1. 程式人生 > >eclipse rcp eclipse project選單的擴充套件的問題

eclipse rcp eclipse project選單的擴充套件的問題

rcp程式設計中,可以使用eclipse原有的project選單項來完成專案的新建,但是這樣這能先新增一個project檔案,裡面的檔案得自己新增,自定義的專案中往往包含一些自定義的檔案需要在專案新建時一併建立,所以我們考慮修改eclipse自定義的project選單

通常使用eclipse的project選單項是通過在ApplicationActionBarAdvisor類中,通過建立

private IWorkbenchAction projectAction ;

protected void makeActions(IWorkbenchWindow window) {
    projectAction = ActionFactory.NEW.create(window);
    projectAction .setText("新建xxx專案");
    register(projectAction );
}

protected void fillMenuBar(IMenuManager menuBar) {
    IMenuManager fileMenu = new MenuManager(TitleServer.TTEMenu_File, IWorkbenchActionConstants.M_FILE);
    IMenuManager newFileMenu = new MenuManager(TitleServer.TTEMenu_File_new, "new");
    newFileMenu .add(projectAction );
    fileMenu.add(newFileMenu);
}

這樣點選選單就可以建立一個空的專案,如下圖所示

這並不能達到我們的要求,因此我查看了ActionFactory.NEW的程式碼,明白了new action的呼叫是通過id,但是能力有限修改.class原始碼我不知道咋弄,也沒時間深入的研究,不過我發現了new action對應的commandId是org.eclipse.ui.newWizard

因此我就嘗試通過直接通過commandId呼叫new action,結果成功了

    IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getActiveWorkbenchWindow()
        .getActivePage().getActivePart().getSite().getService(IHandlerService.class);
    try {
        handlerService.executeCommand("org.eclipse.ui.newWizard", null);
    } catch (Exception ex) {
	    throw new RuntimeException("executing command error!");
    }

因此我在File選單上換掉了系統的action,自己重新定義了一個IAction類

private IWorkbenchAction projectAction ;

protected void fillMenuBar(IMenuManager menuBar) {
    IMenuManager fileMenu = new MenuManager(TitleServer.TTEMenu_File, IWorkbenchActionConstants.M_FILE);
    IMenuManager newFileMenu = new MenuManager(TitleServer.TTEMenu_File_new, "new");
    newFileMenu.add(new TTEProjectNew(window));
    fileMenu.add(newFileMenu);
}

在IAction類的runWithEvent(Event event)下通過commandId:org.eclipse.ui.newWizard呼叫並建立專案,在建立完專案之後再在此專案檔案中新建了自定義的檔案,並打開了自定義檔案對應的自定義編輯器

@Override
	public void runWithEvent(Event event) {
		// TODO Auto-generated method stub
		IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getActiveWorkbenchWindow()
				.getActivePage().getActivePart().getSite().getService(IHandlerService.class);
		try {
			handlerService.executeCommand("org.eclipse.ui.newWizard", null);
		} catch (Exception ex) {
			throw new RuntimeException("executing command error!");
		}
		// 獲取當前工作空間所有的工程
		IProject[] allProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
		if (allProjects.length > 0) {
			IProject newProject = allProjects[allProjects.length - 1];
			final String newProjectPath = newProject.getLocation().toFile().getAbsolutePath();
			System.out.println(newProject.getName());
			// 建立工程
			// 建立預設進度條實現
			NullProgressMonitor nullProgressMonitor = new NullProgressMonitor();
			final IFile file = newProject.getFile(new Path(Variable.defaultNetworkTopologyName));
			try {
				InputStream stream = openContentStream();
				if (file.exists()) {
					file.setContents(stream, true, true, nullProgressMonitor);
				} else {
					file.create(stream, true, nullProgressMonitor);
				}
				stream.close();
			} catch (CoreException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			//新建檔案後開啟編輯器
			shell.getDisplay().asyncExec(new Runnable() {
				public void run() {
					IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
					IEditorInput editorInput = new TopologyEditorInput(file.getName()
							,newProjectPath + "\\" + file.getProjectRelativePath().toString());
					// 查詢要開啟的編輯器物件
					IEditorPart editor = page.findEditor(editorInput);
					if (editor != null) {
						page.bringToTop(editor);
					} else {
						try {
							editor = page.openEditor(editorInput, Variable.editorID);
						} catch (PartInitException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}

				}
			});
		}
		
	}

執行結果如下: