Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcvs2git2006-02-22 01:53:31 +0000
committercvs2git2006-02-22 01:53:31 +0000
commit5d148bfa6c218445247f4d2f84025775eaea12d6 (patch)
treec17a4ae295a8121efa5def9914002c24fe0ada2c
parentce7d6ee8f9cd601f231db0dbd23ad711ba986b35 (diff)
downloadorg.eclipse.mylyn.tasks-5d148bfa6c218445247f4d2f84025775eaea12d6.tar.gz
org.eclipse.mylyn.tasks-5d148bfa6c218445247f4d2f84025775eaea12d6.tar.xz
org.eclipse.mylyn.tasks-5d148bfa6c218445247f4d2f84025775eaea12d6.zip
This commit was manufactured by cvs2svn to create branch 'e_3_1'.
Cherrypick from master 2006-02-22 01:53:30 UTC mkersten 'Completed: make archive sort to bottom': org.eclipse.mylyn.bugzilla.core/.project org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.jdt.core.prefs org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.jdt.ui.prefs org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaException.java org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/PossibleBugzillaFailureException.java org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/TrustAll.java org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.jdt.core.prefs org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.jdt.ui.prefs org.eclipse.mylyn.bugzilla.tests/build.properties org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTestPlugin.java org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/EncodingTest.java org.eclipse.mylyn.bugzilla.tests/testdata/pages/bug-1-full.html org.eclipse.mylyn.bugzilla.tests/testdata/pages/bug-not-found-eclipse.html org.eclipse.mylyn.bugzilla.tests/testdata/pages/bug-not-found-hipikat.html org.eclipse.mylyn.bugzilla.tests/testdata/pages/cdt-page.html org.eclipse.mylyn.bugzilla.tests/testdata/pages/equinox-page.html org.eclipse.mylyn.bugzilla.tests/testdata/pages/gmt-page.html org.eclipse.mylyn.bugzilla.tests/testdata/pages/hipikat-copy-bug-1-full.html org.eclipse.mylyn.bugzilla.tests/testdata/pages/platform-page.html org.eclipse.mylyn.bugzilla.tests/testdata/pages/product-page-1-product-hipikat.html org.eclipse.mylyn.bugzilla.tests/testdata/pages/ve-page.html org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/1.html org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/2.html org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/40152.html org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/4548.html org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/4862.html org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/67395.html org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/76146.html org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/76388.html org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.jdt.core.prefs org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.jdt.ui.prefs org.eclipse.mylyn.bugzilla.ui/build.properties org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-remote.gif org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-repository-new.gif org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-repository.gif org.eclipse.mylyn.bugzilla.ui/icons/eview16/bugzilla-logo.gif org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-bugzilla.gif org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaOpenStructure.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaResultMatchAdapter.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaTableContentProvider.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/OfflineView.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/ViewBugzillaAction.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/AbstractFavoritesAction.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/AbstractOfflineReportsAction.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/AddBugzillaQueryAction.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/BugzillaSortAction.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/DeleteFavoriteAction.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/OpenBugsAction.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/ViewFavoriteAction.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/AbstractBugEditorInput.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaEditorCopyAction.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaOutlineComparer.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaOutlineNode.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaOutlinePage.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaReportSelection.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/ExistingBugEditorInput.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/NewBugEditorInput.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/SpellingDialog.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/BugzillaResultCollector.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/BugzillaSearchResultView.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/GetQueryDialog.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/SaveQueryDialog.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/SavedQueryFile.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaCacheFile.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaCustomQueryDialog.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaReportEditorFactory.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaReportNode.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaTaskEditorInput.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/StackTrace.java org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/wizard/AbstractWizardListPage.java org.eclipse.mylyn.help.ui/.classpath org.eclipse.mylyn.help.ui/.settings/org.eclipse.jdt.core.prefs org.eclipse.mylyn.help.ui/.settings/org.eclipse.jdt.ui.prefs org.eclipse.mylyn.help.ui/build.properties org.eclipse.mylyn.help.ui/doc/images/0.3/active-hierarchy.gif org.eclipse.mylyn.help.ui/doc/images/0.3/active-search-linked.gif org.eclipse.mylyn.help.ui/doc/images/0.3/active-search-manipulation.gif org.eclipse.mylyn.help.ui/doc/images/0.3/active-search-qualify.gif org.eclipse.mylyn.help.ui/doc/images/0.3/active-search.gif org.eclipse.mylyn.help.ui/doc/images/0.3/alt-click.gif org.eclipse.mylyn.help.ui/doc/images/0.3/bugzilla-hyperlink.gif org.eclipse.mylyn.help.ui/doc/images/0.3/bugzilla-internal-browser.gif org.eclipse.mylyn.help.ui/doc/images/0.3/bugzilla-query-custom.gif org.eclipse.mylyn.help.ui/doc/images/0.3/bugzilla-synch.gif org.eclipse.mylyn.help.ui/doc/images/0.3/filter-auto-toggle.gif org.eclipse.mylyn.help.ui/doc/images/0.3/filtering-ant.gif org.eclipse.mylyn.help.ui/doc/images/0.3/filtering-declarations.gif org.eclipse.mylyn.help.ui/doc/images/0.3/filtering-exclusion.gif org.eclipse.mylyn.help.ui/doc/images/0.3/filtering-navigator.gif org.eclipse.mylyn.help.ui/doc/images/0.3/folding-toggle.gif org.eclipse.mylyn.help.ui/doc/images/0.3/highlight.gif org.eclipse.mylyn.help.ui/doc/images/0.3/interest-content-assist.gif org.eclipse.mylyn.help.ui/doc/images/0.3/interest-error.gif org.eclipse.mylyn.help.ui/doc/images/0.3/interest-java-browsing.gif org.eclipse.mylyn.help.ui/doc/images/0.3/interest-manipulate.gif org.eclipse.mylyn.help.ui/doc/images/0.3/monitor-enable.gif org.eclipse.mylyn.help.ui/doc/images/0.3/open-type.gif org.eclipse.mylyn.help.ui/doc/images/0.3/overview.gif org.eclipse.mylyn.help.ui/doc/images/0.3/preference-error-interest.gif org.eclipse.mylyn.help.ui/doc/images/0.3/search-context.gif org.eclipse.mylyn.help.ui/doc/images/0.3/task-context-visible.gif org.eclipse.mylyn.help.ui/doc/images/0.3/tasklist-actions.gif org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-archive.gif org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-drilldown.gif org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-go-navigation.gif org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-history.gif org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-offline.gif org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-quick-filter.gif org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-reminders.gif org.eclipse.mylyn.help.ui/doc/images/0.3/test-context.gif org.eclipse.mylyn.help.ui/doc/images/0.4.1/bugzilla-editor-browser.gif org.eclipse.mylyn.help.ui/doc/images/0.4.1/bugzilla-prefs-220.gif org.eclipse.mylyn.help.ui/doc/images/0.4.1/bugzilla-prefs-open-reports.gif org.eclipse.mylyn.help.ui/doc/images/0.4.1/context-pause.gif org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-context.gif org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-export.gif org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-popup.gif org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-weblink-editor.gif org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-weblink.gif org.eclipse.mylyn.help.ui/doc/images/0.4.3/bugzilla-outline.gif org.eclipse.mylyn.help.ui/doc/images/0.4.3/context-capture-pause-indicator.gif org.eclipse.mylyn.help.ui/doc/images/0.4.3/cvs-resource-history-open.gif org.eclipse.mylyn.help.ui/doc/images/0.4.3/editors-auto-manage-pref.gif org.eclipse.mylyn.help.ui/doc/images/0.4.3/editors-auto-manage.gif org.eclipse.mylyn.help.ui/doc/images/0.4.3/synchronize-change-sets.gif org.eclipse.mylyn.help.ui/doc/images/0.4.4/changeset-addto.gif org.eclipse.mylyn.help.ui/doc/images/0.4.5/taskist-planner.gif org.eclipse.mylyn.help.ui/doc/images/0.4.5/tasklist-drag.gif org.eclipse.mylyn.help.ui/doc/images/0.4.6/tasklist-pastreminder.gif org.eclipse.mylyn.help.ui/doc/images/0.4.7/bugzilla-encoding.gif org.eclipse.mylyn.help.ui/doc/images/0.4.7/tasklist-open-external.gif org.eclipse.mylyn.help.ui/doc/images/0.4.7/tasklist-repositories.gif org.eclipse.mylyn.help.ui/doc/images/faq/eclipse-manage-configuration.gif org.eclipse.mylyn.help.ui/doc/images/faq/filtering-declarations.gif org.eclipse.mylyn.help.ui/doc/images/faq/tasklist-backup.gif org.eclipse.mylyn.help.ui/doc/tips.html org.eclipse.mylyn.tasks.core/.settings/org.eclipse.jdt.core.prefs org.eclipse.mylyn.tasks.core/.settings/org.eclipse.jdt.ui.prefs org.eclipse.mylyn.tasks.core/build.properties org.eclipse.mylyn.tasks.core/icons/elcl16/task-bug.gif org.eclipse.mylyn.tasks.core/icons/elcl16/task-repository.gif org.eclipse.mylyn.tasks.core/plugin.xml org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaContextLabelProvider.java org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaEditingMonitor.java org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaReportCache.java org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaSearchManager.java org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/MylarBugsPlugin.java org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/java/AbstractHyperlinkDetector.java org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/java/BugzillaHyperLinkDetector.java org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/java/OpenBugzillaReportJob.java org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/search/BugzillaMylarSearch.java org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/search/BugzillaMylarSearchJob.java org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/search/Util.java org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.jdt.core.prefs org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.jdt.ui.prefs org.eclipse.mylyn.tasks.tests/META-INF/MANIFEST.MF org.eclipse.mylyn.tasks.tests/build.properties org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/AllTasklistTests.java org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/BackgroundSaveTest.java org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/BugzillaTaskTest.java org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/MylarTasksTestsPlugin.java org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/RetrieveTitleFromUrlTest.java org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskActivityTimingTest.java org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskDataExportTest.java org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskDataImportTest.java org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskHistoryTest.java org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListDnDTest.java org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListManagerTest.java org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListNotificationManagerTest.java org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListStandaloneTest.java org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListUiTest.java org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskReportGeneratorTest.java org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskRepositoryManagerTest.java org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskTest.java org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskTestUtil.java org.eclipse.mylyn.tasks.tests/testdata/legacy/tasklist_0_4_8.xml org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/context-history.xml org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/local-69.xml org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/local-70.xml org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/mylardata-2006-02-16.zip org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/tasklist.xml org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.jdt.core.prefs org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.jdt.ui.prefs org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.pde.prefs org.eclipse.mylyn.tasks.ui/META-INF/MANIFEST.MF org.eclipse.mylyn.tasks.ui/build.properties org.eclipse.mylyn.tasks.ui/doc/bugzilla.html org.eclipse.mylyn.tasks.ui/doc/planning.html org.eclipse.mylyn.tasks.ui/doc/tasklist.html org.eclipse.mylyn.tasks.ui/icons/etool16/overlay-repository.gif org.eclipse.mylyn.tasks.ui/icons/etool16/overlay-web.gif org.eclipse.mylyn.tasks.ui/icons/etool16/query-new.gif org.eclipse.mylyn.tasks.ui/icons/etool16/query.gif org.eclipse.mylyn.tasks.ui/icons/etool16/repository-new.gif org.eclipse.mylyn.tasks.ui/icons/etool16/repository-synchronize.gif org.eclipse.mylyn.tasks.ui/icons/etool16/task-items.gif org.eclipse.mylyn.tasks.ui/icons/etool16/task-new.gif org.eclipse.mylyn.tasks.ui/icons/etool16/task-remote.gif org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository-new.gif org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository.gif org.eclipse.mylyn.tasks.ui/icons/etool16/task-server.gif org.eclipse.mylyn.tasks.ui/icons/etool16/task.gif org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-conflicting.gif org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-incoming.gif org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-outgoing.gif org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-repository.gif org.eclipse.mylyn.tasks.ui/icons/eview16/repositories-blue.gif org.eclipse.mylyn.tasks.ui/icons/eview16/repositories.gif org.eclipse.mylyn.tasks.ui/icons/eview16/repository.gif org.eclipse.mylyn.tasks.ui/plugin.xml org.eclipse.mylyn.tasks.ui/schema/providers.exsd org.eclipse.mylyn.tasks.ui/schema/repositories.exsd org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ScheduledTaskListRefreshJob.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/TaskExternalizationException.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/TaskListPreferenceConstants.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/TaskListRefreshManager.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/CompletedTaskCollector.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ITaskCollector.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/InProgressTaskCollector.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/TaskReportGenerator.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/ITaskPlannerContentProvider.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/OpenTaskEditorAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/PlannedTasksContentProvider.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/ReminderCellEditor.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/RemoveTaskAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskActivityContentProvider.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskActivityLabelProvider.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskActivitySorter.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlanContentProvider.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlanLabelProvider.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlanSorter.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerEditorInput.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerEditorPart.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerWizard.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerWizardPage.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/AbstractTaskFilter.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ComboSelectionDialog.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/IDynamicSubMenuContributor.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ITaskEditorFactory.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ITaskHighlighter.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ITaskListNotification.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ITaskListNotificationProvider.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/RepositoryTaskDecorator.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/SynchronizeReportsAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskCompleteFilter.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListImages.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListNotificationManager.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListNotificationPopup.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListNotificationReminder.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListOverlayDescriptor.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListPatternFilter.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListUiUtil.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskPriorityFilter.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TasksReminderDialog.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/AddRepositoryAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/AddRepositoryTaskAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/CollapseAllAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/CopyDescriptionAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/DeleteAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/DeleteTaskRepositoryAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/EditRepositoryPropertiesAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/FilterCompletedTasksAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/GoIntoAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/GoUpAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/ManageEditorsAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/MarkTaskCompleteAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/MarkTaskIncompleteAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/MoveTaskToRootAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/NewCategoryAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/NewLocalTaskAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/NewQueryAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/NextTaskDropDownAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/OpenTaskInExternalBrowserAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/OpenTaskListElementAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/PreviousTaskDropDownAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/RemoveFromCategoryAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/RenameAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/TaskActivateAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/TaskDeactivateAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/TaskEditorCopyAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/TaskNavigateDropDownAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/WorkOfflineAction.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/CategoryEditor.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/CategoryEditorInput.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/MylarTaskEditor.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/TaskEditorInput.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/TaskInfoEditor.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/preferences/MylarTaskListPreferencePage.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/DatePicker.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/ImageTableCellEditor.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/RetrieveTitleFromUrlJob.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TableDecoratingLabelProvider.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivationHistory.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskElementLabelProvider.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskInputDialog.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListContentProvider.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListDragSourceListener.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListDropAdapter.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListFilteredTree.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListTableLabelProvider.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListToolTipHandler.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListView.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskRepositoriesView.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskRepositoryLabelProvider.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AbstractAddExistingTaskWizard.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AbstractRepositoryClientWizard.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AbstractRepositorySettingsPage.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AddExistingTaskWizard.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AddRepositoryWizard.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/EditRepositoryWizard.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/ExistingTaskWizardPage.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/MultiRepositoryAwareWizard.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/NewQueryWizard.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/SelectRepositoryClientPage.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/SelectRepositoryPage.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/TaskDataExportWizard.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/TaskDataExportWizardPage.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/TaskDataImportWizard.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/TaskDataImportWizardPage.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/BackgroundSaveTimer.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/IBackgroundSaveListener.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/TaskActivityTimer.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/TaskListExtensionReader.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/TaskListSaveManager.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/TaskListWriter.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractQueryHit.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractRepositoryClient.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractRepositoryQuery.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractRepositoryTask.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/DelegatingTaskExternalizer.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITask.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskActivityListener.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskContainer.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskListElement.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskListExternalizer.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskRepositoryListener.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/MylarTaskListPlugin.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/Task.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskCategory.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskList.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskListManager.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskRepository.java org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskRepositoryManager.java
-rw-r--r--org.eclipse.mylyn.bugzilla.core/.project28
-rw-r--r--org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.jdt.core.prefs303
-rw-r--r--org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.jdt.ui.prefs5
-rw-r--r--org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaException.java67
-rw-r--r--org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/PossibleBugzillaFailureException.java66
-rw-r--r--org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/TrustAll.java58
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.jdt.core.prefs303
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.jdt.ui.prefs5
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/build.properties22
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTestPlugin.java99
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/EncodingTest.java44
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/testdata/pages/bug-1-full.html719
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/testdata/pages/bug-not-found-eclipse.html158
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/testdata/pages/bug-not-found-hipikat.html142
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/testdata/pages/cdt-page.html184
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/testdata/pages/equinox-page.html177
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/testdata/pages/gmt-page.html175
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/testdata/pages/hipikat-copy-bug-1-full.html157
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/testdata/pages/platform-page.html299
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/testdata/pages/product-page-1-product-hipikat.html256
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/testdata/pages/ve-page.html178
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/1.html377
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/2.html406
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/40152.html1228
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/4548.html377
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/4862.html401
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/67395.html390
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/76146.html406
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/76388.html426
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.jdt.core.prefs303
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.jdt.ui.prefs6
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/build.properties27
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-remote.gifbin0 -> 89 bytes
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-repository-new.gifbin0 -> 339 bytes
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-repository.gifbin0 -> 216 bytes
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/icons/eview16/bugzilla-logo.gifbin0 -> 1039 bytes
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-bugzilla.gifbin0 -> 61 bytes
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaOpenStructure.java70
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaResultMatchAdapter.java67
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaTableContentProvider.java94
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/OfflineView.java697
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/ViewBugzillaAction.java98
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/AbstractFavoritesAction.java53
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/AbstractOfflineReportsAction.java54
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/AddBugzillaQueryAction.java123
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/BugzillaSortAction.java59
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/DeleteFavoriteAction.java70
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/OpenBugsAction.java80
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/ViewFavoriteAction.java58
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/AbstractBugEditorInput.java70
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaEditorCopyAction.java39
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaOutlineComparer.java51
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaOutlineNode.java355
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaOutlinePage.java172
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaReportSelection.java172
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/ExistingBugEditorInput.java124
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/NewBugEditorInput.java51
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/SpellingDialog.java105
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/BugzillaResultCollector.java176
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/BugzillaSearchResultView.java251
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/GetQueryDialog.java201
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/SaveQueryDialog.java90
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/SavedQueryFile.java255
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaCacheFile.java131
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaCustomQueryDialog.java112
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaReportEditorFactory.java76
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaReportNode.java184
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaTaskEditorInput.java145
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/StackTrace.java375
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/wizard/AbstractWizardListPage.java198
-rw-r--r--org.eclipse.mylyn.help.ui/.classpath6
-rw-r--r--org.eclipse.mylyn.help.ui/.settings/org.eclipse.jdt.core.prefs303
-rw-r--r--org.eclipse.mylyn.help.ui/.settings/org.eclipse.jdt.ui.prefs5
-rw-r--r--org.eclipse.mylyn.help.ui/build.properties19
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/active-hierarchy.gifbin0 -> 6216 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/active-search-linked.gifbin0 -> 6141 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/active-search-manipulation.gifbin0 -> 14447 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/active-search-qualify.gifbin0 -> 5396 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/active-search.gifbin0 -> 11276 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/alt-click.gifbin0 -> 4851 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/bugzilla-hyperlink.gifbin0 -> 4113 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/bugzilla-internal-browser.gifbin0 -> 4234 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/bugzilla-query-custom.gifbin0 -> 5553 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/bugzilla-synch.gifbin0 -> 9183 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/filter-auto-toggle.gifbin0 -> 1270 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/filtering-ant.gifbin0 -> 7450 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/filtering-declarations.gifbin0 -> 8520 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/filtering-exclusion.gifbin0 -> 6921 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/filtering-navigator.gifbin0 -> 8071 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/folding-toggle.gifbin0 -> 5612 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/highlight.gifbin0 -> 8366 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/interest-content-assist.gifbin0 -> 5448 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/interest-error.gifbin0 -> 4373 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/interest-java-browsing.gifbin0 -> 5722 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/interest-manipulate.gifbin0 -> 1438 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/monitor-enable.gifbin0 -> 24782 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/open-type.gifbin0 -> 14088 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/overview.gifbin0 -> 75398 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/preference-error-interest.gifbin0 -> 4798 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/search-context.gifbin0 -> 3458 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/task-context-visible.gifbin0 -> 8717 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/tasklist-actions.gifbin0 -> 5741 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-archive.gifbin0 -> 10002 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-drilldown.gifbin0 -> 5729 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-go-navigation.gifbin0 -> 2915 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-history.gifbin0 -> 11482 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-offline.gifbin0 -> 7069 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-quick-filter.gifbin0 -> 6083 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-reminders.gifbin0 -> 5668 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.3/test-context.gifbin0 -> 18413 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.1/bugzilla-editor-browser.gifbin0 -> 23500 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.1/bugzilla-prefs-220.gifbin0 -> 6968 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.1/bugzilla-prefs-open-reports.gifbin0 -> 2487 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.1/context-pause.gifbin0 -> 8696 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-context.gifbin0 -> 8729 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-export.gifbin0 -> 15654 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-popup.gifbin0 -> 7464 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-weblink-editor.gifbin0 -> 20089 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-weblink.gifbin0 -> 10246 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.3/bugzilla-outline.gifbin0 -> 7428 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.3/context-capture-pause-indicator.gifbin0 -> 4723 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.3/cvs-resource-history-open.gifbin0 -> 11207 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.3/editors-auto-manage-pref.gifbin0 -> 1823 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.3/editors-auto-manage.gifbin0 -> 7409 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.3/synchronize-change-sets.gifbin0 -> 16816 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.4/changeset-addto.gifbin0 -> 20450 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.5/taskist-planner.gifbin0 -> 23336 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.5/tasklist-drag.gifbin0 -> 7324 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.6/tasklist-pastreminder.gifbin0 -> 18758 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.7/bugzilla-encoding.gifbin0 -> 2517 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.7/tasklist-open-external.gifbin0 -> 3821 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/0.4.7/tasklist-repositories.gifbin0 -> 7517 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/faq/eclipse-manage-configuration.gifbin0 -> 23781 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/faq/filtering-declarations.gifbin0 -> 8520 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/images/faq/tasklist-backup.gifbin0 -> 15084 bytes
-rw-r--r--org.eclipse.mylyn.help.ui/doc/tips.html83
-rw-r--r--org.eclipse.mylyn.tasks.core/.settings/org.eclipse.jdt.core.prefs303
-rw-r--r--org.eclipse.mylyn.tasks.core/.settings/org.eclipse.jdt.ui.prefs6
-rw-r--r--org.eclipse.mylyn.tasks.core/build.properties20
-rw-r--r--org.eclipse.mylyn.tasks.core/icons/elcl16/task-bug.gifbin0 -> 339 bytes
-rw-r--r--org.eclipse.mylyn.tasks.core/icons/elcl16/task-repository.gifbin0 -> 216 bytes
-rw-r--r--org.eclipse.mylyn.tasks.core/plugin.xml58
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaContextLabelProvider.java75
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaEditingMonitor.java44
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaReportCache.java78
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaSearchManager.java155
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/MylarBugsPlugin.java111
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/java/AbstractHyperlinkDetector.java37
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/java/BugzillaHyperLinkDetector.java191
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/java/OpenBugzillaReportJob.java48
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/search/BugzillaMylarSearch.java192
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/search/BugzillaMylarSearchJob.java105
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/search/Util.java202
-rw-r--r--org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.jdt.core.prefs303
-rw-r--r--org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.jdt.ui.prefs5
-rw-r--r--org.eclipse.mylyn.tasks.tests/META-INF/MANIFEST.MF23
-rw-r--r--org.eclipse.mylyn.tasks.tests/build.properties20
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/AllTasklistTests.java44
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/BackgroundSaveTest.java59
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/BugzillaTaskTest.java58
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/MylarTasksTestsPlugin.java49
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/RetrieveTitleFromUrlTest.java42
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskActivityTimingTest.java176
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskDataExportTest.java129
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskDataImportTest.java105
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskHistoryTest.java214
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListDnDTest.java76
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListManagerTest.java376
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListNotificationManagerTest.java89
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListStandaloneTest.java118
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListUiTest.java279
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskReportGeneratorTest.java189
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskRepositoryManagerTest.java121
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskTest.java48
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskTestUtil.java75
-rw-r--r--org.eclipse.mylyn.tasks.tests/testdata/legacy/tasklist_0_4_8.xml1
-rw-r--r--org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/context-history.xml1
-rw-r--r--org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/local-69.xml1
-rw-r--r--org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/local-70.xml1
-rw-r--r--org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/mylardata-2006-02-16.zipbin0 -> 2340 bytes
-rw-r--r--org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/tasklist.xml1
-rw-r--r--org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.jdt.core.prefs303
-rw-r--r--org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.jdt.ui.prefs5
-rw-r--r--org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.pde.prefs13
-rw-r--r--org.eclipse.mylyn.tasks.ui/META-INF/MANIFEST.MF28
-rw-r--r--org.eclipse.mylyn.tasks.ui/build.properties28
-rw-r--r--org.eclipse.mylyn.tasks.ui/doc/bugzilla.html46
-rw-r--r--org.eclipse.mylyn.tasks.ui/doc/planning.html21
-rw-r--r--org.eclipse.mylyn.tasks.ui/doc/tasklist.html181
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/etool16/overlay-repository.gifbin0 -> 80 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/etool16/overlay-web.gifbin0 -> 167 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/etool16/query-new.gifbin0 -> 349 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/etool16/query.gifbin0 -> 332 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/etool16/repository-new.gifbin0 -> 342 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/etool16/repository-synchronize.gifbin0 -> 362 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/etool16/task-items.gifbin0 -> 218 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/etool16/task-new.gifbin0 -> 334 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/etool16/task-remote.gifbin0 -> 89 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository-new.gifbin0 -> 339 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository.gifbin0 -> 216 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/etool16/task-server.gifbin0 -> 339 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/etool16/task.gifbin0 -> 211 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-conflicting.gifbin0 -> 187 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-incoming.gifbin0 -> 114 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-outgoing.gifbin0 -> 64 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-repository.gifbin0 -> 80 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/eview16/repositories-blue.gifbin0 -> 367 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/eview16/repositories.gifbin0 -> 365 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/icons/eview16/repository.gifbin0 -> 325 bytes
-rw-r--r--org.eclipse.mylyn.tasks.ui/plugin.xml271
-rw-r--r--org.eclipse.mylyn.tasks.ui/schema/providers.exsd122
-rw-r--r--org.eclipse.mylyn.tasks.ui/schema/repositories.exsd174
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ScheduledTaskListRefreshJob.java88
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/TaskExternalizationException.java27
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/TaskListPreferenceConstants.java61
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/TaskListRefreshManager.java49
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/CompletedTaskCollector.java52
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ITaskCollector.java26
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/InProgressTaskCollector.java75
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/TaskReportGenerator.java133
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/ITaskPlannerContentProvider.java20
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/OpenTaskEditorAction.java53
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/PlannedTasksContentProvider.java48
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/ReminderCellEditor.java81
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/RemoveTaskAction.java47
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskActivityContentProvider.java58
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskActivityLabelProvider.java83
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskActivitySorter.java96
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlanContentProvider.java51
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlanLabelProvider.java58
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlanSorter.java90
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerEditorInput.java179
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerEditorPart.java863
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerWizard.java66
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerWizardPage.java323
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/AbstractTaskFilter.java25
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ComboSelectionDialog.java114
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/IDynamicSubMenuContributor.java21
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ITaskEditorFactory.java35
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ITaskHighlighter.java23
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ITaskListNotification.java27
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ITaskListNotificationProvider.java21
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/RepositoryTaskDecorator.java82
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/SynchronizeReportsAction.java105
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskCompleteFilter.java46
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListImages.java186
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListNotificationManager.java182
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListNotificationPopup.java227
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListNotificationReminder.java90
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListOverlayDescriptor.java90
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListPatternFilter.java28
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListUiUtil.java116
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskPriorityFilter.java61
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TasksReminderDialog.java267
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/AddRepositoryAction.java65
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/AddRepositoryTaskAction.java59
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/CollapseAllAction.java42
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/CopyDescriptionAction.java55
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/DeleteAction.java104
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/DeleteTaskRepositoryAction.java68
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/EditRepositoryPropertiesAction.java72
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/FilterCompletedTasksAction.java47
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/GoIntoAction.java58
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/GoUpAction.java35
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/ManageEditorsAction.java50
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/MarkTaskCompleteAction.java46
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/MarkTaskIncompleteAction.java46
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/MoveTaskToRootAction.java54
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/NewCategoryAction.java51
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/NewLocalTaskAction.java85
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/NewQueryAction.java59
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/NextTaskDropDownAction.java59
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/OpenTaskInExternalBrowserAction.java66
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/OpenTaskListElementAction.java106
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/PreviousTaskDropDownAction.java60
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/RemoveFromCategoryAction.java82
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/RenameAction.java42
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/TaskActivateAction.java67
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/TaskDeactivateAction.java54
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/TaskEditorCopyAction.java33
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/TaskNavigateDropDownAction.java113
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/WorkOfflineAction.java33
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/CategoryEditor.java119
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/CategoryEditorInput.java61
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/MylarTaskEditor.java371
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/TaskEditorInput.java131
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/TaskInfoEditor.java794
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/preferences/MylarTaskListPreferencePage.java363
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/DatePicker.java479
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/ImageTableCellEditor.java215
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/RetrieveTitleFromUrlJob.java125
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TableDecoratingLabelProvider.java72
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivationHistory.java235
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskElementLabelProvider.java172
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskInputDialog.java294
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListContentProvider.java254
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListDragSourceListener.java65
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListDropAdapter.java195
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListFilteredTree.java130
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListTableLabelProvider.java143
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListToolTipHandler.java298
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListView.java1398
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskRepositoriesView.java144
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskRepositoryLabelProvider.java52
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AbstractAddExistingTaskWizard.java68
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AbstractRepositoryClientWizard.java50
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AbstractRepositorySettingsPage.java189
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AddExistingTaskWizard.java37
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AddRepositoryWizard.java69
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/EditRepositoryWizard.java70
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/ExistingTaskWizardPage.java78
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/MultiRepositoryAwareWizard.java52
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/NewQueryWizard.java36
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/SelectRepositoryClientPage.java103
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/SelectRepositoryPage.java170
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/TaskDataExportWizard.java362
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/TaskDataExportWizardPage.java285
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/TaskDataImportWizard.java421
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/TaskDataImportWizardPage.java385
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/BackgroundSaveTimer.java103
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/IBackgroundSaveListener.java26
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/TaskActivityTimer.java131
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/TaskListExtensionReader.java219
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/TaskListSaveManager.java188
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/TaskListWriter.java544
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractQueryHit.java58
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractRepositoryClient.java117
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractRepositoryQuery.java148
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractRepositoryTask.java144
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/DelegatingTaskExternalizer.java534
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITask.java124
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskActivityListener.java34
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskContainer.java29
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskListElement.java35
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskListExternalizer.java75
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskRepositoryListener.java21
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/MylarTaskListPlugin.java611
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/Task.java397
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskCategory.java138
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskList.java404
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskListManager.java313
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskRepository.java125
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskRepositoryManager.java215
343 files changed, 37786 insertions, 0 deletions
diff --git a/org.eclipse.mylyn.bugzilla.core/.project b/org.eclipse.mylyn.bugzilla.core/.project
new file mode 100644
index 000000000..bf9bb8787
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylar.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>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
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 000000000..398008f59
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,303 @@
+#Mon Feb 13 11:20:13 PST 2006
+eclipse.preferences.version=1
+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=disabled
+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.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.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=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.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.5
+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=16
+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_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.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_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=80
+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_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_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.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.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
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 000000000..e8e09e214
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,5 @@
+#Mon Feb 13 11:20:13 PST 2006
+eclipse.preferences.version=1
+formatter_profile=_Mylar based on Eclipse [built-in]
+formatter_settings_version=10
+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">/**\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><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 - 2006 University Of British Columbia 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 * University Of British Columbia - 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></templates>
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaException.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaException.java
new file mode 100644
index 000000000..d4806d814
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/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.mylar.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.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/PossibleBugzillaFailureException.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/PossibleBugzillaFailureException.java
new file mode 100644
index 000000000..85aa861e7
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/PossibleBugzillaFailureException.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * 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.mylar.internal.bugzilla.core;
+
+import java.io.PrintStream;
+import java.io.PrintWriter;
+
+public class PossibleBugzillaFailureException extends Exception {
+ /** Automatically generated serialVersionUID */
+ private static final long serialVersionUID = 3257849887386449974L;
+
+ private Throwable cause;
+
+ /**
+ * Constructor for BugzillaException.
+ */
+ public PossibleBugzillaFailureException() {
+ super();
+ }
+
+ /**
+ * Constructor for BugzillaException.
+ *
+ * @param detailMessage
+ */
+ public PossibleBugzillaFailureException(String detailMessage) {
+ super(detailMessage);
+ }
+
+ public PossibleBugzillaFailureException(String detailMessage, Throwable cause) {
+ super(detailMessage);
+ this.cause = cause;
+ }
+
+ public PossibleBugzillaFailureException(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.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/TrustAll.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/TrustAll.java
new file mode 100644
index 000000000..03df0bf9b
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/TrustAll.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.mylar.internal.bugzilla.core;
+
+import javax.net.ssl.X509TrustManager;
+
+/**
+ * TrustAll class implements X509TrustManager to access all https servers with
+ * signed and unsigned certificates.
+ */
+public class TrustAll implements X509TrustManager {
+ // seems to be no purpose
+ public boolean checkClientTrusted(java.security.cert.X509Certificate[] chain) {
+ return true;
+ }
+
+ // seems to be no purpose
+ public boolean isServerTrusted(java.security.cert.X509Certificate[] chain) {
+ return true;
+ }
+
+ // seems to be no purpose
+ public boolean isClientTrusted(java.security.cert.X509Certificate[] chain) {
+ return true;
+ }
+
+ /**
+ * @see javax.net.ssl.X509TrustManager#getAcceptedIssuers()
+ */
+ public java.security.cert.X509Certificate[] getAcceptedIssuers() {
+ return null;
+ }
+
+ /**
+ * @see javax.net.ssl.X509TrustManager#checkClientTrusted(java.security.cert.X509Certificate[],
+ * java.lang.String)
+ */
+ public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
+ // don't need to do any checks
+ }
+
+ /**
+ * @see javax.net.ssl.X509TrustManager#checkServerTrusted(java.security.cert.X509Certificate[],
+ * java.lang.String)
+ */
+ public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
+ // don't need to do any checks
+ }
+}
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 000000000..398008f59
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,303 @@
+#Mon Feb 13 11:20:13 PST 2006
+eclipse.preferences.version=1
+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=disabled
+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.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.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=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.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.5
+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=16
+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_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.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_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=80
+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_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_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.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.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
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 000000000..e8e09e214
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,5 @@
+#Mon Feb 13 11:20:13 PST 2006
+eclipse.preferences.version=1
+formatter_profile=_Mylar based on Eclipse [built-in]
+formatter_settings_version=10
+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">/**\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><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 - 2006 University Of British Columbia 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 * University Of British Columbia - 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></templates>
diff --git a/org.eclipse.mylyn.bugzilla.tests/build.properties b/org.eclipse.mylyn.bugzilla.tests/build.properties
new file mode 100644
index 000000000..f084a551e
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/build.properties
@@ -0,0 +1,22 @@
+###############################################################################
+# 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
+###############################################################################
+bin.includes = plugin.xml,\
+ bugzilla-test.jar,\
+ META-INF/,\
+ about.html
+jars.compile.order = bugzilla-test.jar
+source.bugzilla-test.jar = src/
+output.bugzilla-test.jar = bin/
+src.includes = src/,\
+ plugin.xml,\
+ about.html,\
+ META-INF/
+jre.compilation.profile = J2SE-1.5
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 000000000..ff7f20856
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTestPlugin.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * 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.mylar.bugzilla.tests;
+
+import org.eclipse.ui.plugin.*;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.osgi.framework.BundleContext;
+import java.util.*;
+
+/**
+ * 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.mylar.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.mylar.bugzilla.tests", path);
+ }
+}
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 000000000..7f9a73254
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/EncodingTest.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * 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.mylar.bugzilla.tests;
+
+import java.io.IOException;
+import java.text.ParseException;
+
+import javax.security.auth.login.LoginException;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylar.internal.bugzilla.core.internal.BugParser;
+
+/**
+ * @author Mik Kersten
+ */
+public class EncodingTest extends TestCase {
+
+ public void testEncodingSetting() throws LoginException, IOException, ParseException {
+
+ String charset = BugParser.getCharsetFromString("text/html; charset=UTF-8");
+ assertEquals("UTF-8", charset);
+
+ charset = BugParser.getCharsetFromString("text/html");
+ assertEquals(null, charset);
+
+ charset = BugParser
+ .getCharsetFromString("<<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-2\">>");
+ assertEquals("iso-8859-2", charset);
+
+ charset = BugParser.getCharsetFromString("<<meta http-equiv=\"Content-Type\" content=\"text/html\">>");
+ assertEquals(null, charset);
+ }
+
+}
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 000000000..00fd1bcb7
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/bug-1-full.html
@@ -0,0 +1,719 @@
+<!-- 1.0@bugzilla.org -->
+
+<!-- 1.0@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@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">&nbsp;</td>
+ <td valign="middle" align="left">Usability issue with external editors (1GE6IRL)</td>
+ </tr>
+ </table>
+<!-- 1.0@bugzilla.org -->
+
+
+
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="query.cgi">Query page</a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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>&nbsp;</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>&nbsp;</td>
+
+ <td align="right">
+ <b>Reporter:</b>
+ </td>
+ <td>andre_weinand@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>&nbsp;</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>&nbsp;</td>
+
+ <td align="right">
+ <b>Add&nbsp;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>&nbsp;</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>&nbsp;</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@oti.com">Kevin_McGuire@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>&nbsp;</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>&nbsp;</td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>
+ <a href="bug_status.html">Resolution</a>:
+ </b>
+ </td>
+ <td>FIXED</td>
+ <td>&nbsp;</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>&nbsp;</td>
+
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>
+ <a href="bug_status.html#assigned_to">Assigned&nbsp;To</a>:
+ </b>
+ </td>
+ <td>James_Moody@ca.ibm.com (James Moody)</td>
+ <td>&nbsp;</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>&nbsp;</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@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&amp;action=enter">Create a New Attachment</a> (proposed patch, testcase, etc.)
+ </td>
+ <td colspan="1">
+ <a href="attachment.cgi?bugid=1&amp;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&nbsp;&nbsp;&nbsp;
+ <a href="votes.cgi?action=show_bug&amp;bug_id=1">Show
+ votes for this bug</a>&nbsp;&nbsp;&nbsp;
+ <a href="votes.cgi?action=show_user&amp;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&nbsp;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>
+ &nbsp; | &nbsp;
+ <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@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
+ -&gt; nothing to release!
+ - in Navigator open the icon resource and verify that your changes are still there
+
+ Problem: because I never &quot;Refreshed from local&quot;, the workspace hasn't changed so &quot;Release&quot; 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 &quot;Release&quot; 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 &quot;ensure local consistency&quot; 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@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@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@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@ca.ibm.com">James Moody</a>
+ 2001-10-25 10:19 -------
+ </i>
+
+
+<pre>Fixed in v206</pre>
+
+<hr>
+<!-- 1.0@bugzilla.org -->
+
+
+
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="query.cgi">Query page</a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="enter_bug.cgi">Enter new bug</a>
+
+<br>
+<!-- 1.0@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@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>&nbsp;</td>
+
+ <td valign="middle" align="right">
+ <a href="createaccount.cgi">New&nbsp;Account</a> |
+ <a href="query.cgi?GoAheadAndLogIn=1">Log&nbsp;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 000000000..156212e5e
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/bug-not-found-eclipse.html
@@ -0,0 +1,158 @@
+<!-- 1.0@bugzilla.org -->
+
+
+
+<!-- 1.0@bugzilla.org -->
+
+
+
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <title>Error</title>
+
+
+
+
+
+
+
+ </head>
+
+
+
+ <body bgcolor="#FFFFFF" onload="">
+
+
+<!-- 1.0@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">&nbsp;</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@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@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>&nbsp;</td>
+
+
+ <td valign="middle">
+ Edit <a href="userprefs.cgi">prefs</a>
+
+ | <a href="relogin.cgi">Log&nbsp;out</a>&nbsp;cubranic@cs.ubc.ca
+ </td>
+ </tr>
+
+
+
+
+ <tr>
+ <td>
+ Preset&nbsp;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&nbsp;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 000000000..e6261be5d
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/bug-not-found-hipikat.html
@@ -0,0 +1,142 @@
+<!-- 1.0@bugzilla.org -->
+
+
+
+<!-- 1.0@bugzilla.org -->
+
+
+
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <title>Error</title>
+
+
+
+
+
+
+
+ </head>
+
+
+
+ <body bgcolor="#FFFFFF" onload="">
+
+
+<!-- 1.0@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">&nbsp;</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@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@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>&nbsp;</td>
+
+ <td valign="middle" align="right">
+ <a href="createaccount.cgi">New&nbsp;Account</a> |
+ <a href="query.cgi?GoAheadAndLogIn=1">Log&nbsp;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 000000000..3a1d20fdb
--- /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@bugzilla.org --><!-- 1.0@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@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>&nbsp;</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@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@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>&nbsp;</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>&nbsp;</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>&nbsp;</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 == '') &#10; { alert('Please enter a summary sentence for this bug.'); &#10; return false; } return true;" type=submit value=" Commit ">
+ &nbsp;&nbsp;&nbsp;&nbsp; <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@eclipse.org. </TD></TR></TBODY></TABLE><INPUT type=hidden
+value=enter_bug name=form_name> </FORM><!-- 1.0@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@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>&nbsp;</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&nbsp;out</A>&nbsp;tanya@cs.ubc.ca
+ </TD></TR>
+ <TR>
+ <TD>Preset&nbsp;Queries: </TD>
+ <TD colSpan=3><A
+ href="https://bugs.eclipse.org/bugs/buglist.cgi?bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;email1=tanya%40cs.ubc.ca&amp;emailtype1=exact&amp;emailassigned_to1=1&amp;emailreporter1=1">My&nbsp;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/equinox-page.html b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/equinox-page.html
new file mode 100644
index 000000000..1c8fdf57d
--- /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@bugzilla.org --><!-- 1.0@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@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>&nbsp;</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@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@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>&nbsp;</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>&nbsp;</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>&nbsp;</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 == '') &#10; { alert('Please enter a summary sentence for this bug.'); &#10; return false; } return true;" type=submit value=" Commit ">
+ &nbsp;&nbsp;&nbsp;&nbsp; <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@eclipse.org. </TD></TR></TBODY></TABLE><INPUT type=hidden
+value=enter_bug name=form_name> </FORM><!-- 1.0@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@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>&nbsp;</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&nbsp;out</A>&nbsp;tanya@cs.ubc.ca
+ </TD></TR>
+ <TR>
+ <TD>Preset&nbsp;Queries: </TD>
+ <TD colSpan=3><A
+ href="https://bugs.eclipse.org/bugs/buglist.cgi?bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;email1=tanya%40cs.ubc.ca&amp;emailtype1=exact&amp;emailassigned_to1=1&amp;emailreporter1=1">My&nbsp;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 000000000..951b86ccd
--- /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@bugzilla.org --><!-- 1.0@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@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>&nbsp;</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@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@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>&nbsp;</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>&nbsp;</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>&nbsp;</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 == '') &#10; { alert('Please enter a summary sentence for this bug.'); &#10; return false; } return true;" type=submit value=" Commit ">
+ &nbsp;&nbsp;&nbsp;&nbsp; <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@eclipse.org. </TD></TR></TBODY></TABLE><INPUT type=hidden
+value=enter_bug name=form_name> </FORM><!-- 1.0@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@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>&nbsp;</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&nbsp;out</A>&nbsp;tanya@cs.ubc.ca
+ </TD></TR>
+ <TR>
+ <TD>Preset&nbsp;Queries: </TD>
+ <TD colSpan=3><A
+ href="https://bugs.eclipse.org/bugs/buglist.cgi?bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;email1=tanya%40cs.ubc.ca&amp;emailtype1=exact&amp;emailassigned_to1=1&amp;emailreporter1=1">My&nbsp;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 000000000..6390fcc9a
--- /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>&nbsp;</TD>
+ <TD VALIGN=CENTER ALIGN=LEFT>
+Usability issue with external editors (1GE6IRL)
+</TD></TR></TABLE>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A HREF=query.cgi>Query page</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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>&nbsp;</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>&nbsp;</TD>
+ <TD ALIGN=RIGHT><B>Reporter:</B></TD><TD>Andre_Weinand@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>&nbsp;</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>&nbsp;</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>&nbsp;</TD>
+ <TD ALIGN=RIGHT><B>Version:</B></TD>
+ <TD><SELECT NAME=version></SELECT></TD>
+ <TD>&nbsp;</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@oti.com">Kevin_McGuire@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>&nbsp;</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>&nbsp;</TD>
+</TR><TR>
+ <TD ALIGN=RIGHT><B><A HREF="bug_status.html">Resolution:</A></B></TD>
+ <TD>FIXED</TD>
+ <TD>&nbsp;</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>&nbsp;</TD>
+</TR><TR>
+ <TD ALIGN=RIGHT><B><A HREF="bug_status.html#assigned_to">Assigned&nbsp;To:
+ </A></B></TD>
+ <TD>James_Moody@oti.com (James Moody)</TD>
+ <TD>&nbsp;</TD><TD></TD><TD></TD><TD>&nbsp;</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>
+ &nbsp; | &nbsp;
+ <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&#013; - release project to CVS&#013; - edit the *.gif resource with an external editor, e.g. PaintShop&#013; - save and close external editor&#013; - in Navigator open the icon resource and verify that your changes are there&#013; - release project&#013; -&gt; nothing to release!&#013; - in Navigator open the icon resource and verify that your changes are still there&#013;&#013; Problem: because I never &quot;Refreshed from local&quot;, the workspace hasn't changed so &quot;Release&quot; didn't find anything.&#013; However opening the resource with an external editor found the modified file on disk and showed the changes.&#013;&#013; The real problem occurs if &quot;Release&quot; actually finds something to release but you don't spot that some resources are missing.&#013; This is extremely error prone: one of my changes didn't made it into build 110 because of this!&#013;&#013;NOTES:&#013;EG (5/23/01 3:00:33 PM)&#013; Release should do a refresh from local before doing the release.&#013; Moving to VCM&#013;&#013;&#013;KM (05/27/01 5:10:19 PM)&#013; Comments from JM in related email:&#013;&#013; 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.&#013; Consider the SWT team who keep their workspaces on network drives. This will be slow. &#013;&#013; 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&#013; 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.&#013;&#013; Summary: Offer to &quot;ensure local consistency&quot; before releasing.&#013;&#013;KM (5/31/01 1:30:35 PM)&#013; See also 1GEAG1A: ITPVCM:WINNT - Internal error comparing with a document&#013; which failed with an error. Never got log from Tod though.</PRE>
+<BR><BR><I>------- Additional Comments From <A HREF="mailto:James_Moody@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@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@oti.com">DJ Houghton</A> 2001-10-23 19:39 -------</I><BR>
+<PRE>PRODUCT VERSION:&#013; 109&#013;&#013;</PRE>
+<BR><BR><I>------- Additional Comments From <A HREF="mailto:James_Moody@oti.com">James Moody</A> 2001-10-25 06:19 -------</I><BR>
+<PRE>Fixed in v206</PRE>
+
+<HR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A HREF=query.cgi>Query page</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A HREF=enter_bug.cgi>Enter new bug</A>
+<hr>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a HREF=query.cgi>Query page</a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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>&nbsp;</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 000000000..d41b5c84d
--- /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@bugzilla.org --><!-- 1.0@bugzilla.org --><title>Enter Bug</title></head>
+
+
+
+
+
+
+
+
+ <body bgcolor="#ffffff" onload="" text="#000000" link="#0000ee" vlink="#551a8b" alink="#ff0000">
+
+
+<!-- 1.0@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">&nbsp;</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@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@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>&nbsp;</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>&nbsp;</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>&nbsp;</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;">
+ &nbsp;&nbsp;&nbsp;&nbsp;
+ <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@eclipse.org.
+ </td>
+ </tr>
+
+ </tbody></table>
+ <input type="hidden" name="form_name" value="enter_bug">
+</form>
+<!-- 1.0@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@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>&nbsp;</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&nbsp;out</a>&nbsp;tanya@cs.ubc.ca
+ </td>
+ </tr>
+
+
+
+
+ <tr>
+ <td>
+ Preset&nbsp;Queries:
+ </td>
+
+ <td colspan="3">
+ <a href="https://bugs.eclipse.org/bugs/buglist.cgi?bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;email1=tanya%40cs.ubc.ca&amp;emailtype1=exact&amp;emailassigned_to1=1&amp;emailreporter1=1">My&nbsp;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 000000000..53805b2d2
--- /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@bugzilla.org --><!-- 1.0@bugzilla.org --><HTML><HEAD><TITLE>Enter Bug</TITLE>
+<META http-equiv=Content-Type content="text/html; charset=windows-1252"><!-- 1.0@bugzilla.org --><!-- 1.0@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@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>&nbsp;</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@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@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>&nbsp;</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>&nbsp;</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>&nbsp;</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 == '')&#10; { alert('Please enter a summary sentence for this bug.');&#10; return false; } return true;" type=submit value=" Commit ">
+ &nbsp;&nbsp;&nbsp;&nbsp; <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@bugzilla.org --><!-- 1.0@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@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&amp;requestee=tanya%40cs.ubc.ca&amp;do_union=1&amp;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>&nbsp;</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&nbsp;out</A>&nbsp;tanya@cs.ubc.ca
+ </TD></TR>
+ <TR>
+ <TD>Saved&nbsp;Searches: </TD>
+ <TD colSpan=3><A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/buglist.cgi?bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;email1=tanya%40cs.ubc.ca&amp;emailtype1=exact&amp;emailassigned_to1=1&amp;emailreporter1=1">My&nbsp;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/ve-page.html b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/ve-page.html
new file mode 100644
index 000000000..e5423da71
--- /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@bugzilla.org --><!-- 1.0@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@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>&nbsp;</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@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@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>&nbsp;</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>&nbsp;</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>&nbsp;</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 == '') &#10; { alert('Please enter a summary sentence for this bug.'); &#10; return false; } return true;" type=submit value=" Commit ">
+ &nbsp;&nbsp;&nbsp;&nbsp; <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@eclipse.org. </TD></TR></TBODY></TABLE><INPUT type=hidden
+value=enter_bug name=form_name> </FORM><!-- 1.0@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@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>&nbsp;</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&nbsp;out</A>&nbsp;tanya@cs.ubc.ca
+ </TD></TR>
+ <TR>
+ <TD>Preset&nbsp;Queries: </TD>
+ <TD colSpan=3><A
+ href="https://bugs.eclipse.org/bugs/buglist.cgi?bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;email1=tanya%40cs.ubc.ca&amp;emailtype1=exact&amp;emailassigned_to1=1&amp;emailreporter1=1">My&nbsp;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 000000000..cf50a3d46
--- /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@bugzilla.org --><!-- 1.0@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@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>&nbsp;</TD>
+ <TD vAlign=center align=left>DCR: TableTree should support icon in 1st
+ column (1G06WFT)</TD></TR></TBODY></TABLE><!-- 1.0@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) &nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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>&nbsp;</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>&nbsp;</TD>
+ <TD align=right><B>Reporter:</B> </TD>
+ <TD>erich_gamma@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>&nbsp;</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>&nbsp;</TD>
+ <TD align=right><B>Add&nbsp;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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned&nbsp;To</A>:
+ </B></TD>
+ <TD>veronika_irvine@ca.ibm.com (Veronika Irvine)</TD>
+ <TD>&nbsp;</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>&nbsp;</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@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&amp;action=enter">Create
+ a New Attachment</A> (proposed patch, testcase, etc.) </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=4548&amp;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&nbsp;&nbsp;&nbsp; <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_bug&amp;bug_id=4548">Show
+ votes for this bug</A>&nbsp;&nbsp;&nbsp; <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_user&amp;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&nbsp;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> &nbsp; | &nbsp; <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@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.
+
+ &lt;picture&gt;
+
+ 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@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@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) &nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A> <BR><!-- 1.0@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@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>&nbsp;</TD>
+ <TD vAlign=center align=right><A
+ href="https://bugs.eclipse.org/bugs/createaccount.cgi">New&nbsp;Account</A>
+ | <A
+ href="https://bugs.eclipse.org/bugs/query.cgi?GoAheadAndLogIn=1">Log&nbsp;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 000000000..6bae80545
--- /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@bugzilla.org --><!-- 1.0@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@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>&nbsp;</TD>
+ <TD vAlign=center align=left>NPE using quickfix in Aspect opened with java
+ editor</TD></TR></TBODY></TABLE><!-- 1.0@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) &nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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>&nbsp;</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>&nbsp;</TD>
+ <TD align=right><B>Reporter:</B> </TD>
+ <TD>hawkinsh@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>&nbsp;</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>&nbsp;</TD>
+ <TD align=right><B>Add&nbsp;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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Resolution</A>:
+ </B></TD>
+ <TD></TD>
+ <TD>&nbsp;</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>&nbsp;</TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned&nbsp;To</A>:
+ </B></TD>
+ <TD>mchapman@uk.ibm.com (Matt Chapman)</TD>
+ <TD>&nbsp;</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>&nbsp;</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@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&amp;action=enter">Create
+ a New Attachment</A> (proposed patch, testcase, etc.) </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=76146&amp;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&nbsp;</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 != '')&#10; {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@uk.ibm.com') &amp;&amp; &#10; (this.value != '')) {&#10; document.changeform.knob[4].checked=true; &#10; }"
+size=32 value=mchapman@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> &nbsp; | &nbsp; <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@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 &gt; open with &gt; 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@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) &nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A> <BR><!-- 1.0@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@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>&nbsp;</TD>
+ <TD vAlign=center align=right><A
+ href="https://bugs.eclipse.org/bugs/createaccount.cgi">New&nbsp;Account</A>
+ | <A
+ href="https://bugs.eclipse.org/bugs/query.cgi?GoAheadAndLogIn=1">Log&nbsp;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 000000000..fb15d0fa8
--- /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@bugzilla.org --><!-- 1.0@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@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>&nbsp;</TD>
+ <TD vAlign=center align=left>Junit tests fail on GTK</TD></TR></TBODY></TABLE><!-- 1.0@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>
+&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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>&nbsp;</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>&nbsp;</TD>
+ <TD align=right><B>Reporter:</B> </TD>
+ <TD>christophe_cornu@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>&nbsp;</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>&nbsp;</TD>
+ <TD align=right><B>Add&nbsp;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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Resolution</A>:
+ </B></TD>
+ <TD></TD>
+ <TD>&nbsp;</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>&nbsp;</TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned&nbsp;To</A>:
+ </B></TD>
+ <TD>felipe_heidrich@ca.ibm.com (Felipe Heidrich)</TD>
+ <TD>&nbsp;</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>&nbsp;</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@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&amp;action=enter">Create
+ a New Attachment</A> (proposed patch, testcase, etc.) </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=40152&amp;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&nbsp;&nbsp;&nbsp; <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_bug&amp;bug_id=40152">Show
+ votes for this bug</A>&nbsp;&nbsp;&nbsp; <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_user&amp;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&nbsp;</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 != '')&#10; {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@ca.ibm.com') &amp;&amp; &#10; (this.value != '')) {&#10; document.changeform.knob[4].checked=true; &#10; }"
+size=32 value=felipe_heidrich@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> &nbsp; | &nbsp; <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@bugzilla.org --><PRE>latest from head (20030715) generate about 30 errors/failures.
+
+.........................................
+.........................................
+.........................E................
+..........4
+5
+...............................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+...........F.....F...........F.E.E............
+.................F....F....................
+..........
+(&lt;unknown&gt;:6548): Gdk-CRITICAL **: file gdkdraw.c: line 238
+(gdk_drawable_get_display): assertion `GDK_IS_DRAWABLE (drawable)' failed
+
+(&lt;unknown&gt;:6548): Gdk-CRITICAL **: file gdkdisplay.c: line 498
+(gdk_display_get_window_at_pointer): assertion `GDK_IS_DISPLAY (display)'
+failed
+........
+(&lt;unknown&gt;:6548): Gdk-CRITICAL **: file gdkdraw.c: line 238
+(gdk_drawable_get_display): assertion `GDK_IS_DRAWABLE (drawable)' failed
+
+(&lt;unknown&gt;:6548): Gdk-CRITICAL **: file gdkdisplay.c: line 498
+(gdk_display_get_window_at_pointer): assertion `GDK_IS_DISPLAY (display)'
+failed
+.......................
+.........................................
+..............F...........................
+.........................................
+....................................F.....
+.........................................
+.........................................
+.........................................
+.......................................
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtkwidget.c: line 5139
+(gtk_widget_set_size_request): assertion `width &gt;= -1' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtkwidget.c: line 5139
+(gtk_widget_set_size_request): assertion `width &gt;= -1' failed
+..
+...................
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtkwidget.c: line 5139
+(gtk_widget_set_size_request): assertion `width &gt;= -1' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtkwidget.c: line 5139
+(gtk_widget_set_size_request): assertion `width &gt;= -1' failed
+......................
+.........................................
+..................................
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 9817
+(gtk_tree_view_get_path_at_pos): assertion `tree_view-&gt;priv-&gt;bin_window !=
+NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 9817
+(gtk_tree_view_get_path_at_pos): assertion `tree_view-&gt;priv-&gt;bin_window !=
+NULL' failed
+.......
+...
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtkliststore.c: line 533
+(gtk_list_store_get_path): assertion `iter-&gt;stamp == GTK_LIST_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtkliststore.c: line 533
+(gtk_list_store_get_path): assertion `iter-&gt;stamp == GTK_LIST_STORE
+(tree_model)-&gt;stamp' failed
+.........
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtkliststore.c: line 533
+(gtk_list_store_get_path): assertion `iter-&gt;stamp == GTK_LIST_STORE
+(tree_model)-&gt;stamp' failed
+..
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 9817
+(gtk_tree_view_get_path_at_pos): assertion `tree_view-&gt;priv-&gt;bin_window !=
+NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 9817
+(gtk_tree_view_get_path_at_pos): assertion `tree_view-&gt;priv-&gt;bin_window !=
+NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 9817
+(gtk_tree_view_get_path_at_pos): assertion `tree_view-&gt;priv-&gt;bin_window !=
+NULL' failed
+F...........................
+.........................................
+........................................F.
+............F........F........F...F..........
+.........................................
+.........................................
+.....................F.F...................
+.........................................
+.........................................
+................................
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 9817
+(gtk_tree_view_get_path_at_pos): assertion `tree_view-&gt;priv-&gt;bin_window !=
+NULL' failed
+F.
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter-&gt;stamp == GTK_TREE_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter-&gt;stamp == GTK_TREE_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter-&gt;stamp == GTK_TREE_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter-&gt;stamp == GTK_TREE_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter-&gt;stamp == GTK_TREE_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter-&gt;stamp == GTK_TREE_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter-&gt;stamp == GTK_TREE_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter-&gt;stamp == GTK_TREE_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter-&gt;stamp == GTK_TREE_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter-&gt;stamp == GTK_TREE_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter-&gt;stamp == GTK_TREE_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter-&gt;stamp == GTK_TREE_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter-&gt;stamp == GTK_TREE_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter-&gt;stamp == GTK_TREE_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter-&gt;stamp == GTK_TREE_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter-&gt;stamp == GTK_TREE_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter-&gt;stamp == GTK_TREE_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter-&gt;stamp == GTK_TREE_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter-&gt;stamp == GTK_TREE_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter-&gt;stamp == GTK_TREE_STORE
+(tree_model)-&gt;stamp' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+........
+.........................................
+.........................................
+...........................F..............
+.........................................
+.........................................
+.............
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtkeditable.c: line 172
+(gtk_editable_delete_selection): assertion `GTK_IS_EDITABLE (editable)' failed
+
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtkeditable.c: line 172
+(gtk_editable_delete_selection): assertion `GTK_IS_EDITABLE (editable)' failed
+F....F.......F.......F.E.......E..
+.........................................
+.........................................
+.............................
+(&lt;unknown&gt;:6548): Gtk-CRITICAL **: file gtkframe.c: line 362
+(gtk_frame_set_label_widget): assertion `label_widget == NULL || label_widget-
+&gt;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.&lt;init&gt;
+(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.&lt;init&gt;
+(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:&lt;1&gt; but was:&lt;0&gt;
+ 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:&lt;null&gt; but was:&lt;MenuItem {}&gt;
+ 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:&lt;0&gt; but was:&lt;1&gt;
+ 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:&lt;false&gt; but was:&lt;true&gt;
+ 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:&lt;1&gt; but was:&lt;0&gt;
+ 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:&lt;false&gt; but was:&lt;true&gt;
+ 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:&lt;8&gt; but was:&lt;0&gt;
+ 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:&lt;1&gt; but was:&lt;0&gt;
+ 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:&lt;1&gt; but was:&lt;10&gt;
+ 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:&lt;10&gt; but was:&lt;9&gt;
+ 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:&lt;TreeItem {}&gt; but was:&lt;null&gt;
+ 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:&lt;0&gt; but was:&lt;1&gt;
+ 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:&lt;1&gt; but was:&lt;0&gt;
+ 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:&lt;0&gt; but was:&lt;-1&gt;
+ 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:&lt;...
+...&gt; but was:&lt;......&gt;
+ 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@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@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>
+&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A> <BR><!-- 1.0@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@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>&nbsp;</TD>
+ <TD vAlign=center align=right><A
+ href="https://bugs.eclipse.org/bugs/createaccount.cgi">New&nbsp;Account</A>
+ | <A
+ href="https://bugs.eclipse.org/bugs/query.cgi?GoAheadAndLogIn=1">Log&nbsp;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 000000000..b7047a40b
--- /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@bugzilla.org --><!-- 1.0@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@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>&nbsp;</TD>
+ <TD vAlign=center align=left>DCR: TableTree should support icon in 1st
+ column (1G06WFT)</TD></TR></TBODY></TABLE><!-- 1.0@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) &nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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>&nbsp;</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>&nbsp;</TD>
+ <TD align=right><B>Reporter:</B> </TD>
+ <TD>erich_gamma@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>&nbsp;</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>&nbsp;</TD>
+ <TD align=right><B>Add&nbsp;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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned&nbsp;To</A>:
+ </B></TD>
+ <TD>veronika_irvine@ca.ibm.com (Veronika Irvine)</TD>
+ <TD>&nbsp;</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>&nbsp;</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@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&amp;action=enter">Create
+ a New Attachment</A> (proposed patch, testcase, etc.) </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=4548&amp;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&nbsp;&nbsp;&nbsp; <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_bug&amp;bug_id=4548">Show
+ votes for this bug</A>&nbsp;&nbsp;&nbsp; <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_user&amp;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&nbsp;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> &nbsp; | &nbsp; <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@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.
+
+ &lt;picture&gt;
+
+ 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@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@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) &nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A> <BR><!-- 1.0@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@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>&nbsp;</TD>
+ <TD vAlign=center align=right><A
+ href="https://bugs.eclipse.org/bugs/createaccount.cgi">New&nbsp;Account</A>
+ | <A
+ href="https://bugs.eclipse.org/bugs/query.cgi?GoAheadAndLogIn=1">Log&nbsp;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 000000000..813a29a15
--- /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@bugzilla.org --><!-- 1.0@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@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>&nbsp;</TD>
+ <TD vAlign=center align=left>Check for isDisposed() in dispose after
+ sending Dispose Calback (1GLC25X)</TD></TR></TBODY></TABLE><!-- 1.0@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) &nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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>&nbsp;</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>&nbsp;</TD>
+ <TD align=right><B>Reporter:</B> </TD>
+ <TD>veronika_irvine@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>&nbsp;</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>&nbsp;</TD>
+ <TD align=right><B>Add&nbsp;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>&nbsp;</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>&nbsp;</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@ca.ibm.com>steve_northover@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>&nbsp;</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>&nbsp;</TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Resolution</A>:
+ </B></TD>
+ <TD></TD>
+ <TD>&nbsp;</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>&nbsp;</TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned&nbsp;To</A>:
+ </B></TD>
+ <TD>Silenio_Quarti@ca.ibm.com (Silenio Quarti)</TD>
+ <TD>&nbsp;</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>&nbsp;</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@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&amp;action=enter">Create
+ a New Attachment</A> (proposed patch, testcase, etc.) </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=4862&amp;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&nbsp;&nbsp;&nbsp; <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_bug&amp;bug_id=4862">Show
+ votes for this bug</A>&nbsp;&nbsp;&nbsp; <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_user&amp;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&nbsp;</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 != '')&#10; {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@ca.ibm.com') &amp;&amp; &#10; (this.value != '')) {&#10; document.changeform.knob[4].checked=true; &#10; }"
+size=32 value=Silenio_Quarti@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> &nbsp; | &nbsp; <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@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@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@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@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) &nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A> <BR><!-- 1.0@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@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>&nbsp;</TD>
+ <TD vAlign=center align=right><A
+ href="https://bugs.eclipse.org/bugs/createaccount.cgi">New&nbsp;Account</A>
+ | <A
+ href="https://bugs.eclipse.org/bugs/query.cgi?GoAheadAndLogIn=1">Log&nbsp;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 000000000..ec9911002
--- /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@bugzilla.org --><!-- 1.0@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@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>&nbsp;</TD>
+ <TD vAlign=center align=left>NullPointerException @
+ org.eclipse.jdt.internal.debug.eval.ast.engine.ASTInstructionCompiler.containsALocalType</TD></TR></TBODY></TABLE><!-- 1.0@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) &nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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>&nbsp;</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>&nbsp;</TD>
+ <TD align=right><B>Reporter:</B> </TD>
+ <TD>Leo.Kuznetsov@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>&nbsp;</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>&nbsp;</TD>
+ <TD align=right><B>Add&nbsp;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>&nbsp;</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>&nbsp;</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@ch.ibm.com>christof_marti@ch.ibm.com</OPTION>
+ <OPTION value=Darin_Wright@ca.ibm.com>Darin_Wright@ca.ibm.com</OPTION>
+ <OPTION
+ value=Michael.Scharf@windriver.com>Michael.Scharf@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>&nbsp;</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>&nbsp;</TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Resolution</A>:
+ </B></TD>
+ <TD></TD>
+ <TD>&nbsp;</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>&nbsp;</TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned&nbsp;To</A>:
+ </B></TD>
+ <TD>luc_bourlier@us.ibm.com (Luc Bourlier)</TD>
+ <TD>&nbsp;</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>&nbsp;</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@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&amp;action=enter">Create
+ a New Attachment</A> (proposed patch, testcase, etc.) </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=67395&amp;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&nbsp;&nbsp;&nbsp; <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_bug&amp;bug_id=67395">Show
+ votes for this bug</A>&nbsp;&nbsp;&nbsp; <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_user&amp;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&nbsp;</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 != '')&#10; {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@us.ibm.com') &amp;&amp; &#10; (this.value != '')) {&#10; document.changeform.knob[3].checked=true; &#10; }"
+size=32 value=luc_bourlier@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> &nbsp; | &nbsp; <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@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@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@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@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@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@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@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@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@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@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@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) &nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A> <BR><!-- 1.0@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@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>&nbsp;</TD>
+ <TD vAlign=center align=right><A
+ href="https://bugs.eclipse.org/bugs/createaccount.cgi">New&nbsp;Account</A>
+ | <A
+ href="https://bugs.eclipse.org/bugs/query.cgi?GoAheadAndLogIn=1">Log&nbsp;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 000000000..f806fe8aa
--- /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@bugzilla.org --><!-- 1.0@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@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>&nbsp;</TD>
+ <TD vAlign=center align=left>NPE using quickfix in Aspect opened with java
+ editor</TD></TR></TBODY></TABLE><!-- 1.0@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) &nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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>&nbsp;</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>&nbsp;</TD>
+ <TD align=right><B>Reporter:</B> </TD>
+ <TD>hawkinsh@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>&nbsp;</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>&nbsp;</TD>
+ <TD align=right><B>Add&nbsp;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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Resolution</A>:
+ </B></TD>
+ <TD></TD>
+ <TD>&nbsp;</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>&nbsp;</TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned&nbsp;To</A>:
+ </B></TD>
+ <TD>mchapman@uk.ibm.com (Matt Chapman)</TD>
+ <TD>&nbsp;</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>&nbsp;</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@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&amp;action=enter">Create
+ a New Attachment</A> (proposed patch, testcase, etc.) </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=76146&amp;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&nbsp;</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 != '')&#10; {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@uk.ibm.com') &amp;&amp; &#10; (this.value != '')) {&#10; document.changeform.knob[4].checked=true; &#10; }"
+size=32 value=mchapman@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> &nbsp; | &nbsp; <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@bugzilla.org --><PRE>To recreate:
+
+- Check out the QuickFix project from ajdt.test project
+- Open TestAspect.java in the Java Editor (right click &gt; open with &gt; 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@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) &nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A> <BR><!-- 1.0@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@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>&nbsp;</TD>
+ <TD vAlign=center align=right><A
+ href="https://bugs.eclipse.org/bugs/createaccount.cgi">New&nbsp;Account</A>
+ | <A
+ href="https://bugs.eclipse.org/bugs/query.cgi?GoAheadAndLogIn=1">Log&nbsp;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 000000000..1e2c41aa0
--- /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@bugzilla.org --><!-- 1.0@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@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>&nbsp;</TD>
+ <TD vAlign=center align=left>Assertion failed during pull up
+ refactoring</TD></TR></TBODY></TABLE><!-- 1.0@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) &nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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>&nbsp;</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>&nbsp;</TD>
+ <TD align=right><B>Reporter:</B> </TD>
+ <TD>silvio_boehler@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>&nbsp;</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>&nbsp;</TD>
+ <TD align=right><B>Add&nbsp;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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Resolution</A>:
+ </B></TD>
+ <TD></TD>
+ <TD>&nbsp;</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>&nbsp;</TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned&nbsp;To</A>:
+ </B></TD>
+ <TD>dirk_baeumer@ch.ibm.com (Dirk Baeumer)</TD>
+ <TD>&nbsp;</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>&nbsp;</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@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&amp;action=enter">Create
+ a New Attachment</A> (proposed patch, testcase, etc.) </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=76388&amp;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&nbsp;&nbsp;&nbsp; <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_bug&amp;bug_id=76388">Show
+ votes for this bug</A>&nbsp;&nbsp;&nbsp; <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_user&amp;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&nbsp;</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 != '')&#10; {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@ch.ibm.com') &amp;&amp; &#10; (this.value != '')) {&#10; document.changeform.knob[4].checked=true; &#10; }"
+size=32 value=dirk_baeumer@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> &nbsp; | &nbsp; <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@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.&lt;init&gt;(TextEditProcessor.java:65)
+ at org.eclipse.text.edits.TextEditProcessor.&lt;init&gt;(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@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@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@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) &nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A> <BR><!-- 1.0@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@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>&nbsp;</TD>
+ <TD vAlign=center align=right><A
+ href="https://bugs.eclipse.org/bugs/createaccount.cgi">New&nbsp;Account</A>
+ | <A
+ href="https://bugs.eclipse.org/bugs/query.cgi?GoAheadAndLogIn=1">Log&nbsp;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/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 000000000..398008f59
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,303 @@
+#Mon Feb 13 11:20:13 PST 2006
+eclipse.preferences.version=1
+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=disabled
+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.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.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=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.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.5
+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=16
+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_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.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_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=80
+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_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_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.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.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
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 000000000..ea5da51b5
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,6 @@
+#Mon Feb 13 11:20:13 PST 2006
+eclipse.preferences.version=1
+formatter_profile=_Mylar based on Eclipse [built-in]
+formatter_settings_version=10
+internal.default.compliance=default
+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">/**\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><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 - 2006 University Of British Columbia 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 * University Of British Columbia - 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></templates>
diff --git a/org.eclipse.mylyn.bugzilla.ui/build.properties b/org.eclipse.mylyn.bugzilla.ui/build.properties
new file mode 100644
index 000000000..1ba129af7
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/build.properties
@@ -0,0 +1,27 @@
+###############################################################################
+# 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
+###############################################################################
+bin.includes = META-INF/,\
+ bugzilla-ui.jar,\
+ plugin.xml,\
+ icons/,\
+ about.html,\
+ doc/,\
+ bugzilla-help.xml
+jars.compile.order = bugzilla-ui.jar
+source.bugzilla-ui.jar = src/
+output.bugzilla-ui.jar = bin/
+src.includes = src/,\
+ plugin.xml,\
+ META-INF/,\
+ about.html,\
+ icons/,\
+ doc/
+jre.compilation.profile = J2SE-1.5
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 000000000..d0d46a007
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-remote.gif
Binary files 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 000000000..5f3396137
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-repository-new.gif
Binary files 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 000000000..78470a36f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-repository.gif
Binary files 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 000000000..1c78494f3
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/icons/eview16/bugzilla-logo.gif
Binary files 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 000000000..a20e6db8c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-bugzilla.gif
Binary files differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaOpenStructure.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaOpenStructure.java
new file mode 100644
index 000000000..3d92ac1d8
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaOpenStructure.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.mylar.internal.bugzilla.ui;
+
+/**
+ * Class to hold information about opening a bug report, such as what comment
+ * number to jump to
+ *
+ * @author Shawn Minto
+ */
+public class BugzillaOpenStructure {
+
+ private String server;
+
+ private int bugId;
+
+ private int commentNumber;
+
+ /**
+ * Constructor
+ *
+ * @param server
+ * The server that the bug resides on
+ * @param bugId
+ * The id of the bug
+ * @param commentNumber
+ * The comment number to jump to when opened, or -1
+ */
+ public BugzillaOpenStructure(String server, int bugId, int commentNumber) {
+ this.bugId = bugId;
+ this.commentNumber = commentNumber;
+ this.server = server;
+ }
+
+ /**
+ * Get the bug id to open
+ *
+ * @return The bug id
+ */
+ public Integer getBugId() {
+ return bugId;
+ }
+
+ /**
+ * Get the comment number to jump to
+ *
+ * @return The comment number or -1 if none
+ */
+ public Integer getCommentNumber() {
+ return commentNumber;
+ }
+
+ /**
+ * Get the server the bug resides on
+ *
+ * @return The server url string
+ */
+ public String getServer() {
+ return server;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaResultMatchAdapter.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaResultMatchAdapter.java
new file mode 100644
index 000000000..e2c434340
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaResultMatchAdapter.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.mylar.internal.bugzilla.ui;
+
+import org.eclipse.mylar.internal.bugzilla.core.search.BugzillaSearchResult;
+import org.eclipse.mylar.internal.bugzilla.core.search.IBugzillaResultEditorMatchAdapter;
+import org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditorInput;
+import org.eclipse.search.ui.text.AbstractTextSearchResult;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+
+public class BugzillaResultMatchAdapter implements IBugzillaResultEditorMatchAdapter {
+
+ /** An empty array of matches */
+ private final Match[] EMPTY_ARR = new Match[0];
+
+ private BugzillaSearchResult 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 ExistingBugEditorInput) {
+ ExistingBugEditorInput bi = (ExistingBugEditorInput) ei;
+ return match.getElement().equals(bi.getBug());
+ }
+ 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 ExistingBugEditorInput) {
+ ExistingBugEditorInput bi = (ExistingBugEditorInput) ei;
+ return result.getMatches(bi.getBug());
+ }
+ return EMPTY_ARR;
+ }
+
+ public void setResult(BugzillaSearchResult result) {
+ this.result = result;
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaTableContentProvider.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaTableContentProvider.java
new file mode 100644
index 000000000..f6da665c1
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaTableContentProvider.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * 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.mylar.internal.bugzilla.ui;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylar.internal.bugzilla.core.search.BugzillaContentProvider;
+import org.eclipse.mylar.internal.bugzilla.core.search.BugzillaSearchResult;
+import org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaSearchResultView;
+import org.eclipse.search.internal.ui.SearchPreferencePage;
+
+/**
+ * This implementation of <code>BugzillaContentProvider</code> is used for the
+ * table view of a Bugzilla search result.
+ */
+public class BugzillaTableContentProvider extends BugzillaContentProvider implements IStructuredContentProvider {
+
+ /** The page the Bugzilla search results are displayed in */
+ private BugzillaSearchResultView bugPage;
+
+ /**
+ * Constructor
+ *
+ * @param page
+ * The page the Bugzilla search results are displayed in
+ */
+ public BugzillaTableContentProvider(BugzillaSearchResultView page) {
+ bugPage = page;
+ }
+
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ if (newInput instanceof BugzillaSearchResult) {
+ bugResult = (BugzillaSearchResult) newInput;
+ }
+ }
+
+ @Override
+ public void elementsChanged(Object[] updatedElements) {
+ TableViewer viewer = getViewer();
+ boolean tableLimited = SearchPreferencePage.isTableLimited();
+ for (int i = 0; i < updatedElements.length; i++) {
+ if (bugResult.getMatchCount(updatedElements[i]) > 0) {
+ if (viewer.testFindItem(updatedElements[i]) != null)
+ viewer.update(updatedElements[i], null);
+ else {
+ if (!tableLimited || viewer.getTable().getItemCount() < SearchPreferencePage.getTableLimit())
+ viewer.add(updatedElements[i]);
+ }
+ } else
+ viewer.remove(updatedElements[i]);
+ }
+ }
+
+ /**
+ * Returns the viewer the bug results are displayed in.
+ */
+ private TableViewer getViewer() {
+ return (TableViewer) bugPage.getViewer();
+ }
+
+ @Override
+ public void clear() {
+ getViewer().refresh();
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+ */
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof BugzillaSearchResult) {
+ Object[] elements = ((BugzillaSearchResult) inputElement).getElements();
+ int tableLimit = SearchPreferencePage.getTableLimit();
+ if (SearchPreferencePage.isTableLimited() && elements.length > tableLimit) {
+ Object[] shownElements = new Object[tableLimit];
+ System.arraycopy(elements, 0, shownElements, 0, tableLimit);
+ return shownElements;
+ }
+ return elements;
+ }
+ return EMPTY_ARR;
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/OfflineView.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/OfflineView.java
new file mode 100644
index 000000000..fd0ca75c5
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/OfflineView.java
@@ -0,0 +1,697 @@
+///*******************************************************************************
+// * 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.mylar.internal.bugzilla.ui;
+//
+//import java.util.ArrayList;
+//import java.util.Iterator;
+//import java.util.List;
+//
+//import org.eclipse.core.runtime.CoreException;
+//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.IContentProvider;
+//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.mylar.bugzilla.core.IBugzillaBug;
+//import org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin;
+//import org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants;
+//import org.eclipse.mylar.internal.bugzilla.core.IOfflineBugListener.BugzillaOfflineStaus;
+//import org.eclipse.mylar.internal.bugzilla.core.internal.OfflineReportsFile;
+//import org.eclipse.mylar.internal.bugzilla.ui.actions.AbstractOfflineReportsAction;
+//import org.eclipse.mylar.internal.bugzilla.ui.actions.DeleteOfflineReportAction;
+//import org.eclipse.mylar.internal.bugzilla.ui.actions.ViewOfflineReportAction;
+//import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+//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.Display;
+//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 displays any bugs that have been saved offline.
+// */
+//public class OfflineView extends ViewPart {
+//
+// private static Composite parent;
+//
+// private IMemento savedMemento;
+//
+// private static DeleteOfflineReportAction remove;
+//
+// public static DeleteOfflineReportAction removeAll;
+//
+// public static SelectAllAction selectAll;
+//
+// private static ViewOfflineReportAction open;
+//
+// private Table table;
+//
+// private MenuManager contextMenu;
+//
+// private static TableViewer viewer;
+//
+// private static OfflineReportsViewContentProvider contentProvider = new OfflineReportsViewContentProvider();
+//
+// private String[] columnHeaders = { "Bug", "Summary", "Description" };
+//
+// private ColumnLayoutData columnLayouts[] = { new ColumnWeightData(3), new ColumnWeightData(5),
+// new ColumnWeightData(10) };
+//
+// /**
+// * Constructor initializes OfflineReports' source file initializes actions
+// */
+// public OfflineView() {
+// super();
+// open = new ViewOfflineReportAction(this);
+// selectAll = new SelectAllAction();
+// remove = new DeleteOfflineReportAction(this, false);
+// removeAll = new DeleteOfflineReportAction(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 parentComposite) {
+// OfflineView.parent = parentComposite;
+// setPartName("Bugzilla Offline Reports");
+// 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(contentProvider);
+// viewer.setLabelProvider(new OfflineReportsViewLabelProvider());
+// viewer.setInput(BugzillaPlugin.getDefault().getOfflineReports().elements());
+//
+// viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+// public void selectionChanged(SelectionChangedEvent event) {
+// OfflineView.this.widgetSelected(event);
+// }
+// });
+//
+// fillToolbar();
+// createContextMenu();
+//
+// Menu menu = contextMenu.createContextMenu(table);
+// table.setMenu(menu);
+//
+// hookGlobalActions();
+// parentComposite.layout();
+//
+// // Restore state from the previous session.
+// restoreState();
+// }
+//
+// @Override
+// public void setFocus() {
+// // don't need to do anything when we get focus
+// }
+//
+// 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(parent, 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 OfflineReports
+// // sortByIDAction = new SortByAction(OfflineReportsFile.ID_SORT);
+// // sortByIDAction.setText("by &Bug ID");
+// // sortByIDAction.setToolTipText("Sorts by Bug number");
+// //
+// // sortByTypeAction = new SortByAction(OfflineReportsFile.TYPE_SORT);
+// // sortByTypeAction.setText("by &Bug Type");
+// // sortByTypeAction.setToolTipText("Sorts by locally created/from server
+// // status");
+//
+// // 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(sortByTypeAction);
+//
+// // updateSortingState();
+// }
+//
+// // /**
+// // * Function to make sure that the appropriate sort is checked
+// // */
+// // void updateSortingState() {
+// // int curCriterion = OfflineReportsFile.lastSel;
+// //
+// // sortByIDAction.setChecked(curCriterion == OfflineReportsFile.ID_SORT);
+// // sortByTypeAction.setChecked(curCriterion ==
+// // OfflineReportsFile.TYPE_SORT);
+// // viewer.setInput(viewer.getInput());
+// // }
+// //
+// // // Sorting actions for the OfflineReports view
+// // SortByAction sortByIDAction, sortByTypeAction/*, sortBySeverityAction,
+// // sortByPriorityAction, sortByStatusAction*/;
+//
+// // /**
+// // * Inner class to handle sorting
+// // * @author Shawn Minto
+// // */
+// // class SortByAction extends Action {
+// // /** The criteria to sort the OfflineReports menu based on */
+// // private int criterion;
+// //
+// // /**
+// // * Constructor
+// // * @param criteria The criteria to sort the OfflineReports menu based on
+// // */
+// // public SortByAction(int criteria) {
+// // this.criterion = criteria;
+// // }
+// //
+// // /**
+// // * Perform the sort
+// // */
+// // @Override
+// // public void run() {
+// // BugzillaPlugin.getDefault().getOfflineReports().sort(criterion);
+// // updateSortingState();
+// // }
+// // }
+//
+// /**
+// * Create context menu.
+// */
+// private void createContextMenu() {
+// contextMenu = new MenuManager("#OfflineReportsView");
+// contextMenu.setRemoveAllWhenShown(true);
+// contextMenu.addMenuListener(new IMenuListener() {
+// public void menuAboutToShow(IMenuManager manager) {
+// fillContextMenu(manager);
+// updateActionEnablement();
+// }
+// });
+//
+// // Register menu for extension.
+// getSite().registerContextMenu("#OfflineReportsView", 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 DeleteOfflineReportAction(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().getOfflineReports().find(Integer.valueOf(id).intValue());
+// }
+// table.setSelection(objList);
+// }
+// }
+// viewer.setSelection(viewer.getSelection(), true);
+// savedMemento = null;
+// updateActionEnablement();
+// }
+//
+// /**
+// * Returns list of names of selected items.
+// */
+// @SuppressWarnings("unchecked")
+// public List<Integer> getBugIdsOfSelected() {
+// IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();// TableItem[]
+// // sel
+// // =
+// // table.getSelection();
+// List<Object> sel = selection.toList();
+// List<Integer> Ids = new ArrayList<Integer>();
+//
+// Iterator<Object> itr = sel.iterator();
+// while (itr.hasNext()) {
+// Object o = itr.next();
+// if (o instanceof IBugzillaBug) {
+// IBugzillaBug entry = (IBugzillaBug) o;
+// Integer id = entry.getId();
+// if (!entry.isLocallyCreated()) {
+// Ids.add(id);
+// }
+// }
+// }
+//
+// return Ids;
+// }
+//
+// /**
+// * @return List of selected offline bug reports.
+// */
+// @SuppressWarnings("unchecked")
+// public List<IBugzillaBug> getSelectedBugs() {
+// List<Object> selection = ((IStructuredSelection) viewer.getSelection()).toList();
+// List<IBugzillaBug> bugs = new ArrayList<IBugzillaBug>();
+// for (Iterator<Object> iter = selection.iterator(); iter.hasNext();) {
+// Object obj = iter.next();
+// if (obj instanceof IBugzillaBug) {
+// bugs.add((IBugzillaBug) obj);
+// }
+// }
+// return bugs;
+// }
+//
+// /**
+// * Closes any open editors of the given offline reports.
+// *
+// * @param reports
+// * The list of offline reports that need their editors closed.
+// */
+// protected void closeOfflineReports(List<IBugzillaBug> reports) {
+// if (reports == null)
+// return;
+//
+// IWorkbenchPage page = BugzillaPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
+//
+// // if we couldn't get the page, get out of here
+// if (page == null)
+// return;
+//
+// for (Iterator<IBugzillaBug> iter = reports.iterator(); iter.hasNext();) {
+// IBugzillaBug bug = iter.next();
+// BugzillaUITools.closeEditor(page, bug);
+// }
+// }
+//
+// /**
+// * Refreshes the view.
+// */
+// public static void refreshView() {
+// if (viewer != null && !viewer.getControl().isDisposed()) {
+// if (viewer.getContentProvider() == null)
+// viewer.setContentProvider(contentProvider);
+// if (viewer.getContentProvider() == null)
+// return;
+// viewer.setInput(viewer.getInput());
+// }
+// }
+//
+// /**
+// * Calls remove function in OfflineReportsFile
+// */
+// @SuppressWarnings("unchecked")
+// public void deleteSelectedOfflineReports() {
+// List<IBugzillaBug> selection = ((IStructuredSelection) viewer.getSelection()).toList();
+// closeOfflineReports(selection);
+// for (IBugzillaBug bug : selection) {
+// removeReport(bug);
+// }
+// viewer.setInput(viewer.getInput());
+// }
+//
+// /**
+// * Removes all of the offline reports in the OfflineReportsFile.
+// */
+// public void deleteAllOfflineReports() {
+// closeOfflineReports(BugzillaPlugin.getDefault().getOfflineReports().elements());
+// List<IBugzillaBug> reports = new ArrayList<IBugzillaBug>(OfflineReportsFile.getOfflineBugs());
+// for (IBugzillaBug bug : reports) {
+// removeReport(bug);
+// }
+// viewer.setInput(viewer.getInput());
+// }
+//
+// /**
+// * Saves the given report to the offlineReportsFile, or, if it already
+// * exists in the file, updates it.
+// *
+// * @param bug
+// * The bug to add/update.
+// * @param saveChosen
+// * This is used to determine a refresh from a user save
+// */
+// public static void saveOffline(final IBugzillaBug bug, final boolean saveChosen) {
+// Display.getDefault().asyncExec(new Runnable() {
+// public void run() {
+//
+// OfflineReportsFile file = BugzillaPlugin.getDefault().getOfflineReports();
+// // If there is already an offline report for this bug, update
+// // the file.
+// if (bug.isSavedOffline()) {
+// file.update();
+// }
+// // If this bug has not been saved offline before, add it to the
+// // file.
+// else {
+// // If there is already an offline report with the same id,
+// // don't save this report.
+// // int index = -1;
+// // if ((index = file.find(bug.getId())) >= 0) {
+// // removeReport(getOfflineBugs().get(index));
+// // MessageDialog.openInformation(null, "Bug's Id is already
+// // used.", "There is already a bug saved offline with an
+// // identical id.");
+// // return;
+// // }
+// try {
+// file.add(bug, saveChosen);
+// bug.setOfflineState(true);
+// } catch (CoreException e) {
+// MylarStatusHandler.fail(e, e.getMessage(), false);
+// }
+// // file.sort(OfflineReportsFile.lastSel);
+// }
+// // OfflineView.checkWindow();
+// OfflineView.refreshView();
+// }
+// });
+// }
+//
+// public static List<IBugzillaBug> getOfflineBugs() {
+// OfflineReportsFile file = BugzillaPlugin.getDefault().getOfflineReports();
+// return file.elements();
+// }
+//
+// /**
+// * Removes the given report from the offlineReportsFile.
+// *
+// * @param bug
+// * The report to remove.
+// */
+// public static void removeReport(IBugzillaBug bug) {
+// BugzillaPlugin.getDefault().fireOfflineStatusChanged(bug, BugzillaOfflineStaus.DELETED);
+//
+// ArrayList<IBugzillaBug> bugList = new ArrayList<IBugzillaBug>();
+// bugList.add(bug);
+// BugzillaPlugin.getDefault().getOfflineReports().remove(bugList);
+//
+// if (viewer != null && !viewer.getControl().isDisposed()) {
+// if (viewer.getContentProvider() == null)
+// viewer.setContentProvider(contentProvider);
+// if (viewer.getContentProvider() == null)
+// return;
+// viewer.setInput(viewer.getInput());
+// }
+// }
+//
+//// public static IBugzillaBug find(int bugId) {
+//// int location = BugzillaPlugin.getDefault().getOfflineReports().find(bugId);
+//// if (location != -1) {
+//// return BugzillaPlugin.getDefault().getOfflineReports().elements().get(location);
+//// }
+//// return null;
+//// }
+//
+// /**
+// * @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<IBugzillaBug> sel = viewerSelection.toList();
+// if (sel.size() > 0) {
+// IStatusLineManager manager = this.getViewSite().getActionBars().getStatusLineManager();
+// manager.setMessage(sel.get(0).toString());
+// }
+//
+// updateActionEnablement();
+// }
+//
+// /**
+// * Attempts to display this view on the workbench.
+// */
+// public static void checkWindow() {
+// if (parent == null || parent.isDisposed()) {
+// IWorkbenchWindow w = BugzillaPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
+// if (w != null) {
+// IWorkbenchPage page = w.getActivePage();
+// if (page != null) {
+// try {
+// page.showView(IBugzillaConstants.PLUGIN_ID + ".ui.offlineReportsView");
+// } catch (PartInitException pie) {
+// BugzillaPlugin.log(pie.getStatus());
+// }
+// }
+// }
+// }
+// }
+//
+// /**
+// * Action class - "Select All"
+// */
+// public class SelectAllAction extends AbstractOfflineReportsAction {
+//
+// public SelectAllAction() {
+// setToolTipText("Select all offline Bugzilla reports");
+// setText("Select all");
+// setImageDescriptor(BugzillaImages.SELECT_ALL);
+// }
+//
+// @Override
+// public void run() {
+// checkWindow();
+// table.selectAll();
+// viewer.setSelection(viewer.getSelection(), true);
+// updateActionEnablement();
+// }
+// }
+//
+// private class OfflineReportsViewLabelProvider 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 IBugzillaBug) {
+// IBugzillaBug f = (IBugzillaBug) element;
+// switch (columnIndex) {
+// case 0:
+// return f.getLabel();
+// case 1:
+// return f.getSummary();
+// case 2:
+// return f.getDescription();
+// 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 static void refresh() {
+// if (viewer != null && !viewer.getTable().isDisposed())
+// viewer.refresh();
+// }
+//
+// private static class OfflineReportsViewContentProvider implements IStructuredContentProvider {
+//
+// private List results;
+//
+// /**
+// * The constructor.
+// */
+// public OfflineReportsViewContentProvider() {
+// // no setup needed
+// }
+//
+// /**
+// * 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.
+// *
+// * @see IContentProvider#inputChanged
+// */
+// public void inputChanged(Viewer inputViewer, Object oldInput, Object newInput) {
+// this.results = (List) newInput;
+// }
+//
+// public void dispose() {
+// if (results != null)
+// results = null;
+// }
+// }
+//}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/ViewBugzillaAction.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/ViewBugzillaAction.java
new file mode 100644
index 000000000..55cc6bee2
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/ViewBugzillaAction.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * 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.mylar.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.mylar.internal.bugzilla.core.BugzillaPlugin;
+import org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylar.internal.bugzilla.ui.editor.AbstractBugEditor;
+import org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditorInput;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.progress.UIJob;
+
+/**
+ * Action performed when the bugs are supposed to be displayed in the editor
+ * window from the favorites list
+ */
+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 = BugzillaPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
+
+ // go through each bug and get its id
+ for (Iterator<BugzillaOpenStructure> it = bugs.iterator(); it.hasNext();) {
+ BugzillaOpenStructure bos = it.next();
+ Integer bugId = bos.getBugId();
+ Integer commentNumber = bos.getCommentNumber();
+
+ try {
+ // try to open a new editor on the bug
+ ExistingBugEditorInput editorInput = new ExistingBugEditorInput(bos.getServer(), bugId.intValue());
+
+ // if the bug could not be found, then tell the user that the
+ // server settings are wrong
+ if (editorInput.getBug() == null) {
+ MessageDialog.openError(null, "Server Setting Error", "Incorrect server set for the bug.");
+ } else {
+ AbstractBugEditor abe = (AbstractBugEditor) page.openEditor(editorInput,
+ IBugzillaConstants.EXISTING_BUG_EDITOR_ID);
+ if (commentNumber == 0) {
+ abe.selectDescription();
+ } else if (commentNumber == 1) {
+ abe.select(commentNumber);
+ } else {
+ abe.select(commentNumber - 1);
+ }
+ }
+ } catch (LoginException e) {
+ 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. ");
+ BugzillaPlugin.log(e);
+ } catch (PartInitException e) {
+ BugzillaPlugin.log(e);
+ } catch (IOException e) {
+ BugzillaPlugin.getDefault().logAndShowExceptionDetailsDialog(e,
+ "occurred while opening the bug report.", "Bugzilla Error");
+ }
+ }
+ return new Status(IStatus.OK, IBugzillaConstants.PLUGIN_ID, IStatus.OK, "", null);
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/AbstractFavoritesAction.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/AbstractFavoritesAction.java
new file mode 100644
index 000000000..6c9e1b47c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/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.mylar.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.mylar.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 BugzillaPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell();
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/AbstractOfflineReportsAction.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/AbstractOfflineReportsAction.java
new file mode 100644
index 000000000..c16ab1022
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/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.mylar.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.mylar.internal.bugzilla.core.BugzillaPlugin;
+import org.eclipse.mylar.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.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/AddBugzillaQueryAction.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/AddBugzillaQueryAction.java
new file mode 100644
index 000000000..13a8116c9
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/AddBugzillaQueryAction.java
@@ -0,0 +1,123 @@
+package org.eclipse.mylar.internal.bugzilla.ui.actions;
+/*******************************************************************************
+ * 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
+ ******************************************************************************/
+// /*******************************************************************************
+// * 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.mylar.internal.bugzilla.ui.actions;
+//
+// import org.eclipse.core.runtime.CoreException;
+// import org.eclipse.core.runtime.IProgressMonitor;
+// import org.eclipse.jface.action.Action;
+// import org.eclipse.jface.action.IAction;
+// import org.eclipse.jface.dialogs.Dialog;
+// import org.eclipse.jface.dialogs.MessageDialog;
+// import org.eclipse.jface.viewers.ISelection;
+// import org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages;
+// import org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaCustomRepositoryQuery;
+// import org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryQuery;
+// import org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaQueryDialog;
+// import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+// import org.eclipse.mylar.internal.tasklist.MylarTaskListPlugin;
+// import org.eclipse.mylar.internal.tasklist.TaskListPreferenceConstants;
+// import org.eclipse.mylar.internal.tasklist.TaskRepositoryManager;
+// import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+// import org.eclipse.mylar.tasklist.TaskRepository;
+// 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.WorkspaceModifyOperation;
+// import org.eclipse.ui.progress.IProgressService;
+//
+// /**
+// * @author Mik Kersten
+// */
+// public class AddBugzillaQueryAction extends Action implements
+// IViewActionDelegate {
+//
+// public static final String ID =
+// "org.eclipse.mylar.tasklist.actions.create.bug.query";
+//
+// public AddBugzillaQueryAction() {
+// setText("Add Bugzilla Query");
+// setToolTipText("Add Bugzilla Query");
+// setId(ID);
+// setImageDescriptor(BugzillaImages.CATEGORY_QUERY_NEW);
+// }
+//
+// @Override
+// public void run() {
+// BugzillaQueryDialog queryDialog = new
+// BugzillaQueryDialog(Display.getCurrent().getActiveShell());
+// if(queryDialog.open() == Dialog.OK){
+// TaskRepository repository = queryDialog.getRepository();
+// if (repository == null) {
+// MessageDialog.openInformation(Display.getCurrent().getActiveShell(), "Mylar
+// Bugzilla Client",
+// TaskRepositoryManager.MESSAGE_NO_REPOSITORY);
+// return;
+// }
+//
+// final BugzillaRepositoryQuery queryCategory;
+// if(!queryDialog.isCustom()){
+// queryCategory = new
+// BugzillaRepositoryQuery(repository.getUrl().toExternalForm(),
+// queryDialog.getUrl(), queryDialog.getName(), queryDialog.getMaxHits());
+// } else {
+// queryCategory = new
+// BugzillaCustomRepositoryQuery(repository.getUrl().toExternalForm(),
+// queryDialog.getName(), queryDialog.getUrl(), queryDialog.getMaxHits());
+// }
+// MylarTaskListPlugin.getTaskListManager().addQuery(queryCategory);
+// boolean offline =
+// MylarTaskListPlugin.getPrefs().getBoolean(TaskListPreferenceConstants.WORK_OFFLINE);
+// if(!offline){
+// WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
+// protected void execute(IProgressMonitor monitor) throws CoreException {
+// queryCategory.refreshBugs();
+// }
+// };
+//
+// IProgressService service = PlatformUI.getWorkbench().getProgressService();
+// try {
+// service.run(true, true, op);
+// } catch (Exception e) {
+// MylarStatusHandler.log(e, "There was a problem executing the query refresh");
+// }
+// }
+// if(TaskListView.getDefault() != null) {
+// // TODO: remove
+// 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.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/BugzillaSortAction.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/BugzillaSortAction.java
new file mode 100644
index 000000000..13f253282
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/BugzillaSortAction.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.mylar.internal.bugzilla.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaSearchResultView;
+
+/**
+ * This class sorts Bugzilla search results by a supplied category.
+ */
+public class BugzillaSortAction extends Action {
+
+ /** The category that this class sorts Bugzilla search results by. */
+ private int bugSortOrder;
+
+ /** The view where the Bugzilla search results are displayed. */
+ private BugzillaSearchResultView bugPage;
+
+ /**
+ * Constructor
+ *
+ * @param label
+ * The string used as the text for the action, or null if there
+ * is no text
+ * @param page
+ * The view where the Bugzilla search results are displayed.
+ * @param sortOrder
+ * The category that this class sorts Bugzilla search results by
+ */
+ public BugzillaSortAction(String label, BugzillaSearchResultView page, int sortOrder) {
+ super(label);
+ bugPage = page;
+ bugSortOrder = sortOrder;
+ }
+
+ /**
+ * Reorder the Bugzilla search results.
+ */
+ @Override
+ public void run() {
+ bugPage.setSortOrder(bugSortOrder);
+ }
+
+ /**
+ * Returns the category that this class sorts Bugzilla search results by.
+ */
+ public int getSortOrder() {
+ return bugSortOrder;
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/DeleteFavoriteAction.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/DeleteFavoriteAction.java
new file mode 100644
index 000000000..eb9e0eca8
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/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.mylar.internal.bugzilla.ui.actions;
+
+import org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages;
+import org.eclipse.mylar.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.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/OpenBugsAction.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/OpenBugsAction.java
new file mode 100644
index 000000000..39a433fb0
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/OpenBugsAction.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * 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.mylar.internal.bugzilla.ui.actions;
+
+import java.util.Iterator;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin;
+import org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylar.internal.bugzilla.ui.BugzillaUITools;
+import org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaSearchResultView;
+import org.eclipse.search.internal.ui.SearchMessages;
+import org.eclipse.search.internal.ui.util.ExceptionHandler;
+
+/**
+ * This class is used to open a bug report in an editor.
+ */
+public class OpenBugsAction extends Action {
+
+ /** The view this action works on */
+ private BugzillaSearchResultView resultView;
+
+ /**
+ * Constructor
+ *
+ * @param text
+ * The text for this action
+ * @param resultView
+ * The <code>BugzillaSearchResultView</code> this action works
+ * on
+ */
+ public OpenBugsAction(String text, BugzillaSearchResultView 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<IMarker> it = selection.iterator(); it.hasNext();) {
+ IMarker marker = it.next();
+ try {
+
+ String repositoryUrl = (String) marker.getAttribute(IBugzillaConstants.HIT_MARKER_ATTR_REPOSITORY);
+ Integer id = (Integer) marker.getAttribute(IBugzillaConstants.HIT_MARKER_ATTR_ID);
+ BugzillaUITools.show(repositoryUrl, id.intValue());
+ } catch (CoreException e) {
+ // if an error occurs, handle and log it
+ ExceptionHandler.handle(e, SearchMessages.Search_Error_search_title,
+ SearchMessages.Search_Error_search_message); //$NON-NLS-2$ //$NON-NLS-1$
+ BugzillaPlugin.log(e.getStatus());
+ }
+ }
+
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/ViewFavoriteAction.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/ViewFavoriteAction.java
new file mode 100644
index 000000000..5113796ae
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/actions/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.mylar.internal.bugzilla.ui.actions;
+
+import java.util.List;
+
+import org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages;
+import org.eclipse.mylar.internal.bugzilla.ui.BugzillaOpenStructure;
+import org.eclipse.mylar.internal.bugzilla.ui.FavoritesView;
+import org.eclipse.mylar.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.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/AbstractBugEditorInput.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/AbstractBugEditorInput.java
new file mode 100644
index 000000000..6a52b1b8f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/AbstractBugEditorInput.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.mylar.internal.bugzilla.ui.editor;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylar.bugzilla.core.IBugzillaBug;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+
+/**
+ * Abstract base implementation of an <code>IEditorInput</code> for a subclass
+ * of <code>AbstractBugEditor</code>.
+ */
+public abstract class AbstractBugEditorInput implements IEditorInput {
+
+ protected String toolTipText = "";
+
+ /**
+ * 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;
+ }
+
+ /**
+ * @return The <code>IBugzillaBug</code> object for this editor input.
+ */
+ public abstract IBugzillaBug getBug();
+
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ public String getToolTipText() {
+ return toolTipText;
+ }
+
+ 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);
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaEditorCopyAction.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaEditorCopyAction.java
new file mode 100644
index 000000000..bd8b6db5a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaEditorCopyAction.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * 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.mylar.internal.bugzilla.ui.editor;
+
+import org.eclipse.jface.action.Action;
+
+/**
+ * Action used to copy selected text from a bug editor to the clipboard.
+ */
+public class BugzillaEditorCopyAction extends Action {
+ /** The editor to copy text selections from. */
+ private AbstractBugEditor bugEditor;
+
+ /**
+ * Creates a new <code>BugzillaEditorCopyAction</code>.
+ *
+ * @param editor
+ * The editor that this action is copying text selections from.
+ */
+ public BugzillaEditorCopyAction(AbstractBugEditor editor) {
+ bugEditor = editor;
+ setText("AbstractBugEditor.copy.text");
+ }
+
+ @Override
+ public void run() {
+ bugEditor.getCurrentText().copy();
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaOutlineComparer.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaOutlineComparer.java
new file mode 100644
index 000000000..fb0571d80
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaOutlineComparer.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.mylar.internal.bugzilla.ui.editor;
+
+import org.eclipse.jface.viewers.IElementComparer;
+import org.eclipse.mylar.internal.bugzilla.core.BugzillaTools;
+import org.eclipse.mylar.internal.bugzilla.core.IBugzillaReportSelection;
+
+/**
+ * This class is used to compare two <code>IBugzillaReportSelection</code>
+ * objects.
+ *
+ * @see IElementComparer
+ * @see IBugzillaReportSelection
+ */
+public class BugzillaOutlineComparer implements IElementComparer {
+
+ public boolean equals(Object a, Object b) {
+ if ((a instanceof IBugzillaReportSelection) && (b instanceof IBugzillaReportSelection)) {
+ IBugzillaReportSelection s1 = (IBugzillaReportSelection) a;
+ IBugzillaReportSelection s2 = (IBugzillaReportSelection) b;
+
+ // An IBugzillaReportSelection is uniquely defined by its handle and
+ // its contents
+ return ((BugzillaTools.getHandle(s1).equals(BugzillaTools.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 IBugzillaReportSelection) {
+ IBugzillaReportSelection sel = (IBugzillaReportSelection) element;
+
+ // An IBugzillaReportSelection is uniquely defined by its handle and
+ // its contents
+ return (BugzillaTools.getHandle(sel) + sel.getContents()).hashCode();
+ }
+ return element.hashCode();
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaOutlineNode.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaOutlineNode.java
new file mode 100644
index 000000000..b18a6ea8f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaOutlineNode.java
@@ -0,0 +1,355 @@
+/*******************************************************************************
+ * 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.mylar.internal.bugzilla.ui.editor;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.mylar.bugzilla.core.BugReport;
+import org.eclipse.mylar.bugzilla.core.Comment;
+import org.eclipse.mylar.bugzilla.core.IBugzillaBug;
+import org.eclipse.mylar.internal.bugzilla.core.IBugzillaReportSelection;
+import org.eclipse.mylar.internal.bugzilla.core.NewBugModel;
+import org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * A node for the tree in the <code>BugzillaOutlinePage</code>.
+ *
+ * @author Mik Kersten (hardening of prototype)
+ */
+public class BugzillaOutlineNode implements IBugzillaReportSelection {
+
+ /** The id of the Bugzilla object that the selection was on. */
+ protected int id;
+
+ /** The server of the Bugzilla object that the selection was on. */
+ protected String server;
+
+ /** The label for this piece of data. */
+ private String key;
+
+ /** The children of this node. */
+ private ArrayList<BugzillaOutlineNode> nodeChildren;
+
+ /** The parent of this node or null if it is the bug report */
+ private BugzillaOutlineNode parent;
+
+ /** This node's image. */
+ private Image image;
+
+ private Object data = null;
+
+ private String bugSummary;
+
+ private boolean fromEditor = false;
+
+ private boolean isCommentHeader = false;
+
+ private boolean isDescription = false;
+
+ /**
+ * Creates a new <code>BugzillaOutlineNode</code>.
+ *
+ * @param id
+ * The id 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 BugzillaOutlineNode(int id, String server, String key, Image image, Object data, String summary) {
+ this.id = id;
+ this.server = server;
+ this.key = key;
+ this.nodeChildren = null;
+ this.image = image;
+ 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 BugzillaOutlineNode[] getChildren() {
+ return (nodeChildren == null) ? new BugzillaOutlineNode[0] : nodeChildren
+ .toArray(new BugzillaOutlineNode[nodeChildren.size()]);
+ }
+
+ /**
+ * Adds a node to this node's list of children.
+ *
+ * @param bugNode
+ * The new child.
+ */
+ public void addChild(BugzillaOutlineNode bugNode) {
+ if (nodeChildren == null) {
+ nodeChildren = new ArrayList<BugzillaOutlineNode>();
+ }
+ bugNode.setParent(this);
+ nodeChildren.add(bugNode);
+ }
+
+ /**
+ * @return The label of this node.
+ */
+ public String getKey() {
+ return key;
+ }
+
+ // /**
+ // * Set the label of this node.
+ // * @param key The new label.
+ // */
+ // public void setKey(String key) {
+ // this.key = key;
+ // }
+
+ /**
+ * TODO: remove, nodes don't need to know about image decorator
+ */
+ public Image getImage() {
+ return image;
+ }
+
+ /**
+ * Sets the decorator image for this node.
+ *
+ * @param newImage
+ * The new image.
+ */
+ public void setImage(Image newImage) {
+ this.image = newImage;
+ }
+
+ /**
+ * @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 BugzillaOutlineNode) {
+ BugzillaOutlineNode bugNode = (BugzillaOutlineNode) 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>BugzillaOutlineNode</code>'s suitable for use in the
+ * <code>BugzillaOutlinePage</code> view.
+ *
+ * @param bug
+ * The bug that needs parsing.
+ * @return The tree of <code>BugzillaOutlineNode</code>'s.
+ */
+ public static BugzillaOutlineNode parseBugReport(IBugzillaBug bug) {
+ // Choose the appropriate parsing function based on
+ // the type of IBugzillaBug.
+ if (bug instanceof NewBugModel) {
+ return parseBugReport((NewBugModel) bug);
+ } else if (bug instanceof BugReport) {
+ return parseBugReport((BugReport) bug);
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Parses the given <code>NewBugModel</code> into a tree of
+ * <code>BugzillaOutlineNode</code>'s suitable for use in the
+ * <code>BugzillaOutlinePage</code> view.
+ *
+ * @param bug
+ * The <code>NewBugModel</code> that needs parsing.
+ * @return The tree of <code>BugzillaOutlineNode</code>'s.
+ */
+ protected static BugzillaOutlineNode parseBugReport(NewBugModel bug) {
+ int bugId = bug.getId();
+ String bugServer = bug.getRepositoryUrl();
+ Image bugImage = BugzillaImages.getImage(BugzillaImages.BUG);
+ Image defaultImage = BugzillaImages.getImage(BugzillaImages.BUG_COMMENT);
+ BugzillaOutlineNode topNode = new BugzillaOutlineNode(bugId, bugServer, bug.getLabel(), bugImage, bug, bug
+ .getSummary());
+
+ topNode.addChild(new BugzillaOutlineNode(bugId, bugServer, "New Description", defaultImage, null, bug
+ .getSummary()));
+
+ BugzillaOutlineNode titleNode = new BugzillaOutlineNode(bugId, bugServer, "NewBugModel Object", defaultImage,
+ null, bug.getSummary());
+ titleNode.addChild(topNode);
+
+ return titleNode;
+ }
+
+ /**
+ * Parses the given <code>BugReport</code> into a tree of
+ * <code>BugzillaOutlineNode</code>'s suitable for use in the
+ * <code>BugzillaOutlinePage</code> view.
+ *
+ * @param bug
+ * The <code>BugReport</code> that needs parsing.
+ * @return The tree of <code>BugzillaOutlineNode</code>'s.
+ */
+ protected static BugzillaOutlineNode parseBugReport(BugReport bug) {
+
+ int bugId = bug.getId();
+ String bugServer = bug.getRepositoryUrl();
+ Image bugImage = BugzillaImages.getImage(BugzillaImages.BUG);
+ Image defaultImage = BugzillaImages.getImage(BugzillaImages.BUG_COMMENT);
+ BugzillaOutlineNode topNode = new BugzillaOutlineNode(bugId, bugServer, bug.getLabel(), bugImage, bug, bug
+ .getSummary());
+
+ BugzillaOutlineNode desc = new BugzillaOutlineNode(bugId, bugServer, "Description", defaultImage, bug
+ .getDescription(), bug.getSummary());
+ desc.setIsDescription(true);
+
+ topNode.addChild(desc);
+
+ BugzillaOutlineNode comments = null;
+ for (Iterator<Comment> iter = bug.getComments().iterator(); iter.hasNext();) {
+ Comment comment = iter.next();
+
+ if (comments == null) {
+ comments = new BugzillaOutlineNode(bugId, bugServer, "Comments", defaultImage, comment, bug
+ .getSummary());
+ comments.setIsCommentHeader(true);
+ }
+ comments.addChild(new BugzillaOutlineNode(bugId, bugServer, comment.getCreated().toString(), defaultImage,
+ comment, bug.getSummary()));
+ }
+ if (comments != null) {
+ topNode.addChild(comments);
+ }
+
+ topNode
+ .addChild(new BugzillaOutlineNode(bugId, bugServer, "New Comment", defaultImage, null, bug.getSummary()));
+
+ BugzillaOutlineNode titleNode = new BugzillaOutlineNode(bugId, bugServer, "BugReport Object", defaultImage,
+ 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 Comment) && !(key.toLowerCase().equals("comments"));
+ }
+
+ public Comment getComment() {
+ return (hasComment()) ? (Comment) data : null;
+ }
+
+ public void setComment(Comment comment) {
+ data = comment;
+ }
+
+ public String getContents() {
+ return key;
+ }
+
+ public void setContents(String contents) {
+ key = contents;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getServer() {
+ return server;
+ }
+
+ public void setServer(String server) {
+ this.server = server;
+ }
+
+ public boolean isEmpty() {
+ return (server == null) || ((getContents() == null) && (getComment() == null));
+ }
+
+ public BugzillaOutlineNode getParent() {
+ return parent;
+ }
+
+ public void setParent(BugzillaOutlineNode 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.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaOutlinePage.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaOutlinePage.java
new file mode 100644
index 000000000..b8c04448a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaOutlinePage.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * 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.mylar.internal.bugzilla.ui.editor;
+
+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.mylar.internal.bugzilla.core.BugzillaTools;
+import org.eclipse.mylar.internal.bugzilla.core.IBugzillaReportSelection;
+import org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+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;
+
+/**
+ * An outline page for a <code>BugEditor</code>.
+ */
+public class BugzillaOutlinePage extends ContentOutlinePage {
+
+ private BugzillaOutlineNode topTreeNode;
+
+ protected final ISelectionListener selectionListener = new ISelectionListener() {
+ public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+ if ((part instanceof AbstractBugEditor) && (selection instanceof IStructuredSelection)) {
+ if (((IStructuredSelection) selection).getFirstElement() instanceof IBugzillaReportSelection) {
+ if (((IStructuredSelection) getSelection()).getFirstElement() instanceof IBugzillaReportSelection) {
+ IBugzillaReportSelection brs1 = (IBugzillaReportSelection) ((IStructuredSelection) getSelection())
+ .getFirstElement();
+ IBugzillaReportSelection brs2 = ((IBugzillaReportSelection) ((IStructuredSelection) selection)
+ .getFirstElement());
+ if (BugzillaTools.getHandle(brs1).compareTo(BugzillaTools.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>BugzillaOutlinePage</code>.
+ *
+ * @param topTreeNode
+ * The top data node of the tree for this view.
+ * @param editor
+ * The editor this outline page is for.
+ */
+ public BugzillaOutlinePage(BugzillaOutlineNode topTreeNode) {
+ super();
+ this.topTreeNode = topTreeNode;
+ }
+
+ @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 BugzillaOutlineNode) {
+ BugzillaOutlineNode node = (BugzillaOutlineNode) element;
+ if (node.getComment() != null) {
+ return node.getImage();
+ } else {
+ return BugzillaImages.getImage(BugzillaImages.BUG);
+ }
+ } else {
+ return super.getImage(element);
+ }
+ }
+
+ @Override
+ public String getText(Object element) {
+ if (element instanceof BugzillaOutlineNode) {
+ BugzillaOutlineNode node = (BugzillaOutlineNode) element;
+ if (node.getComment() != null) {
+ return node.getComment().getAuthorName() + " (" + node.getName() + ")";
+ } else {
+ return node.getName();
+ }
+ }
+ return super.getText(element);
+ }
+ });
+ try {
+ viewer.setInput(topTreeNode);
+ viewer.setComparer(new BugzillaOutlineComparer());
+ viewer.expandAll();
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, "could not create bugzilla outline", true);
+ }
+ 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 class BugTaskOutlineContentProvider implements ITreeContentProvider {
+
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof BugzillaOutlineNode) {
+ Object[] children = ((BugzillaOutlineNode) 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 BugzillaOutlineNode) {
+ return ((BugzillaOutlineNode) element).getChildren().length > 0;
+ }
+ return false;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof BugzillaOutlineNode) {
+ Object[] children = ((BugzillaOutlineNode) 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.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaReportSelection.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaReportSelection.java
new file mode 100644
index 000000000..48941171f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaReportSelection.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * 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.mylar.internal.bugzilla.ui.editor;
+
+import org.eclipse.mylar.bugzilla.core.Comment;
+import org.eclipse.mylar.internal.bugzilla.core.IBugzillaReportSelection;
+
+/**
+ * A selection of a Bugzilla element in a view.
+ */
+public class BugzillaReportSelection implements IBugzillaReportSelection {
+
+ /**
+ * The id of the Bugzilla object that the selection was on.
+ */
+ protected int id;
+
+ /** The server of the Bugzilla object that the selection was on. */
+ protected String server;
+
+ /** The contents of the selection. */
+ protected String contents;
+
+ protected String bugSummary;
+
+ /**
+ * The comment, if a comment was selected. If the selection was not a
+ * comment, then this is <code>null</code>.
+ */
+ protected Comment comment;
+
+ /**
+ * Creates a new <code>BugzillaReportSelection</code> with no supplied
+ * contents or comment.
+ *
+ * @param id
+ * The id of the Bugzilla object that the selection was on.
+ * @param server
+ * The server of the Bugzilla object that the selection was on.
+ */
+ public BugzillaReportSelection(int id, String server, String summary) {
+ this(id, server, null, null, summary);
+ }
+
+ /**
+ * Creates a new <code>BugzillaReportSelection</code> with no supplied
+ * comment.
+ *
+ * @param id
+ * The id of the Bugzilla object that the selection was on.
+ * @param server
+ * The server of the Bugzilla object that the selection was on.
+ * @param contents
+ * The contents of the selection.
+ */
+ public BugzillaReportSelection(int id, String server, String contents, boolean isDescription, String summary) {
+ this(id, server, contents, null, summary);
+ this.isDescription = isDescription;
+ }
+
+ /**
+ * Creates a new <code>BugzillaReportSelection</code> with no supplied
+ * contents.
+ *
+ * @param id
+ * The id of the Bugzilla object that the selection was on.
+ * @param server
+ * The server of the Bugzilla object that the selection was on.
+ * @param comment
+ * The <code>Comment</code> object for this selection. If a
+ * comment was not selected, then this should be
+ * <code>null</code>.
+ */
+ public BugzillaReportSelection(int id, String server, Comment comment, String summary) {
+ this(id, server, null, comment, summary);
+ }
+
+ /**
+ * Creates a new <code>BugzillaReportSelection</code>.
+ *
+ * @param id
+ * The id of the Bugzilla object that the selection was on.
+ * @param server
+ * The server of the Bugzilla object that the selection was on.
+ * @param contents
+ * The contents of the selection.
+ * @param comment
+ * The <code>Comment</code> object for this selection. If a
+ * comment was not selected, then this should be
+ * <code>null</code>.
+ */
+ public BugzillaReportSelection(int id, String server, String contents, Comment comment, String summary) {
+ this.id = id;
+ this.server = server;
+ this.contents = contents;
+ this.comment = comment;
+ this.bugSummary = summary;
+ }
+
+ public boolean hasComment() {
+ return comment != null;
+ }
+
+ public Comment getComment() {
+ return comment;
+ }
+
+ public void setComment(Comment comment) {
+ this.comment = comment;
+ }
+
+ public String getContents() {
+ return contents;
+ }
+
+ public void setContents(String contents) {
+ this.contents = contents;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getServer() {
+ return server;
+ }
+
+ public void setServer(String server) {
+ this.server = server;
+ }
+
+ public boolean isEmpty() {
+ return (server == null) || ((contents == null) && (comment == null));
+ }
+
+ private boolean isCommentHeader = false;
+
+ private boolean isDescription = false;
+
+ 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.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/ExistingBugEditorInput.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/ExistingBugEditorInput.java
new file mode 100644
index 000000000..3f7045ede
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/ExistingBugEditorInput.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * 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.mylar.internal.bugzilla.ui.editor;
+
+import java.io.IOException;
+
+import javax.security.auth.login.LoginException;
+
+import org.eclipse.mylar.bugzilla.core.BugReport;
+import org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin;
+import org.eclipse.mylar.internal.bugzilla.core.BugzillaRepositoryUtil;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskRepository;
+
+/**
+ * The <code>IEditorInput</code> implementation for
+ * <code>ExistingBugEditor</code>.
+ *
+ * @author Mik Kersten (some hardening of initial prototype)
+ */
+public class ExistingBugEditorInput extends AbstractBugEditorInput {
+
+ private TaskRepository repository;
+
+ protected int bugId;
+
+ protected BugReport bug;
+
+ /**
+ * Creates a new <code>ExistingBugEditorInput</code>.
+ *
+ * @param bug
+ * The bug for this editor input.
+ */
+ public ExistingBugEditorInput(BugReport bug) {
+ this.bug = bug;
+ this.bugId = bug.getId();
+ repository = MylarTaskListPlugin.getRepositoryManager().getRepository(BugzillaPlugin.REPOSITORY_KIND,
+ bug.getRepositoryUrl());
+ }
+
+ /**
+ * Creates a new <code>ExistingBugEditorInput</code>. An exception is
+ * thrown if the bug could not be obtained from the server.
+ *
+ * @param bugId
+ * The id of the bug for this editor input.
+ * @throws LoginException
+ * @throws IOException
+ */
+ public ExistingBugEditorInput(String repositoryUrl, int bugId) throws LoginException, IOException {
+ this.bugId = bugId;
+ // get the bug from the server if it exists
+ bug = BugzillaRepositoryUtil.getBug(repositoryUrl, bugId);
+ repository = MylarTaskListPlugin.getRepositoryManager().getRepository(BugzillaPlugin.REPOSITORY_KIND,
+ repositoryUrl);
+ }
+
+ public ExistingBugEditorInput(String repositoryUrl, int bugId, boolean offline) throws LoginException, IOException {
+ this.bugId = bugId;
+ repository = MylarTaskListPlugin.getRepositoryManager().getRepository(BugzillaPlugin.REPOSITORY_KIND,
+ repositoryUrl);
+ if (!offline) {
+ try {
+ bug = BugzillaRepositoryUtil.getBug(repositoryUrl, bugId);
+ } catch (IOException e) {
+ bug = BugzillaRepositoryUtil.getCurrentBug(repositoryUrl, bugId);
+ // IWorkbench workbench = PlatformUI.getWorkbench();
+ // workbench.getDisplay().asyncExec(new Runnable() {
+ // public void run() {
+ // MessageDialog.openInformation(
+ // Display.getDefault().getActiveShell(),
+ // "Mylar Bugzilla Client",
+ // "Unable to download bug report, using offline copy.");
+ //
+ // }
+ // });
+ }
+ } else {
+ bug = BugzillaRepositoryUtil.getCurrentBug(repositoryUrl, bugId);
+ }
+ }
+
+ public String getName() {
+ return bug.getLabel();
+ }
+
+ /**
+ * @return The id of the bug for this editor input.
+ */
+ public int getBugId() {
+ return bugId;
+ }
+
+ @Override
+ public BugReport getBug() {
+ return bug;
+ }
+
+ /**
+ * @return <code>true</code> if the argument is a bug report editor input
+ * on the same bug id.
+ */
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof ExistingBugEditorInput) {
+ ExistingBugEditorInput input = (ExistingBugEditorInput) o;
+ return getBugId() == input.getBugId();
+ }
+ return false;
+ }
+
+ public TaskRepository getRepository() {
+ return repository;
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/NewBugEditorInput.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/NewBugEditorInput.java
new file mode 100644
index 000000000..4d91b85cd
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/NewBugEditorInput.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.mylar.internal.bugzilla.ui.editor;
+
+import org.eclipse.mylar.internal.bugzilla.core.NewBugModel;
+
+/**
+ * The <code>IEditorInput</code> implementation for <code>NewBugEditor</code>.
+ */
+public class NewBugEditorInput extends AbstractBugEditorInput {
+
+ protected NewBugModel bug;
+
+ /**
+ * Creates a new <code>NewBugEditorInput</code>.
+ *
+ * @param bug
+ * The bug for this editor input.
+ */
+ public NewBugEditorInput(NewBugModel bug) {
+ this.bug = bug;
+ }
+
+ public String getName() {
+ return bug.getLabel();
+ }
+
+ @Override
+ public NewBugModel getBug() {
+ return bug;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof NewBugEditorInput) {
+ NewBugEditorInput input = (NewBugEditorInput) o;
+ return input.getBug().equals(bug);
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/SpellingDialog.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/SpellingDialog.java
new file mode 100644
index 000000000..f4b40ef25
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/SpellingDialog.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.mylar.internal.bugzilla.ui.editor;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+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.List;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * TODO this is used only for spell checking which is not yet implemented,
+ * therefore this is not properly tested
+ *
+ * @author Shawn Minto
+ */
+public class SpellingDialog extends Dialog {
+
+ private String title;
+
+ private Text wordToFix;
+
+ private List suggestions;
+
+ private IDocument document;
+
+ private ICompletionProposal[] proposals;
+
+ protected SpellingDialog(Shell parentShell, String title, IDocument document) {
+ super(parentShell);
+ this.title = title;
+ this.document = document;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Control c = super.createDialogArea(parent);
+
+ Composite spellingComposite = new Composite(parent, SWT.NONE);
+
+ GridLayout spellingLayout = new GridLayout();
+ spellingLayout.numColumns = 1;
+ spellingComposite.setLayout(spellingLayout);
+
+ wordToFix = new Text(spellingComposite, SWT.BORDER | SWT.READ_ONLY);
+ GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ gd.widthHint = 150;
+ wordToFix.setLayoutData(gd);
+
+ suggestions = new List(spellingComposite, SWT.BORDER);
+ gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ gd.widthHint = 150;
+ gd.heightHint = AbstractBugEditor.WRAP_LENGTH;
+ suggestions.setLayoutData(gd);
+
+ return c;
+ }
+
+ @Override
+ protected void configureShell(Shell newShell) {
+ super.configureShell(newShell);
+ newShell.setText(title);
+ }
+
+ public void open(String word, ICompletionProposal[] proposals) {
+ create();
+
+ this.proposals = proposals;
+
+ wordToFix.setText(word);
+ suggestions.removeAll();
+
+ for (int i = 0; i < proposals.length; i++) {
+ suggestions.setItem(i, proposals[i].getDisplayString());
+ }
+
+ super.open();
+ }
+
+ @Override
+ protected void handleShellCloseEvent() {
+ if (getReturnCode() == Dialog.OK) {
+ int i = suggestions.getSelectionIndex();
+ if (i > 0 && i < proposals.length)
+ proposals[i].apply(document);
+ }
+ super.handleShellCloseEvent();
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/BugzillaResultCollector.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/BugzillaResultCollector.java
new file mode 100644
index 000000000..3a48332ed
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/BugzillaResultCollector.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.mylar.internal.bugzilla.ui.search;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.mylar.internal.bugzilla.core.search.BugzillaSearchHit;
+import org.eclipse.mylar.internal.bugzilla.core.search.IBugzillaSearchOperation;
+import org.eclipse.mylar.internal.bugzilla.core.search.IBugzillaSearchResultCollector;
+
+/**
+ * Collector for the bugzilla search results
+ *
+ * @author Shawn Minto
+ */
+public class BugzillaResultCollector implements IBugzillaSearchResultCollector {
+ /** A list of all of the search results found */
+ private List<BugzillaSearchHit> results = new ArrayList<BugzillaSearchHit>();
+
+ /** The progress monitor for the search operation */
+ private IProgressMonitor monitor;
+
+ /** The number of matches found */
+ private int matchCount;
+
+ /** The bugzilla search operation */
+ private IBugzillaSearchOperation operation;
+
+ /** 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 the query is done */
+ private static final String DONE = "done";
+
+ /** The string to display when there is one match from the search */
+ private static final String MATCH = "Bugzilla Mylar search - 1 match";
+
+ /** The string to display when there is more than one match from the search */
+ private static final String MATCHES = "Bugzilla Mylar search - {0} matches";
+
+ /**
+ * @see org.eclipse.mylar.internal.bugzilla.core.search.IBugzillaSearchResultCollector#aboutToStart()
+ */
+ public void aboutToStart(int startMatchCount) throws CoreException {
+ // initiailize the number of matches
+ matchCount = startMatchCount;
+
+ // set the progress monitor to say that we are querying the server
+ monitor.setTaskName(STARTING);
+ }
+
+ /**
+ * @see org.eclipse.mylar.internal.bugzilla.core.search.IBugzillaSearchResultCollector#accept(org.eclipse.mylar.internal.bugzilla.core.search.BugzillaSearchHit)
+ */
+ public void accept(BugzillaSearchHit hit) throws CoreException {
+ // add the result to the list of results
+ results.add(hit);
+
+ // increment the match count
+ matchCount++;
+
+ if (getProgressMonitor() != null) {
+ if (!getProgressMonitor().isCanceled()) {
+ // if the operation is cancelled finish with whatever data was
+ // already found
+ getProgressMonitor().subTask(getFormattedMatchesString(matchCount));
+ getProgressMonitor().worked(1);
+ }
+ }
+ }
+
+ /**
+ * @see org.eclipse.mylar.internal.bugzilla.core.search.IBugzillaSearchResultCollector#done()
+ */
+ public void done() {
+ if (getProgressMonitor() != null) {
+ if (!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 = null;
+ }
+
+ /**
+ * @see org.eclipse.mylar.internal.bugzilla.core.search.IBugzillaSearchResultCollector#getProgressMonitor()
+ */
+ public IProgressMonitor getProgressMonitor() {
+ return monitor;
+ }
+
+ /**
+ * @see org.eclipse.mylar.internal.bugzilla.core.search.IBugzillaSearchResultCollector#setProgressMonitor(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void setProgressMonitor(IProgressMonitor monitor) {
+ this.monitor = monitor;
+ }
+
+ /**
+ * @see org.eclipse.mylar.internal.bugzilla.core.search.IBugzillaSearchResultCollector#setOperation(org.eclipse.mylar.internal.bugzilla.core.search.BugzillaSearchOperation)
+ */
+ public void setOperation(IBugzillaSearchOperation operation) {
+ this.operation = operation;
+ }
+
+ /**
+ * @see org.eclipse.mylar.internal.bugzilla.core.search.IBugzillaSearchResultCollector#getOperation()
+ */
+ public IBugzillaSearchOperation getOperation() {
+ return operation;
+ }
+
+ /**
+ * Get the string specifying the number of matches found
+ *
+ * @param count
+ * The number of matches found
+ * @return The <code>String</code> specifying the number of matches found
+ */
+ private String getFormattedMatchesString(int count) {
+ // if only 1 match, return the singular match string
+ String name = "";
+ if (operation.getName() != null)
+ name = " - " + operation.getName();
+ if (count == 1)
+ return MATCH + name;
+
+ // format the matches string and return it
+ Object[] messageFormatArgs = { new Integer(count) };
+ return MessageFormat.format(MATCHES + name, messageFormatArgs);
+ }
+
+ /**
+ * Get the list of results
+ *
+ * @return A List of BugzillaSearchHit
+ */
+ public List<BugzillaSearchHit> getResults() {
+ return results;
+ }
+
+ /**
+ * Get the number of matches from the operation
+ *
+ * @return Returns the matchCount.
+ */
+ public int getMatchCount() {
+ return matchCount;
+ }
+
+ /**
+ * Set the starting number of matches for the search operation
+ *
+ * @param matchCount
+ * The matchCount to set.
+ */
+ public void setMatchCount(int matchCount) {
+ this.matchCount = matchCount;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/BugzillaSearchResultView.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/BugzillaSearchResultView.java
new file mode 100644
index 000000000..05bf3d411
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/BugzillaSearchResultView.java
@@ -0,0 +1,251 @@
+/*******************************************************************************
+ * 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.mylar.internal.bugzilla.ui.search;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin;
+import org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylar.internal.bugzilla.core.search.BugzillaContentProvider;
+import org.eclipse.mylar.internal.bugzilla.core.search.BugzillaIdSearchSorter;
+import org.eclipse.mylar.internal.bugzilla.core.search.BugzillaLabelProvider;
+import org.eclipse.mylar.internal.bugzilla.core.search.BugzillaPrioritySearchSorter;
+import org.eclipse.mylar.internal.bugzilla.core.search.BugzillaSeveritySearchSorter;
+import org.eclipse.mylar.internal.bugzilla.core.search.BugzillaStateSearchSorter;
+import org.eclipse.mylar.internal.bugzilla.ui.BugzillaTableContentProvider;
+import org.eclipse.mylar.internal.bugzilla.ui.BugzillaUITools;
+import org.eclipse.mylar.internal.bugzilla.ui.actions.BugzillaSortAction;
+import org.eclipse.mylar.internal.bugzilla.ui.actions.OpenBugsAction;
+import org.eclipse.search.internal.ui.SearchMessages;
+import org.eclipse.search.internal.ui.SearchPlugin;
+import org.eclipse.search.internal.ui.SearchPreferencePage;
+import org.eclipse.search.internal.ui.util.ExceptionHandler;
+import org.eclipse.search.ui.IContextMenuConstants;
+import org.eclipse.search.ui.text.AbstractTextSearchViewPage;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.IShowInTargetList;
+
+/**
+ * Displays the results of a Bugzilla search.
+ *
+ * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage
+ */
+public class BugzillaSearchResultView extends AbstractTextSearchViewPage implements IAdaptable {
+
+ // The categories to sort bug results by
+ public static final int ORDER_ID = 1;
+
+ public static final int ORDER_SEVERITY = 2;
+
+ public static final int ORDER_PRIORITY = 3;
+
+ public static final int ORDER_STATUS = 4;
+
+ public static final int ORDER_DEFAULT = ORDER_ID;
+
+ private static final String KEY_SORTING = IBugzillaConstants.PLUGIN_ID + ".search.resultpage.sorting"; //$NON-NLS-1$
+
+ private BugzillaContentProvider bugContentProvider;
+
+ private int bugCurrentSortOrder;
+
+ private BugzillaSortAction bugSortByIDAction;
+
+ private BugzillaSortAction bugSortBySeverityAction;
+
+ private BugzillaSortAction bugSortByPriorityAction;
+
+ private BugzillaSortAction bugSortByStatusAction;
+
+// private AddFavoriteAction addToFavoritesAction;
+
+ private OpenBugsAction openInEditorAction;
+
+ private static final String[] SHOW_IN_TARGETS = new String[] { IPageLayout.ID_RES_NAV };
+
+ private static final IShowInTargetList SHOW_IN_TARGET_LIST = new IShowInTargetList() {
+ public String[] getShowInTargetIds() {
+ return SHOW_IN_TARGETS;
+ }
+ };
+
+ private IPropertyChangeListener bugPropertyChangeListener;
+
+ /**
+ * Constructor
+ */
+ public BugzillaSearchResultView() {
+ // Only use the table layout.
+ super(FLAG_LAYOUT_FLAT);
+
+ bugSortByIDAction = new BugzillaSortAction("Bug ID", this, ORDER_ID);
+ bugSortBySeverityAction = new BugzillaSortAction("Bug severity", this, ORDER_SEVERITY);
+ bugSortByPriorityAction = new BugzillaSortAction("Bug priority", this, ORDER_PRIORITY);
+ bugSortByStatusAction = new BugzillaSortAction("Bug status", this, ORDER_STATUS);
+ bugCurrentSortOrder = ORDER_DEFAULT;
+
+// addToFavoritesAction = new AddFavoriteAction("Mark Result as Favorite", this);
+ openInEditorAction = new OpenBugsAction("Open Bug in Editor", this);
+
+ bugPropertyChangeListener = new IPropertyChangeListener() {
+ public void propertyChange(PropertyChangeEvent event) {
+ if (SearchPreferencePage.LIMIT_TABLE.equals(event.getProperty())
+ || SearchPreferencePage.LIMIT_TABLE_TO.equals(event.getProperty()))
+ if (getViewer() instanceof TableViewer) {
+ getViewPart().updateLabel();
+ getViewer().refresh();
+ }
+ }
+ };
+ SearchPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(bugPropertyChangeListener);
+ }
+
+ @Override
+ protected void elementsChanged(Object[] objects) {
+ if (bugContentProvider != null) {
+ bugContentProvider.elementsChanged(objects);
+ }
+ }
+
+ @Override
+ protected void clear() {
+ if (bugContentProvider != null) {
+ bugContentProvider.clear();
+ }
+ }
+
+ // Allows the inherited method "getViewer" to be accessed publicly.
+ @Override
+ public StructuredViewer getViewer() {
+ return super.getViewer();
+ }
+
+ @Override
+ protected void configureTreeViewer(TreeViewer viewer) {
+ // The tree layout is not used, so this function does not need to do
+ // anything.
+ }
+
+ @Override
+ protected void configureTableViewer(TableViewer viewer) {
+ viewer.setUseHashlookup(true);
+ viewer.setLabelProvider(new DecoratingLabelProvider(new BugzillaLabelProvider(), PlatformUI.getWorkbench()
+ .getDecoratorManager().getLabelDecorator()));
+ viewer.setContentProvider(new BugzillaTableContentProvider(this));
+
+ // Set the order when the search view is loading so that the items are
+ // sorted right away
+ setSortOrder(bugCurrentSortOrder);
+
+ bugContentProvider = (BugzillaContentProvider) viewer.getContentProvider();
+ }
+
+ /**
+ * Sets the new sorting category, and reorders all of the bug reports.
+ *
+ * @param sortOrder
+ * The new category to sort bug reports by
+ */
+ public void setSortOrder(int sortOrder) {
+ bugCurrentSortOrder = sortOrder;
+ StructuredViewer viewer = getViewer();
+
+ switch (sortOrder) {
+ case ORDER_ID:
+ viewer.setSorter(new BugzillaIdSearchSorter());
+ break;
+ case ORDER_PRIORITY:
+ viewer.setSorter(new BugzillaPrioritySearchSorter());
+ break;
+ case ORDER_SEVERITY:
+ viewer.setSorter(new BugzillaSeveritySearchSorter());
+ break;
+ case ORDER_STATUS:
+ viewer.setSorter(new BugzillaStateSearchSorter());
+ break;
+ default:
+ // If the setting is not one of the four valid ones,
+ // use the default order setting.
+ sortOrder = ORDER_DEFAULT;
+ viewer.setSorter(new BugzillaIdSearchSorter());
+ break;
+ }
+
+ getSettings().put(KEY_SORTING, bugCurrentSortOrder);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ public Object getAdapter(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 {
+ try {
+ Object element = getCurrentMatch().getElement();
+ if (element instanceof IMarker) {
+
+ String repositoryUrl = (String) ((IMarker) element)
+ .getAttribute(IBugzillaConstants.HIT_MARKER_ATTR_REPOSITORY);
+ Integer id = (Integer) ((IMarker) element).getAttribute(IBugzillaConstants.HIT_MARKER_ATTR_ID);
+ BugzillaUITools.show(repositoryUrl, id.intValue());
+ }
+ } catch (CoreException e) {
+ // if an error occurs, handle and log it
+ ExceptionHandler.handle(e, SearchMessages.Search_Error_search_title,
+ SearchMessages.Search_Error_search_message); //$NON-NLS-2$ //$NON-NLS-1$
+ BugzillaPlugin.log(e.getStatus());
+ }
+ }
+
+ @Override
+ protected void fillContextMenu(IMenuManager mgr) {
+ super.fillContextMenu(mgr);
+
+ // Create the submenu for sorting
+ MenuManager sortMenu = new MenuManager(SearchMessages.SortDropDownAction_label); //$NON-NLS-1$
+ sortMenu.add(bugSortByIDAction);
+ sortMenu.add(bugSortByPriorityAction);
+ sortMenu.add(bugSortBySeverityAction);
+ sortMenu.add(bugSortByStatusAction);
+
+ // Check the right sort option
+ bugSortByIDAction.setChecked(bugCurrentSortOrder == bugSortByIDAction.getSortOrder());
+ bugSortByPriorityAction.setChecked(bugCurrentSortOrder == bugSortByPriorityAction.getSortOrder());
+ bugSortBySeverityAction.setChecked(bugCurrentSortOrder == bugSortBySeverityAction.getSortOrder());
+ bugSortByStatusAction.setChecked(bugCurrentSortOrder == bugSortByStatusAction.getSortOrder());
+
+ // Add the new context menu items
+ mgr.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, sortMenu);
+// mgr.appendToGroup(IContextMenuConstants.GROUP_ADDITIONS, addToFavoritesAction);
+ mgr.appendToGroup(IContextMenuConstants.GROUP_OPEN, openInEditorAction);
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/GetQueryDialog.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/GetQueryDialog.java
new file mode 100644
index 000000000..27357e1e1
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/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.mylar.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.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/SaveQueryDialog.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/SaveQueryDialog.java
new file mode 100644
index 000000000..41084dc3a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/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.mylar.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.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/SavedQueryFile.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/SavedQueryFile.java
new file mode 100644
index 000000000..90dcbf95d
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/SavedQueryFile.java
@@ -0,0 +1,255 @@
+/*******************************************************************************
+ * 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.mylar.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.mylar.internal.bugzilla.core.BugzillaPlugin;
+
+/**
+ * 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(BugzillaPlugin.getDefault().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.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaCacheFile.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaCacheFile.java
new file mode 100644
index 000000000..0822f4d55
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaCacheFile.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * 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.mylar.internal.bugzilla.ui.tasklist;
+
+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.List;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylar.bugzilla.core.IBugzillaBug;
+import org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin;
+
+/**
+ * COPIED FROM
+ *
+ * @see org.eclipse.mylar.bugzilla.offlineReports.OfflineReportsFile
+ *
+ * @author Shawn Minto
+ */
+public class BugzillaCacheFile {
+
+ private File file;
+
+ private ArrayList<IBugzillaBug> list = new ArrayList<IBugzillaBug>();
+
+ protected int latestNewBugId = 0;
+
+ public BugzillaCacheFile(File file) throws ClassNotFoundException, IOException {
+ this.file = file;
+ if (file.exists()) {
+ readFile();
+ }
+ }
+
+ public void add(IBugzillaBug entry) {
+ // add the entry to the list and write the file to disk
+ list.add(entry);
+ writeFile();
+ }
+
+ public void update() {
+ writeFile();
+ }
+
+ public int getNextOfflineBugId() {
+ latestNewBugId++;
+ return latestNewBugId;
+ }
+
+ public int find(int id) {
+ for (int i = 0; i < list.size(); i++) {
+ IBugzillaBug currBug = list.get(i);
+ if (currBug != null && (currBug.getId() == id) && !currBug.isLocallyCreated())
+ return i;
+ }
+ return -1;
+ }
+
+ public ArrayList<IBugzillaBug> elements() {
+ return list;
+ }
+
+ 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());
+
+ out.writeInt(latestNewBugId);
+
+ // 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 offline reports file.");
+ BugzillaPlugin.log(e);
+ }
+ }
+
+ private void readFile() throws ClassNotFoundException, IOException {
+ ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
+
+ // get the number of offline reports in the file
+ int size = in.readInt();
+
+ // get the bug id of the most recently created offline report
+ latestNewBugId = in.readInt();
+
+ // read in each of the offline reports in the file
+ for (int nX = 0; nX < size; nX++) {
+ IBugzillaBug item = (IBugzillaBug) in.readObject();
+ // add the offline report to the offlineReports list
+ list.add(item);
+ }
+ in.close();
+ }
+
+ public void remove(List<IBugzillaBug> sel) {
+ list.removeAll(sel);
+
+ // rewrite the file so that the data is persistant
+ writeFile();
+ }
+
+ public void removeAll() {
+ list.clear();
+
+ // rewrite the file so that the data is persistant
+ writeFile();
+ }
+}
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 000000000..db6b28ad4
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaCustomQueryDialog.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * 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.mylar.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 (some hardening of prototype)
+ */
+public class BugzillaCustomQueryDialog extends Dialog {
+ private String url;
+
+ private String name = "";
+
+ 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("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("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("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/BugzillaReportEditorFactory.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaReportEditorFactory.java
new file mode 100644
index 000000000..edbed9f16
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaReportEditorFactory.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.mylar.internal.bugzilla.ui.tasklist;
+
+import org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditor;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.ui.ITaskEditorFactory;
+import org.eclipse.mylar.internal.tasklist.ui.editors.MylarTaskEditor;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.part.EditorPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class BugzillaReportEditorFactory implements ITaskEditorFactory {
+
+ private static final String REPOSITORY_INFO = "Bugzilla";
+
+ public void notifyEditorActivationChange(IEditorPart editor) {
+ // ignore
+ }
+
+ public EditorPart createEditor(MylarTaskEditor parentEditor) {
+ ExistingBugEditor editor = new ExistingBugEditor();
+ editor.setParentEditor(parentEditor);
+ return editor;
+ }
+
+ public IEditorInput createEditorInput(ITask task) {
+ if (task instanceof BugzillaTask) {
+ BugzillaTask bugzillaTask = (BugzillaTask) task;
+
+// boolean offline = bugzillaTask.getSyncState() == RepositoryTaskSyncState.OUTGOING
+// || bugzillaTask.getSyncState() == RepositoryTaskSyncState.CONFLICT;
+
+ try {
+ BugzillaTaskEditorInput input = new BugzillaTaskEditorInput(bugzillaTask, true);
+ input.setOfflineBug(bugzillaTask.getBugReport());
+ return input;
+// GetBugzillaReportJob getBugzillaReportJob = new GetBugzillaReportJob(bugzillaTask);
+// getBugzillaReportJob.schedule();
+// return getBugzillaReportJob.getEditorInput();
+ // BugzillaTaskEditorInput input = new
+ // BugzillaTaskEditorInput(bugTask, offline);
+ // try {
+ //
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, "Could not create Bugzilla editor input", true);
+ }
+ }
+ return null;
+ }
+
+ public String getTitle() {
+ return REPOSITORY_INFO;
+ }
+
+ public boolean canCreateEditorFor(ITask task) {
+ return task instanceof BugzillaTask;
+ }
+
+ public boolean providesOutline() {
+ return true;
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaReportNode.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaReportNode.java
new file mode 100644
index 000000000..416e5e18f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaReportNode.java
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * 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.mylar.internal.bugzilla.ui.tasklist;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.security.auth.login.LoginException;
+
+import org.eclipse.mylar.bugzilla.core.BugReport;
+import org.eclipse.mylar.internal.bugzilla.core.BugzillaRepositoryUtil;
+import org.eclipse.mylar.internal.bugzilla.core.search.BugzillaSearchHit;
+
+/**
+ * Class to store the DoiInfo of a BugzillaSearchHit
+ *
+ * @author Shawn Minto
+ */
+public class BugzillaReportNode {
+
+ private static final int MAX_LABEL_LENGTH = 150;
+
+ private static final long serialVersionUID = 3257004367222419506L;
+
+ /** The BugzillaSearchHit associated with this DoiInfo */
+ private BugzillaSearchHit 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 List<StackTrace> stackTraces;
+
+ /** The bug report associated with this DoiInfo */
+ private BugReport 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 BugzillaReportNode(float initialValue, BugzillaSearchHit 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 BugzillaSearchHit 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
+ *
+ * @throws IOException
+ * @throws LoginException
+ * @throws MalformedURLException
+ */
+ public BugReport getBug() throws MalformedURLException, LoginException, IOException {
+ if (bug == null) {
+ // get the bug report
+ bug = BugzillaRepositoryUtil.getBug(hit.getRepository(), hit.getId());
+ }
+ return bug;
+ }
+
+ /**
+ * Set the bug report associated with this DoiInfo
+ *
+ * @param bug -
+ * BugReport that this is associated with
+ */
+ public void setBug(BugReport 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 (int i = 0; i < stackTracesToAdd.length; i++)
+ this.stackTraces.add(stackTracesToAdd[i]);
+ }
+
+ /**
+ * Get the name of the bug report
+ *
+ * @return The name of the bug report, max 20 characters
+ */
+ public String getName() {
+ String description = hit.getDescription();
+ int length = description.length();
+ if (length > MAX_LABEL_LENGTH)
+ description = description.substring(0, MAX_LABEL_LENGTH) + "..";
+ return "bug " + hit.getId() + ": " + description;
+ }
+
+ public String getElementHandle() {
+ return hit.getRepository() + ";" + hit.getId();
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaTaskEditorInput.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaTaskEditorInput.java
new file mode 100644
index 000000000..925dcd810
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaTaskEditorInput.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * 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 1-Feb-2005
+ */
+package org.eclipse.mylar.internal.bugzilla.ui.tasklist;
+
+import java.io.IOException;
+
+import javax.security.auth.login.LoginException;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylar.bugzilla.core.BugReport;
+import org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditorInput;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask.RepositoryTaskSyncState;
+import org.eclipse.ui.IPersistableElement;
+
+/**
+ * @author Eric Booth
+ * @author Mik Kersten
+ */
+public class BugzillaTaskEditorInput extends ExistingBugEditorInput {
+
+ private String bugTitle;
+
+ private BugReport offlineBug;
+
+ private BugzillaTask bugTask;
+
+ private boolean offline;
+
+ public BugzillaTaskEditorInput(BugzillaTask bugTask, boolean offline) throws LoginException, IOException {
+ super(bugTask.getRepositoryUrl(), AbstractRepositoryTask.getTaskIdAsInt(bugTask.getHandleIdentifier()), offline);
+ this.bugTask = bugTask;
+ offlineBug = bugTask.getBugReport();
+ bugId = AbstractRepositoryTask.getTaskIdAsInt(bugTask.getHandleIdentifier());
+ bugTitle = "";
+ this.offline = offline;
+ }
+
+ 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 ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ @Override
+ public String getName() {
+ return bugTask.getDescription();
+ }
+
+ @Override
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ @Override
+ public String getToolTipText() {
+ return bugTitle;
+ }
+
+ @Override
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+ @Override
+ public int getBugId() {
+ return bugId;
+ }
+
+ /**
+ * Returns the online server bug for this input
+ *
+ * @see BugzillaRepositoryUtil
+ * @see BugReport
+ */
+ // public BugReport getServerBug() {
+ // return serverBug;
+ // }
+ /**
+ * Returns the offline bug for this input's Bugzilla task
+ */
+ public BugReport getOfflineBug() {
+ if (offline || bugTask.getSyncState() == RepositoryTaskSyncState.OUTGOING
+ || bugTask.getSyncState() == RepositoryTaskSyncState.CONFLICT)
+ return offlineBug;
+ else
+ return super.getBug();
+ }
+
+ public void setOfflineBug(BugReport offlineBug) {
+ this.offlineBug = offlineBug;
+ }
+
+ /**
+ * Gets the bug page input stream
+ */
+ // public InputStream getInputStream() throws IOException {
+ // try {
+ // return url.openStream();
+ // }
+ // catch (Exception e) {
+ // throw new IOException(e.getMessage());
+ // }
+ //
+ // }
+ /**
+ * Returns true if the argument is a bug report editor input on the same bug
+ * id.
+ */
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof BugzillaTaskEditorInput) {
+ BugzillaTaskEditorInput input = (BugzillaTaskEditorInput) o;
+ return getBugId() == input.getBugId();
+ }
+ return false;
+ }
+
+ /**
+ * @return Returns the <code>BugzillaTask</code>
+ */
+ public BugzillaTask getBugTask() {
+ return bugTask;
+ }
+}
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 000000000..d70e4f06c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/StackTrace.java
@@ -0,0 +1,375 @@
+/*******************************************************************************
+ * 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.mylar.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 int length;
+
+ /** The offset of the stack trace in the orignal string */
+ private int offset;
+
+ /** The string of the stack trace */
+ private String stackTrace;
+
+ /**
+ * This is the comment that the stack trace appeared in. String if
+ * desciption else Comment
+ */
+ private 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 description
+ */
+ 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).*";
+ String regexSkip = ".*\\.\\..*";
+
+ // get all of the individual lines for the string
+ String[] lines = s.split("\r\n|\n");
+
+ // 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 {
+
+ // 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.*";
+ String regexEndString = ".*:\\d+\\)$";
+ 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 (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 (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 = "";
+ for (String s2 : l) {
+ s += s2 + "\r\n";
+ }
+
+ 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("\\\\", "\\\\\\\\");
+ sFixed = sFixed.replaceAll("\\$", "\\\\\\$");
+ sFixed = sFixed.replaceAll("\\.", "\\\\.");
+ sFixed = sFixed.replaceAll("\\?", "\\\\?");
+ sFixed = sFixed.replaceAll("\\{", "\\\\{");
+ sFixed = sFixed.replaceAll("\\}", "\\\\}");
+ sFixed = sFixed.replaceAll("\\(", "\\\\(");
+ sFixed = sFixed.replaceAll("\\)", "\\\\)");
+ sFixed = sFixed.replaceAll("\\[", "\\\\[");
+ sFixed = sFixed.replaceAll("\\]", "\\\\]");
+ sFixed = sFixed.replaceAll("\\+", "\\\\+");
+ sFixed = sFixed.replaceAll("\\*", "\\\\*");
+ sFixed = sFixed.replaceAll("\\|", "\\\\|");
+ sFixed = sFixed.replaceAll("\\^", "\\\\^");
+ sFixed = sFixed.replaceAll("\\/", "\\\\/");
+
+ return sFixed;
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/wizard/AbstractWizardListPage.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/wizard/AbstractWizardListPage.java
new file mode 100644
index 000000000..5ceeaf51f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/wizard/AbstractWizardListPage.java
@@ -0,0 +1,198 @@
+/*******************************************************************************
+ * 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.mylar.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.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.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();
+ }
+
+ public abstract String getTableName();
+
+ /**
+ * 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);
+ }
+}
diff --git a/org.eclipse.mylyn.help.ui/.classpath b/org.eclipse.mylyn.help.ui/.classpath
new file mode 100644
index 000000000..ddf0f401d
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.classpath
@@ -0,0 +1,6 @@
+<?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"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
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 000000000..616983fb2
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,303 @@
+#Mon Feb 13 11:20:14 PST 2006
+eclipse.preferences.version=1
+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=disabled
+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.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.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=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.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.5
+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=16
+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_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.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_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=80
+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_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_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.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.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
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 000000000..8eff44dbd
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,5 @@
+#Mon Feb 13 11:20:14 PST 2006
+eclipse.preferences.version=1
+formatter_profile=_Mylar based on Eclipse [built-in]
+formatter_settings_version=10
+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">/**\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><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 - 2006 University Of British Columbia 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 * University Of British Columbia - 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></templates>
diff --git a/org.eclipse.mylyn.help.ui/build.properties b/org.eclipse.mylyn.help.ui/build.properties
new file mode 100644
index 000000000..d5f13bafa
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/build.properties
@@ -0,0 +1,19 @@
+###############################################################################
+# 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
+###############################################################################
+bin.includes = plugin.xml,\
+ META-INF/,\
+ doc/,\
+ about.html
+src.includes = META-INF/,\
+ plugin.xml,\
+ about.html,\
+ doc/
+
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/active-hierarchy.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/active-hierarchy.gif
new file mode 100644
index 000000000..35651b170
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/active-hierarchy.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/active-search-linked.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/active-search-linked.gif
new file mode 100644
index 000000000..1407080bf
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/active-search-linked.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/active-search-manipulation.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/active-search-manipulation.gif
new file mode 100644
index 000000000..b3e3784ab
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/active-search-manipulation.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/active-search-qualify.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/active-search-qualify.gif
new file mode 100644
index 000000000..83109c54a
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/active-search-qualify.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/active-search.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/active-search.gif
new file mode 100644
index 000000000..63af2fd51
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/active-search.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/alt-click.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/alt-click.gif
new file mode 100644
index 000000000..fc2a91bcf
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/alt-click.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/bugzilla-hyperlink.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/bugzilla-hyperlink.gif
new file mode 100644
index 000000000..22dfa8780
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/bugzilla-hyperlink.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/bugzilla-internal-browser.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/bugzilla-internal-browser.gif
new file mode 100644
index 000000000..6087ee5b8
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/bugzilla-internal-browser.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/bugzilla-query-custom.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/bugzilla-query-custom.gif
new file mode 100644
index 000000000..7f341e135
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/bugzilla-query-custom.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/bugzilla-synch.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/bugzilla-synch.gif
new file mode 100644
index 000000000..390e6ea86
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/bugzilla-synch.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/filter-auto-toggle.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/filter-auto-toggle.gif
new file mode 100644
index 000000000..02670b06a
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/filter-auto-toggle.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/filtering-ant.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/filtering-ant.gif
new file mode 100644
index 000000000..eac12cbf4
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/filtering-ant.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/filtering-declarations.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/filtering-declarations.gif
new file mode 100644
index 000000000..9362a231f
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/filtering-declarations.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/filtering-exclusion.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/filtering-exclusion.gif
new file mode 100644
index 000000000..ff1c65b23
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/filtering-exclusion.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/filtering-navigator.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/filtering-navigator.gif
new file mode 100644
index 000000000..fd9d2157e
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/filtering-navigator.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/folding-toggle.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/folding-toggle.gif
new file mode 100644
index 000000000..bfaa55233
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/folding-toggle.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/highlight.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/highlight.gif
new file mode 100644
index 000000000..7368b7f25
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/highlight.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/interest-content-assist.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/interest-content-assist.gif
new file mode 100644
index 000000000..67c85f9d8
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/interest-content-assist.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/interest-error.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/interest-error.gif
new file mode 100644
index 000000000..d57c90d25
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/interest-error.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/interest-java-browsing.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/interest-java-browsing.gif
new file mode 100644
index 000000000..031d55daf
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/interest-java-browsing.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/interest-manipulate.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/interest-manipulate.gif
new file mode 100644
index 000000000..5640c2b2a
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/interest-manipulate.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/monitor-enable.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/monitor-enable.gif
new file mode 100644
index 000000000..bc26204e9
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/monitor-enable.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/open-type.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/open-type.gif
new file mode 100644
index 000000000..2b1879eb4
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/open-type.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/overview.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/overview.gif
new file mode 100644
index 000000000..b005ae592
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/overview.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/preference-error-interest.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/preference-error-interest.gif
new file mode 100644
index 000000000..ee172dfbe
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/preference-error-interest.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/search-context.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/search-context.gif
new file mode 100644
index 000000000..43aed77ec
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/search-context.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/task-context-visible.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/task-context-visible.gif
new file mode 100644
index 000000000..2a3943b3e
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/task-context-visible.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/tasklist-actions.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/tasklist-actions.gif
new file mode 100644
index 000000000..880813f89
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/tasklist-actions.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-archive.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-archive.gif
new file mode 100644
index 000000000..a060adbfd
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-archive.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-drilldown.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-drilldown.gif
new file mode 100644
index 000000000..18c536aad
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-drilldown.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-go-navigation.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-go-navigation.gif
new file mode 100644
index 000000000..7be278ba6
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-go-navigation.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-history.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-history.gif
new file mode 100644
index 000000000..419a2d2d5
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-history.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-offline.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-offline.gif
new file mode 100644
index 000000000..96c74ab4a
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-offline.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-quick-filter.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-quick-filter.gif
new file mode 100644
index 000000000..a0fd9f09e
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-quick-filter.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-reminders.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-reminders.gif
new file mode 100644
index 000000000..d1abb52ce
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/tasks-reminders.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.3/test-context.gif b/org.eclipse.mylyn.help.ui/doc/images/0.3/test-context.gif
new file mode 100644
index 000000000..dba15f26a
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.3/test-context.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.1/bugzilla-editor-browser.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.1/bugzilla-editor-browser.gif
new file mode 100644
index 000000000..a5d53afe1
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.1/bugzilla-editor-browser.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.1/bugzilla-prefs-220.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.1/bugzilla-prefs-220.gif
new file mode 100644
index 000000000..b7e813cca
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.1/bugzilla-prefs-220.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.1/bugzilla-prefs-open-reports.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.1/bugzilla-prefs-open-reports.gif
new file mode 100644
index 000000000..10a606847
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.1/bugzilla-prefs-open-reports.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.1/context-pause.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.1/context-pause.gif
new file mode 100644
index 000000000..d2814d752
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.1/context-pause.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-context.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-context.gif
new file mode 100644
index 000000000..3a5fdef72
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-context.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-export.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-export.gif
new file mode 100644
index 000000000..26a2bc189
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-export.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-popup.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-popup.gif
new file mode 100644
index 000000000..6d1181141
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-popup.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-weblink-editor.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-weblink-editor.gif
new file mode 100644
index 000000000..dd903ec8e
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-weblink-editor.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-weblink.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-weblink.gif
new file mode 100644
index 000000000..7cf37988f
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.1/tasklist-weblink.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.3/bugzilla-outline.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.3/bugzilla-outline.gif
new file mode 100644
index 000000000..4cb7376ff
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.3/bugzilla-outline.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.3/context-capture-pause-indicator.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.3/context-capture-pause-indicator.gif
new file mode 100644
index 000000000..3397ba934
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.3/context-capture-pause-indicator.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.3/cvs-resource-history-open.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.3/cvs-resource-history-open.gif
new file mode 100644
index 000000000..dfdbbc283
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.3/cvs-resource-history-open.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.3/editors-auto-manage-pref.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.3/editors-auto-manage-pref.gif
new file mode 100644
index 000000000..83edcb27e
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.3/editors-auto-manage-pref.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.3/editors-auto-manage.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.3/editors-auto-manage.gif
new file mode 100644
index 000000000..466922c8b
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.3/editors-auto-manage.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.3/synchronize-change-sets.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.3/synchronize-change-sets.gif
new file mode 100644
index 000000000..bb320c141
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.3/synchronize-change-sets.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.4/changeset-addto.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.4/changeset-addto.gif
new file mode 100644
index 000000000..5475c529c
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.4/changeset-addto.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.5/taskist-planner.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.5/taskist-planner.gif
new file mode 100644
index 000000000..30b927a5b
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.5/taskist-planner.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.5/tasklist-drag.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.5/tasklist-drag.gif
new file mode 100644
index 000000000..5d5b49f53
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.5/tasklist-drag.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.6/tasklist-pastreminder.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.6/tasklist-pastreminder.gif
new file mode 100644
index 000000000..fd354ff42
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.6/tasklist-pastreminder.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.7/bugzilla-encoding.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.7/bugzilla-encoding.gif
new file mode 100644
index 000000000..c4c8cb69c
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.7/bugzilla-encoding.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.7/tasklist-open-external.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.7/tasklist-open-external.gif
new file mode 100644
index 000000000..769fe65cb
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.7/tasklist-open-external.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/0.4.7/tasklist-repositories.gif b/org.eclipse.mylyn.help.ui/doc/images/0.4.7/tasklist-repositories.gif
new file mode 100644
index 000000000..f47a5916b
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/0.4.7/tasklist-repositories.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/faq/eclipse-manage-configuration.gif b/org.eclipse.mylyn.help.ui/doc/images/faq/eclipse-manage-configuration.gif
new file mode 100644
index 000000000..dbafa4af2
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/faq/eclipse-manage-configuration.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/faq/filtering-declarations.gif b/org.eclipse.mylyn.help.ui/doc/images/faq/filtering-declarations.gif
new file mode 100644
index 000000000..9362a231f
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/faq/filtering-declarations.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/faq/tasklist-backup.gif b/org.eclipse.mylyn.help.ui/doc/images/faq/tasklist-backup.gif
new file mode 100644
index 000000000..1a6a284d2
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/images/faq/tasklist-backup.gif
Binary files differ
diff --git a/org.eclipse.mylyn.help.ui/doc/tips.html b/org.eclipse.mylyn.help.ui/doc/tips.html
new file mode 100644
index 000000000..fd2d8edd7
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/tips.html
@@ -0,0 +1,83 @@
+<html>
+ <head>
+ <title>
+ Mylar FAQ
+ </title>
+ </head>
+ <body>
+ <h1>
+ Mylar Tips and Tricks</h1>
+
+<p><b>Contents</b></p>
+<ul>
+ <li><a href="#landmarks">Landmarks Explained</a></li>
+ <li><a href="#keyboard">Keyboard Shortcuts</a></li>
+ <li><a href="#mylartasksview">Mylar Tasks view</a></li>
+</ul>
+ <ul>
+ <li>Mylar Active Plug-in Suite is a run environment for executing all unit
+tests currently within your active Mylar task context. By setting one of these
+run environments you can quickly execute whatever tests you are currently
+working on.</li>
+ </ul>
+<p>&nbsp;</p>
+ <h2><a name="landmarks">Landmarks Explained</a></h2>
+<p> How to use landmarks... </p>
+ <p> &nbsp;</p>
+
+
+<h2><a name="mylartasksview">Mylar Tasks view tips</a></h2>
+ <ul>
+ <li>Can't find the task you're looking for? Start typing in the search box
+ at the top of the view and matching tasks will be displayed in the tasks
+ view. <br>
+ Tasks that have been work on in the past but are no longer present in the
+ task view will be retrieved and displayed under the <b>Archived Reports</b>
+ category.</li>
+</ul>
+
+
+<p>&nbsp;</p>
+
+
+
+ <h2><a name="keyboard">Keyboard Shortcuts</a></h2>
+<p> </p>
+
+
+<h3>&nbsp;</h3>
+
+ <table border="1" width="100%" id="table1">
+ <tr>
+ <td width="223" align="center">View</td>
+ <td align="center">&nbsp;Key Sequence</td>
+ <td width="862" align="center">Description</td>
+ </tr>
+ <tr>
+ <td width="223">Mylar Tasks</td>
+ <td>Create new task from browser URL</td>
+ <td width="862">Mozilla - drag URL from browser
+ and drop on task list view.<br>
+ Internet Explorer - drag URL from browser,
+ hold down CTRL key and drop on task list view.</td>
+ </tr>
+ <tr>
+ <td width="223">Package Explorer</td>
+ <td>Ctrl-Left_Click</td>
+ <td width="862">Reveal elements hidden in view due to Mylar
+ filtering</td>
+ </tr>
+ <tr>
+ <td width="223">&nbsp;</td>
+ <td>Ctrl-Alt-Shift-Down</td>
+ <td width="862">Make the selected element less interesting. If the
+ element is a landmark, this key sequence will remove the landmark. </td>
+ </tr>
+ <tr>
+ <td width="223">Java Editor</td>
+ <td>Ctrl - 1</td>
+ <td width="862">Quick Fix</td>
+ </tr>
+ </table>
+
+</body></html>
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 000000000..398008f59
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,303 @@
+#Mon Feb 13 11:20:13 PST 2006
+eclipse.preferences.version=1
+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=disabled
+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.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.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=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.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.5
+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=16
+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_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.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_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=80
+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_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_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.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.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
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 000000000..092916a2d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,6 @@
+#Mon Feb 13 11:20:03 PST 2006
+eclipse.preferences.version=1
+formatter_profile=_Mylar based on Eclipse [built-in]
+formatter_settings_version=10
+internal.default.compliance=default
+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">/**\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><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 - 2006 University Of British Columbia 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 * University Of British Columbia - 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></templates>
diff --git a/org.eclipse.mylyn.tasks.core/build.properties b/org.eclipse.mylyn.tasks.core/build.properties
new file mode 100644
index 000000000..562399762
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/build.properties
@@ -0,0 +1,20 @@
+###############################################################################
+# 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
+###############################################################################
+bin.includes = META-INF/,\
+ mylar-bugs.jar,\
+ plugin.xml
+jars.compile.order = mylar-bugs.jar
+source.mylar-bugs.jar = src/
+output.mylar-bugs.jar = bin/
+src.includes = plugin.xml,\
+ src/,\
+ META-INF/
+jre.compilation.profile = J2SE-1.5
diff --git a/org.eclipse.mylyn.tasks.core/icons/elcl16/task-bug.gif b/org.eclipse.mylyn.tasks.core/icons/elcl16/task-bug.gif
new file mode 100644
index 000000000..71b1baba1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/icons/elcl16/task-bug.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.core/icons/elcl16/task-repository.gif b/org.eclipse.mylyn.tasks.core/icons/elcl16/task-repository.gif
new file mode 100644
index 000000000..78470a36f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/icons/elcl16/task-repository.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.core/plugin.xml b/org.eclipse.mylyn.tasks.core/plugin.xml
new file mode 100644
index 000000000..b2538d242
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/plugin.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<?eclipse version="3.0"?>
+<plugin>
+<!--
+ <extension
+ point="org.eclipse.mylar.core.context">
+ <structureBridge
+ activeSearchIcon="icons/elcl16/edge-ref-bug.gif"
+ activeSearchLabel="Bugzilla References"
+ class="org.eclipse.mylar.bugs.BugzillaStructureBridge"
+ name="Bugzilla Structure Bridge"/>
+ </extension>
+
+ <extension
+ point="org.eclipse.mylar.ui.context">
+ <uiBridge
+ class="org.eclipse.mylar.bugs.BugzillaUiBridge"
+ contentType="bugzilla"/>
+ </extension>
+-->
+
+ <!--
+ <extension
+ point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectors">
+ <hyperlinkDetector class="org.eclipse.mylar.internal.bugs.java.BugzillaHyperLinkDetector"/>
+ </extension>
+ -->
+
+ <extension point="org.eclipse.ui.popupMenus">
+ <objectContribution
+ objectClass="org.eclipse.team.internal.ui.synchronize.ChangeSetDiffNode"
+ id="org.eclipse.mylar.ui.team.synchronize.open.report">
+ <action
+ class="org.eclipse.mylar.internal.bugs.ui.actions.OpenCorrespondingTaskAction"
+ enablesFor="1"
+ icon="icons/elcl16/task-repository.gif"
+ id="org.eclipse.mylar.bugzilla.ui.team.synchronize.contribution.open.report"
+ label="Open Corresponding Task"
+ menubarPath="mylar"
+ tooltip="Open Corresponding Task">
+ </action>
+ </objectContribution>
+ <objectContribution
+ objectClass="org.eclipse.team.internal.ccvs.core.client.listeners.LogEntry"
+ id="org.eclipse.mylar.ui.team.history.open.report">
+ <action
+ class="org.eclipse.mylar.internal.bugs.ui.actions.OpenCorrespondingTaskAction"
+ enablesFor="1"
+ icon="icons/elcl16/task-repository.gif"
+ id="org.eclipse.mylar.bugzilla.ui.team.history.contribution.open.report"
+ label="Open Corresponding Task"
+ menubarPath="mylar"
+ tooltip="Open Corresponding Task">
+ </action>
+ </objectContribution>
+ </extension>
+</plugin>
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaContextLabelProvider.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaContextLabelProvider.java
new file mode 100644
index 000000000..01857ea16
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaContextLabelProvider.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * 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.mylar.internal.bugs;
+
+import org.eclipse.mylar.bugzilla.core.BugReport;
+import org.eclipse.mylar.internal.bugs.search.BugzillaReferencesProvider;
+import org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaReportNode;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.ui.AbstractContextLabelProvider;
+import org.eclipse.mylar.internal.ui.MylarImages;
+import org.eclipse.mylar.provisional.core.IMylarElement;
+import org.eclipse.mylar.provisional.core.IMylarRelation;
+import org.eclipse.mylar.provisional.core.IMylarStructureBridge;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Mik Kersten
+ */
+public class BugzillaContextLabelProvider extends AbstractContextLabelProvider {
+
+ @Override
+ protected Image getImage(IMylarElement node) {
+ return TaskListImages.getImage(TaskListImages.TASK_REMOTE);
+ }
+
+ @Override
+ protected Image getImage(IMylarRelation edge) {
+ return MylarImages.getImage(MylarBugsPlugin.EDGE_REF_BUGZILLA);
+ }
+
+ @Override
+ protected Image getImageForObject(Object object) {
+ return TaskListImages.getImage(TaskListImages.TASK_REMOTE);
+ }
+
+ @Override
+ protected String getTextForObject(Object node) {
+ return "" + node;
+ }
+
+ /**
+ * TODO: slow?
+ */
+ @Override
+ protected String getText(IMylarElement node) {
+ // try to get from the cache before downloading
+ Object report;
+ BugzillaReportNode reportNode = MylarBugsPlugin.getReferenceProvider().getCached(node.getHandleIdentifier());
+ BugReport cachedReport = MylarBugsPlugin.getDefault().getCache().getCached(node.getHandleIdentifier());
+ IMylarStructureBridge bridge = MylarPlugin.getDefault()
+ .getStructureBridge(BugzillaStructureBridge.CONTENT_TYPE);
+
+ if (reportNode != null && cachedReport == null) {
+ report = reportNode;
+ } else {
+ report = bridge.getObjectForHandle(node.getHandleIdentifier());
+ }
+ return bridge.getName(report);
+ }
+
+ @Override
+ protected String getText(IMylarRelation edge) {
+ return BugzillaReferencesProvider.NAME;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaEditingMonitor.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaEditingMonitor.java
new file mode 100644
index 000000000..2db3d01eb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaEditingMonitor.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * 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.mylar.internal.bugs;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylar.internal.bugzilla.ui.editor.AbstractBugEditor;
+import org.eclipse.mylar.internal.bugzilla.ui.editor.BugzillaReportSelection;
+import org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTaskEditor;
+import org.eclipse.mylar.provisional.core.AbstractUserInteractionMonitor;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class BugzillaEditingMonitor extends AbstractUserInteractionMonitor {
+
+ public BugzillaEditingMonitor() {
+ super();
+ }
+
+ @Override
+ protected void handleWorkbenchPartSelection(IWorkbenchPart part, ISelection selection) {
+ if (!(part instanceof AbstractBugEditor) && !(part instanceof BugzillaTaskEditor))
+ return;
+
+ if (selection instanceof StructuredSelection) {
+ StructuredSelection ss = (StructuredSelection) selection;
+ Object object = ss.getFirstElement();
+ if (object instanceof BugzillaReportSelection)
+ super.handleElementSelection(part, object);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaReportCache.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaReportCache.java
new file mode 100644
index 000000000..7d169cb7c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaReportCache.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * 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.mylar.internal.bugs;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.mylar.bugzilla.core.BugReport;
+import org.eclipse.mylar.bugzilla.core.IBugzillaBug;
+import org.eclipse.mylar.internal.bugzilla.core.BugzillaTools;
+import org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaCacheFile;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+
+/**
+ * @author Shawn Minto
+ */
+public class BugzillaReportCache {
+
+ private Map<String, BugReport> cache = new HashMap<String, BugReport>();
+
+ public void cache(String handle, BugReport report) {
+ cache.put(handle, report);
+ cacheFile.add(report);
+ }
+
+ public void clearCache() {
+ cache.clear();
+ cacheFile.removeAll();
+ }
+
+ public BugReport getFromCache(String bugHandle) {
+ return cache.get(bugHandle);
+ }
+
+ public Set<String> getCachedHandles() {
+ return cache.keySet();
+ }
+
+ private BugzillaCacheFile cacheFile;
+
+ private IPath getCacheFile() {
+ IPath stateLocation = Platform.getStateLocation(MylarBugsPlugin.getDefault().getBundle());
+ IPath configFile = stateLocation.append("offlineReports");
+ return configFile;
+ }
+
+ public void readCacheFile() {
+ IPath cachPath = getCacheFile();
+
+ try {
+ cacheFile = new BugzillaCacheFile(cachPath.toFile());
+ ArrayList<IBugzillaBug> cached = cacheFile.elements();
+ for (IBugzillaBug bug : cached) {
+ if (bug instanceof BugReport)
+ cache.put(BugzillaTools.getHandle(bug), (BugReport) bug);
+ }
+ } catch (Exception e) {
+ MylarStatusHandler.log(e, "occurred while restoring saved offline Bugzilla reports.");
+ }
+ }
+
+ public BugReport getCached(String handle) {
+ return cache.get(handle);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaSearchManager.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaSearchManager.java
new file mode 100644
index 000000000..c2d8c2285
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/BugzillaSearchManager.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * 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.mylar.internal.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;
+import org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaReportNode;
+
+/**
+ * Class to handle the bridge between mylar and bugzilla
+ *
+ * @author Shawn Minto
+ */
+public class BugzillaSearchManager {
+
+ /** The hash of all of the landmarks and their related search hits */
+ private Map<String, Map<Integer, List<BugzillaReportNode>>> 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<BugzillaReportNode>>>());
+ }
+
+ /**
+ * 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<BugzillaReportNode> doiList, IMember m, int scope) {
+ Map<Integer, List<BugzillaReportNode>> searches = landmarksHash.get(m.getHandleIdentifier());
+
+ if (searches == null) {
+ searches = new HashMap<Integer, List<BugzillaReportNode>>();
+ }
+ 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<BugzillaReportNode> getFromLandmarksHash(IMember m, int scope) {
+ Map<Integer, List<BugzillaReportNode>> 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();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/MylarBugsPlugin.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/MylarBugsPlugin.java
new file mode 100644
index 000000000..8c9d81937
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/MylarBugsPlugin.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * 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.mylar.internal.bugs;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylar.internal.bugs.search.BugzillaReferencesProvider;
+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 MylarBugsPlugin extends AbstractUIPlugin {
+
+ public static ImageDescriptor EDGE_REF_BUGZILLA = getImageDescriptor("icons/elcl16/edge-ref-bug.gif");
+
+ // private BugzillaEditingMonitor bugzillaEditingMonitor;
+
+ private static BugzillaSearchManager bridge = null;
+
+ private static BugzillaReferencesProvider referencesProvider = new BugzillaReferencesProvider();
+
+ private static MylarBugsPlugin plugin;
+
+ private BugzillaReportCache cache;
+
+ public MylarBugsPlugin() {
+ plugin = this;
+ }
+
+ /**
+ * This method is called upon plug-in activation
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ 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();
+ // MylarPlugin.getDefault().getSelectionMonitors().add(bugzillaEditingMonitor);
+ }
+ });
+ }
+
+ /**
+ * This method is called when the plug-in is stopped
+ */
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ plugin = null;
+ // MylarPlugin.getDefault().getSelectionMonitors().remove(bugzillaEditingMonitor);
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static MylarBugsPlugin 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("org.eclipse.mylar.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.tasks.core/src/org/eclipse/mylyn/internal/bugs/java/AbstractHyperlinkDetector.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/java/AbstractHyperlinkDetector.java
new file mode 100644
index 000000000..36768f3f4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/java/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.mylar.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.tasks.core/src/org/eclipse/mylyn/internal/bugs/java/BugzillaHyperLinkDetector.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/java/BugzillaHyperLinkDetector.java
new file mode 100644
index 000000000..95a4d1d16
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/java/BugzillaHyperLinkDetector.java
@@ -0,0 +1,191 @@
+/*******************************************************************************
+ * 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.mylar.internal.bugs.java;
+
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+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.Region;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+/**
+ * @author Shawn Minto
+ */
+public class BugzillaHyperLinkDetector extends AbstractHyperlinkDetector {
+
+ @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();
+
+ 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.tasks.core/src/org/eclipse/mylyn/internal/bugs/java/OpenBugzillaReportJob.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/java/OpenBugzillaReportJob.java
new file mode 100644
index 000000000..3cff3dddd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/java/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.mylar.internal.bugs.java;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.mylar.internal.bugzilla.ui.BugzillaOpenStructure;
+import org.eclipse.mylar.internal.bugzilla.ui.ViewBugzillaAction;
+import org.eclipse.mylar.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.tasks.core/src/org/eclipse/mylyn/internal/bugs/search/BugzillaMylarSearch.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/search/BugzillaMylarSearch.java
new file mode 100644
index 000000000..12769a46a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/search/BugzillaMylarSearch.java
@@ -0,0 +1,192 @@
+/*******************************************************************************
+ * 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 13, 2004
+ */
+package org.eclipse.mylar.internal.bugs.search;
+
+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.mylar.internal.bugs.BugzillaSearchManager;
+import org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaReportNode;
+import org.eclipse.mylar.internal.core.search.IActiveSearchListener;
+import org.eclipse.mylar.internal.core.search.IMylarSearchOperation;
+import org.eclipse.mylar.provisional.core.InterestComparator;
+
+/**
+ * Used to facilitate bugzilla searches based on IJavaElements
+ *
+ * @author Shawn Minto
+ */
+public class BugzillaMylarSearch implements IMylarSearchOperation {
+
+ // 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 int scope;
+
+ private IJavaElement element;
+
+ private String handle = "";
+
+ private String serverUrl = "";
+
+ /**
+ * Constructor
+ *
+ * @param scope
+ * The scope of this search
+ */
+ public BugzillaMylarSearch(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
+ BugzillaMylarSearchOperation op = new BugzillaMylarSearchOperation(this, m, scope);
+
+ // create a new search job so that it can be scheduled and
+ // run as a background thread
+ Job searchJob = new BugzillaMylarSearchJob("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 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<BugzillaReportNode> 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.tasks.core/src/org/eclipse/mylyn/internal/bugs/search/BugzillaMylarSearchJob.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/search/BugzillaMylarSearchJob.java
new file mode 100644
index 000000000..9ea170a50
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/search/BugzillaMylarSearchJob.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.mylar.internal.bugs.search;
+
+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.mylar.internal.bugs.BugzillaSearchManager;
+import org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin;
+import org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * The bugzilla search job used to search a bugzilla site
+ *
+ * @author Shawn Minto
+ * @author Mik Kersten
+ */
+public class BugzillaMylarSearchJob extends Job {
+
+ /** The search operation used to perform the query */
+ private BugzillaMylarSearchOperation operation;
+
+ /**
+ * Constructor
+ *
+ * @param name
+ * Job name
+ * @param operation
+ * The operation to perform the search query
+ */
+ public BugzillaMylarSearchJob(String name, BugzillaMylarSearchOperation 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. ");
+ BugzillaPlugin.log(new Status(IStatus.ERROR, IBugzillaConstants.PLUGIN_ID, 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];
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/search/Util.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/search/Util.java
new file mode 100644
index 000000000..98701ee5a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/bugs/search/Util.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
+ *******************************************************************************/
+/*
+ * Created on Nov 19, 2004
+ */
+package org.eclipse.mylar.internal.bugs.search;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.nio.charset.Charset;
+
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin;
+import org.eclipse.mylar.internal.bugzilla.core.BugzillaRepositoryUtil;
+import org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskRepository;
+
+/**
+ * Utilities methods for the BugzillaMylarBridge
+ *
+ * @author Shawn Minto
+ * @author Mik Kersten
+ */
+public class Util {
+
+ /**
+ * List of all of the search operations 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 += BugzillaMylarSearchOperation.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();
+
+ String[] resolutionValues = BugzillaRepositoryUtil.getQueryOptions(IBugzillaConstants.VALUES_RESOLUTION,
+ repositoryUrl);
+
+ String[] statusValues = BugzillaRepositoryUtil.getQueryOptions(IBugzillaConstants.VALUES_STATUS, repositoryUrl);
+
+ // 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 = MylarTaskListPlugin.getRepositoryManager().getRepository(
+ BugzillaPlugin.REPOSITORY_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 description 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 (int i = 0; i < lines.length; i++) {
+
+ if (lines[i].matches(regexElement)) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
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 000000000..668b6ccd8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,303 @@
+#Mon Feb 13 11:20:16 PST 2006
+eclipse.preferences.version=1
+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=disabled
+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.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.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=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.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.5
+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=16
+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_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.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_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=80
+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_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_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.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.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
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 000000000..2448f889c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,5 @@
+#Mon Feb 13 11:20:15 PST 2006
+eclipse.preferences.version=1
+formatter_profile=_Mylar based on Eclipse [built-in]
+formatter_settings_version=10
+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">/**\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><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 - 2006 University Of British Columbia 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 * University Of British Columbia - 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></templates>
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 000000000..65a57d4f3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Mylar Tasklist Tests Plug-in
+Bundle-SymbolicName: org.eclipse.mylar.tasklist.tests
+Bundle-Version: 0.0.0
+Bundle-Activator: org.eclipse.mylar.tasklist.tests.MylarTasksTestsPlugin
+Bundle-Vendor: Eclipse.org
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.core.runtime,
+ org.junit,
+ org.eclipse.mylar.core,
+ org.eclipse.mylar.core.tests,
+ org.eclipse.jdt.core,
+ org.eclipse.core.resources,
+ org.eclipse.ui,
+ org.eclipse.mylar.bugzilla.core,
+ org.eclipse.mylar.bugzilla.ui,
+ org.eclipse.mylar.bugs,
+ org.eclipse.mylar.tasklist
+Eclipse-AutoStart: true
+Bundle-ClassPath: mylar-tasklist-tests.jar
+Export-Package: org.eclipse.mylar.tasklist.tests
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.mylyn.tasks.tests/build.properties b/org.eclipse.mylyn.tasks.tests/build.properties
new file mode 100644
index 000000000..de0b15d28
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/build.properties
@@ -0,0 +1,20 @@
+###############################################################################
+# 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
+###############################################################################
+bin.includes = META-INF/,\
+ mylar-tasklist-tests.jar,\
+ about.html
+jars.compile.order = mylar-tasklist-tests.jar
+source.mylar-tasklist-tests.jar = src/
+output.mylar-tasklist-tests.jar = bin/
+src.includes = about.html,\
+ src/,\
+ META-INF/
+jre.compilation.profile = J2SE-1.5
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/AllTasklistTests.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/AllTasklistTests.java
new file mode 100644
index 000000000..e8bc613bd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/AllTasklistTests.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * 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.mylar.tasklist.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author Mik Kersten
+ */
+public class AllTasklistTests {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("Test for org.eclipse.mylar.tasklist.tests");
+
+ // $JUnit-BEGIN$
+ suite.addTestSuite(TaskListNotificationManagerTest.class);
+ suite.addTestSuite(BugzillaTaskTest.class);
+ suite.addTestSuite(TaskReportGeneratorTest.class);
+ suite.addTestSuite(TaskTest.class);
+ suite.addTestSuite(TaskRepositoryManagerTest.class);
+ suite.addTestSuite(TaskListStandaloneTest.class);
+ suite.addTestSuite(TaskListManagerTest.class);
+ suite.addTestSuite(TaskListUiTest.class);
+ suite.addTestSuite(TaskListDnDTest.class);
+ suite.addTestSuite(TaskHistoryTest.class);
+ suite.addTestSuite(TaskDataExportTest.class);
+ suite.addTestSuite(TaskDataImportTest.class);
+ suite.addTestSuite(BackgroundSaveTest.class);
+ suite.addTestSuite(TaskActivityTimingTest.class);
+ // suite.addTestSuite(RetrieveTitleFromUrlTest.class);
+ // $JUnit-END$
+ return suite;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/BackgroundSaveTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/BackgroundSaveTest.java
new file mode 100644
index 000000000..ce10fe6ab
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/BackgroundSaveTest.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.mylar.tasklist.tests;
+
+import java.io.File;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylar.internal.tasklist.util.BackgroundSaveTimer;
+import org.eclipse.mylar.internal.tasklist.util.TaskListSaveManager;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+
+/**
+ * Tests the mechanism for saving the task data periodically. If this test fails
+ * unexpectedly, try adjusting the timing.
+ *
+ * @author Wesley Coelho
+ * @author Mik Kersten (rewrite)
+ */
+public class BackgroundSaveTest extends TestCase {
+
+ private BackgroundSaveTimer saveTimer;
+
+ private TaskListSaveManager policy;
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ policy = MylarTaskListPlugin.getDefault().getTaskListSaveManager();
+
+ saveTimer = new BackgroundSaveTimer(MylarTaskListPlugin.getDefault().getTaskListSaveManager());
+ saveTimer.setSaveIntervalMillis(50);
+ saveTimer.start();
+ MylarTaskListPlugin.getDefault().getTaskListSaveManager().setForceBackgroundSave(true);
+ }
+
+ protected void tearDown() throws Exception {
+ saveTimer.stop();
+ super.tearDown();
+ MylarTaskListPlugin.getDefault().getTaskListSaveManager().setForceBackgroundSave(false);
+ }
+
+ public void testBackgroundSave() throws InterruptedException {
+ File file = MylarTaskListPlugin.getTaskListManager().getTaskListFile();
+ policy.saveTaskListAndContexts();
+
+ long fistModified = file.lastModified();
+ Thread.sleep(500);
+
+ assertTrue(file.lastModified() > fistModified);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/BugzillaTaskTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/BugzillaTaskTest.java
new file mode 100644
index 000000000..4662b9189
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/BugzillaTaskTest.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.mylar.tasklist.tests;
+
+import java.util.Date;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylar.bugzilla.core.Attribute;
+import org.eclipse.mylar.bugzilla.core.BugReport;
+import org.eclipse.mylar.bugzilla.core.Comment;
+import org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTask;
+
+/**
+ * @author Mik Kersten
+ */
+public class BugzillaTaskTest extends TestCase {
+
+ @Override
+ protected void setUp() throws Exception {
+ // ignore
+ super.setUp();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ // ignore
+ super.tearDown();
+ }
+
+ public void testCompletionDate() {
+ BugzillaTask task = new BugzillaTask("handle", "description", true);
+ BugReport report = new BugReport(1, IBugzillaConstants.ECLIPSE_BUGZILLA_URL);
+ task.setBugReport(report);
+ assertNull(task.getCompletionDate());
+
+ Date now = new Date();
+ report.addComment(new Comment(report, 1, now, "author", "author-name"));
+ assertNull(task.getCompletionDate());
+
+ Attribute resolvedAttribute = new Attribute(BugReport.ATTR_STATUS);
+ resolvedAttribute.setValue(BugReport.VAL_STATUS_RESOLVED);
+ report.addAttribute(resolvedAttribute);
+ assertEquals(now, task.getCompletionDate());
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/MylarTasksTestsPlugin.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/MylarTasksTestsPlugin.java
new file mode 100644
index 000000000..4e1f14b43
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/MylarTasksTestsPlugin.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * 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.mylar.tasklist.tests;
+
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class MylarTasksTestsPlugin extends Plugin {
+ // The shared instance.
+ private static MylarTasksTestsPlugin plugin;
+
+ /**
+ * The constructor.
+ */
+ public MylarTasksTestsPlugin() {
+ 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 MylarTasksTestsPlugin getDefault() {
+ return plugin;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/RetrieveTitleFromUrlTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/RetrieveTitleFromUrlTest.java
new file mode 100644
index 000000000..1091e96f5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/RetrieveTitleFromUrlTest.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * 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.mylar.tasklist.tests;
+
+import java.lang.reflect.InvocationTargetException;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylar.internal.tasklist.ui.views.RetrieveTitleFromUrlJob;
+
+/**
+ * @author Mik Kersten
+ */
+public class RetrieveTitleFromUrlTest extends TestCase {
+
+ // XXX broken due to hang that causes the scheduled job to never complete
+ public void testRetrieve() throws InterruptedException, InvocationTargetException {
+ final String url = "http://eclipse.org/mylar/index.php";
+ final String knownTitle = "Mylar Technology Project";
+
+ RetrieveTitleFromUrlJob job = new RetrieveTitleFromUrlJob(url) {
+
+ public void setTitle(String title) {
+ assertEquals(knownTitle, title);
+ }
+ };
+ job.run(new NullProgressMonitor());
+
+ assertTrue(job.isTitleRetrieved());
+ assertEquals(knownTitle, job.getPageTitle());
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskActivityTimingTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskActivityTimingTest.java
new file mode 100644
index 000000000..43d91d832
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/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.mylar.tasklist.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylar.internal.core.util.TimerThread;
+import org.eclipse.mylar.internal.tasklist.util.TaskActivityTimer;
+import org.eclipse.mylar.provisional.core.InteractionEvent;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.Task;
+import org.eclipse.mylar.provisional.tasklist.TaskListManager;
+
+/**
+ * @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 = MylarTaskListPlugin.getTaskListManager();
+
+ protected Task task1 = null;
+
+ protected int originalActivityTimeout = -1;
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ task1 = new Task("t1", "t1", true);
+ originalActivityTimeout = MylarPlugin.getContextManager().getInactivityTimeout();
+ MylarPlugin.getContextManager().setInactivityTimeout(TIMEOUT);
+ manager.setTimerSleepInterval(SLEEP_INTERVAL);
+ }
+
+ public void tearDown() {
+ MylarTaskListPlugin.getTaskListManager().deactivateTask(task1);
+ ITask remaining = MylarTaskListPlugin.getTaskListManager().getTaskList().getActiveTask();
+ if (remaining != null) {
+ MylarTaskListPlugin.getTaskListManager().deactivateTask(remaining);
+ }
+ MylarPlugin.getContextManager().setInactivityTimeout(originalActivityTimeout);
+ manager.setTimerSleepInterval(TimerThread.DEFAULT_SLEEP_INTERVAL);
+ }
+
+ public void testDeactivation() throws InterruptedException {
+ assertEquals(0, task1.getElapsedTime());
+ MylarTaskListPlugin.getTaskListManager().deactivateTask(task1);
+ assertEquals(0, task1.getElapsedTime());
+
+ MylarTaskListPlugin.getTaskListManager().activateTask(task1);
+ Thread.sleep(SLEEP_NOTIMEOUT);
+ MylarTaskListPlugin.getTaskListManager().deactivateTask(task1);
+ assertTrue("elapsed: " + task1.getElapsedTime(), task1.getElapsedTime() >= SLEEP_NOTIMEOUT);
+ }
+
+ 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);
+ MylarTaskListPlugin.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);
+ MylarTaskListPlugin.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);
+ MylarTaskListPlugin.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);
+
+ MylarPlugin.getContextManager().setInactivityTimeout(SLEEP_TIMEOUT * 2);
+ MylarTaskListPlugin.getTaskListManager().activateTask(task1);
+ Thread.sleep(SLEEP_TIMEOUT);
+ // Should not have timed out
+ MylarTaskListPlugin.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);
+ MylarTaskListPlugin.getTaskListManager().deactivateTask(task0);
+
+ }
+
+ protected void mockInteraction() {
+ MylarPlugin.getDefault().notifyInteractionObserved(
+ new InteractionEvent(InteractionEvent.Kind.EDIT, "java", "A.java", "mock-id"));
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskDataExportTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskDataExportTest.java
new file mode 100644
index 000000000..f6bf8b281
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskDataExportTest.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.mylar.tasklist.tests;
+
+import java.io.File;
+
+import org.eclipse.mylar.core.tests.AbstractContextTest;
+import org.eclipse.mylar.internal.core.MylarContext;
+import org.eclipse.mylar.internal.core.MylarContextManager;
+import org.eclipse.mylar.internal.tasklist.ui.wizards.TaskDataExportWizard;
+import org.eclipse.mylar.internal.tasklist.ui.wizards.TaskDataExportWizardPage;
+import org.eclipse.mylar.provisional.core.InteractionEvent;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.Task;
+import org.eclipse.mylar.provisional.tasklist.TaskListManager;
+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 = null;
+
+ private TaskDataExportWizardPage wizardPage = null;
+
+ private File destinationDir = null;
+
+ private ITask task1 = null;
+
+ private TaskListManager manager = MylarTaskListPlugin.getTaskListManager();
+
+ private MylarContext mockContext;
+
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ // Create the export wizard
+ wizard = new TaskDataExportWizard();
+ wizard.addPages();
+ wizard.createPageControls(new Shell());
+ wizardPage = (TaskDataExportWizardPage) wizard.getPage(TaskDataExportWizardPage.PAGE_NAME);
+ assertNotNull(wizardPage);
+
+ // Create test export destination directory
+ destinationDir = new File(MylarPlugin.getDefault().getDataDirectory() + File.separator + "TestDir");
+ destinationDir.mkdir();
+ assertTrue(destinationDir.exists());
+
+ // Create a task and context with an interaction event to be saved
+ task1 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "Export Test Task", true);
+ manager.moveToRoot(task1);
+ mockContext = MylarPlugin.getContextManager().loadContext(task1.getHandleIdentifier());
+ InteractionEvent event = new InteractionEvent(InteractionEvent.Kind.EDIT, "structureKind", "handle", "originId");
+ mockContext.parseEvent(event);
+ MylarPlugin.getContextManager().contextActivated(mockContext);
+
+ // Save the context file and check that it exists
+ MylarPlugin.getContextManager().saveContext(mockContext.getHandleIdentifier());
+ File taskFile = MylarPlugin.getContextManager().getFileForContext(task1.getHandleIdentifier());
+ assertTrue(MylarPlugin.getContextManager().hasContext(task1.getHandleIdentifier()));
+ assertTrue(taskFile.exists());
+ }
+
+ protected void tearDown() throws Exception {
+ File[] files = destinationDir.listFiles();
+ for (File file : files) {
+ file.delete();
+ }
+
+ destinationDir.delete();
+ assertFalse(destinationDir.exists());
+ MylarPlugin.getContextManager().contextDeactivated(mockContext.getHandleIdentifier());
+ super.tearDown();
+ }
+
+ /**
+ * Tests the wizard when it has been asked to export all task data to a zip
+ * file
+ */
+ public void testExportAllToZip() {
+
+ // Set parameters in the wizard to simulate a user setting them and
+ // clicking "Finish"
+ wizardPage.setParameters(true, true, true, true, true, destinationDir.getPath());
+ wizard.performFinish();
+
+ // Check that the task list file was exported
+ File destZipFile = new File(destinationDir + File.separator + TaskDataExportWizard.getZipFileName());
+ assertTrue(destZipFile.exists());
+ }
+
+ /** Tests the wizard when it has been asked to export all task data */
+ public void testExportAll() {
+
+ // Set parameters in the wizard to simulate a user setting them and
+ // clicking "Finish"
+ wizardPage.setParameters(true, true, true, true, false, destinationDir.getPath());
+ wizard.performFinish();
+
+ // Check that the task list file was exported
+ File destTaskListFile = new File(destinationDir + File.separator + MylarTaskListPlugin.DEFAULT_TASK_LIST_FILE);
+ assertTrue(destTaskListFile.exists());
+
+ // Check that the activity history file was exported
+ File destActivationHistoryFile = new File(destinationDir + File.separator
+ + MylarContextManager.CONTEXT_HISTORY_FILE_NAME + MylarContextManager.CONTEXT_FILE_EXTENSION);
+ assertTrue(destActivationHistoryFile.exists());
+
+ // Check that the task context file created in setUp() was exported
+ File destTaskContextFile = MylarPlugin.getContextManager().getFileForContext(task1.getHandleIdentifier());
+ // File destTaskContextFile = new File(destinationDir + File.separator +
+ // task1.getContextPath() + MylarContextManager.CONTEXT_FILE_EXTENSION);
+ assertTrue(destTaskContextFile.exists());
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskDataImportTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskDataImportTest.java
new file mode 100644
index 000000000..f0b34b799
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskDataImportTest.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.mylar.tasklist.tests;
+
+import java.io.File;
+import java.util.Set;
+
+import org.eclipse.mylar.core.tests.AbstractContextTest;
+import org.eclipse.mylar.internal.tasklist.ui.wizards.TaskDataImportWizard;
+import org.eclipse.mylar.internal.tasklist.ui.wizards.TaskDataImportWizardPage;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskList;
+import org.eclipse.mylar.provisional.tasklist.TaskListManager;
+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 String sourceDir = "testdata/taskdataimporttest";
+
+ private File sourceDirFile = null;
+
+ private String sourceZipPath = "testdata/taskdataimporttest/mylardata-2006-02-16.zip";
+
+ private File sourceZipFile = null;
+
+ private TaskListManager manager = MylarTaskListPlugin.getTaskListManager();
+
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ // Create the import wizard
+ wizard = new TaskDataImportWizard();
+ wizard.addPages();
+ wizard.createPageControls(new Shell());
+ wizardPage = (TaskDataImportWizardPage) wizard.getPage(TaskDataImportWizardPage.PAGE_NAME);
+ assertNotNull(wizardPage);
+
+ manager.createNewTaskList();
+ assertTrue(manager.getTaskList().getRootElements().size() == 1);
+
+ sourceDirFile = TaskTestUtil.getLocalFile(sourceDir);
+ assertTrue(sourceDirFile.exists());
+ sourceZipFile = TaskTestUtil.getLocalFile(sourceZipPath);
+ assertTrue(sourceZipFile.exists());
+
+ // make sure no tasks and categories exist prior to import tests
+ assertEquals(manager.getTaskList().getTaskCategories().size(), 1);
+
+ }
+
+ protected void tearDown() throws Exception {
+
+ super.tearDown();
+ }
+
+ /**
+ * Tests the wizard when it has been asked to import all task data from a
+ * zip file
+ */
+ public void testImportFromAllFromZip() {
+ wizardPage.setParameters(true, true, true, true, true, "", sourceZipFile.getPath());
+ wizard.performFinish();
+
+ TaskList taskList = MylarTaskListPlugin.getTaskListManager().getTaskList();
+ assertNotNull(taskList);
+ Set<ITask> tasks = taskList.getRootTasks();
+ assertTrue(tasks.size() > 0);
+ for (ITask task : tasks) {
+ assertTrue(MylarPlugin.getContextManager().hasContext(task.getHandleIdentifier()));
+ }
+ }
+
+ /** Tests the wizard when it has been asked to import task data from folder */
+ public void testImportFromAllFromFolder() {
+ wizardPage.setParameters(true, true, true, true, false, sourceDirFile.getPath(), "");
+ wizard.performFinish();
+
+ TaskList taskList = MylarTaskListPlugin.getTaskListManager().getTaskList();
+ assertNotNull(taskList);
+ Set<ITask> tasks = taskList.getRootTasks();
+ assertTrue(tasks.size() > 0);
+ for (ITask task : tasks) {
+ assertTrue(MylarPlugin.getContextManager().hasContext(task.getHandleIdentifier()));
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskHistoryTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskHistoryTest.java
new file mode 100644
index 000000000..2b743e458
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskHistoryTest.java
@@ -0,0 +1,214 @@
+/*******************************************************************************
+ * 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.mylar.tasklist.tests;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylar.internal.tasklist.ui.actions.NextTaskDropDownAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.PreviousTaskDropDownAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.TaskActivateAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.TaskDeactivateAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.TaskNavigateDropDownAction.TaskNavigateAction;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskActivationHistory;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.Task;
+import org.eclipse.mylar.provisional.tasklist.TaskListManager;
+import org.eclipse.ui.PartInitException;
+
+/**
+ * @author Wes Coelho
+ */
+public class TaskHistoryTest extends TestCase {
+
+ protected TaskListManager manager = MylarTaskListPlugin.getTaskListManager();
+
+ protected TaskListView taskView = null;
+
+ protected Task task1 = null;
+
+ protected Task task2 = null;
+
+ protected Task task3 = null;
+
+ protected Task task4 = null;
+
+ protected Task task5 = null;
+
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ try {
+ MylarTaskListPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(
+ "org.eclipse.mylar.tasks.ui.views.TaskListView");
+ } catch (PartInitException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ fail("View not initialized");
+ }
+
+ assertNotNull(TaskListView.getDefault());
+ taskView = TaskListView.getDefault();
+
+ resetHistory();
+
+ task1 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 1", true);
+ task2 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 2", true);
+ task3 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 3", true);
+ task4 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 4", true);
+ task5 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 5", true);
+
+ manager.moveToRoot(task1);
+ manager.moveToRoot(task2);
+ manager.moveToRoot(task3);
+ manager.moveToRoot(task4);
+ manager.moveToRoot(task5);
+
+ }
+
+ private void resetHistory() {
+ taskView.clearTaskHistory();
+ MylarPlugin.getContextManager().resetActivityHistory();
+ }
+
+ /**
+ * Tests the next task and previous task navigation.
+ */
+ public void testBasicHistoryNavigation() {
+ (new TaskActivateAction()).run(task1);
+ taskView.addTaskToHistory(task1);
+ (new TaskActivateAction()).run(task2);
+ taskView.addTaskToHistory(task2);
+ (new TaskActivateAction()).run(task3);
+ taskView.addTaskToHistory(task3);
+
+ assertTrue(task3.isActive());
+ assertFalse(task2.isActive());
+
+ taskView.getPreviousTaskAction().run();
+ assertTrue(task2.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());
+
+ (new TaskActivateAction()).run(task4);
+ taskView.addTaskToHistory(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() {
+
+ resetHistory();
+
+ // Simulate activating the tasks by clicking rather than
+ // navigating previous/next
+ (new TaskActivateAction()).run(task1);
+ taskView.addTaskToHistory(task1);
+ (new TaskActivateAction()).run(task2);
+ taskView.addTaskToHistory(task2);
+ (new TaskActivateAction()).run(task3);
+ taskView.addTaskToHistory(task3);
+ (new TaskActivateAction()).run(task4);
+ taskView.addTaskToHistory(task4);
+
+ assertTrue(task4.isActive());
+ TaskActivationHistory taskHistory = taskView.getTaskActivationHistory();
+ List<ITask> prevHistoryList = taskHistory.getPreviousTasks();
+
+ // Check that the previous history list looks right
+ assertTrue(prevHistoryList.size() >= 3);
+ assertTrue(prevHistoryList.get(prevHistoryList.size() - 1) == task3);
+ assertTrue(prevHistoryList.get(prevHistoryList.size() - 2) == task2);
+ assertTrue(prevHistoryList.get(prevHistoryList.size() - 3) == task1);
+
+ // Get a task from the list and activate it
+ PreviousTaskDropDownAction prevAction = new PreviousTaskDropDownAction(taskView, taskHistory);
+ TaskNavigateAction navigateAction = prevAction.new TaskNavigateAction(task2);
+ navigateAction.run();
+ taskHistory.navigatedToTask(task2);
+
+ assertTrue(task2.isActive());
+
+ // Now check that the next and prev lists look right
+ prevHistoryList = taskHistory.getPreviousTasks();
+ assertTrue(prevHistoryList.get(prevHistoryList.size() - 1) == task1);
+ 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
+ (new TaskActivateAction()).run(task5);
+ (new TaskDeactivateAction()).run(task5);
+ taskView.addTaskToHistory(task5);
+ prevHistoryList = taskHistory.getPreviousTasks();
+ assertTrue(prevHistoryList.get(prevHistoryList.size() - 1) == task5);
+
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListDnDTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListDnDTest.java
new file mode 100644
index 000000000..4931ff2e0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListDnDTest.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.mylar.tasklist.tests;
+
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListDropAdapter;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskListManager;
+
+/**
+ * @author Robert Elves
+ * @author Mik Kersten
+ */
+public class TaskListDnDTest extends TestCase {
+
+ private TaskListDropAdapter dropAdapter;
+
+ private TaskListManager manager;
+
+ @Override
+ protected void setUp() throws Exception {
+ manager = MylarTaskListPlugin.getTaskListManager();
+ manager.createNewTaskList();
+
+ TreeViewer viewer = TaskListView.getDefault().getViewer();
+ assertNotNull(viewer);
+ dropAdapter = new TaskListDropAdapter(viewer);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ manager.createNewTaskList();
+ MylarTaskListPlugin.getDefault().getTaskListSaveManager().saveTaskListAndContexts();
+ }
+
+ public void testisUrl() {
+ String url = "http://eclipse.org";
+ String title = "Title";
+ String urlData = url + "\n" + title;
+ assertFalse(dropAdapter.isUrl(title));
+ assertTrue(dropAdapter.isUrl(url));
+ assertTrue(dropAdapter.isUrl(urlData));
+ }
+
+ public void testUrlDrop() {
+ assertEquals(0, manager.getTaskList().getRootTasks().size());
+ String url = "http://eclipse.org/mylar";
+ String title = "Mylar Technology Project";
+ String urlData = url + "\n" + title;
+
+ dropAdapter.performDrop(urlData);
+ Set<ITask> tasks = manager.getTaskList().getRootTasks();
+ 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/tasklist/tests/TaskListManagerTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListManagerTest.java
new file mode 100644
index 000000000..722d52f65
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListManagerTest.java
@@ -0,0 +1,376 @@
+/*******************************************************************************
+ * 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 Dec 21, 2004
+ */
+package org.eclipse.mylar.tasklist.tests;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin;
+import org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryQuery;
+import org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTask;
+import org.eclipse.mylar.internal.tasklist.ScheduledTaskListRefreshJob;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskContainer;
+import org.eclipse.mylar.provisional.tasklist.ITaskListElement;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.Task;
+import org.eclipse.mylar.provisional.tasklist.TaskCategory;
+import org.eclipse.mylar.provisional.tasklist.TaskList;
+import org.eclipse.mylar.provisional.tasklist.TaskListManager;
+import org.eclipse.mylar.provisional.tasklist.TaskRepository;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListManagerTest extends TestCase {
+
+ private TaskListManager manager;
+
+ private TaskRepository repository;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ manager = MylarTaskListPlugin.getTaskListManager();
+ manager.createNewTaskList();
+
+ repository = new TaskRepository(BugzillaPlugin.REPOSITORY_KIND,
+ new URL(IBugzillaConstants.ECLIPSE_BUGZILLA_URL));
+ MylarTaskListPlugin.getRepositoryManager().addRepository(repository);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ manager.createNewTaskList();
+ MylarTaskListPlugin.getDefault().getTaskListSaveManager().saveTaskListAndContexts();
+ MylarTaskListPlugin.getRepositoryManager().removeRepository(repository);
+ }
+
+ public void testLegacyTaskListReading() throws IOException {
+ File originalFile = manager.getTaskListFile();
+ File legacyListFile = new File("temptasklist.xml");
+ legacyListFile.deleteOnExit();
+ TaskTestUtil.copy(TaskTestUtil.getLocalFile("testdata/legacy/tasklist_0_4_8.xml"), legacyListFile);
+
+ assertEquals(362445, legacyListFile.length());
+ assertTrue(legacyListFile.exists());
+
+ manager.setTaskListFile(legacyListFile);
+ manager.readExistingOrCreateNewList();
+ manager.setTaskListFile(originalFile);
+
+ Set<ITask> allTasks = manager.getTaskList().getAllTasks();
+ Set<ITask> allRootTasks = manager.getTaskList().getRootTasks();
+ Set<ITaskContainer> allCategories = manager.getTaskList().getCategories();
+ Set<ITaskListElement> allRoots = manager.getTaskList().getRootElements();
+ assertEquals(0, allRootTasks.size());
+
+ manager.saveTaskList();
+ TaskList list = new TaskList();
+ manager.setTaskList(list);
+ manager.readExistingOrCreateNewList();
+
+ assertEquals(allRootTasks.size(), manager.getTaskList().getRootTasks().size());
+ assertEquals(allCategories, manager.getTaskList().getCategories());
+ assertEquals(allRoots.size(), manager.getTaskList().getRootElements().size());
+ assertEquals(allTasks.size(), manager.getTaskList().getAllTasks().size());
+
+ // rewrite and test again
+ manager.saveTaskList();
+ list = new TaskList();
+ manager.setTaskList(list);
+ manager.readExistingOrCreateNewList();
+
+ assertEquals(allRootTasks.size(), manager.getTaskList().getRootTasks().size());
+ assertEquals(allCategories, manager.getTaskList().getCategories());
+ assertEquals(allRoots.size(), manager.getTaskList().getRootElements().size());
+ assertEquals(allTasks.size(), manager.getTaskList().getAllTasks().size());
+
+ manager.deactivateTask(manager.getTaskList().getActiveTask());
+ }
+
+ public void testRepositoryUrlHandles() {
+
+ String repository = IBugzillaConstants.ECLIPSE_BUGZILLA_URL;
+ String id = "123";
+ String handle = AbstractRepositoryTask.getHandle(repository, id);
+ BugzillaTask bugTask = new BugzillaTask(handle, "label 124", true);
+ assertEquals(repository, bugTask.getRepositoryUrl());
+
+ manager.moveToRoot(bugTask);
+
+ manager.saveTaskList();
+ TaskList list = new TaskList();
+ manager.setTaskList(list);
+ manager.readExistingOrCreateNewList();
+
+ BugzillaTask readReport = (BugzillaTask) manager.getTaskList().getRootTasks().iterator().next();
+ assertEquals(readReport.getDescription(), readReport.getDescription());
+ assertEquals(readReport.getRepositoryUrl(), readReport.getRepositoryUrl());
+ }
+
+ public void testMoves() {
+ assertEquals(0, manager.getTaskList().getRootTasks().size());
+ Task task1 = new Task("t1", "t1", true);
+ manager.moveToRoot(task1);
+ assertEquals(1, manager.getTaskList().getRootTasks().size());
+ assertEquals(TaskList.LABEL_ROOT, task1.getCategory().getHandleIdentifier());
+
+ TaskCategory cat1 = new TaskCategory("c1");
+ manager.addCategory(cat1);
+
+ manager.moveToCategory(cat1, task1);
+ assertEquals(0, manager.getTaskList().getRootTasks().size());
+ assertEquals(cat1, task1.getCategory());
+
+ manager.moveToRoot(task1);
+ assertEquals(1, manager.getTaskList().getRootTasks().size());
+ assertEquals(0, cat1.getChildren().size());
+ assertEquals(TaskList.LABEL_ROOT, task1.getCategory().getHandleIdentifier());
+ }
+
+ public void testPlans() {
+ Task task1 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 1", true);
+ task1.addPlan("default");
+ manager.moveToRoot(task1);
+
+ manager.saveTaskList();
+ assertNotNull(manager.getTaskList());
+ TaskList list = new TaskList();
+ manager.setTaskList(list);
+ manager.readExistingOrCreateNewList();
+ assertNotNull(manager.getTaskList());
+
+ Set<ITask> readList = manager.getTaskList().getRootTasks();
+ ITask task = readList.iterator().next();
+ assertEquals(1, task.getPlans().size());
+ assertTrue(task.getPlans().get(0).equals("default"));
+ }
+
+ public void testEmpty() {
+ TaskList list = new TaskList();
+ assertTrue(list.isEmpty());
+ list.internalAddRootTask(new Task("", "", true));
+ assertFalse(list.isEmpty());
+ }
+
+ public void testCategories() {
+ BugzillaTask task = new BugzillaTask("b1", "b 1", true);
+ TaskCategory category = new TaskCategory("cat");
+ manager.addCategory(category);
+ manager.moveToCategory(category, task);
+ assertNotNull(manager.getTaskList());
+
+ TaskList list = new TaskList();
+ manager.setTaskList(list);
+ manager.readExistingOrCreateNewList();
+ assertEquals(2, manager.getTaskList().getCategories().size());
+ assertEquals(1, manager.getTaskList().getAllTasks().size());
+ }
+
+ public void testDelete() {
+ ITask task = new Task("handle", "label", true);
+ manager.getTaskList().addTaskToArchive(task);
+ manager.getTaskList().internalAddRootTask(task);
+ manager.deleteTask(task);
+ assertEquals(0, manager.getTaskList().getAllTasks().size());
+ }
+
+ public void testBugzillaCustomQueryExternalization() {
+ BugzillaRepositoryQuery query = new BugzillaRepositoryQuery("repositoryUrl", "queryUrl", "label", "1");
+ query.setCustomQuery(true);
+ manager.addQuery(query);
+ manager.saveTaskList();
+ assertNotNull(manager.getTaskList());
+
+ TaskList list = new TaskList();
+ manager.setTaskList(list);
+ manager.readExistingOrCreateNewList();
+ assertEquals(1, manager.getTaskList().getQueries().size());
+ BugzillaRepositoryQuery readQuery = (BugzillaRepositoryQuery)manager.getTaskList().getQueries().get(0);
+ assertTrue(readQuery.isCustomQuery());
+ }
+
+ public void testQueryExternalization() {
+ AbstractRepositoryQuery query = new BugzillaRepositoryQuery("repositoryUrl", "queryUrl", "label", "1");
+ assertEquals("repositoryUrl", query.getRepositoryUrl());
+ assertEquals("queryUrl", query.getQueryUrl());
+ manager.addQuery(query);
+ manager.saveTaskList();
+ assertNotNull(manager.getTaskList());
+
+ manager.setTaskList(new TaskList());
+ manager.readExistingOrCreateNewList();
+ assertEquals(1, manager.getTaskList().getQueries().size());
+ AbstractRepositoryQuery readQuery = manager.getTaskList().getQueries().get(0);
+ assertEquals(query.getQueryUrl(), readQuery.getQueryUrl());
+ assertEquals(query.getRepositoryUrl(), readQuery.getRepositoryUrl());
+ assertEquals("repositoryUrl", readQuery.getRepositoryUrl());
+ }
+
+ public void testArchiveRepositoryTaskExternalization() {
+ BugzillaTask repositoryTask = new BugzillaTask("handle", "label", true);
+ repositoryTask.setKind("kind");
+ manager.getTaskList().addTaskToArchive(repositoryTask);
+// repositoryTask.setCategory(manager.getTaskList().getArchiveCategory());
+ assertEquals(1, manager.getTaskList().getArchiveTasks().size());
+ assertEquals(0, manager.getTaskList().getRootTasks().size());
+ manager.saveTaskList();
+
+ manager.setTaskList(new TaskList());
+ manager.readExistingOrCreateNewList();
+ assertEquals(1, manager.getTaskList().getArchiveTasks().size());
+ assertEquals(0, manager.getTaskList().getRootTasks().size());
+ }
+
+ public void testRepositoryTaskExternalization() {
+ BugzillaTask repositoryTask = new BugzillaTask("handle", "label", true);
+ repositoryTask.setKind("kind");
+ manager.moveToRoot(repositoryTask);
+ manager.saveTaskList();
+
+ TaskList list = new TaskList();
+ manager.setTaskList(list);
+ manager.readExistingOrCreateNewList();
+ assertEquals(1, manager.getTaskList().getRootTasks().size());
+ AbstractRepositoryTask readTask = (AbstractRepositoryTask)manager.getTaskList().getRootTasks().iterator().next();
+
+ assertEquals(repositoryTask.getHandleIdentifier(), readTask.getHandleIdentifier());
+ assertEquals(repositoryTask.getDescription(), readTask.getDescription());
+ assertEquals(repositoryTask.getKind(), readTask.getKind());
+ }
+
+ public void testRepositoryTasksAndCategoriesMultiRead() {
+ TaskCategory cat1 = new TaskCategory("Category 1");
+ manager.addCategory(cat1);
+
+ BugzillaTask reportInCat1 = new BugzillaTask("123", "label 123", true);
+ manager.moveToCategory(cat1, reportInCat1);
+ assertEquals(cat1, reportInCat1.getCategory());
+
+ manager.saveTaskList();
+ assertNotNull(manager.getTaskList());
+ manager.setTaskList(new TaskList());
+ manager.readExistingOrCreateNewList();
+
+ // read once
+ Set<TaskCategory> readCats = manager.getTaskList().getTaskCategories();
+ assertTrue(manager.getTaskList().getCategories().contains(cat1));
+ Iterator<TaskCategory> iterator = readCats.iterator();
+ TaskCategory readCat1 = iterator.next();
+ assertEquals(cat1, readCat1);
+ assertEquals(1, readCat1.getChildren().size());
+
+ manager.saveTaskList();
+ assertNotNull(manager.getTaskList());
+ manager.setTaskList(new TaskList());
+ manager.readExistingOrCreateNewList();
+
+ // read again
+ readCats = manager.getTaskList().getTaskCategories();
+ assertTrue(manager.getTaskList().getCategories().contains(cat1));
+
+ iterator = readCats.iterator();
+ readCat1 = iterator.next();
+ assertEquals(cat1, readCat1);
+ assertEquals(1, readCat1.getChildren().size());
+ }
+
+ public void testCreationAndExternalization() {
+ Set<ITask> rootTasks = new HashSet<ITask>();
+ Task task1 = new Task(manager.genUniqueTaskHandle(), "task 1", true);
+ manager.moveToRoot(task1);
+ rootTasks.add(task1);
+ Task sub1 = new Task(manager.genUniqueTaskHandle(), "sub 1", true);
+ task1.addSubTask(sub1);
+ sub1.setParent(task1);
+ Task task2 = new Task(manager.genUniqueTaskHandle(), "task 2", true);
+ manager.moveToRoot(task2);
+ rootTasks.add(task2);
+
+ Set<TaskCategory> categories = new HashSet<TaskCategory>();
+ Set<ITask> cat1Contents = new HashSet<ITask>();
+ TaskCategory cat1 = new TaskCategory("Category 1");
+ manager.addCategory(cat1);
+ categories.add(cat1);
+ Task task3 = new Task(manager.genUniqueTaskHandle(), "task 3", true);
+ manager.moveToCategory(cat1, task3);
+ cat1Contents.add(task3);
+ assertEquals(cat1, task3.getCategory());
+ Task sub2 = new Task(manager.genUniqueTaskHandle(), "sub 2", true);
+ task3.addSubTask(sub2);
+ sub2.setParent(task3);
+ Task task4 = new Task(manager.genUniqueTaskHandle(), "task 4", true);
+ manager.moveToCategory(cat1, task4);
+ cat1Contents.add(task4);
+
+ BugzillaTask reportInCat1 = new BugzillaTask("123", "label 123", true);
+ manager.moveToCategory(cat1, reportInCat1);
+ assertEquals(cat1, reportInCat1.getCategory());
+ cat1Contents.add(reportInCat1);
+
+ BugzillaTask reportInRoot = new BugzillaTask("124", "label 124", true);
+ manager.moveToRoot(reportInRoot);
+ rootTasks.add(reportInRoot);
+
+ assertEquals(""+ manager.getTaskList().getRootElements(), 5, manager.getTaskList().getRootElements().size());
+
+ manager.saveTaskList();
+ assertNotNull(manager.getTaskList());
+ TaskList list = new TaskList();
+ manager.setTaskList(list);
+ manager.readExistingOrCreateNewList();
+
+ assertNotNull(manager.getTaskList());
+ assertEquals(rootTasks, manager.getTaskList().getRootTasks());
+
+ Set<ITask> readList = manager.getTaskList().getRootTasks();
+ for (ITask task : readList) {
+ if (task.equals(task1)) {
+ assertEquals(task1.getDescription(), task.getDescription());
+ assertEquals(1, task.getChildren().size());
+ }
+ if (task.equals(reportInRoot)) {
+ assertEquals(reportInRoot.getDescription(), task.getDescription());
+ }
+ }
+
+ Set<TaskCategory> readCats = manager.getTaskList().getTaskCategories();
+ assertTrue(manager.getTaskList().getCategories().contains(cat1));
+ Iterator<TaskCategory> iterator = readCats.iterator();
+ TaskCategory readCat1 = iterator.next();
+ assertEquals(cat1, readCat1);
+ assertEquals(cat1Contents, readCat1.getChildren());
+ }
+
+ public void testScheduledRefreshJob() throws InterruptedException {
+ int counter = 3;
+ ScheduledTaskListRefreshJob job = new ScheduledTaskListRefreshJob(500, manager);
+ job.run(new NullProgressMonitor());
+ Thread.sleep(1500);
+ assertEquals(counter, job.getCount());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListNotificationManagerTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListNotificationManagerTest.java
new file mode 100644
index 000000000..c0e8e3957
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListNotificationManagerTest.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * 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.mylar.tasklist.tests;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylar.internal.tasklist.ui.ITaskListNotification;
+import org.eclipse.mylar.internal.tasklist.ui.ITaskListNotificationProvider;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListNotificationManager;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListNotificationPopup;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListNotificationReminder;
+import org.eclipse.mylar.provisional.tasklist.Task;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+
+public class TaskListNotificationManagerTest extends TestCase {
+
+ TaskListNotificationPopup popup;
+
+ Shell dialogShell;
+
+ Shell parentShell;
+
+ int shellStyle = SWT.MODELESS | SWT.NO_TRIM;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testTaskListNotificationManager() throws InterruptedException {
+
+ Task task0 = new Task("t0", "t0 - test 0", true);
+ Task task1 = new Task("t1", "t1 - test 1", true);
+ Task task2 = new Task("t2", "t2 - test 2", true);
+ TaskListNotificationReminder reminder0 = new TaskListNotificationReminder(task0);
+ TaskListNotificationReminder reminder1 = new TaskListNotificationReminder(task1);
+ TaskListNotificationReminder reminder2 = new TaskListNotificationReminder(task2);
+
+ final Set<ITaskListNotification> notifications = new HashSet<ITaskListNotification>();
+ notifications.add(reminder0);
+ notifications.add(reminder1);
+ notifications.add(reminder2);
+
+ for (ITaskListNotification notification : notifications) {
+ assertFalse(notification.isNotified());
+ }
+
+ ITaskListNotificationProvider provider = new ITaskListNotificationProvider() {
+
+ public Set<ITaskListNotification> getNotifications() {
+ return notifications;
+ }
+
+ };
+
+ TaskListNotificationManager notificationManager = new TaskListNotificationManager();
+ notificationManager.addNotificationProvider(provider);
+ notificationManager.startNotification(1);
+ Thread.sleep(500);
+ List<ITaskListNotification> notified = notificationManager.getNotifications();
+ for (ITaskListNotification notification : notified) {
+ assertTrue(notification.isNotified());
+ }
+ notificationManager.stopNotification();
+ }
+
+
+
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListStandaloneTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListStandaloneTest.java
new file mode 100644
index 000000000..9269262f9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListStandaloneTest.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.mylar.tasklist.tests;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylar.internal.tasklist.util.TaskListWriter;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskListExternalizer;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.Task;
+import org.eclipse.mylar.provisional.tasklist.TaskList;
+import org.eclipse.mylar.provisional.tasklist.TaskListManager;
+
+/**
+ * Can be run without workbench
+ *
+ * @author Mik Kersten
+ */
+public class TaskListStandaloneTest extends TestCase {
+
+ private TaskListManager manager;
+
+ private File file;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ List<ITaskListExternalizer> externalizers = new ArrayList<ITaskListExternalizer>();
+
+ // bugzilla externalizer requires workbench
+ // externalizers.add(new BugzillaTaskExternalizer());
+
+ TaskListWriter writer = new TaskListWriter();
+ writer.setDelegateExternalizers(externalizers);
+
+ file = new File("foo" + MylarTaskListPlugin.FILE_EXTENSION);
+ file.deleteOnExit();
+ manager = new TaskListManager(writer, file, 1);
+ manager.createNewTaskList();
+ assertEquals("should be empty: " + manager.getTaskList().getRootTasks(), 0, manager.getTaskList()
+ .getRootTasks().size());
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ manager.setTaskList(new TaskList());
+ super.tearDown();
+ }
+
+ public void testPastReminder() {
+ ITask task = new Task("1", "1", true);
+ long now = new Date().getTime();
+ task.setReminderDate(new Date(now - 1000));
+ assertTrue(task.isPastReminder());
+
+ task.setReminderDate(new Date(now + 1000));
+ assertFalse(task.isPastReminder());
+
+ task.setReminderDate(new Date(now - 1000));
+ task.setCompleted(true);
+ assertTrue(task.isPastReminder());
+ }
+
+ public void testDates() {
+ Date start = Calendar.getInstance().getTime();
+ Date creation = new Date();
+ Task task = new Task("1", "task 1", true);
+
+ manager.moveToRoot(task);
+ assertDatesCloseEnough(task.getCreationDate(), start);
+
+ task.setCompleted(true);
+ assertDatesCloseEnough(task.getCompletionDate(), start);
+
+ task.setReminderDate(start);
+ assertDatesCloseEnough(task.getReminderDate(), start);
+
+ assertEquals(2, manager.getTaskList().getRootElements().size());
+ manager.saveTaskList();
+
+ assertNotNull(manager.getTaskList());
+ // TaskList list = new TaskList();
+ // manager.setTaskList(list);
+ // assertEquals(0, manager.getTaskList().getRootTasks().size());
+ // manager.readOrCreateTaskList();
+ // assertNotNull(manager.getTaskList());
+ assertEquals(1, manager.getTaskList().getRootTasks().size());
+
+ Set<ITask> readList = manager.getTaskList().getRootTasks();
+ ITask readTask = readList.iterator().next();
+ assertTrue(readTask.getDescription().equals("task 1"));
+
+ assertEquals("should be: " + creation, task.getCreationDate(), readTask.getCreationDate());
+ assertEquals(task.getCompletionDate(), readTask.getCompletionDate());
+ assertEquals(task.getReminderDate(), readTask.getReminderDate());
+ }
+
+ public void assertDatesCloseEnough(Date first, Date second) {
+ assertTrue(second.getTime() - first.getTime() < 100);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListUiTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListUiTest.java
new file mode 100644
index 000000000..3acf792fb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskListUiTest.java
@@ -0,0 +1,279 @@
+/*******************************************************************************
+ * 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.mylar.tasklist.tests;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListUiUtil;
+import org.eclipse.mylar.internal.tasklist.ui.TaskPriorityFilter;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskActivityListener;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.Task;
+import org.eclipse.mylar.provisional.tasklist.TaskCategory;
+import org.eclipse.mylar.provisional.tasklist.TaskListManager;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.PartInitException;
+
+/**
+ * Tests TaskListView's filtering mechanism.
+ *
+ * @author Ken Sueda
+ *
+ */
+public class TaskListUiTest extends TestCase {
+
+ private TaskCategory cat1 = null;
+
+ private Task cat1task1 = null;
+
+ private Task cat1task2 = null;
+
+ private Task cat1task3 = null;
+
+ private Task cat1task4 = null;
+
+ private Task cat1task5 = null;
+
+ private Task cat1task1sub1 = null;
+
+ private TaskCategory cat2 = null;
+
+ private Task cat2task1 = null;
+
+ private Task cat2task2 = null;
+
+ private Task cat2task3 = null;
+
+ private Task cat2task4 = null;
+
+ private Task cat2task5 = null;
+
+ private Task cat2task1sub1 = null;
+
+ private final static int CHECK_COMPLETE_FILTER = 1;
+
+ private final static int CHECK_INCOMPLETE_FILTER = 2;
+
+ private final static int CHECK_PRIORITY_FILTER = 3;
+
+ public void setUp() throws PartInitException {
+ try {
+ MylarTaskListPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(
+ "org.eclipse.mylar.tasks.ui.views.TaskListView");
+ TaskListManager manager = MylarTaskListPlugin.getTaskListManager();
+ cat1 = new TaskCategory("First Category");
+
+ cat1task1 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 1", true);
+ cat1task1.setPriority(Task.PriorityLevel.P1.toString());
+ cat1task1.setCompleted(true);
+ cat1task1.setCategory(cat1);
+ manager.moveToCategory(cat1, cat1task1);
+
+ cat1task1sub1 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "sub task 1", true);
+ cat1task1sub1.setPriority(Task.PriorityLevel.P1.toString());
+ cat1task1sub1.setCompleted(true);
+ cat1task1sub1.setParent(cat1task1);
+ cat1task1.addSubTask(cat1task1sub1);
+
+ cat1task2 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 2", true);
+ cat1task2.setPriority(Task.PriorityLevel.P2.toString());
+ cat1task2.setCategory(cat1);
+ manager.moveToCategory(cat1, cat1task2);
+
+ cat1task3 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 3", true);
+ cat1task3.setPriority(Task.PriorityLevel.P3.toString());
+ cat1task3.setCompleted(true);
+ cat1task3.setCategory(cat1);
+ manager.moveToCategory(cat1, cat1task3);
+
+ cat1task4 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 4", true);
+ cat1task4.setPriority(Task.PriorityLevel.P4.toString());
+ cat1task4.setCategory(cat1);
+ manager.moveToCategory(cat1, cat1task4);
+
+ cat1task5 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 5", true);
+ cat1task5.setPriority(Task.PriorityLevel.P5.toString());
+ cat1task5.setCompleted(true);
+ cat1task5.setCategory(cat1);
+ manager.moveToCategory(cat1, cat1task5);
+
+ manager.addCategory(cat1);
+ assertEquals(cat1.getChildren().size(), 5);
+
+ cat2 = new TaskCategory("Second Category");
+
+ cat2task1 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 1", true);
+ cat2task1.setPriority(Task.PriorityLevel.P1.toString());
+ cat2task1.setCategory(cat2);
+ manager.moveToCategory(cat2, cat2task1);
+
+ cat2task1sub1 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "sub task 1", true);
+ cat2task1sub1.setPriority(Task.PriorityLevel.P1.toString());
+ cat2task1sub1.setParent(cat2task1);
+ cat2task1.addSubTask(cat2task1sub1);
+
+ cat2task2 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 2", true);
+ cat2task2.setPriority(Task.PriorityLevel.P2.toString());
+ cat2task2.setCompleted(true);
+ cat2task2.setCategory(cat2);
+ manager.moveToCategory(cat2, cat2task2);
+
+ cat2task3 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 3", true);
+ cat2task3.setPriority(Task.PriorityLevel.P3.toString());
+ cat2task3.setCategory(cat2);
+ manager.moveToCategory(cat2, cat2task3);
+
+ cat2task4 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 4", true);
+ cat2task4.setPriority(Task.PriorityLevel.P4.toString());
+ cat2task4.setCompleted(true);
+ cat2task4.setCategory(cat2);
+ manager.moveToCategory(cat2, cat2task4);
+
+ cat2task5 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 5", true);
+ cat2task5.setPriority(Task.PriorityLevel.P5.toString());
+ cat2task5.setCategory(cat2);
+ manager.moveToCategory(cat2, cat2task5);
+
+ manager.addCategory(cat2);
+ manager.saveTaskList();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void tearDown() {
+ // clear everything
+ }
+
+ public void testUiFilter() {
+ try {
+ assertNotNull(TaskListView.getDefault());
+ TreeViewer viewer = TaskListView.getDefault().getViewer();
+ TaskListView.getDefault().addFilter(TaskListView.getDefault().getCompleteFilter());
+ viewer.refresh();
+ viewer.expandAll();
+ TreeItem[] items = viewer.getTree().getItems();
+ assertTrue(checkFilter(CHECK_COMPLETE_FILTER, items));
+ TaskListView.getDefault().removeFilter(TaskListView.getDefault().getCompleteFilter());
+
+ TaskPriorityFilter filter = (TaskPriorityFilter) TaskListView.getDefault().getPriorityFilter();
+ filter.displayPrioritiesAbove("P2");
+ TaskListView.getDefault().addFilter(filter);
+ viewer.refresh();
+ viewer.expandAll();
+ items = viewer.getTree().getItems();
+
+ // check priority tasks
+ assertTrue(checkFilter(CHECK_PRIORITY_FILTER, items));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Tests that TaskEditors remove all listeners when closed
+ */
+ public void testListenersRemoved() {
+
+ int numListenersBefore = 0;
+ int numListenersDuring = 0;
+ int numListenersAfter = 0;
+
+ TaskListManager manager = MylarTaskListPlugin.getTaskListManager();
+ List<ITaskActivityListener> listeners = manager.getListeners();
+ numListenersBefore = listeners.size();
+
+ // open a task in editor
+// cat1task1.setForceSyncOpen(true);
+ TaskListUiUtil.openEditor(cat1task1, false);
+// cat1task1.openTaskInEditor(false);
+// cat1task2.setForceSyncOpen(true);
+// cat1task2.openTaskInEditor(false);
+ TaskListUiUtil.openEditor(cat1task2, false);
+
+ listeners = manager.getListeners();
+ numListenersDuring = listeners.size();
+
+ assertEquals(numListenersDuring, numListenersBefore + 2);
+
+ MylarTaskListPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage().closeAllEditors(
+ false);
+
+ listeners = manager.getListeners();
+ numListenersAfter = listeners.size();
+ assertEquals(numListenersBefore, numListenersAfter);
+
+ }
+
+ 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(2, items.length);
+ int count = 0;
+ for (int i = 0; i < items.length; i++) {
+ assertTrue(items[i].getData() instanceof TaskCategory);
+ TreeItem[] sub = items[i].getItems();
+ for (int j = 0; j < sub.length; j++) {
+ assertTrue(sub[j].getData() instanceof ITask);
+ ITask task = (ITask) sub[j].getData();
+ if (checkComplete) {
+ assertTrue(task.isCompleted());
+ } else {
+ assertFalse(task.isCompleted());
+ }
+ count++;
+ }
+ }
+ assertTrue(count == 5);
+ return true;
+ }
+
+ public boolean checkPriorityFilter(TreeItem[] items) {
+ assertTrue(items.length == 2);
+ int p2Count = 0;
+ int p1Count = 0;
+ for (int i = 0; i < items.length; i++) {
+ assertTrue(items[i].getData() instanceof TaskCategory);
+ TreeItem[] sub = items[i].getItems();
+ for (int j = 0; j < sub.length; j++) {
+ assertTrue(sub[j].getData() instanceof ITask);
+ ITask task = (ITask) sub[j].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/tasklist/tests/TaskReportGeneratorTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskReportGeneratorTest.java
new file mode 100644
index 000000000..87081c868
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskReportGeneratorTest.java
@@ -0,0 +1,189 @@
+/*******************************************************************************
+ * 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.mylar.tasklist.tests;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaQueryHit;
+import org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryQuery;
+import org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTask;
+import org.eclipse.mylar.internal.tasklist.planner.CompletedTaskCollector;
+import org.eclipse.mylar.internal.tasklist.planner.TaskReportGenerator;
+import org.eclipse.mylar.provisional.tasklist.ITaskListElement;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.Task;
+import org.eclipse.mylar.provisional.tasklist.TaskCategory;
+import org.eclipse.mylar.provisional.tasklist.TaskListManager;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class TaskReportGeneratorTest extends TestCase {
+
+ private TaskListManager manager;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ manager = MylarTaskListPlugin.getTaskListManager();
+ manager.createNewTaskList();
+ assertEquals(0, manager.getTaskList().getAllTasks().size());
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ manager.createNewTaskList();
+ MylarTaskListPlugin.getDefault().getTaskListSaveManager().saveTaskListAndContexts();
+ assertEquals(0, manager.getTaskList().getAllTasks().size());
+ }
+
+ public void testCompletedTasksRetrieved() throws InvocationTargetException, InterruptedException {
+ Task task1 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 1", true);
+ manager.moveToRoot(task1);
+
+ CompletedTaskCollector collector = new CompletedTaskCollector(new Date(0));
+ TaskReportGenerator generator = new TaskReportGenerator(manager.getTaskList());
+ generator.addCollector(collector);
+ generator.run(new NullProgressMonitor());
+ assertEquals(0, generator.getAllCollectedTasks().size());
+
+ task1.setCompleted(true);
+ generator.run(new NullProgressMonitor());
+ assertEquals(1, generator.getAllCollectedTasks().size());
+ assertEquals(task1, generator.getAllCollectedTasks().get(0));
+ }
+
+ public void testCompletedTasksDateBoundsRetrieved() throws InvocationTargetException, InterruptedException {
+ Task task1 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 1", true);
+ manager.moveToRoot(task1);
+ task1.setCompleted(true);
+ Thread.sleep(1000);
+ long now = new Date().getTime();
+
+ CompletedTaskCollector collector = new CompletedTaskCollector(new Date(now));
+ TaskReportGenerator generator = new TaskReportGenerator(manager.getTaskList());
+ generator.addCollector(collector);
+ generator.run(new NullProgressMonitor());
+ assertEquals(0, generator.getAllCollectedTasks().size());
+
+ generator = new TaskReportGenerator(manager.getTaskList());
+ collector = new CompletedTaskCollector(new Date(now - 8000));
+ generator.addCollector(collector);
+ generator.run(new NullProgressMonitor());
+ assertEquals(1, generator.getAllCollectedTasks().size());
+ assertEquals(task1, generator.getAllCollectedTasks().get(0));
+ }
+
+ public void testCompletedBugzillaTasksRetrieved() throws InvocationTargetException, InterruptedException {
+ BugzillaTask task1 = new BugzillaTask(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(),
+ "bugzillatask 1", true);
+ manager.moveToRoot(task1);
+
+ CompletedTaskCollector collector = new CompletedTaskCollector(new Date(0));
+ TaskReportGenerator generator = new TaskReportGenerator(manager.getTaskList());
+ generator.addCollector(collector);
+ generator.run(new NullProgressMonitor());
+ assertEquals(0, generator.getAllCollectedTasks().size());
+
+ TaskTestUtil.setBugTaskCompleted(task1, true);
+ generator.run(new NullProgressMonitor());
+ assertEquals(1, generator.getAllCollectedTasks().size());
+ assertEquals(task1, generator.getAllCollectedTasks().get(0));
+ }
+
+ public void testCompletedTasksInCategoryRetrieved() throws InvocationTargetException, InterruptedException {
+ Task task1 = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 1", true);
+ manager.moveToRoot(task1);
+ task1.setCompleted(true);
+ TaskCategory cat1 = new TaskCategory("TaskReportGeneratorTest Category");
+ manager.addCategory(cat1);
+
+ Set<ITaskListElement> catagories = new HashSet<ITaskListElement>();
+ catagories.add(cat1);
+
+ CompletedTaskCollector collector = new CompletedTaskCollector(new Date(0));
+ TaskReportGenerator generator = new TaskReportGenerator(manager.getTaskList(), catagories);
+ generator.addCollector(collector);
+ generator.run(new NullProgressMonitor());
+ assertEquals(0, generator.getAllCollectedTasks().size());
+
+ manager.moveToCategory(cat1, task1);
+
+ generator.run(new NullProgressMonitor());
+ assertEquals(1, generator.getAllCollectedTasks().size());
+ assertEquals(task1, generator.getAllCollectedTasks().get(0));
+ }
+
+ public void testCompletedBugzillaTasksInCategoryRetrieved() throws InvocationTargetException, InterruptedException {
+ BugzillaTask task1 = new BugzillaTask(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 1",
+ true);
+ manager.moveToRoot(task1);
+ TaskTestUtil.setBugTaskCompleted(task1, true);
+ TaskCategory cat1 = new TaskCategory("TaskReportGeneratorTest Category");
+ manager.addCategory(cat1);
+
+ Set<ITaskListElement> catagories = new HashSet<ITaskListElement>();
+ catagories.add(cat1);
+
+ CompletedTaskCollector collector = new CompletedTaskCollector(new Date(0));
+ TaskReportGenerator generator = new TaskReportGenerator(manager.getTaskList(), catagories);
+ generator.addCollector(collector);
+ generator.run(new NullProgressMonitor());
+ assertEquals(0, generator.getAllCollectedTasks().size());
+
+ manager.moveToCategory(cat1, task1);
+
+ generator.run(new NullProgressMonitor());
+ assertEquals(1, generator.getAllCollectedTasks().size());
+ assertEquals(task1, generator.getAllCollectedTasks().get(0));
+ }
+
+ public void testCompletedBugzillaTasksInQueryRetrieved() throws InvocationTargetException, InterruptedException {
+ BugzillaTask task1 = new BugzillaTask(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), "task 1",
+ true);
+ manager.moveToRoot(task1);
+ TaskTestUtil.setBugTaskCompleted(task1, false);
+
+ BugzillaRepositoryQuery bugQuery = new BugzillaRepositoryQuery("repositoryUrl", "queryUrl",
+ "TaskReportGeneratorBugzillaQueryCategory", "maxHits");
+
+ manager.addQuery(bugQuery);
+
+ Set<ITaskListElement> catagories = new HashSet<ITaskListElement>();
+ catagories.add(bugQuery);
+
+ CompletedTaskCollector collector = new CompletedTaskCollector(new Date(0));
+ TaskReportGenerator generator = new TaskReportGenerator(manager.getTaskList(), catagories);
+ generator.addCollector(collector);
+ generator.run(new NullProgressMonitor());
+ assertEquals(0, generator.getAllCollectedTasks().size());
+
+ bugQuery.addHit(new BugzillaQueryHit("task1description", "low", "repositoryURL", 1, task1, "FIXED"));
+
+ generator.run(new NullProgressMonitor());
+ assertEquals(0, generator.getAllCollectedTasks().size());
+
+ TaskTestUtil.setBugTaskCompleted(task1, true);
+
+ generator.run(new NullProgressMonitor());
+ assertEquals(1, generator.getAllCollectedTasks().size());
+ assertEquals(task1, generator.getAllCollectedTasks().get(0));
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskRepositoryManagerTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskRepositoryManagerTest.java
new file mode 100644
index 000000000..5e6a5771e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskRepositoryManagerTest.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * 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.mylar.tasklist.tests;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin;
+import org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskRepository;
+import org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskRepositoryManagerTest extends TestCase {
+
+ private static final String DEFAULT_KIND = BugzillaPlugin.REPOSITORY_KIND;
+
+ private static final String DEFAULT_URL = "http://eclipse.org";
+
+ private static final String ANOTHER_URL = "http://codehaus.org";
+
+ private TaskRepositoryManager manager;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ manager = MylarTaskListPlugin.getRepositoryManager();
+ manager.clearRepositories();
+ assertNotNull(manager);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ manager.clearRepositories();
+ }
+
+ public void testHandles() {
+ String url = IBugzillaConstants.ECLIPSE_BUGZILLA_URL;
+ String id = "123";
+ String handle = AbstractRepositoryTask.getHandle(url, id);
+ assertEquals(url, AbstractRepositoryTask.getRepositoryUrl(handle));
+ assertEquals(id, AbstractRepositoryTask.getTaskId(handle));
+ assertEquals(123, AbstractRepositoryTask.getTaskIdAsInt(handle));
+ }
+
+ public void testMultipleNotAdded() throws MalformedURLException {
+ TaskRepository repository = new TaskRepository(DEFAULT_KIND, new URL(DEFAULT_URL));
+ manager.addRepository(repository);
+ TaskRepository repository2 = new TaskRepository(DEFAULT_KIND, new URL(DEFAULT_URL));
+ manager.addRepository(repository2);
+ assertEquals(1, manager.getAllRepositories().size());
+ }
+
+ public void testGet() throws MalformedURLException {
+ assertEquals("", MylarTaskListPlugin.getPrefs().getString(TaskRepositoryManager.PREF_REPOSITORIES));
+
+ TaskRepository repository = new TaskRepository(DEFAULT_KIND, new URL(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 testRepositoryPersistance() throws MalformedURLException {
+ assertEquals("", MylarTaskListPlugin.getPrefs().getString(TaskRepositoryManager.PREF_REPOSITORIES));
+
+ TaskRepository repository1 = new TaskRepository("bugzilla", new URL("http://bugzilla"));
+ TaskRepository repository2 = new TaskRepository("jira", new URL("http://jira"));
+ manager.addRepository(repository1);
+ manager.addRepository(repository2);
+
+ assertNotNull(MylarTaskListPlugin.getPrefs().getString(TaskRepositoryManager.PREF_REPOSITORIES));
+
+ List<TaskRepository> repositoryList = new ArrayList<TaskRepository>();
+ repositoryList.add(repository2);
+ repositoryList.add(repository1);
+ manager.readRepositories();
+ assertEquals(repositoryList, manager.getAllRepositories());
+ }
+
+ public void testRepositoryPersistanceAfterDelete() throws MalformedURLException {
+ manager.clearRepositories();
+
+ assertEquals("", MylarTaskListPlugin.getPrefs().getString(TaskRepositoryManager.PREF_REPOSITORIES + DEFAULT_KIND));
+
+ TaskRepository repository = new TaskRepository(DEFAULT_KIND, new URL(DEFAULT_URL));
+ manager.addRepository(repository);
+
+ assertFalse(MylarTaskListPlugin.getPrefs().getString(TaskRepositoryManager.PREF_REPOSITORIES + DEFAULT_KIND).equals(""));
+
+ TaskRepository repository2 = new TaskRepository(DEFAULT_KIND, new URL(ANOTHER_URL));
+ manager.addRepository(repository2);
+
+ String saveString = MylarTaskListPlugin.getPrefs().getString(TaskRepositoryManager.PREF_REPOSITORIES + DEFAULT_KIND);
+ assertNotNull(saveString);
+
+ manager.removeRepository(repository2);
+
+ String newSaveString = MylarTaskListPlugin.getPrefs().getString(TaskRepositoryManager.PREF_REPOSITORIES + DEFAULT_KIND);
+
+ assertFalse(saveString.equals(newSaveString));
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskTest.java
new file mode 100644
index 000000000..ec4e32a84
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskTest.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.mylar.tasklist.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylar.provisional.tasklist.Task;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskTest extends TestCase {
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testUrl() {
+ Task task = new Task("handle", "label", true);
+ task.setUrl("http://eclipse.org/mylar/doc.php");
+ assertTrue(task.hasValidUrl());
+
+ task.setUrl("http://");
+ assertFalse(task.hasValidUrl());
+
+ task.setUrl("https://");
+ assertFalse(task.hasValidUrl());
+
+ task.setUrl("");
+ assertFalse(task.hasValidUrl());
+
+ task.setUrl(null);
+ assertFalse(task.hasValidUrl());
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskTestUtil.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskTestUtil.java
new file mode 100644
index 000000000..acc16b1f3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/TaskTestUtil.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * 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.mylar.tasklist.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 java.util.Date;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.mylar.bugzilla.core.Attribute;
+import org.eclipse.mylar.bugzilla.core.BugReport;
+import org.eclipse.mylar.bugzilla.core.Comment;
+import org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTask;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskTestUtil {
+
+ public static File getLocalFile(String path) {
+ try {
+ URL installURL = MylarTasksTestsPlugin.getDefault().getBundle().getEntry(path);
+ URL localURL = FileLocator.toFileURL(installURL);
+ return new File(localURL.getFile());
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ /**
+ * Adaptred 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();
+ }
+
+ public static void setBugTaskCompleted(BugzillaTask bugzillaTask, boolean completed) {
+ BugReport report = new BugReport(1, IBugzillaConstants.ECLIPSE_BUGZILLA_URL);
+ bugzillaTask.setBugReport(report);
+ Attribute resolvedAttribute = new Attribute(BugReport.ATTR_STATUS);
+ if (completed) {
+ resolvedAttribute.setValue(BugReport.VAL_STATUS_RESOLVED);
+ } else {
+ resolvedAttribute.setValue(BugReport.VAL_STATUS_NEW);
+ }
+
+ report.addAttribute(resolvedAttribute);
+
+ Date now = new Date();
+ report.addComment(new Comment(report, 1, now, "author", "author-name"));
+ }
+}
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 000000000..62573aeb3
--- /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: &quot;Could not save task list&quot; 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 &quot;Last 30 days&quot;" 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&#13;&#10;- navigating to reports&#13;&#10;&#13;&#10;other &#13;&#10;- junit tests of active context&#13;&#10;- commit resources in context&#13;&#10;&#13;&#10;active search&#13;&#10;- qualify member names&#13;&#10;- 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 &quot;orange gradient&quot; 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 &quot;make less interesting&quot; 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 &quot;public&quot; for &quot;private&quot; 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: &quot;make less interesting&quot; 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 -&gt; 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 &quot;download failed&quot; 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 &quot;unsure&quot; 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 &quot;org.eclipse.mylar.java_0.3.12.e31&quot;." 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 &quot;open declaration&quot; 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 &quot;validate password&quot; 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 &quot;new bug report&quot;, 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 &quot;edit highlighters&quot; button to &quot;choose highlighter&quot; 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 &quot;dependant project&quot; 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: &quot;unfiltered&quot; 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 &quot;class&quot;" 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-&gt;Mylar-&gt;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: &quot;link with editor&quot; 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: &gt;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 &quot;Updating Change Sets for CVS Workspace&quot;" 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 &quot;Link With Editor&quot; 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 &quot;remove from this category&quot; 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: &quot;close all editors&quot; 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 &quot;SWTError: No more handles&quot; 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 &quot;new&quot; 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 &quot;clear task context action&quot;" 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:&#13;&#10;org.eclipse.ui.internal.dialogs.FilteredTree.getFilterControl()Lorg/eclipse/swt/widgets/Text;&#13;&#10;at&#13;&#10;org.eclipse.mylar.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.&#13;&#10;&#13;&#10;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.&#13;&#10;&#13;&#10;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:&#13;&#10;&#13;&#10;::name::description&#13;&#10;::name::description&#13;&#10;&#13;&#10;So and example of a newsgroup entry for say the BPEL newsgroup would be:&#13;&#10;&#13;&#10;::eclipse.technology.bpel-designer::The &lt;a href=&quot;http://www.eclipse.org/bpel&quot;&gt;BPEL Designer Editor project&lt;/a&gt; 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.&#13;&#10;&#13;&#10;You can add as many newsgroups or mailing lists as you like, as long as each entry has the same format.&#13;&#10;&#13;&#10;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.&#13;&#10;&#13;&#10;These changes will go into effect for the news pages on the 30th of December&#13;&#10;&#13;&#10;If you have any questions about these changes contact contact me.&#13;&#10;" 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 &quot;mark incomplete&quot; 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&#13;&#10;- perspective bar to top right&#13;&#10;- new (not traditional) tabs&#13;&#10;- " 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&#13;&#10;&#9;at org.eclipse.mylar.core.MylarPlugin$1.getHandleIdentifier(MylarPlugin.java:83)&#13;&#10;&#9;at org.eclipse.mylar.ui.InterestFilter.select(InterestFilter.java:62)&#13;&#10;&#9;at org.eclipse.jface.viewers.ViewerFilter.filter(ViewerFilter.java:51)&#13;&#10;&#9;at org.eclipse.jface.viewers.StructuredViewer.getFilteredChildren(StructuredViewer.java:794)&#13;&#10;&#9;at org.eclipse.jface.viewers.StructuredViewer.getSortedChildren(StructuredViewer.java:905)&#13;&#10;&#9;at org.eclipse.jface.viewers.AbstractTreeViewer.updateChildren(AbstractTreeViewer.java:1720)&#13;&#10;&#9;at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefreshStruct(AbstractTreeViewer.java:1274)&#13;&#10;&#9;at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefresh(AbstractTreeViewer.java:1251)&#13;&#10;&#9;at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefresh(AbstractTreeViewer.java:1207)&#13;&#10;&#9;at org.eclipse.jface.viewers.StructuredViewer$8.run(StructuredViewer.java:1291)&#13;&#10;&#9;at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1201)&#13;&#10;&#9;at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1289)&#13;&#10;&#9;at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1246)&#13;&#10;&#9;at org.eclipse.mylar.ui.MylarViewerManager.internalRefresh(MylarViewerManager.java:150)&#13;&#10;&#9;at org.eclipse.mylar.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&#13;&#10;- Package Explorer collapse suppression&#13;&#10;- content assist selection listener&#13;&#10;- PDE viewer accessibility&#13;&#10;- type history extensibility&#13;&#10;- decorator job priority: problem is that if a decorator makes elements in explorer bold, and markers change, there is a 1-2 second blink&#13;&#10;&#13;&#10;Done&#13;&#10;- expose resolveMember on MemberProposalInfo&#13;&#10;- strikethru for SWT widgets&#13;&#10;- filtered tree should refresh when filtered&#13;&#10;- folding updater&#13;&#10;&#13;&#10;&#13;&#10;" 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:&#13;&#10;&#9;http://blog.enargi.com/programming/eclipse/eclipse-tips-external-plugin-directory/&#13;&#10;&#13;&#10;" 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&#13;&#10;- Tom Eicher and Daniel Megert for extensibility improvements in editor folding support&#13;&#10;&#13;&#10;0.4.8&#13;&#10;- Brock for improving multi-repository wizards&#13;&#10;- Brock and Eugene's ideas on task list architecture&#13;&#10;- Eugene's idea for completion bar on categories&#13;&#10;&#13;&#10;0.4.7&#13;&#10;- upgrade&#13;&#10; - after starting, open repositories view, add repository if not there, ensure correct&#13;&#10; - restart Eclipse, query categories should show up and contexts have been migrated&#13;&#10; - restart again to see tasks in query matches.&#13;&#10;- Eugene had a good idea for avoiding inducing interest on newly checked out projects&#13;&#10;- David Bari and Tomasz Smietanka: set up test bugzilla server for encodings&#13;&#10;- Brock: elegant solution to fix lazy loading of image registry, 3.2M4 detective work and fixes, highlighter fix&#13;&#10;- Rob: drag-and-drop tasks, external browser&#13;&#10;&#13;&#10;0.4.6&#13;&#10;- Brock's XML SAX externalization contribution&#13;&#10;- performance of content assist&#13;&#10;- Alexander Staubo provided useful video&#13;&#10;&#13;&#10;0.4.5&#13;&#10;- back up your task lists (support revamped, now more extensible, etc)&#13;&#10; - restore default directory before upgrading, then can copy back&#13;&#10;- Felix Knecht helped proided instructions for how to patch a bugzilla bug issue&#13;&#10;- Leah &amp; Suzanne's monitor stuff?&#13;&#10;- issue tracker discussion &#13;&#10;- brock for patch of tasklist schema and integration build fix&#13;&#10;&#13;&#10;0.4.4:&#13;&#10;- Igor Fedorenko provide a patch for an NPE in the Java Problem Listener&#13;&#10;- Vote for Mylar talk&#13;&#10;- Ian's bugzilla patch&#13;&#10;- watch for resources added to context in Error Log?&#13;&#10;- 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.&#13;&#10;&#13;&#10;Problem: people leaving Mylar active and not using it&#13;&#10;&#13;&#10;To do by next meet:&#13;&#10;- JUST JAVA&#13;&#10;- CONSIDER JUST HOURS&#13;&#10;&#13;&#10;- shared vs. unique task content coverage&#13;&#10;- 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]&#13;&#10;&#13;&#10;Misc:&#13;&#10;- number of unique elements in each context&#13;&#10;- three kinds of baseline stats?&#13;&#10;- not doing: number of tasks,time mylar active (not determinable, since they could be doing something else, base on selections)&#13;&#10;- filters used in navigator/explorer&#13;&#10;- figure out how many landmarks they have&#13;&#10;- correlate additional information for accepted users (questionnaires, etc, tasks peformed)&#13;&#10;- could discard first n events of usage&#13;&#10;- 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="&#13;&#10;&#13;&#10;download&#13;&#10;- General Eclipse.org newsgroup information:&#13;&#10;http://www.eclipse.org/newsgroups/index.php&#13;&#10;&#13;&#10;about:&#13;&#10;- Mylar: A Task Focused UI for Eclipse.&#13;&#10;- mention Eclipse's openness and extensibility?&#13;&#10;&#13;&#10;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.&#13;&#10;&#13;&#10;dev&#13;&#10;- add note to dev page on connecting to eclispe.org ...&#13;&#10;&#13;&#10;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:&#13;&#10;&#13;&#10;java.lang.NullPointerException&#13;&#10; at&#13;&#10;org.eclipse.mylar.internal.tasklist.MylarTaskListPlugin.access$1(MylarTask&#13;&#10;ListPlugin.java:433)&#13;&#10; at&#13;&#10;org.eclipse.mylar.internal.tasklist.MylarTaskListPlugin$2.shellActivated(M&#13;&#10;ylarTaskListPlugin.java:190)&#13;&#10; at&#13;&#10;&#13;&#10; or this:&#13;&#10;&#13;&#10;java.lang.NullPointerException&#13;&#10;at&#13;&#10;org.eclipse.mylar.internal.monitor.monitors.SelectionMonitor.selectionChan&#13;&#10;ged(SelectionMonitor.java:147)&#13;&#10;at&#13;&#10;org.eclipse.ui.internal.AbstractSelectionService.firePostSelection(Abstrac&#13;&#10;tSelectionService.java:179)&#13;&#10;at&#13;&#10;&#13;&#10; &#13;&#10;&#13;&#10;" 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 &#13;&#10;incremental compilation and then visualization inside of alien IDE's like Eclipse 2.1, IDEA 5.0, &#13;&#10;or RAD. At this stage, I think core incremental ant support is the right foundation rather than, &#13;&#10;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 &quot;suppress filter&quot; 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 &quot;show filtered&quot; 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&#13;&#10;New case: 3780198, hard drive dispatch: 3780478, recovery CDs: 3780482, newest: 3782684&#13;&#10;Business partner: DTM, 2323 Boundary Road&#13;&#10;&#13;&#10;Nexinnovations 985 virtual, vancouver, canada, 604-216-2400, 8:30am-5pm.&#13;&#10; &#13;&#10;Drive Fitness test: Failure code: 0x20 - Device not found (TRC: 2000B51C)&#13;&#10;&#13;&#10;ERROR&#13;&#10;0200: Failure Fixed Disk 0&#13;&#10;&#13;&#10;drive setup: http://www.hitachigst.com/hdd/support/download.htm&#13;&#10;&#13;&#10;http://www-3.ibm.com/pc/support/site.wss/document.do?lndocid=MIGR-4PEN8X&#13;&#10;&#13;&#10;-------------&#13;&#10;&#13;&#10;DATA RECOVERY&#13;&#10;&#13;&#10;http://www.acsdata.com/hitachi-data-recovery.htm&#13;&#10;&#13;&#10;Clean room: $1400-$1500&#13;&#10;Non clean-room: $600&#13;&#10;&#13;&#10;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&amp;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@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.&#13;&#10;&#13;&#10;cheers,&#13;&#10;Brock&#13;&#10;&#13;&#10;Quoting Mik Kersten &lt;beatmik@acm.org&gt;:&#13;&#10;&#13;&#10;&gt; Brock, here's a draft, what do you think? Do you have a contact there &#13;&#10;&gt; that you want to use? If not I have a pretty senior contact there, &#13;&#10;&gt; but don't know him.&#13;&#10;&gt; &#13;&#10;&gt; ------------&#13;&#10;&gt; &#13;&#10;&gt; The Mylar eclipse.org project is growing, and there has been &#13;&#10;&gt; increasing demand for providing issue tracker integration for JIRA. &#13;&#10;&gt; One of the key components of Mylar is a standalone task management UI. &#13;&#10;&gt; The Mylar Bugzilla Client extends that and provides tight integration &#13;&#10;&gt; for working with Bugzilla issues within Eclipse. To see it in action &#13;&#10;&gt; see the 2nd flash video&#13;&#10;&gt; at:&#13;&#10;&gt; http://eclipse.org/mylar/doc.php&#13;&#10;&gt; &#13;&#10;&gt; As Eclipse itself has demonstrated with it's CVS client, the quality &#13;&#10;&gt; and integration of the client UI can be more important to developer &#13;&#10;&gt; productivity than the quality of the underlying repository. Brock &#13;&#10;&gt; Janiczak has made significant progress with his JIRA Dashboard &#13;&#10;&gt; plug-in, and we have generic task/query management support in Mylar's &#13;&#10;&gt; Task List component. To meet our community's needs we would like to &#13;&#10;&gt; take the next step, and build the same level of Eclipse integration &#13;&#10;&gt; with JIRA that we currently have for Bugzilla.&#13;&#10;&gt; &#13;&#10;&gt; &#13;&#10;&gt; I can dedicate some of my Mylar development time to make this happen &#13;&#10;&gt; in order to help make Mylar the standard mechanism for task management &#13;&#10;&gt; in Eclipse. Brock Janiczak is also volunteering some time to help &#13;&#10;&gt; build the community that uses the JIRA Dashboard plug-in. But we &#13;&#10;&gt; would benefit from your support in this effort. Please let us know if &#13;&#10;&gt; this is something that you are interested in helping with.&#13;&#10;&gt; &#13;&#10;&gt; Best regards,&#13;&#10;&gt; &#13;&#10;&gt; 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&#13;&#10;&#13;&#10;Choice: A Collection of Classics&quot; by Danny Howells&#13;&#10;&#13;&#10;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&amp;Bugzilla_login=beatmik%40acm.org&amp;Bugzilla_password=1umberto&amp;short_desc_type=allwordssubstr&amp;short_desc=&amp;product=Mylar&amp;long_desc_type=allwordssubstr&amp;long_desc=&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;priority=P1&amp;priority=P2&amp;priority=P3&amp;emailassigned_to1=1&amp;emailtype1=substring&amp;email1=beatmik&amp;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: &gt;make priority column and combo editor be icon based" Priority="P1"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126775" Name="126775: &gt;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: &gt;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: &gt;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: &gt;new bug wizard doesn't automatically update options" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-124259" Name="124259: &gt;Can't cacel a temporarily unfilter a node" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-125591" Name="125591: &gt;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: &gt;package explorer and other views fail to refresh on persp..." Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126882" Name="126882: &gt;Not all file types preserved in Mylar filtered Package Ex..." Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-117518" Name="117518: &gt;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: &gt;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: &gt;Add progress bar to the category" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-125987" Name="125987: &gt;Add a possibility to set more than one &amp;quot;interest filter&amp;quot;" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126863" Name="126863: &gt;Update docs by 0.50 release" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-112020" Name="112020: &gt;limit number of visible items in active search view" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-121759" Name="121759: &gt;active search tree is automatically expanded on double-click" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-125173" Name="125173: &gt;[v0.4.7] Partial functionality failures for Bugzilla 2.21" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-117761" Name="117761: &gt;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: &gt;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: &gt;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: &gt;Preferences: Button for colorpicker rendered half and wit..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-121317" Name="121317: &gt;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: &gt;Mylar Java Editor doesn't trigger action through shortcut" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-122931" Name="122931: &gt;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: &gt;&amp;quot;Synchronize Reports&amp;quot; doesn't update editor" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-124887" Name="124887: &gt;browser tab not loading web page for Bugzilla tasks" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-125422" Name="125422: &gt;Option to blacklist some file types" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-125733" Name="125733: &gt;minimization problem with task list" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-125883" Name="125883: &gt;Moving a new class doesn't update the filtered package view" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126263" Name="126263: &gt;junit launch configurations broken in M5" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126862" Name="126862: &gt;failure to bring compare editor into focus" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126865" Name="126865: &gt;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&amp;Bugzilla_login=beatmik%40acm.org&amp;Bugzilla_password=1umberto&amp;short_desc_type=allwordssubstr&amp;short_desc=&amp;product=AJDT&amp;product=AspectJ&amp;long_desc_type=allwordssubstr&amp;long_desc=&amp;bug_status=UNCONFIRMED&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;emailassigned_to1=1&amp;emailtype1=exact&amp;email1=beatmik%40acm.org&amp;order=Importance" RepositoryUrl="https://bugs.eclipse.org/bugs"><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-109759" Name="109759: &gt;create pointcut matcher tool" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-42070" Name="42070: &gt;Applying a perthis modifier to an aspect cause the aspect..." Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-50928" Name="50928: &gt;Provide UI for advice execution ordering at join points" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-50929" Name="50929: &gt;Provide UI for showing call graph affected by flow advice" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-50931" Name="50931: &gt;Augment views that expose inheritance with aspect-declare..." Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-58688" Name="58688: &gt;ajbrowser filter associations button doesn't work" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-63116" Name="63116: &gt;Aspect oriented pointcuts for debugging" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-75233" Name="75233: &gt;Pointcut &amp;amp; advice definition wizards" Priority="P4"/></BugzillaQuery><BugzillaQuery MaxHits="100" Name="People - Wesley" QueryString="https://bugs.eclipse.org/bugs/buglist.cgi?GoAheadAndLogIn=1&amp;Bugzilla_login=beatmik%40acm.org&amp;Bugzilla_password=1umberto&amp;short_desc_type=allwordssubstr&amp;short_desc=&amp;long_desc_type=allwordssubstr&amp;long_desc=&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;emailassigned_to1=1&amp;emailtype1=substring&amp;email1=wes.coelho%40gmail.com&amp;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&amp;Bugzilla_login=beatmik%40acm.org&amp;Bugzilla_password=1umberto&amp;short_desc_type=allwordssubstr&amp;short_desc=&amp;product=Mylar&amp;long_desc_type=allwordssubstr&amp;long_desc=&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;emailassigned_to1=1&amp;emailtype1=substring&amp;email1=murphy&amp;order=Importance" RepositoryUrl="https://bugs.eclipse.org/bugs"><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-117827" Name="117827: &gt;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&amp;Bugzilla_login=beatmik%40acm.org&amp;Bugzilla_password=1umberto&amp;short_desc_type=allwordssubstr&amp;short_desc=&amp;product=Mylar&amp;long_desc_type=allwordssubstr&amp;long_desc=&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;priority=P1&amp;priority=P2&amp;emailassigned_to1=1&amp;emailtype1=substring&amp;email1=relves&amp;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: &gt;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 &quot;orange gradient&quot; 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: &gt;doSave(..) called too many times on MylarTaskEditor" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126618" Name="126618: &gt;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&amp;Bugzilla_login=mik.kersten%40eclipse.org&amp;Bugzilla_password=1umberto&amp;short_desc_type=allwordssubstr&amp;short_desc=&amp;long_desc_type=allwordssubstr&amp;long_desc=&amp;emailcc1=1&amp;emaillongdesc1=1&amp;emailtype1=substring&amp;email1=mik.kersten&amp;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&amp;Bugzilla_login=beatmik%40acm.org&amp;Bugzilla_password=1umberto&amp;short_desc_type=allwordssubstr&amp;short_desc=&amp;product=JDT&amp;product=Platform&amp;long_desc_type=allwordssubstr&amp;long_desc=&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;bug_status=RESOLVED&amp;emailreporter1=1&amp;emailcc1=1&amp;emaillongdesc1=1&amp;emailtype1=substring&amp;email1=beatmik&amp;order=Importance" RepositoryUrl="https://bugs.eclipse.org/bugs"><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-110147" Name="110147: &gt;[preferences][content assist] preference page issues" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-9355" Name="9355: &gt;Collapse function for block of code and comments hiding" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-37974" Name="37974: &gt;[Tasks] Issues with task/problem view split - go back to ..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-52685" Name="52685: &gt;[Plan Item] Evolve the Eclipse user experience *CONTINUED*" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-71901" Name="71901: &gt;Underline and Strikethrough Font styles" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-79056" Name="79056: &gt;[api][navigation]Providing an extension point to enable o..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-84988" Name="84988: &gt;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: &gt;[misc] Java editor should support guarded regions in source" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-100095" Name="100095: &gt;Consider making URLTransfer public" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-106000" Name="106000: &gt;[plan] Need API to allow code assist/completion from outs..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-113272" Name="113272: &gt;[Browser] allow url tracking listeners to be added to the..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-122611" Name="122611: &gt;Provide a facility to save and load exclusion filters fro..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126748" Name="126748: &gt;[search] Provide integration with the new TextSearch UI" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126085" Name="126085: &gt;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: &gt;org.eclipse.ui.views.showView bindings don't show up in menu" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-69315" Name="69315: &gt;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: &gt;Accessibility issue with new icon for Annotations" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-89843" Name="89843: &gt;[Commands] parameters: Keybinding for a View displayed bu..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-95634" Name="95634: &gt;[Tree] TreeColumn does not show &amp;quot;...&amp;quot; on cut-off Text and..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-99984" Name="99984: &gt;Sync view toolbar buttons are bigger with SWT manifest" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-101205" Name="101205: &gt;[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: &gt;[Workbench] ShellListener.shellClosed is not called on co..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-110913" Name="110913: &gt;[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: &gt;Make ChangeSetProvider and friends API" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-117223" Name="117223: &gt;trees with columns don't show tooltips" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-117319" Name="117319: &gt;&amp;quot;Search for updates..&amp;quot; should allow update sites to be sp..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-125372" Name="125372: &gt;make Package Explorer collapse policy optional" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-121441" Name="121441: &gt;[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: &gt;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: &gt;problem starting plugins with I20060207-0930" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-128233" Name="128233: &gt;need to investigate scalability of FilteredTree" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-19945" Name="19945: &gt;DCR: date/time widget would be useful" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-37997" Name="37997: &gt;[Plan Item] Evolve the Eclipse user experience" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-115152" Name="115152: &gt;[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: &gt;[Team] Support for subversion" Priority="P5"/></BugzillaQuery><BugzillaQuery MaxHits="500" Name="Low Priority" QueryString="https://bugs.eclipse.org/bugs/buglist.cgi?GoAheadAndLogIn=1&amp;Bugzilla_login=beatmik%40acm.org&amp;Bugzilla_password=1umberto&amp;short_desc_type=allwordssubstr&amp;short_desc=&amp;product=Mylar&amp;long_desc_type=allwordssubstr&amp;long_desc=&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;priority=P4&amp;priority=P5&amp;emailassigned_to1=1&amp;emailtype1=substring&amp;email1=beatmik%40acm.org&amp;order=Importance" RepositoryUrl="https://bugs.eclipse.org/bugs"><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-58646" Name="58646: &gt;[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: &gt;support adding attachments to reports" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-102854" Name="102854: &gt;add bug editor support for voting" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-103093" Name="103093: &gt;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: &gt;drag-and-drop patching" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-104062" Name="104062: in &quot;new bug report&quot;, 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: &gt;broaden composite contexts" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-104497" Name="104497: &gt;[discussion] automatic task activation" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-104601" Name="104601: &gt;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: &gt;[discussion] property-based interest filtering" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-107259" Name="107259: &gt;[discussion] provide preview of task context" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-107264" Name="107264: &gt;make active hierarchy update lazily" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-107596" Name="107596: &gt;[discussion] XP / Agile support features" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-109552" Name="109552: &gt;add workflow to task completion" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-109559" Name="109559: add &quot;dependant project&quot; 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: &gt;Active Search view could show additional relevant info" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-111218" Name="111218: &gt;[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: &gt;provide spring framework specific active search features" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-111700" Name="111700: &gt;provide wtp xml editor integration" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-111713" Name="111713: &gt;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: &gt;[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: &gt;Drag-n-drop of java file nodes to active search view" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-115941" Name="115941: &gt;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: &gt;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: &gt;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: &gt;Reminder date chooser forces date selection" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-120189" Name="120189: &gt;add version field to InteractionEvent" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-101724" Name="101724: &gt;differentiating between xml edits and selections" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-102853" Name="102853: &gt;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: &gt;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: &gt;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: &gt;allow columns to be configured in task list" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-106922" Name="106922: &gt;Submitting Data from bug report is blocking UI" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-106940" Name="106940: &gt;[discussion] support for QA tools" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-106943" Name="106943: &gt;Add dropdown for filters previously used on the tasklist" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-107091" Name="107091: &gt;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: &gt;localize messages to a single class and bundle" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-107491" Name="107491: &gt;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: &gt;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: &gt;[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: &gt;[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: &gt;[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: &gt;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: &gt;[mac] Mylar Editor: missing rectangle around Documentatio..." Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-122928" Name="122928: &gt;[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/taskdataimporttest/context-history.xml b/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/context-history.xml
new file mode 100644
index 000000000..00635a83f
--- /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.mylar.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.mylar.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.mylar.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.mylar.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.mylar.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.mylar.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.mylar.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.mylar.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.mylar.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.mylar.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.mylar.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 000000000..6fa996e7d
--- /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.mylar.core.model.interest.decay" StartDate="2006-02-16 16:51:17.4 PST" StructureHandle="=TestProject/&amp;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.mylar.core.model.interest.decay" StartDate="2006-02-16 16:51:07.437 PST" StructureHandle="=TestProject/&amp;lt;" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:13.658 PST" Interest="19.294" Kind="propagation" Navigation="org.eclipse.mylar.core.model.edges.containment" OriginId="org.eclipse.mylar.core.model.interest.propagation" StartDate="2006-02-16 16:50:16.718 PST" StructureHandle="=TestProject/&amp;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.mylar.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.mylar.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.mylar.core.model.edges.containment" OriginId="org.eclipse.mylar.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.mylar.core.model.interest.decay" StartDate="2006-02-16 16:51:17.4 PST" StructureHandle="=TestProject/&amp;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.mylar.core.model.interest.decay" StartDate="2006-02-16 16:51:07.437 PST" StructureHandle="=TestProject/&amp;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/&amp;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/&amp;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.mylar.core.model.edges.containment" OriginId="org.eclipse.mylar.core.model.interest.propagation" StartDate="2006-02-16 16:50:40.260 PST" StructureHandle="=TestProject/&amp;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.mylar.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.mylar.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.mylar.core.model.edges.containment" OriginId="org.eclipse.mylar.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.mylar.core.model.interest.decay" StartDate="2006-02-16 16:51:17.4 PST" StructureHandle="=TestProject/&amp;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.mylar.core.model.interest.decay" StartDate="2006-02-16 16:51:07.437 PST" StructureHandle="=TestProject/&amp;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/&amp;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.mylar.core.model.edges.containment" OriginId="org.eclipse.mylar.core.model.interest.propagation" StartDate="2006-02-16 16:50:29.701 PST" StructureHandle="=TestProject/&amp;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.mylar.core.model.interest.decay" StartDate="2006-02-16 16:51:17.4 PST" StructureHandle="=TestProject/&amp;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.mylar.core.model.interest.decay" StartDate="2006-02-16 16:51:07.437 PST" StructureHandle="=TestProject/&amp;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/&amp;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/&amp;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.mylar.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.mylar.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.mylar.core.model.edges.containment" OriginId="org.eclipse.mylar.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.mylar.core.model.interest.decay" StartDate="2006-02-16 16:51:17.4 PST" StructureHandle="=TestProject/&amp;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.mylar.core.model.interest.decay" StartDate="2006-02-16 16:51:07.437 PST" StructureHandle="=TestProject/&amp;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/&amp;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/&amp;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 000000000..2b043aaf6
--- /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.mylar.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.mylar.core.model.edges.containment" OriginId="org.eclipse.mylar.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.mylar.core.model.interest.decay" StartDate="2006-02-16 17:03:27.538 PST" StructureHandle="=TestProject/&amp;lt;" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 17:03:23.481 PST" Interest="4.6489997" Kind="propagation" Navigation="org.eclipse.mylar.core.model.edges.containment" OriginId="org.eclipse.mylar.core.model.interest.propagation" StartDate="2006-02-16 17:03:04.497 PST" StructureHandle="=TestProject/&amp;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.mylar.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.mylar.core.model.edges.containment" OriginId="org.eclipse.mylar.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.mylar.core.model.interest.decay" StartDate="2006-02-16 17:03:27.538 PST" StructureHandle="=TestProject/&amp;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/&amp;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/&amp;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.mylar.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.mylar.core.model.edges.containment" OriginId="org.eclipse.mylar.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.mylar.core.model.interest.decay" StartDate="2006-02-16 17:03:27.538 PST" StructureHandle="=TestProject/&amp;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/&amp;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 000000000..6538612f8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/mylardata-2006-02-16.zip
Binary files differ
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 000000000..c5848ef42
--- /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.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 000000000..12b2c1a0d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,303 @@
+#Mon Feb 13 11:20:15 PST 2006
+eclipse.preferences.version=1
+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=disabled
+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.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.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=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.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.5
+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=16
+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_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.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_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=80
+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_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_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.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.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
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 000000000..2448f889c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,5 @@
+#Mon Feb 13 11:20:15 PST 2006
+eclipse.preferences.version=1
+formatter_profile=_Mylar based on Eclipse [built-in]
+formatter_settings_version=10
+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">/**\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><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 - 2006 University Of British Columbia 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 * University Of British Columbia - 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></templates>
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 000000000..3076fc847
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,13 @@
+#Thu Feb 16 13:46:11 PST 2006
+compilers.p.build=1
+compilers.p.deprecated=2
+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-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 000000000..e01ee6a7a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,28 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Mylar TaskList Plug-in
+Bundle-SymbolicName: org.eclipse.mylar.tasklist; singleton:=true
+Bundle-Version: 0.4.8.v20060221-1550
+Bundle-Activator: org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.ui.browser,
+ org.eclipse.ui.forms,
+ org.eclipse.mylar.core
+Eclipse-AutoStart: true
+Bundle-Vendor: Eclipse.org
+Bundle-ClassPath: mylar-tasklist.jar
+Export-Package: org.eclipse.mylar.internal.tasklist,
+ org.eclipse.mylar.internal.tasklist.planner,
+ org.eclipse.mylar.internal.tasklist.planner.ui,
+ org.eclipse.mylar.internal.tasklist.ui,
+ org.eclipse.mylar.internal.tasklist.ui.actions,
+ org.eclipse.mylar.internal.tasklist.ui.editors,
+ org.eclipse.mylar.internal.tasklist.ui.preferences,
+ org.eclipse.mylar.internal.tasklist.ui.views,
+ org.eclipse.mylar.internal.tasklist.ui.wizards,
+ org.eclipse.mylar.internal.tasklist.util,
+ org.eclipse.mylar.provisional.tasklist
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.mylyn.tasks.ui/build.properties b/org.eclipse.mylyn.tasks.ui/build.properties
new file mode 100644
index 000000000..44358eedc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/build.properties
@@ -0,0 +1,28 @@
+###############################################################################
+# 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
+###############################################################################
+bin.includes = plugin.xml,\
+ icons/,\
+ mylar-tasklist.jar,\
+ META-INF/,\
+ about.html,\
+ schema/,\
+ doc/
+src.includes = icons/,\
+ plugin.xml,\
+ src/,\
+ META-INF/,\
+ schema/,\
+ about.html,\
+ doc/
+jars.compile.order = mylar-tasklist.jar
+source.mylar-tasklist.jar = src/
+output.mylar-tasklist.jar = bin/
+jre.compilation.profile = J2SE-1.5
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 000000000..a4b06ddc8
--- /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.&nbsp; This can be set as a Task List preferences.&nbsp;
+ 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).&nbsp; <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.&nbsp; 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 &quot;incoming&quot; overlay is displayed.&nbsp; If
+ a bug has changes on it that have been saved but have not been
+ committed to Bugzilla, the gray &quot;outgoing&quot; overlay is displayed.&nbsp;
+ 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.&nbsp; In offline mode the cached bug
+ copy is always used.&nbsp; 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/planning.html b/org.eclipse.mylyn.tasks.ui/doc/planning.html
new file mode 100644
index 000000000..134f9ec66
--- /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
+ &quot;Summary&quot; tab of the Task Editor.&nbsp; 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 000000000..d7340069e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/doc/tasklist.html
@@ -0,0 +1,181 @@
+<!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>&nbsp;
+ <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.&nbsp; 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>&nbsp;&nbsp;</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 &quot;Mark Complete&quot;. 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 &quot;Clear Task Context&quot;.</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="table2">
+ <tr>
+ <td width="30%" valign="top" align="left">
+ <p align="right"><b>New context menu actions</b></p>
+ </td>
+ <td width="70%" valign="top">
+ <span style="background-color: #FFFFFF">The task list now contains
+ actions for collapsing all nodes, navigating, and specifying
+ preferences for file closing behavior on task activation.</span><p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/tasklist-actions.gif" width="264" height="185"></p>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<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 &quot;Go Into Category&quot; action from the context menu.&nbsp; To
+ go back to viewing all tasks and categories under the root use the
+ &quot;Go Up To Root&quot; 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.&nbsp; Note that this will temporarily suppress all
+ other filters.&nbsp; To clear the query press the &quot;x&quot; 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>
+
+<table cellpadding="10" cellspacing="0" width="600" id="table7">
+ <tr>
+ <td align="left" valign="top" width="30%">
+ <p align="right"><b>Context highlighters</b></p>
+ </td>
+ <td valign="top" width="70%">
+ You can associate a task with a highlighter. This can be useful if
+ you are using Mylar without the filtering support.&nbsp; It also
+ allows you to distinguish between task contexts if you have multiple
+ tasks active.<p>
+ <img
+ src="../../org.eclipse.mylar.doc/doc/images/0.3/highlight.gif"></p>
+
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+ </table>
+
+ </body>
+</html>
+
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/overlay-repository.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/overlay-repository.gif
new file mode 100644
index 000000000..0ce0f9f4b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/etool16/overlay-repository.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/overlay-web.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/overlay-web.gif
new file mode 100644
index 000000000..b168c1c0e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/etool16/overlay-web.gif
Binary files 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 000000000..09fcacad3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/etool16/query-new.gif
Binary files 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 000000000..94e7d5d1c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/etool16/query.gif
Binary files 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 000000000..b4832fc94
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/etool16/repository-new.gif
Binary files 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 000000000..bb8538b39
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/etool16/repository-synchronize.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task-items.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-items.gif
new file mode 100644
index 000000000..946c6e694
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-items.gif
Binary files 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 000000000..e2cde50c2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-new.gif
Binary files 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 000000000..d0d46a007
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-remote.gif
Binary files 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 000000000..5f3396137
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository-new.gif
Binary files 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 000000000..78470a36f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task-server.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-server.gif
new file mode 100644
index 000000000..71b1baba1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-server.gif
Binary files 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 000000000..7e95e2c29
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/etool16/task.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-conflicting.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-conflicting.gif
new file mode 100644
index 000000000..d13a35640
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-conflicting.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-incoming.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-incoming.gif
new file mode 100644
index 000000000..f74cffb45
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-incoming.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-outgoing.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-outgoing.gif
new file mode 100644
index 000000000..0c5a35cfa
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-outgoing.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-repository.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-repository.gif
new file mode 100644
index 000000000..0ce0f9f4b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-repository.gif
Binary files 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 000000000..4ecfd3853
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/repositories-blue.gif
Binary files 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 000000000..d5562226d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/repositories.gif
Binary files 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 000000000..ae982990d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/icons/eview16/repository.gif
Binary files differ
diff --git a/org.eclipse.mylyn.tasks.ui/plugin.xml b/org.eclipse.mylyn.tasks.ui/plugin.xml
new file mode 100644
index 000000000..2ec83dc7d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/plugin.xml
@@ -0,0 +1,271 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension-point id="providers" name="Tasklist Providers" schema="schema/providers.exsd"/>
+ <extension-point id="repositories" name="Task Repositories" schema="schema/repositories.exsd"/>
+ <extension-point id="editors" name="Task Editors" schema="schema/editors.exsd"/>
+
+ <extension
+ name="Mylar Task List Startup (required)"
+ point="org.eclipse.ui.startup">
+ </extension>
+
+ <extension
+ id="org.eclipse.mylar.helpDocs"
+ name="Mylar Help"
+ point="org.eclipse.help.toc">
+ <toc
+ file="doc/toc.xml"
+ primary="false">
+ </toc>
+ </extension>
+
+ <extension point="org.eclipse.ui.newWizards">
+ <wizard
+ category="org.eclipse.mylar.wizards"
+ class="org.eclipse.mylar.internal.tasklist.planner.ui.TaskPlannerWizard"
+ icon="icons/eview16/task-list.gif"
+ id="org.eclipse.mylar.tasklist.report.ui.planningGameWizard"
+ name="Mylar Task Planner (Experimental)">
+ </wizard>
+ </extension>
+ <extension
+ point="org.eclipse.ui.importWizards">
+ <wizard
+ category="org.eclipse.mylar.tasklist.importcategory"
+ class="org.eclipse.mylar.internal.tasklist.ui.wizards.TaskDataImportWizard"
+ icon="icons/eview16/task-list.gif"
+ id="org.eclipse.mylar.tasklist.ui.importWizard"
+ name="Mylar Task Data">
+ <description>
+ Import Mylar task data files from file system.
+ </description>
+ </wizard>
+ <category
+ id="org.eclipse.mylar.tasklist.importcategory"
+ name="Mylar"/>
+ </extension>
+
+ <extension point="org.eclipse.ui.exportWizards">
+ <wizard
+ category="org.eclipse.mylar.tasklist.exportcategory"
+ class="org.eclipse.mylar.internal.tasklist.ui.wizards.TaskDataExportWizard"
+ icon="icons/eview16/task-list.gif"
+ id="org.eclipse.mylar.tasklist.ui.exportWizard"
+ name="Mylar Task Data">
+ <description>
+ Export Mylar task data files to the file system.
+ </description>
+ </wizard>
+ <category
+ id="org.eclipse.mylar.tasklist.exportcategory"
+ name="Mylar"/>
+ </extension>
+
+
+ <extension point="org.eclipse.ui.decorators">
+ <decorator
+ class="org.eclipse.mylar.internal.tasklist.ui.RepositoryTaskDecorator"
+ id="org.eclipse.mylar.tasklist.ui.decorator.repositories"
+ label="Mylar Repository Task Decorator"
+ lightweight="true"
+ state="true">
+ <description>
+ Mylar JIRA Task Decorator
+ </description>
+ <enablement>
+ <objectClass name="org.eclipse.mylar.provisional.tasklist.ITaskListElement"/>
+ </enablement>
+ </decorator>
+ </extension>
+
+
+ <extension
+ point="org.eclipse.ui.views">
+ <view
+ allowMultiple="false"
+ category="org.eclipse.mylar"
+ class="org.eclipse.mylar.internal.tasklist.ui.views.TaskListView"
+ icon="icons/eview16/task-list.gif"
+ id="org.eclipse.mylar.tasks.ui.views.TaskListView"
+ name="Mylar Tasks"/>
+ <view
+ id="org.eclipse.mylar.tasklist.repositories"
+ allowMultiple="false"
+ category="org.eclipse.mylar"
+ class="org.eclipse.mylar.internal.tasklist.ui.views.TaskRepositoriesView"
+ icon="icons/eview16/repositories.gif"
+ name="Task Repositories">
+ </view>
+ </extension>
+
+ <extension point="org.eclipse.ui.perspectiveExtensions">
+ <perspectiveExtension targetID="org.eclipse.jdt.ui.JavaPerspective">
+ <viewShortcut id="org.eclipse.mylar.tasks.ui.views.TaskListView"/>
+ <view id="org.eclipse.mylar.tasks.ui.views.TaskListView"
+ relative="org.eclipse.ui.views.ContentOutline"
+ relationship="top"/>
+ </perspectiveExtension>
+ <perspectiveExtension targetID="org.eclipse.jdt.ui.JavaBrowsingPerspective">
+ <viewShortcut id="org.eclipse.mylar.tasks.ui.views.TaskListView"/>
+ </perspectiveExtension>
+ <perspectiveExtension
+ targetID="org.eclipse.ui.resourcePerspective">
+ <view
+ ratio="0.5"
+ relative="org.eclipse.ui.views.TaskList"
+ relationship="right"
+ id="org.eclipse.mylar.tasklist.repositories">
+ </view>
+ </perspectiveExtension>
+
+ <perspectiveExtension targetID="org.eclipse.team.cvs.ui.cvsPerspective">
+ <view
+ id="org.eclipse.mylar.tasklist.repositories"
+ ratio="0.7"
+ relationship="bottom"
+ relative="org.eclipse.team.ccvs.ui.RepositoriesView"
+ visible="true"/>
+ <viewShortcut id="org.eclipse.mylar.tasklist.repositories"/>
+ </perspectiveExtension>
+ <perspectiveExtension targetID="org.eclipse.team.ui.TeamSynchronizingPerspective">
+ <view
+ id="org.eclipse.mylar.tasklist.repositories"
+ ratio="0.8"
+ relationship="bottom"
+ relative="org.eclipse.team.sync.views.SynchronizeView"
+ visible="true"/>
+ <viewShortcut id="org.eclipse.mylar.tasklist.repositories"/>
+ </perspectiveExtension>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.editors">
+ <editor
+ icon="icons/etool16/task.gif"
+ class="org.eclipse.mylar.internal.tasklist.ui.editors.MylarTaskEditor"
+ name="Task Viewer"
+ id="org.eclipse.mylar.tasklist.ui.taskEditor"/>
+ <editor
+ icon="icons/etool16/task.gif"
+ class="org.eclipse.mylar.internal.tasklist.ui.editors.CategoryEditor"
+ name="Category Editor"
+ id="org.eclipse.mylar.tasklist.ui.catEditor"/>
+ <editor
+ icon="icons/eview16/task-list.gif"
+ class="org.eclipse.mylar.internal.tasklist.planner.ui.TaskPlannerEditorPart"
+ name="Mylar Task Planner"
+ id="org.eclipse.mylar.tasklist.ui.planner.editor"/>
+ </extension>
+
+ <extension point="org.eclipse.ui.viewActions">
+ <viewContribution
+ id="org.eclipse.mylar.bugzilla.ui.tasklist.actions"
+ targetID="org.eclipse.mylar.tasks.ui.views.TaskListView">
+
+ <action
+ class="org.eclipse.mylar.internal.tasklist.ui.SynchronizeReportsAction"
+ enablesFor="*"
+ icon="icons/etool16/repository-synchronize.gif"
+ id="org.eclipse.mylar.bugzilla.ui.popup.refresh"
+ label="Synchronize Queries"
+ menubarPath="additions"
+ tooltip="Synchronize with Repository">
+ </action>
+
+ </viewContribution>
+ </extension>
+
+ <extension point="org.eclipse.ui.popupMenus">
+ <viewerContribution
+ id="org.eclipse.mylar.tasklist.ui.viewerContribution"
+ targetID="org.eclipse.mylar.tasks.ui.views.TaskListView">
+
+ <action
+ class="org.eclipse.mylar.internal.tasklist.ui.actions.AddRepositoryTaskAction"
+ enablesFor="*"
+ icon="icons/etool16/task-repository.gif"
+ id="org.eclipse.mylar.tasklist.actions.addQuery"
+ menubarPath="reports"
+ label="Add Existing Repository Task"
+ style="push"
+ tooltip="Add Repository Task">
+ </action>
+ <action
+ class="org.eclipse.mylar.internal.tasklist.ui.actions.NewQueryAction"
+ enablesFor="*"
+ icon="icons/etool16/query-new.gif"
+ id="org.eclipse.mylar.tasklist.actions.addQuery"
+ menubarPath="reports"
+ label="New Repository Query"
+ style="push"
+ tooltip="New Repository Query">
+ </action>
+
+ <action
+ class="org.eclipse.mylar.internal.tasklist.ui.SynchronizeReportsAction"
+ enablesFor="*"
+ icon="icons/etool16/repository-synchronize.gif"
+ id="org.eclipse.mylar.bugzilla.ui.popup.refresh"
+ label="Synchronize with Repository"
+ menubarPath="reports"
+ tooltip="Synchronize with Repository">
+ <enablement>
+ <or>
+ <objectClass name="org.eclipse.mylar.provisional.tasklist.AbstractQueryHit"/>
+ <objectClass name="org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery"/>
+ <objectClass name="org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask"/>
+ <objectClass name="org.eclipse.mylar.provisional.tasklist.ITaskContainer"/>
+ </or>
+ </enablement>
+ </action>
+ </viewerContribution>
+ </extension>
+
+ <extension point="org.eclipse.ui.preferencePages">
+ <page
+ name="Task List"
+ class="org.eclipse.mylar.internal.tasklist.ui.preferences.MylarTaskListPreferencePage"
+ id="org.eclipse.mylar.tasklist.ui.preferences"
+ category="org.eclipse.mylar.ui.preferences">
+ </page>
+ </extension>
+
+
+
+
+
+<!--
+ <extension point="org.eclipse.ui.commands">
+ <command
+ name="Mylar Tasks"
+ description="Open Mylar Tasks View"
+ categoryId="org.eclipse.ui.category.views"
+ id="org.eclipse.mylar.tasklist.ui.views.TaskListView">
+ </command>
+ </extension>
+ -->
+ <extension point="org.eclipse.ui.bindings">
+ <key
+ sequence="M2+M3+Q M"
+ contextId="org.eclipse.ui.contexts.window"
+ commandId="org.eclipse.ui.views.showView"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
+ <parameter
+ id="org.eclipse.ui.views.showView.viewId"
+ value="org.eclipse.mylar.tasks.ui.views.TaskListView"/>
+ </key>
+ </extension>
+</plugin>
+
+
+<!--
+ <action
+ label="Go Into Category"
+ tooltip="Go Into Category"
+ menubarPath="tasks"
+ id="org.eclipse.mylar.tasklist.actions.category.gointo"
+ class="org.eclipse.mylar.tasklist.ui.actions.GoIntoAction"
+ icon="icons/etool16/go-into.gif"
+ enablesFor="1"/>
+-->
diff --git a/org.eclipse.mylyn.tasks.ui/schema/providers.exsd b/org.eclipse.mylyn.tasks.ui/schema/providers.exsd
new file mode 100644
index 000000000..3fa1bc8b4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/schema/providers.exsd
@@ -0,0 +1,122 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylar.tasklist">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylar.tasklist" id="providers" name="Task List Providers"/>
+ </appInfo>
+ <documentation>
+ Currently only a work-around for creating a dynamic popupo menu.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <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"/>
+ </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>
+
+ </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.tasks.ui/schema/repositories.exsd b/org.eclipse.mylyn.tasks.ui/schema/repositories.exsd
new file mode 100644
index 000000000..f47969400
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/schema/repositories.exsd
@@ -0,0 +1,174 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylar.tasklist">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylar.tasklist" id="repositories" name="Repositories"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="repositoryType"/>
+ <element ref="externalizer"/>
+ </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="externalizer">
+ <annotation>
+ <appInfo>
+ <meta.element labelAttribute="name"/>
+ </appInfo>
+ </annotation>
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylar.provisional.tasklist.ITaskListExternalizer"/>
+ </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>
+
+ <element name="repositoryType">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylar.provisional.tasklist.AbstractRepositoryClient"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="type" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="brandingIcon" type="string">
+ <annotation>
+ <documentation>
+
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ScheduledTaskListRefreshJob.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ScheduledTaskListRefreshJob.java
new file mode 100644
index 000000000..1148fd29e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ScheduledTaskListRefreshJob.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.mylar.internal.tasklist;
+
+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.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryClient;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskList;
+import org.eclipse.mylar.provisional.tasklist.TaskListManager;
+
+/**
+ * @author Robert Elves
+ */
+public class ScheduledTaskListRefreshJob extends Job {
+
+ private static final String JOB_NAME = "Scheduled Tasklist Refresh Job";
+
+ private long scheduleDelay = 1000 * 60 * 20;// 20 minutes default
+
+ private TaskList taskList = null;
+
+ private long count = 0;
+
+ private TaskListManager taskManager;
+
+ public ScheduledTaskListRefreshJob(long schedule, TaskListManager manager) {
+ super(JOB_NAME);
+ this.scheduleDelay = schedule;
+ this.taskManager = manager;
+
+ }
+
+ public IStatus run(IProgressMonitor monitor) {
+ if (TaskListView.getDefault() != null) {
+ try {
+
+ taskList = taskManager.getTaskList();
+ List<AbstractRepositoryQuery> queries = Collections.unmodifiableList(taskList.getQueries());
+
+ for (AbstractRepositoryQuery query : queries) {
+ AbstractRepositoryClient client = MylarTaskListPlugin.getRepositoryManager().getRepositoryClient(
+ query.getRepositoryKind());
+ client.synchronize(query);
+ if (monitor.isCanceled())
+ return Status.CANCEL_STATUS;
+ }
+
+ } finally {
+ count++;
+ if (count == Long.MAX_VALUE)
+ count = 0;
+ schedule(scheduleDelay);
+ }
+ }
+ return Status.OK_STATUS;
+ }
+
+ public void setSchedule(long schedule) {
+ this.scheduleDelay = schedule;
+ }
+
+ /**
+ * for testing purposes
+ *
+ * @return
+ */
+ public long getCount() {
+ return count;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/TaskExternalizationException.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/TaskExternalizationException.java
new file mode 100644
index 000000000..15faaf8c9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/TaskExternalizationException.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist;
+
+/**
+ * @author Mik Kersten and 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.ui/src/org/eclipse/mylyn/internal/tasklist/TaskListPreferenceConstants.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/TaskListPreferenceConstants.java
new file mode 100644
index 000000000..dd0c82296
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/TaskListPreferenceConstants.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListPreferenceConstants {
+
+ public static final String PLANNER_WIZARD_ID = "org.eclipse.mylar.tasklist.ui.planner.wizard";
+
+ public static final String PLANNER_EDITOR_ID = "org.eclipse.mylar.tasklist.ui.planner.editor";
+
+ public static final String REPORT_OPEN_EDITOR = "org.eclipse.mylar.tasklist.report.open.editor";
+
+ public static final String REPORT_OPEN_INTERNAL = "org.eclipse.mylar.tasklist.report.open.internal";
+
+ public static final String REPORT_OPEN_EXTERNAL = "org.eclipse.mylar.tasklist.report.open.external";
+
+ public static final String MULTIPLE_ACTIVE_TASKS = "org.eclipse.mylar.tasklist.active.multipe";
+
+ public static final String COPY_TASK_DATA = "org.eclipse.mylar.tasklist.preferences.copyTaskData";
+
+ public static final String TASK_ID = "org.eclipse.mylar.tasklist.userid";
+
+ public static final String TASK_EDITOR_ID = "org.eclipse.mylar.tasklist.ui.taskEditor";
+
+ public static final String CATEGORY_EDITOR_ID = "org.eclipse.mylar.tasklist.ui.catEditor";
+
+ public static final String SELECTED_PRIORITY = "org.eclipse.mylar.tasklist.filter.priority";
+
+ public static final String FILTER_COMPLETE_MODE = "org.eclipse.mylar.tasklist.filter.complete";
+
+ public static final String FILTER_INCOMPLETE_MODE = "org.eclipse.mylar.tasklist.filter.incomplete";
+
+ public static final String SAVE_TASKLIST_MODE = "org.eclipse.mylar.tasklist.save.mode";
+
+ public static final String PREVIOUS_SAVE_DATE = "org.eclipse.mylar.tasklist.save.last";
+
+ public static final String DEFAULT_URL_PREFIX = "org.eclipse.mylar.tasklist.defaultUrlPrefix";
+
+ public static final String WORK_OFFLINE = "org.eclipse.mylar.tasklist.work.offline";
+
+ public static final String CONTEXTS_MIGRATED = "org.eclipse.mylar.tasklist.repositories.migrated.single";
+
+ public static final String REPOSITORY_SYNCH_ON_STARTUP = "org.eclipse.mylar.tasklist.repositories.synch.startup";
+
+ public static final String REPOSITORY_SYNCH_SCHEDULE_ENABLED = "org.eclipse.mylar.tasklist.repositories.synch.schedule.enabled";
+
+ public static final String REPOSITORY_SYNCH_SCHEDULE_MILISECONDS = "org.eclipse.mylar.tasklist.repositories.synch.schedule.miliseconds";
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/TaskListRefreshManager.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/TaskListRefreshManager.java
new file mode 100644
index 000000000..a85cee207
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/TaskListRefreshManager.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist;
+
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+
+/**
+ * @author Rob Elves
+ */
+public class TaskListRefreshManager implements IPropertyChangeListener {
+
+ private ScheduledTaskListRefreshJob refreshJob;
+
+ public void startRefreshJob() {
+ if (refreshJob != null) {
+ refreshJob.cancel();
+ }
+
+ boolean enabled = MylarTaskListPlugin.getPrefs().getBoolean(
+ TaskListPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED);
+
+ if (enabled) {
+ long miliseconds = MylarTaskListPlugin.getPrefs().getLong(
+ TaskListPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_MILISECONDS);
+
+ refreshJob = new ScheduledTaskListRefreshJob(miliseconds, MylarTaskListPlugin.getTaskListManager());
+ refreshJob.schedule(miliseconds);
+ }
+ }
+
+ public void propertyChange(PropertyChangeEvent event) {
+ if (event.getProperty().equals(TaskListPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED)
+ || event.getProperty().equals(TaskListPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_MILISECONDS)) {
+ startRefreshJob();
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/CompletedTaskCollector.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/CompletedTaskCollector.java
new file mode 100644
index 000000000..4906c96d9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/CompletedTaskCollector.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.planner;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.mylar.provisional.tasklist.ITask;
+
+/**
+ * @author Ken Sueda
+ */
+public class CompletedTaskCollector implements ITaskCollector {
+
+ private Map<String, ITask> completedTasks = new HashMap<String, ITask>();
+
+ private Date periodStartDate;
+
+ public CompletedTaskCollector(Date periodStartDate) {
+ this.periodStartDate = periodStartDate;
+ }
+
+ public String getLabel() {
+ return "Completed Tasks";
+ }
+
+ public void consumeTask(ITask task) {
+ if (task.isCompleted() && task.getCompletionDate() != null
+ && task.getCompletionDate().compareTo(periodStartDate) > 0
+ && !completedTasks.containsKey(task.getHandleIdentifier())) {
+ completedTasks.put(task.getHandleIdentifier(), task);
+ }
+ }
+
+ public Set<ITask> getTasks() {
+ Set<ITask> tasks = new HashSet<ITask>();
+ tasks.addAll(completedTasks.values());
+ return tasks;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ITaskCollector.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ITaskCollector.java
new file mode 100644
index 000000000..2bb137399
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ITaskCollector.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.planner;
+
+import java.util.Set;
+
+import org.eclipse.mylar.provisional.tasklist.ITask;
+
+/**
+ * @author Ken Sueda
+ */
+public interface ITaskCollector {
+
+ public abstract void consumeTask(ITask task);
+
+ public abstract Set<ITask> getTasks();
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/InProgressTaskCollector.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/InProgressTaskCollector.java
new file mode 100644
index 000000000..5e0a5221a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/InProgressTaskCollector.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.planner;
+
+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.mylar.provisional.core.IMylarContext;
+import org.eclipse.mylar.provisional.core.InteractionEvent;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+
+/**
+ * Collects tasks that are not complete but have been worked on during the
+ * specified number of previous days.
+ *
+ * @author Wesley Coelho (Adapted from CompletedTaskCollector by Key Sueda)
+ * @author Mik Kersten
+ */
+public class InProgressTaskCollector implements ITaskCollector {
+
+ private Map<String, ITask> inProgressTasks = new HashMap<String, ITask>();
+
+ private Date periodStartDate;
+
+ // private long DAY = 24*3600*1000;
+
+ public InProgressTaskCollector(Date periodStartDate) {
+ // periodStartDate = new Date(new Date().getTime() - prevDays * DAY);
+ this.periodStartDate = periodStartDate;
+ }
+
+ public String getLabel() {
+ return "Tasks in Progress";
+ }
+
+ public void consumeTask(ITask task) {
+ if (!task.isCompleted() && hasActivitySince(task, periodStartDate)
+ && !inProgressTasks.containsKey(task.getHandleIdentifier())) {
+ inProgressTasks.put(task.getHandleIdentifier(), task);
+ }
+ }
+
+ protected boolean hasActivitySince(ITask task, Date startDate) {
+ IMylarContext mylarContext = MylarPlugin.getContextManager().loadContext(task.getHandleIdentifier());// ,task.getContextPath());
+ if (mylarContext != null) {
+ List<InteractionEvent> events = mylarContext.getInteractionHistory();
+ if (events.size() > 0) {
+ InteractionEvent latestEvent = events.get(events.size() - 1);
+ if (latestEvent.getDate().compareTo(periodStartDate) > 0) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public Set<ITask> getTasks() {
+ Set<ITask> tasks = new HashSet<ITask>();
+ tasks.addAll(inProgressTasks.values());
+ return tasks;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/TaskReportGenerator.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/TaskReportGenerator.java
new file mode 100644
index 000000000..d41048ba2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/TaskReportGenerator.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.planner;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.planner.ui.TaskPlannerWizardPage;
+import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskContainer;
+import org.eclipse.mylar.provisional.tasklist.ITaskListElement;
+import org.eclipse.mylar.provisional.tasklist.Task;
+import org.eclipse.mylar.provisional.tasklist.TaskList;
+
+/**
+ * @author Ken Sueda
+ * @author Mik Kersten
+ * @author Rob Elves (scope report to specific categories and queries)
+ */
+public class TaskReportGenerator implements IRunnableWithProgress {
+
+ private boolean finished;
+
+ private TaskList tasklist = null;
+
+ private List<ITaskCollector> collectors = new ArrayList<ITaskCollector>();
+
+ private List<ITask> tasks = new ArrayList<ITask>();
+
+ private Set<ITaskListElement> filterCategories;
+
+ public TaskReportGenerator(TaskList tlist) {
+ this(tlist, null);
+ }
+
+ public TaskReportGenerator(TaskList tlist, Set<ITaskListElement> filterCategories) {
+ tasklist = tlist;
+ this.filterCategories = filterCategories != null ? filterCategories : new HashSet<ITaskListElement>();
+ }
+
+ public void addCollector(ITaskCollector collector) {
+ collectors.add(collector);
+ }
+
+ public void collectTasks() {
+ try {
+ run(new NullProgressMonitor());
+ } catch (InvocationTargetException e) {
+ // operation was canceled
+ } catch (InterruptedException e) {
+ MylarStatusHandler.log(e, "Could not collect tasks");
+ }
+ }
+
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+
+ Set<ITaskListElement> rootElements;
+ if (filterCategories.size() == 0) {
+ rootElements = tasklist.getRootElements();
+ } else if(filterCategories.contains(TaskPlannerWizardPage.ROOT_CATEGORY_HACK)) {
+ // TODO: Remove when root category issues fixed
+ rootElements = new HashSet<ITaskListElement>(tasklist.getRootTasks());
+ filterCategories.remove(TaskPlannerWizardPage.ROOT_CATEGORY_HACK);
+ rootElements.addAll(filterCategories);
+ } else {
+ rootElements = filterCategories;
+ }
+
+ int estimatedItemsToProcess = rootElements.size();
+ monitor.beginTask("Mylar Task Planner", estimatedItemsToProcess);
+
+ for (Object element : rootElements) {
+ monitor.worked(1);
+ if (element instanceof ITaskContainer) {
+ ITaskContainer cat = (ITaskContainer) element;
+ for (ITask task : cat.getChildren())
+ for (ITaskCollector collector : collectors) {
+ collector.consumeTask(task);
+ }
+
+ } else if (element instanceof Task) {
+ Task task = (Task) element;
+ for (ITaskCollector collector : collectors) {
+ collector.consumeTask(task);
+ }
+
+ } else if (element instanceof AbstractRepositoryQuery) {
+ // process queries
+ AbstractRepositoryQuery repositoryQuery = (AbstractRepositoryQuery) element;
+ for (AbstractQueryHit hit : repositoryQuery.getHits()) {
+ ITask correspondingTask = hit.getCorrespondingTask();
+ if (correspondingTask != null) {
+ for (ITaskCollector collector : collectors) {
+ collector.consumeTask(correspondingTask);
+ }
+ }
+ }
+ }
+ }
+ // Put the results all into one list (tasks)
+ for (ITaskCollector collector : collectors) {
+ tasks.addAll(collector.getTasks());
+ }
+ finished = true;
+ monitor.done();
+ }
+
+ public List<ITask> getAllCollectedTasks() {
+ return tasks;
+ }
+
+ public boolean isFinished() {
+ return finished;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/ITaskPlannerContentProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/ITaskPlannerContentProvider.java
new file mode 100644
index 000000000..7f309f876
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/ITaskPlannerContentProvider.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.planner.ui;
+
+import org.eclipse.mylar.provisional.tasklist.ITask;
+
+public interface ITaskPlannerContentProvider {
+
+ public void removeTask(ITask task);
+ public void addTask(ITask task);
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/OpenTaskEditorAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/OpenTaskEditorAction.java
new file mode 100644
index 000000000..e33e5ab1a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/OpenTaskEditorAction.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.mylar.internal.tasklist.planner.ui;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListUiUtil;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+
+/**
+ * @author Mik Kersten
+ * @author Ken Sueda
+ * @author Rob Elves
+ */
+public class OpenTaskEditorAction extends Action {
+
+ public static final String ID = "org.eclipse.mylar.taskplannereditor.actions.open";
+
+ private final TableViewer viewer;
+
+ /**
+ * @param view
+ */
+ public OpenTaskEditorAction(TableViewer view) {
+ this.viewer = view;
+ setText("Open");
+ setToolTipText("Open Element");
+ setId(ID);
+ }
+
+ @Override
+ public void run() {
+ ISelection selection = viewer.getSelection();
+ Object object = ((IStructuredSelection) selection).getFirstElement();
+ if (object instanceof ITask) {
+ TaskListUiUtil.openEditor((ITask)object);
+ }
+// if (obj instanceof Task) {
+// ((Task) obj).openTaskInEditor(false);
+// }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/PlannedTasksContentProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/PlannedTasksContentProvider.java
new file mode 100644
index 000000000..0d89370cf
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/PlannedTasksContentProvider.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.mylar.internal.tasklist.planner.ui;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+
+/**
+ * @author Rob Elves
+ * @author Ken Sueda
+ */
+public class PlannedTasksContentProvider implements IStructuredContentProvider, ITaskPlannerContentProvider {
+
+ TaskPlannerEditorInput editorInput;
+
+ public PlannedTasksContentProvider(TaskPlannerEditorInput editorInput) {
+ this.editorInput = editorInput;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ return editorInput.getPlannedTasks().toArray();
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ public void addTask(ITask task) {
+ editorInput.addPlannedTask(task);
+ }
+
+ public void removeTask(ITask task) {
+ editorInput.removePlannedTask(task);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/ReminderCellEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/ReminderCellEditor.java
new file mode 100644
index 000000000..1c9b552c4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/ReminderCellEditor.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.planner.ui;
+
+import java.util.Date;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.DialogCellEditor;
+import org.eclipse.jface.window.IShellProvider;
+import org.eclipse.mylar.internal.tasklist.ui.views.DatePicker;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Ken Sueda
+ * @author Mik Kersten
+ */
+public class ReminderCellEditor extends DialogCellEditor {
+
+ private Date reminderDate;
+
+ public ReminderCellEditor(Composite parent) {
+ super(parent, SWT.NONE);
+ }
+
+ @Override
+ protected Object openDialogBox(Control cellEditorWindow) {
+ ReminderDialog dialog = new ReminderDialog(cellEditorWindow.getShell());
+ dialog.open();
+ reminderDate = dialog.getDate();
+ return reminderDate;
+ }
+
+ public Date getReminderDate() {
+ return reminderDate;
+ }
+
+ private static class ReminderDialog extends Dialog {
+
+ private Date reminderDate = null;
+
+ protected ReminderDialog(Shell parentShell) {
+ super(parentShell);
+ }
+
+ protected ReminderDialog(IShellProvider parentShell) {
+ super(parentShell);
+ }
+
+ protected Control createDialogArea(Composite parent) {
+ Composite composite = (Composite) super.createDialogArea(parent);
+ final DatePicker datePicker = new DatePicker(composite, SWT.NULL, "<reminder>");
+ datePicker.addPickerSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent arg0) {
+ reminderDate = datePicker.getDate().getTime();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent arg0) {
+ // ignore
+ }
+ });
+ return composite;
+ }
+
+ public Date getDate() {
+ return reminderDate;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/RemoveTaskAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/RemoveTaskAction.java
new file mode 100644
index 000000000..9757cc79d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/RemoveTaskAction.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.planner.ui;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+
+/**
+ * @author Rob Elves
+ */
+public class RemoveTaskAction extends Action {
+ public static final String ID = "org.eclipse.mylar.taskplannereditor.actions.remove";
+
+ private final TableViewer viewer;
+
+ public RemoveTaskAction(TableViewer view) {
+ this.viewer = view;
+ setText("Remove Selected");
+ setId(ID);
+ setImageDescriptor(TaskListImages.REMOVE);
+ }
+
+ @Override
+ public void run() {
+ for (Object object : ((IStructuredSelection) viewer.getSelection()).toList()) {
+ if (object instanceof ITask) {
+ ITask task = (ITask) object;
+ if (task != null) {
+ ((ITaskPlannerContentProvider) (viewer.getContentProvider())).removeTask(task);
+ }
+ }
+ }
+ viewer.refresh();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskActivityContentProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskActivityContentProvider.java
new file mode 100644
index 000000000..f61165a46
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskActivityContentProvider.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.mylar.internal.tasklist.planner.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+
+public class TaskActivityContentProvider implements IStructuredContentProvider, ITaskPlannerContentProvider {
+
+ TaskPlannerEditorInput editorInput;
+ Viewer viewer;
+
+ public TaskActivityContentProvider(TaskPlannerEditorInput editorInput) {
+ this.editorInput = editorInput;
+ }
+
+
+ public Object[] getElements(Object inputElement) {
+ List<ITask> allTasks = new ArrayList<ITask>();
+ allTasks.addAll(editorInput.getCompletedTasks());
+ allTasks.addAll(editorInput.getInProgressTasks());
+ return allTasks.toArray();
+ }
+
+ public void dispose() {
+ // ignore
+
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ this.viewer = viewer;
+ }
+
+
+ public void removeTask(ITask task) {
+ editorInput.removeCompletedTask(task);
+ editorInput.removeInProgressTask(task);
+ }
+
+
+ public void addTask(ITask task) {
+ // ignore
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskActivityLabelProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskActivityLabelProvider.java
new file mode 100644
index 000000000..6295288e6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskActivityLabelProvider.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.planner.ui;
+
+import java.text.DateFormat;
+
+import org.eclipse.jface.viewers.IColorProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.mylar.internal.core.util.DateUtil;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskElementLabelProvider;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Ken Sueda
+ */
+public class TaskActivityLabelProvider extends TaskElementLabelProvider implements ITableLabelProvider, IColorProvider {
+
+ private TaskElementLabelProvider taskListLabelProvider = new TaskElementLabelProvider();
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ if (columnIndex == 0) {
+ return super.getImage(element);
+ } else {
+ return null;
+ }
+ }
+
+ public String getColumnText(Object element, int columnIndex) {
+ try {
+ if (element instanceof ITask) {
+ ITask task = (ITask) element;
+ switch (columnIndex) {
+ case 1:
+ return task.getPriority();
+ case 2:
+ return task.getDescription();
+ case 3:
+ if (task.getCreationDate() != null) {
+ return DateFormat.getDateInstance(DateFormat.MEDIUM).format(task.getCreationDate());
+ } else {
+ MylarStatusHandler.log("Task has no creation date: " + task.getDescription(), this);
+ return "[unknown]";
+ }
+ case 4:
+ if (task.getCompletionDate() != null) {
+ return DateFormat.getDateInstance(DateFormat.MEDIUM).format(task.getCompletionDate());
+ } else {
+ return "";
+ }
+ case 5:
+ return DateUtil.getFormattedDurationShort(task.getElapsedTime());
+ case 6:
+ return task.getEstimateTimeHours() + " hours";
+ }
+ }
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "Could not produce completed task label", false);
+ return "";
+ }
+ return null;
+ }
+
+ public Color getForeground(Object element) {
+ return taskListLabelProvider.getForeground(element);
+ }
+
+ public Color getBackground(Object element) {
+ return taskListLabelProvider.getBackground(element);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskActivitySorter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskActivitySorter.java
new file mode 100644
index 000000000..0544a816e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskActivitySorter.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.planner.ui;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+
+/**
+ * @author Ken Sueda
+ * @author Mik Kersten
+ */
+public class TaskActivitySorter extends ViewerSorter {
+
+ public final static int DESCRIPTION = 1;
+
+ public final static int PRIORITY = 2;
+
+ public final static int CREATION_DATE = 3;
+
+ public final static int COMPLETED_DATE = 4;
+
+ public final static int DURATION = 5;
+
+ public final static int ESTIMATED = 6;
+
+ public static final int ICON = 0;
+
+ private int criteria;
+
+ public TaskActivitySorter(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 CREATION_DATE:
+ return compareCreationDate(t1, t2);
+ case COMPLETED_DATE:
+ return compareCompletedDate(t1, t2);
+ case DURATION:
+ return compareDuration(t1, t2);
+ case ESTIMATED:
+ return compareEstimated(t1, t2);
+ default:
+ return 0;
+ }
+ }
+
+ protected int compareDescription(ITask task1, ITask task2) {
+ return task1.getDescription().compareTo(task2.getDescription());
+ }
+
+ protected int comparePriority(ITask task1, ITask task2) {
+ return task1.getPriority().compareTo(task2.getPriority());
+ }
+
+ protected int compareCompletedDate(ITask task1, ITask task2) {
+ return task2.getCompletionDate().compareTo(task1.getCompletionDate());
+ }
+
+ protected int compareEstimated(ITask task1, ITask task2) {
+ return task2.getEstimateTimeHours() - task1.getEstimateTimeHours();
+ }
+
+ protected int compareCreationDate(ITask task1, ITask task2) {
+ if (task1.getCreationDate() == null)
+ return 1;
+ else if (task2.getCreationDate() == null)
+ return -1;
+ else
+ return task2.getCreationDate().compareTo(task1.getCreationDate());
+ }
+
+ protected int compareDuration(ITask task1, ITask task2) {
+ return task1.getElapsedTime() < task2.getElapsedTime() ? 1 : -1;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlanContentProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlanContentProvider.java
new file mode 100644
index 000000000..35e3cbad7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlanContentProvider.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.mylar.internal.tasklist.planner.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+
+/**
+ * @author Ken Sueda
+ */
+public class TaskPlanContentProvider implements IStructuredContentProvider {
+
+ private List<ITask> tasks = new ArrayList<ITask>();
+
+ public Object[] getElements(Object inputElement) {
+ return tasks.toArray();
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ public void addTask(ITask t) {
+ if (!tasks.contains(t)) {
+ tasks.add(t);
+ }
+ }
+
+ public void removeTask(ITask t) {
+ tasks.remove(t);
+ }
+
+ public List<ITask> getTasks() {
+ return tasks;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlanLabelProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlanLabelProvider.java
new file mode 100644
index 000000000..af66fb0df
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlanLabelProvider.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.mylar.internal.tasklist.planner.ui;
+
+import java.text.DateFormat;
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.mylar.internal.core.util.DateUtil;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskElementLabelProvider;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Ken Sueda
+ */
+public class TaskPlanLabelProvider extends TaskElementLabelProvider implements ITableLabelProvider {
+
+ // {".", "Description", "Priority", "Estimated Time", "Reminder Date"};
+ public Image getColumnImage(Object element, int columnIndex) {
+ if (columnIndex == 0) {
+ return super.getImage(element);
+ } else {
+ return null;
+ }
+ }
+
+ public String getColumnText(Object element, int columnIndex) {
+ if (element instanceof ITask) {
+ ITask task = (ITask) element;
+ switch (columnIndex) {
+ case 1:
+ return task.getPriority();
+ case 2:
+ return task.getDescription();
+ case 3:
+ return DateUtil.getFormattedDurationShort(task.getElapsedTime());
+ case 4:
+ return task.getEstimateTimeHours() + " hours";
+ case 5:
+ if (task.getReminderDate() != null) {
+ return DateFormat.getDateInstance(DateFormat.MEDIUM).format(task.getReminderDate());
+ } else {
+ return "";
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlanSorter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlanSorter.java
new file mode 100644
index 000000000..2b8cd5a31
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlanSorter.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.mylar.internal.tasklist.planner.ui;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskPlanSorter extends TaskActivitySorter {
+
+ // {".", "Description", "Priority", "Estimated Time", "Reminder Date"};
+ public final static int PRIORITY = 1;
+
+ public final static int DESCRIPTION = 2;
+
+ public final static int DURATION = 3;
+
+ public final static int ESTIMATE = 4;
+
+ public final static int REMINDER = 5;
+
+ public static final int ICON = 0;
+
+ private int criteria;
+
+ public TaskPlanSorter(int criteria) {
+ super(criteria);
+ this.criteria = criteria;
+ }
+
+ @Override
+ public int compare(Viewer viewer, Object obj1, Object obj2) {
+ ITask t1 = (ITask) obj1;
+ ITask t2 = (ITask) obj2;
+
+ switch (criteria) {
+ case PRIORITY:
+ return comparePriority(t1, t2);
+ case DESCRIPTION:
+ return compareDescription(t1, t2);
+ case DURATION:
+ return compareDuration(t1, t2);
+ case ESTIMATE:
+ return compareEstimated(t1, t2);
+ case REMINDER:
+ return compareReminder(t1, t2);
+ default:
+ return 0;
+ }
+ }
+
+ private int compareReminder(ITask task1, ITask task2) {
+ if (task2.getReminderDate() == null)
+ return -1;
+ if (task1.getReminderDate() == null)
+ return 1;
+ if (task1.getReminderDate() == null && task2.getReminderDate() == null)
+ return 0;
+ return task2.getReminderDate().compareTo(task1.getReminderDate());
+ }
+
+ // protected int compareEstimated(ITask task1, ITask task2) {
+ // if (task1.getEstimateTimeHours() > task2.getEstimateTimeHours()) {
+ // return 1;
+ // } else {
+ // return -1;
+ // }
+
+ // private int compareDescription(ITask task1, ITask task2) {
+ // return
+ // task1.getDescription(false).compareTo(task2.getDescription(false));
+ // }
+ //
+ // private int comparePriority(ITask task1, ITask task2) {
+ // return task1.getPriority().compareTo(task2.getPriority());
+ // }
+ //
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerEditorInput.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerEditorInput.java
new file mode 100644
index 000000000..f754e1ad6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerEditorInput.java
@@ -0,0 +1,179 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.planner.ui;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.planner.CompletedTaskCollector;
+import org.eclipse.mylar.internal.tasklist.planner.ITaskCollector;
+import org.eclipse.mylar.internal.tasklist.planner.InProgressTaskCollector;
+import org.eclipse.mylar.internal.tasklist.planner.TaskReportGenerator;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskListElement;
+import org.eclipse.mylar.provisional.tasklist.TaskList;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.IProgressService;
+
+/**
+ * @author Ken Sueda
+ * @author Mik Kersten
+ */
+public class TaskPlannerEditorInput implements IEditorInput {
+
+ private Set<ITask> completedTasks = new HashSet<ITask>();
+
+ private Set<ITask> inProgressTasks = new HashSet<ITask>();
+
+ private Set<ITask> plannedTasks = new HashSet<ITask>();
+
+ private TaskReportGenerator taskReportGenerator = null;
+
+ // private int prevDaysToReport = -1;
+
+ private Date reportStartDate = null;
+
+ public TaskPlannerEditorInput(Date reportStartDate, Set<ITaskListElement> chosenCategories, TaskList tlist) {
+ this.reportStartDate = reportStartDate;
+ taskReportGenerator = new TaskReportGenerator(tlist, chosenCategories);
+
+ ITaskCollector completedTaskCollector = new CompletedTaskCollector(reportStartDate);
+ taskReportGenerator.addCollector(completedTaskCollector);
+
+ ITaskCollector inProgressTaskCollector = new InProgressTaskCollector(reportStartDate);
+ taskReportGenerator.addCollector(inProgressTaskCollector);
+
+ try {
+ IProgressService service = PlatformUI.getWorkbench().getProgressService();
+ service.run(false, true, taskReportGenerator);
+ while (!taskReportGenerator.isFinished())
+ Thread.sleep(500);
+ } catch (InvocationTargetException e) {
+ // operation was canceled
+ } catch (InterruptedException e) {
+ MylarStatusHandler.log(e, "Could not generate report");
+ }
+
+ completedTasks = completedTaskCollector.getTasks();
+ inProgressTasks = inProgressTaskCollector.getTasks();
+ plannedTasks = new HashSet<ITask>();
+ }
+
+ public boolean exists() {
+ return true;
+ }
+
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ public String getName() {
+ return "Mylar Task Planner";
+ }
+
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ public String getToolTipText() {
+ return "Task Planner";
+ }
+
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+ public Set<ITask> getCompletedTasks() {
+ return completedTasks;
+ }
+
+ public Set<ITask> getInProgressTasks() {
+ return inProgressTasks;
+ }
+
+ public Set<ITask> getPlannedTasks() {
+ return plannedTasks;
+ }
+
+ public long getTotalTimeSpentOnCompletedTasks() {
+ long duration = 0;
+ for (ITask t : completedTasks) {
+ duration += t.getElapsedTime();
+ }
+ return duration;
+ }
+
+ public long getTotalTimeSpentOnInProgressTasks() {
+ long duration = 0;
+ for (ITask t : inProgressTasks) {
+ duration += t.getElapsedTime();
+ }
+ return duration;
+ }
+
+ public TaskReportGenerator getReportGenerator() {
+ return taskReportGenerator;
+ }
+
+ public boolean createdDuringReportPeriod(ITask task) {
+ Date creationDate = task.getCreationDate();
+ if (creationDate != null) {
+ return creationDate.compareTo(reportStartDate) > 0;
+ } else {
+ return false;
+ }
+ }
+
+ public Date getReportStartDate() {
+ return reportStartDate;
+ }
+
+ public int getTotalTimeEstimated() {
+ int duration = 0;
+ for (ITask task : inProgressTasks) {
+ duration += task.getEstimateTimeHours();
+ }
+ return duration;
+ }
+
+ public void removeCompletedTask( ITask task) {
+ completedTasks.remove(task);
+ }
+
+ public void removeInProgressTask(ITask task) {
+ inProgressTasks.remove(task);
+ }
+
+ public void addPlannedTask(ITask task) {
+ if(!plannedTasks.contains(task)) {
+ plannedTasks.add(task);
+ }
+ }
+ public void removePlannedTask(ITask task) {
+ plannedTasks.remove(task);
+ }
+
+ public int getPlannedEstimate() {
+ int estimated = 0;
+ for (ITask task : plannedTasks) {
+ estimated += task.getEstimateTimeHours();
+ }
+ return estimated;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerEditorPart.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerEditorPart.java
new file mode 100644
index 000000000..537b4a786
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerEditorPart.java
@@ -0,0 +1,863 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.planner.ui;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+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.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ComboBoxCellEditor;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.ICellEditorListener;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.ViewerDropAdapter;
+import org.eclipse.mylar.internal.core.dt.MylarWebRef;
+import org.eclipse.mylar.internal.core.util.DateUtil;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.ui.ComboSelectionDialog;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskContainer;
+import org.eclipse.mylar.provisional.tasklist.ITaskListElement;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskCategory;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.dnd.TransferData;
+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.FileDialog;
+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.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.forms.FormColors;
+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.TableWrapLayout;
+import org.eclipse.ui.internal.Workbench;
+import org.eclipse.ui.part.EditorPart;
+
+/**
+ *
+ * Note: Some methods have been generalized to remove duplicate code but the
+ * design still isn't right (long parameter lists, inflexible table creation).
+ * Needs refactoring. (Planned tasks section is currently disabled but should
+ * also use the new common methods)
+ *
+ * @author Mik Kersten
+ * @author Ken Sueda (original prototype)
+ * @author Wesley Coelho (added tasks in progress section, refactored-out
+ * similar code)
+ * @author Mik Kersten (rewrite)
+ */
+public class TaskPlannerEditorPart extends EditorPart {
+
+ private static final String LABEL_PLANNED_ACTIVITY = "Planned Activity";
+
+ private static final String LABEL_DIALOG = "Summary";
+
+ private static final String LABEL_PAST_ACTIVITY = "Past Activity";
+
+ private TaskPlannerEditorInput editorInput = null;
+
+ private String[] activityColumnNames = new String[] { " ", " !", "Description", "Created", "Completed", "Elapsed",
+ "Estimated" };
+
+ private int[] activityColumnWidths = new int[] { 20, 30, 300, 90, 90, 70, 70 };
+
+ private int[] activitySortConstants = new int[] { TaskActivitySorter.ICON, TaskActivitySorter.PRIORITY,
+ TaskActivitySorter.DESCRIPTION, TaskActivitySorter.CREATION_DATE, TaskActivitySorter.COMPLETED_DATE,
+ TaskActivitySorter.DURATION, TaskActivitySorter.ESTIMATED };
+
+ private String[] planColumnNames = new String[] { " ", " !", "Description", "Elapsed", "Estimated", "Reminder" };
+
+ private int[] planSortConstants = new int[] { TaskPlanSorter.ICON, TaskPlanSorter.PRIORITY,
+ TaskPlanSorter.DESCRIPTION, TaskPlanSorter.DURATION, TaskPlanSorter.ESTIMATED, TaskPlanSorter.REMINDER };
+
+ private int[] planColumnWidths = new int[] { 20, 30, 340, 90, 90, 100 };
+
+ private static final String[] ESTIMATE_TIMES = new String[] { "0 Hours", "1 Hours", "2 Hours", "3 Hours",
+ "4 Hours", "5 Hours", "6 Hours", "7 Hours", "8 Hours", "9 Hours", "10 Hours" };
+
+ private static final String LABEL_ESTIMATED = "Total estimated: ";
+
+ private static final String NO_TIME_ELAPSED = "&nbsp;";
+
+ private static final String BLANK_CELL = "&nbsp;";
+
+ private Label totalEstimatedHoursLabel;
+
+ // Summary Fields
+
+ private Label numberCompleted;
+
+ private Label totalTimeOnCompleted;
+
+ private Label numberInProgress;
+
+ private Label totalTimeOnIncomplete;
+
+ private Label totalEstimatedTime;
+
+ private Label totalTime;
+
+
+ private TaskActivityContentProvider activityContentProvider;
+
+ private PlannedTasksContentProvider planContentProvider;
+
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ }
+
+ @Override
+ public void doSaveAs() {
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+ setSite(site);
+ setInput(input);
+ editorInput = (TaskPlannerEditorInput) input;
+ setPartName(editorInput.getName());
+ setTitleToolTip(editorInput.getToolTipText());
+ }
+
+ @Override
+ public boolean isDirty() {
+ return false;
+ }
+
+ @Override
+ public boolean isSaveAsAllowed() {
+ return false;
+ }
+
+ @Override
+ public void createPartControl(Composite parent) {
+ FormToolkit toolkit = new FormToolkit(parent.getDisplay());
+ ScrolledForm sform = toolkit.createScrolledForm(parent);
+ Composite editorComposite = sform.getBody();
+
+ editorComposite.setLayout(new GridLayout());
+ GridData gridData = new GridData();
+ gridData.horizontalAlignment = GridData.FILL_BOTH;
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.grabExcessVerticalSpace = true;
+ editorComposite.setLayoutData(gridData);
+
+ createSummarySection(editorComposite, toolkit, editorInput.getReportStartDate());
+ String label = LABEL_PAST_ACTIVITY;
+
+ List<ITask> allTasks = new ArrayList<ITask>();
+ allTasks.addAll(editorInput.getCompletedTasks());
+ allTasks.addAll(editorInput.getInProgressTasks());
+
+ SashForm sashForm = new SashForm(editorComposite, SWT.VERTICAL);
+
+ sashForm.setLayout(new GridLayout());
+ sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ activityContentProvider = new TaskActivityContentProvider(editorInput);
+
+ final TableViewer activityViewer = createTableSection(sashForm, toolkit, label, activityColumnNames,
+ activityColumnWidths, activitySortConstants);
+ activityViewer.setContentProvider(activityContentProvider);
+ activityViewer.setLabelProvider(new TaskActivityLabelProvider());
+ setSorters(activityColumnNames, activitySortConstants, activityViewer.getTable(), activityViewer, false);
+ activityViewer.setInput(editorInput);
+
+ activityViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ updateLabels();
+ }
+ });
+
+ MenuManager activityContextMenuMgr = new MenuManager("#ActivityPlannerPopupMenu");
+ activityContextMenuMgr.setRemoveAllWhenShown(true);
+ activityContextMenuMgr.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ TaskPlannerEditorPart.this.fillContextMenu(activityViewer, manager);
+
+ }
+ });
+ Menu menu = activityContextMenuMgr.createContextMenu(activityViewer.getControl());
+ activityViewer.getControl().setMenu(menu);
+ getSite().registerContextMenu(activityContextMenuMgr, activityViewer);
+
+
+ planContentProvider = new PlannedTasksContentProvider(editorInput);
+ final TableViewer planViewer = createTableSection(sashForm, toolkit, LABEL_PLANNED_ACTIVITY,
+ planColumnNames, planColumnWidths, planSortConstants);
+ planViewer.setContentProvider(planContentProvider);
+ planViewer.setLabelProvider(new TaskPlanLabelProvider());
+ createPlanCellEditorListener(planViewer.getTable(), planViewer, planContentProvider);
+ planViewer.setCellModifier(new PlannedTasksCellModifier(planViewer));
+ initDrop(planViewer, planContentProvider);
+ setSorters(planColumnNames, planSortConstants, planViewer.getTable(), planViewer, true);
+ planViewer.setInput(editorInput);
+
+ planViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ updateLabels();
+ }
+ });
+
+ MenuManager planContextMenuMgr = new MenuManager("#PlanPlannerPopupMenu");
+ planContextMenuMgr.setRemoveAllWhenShown(true);
+ planContextMenuMgr.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ TaskPlannerEditorPart.this.fillContextMenu(planViewer, manager);
+ }
+ });
+ Menu planMenu = planContextMenuMgr.createContextMenu(planViewer.getControl());
+ planViewer.getControl().setMenu(planMenu);
+ getSite().registerContextMenu(planContextMenuMgr, planViewer);
+
+ totalEstimatedHoursLabel = toolkit.createLabel(editorComposite, LABEL_ESTIMATED + "0 hours ", SWT.NULL);
+ createButtons(editorComposite, toolkit, planViewer, planContentProvider);
+
+ }
+
+ private void fillContextMenu(TableViewer viewer, IMenuManager manager) {
+ if (!viewer.getSelection().isEmpty()) {
+ manager.add(new OpenTaskEditorAction(viewer));
+ manager.add(new RemoveTaskAction(viewer));
+ manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+ }
+
+ @Override
+ public void setFocus() {
+ }
+
+ private void createSummarySection(Composite parent, FormToolkit toolkit, Date startDate) {
+ Section summarySection = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
+ summarySection.setText(LABEL_DIALOG);
+ summarySection.setLayout(new GridLayout());
+ summarySection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ Composite summaryContainer = toolkit.createComposite(summarySection);
+ summarySection.setClient(summaryContainer);
+ TableWrapLayout layout = new TableWrapLayout();
+ layout.numColumns = 2;
+ summaryContainer.setLayout(layout);
+
+ String formatString = "yyyy-MM-dd, h:mm a";
+ SimpleDateFormat format = new SimpleDateFormat(formatString, Locale.ENGLISH);
+
+ if (startDate != null) {
+ String dateLabel = "Activity since " + format.format(startDate);
+ // DateFormat.getDateInstance(DateFormat.MEDIUM).format(reportStartDate)
+ Label startLabel = toolkit.createLabel(summaryContainer, dateLabel, SWT.NULL);
+ startLabel.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+ toolkit.createLabel(summaryContainer, "", SWT.NULL);
+ }
+
+ String numComplete = "Number completed: " + editorInput.getCompletedTasks().size();
+ numberCompleted = toolkit.createLabel(summaryContainer, numComplete, SWT.NULL);
+ numberCompleted.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+
+ String totalCompletedTaskTime = "Total time on completed: "
+ + DateUtil.getFormattedDuration(editorInput.getTotalTimeSpentOnCompletedTasks(), false);
+ totalTimeOnCompleted = toolkit.createLabel(summaryContainer, totalCompletedTaskTime, SWT.NULL);
+ totalTimeOnCompleted.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+
+ String numInProgress = "Number in progress: " + editorInput.getInProgressTasks().size();
+ numberInProgress = toolkit.createLabel(summaryContainer, numInProgress, SWT.NULL);
+ numberInProgress.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+
+ String totalInProgressTaskTime = "Total time on incomplete: "
+ + DateUtil.getFormattedDuration(editorInput.getTotalTimeSpentOnInProgressTasks(), false);
+ totalTimeOnIncomplete = toolkit.createLabel(summaryContainer, totalInProgressTaskTime, SWT.NULL);
+ totalTimeOnIncomplete.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+
+ String spacer = " ";
+ String totalEstimated = "Total estimated time: " + editorInput.getTotalTimeEstimated() + " hours" + spacer;
+ totalEstimatedTime = toolkit.createLabel(summaryContainer, totalEstimated, SWT.NULL);
+ totalEstimatedTime.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+
+ String grandTotalTime = "Total time: " + getTotalTime();
+ totalTime = toolkit.createLabel(summaryContainer, grandTotalTime, SWT.NULL);
+ totalTime.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+
+ }
+
+ private void updateSummarySection() {
+ String numComplete = "Number completed: " + editorInput.getCompletedTasks().size();
+ numberCompleted.setText(numComplete);
+
+ String totalCompletedTaskTime = "Total time on completed: "
+ + DateUtil.getFormattedDuration(editorInput.getTotalTimeSpentOnCompletedTasks(), false);
+ totalTimeOnCompleted.setText(totalCompletedTaskTime);
+
+ String numInProgress = "Number in progress: " + editorInput.getInProgressTasks().size();
+ numberInProgress.setText(numInProgress);
+
+ String totalInProgressTaskTime = "Total time on incomplete: "
+ + DateUtil.getFormattedDuration(editorInput.getTotalTimeSpentOnInProgressTasks(), false);
+ totalTimeOnIncomplete.setText(totalInProgressTaskTime);
+
+ String spacer = " ";
+ String totalEstimated = "Total estimated time: " + editorInput.getTotalTimeEstimated() + " hours" + spacer;
+ totalEstimatedTime.setText(totalEstimated);
+
+ String grandTotalTime = "Total time: " + getTotalTime();
+ totalTime.setText(grandTotalTime);
+
+ }
+
+ private void createPlanCellEditorListener(final Table planTable, final TableViewer planTableViewer,
+ final PlannedTasksContentProvider contentProvider) {
+ CellEditor[] editors = new CellEditor[planColumnNames.length + 1];
+ final ComboBoxCellEditor estimateEditor = new ComboBoxCellEditor(planTable, ESTIMATE_TIMES, SWT.READ_ONLY);
+ final ReminderCellEditor reminderEditor = new ReminderCellEditor(planTable);
+ editors[0] = null; // not used
+ editors[1] = null;// not used
+ editors[2] = null;// not used
+ editors[3] = null;// not used
+ editors[4] = estimateEditor;
+ editors[5] = reminderEditor;
+ reminderEditor.addListener(new ICellEditorListener() {
+ public void applyEditorValue() {
+ Object selection = ((IStructuredSelection) planTableViewer.getSelection()).getFirstElement();
+ if (selection instanceof ITask) {
+ ((ITask) selection).setReminderDate(reminderEditor.getReminderDate());
+ planTableViewer.refresh();
+ }
+ }
+
+ public void cancelEditor() {
+ }
+
+ public void editorValueChanged(boolean oldValidState, boolean newValidState) {
+ }
+
+ });
+ estimateEditor.addListener(new ICellEditorListener() {
+ public void applyEditorValue() {
+ Object selection = ((IStructuredSelection) planTableViewer.getSelection()).getFirstElement();
+ if (selection instanceof ITask) {
+ ITask task = (ITask) selection;
+ int estimate = (Integer) estimateEditor.getValue();
+ if (estimate == -1) {
+ estimate = 0;
+ }
+ task.setEstimatedTimeHours(estimate);
+ updateLabels();
+ planTableViewer.refresh();
+ }
+ }
+
+ public void cancelEditor() {
+ }
+
+ public void editorValueChanged(boolean oldValidState, boolean newValidState) {
+ }
+
+ });
+ planTableViewer.setCellEditors(editors);
+ }
+
+ private String getTotalTime() {
+ return DateUtil.getFormattedDuration(editorInput.getTotalTimeSpentOnCompletedTasks()
+ + editorInput.getTotalTimeSpentOnInProgressTasks(), false);
+ }
+
+ private TableViewer createTableSection(Composite parent, FormToolkit toolkit, String title, String[] columnNames,
+ int[] columnWidths, int[] sortConstants) {
+ Section tableSection = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR); // | ExpandableComposite.TWISTIE
+ tableSection.setText(title);
+// tableSection.setExpanded(true);
+ tableSection.marginHeight = 8;
+ tableSection.setLayout(new GridLayout());
+ tableSection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Composite detailContainer = toolkit.createComposite(tableSection);
+ tableSection.setClient(detailContainer);
+ detailContainer.setLayout(new GridLayout());
+ detailContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ return createTable(detailContainer, toolkit, columnNames, columnWidths, sortConstants);
+ }
+
+ private TableViewer createTable(Composite parent, FormToolkit toolkit, String[] columnNames, int[] columnWidths,
+ int[] sortConstants) {
+ int style = SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION;
+ Table table = toolkit.createTable(parent, style);
+
+ table.setLayout(new GridLayout());
+ GridData tableGridData = new GridData(GridData.FILL_BOTH);
+ tableGridData.heightHint = 100;
+ table.setLayoutData(tableGridData);
+
+ table.setLinesVisible(true);
+ table.setHeaderVisible(true);
+ table.setEnabled(true);
+
+ for (int i = 0; i < columnNames.length; i++) {
+ TableColumn column = new TableColumn(table, SWT.LEFT, i);
+ column.setText(columnNames[i]);
+ column.setWidth(columnWidths[i]);
+ }
+
+ TableViewer tableViewer = new TableViewer(table);
+ tableViewer.setUseHashlookup(true);
+ tableViewer.setColumnProperties(columnNames);
+
+ final OpenTaskEditorAction openAction = new OpenTaskEditorAction(tableViewer);
+ tableViewer.addDoubleClickListener(new IDoubleClickListener() {
+ public void doubleClick(DoubleClickEvent event) {
+ openAction.run();
+ }
+ });
+
+ return tableViewer;
+ }
+
+ private void setSorters(String[] columnNames, int[] sortConstants, Table table, TableViewer tableViewer,
+ boolean plan) {
+ for (int i = 0; i < columnNames.length; i++) {
+ TableColumn column = table.getColumn(i);
+ addColumnSelectionListener(tableViewer, column, sortConstants[i], plan);
+ }
+ }
+
+ private void addColumnSelectionListener(final TableViewer tableViewer, TableColumn column,
+ final int sorterConstant, final boolean plan) {
+ column.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (plan) { // TODO: bad modularity
+ tableViewer.setSorter(new TaskPlanSorter(sorterConstant));
+ } else {
+ tableViewer.setSorter(new TaskActivitySorter(sorterConstant));
+ }
+ }
+ });
+ }
+
+ /**
+ * TODO: refactor into seperate actions?
+ */
+ private void createButtons(Composite parent, FormToolkit toolkit, final TableViewer viewer,
+ final PlannedTasksContentProvider contentProvider) {
+ Composite container = new Composite(parent, SWT.NULL);
+ container.setBackground(parent.getBackground());
+ GridLayout layout = new GridLayout();
+ container.setLayout(layout);
+ layout.numColumns = 3;
+
+ Button addIncomplete = toolkit.createButton(container, "Add Incomplete", SWT.PUSH | SWT.CENTER);
+ addIncomplete.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Set<ITask> incompleteTasks = editorInput.getInProgressTasks();
+ for (ITask task : incompleteTasks) {
+ contentProvider.addTask(task);
+ viewer.refresh();
+ updateLabels();
+ }
+ }
+ });
+
+ Button addToCategory = toolkit.createButton(container, "Add Planned to Category...", SWT.PUSH | SWT.CENTER);
+ addToCategory.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ addPlannedTasksToCategory(contentProvider);
+ }
+ });
+
+ Button exportToHTML = toolkit.createButton(container, "Export to HTML...", SWT.PUSH | SWT.CENTER);
+ exportToHTML.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ exportToHtml();
+ }
+ });
+ }
+
+ @MylarWebRef(name = "Drag and drop article", url = "http://www.eclipse.org/articles/Article-Workbench-DND/drag_drop.html")
+ private void initDrop(final TableViewer tableViewer, final PlannedTasksContentProvider contentProvider) {
+ Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
+
+ tableViewer.addDropSupport(DND.DROP_MOVE, types, new ViewerDropAdapter(tableViewer) {
+ {
+ setFeedbackEnabled(false);
+ }
+
+ @Override
+ public boolean performDrop(Object data) {
+
+ IStructuredSelection selection = ((IStructuredSelection) TaskListView.getDefault().getViewer()
+ .getSelection());
+
+ for (Iterator iter = selection.iterator(); iter.hasNext();) {
+ Object selectedObject = iter.next();
+ if (selectedObject instanceof ITask) {
+ contentProvider.addTask((ITask) selectedObject);
+ updateLabels();
+ continue;
+ } else if (selectedObject instanceof ITaskListElement) {
+// if (MylarTaskListPlugin.getDefault().getHandlerForElement((ITaskListElement) selectedObject) != null) {
+ ITask task = null;
+ if (selectedObject instanceof ITask) {
+ task = (ITask) selectedObject;
+ } else if (selectedObject instanceof AbstractQueryHit) {
+ task = ((AbstractQueryHit) selectedObject).getOrCreateCorrespondingTask();
+ }
+ if (task != null) {
+ contentProvider.addTask(task);
+ updateLabels();
+ continue;
+ }
+// }
+ } else {
+ return false;
+ }
+ }
+ tableViewer.refresh();
+ return true;
+ }
+
+ @Override
+ public boolean validateDrop(Object targetObject, int operation, TransferData transferType) {
+ Object selectedObject = ((IStructuredSelection) TaskListView.getDefault().getViewer().getSelection())
+ .getFirstElement();
+ if (!(selectedObject instanceof AbstractRepositoryQuery)) {
+// && ((ITaskListElement) selectedObject).isDragAndDropEnabled()) {
+ return true;
+ }
+ return false;
+ }
+ });
+ }
+
+ private class PlannedTasksCellModifier implements ICellModifier {
+
+ private TableViewer tableViewer;
+
+ public PlannedTasksCellModifier(TableViewer tableViewer) {
+ this.tableViewer = tableViewer;
+ }
+
+ public boolean canModify(Object element, String property) {
+ int columnIndex = Arrays.asList(planColumnNames).indexOf(property);
+ if (columnIndex == 5 || columnIndex == 4) {
+ return true;
+ }
+ return false;
+ }
+
+ public Object getValue(Object element, String property) {
+ if (element instanceof ITask) {
+ int columnIndex = Arrays.asList(planColumnNames).indexOf(property);
+ if (element instanceof ITask) {
+ if (columnIndex == 5) {
+ if (((ITask) element).getReminderDate() != null) {
+ return DateFormat.getDateInstance(DateFormat.MEDIUM).format(
+ ((ITask) element).getReminderDate());
+ } else {
+ return null;
+ }
+ } else if (columnIndex == 4) {
+ return new Integer(Arrays.asList(ESTIMATE_TIMES).indexOf(
+ ((ITask) element).getEstimateTimeHours()));
+ }
+
+ }
+ }
+ return null;
+ }
+
+ public void modify(Object element, String property, Object value) {
+ int columnIndex = Arrays.asList(planColumnNames).indexOf(property);
+ if (element instanceof ITask) {
+ ITask task = (ITask) element;
+ if (columnIndex == 4) {
+ if (value instanceof Integer) {
+ task.setEstimatedTimeHours(((Integer) value).intValue() * 10);
+ tableViewer.refresh();
+ }
+ }
+ }
+ }
+ }
+
+ private void addPlannedTasksToCategory(PlannedTasksContentProvider contentProvider) {
+ List<ITaskContainer> categories = MylarTaskListPlugin.getTaskListManager().getTaskList().getUserCategories();
+ String[] categoryNames = new String[categories.size()];
+ int i = 0;
+ for (ITaskContainer category : categories) {
+ categoryNames[i++] = category.getDescription();
+ }
+ if (categories.size() > 0) {
+ ComboSelectionDialog dialog = new ComboSelectionDialog(Display.getCurrent().getActiveShell(), LABEL_DIALOG,
+ "Select destination category: ", categoryNames, 0);
+ int confirm = dialog.open();
+ if (confirm == ComboSelectionDialog.OK) {
+ String selected = dialog.getSelectedString();
+ ITaskContainer destinationCategory = null;
+ for (ITaskContainer category : categories) {
+ if (category.getDescription().equals(selected)) {
+ destinationCategory = category;
+ break; // will go to the first one
+ }
+ }
+ if (destinationCategory != null && destinationCategory instanceof TaskCategory) {
+ TaskCategory taskCategory = (TaskCategory) destinationCategory;
+ for (ITask task : editorInput.getPlannedTasks()) {
+ if (!taskCategory.getChildren().contains(task)) {
+ MylarTaskListPlugin.getTaskListManager().moveToCategory(taskCategory, task);
+ }
+ }
+ if (TaskListView.getDefault() != null) {
+ TaskListView.getDefault().refreshAndFocus();
+ }
+ } else {
+ MessageDialog.openInformation(Display.getCurrent().getActiveShell(), LABEL_DIALOG,
+ "Can not add plan tasks into a query category.");
+ }
+ }
+ } else {
+ MessageDialog.openInformation(Display.getCurrent().getActiveShell(), LABEL_DIALOG,
+ "No categories in task list.");
+ }
+ }
+
+ private void updateLabels() {
+ totalEstimatedHoursLabel.setText(LABEL_ESTIMATED + editorInput.getPlannedEstimate() + " hours");
+ updateSummarySection();
+ }
+
+
+ private void exportToHtml() {
+ File outputFile;
+ try {
+ FileDialog dialog = new FileDialog(Workbench.getInstance().getActiveWorkbenchWindow().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></head><body>"
+ // + "<link rel=\"stylesheet\"
+ // href=\"http://eclipse.org/mylar/style.css\"
+ // type=\"text/css\"></head><body>"
+ );
+
+ exportSummarySection(writer);
+
+ exportActivitySection(writer);
+
+ exportPlanSection(writer);
+
+ writer.write("</body></html>");
+ writer.close();
+ } catch (FileNotFoundException e) {
+ MylarStatusHandler.log(e, "could not resolve file");
+ } catch (IOException e) {
+ MylarStatusHandler.log(e, "could not write to file");
+ }
+ }
+
+ private void exportPlanSection(BufferedWriter writer) throws IOException {
+
+ writer.write("<H2>" + LABEL_PLANNED_ACTIVITY + "</H2>");
+
+ writer.write("<table border=\"1\" width=\"100%\" id=\"plannedActivityTable\">");
+ writer.write("<tr>");
+ writer
+ .write("<td width=\"59\"><b>Type</b></td><td width=\"55\"><b>Priority</b></td><td width=\"495\"><b>Description</b></td>");
+ writer.write("<td><b>Elapsed</b></td><td><b>Estimated</b></td><td><b>Reminder</b></td>");
+ writer.write("</tr>");
+
+ for (Object element : planContentProvider.getElements(null)) {
+ if (element instanceof ITask) {
+ ITask currentTask = (ITask) element;
+
+ String formatString = "dd-MM-yyyy";
+ SimpleDateFormat format = new SimpleDateFormat(formatString, Locale.ENGLISH);
+
+ String elapsedTimeString = DateUtil.getFormattedDuration(currentTask.getElapsedTime(), false);
+ String estimatedTimeString = currentTask.getEstimateTimeHours() + " hours";
+ if (elapsedTimeString.equals(""))
+ elapsedTimeString = BLANK_CELL;
+
+ Date reminderDate = currentTask.getReminderDate();
+ String reminderDateString = BLANK_CELL;
+ if (reminderDate != null) {
+ reminderDateString = format.format(reminderDate);
+ }
+
+ writer.write("<tr>");
+ writer.write("<td width=\"59\">ICON</td><td width=\"55\">" + currentTask.getPriority()
+ + "</td><td width=\"495\">");
+ if (currentTask.hasValidUrl()) {
+ writer.write("<a href='" + currentTask.getUrl() + "'>" + currentTask.getDescription() + "</a>");
+ } else {
+ writer.write(currentTask.getDescription());
+ }
+ writer.write("</td><td>" + elapsedTimeString + "</td><td>" + estimatedTimeString + "</td><td>"
+ + reminderDateString + "</td>");
+ writer.write("</tr>");
+
+ }
+ }
+ writer.write("</table>");
+ writer.write("<BR></BR>");
+ writer.write("<H3>" + totalEstimatedHoursLabel.getText() + "</H3>");
+
+ }
+
+ private void exportActivitySection(BufferedWriter writer) throws IOException {
+
+ writer.write("<H2>" + LABEL_PAST_ACTIVITY + "</H2>");
+
+ writer.write("<table border=\"1\" width=\"100%\" id=\"activityTable\">");
+ writer.write("<tr>");
+ writer
+ .write("<td width=\"59\"><b>Type</b></td><td width=\"55\"><b>Priority</b></td><td width=\"495\"><b>Description</b></td>");
+ writer
+ .write("<td><b>Created</b></td><td><b>Completed</b></td><td><b>Elapsed</b></td><td><b>Estimated</b></td>");
+ writer.write("</tr>");
+
+ for (Object element : activityContentProvider.getElements(null)) {
+ if (element instanceof ITask) {
+ ITask currentTask = (ITask) element;
+
+ String formatString = "dd-MM-yyyy";
+ SimpleDateFormat format = new SimpleDateFormat(formatString, Locale.ENGLISH);
+
+ String elapsedTimeString = DateUtil.getFormattedDuration(currentTask.getElapsedTime(), false);
+ String estimatedTimeString = currentTask.getEstimateTimeHours() + " hours";
+ if (elapsedTimeString.equals(""))
+ elapsedTimeString = NO_TIME_ELAPSED;
+
+ Date creationDate = currentTask.getCreationDate();
+ String creationDateString = BLANK_CELL;
+ if (creationDate != null) {
+ creationDateString = format.format(creationDate);
+ }
+
+ String completionDateString = BLANK_CELL;
+ Date completedDate = currentTask.getCompletionDate();
+ if (completedDate != null) {
+ completionDateString = format.format(completedDate);
+ }
+
+ writer.write("<tr>");
+ writer.write("<td width=\"59\">ICON</td><td width=\"55\">" + currentTask.getPriority()
+ + "</td><td width=\"495\">");
+
+ if (currentTask.hasValidUrl()) {
+ writer.write("<a href='" + currentTask.getUrl() + "'>" + currentTask.getDescription() + "</a>");
+ } else {
+ writer.write(currentTask.getDescription());
+ }
+
+ writer.write("</td><td>" + creationDateString+ "</td>");
+ writer.write("<td>" + completionDateString + "</td><td>" + elapsedTimeString + "</td><td>"
+ + estimatedTimeString + "</td>");
+ writer.write("</tr>");
+
+ }
+ }
+ writer.write("</table>");
+
+ }
+
+ private void exportSummarySection(BufferedWriter writer) throws IOException {
+ Date startDate = editorInput.getReportStartDate();
+ writer.write("<H2>" + LABEL_DIALOG + "</H2>");
+
+ String formatString = "yyyy-MM-dd, h:mm a";
+ SimpleDateFormat format = new SimpleDateFormat(formatString, Locale.ENGLISH);
+
+ writer.write("<table border=\"0\" width=\"75%\" id=\"table1\">\n<tr>\n");
+ writer.write("<td width=\"138\">Activity since:</td> ");
+ String dateLabel = "Not Available";
+ if (startDate != null) {
+ dateLabel = format.format(startDate);
+ }
+ writer.write("<td>" + dateLabel + "</td>");
+ writer.write("<td width=\"169\">&nbsp;</td><td width=\"376\">&nbsp;</td>\n</tr>");
+
+ writer.write("<tr><td width=\"138\">Number Completed:</td><td>" + editorInput.getCompletedTasks().size()
+ + "</td>");
+
+ writer.write("<td width=\"169\">Total time on completed:</td><td width=\"376\">"
+ + DateUtil.getFormattedDuration(editorInput.getTotalTimeSpentOnCompletedTasks(), false) + "</td>");
+ writer.write("</tr>");
+
+ writer.write("<tr><td width=\"138\">Number in Progress:</td><td>" + editorInput.getInProgressTasks().size()
+ + "</td>");
+ writer.write("<td width=\"169\">Total time on incompleted:</td><td width=\"376\">"
+ + DateUtil.getFormattedDuration(editorInput.getTotalTimeSpentOnInProgressTasks(), false) + "</td>");
+ writer.write("</tr>");
+
+ writer.write("<tr><td width=\"138\">Total estimated time:</td><td>" + totalEstimatedHoursLabel.getText()
+ + "</td>");
+ writer.write("<td width=\"169\">Total time:</td><td width=\"376\">" + getTotalTime() + "</td>");
+ writer.write("</tr>");
+
+ writer.write("</table>");
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerWizard.java
new file mode 100644
index 000000000..f73af446c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerWizard.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.planner.ui;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.TaskListPreferenceConstants;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+
+/**
+ * @author Ken Sueda
+ * @author Mik Kersten
+ */
+public class TaskPlannerWizard extends Wizard implements INewWizard {
+
+ private TaskPlannerWizardPage planningGamePage;
+
+ public TaskPlannerWizard() {
+ super();
+ init();
+ }
+
+ @Override
+ public boolean performFinish() {
+ try {
+ IWorkbenchPage page = MylarTaskListPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow()
+ .getActivePage();
+ if (page == null)
+ return false;
+ IEditorInput input = new TaskPlannerEditorInput(planningGamePage.getReportStartDate(), planningGamePage
+ .getSelectedFilters(), MylarTaskListPlugin.getTaskListManager().getTaskList());
+ page.openEditor(input, TaskListPreferenceConstants.PLANNER_EDITOR_ID);
+ } catch (PartInitException ex) {
+ MylarStatusHandler.log(ex, "couldn't open summary editor");
+ }
+ return true;
+ }
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ }
+
+ private void init() {
+ planningGamePage = new TaskPlannerWizardPage();
+ super.setForcePreviousAndNextButtons(true);
+ }
+
+ @Override
+ public void addPages() {
+ addPage(planningGamePage);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerWizardPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerWizardPage.java
new file mode 100644
index 000000000..ab27e79aa
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/planner/ui/TaskPlannerWizardPage.java
@@ -0,0 +1,323 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.planner.ui;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylar.internal.tasklist.ui.views.DatePicker;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskElementLabelProvider;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
+import org.eclipse.mylar.provisional.tasklist.ITaskContainer;
+import org.eclipse.mylar.provisional.tasklist.ITaskListElement;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskListManager;
+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.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.Group;
+import org.eclipse.swt.widgets.Label;
+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 Mik Kersten
+ * @author Ken Sueda (original prototype)
+ * @author Rob Elves (categories)
+ */
+public class TaskPlannerWizardPage extends WizardPage {
+
+ private static final int DEFAULT_DAYS = 1;
+
+ private static final String TITLE = "Mylar Task Planner";
+
+ private static final String DESCRIPTION = "Summarizes task activity and assists planning future tasks.";
+
+ public static final String ROOT_CATEGORY_HACK = "Root Tasks";
+
+ private long DAY = 24 * 3600 * 1000;
+
+ protected String[] columnNames = new String[] { "", "Description" };
+
+ private Date reportStartDate = null;
+
+ private Button daysRadioButton = null;
+
+ private Button dateRadioButton = null;
+
+ private Text numDays;
+
+ private int numDaysToReport = 0;
+
+ private Table filtersTable;
+
+ private TaskElementLabelProvider labelProvider = new TaskElementLabelProvider();
+
+ public TaskPlannerWizardPage() {
+ super(TITLE);
+ setTitle(TITLE);
+ setDescription(DESCRIPTION);
+ }
+
+ public void createControl(Composite parent) {
+ Composite container = new Composite(parent, SWT.FILL);
+ GridLayout layout = new GridLayout();
+ container.setLayout(layout);
+ layout.numColumns = 1;
+
+ createReportPeriodGroup(container);
+
+ Label spacer = new Label(container, SWT.NONE);
+ spacer.setText(" ");
+
+ createCategorySelectionGroup(container);
+
+ setControl(container);
+ numDays.setFocus();
+ }
+
+ private void createReportPeriodGroup(Composite parent) {
+ Group reportPeriodGroup = new Group(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 2;
+ reportPeriodGroup.setLayout(layout);
+ reportPeriodGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
+ reportPeriodGroup.setText("Report Period");
+ reportPeriodGroup.setFont(parent.getFont());
+
+ daysRadioButton = new Button(reportPeriodGroup, SWT.RADIO | SWT.LEFT | SWT.NO_FOCUS);
+ daysRadioButton.setText("Number of days prior: ");
+ daysRadioButton.setSelection(true);
+
+ numDays = new Text(reportPeriodGroup, SWT.BORDER);
+ GridData gd = new GridData();
+ gd.widthHint = 50;
+ numDays.setLayoutData(gd);
+ numDays.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ try {
+ numDaysToReport = Integer.parseInt(numDays.getText());
+ setErrorMessage(null);
+ } catch (Exception ex) {
+ setErrorMessage("Must be integer");
+ numDaysToReport = 0;
+ }
+ }
+ });
+
+ numDays.setText("" + DEFAULT_DAYS);
+ numDaysToReport = DEFAULT_DAYS;
+
+ dateRadioButton = new Button(reportPeriodGroup, SWT.RADIO | SWT.LEFT | SWT.NO_FOCUS);
+ dateRadioButton.setText("Report start date: ");
+
+ final DatePicker datePicker = new DatePicker(reportPeriodGroup, SWT.BORDER, "<start date>");
+ datePicker.setEnabled(false);
+ datePicker.addPickerSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent arg0) {
+ if (datePicker.getDate() != null) {
+ reportStartDate = datePicker.getDate().getTime();
+ }
+ }
+
+ public void widgetDefaultSelected(SelectionEvent arg0) {
+ // ignore
+ }
+ });
+
+ SelectionListener radioListener = new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent e) {
+ numDays.setEnabled(daysRadioButton.getSelection());
+ datePicker.setEnabled(dateRadioButton.getSelection());
+ if (daysRadioButton.getSelection())
+ numDays.setFocus();
+ if (dateRadioButton.getSelection())
+ datePicker.setFocus();
+ }
+
+ };
+
+ daysRadioButton.addSelectionListener(radioListener);
+ dateRadioButton.addSelectionListener(radioListener);
+
+ }
+
+ /**
+ * Selection of specific category to report on in the Task Planner
+ *
+ * @param composite
+ * container to add categories combo box to
+ */
+ private void createCategorySelectionGroup(Composite composite) {
+
+ Group categorySelectionGroup = new Group(composite, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ categorySelectionGroup.setLayout(layout);
+ categorySelectionGroup.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL));
+ categorySelectionGroup.setText("Catagory Selection");
+ categorySelectionGroup.setFont(composite.getFont());
+
+ createFilterTable(categorySelectionGroup, true);
+ TaskListManager manager = MylarTaskListPlugin.getTaskListManager();
+ if (manager == null) {
+ filtersTable.setEnabled(false);
+ return;
+ }
+
+ // TODO: Hack to allow selection of a 'root tasks' category
+ TableItem rootItem = new TableItem(filtersTable, SWT.NONE);
+ rootItem.setText(ROOT_CATEGORY_HACK);
+ rootItem.setData(ROOT_CATEGORY_HACK);
+
+ // populate categories
+ for (ITaskContainer category : manager.getTaskList().getTaskCategories()) {
+ TableItem item = new TableItem(filtersTable, SWT.NONE);
+ item.setImage(labelProvider.getImage(category));
+ item.setText(category.getDescription());
+ item.setData(category);
+ }
+
+ // populate qeries
+ for (AbstractRepositoryQuery query : manager.getTaskList().getQueries()) {
+ TableItem item = new TableItem(filtersTable, SWT.NONE);
+ item.setImage(labelProvider.getImage(query));
+ item.setText(query.getDescription());
+ item.setData(query);
+ }
+ for (int i = 0; i < columnNames.length; i++) {
+ filtersTable.getColumn(i).pack();
+ }
+
+ createButtonsGroup(categorySelectionGroup);
+
+ // default to all categories selected
+ setChecked(true);
+ }
+
+ /**
+ *
+ * Creates the buttons for selecting all or none of the categories.
+ *
+ * @param parent
+ * parent composite
+ */
+ private final void createButtonsGroup(Composite parent) {
+
+ Font font = parent.getFont();
+ new Label(parent, SWT.NONE); // Blank cell on left
+
+ Composite buttonComposite = new Composite(parent, SWT.NONE);
+ buttonComposite.setFont(parent.getFont());
+
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 3;
+ layout.makeColumnsEqualWidth = true;
+ buttonComposite.setLayout(layout);
+ buttonComposite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
+
+ Button selectButton = new Button(buttonComposite, SWT.NONE);
+ selectButton.setText("Select All");
+
+ selectButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ setChecked(true);
+ }
+ });
+
+ selectButton.setFont(font);
+ setButtonLayoutData(selectButton);
+
+ Button deselectButton = new Button(buttonComposite, SWT.NONE);
+ deselectButton.setText("Deselect All");
+
+ deselectButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ setChecked(false);
+ }
+ });
+
+ deselectButton.setFont(font);
+ setButtonLayoutData(deselectButton);
+
+ }
+
+ private void setChecked(boolean checked) {
+ for (TableItem item : filtersTable.getItems()) {
+ item.setChecked(checked);
+ }
+ }
+
+ private void createFilterTable(Composite composite, boolean enabled) {
+
+ Font font = composite.getFont();
+ this.filtersTable = new Table(composite, SWT.BORDER | SWT.MULTI | SWT.CHECK | SWT.H_SCROLL | SWT.V_SCROLL);
+ this.filtersTable.setEnabled(enabled);
+ GridData data = new GridData();
+ // Set heightHint with a small value so the list size will be defined by
+ // the space available in the dialog instead of resizing the dialog to
+ // fit all the items in the list.
+ data.heightHint = filtersTable.getItemHeight();
+ data.verticalAlignment = GridData.FILL;
+ data.horizontalAlignment = GridData.FILL;
+ data.grabExcessHorizontalSpace = true;
+ data.grabExcessVerticalSpace = true;
+ this.filtersTable.setLayoutData(data);
+ this.filtersTable.setFont(font);
+
+ for (int i = 0; i < columnNames.length; i++) {
+ TableColumn column = new TableColumn(filtersTable, SWT.NONE);
+ column.setText(columnNames[i]);
+ }
+
+ }
+
+ public Set<ITaskListElement> getSelectedFilters() {
+ Set<ITaskListElement> result = new HashSet<ITaskListElement>();
+ TableItem[] items = filtersTable.getItems();
+ for (TableItem item : items) {
+ if (item.getChecked() && item.getData() instanceof ITaskListElement) {
+ result.add((ITaskListElement)item.getData());
+ }
+ }
+ return result;
+ }
+
+ public Date getReportStartDate() {
+ if (dateRadioButton.getSelection() && reportStartDate != null) {
+ return reportStartDate;
+ } else {
+ long today = new Date().getTime();
+ long lastDay = numDaysToReport * DAY;
+
+ int offsetToday = Calendar.getInstance().get(Calendar.HOUR) * 60 * 60 * 1000
+ + Calendar.getInstance().get(Calendar.MINUTE) * 60 * 1000
+ + Calendar.getInstance().get(Calendar.SECOND) * 1000;
+ return new Date(today - offsetToday - lastDay);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/AbstractTaskFilter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/AbstractTaskFilter.java
new file mode 100644
index 000000000..8d02c55c6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/AbstractTaskFilter.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui;
+
+import org.eclipse.mylar.provisional.tasklist.ITask;
+
+/**
+ * @author Ken Sueda
+ */
+public abstract class AbstractTaskFilter {
+
+ public abstract boolean select(Object element);
+
+ protected boolean shouldAlwaysShow(ITask task) {
+ return task.isActive() || (task.isPastReminder() && !task.isCompleted());
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ComboSelectionDialog.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ComboSelectionDialog.java
new file mode 100644
index 000000000..e924c65dd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ComboSelectionDialog.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.util.Assert;
+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);
+ Assert.isNotNull(shellTitle);
+ Assert.isNotNull(labelText);
+ Assert.isTrue(comboStrings.length > 0);
+ Assert.isTrue(initialSelectionIndex >= 0 && initialSelectionIndex < comboStrings.length);
+ 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)
+ */
+ 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 (int i = 0; i < fAllowedStrings.length; i++) {
+ combo.add(fAllowedStrings[i]);
+ }
+ combo.select(fInitialSelectionIndex);
+ fSelection = combo.getItem(combo.getSelectionIndex());
+ GridData gd = new GridData();
+ gd.widthHint = convertWidthInCharsToPixels(getMaxStringLength());
+ combo.setLayoutData(gd);
+ combo.addSelectionListener(new SelectionAdapter() {
+ 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 (int i = 0; i < fAllowedStrings.length; i++) {
+ max = Math.max(max, fAllowedStrings[i].length());
+ }
+ return max;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/IDynamicSubMenuContributor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/IDynamicSubMenuContributor.java
new file mode 100644
index 000000000..eaa6f7a35
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/IDynamicSubMenuContributor.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui;
+
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.ITaskListElement;
+
+public interface IDynamicSubMenuContributor {
+
+ public abstract MenuManager getSubMenuManager(TaskListView view, ITaskListElement selection);
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ITaskEditorFactory.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ITaskEditorFactory.java
new file mode 100644
index 000000000..3713e3dd3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ITaskEditorFactory.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.mylar.internal.tasklist.ui;
+
+import org.eclipse.mylar.internal.tasklist.ui.editors.MylarTaskEditor;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+
+/**
+ * @author Mik Kersten
+ */
+public interface ITaskEditorFactory {
+
+ public IEditorPart createEditor(MylarTaskEditor parentEditor);
+
+ public IEditorInput createEditorInput(ITask task);
+
+ public boolean providesOutline();
+
+ public String getTitle();
+
+ public void notifyEditorActivationChange(IEditorPart editor);
+
+ public boolean canCreateEditorFor(ITask task);
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ITaskHighlighter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ITaskHighlighter.java
new file mode 100644
index 000000000..ff563b7c1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ITaskHighlighter.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui;
+
+import org.eclipse.mylar.provisional.tasklist.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/tasklist/ui/ITaskListNotification.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ITaskListNotification.java
new file mode 100644
index 000000000..a6e0e8a88
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ITaskListNotification.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui;
+
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Rob Elves
+ */
+public interface ITaskListNotification {
+
+ public void openResource();
+ public String getDescription();
+ public String getToolTip();
+ public Image getNotificationIcon();
+ public void setNotified(boolean notified);
+ public boolean isNotified();
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ITaskListNotificationProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ITaskListNotificationProvider.java
new file mode 100644
index 000000000..52e55496b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/ITaskListNotificationProvider.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui;
+
+import java.util.Set;
+
+
+public interface ITaskListNotificationProvider {
+
+ Set<ITaskListNotification> getNotifications();
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/RepositoryTaskDecorator.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/RepositoryTaskDecorator.java
new file mode 100644
index 000000000..af82bd5d5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/RepositoryTaskDecorator.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.mylar.internal.tasklist.ui;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.jface.viewers.IDecoration;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ILightweightLabelDecorator;
+import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask.RepositoryTaskSyncState;
+
+/**
+ * @author Mik Kersten
+ */
+public class RepositoryTaskDecorator implements ILightweightLabelDecorator {
+
+ public void decorate(Object element, IDecoration decoration) {
+ if (element instanceof AbstractRepositoryQuery) {
+ AbstractRepositoryQuery query = (AbstractRepositoryQuery)element;
+ String repositoryUrl = query.getRepositoryUrl();
+ if (repositoryUrl != null) {
+ try {
+ URL url = new URL(repositoryUrl);
+ decoration.addSuffix(" [" + url.getHost() + "]");
+ } catch (MalformedURLException e) {
+ decoration.addSuffix(" [ <unknown host> ]");
+ }
+ }
+ } else if (element instanceof AbstractRepositoryTask) {
+ AbstractRepositoryTask repositoryTask = (AbstractRepositoryTask)element;
+ if (repositoryTask.getSyncState() == RepositoryTaskSyncState.OUTGOING) {
+ decoration.addOverlay(TaskListImages.OVERLAY_OUTGOING, IDecoration.TOP_RIGHT);
+ } else if (repositoryTask.getSyncState() == RepositoryTaskSyncState.INCOMING) {
+ decoration.addOverlay(TaskListImages.OVERLAY_INCOMMING, IDecoration.TOP_RIGHT);
+ } else if (repositoryTask.getSyncState() == RepositoryTaskSyncState.CONFLICT) {
+ decoration.addOverlay(TaskListImages.OVERLAY_CONFLICT, IDecoration.TOP_RIGHT);
+ }
+ } else if (element instanceof AbstractQueryHit) {
+ ITask correspondingTask = ((AbstractQueryHit)element).getCorrespondingTask();
+ if (correspondingTask == null) {
+ decoration.addOverlay(TaskListImages.OVERLAY_INCOMMING, IDecoration.TOP_RIGHT);
+ } else {
+ decorate(correspondingTask, decoration);
+ }
+ }
+ }
+
+ 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/tasklist/ui/SynchronizeReportsAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/SynchronizeReportsAction.java
new file mode 100644
index 000000000..390b73b60
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/SynchronizeReportsAction.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.mylar.internal.tasklist.ui;
+
+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.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryClient;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskCategory;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+
+/**
+ * @author Ken Sueda and Mik Kersten
+ */
+public class SynchronizeReportsAction extends Action implements IViewActionDelegate {
+
+ private static final String LABEL = "Synchronize Repsitory Tasks";
+
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.synchronize";
+
+ private AbstractRepositoryQuery query = null;
+
+ public SynchronizeReportsAction() {
+ setText(LABEL);
+ setToolTipText(LABEL);
+ setId(ID);
+ setImageDescriptor(TaskListImages.REPOSITORY_SYNCHRONIZE);
+ }
+
+ public SynchronizeReportsAction(AbstractRepositoryQuery query) {
+ this();
+ this.query = query;
+ }
+
+ @Override
+ public void run() {
+ if (query != null) {
+ AbstractRepositoryClient client = MylarTaskListPlugin.getRepositoryManager().getRepositoryClient(query.getRepositoryKind());
+ if (client != null) client.synchronize(query);
+ } else if (TaskListView.getDefault() != null) {
+ ISelection selection = TaskListView.getDefault().getViewer().getSelection();
+ for (Object obj : ((IStructuredSelection) selection).toList()) {
+ if (obj instanceof AbstractRepositoryQuery) {
+ AbstractRepositoryQuery repositoryQuery = (AbstractRepositoryQuery) obj;
+ AbstractRepositoryClient client = MylarTaskListPlugin.getRepositoryManager().getRepositoryClient(repositoryQuery.getRepositoryKind());
+ if (client != null) client.synchronize(repositoryQuery);
+ } else if (obj instanceof TaskCategory) {
+ TaskCategory cat = (TaskCategory) obj;
+ for (ITask task : cat.getChildren()) {
+ if (task instanceof AbstractRepositoryTask) {
+ AbstractRepositoryClient client = MylarTaskListPlugin.getRepositoryManager().getRepositoryClient(task.getRepositoryKind());
+ if (client != null) client.requestRefresh((AbstractRepositoryTask)task);
+ }
+ }
+ } else if (obj instanceof AbstractRepositoryTask) {
+ AbstractRepositoryTask bugTask = (AbstractRepositoryTask)obj;
+ AbstractRepositoryClient client = MylarTaskListPlugin.getRepositoryManager().getRepositoryClient(bugTask.getRepositoryKind());
+ if (client != null) client.requestRefresh(bugTask);
+ } else if (obj instanceof AbstractQueryHit) {
+ AbstractQueryHit hit = (AbstractQueryHit) obj;
+ if (hit.getCorrespondingTask() != null) {
+ AbstractRepositoryClient client = MylarTaskListPlugin.getRepositoryManager().getRepositoryClient(hit.getCorrespondingTask().getRepositoryKind());
+ if (client != null) client.requestRefresh(hit.getCorrespondingTask());
+ }
+ }
+ }
+ }
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ if (TaskListView.getDefault() != null)
+ 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.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskCompleteFilter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskCompleteFilter.java
new file mode 100644
index 000000000..dfc79d87f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskCompleteFilter.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.mylar.internal.tasklist.ui;
+
+import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+
+/**
+ * @author Ken Sueda
+ */
+public class TaskCompleteFilter extends AbstractTaskFilter {
+
+ public boolean select(Object element) {
+ if (element instanceof ITask) {
+ ITask task = (ITask) element;
+ if (shouldAlwaysShow(task)) {
+ return true;
+ }
+ return !task.isCompleted();
+ } else if (element instanceof AbstractQueryHit) {
+ AbstractQueryHit hit = (AbstractQueryHit) element;
+ if (hit.getCorrespondingTask() != null) {
+ if (shouldAlwaysShow(hit.getCorrespondingTask())) {
+ return true;
+ } else {
+ return !hit.getCorrespondingTask().isCompleted();
+ }
+ } else {
+ return true;
+ }
+ }
+// else if (element instanceof ITaskListElement) {
+// ITaskListElement taskElement = (ITaskListElement) element;
+// return !taskElement.isCompleted();
+// }
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListImages.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListImages.java
new file mode 100644
index 000000000..2c2e45e56
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListImages.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
+ *******************************************************************************/
+/*
+ * Created on Apr 20, 2004
+ */
+package org.eclipse.mylar.internal.tasklist.ui;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListImages {
+
+ private static ImageRegistry imageRegistry;
+
+ public static final Color BACKGROUND_WHITE = new Color(Display.getDefault(), 255, 255, 255);
+
+ public static final Color BACKGROUND_ARCHIVE = new Color(Display.getDefault(), 199, 199, 237);
+
+ public static final Color GRAY_LIGHT = new Color(Display.getDefault(), 170, 170, 170);
+
+ public static final Color COLOR_TASK_COMPLETED = new Color(Display.getDefault(), 170, 170, 170); // TODO:
+
+ public static final Color COLOR_TASK_ACTIVE = new Color(Display.getDefault(), 36, 22, 50);
+
+ public static final Color COLOR_TASK_OVERDUE = new Color(Display.getDefault(), 200, 10, 30);
+
+ public static final Font BOLD = JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT);
+
+ public static final Font ITALIC = JFaceResources.getFontRegistry().getItalic(JFaceResources.DEFAULT_FONT);
+
+ private static final String T_ELCL = "elcl16";
+
+ private static final String T_EVIEW = "eview16";
+
+ private static final String T_TOOL = "etool16";
+
+ private static final URL baseURL = MylarTaskListPlugin.getDefault().getBundle().getEntry("/icons/");
+
+ public static final ImageDescriptor TASKLIST = create("eview16", "task-list.gif");
+
+ public static final ImageDescriptor REPOSITORY = create("eview16", "repository.gif");
+
+ public static final ImageDescriptor REPOSITORY_NEW = create("etool16", "repository-new.gif");
+
+ public static final ImageDescriptor REPOSITORIES = create("eview16", "repositories.gif");
+
+ public static final ImageDescriptor REMOVE = create(T_ELCL, "remove.gif");
+
+ public static final ImageDescriptor FILTER_COMPLETE = create(T_ELCL, "filter-complete.gif");
+
+ public static final ImageDescriptor FILTER_PRIORITY = create(T_ELCL, "filter-priority.gif");
+
+ public static final ImageDescriptor COLOR_PALETTE = create(T_ELCL, "color-palette.gif");
+
+ public static final ImageDescriptor TASK = create(T_TOOL, "task.gif");
+
+ public static final ImageDescriptor TASK_NEW = create(T_TOOL, "task-new.gif");
+
+ public static final ImageDescriptor OVERLAY_WEB = create(T_TOOL, "overlay-web.gif");
+
+ public static final ImageDescriptor TASK_WEB = createWithOverlay(TASK, OVERLAY_WEB, false, true);
+
+ public static final ImageDescriptor TASK_WEB_REMOTE = create(T_TOOL, "overlay-web.gif");
+
+ public static final ImageDescriptor CATEGORY = create(T_TOOL, "category.gif");
+
+ public static final ImageDescriptor CATEGORY_NEW = create(T_TOOL, "category-new.gif");
+
+ public static final ImageDescriptor CATEGORY_ARCHIVE = create(T_TOOL, "category-archive.gif");
+
+ public static final ImageDescriptor TASK_REMOTE = create(T_TOOL, "task-remote.gif");
+
+ public static final ImageDescriptor TASK_REPOSITORY = create(T_TOOL, "task-repository.gif");
+
+ public static final ImageDescriptor TASK_REPOSITORY_NEW = create(T_TOOL, "task-repository-new.gif");
+
+ public static final ImageDescriptor OVERLAY_INCOMMING = create(T_EVIEW, "overlay-incoming.gif");
+
+ public static final ImageDescriptor OVERLAY_OUTGOING = create(T_EVIEW, "overlay-outgoing.gif");
+
+ public static final ImageDescriptor OVERLAY_CONFLICT = create(T_EVIEW, "overlay-conflicting.gif");
+
+ public static final ImageDescriptor OVERLAY_REPOSITORY = create(T_EVIEW, "overlay-repository.gif");
+
+ public static final ImageDescriptor TASK_REPOSITORY_INCOMMING = createWithOverlay(TASK_REPOSITORY,
+ OVERLAY_INCOMMING, true, false);
+
+ public static final ImageDescriptor TASK_REPOSITORY_CONFLICT = createWithOverlay(TASK_REPOSITORY, OVERLAY_CONFLICT,
+ true, false);
+
+ public static final ImageDescriptor TASK_REPOSITORY_OUTGOING = createWithOverlay(TASK_REPOSITORY, OVERLAY_OUTGOING,
+ true, false);
+
+ public static final ImageDescriptor QUERY = create(T_TOOL, "query.gif");
+
+ public static final ImageDescriptor QUERY_NEW = create(T_TOOL, "query-new.gif");
+
+ public static final ImageDescriptor REPOSITORY_SYNCHRONIZE = create(T_TOOL, "repository-synchronize.gif");
+
+ public static final ImageDescriptor NAVIGATE_PREVIOUS = create(T_TOOL, "navigate-previous.gif");
+
+ public static final ImageDescriptor NAVIGATE_NEXT = create(T_TOOL, "navigate-next.gif");
+
+ public static final ImageDescriptor COPY = create(T_TOOL, "copy.png");
+
+ public static final ImageDescriptor GO_UP = create(T_TOOL, "go-up.gif");
+
+ public static final ImageDescriptor GO_INTO = create(T_TOOL, "go-into.gif");
+
+ public static final ImageDescriptor TASK_ACTIVE = create(T_TOOL, "task-active.gif");
+
+ public static final ImageDescriptor TASK_INACTIVE = create(T_TOOL, "task-inactive.gif");
+
+ public static final ImageDescriptor TASK_INACTIVE_CONTEXT = create(T_TOOL, "task-context.gif");
+
+ public static final ImageDescriptor TASK_COMPLETE = create(T_TOOL, "task-complete.gif");
+
+ public static final ImageDescriptor TASK_INCOMPLETE = create(T_TOOL, "task-incomplete.gif");
+
+ public static final ImageDescriptor COLLAPSE_ALL = create(T_ELCL, "collapseall.png");
+
+ private static ImageDescriptor create(String prefix, String name) {
+ try {
+ return ImageDescriptor.createFromURL(makeIconFileURL(prefix, name));
+ } catch (MalformedURLException e) {
+ return ImageDescriptor.getMissingImageDescriptor();
+ }
+ }
+
+ private static ImageDescriptor createWithOverlay(ImageDescriptor base, ImageDescriptor overlay, boolean top,
+ boolean left) {
+ return new TaskListOverlayDescriptor(base, overlay, top, left);
+ }
+
+ 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.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListNotificationManager.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListNotificationManager.java
new file mode 100644
index 000000000..afff7d4e6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListNotificationManager.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui;
+
+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.swt.events.ShellEvent;
+import org.eclipse.swt.events.ShellListener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Rob Elves
+ */
+public class TaskListNotificationManager {
+
+ private static final String CLOSE_NOTIFICATION_JOB = "Close Notification Job";
+
+ private static final String OPEN_NOTIFICATION_JOB = "Open Notification Job";
+
+ private static final long CLOSE_POPUP_DELAY = 1000 * 10;
+
+ private static final long OPEN_POPUP_DELAY = 1000 * 60;
+
+ private static final boolean runSystem = true;
+
+ private TaskListNotificationPopup popup;
+
+ private List<ITaskListNotification> notifications = new ArrayList<ITaskListNotification>();
+
+ private List<ITaskListNotification> currentlyNotifying = Collections.synchronizedList(notifications);
+
+ private List<ITaskListNotificationProvider> notificationProviders = new ArrayList<ITaskListNotificationProvider>();
+
+ private Job openJob = new Job(OPEN_NOTIFICATION_JOB) {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+
+ try {
+
+ if (!PlatformUI.getWorkbench().getDisplay().isDisposed()) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if ((popup != null && popup.close()) || popup == null) {
+ closeJob.cancel();
+ collectNotifications();
+ synchronized (TaskListNotificationManager.class) {
+ if (currentlyNotifying.size() > 0) {
+ popup = new TaskListNotificationPopup(new Shell(PlatformUI.getWorkbench().getDisplay()));
+ popup.setContents(new ArrayList<ITaskListNotification>(currentlyNotifying));
+ cleanNotified();
+ popup.setBlockOnOpen(false);
+ popup.open();
+ closeJob.setSystem(runSystem);
+ closeJob.schedule(CLOSE_POPUP_DELAY);
+ popup.getShell().addShellListener(SHELL_LISTENER);
+ }
+ }
+ }
+
+ }
+ });
+ }
+ } finally {
+ schedule(OPEN_POPUP_DELAY);
+ }
+
+ if (monitor.isCanceled())
+ return Status.CANCEL_STATUS;
+
+ return Status.OK_STATUS;
+ }
+
+ };
+
+ private Job closeJob = new Job(CLOSE_NOTIFICATION_JOB) {
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ if (!PlatformUI.getWorkbench().getDisplay().isDisposed()) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (popup != null) {
+ synchronized (popup) {
+ popup.close();
+ }
+ }
+ }
+ });
+ }
+ if (monitor.isCanceled())
+ return Status.CANCEL_STATUS;
+
+ return Status.OK_STATUS;
+ }
+
+ };
+
+ private ShellListener SHELL_LISTENER = new ShellListener() {
+
+ public void shellClosed(ShellEvent arg0) {
+ }
+
+ public void shellDeactivated(ShellEvent arg0) {
+ popup.close();
+ // don't want notifications right away
+ openJob.cancel();
+ openJob.schedule(OPEN_POPUP_DELAY);
+ }
+
+ public void shellActivated(ShellEvent arg0) {
+ closeJob.cancel();
+ }
+
+ public void shellDeiconified(ShellEvent arg0) {
+ // ingore
+ }
+
+ public void shellIconified(ShellEvent arg0) {
+ // ignore
+ }
+ };
+
+ private void cleanNotified() {
+ for (ITaskListNotification notification : currentlyNotifying) {
+ notification.setNotified(true);
+ }
+ currentlyNotifying.clear();
+ }
+
+ private void collectNotifications() {
+ for (ITaskListNotificationProvider provider : notificationProviders) {
+ currentlyNotifying.addAll(provider.getNotifications());
+ }
+ }
+
+ public void startNotification(long initialStartupTime) {
+ 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 List<ITaskListNotification> getNotifications() {
+ synchronized (TaskListNotificationManager.class) {
+ return currentlyNotifying;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListNotificationPopup.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListNotificationPopup.java
new file mode 100644
index 000000000..ef7dbb753
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListNotificationPopup.java
@@ -0,0 +1,227 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui;
+
+import java.util.List;
+
+import org.eclipse.jface.dialogs.PopupDialog;
+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.graphics.Rectangle;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowData;
+import org.eclipse.swt.layout.RowLayout;
+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.Shell;
+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.Form;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Rob Elves
+ */
+public class TaskListNotificationPopup extends PopupDialog {
+
+ private static final int BUTTON_FONT_SIZE = 7;
+
+ static boolean takeFocusOnOpen = false;
+
+ static boolean persistBounds = false;
+
+ static boolean showDialogMenu = false;
+
+ static boolean showPersistAction = false;
+
+ static String titleText;
+
+ static final String MYLAR_NOTIFICATION_LABEL = "Mylar Notification";
+
+ static String infoText = null;
+
+ private FormToolkit toolkit;
+
+ private Form form;
+
+ private Rectangle bounds;
+
+ List<ITaskListNotification> notifications;
+
+ private Composite sectionClient;
+
+ public TaskListNotificationPopup(Shell parent) {
+ super(parent, PopupDialog.INFOPOPUP_SHELLSTYLE | SWT.ON_TOP, takeFocusOnOpen, persistBounds, showDialogMenu,
+ showPersistAction, titleText, infoText);
+ }
+
+ public void setContents(List<ITaskListNotification> notifications) {
+ this.notifications = notifications;
+ }
+
+ protected Control createContents(Composite parent) {
+ getShell().setBackground(getShell().getDisplay().getSystemColor(SWT.COLOR_GRAY));
+ return createDialogArea(parent);
+ }
+
+ protected final Control createDialogArea(final Composite parent) {
+
+ getShell().setText(MYLAR_NOTIFICATION_LABEL);
+
+ toolkit = new FormToolkit(parent.getDisplay());
+ form = toolkit.createForm(parent);
+ form.getBody().setLayout(new GridLayout());
+
+ Section section = toolkit.createSection(form.getBody(), Section.TITLE_BAR);
+
+ section.setText(MYLAR_NOTIFICATION_LABEL);
+ section.setLayout(new GridLayout());
+
+ sectionClient = toolkit.createComposite(section);
+ sectionClient.setLayout(new GridLayout());
+ for (final ITaskListNotification notification : notifications) {
+ ImageHyperlink link = toolkit.createImageHyperlink(sectionClient, SWT.WRAP | SWT.TOP);
+ link.setText(notification.getDescription());
+ link.setImage(notification.getNotificationIcon());
+ link.addHyperlinkListener(new HyperlinkAdapter() {
+ public void linkActivated(HyperlinkEvent e) {
+ notification.setNotified(true);
+ notification.openResource();
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ Shell windowShell = window.getShell();
+ if (windowShell != null) {
+// windowShell.moveAbove(null);
+ windowShell.setMaximized(true);
+ windowShell.open();
+ }
+ }
+ }
+ });
+ }
+
+ section.setClient(sectionClient);
+
+ Composite buttonsComposite = toolkit.createComposite(sectionClient);
+ buttonsComposite.setLayout(new RowLayout());
+ Button buttonOpenAll = toolkit.createButton(buttonsComposite, "Open All", SWT.NONE);
+
+ {
+ Font initialFont = buttonOpenAll.getFont();
+ FontData[] fontData = initialFont.getFontData();
+ for (int i = 0; i < fontData.length; i++) {
+ fontData[i].setHeight(BUTTON_FONT_SIZE);
+ }
+ Font newFont = new Font(getShell().getDisplay(), fontData);
+ buttonOpenAll.setFont(newFont);
+ }
+ buttonOpenAll.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ for (ITaskListNotification notification : notifications) {
+ notification.setNotified(true);
+ notification.openResource();
+ }
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ Shell windowShell = window.getShell();
+ if (windowShell != null) {
+ windowShell.setMaximized(true);
+ windowShell.open();
+ }
+ }
+ close();
+ }
+ });
+
+ RowData buttonOpenAllRowData = new RowData(45, 15);
+ buttonOpenAll.setLayoutData(buttonOpenAllRowData);
+
+ Button buttonDismiss = toolkit.createButton(buttonsComposite, "Close", SWT.NONE);
+
+ {
+ Font initialFont = buttonDismiss.getFont();
+ FontData[] fontData = initialFont.getFontData();
+ for (int i = 0; i < fontData.length; i++) {
+ fontData[i].setHeight(BUTTON_FONT_SIZE);
+ }
+ Font newFont = new Font(getShell().getDisplay(), fontData);
+ buttonDismiss.setFont(newFont);
+ }
+ buttonDismiss.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ for (ITaskListNotification notification : notifications) {
+ notification.setNotified(true);
+ }
+ close();
+ }
+ });
+
+ RowData buttonDismissRowData = new RowData(30, 15);
+ buttonDismiss.setLayoutData(buttonDismissRowData);
+ // toolkit.paintBordersFor(parent);
+ form.pack();
+ return parent;
+ }
+
+ /**
+ * Initialize the shell's bounds.
+ */
+ public void initializeBounds() {
+ getShell().setBounds(restoreBounds());
+ }
+
+ private Rectangle restoreBounds() {
+ bounds = form.getBounds();
+ Rectangle maxBounds = null;
+ if (getShell() != null && !getShell().isDisposed())
+ maxBounds = getShell().getDisplay().getClientArea();
+ else {
+ // fallback
+ Display display = Display.getCurrent();
+ if (display == null)
+ display = Display.getDefault();
+ if (display != null && !display.isDisposed())
+ maxBounds = display.getBounds();
+ }
+
+ if (bounds.width > -1 && bounds.height > -1) {
+ if (maxBounds != null) {
+ bounds.width = Math.min(bounds.width, maxBounds.width);
+ bounds.height = Math.min(bounds.height, maxBounds.height);
+ }
+ // Enforce an absolute minimal size
+ bounds.width = Math.max(bounds.width, 30);
+ bounds.height = Math.max(bounds.height, 30);
+ }
+
+ if (bounds.x > -1 && bounds.y > -1 && maxBounds != null) {
+ bounds.x = Math.max(bounds.x, maxBounds.x);
+ bounds.y = Math.max(bounds.y, maxBounds.y);
+
+ if (bounds.width > -1 && bounds.height > -1) {
+ bounds.x = maxBounds.width - bounds.width;
+ bounds.y = maxBounds.height - bounds.height;
+ }
+ }
+ return bounds;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListNotificationReminder.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListNotificationReminder.java
new file mode 100644
index 000000000..625ca446f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListNotificationReminder.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.mylar.internal.tasklist.ui;
+
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskElementLabelProvider;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.PlatformUI;
+
+public class TaskListNotificationReminder implements ITaskListNotification {
+
+ private final ITask task;
+
+ private TaskElementLabelProvider labelProvider = new TaskElementLabelProvider();
+
+ public TaskListNotificationReminder(ITask task) {
+ this.task = task;
+ }
+
+ private Image getIcon() {
+ return labelProvider.getImage(task);
+// return task.getIcon();
+ }
+
+ public String getDescription() {
+ if (task.getDescription().length() > 40) {
+ String truncated = task.getDescription().substring(0, 35);
+ return truncated + "...";
+ }
+ return task.getDescription();
+
+ }
+
+ public String getToolTip() {
+ return null;
+ }
+
+ public void openResource() {
+
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ TaskListUiUtil.openEditor(task);
+ }
+ });
+
+ }
+
+ public Image getNotificationIcon() {
+ Image taskImage = getIcon();
+ // TODO: overlay with REMINDER decorator
+ return taskImage;
+ }
+
+ public synchronized void setNotified(boolean notified) {
+ task.setReminded(true);
+ }
+
+ public synchronized boolean isNotified() {
+ return task.hasBeenReminded();
+ }
+
+ /**
+ * equality based on tasks' equality (handle)
+ */
+ public boolean equals(Object o) {
+ if (!(o instanceof TaskListNotificationReminder)) {
+ return false;
+ }
+ TaskListNotificationReminder notification = (TaskListNotificationReminder) o;
+ return notification.getTask().equals(task);
+ }
+
+ private ITask getTask() {
+ return task;
+ }
+
+ public int hashCode() {
+ return task.hashCode();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListOverlayDescriptor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListOverlayDescriptor.java
new file mode 100644
index 000000000..ddfc8378a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListOverlayDescriptor.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui;
+
+import org.eclipse.jface.resource.CompositeImageDescriptor;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.util.Assert;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.Point;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListOverlayDescriptor extends CompositeImageDescriptor {
+
+ private ImageData base;
+
+ private ImageData overlay;
+
+ private Point fSize;
+
+ private boolean top;
+
+ private boolean left;
+
+ public TaskListOverlayDescriptor(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);
+ }
+
+ @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;
+ }
+
+ /**
+ * 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);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListPatternFilter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListPatternFilter.java
new file mode 100644
index 000000000..7b4319506
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListPatternFilter.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui;
+
+import org.eclipse.ui.dialogs.PatternFilter;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListPatternFilter extends PatternFilter {
+
+ @Override
+ public void setPattern(String patternString) {
+ if (patternString == null || patternString.startsWith("*")) {
+ super.setPattern(patternString);
+ } else {
+ super.setPattern("*" + patternString);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListUiUtil.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListUiUtil.java
new file mode 100644
index 000000000..3a8ac5296
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskListUiUtil.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.TaskListPreferenceConstants;
+import org.eclipse.mylar.internal.tasklist.ui.editors.CategoryEditorInput;
+import org.eclipse.mylar.internal.tasklist.ui.editors.TaskEditorInput;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskContainer;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+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.internal.browser.WorkbenchBrowserSupport;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListUiUtil {
+
+ public static void closeEditorInActivePage(ITask task) {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ if (page == null) {
+ return;
+ }
+ IEditorInput input = new TaskEditorInput(task);
+ IEditorPart editor = page.findEditor(input);
+ if (editor != null) {
+ page.closeEditor(editor, false);
+ }
+ }
+
+ public static void openEditor(final ITask task) {
+ openEditor(task, true);
+ }
+
+ /**
+ * Set asyncExec false for testing purposes.
+ */
+ public static void openEditor(final ITask task, boolean asyncExec) {
+
+ final IEditorInput editorInput = new TaskEditorInput(task);
+
+ if (asyncExec) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ openEditor(editorInput, TaskListPreferenceConstants.TASK_EDITOR_ID, page);
+ }
+ });
+ } else {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ openEditor(editorInput, TaskListPreferenceConstants.TASK_EDITOR_ID, page);
+ }
+ }
+
+ public static IEditorPart openEditor(IEditorInput input, String editorId, IWorkbenchPage page) {
+ try {
+ return page.openEditor(input, editorId);
+ } catch (PartInitException e) {
+ MylarStatusHandler.fail(e, "Open for editor failed: " + input + ", id: " + editorId, true);
+ }
+ return null;
+ }
+
+ public static void openEditor(ITaskContainer category) {
+ final IEditorInput input = new CategoryEditorInput(category);
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ openEditor(input, TaskListPreferenceConstants.CATEGORY_EDITOR_ID, page);
+ }
+ });
+ }
+
+ public static void openUrl(String title, String tooltip, 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, MylarTaskListPlugin.PLUGIN_ID + title,
+ title, tooltip);
+ browser.openURL(new URL(url));
+ } 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");
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskPriorityFilter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskPriorityFilter.java
new file mode 100644
index 000000000..e8daaf300
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TaskPriorityFilter.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui;
+
+import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskListElement;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.Task;
+
+/**
+ * @author Ken Sueda
+ */
+public class TaskPriorityFilter extends AbstractTaskFilter {
+
+ private static final String PRIORITY_PREFIX = "P";
+
+ private String priorityLevel = Task.PriorityLevel.P5.toString();
+
+ public TaskPriorityFilter() {
+ displayPrioritiesAbove(MylarTaskListPlugin.getCurrentPriorityLevel());
+ }
+
+ public void displayPrioritiesAbove(String level) {
+ priorityLevel = level;
+ }
+
+ public boolean select(Object element) {
+ // System.out.println("Priority: " + priorityLevel);
+ if (element instanceof ITaskListElement) {
+ if (element instanceof AbstractQueryHit && ((AbstractQueryHit) element).getCorrespondingTask() != null) {
+ element = ((AbstractQueryHit) element).getCorrespondingTask();
+ }
+
+ if (element instanceof ITask) {
+ ITask task = (ITask) element;
+ if (shouldAlwaysShow(task)) {
+ return true;
+ }
+ }
+ String priority = ((ITaskListElement) element).getPriority();
+ if (priority == null || !(priority.startsWith(PRIORITY_PREFIX))) {
+ return true;
+ }
+ if (priorityLevel.compareTo(((ITaskListElement) element).getPriority()) >= 0) {
+ return true;
+ }
+ return false;
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TasksReminderDialog.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TasksReminderDialog.java
new file mode 100644
index 000000000..e31df3195
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/TasksReminderDialog.java
@@ -0,0 +1,267 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui;
+
+import java.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.mylar.provisional.tasklist.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<ITask> tasks = null;
+
+ private Table table = null;
+
+ private TableViewer tableViewer = null;
+
+ private String[] columnNames = new String[] { "Description", "Priority", "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 final String DISMISS_ALL_LABEL = "Dismiss All";
+
+ private static final String DISMISS_LABEL = "Dismiss Selected";
+
+ private static final String SNOOZE_ALL_LABEL = "Remind tommorrow";
+
+ private static long DAY = 24 * 3600 * 1000;
+
+ public TasksReminderDialog(Shell parentShell, List<ITask> 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("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, DISMISS_ALL_LABEL, false);
+ createButton(parent, DISMISS_ID, DISMISS_LABEL, false);
+ createButton(parent, SNOOZE_ID, SNOOZE_ALL_LABEL, 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);
+ }
+
+ protected void buttonPressed(int buttonId) {
+ if (buttonId == DISMISS_ALL_ID) {
+ for (ITask t : tasks) {
+ 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;
+ 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;
+ t.setReminded(false);
+ t.setReminderDate(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) {
+ ITask task = (ITask) element;
+ switch (columnIndex) {
+ case 0:
+ return task.getDescription();
+ case 1:
+ return task.getPriority();
+ case 2:
+ return DateFormat.getDateInstance(DateFormat.MEDIUM).format(task.getReminderDate());
+ }
+ }
+ 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 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(t1, t2);
+ default:
+ return 0;
+ }
+ }
+
+ private int compareDescription(ITask task1, ITask task2) {
+ return task1.getDescription().compareTo(task2.getDescription());
+ }
+
+ private int comparePriority(ITask task1, ITask task2) {
+ return task1.getPriority().compareTo(task2.getPriority());
+ }
+
+ private int compareDate(ITask task1, ITask task2) {
+ return task2.getReminderDate().compareTo(task1.getReminderDate());
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/AddRepositoryAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/AddRepositoryAction.java
new file mode 100644
index 000000000..50cee6384
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/AddRepositoryAction.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.tasklist.ui.wizards.AddRepositoryWizard;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class AddRepositoryAction extends Action {
+
+ private static final String ID = "org.eclipse.mylar.tasklist.repositories.add";
+
+ public AddRepositoryAction() {
+ setImageDescriptor(TaskListImages.REPOSITORY_NEW);
+ setText("Add Repository");
+ setId(ID);
+ }
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ public void run() {
+ try {
+ AddRepositoryWizard wizard = new AddRepositoryWizard();
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ if (wizard != null && shell != null && !shell.isDisposed()) {
+ WizardDialog dialog = new WizardDialog(shell, wizard);
+ dialog.create();
+ // dialog.getShell().setText("Mylar Tasks");
+ dialog.setBlockOnOpen(true);
+ if (dialog.open() == Dialog.CANCEL) {
+ dialog.close();
+ return;
+ }
+ }
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, e.getMessage(), true);
+ }
+ }
+
+ 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/tasklist/ui/actions/AddRepositoryTaskAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/AddRepositoryTaskAction.java
new file mode 100644
index 000000000..6b712984c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/AddRepositoryTaskAction.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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.ui.wizards.AddExistingTaskWizard;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class AddRepositoryTaskAction extends Action implements IViewActionDelegate {
+
+ private static final String WIZARD_LABEL = "Add an existing repository task/issue";
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ public void run(IAction action) {
+ try {
+ AddExistingTaskWizard wizard = new AddExistingTaskWizard();
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ if (wizard != null && shell != null && !shell.isDisposed()) {
+ WizardDialog dialog = new WizardDialog(shell, wizard);
+ dialog.create();
+ dialog.setTitle(WIZARD_LABEL);
+ dialog.setBlockOnOpen(true);
+ if (dialog.open() == Dialog.CANCEL) {
+ dialog.close();
+ return;
+ }
+ }
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, e.getMessage(), true);
+ }
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ // ignore
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/CollapseAllAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/CollapseAllAction.java
new file mode 100644
index 000000000..3cf5cfc0c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/CollapseAllAction.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+
+/**
+ * @author Mik Kersten
+ */
+public class CollapseAllAction extends Action {
+
+ private static final String LABEL = "Collapse All";
+
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.collapse.all";
+
+ private TaskListView taskListView;
+
+ public CollapseAllAction(TaskListView taskListView) {
+ super(LABEL);
+ this.taskListView = taskListView;
+ setId(ID);
+ setText(LABEL);
+ setToolTipText(LABEL);
+ setImageDescriptor(TaskListImages.COLLAPSE_ALL);
+ }
+
+ public void run() {
+ if (taskListView.getViewer() != null)
+ taskListView.getViewer().collapseAll();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/CopyDescriptionAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/CopyDescriptionAction.java
new file mode 100644
index 000000000..78349e1ac
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/CopyDescriptionAction.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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.ITaskListElement;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+
+public class CopyDescriptionAction extends Action {
+
+ private static final String DESCRIPTION_PREFIX = "Bugzilla Bug ";
+
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.copy";
+
+ private TaskListView view;
+
+ public CopyDescriptionAction(TaskListView view) {
+ this.view = view;
+ setText("Copy Description");
+ setToolTipText("Copy Description");
+ setId(ID);
+ setImageDescriptor(TaskListImages.COPY);
+ setAccelerator(SWT.MOD1 + 'c');
+ }
+
+ @Override
+ public void run() {
+ ISelection selection = this.view.getViewer().getSelection();
+ Object obj = ((IStructuredSelection) selection).getFirstElement();
+ if (obj instanceof ITaskListElement) {
+ ITaskListElement element = (ITaskListElement) obj;
+ String description = DESCRIPTION_PREFIX + element.getDescription();
+
+ // HACK: this should be done using proper copying
+ StyledText styledText = new StyledText(view.getDummyComposite(), SWT.NULL);
+ styledText.setText(description);
+ styledText.selectAll();
+ styledText.copy();
+ styledText.dispose();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/DeleteAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/DeleteAction.java
new file mode 100644
index 000000000..52007c417
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/DeleteAction.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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListUiUtil;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskCategory;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.WorkbenchImages;
+
+/**
+ * @author Mik Kersten and Ken Sueda
+ */
+public class DeleteAction extends Action {
+
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.delete";
+
+ public DeleteAction() {
+ setText("Delete");
+ setId(ID);
+ setImageDescriptor(WorkbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
+ }
+
+ @Override
+ public void run() {
+ ISelection selection = TaskListView.getDefault().getViewer().getSelection();
+ for (Object selectedObject : ((IStructuredSelection) selection).toList()) {
+ if (selectedObject instanceof ITask || selectedObject instanceof AbstractQueryHit) {
+ ITask task = null;
+ if (selectedObject instanceof AbstractQueryHit) {
+ task = ((AbstractQueryHit) selectedObject).getCorrespondingTask();
+ } else {
+ task = (ITask) selectedObject;
+ }
+ if (task == null) {
+ MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Mylar Tasks", "No task data to delte.");
+ return;
+ }
+ if (task.isActive()) {
+ MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Mylar Tasks", "Task must be deactivated in order to delete.");
+ return;
+ }
+
+ String message = genDeleteConfirmationMessage(task);
+ boolean deleteConfirmed = MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow()
+ .getShell(), "Confirm Delete", message);
+ if (!deleteConfirmed) {
+ return;
+ }
+
+ MylarTaskListPlugin.getTaskListManager().deleteTask(task);
+ MylarPlugin.getContextManager().contextDeleted(task.getHandleIdentifier());
+ TaskListUiUtil.closeEditorInActivePage(task);
+ } else if (selectedObject instanceof AbstractRepositoryQuery) {
+ boolean deleteConfirmed = MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow()
+ .getShell(), "Confirm delete", "Delete the selected query? Task data will not be deleted.");
+ if (deleteConfirmed) {
+ MylarTaskListPlugin.getTaskListManager().deleteQuery((AbstractRepositoryQuery) selectedObject);
+ }
+ } else if (selectedObject instanceof TaskCategory) {
+ boolean deleteConfirmed = MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow()
+ .getShell(), "Confirm Delete", "Delete the selected category and all contained tasks?");
+ if (!deleteConfirmed)
+ return;
+
+ TaskCategory cat = (TaskCategory) selectedObject;
+ for (ITask task : cat.getChildren()) {
+ MylarPlugin.getContextManager().contextDeleted(task.getHandleIdentifier());
+ TaskListUiUtil.closeEditorInActivePage(task);
+ }
+ MylarTaskListPlugin.getTaskListManager().deleteCategory(cat);
+ } else {
+ MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Delete failed",
+ "Nothing selected.");
+ return;
+ }
+ }
+ }
+
+ public static String genDeleteConfirmationMessage(ITask task) {
+ return "Delete the selected task and discard task context?\n\n" + task.getDescription();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/DeleteTaskRepositoryAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/DeleteTaskRepositoryAction.java
new file mode 100644
index 000000000..30411aadf
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/DeleteTaskRepositoryAction.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.mylar.internal.tasklist.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.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskRepositoriesView;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskRepository;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.WorkbenchImages;
+
+/**
+ * @author Mik Kersten
+ */
+public class DeleteTaskRepositoryAction extends Action {
+
+ private static final String ID = "org.eclipse.mylar.tasklist.repositories.delete";
+
+ private TaskRepositoriesView repositoriesView;
+
+ public DeleteTaskRepositoryAction(TaskRepositoriesView repositoriesView) {
+ this.repositoriesView = repositoriesView;
+ setImageDescriptor(WorkbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
+ setText("Delete Repository");
+ setId(ID);
+ }
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ public void run() {
+ try {
+ boolean deleteConfirmed = MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow()
+ .getShell(), "Confirm Delete", "Delete the selected task repositories?");
+ if (deleteConfirmed) {
+ IStructuredSelection selection = (IStructuredSelection) repositoriesView.getViewer().getSelection();
+ for (Object selectedObject : selection.toList()) {
+ if (selectedObject instanceof TaskRepository) {
+ MylarTaskListPlugin.getRepositoryManager().removeRepository((TaskRepository) selectedObject);
+ }
+ }
+ }
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, e.getMessage(), true);
+ }
+ }
+
+ 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/tasklist/ui/actions/EditRepositoryPropertiesAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/EditRepositoryPropertiesAction.java
new file mode 100644
index 000000000..6b8dc7bfe
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/EditRepositoryPropertiesAction.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskRepositoriesView;
+import org.eclipse.mylar.internal.tasklist.ui.wizards.EditRepositoryWizard;
+import org.eclipse.mylar.provisional.tasklist.TaskRepository;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class EditRepositoryPropertiesAction extends Action {
+
+ private static final String ID = "org.eclipse.mylar.tasklist.repositories.properties";
+
+ private TaskRepositoriesView repositoriesView;
+
+ public EditRepositoryPropertiesAction(TaskRepositoriesView repositoriesView) {
+ this.repositoriesView = repositoriesView;
+ setText("Properties");
+ setId(ID);
+ }
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ public void run() {
+ try {
+ IStructuredSelection selection = (IStructuredSelection) repositoriesView.getViewer().getSelection();
+ if (selection.getFirstElement() instanceof TaskRepository) {
+ EditRepositoryWizard wizard = new EditRepositoryWizard((TaskRepository) selection.getFirstElement());
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ if (wizard != null && shell != null && !shell.isDisposed()) {
+ WizardDialog dialog = new WizardDialog(shell, wizard);
+ dialog.create();
+ // dialog.getShell().setText("Mylar Tasks");
+ dialog.setBlockOnOpen(true);
+ if (dialog.open() == Dialog.CANCEL) {
+ dialog.close();
+ return;
+ }
+ }
+ }
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, e.getMessage(), true);
+ }
+ }
+
+ 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/tasklist/ui/actions/FilterCompletedTasksAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/FilterCompletedTasksAction.java
new file mode 100644
index 000000000..9d67a2b69
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/FilterCompletedTasksAction.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+
+/**
+ * @author Mik Kersten and Ken Sueda
+ */
+public class FilterCompletedTasksAction extends Action {
+
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.filter.completed";
+
+ private final TaskListView view;
+
+ public FilterCompletedTasksAction(TaskListView view) {
+ this.view = view;
+ setText("Filter Completed Tasks");
+ setToolTipText("Filter Completed Tasks");
+ setId(ID);
+ setImageDescriptor(TaskListImages.FILTER_COMPLETE);
+ setChecked(MylarTaskListPlugin.getDefault().isFilterCompleteMode());
+ }
+
+ @Override
+ public void run() {
+ MylarTaskListPlugin.getDefault().setFilterCompleteMode(isChecked());
+ if (isChecked()) {
+ view.addFilter(view.getCompleteFilter());
+ } else {
+ view.removeFilter(view.getCompleteFilter());
+ }
+ this.view.refreshAndFocus();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/GoIntoAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/GoIntoAction.java
new file mode 100644
index 000000000..c2e5135e2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/GoIntoAction.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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.tasklist.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.mylar.tasklist.actions.view.go.into";
+
+ //
+ // private DrillDownAdapter drillDownAdapter;
+ //
+ public GoIntoAction() {
+ setId(ID);
+ setText("Go Into Category");
+ setToolTipText("Go Into Category");
+ setImageDescriptor(TaskListImages.GO_INTO);
+ }
+
+ public void init(IViewPart view) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void run() {
+ if (TaskListView.getDefault() != null) {
+ TaskListView.getDefault().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/tasklist/ui/actions/GoUpAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/GoUpAction.java
new file mode 100644
index 000000000..74a7e5c0a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/GoUpAction.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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.ui.part.DrillDownAdapter;
+
+public class GoUpAction extends Action {
+
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.view.go.up";
+
+ public GoUpAction(DrillDownAdapter drillDownAdapter) {
+ setText("Go Up To Root");
+ setToolTipText("Go Up To Root");
+ setId(ID);
+ setImageDescriptor(TaskListImages.GO_UP);
+ }
+
+ @Override
+ public void run() {
+ if (TaskListView.getDefault() != null) {
+ TaskListView.getDefault().goUpToRoot();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/ManageEditorsAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/ManageEditorsAction.java
new file mode 100644
index 000000000..3890662ba
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/ManageEditorsAction.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.actions;
+
+
+/**
+ * @author Mik Kersten
+ */
+//public class ManageEditorsAction extends Action {
+//
+// public static final String ID = "org.eclipse.mylar.ui.editors.auto.manage";
+
+// public ManageEditorsAction() {
+// super("Manage Editors with Context", IAction.AS_CHECK_BOX);
+// setId(ID);
+// update(MylarTaskListPlugin.getPrefs().getBoolean(TaskListPreferenceConstants.AUTO_MANAGE_EDITORS));
+// }
+//
+// @Override
+// public void run() {
+// update(isChecked());
+// }
+//
+// public void update(boolean on) {
+// setChecked(on);
+// MylarTaskListPlugin.getPrefs().setValue(TaskListPreferenceConstants.AUTO_MANAGE_EDITORS, on);
+//
+// if (on) {
+// boolean previousValue = WorkbenchPlugin.getDefault().getPreferenceStore().getBoolean(
+// IPreferenceConstants.REUSE_EDITORS_BOOLEAN);
+// MylarTaskListPlugin.getPrefs().setValue(IPreferenceConstants.REUSE_EDITORS_BOOLEAN, previousValue);
+// WorkbenchPlugin.getDefault().getPreferenceStore().setValue(IPreferenceConstants.REUSE_EDITORS_BOOLEAN,
+// false);
+// } else {
+// boolean previousValue = MylarTaskListPlugin.getPrefs().getBoolean(
+// IPreferenceConstants.REUSE_EDITORS_BOOLEAN);
+// WorkbenchPlugin.getDefault().getPreferenceStore().setValue(IPreferenceConstants.REUSE_EDITORS_BOOLEAN,
+// previousValue);
+// }
+// }
+//}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/MarkTaskCompleteAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/MarkTaskCompleteAction.java
new file mode 100644
index 000000000..1052fbab6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/MarkTaskCompleteAction.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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+
+/**
+ * @author Mik Kersten
+ */
+public class MarkTaskCompleteAction extends Action {
+
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.mark.completed";
+
+ private final TaskListView view;
+
+ public MarkTaskCompleteAction(TaskListView view) {
+ this.view = view;
+ setText("Mark Complete");
+ setToolTipText("Mark Complete");
+ setId(ID);
+ setImageDescriptor(TaskListImages.TASK_COMPLETE);
+ }
+
+ @Override
+ public void run() {
+ for (Object selectedObject : ((IStructuredSelection) this.view.getViewer().getSelection()).toList()) {
+ if (selectedObject instanceof ITask) {
+ MylarTaskListPlugin.getTaskListManager().markComplete(((ITask) selectedObject), true);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/MarkTaskIncompleteAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/MarkTaskIncompleteAction.java
new file mode 100644
index 000000000..d92fe84a3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/MarkTaskIncompleteAction.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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+
+/**
+ * @author Mik Kersten and Ken Sueda
+ */
+public class MarkTaskIncompleteAction extends Action {
+
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.mark.incomplete";
+
+ private final TaskListView view;
+
+ public MarkTaskIncompleteAction(TaskListView view) {
+ this.view = view;
+ setText("Mark Incomplete");
+ setToolTipText("Mark Incomplete");
+ setId(ID);
+ setImageDescriptor(TaskListImages.TASK_INCOMPLETE);
+ }
+
+ @Override
+ public void run() {
+ for (Object selectedObject : ((IStructuredSelection) this.view.getViewer().getSelection()).toList()) {
+ if (selectedObject instanceof ITask) {
+ MylarTaskListPlugin.getTaskListManager().markComplete(((ITask) selectedObject), false);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/MoveTaskToRootAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/MoveTaskToRootAction.java
new file mode 100644
index 000000000..70b95c198
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/MoveTaskToRootAction.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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+
+/**
+ * @author Mik Kersten and Ken Sueda
+ */
+public class MoveTaskToRootAction extends Action {
+
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.move.toroot";
+
+ // private final TaskListView view;
+ public MoveTaskToRootAction(TaskListView view) {
+ // this.view = view;
+ setText("Move Task to Root");
+ setToolTipText("Move Task to Root");
+ setId(ID);
+ }
+
+ @Override
+ public void run() {
+ throw new RuntimeException("unimplemented");
+ // ISelection selection = this.view.getViewer().getSelection();
+ // Object obj = ((IStructuredSelection)selection).getFirstElement();
+ // if (obj instanceof ITask) {
+ // ITask t = (ITask) obj;
+ // TaskCategory cat = t.getCategory();
+ // if (cat != null) {
+ // cat.removeTask(t);
+ // t.setCategory(null);
+ // t.setParent(null);
+ // MylarTaskListPlugin.getTaskListManager().getTaskList().addRootTask(t);
+ // this.view.getViewer().refresh();
+ // } else if (t.getParent() != null) {
+ // t.getParent().removeSubTask(t);
+ // t.setParent(null);
+ // MylarTaskListPlugin.getTaskListManager().getTaskList().addRootTask(t);
+ // this.view.getViewer().refresh();
+ // }
+ // }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/NewCategoryAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/NewCategoryAction.java
new file mode 100644
index 000000000..db00f3f0c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/NewCategoryAction.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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskCategory;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten and Ken Sueda
+ */
+public class NewCategoryAction extends Action {
+
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.create.category";
+
+ private final TaskListView view;
+
+ public NewCategoryAction(TaskListView view) {
+ this.view = view;
+ setText("New Category");
+ setToolTipText("New Category");
+ setId(ID);
+ setImageDescriptor(TaskListImages.CATEGORY_NEW);
+ }
+
+ @Override
+ public void run() {
+ InputDialog dialog = new InputDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Enter name", "Enter a name for the Category: ", "", null);
+ int dialogResult = dialog.open();
+ if (dialogResult == Window.OK) {
+ TaskCategory cat = new TaskCategory(dialog.getValue());
+ MylarTaskListPlugin.getTaskListManager().addCategory(cat);
+ this.view.getViewer().refresh();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/NewLocalTaskAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/NewLocalTaskAction.java
new file mode 100644
index 000000000..8b23e9bfd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/NewLocalTaskAction.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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListUiUtil;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskInputDialog;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.Task;
+import org.eclipse.mylar.provisional.tasklist.TaskCategory;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class NewLocalTaskAction extends Action {
+
+ private static final String LABEL = "New Personal Task";
+
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.create.task";
+
+ private final TaskListView view;
+
+ public NewLocalTaskAction(TaskListView view) {
+ this.view = view;
+ setText(LABEL);
+ setToolTipText(LABEL);
+ setId(ID);
+ setImageDescriptor(TaskListImages.TASK_NEW);
+ }
+
+ @Override
+ public void run() {
+ TaskInputDialog dialog = new TaskInputDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
+ int dialogResult = dialog.open();
+ if (dialogResult == Window.OK) {
+ Task newTask = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), dialog
+ .getTaskname(), true);
+ newTask.setPriority(dialog.getSelectedPriority());
+ newTask.setReminderDate(dialog.getReminderDate());
+ newTask.setUrl(dialog.getIssueURL());
+
+ Object selectedObject = ((IStructuredSelection) view.getViewer().getSelection()).getFirstElement();
+
+ if (selectedObject instanceof TaskCategory) {
+ MylarTaskListPlugin.getTaskListManager().moveToCategory((TaskCategory) selectedObject, newTask);
+ } else if (selectedObject instanceof ITask) {
+ ITask task = (ITask) selectedObject;
+ if (task.getCategory() != null) {
+ MylarTaskListPlugin.getTaskListManager().moveToCategory((TaskCategory) task.getCategory(), newTask);
+ } else if (view.getDrilledIntoCategory() != null) {
+ MylarTaskListPlugin.getTaskListManager().moveToCategory(
+ (TaskCategory) view.getDrilledIntoCategory(), newTask);
+ } else {
+ MylarTaskListPlugin.getTaskListManager().moveToRoot(newTask);
+ }
+ } else if (view.getDrilledIntoCategory() != null) {
+ MylarTaskListPlugin.getTaskListManager().moveToCategory((TaskCategory) view.getDrilledIntoCategory(),
+ newTask);
+ } else {
+ MylarTaskListPlugin.getTaskListManager().moveToRoot(newTask);
+ }
+ MylarTaskListPlugin.getTaskListManager().getTaskList().addTaskToArchive(newTask);
+ TaskListUiUtil.openEditor(newTask);
+// newTask.openTaskInEditor(false);
+ view.getViewer().refresh();
+ view.getViewer().setSelection(new StructuredSelection(newTask));
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/NewQueryAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/NewQueryAction.java
new file mode 100644
index 000000000..1546cede4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/NewQueryAction.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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.ui.wizards.NewQueryWizard;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class NewQueryAction extends Action implements IViewActionDelegate {
+
+ private static final String WIZARD_LABEL = "Add or modify repository query";
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ public void run(IAction action) {
+ try {
+ NewQueryWizard wizard = new NewQueryWizard();
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ if (wizard != null && shell != null && !shell.isDisposed()) {
+ WizardDialog dialog = new WizardDialog(shell, wizard);
+ dialog.create();
+ dialog.setTitle(WIZARD_LABEL);
+ dialog.setBlockOnOpen(true);
+ if (dialog.open() == Dialog.CANCEL) {
+ dialog.close();
+ return;
+ }
+ }
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, e.getMessage(), true);
+ }
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ // ignore
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/NextTaskDropDownAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/NextTaskDropDownAction.java
new file mode 100644
index 000000000..aeafb6eb1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/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.mylar.internal.tasklist.ui.actions;
+
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskActivationHistory;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+
+/**
+ * @author Wesley Coelho
+ */
+public class NextTaskDropDownAction extends TaskNavigateDropDownAction {
+ public static final String ID = "org.eclipse.mylar.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();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/OpenTaskInExternalBrowserAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/OpenTaskInExternalBrowserAction.java
new file mode 100644
index 000000000..286ca18c6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/OpenTaskInExternalBrowserAction.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.actions;
+
+import java.net.URL;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
+
+/**
+ * @author Mik Kersten
+ * @author Robert Elves
+ */
+public class OpenTaskInExternalBrowserAction extends Action {
+
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.open.external";
+
+ public OpenTaskInExternalBrowserAction() {
+ setText("Open in External Browser");
+ setToolTipText("Open in External Browser");
+ setId(ID);
+ }
+
+ @Override
+ public void run() {
+ ISelection selection = TaskListView.getDefault().getViewer().getSelection();
+ for (Object selectedObject : ((IStructuredSelection) selection).toList()) {
+ ITask task = null;
+ if (selectedObject instanceof ITask) {
+ task = (ITask) selectedObject;
+ } else if (selectedObject instanceof AbstractQueryHit) {
+ AbstractQueryHit hit = (AbstractQueryHit) selectedObject;
+ task = hit.getOrCreateCorrespondingTask();
+ }
+ if (task != null) {
+ String urlString = task.getUrl();
+ if (task.hasValidUrl()) {
+ URL url;
+ try {
+ url = new URL(urlString);
+ IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport();
+ support.getExternalBrowser().openURL(url);
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, "could not open task url", true);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/OpenTaskListElementAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/OpenTaskListElementAction.java
new file mode 100644
index 000000000..38dfe1e37
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/OpenTaskListElementAction.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListUiUtil;
+import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryClient;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskContainer;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskCategory;
+
+/**
+ * @author Mik Kersten
+ */
+public class OpenTaskListElementAction extends Action {
+
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.open";
+
+ private final StructuredViewer viewer;
+
+ public OpenTaskListElementAction(StructuredViewer view) {
+ this.viewer = view;
+ setText("Open");
+ setToolTipText("Open Task List Element");
+ setId(ID);
+ }
+
+ @Override
+ public void run() {
+ ISelection selection = viewer.getSelection();
+ Object element = ((IStructuredSelection) selection).getFirstElement();
+ if (element instanceof ITask || element instanceof AbstractQueryHit) {
+ final ITask task;
+ if (element instanceof AbstractQueryHit) {
+ task = ((AbstractQueryHit) element).getOrCreateCorrespondingTask();
+ } else {
+ task = (ITask) element;
+ }
+
+ //element instanceof IQueryHit;
+ boolean forceUpdate = false;
+
+ final AbstractRepositoryClient client = MylarTaskListPlugin.getRepositoryManager().getRepositoryClient(
+ task.getRepositoryKind());
+ if (!task.isLocal() && client != null) {
+ Job refreshJob = client.synchronize(task, forceUpdate, new IJobChangeListener() {
+
+ public void done(IJobChangeEvent event) {
+ TaskListUiUtil.openEditor(task);
+ }
+
+ public void aboutToRun(IJobChangeEvent event) {
+ // ignore
+ }
+
+ public void awake(IJobChangeEvent event) {
+ // ignore
+ }
+
+ public void running(IJobChangeEvent event) {
+ // ignore
+ }
+
+ public void scheduled(IJobChangeEvent event) {
+ // ignore
+ }
+
+ public void sleeping(IJobChangeEvent event) {
+ // ignore
+ }
+ });
+ if (refreshJob == null) {
+ TaskListUiUtil.openEditor(task);
+ }
+ } else {
+ TaskListUiUtil.openEditor(task);
+ }
+ } else if (element instanceof TaskCategory) {
+ TaskListUiUtil.openEditor((ITaskContainer) element);
+ } else if (element instanceof AbstractRepositoryQuery) {
+ AbstractRepositoryQuery query = (AbstractRepositoryQuery) element;
+ AbstractRepositoryClient client = MylarTaskListPlugin.getRepositoryManager().getRepositoryClient(
+ query.getRepositoryKind());
+ client.openEditQueryDialog(query);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/PreviousTaskDropDownAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/PreviousTaskDropDownAction.java
new file mode 100644
index 000000000..50398753a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/PreviousTaskDropDownAction.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.actions;
+
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskActivationHistory;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+
+/**
+ * @author Wesley Coelho
+ */
+public class PreviousTaskDropDownAction extends TaskNavigateDropDownAction {
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.navigate.previous";
+
+ public PreviousTaskDropDownAction(TaskListView view, TaskActivationHistory history) {
+ super(view, history);
+ setText("Previous Task");
+ setToolTipText("Previous Task");
+ setId(ID);
+ setEnabled(true);
+ setImageDescriptor(TaskListImages.NAVIGATE_PREVIOUS);
+ }
+
+ protected void addActionsToMenu() {
+ List<ITask> tasks = taskHistory.getPreviousTasks();
+
+ if (tasks.size() > MAX_ITEMS_TO_DISPLAY) {
+ tasks = tasks.subList(tasks.size() - MAX_ITEMS_TO_DISPLAY, tasks.size());
+ }
+
+ for (int i = tasks.size() - 1; i >= 0; 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.hasPrevious()) {
+ new TaskActivateAction().run(taskHistory.getPreviousTask());
+ setButtonStatus();
+ view.refreshAndFocus();
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/RemoveFromCategoryAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/RemoveFromCategoryAction.java
new file mode 100644
index 000000000..8985cb619
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/RemoveFromCategoryAction.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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskCategory;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Ken Sueda
+ */
+public class RemoveFromCategoryAction extends Action {
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.remove";
+
+ private final TaskListView view;
+
+ public RemoveFromCategoryAction(TaskListView view) {
+ this.view = view;
+ setText("Remove From Category");
+ setId(ID);
+ setImageDescriptor(TaskListImages.REMOVE);
+ }
+
+ @Override
+ public void run() {
+ try {
+ ISelection selection = TaskListView.getDefault().getViewer().getSelection();
+ for (Object selectedObject : ((IStructuredSelection) selection).toList()) {
+ if (selectedObject instanceof ITask) { // && !((ITask) selectedObject).isLocal()) {
+ ITask task = (ITask) selectedObject;
+ if (task.isActive()) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ MylarTaskListPlugin.TITLE_DIALOG,
+ "Task must be deactivated in order to remove from category.");
+ return;
+ }
+
+ TreeItem item = this.view.getViewer().getTree().getSelection()[0];
+ if (item.getParentItem() != null && item.getParentItem().getData() instanceof TaskCategory) {
+ TaskCategory category = (TaskCategory) item.getParentItem().getData();
+ MylarTaskListPlugin.getTaskListManager().removeFromCategory(category, task);
+ } else {
+ MylarTaskListPlugin.getTaskListManager().removeFromRoot(task);
+ }
+ // just in case, should already be there
+ MylarTaskListPlugin.getTaskListManager().getTaskList().addTaskToArchive(task);
+// ITaskContainer cat = task.getCategory();
+// if (cat != null) {
+// String message = DeleteAction.genDeleteConfirmationMessage(task);
+// boolean deleteConfirmed = MessageDialog.openQuestion(PlatformUI.getWorkbench()
+// .getActiveWorkbenchWindow().getShell(), "Confirm delete", message);
+// if (!deleteConfirmed)
+// return;
+//
+// MylarTaskListPlugin.getTaskListManager().deleteTask(task);
+// MylarPlugin.getContextManager().contextDeleted(task.getHandleIdentifier()); // task.getContextPath());
+// }
+ }
+ }
+ } catch (NullPointerException npe) {
+ MylarStatusHandler.fail(npe, "Could not remove task from category, it may still be refreshing.", true);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/RenameAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/RenameAction.java
new file mode 100644
index 000000000..1c161c221
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/RenameAction.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.ITaskListElement;
+import org.eclipse.swt.SWT;
+
+public class RenameAction extends Action {
+
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.rename";
+
+ private TaskListView view;
+
+ public RenameAction(TaskListView view) {
+ this.view = view;
+ setText("Rename");
+ setId(ID);
+ setAccelerator(SWT.F2);
+ }
+
+ @Override
+ public void run() {
+ Object selectedObject = ((IStructuredSelection) this.view.getViewer().getSelection()).getFirstElement();
+ if (selectedObject instanceof ITaskListElement) {
+ ITaskListElement element = (ITaskListElement) selectedObject;
+ view.setInRenameAction(true);
+ view.getViewer().editElement(element, 3);
+ view.setInRenameAction(false);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/TaskActivateAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/TaskActivateAction.java
new file mode 100644
index 000000000..33be7b1ab
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/TaskActivateAction.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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskActivateAction extends Action implements IViewActionDelegate {
+
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.context.activate";
+
+ public ITask task = null;
+
+ public TaskActivateAction() {
+ setId(ID);
+ setText("Activate");
+ setImageDescriptor(TaskListImages.TASK_ACTIVE);
+ }
+
+ public void init(IViewPart view) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void run() {
+ MylarPlugin.getContextManager().actionObserved(this, Boolean.TRUE.toString());
+ run(TaskListView.getDefault().getSelectedTask());
+ }
+
+ public void run(ITask task) {
+ if (task != null) {
+ MylarTaskListPlugin.getTaskListManager().activateTask(task);
+ if (TaskListView.getDefault() != null) {
+ TaskListView.getDefault().refreshAndFocus();
+ }
+ }
+ }
+
+ 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/tasklist/ui/actions/TaskDeactivateAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/TaskDeactivateAction.java
new file mode 100644
index 000000000..87741612a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/TaskDeactivateAction.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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListUiUtil;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskDeactivateAction extends Action {
+
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.context.deactivate";
+
+ public TaskDeactivateAction() {
+ setId(ID);
+ setText("Deactivate");
+ setImageDescriptor(TaskListImages.TASK_INACTIVE);
+ }
+
+ public void run(ITask task) {
+ MylarPlugin.getContextManager().actionObserved(this, Boolean.FALSE.toString());
+
+ try {
+ if (task != null) {
+ MylarTaskListPlugin.getTaskListManager().deactivateTask(task);
+ TaskListView.getDefault().refreshAndFocus();
+ TaskListUiUtil.closeEditorInActivePage(task);
+// TaskListView.getDefault().closeTaskEditors(task, page);
+ }
+ } catch (Exception e) {
+ MylarStatusHandler.log(e, " Closing task editor on task deactivation failed");
+ }
+ }
+
+ public void run() {
+ run(TaskListView.getDefault().getSelectedTask());
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/TaskEditorCopyAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/TaskEditorCopyAction.java
new file mode 100644
index 000000000..5299d3ebe
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/TaskEditorCopyAction.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
+ *******************************************************************************/
+/*
+ * Created on 20-Jan-2005
+ */
+package org.eclipse.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+
+/**
+ * TODO: delete?
+ */
+public class TaskEditorCopyAction extends Action {
+
+ public TaskEditorCopyAction() {
+ setText("TaskInfoEditor.copy.text");
+ }
+
+ @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/tasklist/ui/actions/TaskNavigateDropDownAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/TaskNavigateDropDownAction.java
new file mode 100644
index 000000000..426a83626
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/TaskNavigateDropDownAction.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskActivationHistory;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskElementLabelProvider;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+
+/**
+ * This abstract class contains some common code used by NextTaskDropDownAction
+ * and PreviousTaskDropDownAction
+ *
+ * @author Wesley Coelho
+ * @author Mik Kersten
+ */
+public abstract class TaskNavigateDropDownAction extends Action implements IMenuCreator {
+ protected final TaskListView view;
+
+ protected TaskActivationHistory taskHistory;
+
+ protected Menu dropDownMenu = null;
+
+ protected TaskElementLabelProvider labelProvider = new TaskElementLabelProvider();
+
+ /** Maximum number of items to appear in the drop-down menu */
+ protected final static int MAX_ITEMS_TO_DISPLAY = 12;
+
+ public TaskNavigateDropDownAction(TaskListView view, TaskActivationHistory history) {
+ super();
+ this.view = view;
+ taskHistory = history;
+ setMenuCreator(this);
+ }
+
+ /**
+ * Action for navigating to a specified task. This class should be protected
+ * but has been made public for testing only
+ */
+ public class TaskNavigateAction extends Action {
+
+ private ITask targetTask;
+
+ private static final int MAX_LABEL_LENGTH = 40;
+
+ public TaskNavigateAction(ITask task) {
+ targetTask = task;
+ String taskDescription = task.getDescription();
+ if (taskDescription.length() > MAX_LABEL_LENGTH) {
+ taskDescription = taskDescription.subSequence(0, MAX_LABEL_LENGTH - 3) + "...";
+ }
+ setText(taskDescription);
+ setEnabled(true);
+ setToolTipText(task.getDescription());
+ Image image = labelProvider.getImage(task);
+ setImageDescriptor(ImageDescriptor.createFromImage(image));
+ }
+
+ public void run() {
+ new TaskActivateAction().run(targetTask);
+ taskHistory.navigatedToTask(targetTask);
+ setButtonStatus();
+ view.refreshAndFocus();
+ }
+ }
+
+ 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;
+ }
+
+ protected void setButtonStatus() {
+ view.getPreviousTaskAction().setEnabled(taskHistory.hasPrevious());
+ view.getNextTaskAction().setEnabled(taskHistory.hasNext());
+ }
+
+ protected abstract void addActionsToMenu();
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/WorkOfflineAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/WorkOfflineAction.java
new file mode 100644
index 000000000..54c1e7215
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/actions/WorkOfflineAction.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.mylar.internal.tasklist.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylar.internal.tasklist.TaskListPreferenceConstants;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+
+public class WorkOfflineAction extends Action {
+
+ public static final String ID = "org.eclipse.mylar.tasklist.actions.work.offline";
+
+ public WorkOfflineAction() {
+ setId(ID);
+ setText("Work Offline");
+ setToolTipText("Work Offline");
+ setChecked(MylarTaskListPlugin.getPrefs().getBoolean(TaskListPreferenceConstants.WORK_OFFLINE));
+ }
+
+ @Override
+ public void run() {
+ boolean on = !MylarTaskListPlugin.getPrefs().getBoolean(TaskListPreferenceConstants.WORK_OFFLINE);
+ MylarTaskListPlugin.getPrefs().setValue(TaskListPreferenceConstants.WORK_OFFLINE, on);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/CategoryEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/CategoryEditor.java
new file mode 100644
index 000000000..7c91745d7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/CategoryEditor.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.editors;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+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.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.FormColors;
+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
+ */
+public class CategoryEditor extends EditorPart {
+
+ private CategoryEditorInput input = null;
+
+ private boolean isDirty = false;
+
+ private Text description = null;
+
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ input.setCategoryName(description.getText());
+ isDirty = false;
+ MylarTaskListPlugin.getTaskListManager().notifyListUpdated();
+// if (TaskListView.getDefault() != null)
+// TaskListView.getDefault().notifyTaskDataChanged(null);
+ firePropertyChange(PROP_DIRTY);
+ }
+
+ @Override
+ public void doSaveAs() {
+ }
+
+ @SuppressWarnings("deprecation")
+ @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("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);
+
+ Label label = toolkit.createLabel(summaryContainer, "Description: ", SWT.NULL);
+ label.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+ description = toolkit.createText(summaryContainer, input.getCategoryName(), SWT.BORDER);
+ description.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+ description.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ markDirty();
+ }
+ });
+ }
+
+ private void markDirty() {
+ isDirty = true;
+ firePropertyChange(PROP_DIRTY);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/CategoryEditorInput.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/CategoryEditorInput.java
new file mode 100644
index 000000000..7cb972202
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/CategoryEditorInput.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.editors;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylar.provisional.tasklist.ITaskContainer;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+
+/**
+ * @author Ken Sueda
+ */
+public class CategoryEditorInput implements IEditorInput {
+
+ private ITaskContainer category;
+
+ public CategoryEditorInput(ITaskContainer cat) {
+ this.category = cat;
+ }
+
+ public boolean exists() {
+ return true;
+ }
+
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ public String getName() {
+ return "Category Editor";
+ }
+
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ public String getToolTipText() {
+ return "Category Editor";
+ }
+
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+ public String getCategoryName() {
+ return category.getDescription();
+ }
+
+ public void setCategoryName(String description) {
+ category.setDescription(description);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/MylarTaskEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/MylarTaskEditor.java
new file mode 100644
index 000000000..5f81dc970
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/MylarTaskEditor.java
@@ -0,0 +1,371 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.editors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.TaskListPreferenceConstants;
+import org.eclipse.mylar.internal.tasklist.ui.ITaskEditorFactory;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTError;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.part.MultiPageEditorPart;
+import org.eclipse.ui.part.MultiPageSelectionProvider;
+
+/**
+ * @author Mik Kersten
+ * @author Eric Booth (initial prototype)
+ */
+public class MylarTaskEditor extends MultiPageEditorPart {
+
+ private static final String TASK_INFO_PAGE_LABEL = "Task Info";
+
+ private static final String ISSUE_WEB_PAGE_LABEL = "Browser";
+
+ protected ITask task;
+
+ private TaskInfoEditor taskInfoEditor;
+
+ private Browser webBrowser;
+
+ private TaskEditorInput taskEditorInput;
+
+ private TaskEditorListener partListener;
+
+ private List<IEditorPart> editors = new ArrayList<IEditorPart>();
+
+ private IEditorPart contentOutlineProvider = null;
+
+ private static class TaskEditorSelectionProvider extends MultiPageSelectionProvider {
+ private ISelection globalSelection;
+
+ public TaskEditorSelectionProvider(MylarTaskEditor taskEditor) {
+ super(taskEditor);
+ }
+
+ public ISelection getSelection() {
+ IEditorPart activeEditor = ((MylarTaskEditor) getMultiPageEditor()).getActiveEditor();
+ if (activeEditor != null && activeEditor.getSite() != null) {
+ ISelectionProvider selectionProvider = activeEditor.getSite().getSelectionProvider();
+ if (selectionProvider != null)
+ return selectionProvider.getSelection();
+ }
+ return globalSelection;
+ }
+
+ public void setSelection(ISelection selection) {
+ IEditorPart activeEditor = ((MylarTaskEditor) getMultiPageEditor()).getActiveEditor();
+ if (activeEditor != null && activeEditor.getSite() != null) {
+ ISelectionProvider selectionProvider = activeEditor.getSite().getSelectionProvider();
+ if (selectionProvider != null)
+ selectionProvider.setSelection(selection);
+ } else {
+ this.globalSelection = selection;
+ fireSelectionChanged(new SelectionChangedEvent(this, globalSelection));
+ }
+ }
+ }
+
+ public MylarTaskEditor() {
+ super();
+ IWorkbench workbench = MylarTaskListPlugin.getDefault().getWorkbench();
+ IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
+ IWorkbenchPage activePage = window.getActivePage();
+ partListener = new TaskEditorListener();
+ activePage.addPartListener(partListener);
+ taskInfoEditor = new TaskInfoEditor();
+ taskInfoEditor.setParentEditor(this);
+ }
+
+ @Override
+ protected void createPages() {
+ try {
+ int index = 0;
+ index = createTaskSummaryPage();
+ int selectedIndex = index;
+ for (ITaskEditorFactory factory : MylarTaskListPlugin.getDefault().getTaskEditors()) {
+ if (factory.canCreateEditorFor(task)) {
+ try {
+ IEditorPart editor = factory.createEditor(this);
+ IEditorInput input = factory.createEditorInput(task);
+ if (editor != null && input != null) {
+ editors.add(editor);
+ index = addPage(editor, input);
+ selectedIndex = index;
+ setPageText(index++, factory.getTitle());
+ }
+ // HACK: overwrites if multiple present
+ if (factory.providesOutline()) {
+ contentOutlineProvider = editor;
+ }
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, "Could not create editor via factory: " + factory, true);
+ }
+ }
+ }
+ if (hasValidUrl()) {
+ int browserIndex = createBrowserPage();
+ if (selectedIndex == 0) {
+ selectedIndex = browserIndex;
+ }
+ }
+ setActivePage(selectedIndex);
+
+ if (!task.isLocal()) {
+ setTitleImage(TaskListImages.getImage(TaskListImages.TASK_REPOSITORY));
+ } else if (hasValidUrl()){
+ setTitleImage(TaskListImages.getImage(TaskListImages.TASK_WEB));
+ }
+ } catch (PartInitException e) {
+ MylarStatusHandler.fail(e, "failed to create task editor pages", false);
+ }
+ }
+
+ @Override
+ public Object getAdapter(Class adapter) {
+ // TODO: consider adding: IContentOutlinePage.class.equals(adapter) &&
+ if (contentOutlineProvider != null) {
+ return contentOutlineProvider.getAdapter(adapter);
+ } else {
+ return super.getAdapter(adapter);
+ }
+ }
+
+ public IEditorPart getActiveEditor() {
+ return super.getActiveEditor();
+ }
+
+ private int createTaskSummaryPage() throws PartInitException {
+ try {
+ taskInfoEditor.createPartControl(getContainer());
+ taskInfoEditor.setParentEditor(this);
+ editors.add(taskInfoEditor);
+
+ int index = addPage(taskInfoEditor.getControl());
+ setPageText(index, TASK_INFO_PAGE_LABEL);
+ return index;
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "could not add task editor", false);
+ }
+ return 0;
+ }
+
+ private int createBrowserPage() {
+ try {
+ webBrowser = new Browser(getContainer(), SWT.NONE);
+ int index = addPage(webBrowser);
+ setPageText(index, ISSUE_WEB_PAGE_LABEL);
+ webBrowser.setUrl(task.getUrl());
+
+ boolean openWithBrowser = MylarTaskListPlugin.getPrefs().getBoolean(
+ TaskListPreferenceConstants.REPORT_OPEN_INTERNAL);
+ if (task.isLocal() || openWithBrowser) {
+ setActivePage(index);
+ }
+ return index;
+ } catch (SWTError e) {
+ MylarStatusHandler.fail(e, "Could not create Browser page: " + e.getMessage(), true);
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "could not create issue report page", false);
+ }
+ return 0;
+ }
+
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ for (IEditorPart editor : editors) {
+ editor.doSave(monitor);
+ }
+
+ if (webBrowser != null) {
+ webBrowser.setUrl(task.getUrl());
+ } else if (hasValidUrl()) {
+ createBrowserPage();
+ }
+ }
+
+ /**
+ * HACK: perform real check
+ */
+ private boolean hasValidUrl() {
+ return task.getUrl().length() > 9;
+ }
+
+ /**
+ * Saves the multi-page editor's document as another file. Also updates the
+ * text for page 0's tab, and updates this multi-page editor's input to
+ * correspond to the nested editor's.
+ *
+ * @see org.eclipse.ui.ISaveablePart#doSaveAs()
+ */
+ @SuppressWarnings("deprecation")
+ @Override
+ public void doSaveAs() {
+ IEditorPart editor = getEditor(0);
+ editor.doSaveAs();
+ setPageText(0, editor.getTitle());
+ setInput(editor.getEditorInput());
+ }
+
+ @Override
+ public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+ taskEditorInput = (TaskEditorInput) input;
+ super.init(site, input);
+
+ setSite(site);
+ site.setSelectionProvider(new TaskEditorSelectionProvider(this));
+
+ /*
+ * The task data is saved only once, at the initialization of the
+ * editor. This is then passed to each of the child editors. This way,
+ * only one instance of the task data is stored for each editor opened.
+ */
+ task = taskEditorInput.getTask();
+ try {
+ taskInfoEditor.init(this.getEditorSite(), this.getEditorInput());
+ taskInfoEditor.setTask(task);
+ // Set the title on the editor's tab
+ this.setPartName(taskEditorInput.getLabel());
+ } catch (Exception e) {
+ throw new PartInitException(e.getMessage());
+ }
+ }
+
+ @Override
+ public boolean isSaveAsAllowed() {
+ return false;
+ }
+
+ @Override
+ public boolean isDirty() {
+ for (IEditorPart editor : editors) {
+ if (editor.isDirty()) {
+ return true;
+ }
+ }
+ return false;
+ // return taskInfoEditor.isDirty();
+ }
+
+ private class TaskEditorListener implements IPartListener {
+
+ public void partActivated(IWorkbenchPart part) {
+ if (part.equals(MylarTaskEditor.this)) {
+ ITask task = taskEditorInput.getTask();
+ if (TaskListView.getDefault() != null) {
+ TaskListView.getDefault().selectedAndFocusTask(task);
+ }
+ }
+ }
+
+ /**
+ * @see org.eclipse.ui.IPartListener#partBroughtToTop(org.eclipse.ui.IWorkbenchPart)
+ */
+ public void partBroughtToTop(IWorkbenchPart part) {
+ // don't care about this event
+ }
+
+ /**
+ * @see org.eclipse.ui.IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart)
+ */
+ public void partClosed(IWorkbenchPart part) {
+ // don't care about this event
+ }
+
+ /**
+ * @see org.eclipse.ui.IPartListener#partDeactivated(org.eclipse.ui.IWorkbenchPart)
+ */
+ public void partDeactivated(IWorkbenchPart part) {
+ // don't care about this event
+ }
+
+ /**
+ * @see org.eclipse.ui.IPartListener#partOpened(org.eclipse.ui.IWorkbenchPart)
+ */
+ public void partOpened(IWorkbenchPart part) {
+ // don't care about this event
+ }
+ }
+
+ /**
+ * Updates the tab titile
+ */
+ public void changeTitle() {
+ this.setPartName(taskEditorInput.getLabel());
+ }
+
+ public void markDirty() {
+ firePropertyChange(PROP_DIRTY);
+ return;
+ }
+
+ @Override
+ public void setFocus() {
+ // taskInfoEditor.setFocus();
+ }
+
+ public Browser getWebBrowser() {
+ return webBrowser;
+ }
+
+ @Override
+ protected void pageChange(int newPageIndex) {
+ // super.pageChange(newPageIndex);
+ for (ITaskEditorFactory factory : MylarTaskListPlugin.getDefault().getTaskEditors()) {
+ for (IEditorPart editor : editors) {
+ factory.notifyEditorActivationChange(editor);
+ }
+ }
+ }
+
+ public void dispose() {
+ for (IEditorPart part : editors) {
+ part.dispose();
+ }
+ if (taskInfoEditor != null)
+ taskInfoEditor.dispose();
+ if (webBrowser != null)
+ webBrowser.dispose();
+
+ IWorkbench workbench = MylarTaskListPlugin.getDefault().getWorkbench();
+ IWorkbenchWindow window = null;
+ IWorkbenchPage activePage = null;
+ if (workbench != null) {
+ window = workbench.getActiveWorkbenchWindow();
+ }
+ if (window != null) {
+ activePage = window.getActivePage();
+ }
+ if (activePage != null) {
+ activePage.removePartListener(partListener);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/TaskEditorInput.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/TaskEditorInput.java
new file mode 100644
index 000000000..012ff12b6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/TaskEditorInput.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * 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 19-Jan-2005
+ */
+package org.eclipse.mylar.internal.tasklist.ui.editors;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+
+/**
+ * @author Eric Booth
+ */
+public class TaskEditorInput implements IEditorInput {
+
+ private static final int MAX_LABEL_LENGTH = 60;
+
+ private ITask task;
+
+ private String id;
+
+ private String label;
+
+ public TaskEditorInput(ITask task) {
+ this.task = task;
+ id = task.getHandleIdentifier();
+ label = truncateDescription(task.getDescription());
+ }
+
+ private String truncateDescription(String description) {
+ if (description == null || description.length() <= MAX_LABEL_LENGTH) {
+ return description;
+ } else {
+ return description.substring(0, MAX_LABEL_LENGTH) + "...";
+ }
+ }
+
+ public boolean exists() {
+ return true;
+ }
+
+ /*
+ * (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 #" + id;
+ }
+
+ /*
+ * (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 label;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+ /**
+ * @return Returns the task.
+ */
+ public ITask getTask() {
+ return task;
+ }
+
+ /**
+ * @return Returns the id.
+ */
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * @return Returns the label.
+ */
+ public String getLabel() {
+ label = truncateDescription(task.getDescription());
+ return label;
+ }
+
+ /**
+ * Returns true if the argument is a bug report editor input on the same bug
+ * id.
+ */
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof TaskEditorInput) {
+ TaskEditorInput input = (TaskEditorInput) o;
+ return getId() != null && getId().equals(input.getId());
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/TaskInfoEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/TaskInfoEditor.java
new file mode 100644
index 000000000..c6e0779ef
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/editors/TaskInfoEditor.java
@@ -0,0 +1,794 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.editors;
+
+import java.io.File;
+import java.text.DateFormat;
+import java.util.Calendar;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylar.internal.core.util.DateUtil;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.ui.actions.TaskEditorCopyAction;
+import org.eclipse.mylar.internal.tasklist.ui.views.DatePicker;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskActivityListener;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.Task;
+import org.eclipse.mylar.provisional.tasklist.Task.TaskStatus;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
+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.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.Spinner;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.actions.RetargetAction;
+import org.eclipse.ui.forms.FormColors;
+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.internal.WorkbenchImages;
+import org.eclipse.ui.internal.WorkbenchMessages;
+import org.eclipse.ui.part.EditorPart;
+
+/**
+ * For details on forms, go to:
+ * http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/pde-ui-home/working/EclipseForms/EclipseForms.html
+ *
+ * @author Mik Kersten
+ * @author Ken Sueda (initial prototype)
+ * @author Rob Elves (added additional fields)
+ */
+public class TaskInfoEditor extends EditorPart {
+
+ private static final String NO_TIME_ELAPSED = "0 seconds";
+
+ private static final String DESCRIPTION_OVERVIEW = "Task Summary";
+
+ private DatePicker datePicker;
+
+ private ITask task;
+
+ private TaskEditorInput editorInput;
+
+ private Composite editorComposite;
+
+ private TaskEditorCopyAction copyAction;
+
+ private RetargetAction pasteAction;
+
+ private RetargetAction cutAction;
+
+ private static final String cutActionDefId = "org.eclipse.ui.edit.cut";
+
+ private static final String pasteActionDefId = "org.eclipse.ui.edit.paste";
+
+ private Button removeReminder;
+
+ private Text pathText;
+
+ private Text endDate;
+
+ private ScrolledForm form;
+
+ private Text description;
+
+ private Text issueReportURL;
+
+ private Combo priorityCombo;
+
+ private Combo statusCombo;
+
+ private Text notes;
+
+ private Spinner estimated;
+
+ private boolean isDirty = false;
+
+ private MylarTaskEditor parentEditor = null;
+
+ private ITaskActivityListener TASK_LIST_LISTENER = new ITaskActivityListener() {
+ public void taskActivated(ITask activeTask) {
+ // if (task != null && !browse.isDisposed()
+ // &&
+ // activeTask.getHandleIdentifier().equals(task.getHandleIdentifier()))
+ // {
+ // browse.setEnabled(false);
+ // }
+ }
+
+ public void tasksActivated(List<ITask> tasks) {
+ for (ITask t : tasks) {
+ taskActivated(t);
+ }
+ }
+
+ public void taskDeactivated(ITask deactiveTask) {
+ // if (task != null && !browse.isDisposed()
+ // &&
+ // deactiveTask.getHandleIdentifier().equals(task.getHandleIdentifier()))
+ // {
+ // browse.setEnabled(true);
+ // }
+ }
+
+ public void tasklistRead() {
+ // ignore
+ }
+
+ public void localInfoChanged(final ITask updateTask) {
+ if (updateTask != null && updateTask.getHandleIdentifier().equals(task.getHandleIdentifier())) {
+ if (PlatformUI.getWorkbench() != null && !PlatformUI.getWorkbench().getDisplay().isDisposed()) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (!description.isDisposed()) {
+ description.setText(updateTask.getDescription());
+ // TaskInfoEditor.this.setPartName(updateTask.getDescription(true));
+ parentEditor.changeTitle();
+ }
+ if (!priorityCombo.isDisposed()) {
+ int selectionIndex = priorityCombo.indexOf(updateTask.getPriority());
+ priorityCombo.select(selectionIndex);
+ }
+ if (!statusCombo.isDisposed()) {
+ int selectionIndex = statusCombo.indexOf(updateTask.getStatus().toString());
+ statusCombo.select(selectionIndex);
+ }
+ if (updateTask.isLocal() && !endDate.isDisposed()) {
+ endDate.setText(getTaskDateString(updateTask));
+ }
+ }
+ });
+ }
+ }
+ }
+
+ public void repositoryInfoChanged(ITask task) {
+ localInfoChanged(task);
+ }
+
+ public void taskListModified() {
+ // TODO Auto-generated method stub
+
+ }
+ };
+
+ public TaskInfoEditor() {
+ super();
+ cutAction = new RetargetAction(ActionFactory.CUT.getId(), 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.setAccelerator(SWT.CTRL | 'x');
+ cutAction.setActionDefinitionId(cutActionDefId);
+
+ pasteAction = new RetargetAction(ActionFactory.PASTE.getId(), 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.setAccelerator(SWT.CTRL | 'v');
+ pasteAction.setActionDefinitionId(pasteActionDefId);
+
+ copyAction = new TaskEditorCopyAction();
+ 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.setAccelerator(SWT.CTRL | 'c');
+
+ copyAction.setEnabled(false);
+ MylarTaskListPlugin.getTaskListManager().addListener(TASK_LIST_LISTENER);
+ }
+
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ String label = description.getText();
+ task.setDescription(label);
+ task.setUrl(issueReportURL.getText());
+ String note = notes.getText();
+ task.setNotes(note);
+ task.setEstimatedTimeHours(estimated.getSelection());
+ if (datePicker != null && datePicker.getDate() != null) {
+ task.setReminderDate(datePicker.getDate().getTime());
+ } else {
+ task.setReminderDate(null);
+ }
+ task.setPriority(priorityCombo.getItem(priorityCombo.getSelectionIndex()));
+
+ // Method not implemented yet
+ // task.setStatus(statusCombo.getItem(statusCombo.getSelectionIndex()));
+
+ // MylarTaskListPlugin.getTaskListManager().setStatus(task,
+ // statusCombo.getItem(statusCombo.getSelectionIndex()));
+
+// refreshTaskListView(task);
+ MylarTaskListPlugin.getTaskListManager().notifyLocalInfoChanged(task);
+
+ markDirty(false);
+ }
+
+ @Override
+ public void doSaveAs() {
+ // don't support saving as
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+ if (!(input instanceof TaskEditorInput)) {
+ throw new PartInitException("Invalid Input: Must be TaskEditorInput");
+ }
+ setSite(site);
+ setInput(input);
+ editorInput = (TaskEditorInput) input;
+ setPartName(editorInput.getLabel());
+ }
+
+ @Override
+ public boolean isDirty() {
+ return isDirty;
+ }
+
+ @Override
+ public boolean isSaveAsAllowed() {
+ return false;
+ }
+
+ @Override
+ public void createPartControl(Composite parent) {
+ FormToolkit toolkit = new FormToolkit(parent.getDisplay());
+ form = toolkit.createScrolledForm(parent);
+
+ editorComposite = form.getBody();
+ editorComposite.setLayout(new GridLayout());
+ editorComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
+ // Put the info onto the editor
+ createContent(editorComposite, toolkit);
+ form.setFocus();
+ }
+
+ @Override
+ public void setFocus() {
+ form.setFocus();
+ }
+
+ public Control getControl() {
+ return form;
+ }
+
+ public void setTask(ITask task) throws Exception {
+ if (task == null)
+ throw new Exception("ITask object is null.");
+ this.task = task;
+ }
+
+ private Composite createContent(Composite parent, FormToolkit toolkit) {
+ TaskEditorInput taskEditorInput = (TaskEditorInput) getEditorInput();
+
+ task = taskEditorInput.getTask();
+ if (task == null) {
+ MessageDialog.openError(parent.getShell(), "No such task", "No task exists with this id");
+ return null;
+ }
+
+ try {
+ createSummarySection(parent, toolkit);
+ createPlanningSection(parent, toolkit);
+ createDocumentationSection(parent, toolkit);
+ // // createRelatedLinksSection(parent, toolkit);
+ createResourcesSection(parent, toolkit);
+ } catch (SWTException e) {
+ MylarStatusHandler.log(e, "content failed");
+ }
+ return null;
+ }
+
+ private void createSummarySection(Composite parent, FormToolkit toolkit) {
+ Section section = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR | Section.DESCRIPTION
+ | Section.TWISTIE);
+ section.setText(DESCRIPTION_OVERVIEW);
+ section.setExpanded(true);
+ if (!task.isLocal()) {
+ section.setDescription("To modify these fields use the repository editor.");
+ }
+
+ section.setLayout(new GridLayout());
+ section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ 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);
+ GridLayout compLayout = new GridLayout();
+ compLayout.numColumns = 2;
+ container.setLayout(compLayout);
+ container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Label l = toolkit.createLabel(container, "Description:");
+ l.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+ description = toolkit.createText(container, task.getDescription(), SWT.NONE);
+ description.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ description.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ toolkit.paintBordersFor(container);
+
+ if (!task.isLocal()) {
+ description.setEnabled(false);
+ } else {
+ description.addKeyListener(new KeyListener() {
+
+ public void keyPressed(KeyEvent e) {
+ markDirty(true);
+
+ }
+
+ public void keyReleased(KeyEvent e) {
+ // ignore
+
+ }
+ });
+
+ }
+
+ Label urlLabel = toolkit.createLabel(container, "Web Link:");
+ urlLabel.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+ issueReportURL = toolkit.createText(container, task.getUrl(), SWT.NONE);
+ issueReportURL.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ if (!task.isLocal()) {
+ issueReportURL.setEditable(false);
+ } else {
+ issueReportURL.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ markDirty(true);
+ }
+ });
+ }
+
+ Label label = toolkit.createLabel(container, "Status:");
+ label.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+
+ Composite statusComposite = toolkit.createComposite(container);
+ statusComposite.setLayout(new GridLayout(2, false));
+
+ priorityCombo = new Combo(statusComposite, SWT.READ_ONLY);
+
+ // Populate the combo box with priority levels
+ for (String priorityLevel : TaskListView.PRIORITY_LEVELS) {
+ priorityCombo.add(priorityLevel);
+ }
+
+ int prioritySelectionIndex = priorityCombo.indexOf(task.getPriority());
+ priorityCombo.select(prioritySelectionIndex);
+
+ if (!task.isLocal()) {
+ priorityCombo.setEnabled(false);
+ } else {
+ priorityCombo.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ TaskInfoEditor.this.markDirty(true);
+
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // do nothing
+
+ }
+ });
+ }
+
+ statusCombo = new Combo(statusComposite, SWT.READ_ONLY);
+
+ for (TaskStatus status : Task.TaskStatus.values()) {
+ statusCombo.add(status.toString());
+ }
+
+ int selectionIndex = statusCombo.indexOf(task.getStatus().toString());
+ statusCombo.select(selectionIndex);
+ if (!task.isLocal()) {
+ statusCombo.setEnabled(false);
+ } else {
+ statusCombo.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ TaskInfoEditor.this.markDirty(true);
+
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // do nothing
+
+ }
+ });
+ }
+ statusCombo.setEnabled(false);
+
+ }
+
+ private void createDocumentationSection(Composite parent, FormToolkit toolkit) {
+ Section section = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
+ section.setText("Documentation");
+ section.setExpanded(true);
+ section.setLayout(new GridLayout());
+ section.setLayoutData(new GridData(GridData.FILL_BOTH));
+ 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);
+ container.setLayout(new GridLayout());
+
+ notes = toolkit.createText(container, task.getNotes(), SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
+
+ GridData notesDataLayout = new GridData(GridData.FILL_BOTH);
+ notes.setLayoutData(notesDataLayout);
+ notes.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ markDirty(true);
+ }
+ });
+
+ toolkit.paintBordersFor(container);
+ }
+
+ private void createPlanningSection(Composite parent, FormToolkit toolkit) {
+
+ Section section = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR | Section.TWISTIE);
+ section.setText("Planning");
+ section.setLayout(new GridLayout());
+ section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ section.setExpanded(true);
+ section.addExpansionListener(new IExpansionListener() {
+ public void expansionStateChanging(ExpansionEvent e) {
+ form.reflow(true);
+ }
+
+ public void expansionStateChanged(ExpansionEvent e) {
+ form.reflow(true);
+ }
+ });
+
+ Composite sectionClient = toolkit.createComposite(section);
+ section.setClient(sectionClient);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 6;
+ layout.makeColumnsEqualWidth = false;
+ sectionClient.setLayout(layout);
+ GridData clientDataLayout = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ sectionClient.setLayoutData(clientDataLayout);
+
+ // Reminder
+ Label label = toolkit.createLabel(sectionClient, "Reminder:");
+ label.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+
+ datePicker = new DatePicker(sectionClient, SWT.NONE, "<reminder>");
+
+ Calendar calendar = Calendar.getInstance();
+ if (task.getReminderDate() != null) {
+ calendar.setTime(task.getReminderDate());
+ datePicker.setDate(calendar);
+ }
+
+ datePicker.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
+ datePicker.addPickerSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent arg0) {
+ task.setReminded(false);
+ TaskInfoEditor.this.markDirty(true);
+ }
+
+ public void widgetDefaultSelected(SelectionEvent arg0) {
+ // ignore
+ }
+ });
+ datePicker.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+
+ removeReminder = toolkit.createButton(sectionClient, "Clear", SWT.PUSH | SWT.CENTER);
+ removeReminder.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ datePicker.setDate(null);
+ task.setReminded(false);
+ TaskInfoEditor.this.markDirty(true);
+ }
+ });
+
+ // 1 Blank column after Reminder clear button
+ Label dummy = toolkit.createLabel(sectionClient, "");
+ GridData dummyLabelDataLayout = new GridData(GridData.HORIZONTAL_ALIGN_CENTER);
+ dummyLabelDataLayout.horizontalSpan = 1;
+ dummyLabelDataLayout.widthHint = 30;
+ dummy.setLayoutData(dummyLabelDataLayout);
+
+ // Creation date
+ label = toolkit.createLabel(sectionClient, "Creation date:");
+ label.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+
+ String creationDateString = "";
+ try {
+ creationDateString = DateFormat.getDateInstance(DateFormat.LONG).format(task.getCreationDate());
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "Could not format creation date", true);
+ }
+
+ Text creationDate = toolkit.createText(sectionClient, creationDateString, SWT.NONE);
+ GridData creationDateDataLayout = new GridData();
+ creationDateDataLayout.widthHint = 120;
+ creationDate.setLayoutData(creationDateDataLayout);
+ creationDate.setEditable(false);
+ creationDate.setEnabled(true);
+
+
+ // Estimated time
+
+ label = toolkit.createLabel(sectionClient, "Estimated time:");
+ label.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+
+ estimated = new Spinner(sectionClient, SWT.NONE);
+ estimated.setSelection(task.getEstimateTimeHours());
+ estimated.setDigits(0);
+ estimated.setMaximum(100);
+ estimated.setMinimum(0);
+ estimated.setIncrement(1);
+ estimated.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ TaskInfoEditor.this.markDirty(true);
+ }
+ });
+
+ estimated.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ GridData estimatedDataLayout = new GridData();
+ estimatedDataLayout.widthHint = 110;
+ estimated.setLayoutData(estimatedDataLayout);
+
+ label = toolkit.createLabel(sectionClient, "hours ");
+ label.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+
+
+ // 1 Blank column
+ Label blankLabel2 = toolkit.createLabel(sectionClient, "");
+ GridData blankLabl2Layout = new GridData(GridData.HORIZONTAL_ALIGN_CENTER);
+ blankLabl2Layout.horizontalSpan = 1;
+ blankLabl2Layout.widthHint = 25;
+ blankLabel2.setLayoutData(blankLabl2Layout);
+
+ // Completion date
+ label = toolkit.createLabel(sectionClient, "Completion date:");
+ label.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+
+ String completionDateString = "";
+ if (task.isCompleted()) {
+ completionDateString = getTaskDateString(task);
+ }
+ endDate = toolkit.createText(sectionClient, completionDateString, SWT.NONE);
+ GridData endDateDataLayout = new GridData();
+ endDateDataLayout.widthHint = 120;
+ endDate.setLayoutData(endDateDataLayout);
+
+
+ endDate.setEditable(false);
+ endDate.setEnabled(true);
+ toolkit.paintBordersFor(sectionClient);
+
+ // Elapsed Time
+
+ label = toolkit.createLabel(sectionClient, "Elapsed time:");
+ label.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+
+ Composite elapsedComposite = toolkit.createComposite(sectionClient);
+ GridLayout elapsedLayout = new GridLayout();
+ elapsedLayout.numColumns = 2;
+ elapsedLayout.marginWidth = 1;
+ elapsedLayout.makeColumnsEqualWidth = false;
+ elapsedComposite.setLayout(elapsedLayout);
+ GridData elapsedCompositeGridData = new GridData();
+ elapsedCompositeGridData.horizontalSpan = 5;
+ elapsedComposite.setLayoutData(elapsedCompositeGridData);
+
+
+
+ String elapsedTimeString = NO_TIME_ELAPSED;
+ try {
+ elapsedTimeString = DateUtil.getFormattedDuration(task.getElapsedTime(), true);
+ if (elapsedTimeString.equals(""))
+ elapsedTimeString = NO_TIME_ELAPSED;
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "Could not format elapsed time", true);
+ }
+
+ final Text elapsedTimeText = toolkit.createText(elapsedComposite, elapsedTimeString, SWT.NONE);
+ GridData td = new GridData(GridData.FILL_HORIZONTAL);
+ elapsedTimeText.setLayoutData(td);
+ elapsedTimeText.setEditable(false);
+
+ // Refresh Button
+ Button timeRefresh = toolkit.createButton(elapsedComposite, "Refresh", SWT.PUSH | SWT.CENTER);
+
+ timeRefresh.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ String elapsedTimeString = NO_TIME_ELAPSED;
+ try {
+ elapsedTimeString = DateUtil.getFormattedDuration(task.getElapsedTime(), true);
+ if (elapsedTimeString.equals("")) {
+ elapsedTimeString = NO_TIME_ELAPSED;
+ }
+
+ } catch (RuntimeException e1) {
+ MylarStatusHandler.fail(e1, "Could not format elapsed time", true);
+ }
+ elapsedTimeText.setText(elapsedTimeString);
+ }
+ });
+
+ toolkit.paintBordersFor(elapsedComposite);
+ }
+
+ private String getTaskDateString(ITask task) {
+
+ if (task == null)
+ return "";
+ if (task.getCompletionDate() == null)
+ return "";
+
+ String completionDateString = "";
+ try {
+ completionDateString = DateFormat.getDateInstance(DateFormat.LONG).format(task.getCompletionDate());
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "Could not format date", true);
+ return completionDateString;
+ }
+ return completionDateString;
+ }
+
+ private void createResourcesSection(Composite parent, FormToolkit toolkit) {
+ Section section = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR | Section.TWISTIE);
+ section.setText("Resources");
+ section.setLayout(new GridLayout());
+ section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ 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);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 2;
+ container.setLayout(layout);
+ container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Label l2 = toolkit.createLabel(container, "Task context file:");
+ l2.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+ File contextFile = MylarPlugin.getContextManager().getFileForContext(task.getHandleIdentifier());
+ // String contextPath = MylarPlugin.getDefault().getDataDirectory()
+ // + '/' + task.getContextPath() +
+ // MylarContextManager.CONTEXT_FILE_EXTENSION;
+ if (contextFile != null) {
+ pathText = toolkit.createText(container, contextFile.getAbsolutePath(), SWT.NONE);
+ pathText.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ pathText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ pathText.setEditable(false);
+ pathText.setEnabled(false);
+ }
+ toolkit.paintBordersFor(container);
+
+ // browse = toolkit.createButton(container, "Change", SWT.PUSH |
+ // SWT.CENTER);
+ // if (task.isActive()) {
+ // browse.setEnabled(false);
+ // } else {
+ // browse.setEnabled(true);
+ // }
+ // browse.addSelectionListener(new SelectionAdapter() {
+ // @Override
+ // public void widgetSelected(SelectionEvent e) {
+ //
+ // if (task.isActive()) {
+ // MessageDialog.openInformation(Display.getDefault().getActiveShell(),
+ // "Task Message",
+ // "Task can not be active when changing taskscape");
+ // } else {
+ // FileDialog dialog = new
+ // FileDialog(Display.getDefault().getActiveShell(), SWT.OPEN);
+ // String[] ext = { "*.xml" };
+ // dialog.setFilterExtensions(ext);
+ //
+ // String mylarDir = MylarPlugin.getDefault().getDataDirectory() + "/";
+ // mylarDir = mylarDir.replaceAll("\\\\", "/");
+ // dialog.setFilterPath(mylarDir);
+ //
+ // String res = dialog.open();
+ // if (res != null) {
+ // res = res.replaceAll("\\\\", "/");
+ // pathText.setText("<MylarDir>/" + res + ".xml");
+ // markDirty(true);
+ // }
+ // }
+ // }
+ // });
+ // toolkit.createLabel(container, "");
+ // l = toolkit.createLabel(container, "Go to Task List Preferences to
+ // change task context directory");
+ // l.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+ }
+
+ private void markDirty(boolean dirty) {
+ isDirty = dirty;
+ if (parentEditor != null) {
+ parentEditor.markDirty();
+ }
+ return;
+ }
+
+ public void setParentEditor(MylarTaskEditor parentEditor) {
+ this.parentEditor = parentEditor;
+ }
+
+ @Override
+ public void dispose() {
+ MylarTaskListPlugin.getTaskListManager().removeListener(TASK_LIST_LISTENER);
+ }
+
+ @Override
+ public String toString() {
+ return "(info editor for task: " + task + ")";
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/preferences/MylarTaskListPreferencePage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/preferences/MylarTaskListPreferencePage.java
new file mode 100644
index 000000000..3a2076e0b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/preferences/MylarTaskListPreferencePage.java
@@ -0,0 +1,363 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.preferences;
+
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.mylar.internal.tasklist.TaskListPreferenceConstants;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+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.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.DirectoryDialog;
+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 MylarTaskListPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+
+ private Text taskDirectoryText = null;
+
+ private Text taskURLPrefixText = null;
+
+ private Button browse = null;
+
+ private Button copyExistingDataCheckbox = null;
+
+ private Button reportEditor = null;
+
+ private Button reportInternal = null;
+
+ private Button refreshQueries = null;
+
+ private Text refreshScheduleTime = null;
+
+ private Button userRefreshOnly;
+
+ private Button enableBackgroundRefresh;
+
+ public MylarTaskListPreferencePage() {
+ super();
+ setPreferenceStore(MylarTaskListPlugin.getPrefs());
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout(1, false);
+ container.setLayout(layout);
+
+ createCreationGroup(container);
+ createTaskDirectoryControl(container);
+ createBugzillaReportOption(container);
+ createTaskRefreshScheduleGroup(container);
+ updateRefreshGroupEnablements();
+ return container;
+ }
+
+ public void init(IWorkbench workbench) {
+ // TODO Auto-generated method stub
+ }
+
+ private void createBugzillaReportOption(Composite parent) {
+ Group container = new Group(parent, SWT.SHADOW_ETCHED_IN);
+ container.setLayout(new GridLayout(2, false));
+ container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ container.setText("Open Repository Tasks With");
+ reportEditor = new Button(container, SWT.RADIO);
+ reportEditor.setText("Bug editor");
+ reportEditor.setSelection(getPreferenceStore().getBoolean(TaskListPreferenceConstants.REPORT_OPEN_EDITOR));
+ reportInternal = new Button(container, SWT.RADIO);
+ reportInternal.setText("Internal browser");
+ reportInternal.setSelection(getPreferenceStore().getBoolean(TaskListPreferenceConstants.REPORT_OPEN_INTERNAL));
+ // reportExternal = new Button(container, SWT.RADIO);
+ // reportExternal.setText("External browser");
+ // reportExternal.setSelection(getPreferenceStore().getBoolean(MylarTaskListPlugin.REPORT_OPEN_EXTERNAL));
+ // reportExternal.setEnabled(false);
+ }
+
+ @Override
+ public boolean performOk() {
+ String taskDirectory = taskDirectoryText.getText();
+ taskDirectory = taskDirectory.replaceAll("\\\\", "/");
+ if (!taskDirectory.equals(MylarPlugin.getDefault().getDataDirectory())) {
+ // Order matters:
+ MylarTaskListPlugin.getDefault().getTaskListSaveManager().saveTaskListAndContexts();
+ if (copyExistingDataCheckbox.getSelection()) {
+ MylarTaskListPlugin.getDefault().getTaskListSaveManager().copyDataDirContentsTo(taskDirectory);
+ }
+ MylarPlugin.getDefault().setDataDirectory(taskDirectory);
+ // getPreferenceStore().setValue(MylarPlugin.PREF_DATA_DIR,
+ // taskDirectory);
+ // MylarTaskListPlugin.getDefault().setDataDirectory(MylarPlugin.getDefault().getDataDirectory());
+ }
+
+ getPreferenceStore().setValue(TaskListPreferenceConstants.COPY_TASK_DATA,
+ copyExistingDataCheckbox.getSelection());
+ getPreferenceStore().setValue(TaskListPreferenceConstants.REPORT_OPEN_EDITOR, reportEditor.getSelection());
+ getPreferenceStore().setValue(TaskListPreferenceConstants.REPORT_OPEN_INTERNAL, reportInternal.getSelection());
+ // getPreferenceStore().setValue(MylarTaskListPlugin.REPORT_OPEN_EXTERNAL,
+ // reportExternal.getSelection());
+ getPreferenceStore().setValue(TaskListPreferenceConstants.DEFAULT_URL_PREFIX, taskURLPrefixText.getText());
+ getPreferenceStore().setValue(TaskListPreferenceConstants.REPOSITORY_SYNCH_ON_STARTUP, refreshQueries.getSelection());
+
+
+ // Set refresh schedule preferences and start/stop as necessary
+ getPreferenceStore().setValue(TaskListPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED, enableBackgroundRefresh.getSelection());
+ long miliseconds = 60000*Long.parseLong(refreshScheduleTime.getText());
+ getPreferenceStore().setValue(TaskListPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_MILISECONDS, ""+miliseconds);
+
+ return true;
+ }
+
+ @Override
+ public boolean performCancel() {
+ // closeEditors.setSelection(getPreferenceStore().getBoolean(MylarPlugin.AUTO_MANAGE_EDITORS));
+ reportEditor.setSelection(getPreferenceStore().getBoolean(TaskListPreferenceConstants.REPORT_OPEN_EDITOR));
+ reportInternal.setSelection(getPreferenceStore().getBoolean(TaskListPreferenceConstants.REPORT_OPEN_INTERNAL));
+ // reportExternal.setSelection(getPreferenceStore().getBoolean(MylarTaskListPlugin.REPORT_OPEN_EXTERNAL));
+ refreshQueries.setSelection(getPreferenceStore().getBoolean(TaskListPreferenceConstants.REPOSITORY_SYNCH_ON_STARTUP));
+ // saveCombo.setText(getPreferenceStore().getString(MylarTaskListPlugin.SAVE_TASKLIST_MODE));
+
+ enableBackgroundRefresh.setSelection(getPreferenceStore().getBoolean(TaskListPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED));
+ refreshScheduleTime.setText(getMinutesString());
+
+ return true;
+ }
+
+ public void performDefaults() {
+ super.performDefaults();
+ copyExistingDataCheckbox.setSelection(true);
+ // IPath rootPath =
+ // ResourcesPlugin.getWorkspace().getRoot().getLocation();
+ // String taskDirectory = rootPath.toString() + "/" +
+ // MylarPlugin.DATA_DIR_NAME;
+ taskDirectoryText.setText(MylarPlugin.getDefault().getDefaultDataDirectory());
+
+ // copyExistingDataCheckbox.setSelection(getPreferenceStore().getDefaultBoolean(MylarTaskListPlugin.COPY_TASK_DATA));
+ reportEditor
+ .setSelection(getPreferenceStore().getDefaultBoolean(TaskListPreferenceConstants.REPORT_OPEN_EDITOR));
+ reportInternal.setSelection(getPreferenceStore().getDefaultBoolean(
+ TaskListPreferenceConstants.REPORT_OPEN_INTERNAL));
+ // reportExternal.setSelection(getPreferenceStore().getDefaultBoolean(MylarTaskListPlugin.REPORT_OPEN_EXTERNAL));
+ taskURLPrefixText.setText(getPreferenceStore().getDefaultString(TaskListPreferenceConstants.DEFAULT_URL_PREFIX));
+
+ refreshQueries.setSelection(getPreferenceStore().getDefaultBoolean(
+ TaskListPreferenceConstants.REPOSITORY_SYNCH_ON_STARTUP));
+
+ enableBackgroundRefresh.setSelection(getPreferenceStore().getDefaultBoolean(TaskListPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED));
+ userRefreshOnly.setSelection(!enableBackgroundRefresh.getSelection());
+ refreshScheduleTime.setText(getPreferenceStore().getDefaultString(TaskListPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_MILISECONDS));
+
+ }
+
+
+ private String getMinutesString() {
+ long miliseconds = getPreferenceStore().getLong(TaskListPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_MILISECONDS);
+ long minutes = miliseconds / 60000;
+ return ""+minutes;
+ }
+
+
+ private Label createLabel(Composite parent, String text) {
+ Label label = new Label(parent, SWT.LEFT);
+ label.setText(text);
+ GridData data = new GridData();
+ data.horizontalSpan = 2;
+ data.horizontalAlignment = GridData.BEGINNING;
+ label.setLayoutData(data);
+ return label;
+ }
+
+ private void createTaskDirectoryControl(Composite parent) {
+ Group taskDirComposite = new Group(parent, SWT.SHADOW_ETCHED_IN);
+ taskDirComposite.setText("Mylar Data Directory (task list and contexts)");
+ taskDirComposite.setLayout(new GridLayout(2, false));
+ taskDirComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ String taskDirectory = MylarPlugin.getDefault().getDataDirectory();
+ // String taskDirectory =
+ // getPreferenceStore().getString(MylarPlugin.PREF_DATA_DIR);
+ taskDirectory = taskDirectory.replaceAll("\\\\", "/");
+ taskDirectoryText = new Text(taskDirComposite, SWT.BORDER);
+ taskDirectoryText.setText(taskDirectory);
+ taskDirectoryText.setEditable(false);
+ taskDirectoryText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ browse = createButton(taskDirComposite, "Browse...");
+ browse.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ DirectoryDialog dialog = new DirectoryDialog(getShell());
+ dialog.setText("Folder Selection");
+ dialog.setMessage("Specify the folder for tasks");
+ String dir = taskDirectoryText.getText();
+ dir = dir.replaceAll("\\\\", "/");
+ dialog.setFilterPath(dir);
+
+ dir = dialog.open();
+ if (dir == null || dir.equals(""))
+ return;
+ taskDirectoryText.setText(dir);
+ }
+ });
+
+ copyExistingDataCheckbox = new Button(taskDirComposite, SWT.CHECK);
+ copyExistingDataCheckbox.setText("Copy existing data to new location");
+ copyExistingDataCheckbox.setSelection(getPreferenceStore()
+ .getBoolean(TaskListPreferenceConstants.COPY_TASK_DATA));
+
+ }
+
+ private void createCreationGroup(Composite parent) {
+ Group group = new Group(parent, SWT.SHADOW_ETCHED_IN);
+ group.setText("Task Creation");
+ group.setLayout(new GridLayout(1, false));
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Label urlLabel = createLabel(group, "Web link prefix (e.g. https://bugs.eclipse.org/bugs/show_bug.cgi?id=)");
+ urlLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+
+ String taskURLPrefix = getPreferenceStore().getString(TaskListPreferenceConstants.DEFAULT_URL_PREFIX);
+ taskURLPrefixText = new Text(group, SWT.BORDER);
+ taskURLPrefixText.setText(taskURLPrefix);
+ taskURLPrefixText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ }
+
+ // reference: org.eclipse.team.internal.ui.synchronize.ConfigureSynchronizeScheduleComposite
+ private void createTaskRefreshScheduleGroup(Composite parent) {
+ Group group = new Group(parent, SWT.SHADOW_ETCHED_IN);
+ group.setText("Refresh Schedule");
+ group.setLayout(new GridLayout(1, false));
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ {
+ userRefreshOnly = new Button(group, SWT.RADIO);
+ final GridData gridData = new GridData();
+ gridData.horizontalSpan = 2;
+ userRefreshOnly.setLayoutData(gridData);
+ userRefreshOnly.setText("Do not schedule periodic background synchronization");
+ userRefreshOnly.setSelection(!getPreferenceStore().getBoolean(
+ TaskListPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED));
+ userRefreshOnly.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ updateRefreshGroupEnablements();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+
+ }
+ {
+ enableBackgroundRefresh = new Button(group, SWT.RADIO);
+ final GridData gridData = new GridData();
+ gridData.horizontalSpan = 2;
+ enableBackgroundRefresh.setLayoutData(gridData);
+ enableBackgroundRefresh.setText("Use the following schedule:");
+ enableBackgroundRefresh.setSelection(getPreferenceStore().getBoolean(
+ TaskListPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED));
+ enableBackgroundRefresh.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ updateRefreshGroupEnablements();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+
+ }
+ final Composite composite = new Composite(group, SWT.NONE);
+ final GridData gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_VERTICAL
+ | GridData.VERTICAL_ALIGN_BEGINNING);
+ gridData.horizontalSpan = 2;
+ composite.setLayoutData(gridData);
+ final GridLayout gridLayout_1 = new GridLayout();
+ gridLayout_1.numColumns = 3;
+ composite.setLayout(gridLayout_1);
+ {
+ final Label label = new Label(composite, SWT.NONE);
+ label.setText("Every: ");
+ }
+ {
+ refreshScheduleTime = new Text(composite, SWT.BORDER | SWT.RIGHT);
+ final GridData gridData_1 = new GridData();
+ gridData_1.widthHint = 35;
+ refreshScheduleTime.setLayoutData(gridData_1);
+
+ refreshScheduleTime.setText(getMinutesString());
+ refreshScheduleTime.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ updateRefreshGroupEnablements();
+ }
+ });
+
+ }
+ {
+ final Label label = new Label(composite, SWT.NONE);
+ label.setText("minutes");
+ }
+
+ refreshQueries = new Button(group, SWT.CHECK);
+ refreshQueries.setText("Automatically perform a repository refresh on startup");
+ refreshQueries.setSelection(getPreferenceStore().getBoolean(
+ TaskListPreferenceConstants.REPOSITORY_SYNCH_ON_STARTUP));
+
+ }
+
+ public void updateRefreshGroupEnablements() {
+ if (enableBackgroundRefresh.getSelection()) {
+ try {
+ long number = Long.parseLong(refreshScheduleTime.getText());
+ if (number <= 0) {
+ this.setErrorMessage("Refresh schedule time must be > 0");
+ this.setValid(false);
+ } else {
+ this.setErrorMessage(null);
+ this.setValid(true);
+ }
+ } catch (NumberFormatException e) {
+ this.setErrorMessage("Refresh schedule time must be valid integer");
+ this.setValid(false);
+ }
+ } else {
+ this.setValid(true);
+ this.setErrorMessage(null);
+ }
+ refreshScheduleTime.setEnabled(enableBackgroundRefresh.getSelection());
+// hoursOrMinutes.setEnabled(enableBackgroundRefresh.getSelection());
+ }
+
+
+
+ private Button createButton(Composite parent, String text) {
+ Button button = new Button(parent, SWT.TRAIL);
+ button.setText(text);
+ button.setVisible(true);
+ return button;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/DatePicker.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/DatePicker.java
new file mode 100644
index 000000000..3f2d5aa0c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/DatePicker.java
@@ -0,0 +1,479 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.views;
+
+import java.text.DateFormatSymbols;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+
+import org.eclipse.swt.SWT;
+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.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.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.Combo;
+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.swt.widgets.Spinner;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Temporary date picker from patch posted to:
+ * https://bugs.eclipse.org/bugs/show_bug.cgi?id=19945
+ *
+ * see bug# 19945
+ *
+ * TODO: remove this class when an SWT date picker is added
+ *
+ * @author Bahadir Yagan
+ * @author Mik Kersten
+ */
+public class DatePicker extends Composite {
+
+ private Text dateText = null;
+
+ private Button pickButton = null;
+
+ private Calendar date = null;
+
+ private Shell pickerShell = null;
+
+ private DatePickerPanel datePickerPanel = null;
+
+ private List<SelectionListener> pickerListeners = new LinkedList<SelectionListener>();
+
+ SimpleDateFormat simpleDateFormat = (SimpleDateFormat) SimpleDateFormat.getDateInstance(SimpleDateFormat.LONG, Locale.ENGLISH);
+
+ private String initialText = "Select Date";
+
+ public DatePicker(Composite parent, int style, String initialText) {
+ super(parent, style);
+ this.initialText = initialText;
+ initialize();
+ }
+
+ private void initialize() {
+
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 2;
+ gridLayout.horizontalSpacing = 0;
+ gridLayout.verticalSpacing = 0;
+ gridLayout.marginWidth = 0;
+ gridLayout.marginHeight = 0;
+ gridLayout.makeColumnsEqualWidth = false;
+ this.setLayout(gridLayout);
+
+ setSize(new org.eclipse.swt.graphics.Point(120, 19));
+
+ simpleDateFormat.applyPattern("MM/dd/yy h:mm aa");
+ dateText = new Text(this, SWT.NONE);
+
+ GridData dateTextGridData = new org.eclipse.swt.layout.GridData();
+ dateTextGridData.widthHint = 95;
+
+ dateText.setLayoutData(dateTextGridData);
+ dateText.setText(initialText);
+ dateText.addFocusListener(new FocusListener() {
+// DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(currentDate));
+
+ Calendar calendar = Calendar.getInstance();
+
+ public void focusGained(FocusEvent e) {
+ }
+
+ public void focusLost(FocusEvent e) {
+ Date reminderDate;
+ try {
+ reminderDate = simpleDateFormat.parse(dateText.getText());
+ calendar.setTime(reminderDate);
+ date = calendar;
+ updateDateText();
+ } catch (ParseException e1) {
+ updateDateText();
+ }
+
+ }
+ });
+
+
+ pickButton = new Button(this, SWT.ARROW | SWT.DOWN);
+ GridData pickButtonGridData = new org.eclipse.swt.layout.GridData();
+ pickButtonGridData.horizontalAlignment = org.eclipse.swt.layout.GridData.END;
+ pickButton.setLayoutData(pickButtonGridData);
+ pickButton.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent arg0) {
+ Display display = Display.getCurrent();
+ pickButton.setEnabled(false);
+ dateText.setEnabled(false);
+ showDatePicker((display.getCursorLocation().x), (display.getCursorLocation().y));
+ }
+
+ public void widgetDefaultSelected(SelectionEvent arg0) {
+
+ }
+ });
+ }
+
+ public void addPickerSelectionListener(SelectionListener listener) {
+ pickerListeners.add(listener);
+ }
+
+ public Calendar getDate() {
+ return date;
+ }
+
+ public void setDate(Calendar date) {
+ this.date = date;
+ updateDateText();
+ }
+
+ public Point computeSize(int wHint, int hHint, boolean changed) {
+ this.layout();
+ return new Point(this.getSize().x, this.getSize().y);
+ }
+
+ 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);
+ 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);
+ }
+ }
+
+ public void keyReleased(KeyEvent e) {
+ }
+ });
+ pickerShell.pack();
+ pickerShell.open();
+ }
+
+ /** Called when the user has selected a date */
+ protected void dateSelected(boolean canceled) {
+ if (!canceled) {
+ updateDateText();
+ }
+
+ notifyPickerListeners();
+ pickButton.setEnabled(true);
+ dateText.setEnabled(true);
+ pickerShell.close();
+ }
+
+ private void notifyPickerListeners() {
+ for (SelectionListener listener : pickerListeners) {
+ listener.widgetSelected(null);
+ }
+ }
+
+ private void updateDateText() {
+ if (date != null) {
+ Date currentDate = new Date(date.getTimeInMillis());
+ dateText.setText(simpleDateFormat.format(currentDate));
+ //DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(currentDate));
+ } else {
+ dateText.setEnabled(false);
+ dateText.setText(initialText);
+ dateText.setEnabled(true);
+ }
+ notifyPickerListeners();
+ }
+
+ public void setEnabled(boolean enabled) {
+ dateText.setEnabled(enabled);
+ pickButton.setEnabled(enabled);
+ super.setEnabled(enabled);
+ }
+
+ class DatePickerPanel extends Composite implements KeyListener {
+
+ private Combo timeCombo = null;
+
+ private Combo monthCombo = null;
+
+ private Spinner yearSpinner = null;
+
+ private Composite headerComposite = null;
+
+ private Composite calendarComposite = null;
+
+ private Calendar date = null;
+
+ private DateFormatSymbols dateFormatSymbols = null;
+
+ private Label[] calendarLabels = null;
+
+ public DatePickerPanel(Composite parent, int style, Calendar initialDate) {
+ super(parent, style);
+ this.date = initialDate;
+ initialize();
+ updateCalendar();
+ }
+
+ private void initialize() {
+ if(date == null) {
+ date = new GregorianCalendar();
+ }
+ dateFormatSymbols = new DateFormatSymbols();
+ calendarLabels = new Label[42];
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 3;
+ gridLayout.horizontalSpacing = 3;
+ gridLayout.verticalSpacing = 3;
+ this.setLayout(gridLayout);
+ setSize(new org.eclipse.swt.graphics.Point(400, 200));//277, 200
+ createTimeCombo();
+ createMonthCombo();
+ createYearSpinner();
+ createComposite();
+ createComposite1();
+ createCalendarData();
+ }
+
+ /**
+ * This method initializes the month combo
+ *
+ */
+ private void createTimeCombo() {
+ timeCombo = new Combo(this, SWT.READ_ONLY);
+ timeCombo.setItems(new String[] { "12:00 AM", "1:00 AM", "2:00 AM", "3:00 AM", "4:00 AM", "5:00 AM",
+ "6:00 AM", "7:00 AM", "8:00 AM", "9:00 AM", "10:00 AM", "11:00 AM", "12:00 PM", "1:00 PM",
+ "2:00 PM", "3:00 PM", "4:00 PM", "5:00 PM", "6:00 PM", "7:00 PM", "8:00 PM", "9:00 PM", "10:00 PM",
+ "11:00 PM" });
+ timeCombo.select(Calendar.getInstance().get(Calendar.HOUR_OF_DAY));
+ timeCombo.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent arg0) {
+ date.set(Calendar.HOUR_OF_DAY, timeCombo.getSelectionIndex());
+ date.set(Calendar.MINUTE, 0);
+ updateCalendar();
+ }
+ });
+ timeCombo.addKeyListener(this);
+ }
+
+ /**
+ * This method initializes the month combo
+ *
+ */
+ private void createMonthCombo() {
+ monthCombo = new Combo(this, SWT.READ_ONLY);
+ monthCombo.setItems(dateFormatSymbols.getMonths());
+ monthCombo.remove(12);
+ monthCombo.select(date.get(Calendar.MONTH));
+ monthCombo.setVisibleItemCount(12);
+ monthCombo.addModifyListener(new ModifyListener() {
+
+ public void modifyText(ModifyEvent arg0) {
+ date.set(Calendar.MONTH, monthCombo.getSelectionIndex());
+ updateCalendar();
+ }
+
+ });
+ monthCombo.addKeyListener(this);
+ }
+
+ private void createYearSpinner() {
+ GridData gridData1 = new org.eclipse.swt.layout.GridData();
+ gridData1.horizontalAlignment = org.eclipse.swt.layout.GridData.BEGINNING;
+ gridData1.grabExcessVerticalSpace = false;
+ gridData1.grabExcessHorizontalSpace = false;
+ gridData1.heightHint = -1;
+ gridData1.verticalAlignment = org.eclipse.swt.layout.GridData.CENTER;
+ yearSpinner = new Spinner(this, SWT.BORDER | SWT.READ_ONLY);
+ yearSpinner.setMinimum(1900);
+ yearSpinner.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
+ yearSpinner.setDigits(0);
+ yearSpinner.setMaximum(3000);
+ yearSpinner.setLayoutData(gridData1);
+ yearSpinner.setSelection(date.get(Calendar.YEAR));
+ yearSpinner.addModifyListener(new ModifyListener() {
+
+ public void modifyText(ModifyEvent arg0) {
+ date.set(Calendar.YEAR, yearSpinner.getSelection());
+ updateCalendar();
+ }
+
+ });
+ yearSpinner.addKeyListener(this);
+ }
+
+ /**
+ * This method initializes composite
+ *
+ */
+ private void createComposite() {
+ String[] weekDays = dateFormatSymbols.getWeekdays();
+ GridLayout gridLayout1 = new GridLayout();
+ gridLayout1.numColumns = 7;
+ gridLayout1.makeColumnsEqualWidth = true;
+ GridData gridData = new org.eclipse.swt.layout.GridData();
+ gridData.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.grabExcessVerticalSpace = false;
+ gridData.horizontalSpan = 3;
+ gridData.verticalAlignment = org.eclipse.swt.layout.GridData.CENTER;
+ headerComposite = new Composite(this, SWT.NONE);
+ headerComposite.setLayoutData(gridData);
+ headerComposite.setLayout(gridLayout1);
+ GridData labelGridData = new org.eclipse.swt.layout.GridData();
+ labelGridData.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
+ labelGridData.grabExcessHorizontalSpace = true;
+ labelGridData.verticalAlignment = org.eclipse.swt.layout.GridData.CENTER;
+ for (int i = 1; i < 8; ++i) {
+ Label headerLabel = new Label(headerComposite, SWT.CENTER);
+ headerLabel.setText(weekDays[i].substring(0, 3));
+ headerLabel.setLayoutData(labelGridData);
+ }
+ }
+
+ /**
+ * This method initializes composite1
+ *
+ */
+ private void createComposite1() {
+ GridLayout gridLayout2 = new GridLayout();
+ gridLayout2.numColumns = 7;
+ gridLayout2.makeColumnsEqualWidth = true;
+ GridData gridData1 = new org.eclipse.swt.layout.GridData();
+ gridData1.horizontalSpan = 3;
+ gridData1.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
+ gridData1.verticalAlignment = org.eclipse.swt.layout.GridData.FILL;
+ gridData1.grabExcessVerticalSpace = true;
+ gridData1.grabExcessHorizontalSpace = true;
+ calendarComposite = new Composite(this, SWT.BORDER);
+ calendarComposite.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
+ calendarComposite.setLayout(gridLayout2);
+ calendarComposite.setLayoutData(gridData1);
+ }
+
+ private void createCalendarData() {
+ GridData gridData = new org.eclipse.swt.layout.GridData();
+ gridData.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.verticalAlignment = org.eclipse.swt.layout.GridData.CENTER;
+ for (int i = 0; i < 42; ++i) {
+ Label headerLabel = new Label(calendarComposite, SWT.CENTER);
+ headerLabel.setText("99");
+ headerLabel.setLayoutData(gridData);
+ calendarLabels[i] = headerLabel;
+ headerLabel.addMouseListener(new MouseListener() {
+
+ public void mouseDoubleClick(MouseEvent arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void mouseDown(MouseEvent arg0) {
+ unSellectAll();
+ Label label = (Label) arg0.getSource();
+ if (!label.getText().equals("")) {
+ label.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_LIST_SELECTION));
+ label.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
+ }
+ }
+
+ public void mouseUp(MouseEvent arg0) {
+ Label label = (Label) arg0.getSource();
+ if (!label.getText().equals("")) {
+ date.set(Calendar.YEAR, yearSpinner.getSelection());
+ date.set(Calendar.MONTH, monthCombo.getSelectionIndex());
+ date.set(Calendar.DAY_OF_MONTH, Integer.parseInt(label.getText()));
+ dateSelected(false);
+ }
+
+ }
+
+ });
+ }
+ }
+
+ private void updateCalendar() {
+ unSellectAll();
+ // Fill Labels
+ Calendar cal = new GregorianCalendar(date.get(Calendar.YEAR), date.get(Calendar.MONTH), 1);
+ int dayofWeek = cal.get(Calendar.DAY_OF_WEEK) - 1;
+
+ for (int i = 0; i < dayofWeek; ++i) {
+ calendarLabels[i].setText("");
+ }
+
+ for (int i = 1; i <= cal.getActualMaximum(Calendar.DAY_OF_MONTH); ++i) {
+ calendarLabels[i + dayofWeek - 1].setText("" + i);
+ }
+
+ for (int i = cal.getActualMaximum(Calendar.DAY_OF_MONTH) + dayofWeek; i < 42; ++i) {
+ calendarLabels[i].setText("");
+ }
+
+ calendarLabels[date.get(Calendar.DAY_OF_MONTH) + dayofWeek - 1].setBackground(Display.getDefault()
+ .getSystemColor(SWT.COLOR_LIST_SELECTION));
+ calendarLabels[date.get(Calendar.DAY_OF_MONTH) + dayofWeek - 1].setForeground(Display.getDefault()
+ .getSystemColor(SWT.COLOR_WHITE));
+
+ }
+
+ private void unSellectAll() {
+ for (int i = 0; i < 42; ++i) {
+ calendarLabels[i].setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK));
+ calendarLabels[i].setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ }
+ }
+
+ public Calendar getDate() {
+ return date;
+ }
+
+ public void setDate(Calendar date) {
+ this.date = date;
+ updateCalendar();
+ }
+
+ public void keyPressed(KeyEvent e) {
+ if (e.keyCode == SWT.ESC) {
+ dateSelected(true);
+ }
+ }
+
+ public void keyReleased(KeyEvent e) {
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/ImageTableCellEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/ImageTableCellEditor.java
new file mode 100644
index 000000000..305b8be60
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/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.mylar.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.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/RetrieveTitleFromUrlJob.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/RetrieveTitleFromUrlJob.java
new file mode 100644
index 000000000..060e104f0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/RetrieveTitleFromUrlJob.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.views;
+
+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.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.TitleEvent;
+import org.eclipse.swt.browser.TitleListener;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Waits for the title from the browser
+ *
+ * @author Wesley Coelho
+ * @author Mik Kersten
+ */
+public abstract class RetrieveTitleFromUrlJob extends Job implements TitleListener {
+
+ public static final String LABEL_TITLE = "Retrieving description from URL";
+
+ private final static long MAX_WAIT_TIME_MILLIS = 1000 * 10; // (10 Seconds)
+
+ private final static long SLEEP_INTERVAL_MILLIS = 500;
+
+ private String taskURL = null;
+
+ private String pageTitle = null;
+
+ private boolean retrievalFailed = false;
+
+ private long timeWaitedMillis = 0;
+
+ boolean ignoreChangeCall = false;
+
+ private boolean titleRetrieved = false;
+
+ public RetrieveTitleFromUrlJob(String url) {
+ super(LABEL_TITLE);
+ taskURL = url;
+ }
+
+ protected abstract void setTitle(String pageTitle);
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ final Shell shell = new Shell(Display.getDefault());
+ shell.setVisible(false);
+ Browser browser = new Browser(shell, SWT.NONE);
+ browser.addTitleListener(RetrieveTitleFromUrlJob.this);
+ browser.setUrl(taskURL);
+ }
+ });
+
+ while (pageTitle == null && !retrievalFailed && (timeWaitedMillis <= MAX_WAIT_TIME_MILLIS)) {
+ try {
+ Thread.sleep(SLEEP_INTERVAL_MILLIS);
+ } catch (InterruptedException e) {
+ MylarStatusHandler.fail(e, "Thread interrupted during sleep", false);
+ }
+ timeWaitedMillis += SLEEP_INTERVAL_MILLIS;
+ }
+
+ if (pageTitle != null) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ setTitle(pageTitle);
+ titleRetrieved = true;
+ }
+ });
+ return Status.OK_STATUS;
+ } else {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openError(Display.getDefault().getActiveShell(), "Task Description Error",
+ "Could not retrieve a description from the specified web page.");
+ }
+ });
+ return Status.CANCEL_STATUS;
+ }
+
+ }
+
+ public void changed(TitleEvent event) {
+ if (!ignoreChangeCall) {
+ if (event.title.equals(taskURL)) {
+ return;
+ } else {
+ ignoreChangeCall = true;
+ if (event.title.equals(taskURL + "/") || event.title.equals("Object not found!")
+ || event.title.equals("No page to display") || event.title.equals("Cannot find server")
+ || event.title.equals("Invalid Bug ID")) {
+ retrievalFailed = true;
+ } else {
+ pageTitle = event.title;
+ }
+ }
+ }
+ }
+
+ public boolean isTitleRetrieved() {
+ return titleRetrieved;
+ }
+
+ public String getPageTitle() {
+ return pageTitle;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TableDecoratingLabelProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TableDecoratingLabelProvider.java
new file mode 100644
index 000000000..da8906b45
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TableDecoratingLabelProvider.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.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.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskContainer;
+import org.eclipse.mylar.provisional.tasklist.ITaskListElement;
+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 ITaskListElement)) {
+ return null;
+ }
+ if (columnIndex == 0) {
+ if (element instanceof ITaskContainer) {
+ return super.getImage(element);
+ } else {
+ ITask task = TaskElementLabelProvider.getCorrespondingTask((ITaskListElement)element);
+ if (task != null) {
+ if (task.isActive()) {
+ return TaskListImages.getImage(TaskListImages.TASK_ACTIVE);
+ } else {
+ if (MylarPlugin.getContextManager().hasContext(task.getHandleIdentifier())) {
+ return TaskListImages.getImage(TaskListImages.TASK_INACTIVE_CONTEXT);
+ } else {
+ return TaskListImages.getImage(TaskListImages.TASK_INACTIVE);
+ }
+ }
+ } else {
+ return TaskListImages.getImage(TaskListImages.TASK_INACTIVE);
+ }
+ }
+ } else if (columnIndex == 1) {
+ if (element instanceof ITaskContainer || element instanceof AbstractRepositoryQuery) {
+ return null;
+ }
+ return super.getImage(element);
+ }
+ return null;
+ }
+
+ public String getColumnText(Object element, int columnIndex) {
+ // ignore
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivationHistory.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivationHistory.java
new file mode 100644
index 000000000..38869121f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskActivationHistory.java
@@ -0,0 +1,235 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.views;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.provisional.core.InteractionEvent;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+
+/**
+ * @author Ken Sueda (original prototype)
+ * @author Wesley Coelho (Added persistent tasks)
+ * @author Mik Kersten (hardening)
+ */
+public class TaskActivationHistory {
+
+ private List<ITask> history = new ArrayList<ITask>();
+
+ private int currentIndex = -1;
+
+ /**
+ * The number of tasks from the previous Eclipse session to load into the
+ * history at startup. (This is not the maximum size of the history, which
+ * is currently unbounded)
+ */
+ private static final int NUM_SAVED_HISTORY_ITEMS_TO_LOAD = 10;
+
+ private boolean persistentHistoryLoaded = false;
+
+ /**
+ * Load in a number of saved history tasks from previous session. Should be
+ * called from constructor but ContextManager doesn't seem to be able to
+ * provide activity history at that point
+ *
+ * @author Wesley Coelho
+ */
+ protected void loadPersistentHistory() {
+ int tasksAdded = 0;
+
+ for (int i = MylarPlugin.getContextManager().getActivityHistory().getInteractionHistory().size() - 1; i >= 0; i--) {
+ ITask prevTask = getHistoryTaskAt(i);
+
+ if (prevTask != null && !isDuplicate(prevTask, i + 1)) {
+ history.add(0, prevTask);
+ currentIndex++;
+ tasksAdded++;
+ if (tasksAdded == NUM_SAVED_HISTORY_ITEMS_TO_LOAD) {
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns true if the specified task appears in the activity history
+ * between the starting index and the end of the history list.
+ *
+ * @author Wesley Coelho
+ */
+ protected boolean isDuplicate(ITask task, int startingIndex) {
+ for (int i = startingIndex; i < MylarPlugin.getContextManager().getActivityHistory().getInteractionHistory()
+ .size(); i++) {
+ ITask currTask = getHistoryTaskAt(i);
+ if (currTask != null && currTask.getHandleIdentifier().equals(task.getHandleIdentifier())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns the task corresponding to the interaction event history item at
+ * the specified position
+ *
+ * @author Wesley Coelho
+ */
+ protected ITask getHistoryTaskAt(int pos) {
+ InteractionEvent event = MylarPlugin.getContextManager().getActivityHistory().getInteractionHistory().get(pos);
+ return MylarTaskListPlugin.getTaskListManager().getTaskForHandle(event.getStructureHandle(), false);
+ }
+
+ public void addTask(ITask task) {
+ try {
+ if (!persistentHistoryLoaded) {
+ loadPersistentHistory();
+ persistentHistoryLoaded = true;
+ }
+
+ if (hasNext()) {
+ for (int i = currentIndex + 1; i < history.size();) {
+ history.remove(i);
+ }
+ }
+ if (history.remove(task)) {
+ currentIndex--;
+ }
+ history.add(task);
+ currentIndex++;
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "could not add task to history", false);
+ }
+ }
+
+ public ITask getPreviousTask() {
+ try {
+ if (hasPrevious()) {
+ if ((currentIndex == 0 && !history.get(currentIndex).isActive())) {
+ return history.get(currentIndex);
+ } else {
+ return history.get(--currentIndex);
+ }
+ } else {
+ return null;
+ }
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "could not get previous task from history", false);
+ return null;
+ }
+ }
+
+ /**
+ * Get a list of the preceding tasks in the history. navigatedToTask(Task)
+ * should be called to notify the history if the user navigates to an
+ * arbitrary previous task from this list
+ *
+ * @author Wesley Coelho
+ */
+ public List<ITask> getPreviousTasks() {
+ try {
+
+ if (!hasPrevious()) {
+ return new ArrayList<ITask>();
+ }
+
+ if (history.get(currentIndex).isActive()) {
+ return history.subList(0, currentIndex);
+ } else {
+ return history.subList(0, currentIndex + 1);
+ }
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "could not get previous tasks from history", false);
+ return new ArrayList<ITask>();
+ }
+ }
+
+ /**
+ * Get a list of the next tasks in the history. navigatedToTask(Task) should
+ * be called to notify the history if the user navigates to an arbitrary
+ * next task from this list
+ *
+ * @author Wesley Coelho
+ */
+ public List<ITask> getNextTasks() {
+ try {
+ return history.subList(currentIndex + 1, history.size());
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "could not get next tasks from history", false);
+ return new ArrayList<ITask>();
+ }
+ }
+
+ /**
+ * Use this method to notify the task history that the user has navigated to
+ * an arbitrary task in the history without using getNextTask() or
+ * getPreviousTask()
+ *
+ * @author Wesley Coelho
+ */
+ public void navigatedToTask(ITask task) {
+ for (int i = 0; i < history.size(); i++) {
+ if (history.get(i).getHandleIdentifier() != null
+ && history.get(i).getHandleIdentifier().equals(task.getHandleIdentifier())) {
+ currentIndex = i;
+ break;
+ }
+ }
+ }
+
+ public boolean hasPrevious() {
+ try {
+ if (!persistentHistoryLoaded) {
+ loadPersistentHistory();
+ persistentHistoryLoaded = true;
+ }
+
+ return (currentIndex == 0 && !history.get(currentIndex).isActive()) || currentIndex > 0;
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "could determine previous task", false);
+ return false;
+ }
+ }
+
+ public ITask getNextTask() {
+ try {
+ if (hasNext()) {
+ return history.get(++currentIndex);
+ } else {
+ return null;
+ }
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "could not get next task", false);
+ return null;
+ }
+ }
+
+ public boolean hasNext() {
+ try {
+ return currentIndex < history.size() - 1;
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "could not get next task", false);
+ return false;
+ }
+ }
+
+ public void clear() {
+ try {
+ history.clear();
+ currentIndex = -1;
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "could not clear history", false);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskElementLabelProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskElementLabelProvider.java
new file mode 100644
index 000000000..11fa88691
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskElementLabelProvider.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.views;
+
+import org.eclipse.jface.viewers.IColorProvider;
+import org.eclipse.jface.viewers.IFontProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.mylar.internal.tasklist.ui.ITaskHighlighter;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskContainer;
+import org.eclipse.mylar.provisional.tasklist.ITaskListElement;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskCategory;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskElementLabelProvider extends LabelProvider implements IColorProvider, IFontProvider {
+
+ @Override
+ public Image getImage(Object element) {
+ if (element instanceof TaskCategory) {
+ TaskCategory category = (TaskCategory) element;
+ if (category.isArchive()) {
+ return TaskListImages.getImage(TaskListImages.CATEGORY_ARCHIVE);
+ } else {
+ return TaskListImages.getImage(TaskListImages.CATEGORY);
+ }
+ } else if (element instanceof AbstractRepositoryQuery) {
+ return TaskListImages.getImage(TaskListImages.QUERY);
+ } else if (element instanceof AbstractQueryHit) {
+ AbstractQueryHit hit = (AbstractQueryHit)element;
+ if (hit.getCorrespondingTask() != null) {
+ return getImage(hit.getCorrespondingTask());
+ } else {
+ return TaskListImages.getImage(TaskListImages.TASK_REMOTE);
+ }
+ } else if (element instanceof AbstractRepositoryTask) {
+// if (((AbstractRepositoryTask)element).isPersistentInWorkspace()) {
+ return TaskListImages.getImage(TaskListImages.TASK_REPOSITORY);
+// } else {
+// return TaskListImages.getImage(TaskListImages.TASK_WEB);
+// }
+ } else if (element instanceof ITask) {
+ ITask task = (ITask)element;
+ String url = task.getUrl();
+ if (url != null && !url.trim().equals("") && !url.equals("http://")) {
+ return TaskListImages.getImage(TaskListImages.TASK_WEB);
+ } else {
+ return TaskListImages.getImage(TaskListImages.TASK);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public String getText(Object object) {
+ if (object instanceof ITaskListElement) {
+ ITaskListElement element = (ITaskListElement) object;
+ return element.getDescription();
+ } else {
+ return super.getText(object);
+ }
+ }
+
+ public Color getForeground(Object object) {
+ if (object instanceof ITaskContainer) {
+ for (ITask child : ((ITaskContainer) object).getChildren()) {
+ if (child.isActive()) {
+ return TaskListImages.COLOR_TASK_ACTIVE;
+ } else if (child.isPastReminder() && !child.isCompleted()) {
+ return TaskListImages.COLOR_TASK_OVERDUE;
+ }
+ }
+ } else if (object instanceof AbstractRepositoryQuery) {
+ for (ITaskListElement child : ((AbstractRepositoryQuery) object).getHits()) {
+ if (child instanceof AbstractQueryHit) {
+ ITask task = ((AbstractQueryHit) child).getCorrespondingTask();
+ if (task != null && task.isActive()) {
+ return TaskListImages.COLOR_TASK_ACTIVE;
+ }
+ }
+ }
+ } else if (object instanceof AbstractQueryHit && ((AbstractQueryHit) object).getCorrespondingTask() == null) {
+ AbstractQueryHit hit = (AbstractQueryHit) object;
+ if ((hit.getCorrespondingTask() != null && hit.getCorrespondingTask().isCompleted())
+ || hit.isCompleted()) {
+ return TaskListImages.COLOR_TASK_COMPLETED;
+ }
+ } else if (object instanceof ITaskListElement) {
+ ITask task = getCorrespondingTask((ITaskListElement) object);
+ if (task != null) {
+ if (task.isCompleted()) {
+ return TaskListImages.COLOR_TASK_COMPLETED;
+ } else if (task.isActive()) {
+ return TaskListImages.COLOR_TASK_ACTIVE;
+ } else if (task.isPastReminder()) {
+ return TaskListImages.COLOR_TASK_OVERDUE;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * TODO: move
+ */
+ public static ITask getCorrespondingTask(ITaskListElement element) {
+ if (element instanceof ITask) {
+ return (ITask) element;
+ } else if (element instanceof AbstractQueryHit) {
+ return ((AbstractQueryHit) element).getCorrespondingTask();
+ } else {
+ return null;
+ }
+ }
+
+ public Color getBackground(Object element) {
+ if (element instanceof ITask) {
+ ITask task = (ITask) element;
+ ITaskHighlighter highlighter = MylarTaskListPlugin.getDefault().getHighlighter();
+ if (highlighter != null) {
+ return highlighter.getHighlightColor(task);
+ }
+ }
+ return TaskListImages.BACKGROUND_WHITE;
+ }
+
+ public Font getFont(Object element) {
+ if (!(element instanceof ITaskListElement)) {
+ return null;
+ }
+ ITask task = getCorrespondingTask((ITaskListElement) element);
+ if (task instanceof AbstractRepositoryTask) {
+ AbstractRepositoryTask repositoryTask = (AbstractRepositoryTask)task;
+ if (repositoryTask.isCurrentlyDownloading()) {
+ return TaskListImages.ITALIC;
+ }
+ }
+ if (element instanceof ITaskContainer) {
+ for (ITask child : ((ITaskContainer) element).getChildren()) {
+ if (child.isActive())
+ return TaskListImages.BOLD;
+ }
+ }
+ if (task != null) {
+ if (task.isActive())
+ return TaskListImages.BOLD;
+ for (ITask child : task.getChildren()) {
+ if (child.isActive())
+ return TaskListImages.BOLD;
+ }
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskInputDialog.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskInputDialog.java
new file mode 100644
index 000000000..851e4b292
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskInputDialog.java
@@ -0,0 +1,294 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.views;
+
+import java.util.Date;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.TaskListPreferenceConstants;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+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 static final String LABEL_SHELL = "New Personal Task";
+
+ private static final String LABEL_DESCRIPTION = "Description:";
+
+ private String taskName = "";
+
+ private String priority = "P3";
+
+ private String taskURL = "http://";
+
+ private Date reminderDate = null;
+
+ Text taskNameTextWidget = null;
+
+ private Text issueURLTextWidget = null;
+
+ private Button getDescButton = null;
+
+ public TaskInputDialog(Shell parentShell) {
+ super(parentShell);
+ }
+
+ 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(LABEL_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);
+// reminderLabel.setText("Reminder Date:");
+ final DatePicker datePicker = new DatePicker(composite, SWT.BORDER, "<reminder>");
+ 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("Clear");
+ removeReminder.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ datePicker.setDate(null);
+ reminderDate = null;
+ }
+ });
+
+//
+// datePicker.setLayout(new GridLayout());
+// GridData datePickerGD = new GridData();
+// datePickerGD.widthHint = 300;
+// datePicker.setLayoutData(datePickerGD);
+
+
+ Label urlLabel = new Label(composite, SWT.WRAP);
+ urlLabel.setText("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("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://"))) {
+ String defaultPrefix = MylarPlugin.getDefault().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)) {
+ return clipboardText;
+ }
+
+ String defaultPrefix = MylarPlugin.getDefault().getPreferenceStore().getString(
+ TaskListPreferenceConstants.DEFAULT_URL_PREFIX);
+ if (!defaultPrefix.equals("")) {
+ return defaultPrefix;
+ }
+
+ return taskURL;
+ }
+
+ /**
+ * Attempts to set the task pageTitle to the title from the specified url
+ */
+ protected void retrieveTaskDescription(final String url) {
+
+ try {
+ RetrieveTitleFromUrlJob job = new RetrieveTitleFromUrlJob(issueURLTextWidget.getText()) {
+
+ @Override
+ protected void setTitle(final String pageTitle) {
+ taskNameTextWidget.setText(pageTitle);
+ }
+
+ };
+ job.schedule();
+
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "could not open task web page", false);
+ }
+ }
+
+ /**
+ * 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 "";
+ }
+ }
+
+ public String getSelectedPriority() {
+ return priority;
+ }
+
+ public String getTaskname() {
+ return taskName;
+ }
+
+ public Date getReminderDate() {
+ return reminderDate;
+ }
+
+ public String getIssueURL() {
+ return taskURL;
+ }
+
+ protected void buttonPressed(int buttonId) {
+ if (buttonId == IDialogConstants.OK_ID) {
+ taskName = taskNameTextWidget.getText();
+ taskURL = issueURLTextWidget.getText();
+ } else {
+ taskName = null;
+ }
+ super.buttonPressed(buttonId);
+ }
+
+ protected void configureShell(Shell shell) {
+ super.configureShell(shell);
+ shell.setText(LABEL_SHELL);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListContentProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListContentProvider.java
new file mode 100644
index 000000000..efe75ff1a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListContentProvider.java
@@ -0,0 +1,254 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.views;
+
+import java.util.ArrayList;
+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.mylar.internal.tasklist.ui.AbstractTaskFilter;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskContainer;
+import org.eclipse.mylar.provisional.tasklist.ITaskListElement;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.Task;
+import org.eclipse.mylar.provisional.tasklist.TaskCategory;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListContentProvider implements IStructuredContentProvider, ITreeContentProvider {
+
+ private final TaskListView view;
+
+ private static class ContentTaskFilter extends AbstractTaskFilter {
+ @Override
+ public boolean select(Object element) {
+ return true;
+ }
+
+ @Override
+ public boolean shouldAlwaysShow(ITask task) {
+ return super.shouldAlwaysShow(task);
+ }
+ };
+
+ private ContentTaskFilter contentTaskFilter = new ContentTaskFilter();
+
+ public TaskListContentProvider(TaskListView view) {
+ this.view = view;
+ }
+
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+ this.view.expandToActiveTasks();
+ }
+
+ public void dispose() {
+ // ignore
+ }
+
+ public Object[] getElements(Object parent) {
+ if (parent.equals(this.view.getViewSite())) {
+ return applyFilter(MylarTaskListPlugin.getTaskListManager().getTaskList().getRootElements()).toArray();
+ }
+ return getChildren(parent);
+ }
+
+ public Object getParent(Object child) {
+ if (child instanceof ITask) {
+ if (((ITask) child).getParent() != null) {
+ return ((ITask) child).getParent();
+ } else {
+ return ((ITask) child).getCategory();
+ }
+ }
+ return null;
+ }
+
+ public Object[] getChildren(Object parent) {
+ return getFilteredChildrenFor(parent).toArray();
+ }
+
+ public boolean hasChildren(Object parent) {
+ if (parent instanceof TaskCategory) {
+ ITaskContainer cat = (ITaskContainer) parent;
+ return cat.getChildren() != null && cat.getChildren().size() > 0;
+ } else if (parent instanceof Task) {
+ Task t = (Task) parent;
+ return t.getChildren() != null && t.getChildren().size() > 0;
+ } else if (parent instanceof AbstractRepositoryQuery) {
+ AbstractRepositoryQuery t = (AbstractRepositoryQuery) parent;
+ return t.getHits() != null && t.getHits().size() > 0;
+ }
+ return false;
+ }
+
+ private List<ITaskListElement> applyFilter(Set<ITaskListElement> roots) {
+ String filterText = ((Text) this.view.getFilteredTree().getFilterControl()).getText();
+ if (containsNoFilterText(filterText)) {
+ List<ITaskListElement> filteredRoots = new ArrayList<ITaskListElement>();
+ for (ITaskListElement element : roots) {
+// for (int i = 0; i < list.size(); i++) {
+ if (element instanceof ITask) {
+ if (!filter(element)) {
+ filteredRoots.add(element);
+ }
+ } else if (element instanceof TaskCategory) {
+ if (selectCategory((TaskCategory)element)) {
+ filteredRoots.add(element);
+ }
+ } else if (element instanceof AbstractRepositoryQuery) {
+ if (selectQuery((AbstractRepositoryQuery)element)) {
+ filteredRoots.add(element);
+ }
+ }
+ }
+ return filteredRoots;
+ } else {
+ return new ArrayList<ITaskListElement>(roots);
+ }
+ }
+
+ /**
+ * See bug 109693
+ */
+ private boolean containsNoFilterText(String filterText) {
+ return filterText == null || filterText.length() == 0;
+ }
+
+ private boolean selectQuery(AbstractRepositoryQuery cat) {
+ Set<? extends ITaskListElement> list = cat.getHits();
+ if (list.size() == 0) {
+ return true;
+ }
+ for (ITaskListElement element : list) {
+ if (!filter(element)) {
+ return true;
+ }
+ }
+// for (int i = 0; i < list.size(); i++) {
+// if (!filter(list.get(i))) {
+// return true;
+// }
+// }
+ return false;
+ }
+
+ private boolean selectCategory(ITaskContainer cat) {
+ if (cat.isArchive()) {
+ for (ITask task : cat.getChildren()) {
+ if (contentTaskFilter.shouldAlwaysShow(task)) {
+ ITask t = MylarTaskListPlugin.getTaskListManager().getTaskForHandle(task.getHandleIdentifier(),
+ false);
+ if (t == null)
+ return true;
+ }
+ }
+ return false;
+ }
+ Set<? extends ITaskListElement> list = cat.getChildren();
+ if (list.size() == 0) {
+ return true;
+ }
+ for (ITaskListElement element : list) {
+ if (!filter(element)) {
+ return true;
+ }
+ }
+// for (int i = 0; i < list.size(); i++) {
+// if (!filter(list.get(i))) {
+// return true;
+// }
+// }
+ return false;
+ }
+
+ private List<Object> getFilteredChildrenFor(Object parent) {
+ if (containsNoFilterText(((Text) this.view.getFilteredTree().getFilterControl()).getText())
+ || ((Text) this.view.getFilteredTree().getFilterControl()).getText().startsWith(TaskListView.FILTER_LABEL)) {
+ List<Object> children = new ArrayList<Object>();
+ if (parent instanceof TaskCategory) {
+ if (((ITaskContainer) parent).isArchive()) {
+ for (ITask task : ((ITaskContainer) parent).getChildren()) {
+ if (contentTaskFilter.shouldAlwaysShow(task)) {
+ ITask t = MylarTaskListPlugin.getTaskListManager().getTaskForHandle(
+ task.getHandleIdentifier(), false);
+ if (t == null)
+ children.add(task);
+ }
+ }
+ return children;
+ }
+ Set<? extends ITaskListElement> list = ((ITaskContainer) parent).getChildren();
+ for (ITaskListElement element : list) {
+ if (!filter(element)) {
+ children.add(element);
+ }
+ }
+// for (int i = 0; i < list.size(); i++) {
+// if (!filter(list.get(i))) {
+// children.add(list.get(i));
+// }
+// }
+ return children;
+ } else if (parent instanceof AbstractRepositoryQuery) {
+ Set<? extends ITaskListElement> list = ((AbstractRepositoryQuery) parent).getHits();
+ for (ITaskListElement element : list) {
+ if (!filter(element)) {
+ children.add(element);
+ }
+ }
+// for (int i = 0; i < list.size(); i++) {
+// if (!filter(list.get(i))) {
+// children.add(list.get(i));
+// }
+// }
+ return children;
+ } else if (parent instanceof Task) {
+ Set<ITask> subTasks = ((Task) parent).getChildren();
+ for (ITask t : subTasks) {
+ if (!filter(t)) {
+ children.add(t);
+ }
+ }
+ return children;
+ }
+ } else {
+ List<Object> children = new ArrayList<Object>();
+ if (parent instanceof TaskCategory) {
+ children.addAll(((ITaskContainer) parent).getChildren());
+ return children;
+ } else if (parent instanceof AbstractRepositoryQuery) {
+ children.addAll(((AbstractRepositoryQuery) parent).getHits());
+ return children;
+ } else if (parent instanceof Task) {
+ children.addAll(((Task) parent).getChildren());
+ return children;
+ }
+ }
+ return new ArrayList<Object>();
+ }
+
+ private boolean filter(Object obj) {
+ for (AbstractTaskFilter filter : this.view.filters) {
+ if (!filter.select(obj)) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListDragSourceListener.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListDragSourceListener.java
new file mode 100644
index 000000000..98d2f56f1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListDragSourceListener.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.views;
+
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.DragSourceListener;
+
+/**
+ * @author Mik Kersten
+ */
+class TaskListDragSourceListener implements DragSourceListener {
+
+ static final String DELIM = ", ";
+
+ private final TaskListView view;
+
+ /**
+ * @param view
+ */
+ public TaskListDragSourceListener(TaskListView view) {
+ this.view = view;
+ }
+
+ public void dragStart(DragSourceEvent event) {
+ if (((StructuredSelection) this.view.getViewer().getSelection()).isEmpty()) {
+ event.doit = false;
+ }
+ }
+
+ public void dragSetData(DragSourceEvent event) {
+ event.data = "task-drag";
+ // StructuredSelection selection = (StructuredSelection)
+ // this.view.getViewer().getSelection();
+ // String data = "task-drag";
+ // for (Object selectedObject : ((IStructuredSelection)
+ // selection).toList()) {
+ // if (selectedObject instanceof ITaskListElement) {
+ // ITaskListElement element = (ITaskListElement) selectedObject;
+ // if (element.isDragAndDropEnabled()) {
+ // data += "task"
+ // data += element.getHandleIdentifier() + DELIM;
+ // }
+ // }
+ // }
+ // if (data != null) {
+ // event.data = data;
+ // } else {
+ // event.data = "null";
+ // }
+ }
+
+ public void dragFinished(DragSourceEvent event) {
+ // don't care if the drag is done
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListDropAdapter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListDropAdapter.java
new file mode 100644
index 000000000..e2cba5d46
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListDropAdapter.java
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.views;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerDropAdapter;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListUiUtil;
+import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskListElement;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.Task;
+import org.eclipse.mylar.provisional.tasklist.TaskCategory;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.TransferData;
+
+/**
+ * @author Mik Kersten
+ * @author Robert Elves (added URL based task creation support)
+ */
+public class TaskListDropAdapter extends ViewerDropAdapter {
+
+ private Task newTask = null;
+
+ public TaskListDropAdapter(Viewer viewer) {
+ super(viewer);
+ setFeedbackEnabled(true);
+ }
+
+ @Override
+ public boolean performDrop(Object data) {
+
+ Object currentTarget = getCurrentTarget();
+ List<ITask> tasksToMove = new ArrayList<ITask>();
+
+ if (isUrl(data) && createTaskFromUrl(data)) {
+ tasksToMove.add(newTask);
+ } else {
+ ISelection selection = ((TreeViewer) getViewer()).getSelection();
+ for (Object selectedObject : ((IStructuredSelection) selection).toList()) {
+ ITask toMove = null;
+ if (selectedObject instanceof ITask) {
+ toMove = (ITask) selectedObject;
+ } else if (selectedObject instanceof AbstractQueryHit) {
+ toMove = ((AbstractQueryHit) selectedObject).getOrCreateCorrespondingTask();
+ }
+ if (toMove != null) {
+ tasksToMove.add(toMove);
+ }
+ }
+ }
+
+ for (ITask task : tasksToMove) {
+ if (currentTarget instanceof TaskCategory) {
+ MylarTaskListPlugin.getTaskListManager().moveToCategory((TaskCategory) currentTarget, task);
+ } else if (currentTarget instanceof ITask) {
+ ITask targetTask = (ITask) currentTarget;
+ if (targetTask.getCategory() == null) {
+ MylarTaskListPlugin.getTaskListManager().moveToRoot(task);
+ } else {
+ MylarTaskListPlugin.getTaskListManager().moveToCategory((TaskCategory) targetTask.getCategory(),
+ task);
+ }
+ } else if (currentTarget == null) {
+ MylarTaskListPlugin.getTaskListManager().moveToRoot(newTask);
+ }
+ }
+
+ // Make new task the current selection in the view
+ if (newTask != null) {
+ StructuredSelection ss = new StructuredSelection(newTask);
+ getViewer().setSelection(ss);
+ getViewer().refresh();
+ }
+
+ return true;
+
+ }
+
+ /**
+ * @return true if string is a http(s) url
+ */
+ public boolean isUrl(Object data) {
+ String uri = "";
+ if (data instanceof String) {
+ uri = (String) data;
+ if ((uri.startsWith("http://") || uri.startsWith("https://"))) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @param data
+ * string containing url and title separated by <quote>\n</quote>
+ * @return true if task succesfully created, false otherwise
+ */
+ public boolean createTaskFromUrl(Object data) {
+
+ if (!(data instanceof String))
+ return false;
+
+ String[] urlTransfer = ((String) data).split("\n");
+
+ String url = "";
+ String urlTitle = "<retrieving from URL>";
+
+ if (urlTransfer.length > 0) {
+ url = urlTransfer[0];
+ } else {
+ return false;
+ }
+
+ // Removed in order to default to retrieving title from url rather than
+ // accepting what was sent by the brower's DnD code. (see bug 114401)
+ // If a Title is provided, use it.
+ // if (urlTransfer.length > 1) {
+ // urlTitle = urlTransfer[1];
+ // }
+ // if (urlTransfer.length < 2) { // no title provided
+ // retrieveTaskDescription(url);
+ // }
+ retrieveTaskDescription(url);
+
+ newTask = new Task(MylarTaskListPlugin.getTaskListManager().genUniqueTaskHandle(), urlTitle, true);
+
+ if (newTask == null) {
+ return false;
+ }
+
+ newTask.setPriority(Task.PriorityLevel.P3.toString());
+ newTask.setUrl(url);
+ TaskListUiUtil.openEditor(newTask);
+// newTask.openTaskInEditor(true);
+
+ return true;
+
+ }
+
+ @Override
+ public boolean validateDrop(Object targetObject, int operation, TransferData transferType) {
+ Object selectedObject = ((IStructuredSelection) ((TreeViewer) getViewer()).getSelection()).getFirstElement();
+ if (!(selectedObject instanceof AbstractRepositoryQuery)) {
+// if (selectedObject instanceof ITaskListElement && ((ITaskListElement) selectedObject).isDragAndDropEnabled()) {
+ if (getCurrentTarget() instanceof TaskCategory) {
+ return true;
+ } else if (getCurrentTarget() instanceof ITaskListElement
+ && (getCurrentLocation() == ViewerDropAdapter.LOCATION_AFTER || getCurrentLocation() == ViewerDropAdapter.LOCATION_BEFORE)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ return TextTransfer.getInstance().isSupportedType(transferType);
+ }
+
+ /**
+ * Attempts to set the task pageTitle to the title from the specified url
+ */
+ protected void retrieveTaskDescription(final String url) {
+
+ try {
+ RetrieveTitleFromUrlJob job = new RetrieveTitleFromUrlJob(url) {
+ @Override
+ protected void setTitle(final String pageTitle) {
+ newTask.setDescription(pageTitle);
+ MylarTaskListPlugin.getTaskListManager().notifyLocalInfoChanged(newTask);
+ }
+ };
+ job.schedule();
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "could not open task web page", false);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListFilteredTree.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListFilteredTree.java
new file mode 100644
index 000000000..85f387a1e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListFilteredTree.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.views;
+
+import java.lang.reflect.Field;
+
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+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.ui.dialogs.FilteredTree;
+import org.eclipse.ui.dialogs.PatternFilter;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListFilteredTree extends FilteredTree {
+
+ private static final int LABEL_MAX_SIZE = 30;
+
+ private static final int DELAY_REFRESH = 700;
+
+ private static final String LABEL_FIND = " Find:";
+
+ private static final String LABEL_NO_ACTIVE = " <no active task>";
+
+ private Job refreshJob;
+
+ private Hyperlink activeTaskLabel;
+
+ public TaskListFilteredTree(Composite parent, int treeStyle, PatternFilter filter) {
+ super(parent, treeStyle, filter);
+ Field refreshField;
+ try {
+ // HACK: using reflection to gain access
+ refreshField = FilteredTree.class.getDeclaredField("refreshJob");
+ refreshField.setAccessible(true);
+ refreshJob = (Job)refreshField.get(this);
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, "Could not get refresh job", false);
+ }
+ }
+
+ @Override
+ protected Composite createFilterControls(Composite parent){
+ Composite container = new Composite(parent, SWT.NULL);
+ GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+ container.setLayoutData(gridData);
+ GridLayout gridLayout = new GridLayout(4, false);
+ gridLayout.marginHeight = 0;
+ gridLayout.marginWidth = 0;
+ container.setLayout(gridLayout);
+
+ Label label = new Label(container, SWT.LEFT);
+ label.setText(LABEL_FIND);
+
+ super.createFilterControls(container);
+// patternFilter.setSize(100, patternFilter.getSize().y);
+
+ activeTaskLabel = new Hyperlink(container, SWT.RIGHT);
+ activeTaskLabel.setText(LABEL_NO_ACTIVE);
+ ITask activeTask = MylarTaskListPlugin.getTaskListManager().getTaskList().getActiveTask();
+ if (activeTask != null) {
+ indicateActiveTask(activeTask);
+ }
+ activeTaskLabel.addMouseListener(new MouseListener() {
+
+ public void mouseDoubleClick(MouseEvent e) {
+ // ignore
+ }
+
+ public void mouseDown(MouseEvent e) {
+ TaskListFilteredTree.super.filterText.setText("");
+ TaskListFilteredTree.this.textChanged(0);
+ TaskListView.getDefault().selectedAndFocusTask(
+ MylarTaskListPlugin.getTaskListManager().getTaskList().getActiveTask()
+ );
+ }
+
+ public void mouseUp(MouseEvent e) {
+ // ignore
+ }
+ });
+
+ return container;
+ }
+
+ protected void textChanged() {
+ textChanged(DELAY_REFRESH);
+ //refreshJob.schedule(200);
+ }
+
+ public void textChanged(int delay) {
+ if (refreshJob != null) {
+ refreshJob.schedule(delay);
+ }
+ }
+
+ public void indicateActiveTask(ITask task) {
+ String text = task.getDescription();
+ if (text.length() > LABEL_MAX_SIZE) {
+ text = text.substring(0, LABEL_MAX_SIZE);
+ }
+ activeTaskLabel.setText(text);
+ activeTaskLabel.setUnderlined(true);
+ }
+
+ public void indicateNoActiveTask() {
+ activeTaskLabel.setText(LABEL_NO_ACTIVE);
+ activeTaskLabel.setUnderlined(false);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListTableLabelProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListTableLabelProvider.java
new file mode 100644
index 000000000..0e30f8467
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListTableLabelProvider.java
@@ -0,0 +1,143 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.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.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskContainer;
+import org.eclipse.mylar.provisional.tasklist.ITaskListElement;
+import org.eclipse.mylar.provisional.tasklist.Task;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListTableLabelProvider extends DecoratingLabelProvider implements ITableLabelProvider,
+ ITableColorProvider, ITableFontProvider {
+
+ private Color parentBackgroundColor;
+
+ public TaskListTableLabelProvider(ILabelProvider provider, ILabelDecorator decorator, Color parentBacground) {
+ super(provider, decorator);
+ this.parentBackgroundColor = parentBacground;
+ }
+
+ public Image getImageForPriority(Task.PriorityLevel priorityLevel) {
+ switch (priorityLevel) {
+ case P1:
+ return TaskListImages.getImage(TaskListImages.TASK_ACTIVE);
+ case P2:
+ return TaskListImages.getImage(TaskListImages.NAVIGATE_NEXT);
+ case P3:
+ return TaskListImages.getImage(TaskListImages.NAVIGATE_PREVIOUS);
+ case P4:
+ return TaskListImages.getImage(TaskListImages.GO_UP);
+ case P5:
+ return TaskListImages.getImage(TaskListImages.GO_INTO);
+ default:
+ return TaskListImages.getImage(TaskListImages.OVERLAY_INCOMMING);
+ }
+ }
+
+ public String getColumnText(Object obj, int columnIndex) {
+ if (obj instanceof ITaskListElement) {
+ ITaskListElement element = (ITaskListElement) obj;
+ switch (columnIndex) {
+ case 0:
+ return null;
+ case 1:
+ return null;
+ case 2:
+ if (element instanceof ITaskContainer || element instanceof AbstractRepositoryQuery) {
+ return null;
+ } else {
+ return element.getPriority();
+ }
+ case 3:
+ return super.getText(obj);
+ }
+ }
+ return null;
+ }
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ if (!(element instanceof ITaskListElement)) {
+ return null;
+ }
+ if (columnIndex == 0) {
+ if (element instanceof ITaskContainer) {
+ return super.getImage(element);
+ } else {
+ ITask task = TaskElementLabelProvider.getCorrespondingTask((ITaskListElement)element);
+ if (task != null) {
+ if (task.isActive()) {
+ return TaskListImages.getImage(TaskListImages.TASK_ACTIVE);
+ } else {
+ if (MylarPlugin.getContextManager().hasContext(task.getHandleIdentifier())) {
+ return TaskListImages.getImage(TaskListImages.TASK_INACTIVE_CONTEXT);
+ } else {
+ return TaskListImages.getImage(TaskListImages.TASK_INACTIVE);
+ }
+ }
+ } else {
+ return TaskListImages.getImage(TaskListImages.TASK_INACTIVE);
+ }
+ }
+ } else if (columnIndex == 1) {
+ if (element instanceof ITaskContainer || element instanceof AbstractRepositoryQuery) {
+ return null;
+ }
+ return super.getImage(element);
+// } else if (columnIndex == 2) {
+// if (element instanceof ITaskListElement && !(element instanceof ITaskContainer)) {
+// ITaskListElement taskElement = (ITaskListElement) element;
+// return getImageForPriority(PriorityLevel.fromString(taskElement.getPriority()));
+// }
+ }
+ 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) {
+ ITaskContainer category = (ITaskContainer) element;
+ if (category.isArchive()) {
+ return TaskListImages.BACKGROUND_ARCHIVE;
+ } else {
+ return parentBackgroundColor;
+ }
+ } else if (element instanceof AbstractRepositoryQuery) {
+ return parentBackgroundColor;
+ }
+
+ return super.getBackground(element);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListToolTipHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListToolTipHandler.java
new file mode 100644
index 000000000..f318f96fb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListToolTipHandler.java
@@ -0,0 +1,298 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+/**
+ * Copied from newsgroup, forwarded from Make Technologies
+ */
+
+package org.eclipse.mylar.internal.tasklist.ui.views;
+
+import java.util.Date;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask;
+import org.eclipse.mylar.provisional.tasklist.ITaskListElement;
+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.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+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;
+
+/**
+ * @author Mik Kersten
+ * @author Eric Booth
+ */
+public class TaskListToolTipHandler {
+
+ private Shell tipShell;
+
+ private Label tipLabelImage;
+
+ private Label tipLabelText;
+
+ private Widget tipWidget; // widget this tooltip is hovering over
+
+ protected Point tipPosition; // the position being hovered over on the
+
+ protected Point widgetPosition; // the position hovered over in the Widget;
+
+ public TaskListToolTipHandler(Shell parentShell) {
+ if (parentShell != null) {
+ tipShell = createTipShell(parentShell);
+ }
+ }
+
+ private Shell createTipShell(Shell parent) {
+ Shell tipShell = new Shell(parent, SWT.NONE);
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 2;
+ gridLayout.marginWidth = 2;
+ gridLayout.marginHeight = 2;
+ tipShell.setLayout(gridLayout);
+ tipShell.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+
+ tipLabelImage = new Label(tipShell, SWT.NONE);
+ tipLabelImage.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
+ tipLabelImage.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+
+ GridData imageGridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING);
+ tipLabelImage.setLayoutData(imageGridData);
+
+ tipLabelText = new Label(tipShell, SWT.NONE);
+ tipLabelText.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
+ tipLabelText.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+
+ GridData textGridData = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER);
+ tipLabelText.setLayoutData(textGridData);
+
+ return tipShell;
+ }
+
+ private ITaskListElement getTaskListElement(Object hoverObject) {
+ if (hoverObject instanceof Widget) {
+ Object data = ((Widget) hoverObject).getData();
+ if (data != null) {
+ if (data instanceof ITaskListElement) {
+ return (ITaskListElement) data;
+ } else if (data instanceof IAdaptable) {
+ return (ITaskListElement) ((IAdaptable) data).getAdapter(ITaskListElement.class);
+ }
+ }
+ }
+ return null;
+ }
+
+ protected String getToolTipText(Object object) {
+ ITaskListElement element = getTaskListElement(object);
+ if (element instanceof AbstractRepositoryQuery) {
+ AbstractRepositoryQuery query = (AbstractRepositoryQuery) element;
+ String tooltip = "";
+ if (query.getHits().size() == 1) {
+ tooltip += "1 hit";
+ } else {
+ tooltip += query.getHits().size() + " hits";
+ }
+ if (query.getMaxHits() != -1) {
+ tooltip += " (max set to: " + query.getMaxHits() + ")";
+ }
+ tooltip += formatLastRefreshTime(query.getLastRefresh());
+ return tooltip;
+ } else if (element instanceof AbstractRepositoryTask || element instanceof AbstractQueryHit) {
+ AbstractRepositoryTask repositoryTask;
+ if (element instanceof AbstractQueryHit) {
+ repositoryTask = ((AbstractQueryHit)element).getCorrespondingTask();
+ } else {
+ repositoryTask = (AbstractRepositoryTask) element;
+ }
+ String toolTip = ((ITaskListElement)element).getDescription();
+ if (repositoryTask != null) {
+ Date lastRefresh = repositoryTask.getLastRefresh();
+ if (lastRefresh != null) {
+ toolTip += formatLastRefreshTime(repositoryTask.getLastRefresh());
+ }
+ }
+ return toolTip;
+ } else if (element != null) {
+ return ((ITaskListElement) element).getDescription();
+ } else if (object instanceof Control) {
+ return (String) ((Control) object).getData("TIP_TEXT");
+ }
+ return null;
+ }
+
+ private String formatLastRefreshTime(Date lastRefresh) {
+ String toolTip = "\n---------------\n" + "Last synchronized: ";
+ Date timeNow = new Date();
+ if (lastRefresh == null)
+ lastRefresh = new Date();
+ long timeDifference = (timeNow.getTime() - lastRefresh.getTime()) / 60000;
+ long minutes = timeDifference % 60;
+ timeDifference /= 60;
+ long hours = timeDifference % 24;
+ timeDifference /= 24;
+ if (timeDifference > 0) {
+ toolTip += timeDifference + ((timeDifference == 1) ? " day, " : " days, ");
+ }
+ if (hours > 0 || timeDifference > 0) {
+ toolTip += hours + ((hours == 1) ? " hour, " : " hours, ");
+ }
+ toolTip += minutes + ((minutes == 1) ? " minute " : " minutes ") + "ago";
+ return toolTip;
+ }
+
+ protected Image getToolTipImage(Object object) {
+ if (object instanceof Control) {
+ return (Image) ((Control) object).getData("TIP_IMAGE");
+ }
+ return null;
+ }
+
+ protected Object getToolTipHelp(Object object) {
+ if (object instanceof Control) {
+ return (String) ((Control) object).getData("TIP_HELPTEXT");
+ }
+ return null;
+ }
+
+ /**
+ * Enables customized hover help for a specified control
+ *
+ * @control the control on which to enable hoverhelp
+ */
+ public void activateHoverHelp(final Control control) {
+
+ /*
+ * Get out of the way if we attempt to activate the control underneath
+ * the tooltip
+ */
+ control.addMouseListener(new MouseAdapter() {
+
+ @Override
+ public void mouseDown(MouseEvent e) {
+ if (tipShell.isVisible())
+ tipShell.setVisible(false);
+ }
+ });
+ /*
+ * Trap hover events to pop-up tooltip
+ */
+ control.addMouseTrackListener(new MouseTrackAdapter() {
+
+ @Override
+ public void mouseExit(MouseEvent e) {
+ if (tipShell != null && tipShell.isVisible()) {
+ tipShell.setVisible(false);
+ }
+ tipWidget = null;
+ }
+
+ @Override
+ public void mouseHover(MouseEvent event) {
+ 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) {
+ tipShell.setVisible(false);
+ tipWidget = null;
+ return;
+ }
+ if (widget == tipWidget)
+ return;
+ tipWidget = widget;
+ tipPosition = control.toDisplay(widgetPosition);
+ String text = getToolTipText(widget);
+ Image image = getToolTipImage(widget);
+ if (text == null) { // HACK: don't check length
+ return;
+ }
+
+ if (tipShell.getShell() != null && tipShell.getShell().getParent() != null
+ && Display.getCurrent().getActiveShell() != null
+ && tipShell.getShell().getParent() != Display.getCurrent().getActiveShell()) {
+ tipShell.close();
+ tipShell = createTipShell(Display.getCurrent().getActiveShell());
+ }
+
+ tipLabelText.setText(text);
+ tipLabelImage.setImage(image); // accepts null
+ tipShell.pack();
+ setHoverLocation(tipShell, tipPosition);
+ tipShell.setVisible(true);
+ }
+ });
+ // /*
+ // * Trap F1 Help to pop up a custom help box
+ // */
+ // control.addHelpListener(new HelpListener() {
+ // public void helpRequested(HelpEvent event) {
+ // if (tipWidget == null)
+ // return;
+ // Object help = getToolTipHelp(tipWidget);
+ // if (help == null)
+ // return;
+ // if (help.getClass() != String.class) {
+ // return;
+ // }
+ // if (tipShell.isVisible()) {
+ // tipShell.setVisible(false);
+ // Shell helpShell = new Shell(parentShell, SWT.SHELL_TRIM);
+ // helpShell.setLayout(new FillLayout());
+ // Label label = new Label(helpShell, SWT.NONE);
+ // label.setText((String) help);
+ // helpShell.pack();
+ // setHoverLocation(helpShell, tipPosition);
+ // helpShell.open();
+ // }
+ // }
+ // });
+ }
+
+ /**
+ * 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.getDisplay().getBounds();
+ Rectangle shellBounds = shell.getBounds();
+ shellBounds.x = Math.max(Math.min(position.x, displayBounds.width - shellBounds.width), 0);
+ shellBounds.y = Math.max(Math.min(position.y + 10, displayBounds.height - shellBounds.height), 0);
+ shell.setBounds(shellBounds);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListView.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListView.java
new file mode 100644
index 000000000..048296716
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskListView.java
@@ -0,0 +1,1398 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.views;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+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.IMenuCreator;
+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.dialogs.InputDialog;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.CheckboxCellEditor;
+import org.eclipse.jface.viewers.ComboBoxCellEditor;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.ICellModifier;
+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.StructuredSelection;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylar.internal.core.dt.MylarWebRef;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.ui.AbstractTaskFilter;
+import org.eclipse.mylar.internal.tasklist.ui.IDynamicSubMenuContributor;
+import org.eclipse.mylar.internal.tasklist.ui.TaskCompleteFilter;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListPatternFilter;
+import org.eclipse.mylar.internal.tasklist.ui.TaskPriorityFilter;
+import org.eclipse.mylar.internal.tasklist.ui.actions.CollapseAllAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.CopyDescriptionAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.DeleteAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.FilterCompletedTasksAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.GoIntoAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.GoUpAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.MarkTaskCompleteAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.MarkTaskIncompleteAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.NewCategoryAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.NewLocalTaskAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.NextTaskDropDownAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.OpenTaskInExternalBrowserAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.OpenTaskListElementAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.PreviousTaskDropDownAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.RemoveFromCategoryAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.RenameAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.TaskActivateAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.TaskDeactivateAction;
+import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskActivityListener;
+import org.eclipse.mylar.provisional.tasklist.ITaskContainer;
+import org.eclipse.mylar.provisional.tasklist.ITaskListElement;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.Task;
+import org.eclipse.mylar.provisional.tasklist.TaskCategory;
+import org.eclipse.mylar.provisional.tasklist.TaskList;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+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.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.FilteredTree;
+import org.eclipse.ui.part.DrillDownAdapter;
+import org.eclipse.ui.part.PluginTransfer;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * @author Mik Kersten
+ * @author Ken Sueda
+ */
+public class TaskListView extends ViewPart {
+
+ private static final String SEPARATOR_LOCAL = "local";
+
+ private static final String SEPARATOR_CONTEXT = "context";
+
+ private static final String SEPARATOR_REPORTS = "reports";
+
+ private static final String LABEL_NO_TASKS = "no task active";
+
+ public static final String ID = "org.eclipse.mylar.tasks.ui.views.TaskListView";
+
+ public static final String[] PRIORITY_LEVELS = { Task.PriorityLevel.P1.toString(),
+ Task.PriorityLevel.P2.toString(), Task.PriorityLevel.P3.toString(), Task.PriorityLevel.P4.toString(),
+ Task.PriorityLevel.P5.toString() };
+
+ private static final String SEPARATOR_ID_REPORTS = SEPARATOR_REPORTS;
+
+ private static final String PART_NAME = "Mylar Tasks";
+
+ private static TaskListView INSTANCE;
+
+ private TaskListFilteredTree filteredTree;
+
+ private DrillDownAdapter drillDownAdapter;
+
+ private ITaskContainer drilledIntoCategory = null;
+
+ private GoIntoAction goIntoAction;
+
+ private GoUpAction goUpAction;
+
+ private CopyDescriptionAction copyDescriptionAction;
+
+ private OpenTaskListElementAction openTaskEditor;
+
+ private OpenTaskInExternalBrowserAction openUrlInExternal;
+
+ private NewLocalTaskAction newLocalTaskAction;
+
+ private NewCategoryAction newCategoryAction;
+
+ private RenameAction renameAction;
+
+ private CollapseAllAction collapseAll;
+
+ private DeleteAction deleteAction;
+
+ private RemoveFromCategoryAction removeFromCategoryAction;
+
+ private TaskActivateAction activateAction = new TaskActivateAction();
+
+ private TaskDeactivateAction deactivateAction = new TaskDeactivateAction();
+
+ private MarkTaskCompleteAction markIncompleteAction;
+
+ private MarkTaskIncompleteAction markCompleteAction;
+
+ private FilterCompletedTasksAction filterCompleteTask;
+
+ private PriorityDropDownAction filterOnPriority;
+
+ private PreviousTaskDropDownAction previousTaskAction;
+
+ private NextTaskDropDownAction nextTaskAction;
+
+ // private WorkOfflineAction workOffline;
+
+ // private ManageEditorsAction autoClose;
+
+ private static TaskPriorityFilter PRIORITY_FILTER = new TaskPriorityFilter();
+
+ private static TaskCompleteFilter COMPLETE_FILTER = new TaskCompleteFilter();
+
+ List<AbstractTaskFilter> filters = new ArrayList<AbstractTaskFilter>();
+
+ static final String FILTER_LABEL = "<filter>";
+
+ protected String[] columnNames = new String[] { "", ".", "!", "Description" };
+
+ protected int[] columnWidths = new int[] { 60, 20, 20, 150 };
+
+ private TreeColumn[] columns;
+
+ private IMemento taskListMemento;
+
+ public static final String columnWidthIdentifier = "org.eclipse.mylar.tasklist.ui.views.tasklist.columnwidth";
+
+ public static final String tableSortIdentifier = "org.eclipse.mylar.tasklist.ui.views.tasklist.sortIndex";
+
+ private static final int DEFAULT_SORT_DIRECTION = -1;
+
+ private int sortIndex = 2;
+
+ private int sortDirection = DEFAULT_SORT_DIRECTION;
+
+ private TaskActivationHistory taskHistory = new TaskActivationHistory();
+
+ /**
+ * True if the view should indicate that interaction monitoring is paused
+ */
+ protected boolean isPaused = false;
+
+ private final ITaskActivityListener TASK_REFERESH_LISTENER = new ITaskActivityListener() {
+
+ public void taskActivated(ITask task) {
+ if (task != null) {
+ updateDescription(task);
+ selectedAndFocusTask(task);
+ filteredTree.indicateActiveTask(task);
+ }
+ }
+
+ public void tasksActivated(List<ITask> tasks) {
+ if (tasks.size() == 1) {
+ taskActivated(tasks.get(0));
+ }
+ }
+
+ public void taskDeactivated(ITask task) {
+ updateDescription(null);
+ filteredTree.indicateNoActiveTask();
+ }
+
+ public void localInfoChanged(ITask task) {
+ refreshTask(task);
+ }
+
+ public void repositoryInfoChanged(ITask task) {
+ refreshTask(task);
+ }
+
+ public void tasklistRead() {
+ refresh(null);
+ }
+
+ public void taskListModified() {
+ refresh(null);
+ }
+ };
+
+ private TaskListTableLabelProvider taskListTableLabelProvider;
+
+ private final class PriorityDropDownAction extends Action implements IMenuCreator {
+ private Menu dropDownMenu = null;
+
+ public PriorityDropDownAction() {
+ super();
+ setText("Priority Filter");
+ setToolTipText("Filter Priority Lower Than");
+ setImageDescriptor(TaskListImages.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() {
+ Action P1 = new Action(PRIORITY_LEVELS[0], AS_CHECK_BOX) {
+ @Override
+ public void run() {
+ MylarTaskListPlugin.setCurrentPriorityLevel(Task.PriorityLevel.P1);
+ PRIORITY_FILTER.displayPrioritiesAbove(PRIORITY_LEVELS[0]);
+ getViewer().refresh();
+ }
+ };
+ P1.setEnabled(true);
+ P1.setToolTipText(PRIORITY_LEVELS[0]);
+ ActionContributionItem item = new ActionContributionItem(P1);
+ item.fill(dropDownMenu, -1);
+
+ Action P2 = new Action(PRIORITY_LEVELS[1], AS_CHECK_BOX) {
+ @Override
+ public void run() {
+ MylarTaskListPlugin.setCurrentPriorityLevel(Task.PriorityLevel.P2);
+ PRIORITY_FILTER.displayPrioritiesAbove(PRIORITY_LEVELS[1]);
+ getViewer().refresh();
+ }
+ };
+ P2.setEnabled(true);
+ P2.setToolTipText(PRIORITY_LEVELS[1]);
+ item = new ActionContributionItem(P2);
+ item.fill(dropDownMenu, -1);
+
+ Action P3 = new Action(PRIORITY_LEVELS[2], AS_CHECK_BOX) {
+ @Override
+ public void run() {
+ MylarTaskListPlugin.setCurrentPriorityLevel(Task.PriorityLevel.P3);
+ PRIORITY_FILTER.displayPrioritiesAbove(PRIORITY_LEVELS[2]);
+ getViewer().refresh();
+ }
+ };
+ P3.setEnabled(true);
+ P3.setToolTipText(PRIORITY_LEVELS[2]);
+ item = new ActionContributionItem(P3);
+ item.fill(dropDownMenu, -1);
+
+ Action P4 = new Action(PRIORITY_LEVELS[3], AS_CHECK_BOX) {
+ @Override
+ public void run() {
+ MylarTaskListPlugin.setCurrentPriorityLevel(Task.PriorityLevel.P4);
+ PRIORITY_FILTER.displayPrioritiesAbove(PRIORITY_LEVELS[3]);
+ getViewer().refresh();
+ }
+ };
+ P4.setEnabled(true);
+ P4.setToolTipText(PRIORITY_LEVELS[3]);
+ item = new ActionContributionItem(P4);
+ item.fill(dropDownMenu, -1);
+
+ Action P5 = new Action(PRIORITY_LEVELS[4], AS_CHECK_BOX) {
+ @Override
+ public void run() {
+ MylarTaskListPlugin.setCurrentPriorityLevel(Task.PriorityLevel.P5);
+ PRIORITY_FILTER.displayPrioritiesAbove(PRIORITY_LEVELS[4]);
+ getViewer().refresh();
+ }
+ };
+ P5.setEnabled(true);
+ P5.setToolTipText(PRIORITY_LEVELS[4]);
+ item = new ActionContributionItem(P5);
+ item.fill(dropDownMenu, -1);
+
+ String priority = MylarTaskListPlugin.getCurrentPriorityLevel();
+ if (priority.equals(PRIORITY_LEVELS[0])) {
+ P1.setChecked(true);
+ } else if (priority.equals(PRIORITY_LEVELS[1])) {
+ P1.setChecked(true);
+ P2.setChecked(true);
+ } else if (priority.equals(PRIORITY_LEVELS[2])) {
+ P1.setChecked(true);
+ P2.setChecked(true);
+ P3.setChecked(true);
+ } else if (priority.equals(PRIORITY_LEVELS[3])) {
+ P1.setChecked(true);
+ P2.setChecked(true);
+ P3.setChecked(true);
+ P4.setChecked(true);
+ } else if (priority.equals(PRIORITY_LEVELS[4])) {
+ P1.setChecked(true);
+ P2.setChecked(true);
+ P3.setChecked(true);
+ P4.setChecked(true);
+ P5.setChecked(true);
+ }
+ }
+
+ public void run() {
+ this.setChecked(isChecked());
+ }
+ }
+
+ public static TaskListView openInActivePerspective() {
+ try {
+ return (TaskListView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(ID);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+
+ public TaskListView() {
+ INSTANCE = this;
+ MylarTaskListPlugin.getTaskListManager().addListener(TASK_REFERESH_LISTENER);
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ MylarTaskListPlugin.getTaskListManager().removeListener(TASK_REFERESH_LISTENER);
+ }
+
+ /**
+ * TODO: should be updated when view mode switches to fast and vice-versa
+ */
+ private void updateDescription(ITask task) {
+ if (getSite() == null || getSite().getPage() == null)
+ return;
+
+ IViewReference reference = getSite().getPage().findViewReference(ID);
+ boolean shouldSetDescription = false;
+ if (reference != null && reference.isFastView()) {
+ shouldSetDescription = true;
+ }
+
+ if (task != null) {
+ setTitleToolTip(PART_NAME + " (" + task.getDescription() + ")");
+ if (shouldSetDescription) {
+ setContentDescription(task.getDescription());
+ } else {
+ setContentDescription("");
+ }
+ } else {
+ setTitleToolTip(PART_NAME);
+ if (shouldSetDescription) {
+ setContentDescription(LABEL_NO_TASKS);
+ } else {
+ setContentDescription("");
+ }
+ }
+ }
+
+ class TaskListCellModifier implements ICellModifier {
+
+ public boolean canModify(Object element, String property) {
+ int columnIndex = Arrays.asList(columnNames).indexOf(property);
+ if (columnIndex == 0 && element instanceof ITaskListElement) {
+ return element instanceof ITask || element instanceof AbstractQueryHit;
+ // return ((ITaskListElement) element).isActivatable();
+ } else if (columnIndex == 2 && element instanceof ITask) {
+ return ((ITask) element).isLocal();
+ } else if (element instanceof ITaskListElement && isInRenameAction) {
+ ITaskListElement taskListElement = (ITaskListElement) element;
+ switch (columnIndex) {
+ case 3:
+ return taskListElement.isLocal();
+ }
+ }
+ return false;
+ }
+
+ public Object getValue(Object element, String property) {
+ try {
+ int columnIndex = Arrays.asList(columnNames).indexOf(property);
+ if (element instanceof ITaskListElement) {
+ final ITaskListElement taskListElement = (ITaskListElement) element;
+ ITask task = null;
+ if (taskListElement instanceof ITask) {
+ task = (ITask) taskListElement;
+ } else if (taskListElement instanceof AbstractQueryHit) {
+ if (((AbstractQueryHit) taskListElement).getCorrespondingTask() != null) {
+ task = ((AbstractQueryHit) taskListElement).getCorrespondingTask();
+ }
+ }
+ switch (columnIndex) {
+ case 0:
+ if (task == null) {
+ return Boolean.TRUE;
+ } else {
+ return new Boolean(task.isCompleted());
+ }
+ case 1:
+ return "";
+ case 2:
+ String priorityString = taskListElement.getPriority().substring(1);
+ int priorityInt = new Integer(priorityString);
+ return priorityInt - 1;
+ case 3:
+ return taskListElement.getDescription();
+ }
+ } else if (element instanceof ITaskContainer) {
+ ITaskContainer cat = (ITaskContainer) element;
+ switch (columnIndex) {
+ case 0:
+ return new Boolean(false);
+ case 1:
+ return "";
+ case 2:
+ return "";
+ case 3:
+ return cat.getDescription();
+ }
+ } else if (element instanceof AbstractRepositoryQuery) {
+ AbstractRepositoryQuery cat = (AbstractRepositoryQuery) element;
+ switch (columnIndex) {
+ case 0:
+ return new Boolean(false);
+ case 1:
+ return "";
+ case 2:
+ return "";
+ case 3:
+ return cat.getDescription();
+ }
+ }
+ } catch (Exception e) {
+ MylarStatusHandler.log(e, e.getMessage());
+ }
+ return "";
+ }
+
+ public void modify(Object element, String property, Object value) {
+ int columnIndex = -1;
+ try {
+ columnIndex = Arrays.asList(columnNames).indexOf(property);
+ if (((TreeItem) element).getData() instanceof ITaskContainer) {
+ ITaskContainer cat = (ITaskContainer) ((TreeItem) element).getData();
+ switch (columnIndex) {
+ case 0:
+ break;
+ case 1:
+ break;
+ case 2:
+ break;
+ case 3:
+ cat.setDescription(((String) value).trim());
+ break;
+ }
+ } else if (((TreeItem) element).getData() instanceof AbstractRepositoryQuery) {
+ AbstractRepositoryQuery cat = (AbstractRepositoryQuery) ((TreeItem) element).getData();
+ switch (columnIndex) {
+ case 0:
+ break;
+ case 1:
+ break;
+ case 2:
+ break;
+ case 3:
+ cat.setDescription(((String) value).trim());
+ break;
+ }
+ } else if (((TreeItem) element).getData() instanceof ITaskListElement) {
+
+ final ITaskListElement taskListElement = (ITaskListElement) ((TreeItem) element).getData();
+ ITask task = null;
+ if (taskListElement instanceof ITask) {
+ task = (ITask) taskListElement;
+ } else if (taskListElement instanceof AbstractQueryHit) {
+ if (((AbstractQueryHit) taskListElement).getCorrespondingTask() != null) {
+ task = ((AbstractQueryHit) taskListElement).getCorrespondingTask();
+ }
+ }
+ switch (columnIndex) {
+ case 0:
+ if (taskListElement instanceof AbstractQueryHit) {
+ task = ((AbstractQueryHit) taskListElement).getOrCreateCorrespondingTask();
+ }
+ if (task != null) {
+ if (task.isActive()) {
+ new TaskDeactivateAction().run();
+ nextTaskAction.setEnabled(taskHistory.hasNext());
+ previousTaskAction.setEnabled(taskHistory.hasPrevious());
+ } else {
+ new TaskActivateAction().run();
+ addTaskToHistory(task);
+ }
+ }
+ break;
+ case 1:
+ break;
+ case 2:
+ if (task.isLocal()) {
+ Integer intVal = (Integer) value;
+ task.setPriority("P" + (intVal + 1));
+ MylarTaskListPlugin.getTaskListManager().notifyLocalInfoChanged(task);
+ }
+ break;
+ case 3:
+ if (task.isLocal()) {
+ task.setDescription(((String) value).trim());
+ // MylarTaskListPlugin.getTaskListManager().notifyTaskPropertyChanged(task,
+ // columnNames[3]);
+ MylarTaskListPlugin.getTaskListManager().notifyLocalInfoChanged(task);
+ }
+ break;
+ }
+ }
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, e.getMessage(), true);
+ }
+ getViewer().refresh();
+ }
+ }
+
+ public void addTaskToHistory(ITask task) {
+ if (!MylarTaskListPlugin.getDefault().isMultipleActiveTasksMode()) {
+ taskHistory.addTask(task);
+ nextTaskAction.setEnabled(taskHistory.hasNext());
+ previousTaskAction.setEnabled(taskHistory.hasPrevious());
+ }
+ }
+
+ public void clearTaskHistory() {
+ taskHistory.clear();
+ }
+
+ private class TaskListTableSorter extends ViewerSorter {
+
+ private String column;
+
+ public TaskListTableSorter(String column) {
+ super();
+ this.column = column;
+ }
+
+ /**
+ * 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 ITaskContainer && o2 instanceof ITaskContainer && ((ITaskContainer)o2).isArchive()) {
+ return -1;
+ }
+
+ if (o1 instanceof ITaskContainer && o2 instanceof ITask) {
+ return 1;
+ }
+ if (o1 instanceof ITaskContainer || o1 instanceof AbstractRepositoryQuery) {
+ if (o2 instanceof ITaskContainer || o2 instanceof AbstractRepositoryQuery) {
+ return sortDirection
+ * ((ITaskListElement) o1).getDescription().compareTo(
+ ((ITaskListElement) o2).getDescription());
+ } else {
+ return -1;
+ }
+ } else if (o1 instanceof ITaskListElement) {
+ if (o2 instanceof ITaskContainer || o2 instanceof AbstractRepositoryQuery) {
+ return -1;
+ } else if (o2 instanceof ITaskListElement) {
+ ITaskListElement element1 = (ITaskListElement) o1;
+ ITaskListElement element2 = (ITaskListElement) o2;
+
+ if (column != null && column.equals(columnNames[1])) {
+ return 0;
+ } else if (column == columnNames[2]) {
+ return sortDirection * element1.getPriority().compareTo(element2.getPriority());
+ } else if (column == columnNames[3]) {
+ String c1 = element1.getDescription();
+ String c2 = element2.getDescription();
+ try {
+ return new Integer(c1).compareTo(new Integer(c2));
+ } catch (Exception e) {
+ }
+
+ return sortDirection * c1.compareTo(c2);
+
+ } else {
+ return 0;
+ }
+ }
+ } else {
+ return 0;
+ }
+ return 0;
+ }
+ }
+
+ @Override
+ public void init(IViewSite site, IMemento memento) throws PartInitException {
+ init(site);
+ this.taskListMemento = memento;
+ }
+
+ @Override
+ public void saveState(IMemento memento) {
+ IMemento colMemento = memento.createChild(columnWidthIdentifier);
+
+ for (int i = 0; i < columnWidths.length; i++) {
+ IMemento m = colMemento.createChild("col" + i);
+ m.putInteger("width", columnWidths[i]);
+ }
+
+ IMemento sorter = memento.createChild(tableSortIdentifier);
+ IMemento m = sorter.createChild("sorter");
+ m.putInteger("sortIndex", sortIndex);
+ m.putInteger("sortDirection", sortDirection);
+ MylarTaskListPlugin.getDefault().getTaskListSaveManager().createTaskListBackupFile();
+
+ if (MylarTaskListPlugin.getDefault() != null) {
+ MylarTaskListPlugin.getDefault().getTaskListSaveManager().saveTaskListAndContexts();
+ }
+ }
+
+ private void restoreState() {
+ if (taskListMemento != null) {
+ IMemento taskListWidth = taskListMemento.getChild(columnWidthIdentifier);
+ if (taskListWidth != null) {
+ for (int i = 0; i < columnWidths.length; i++) {
+ IMemento m = taskListWidth.getChild("col" + i);
+ if (m != null) {
+ int width = m.getInteger("width");
+ columnWidths[i] = width;
+ columns[i].setWidth(width);
+ }
+ }
+ }
+ IMemento sorterMemento = taskListMemento.getChild(tableSortIdentifier);
+ if (sorterMemento != null) {
+ IMemento m = sorterMemento.getChild("sorter");
+ if (m != null) {
+ sortIndex = m.getInteger("sortIndex");
+ Integer sortDirInt = m.getInteger("sortDirection");
+ if (sortDirInt != null) {
+ sortDirection = sortDirInt.intValue();
+ }
+ } else {
+ sortIndex = 2;
+ sortDirection = DEFAULT_SORT_DIRECTION;
+ }
+
+ } else {
+ sortIndex = 2; // default priority
+ sortDirection = DEFAULT_SORT_DIRECTION;
+ }
+ getViewer().setSorter(new TaskListTableSorter(columnNames[sortIndex]));
+ }
+ addFilter(PRIORITY_FILTER);
+ // if (MylarTaskListPlugin.getDefault().isFilterInCompleteMode())
+ // MylarTaskListPlugin.getTaskListManager().getTaskList().addFilter(inCompleteFilter);
+ if (MylarTaskListPlugin.getDefault().isFilterCompleteMode())
+ addFilter(COMPLETE_FILTER);
+ if (MylarTaskListPlugin.getDefault().isMultipleActiveTasksMode()) {
+ togglePreviousAction(false);
+ toggleNextAction(false);
+ }
+
+ getViewer().refresh();
+ }
+
+ @Override
+ public void createPartControl(Composite parent) {
+ filteredTree = new TaskListFilteredTree(parent, SWT.MULTI | SWT.VERTICAL | SWT.H_SCROLL | SWT.V_SCROLL
+ | SWT.FULL_SELECTION | SWT.HIDE_SELECTION, new TaskListPatternFilter());
+ filteredTree.setInitialText("");
+
+ getViewer().getTree().setHeaderVisible(true);
+ getViewer().getTree().setLinesVisible(true);
+ getViewer().setColumnProperties(columnNames);
+ getViewer().setUseHashlookup(true);
+
+ columns = new TreeColumn[columnNames.length];
+ for (int i = 0; i < columnNames.length; i++) {
+ columns[i] = new TreeColumn(getViewer().getTree(), 0); // SWT.LEFT
+ columns[i].setText(columnNames[i]);
+ columns[i].setWidth(columnWidths[i]);
+ final int index = i;
+ columns[i].addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ sortIndex = index;
+ sortDirection *= DEFAULT_SORT_DIRECTION;
+ getViewer().setSorter(new TaskListTableSorter(columnNames[sortIndex]));
+ }
+ });
+ 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
+ }
+ });
+ }
+
+ taskListTableLabelProvider = new TaskListTableLabelProvider(new TaskElementLabelProvider(), PlatformUI.getWorkbench()
+ .getDecoratorManager().getLabelDecorator(), parent.getBackground());
+
+ CellEditor[] editors = new CellEditor[columnNames.length];
+ TextCellEditor textEditor = new TextCellEditor(getViewer().getTree());
+ ((Text) textEditor.getControl()).setOrientation(SWT.LEFT_TO_RIGHT);
+ editors[0] = new CheckboxCellEditor();
+ editors[1] = textEditor;
+ editors[2] = new ComboBoxCellEditor(getViewer().getTree(), PRIORITY_LEVELS, SWT.READ_ONLY);
+// editors[2] = new ImageTableCellEditor(getViewer().getTree(), getPirorityImages());
+ editors[3] = textEditor;
+ getViewer().setCellEditors(editors);
+ getViewer().setCellModifier(new TaskListCellModifier());
+ getViewer().setSorter(new TaskListTableSorter(columnNames[sortIndex]));
+
+ drillDownAdapter = new DrillDownAdapter(getViewer());
+ getViewer().setContentProvider(new TaskListContentProvider(this));
+ getViewer().setLabelProvider(taskListTableLabelProvider);
+ getViewer().setInput(getViewSite());
+ getViewer().getTree().addKeyListener(new KeyListener() {
+
+ public void keyPressed(KeyEvent e) {
+ if (e.keyCode == SWT.F2 && e.stateMask == 0) {
+ if (renameAction.isEnabled()) {
+ renameAction.run();
+ }
+ } else if (e.keyCode == 'c' && e.stateMask == SWT.MOD1) {
+ copyDescriptionAction.run();
+ } else if (e.keyCode == SWT.DEL) {
+ deleteAction.run();
+ } else if (e.keyCode == SWT.INSERT) {
+ newLocalTaskAction.run();
+ }
+ }
+
+ public void keyReleased(KeyEvent e) {
+ }
+
+ });
+
+ // HACK: shouldn't need to update explicitly
+ getViewer().addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ Object selectedObject = ((IStructuredSelection) getViewer().getSelection()).getFirstElement();
+ if (selectedObject instanceof ITaskListElement) {
+ updateActionEnablement(renameAction, (ITaskListElement) selectedObject);
+ }
+ }
+ });
+
+ makeActions();
+ hookContextMenu();
+ hookOpenAction();
+ contributeToActionBars();
+
+ TaskListToolTipHandler taskListToolTipHandler = new TaskListToolTipHandler(getViewer().getControl().getShell());
+ taskListToolTipHandler.activateHoverHelp(getViewer().getControl());
+
+ initDragAndDrop(parent);
+ expandToActiveTasks();
+ restoreState();
+
+ List<ITask> activeTasks = MylarTaskListPlugin.getTaskListManager().getTaskList().getActiveTasks();
+ if (activeTasks.size() > 0) {
+ updateDescription(activeTasks.get(0));
+ }
+ }
+
+ @MylarWebRef(name = "Drag and drop article", url = "http://www.eclipse.org/articles/Article-Workbench-DND/drag_drop.html")
+ private void initDragAndDrop(Composite parent) {
+ Transfer[] types = new Transfer[] { TextTransfer.getInstance(), PluginTransfer.getInstance() };
+
+ getViewer().addDragSupport(DND.DROP_MOVE, types, new TaskListDragSourceListener(this));
+
+ getViewer().addDropSupport(DND.DROP_COPY | DND.DROP_MOVE, types, new TaskListDropAdapter(getViewer()));
+ }
+
+ void expandToActiveTasks() {
+ final IWorkbench workbench = PlatformUI.getWorkbench();
+ workbench.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ List<ITask> activeTasks = MylarTaskListPlugin.getTaskListManager().getTaskList().getActiveTasks();
+ for (ITask t : activeTasks) {
+ getViewer().expandToLevel(t, 0);
+ }
+ }
+ });
+ }
+
+ private void hookContextMenu() {
+ MenuManager menuMgr = new MenuManager("#PopupMenu");
+ menuMgr.setRemoveAllWhenShown(true);
+ menuMgr.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ TaskListView.this.fillContextMenu(manager);
+ }
+ });
+ Menu menu = menuMgr.createContextMenu(getViewer().getControl());
+ getViewer().getControl().setMenu(menu);
+ getSite().registerContextMenu(menuMgr, getViewer());
+ }
+
+ private void contributeToActionBars() {
+ IActionBars bars = getViewSite().getActionBars();
+ fillLocalPullDown(bars.getMenuManager());
+ fillLocalToolBar(bars.getToolBarManager());
+ }
+
+ private void fillLocalPullDown(IMenuManager manager) {
+ updateDrillDownActions();
+ manager.add(goUpAction);
+ manager.add(collapseAll);
+ manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+
+ private void fillLocalToolBar(IToolBarManager manager) {
+ manager.add(new Separator(SEPARATOR_ID_REPORTS));
+ manager.add(newLocalTaskAction);
+ // manager.add(newCategoryAction);
+ manager.add(new Separator());
+ manager.add(filterCompleteTask);
+ manager.add(filterOnPriority);
+ manager.add(new Separator("navigation"));
+ manager.add(previousTaskAction);
+ manager.add(nextTaskAction);
+ manager.add(new Separator(SEPARATOR_CONTEXT));
+ // manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+
+ private void fillContextMenu(IMenuManager manager) {
+ updateDrillDownActions();
+
+ ITaskListElement element = null;
+
+ final Object selectedObject = ((IStructuredSelection) getViewer().getSelection()).getFirstElement();
+ if (selectedObject instanceof ITaskListElement) {
+ element = (ITaskListElement) selectedObject;
+ }
+
+ addAction(openTaskEditor, manager, element);
+ if ((element instanceof ITask) || (element instanceof AbstractQueryHit)) {
+ ITask task = null;
+ if (element instanceof AbstractQueryHit) {
+ task = ((AbstractQueryHit) element).getCorrespondingTask();
+ } else {
+ task = (ITask) element;
+ }
+
+ addAction(openUrlInExternal, manager, element);
+
+ if (task != null) {
+ if (task.isLocal()) {
+ if (task.isCompleted()) {
+ addAction(markCompleteAction, manager, element);
+ } else {
+ addAction(markIncompleteAction, manager, element);
+ }
+ }
+
+ if (task.isActive()) {
+ manager.add(deactivateAction);
+ } else {
+ manager.add(activateAction);
+ }
+
+// if (!task.isLocal()) {
+ addAction(removeFromCategoryAction, manager, element);
+// }
+ addAction(deleteAction, manager, element);
+ } else {
+ manager.add(activateAction);
+ }
+ } else if (element instanceof ITaskContainer || element instanceof AbstractRepositoryQuery) {
+ addAction(deleteAction, manager, element);
+ }
+
+ if ((element instanceof ITask && ((ITask) element).isLocal()) || element instanceof ITaskContainer
+ || element instanceof AbstractRepositoryQuery) {
+ addAction(renameAction, manager, element);
+ }
+ if (element instanceof ITaskContainer) {
+ manager.add(goIntoAction);
+ }
+ if (drilledIntoCategory != null) {
+ manager.add(goUpAction);
+ }
+
+ manager.add(new Separator(SEPARATOR_LOCAL));
+ manager.add(newCategoryAction);
+ manager.add(newLocalTaskAction);
+ manager.add(new Separator(SEPARATOR_REPORTS));
+
+ manager.add(new Separator(SEPARATOR_CONTEXT));
+ for (IDynamicSubMenuContributor contributor : MylarTaskListPlugin.getDefault().getDynamicMenuContributers()) {
+ MenuManager subMenuManager = contributor.getSubMenuManager(this, (ITaskListElement) selectedObject);
+ if (subMenuManager != null)
+ addMenuManager(subMenuManager, manager, element);
+ }
+
+ manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+
+ private void addMenuManager(IMenuManager menuToAdd, IMenuManager manager, ITaskListElement element) {
+ if (element != null && element instanceof ITask) {
+ manager.add(menuToAdd);
+ }
+ }
+
+ private void addAction(Action action, IMenuManager manager, ITaskListElement element) {
+ manager.add(action);
+ if (element != null) {
+ // ITaskHandler handler =
+ // MylarTaskListPlugin.getDefault().getHandlerForElement(element);
+ // if (handler != null) {
+ // action.setEnabled(handler.enableAction(action, element));
+ // } else {
+ updateActionEnablement(action, element);
+ // }
+ }
+ }
+
+ /**
+ * Refactor out element
+ */
+ private void updateActionEnablement(Action action, ITaskListElement element) {
+ if (element instanceof ITask) {
+ // if (action instanceof MarkTaskCompleteAction) {
+ // if (element.isCompleted()) {
+ // action.setEnabled(false);
+ // } else {
+ // action.setEnabled(true);
+ // }
+ // } else
+ if (action instanceof OpenTaskInExternalBrowserAction) {
+ if (((ITask) element).hasValidUrl()) {
+ action.setEnabled(true);
+ } else {
+ action.setEnabled(false);
+ }
+ // } else if (action instanceof MarkTaskIncompleteAction) {
+ // if (element.isCompleted()) {
+ // action.setEnabled(true);
+ // } else {
+ // action.setEnabled(false);
+ // }
+ } else if (action instanceof DeleteAction) {
+ action.setEnabled(true);
+ } else if (action instanceof NewLocalTaskAction) {
+ action.setEnabled(false);
+ } else if (action instanceof OpenTaskListElementAction) {
+ action.setEnabled(true);
+ } else if (action instanceof CopyDescriptionAction) {
+ action.setEnabled(true);
+ } else if (action instanceof RenameAction) {
+ action.setEnabled(true);
+ }
+ } else if (element instanceof ITaskContainer) {
+ if (action instanceof MarkTaskCompleteAction) {
+ action.setEnabled(false);
+ } else if (action instanceof MarkTaskIncompleteAction) {
+ action.setEnabled(false);
+ } else if (action instanceof DeleteAction) {
+ if (((ITaskContainer) element).isArchive())
+ action.setEnabled(false);
+ else
+ action.setEnabled(true);
+ } else if (action instanceof NewLocalTaskAction) {
+ if (((ITaskContainer) element).isArchive())
+ action.setEnabled(false);
+ else
+ action.setEnabled(true);
+ } else 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 CopyDescriptionAction) {
+ action.setEnabled(true);
+ } else if (action instanceof RenameAction) {
+ if (((ITaskContainer) element).isArchive())
+ action.setEnabled(false);
+ else
+ action.setEnabled(true);
+ }
+ } else {
+ action.setEnabled(true);
+ }
+ // if(!canEnableGoInto){
+ // goIntoAction.setEnabled(false);
+ // }
+ }
+
+ private void makeActions() {
+
+ copyDescriptionAction = new CopyDescriptionAction(this);
+ // workOffline = new WorkOfflineAction();
+
+ goIntoAction = new GoIntoAction();
+ goUpAction = new GoUpAction(drillDownAdapter);
+
+ newLocalTaskAction = new NewLocalTaskAction(this);
+ newCategoryAction = new NewCategoryAction(this);
+ removeFromCategoryAction = new RemoveFromCategoryAction(this);
+ renameAction = new RenameAction(this);
+
+ deleteAction = new DeleteAction();
+ collapseAll = new CollapseAllAction(this);
+ // autoClose = new ManageEditorsAction();
+ markIncompleteAction = new MarkTaskCompleteAction(this);
+ markCompleteAction = new MarkTaskIncompleteAction(this);
+ openTaskEditor = new OpenTaskListElementAction(this.getViewer());
+ openUrlInExternal = new OpenTaskInExternalBrowserAction();
+ filterCompleteTask = new FilterCompletedTasksAction(this);
+ filterOnPriority = new PriorityDropDownAction();
+ previousTaskAction = new PreviousTaskDropDownAction(this, taskHistory);
+ nextTaskAction = new NextTaskDropDownAction(this, taskHistory);
+ }
+
+ public void toggleNextAction(boolean enable) {
+ nextTaskAction.setEnabled(enable);
+ }
+
+ public void togglePreviousAction(boolean enable) {
+ previousTaskAction.setEnabled(enable);
+ }
+
+ public NextTaskDropDownAction getNextTaskAction() {
+ return nextTaskAction;
+ }
+
+ public PreviousTaskDropDownAction getPreviousTaskAction() {
+ return previousTaskAction;
+ }
+
+ /**
+ * Recursive function that checks for the occurrence of a certain task id.
+ * All children of the supplied node will be checked.
+ *
+ * @param task
+ * The <code>ITask</code> object that is to be searched.
+ * @param taskId
+ * The id that is being searched for.
+ * @return <code>true</code> if the id was found in the node or any of its
+ * children
+ */
+ protected boolean lookForId(String taskId) {
+ return (MylarTaskListPlugin.getTaskListManager().getTaskForHandle(taskId, true) == null);
+ // for (ITask task :
+ // MylarTaskListPlugin.getTaskListManager().getTaskList().getRootTasks())
+ // {
+ // if (task.getHandle().equals(taskId)) {
+ // return true;
+ // }
+ // }
+ // for (TaskCategory cat :
+ // MylarTaskListPlugin.getTaskListManager().getTaskList().getTaskCategories())
+ // {
+ // for (ITask task : cat.getChildren()) {
+ // if (task.getHandle().equals(taskId)) {
+ // return true;
+ // }
+ // }
+ // }
+ // return false;
+ }
+
+ private void hookOpenAction() {
+ getViewer().addDoubleClickListener(new IDoubleClickListener() {
+ public void doubleClick(DoubleClickEvent event) {
+ openTaskEditor.run();
+ }
+ });
+ }
+
+ // public void showMessage(String message) {
+ // MessageDialog.openInformation(getViewer().getControl().getShell(),
+ // "TaskList Message", message);
+ // }
+
+ /**
+ * Passing the focus request to the viewer's control.
+ */
+ @Override
+ public void setFocus() {
+ filteredTree.getViewer().getControl().setFocus();
+ }
+
+ public String getBugIdFromUser() {
+ InputDialog dialog = new InputDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Enter Bugzilla ID", "Enter the Bugzilla ID: ", "", null);
+ int dialogResult = dialog.open();
+ if (dialogResult == Window.OK) {
+ return dialog.getValue();
+ } else {
+ return null;
+ }
+ }
+
+ // public void notifyTaskDataChanged(ITask task) {
+ // if (getViewer().getTree() != null && !getViewer().getTree().isDisposed())
+ // {
+ // getViewer().refresh();
+ // expandToActiveTasks();
+ // }
+ // }
+
+ public static TaskListView getDefault() {
+ return INSTANCE;
+ }
+
+ public void refreshAndFocus() {
+ getViewer().refresh();
+ selectedAndFocusTask(MylarTaskListPlugin.getTaskListManager().getTaskList().getActiveTask());
+ }
+
+ public TreeViewer getViewer() {
+ return filteredTree.getViewer();
+ }
+
+ public TaskCompleteFilter getCompleteFilter() {
+ return COMPLETE_FILTER;
+ }
+
+ public TaskPriorityFilter getPriorityFilter() {
+ return PRIORITY_FILTER;
+ }
+
+ public void addFilter(AbstractTaskFilter filter) {
+ if (!filters.contains(filter))
+ filters.add(filter);
+ }
+
+ public void removeFilter(AbstractTaskFilter filter) {
+ filters.remove(filter);
+ }
+
+ public void updateDrillDownActions() {
+ if (drillDownAdapter.canGoBack()) {
+ goUpAction.setEnabled(true);
+ } else {
+ goUpAction.setEnabled(false);
+ }
+ }
+
+ /**
+ * HACK: This is used for the copy action
+ */
+ public Composite getDummyComposite() {
+ return filteredTree;
+ }
+
+ private boolean isInRenameAction = false;
+
+ public void setInRenameAction(boolean b) {
+ isInRenameAction = b;
+ }
+
+ /**
+ * This method is for testing only
+ */
+ public TaskActivationHistory getTaskActivationHistory() {
+ return taskHistory;
+ }
+
+ public void goIntoCategory() {
+ ISelection selection = getViewer().getSelection();
+ if (selection instanceof StructuredSelection) {
+ StructuredSelection structuredSelection = (StructuredSelection) selection;
+ Object element = structuredSelection.getFirstElement();
+ if (element instanceof ITaskContainer) {
+ drilledIntoCategory = (ITaskContainer) element;
+ drillDownAdapter.goInto();
+ updateDrillDownActions();
+ }
+ }
+ }
+
+ public void goUpToRoot() {
+ drilledIntoCategory = null;
+ drillDownAdapter.goBack();
+ updateDrillDownActions();
+ }
+
+ public ITask 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 (ITask) structuredSelection.getFirstElement();
+ } else if (element instanceof AbstractQueryHit) {
+ return ((AbstractQueryHit) element).getOrCreateCorrespondingTask();
+ }
+ }
+ return null;
+ }
+
+ public void indicatePaused(boolean paused) {
+ isPaused = paused;
+ IStatusLineManager statusLineManager = getViewSite().getActionBars().getStatusLineManager();
+ if (isPaused) {
+ statusLineManager.setMessage(TaskListImages.getImage(TaskListImages.TASKLIST),
+ "Mylar context capture paused");
+ } else {
+ statusLineManager.setMessage("");
+ }
+ }
+
+ /**
+ * Show the shared data folder currently in use. Call with "" to turn off
+ * the indication. TODO: Need a better way to indicate paused and/or the
+ * shared folder
+ */
+ public void indicateSharedFolder(String folderName) {
+ if (folderName.equals("")) {
+ if (isPaused) {
+ setPartName("(paused) " + PART_NAME);
+ } else {
+ setPartName(PART_NAME);
+ }
+ } else {
+ if (isPaused) {
+ setPartName("(paused) " + folderName + " " + PART_NAME);
+ } else {
+ setPartName(folderName + " " + PART_NAME);
+ }
+ }
+
+ }
+
+ public ITaskContainer getDrilledIntoCategory() {
+ return drilledIntoCategory;
+ }
+
+
+ public FilteredTree getFilteredTree() {
+ return filteredTree;
+ }
+
+
+ public void selectedAndFocusTask(ITask task) {
+ if (task == null)
+ return;
+ getViewer().setSelection(new StructuredSelection(task));
+ // if no task exists, select the query hit if exists
+ AbstractQueryHit hit = null;
+ if (getViewer().getSelection().isEmpty()
+ && (hit = MylarTaskListPlugin.getTaskListManager().getTaskList().getQueryHitForHandle(
+ task.getHandleIdentifier())) != null) {
+ AbstractRepositoryQuery query = MylarTaskListPlugin.getTaskListManager().getTaskList().getQueryForHandle(
+ task.getHandleIdentifier());
+ getViewer().expandToLevel(query, 1);
+ getViewer().setSelection(new StructuredSelection(hit), true);
+ } else {
+ if (task.getCategory() != null) {
+ getViewer().expandToLevel(task.getCategory(), 1);
+ }
+ }
+ }
+
+ protected void refreshTask(ITask task) {
+ refresh(task);
+ if (task.getCategory() == null || task.getCategory().getHandleIdentifier().equals(TaskList.LABEL_ARCHIVE)) {
+ refresh(null);
+ } else {
+ refresh(task.getCategory());
+ }
+
+ Set<AbstractQueryHit> hits = MylarTaskListPlugin.getTaskListManager().getTaskList().getQueryHitsForHandle(task.getHandleIdentifier());
+ for (AbstractQueryHit hit : hits) {
+ refresh(hit);
+ }
+
+ }
+
+ private void refresh(final ITaskListElement element) {
+ if (PlatformUI.getWorkbench() != null && !PlatformUI.getWorkbench().getDisplay().isDisposed()) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (getViewer().getControl() != null && !getViewer().getControl().isDisposed()) {
+ if (element == null) {
+ // getViewer().getControl().setRedraw(false);
+ // getViewer().refresh();
+ filteredTree.textChanged(0);
+ // getViewer().getControl().setRedraw(true);
+ } else {
+ // getViewer().getControl().setRedraw(false);
+ getViewer().refresh(element, true);
+ // getViewer().getControl().setRedraw(true);
+ }
+ }
+ }
+ });
+ }
+ }
+
+
+ public Image[] getPirorityImages() {
+ Image[] images = new Image[Task.PriorityLevel.values().length];
+ for (int i = 0; i < Task.PriorityLevel.values().length; i++) {
+ images[i] = taskListTableLabelProvider.getImageForPriority(Task.PriorityLevel.values()[i]);
+ }
+ return images;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskRepositoriesView.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskRepositoriesView.java
new file mode 100644
index 000000000..dc27db8e2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskRepositoriesView.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.mylar.internal.tasklist.ui.views;
+
+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.IStructuredContentProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.mylar.internal.tasklist.ui.actions.AddRepositoryAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.DeleteTaskRepositoryAction;
+import org.eclipse.mylar.internal.tasklist.ui.actions.EditRepositoryPropertiesAction;
+import org.eclipse.mylar.provisional.tasklist.ITaskRepositoryListener;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+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.part.ViewPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskRepositoriesView extends ViewPart {
+
+ public static final String ID = "org.eclipse.mylar.tasklist.repositories";
+
+ public static final String NAME = "Task Repositories View";
+
+ private TableViewer viewer;
+
+ private Action addRepositoryAction = new AddRepositoryAction();
+
+ private Action deleteRepositoryAction = new DeleteTaskRepositoryAction(this);
+
+ private Action repositoryPropertiesAction = new EditRepositoryPropertiesAction(this);
+
+ private final ITaskRepositoryListener REPOSITORY_LISTENER = new ITaskRepositoryListener() {
+
+ public void repositorySetUpdated() {
+ TaskRepositoriesView.this.getViewer().refresh();
+ }
+ };
+
+ class ViewContentProvider implements IStructuredContentProvider {
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+ }
+
+ public void dispose() {
+ }
+
+ public Object[] getElements(Object parent) {
+ return MylarTaskListPlugin.getRepositoryManager().getAllRepositories().toArray();
+ }
+ }
+
+ public TaskRepositoriesView() {
+ MylarTaskListPlugin.getRepositoryManager().addListener(REPOSITORY_LISTENER);
+ }
+
+ public static TaskRepositoriesView getFromActivePerspective() {
+ IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ if (activePage == null)
+ return null;
+ IViewPart view = activePage.findView(ID);
+ if (view instanceof TaskRepositoriesView)
+ return (TaskRepositoriesView) view;
+ return null;
+ }
+
+ public void createPartControl(Composite parent) {
+ viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+ viewer.setContentProvider(new ViewContentProvider());
+ viewer.setLabelProvider(new TaskRepositoryLabelProvider());
+ viewer.setSorter(new ViewerSorter());
+ viewer.setInput(getViewSite());
+
+ hookContextMenu();
+ contributeToActionBars();
+ }
+
+ private void hookContextMenu() {
+ MenuManager menuMgr = new MenuManager("#PopupMenu");
+ 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(addRepositoryAction);
+ manager.add(deleteRepositoryAction);
+ manager.add(new Separator());
+ manager.add(repositoryPropertiesAction);
+ manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+
+ private void fillLocalToolBar(IToolBarManager manager) {
+ manager.add(addRepositoryAction);
+ }
+
+ /**
+ * Passing the focus request to the viewer's control.
+ */
+ public void setFocus() {
+ viewer.getControl().setFocus();
+ }
+
+ public TableViewer getViewer() {
+ return viewer;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskRepositoryLabelProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskRepositoryLabelProvider.java
new file mode 100644
index 000000000..b2037d68f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/views/TaskRepositoryLabelProvider.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.views;
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryClient;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskRepository;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskRepositoryLabelProvider extends LabelProvider implements ITableLabelProvider {
+
+ public String getColumnText(Object object, int index) {
+ if (object instanceof TaskRepository) {
+ TaskRepository repository = (TaskRepository) object;
+ return repository.getKind() + ": " + repository.getUrl().toExternalForm();
+ } else if (object instanceof AbstractRepositoryClient) {
+ return ((AbstractRepositoryClient)object).getLabel();
+ } else {
+ return getText(object);
+ }
+ }
+
+ public Image getColumnImage(Object obj, int index) {
+ return getImage(obj);
+ }
+
+ public Image getImage(Object object) {
+ if (object instanceof AbstractRepositoryClient) {
+ AbstractRepositoryClient repositoryClient = (AbstractRepositoryClient)object;
+ Image image = MylarTaskListPlugin.getDefault().getBrandingIcons().get(repositoryClient);
+ if (image != null) {
+ return image;
+ }
+ }
+ return TaskListImages.getImage(TaskListImages.REPOSITORY);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AbstractAddExistingTaskWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AbstractAddExistingTaskWizard.java
new file mode 100644
index 000000000..fd0c40d01
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AbstractAddExistingTaskWizard.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.mylar.internal.tasklist.ui.wizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryClient;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskCategory;
+import org.eclipse.mylar.provisional.tasklist.TaskRepository;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Brock Janiczak
+ */
+public abstract class AbstractAddExistingTaskWizard extends Wizard {
+
+ private final TaskRepository repository;
+
+ public AbstractAddExistingTaskWizard(TaskRepository repository) {
+ this.repository = repository;
+ init();
+ }
+
+ @Override
+ public final boolean performFinish() {
+ AbstractRepositoryClient client = MylarTaskListPlugin.getRepositoryManager().getRepositoryClient(
+ this.repository.getKind());
+ ITask newTask = client.createTaskFromExistingId(repository, getTaskId());
+
+ if (newTask != null && TaskListView.getDefault() != null) {
+ Object selectedObject = ((IStructuredSelection) TaskListView.getDefault().getViewer().getSelection())
+ .getFirstElement();
+
+ if (selectedObject instanceof TaskCategory) {
+ MylarTaskListPlugin.getTaskListManager().moveToCategory(((TaskCategory) selectedObject), newTask);
+ } else {
+ MylarTaskListPlugin.getTaskListManager().moveToRoot(newTask);
+ }
+ if (TaskListView.getDefault() != null) {
+ TaskListView.getDefault().getViewer().setSelection(new StructuredSelection(newTask));
+ }
+ }
+
+ return true;
+ }
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ }
+
+ private void init() {
+ super.setForcePreviousAndNextButtons(true);
+ }
+
+ protected abstract String getTaskId();
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AbstractRepositoryClientWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AbstractRepositoryClientWizard.java
new file mode 100644
index 000000000..af2c33a22
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AbstractRepositoryClientWizard.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.wizards;
+
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryClient;
+import org.eclipse.ui.INewWizard;
+
+/**
+ * @author Mik Kersten
+ */
+public abstract class AbstractRepositoryClientWizard extends Wizard implements INewWizard {
+
+ private SelectRepositoryClientPage selectRepositoryClientPage = new SelectRepositoryClientPage(this);
+
+ protected AbstractRepositorySettingsPage abstractRepositorySettingsPage;
+
+ protected AbstractRepositoryClient repositoryClient;
+
+ public void setRepositoryClient(AbstractRepositoryClient repository) {
+ this.repositoryClient = repository;
+ }
+
+ public AbstractRepositoryClient getRepositoryClient() {
+ return repositoryClient;
+ }
+
+ @Override
+ public void addPages() {
+ addPage(selectRepositoryClientPage);
+ }
+
+ @Override
+ public boolean canFinish() {
+ return selectRepositoryClientPage.isPageComplete();
+ }
+
+ public void setRepositorySettingsPage(AbstractRepositorySettingsPage abstractRepositorySettingsPage) {
+ this.abstractRepositorySettingsPage = abstractRepositorySettingsPage;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AbstractRepositorySettingsPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AbstractRepositorySettingsPage.java
new file mode 100644
index 000000000..4638a7851
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AbstractRepositorySettingsPage.java
@@ -0,0 +1,189 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.wizards;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.jface.preference.StringFieldEditor;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.provisional.tasklist.TaskRepository;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Mik Kersten
+ */
+public abstract class AbstractRepositorySettingsPage extends WizardPage {
+
+ protected static final String LABEL_SERVER = "Server: ";
+
+ protected static final String LABEL_USER = "User Name: ";
+
+ protected static final String LABEL_PASSWORD = "Password: ";
+
+ protected static final String URL_PREFIX_HTTPS = "https://";
+
+ protected static final String URL_PREFIX_HTTP = "http://";
+
+ protected StringFieldEditor serverUrlEditor;
+
+ protected StringFieldEditor userNameEditor;
+
+ protected RepositoryStringFieldEditor passwordEditor;
+
+ protected TaskRepository repository;
+
+ private Button validateServerButton;
+
+ public AbstractRepositorySettingsPage(String title, String description) {
+ super(title);
+ super.setTitle(title);
+ super.setDescription(description);
+ }
+
+ public void createControl(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ FillLayout layout = new FillLayout();
+ container.setLayout(layout);
+
+ serverUrlEditor = new StringFieldEditor("", LABEL_SERVER, StringFieldEditor.UNLIMITED, container) {
+
+ @Override
+ protected boolean doCheckState() {
+ return isValidUrl(getStringValue());
+ }
+
+ @Override
+ protected void valueChanged() {
+ super.valueChanged();
+ getWizard().getContainer().updateButtons();
+ }
+ };
+ serverUrlEditor.setErrorMessage("Server path must be a valid http(s):// url");
+
+ userNameEditor = new StringFieldEditor("", LABEL_USER, StringFieldEditor.UNLIMITED, container);
+ passwordEditor = new RepositoryStringFieldEditor("", LABEL_PASSWORD, StringFieldEditor.UNLIMITED, container);
+ passwordEditor.getTextControl().setEchoChar('*');
+
+ if (repository != null) {
+ serverUrlEditor.setStringValue(repository.getUrl().toExternalForm());
+ userNameEditor.setStringValue(repository.getUserName());
+ passwordEditor.setStringValue(repository.getPassword());
+ }
+
+ validateServerButton = new Button(container, SWT.PUSH);
+ validateServerButton.setText("Validate Settings");
+ validateServerButton.addMouseListener(new MouseListener() {
+
+ public void mouseDoubleClick(MouseEvent e) {
+ // ignore
+
+ }
+
+ public void mouseDown(MouseEvent e) {
+ // ignore
+
+ }
+
+ public void mouseUp(MouseEvent e) {
+ validateSettings();
+ }
+ });
+
+ createAdditionalControls(container);
+ setControl(container);
+ }
+
+ protected abstract void createAdditionalControls(Composite parent);
+
+ protected abstract void validateSettings();
+
+ public URL getServerUrl() {
+ try {
+ return new URL(serverUrlEditor.getStringValue());
+ } catch (MalformedURLException e) {
+ MylarStatusHandler.fail(e, "could not create url", true);
+ return null;
+ }
+ }
+
+ public String getUserName() {
+ return userNameEditor.getStringValue();
+ }
+
+ public String getPassword() {
+ return passwordEditor.getStringValue();
+ }
+
+ private boolean isValidUrl(String name) {
+ if (name.startsWith(URL_PREFIX_HTTPS) || name.startsWith(URL_PREFIX_HTTP)) {
+ try {
+ new URL(name);
+ } catch (MalformedURLException e) {
+ return false;
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public void init(IWorkbench workbench) {
+ // ignore
+ }
+
+ /**
+ * 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) {
+ MylarStatusHandler.log(e, "problem refreshing password field");
+ }
+ }
+
+ @Override
+ public Text getTextControl() {
+ return super.getTextControl();
+ }
+
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ return isValidUrl(serverUrlEditor.getStringValue());
+ }
+
+ public void setRepository(TaskRepository repository) {
+ this.repository = repository;
+ }
+
+ public TaskRepository getRepository() {
+ return repository;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AddExistingTaskWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AddExistingTaskWizard.java
new file mode 100644
index 000000000..7202fe62d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AddExistingTaskWizard.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.wizards;
+
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryClient;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskRepository;
+
+/**
+ * @author Mik Kersten
+ * @author Brock Janiczak
+ */
+public class AddExistingTaskWizard extends MultiRepositoryAwareWizard {
+
+ public AddExistingTaskWizard() {
+ super(new SelectRepositoryPage() {
+
+ @Override
+ protected IWizard createWizard(TaskRepository taskRepository) {
+ AbstractRepositoryClient client = MylarTaskListPlugin.getRepositoryManager().getRepositoryClient(
+ taskRepository.getKind());
+ return client.getAddExistingTaskWizard(taskRepository);
+ }
+
+ });
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AddRepositoryWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AddRepositoryWizard.java
new file mode 100644
index 000000000..1c4af901b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AddRepositoryWizard.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.wizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskRepository;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Mik Kersten
+ */
+public class AddRepositoryWizard extends AbstractRepositoryClientWizard {
+
+ // private AbstractRepositorySettingsPage abstractRepositorySettingsPage;//
+ // = new AbstractRepositorySettingsPage();
+
+ public AddRepositoryWizard() {
+ super();
+ super.setForcePreviousAndNextButtons(true);
+ }
+
+ @Override
+ public boolean performFinish() {
+ if (canFinish()) {
+ TaskRepository repository = new TaskRepository(repositoryClient.getKind(),
+ super.abstractRepositorySettingsPage.getServerUrl());
+ if (repository != null) {
+ repository.setAuthenticationCredentials(abstractRepositorySettingsPage.getUserName(),
+ abstractRepositorySettingsPage.getPassword());
+ MylarTaskListPlugin.getRepositoryManager().addRepository(repository);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ }
+
+ @Override
+ public void addPages() {
+ super.addPages();
+ // addPage(abstractRepositorySettingsPage);
+ }
+
+ public AbstractRepositorySettingsPage getRepositorySettingsPage() {
+ return abstractRepositorySettingsPage;
+ }
+
+ public void setRepositorySettingsPage(AbstractRepositorySettingsPage abstractRepositorySettingsPage) {
+ this.abstractRepositorySettingsPage = abstractRepositorySettingsPage;
+ }
+
+ @Override
+ public boolean canFinish() {
+ return super.canFinish() && abstractRepositorySettingsPage != null
+ && abstractRepositorySettingsPage.isPageComplete();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/EditRepositoryWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/EditRepositoryWizard.java
new file mode 100644
index 000000000..533cf4f1d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/EditRepositoryWizard.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.mylar.internal.tasklist.ui.wizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryClient;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskRepository;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Mik Kersten
+ */
+public class EditRepositoryWizard extends Wizard implements INewWizard {
+
+ private AbstractRepositorySettingsPage abstractRepositorySettingsPage;// =
+
+ private TaskRepository oldRepository;
+
+ public EditRepositoryWizard(TaskRepository repository) {
+ super();
+ oldRepository = repository;
+ // super.setForcePreviousAndNextButtons(true);
+ AbstractRepositoryClient client = MylarTaskListPlugin.getRepositoryManager().getRepositoryClient(
+ repository.getKind());
+ abstractRepositorySettingsPage = client.getSettingsPage();
+ abstractRepositorySettingsPage.setRepository(repository);
+ abstractRepositorySettingsPage.setWizard(this);
+ }
+
+ @Override
+ public boolean performFinish() {
+ if (canFinish()) {
+ TaskRepository repository = new TaskRepository(abstractRepositorySettingsPage.getRepository().getKind(),
+ abstractRepositorySettingsPage.getServerUrl());
+ if (repository != null) {
+ repository.setAuthenticationCredentials(abstractRepositorySettingsPage.getUserName(),
+ abstractRepositorySettingsPage.getPassword());
+ MylarTaskListPlugin.getRepositoryManager().removeRepository(oldRepository);
+ MylarTaskListPlugin.getRepositoryManager().addRepository(repository);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ }
+
+ @Override
+ public void addPages() {
+ addPage(abstractRepositorySettingsPage);
+ }
+
+ @Override
+ public boolean canFinish() {
+ return abstractRepositorySettingsPage.isPageComplete();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/ExistingTaskWizardPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/ExistingTaskWizardPage.java
new file mode 100644
index 000000000..4a83e5d43
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/ExistingTaskWizardPage.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.wizards;
+
+import org.eclipse.jface.wizard.WizardPage;
+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 Mik Kersten
+ */
+public class ExistingTaskWizardPage extends WizardPage {
+
+ private static final String TITLE = "Add Existing Task";
+
+ private static final String DESCRIPTION = "Enter the identifier for the task, issue, or bug report.";
+
+ private Text taskIdText;
+
+ public ExistingTaskWizardPage() {
+ super(TITLE);
+ setTitle(TITLE);
+ setDescription(DESCRIPTION);
+ }
+
+ public void createControl(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout();
+ container.setLayout(layout);
+ layout.numColumns = 2;
+
+ GridData gd = new GridData();
+ gd.widthHint = 200;
+
+ Label label = new Label(container, SWT.NULL);
+ label.setText("Enter ID: ");
+ taskIdText = new Text(container, SWT.BORDER);
+ taskIdText.setLayoutData(gd);
+ taskIdText.setFocus();
+ taskIdText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ getWizard().getContainer().updateButtons();
+ // try {
+ // numDaysToReport = Integer.parseInt(taskId.getText());
+ // setErrorMessage(null);
+ // } catch (Exception ex) {
+ // setErrorMessage("Must be integer");
+ // numDaysToReport = 0;
+ // }
+ }
+ });
+
+ setControl(container);
+ }
+
+ public boolean isPageComplete() {
+ return getTaskId() != null && !getTaskId().trim().equals("");
+ }
+
+ public String getTaskId() {
+ return taskIdText.getText();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/MultiRepositoryAwareWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/MultiRepositoryAwareWizard.java
new file mode 100644
index 000000000..3efe4bc15
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/MultiRepositoryAwareWizard.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.wizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Mik Kersten
+ * @author Brock Janiczak
+ */
+public class MultiRepositoryAwareWizard extends Wizard implements INewWizard {
+
+ private SelectRepositoryPage selectRepositoryPage;
+
+ public MultiRepositoryAwareWizard(SelectRepositoryPage page) {
+ selectRepositoryPage = page;
+ setForcePreviousAndNextButtons(true);
+ setNeedsProgressMonitor(true);
+ }
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ // ignore
+ }
+
+ @Override
+ public void addPages() {
+ addPage(selectRepositoryPage);
+ }
+
+ @Override
+ public boolean canFinish() {
+ return false;
+ }
+
+ @Override
+ public boolean performFinish() {
+ // Can't finish on the first page
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/NewQueryWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/NewQueryWizard.java
new file mode 100644
index 000000000..c07cd29df
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/NewQueryWizard.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.wizards;
+
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryClient;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskRepository;
+
+/**
+ * @author Mik Kersten
+ */
+public class NewQueryWizard extends MultiRepositoryAwareWizard {
+
+ public NewQueryWizard() {
+ super(new SelectRepositoryPage() {
+
+ @Override
+ protected IWizard createWizard(TaskRepository taskRepository) {
+ AbstractRepositoryClient client = MylarTaskListPlugin.getRepositoryManager().getRepositoryClient(
+ taskRepository.getKind());
+ return client.getQueryWizard(taskRepository);
+ }
+
+ });
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/SelectRepositoryClientPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/SelectRepositoryClientPage.java
new file mode 100644
index 000000000..d5e541c49
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/SelectRepositoryClientPage.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.wizards;
+
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskRepositoryLabelProvider;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryClient;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Mik Kersten
+ */
+public class SelectRepositoryClientPage extends WizardPage {
+
+ private static final String DESCRIPTION = "You can connect to an existing account using one of the installed connectors.";
+
+ private static final String TITLE = "Select a task repository type";
+
+ private TableViewer viewer;
+
+ private AbstractRepositoryClientWizard wizard;
+
+ class RepositoryContentProvider implements IStructuredContentProvider {
+
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+ }
+
+ public void dispose() {
+ }
+
+ public Object[] getElements(Object parent) {
+ return MylarTaskListPlugin.getRepositoryManager().getRepositoryClients().toArray();
+ }
+ }
+
+ public SelectRepositoryClientPage(AbstractRepositoryClientWizard wizard) {
+ super(TITLE);
+ setTitle(TITLE);
+ setDescription(DESCRIPTION);
+ this.wizard = wizard;
+ super.setWizard(wizard);
+ }
+
+ @Override
+ public boolean canFlipToNextPage() {
+ return wizard.getRepositoryClient() != null;
+ }
+
+ public void createControl(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ FillLayout layout = new FillLayout();
+ container.setLayout(layout);
+
+ viewer = new TableViewer(container, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
+ viewer.setContentProvider(new RepositoryContentProvider());
+ viewer.setLabelProvider(new TaskRepositoryLabelProvider());
+ viewer.setInput(MylarTaskListPlugin.getRepositoryManager().getRepositoryClients());
+ viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+
+ public void selectionChanged(SelectionChangedEvent event) {
+ IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+ if (selection.getFirstElement() instanceof AbstractRepositoryClient) {
+ wizard.setRepositoryClient((AbstractRepositoryClient) selection.getFirstElement());
+ SelectRepositoryClientPage.this.setPageComplete(true);
+ wizard.getContainer().updateButtons();
+ }
+ }
+
+ });
+ setControl(container);
+ }
+
+ @Override
+ public IWizardPage getNextPage() {
+ if (isPageComplete()) {
+ AbstractRepositorySettingsPage nextPage = wizard.getRepositoryClient().getSettingsPage();
+ wizard.setRepositorySettingsPage(nextPage);
+ nextPage.setWizard(wizard);
+ return nextPage;
+ } else {
+ return super.getNextPage();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/SelectRepositoryPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/SelectRepositoryPage.java
new file mode 100644
index 000000000..7ad30b039
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/SelectRepositoryPage.java
@@ -0,0 +1,170 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.wizards;
+
+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.WizardSelectionPage;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskRepositoryLabelProvider;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskRepository;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Mik Kersten
+ * @author Brock Janiczak
+ */
+public abstract class SelectRepositoryPage extends WizardSelectionPage {
+
+ private static final String DESCRIPTION = "Select a repository, or add a new one using the Task Repositories view.";
+
+ private static final String TITLE = "Select a repository";
+
+ private TableViewer viewer;
+
+ protected MultiRepositoryAwareWizard wizard;
+
+ private String repositoryKind = null;
+
+ class RepositoryContentProvider implements IStructuredContentProvider {
+
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+ }
+
+ public void dispose() {
+ }
+
+ public Object[] getElements(Object parent) {
+ if (repositoryKind != null) {
+ return MylarTaskListPlugin.getRepositoryManager().getRepositories(repositoryKind).toArray();
+ } else {
+ return MylarTaskListPlugin.getRepositoryManager().getAllRepositories().toArray();
+ }
+ }
+ }
+
+ public SelectRepositoryPage() {
+ super(TITLE);
+ setTitle(TITLE);
+ setDescription(DESCRIPTION);
+ }
+
+ public SelectRepositoryPage(String repositoryKind) {
+ this();
+ this.repositoryKind = repositoryKind;
+ }
+
+ public void createControl(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ FillLayout layout = new FillLayout();
+ container.setLayout(layout);
+
+ viewer = new TableViewer(container, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
+ viewer.setContentProvider(new RepositoryContentProvider());
+ viewer.setLabelProvider(new TaskRepositoryLabelProvider());
+ viewer.setInput(MylarTaskListPlugin.getRepositoryManager().getRepositoryClients());
+
+ 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);
+ }
+ setPageComplete(false);
+ }
+ });
+
+ viewer.addOpenListener(new IOpenListener() {
+
+ public void open(OpenEvent event) {
+ getContainer().showPage(getNextPage());
+ }
+
+ });
+ viewer.getTable().setFocus();
+ TaskRepository defaultRepository = MylarTaskListPlugin.getRepositoryManager().getDefaultRepository(
+ repositoryKind);
+ if (defaultRepository != null) {
+ viewer.setSelection(new StructuredSelection(defaultRepository));
+ }
+
+ setControl(container);
+ }
+
+ protected abstract IWizard createWizard(TaskRepository taskRepository);
+
+ 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);
+ }
+
+ 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.getKind().equals(that.repository.getKind())
+ && this.repository.getUrl().equals(that.repository.getUrl());
+ }
+
+ @Override
+ public int hashCode() {
+ return 31 * this.repository.getUrl().hashCode() + this.repository.getKind().hashCode();
+ }
+
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/TaskDataExportWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/TaskDataExportWizard.java
new file mode 100644
index 000000000..24aceca63
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/TaskDataExportWizard.java
@@ -0,0 +1,362 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.wizards;
+
+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.lang.reflect.InvocationTargetException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylar.internal.core.MylarContextManager;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.core.util.ZipFileUtil;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskContainer;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskList;
+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.mylar.tasklist.ui.exportWizard";
+
+ private final static String ZIP_FILE_PREFIX = "mylardata";
+
+ private final static String ZIP_FILE_EXTENSION = ".zip";
+
+ private final static String WINDOW_TITLE = "Export";
+
+ private TaskDataExportWizardPage exportPage = null;
+
+ public static String getZipFileName() {
+ String fomratString = "yyyy-MM-dd";
+ SimpleDateFormat format = new SimpleDateFormat(fomratString, Locale.ENGLISH);
+ String date = format.format(new Date());
+ return ZIP_FILE_PREFIX + "-" + date + ZIP_FILE_EXTENSION;
+ }
+
+ public TaskDataExportWizard() {
+ IDialogSettings masterSettings = MylarTaskListPlugin.getDefault().getDialogSettings();
+ setDialogSettings(getSettingsSection(masterSettings));
+ setNeedsProgressMonitor(true);
+ setWindowTitle(WINDOW_TITLE);
+ }
+
+ /**
+ * Finds or creates a dialog settings section that is used to make the
+ * dialog control settings persistent
+ */
+ public IDialogSettings getSettingsSection(IDialogSettings master) {
+ IDialogSettings settings = master.getSection(SETTINGS_SECTION);
+ if (settings == null) {
+ settings = master.addNewSection(SETTINGS_SECTION);
+ }
+ return settings;
+ }
+
+ public void addPages() {
+ exportPage = new TaskDataExportWizardPage();
+ exportPage.setWizard(this);
+ addPage(exportPage);
+ }
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ // no initialization needed
+ }
+
+ public boolean canFinish() {
+ return exportPage.isPageComplete();
+ }
+
+ /**
+ * 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.
+ */
+ public boolean performFinish() {
+ boolean overwrite = exportPage.overwrite();
+ boolean zip = exportPage.zip();
+
+ // Get file paths to check for existence
+ String destDir = exportPage.getDestinationDirectory();
+ final File destDirFile = new File(destDir);
+ if (!destDirFile.exists() || !destDirFile.isDirectory()) {
+ // This should never happen
+ MylarStatusHandler.fail(new Exception("File Export Exception"),
+ "Could not export data because specified location does not exist or is not a folder", true);
+ return false;
+ }
+
+ final File destTaskListFile = new File(destDir + File.separator + MylarTaskListPlugin.DEFAULT_TASK_LIST_FILE);
+ final File destActivationHistoryFile = new File(destDir + File.separator
+ + MylarContextManager.CONTEXT_HISTORY_FILE_NAME + MylarContextManager.CONTEXT_FILE_EXTENSION);
+ final File destZipFile = new File(destDir + File.separator + getZipFileName());
+
+ // Prompt the user to confirm if ANY of the save operations will cause
+ // an overwrite
+ if (!overwrite) {
+
+ if (zip) {
+ if (destZipFile.exists()) {
+ if (!MessageDialog.openConfirm(getShell(), "Confirm File Replace", "The zip file "
+ + destZipFile.getPath() + " already exists. Do you want to overwrite it?")) {
+ return false;
+ }
+ }
+ } else {
+ if (exportPage.exportTaskList() && destTaskListFile.exists()) {
+ if (!MessageDialog.openConfirm(getShell(), "Confirm File Replace", "The task list file "
+ + destTaskListFile.getPath() + " already exists. Do you want to overwrite it?")) {
+ return false;
+ }
+ }
+
+ if (exportPage.exportActivationHistory() && destActivationHistoryFile.exists()) {
+ if (!MessageDialog.openConfirm(getShell(), "Confirm File Replace",
+ "The task activation history file " + destActivationHistoryFile.getPath()
+ + " already exists. Do you want to overwrite it?")) {
+ return false;
+ }
+ }
+
+ if (exportPage.exportTaskContexts()) {
+ for (ITask task : getAllTasks()) {
+ File contextFile = MylarPlugin.getContextManager()
+ .getFileForContext(task.getHandleIdentifier());
+ File destTaskFile = new File(destDir + File.separator + contextFile.getName());
+ if (destTaskFile.exists()) {
+ if (!MessageDialog.openConfirm(getShell(), "Confirm File Replace",
+ "Task context files already exist in " + destDir
+ + ". Do you want to overwrite them?")) {
+ return false;
+ } else {
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ FileCopyJob job = new FileCopyJob(destZipFile, destTaskListFile, destActivationHistoryFile);
+ IProgressService service = PlatformUI.getWorkbench().getProgressService();
+
+ try {
+ service.run(true, false, job);
+ } catch (InvocationTargetException e) {
+ MylarStatusHandler.fail(e, "Could not export files", true);
+ } catch (InterruptedException e) {
+ MylarStatusHandler.fail(e, "Could not export files", true);
+ }
+
+ exportPage.saveSettings();
+ return true;
+ }
+
+ /** Job that performs the file copying and zipping */
+ class FileCopyJob implements IRunnableWithProgress {
+
+ private static final String JOB_LABEL = "Exporting Data";
+
+ private File destZipFile = null;
+
+ private File destTaskListFile = null;
+
+ private File destActivationHistoryFile = null;
+
+ private boolean zip;
+
+ private boolean exportTaskList;
+
+ private boolean exportActivationHistory;
+
+ private boolean exportTaskContexts;
+
+ private String destinationDirectory;
+
+ public FileCopyJob(File destZipFile, File destTaskListFile, File destActivationHistoryFile) {
+ this.destZipFile = destZipFile;
+ this.destTaskListFile = destTaskListFile;
+ this.destActivationHistoryFile = destActivationHistoryFile;
+
+ // Get parameters here to avoid accessing the UI thread
+ this.zip = exportPage.zip();
+ this.exportTaskList = exportPage.exportTaskList();
+ this.exportActivationHistory = exportPage.exportActivationHistory();
+ this.exportTaskContexts = exportPage.exportTaskContexts();
+ this.destinationDirectory = exportPage.getDestinationDirectory();
+ }
+
+ public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ List<ITask> tasks = getAllTasks();
+ monitor.beginTask(JOB_LABEL, tasks.size() + 2);
+
+ // List of files to add to the zip archive
+ List<File> filesToZip = new ArrayList<File>();
+
+ // Map of file paths used to avoid duplicates
+ Map<String, String> filesToZipMap = new HashMap<String, String>();
+
+ if (exportTaskList) {
+ MylarTaskListPlugin.getTaskListManager().saveTaskList();
+
+ String sourceTaskListPath = MylarPlugin.getDefault().getDataDirectory() + File.separator
+ + MylarTaskListPlugin.DEFAULT_TASK_LIST_FILE;
+ File sourceTaskListFile = new File(sourceTaskListPath);
+
+ if (zip) {
+ filesToZip.add(sourceTaskListFile);
+ } else {
+ if (!copy(sourceTaskListFile, destTaskListFile)) {
+ MylarStatusHandler.fail(new Exception("Export Exception"), "Could not export task list file.",
+ false);
+ }
+ monitor.worked(1);
+ }
+
+ }
+
+ if (exportActivationHistory) {
+ try {
+ File sourceActivationHistoryFile = new File(MylarPlugin.getDefault().getDataDirectory()
+ + File.separator + MylarContextManager.CONTEXT_HISTORY_FILE_NAME
+ + MylarContextManager.CONTEXT_FILE_EXTENSION);
+
+ MylarPlugin.getContextManager().saveActivityHistoryContext();
+
+ if (zip) {
+ filesToZip.add(sourceActivationHistoryFile);
+ } else {
+ copy(sourceActivationHistoryFile, destActivationHistoryFile);
+ monitor.worked(1);
+ }
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "Could not export activity history context file", true);
+ }
+ }
+
+ if (exportTaskContexts) {
+ boolean errorDisplayed = false; // Prevent many repeated error
+ // messages
+ for (ITask task : tasks) {
+
+ if (!MylarPlugin.getContextManager().hasContext(task.getHandleIdentifier())) {
+ continue; // Tasks without a context have no file to
+ // copy
+ }
+
+ File contextFile = MylarPlugin.getContextManager().getFileForContext(task.getHandleIdentifier());
+
+ File destTaskFile = new File(destinationDirectory + File.separator + contextFile.getName());
+ File sourceTaskFile = contextFile;
+ // new File(MylarPlugin.getDefault().getDataDirectory() +
+ // File.separator + task.getContextPath()
+ // + MylarContextManager.CONTEXT_FILE_EXTENSION);
+
+ if (zip) {
+ if (!filesToZipMap.containsKey(task.getHandleIdentifier())) {
+ filesToZip.add(sourceTaskFile);
+ filesToZipMap.put(task.getHandleIdentifier(), null);
+ }
+ } else {
+ if (!copy(sourceTaskFile, destTaskFile) && !errorDisplayed) {
+ MylarStatusHandler.fail(new Exception("Export Exception: " + sourceTaskFile.getPath()
+ + " -> " + destTaskFile.getPath()),
+ "Could not export one or more task context files.", true);
+ errorDisplayed = true;
+ }
+ monitor.worked(1);
+ }
+ }
+ }
+
+ if (zip) {
+ try {
+ if (destZipFile.exists()) {
+ destZipFile.delete();
+ }
+ ZipFileUtil.createZipFile(destZipFile, filesToZip, monitor);
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, "Could not create zip file.", true);
+ }
+ }
+ monitor.done();
+
+ }
+ }
+
+ /** Returns all tasks in the task list root or a category in the task list */
+ protected List<ITask> getAllTasks() {
+ List<ITask> allTasks = new ArrayList<ITask>();
+ TaskList taskList = MylarTaskListPlugin.getTaskListManager().getTaskList();
+
+ allTasks.addAll(taskList.getRootTasks());
+
+ for (ITaskContainer category : taskList.getCategories()) {
+ allTasks.addAll(category.getChildren());
+ }
+
+ return allTasks;
+ }
+
+ // Note: Copied from MylarTaskListPlugin
+ 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;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/TaskDataExportWizardPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/TaskDataExportWizardPage.java
new file mode 100644
index 000000000..cf5723385
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/TaskDataExportWizardPage.java
@@ -0,0 +1,285 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.wizards;
+
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+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.Composite;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Wizard Page for the Task Data Export Wizard
+ *
+ * @author Wesley Coelho
+ * @author Mik Kersten
+ */
+public class TaskDataExportWizardPage extends WizardPage {
+
+ protected final static String PAGE_TITLE = "Export Mylar Task Data";
+
+ public final static String PAGE_NAME = PAGE_TITLE;
+
+ private Button taskListCheckBox = null;
+
+ private Button taskActivationHistoryCheckBox = null;
+
+ private Button taskContextsCheckBox = null;
+
+ private Button zipCheckBox = null;
+
+ private Button browseButton = null;
+
+ private Text destDirText = null;
+
+ private Button overwriteCheckBox = null;
+
+ // Key values for the dialog settings object
+ private final static String SETTINGS_SAVED = "Settings saved";
+
+ private final static String TASKLIST_SETTING = "TaskList setting";
+
+ private final static String ACTIVATION_HISTORY_SETTING = "Activation history setting";
+
+ private final static String CONTEXTS_SETTING = "Contexts setting";
+
+ private final static String DEST_DIR_SETTING = "Destination directory setting";
+
+ private final static String OVERWRITE_SETTING = "Overwrite setting";
+
+ private final static String ZIP_SETTING = "Zip Setting";
+
+ public TaskDataExportWizardPage() {
+ super("org.eclipse.mylar.tasklist.exportPage", PAGE_TITLE, MylarTaskListPlugin.imageDescriptorFromPlugin(
+ MylarTaskListPlugin.PLUGIN_ID, "icons/wizban/banner-export.gif"));
+ setPageComplete(false);
+ }
+
+ public String getName() {
+ return PAGE_NAME;
+ }
+
+ /**
+ * Create the widgets on the page
+ */
+ public void createControl(Composite parent) {
+ try {
+ Composite container = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout(1, false);
+ container.setLayout(layout);
+
+ createFileSelectionControl(container);
+ createExportDirectoryControl(container);
+
+ zipCheckBox = createCheckBox(container, "Export to zip file: " + TaskDataExportWizard.getZipFileName());
+ overwriteCheckBox = createCheckBox(container, "Overwrite existing files without warning");
+
+ initSettings();
+
+ setControl(container);
+
+ setPageComplete(validate());
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "Could not create export wizard page", true);
+ }
+ }
+
+ /**
+ * Create widgets for selecting the data files to export
+ */
+ private void createFileSelectionControl(Composite parent) {
+ Group group = new Group(parent, SWT.SHADOW_ETCHED_IN);
+ GridLayout gl = new GridLayout(1, false);
+ group.setLayout(gl);
+ GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+ group.setLayoutData(gridData);
+ group.setText("Select data to export:");
+
+ taskListCheckBox = createCheckBox(group, "Task List");
+ taskActivationHistoryCheckBox = createCheckBox(group, "Task Activation History");
+ taskContextsCheckBox = createCheckBox(group, "Task Contexts");
+ }
+
+ /**
+ * Create widgets for specifying the destination directory
+ */
+ private void createExportDirectoryControl(Composite parent) {
+ Group destDirGroup = new Group(parent, SWT.SHADOW_ETCHED_IN);
+ destDirGroup.setText("Export destination folder");
+ destDirGroup.setLayout(new GridLayout(2, false));
+ destDirGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ destDirText = new Text(destDirGroup, 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(destDirGroup, SWT.PUSH);
+ browseButton.setText("Browse...");
+ browseButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ DirectoryDialog dialog = new DirectoryDialog(getShell());
+ dialog.setText("Folder Selection");
+ dialog.setMessage("Specify the destination folder for task data");
+ String dir = destDirText.getText();
+ dialog.setFilterPath(dir);
+ dir = dialog.open();
+ if (dir == null || dir.equals(""))
+ return;
+ destDirText.setText(dir);
+ }
+ });
+ }
+
+ /**
+ * Initializes controls with values from the Dialog Settings object
+ */
+ protected void initSettings() {
+ IDialogSettings settings = getDialogSettings();
+
+ if (settings.get(SETTINGS_SAVED) == null) {
+ // Set default values
+ taskListCheckBox.setSelection(true);
+ taskActivationHistoryCheckBox.setSelection(true);
+ taskContextsCheckBox.setSelection(true);
+ destDirText.setText("");
+ overwriteCheckBox.setSelection(true);
+ zipCheckBox.setSelection(false);
+ } else {
+ // Retrieve previous values from the dialog settings
+ taskListCheckBox.setSelection(true); // force it
+ // taskListCheckBox.setSelection(settings.getBoolean(TASKLIST_SETTING));
+ taskActivationHistoryCheckBox.setSelection(settings.getBoolean(ACTIVATION_HISTORY_SETTING));
+ taskContextsCheckBox.setSelection(settings.getBoolean(CONTEXTS_SETTING));
+ String directory = settings.get(DEST_DIR_SETTING);
+ if (directory != null) {
+ destDirText.setText(settings.get(DEST_DIR_SETTING));
+ }
+ overwriteCheckBox.setSelection(settings.getBoolean(OVERWRITE_SETTING));
+ zipCheckBox.setSelection(settings.getBoolean(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(TASKLIST_SETTING, taskListCheckBox.getSelection());
+ settings.put(ACTIVATION_HISTORY_SETTING, taskActivationHistoryCheckBox.getSelection());
+ settings.put(CONTEXTS_SETTING, taskContextsCheckBox.getSelection());
+ settings.put(DEST_DIR_SETTING, destDirText.getText());
+ settings.put(OVERWRITE_SETTING, overwriteCheckBox.getSelection());
+ settings.put(ZIP_SETTING, zipCheckBox.getSelection());
+
+ settings.put(SETTINGS_SAVED, SETTINGS_SAVED);
+ }
+
+ /** Convenience method for creating a new checkbox */
+ protected Button createCheckBox(Composite parent, String text) {
+ Button newButton = new Button(parent, SWT.CHECK);
+ newButton.setText(text);
+
+ newButton.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ controlChanged();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // No action required
+ }
+ });
+
+ return newButton;
+ }
+
+ /** 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() {
+
+ // Check that at least one type of data has been selected
+ if (!taskListCheckBox.getSelection() && !taskActivationHistoryCheckBox.getSelection()
+ && !taskContextsCheckBox.getSelection()) {
+ return false;
+ }
+
+ // Check that a destination dir has been specified
+ if (destDirText.getText().equals("")) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /** Returns the directory where data files are to be saved */
+ public String getDestinationDirectory() {
+ return destDirText.getText();
+ }
+
+ /** True if the user wants to export the task list */
+ public boolean exportTaskList() {
+ return taskListCheckBox.getSelection();
+ }
+
+ /** True if the user wants to export task activation history */
+ public boolean exportActivationHistory() {
+ return taskActivationHistoryCheckBox.getSelection();
+ }
+
+ /** True if the user wants to export task context files */
+ public boolean exportTaskContexts() {
+ return taskContextsCheckBox.getSelection();
+ }
+
+ /** True if the user wants to overwrite files by default */
+ public boolean overwrite() {
+ return overwriteCheckBox.getSelection();
+ }
+
+ /** True if the user wants to write to a zip file */
+ public boolean zip() {
+ return zipCheckBox.getSelection();
+ }
+
+ /** For testing only. Sets controls to the specified values */
+ public void setParameters(boolean overwrite, boolean exportTaskList, boolean exportActivationHistory,
+ boolean exportTaskContexts, boolean zip, String destinationDir) {
+ overwriteCheckBox.setSelection(overwrite);
+ taskListCheckBox.setSelection(exportTaskList);
+ taskActivationHistoryCheckBox.setSelection(exportActivationHistory);
+ taskContextsCheckBox.setSelection(exportTaskContexts);
+ destDirText.setText(destinationDir);
+ zipCheckBox.setSelection(zip);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/TaskDataImportWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/TaskDataImportWizard.java
new file mode 100644
index 000000000..73d1d0da9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/TaskDataImportWizard.java
@@ -0,0 +1,421 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.wizards;
+
+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.lang.reflect.InvocationTargetException;
+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.core.runtime.IProgressMonitor;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylar.internal.core.MylarContextManager;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskContainer;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskList;
+import org.eclipse.ui.IImportWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.IProgressService;
+
+/**
+ * @author Rob Elves
+ * Some code leveraged from TaskDataExportWizard
+ */
+public class TaskDataImportWizard extends Wizard implements IImportWizard {
+
+ private final static String SETTINGS_SECTION = "org.eclipse.mylar.tasklist.ui.importWizard";
+
+ private final static String WINDOW_TITLE = "Import";
+
+ private TaskDataImportWizardPage importPage = null;
+
+ public TaskDataImportWizard() {
+ super();
+ IDialogSettings masterSettings = MylarTaskListPlugin.getDefault().getDialogSettings();
+ setDialogSettings(getSettingsSection(masterSettings));
+ setNeedsProgressMonitor(true);
+ setWindowTitle(WINDOW_TITLE);
+ }
+
+ /**
+ * Finds or creates a dialog settings section that is used to make the
+ * dialog control settings persistent
+ */
+ public IDialogSettings getSettingsSection(IDialogSettings master) {
+ IDialogSettings settings = master.getSection(SETTINGS_SECTION);
+ if (settings == null) {
+ settings = master.addNewSection(SETTINGS_SECTION);
+ }
+ return settings;
+ }
+
+ public void addPages() {
+ importPage = new TaskDataImportWizardPage();
+ importPage.setWizard(this);
+ addPage(importPage);
+ }
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ // no initialization needed
+ }
+
+ public boolean canFinish() {
+ return importPage.isPageComplete();
+ }
+
+ /**
+ * 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.
+ */
+ public boolean performFinish() {
+
+ File sourceDirFile = null;
+ File sourceZipFile = null;
+ File sourceTaskListFile = null;
+ File sourceActivationHistoryFile = null;
+ List<File> contextFiles = new ArrayList<File>();
+ List<String> zipFilesToExtract = new ArrayList<String>();
+ boolean overwrite = importPage.overwrite();
+ boolean zip = importPage.zip();
+
+ if (zip) {
+
+ String sourceZip = importPage.getSourceZipFile();
+ sourceZipFile = new File(sourceZip);
+
+ if (!sourceZipFile.exists()) {
+ MessageDialog
+ .openError(getShell(), "File not found", sourceZipFile.toString() + " could not be found.");
+ }
+
+ Enumeration entries;
+ ZipFile zipFile;
+
+ try {
+ zipFile = new ZipFile(sourceZipFile, ZipFile.OPEN_READ);
+ entries = zipFile.entries();
+ while (entries.hasMoreElements()) {
+ ZipEntry entry = (ZipEntry) entries.nextElement();
+
+ if (entry.isDirectory()) {
+ // ignore directories (shouldn't be any)
+ continue;
+ }
+ if (!importPage.importTaskList()
+ && entry.getName().endsWith(MylarTaskListPlugin.DEFAULT_TASK_LIST_FILE)) {
+ continue;
+ }
+ if (!importPage.importActivationHistory()
+ && entry.getName().endsWith(
+ MylarContextManager.CONTEXT_HISTORY_FILE_NAME
+ + MylarContextManager.CONTEXT_FILE_EXTENSION)) {
+ continue;
+ }
+ if (!importPage.importTaskContexts()
+ && entry.getName().matches(".*-\\d*" + MylarContextManager.CONTEXT_FILE_EXTENSION + "$")) {
+ continue;
+ }
+
+ File destContextFile = new File(MylarPlugin.getDefault().getDataDirectory() + File.separator
+ + entry.getName());
+
+ if (!overwrite && destContextFile.exists()) {
+ if (MessageDialog.openConfirm(getShell(), "File exists!", "Overwrite existing file?\n"
+ + destContextFile.getName())) {
+ zipFilesToExtract.add(entry.toString());
+ } else {
+ // no overwrite
+ }
+ } else {
+ zipFilesToExtract.add(entry.toString());
+ }
+
+ }
+
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ } else {
+ // Get file paths to check for existence
+ String sourceDir = importPage.getSourceDirectory();
+ sourceDirFile = new File(sourceDir);
+ if (!sourceDirFile.exists() || !sourceDirFile.isDirectory()) {
+ // This should never happen
+ MylarStatusHandler.fail(new Exception("File Import Exception"),
+ "Could not import data because specified location does not exist or is not a folder", true);
+ return false;
+ }
+
+ // make sure selected files for import are there
+ sourceTaskListFile = new File(sourceDir + File.separator + MylarTaskListPlugin.DEFAULT_TASK_LIST_FILE);
+ sourceActivationHistoryFile = new File(sourceDir + File.separator
+ + MylarContextManager.CONTEXT_HISTORY_FILE_NAME + MylarContextManager.CONTEXT_FILE_EXTENSION);
+
+ File[] children = sourceDirFile.listFiles();
+ for (int i = 0; i < children.length; i++) {
+ if (children[i].getAbsolutePath().matches(".*-\\d*" + MylarContextManager.CONTEXT_FILE_EXTENSION + "$")) {
+
+ File destContextFile = new File(MylarPlugin.getDefault().getDataDirectory() + File.separator
+ + children[i].getName());
+
+ if (!overwrite && destContextFile.exists()) {
+ if (MessageDialog.openConfirm(getShell(), "Context exists!",
+ "Overwrite existing task context?\n" + destContextFile.getName())) {
+ contextFiles.add(children[i]);
+ } else {
+ // no overwrite
+ }
+ } else {
+ contextFiles.add(children[i]);
+ }
+ }
+
+ }
+
+ if (importPage.importTaskList() && !sourceTaskListFile.exists()) {
+ MessageDialog.openError(getShell(), "File not found", sourceTaskListFile.toString() + " not found.");
+ return false;
+ } else if (importPage.importActivationHistory() && !sourceActivationHistoryFile.exists()) {
+ MessageDialog.openError(getShell(), "File not found", sourceActivationHistoryFile.toString()
+ + " not found.");
+ return false;
+ }
+
+ }
+
+ FileCopyJob job = new FileCopyJob(sourceDirFile, sourceZipFile, sourceTaskListFile,
+ sourceActivationHistoryFile, contextFiles, zipFilesToExtract);
+
+ IProgressService service = PlatformUI.getWorkbench().getProgressService();
+
+ try {
+ service.run(true, false, job);
+ } catch (InvocationTargetException e) {
+ MylarStatusHandler.fail(e, "Could not import files", true);
+ } catch (InterruptedException e) {
+ MylarStatusHandler.fail(e, "Could not import files", true);
+ }
+
+ importPage.saveSettings();
+ return true;
+ }
+
+ /** Job that performs the file copying and zipping */
+ class FileCopyJob implements IRunnableWithProgress {
+
+ private static final String JOB_LABEL = "Importing Data";
+
+ private File sourceZipFile = null;
+
+ private File sourceTaskListFile = null;
+
+ private File sourceActivationHistoryFile = null;
+
+ private boolean zip;
+
+ private boolean importTaskList;
+
+ private boolean importActivationHistory;
+
+ private boolean importTaskContexts;
+
+ private List<File> sourceContextFiles;
+
+ private List<String> zipFilesToExtract;
+
+ public FileCopyJob(File sourceFolder, File sourceZipFile, File sourceTaskListFile,
+ File sourceActivationHistoryFile, List<File> contextFiles, List<String> zipFiles) {
+
+ this.sourceZipFile = sourceZipFile;
+ this.sourceTaskListFile = sourceTaskListFile;
+ this.sourceActivationHistoryFile = sourceActivationHistoryFile;
+ this.sourceContextFiles = contextFiles;
+ this.zipFilesToExtract = zipFiles;
+
+ // Get parameters here to avoid accessing the UI thread
+ this.zip = importPage.zip();
+ this.importTaskList = importPage.importTaskList();
+ this.importActivationHistory = importPage.importActivationHistory();
+ this.importTaskContexts = importPage.importTaskContexts();
+
+ }
+
+ public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+
+ if (zip) {
+ monitor.beginTask(JOB_LABEL, zipFilesToExtract.size() + 2);
+ ZipFile zipFile;
+
+ try {
+ zipFile = new ZipFile(sourceZipFile, ZipFile.OPEN_READ);
+
+ for (String zipFileStr : zipFilesToExtract) {
+ ZipEntry entry = zipFile.getEntry(zipFileStr);
+ if (entry == null) {
+ MylarStatusHandler.fail(new Exception("Import Exception"),
+ "Problem occured extracting from zip file.", true);
+ return;
+ }
+
+ File destinationFile = new File(MylarPlugin.getDefault().getDataDirectory() + File.separator
+ + entry.getName());
+ if (destinationFile.exists()) {
+ destinationFile.delete();
+ }
+
+ copyInputStream(zipFile.getInputStream(entry), new BufferedOutputStream(new FileOutputStream(
+ destinationFile)));
+ monitor.worked(1);
+
+ }
+ zipFile.close();
+ } catch (IOException ioe) {
+ MylarStatusHandler.fail(new Exception("Import Exception"),
+ "Problem occured extracting from zip file.", true);
+ return;
+ }
+ monitor.done();
+
+ MylarTaskListPlugin.getTaskListManager().readExistingOrCreateNewList();
+
+ return;
+ }
+
+ if (importTaskList) {
+ monitor.beginTask(JOB_LABEL, sourceContextFiles.size() + 2);
+ String destTaskListPath = MylarPlugin.getDefault().getDataDirectory() + File.separator
+ + MylarTaskListPlugin.DEFAULT_TASK_LIST_FILE;
+ File destTaskListFile = new File(destTaskListPath);
+
+ if (destTaskListFile.exists()) {
+ destTaskListFile.delete();
+ }
+
+ if (!copy(sourceTaskListFile, destTaskListFile)) {
+ MylarStatusHandler
+ .fail(new Exception("Import Exception"), "Could not import task list file.", true);
+ }
+ monitor.worked(1);
+
+ }
+
+ if (importActivationHistory) {
+ try {
+ File destActivationHistoryFile = new File(MylarPlugin.getDefault().getDataDirectory()
+ + File.separator + MylarContextManager.CONTEXT_HISTORY_FILE_NAME
+ + MylarContextManager.CONTEXT_FILE_EXTENSION);
+
+ if (destActivationHistoryFile.exists()) {
+ destActivationHistoryFile.delete();
+ }
+
+ copy(sourceActivationHistoryFile, destActivationHistoryFile);
+ monitor.worked(1);
+
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "Could not import activity history context file", true);
+ }
+ }
+
+ if (importTaskContexts) {
+ boolean errorDisplayed = false;
+ for (File sourceContextFile : sourceContextFiles) {
+
+ File destContextFile = new File(MylarPlugin.getDefault().getDataDirectory() + File.separator
+ + sourceContextFile.getName());
+
+ if (destContextFile.exists()) {
+ destContextFile.delete();
+ }
+
+ if (!copy(sourceContextFile, destContextFile) && !errorDisplayed) {
+ MylarStatusHandler.fail(new Exception("Import Exception: " + sourceContextFile.getPath()
+ + " -> " + destContextFile.getPath()),
+ "Could not import one or more task context files.", true);
+ errorDisplayed = true;
+ }
+ monitor.worked(1);
+ }
+ }
+ monitor.done();
+ MylarTaskListPlugin.getTaskListManager().readExistingOrCreateNewList();
+ }
+ }
+
+ /** Returns all tasks in the task list root or a category in the task list */
+ protected List<ITask> getAllTasks() {
+ List<ITask> allTasks = new ArrayList<ITask>();
+ TaskList taskList = MylarTaskListPlugin.getTaskListManager().getTaskList();
+
+ allTasks.addAll(taskList.getRootTasks());
+
+ for (ITaskContainer category : taskList.getCategories()) {
+ allTasks.addAll(category.getChildren());
+ }
+
+ return allTasks;
+ }
+
+ private boolean copy(File src, File dst) {
+
+ try {
+ InputStream in = new FileInputStream(src);
+ OutputStream out = new FileOutputStream(dst);
+ return copyInputStream(in, new BufferedOutputStream(out));
+ } catch (FileNotFoundException e) {
+ return false;
+ }
+
+ }
+
+ private boolean copyInputStream(InputStream inputStream, BufferedOutputStream stream) {
+ try {
+ InputStream in = inputStream;
+ OutputStream out = stream;
+
+ // 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;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/TaskDataImportWizardPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/TaskDataImportWizardPage.java
new file mode 100644
index 000000000..ef2ccc10c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/TaskDataImportWizardPage.java
@@ -0,0 +1,385 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.ui.wizards;
+
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+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.Composite;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * 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 final static String PAGE_TITLE = "Import Mylar Task Data";
+
+ public final static String PAGE_NAME = PAGE_TITLE;
+
+ private Button taskListCheckBox = null;
+
+ private Button taskActivationHistoryCheckBox = null;
+
+ private Button taskContextsCheckBox = null;
+
+ private Button browseButton = null;
+ private Button browseButtonZip = null;
+
+ private Text sourceDirText = null;
+ private Text sourceZipText = null;
+
+ private Button overwriteCheckBox = null;
+
+ private Group importFromZipGroup;
+
+ private Group importFromFolderGroup;
+
+ private Button importViaFolderButton;
+
+ private Button importViaZipButton;
+
+ // Key values for the dialog settings object
+ private final static String SETTINGS_SAVED = "Import Settings saved";
+
+ private final static String TASKLIST_SETTING = "Import TaskList setting";
+
+ private final static String ACTIVATION_HISTORY_SETTING = "Import Activation history setting";
+
+ private final static String CONTEXTS_SETTING = "Import Contexts setting";
+
+ private final static String SOURCE_DIR_SETTING = "Import Source directory setting";
+
+ private final static String SOURCE_ZIP_SETTING = "Import Source zip file setting";
+
+ private final static String OVERWRITE_SETTING = "Import Overwrite setting";
+
+ private final static String IMPORT_METHOD_SETTING = "Import method setting";
+
+ public TaskDataImportWizardPage() {
+ super("org.eclipse.mylar.tasklist.importPage", PAGE_TITLE, MylarTaskListPlugin.imageDescriptorFromPlugin(
+ MylarTaskListPlugin.PLUGIN_ID, "icons/wizban/banner-import.gif"));
+ setPageComplete(false);
+ }
+
+ public String getName() {
+ return PAGE_NAME;
+ }
+
+ /**
+ * Create the widgets on the page
+ */
+ public void createControl(Composite parent) {
+ try {
+ Composite container = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout(1, false);
+ container.setLayout(layout);
+
+ Label warningLabel = new Label(container, SWT.NONE);
+ warningLabel.setForeground(PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_RED));
+ warningLabel.setText("Warning: Importing can result in loss of data. Use with caution.");
+
+ createFileSelectionControl(container);
+ createImportDirectoryControl(container);
+ createImportFromZipControl(container);
+
+ overwriteCheckBox = createCheckBox(container, "Overwrite existing files without warning");
+
+ initSettings();
+
+ setControl(container);
+
+ setPageComplete(validate());
+ } catch (RuntimeException e) {
+ MylarStatusHandler.fail(e, "Could not create import wizard page", true);
+ }
+ }
+
+ /**
+ * Create widgets for selecting the data files to import
+ */
+ private void createFileSelectionControl(Composite parent) {
+ Group group = new Group(parent, SWT.SHADOW_ETCHED_IN);
+ GridLayout gl = new GridLayout(1, false);
+ group.setLayout(gl);
+ GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+ group.setLayoutData(gridData);
+ group.setText("Select data to import:");
+
+ taskListCheckBox = createCheckBox(group, "Task List");
+ taskActivationHistoryCheckBox = createCheckBox(group, "Task Activation History");
+ taskContextsCheckBox = createCheckBox(group, "Task Contexts");
+
+ importViaFolderButton = new Button(group, SWT.RADIO);
+ importViaFolderButton.setText("Import task data from .mylar folder");
+ importViaZipButton = new Button(group, SWT.RADIO);
+ importViaZipButton.setText("Import task data from zip file");
+
+ SelectionListener radioListener = new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ importFromFolderGroup.setEnabled(importViaFolderButton.getSelection());
+ browseButton.setEnabled(importViaFolderButton.getSelection());
+ importFromZipGroup.setEnabled(importViaZipButton.getSelection());
+ browseButtonZip.setEnabled(importViaZipButton.getSelection());
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // ignore
+
+ }};
+
+ importViaFolderButton.addSelectionListener(radioListener);
+ importViaZipButton.addSelectionListener(radioListener);
+ }
+
+ /**
+ * Create widgets for specifying the source directory
+ */
+ private void createImportDirectoryControl(Composite parent) {
+ importFromFolderGroup = new Group(parent, SWT.SHADOW_ETCHED_IN);
+ importFromFolderGroup.setText("Import from folder");
+ importFromFolderGroup.setLayout(new GridLayout(2, false));
+ importFromFolderGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ sourceDirText = new Text(importFromFolderGroup, SWT.BORDER);
+ sourceDirText.setEditable(false);
+ sourceDirText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ sourceDirText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ controlChanged();
+ }
+ });
+
+ browseButton = new Button(importFromFolderGroup, SWT.PUSH);
+ browseButton.setText("Browse...");
+ browseButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ DirectoryDialog dialog = new DirectoryDialog(getShell());
+ dialog.setText("Folder Selection");
+ dialog.setMessage("Specify the source folder for task data");
+ String dir = sourceDirText.getText();
+ dialog.setFilterPath(dir);
+ dir = dialog.open();
+ if (dir == null || dir.equals(""))
+ return;
+ sourceDirText.setText(dir);
+ }
+ });
+ }
+
+ /**
+ * Create widgets for specifying the source zip
+ */
+ private void createImportFromZipControl(Composite parent) {
+ importFromZipGroup = new Group(parent, SWT.SHADOW_ETCHED_IN);
+ importFromZipGroup.setText("Import from zip file");
+ importFromZipGroup.setLayout(new GridLayout(2, false));
+ importFromZipGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ sourceZipText = new Text(importFromZipGroup, SWT.BORDER);
+ sourceZipText.setEditable(false);
+ sourceZipText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ sourceZipText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ controlChanged();
+ }
+ });
+
+ browseButtonZip = new Button(importFromZipGroup, SWT.PUSH);
+ browseButtonZip.setText("Browse...");
+ browseButtonZip.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ FileDialog dialog = new FileDialog(getShell());
+ dialog.setText("Zip File Selection");
+// dialog.setText("Specify the source zip file for task data");
+ String dir = sourceZipText.getText();
+ dialog.setFilterPath(dir);
+ dir = dialog.open();
+ if (dir == null || dir.equals(""))
+ return;
+ sourceZipText.setText(dir);
+ }
+ });
+
+ importFromZipGroup.setEnabled(false);
+ browseButtonZip.setEnabled(false);
+
+ }
+
+
+
+
+ /**
+ * Initializes controls with values from the Dialog Settings object
+ */
+ protected void initSettings() {
+ IDialogSettings settings = getDialogSettings();
+
+ if (settings.get(SETTINGS_SAVED) == null) {
+ // Set default values
+ taskListCheckBox.setSelection(true);
+ taskActivationHistoryCheckBox.setSelection(true);
+ taskContextsCheckBox.setSelection(true);
+ sourceDirText.setText("");
+ overwriteCheckBox.setSelection(true);
+ importFromFolderGroup.setEnabled(true);
+ importViaFolderButton.setSelection(true);
+
+ } else {
+ // Retrieve previous values from the dialog settings
+ taskListCheckBox.setSelection(settings.getBoolean(TASKLIST_SETTING));
+ taskActivationHistoryCheckBox.setSelection(settings.getBoolean(ACTIVATION_HISTORY_SETTING));
+ taskContextsCheckBox.setSelection(settings.getBoolean(CONTEXTS_SETTING));
+ importViaFolderButton.setSelection(settings.getBoolean(IMPORT_METHOD_SETTING));
+ importViaZipButton.setSelection(!importViaFolderButton.getSelection());
+
+ importFromFolderGroup.setEnabled(importViaFolderButton.getSelection());
+ importFromZipGroup.setEnabled(importViaZipButton.getSelection());
+ browseButton.setEnabled(importFromFolderGroup.isEnabled());
+ browseButtonZip.setEnabled(importFromZipGroup.isEnabled());
+
+ String directory = settings.get(SOURCE_DIR_SETTING);
+ if (directory != null) {
+ sourceDirText.setText(settings.get(SOURCE_DIR_SETTING));
+ }
+ String zipFile = settings.get(SOURCE_ZIP_SETTING);
+ if (zipFile != null) {
+ sourceZipText.setText(settings.get(SOURCE_ZIP_SETTING));
+ }
+ overwriteCheckBox.setSelection(settings.getBoolean(OVERWRITE_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(TASKLIST_SETTING, taskListCheckBox.getSelection());
+ settings.put(ACTIVATION_HISTORY_SETTING, taskActivationHistoryCheckBox.getSelection());
+ settings.put(CONTEXTS_SETTING, taskContextsCheckBox.getSelection());
+ settings.put(SOURCE_DIR_SETTING, sourceDirText.getText());
+ settings.put(SOURCE_ZIP_SETTING, sourceZipText.getText());
+ settings.put(OVERWRITE_SETTING, overwriteCheckBox.getSelection());
+ settings.put(IMPORT_METHOD_SETTING, importViaFolderButton.getSelection());
+
+ settings.put(SETTINGS_SAVED, SETTINGS_SAVED);
+ }
+
+ /** Convenience method for creating a new checkbox */
+ protected Button createCheckBox(Composite parent, String text) {
+ Button newButton = new Button(parent, SWT.CHECK);
+ newButton.setText(text);
+
+ newButton.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ controlChanged();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // No action required
+ }
+ });
+
+ return newButton;
+ }
+
+ /** 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() {
+
+ // Check that at least one type of data has been selected
+ if (!taskListCheckBox.getSelection() && !taskActivationHistoryCheckBox.getSelection()
+ && !taskContextsCheckBox.getSelection()) {
+ return false;
+ }
+
+ // Check that a destination dir has been specified
+ if (sourceDirText.getText().equals("") && sourceZipText.getText().equals("")) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /** Returns the directory where data files are to be restored from */
+ public String getSourceDirectory() {
+ return sourceDirText.getText();
+ }
+
+ public String getSourceZipFile() {
+ return sourceZipText.getText();
+ }
+
+ /** True if the user wants to import the task list */
+ public boolean importTaskList() {
+ return taskListCheckBox.getSelection();
+ }
+
+ /** True if the user wants to import task activation history */
+ public boolean importActivationHistory() {
+ return taskActivationHistoryCheckBox.getSelection();
+ }
+
+ /** True if the user wants to import task context files */
+ public boolean importTaskContexts() {
+ return taskContextsCheckBox.getSelection();
+ }
+
+ /** True if the user wants to overwrite files by default */
+ public boolean overwrite() {
+ return overwriteCheckBox.getSelection();
+ }
+
+ /** True if the user wants to import from a zip file */
+ public boolean zip() {
+ return importViaZipButton.getSelection();
+ }
+
+ /** For testing only. Sets controls to the specified values */
+ public void setParameters(boolean overwrite, boolean importTaskList, boolean importActivationHistory,
+ boolean importTaskContexts, boolean zip, String sourceDir, String sourceZip) {
+ overwriteCheckBox.setSelection(overwrite);
+ taskListCheckBox.setSelection(importTaskList);
+ taskActivationHistoryCheckBox.setSelection(importActivationHistory);
+ taskContextsCheckBox.setSelection(importTaskContexts);
+ sourceDirText.setText(sourceDir);
+ sourceZipText.setText(sourceZip);
+ importViaZipButton.setSelection(zip);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/BackgroundSaveTimer.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/BackgroundSaveTimer.java
new file mode 100644
index 000000000..9431b9b19
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/BackgroundSaveTimer.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.util;
+
+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.mylar.internal.core.util.ITimerThreadListener;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.core.util.TimerThread;
+
+/**
+ * Timer that periodically runs saveRequested() on its client as a job
+ *
+ * @author Wesley Coelho
+ */
+public class BackgroundSaveTimer implements ITimerThreadListener {
+
+ private final static int DEFAULT_SAVE_INTERVAL = 60 * 1000;
+
+ private int saveInterval = DEFAULT_SAVE_INTERVAL;
+
+ private IBackgroundSaveListener listener = null;
+
+ private TimerThread timer = null;
+
+ private boolean forceSyncExec = false;
+
+ public BackgroundSaveTimer(IBackgroundSaveListener listener) {
+ this.listener = listener;
+ timer = new TimerThread(saveInterval);
+ timer.addListener(this);
+ }
+
+ public void start() {
+ timer.start();
+ }
+
+ public void stop() {
+ timer.kill();
+ }
+
+ public void setSaveIntervalMillis(int saveIntervalMillis) {
+ this.saveInterval = saveIntervalMillis;
+ timer.setTimeoutMillis(saveIntervalMillis);
+ }
+
+ public int getSaveIntervalMillis() {
+ return saveInterval;
+ }
+
+ /**
+ * For testing
+ */
+ public void setForceSyncExec(boolean forceSyncExec) {
+ this.forceSyncExec = forceSyncExec;
+ }
+
+ /**
+ * Called by the ActivityTimerThread Calls save in a new job
+ */
+ public void fireTimedOut() {
+ try {
+ if (!forceSyncExec) {
+ final SaveJob job = new SaveJob("Saving Task Data", listener);
+ job.schedule();
+ } else {
+ listener.saveRequested();
+ }
+ } catch (RuntimeException e) {
+ MylarStatusHandler.log("Could not schedule save job", this);
+ }
+ }
+
+ /** Job that makes the save call */
+ private class SaveJob extends Job {
+ private IBackgroundSaveListener listener = null;
+
+ public SaveJob(String name, IBackgroundSaveListener listener) {
+ super(name);
+ this.listener = listener;
+ }
+
+ protected IStatus run(IProgressMonitor monitor) {
+ listener.saveRequested();
+ return Status.OK_STATUS;
+ }
+ }
+
+ public void intervalElapsed() {
+ // ignore
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/IBackgroundSaveListener.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/IBackgroundSaveListener.java
new file mode 100644
index 000000000..4482be824
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/IBackgroundSaveListener.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.util;
+
+/**
+ * Interface implemented by clients who are to be notified of periodic requests
+ * to save data to disk.
+ *
+ * @author Wesley Coelho
+ */
+public interface IBackgroundSaveListener {
+
+ /**
+ * Called to notify the client of a PeriodicSaveTimer that a save should be
+ * performed
+ */
+ public void saveRequested();
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/TaskActivityTimer.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/TaskActivityTimer.java
new file mode 100644
index 000000000..5167cd972
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/TaskActivityTimer.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.util;
+
+import java.util.Calendar;
+
+import org.eclipse.mylar.internal.core.util.ITimerThreadListener;
+import org.eclipse.mylar.internal.core.util.TimerThread;
+import org.eclipse.mylar.provisional.core.IInteractionEventListener;
+import org.eclipse.mylar.provisional.core.InteractionEvent;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.swt.events.ShellEvent;
+import org.eclipse.swt.events.ShellListener;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskActivityTimer implements ITimerThreadListener, IInteractionEventListener, ShellListener {
+
+ 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().getActiveWorkbenchWindow().getShell().addShellListener(this);
+ MylarPlugin.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);
+ MylarPlugin.getDefault().removeInteractionListener(this);
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().removeShellListener(this);
+ started = false;
+ }
+
+ public void fireTimedOut() {
+ suspendTiming();
+ }
+
+ public void shellDeactivated(ShellEvent e) {
+ suspendTiming();
+ }
+
+ public void interactionObserved(InteractionEvent event) {
+ // lastActivity = Calendar.getInstance().getTimeInMillis();
+ timer.resetTimer();
+ }
+
+ public void shellActivated(ShellEvent e) {
+ timer.resetTimer();
+ lastActivity = Calendar.getInstance().getTimeInMillis();
+ }
+
+ 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 shellClosed(ShellEvent e) {
+ timer.kill();
+ }
+
+ public void shellDeiconified(ShellEvent e) {
+ // ignore
+ }
+
+ public void shellIconified(ShellEvent e) {
+ // ignore
+ }
+
+ public void startObserving() {
+
+ }
+
+ public void stopObserving() {
+
+ }
+
+ /**
+ * 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();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/TaskListExtensionReader.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/TaskListExtensionReader.java
new file mode 100644
index 000000000..8b03b0f34
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/TaskListExtensionReader.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.mylar.internal.tasklist.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+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.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.ui.IDynamicSubMenuContributor;
+import org.eclipse.mylar.internal.tasklist.ui.ITaskEditorFactory;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryClient;
+import org.eclipse.mylar.provisional.tasklist.ITaskListExternalizer;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+/**
+ * @author Shawn Minto
+ * @author Mik Kersten
+ */
+public class TaskListExtensionReader {
+
+ public static final String EXTENSION_REPOSITORIES = "org.eclipse.mylar.tasklist.repositories";
+
+ public static final String ELMNT_REPOSITORY_TYPE = "repositoryType";
+
+ public static final String ELMNT_EXTERNALIZER = "externalizer";
+
+ public static final String ATTR_BRANDING_ICON = "brandingIcon";
+
+ public static final String ELMNT_TYPE = "type";
+
+ public static final String ELMNT_QUERY_PAGE = "queryPage";
+
+ public static final String ELMNT_SETTINGS_PAGE = "settingsPage";
+
+ public static final String EXTENSION_TASK_CONTRIBUTOR = "org.eclipse.mylar.tasklist.providers";
+
+// public static final String ELMNT_TASK_HANDLER = "taskHandler";
+
+// public static final String ATTR_EXTERNALIZER_CLASS = "externalizerClass";
+
+ public static final String ATTR_ACTION_CONTRIBUTOR_CLASS = "taskHandlerClass";
+
+ // public static final String TASK_LISTENER_ELEMENT = "taskListener";
+
+ // public static final String TASK_LISTENER_CLASS_ID = "class";
+
+ public static final String DYNAMIC_POPUP_ELEMENT = "dynamicPopupMenu";
+
+ public static final String ATTR_CLASS = "class";
+
+ public static final String EXTENSION_EDITORS = "org.eclipse.mylar.tasklist.editors";
+
+ public static final String EDITOR_FACTORY = "editorFactory";
+
+ public static final String EDITOR_FACTORY_CLASS = "class";
+
+ private static boolean extensionsRead = false;
+
+ public static void initExtensions(TaskListWriter writer) {
+ // code from "contributing to eclipse" with modifications for deprecated
+ // code
+ List<ITaskListExternalizer> externalizers = new ArrayList<ITaskListExternalizer>();
+ if (!extensionsRead) {
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+
+ // HACK: has to be read first
+ IExtensionPoint repositoriesExtensionPoint = registry.getExtensionPoint(EXTENSION_REPOSITORIES);
+ IExtension[] repositoryExtensions = repositoriesExtensionPoint.getExtensions();
+ for (int i = 0; i < repositoryExtensions.length; i++) {
+ IConfigurationElement[] elements = repositoryExtensions[i].getConfigurationElements();
+ for (int j = 0; j < elements.length; j++) {
+ if (elements[j].getName().equals(ELMNT_REPOSITORY_TYPE)) {
+ readRepositoryClient(elements[j]);
+ } else if (elements[j].getName().equals(ELMNT_EXTERNALIZER)) {
+ readExternalizer(elements[j], externalizers);
+ }
+ }
+ }
+
+ IExtensionPoint extensionPoint = registry.getExtensionPoint(EXTENSION_TASK_CONTRIBUTOR);
+ IExtension[] extensions = extensionPoint.getExtensions();
+ for (int i = 0; i < extensions.length; i++) {
+ IConfigurationElement[] elements = extensions[i].getConfigurationElements();
+ for (int j = 0; j < elements.length; j++) {
+// if (elements[j].getName().compareTo(ELMNT_TASK_HANDLER) == 0) {
+// readExternalizer(elements[j], externalizers);
+// } else
+ if (elements[j].getName().equals(DYNAMIC_POPUP_ELEMENT)) {
+ readDynamicPopupContributor(elements[j]);
+ }
+ }
+ }
+ // for (int i = 0; i < extensions.length; i++) {
+ // IConfigurationElement[] elements =
+ // extensions[i].getConfigurationElements();
+ // for (int j = 0; j < elements.length; j++) {
+ // if (elements[j].getName().compareTo(ELMNT_REPOSITORY_CLIENT) ==
+ // 0) {
+ // readRepositoryClient(elements[j]);
+ // }
+ // }
+ // }
+
+ IExtensionPoint editorsExtensionPoint = registry.getExtensionPoint(EXTENSION_EDITORS);
+ IExtension[] editors = editorsExtensionPoint.getExtensions();
+ for (int i = 0; i < editors.length; i++) {
+ IConfigurationElement[] elements = editors[i].getConfigurationElements();
+ for (int j = 0; j < elements.length; j++) {
+ if (elements[j].getName().equals(EDITOR_FACTORY)) {
+ readEditorFactory(elements[j]);
+ }
+ }
+ }
+ writer.setDelegateExternalizers(externalizers);
+ extensionsRead = true;
+ }
+ }
+
+ private static void readEditorFactory(IConfigurationElement element) {
+ try {
+ Object editor = element.createExecutableExtension(EDITOR_FACTORY_CLASS);
+ if (editor instanceof ITaskEditorFactory) {
+ MylarTaskListPlugin.getDefault().addContextEditor((ITaskEditorFactory) editor);
+ } else {
+ MylarStatusHandler.log("Could not load editor: " + editor.getClass().getCanonicalName()
+ + " must implement " + ITaskEditorFactory.class.getCanonicalName(), null);
+ }
+ } catch (CoreException e) {
+ MylarStatusHandler.log(e, "Could not load tasklist listener extension");
+ }
+ }
+
+ private static void readRepositoryClient(IConfigurationElement element) {
+ try {
+ Object type = element.getAttribute(ELMNT_TYPE);
+ Object repository = element.createExecutableExtension(ATTR_CLASS);
+ if (repository instanceof AbstractRepositoryClient && type != null) {
+ MylarTaskListPlugin.getRepositoryManager().addRepositoryClient((AbstractRepositoryClient) repository);
+
+ String iconPath = element.getAttribute(ATTR_BRANDING_ICON);
+ if (iconPath != null) {
+
+ ImageDescriptor descriptor = AbstractUIPlugin.imageDescriptorFromPlugin(element.getContributor().getName(),
+ iconPath);
+ if (descriptor != null) {
+ MylarTaskListPlugin.getDefault().getBrandingIcons().put((AbstractRepositoryClient) repository, TaskListImages.getImage(descriptor));
+ }
+ }
+
+ } else {
+ MylarStatusHandler.log("could not not load extension: " + repository, null);
+ }
+
+ } catch (CoreException e) {
+ MylarStatusHandler.log(e, "Could not load tasklist listener extension");
+ }
+ }
+
+ private static void readDynamicPopupContributor(IConfigurationElement element) {
+ try {
+ Object dynamicPopupContributor = element.createExecutableExtension(ATTR_CLASS);
+ if (dynamicPopupContributor instanceof IDynamicSubMenuContributor) {
+ MylarTaskListPlugin.getDefault().addDynamicPopupContributor(
+ (IDynamicSubMenuContributor) dynamicPopupContributor);
+ } else {
+ MylarStatusHandler.log("Could not load dyanmic popup menu: "
+ + dynamicPopupContributor.getClass().getCanonicalName() + " must implement "
+ + IDynamicSubMenuContributor.class.getCanonicalName(), null);
+ }
+ } catch (CoreException e) {
+ MylarStatusHandler.log(e, "Could not load dynamic popup extension");
+ }
+ }
+
+ private static void readExternalizer(IConfigurationElement element, List<ITaskListExternalizer> externalizers) {
+ try {
+ Object externalizerObject = element.createExecutableExtension(ATTR_CLASS);
+ if (externalizerObject instanceof ITaskListExternalizer) {
+ ITaskListExternalizer externalizer = (ITaskListExternalizer) externalizerObject;
+ externalizers.add((ITaskListExternalizer) externalizer);
+ } else {
+ MylarStatusHandler.log("Could not load externalizer: "
+ + externalizerObject.getClass().getCanonicalName() + " must implement "
+ + ITaskListExternalizer.class.getCanonicalName(), null);
+ }
+
+ // Object taskHandler =
+ // element.createExecutableExtension(ATTR_ACTION_CONTRIBUTOR_CLASS);
+ // if (taskHandler instanceof ITaskHandler) {
+ // MylarTaskListPlugin.getDefault().addTaskHandler((ITaskHandler)
+ // taskHandler);
+ // } else {
+ // MylarStatusHandler.log("Could not load contributor: " +
+ // taskHandler.getClass().getCanonicalName()
+ // + " must implement " + ITaskHandler.class.getCanonicalName(),
+ // null);
+ // }
+ } catch (CoreException e) {
+ MylarStatusHandler.log(e, "Could not load task handler extension");
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/TaskListSaveManager.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/TaskListSaveManager.java
new file mode 100644
index 000000000..8cc1a7694
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/TaskListSaveManager.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.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.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskActivityListener;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListSaveManager implements ITaskActivityListener, DisposeListener, IBackgroundSaveListener {
+
+ private final static int DEFAULT_SAVE_INTERVAL = 5 * 60 * 1000;
+
+ private static final String FILE_SUFFIX_BACKUP = "-backup.xml";
+
+ private BackgroundSaveTimer saveTimer = null;
+
+ /**
+ * Fort testing.
+ */
+ private boolean forceBackgroundSave = false;
+
+ public TaskListSaveManager() {
+ saveTimer = new BackgroundSaveTimer(this);
+ saveTimer.setSaveIntervalMillis(DEFAULT_SAVE_INTERVAL);
+ saveTimer.start();
+ }
+
+ /**
+ * Called periodically by the save timer
+ */
+ public void saveRequested() {
+ if (!MylarTaskListPlugin.getDefault().isInitialized()) {
+ if (PlatformUI.getWorkbench() != null && PlatformUI.getWorkbench().getDisplay() != null) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getDisplay().getActiveShell(), MylarTaskListPlugin.TITLE_DIALOG,
+ "If task list is blank, Mylar 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" +
+ MylarTaskListPlugin.URL_HOMEPAGE);
+ }
+ }
+
+ if (MylarTaskListPlugin.getDefault() != null && MylarTaskListPlugin.getDefault().isShellActive()
+ || forceBackgroundSave) {
+ try {
+ saveTaskListAndContexts();
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, "Could not auto save task list", false);
+ }
+ }
+ }
+
+ public void saveTaskListAndContexts() {
+ if (MylarTaskListPlugin.getDefault() != null) {
+ MylarTaskListPlugin.getTaskListManager().saveTaskList();
+ for (ITask task : new ArrayList<ITask>(MylarTaskListPlugin.getTaskListManager().getTaskList().getActiveTasks())) {
+ MylarPlugin.getContextManager().saveContext(task.getHandleIdentifier());
+ }
+ }
+ }
+
+ /**
+ * Copies all files in the current data directory to the specified folder.
+ * Will overwrite.
+ */
+ public void copyDataDirContentsTo(String targetFolderPath) {
+ File mainDataDir = new File(MylarPlugin.getDefault().getDataDirectory());
+
+ for (File currFile : mainDataDir.listFiles()) {
+ if (currFile.isFile()) {
+ File destFile = new File(targetFolderPath + File.separator + currFile.getName());
+ copy(currFile, destFile);
+ }
+ }
+ }
+
+ public void createTaskListBackupFile() {
+ String path = MylarPlugin.getDefault().getDataDirectory() + File.separator
+ + MylarTaskListPlugin.DEFAULT_TASK_LIST_FILE;
+ File taskListFile = new File(path);
+ String backup = path.substring(0, path.lastIndexOf('.')) + FILE_SUFFIX_BACKUP;
+ copy(taskListFile, new File(backup));
+ }
+
+ public String getBackupFilePath() {
+ String path = MylarPlugin.getDefault().getDataDirectory() + File.separator
+ + MylarTaskListPlugin.DEFAULT_TASK_LIST_FILE;
+ return path.substring(0, path.lastIndexOf('.')) + FILE_SUFFIX_BACKUP;
+ }
+
+ public void reverseBackup() {
+ String path = MylarPlugin.getDefault().getDataDirectory() + File.separator
+ + MylarTaskListPlugin.DEFAULT_TASK_LIST_FILE;
+ File taskListFile = new File(path);
+ String backup = path.substring(0, path.lastIndexOf('.')) + 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;
+ }
+ }
+
+ /** For testing only * */
+ public BackgroundSaveTimer getSaveTimer() {
+ return saveTimer;
+ }
+
+ public void taskActivated(ITask task) {
+
+ }
+
+ public void tasksActivated(List<ITask> tasks) {
+ // ignore
+ }
+
+ public void taskDeactivated(ITask task) {
+ saveTaskListAndContexts();
+ }
+
+ public void localInfoChanged(ITask task) {
+ saveTaskListAndContexts();
+ }
+
+ public void repositoryInfoChanged(ITask task) {
+ // ignore
+ }
+
+ public void tasklistRead() {
+ // ignore
+ }
+
+ public void taskListModified() {
+ saveTaskListAndContexts();
+ }
+
+ public void widgetDisposed(DisposeEvent e) {
+ saveTaskListAndContexts();
+ }
+
+ /**
+ * For testing.
+ */
+ public void setForceBackgroundSave(boolean on) {
+ forceBackgroundSave = on;
+ saveTimer.setForceSyncExec(on);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/TaskListWriter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/TaskListWriter.java
new file mode 100644
index 000000000..5a2460d1b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/util/TaskListWriter.java
@@ -0,0 +1,544 @@
+/*******************************************************************************
+ * 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.mylar.internal.tasklist.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.util.List;
+
+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.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.jface.dialogs.MessageDialog;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.TaskExternalizationException;
+import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
+import org.eclipse.mylar.provisional.tasklist.DelegatingTaskExternalizer;
+import org.eclipse.mylar.provisional.tasklist.ITask;
+import org.eclipse.mylar.provisional.tasklist.ITaskContainer;
+import org.eclipse.mylar.provisional.tasklist.ITaskListExternalizer;
+import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylar.provisional.tasklist.TaskList;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Mik Kersten
+ * @author Ken Sueda
+ */
+public class TaskListWriter {
+
+ public static final String ATTRIBUTE_VERSION = "Version";
+
+ public static final String ELEMENT_TASK_LIST = "TaskList";
+
+ private static final String VALUE_VERSION = "1.0.1";
+
+ private static final String VALUE_VERSION_1_0_0 = "1.0.0";
+
+ private static final String FILE_SUFFIX_SAVE = "save.xml";
+
+ private List<ITaskListExternalizer> externalizers;
+
+ private DelegatingTaskExternalizer delagatingExternalizer = new DelegatingTaskExternalizer();
+
+ private String readVersion = "";
+
+ private boolean hasCaughtException = false;
+
+ public void setDelegateExternalizers(List<ITaskListExternalizer> externalizers) {
+ this.externalizers = externalizers;
+ this.delagatingExternalizer.setDelegateExternalizers(externalizers);
+ }
+
+ public void writeTaskList(TaskList taskList, File outFile) {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder db;
+ Document doc = null;
+
+ try {
+ db = dbf.newDocumentBuilder();
+ doc = db.newDocument();
+ } catch (ParserConfigurationException e) {
+ MylarStatusHandler.log(e, "could not create document");
+ }
+
+ Element root = doc.createElement(ELEMENT_TASK_LIST);
+ root.setAttribute(ATTRIBUTE_VERSION, VALUE_VERSION);
+
+ // create the categories
+ for (ITaskContainer category : taskList.getCategories()) {
+ if (!category.getHandleIdentifier().equals(TaskList.LABEL_ARCHIVE)) {
+ delagatingExternalizer.createCategoryElement(category, doc, root);
+ }
+ }
+
+ for (AbstractRepositoryQuery query : taskList.getQueries()) {
+ Element element = null;
+ for (ITaskListExternalizer externalizer : externalizers) {
+ if (externalizer.canCreateElementFor(query))
+ element = externalizer.createQueryElement(query, doc, root);
+ }
+ if (element == null && delagatingExternalizer.canCreateElementFor(query)) {
+ delagatingExternalizer.createQueryElement(query, doc, root);
+ } else if (element == null) {
+ MylarStatusHandler.log("Did not externalize: " + query, this);
+ }
+ }
+
+ for (ITask task : taskList.getAllTasks()) {
+ createTaskElement(doc, root, task);
+ }
+
+// for (ITask task : taskList.getArchiveTasks()) {
+// createTaskElement(doc, root, task);
+// }
+
+// for (ITask task : taskList.getRootTasks()) {
+// createTaskElement(doc, root, task);
+// }
+ doc.appendChild(root);
+ writeDOMtoFile(doc, outFile);
+ return;
+ }
+
+ private void createTaskElement(Document doc, Element root, ITask task) {
+ try {
+ Element element = null;
+ for (ITaskListExternalizer externalizer : externalizers) {
+ if (externalizer.canCreateElementFor(task)) {
+ element = externalizer.createTaskElement(task, doc, root);
+ break;
+ }
+ }
+ if (element == null && delagatingExternalizer.canCreateElementFor(task)) {
+ delagatingExternalizer.createTaskElement(task, doc, root);
+ } else if (element == null) {
+ MylarStatusHandler.log("Did not externalize: " + task, this);
+ }
+ } catch (Exception e) {
+ MylarStatusHandler.log(e, e.getMessage());
+ }
+ }
+
+ /**
+ * Writes an XML file from a DOM.
+ *
+ * doc - the document to write file - the file to be written to
+ */
+ private void writeDOMtoFile(Document doc, File file) {
+ try {
+ // A file output stream is an output stream for writing data to a
+ // File
+ //
+ OutputStream outputStream = new FileOutputStream(file);
+ writeDOMtoStream(doc, outputStream);
+ outputStream.flush();
+ outputStream.close();
+ } catch (Exception fnfe) {
+ MylarStatusHandler.log(fnfe, "TaskList could not be found");
+ }
+ }
+
+ /**
+ * Writes the provided XML document out to the specified output stream.
+ *
+ * doc - the document to be written outputStream - the stream to which the
+ * document is to be written
+ */
+ private void writeDOMtoStream(Document doc, OutputStream outputStream) {
+ // Prepare the DOM document for writing
+ // DOMSource - Acts as a holder for a transformation Source tree in the
+ // form of a Document Object Model (DOM) tree
+ //
+ Source source = new DOMSource(doc);
+
+ // StreamResult - Acts as an holder for a XML transformation result
+ // Prepare the output stream
+ //
+ Result result = new StreamResult(outputStream);
+
+ // An instance of this class can be obtained with the
+ // TransformerFactory.newTransformer method. This instance may
+ // then be used to process XML from a variety of sources and write
+ // the transformation output to a variety of sinks
+ //
+
+ Transformer xformer = null;
+ try {
+ xformer = TransformerFactory.newInstance().newTransformer();
+ // Transform the XML Source to a Result
+ //
+ xformer.transform(source, result);
+ } catch (TransformerConfigurationException e) {
+ e.printStackTrace();
+ } catch (TransformerFactoryConfigurationError e) {
+ e.printStackTrace();
+ } catch (TransformerException e1) {
+ e1.printStackTrace();
+ }
+ }
+
+ /**
+ * TODO: fix this old mess
+ */
+ public void readTaskList(TaskList taskList, File inFile) {
+ hasCaughtException = false;
+ try {
+ if (!inFile.exists())
+ return;
+ Document doc = openAsDOM(inFile);
+ if (doc == null) {
+ handleException(inFile, null, new TaskExternalizationException("TaskList was not well formed XML"));
+ return;
+ }
+ Element root = doc.getDocumentElement();
+ readVersion = root.getAttribute(ATTRIBUTE_VERSION);
+
+ if (readVersion.equals(VALUE_VERSION_1_0_0)) {
+ MylarStatusHandler.log("version: " + readVersion + " not supported", this);
+ } else {
+ NodeList list = root.getChildNodes();
+
+ // NOTE: order is important, first read the categories
+ for (int i = 0; i < list.getLength(); i++) {
+ Node child = list.item(i);
+ try {
+ if (child.getNodeName().endsWith(DelegatingTaskExternalizer.KEY_CATEGORY)) {
+ delagatingExternalizer.readCategory(child, taskList);
+ }
+ } catch (Exception e) {
+ handleException(inFile, child, e);
+ }
+ }
+
+ // then read the tasks
+ for (int i = 0; i < list.getLength(); i++) {
+ Node child = list.item(i);
+ try {
+ boolean wasRead = false;
+ if (!child.getNodeName().endsWith(DelegatingTaskExternalizer.KEY_CATEGORY)
+ && !child.getNodeName().endsWith(DelegatingTaskExternalizer.KEY_QUERY)) {
+ for (ITaskListExternalizer externalizer : externalizers) {
+ if (!wasRead && externalizer.canReadTask(child)) {
+ externalizer.readTask(child, taskList, null, null);
+ wasRead = true;
+ }
+ }
+ if (!wasRead && delagatingExternalizer.canReadTask(child)) {
+ delagatingExternalizer.readTask(child, taskList, null, null);
+ }
+ }
+ } catch (Exception e) {
+ handleException(inFile, child, e);
+ }
+ }
+
+ // then query hits hits, which get corresponded to tasks
+ for (int i = 0; i < list.getLength(); i++) {
+ Node child = list.item(i);
+ try {
+ if (child.getNodeName().endsWith(DelegatingTaskExternalizer.KEY_QUERY)) {
+ for (ITaskListExternalizer externalizer : externalizers) {
+ if (externalizer.canReadQuery(child)) {
+ AbstractRepositoryQuery query = externalizer.readQuery(child, taskList);
+ if (query != null) {
+ taskList.internalAddQuery(query);
+ }
+ break;
+ }
+ }
+ }
+ } catch (Exception e) {
+ handleException(inFile, child, e);
+ }
+ }
+ }
+ } catch (Exception e) {
+ handleException(inFile, null, e);
+ }
+ if (hasCaughtException) {
+ // if exception was caught, write out the new task file, so that it
+ // doesn't happen again.
+ // this is OK, since the original (corrupt) tasklist is saved.
+ // TODO: The problem with this is that if the orignal tasklist has
+ // tasks and bug reports, but a
+ // task is corrupted, the new tasklist that is written will not
+ // include the bug reports (since the
+ // bugzilla externalizer is not loaded. So there is a potentila that
+ // we can lose bug reports.
+ writeTaskList(taskList, inFile);
+ }
+ }
+
+ /**
+ * 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
+ */
+ private Document openAsDOM(File inputFile) throws IOException {
+
+ // A factory API that enables applications to obtain a parser
+ // that produces DOM object trees from XML documents
+ //
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+
+ // Using DocumentBuilder, obtain a Document from XML file.
+ //
+ DocumentBuilder builder = null;
+ Document document = null;
+ try {
+ // create new instance of DocumentBuilder
+ //
+ builder = factory.newDocumentBuilder();
+ } catch (ParserConfigurationException pce) {
+ inputFile.renameTo(new File(inputFile.getName() + FILE_SUFFIX_SAVE));
+ MylarStatusHandler.log(pce, "Failed to load XML file");
+ }
+ try {
+ // Parse the content of the given file as an XML document
+ // and return a new DOM Document object. Also throws IOException
+ document = builder.parse(inputFile);
+ } catch (SAXException se) {
+ File backup = new File(MylarTaskListPlugin.getDefault().getTaskListSaveManager().getBackupFilePath());
+ String message = "Restoring the tasklist failed. Would you like to attempt to restore from the backup?\n\nTasklist XML File location: "
+ + inputFile.getAbsolutePath()
+ + "\n\nBackup tasklist XML file location: "
+ + backup.getAbsolutePath();
+ if (backup.exists() && MessageDialog.openQuestion(null, "Restore From Backup", message)) {
+ try {
+ document = builder.parse(backup);
+ MylarTaskListPlugin.getDefault().getTaskListSaveManager().reverseBackup();
+ } catch (SAXException s) {
+ inputFile.renameTo(new File(inputFile.getName() + FILE_SUFFIX_SAVE));
+ MylarStatusHandler.log(s, "Failed to recover from backup restore");
+ }
+ }
+ }
+ return document;
+ }
+
+ private void handleException(File inFile, Node child, Exception e) {
+ hasCaughtException = true;
+ String name = inFile.getAbsolutePath();
+ name = name.substring(0, name.lastIndexOf('.')) + "-save1.xml";
+ File save = new File(name);
+ int i = 2;
+ while (save.exists()) {
+ name = name.substring(0, name.lastIndexOf('.') - 1) + i + ".xml";
+ save = new File(name);
+ i++;
+ }
+ if (!copy(inFile, save)) {
+ inFile.renameTo(new File(name));
+ }
+ if (child == null) {
+ MylarStatusHandler.log(e, "Could not read task list");
+ } else {
+ MylarStatusHandler.log(e, "Tasks may have been lost from " + child.getNodeName());
+ }
+ }
+
+ 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;
+ }
+ }
+
+// private Document openAsDOM(String input) throws IOException {
+//
+// // A factory API that enables applications to obtain a parser
+// // that produces DOM object trees from XML documents
+// //
+// DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+//
+// // Using DocumentBuilder, obtain a Document from XML file.
+// //
+// DocumentBuilder builder = null;
+// Document document = null;
+// try {
+// // create new instance of DocumentBuilder
+// //
+// builder = factory.newDocumentBuilder();
+// } catch (ParserConfigurationException pce) {
+// MylarStatusHandler.log(pce, "Failed to load XML file");
+// }
+// try {
+// // Parse the content of the given file as an XML document
+// // and return a new DOM Document object. Also throws IOException
+// StringReader s = new StringReader(input);
+// InputSource in = new InputSource(s);
+// document = builder.parse(in);
+// } catch (SAXException se) {
+// MylarStatusHandler.log(se, "Failed to parse XML file");
+// }
+// return document;
+// }
+
+// public void readTaskList(TaskList taskList, String input) {
+// try {
+// Document doc = openAsDOM(input);
+// if (doc == null) {
+// return;
+// }
+// Element root = doc.getDocumentElement();
+// readVersion = root.getAttribute(ATTRIBUTE_VERSION);
+//
+// if (readVersion.equals(VALUE_VERSION_1_0_0)) {
+// MylarStatusHandler.log("version: " + readVersion + " not supported", this);
+// } else {
+// NodeList list = root.getChildNodes();
+// for (int i = 0; i < list.getLength(); i++) {
+// Node child = list.item(i);
+// boolean wasRead = false;
+// try {
+// if (child.getNodeName().endsWith(DelegatingTaskExternalizer.KEY_CATEGORY)) {
+//// for (ITaskListExternalizer externalizer : externalizers) {
+//// if (externalizer.canReadCategory(child)) {
+//// externalizer.readCategory(child, taskList);
+//// wasRead = true;
+//// break;
+//// }
+//// }
+// if (delagatingExternalizer.canReadCategory(child)) {
+// delagatingExternalizer.readCategory(child, taskList);
+// }
+// } else {
+// for (ITaskListExternalizer externalizer : externalizers) {
+// if (externalizer.canReadTask(child)) {
+// ITask newTask = externalizer.readTask(child, taskList, null, null);
+//// externalizer.getRepositoryClient().addTaskToArchive(newTask);
+// taskList.addTaskToArchive(newTask);
+//
+// taskList.internalAddRootTask(newTask);
+//
+// wasRead = true;
+// break;
+// }
+// }
+// if (!wasRead && delagatingExternalizer.canReadTask(child)) {
+// taskList.internalAddRootTask(delagatingExternalizer.readTask(child, taskList, null, null));
+// }
+// }
+// } catch (Exception e) {
+// MylarStatusHandler.log(e, "can't read xml string");
+// }
+// }
+// }
+// } catch (Exception e) {
+// MylarStatusHandler.log(e, "can't read xml string");
+// }
+// }
+
+// public String getTaskListXml(TaskList tlist) {
+// // TODO make this and writeTaskList use the same base code
+// DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+// DocumentBuilder db;
+// Document doc = null;
+//
+// try {
+// db = dbf.newDocumentBuilder();
+// doc = db.newDocument();
+// } catch (ParserConfigurationException e) {
+// MylarStatusHandler.log(e, "could not create document");
+// e.printStackTrace();
+// }
+//
+// Element root = doc.createElement(ELEMENT_TASK_LIST);
+// root.setAttribute(ATTRIBUTE_VERSION, VALUE_VERSION);
+//
+// for (ITaskListExternalizer externalizer : externalizers) {
+// externalizer.createRegistry(doc, root);
+// }
+//
+// for (ITaskContainer category : tlist.getCategories()) {
+// Element element = null;
+// for (ITaskListExternalizer externalizer : externalizers) {
+// if (externalizer.canCreateElementFor(category))
+// element = externalizer.createCategoryElement(category, doc, root);
+// }
+// if (element == null && delagatingExternalizer.canCreateElementFor(category)) {
+// delagatingExternalizer.createCategoryElement(category, doc, root);
+// } else if (element == null) {
+// MylarStatusHandler.log("Did not externalize: " + category, this);
+// }
+// }
+// for (ITask task : tlist.getRootTasks()) {
+// try {
+// Element element = null;
+// for (ITaskListExternalizer externalizer : externalizers) {
+// if (externalizer.canCreateElementFor(task))
+// element = externalizer.createTaskElement(task, doc, root);
+// }
+// if (element == null && delagatingExternalizer.canCreateElementFor(task)) {
+// delagatingExternalizer.createTaskElement(task, doc, root);
+// } else if (element == null) {
+// MylarStatusHandler.log("Did not externalize: " + task, this);
+// }
+// } catch (Exception e) {
+// MylarStatusHandler.log(e, e.getMessage());
+// }
+// }
+// doc.appendChild(root);
+// StringWriter sw = new StringWriter();
+//
+// Source source = new DOMSource(doc);
+//
+// Result result = new StreamResult(sw);
+//
+// Transformer xformer = null;
+// try {
+// xformer = TransformerFactory.newInstance().newTransformer();
+// // Transform the XML Source to a Result
+// //
+// xformer.transform(source, result);
+// } catch (Exception e) {
+// e.printStackTrace();
+// }
+// return sw.toString();
+// }
+
+ public void setDelegatingExternalizer(DelegatingTaskExternalizer delagatingExternalizer) {
+ this.delagatingExternalizer = delagatingExternalizer;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractQueryHit.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractQueryHit.java
new file mode 100644
index 000000000..fb3664c04
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractQueryHit.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.mylar.provisional.tasklist;
+
+/**
+ * @author Mik Kersten
+ */
+public abstract class AbstractQueryHit implements ITaskListElement {
+
+ protected String repositoryUrl;
+
+ protected String description;
+
+ protected String priority;
+
+ protected int id;
+
+ protected AbstractQueryHit(String repositoryUrl, String description, int id) {
+ this.repositoryUrl = repositoryUrl;
+ this.description = description;
+ this.id = id;
+ }
+
+ public String getRepositoryUrl() {
+ return repositoryUrl;
+ }
+
+ public void setRepositoryUrl(String repositoryUrl) {
+ this.repositoryUrl = repositoryUrl;
+ }
+
+ public abstract AbstractRepositoryTask getOrCreateCorrespondingTask();
+
+ /**
+ * @return null if there is no corresponding report
+ */
+ public abstract AbstractRepositoryTask getCorrespondingTask();
+
+ public abstract boolean isCompleted();
+
+ public abstract void setCorrespondingTask(AbstractRepositoryTask task);
+
+ public String getHandleIdentifier() {
+ return AbstractRepositoryTask.getHandle(repositoryUrl, id);
+ }
+
+ public int getId() {
+ return id;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractRepositoryClient.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractRepositoryClient.java
new file mode 100644
index 000000000..e7e65401e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractRepositoryClient.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * 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.mylar.provisional.tasklist;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.mylar.internal.tasklist.ui.wizards.AbstractRepositorySettingsPage;
+
+/**
+ * @author Mik Kersten
+ */
+public abstract class AbstractRepositoryClient {
+
+ private static final int MAX_REFRESH_JOBS = 5;
+
+// private TaskCategory archiveCategory = null;
+
+ private List<AbstractRepositoryTask> toBeRefreshed = new LinkedList<AbstractRepositoryTask>();
+
+ private Map<AbstractRepositoryTask, Job> currentlyRefreshing = new HashMap<AbstractRepositoryTask, Job>();
+
+ public void requestRefresh(AbstractRepositoryTask task) {
+ if (!currentlyRefreshing.containsKey(task) && !toBeRefreshed.contains(task)) {
+ toBeRefreshed.add(task);
+ }
+ updateRefreshState();
+ }
+
+ public void removeTaskToBeRefreshed(AbstractRepositoryTask task) {
+ toBeRefreshed.remove(task);
+ if (currentlyRefreshing.get(task) != null) {
+ currentlyRefreshing.get(task).cancel();
+ currentlyRefreshing.remove(task);
+ }
+ updateRefreshState();
+ }
+
+ public void removeRefreshingTask(AbstractRepositoryTask task) {
+ if (currentlyRefreshing.containsKey(task)) {
+ currentlyRefreshing.remove(task);
+ }
+ updateRefreshState();
+ }
+
+ public void clearAllRefreshes() {
+ toBeRefreshed.clear();
+ List<Job> l = new ArrayList<Job>();
+ l.addAll(currentlyRefreshing.values());
+ for (Job j : l) {
+ if (j != null)
+ j.cancel();
+ }
+ currentlyRefreshing.clear();
+ }
+
+ private void updateRefreshState() {
+ if (currentlyRefreshing.size() < MAX_REFRESH_JOBS && toBeRefreshed.size() > 0) {
+ AbstractRepositoryTask bugzillaTask = toBeRefreshed.remove(0);
+ Job refreshJob = synchronize(bugzillaTask, true, null);
+ if (refreshJob != null) {
+ currentlyRefreshing.put(bugzillaTask, refreshJob);
+ }
+ }
+ }
+
+ public abstract String getLabel();
+
+ /**
+ * @return the unique type of the repository, e.g. "bugzilla"
+ */
+ public abstract String getKind();
+
+ /**
+ * @param id
+ * identifier, e.g. "123" bug Bugzilla bug 123
+ * @return null if task could not be created
+ */
+ public abstract ITask createTaskFromExistingId(TaskRepository repository, String id);
+
+ /**
+ * Synchronize state with the repository (e.g. queries, task contents)
+ */
+ public abstract void synchronize();
+
+ /**
+ * @param listener can be null
+ * @return TODO
+ */
+ public abstract Job synchronize(ITask task, boolean forceUpdate, IJobChangeListener listener);
+
+ public abstract void synchronize(AbstractRepositoryQuery repositoryQuery);
+
+ public abstract AbstractRepositorySettingsPage getSettingsPage();
+
+ public abstract IWizard getQueryWizard(TaskRepository repository);
+
+ public abstract void openEditQueryDialog(AbstractRepositoryQuery query);
+
+ public abstract IWizard getAddExistingTaskWizard(TaskRepository repository);
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractRepositoryQuery.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractRepositoryQuery.java
new file mode 100644
index 000000000..d59b9ed5a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractRepositoryQuery.java
@@ -0,0 +1,148 @@
+/*******************************************************************************
+ * 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.mylar.provisional.tasklist;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+
+/**
+ * @author Mik Kersten
+ */
+public abstract class AbstractRepositoryQuery implements ITaskContainer {
+
+ protected String repositoryUrl;
+
+ protected String queryUrl;
+
+ protected int maxHits;
+
+ private Set<AbstractQueryHit> hits = new HashSet<AbstractQueryHit>();
+
+ protected Date lastRefresh;
+
+ protected String description = "";
+
+ private String handle = "";
+
+ public abstract String getRepositoryKind();
+
+ public String getDescription() {
+ return description;
+ }
+
+ public String getQueryUrl() {
+ return queryUrl;
+ }
+
+ public Set<ITask> getChildren() {
+ Set<ITask> tasks = new HashSet<ITask>();
+ for (AbstractQueryHit hit : new ArrayList<AbstractQueryHit>(getHits())) {
+ ITask task = hit.getCorrespondingTask();
+ if (task != null) {
+ tasks.add(task);
+ }
+ }
+ return tasks;
+ }
+
+ public boolean isArchive() {
+ return false;
+ }
+
+ public void setIsArchive(boolean isArchive) {
+ // ignore
+ }
+
+ public Set<AbstractQueryHit> getHits() {
+ return Collections.unmodifiableSet(hits);
+ }
+
+ public void clearHits() {
+ hits.clear();
+ }
+
+ public void addHit(AbstractQueryHit hit) {
+ ITask correspondingTask = MylarTaskListPlugin.getTaskListManager().getTaskList().getTaskFromArchive(hit.getHandleIdentifier());
+ if (correspondingTask instanceof AbstractRepositoryTask) {
+ hit.setCorrespondingTask((AbstractRepositoryTask) correspondingTask);
+ }
+ hits.add(hit);
+ }
+
+ public void removeHit(AbstractQueryHit hit) {
+ hits.remove(hit);
+ }
+
+ public void setQueryUrl(String url) {
+ this.queryUrl = url;
+ }
+
+ public String getPriority() {
+ String highestPriority = Task.PriorityLevel.P5.toString();
+ if (hits.isEmpty()) {
+ return Task.PriorityLevel.P1.toString();
+ }
+ for (AbstractQueryHit hit : hits) {
+ if (highestPriority.compareTo(hit.getPriority()) > 0) {
+ highestPriority = hit.getPriority();
+ }
+ }
+ return highestPriority;
+ }
+
+ public boolean isLocal() {
+ return true;
+ }
+
+ public boolean isCompleted() {
+ return false;
+ }
+
+ public int getMaxHits() {
+ return maxHits;
+ }
+
+ public void setMaxHits(int maxHits) {
+ this.maxHits = maxHits;
+ }
+
+ public String getHandleIdentifier() {
+ return handle;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public void setHandleIdentifier(String id) {
+ this.handle = id;
+ }
+
+ public String getRepositoryUrl() {
+ return repositoryUrl;
+ }
+
+ public void setRepositoryUrl(String repositoryUrl) {
+ this.repositoryUrl = repositoryUrl;
+ }
+
+ public Date getLastRefresh() {
+ return lastRefresh;
+ }
+
+ public void setLastRefresh(Date lastRefresh) {
+ this.lastRefresh = lastRefresh;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractRepositoryTask.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractRepositoryTask.java
new file mode 100644
index 000000000..baedc6bd7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractRepositoryTask.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.mylar.provisional.tasklist;
+
+import java.util.Date;
+
+import org.eclipse.mylar.internal.core.MylarContextManager;
+
+/**
+ * @author Mik Kersten and Robert Elves
+ */
+public abstract class AbstractRepositoryTask extends Task {
+
+ /** The last time this task's bug report was downloaded from the server. */
+ protected Date lastRefresh;
+
+ protected boolean currentlyDownloading;
+
+ public enum RepositoryTaskSyncState {
+ OUTGOING, SYNCHRONIZED, INCOMING, CONFLICT
+ }
+
+ protected RepositoryTaskSyncState syncState = RepositoryTaskSyncState.SYNCHRONIZED;
+
+ public static final String HANDLE_DELIM = "-";
+
+ public AbstractRepositoryTask(String handle, String label, boolean newTask) {
+ super(handle, label, newTask);
+ }
+
+ /**
+ * @return true if the task can be queried and manipulated without connecting to the server
+ */
+ public abstract boolean isPersistentInWorkspace();
+
+ public Date getLastRefresh() {
+ return lastRefresh;
+ }
+
+ public void setLastRefresh(Date lastRefresh) {
+ this.lastRefresh = lastRefresh;
+ }
+
+ public void setSyncState(RepositoryTaskSyncState syncState) {
+ this.syncState = syncState;
+ }
+
+ public RepositoryTaskSyncState getSyncState() {
+ return syncState;
+ }
+
+ /**
+ * @return The number of seconds ago that this task's bug report was
+ * downloaded from the server.
+ */
+ public long getTimeSinceLastRefresh() {
+ Date timeNow = new Date();
+ return (timeNow.getTime() - lastRefresh.getTime()) / 1000;
+ }
+
+ public String getRepositoryUrl() {
+ return AbstractRepositoryTask.getRepositoryUrl(getHandleIdentifier());
+ }
+
+ @Override
+ public boolean isLocal() {
+ return false;
+ }
+
+ public static long getLastRefreshTimeInMinutes(Date lastRefresh) {
+ Date timeNow = new Date();
+ if (lastRefresh == null)
+ lastRefresh = new Date();
+ long timeDifference = (timeNow.getTime() - lastRefresh.getTime()) / 60000;
+ return timeDifference;
+ }
+
+ public boolean isCurrentlyDownloading() {
+ return currentlyDownloading;
+ }
+
+ public void setCurrentlyDownloading(boolean currentlyDownloading) {
+ this.currentlyDownloading = currentlyDownloading;
+ }
+
+ public static String getTaskId(String taskHandle) {
+ int index = taskHandle.lastIndexOf(AbstractRepositoryTask.HANDLE_DELIM);
+ if (index != -1) {
+ String id = taskHandle.substring(index + 1);
+ return id;
+ }
+ return null;
+ }
+
+ public static String getRepositoryUrl(String taskHandle) {
+ int index = taskHandle.lastIndexOf(AbstractRepositoryTask.HANDLE_DELIM);
+ String url = null;
+ if (index != -1) {
+ url = taskHandle.substring(0, index);
+ }
+ if (url != null && url.equals(TaskRepositoryManager.PREFIX_REPOSITORY_OLD)) {
+ String repositoryKind = TaskRepositoryManager.PREFIX_REPOSITORY_OLD.toLowerCase();
+ TaskRepository repository = MylarTaskListPlugin.getRepositoryManager().getDefaultRepository(repositoryKind);
+ if (repository != null) {
+ url = repository.getUrl().toExternalForm();
+ }
+ }
+ return url;
+ }
+
+ public static int getTaskIdAsInt(String taskHandle) {
+ String idString = getTaskId(taskHandle);
+ if (idString != null) {
+ return Integer.parseInt(idString);
+ } else {
+ return -1;
+ }
+ }
+
+ /**
+ * @param taskId must be an integer
+ */
+ public static String getHandle(String repositoryUrl, String taskId) {
+ if (repositoryUrl == null) {
+ return TaskRepositoryManager.MISSING_REPOSITORY_HANDLE + taskId;
+ } else {
+ // MylarContextManager.CONTEXT_HANDLE_DELIM + taskId);
+ return repositoryUrl + MylarContextManager.CONTEXT_HANDLE_DELIM + taskId;
+ }
+ }
+
+ public static String getHandle(String repositoryUrl, int taskId) {
+ return AbstractRepositoryTask.getHandle(repositoryUrl, "" + taskId);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/DelegatingTaskExternalizer.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/DelegatingTaskExternalizer.java
new file mode 100644
index 000000000..0136b93a7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/DelegatingTaskExternalizer.java
@@ -0,0 +1,534 @@
+/*******************************************************************************
+ * 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.mylar.provisional.tasklist;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.TaskExternalizationException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * @author Mik Kersten
+ * @author Ken Sueda (XML serialization support)
+ */
+public class DelegatingTaskExternalizer implements ITaskListExternalizer {
+
+ private static final String DEFAULT_PRIORITY = Task.PriorityLevel.P3.toString();
+
+ private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.S z";
+
+ public static final String KEY_QUERY = "Query";
+
+ public static final String KEY_QUERY_HIT = "QueryHit";
+
+ public static final String KEY_QUERY_MAX_HITS = "MaxHits";
+
+ public static final String KEY_QUERY_STRING = "QueryString";
+
+ public static final String KEY_LABEL = "Label";
+
+ public static final String KEY_HANDLE = "Handle";
+
+ public static final String KEY_REPOSITORY_URL = "RepositoryUrl";
+
+ public static final String KEY_CATEGORY = "Category";
+
+// public static final String VAL_ARCHIVE = "Archive";
+
+ public static final String VAL_ROOT = "Root";
+
+ public static final String KEY_TASK = "Task";
+
+ public static final String KEY_KIND = "Kind";
+
+ public static final String KEY_TASK_CATEGORY = "Task" + KEY_CATEGORY;
+
+ public static final String KEY_LINK = "Link";
+
+ public static final String KEY_PLAN = "Plan";
+
+ public static final String KEY_TIME_ESTIMATED = "Estimated";
+
+ public static final String KEY_TIME_ELAPSED = "Elapsed";
+
+ public static final String KEY_ISSUEURL = "IssueURL";
+
+ public static final String KEY_NOTES = "Notes";
+
+ // @Deprecated
+ // public static final String KEY_BUGZILLA = "Bugzilla";
+
+ public static final String KEY_ACTIVE = "Active";
+
+ public static final String KEY_COMPLETE = "Complete";
+
+ public static final String KEY_PRIORITY = "Priority";
+
+ public static final String KEY_PATH = "Path";
+
+ public static final String VAL_FALSE = "false";
+
+ public static final String VAL_TRUE = "true";
+
+ public static final String KEY_NAME = "Name";
+
+ public static final String KEY_DATE_END = "EndDate";
+
+ public static final String KEY_DATE_CREATION = "CreationDate";
+
+ public static final String KEY_DATE_REMINDER = "ReminderDate";
+
+ public static final String KEY_REMINDED = "Reminded";
+
+ public static final String LABEL_AUTOMATIC = "<automatic>";
+
+ private List<ITaskListExternalizer> delegateExternalizers = new ArrayList<ITaskListExternalizer>();
+
+ // public AbstractRepositoryClient getRepositoryClient() {
+ // return null;
+ // }
+
+ /**
+ * Set these on the TaskListWriter instead
+ */
+ public void setDelegateExternalizers(List<ITaskListExternalizer> externalizers) {
+ this.delegateExternalizers = externalizers;
+ }
+
+ // public boolean canCreateElementFor(ITaskContainer category) {
+ // return category instanceof TaskCategory;
+ // }
+
+ public Element createCategoryElement(ITaskContainer category, Document doc, Element parent) {
+ if (category.isArchive())
+ return parent;
+ Element node = doc.createElement(getCategoryTagName());
+ node.setAttribute(KEY_NAME, category.getDescription());
+
+ // for (ITask task : ((TaskCategory) category).getChildren()) {
+ // try {
+ // Element element = null;
+ // for (ITaskListExternalizer externalizer : delegateExternalizers) {
+ // if (externalizer.canCreateElementFor(task)) {
+ // element = externalizer.createTaskElement(task, doc, node);
+ // }
+ // }
+ // if (element == null)
+ // createTaskElement(task, doc, node);
+ // } catch (Exception e) {
+ // MylarStatusHandler.log(e, e.getMessage());
+ // }
+ // }
+ parent.appendChild(node);
+ return node;
+ }
+
+ public boolean canCreateElementFor(ITask task) {
+ return true;
+ }
+
+ public Element createTaskElement(ITask task, Document doc, Element parent) {
+ Element node = doc.createElement(getTaskTagName());
+ node.setAttribute(KEY_LABEL, task.getDescription());
+ node.setAttribute(KEY_HANDLE, task.getHandleIdentifier());
+ if (task.getCategory() != null) {
+// if (task.getCategory().getHandleIdentifier().equals(TaskList.LABEL_ARCHIVE)) {
+// node.setAttribute(KEY_CATEGORY, VAL_ARCHIVE);
+// } else
+ if (task.getCategory().getHandleIdentifier().equals(TaskList.LABEL_ROOT)) {
+ node.setAttribute(KEY_CATEGORY, VAL_ROOT);
+ } else {
+ node.setAttribute(KEY_CATEGORY, task.getCategory().getHandleIdentifier());
+ }
+ }
+// else if (task instanceof AbstractRepositoryTask && !task.getCategory().equals(TaskList.LABEL_ROOT)) {
+// node.setAttribute(KEY_CATEGORY, VAL_ARCHIVE);
+// }
+
+ node.setAttribute(KEY_PRIORITY, task.getPriority());
+ node.setAttribute(KEY_KIND, task.getKind());
+
+ if (task.isCompleted()) {
+ node.setAttribute(KEY_COMPLETE, VAL_TRUE);
+ } else {
+ node.setAttribute(KEY_COMPLETE, VAL_FALSE);
+ }
+ 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());
+ }
+ // if (task.getRepositoryUrl() != null) {
+ // node.setAttribute(REPOSITORY_URL, task.getRepositoryUrl());
+ // }
+ node.setAttribute(KEY_NOTES, task.getNotes());
+ node.setAttribute(KEY_TIME_ELAPSED, "" + task.getElapsedTime());
+ node.setAttribute(KEY_TIME_ESTIMATED, "" + task.getEstimateTimeHours());
+ node.setAttribute(KEY_DATE_END, formatExternDate(task.getCompletionDate()));
+ node.setAttribute(KEY_DATE_CREATION, formatExternDate(task.getCreationDate()));
+ node.setAttribute(KEY_DATE_REMINDER, formatExternDate(task.getReminderDate()));
+ if (task.hasBeenReminded()) {
+ node.setAttribute(KEY_REMINDED, VAL_TRUE);
+ } else {
+ node.setAttribute(KEY_REMINDED, VAL_FALSE);
+ }
+ List<String> rl = task.getRelatedLinks();
+ int i = 0;
+ for (String link : rl) {
+ node.setAttribute(KEY_LINK + i, link);
+ i++;
+ }
+ List<String> plans = task.getPlans();
+ int currPlan = 0;
+ for (String plan : plans) {
+ node.setAttribute(KEY_PLAN + currPlan, plan);
+ currPlan++;
+ }
+
+ for (ITask t : task.getChildren()) {
+ createTaskElement(t, doc, node);
+ }
+ parent.appendChild(node);
+ return node;
+ }
+
+ protected String formatExternDate(Date date) {
+ if (date == null)
+ return "";
+ String f = DATE_FORMAT;
+ SimpleDateFormat format = new SimpleDateFormat(f, Locale.ENGLISH);
+ return format.format(date);
+ }
+
+ public boolean canReadCategory(Node node) {
+ return node.getNodeName().equals(getCategoryTagName());
+ }
+
+ public void readCategory(Node node, TaskList taskList) throws TaskExternalizationException {
+ boolean hasCaughtException = false;
+ Element element = (Element) node;
+
+ TaskCategory category;
+ if (element.hasAttribute(KEY_NAME)) {
+ category = new TaskCategory(element.getAttribute(KEY_NAME));
+ taskList.internalAddCategory(category);
+ } else {
+ // LEGACY: registry categories did not have names
+ category = taskList.getArchiveCategory();
+ }
+
+ NodeList list = node.getChildNodes();
+ for (int i = 0; i < list.getLength(); i++) {
+ Node child = list.item(i);
+ boolean read = false;
+ try {
+ for (ITaskListExternalizer externalizer : delegateExternalizers) {
+ // LEGACY: categories used to contain tasks
+ if (externalizer.canReadTask(child)) {
+// ITask task =
+ externalizer.readTask(child, taskList, category, null);
+// category.addTask(task);
+// if (!category.isArchive()) {
+// task.setCategory(category);
+// }
+// taskList.addTaskToArchive(task);
+ read = true;
+ }
+ }
+ if (!read && canReadTask(child)) {
+ category.internalAddTask(readTask(child, taskList, category, null));
+ }
+ } catch (TaskExternalizationException e) {
+ hasCaughtException = true;
+ }
+ }
+ if (hasCaughtException)
+ throw new TaskExternalizationException("Failed to load all tasks");
+ }
+
+ public boolean canReadTask(Node node) {
+ return node.getNodeName().equals(getTaskTagName());
+ }
+
+ public ITask readTask(Node node, TaskList taskList, TaskCategory category, ITask parent)
+ throws TaskExternalizationException {
+ Element element = (Element) node;
+ String handle;
+ String label;
+ if (element.hasAttribute(KEY_HANDLE)) {
+ handle = element.getAttribute(KEY_HANDLE);
+ } else {
+ throw new TaskExternalizationException("Handle not stored for task");
+ }
+ if (element.hasAttribute(KEY_LABEL)) {
+ label = element.getAttribute(KEY_LABEL);
+ } else {
+ label = "Description was corrupted in stored tasklist";
+ }
+
+ Task task = new Task(handle, label, false);
+ readTaskInfo(task, taskList, element, parent, category);
+ return task;
+ }
+
+ protected void readTaskInfo(ITask task, TaskList taskList, Element element, ITask parent,
+ TaskCategory legacyCategory) throws TaskExternalizationException {
+
+ String categoryHandle = null;
+ if (element.hasAttribute(KEY_CATEGORY)) {
+ categoryHandle = element.getAttribute(KEY_CATEGORY);
+ TaskCategory category = null;
+ if (categoryHandle != null) {
+ category = taskList.getCategoryForHandle(categoryHandle);
+ }
+
+ if (category != null) {
+ if (category.equals(taskList.getArchiveCategory())) {
+ taskList.addTaskToArchive(task);
+ } else if (category.equals(VAL_ROOT)) {
+ taskList.internalAddRootTask(task);
+ } else {
+ task.setCategory(category);
+ category.addTask(task);
+ }
+ } else if (parent == null) {
+ taskList.internalAddRootTask(task);
+ }
+ } else if (legacyCategory != null && !legacyCategory.isArchive()) { //&& !legacyCategory.getHandleIdentifier().equals(TaskList.LABEL_ARCHIVE)) {
+ task.setCategory(legacyCategory);
+ legacyCategory.addTask(task);
+ } else if (legacyCategory == null && parent == null) {
+ if (task instanceof AbstractRepositoryTask) {
+ taskList.addTaskToArchive(task);
+ } else {
+ taskList.internalAddRootTask(task);
+ }
+ } else if (parent != null) {
+ task.setParent(parent);
+ }
+ taskList.addTaskToArchive(task);
+
+
+ if (element.hasAttribute(KEY_PRIORITY)) {
+ task.setPriority(element.getAttribute(KEY_PRIORITY));
+ } else {
+ task.setPriority(DEFAULT_PRIORITY);
+ }
+
+ if (element.hasAttribute(KEY_KIND)) {
+ task.setKind(element.getAttribute(KEY_KIND));
+ }
+
+ if (element.getAttribute(KEY_ACTIVE).compareTo(VAL_TRUE) == 0) {
+ task.setActive(true);
+ taskList.setActive(task, true);
+ } else {
+ task.setActive(false);
+ }
+ if (element.hasAttribute(KEY_ISSUEURL)) {
+ task.setUrl(element.getAttribute(KEY_ISSUEURL));
+ } else {
+ task.setUrl("");
+ }
+ if (element.hasAttribute(KEY_NOTES)) {
+ task.setNotes(element.getAttribute(KEY_NOTES));
+ } else {
+ task.setNotes("");
+ }
+ if (element.hasAttribute(KEY_TIME_ELAPSED)) {
+ long elapsed = 0;
+ try {
+ long read = Long.parseLong(element.getAttribute(KEY_TIME_ELAPSED));
+ if (read > 0)
+ elapsed = read;
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ task.setElapsedTime(elapsed);
+ } else {
+ task.setElapsedTime(0);
+ }
+ 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);
+ }
+ // NOTE: do not change the order of complete and end date!!
+ if (element.getAttribute(KEY_COMPLETE).compareTo(VAL_TRUE) == 0) {
+ task.setCompleted(true);
+ } else {
+ task.setCompleted(false);
+ }
+ if (element.hasAttribute(KEY_DATE_END)) {
+ task.setCompletionDate(getDateFromString(element.getAttribute(KEY_DATE_END)));
+ // task.setEndDate(element.getAttribute(END_DATE));
+ } else {
+ task.setCompletionDate(null);
+ }
+ if (element.hasAttribute(KEY_DATE_CREATION)) {
+ task.setCreationDate(getDateFromString(element.getAttribute(KEY_DATE_CREATION)));
+ // task.setCreationDate(element.getAttribute(CREATION_DATE));
+ } else {
+ task.setCreationDate(Calendar.getInstance().getTime());
+ }
+ if (element.hasAttribute(KEY_DATE_REMINDER)) {
+ task.setReminderDate(getDateFromString(element.getAttribute(KEY_DATE_REMINDER)));
+ // task.setReminderDate(element.getAttribute(REMINDER_DATE));
+ } else {
+ task.setReminderDate(null);
+ }
+ if (element.hasAttribute(KEY_REMINDED) && element.getAttribute(KEY_REMINDED).compareTo(VAL_TRUE) == 0) {
+ task.setReminded(true);
+ } else {
+ task.setReminded(false);
+ }
+ int i = 0;
+ while (element.hasAttribute(KEY_LINK + i)) {
+ task.getRelatedLinks().add(element.getAttribute(KEY_LINK + i));
+ i++;
+ }
+ int ii = 0;
+ while (element.hasAttribute(KEY_PLAN + ii)) {
+ task.getPlans().add(element.getAttribute(KEY_PLAN + i));
+ ii++;
+ }
+
+ NodeList list = element.getChildNodes();
+ for (int j = 0; j < list.getLength(); j++) {
+ Node child = list.item(j);
+ task.addSubTask(readTask(child, taskList, null, task));
+ }
+ }
+
+ protected Date getDateFromString(String dateString) {
+ Date date = null;
+ if ("".equals(dateString))
+ return null;
+ String formatString = DATE_FORMAT;
+ SimpleDateFormat format = new SimpleDateFormat(formatString, Locale.ENGLISH);
+ try {
+ date = format.parse(dateString);
+ } catch (ParseException e) {
+ MylarStatusHandler.fail(e, "Could not parse end date", false);
+ }
+ return date;
+ }
+
+ public String getCategoryTagName() {
+ return KEY_TASK_CATEGORY;
+ }
+
+ public String getTaskTagName() {
+ return KEY_TASK;
+ }
+
+ // public void createRegistry(Document doc, Node parent) {
+ // // nothing to do
+ // }
+
+ public boolean canCreateElementFor(AbstractRepositoryQuery category) {
+ return true;
+ }
+
+ public Element createQueryElement(AbstractRepositoryQuery query, Document doc, Element parent) {
+ String queryTagName = getQueryTagNameForElement(query);
+ Element node = doc.createElement(queryTagName);
+ node.setAttribute(KEY_NAME, query.getDescription());
+ node.setAttribute(KEY_QUERY_MAX_HITS, query.getMaxHits() + "");
+ node.setAttribute(KEY_QUERY_STRING, query.getQueryUrl());
+ node.setAttribute(KEY_REPOSITORY_URL, query.getRepositoryUrl());
+
+ for (AbstractQueryHit hit : query.getHits()) {
+ try {
+ Element element = null;
+ for (ITaskListExternalizer externalizer : delegateExternalizers) {
+ if (externalizer.canCreateElementFor(hit))
+ element = externalizer.createQueryHitElement(hit, doc, node);
+ }
+ if (element == null)
+ createQueryHitElement(hit, doc, node);
+ } catch (Exception e) {
+ MylarStatusHandler.log(e, e.getMessage());
+ }
+ }
+ parent.appendChild(node);
+ return node;
+ }
+
+ public boolean canReadQuery(Node node) {
+ return false;
+ }
+
+ public AbstractRepositoryQuery readQuery(Node node, TaskList tlist) throws TaskExternalizationException {
+ // doesn't know how to read any queries
+ return null;
+ }
+
+ public String getQueryTagNameForElement(AbstractRepositoryQuery query) {
+ return "";
+ }
+
+ public String getQueryHitTagName() {
+ return KEY_QUERY_HIT;
+ }
+
+ public boolean canCreateElementFor(AbstractQueryHit queryHit) {
+ return true;
+ }
+
+ public Element createQueryHitElement(AbstractQueryHit queryHit, Document doc, Element parent) {
+ Element node = doc.createElement(getQueryHitTagName());
+ node.setAttribute(KEY_NAME, queryHit.getDescription());
+ node.setAttribute(KEY_HANDLE, queryHit.getHandleIdentifier());
+ node.setAttribute(KEY_PRIORITY, queryHit.getPriority());
+ if (queryHit.isCompleted()) {
+ node.setAttribute(KEY_COMPLETE, VAL_TRUE);
+ } else {
+ node.setAttribute(KEY_COMPLETE, VAL_FALSE);
+ }
+ parent.appendChild(node);
+ return null;
+ }
+
+ public boolean canReadQueryHit(Node node) {
+ return false;
+ }
+
+ public void readQueryHit(Node node, TaskList tlist, AbstractRepositoryQuery query)
+ throws TaskExternalizationException {
+ // doesn't know how to read a query hit
+ }
+
+ public List<ITaskListExternalizer> getDelegateExternalizers() {
+ return delegateExternalizers;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITask.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITask.java
new file mode 100644
index 000000000..d12e1b05d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITask.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * 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 Jan 13, 2005
+ */
+package org.eclipse.mylar.provisional.tasklist;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.mylar.provisional.tasklist.Task.TaskStatus;
+
+/**
+ * @author Mik Kersten
+ */
+public interface ITask extends ITaskListElement {
+
+ public abstract String getHandleIdentifier();
+
+ public String getRepositoryKind();
+
+ public abstract ITask getParent();
+
+ public abstract void setParent(ITask parent);
+
+ public abstract boolean isActive();
+
+ public abstract void setActive(boolean active);
+
+ public String getKind();
+
+ public void setKind(String kind);
+
+ public abstract void addPlan(String plan);
+
+ public List<String> getPlans();
+
+ public abstract boolean isCompleted();
+
+ public abstract TaskStatus getStatus();
+
+ public abstract void setCompleted(boolean completed);
+
+ public abstract List<String> getRelatedLinks();
+
+ public abstract void setRelatedLinks(List<String> relatedLinks);
+
+ public abstract void addLink(String url);
+
+ public abstract void removeLink(String url);
+
+ public abstract boolean hasValidUrl();
+
+ public abstract void setUrl(String url);
+
+ public abstract String getUrl();
+
+ public abstract String getNotes();
+
+ public abstract void setNotes(String notes);
+
+ /**
+ * @param time
+ * in milliseconds
+ */
+ public abstract void setElapsedTime(long elapsed);
+
+ /**
+ * TODO: change to millis
+ */
+ public abstract int getEstimateTimeHours();
+
+ public abstract void setEstimatedTimeHours(int estimated);
+
+ public abstract Set<ITask> getChildren();
+
+ public abstract void addSubTask(ITask task);
+
+ public abstract void removeSubTask(ITask task);
+
+ public abstract void setPriority(String priority);
+
+ public abstract void setCategory(ITaskContainer category);
+
+ /**
+ * @return null if root task
+ */
+ public abstract ITaskContainer getCategory();
+
+ public abstract long getElapsedTime();
+
+ public abstract Date getCompletionDate();
+
+ public abstract void setCompletionDate(Date date);
+
+ public abstract Date getCreationDate();
+
+ public abstract void setCreationDate(Date date);
+
+ public abstract void setReminderDate(Date date);
+
+ public abstract Date getReminderDate();
+
+ /**
+ * TODO: move
+ */
+ public abstract boolean hasBeenReminded();
+
+ /**
+ * TODO: move
+ */
+ public abstract void setReminded(boolean reminded);
+
+ public abstract boolean isPastReminder();
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskActivityListener.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskActivityListener.java
new file mode 100644
index 000000000..101d918d8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskActivityListener.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.mylar.provisional.tasklist;
+
+import java.util.List;
+
+/**
+ * @author Mik Kersten
+ */
+public interface ITaskActivityListener {
+
+ public abstract void taskActivated(ITask task);
+
+ public abstract void tasksActivated(List<ITask> tasks);
+
+ public abstract void taskDeactivated(ITask task);
+
+ public abstract void localInfoChanged(ITask task);
+
+ public abstract void repositoryInfoChanged(ITask task);
+
+ public abstract void tasklistRead();
+
+ public abstract void taskListModified();
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskContainer.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskContainer.java
new file mode 100644
index 000000000..1699ea593
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskContainer.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * 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.mylar.provisional.tasklist;
+
+import java.util.Set;
+
+
+/**
+ * Manipulate containers via TaskListManager
+ *
+ * @author Mik Kersten
+ */
+public interface ITaskContainer extends ITaskListElement {
+
+ public Set<ITask> getChildren();
+
+ public boolean isArchive();
+
+ public void setIsArchive(boolean isArchive);
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskListElement.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskListElement.java
new file mode 100644
index 000000000..a4144839e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskListElement.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.mylar.provisional.tasklist;
+
+
+/**
+ * @author Mik Kersten
+ */
+public interface ITaskListElement {
+
+ public abstract String getPriority();
+
+ public abstract String getDescription();
+
+ public abstract void setDescription(String description);
+
+ public abstract String getHandleIdentifier();
+
+ public abstract void setHandleIdentifier(String id);
+
+ /**
+ * TODO: refactor to use repository kinds?
+ */
+ public abstract boolean isLocal();
+
+}
+
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskListExternalizer.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskListExternalizer.java
new file mode 100644
index 000000000..6d68f4688
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskListExternalizer.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * 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.mylar.provisional.tasklist;
+
+import org.eclipse.mylar.internal.tasklist.TaskExternalizationException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * Used to externalize things like tasks and bug reports along with the task
+ * list so that information about them can be persisted across invocations.
+ *
+ * @author Mik Kersten
+ * @author Ken Sueda
+ *
+ * TODO: consider merging tasks and categories
+ */
+public interface ITaskListExternalizer {
+
+ public abstract String getCategoryTagName();
+
+ public abstract String getTaskTagName();
+
+ public abstract String getQueryTagNameForElement(AbstractRepositoryQuery query);
+
+ public abstract String getQueryHitTagName();
+
+ /**
+ * @return the element that was created, null if failed
+ */
+ public abstract Element createCategoryElement(ITaskContainer category, Document doc, Element parent);
+
+ public abstract boolean canCreateElementFor(ITask task);
+
+ /**
+ * @return the element that was created, null if failed
+ */
+ public abstract Element createTaskElement(ITask task, Document doc, Element parent);
+
+ public abstract boolean canReadCategory(Node node);
+
+ public abstract void readCategory(Node node, TaskList tlist) throws TaskExternalizationException;
+
+ public abstract boolean canReadTask(Node node);
+
+ public abstract ITask readTask(Node node, TaskList tlist, TaskCategory category, ITask parent)
+ throws TaskExternalizationException;
+
+ public abstract boolean canCreateElementFor(AbstractRepositoryQuery category);
+
+ public abstract Element createQueryElement(AbstractRepositoryQuery query, Document doc, Element parent);
+
+ public abstract boolean canReadQuery(Node node);
+
+ public abstract AbstractRepositoryQuery readQuery(Node node, TaskList tlist) throws TaskExternalizationException;
+
+ public abstract boolean canCreateElementFor(AbstractQueryHit queryHit);
+
+ public abstract Element createQueryHitElement(AbstractQueryHit queryHit, Document doc, Element parent);
+
+ public abstract boolean canReadQueryHit(Node node);
+
+ public abstract void readQueryHit(Node node, TaskList tlist, AbstractRepositoryQuery query)
+ throws TaskExternalizationException;
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskRepositoryListener.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskRepositoryListener.java
new file mode 100644
index 000000000..8daae2b9d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/ITaskRepositoryListener.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * 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.mylar.provisional.tasklist;
+
+/**
+ * @author Mik Kersten
+ */
+public interface ITaskRepositoryListener {
+
+ public abstract void repositorySetUpdated();
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/MylarTaskListPlugin.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/MylarTaskListPlugin.java
new file mode 100644
index 000000000..c8268eba4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/MylarTaskListPlugin.java
@@ -0,0 +1,611 @@
+/*******************************************************************************
+ * 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.mylar.provisional.tasklist;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Date;
+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 org.eclipse.core.runtime.Preferences.IPropertyChangeListener;
+import org.eclipse.core.runtime.Preferences.PropertyChangeEvent;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.mylar.internal.core.MylarPreferenceContstants;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.tasklist.TaskListPreferenceConstants;
+import org.eclipse.mylar.internal.tasklist.TaskListRefreshManager;
+import org.eclipse.mylar.internal.tasklist.ui.IDynamicSubMenuContributor;
+import org.eclipse.mylar.internal.tasklist.ui.ITaskEditorFactory;
+import org.eclipse.mylar.internal.tasklist.ui.ITaskHighlighter;
+import org.eclipse.mylar.internal.tasklist.ui.ITaskListNotification;
+import org.eclipse.mylar.internal.tasklist.ui.ITaskListNotificationProvider;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListNotificationManager;
+import org.eclipse.mylar.internal.tasklist.ui.TaskListNotificationReminder;
+import org.eclipse.mylar.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylar.internal.tasklist.util.TaskListExtensionReader;
+import org.eclipse.mylar.internal.tasklist.util.TaskListSaveManager;
+import org.eclipse.mylar.internal.tasklist.util.TaskListWriter;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+import org.eclipse.swt.events.ShellEvent;
+import org.eclipse.swt.events.ShellListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.IStartup;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Mik Kersten
+ *
+ * TODO: this class is in serious need of refactoring
+ */
+public class MylarTaskListPlugin extends AbstractUIPlugin implements IStartup {
+
+ public static final String PLUGIN_ID = "org.eclipse.mylar.tasklist";
+
+ public static final String URL_HOMEPAGE = "http://eclipse.org/mylar";
+
+ private static MylarTaskListPlugin INSTANCE;
+
+ private static TaskListManager taskListManager;
+
+ private static TaskRepositoryManager taskRepositoryManager;
+
+ private TaskListSaveManager taskListSaveManager = new TaskListSaveManager();
+
+ private TaskListRefreshManager taskListRefreshManager;
+
+ private TaskListNotificationManager taskListNotificationManager;
+
+ private List<ITaskEditorFactory> taskEditors = new ArrayList<ITaskEditorFactory>();
+
+ private TaskListWriter taskListWriter;
+
+ public static final String FILE_EXTENSION = ".xml";
+
+ public static final String DEFAULT_TASK_LIST_FILE = "tasklist" + FILE_EXTENSION;
+
+ public static final String TITLE_DIALOG = "Mylar Information";
+
+ private ResourceBundle resourceBundle;
+
+ private long AUTOMATIC_BACKUP_SAVE_INTERVAL = 1 * 3600 * 1000; // every
+
+ private static Date lastBackup = new Date();
+
+ private ITaskHighlighter highlighter;
+
+ private static boolean shellActive = true;
+
+ private boolean initialized = false;
+
+ private Map<AbstractRepositoryClient, Image> brandingIcons = new HashMap<AbstractRepositoryClient, Image>();
+
+ public enum TaskListSaveMode {
+ ONE_HOUR, THREE_HOURS, DAY;
+ @Override
+ public String toString() {
+ switch (this) {
+ case ONE_HOUR:
+ return "1 hour";
+ case THREE_HOURS:
+ return "3 hours";
+ case DAY:
+ return "1 day";
+ default:
+ return "3 hours";
+ }
+ }
+
+ public static TaskListSaveMode fromString(String string) {
+ if (string == null)
+ return null;
+ if (string.equals("1 hour"))
+ return ONE_HOUR;
+ if (string.equals("3 hours"))
+ return THREE_HOURS;
+ if (string.equals("1 day"))
+ 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 ITaskActivityListener CONTEXT_TASK_ACTIVITY_LISTENER = new ITaskActivityListener() {
+
+ public void taskActivated(ITask task) {
+ MylarPlugin.getContextManager().contextActivated(task.getHandleIdentifier());
+ }
+
+ public void tasksActivated(List<ITask> tasks) {
+ for (ITask task : tasks) {
+ taskActivated(task);
+ }
+ }
+
+ public void taskDeactivated(ITask task) {
+ MylarPlugin.getContextManager().contextDeactivated(task.getHandleIdentifier());
+ }
+
+ public void tasklistRead() {
+ // ignore
+ }
+
+ public void localInfoChanged(ITask task) {
+ // ignore
+ }
+
+ public void repositoryInfoChanged(ITask task) {
+ // ignore
+ }
+
+ public void taskListModified() {
+ // ignore
+ }
+ };
+
+ /**
+ * TODO: move into reminder mechanims
+ */
+ private static ShellListener SHELL_LISTENER = new ShellListener() {
+
+ public void shellClosed(ShellEvent arg0) {
+ // ignore
+ }
+
+ /**
+ * bug 1002249: too slow to save state here
+ */
+ public void shellDeactivated(ShellEvent arg0) {
+ shellActive = false;
+ }
+
+ public void shellActivated(ShellEvent arg0) {
+ getDefault().checkTaskListBackup();
+ shellActive = true;
+ }
+
+ public void shellDeiconified(ShellEvent arg0) {
+ // ingore
+ }
+
+ public void shellIconified(ShellEvent arg0) {
+ // ignore
+ }
+ };
+
+ private static ITaskListNotificationProvider NOTIFICATION_PROVIDER = new ITaskListNotificationProvider() {
+
+ public Set<ITaskListNotification> getNotifications() {
+ Date currentDate = new Date();
+ Set<ITask> allTasks = MylarTaskListPlugin.getTaskListManager().getTaskList().getAllTasks();
+ Set<ITaskListNotification> reminders = new HashSet<ITaskListNotification>();
+ for (ITask task : allTasks) {
+ if (task.getReminderDate() != null && !task.hasBeenReminded() && task.getReminderDate().compareTo(currentDate) < 0) {
+ reminders.add(new TaskListNotificationReminder(task));
+ }
+ }
+ return reminders;
+ } };
+
+ private final IPropertyChangeListener PREFERENCE_LISTENER = new IPropertyChangeListener() {
+
+ public void propertyChange(PropertyChangeEvent event) {
+ if (event.getProperty().equals(TaskListPreferenceConstants.MULTIPLE_ACTIVE_TASKS)) {
+ TaskListView.getDefault().togglePreviousAction(
+ !getPrefs().getBoolean(TaskListPreferenceConstants.MULTIPLE_ACTIVE_TASKS));
+ TaskListView.getDefault().toggleNextAction(
+ !getPrefs().getBoolean(TaskListPreferenceConstants.MULTIPLE_ACTIVE_TASKS));
+ TaskListView.getDefault().clearTaskHistory();
+ }
+ if (event.getProperty().equals(MylarPreferenceContstants.PREF_DATA_DIR)) {
+ if (event.getOldValue() instanceof String) {
+ String newDirPath = MylarPlugin.getDefault().getDataDirectory();
+ String taskListFilePath = newDirPath + File.separator + DEFAULT_TASK_LIST_FILE;
+
+ getTaskListSaveManager().saveTaskListAndContexts();
+ getTaskListManager().setTaskListFile(new File(taskListFilePath));
+ getTaskListManager().createNewTaskList();
+ getTaskListManager().readExistingOrCreateNewList();
+
+ if (TaskListView.getDefault() != null)
+ TaskListView.getDefault().clearTaskHistory();
+ }
+ }
+ }
+ };
+
+ public MylarTaskListPlugin() {
+ super();
+ INSTANCE = this;
+
+ try {
+ initializeDefaultPreferences(getPrefs());
+ taskListWriter = new TaskListWriter();
+
+ String path = MylarPlugin.getDefault().getDataDirectory() + File.separator + DEFAULT_TASK_LIST_FILE;
+ File taskListFile = new File(path);
+
+ // TODO: decouple from core
+ int nextTaskId = 1;
+ if (MylarPlugin.getDefault() != null
+ && MylarPlugin.getDefault().getPreferenceStore().contains(TaskListPreferenceConstants.TASK_ID)) {
+ nextTaskId = MylarPlugin.getDefault().getPreferenceStore().getInt(TaskListPreferenceConstants.TASK_ID);
+ }
+
+ taskListManager = new TaskListManager(taskListWriter, taskListFile, nextTaskId);
+ taskRepositoryManager = new TaskRepositoryManager();
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, "Mylar Task List initialization failed", false);
+ }
+ }
+
+ /**
+ * Startup order is critical
+ */
+ public void earlyStartup() {
+ final IWorkbench workbench = PlatformUI.getWorkbench();
+ workbench.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ TaskListExtensionReader.initExtensions(taskListWriter);
+ taskRepositoryManager.readRepositories();
+
+ taskListManager.addListener(CONTEXT_TASK_ACTIVITY_LISTENER);
+ taskListManager.addListener(taskListSaveManager);
+
+ taskListManager.readExistingOrCreateNewList();
+ initialized = true;
+ migrateHandlesToRepositorySupport();
+
+ if (getPrefs().getBoolean(TaskListPreferenceConstants.REPOSITORY_SYNCH_ON_STARTUP)) {
+ for (AbstractRepositoryClient repositoryClient : taskRepositoryManager.getRepositoryClients()) {
+ repositoryClient.synchronize();
+ }
+ }
+
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().addShellListener(SHELL_LISTENER);
+
+ taskListNotificationManager = new TaskListNotificationManager();
+ taskListNotificationManager.addNotificationProvider(NOTIFICATION_PROVIDER);
+ taskListNotificationManager.startNotification(5000);
+
+ taskListRefreshManager = new TaskListRefreshManager();
+ taskListRefreshManager.startRefreshJob();
+
+ MylarPlugin.getDefault().getPluginPreferences().addPropertyChangeListener(PREFERENCE_LISTENER);
+ getPrefs().addPropertyChangeListener(taskListRefreshManager);
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().addDisposeListener(
+ taskListSaveManager);
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, "Task List initialization failed", true);
+ }
+ }
+ });
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ INSTANCE = null;
+ resourceBundle = null;
+ try {
+ taskListManager.removeListener(taskListSaveManager);
+ if (MylarPlugin.getDefault() != null) {
+ MylarPlugin.getDefault().getPluginPreferences().removePropertyChangeListener(PREFERENCE_LISTENER);
+ }
+ if (PlatformUI.getWorkbench() != null && PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null && PlatformUI.getWorkbench().isClosing()) {
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().removeShellListener(SHELL_LISTENER);
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().removeDisposeListener(
+ taskListSaveManager);
+ }
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, "Mylar Task List stop failed", false);
+ }
+ }
+
+ private void migrateHandlesToRepositorySupport() {
+ boolean migrated = false;
+ getPreferenceStore().setDefault(TaskListPreferenceConstants.CONTEXTS_MIGRATED, false);
+ if (!getPreferenceStore().getBoolean(TaskListPreferenceConstants.CONTEXTS_MIGRATED)) {
+ File dataDir = new File(MylarPlugin.getDefault().getDataDirectory());
+ TaskRepository defaultRepository = MylarTaskListPlugin.getRepositoryManager().getDefaultRepository(
+ TaskRepositoryManager.PREFIX_REPOSITORY_OLD.toLowerCase());
+ if (defaultRepository != null) {
+ String repositoryUrl = defaultRepository.getUrl().toExternalForm();
+ migrated = true;
+ if (dataDir.exists() && dataDir.isDirectory()) {
+ for (File file : dataDir.listFiles()) {
+ String oldHandle = file.getName().substring(0, file.getName().lastIndexOf('.'));
+ if (oldHandle.startsWith(TaskRepositoryManager.PREFIX_REPOSITORY_OLD)) {
+ String id = AbstractRepositoryTask.getTaskId(oldHandle);
+ String newHandle = AbstractRepositoryTask.getHandle(repositoryUrl, id);
+ File newFile = MylarPlugin.getContextManager().getFileForContext(newHandle);
+ file.renameTo(newFile);
+ }
+ }
+ }
+ for (ITask task : taskListManager.getTaskList().getAllTasks()) {
+ if (!task.isLocal()) {
+ String id = AbstractRepositoryTask.getTaskId(task.getHandleIdentifier());
+ String newHandle = AbstractRepositoryTask.getHandle(repositoryUrl, id);
+ task.setHandleIdentifier(newHandle);
+ }
+ }
+
+ for (AbstractRepositoryQuery query : taskListManager.getTaskList().getQueries()) {
+ query.setRepositoryUrl(repositoryUrl);
+ for (AbstractQueryHit hit : query.getHits()) {
+ hit.setRepositoryUrl(repositoryUrl);
+ }
+ }
+ taskListManager.saveTaskList();
+ taskListManager.readExistingOrCreateNewList();
+ }
+ }
+ if (migrated) {
+ MylarStatusHandler.log("Migrated context files to repository-aware paths", this);
+ getPreferenceStore().setValue(TaskListPreferenceConstants.CONTEXTS_MIGRATED, true);
+ }
+ }
+
+ @Override
+ protected void initializeDefaultPreferences(IPreferenceStore store) {
+// store.setDefault(TaskListPreferenceConstants.AUTO_MANAGE_EDITORS, true);
+ store.setDefault(TaskListPreferenceConstants.SELECTED_PRIORITY, Task.PriorityLevel.P5.toString());
+ store.setDefault(TaskListPreferenceConstants.REPORT_OPEN_EDITOR, true);
+ store.setDefault(TaskListPreferenceConstants.REPORT_OPEN_INTERNAL, false);
+ store.setDefault(TaskListPreferenceConstants.REPORT_OPEN_EXTERNAL, false);
+ store.setDefault(TaskListPreferenceConstants.REPOSITORY_SYNCH_ON_STARTUP, false);
+
+ store.setDefault(TaskListPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED, false);
+ store.setDefault(TaskListPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_MILISECONDS, ""+(30 * 60 * 1000));
+
+ store.setDefault(TaskListPreferenceConstants.MULTIPLE_ACTIVE_TASKS, false);
+ store.setValue(TaskListPreferenceConstants.MULTIPLE_ACTIVE_TASKS, false);
+
+ store.setDefault(TaskListPreferenceConstants.SAVE_TASKLIST_MODE, TaskListSaveMode.THREE_HOURS.toString());
+ }
+
+ public static TaskListManager getTaskListManager() {
+ return taskListManager;
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static MylarTaskListPlugin getDefault() {
+ return INSTANCE;
+ }
+
+ /**
+ * Returns the string from the INSTANCE's resource bundle, or 'key' if not
+ * found.
+ */
+ public static String getResourceString(String key) {
+ ResourceBundle bundle = MylarTaskListPlugin.getDefault().getResourceBundle();
+ try {
+ return (bundle != null) ? bundle.getString(key) : key;
+ } catch (MissingResourceException e) {
+ return key;
+ }
+ }
+
+ /**
+ * Returns the INSTANCE's resource bundle,
+ */
+ public ResourceBundle getResourceBundle() {
+ try {
+ if (resourceBundle == null)
+ resourceBundle = ResourceBundle.getBundle("taskListPlugin.TaskListPluginPluginResources");
+ } catch (MissingResourceException x) {
+ resourceBundle = null;
+ }
+ return resourceBundle;
+ }
+
+ public static IPreferenceStore getPrefs() {
+ // TODO: should be using the task list's prefernece store, but can't
+ // change without migrating because this will cause people to lose
+ // repositories
+ return MylarPlugin.getDefault().getPreferenceStore();
+ }
+
+ private void checkTaskListBackup() {
+ // if (getPrefs().contains(PREVIOUS_SAVE_DATE)) {
+ // lastSave = new Date(getPrefs().getLong(PREVIOUS_SAVE_DATE));
+ // } else {
+ // lastSave = new Date();
+ // getPrefs().setValue(PREVIOUS_SAVE_DATE, lastSave.getTime());
+ // }
+ Date currentTime = new Date();
+ if (currentTime.getTime() > lastBackup.getTime() + AUTOMATIC_BACKUP_SAVE_INTERVAL) {// TaskListSaveMode.fromStringToLong(getPrefs().getString(SAVE_TASKLIST_MODE)))
+ // {
+ MylarTaskListPlugin.getDefault().getTaskListSaveManager().createTaskListBackupFile();
+ lastBackup = new Date();
+ // INSTANCE.getPreferenceStore().setValue(PREVIOUS_SAVE_DATE,
+ // lastSave.getTime());
+ }
+ }
+
+ /**
+ * TODO: move
+ */
+ public static void setCurrentPriorityLevel(Task.PriorityLevel pl) {
+ getPrefs().setValue(TaskListPreferenceConstants.SELECTED_PRIORITY, pl.toString());
+ }
+
+ public static String getCurrentPriorityLevel() {
+ if (getPrefs().contains(TaskListPreferenceConstants.SELECTED_PRIORITY)) {
+ return getPrefs().getString(TaskListPreferenceConstants.SELECTED_PRIORITY);
+ } else {
+ return Task.PriorityLevel.P5.toString();
+ }
+ }
+
+ public void setFilterCompleteMode(boolean isFilterOn) {
+ getPrefs().setValue(TaskListPreferenceConstants.FILTER_COMPLETE_MODE, isFilterOn);
+ }
+
+ public boolean isFilterCompleteMode() {
+ if (getPrefs().contains(TaskListPreferenceConstants.FILTER_COMPLETE_MODE)) {
+ return getPrefs().getBoolean(TaskListPreferenceConstants.FILTER_COMPLETE_MODE);
+ } else {
+ return false;
+ }
+ }
+
+ public void setFilterInCompleteMode(boolean isFilterOn) {
+ getPrefs().setValue(TaskListPreferenceConstants.FILTER_INCOMPLETE_MODE, isFilterOn);
+ }
+
+ public boolean isFilterInCompleteMode() {
+ if (getPrefs().contains(TaskListPreferenceConstants.FILTER_INCOMPLETE_MODE)) {
+ return getPrefs().getBoolean(TaskListPreferenceConstants.FILTER_INCOMPLETE_MODE);
+ } else {
+ return false;
+ }
+ }
+
+ // public List<ITaskHandler> getTaskHandlers() {
+ // return taskHandlers;
+ // }
+
+ // public ITaskHandler getHandlerForElement(ITaskListElement element) {
+ // for (ITaskHandler taskHandler : taskHandlers) {
+ // if (taskHandler.acceptsItem(element))
+ // return taskHandler;
+ // }
+ // return null;
+ // }
+
+ // public void addTaskHandler(ITaskHandler taskHandler) {
+ // taskHandlers.add(taskHandler);
+ // }
+
+ // private void restoreTaskHandlerState() {
+ // for (ITaskHandler handler : taskHandlers) {
+ // handler.restoreState(TaskListView.getDefault());
+ // }
+ // }
+
+ private List<IDynamicSubMenuContributor> menuContributors = new ArrayList<IDynamicSubMenuContributor>();
+
+ public List<IDynamicSubMenuContributor> getDynamicMenuContributers() {
+ return menuContributors;
+ }
+
+ public void addDynamicPopupContributor(IDynamicSubMenuContributor contributor) {
+ menuContributors.add(contributor);
+ }
+
+ public boolean isMultipleActiveTasksMode() {
+ return getPrefs().getBoolean(TaskListPreferenceConstants.MULTIPLE_ACTIVE_TASKS);
+ }
+
+ public String[] getSaveOptions() {
+ String[] options = { TaskListSaveMode.ONE_HOUR.toString(), TaskListSaveMode.THREE_HOURS.toString(),
+ TaskListSaveMode.DAY.toString() };
+ return options;
+ }
+
+ public ITaskHighlighter getHighlighter() {
+ return highlighter;
+ }
+
+ public void setHighlighter(ITaskHighlighter highlighter) {
+ this.highlighter = highlighter;
+ }
+
+ public List<ITaskEditorFactory> getTaskEditors() {
+ return taskEditors;
+ }
+
+ public void addContextEditor(ITaskEditorFactory contextEditor) {
+ if (contextEditor != null)
+ this.taskEditors.add(contextEditor);
+ }
+
+ public TaskListSaveManager getTaskListSaveManager() {
+ return taskListSaveManager;
+ }
+
+ public boolean isShellActive() {
+ return MylarTaskListPlugin.shellActive;
+ }
+
+ public static TaskRepositoryManager getRepositoryManager() {
+ return taskRepositoryManager;
+ }
+
+ public Map<AbstractRepositoryClient, Image> getBrandingIcons() {
+ return brandingIcons;
+ }
+
+ public boolean isInitialized() {
+ return initialized;
+ }
+}
+
+// /**
+// * Sets the directory containing the task list file to use.
+// * Switches immediately to use the data at that location.
+// */
+// public void setDataDirectory(String newDirPath) {
+// String taskListFilePath = newDirPath + File.separator +
+// DEFAULT_TASK_LIST_FILE;
+// getTaskListManager().setTaskListFile(new File(taskListFilePath));
+// getTaskListManager().createNewTaskList();
+// getTaskListManager().readTaskList();
+//
+// if (TaskListView.getDefault() != null)
+// TaskListView.getDefault().clearTaskHistory();
+// }
+
+// private List<ITaskActivationListener> taskListListeners = new
+// ArrayList<ITaskActivationListener>();
+//
+// public List<ITaskActivationListener> getTaskListListeners() {
+// return taskListListeners;
+// }
+//
+// public void addTaskListListener(ITaskActivationListener taskListListner) {
+// taskListListeners.add(taskListListner);
+// }
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/Task.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/Task.java
new file mode 100644
index 000000000..720506f06
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/Task.java
@@ -0,0 +1,397 @@
+/*******************************************************************************
+ * 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.mylar.provisional.tasklist;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+
+/**
+ * @author Mik Kersten
+ */
+public class Task implements ITask {
+
+ private static final String REPOSITORY_KIND_LOCAL = "local";
+
+ public enum TaskStatus {
+ NOT_STARTED, IN_PROGRESS, COMPLETED;
+
+ @Override
+ public String toString() {
+ switch (this) {
+ case NOT_STARTED:
+ return "Not Started";
+ case IN_PROGRESS:
+ return "In Progress";
+ case COMPLETED:
+ return "Completed";
+ default:
+ return "null";
+ }
+ }
+ }
+
+ public enum PriorityLevel {
+ P1, P2, P3, P4, P5;
+
+ @Override
+ public String toString() {
+ switch (this) {
+ case P1:
+ return "P1";
+ case P2:
+ return "P2";
+ case P3:
+ return "P3";
+ case P4:
+ return "P4";
+ case P5:
+ return "P5";
+ default:
+ return "P5";
+ }
+ }
+
+ public static PriorityLevel fromString(String string) {
+ if (string == null)
+ return null;
+ if (string.equals("P1"))
+ return P1;
+ if (string.equals("P2"))
+ return P2;
+ if (string.equals("P3"))
+ return P3;
+ if (string.equals("P4"))
+ return P4;
+ if (string.equals("P5"))
+ return P5;
+ return null;
+ }
+ }
+
+ private boolean active = false;
+
+ protected String handle = "-1";
+
+ private boolean category = false;
+
+ private boolean hasReminded = false;
+
+ private String description;
+
+ private String priority = PriorityLevel.P3.toString();
+
+ private String notes = "";
+
+ private int estimatedTimeHours = 0;
+
+ private boolean completed;
+
+ private List<String> links = new ArrayList<String>();
+
+ private List<String> plans = new ArrayList<String>();
+
+ private String url = "";
+
+ private ITaskContainer parentCategory = null;
+
+ private long timeActive = 0;
+
+ private Date completionDate = null;
+
+ private Date creationDate = null;
+
+ private Date reminderDate = null;
+
+ /**
+ * @return null if root
+ */
+ private transient ITask parent;
+
+ private Set<ITask> children = new HashSet<ITask>();
+
+ protected String kind;
+
+ @Override
+ public String toString() {
+ return description;
+ }
+
+ public Task(String handle, String label, boolean newTask) {
+ this.handle = handle;
+ this.description = label;
+ if (newTask) {
+ creationDate = new Date();
+ }
+ }
+
+ public String getHandleIdentifier() {
+ return handle;
+ }
+
+ public void setHandleIdentifier(String id) {
+ this.handle = id;
+ }
+
+ public ITask getParent() {
+ return parent;
+ }
+
+ public void setParent(ITask parent) {
+ this.parent = parent;
+ }
+
+ /**
+ * Package visible in order to prevent sets that don't update the index.
+ */
+ public void setActive(boolean active) {
+ this.active = active;
+ }
+
+ public boolean isActive() {
+ return active;
+ }
+
+ public String getToolTipText() {
+ return getDescription();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof Task && obj != null) {
+ return this.getHandleIdentifier().compareTo(((Task) obj).getHandleIdentifier()) == 0;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ return this.getHandleIdentifier().hashCode();
+ }
+
+ public boolean isCompleted() {
+ return completed;
+ }
+
+ public void setCompleted(boolean completed) {
+ if (completed) {
+ completionDate = new Date();
+ }
+ this.completed = completed;
+ }
+
+ public boolean isCategory() {
+ return category;
+ }
+
+ public void setIsCategory(boolean category) {
+ this.category = category;
+ }
+
+ public String getPriority() {
+ return priority;
+ }
+
+ public void setPriority(String priority) {
+ this.priority = priority;
+ }
+
+ public List<String> getRelatedLinks() {
+ // TODO: removed check for null once xml updated.
+ if (links == null) {
+ links = new ArrayList<String>();
+ }
+ return links;
+ }
+
+ public void setRelatedLinks(List<String> relatedLinks) {
+ this.links = relatedLinks;
+ }
+
+ public void addLink(String link) {
+ links.add(link);
+ }
+
+ public void removeLink(String link) {
+ links.remove(link);
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public String getNotes() {
+ // TODO: removed check for null once xml updated.
+ if (notes == null) {
+ notes = "";
+ }
+ return notes;
+ }
+
+ public void setNotes(String notes) {
+ this.notes = notes;
+ }
+
+ public long getElapsedTime() {
+ return timeActive;
+ }
+
+ public void setElapsedTime(long elapsedTime) {
+ if (elapsedTime >= 0) {
+ this.timeActive = elapsedTime;
+ } else {
+ MylarStatusHandler.log("Attempt to set negative time on task: " + getDescription(), this);
+ }
+ }
+
+ public int getEstimateTimeHours() {
+ return estimatedTimeHours;
+ }
+
+ public void setEstimatedTimeHours(int estimated) {
+ this.estimatedTimeHours = estimated;
+ }
+
+ public Set<ITask> getChildren() {
+ return children;
+ }
+
+ public void addSubTask(ITask t) {
+ children.add(t);
+ }
+
+ public void removeSubTask(ITask t) {
+ children.remove(t);
+ }
+
+ public void setCategory(ITaskContainer cat) {
+ this.parentCategory = cat;
+ }
+
+ public ITaskContainer getCategory() {
+ return parentCategory;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public boolean isLocal() {
+ return true;
+ }
+
+ public Date getCompletionDate() {
+ return completionDate;
+ }
+
+ public void setReminderDate(Date date) {
+ reminderDate = date;
+ }
+
+ public Date getReminderDate() {
+ return reminderDate;
+ }
+
+ public boolean hasBeenReminded() {
+ return hasReminded;
+ }
+
+ public void setReminded(boolean reminded) {
+ this.hasReminded = reminded;
+ }
+
+ public Date getCreationDate() {
+ if (creationDate == null)
+ creationDate = new Date();
+ return creationDate;
+ }
+
+ public void setCreationDate(Date date) {
+ this.creationDate = date;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public void addPlan(String plan) {
+ if (plan != null && !plans.contains(plan))
+ plans.add(plan);
+ }
+
+ public List<String> getPlans() {
+ return plans;
+ }
+
+ public void setCompletionDate(Date completionDate) {
+ this.completionDate = completionDate;
+ }
+
+ public boolean isPastReminder() {
+ if (reminderDate == null) {
+ return false;
+ } else {
+ Date now = new Date();
+ if (reminderDate.compareTo(now) < 0) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+
+ public boolean hasValidUrl() {
+ String taskUrl = getUrl();
+ if (taskUrl != null && !taskUrl.equals("") && !taskUrl.equals("http://") && !taskUrl.equals("https://")) {
+ try {
+ new URL(taskUrl);
+ return true;
+ } catch (MalformedURLException e) {
+ return false;
+ }
+ }
+ return false;
+ }
+
+ public TaskStatus getStatus() {
+ if (isCompleted()) {
+ return TaskStatus.COMPLETED;
+ } else {
+ return TaskStatus.NOT_STARTED;
+ }
+ }
+
+ public String getRepositoryKind() {
+ return REPOSITORY_KIND_LOCAL;
+ }
+
+
+ public String getKind() {
+ return kind;
+ }
+
+ public void setKind(String kind) {
+ this.kind = kind;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskCategory.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskCategory.java
new file mode 100644
index 000000000..0d4bb7174
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskCategory.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * 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 Dec 26, 2004
+ */
+package org.eclipse.mylar.provisional.tasklist;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskCategory implements ITaskContainer {
+
+ private Set<ITask> tasks = new HashSet<ITask>();
+
+ private String handle = "";
+
+ private boolean isArchive = false;
+
+ public TaskCategory(String handleAndDescription) {
+ this.handle = handleAndDescription;
+ }
+
+ public String getDescription() {
+ return handle;
+ }
+
+ public String getHandleIdentifier() {
+ return handle;
+ }
+
+ public void setDescription(String description) {
+ this.handle = description;
+ }
+
+ public void setHandleIdentifier(String handle) {
+ this.handle = handle;
+ }
+
+ public String getPriority() {
+ String highestPriority = Task.PriorityLevel.P5.toString();
+ if (tasks.isEmpty()) {
+ return Task.PriorityLevel.P1.toString();
+ }
+ for (ITask task : tasks) {
+ if (highestPriority.compareTo(task.getPriority()) > 0) {
+ highestPriority = task.getPriority();
+ }
+ }
+ return highestPriority;
+ }
+
+ void addTask(ITask task) {
+ tasks.add(task);
+ }
+
+ /**
+ * HACK: public so it can be used by other externalizers
+ */
+ public void internalAddTask(ITask task) {
+ tasks.add(task);
+ }
+
+ public void removeTask(ITask task) {
+ tasks.remove(task);
+ }
+
+ public Set<ITask> getChildren() {
+ return tasks;
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (object == null)
+ return false;
+ if (object instanceof TaskCategory) {
+ TaskCategory compare = (TaskCategory) object;
+ return this.getHandleIdentifier().equals(compare.getHandleIdentifier());
+ } else {
+ return false;
+ }
+ }
+
+ public int hashCode() {
+ return handle.hashCode();
+ }
+
+ public ITask getOrCreateCorrespondingTask() {
+ return null;
+ }
+
+ public boolean hasCorrespondingActivatableTask() {
+ return false;
+ }
+
+ public boolean isLocal() {
+ return true;
+ }
+
+ public boolean isCompleted() {
+ return false;
+ }
+
+ public String getToolTipText() {
+ if (tasks.size() == 1) {
+ return "1 task";
+ } else {
+ return tasks.size() + " tasks";
+ }
+ }
+
+ public boolean isArchive() {
+ return isArchive;
+ }
+
+ public void setIsArchive(boolean isArchive) {
+ this.isArchive = isArchive;
+ ;
+ }
+
+ public String getStringForSortingDescription() {
+ return getDescription();
+ }
+
+ public String toString() {
+ return getDescription();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskList.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskList.java
new file mode 100644
index 000000000..23f0b432e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskList.java
@@ -0,0 +1,404 @@
+/*******************************************************************************
+ * 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.mylar.provisional.tasklist;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+
+/**
+ * TODO: in need of refactoring since there is duplication between categories and fields.
+ *
+ * @author Mik Kersten
+ */
+public class TaskList {
+
+ public static final String LABEL_ARCHIVE = "Archive (automatic)";
+
+ public static final String LABEL_ROOT = "Root (automatic)";
+
+ private TaskCategory archiveCategory = new TaskCategory(LABEL_ARCHIVE);
+
+ private TaskCategory rootCategory = new TaskCategory(LABEL_ROOT);
+
+ private Set<ITaskContainer> categories = new HashSet<ITaskContainer>();
+
+ private Set<ITask> rootTasks = new HashSet<ITask>();
+
+ private List<AbstractRepositoryQuery> queries = new ArrayList<AbstractRepositoryQuery>();
+
+ private transient List<ITask> activeTasks = new ArrayList<ITask>();
+
+ public TaskList() {
+ archiveCategory.setIsArchive(true);
+ categories.add(archiveCategory);
+ }
+
+ public void internalAddRootTask(ITask task) {
+ rootTasks.add(task);
+ task.setCategory(rootCategory);
+ }
+
+ void removeFromRoot(ITask task) {
+ rootTasks.remove(task);
+ task.setCategory(archiveCategory);
+ }
+
+ void addCategory(ITaskContainer cat) {
+ categories.add(cat);
+ }
+
+ void addQuery(AbstractRepositoryQuery query) {
+ queries.add(query);
+ }
+
+ /**
+ * XXX Only public so that other externalizers can use it
+ */
+ public void internalAddCategory(ITaskContainer cat) {
+ categories.add(cat);
+ }
+
+ /**
+ * XXX Only public so that other externalizers can use it
+ */
+ public void internalAddQuery(AbstractRepositoryQuery query) {
+ queries.add(query);
+ }
+
+ void setActive(ITask task, boolean active) {
+ task.setActive(active);
+ if (active && !activeTasks.contains(task)) {
+ activeTasks.add(task);
+ } else if (!active) {
+ activeTasks.remove(task);
+ }
+ }
+
+ /**
+ * TODO: refactor around querying containers for their tasks
+ */
+ void deleteTask(ITask task) {
+ deleteTaskHelper(archiveCategory.getChildren(), task);
+ boolean deleted = deleteTaskHelper(rootTasks, task);
+ task.setCategory(null);
+ if (!deleted) {
+ for (TaskCategory cat : getTaskCategories()) {
+ deleted = deleteTaskHelper(cat.getChildren(), task);
+ if (deleted) {
+ return;
+ }
+ }
+ }
+
+ }
+
+ private boolean deleteTaskHelper(Set<ITask> tasks, ITask toDelete) {
+ for (ITask task : tasks) {
+ if (task.getHandleIdentifier().equals(toDelete.getHandleIdentifier())) {
+ tasks.remove(task);
+ return true;
+ } else {
+ if (deleteTaskHelper(task.getChildren(), toDelete))
+ return true;
+ }
+ }
+ return false;
+ }
+
+ void deleteCategory(ITaskContainer category) {
+ categories.remove(category);
+ }
+
+ void deleteQuery(AbstractRepositoryQuery query) {
+ queries.remove(query);
+ }
+
+ public ITask getTaskForHandle(String handle, boolean lookInArchives) {
+ ITask foundTask = null;
+ for (ITaskContainer cat : categories) {
+ if (!lookInArchives && cat.isArchive())
+ continue;
+ if ((foundTask = findTaskHelper(cat.getChildren(), handle)) != null) {
+ return foundTask;
+ }
+ }
+ for (AbstractRepositoryQuery query : queries) {
+ if ((foundTask = findTaskHelper(query.getHits(), handle)) != null) {
+ return foundTask;
+ }
+ }
+ return findTaskHelper(rootTasks, handle);
+ }
+
+ private AbstractQueryHit findQueryHitHelper(Set<? extends ITaskListElement> elements, String handle) {
+ if (handle == null)
+ return null;
+ for (ITaskListElement element : elements) {
+ if (element instanceof AbstractQueryHit) {
+ AbstractQueryHit hit = (AbstractQueryHit) element;
+ if (hit.getHandleIdentifier().compareTo(handle) == 0) {
+ return hit;
+ }
+ }
+ }
+ return null;
+ }
+
+ private ITask findTaskHelper(Set<? extends ITaskListElement> elements, String handle) {
+ if (handle == null)
+ return null;
+ for (ITaskListElement element : elements) {
+ if (element instanceof ITask) {
+ if (element.getHandleIdentifier().compareTo(handle) == 0)
+ return (ITask) element;
+ } else if (element instanceof AbstractQueryHit) {
+ AbstractQueryHit hit = (AbstractQueryHit) element;
+ if (hit.getHandleIdentifier().compareTo(handle) == 0 && hit.getCorrespondingTask() != null) {
+ return hit.getCorrespondingTask();
+ }
+ }
+
+ // for subtasks
+ if (element instanceof ITask) {
+ ITask searchTask = (ITask) element;
+ ITask t = findTaskHelper(searchTask.getChildren(), handle);
+ if (t != null) {
+ return t;
+ }
+ }
+ }
+ return null;
+ }
+
+ public List<ITask> getActiveTasks() {
+ return activeTasks;
+ }
+
+ /**
+ * HACK: returns first
+ *
+ * @return
+ */
+ public ITask getActiveTask() {
+ if (activeTasks.size() > 0) {
+ return activeTasks.get(0);
+ } else {
+ return null;
+ }
+ }
+
+ public Set<ITask> getRootTasks() {
+ return rootTasks;
+ }
+
+ public Set<ITaskContainer> getCategories() {
+ return categories;
+ }
+
+ public List<ITaskContainer> getUserCategories() {
+ List<ITaskContainer> included = new ArrayList<ITaskContainer>();
+ for (ITaskContainer category : categories) {
+ if (!category.getDescription().endsWith(DelegatingTaskExternalizer.LABEL_AUTOMATIC)) {
+ included.add(category);
+ }
+ }
+ return included;
+ }
+
+ public List<AbstractRepositoryQuery> getQueries() {
+ return queries;
+ }
+
+ public int findLargestTaskHandle() {
+ int max = 0;
+ max = Math.max(largestTaskHandleHelper(rootTasks), max);
+ for (TaskCategory cat : getTaskCategories()) {
+ max = Math.max(largestTaskHandleHelper(cat.getChildren()), max);
+ }
+ return max;
+ }
+
+ private int largestTaskHandleHelper(Set<ITask> tasks) {
+ int ihandle = 0;
+ int max = 0;
+ for (ITask task : tasks) {
+ if (task.isLocal()) {
+ String string = task.getHandleIdentifier().substring(task.getHandleIdentifier().indexOf('-') + 1,
+ task.getHandleIdentifier().length());
+ if (!"".equals(string)) {
+ ihandle = Integer.parseInt(string);
+ }
+ }
+ max = Math.max(ihandle, max);
+ ihandle = largestTaskHandleHelper(task.getChildren());
+ max = Math.max(ihandle, max);
+ }
+ return max;
+ }
+
+ public Set<ITaskListElement> getRootElements() {
+ Set<ITaskListElement> roots = new HashSet<ITaskListElement>();
+ // roots.add(archiveCategory);
+ for (ITask task : rootTasks)
+ roots.add(task);
+ for (ITaskContainer cat : categories)
+ roots.add(cat);
+ for (AbstractRepositoryQuery query : queries)
+ roots.add(query);
+ return roots;
+ }
+
+ public Set<ITask> getAllTasks() {
+ Set<ITask> allTasks = new HashSet<ITask>();
+ allTasks.addAll(rootTasks);
+ for (ITaskContainer container : categories) {
+ allTasks.addAll(container.getChildren());
+ }
+ return allTasks;
+ }
+
+ public Set<TaskCategory> getTaskCategories() {
+ Set<TaskCategory> cats = new HashSet<TaskCategory>();
+ for (ITaskContainer cat : categories) {
+ if (cat instanceof TaskCategory) {
+ cats.add((TaskCategory) cat);
+ }
+ }
+ return cats;
+ }
+
+ public void clear() {
+ activeTasks.clear();
+ categories.clear();
+ rootTasks.clear();
+ }
+
+ public AbstractRepositoryQuery getQueryForHandle(String handle) {
+ if (handle == null) {
+ return null;
+ }
+ for (AbstractRepositoryQuery query : queries) {
+ if ((findQueryHitHelper(query.getHits(), handle)) != null) {
+ return query;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * NOTE: will only return first occurrence of the hit in the first
+ * category it is matched in.
+ */
+ public AbstractQueryHit getQueryHitForHandle(String handle) {
+ if (handle == null) {
+ return null;
+ }
+ AbstractQueryHit foundHit = null;
+ for (AbstractRepositoryQuery query : queries) {
+ if ((foundHit = findQueryHitHelper(query.getHits(), handle)) != null) {
+ return foundHit;
+ }
+ }
+ return foundHit;
+ }
+
+ public boolean isEmpty() {
+ boolean archiveIsEmpty = getCategories().size() == 1
+ && getCategories().iterator().next().equals(archiveCategory) && archiveCategory.getChildren().isEmpty();
+ return getAllTasks().size() == 0 && archiveIsEmpty && getQueries().size() == 0;
+ }
+
+ public void addTaskToArchive(ITask task) {
+ archiveCategory.internalAddTask(task);
+ }
+
+ public ITask getTaskFromArchive(String handleIdentifier) {
+ for (ITask task : archiveCategory.getChildren()) {
+ if (task.getHandleIdentifier().equals(handleIdentifier)) {
+ return task;
+ }
+ }
+ return null;
+ // return archiveMap.get(handleIdentifier);
+ }
+
+ public Set<ITask> getArchiveTasks() {
+ return archiveCategory.getChildren();
+ // List<ITask> archiveTasks = new ArrayList<ITask>();
+ // archiveTasks.addAll(archiveMap.values());
+ // return archiveTasks;
+ }
+
+ public void setArchiveCategory(TaskCategory category) {
+ this.archiveCategory = category;
+ }
+
+ /**
+ * For testing.
+ */
+ public void clearArchive() {
+ archiveCategory.getChildren().clear();
+ // archiveMap.clear();
+ }
+
+ public TaskCategory getCategoryForHandle(String categoryHandle) {
+ for (ITaskContainer cat : categories) {
+ if (cat instanceof TaskCategory) {
+ if (cat.getHandleIdentifier().equals(categoryHandle)) {
+ return (TaskCategory) cat;
+ }
+ }
+ }
+ return null;
+ }
+
+ public TaskCategory getRootCategory() {
+ return rootCategory;
+ }
+
+ public TaskCategory getArchiveCategory() {
+ return archiveCategory;
+ }
+
+ /** if handle == null or no queries found an empty set is returned **/
+ public Set<AbstractRepositoryQuery> getQueriesForHandle(String handle) {
+ Set<AbstractRepositoryQuery> queriesForHandle = new HashSet<AbstractRepositoryQuery>();
+ if (handle == null) {
+ return queriesForHandle;
+ }
+ for (AbstractRepositoryQuery query : queries) {
+ if ((findQueryHitHelper(query.getHits(), handle)) != null) {
+ queriesForHandle.add(query);
+ }
+ }
+ return queriesForHandle;
+ }
+
+ /** if handle == null or no query hits found an empty set is returned **/
+ public Set<AbstractQueryHit> getQueryHitsForHandle(String handle) {
+ Set<AbstractQueryHit> hitsForHandle = new HashSet<AbstractQueryHit>();
+ if (handle == null) {
+ return hitsForHandle;
+ }
+ AbstractQueryHit foundHit = null;
+ for (AbstractRepositoryQuery query : queries) {
+ if ((foundHit = findQueryHitHelper(query.getHits(), handle)) != null) {
+ hitsForHandle.add(foundHit);
+ }
+ }
+ return hitsForHandle;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskListManager.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskListManager.java
new file mode 100644
index 000000000..e2fe0258a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskListManager.java
@@ -0,0 +1,313 @@
+/*******************************************************************************
+ * 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 Dec 26, 2004
+ */
+package org.eclipse.mylar.provisional.tasklist;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylar.internal.core.util.TimerThread;
+import org.eclipse.mylar.internal.tasklist.TaskListPreferenceConstants;
+import org.eclipse.mylar.internal.tasklist.util.TaskActivityTimer;
+import org.eclipse.mylar.internal.tasklist.util.TaskListWriter;
+import org.eclipse.mylar.provisional.core.MylarPlugin;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListManager {
+
+ public static final String ARCHIVE_CATEGORY_DESCRIPTION = "Archive";
+
+ private Map<ITask, TaskActivityTimer> timerMap = new HashMap<ITask, TaskActivityTimer>();
+
+ private List<ITaskActivityListener> listeners = new ArrayList<ITaskActivityListener>();
+
+ private TaskListWriter taskListWriter;
+
+ private File taskListFile;
+
+ private TaskList taskList = new TaskList();
+
+ private boolean taskListInitialized = false;
+
+ private int nextTaskId;
+
+ private int timerSleepInterval = TimerThread.DEFAULT_SLEEP_INTERVAL;
+
+ public TaskListManager(TaskListWriter taskListWriter, File file, int startId) {
+ this.taskListFile = file;
+ this.taskListWriter = taskListWriter;
+ this.nextTaskId = startId;
+ }
+
+ public TaskList createNewTaskList() {
+ taskList = new TaskList();
+ taskListInitialized = true;
+ return taskList;
+ }
+
+ /**
+ * Exposed for unit testing
+ *
+ * @return unmodifiable collection of ITaskActivityListeners
+ */
+ public List<ITaskActivityListener> getListeners() {
+ return Collections.unmodifiableList(listeners);
+ }
+
+ public String genUniqueTaskHandle() {
+ return TaskRepositoryManager.PREFIX_LOCAL + nextTaskId++;
+ }
+
+ public boolean readExistingOrCreateNewList() {
+ try {
+ if (taskListFile.exists()) {
+ taskList = new TaskList();
+ taskListWriter.readTaskList(taskList, taskListFile);
+ int maxHandle = taskList.findLargestTaskHandle();
+ if (maxHandle >= nextTaskId) {
+ nextTaskId = maxHandle + 1;
+ }
+ } else {
+ createNewTaskList();
+ }
+ taskListInitialized = true;
+ for (ITaskActivityListener listener : new ArrayList<ITaskActivityListener>(listeners)) {
+ listener.tasklistRead();
+ }
+ // only activate the first task to avoid confusion of mutliple
+ // active tasks on startup
+ List<ITask> activeTasks = taskList.getActiveTasks();
+ if (activeTasks.size() > 0) {
+ activateTask(activeTasks.get(0));
+ }
+ } catch (Exception e) {
+ MylarStatusHandler.log(e, "Could not read task list");
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Will not save an empty task list to avoid losing data on bad startup.
+ */
+ public void saveTaskList() {
+ try {
+ if (taskListInitialized) {
+ if (!taskList.isEmpty()) {
+ taskListWriter.writeTaskList(taskList, taskListFile);
+ MylarPlugin.getDefault().getPreferenceStore().setValue(TaskListPreferenceConstants.TASK_ID, nextTaskId);
+ }
+ } else {
+ MylarStatusHandler.log("task list save attempted before initialization", this);
+ }
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, "Could not save task list", true);
+ }
+ }
+
+ public TaskList getTaskList() {
+ return taskList;
+ }
+
+ public void setTaskList(TaskList taskList) {
+ this.taskList = taskList;
+ }
+
+ public void moveToRoot(ITask task) {
+ if (task.getCategory() instanceof TaskCategory) {
+ ((TaskCategory) task.getCategory()).removeTask(task);
+ }
+// task.setCategory(null);
+// if (!taskList.getRootTasks().contains(task))
+ taskList.internalAddRootTask(task);
+ for (ITaskActivityListener listener : listeners)
+ listener.taskListModified();
+ }
+
+ public void moveToCategory(TaskCategory category, ITask task) {
+ if(category.equals(taskList.getRootCategory())) {
+ moveToRoot(task);
+ } else {
+ taskList.removeFromRoot(task);
+ }
+ if (task.getCategory() instanceof TaskCategory) {
+ ((TaskCategory) task.getCategory()).removeTask(task);
+ }
+ if (!category.getChildren().contains(task)) {
+ category.addTask(task);
+ }
+ task.setCategory(category);
+ for (ITaskActivityListener listener : listeners)
+ listener.taskListModified();
+ }
+
+ public void addCategory(ITaskContainer cat) {
+ taskList.addCategory(cat);
+ for (ITaskActivityListener listener : listeners)
+ listener.taskListModified();
+ }
+
+ public void removeFromCategory(TaskCategory category, ITask task) {
+ if (!category.isArchive()) {
+ category.removeTask(task);
+ task.setCategory(null);
+ }
+ for (ITaskActivityListener listener : listeners)
+ listener.taskListModified();
+ }
+
+ public void removeFromRoot(ITask task) {
+ taskList.removeFromRoot(task);
+ for (ITaskActivityListener listener : listeners)
+ listener.taskListModified();
+ }
+
+ public void addQuery(AbstractRepositoryQuery cat) {
+ taskList.addQuery(cat);
+ for (ITaskActivityListener listener : listeners)
+ listener.taskListModified();
+ }
+
+ public void deleteTask(ITask task) {
+ TaskActivityTimer taskTimer = timerMap.remove(task);
+ if (taskTimer != null)
+ taskTimer.stopTimer();
+ taskList.setActive(task, false);
+ taskList.deleteTask(task);
+ for (ITaskActivityListener listener : listeners)
+ listener.taskListModified();
+ }
+
+ public void deleteCategory(ITaskContainer cat) {
+ taskList.deleteCategory(cat);
+ for (ITaskActivityListener listener : listeners)
+ listener.taskListModified();
+ }
+
+ public void deleteQuery(AbstractRepositoryQuery query) {
+ taskList.deleteQuery(query);
+ for (ITaskActivityListener listener : listeners)
+ listener.taskListModified();
+ }
+
+ public void addListener(ITaskActivityListener listener) {
+ listeners.add(listener);
+ }
+
+ public void removeListener(ITaskActivityListener listener) {
+ listeners.remove(listener);
+ }
+
+ /**
+ * Deactivates previously active tasks if not in multiple active mode.
+ *
+ * @param task
+ */
+ public void activateTask(ITask task) {
+ if (!MylarTaskListPlugin.getDefault().isMultipleActiveTasksMode()) {
+ for (ITask activeTask : new ArrayList<ITask>(taskList.getActiveTasks())) {
+ deactivateTask(activeTask);
+ }
+ }
+ taskList.setActive(task, true);
+ int timeout = MylarPlugin.getContextManager().getInactivityTimeout();
+ TaskActivityTimer activityTimer = new TaskActivityTimer(task, timeout, timerSleepInterval);
+ activityTimer.startTimer();
+ timerMap.put(task, activityTimer);
+ for (ITaskActivityListener listener : new ArrayList<ITaskActivityListener>(listeners)) {
+ listener.taskActivated(task);
+ }
+ }
+
+ public void deactivateTask(ITask task) {
+ TaskActivityTimer taskTimer = timerMap.remove(task);
+ if (taskTimer != null)
+ taskTimer.stopTimer();
+ taskList.setActive(task, false);
+ for (ITaskActivityListener listener : new ArrayList<ITaskActivityListener>(listeners)) {
+ listener.taskDeactivated(task);
+ }
+ }
+
+ /**
+ * TODO: refactor into task deltas?
+ */
+ public void notifyLocalInfoChanged(ITask task) {
+ for (ITaskActivityListener listener : new ArrayList<ITaskActivityListener>(listeners)) {
+ listener.localInfoChanged(task);
+ }
+ }
+
+ public void notifyRepositoryInfoChanged(ITask task) {
+ for (ITaskActivityListener listener : new ArrayList<ITaskActivityListener>(listeners)) {
+ listener.repositoryInfoChanged(task);
+ }
+ }
+
+ public void notifyListUpdated() {
+ for (ITaskActivityListener listener : new ArrayList<ITaskActivityListener>(listeners)) {
+ listener.taskListModified();
+ }
+ }
+
+ public void setTaskListFile(File f) {
+ this.taskListFile = f;
+ }
+
+ public ITask getTaskForHandle(String handle, boolean lookInArchives) {
+ if (handle == null)
+ return null;
+ return taskList.getTaskForHandle(handle, lookInArchives);
+ }
+
+
+ public boolean isTaskListInitialized() {
+ return taskListInitialized;
+ }
+
+ public TaskListWriter getTaskListWriter() {
+ return taskListWriter;
+ }
+
+ public File getTaskListFile() {
+ return taskListFile;
+ }
+
+ /**
+ * Public for testing
+ */
+ public Map<ITask, TaskActivityTimer> getTimerMap() {
+ return timerMap;
+ }
+
+ public void markComplete(ITask task, boolean complete) {
+ task.setCompleted(complete);
+ for (ITaskActivityListener listener : new ArrayList<ITaskActivityListener>(listeners)) {
+ listener.localInfoChanged(task); // to ensure comleted filter notices
+ }
+ }
+
+ /**
+ * For testing
+ */
+ public void setTimerSleepInterval(int timerSleepInterval) {
+ this.timerSleepInterval = timerSleepInterval;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskRepository.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskRepository.java
new file mode 100644
index 000000000..595ac9ea5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskRepository.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * 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.mylar.provisional.tasklist;
+
+import java.net.URL;
+import java.util.Map;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskRepository {
+
+ public static final String AUTH_PASSWORD = "org.eclipse.mylar.tasklist.repositories.password"; //$NON-NLS-1$
+
+ public static final String AUTH_USERNAME = "org.eclipse.mylar.tasklist.repositories.username"; //$NON-NLS-1$
+
+ private static final String AUTH_SCHEME = "Basic";
+
+ private static final String AUTH_REALM = "";
+
+ private URL serverUrl;
+
+ private String kind;
+
+ public TaskRepository(String kind, URL serverUrl) {
+ this.serverUrl = serverUrl;
+ this.kind = kind;
+ }
+
+ public URL getUrl() {
+ return serverUrl;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Map<String, String> getCredentials() {
+ return Platform.getAuthorizationInfo(serverUrl, AUTH_REALM, AUTH_SCHEME);
+ }
+
+ public boolean hasCredentials() {
+ String username = getUserName();
+ String password = getPassword();
+ return username != null && !username.equals("") && password != null && !password.equals("");
+ }
+
+ @SuppressWarnings("unchecked")
+ public String getUserName() {
+ Map<String, String> map = Platform.getAuthorizationInfo(serverUrl, AUTH_REALM, AUTH_SCHEME);
+ if (map != null && map.containsKey(AUTH_USERNAME)) {
+ return map.get(AUTH_USERNAME);
+ } else {
+ return null;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public String getPassword() {
+ Map<String, String> map = Platform.getAuthorizationInfo(serverUrl, AUTH_REALM, AUTH_SCHEME);
+ if (map != null && map.containsKey(AUTH_PASSWORD)) {
+ return map.get(AUTH_PASSWORD);
+ } else {
+ return null;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void setAuthenticationCredentials(String username, String password) {
+ Map<String, String> map = Platform.getAuthorizationInfo(serverUrl, AUTH_REALM, AUTH_SCHEME);
+
+ if (map == null) {
+ map = new java.util.HashMap<String, String>();
+ }
+
+ if (username != null) {
+ map.put(AUTH_USERNAME, username);
+ }
+ if (password != null) {
+ map.put(AUTH_PASSWORD, password);
+ }
+ try {
+ // write the map to the keyring
+ Platform.addAuthorizationInfo(serverUrl, AUTH_REALM, AUTH_SCHEME, map);
+ } catch (CoreException e) {
+ MylarStatusHandler.fail(e, "could not set authorization", true);
+ }
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (serverUrl != null && object instanceof TaskRepository) {
+ return serverUrl.equals(((TaskRepository) object).getUrl());
+ } else {
+ return super.equals(object);
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ if (serverUrl != null) {
+ return serverUrl.hashCode();
+ } else {
+ return super.hashCode();
+ }
+ }
+
+ public String toString() {
+ return serverUrl.toExternalForm();
+ }
+
+ public String getKind() {
+ return kind;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskRepositoryManager.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskRepositoryManager.java
new file mode 100644
index 000000000..dfa49cd5d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/TaskRepositoryManager.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.mylar.provisional.tasklist;
+
+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.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.eclipse.mylar.internal.core.MylarContextManager;
+import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskRepositoryManager {
+
+ public static final String PREF_REPOSITORIES = "org.eclipse.mylar.tasklist.repositories.";
+
+ private Map<String, AbstractRepositoryClient> repositoryClients = new HashMap<String, AbstractRepositoryClient>();
+
+ private Map<String, Set<TaskRepository>> repositoryMap = new HashMap<String, Set<TaskRepository>>();
+
+ private Set<ITaskRepositoryListener> listeners = new HashSet<ITaskRepositoryListener>();
+
+ public static final String MESSAGE_NO_REPOSITORY = "No repository available, please add one using the Task Repositories view.";
+
+ public static final String PREFIX_LOCAL_OLD = "task-";
+
+ public static final String PREFIX_LOCAL = "local-";
+
+ public static final String PREFIX_REPOSITORY_OLD = "Bugzilla";
+
+ public static final String MISSING_REPOSITORY_HANDLE = "norepository" + MylarContextManager.CONTEXT_HANDLE_DELIM;
+
+ private static final String PREF_STORE_DELIM = ", ";
+
+ public Collection<AbstractRepositoryClient> getRepositoryClients() {
+ return Collections.unmodifiableCollection(repositoryClients.values());
+ }
+
+ public AbstractRepositoryClient getRepositoryClient(String kind) {
+ return repositoryClients.get(kind);
+ }
+
+ public void addRepositoryClient(AbstractRepositoryClient repositoryClient) {
+ if (!repositoryClients.values().contains(repositoryClient)) {
+ repositoryClients.put(repositoryClient.getKind(), repositoryClient);
+ }
+ }
+
+ public void removeRepositoryClient(AbstractRepositoryClient repositoryClient) {
+ repositoryClients.remove(repositoryClient);
+ }
+
+ public void addRepository(TaskRepository repository) {
+ Set<TaskRepository> repositories;
+ if (!repositoryMap.containsKey(repository.getKind())) {
+ repositories = new HashSet<TaskRepository>();
+ repositoryMap.put(repository.getKind(), repositories);
+ } else {
+ repositories = repositoryMap.get(repository.getKind());
+ }
+ repositories.add(repository);
+ saveRepositories();
+ }
+
+ public void removeRepository(TaskRepository repository) {
+ Set<TaskRepository> repositories = repositoryMap.get(repository.getKind());
+ if (repositories != null) {
+ repositories.remove(repository);
+ }
+ saveRepositories();
+ }
+
+ public void addListener(ITaskRepositoryListener listener) {
+ listeners.add(listener);
+ }
+
+ public void removeListener(ITaskRepositoryListener listener) {
+ listeners.remove(listener);
+ }
+
+ public TaskRepository getRepository(String kind, String urlString) {
+ if (repositoryMap.containsKey(kind)) {
+ for (TaskRepository repository : repositoryMap.get(kind)) {
+ if (repository.getUrl().toExternalForm().equals(urlString)) {
+ return repository;
+ }
+ }
+ }
+ return null;
+ }
+
+ public Set<TaskRepository> getRepositories(String kind) {
+ if (repositoryMap.containsKey(kind)) {
+ return repositoryMap.get(kind);
+ } else {
+ return Collections.emptySet();
+ }
+ }
+
+ public List<TaskRepository> getAllRepositories() {
+ List<TaskRepository> repositories = new ArrayList<TaskRepository>();
+ for (AbstractRepositoryClient repositoryClient : repositoryClients.values()) {
+ if (repositoryMap.containsKey(repositoryClient.getKind())) {
+ repositories.addAll(repositoryMap.get(repositoryClient.getKind()));
+ }
+ }
+ return repositories;
+ }
+
+ public TaskRepository getRepositoryForActiveTask(String repositoryKind) {
+ List<ITask> activeTasks = MylarTaskListPlugin.getTaskListManager().getTaskList().getActiveTasks();
+ if (activeTasks.size() == 1) {
+ ITask activeTask = activeTasks.get(0);
+ if (!activeTask.isLocal()) {
+ String repositoryUrl = AbstractRepositoryTask.getRepositoryUrl(activeTask.getHandleIdentifier());
+ for (TaskRepository repository : getRepositories(repositoryKind)) {
+ if (repository.getUrl().toExternalForm().equals(repositoryUrl)) {
+ return repository;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 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 values = repositoryMap.values();
+ if (!values.isEmpty()) {
+ HashSet repoistorySet = (HashSet) values.iterator().next();
+ return (TaskRepository) repoistorySet.iterator().next();
+ }
+ }
+ return null;
+ }
+
+ public Map<String, Set<TaskRepository>> readRepositories() {
+ for (AbstractRepositoryClient repositoryClient : repositoryClients.values()) {
+ String read = MylarTaskListPlugin.getPrefs().getString(PREF_REPOSITORIES + repositoryClient.getKind());
+ Set<TaskRepository> repositories = new HashSet<TaskRepository>();
+ if (read != null) {
+ StringTokenizer st = new StringTokenizer(read, PREF_STORE_DELIM);
+ while (st.hasMoreTokens()) {
+ String urlString = st.nextToken();
+ try {
+ URL url = new URL(urlString);
+ repositoryMap.put(repositoryClient.getKind(), repositories);
+ repositories.add(new TaskRepository(repositoryClient.getKind(), url));
+ } catch (MalformedURLException e) {
+ MylarStatusHandler.fail(e, "could not restore URL: " + urlString, false);
+ }
+ }
+ }
+ }
+ for (ITaskRepositoryListener listener : listeners) {
+ listener.repositorySetUpdated();
+ }
+ return repositoryMap;
+ }
+
+ private void saveRepositories() {
+ for (AbstractRepositoryClient repositoryClient : repositoryClients.values()) {
+ if (repositoryMap.containsKey(repositoryClient.getKind())) {
+ String repositoriesToStore = "";
+ for (TaskRepository repository : repositoryMap.get(repositoryClient.getKind())) {
+ repositoriesToStore += repository.getUrl().toExternalForm() + PREF_STORE_DELIM;
+ }
+ String prefId = PREF_REPOSITORIES + repositoryClient.getKind();
+ MylarTaskListPlugin.getPrefs().setValue(prefId, repositoriesToStore);
+ }
+ }
+
+ for (ITaskRepositoryListener listener : listeners) {
+ listener.repositorySetUpdated();
+ }
+ }
+
+ /**
+ * For testing.
+ */
+ public void clearRepositories() {
+ repositoryMap.clear();
+ for (AbstractRepositoryClient repositoryClient : repositoryClients.values()) {
+ String prefId = PREF_REPOSITORIES + repositoryClient.getKind();
+ MylarTaskListPlugin.getPrefs().setValue(prefId, "");
+ }
+ }
+}

Back to the top