如果我們在Eclipse RCP程式中新增TaskList View,用來管理Task或者TODO項,如下程式碼:

PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
.showView("org.eclipse.ui.views.TaskList");

 

我們發現,建立的Task,在重啟之後無法儲存,而在Eclipse IDE中卻不會有這個問題. 在閱讀org.eclipse.ui.internal.views.markers.TasksView的程式碼後,我發現TasksView在程式退出時,只負責儲存TasksView的佈局資訊。那麼,需要怎麼儲存新增的Task呢?

如何儲存TaskList

原來Task的本質是Marker,並不是儲存在TasksView中,而是和Resource相關聯,儲存在IResource物件中。在RCP程式中,儲存Marker需要呼叫IWorkspace的save方法,可以在preShutdown中呼叫,如下程式碼:

	@Override
public boolean preShutdown() { /* Save workspace before closing the application */
final MultiStatus status = new MultiStatus(
"com.voxana.vuidesigner.diagram", 0, "Saving Workspace....",
null);
IRunnableWithProgress runnable = new IRunnableWithProgress() { @Override
public void run(final IProgressMonitor monitor) {
try {
IWorkspace ws = ResourcesPlugin.getWorkspace();
status.merge(ws.save(true, monitor));
} catch (CoreException e) {
status.merge(e.getStatus());
}
}
};
try {
new ProgressMonitorDialog(null).run(false, false, runnable);
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
if (!status.isOK()) {
ErrorDialog.openError(Display.getDefault().getActiveShell(),
"Error...", "Error while saving workspace", status);
return true;
}
return true;
}

獲取TaskList

如前面所說,Task(Marker的其中一種型別)是和Resource關聯,儲存在IResource中的。我們可以通過以下程式碼來獲取所有Task:

IResource root =  ResourcesPlugin.getWorkspace().getRoot();
String TypeId = "org.eclipse.core.resources.taskmarker";
IMarker[] markers = resource.findMarkers(TypeId, true, IResource.DEPTH_INFINITE);

 

其中,第一個引數TypeId指定要獲取的Marker型別;第二個引數指定是否搜尋子節點的Marker;第三個引數指定搜尋的深度。

在獲取了IMarker後,即可通過getAttribute或者getAttributes方法來獲取引數

 

參考

https://gama-platform.googlecode.com/svn-history/r4005/branches/GAMA_CURRENT/msi.gama.application/src/msi/gama/gui/swt/ApplicationWorkbenchAdvisor.java

http://www.eclipse.org/forums/index.php/t/106705/

http://wiki.eclipse.org/FAQ_How_and_when_do_I_save_the_workspace%3F

org.eclipse.ui.internal.views.markers.MarkerContentGenerator class internalGatherMarkers method