如果我們在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方法來獲取引數
參考
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