Eclipse RCP를 개발하면서 Target을 3.6 이하 버전으로 사용하다가 3.7 이후 버전을 사용하도록 변경한다면 화면 상단 툴바에 Quick Access가 무조건 나타나면서 원치 않는 UI를 노출 시키는 문제가 발생합니다.  


Quick Access 노출을 조정할 수 있는 액션이나 메뉴가 없는 상태입니다. 4.4 버전부터는 만든다는 것 같지만 현재까진 해결책이 없네요.



Quick Access를 없애기 위한 해결책을 보도록 하겠습니다. 


1. 자신의 RCP에 plugin.xml에서 다음 패키지 의존성을 추가한다.

    • org.eclipse.e4.ui.model.workbench


2. ApplicationWorkbenchWindowAdvisor.java 파일에 다음 코드를 추가한다.

package com.billy.snippet.quickaccess;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimElement;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.application.WorkbenchWindowAdvisor;
import org.eclipse.ui.internal.WorkbenchWindow;
import org.eclipse.ui.progress.UIJob;

public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {

    public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
        super(configurer);
    }

    public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {
        return new ApplicationActionBarAdvisor(configurer);
    }
    
    public void preWindowOpen() {
        IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
        configurer.setInitialSize(new Point(600, 400));
        configurer.setShowCoolBar(true);
        configurer.setShowStatusLine(false);

        // This code
        hideQuickAccess();
    }

	private void hideQuickAccess() {
		UIJob job = new UIJob("Hide quick access") {
			@Override
			public IStatus runInUIThread(IProgressMonitor monitor) {
				IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
				if (window instanceof WorkbenchWindow) {
					MTrimBar topTrim = ((WorkbenchWindow) window).getTopTrim();
					for (MTrimElement element : topTrim.getChildren()) {
						if ("SearchField".equals(element.getElementId())) {
							element.setVisible(false);
							element.setToBeRendered(false);;
							break;
						}
					}
				}
				return Status.OK_STATUS;
			}
		};
		
		job.schedule();
	}
    
}


아래와 같이 Quick Access가 없어진 것을 보실 수 있습니다.



샘플 프로젝트 코드는 아래에서 받으면 됩니다.

removeQuickAccess.zip


Tip


Quick Access를 지우니, Toolbar layout이 흐트러 질때는 다음을 확인합니다.

    • 기여한 Toolbar action이 'main'에 추가되었나요?


protected void fillCoolBar(ICoolBarManager coolBar) {
	IToolBarManager toolbar = new ToolBarManager(SWT.FLAT | SWT.RIGHT);
	coolBar.add(new ToolBarContributionItem(toolbar, "main"));   // main
        //coolBar.add(toolbar);
	toolbar.add(openViewAction);
	toolbar.add(messagePopupAction);
}


위와 같이 main이 아닌 Toolbar를 단순히 coolBar에 추가하게 되면, Layout이 흐트러집니다. 


Posted by 빌리 :

Eclipse RCP 제품을 개발하면서 기존의 Eclipse관련 프로젝트 기능을 가져다 쓸때가 있다. P2 프로젝트 기능을 이용한 Update 기능 활용이 한 예이다.

Eclipse IDE를 이용해 RCP 개발을 하는데 P2 기존 기능을 사용할때 다음 실행 옵션을 활성화 해야 한다. 그렇지 않으면 Update 관련 기능 테스트 할 때 실제 빌드된 제품을 가지고 로그를 하나씩 하나씩 System.out.println()을 이용해 추적해야만 한다. 간단한 설정인데도 놓치기 쉽다.

변경을 해하는 곳은 다음과 같다.



메뉴 Run > Run Configuration > [빌드명] > Configuration > Software Installation 

                   > Support software installation in the launched application



  • 참고 사이트

- P2 Api 설명 자료
http://www.slideshare.net/PascalRapicault/discovering-the-p2-api

'개발자 > Eclipse SWT' 카테고리의 다른 글

Eclipse RCP에서 Quick Access 없애기  (0) 2013.08.25
Eclipse RCP - Command를 코드로 불러오기  (0) 2013.03.22
Posted by 빌리 :

Eclipse 플랫폼을 이용하여 Eclipse Plug-in 개발시 Command를 직접 호출할 경우가 생기는데 코드 상에서 어떻게 호출 할 수 있는지 설명한다. 

코드는 간단하다. 단순히 Workbench 객체에서 관련 Service 참조 객체를 얻어온 다음 메소드로 실행 시키면 된다.


private void sampleCode() {
	IHandlerService handlerService = 
                   (IHandlerService) getSite.getService(IHandlerService.class);
	try {
		handlerService.executeCommand("Command ID", null);
	} catch (ExecutionException e) {
		e.printStackTrace();
	} catch (NotDefinedException e) {
		e.printStackTrace();
	} catch (NotEnabledException e) {
		e.printStackTrace();
	} catch (NotHandledException e) {
		e.printStackTrace();
	}
}


  • 참고 사이트

http://wiki.eclipse.org/Platform_Command_Framework


Posted by 빌리 :