번역 문서 저작권 표시 :
저작자표시-비영리-동일조건 변경 허락 (CC BY-NC-SA)
원문 저작권 표시 :
(ExtensionsAdding menus, toolbar and popup menus to the Eclipse IDE, by Lars Vogel, (c) 2009 - 2020 vogella GmbH Version 3.2, 29.08.2016
, CC BY-NC-SA )
소스 코드의 경우 Eclipse Public License 2.0 를 따른다.

[원문 출처] www.vogella.com/tutorials/EclipseCommands/article.html


해당 문서의 경우 vogella사의 Eclipse IDE Extensions 
Document 문서 일부를 번역 한 것입니다. 
번역본인 해당 문서의 경우 역자에게 있음을 알리며 상업적 이용을 불허합니다. 
번역 작업 시 이클립스 내 고유이름을 가진 값의 경우, 가령 Tab의 명칭 등의 경우 화면에서 표시되는 이름이므로 별도로 번역없이 제공하거나 괄호를 사용하여 동시에 명기한다.
저작자표시-비영리-동일조건 변경 허락 (BY-NC-SA)

www.sogomsoft.co.kr (주) 소곰소프트 

1. 커멘드 소개

이클립스 프레임워크는 사용자 인터페이스에 액션을 기여하기 위해 커멘트 프레임워크를 사용한다. 

이클립스에서 커멘드는 컴포넌트의 선언적 기술이며 구현 상세로 부터 독립적이다. 

커멘드는 카테고리화 될 수 있고 사용자 인터페이스에 할당 될 수 있고 키 바인딩은 커멘드를 위해 정의 될 수 있다. 핸들러를 통해 커멘드의 동작이 정의 된다. 

1.1. 이클립스 3.x API로 커멘트 정의하기

이클립스3.x API는 커멘드를 정의하기 위해 확장점(extension points)을 사용한다. 3 확장점이 여기서 역할을 수행한다. 다음 확장점(extension points)은 이클립스 플러그인을 위해 메뉴 또는 툴바 컨트리뷰션을 정의 하는데 관련 있다. 

표 1. 확장점 설명

확장점(Extension point)

상세 설명

org.eclipse.ui.command

커멘드를 선언적으로 기술한다.

org.eclipse.ui.handlers

동작 정의 한다. 즉, 호출 되어야 하는 Java 클래스

org.eclipse.ui.menu

사용자 인터페이스에서 커멘트가 포함 되어야 하는 위치와 방법 즉, 메뉴, 팝업 메뉴, 툴바 등등.

2.2. 메뉴 확장점의 위치 정의 하기

커멘드의 위치를 정의 할 수있다. 예를들면, 저장(Save) 메뉴 엔트리 다음에 전체 저장(Save All) 메뉴 엔트리가 위치해야 한다. "?before=ID" 또는 "?after=ID" 같은 패턴을 사용함으로써 이 로케이션URL(locationURI)에 커멘드의 상대적 위치를 정의 할 수 있다. .

ID는 menu ID, 또는 item ID 같은 존재 하는 구별자 이름이 될 수 있다. 커멘드는 상응하는 ID로 에리먼트의 앞과 뒤에 놓일 수 있다.

예를 들면, oneEntry 메뉴 엔트리 앞에 fileMenu 메뉴에서 커멘드를 놓기 위해, menu:fileMenu?after=oneEntry 로케이션URI(locationURI)를 사용한다.

3. 핸들러(Handler)

3.1. 커멘드 핸들러

org.eclipse.ui.handlers 확장점(extension point)은 커멘드가 실행될때 한번 호출 되는 어떤 클래스에 커멘드를 연결한다.

커멘드의 동작은 핸들러를 통해서 정의된다. 핸들러(handler)는 커멘드가 호출 될때 한번 실행되는 클래스이다. org.eclipse.core.commands 패키지로 부터 IHandler 인터페이스를 구현 해야 한다. .

IHandler 인터페이스 기본 구현체로 제공되는 org.eclipse.core.commands.AbstractHandler 클래스를 확장 할 수 있다.

핸들러가 실행되면 execute() 메서드가 호출된다. 

execute() 메서드에서 HandlerUtil 클래스를 통해서 시스템 값에 접근 할 수있다. 

3.2. 핸들러의 효력

핸들러는 핸들러가 커멘트에 유효한지에 따라 정의된 조건하에서 조건(activeWhen)으로 정의 될 수 있다. 커멘트들 위해 여러 핸들러들이 정의 될 수 있다. 단지 하나의 핸들러가 어떤 조건의 커멘드를 위해 유효 할 수 있고, 만약 여러개 핸들러가 유효하다면, 이클립스 런타임은 그 커멘드를 비활성화 한다. (역자주, 여러개의 핸들러와 매핑될 수 있지만 하나의 핸들러만 유효해야 하고 여러 핸들러가 유효한 상태이면 그 커멘드가 비활성화 된다.)

4. 튜토리얼의 전제조건

이 튜토리얼은 이클립스 플랫폼 개발의 기본적 이해를 가지고 있다는 것을 가정한다. 만약 기본 정보를 필요로 하면 Eclipse RCP Tutorial 또는 Eclipse Plug-in Tutorial 을 보라.

5. 튜토리얼: 커멘드(Commands )와 메뉴(menus) 

5.1. 연습: 커멘드 정의하기

이 연습에서 어플르케이션을 빠져나오기 위해 허용하는 커멘드를 생성한다. 새 RCP project "Hello RCP" 템플릿을 사용하여 "de.vogella.rcp.commands.first" 생성하라. plugin.xml을 열고 확장(Extensions) 탭을 선택하라. Add…​ 버튼을 눌러라.

확장 "org.eclipse.ui.commands"를 검색하고, 해당 확장을 선택하고 finish버튼을 누른다.

확장(extension)을 오른쪽 마우스 클릭하고 New → command를 선택함으로써 새 커멘드를 생성한다.

단지 "Generic" 엔트리만 보인다면,  아마 "Eclipse for RCP/Plug-in Developers"를 다운로드 하지 않은 것이 분명하다. Eclipse Installation를 보라.

"de.vogella.rcp.commands.first.commands.Exit"를 id*인 ID 항목에 "Exit"를 name*인 이름 항목에 설정한다. defaultHandler인 기본핸들러 항목에 "de.vogella.rcp.commands.first.commands.ExitHandler" 클래스를 넣는다..

"org.eclipse.core.commands.AbstractHandler"를 확장해야 하는 클래스를 생성해야 하기 위해 "defaultHandler" 하이퍼 링크를 누른다.

package de.vogella.rcp.commands.first.commands; 

import org.eclipse.core.commands.AbstractHandler; 
import org.eclipse.core.commands.ExecutionEvent; 
import org.eclipse.core.commands.ExecutionException; 
import org.eclipse.ui.handlers.HandlerUtil; 

public class ExitHandler extends AbstractHandler { 
	
    @Override 
    public Object execute(ExecutionEvent event) throws ExecutionException { 
    	HandlerUtil.getActiveWorkbenchWindow(event).close(); 
        return null; 
    } 
}

5.2. 메뉴에서 커멘드 사용하기 

정의된 커멘드는메뉴에서 사용되어야 한다. org.eclipse.ui.menus 확장점(extension point)에 확장(extension)을 추가한다. 확장점(extension point)에 오른쪽 마우스 클릭하고 New > menuContribution.을 선택한다. 

"menu:org.eclipse.ui.main.menu" 로케이션URI(locationURI)로 새 메뉴 컨트리 뷰션을 생성한다. URL이 정확한 스펠링으로 되어 있는지 확인하라 아니면 그 메뉴가 보여지지 않게 될 것이다. 

메뉴컨트리뷰션(menucontribution)에 오른쪽 클릭하고 New > Menu를 선택하라. label*인 라벨 항목에 "File" 과 id 인 ID 항목에 "fileMenu"로 메뉴를 추가 하라.

 메류를 선택하고, 그 메뉴에 오른쪽 마우스 클릭하고, New→ Command를 선택한다. commandID를 지정하라. "Exit"를 라벨 항목에 "Exits the application"를 툴팁 항목에 설정하라..

plugin.xml 파일에 다음과 예제와 같이 보이는 결과가 만들어져야 한다. 

<?xml version="1.0" encoding="UTF-8"?> 
<?eclipse version="3.4"?> 
<plugin> 
   	<extension id="application" point="org.eclipse.core.runtime.applications"> 
       	<application> 
           	<run class="de.vogella.rcp.commands.first.Application"> 
               </run> 
           </application> 
    </extension> 
	<extension point="org.eclipse.ui.perspectives"> 
       	<perspective name="RCP Perspective" 
           			class="de.vogella.rcp.commands.first.Perspective" 
                    id="de.vogella.rcp.commands.first.perspective"> 
        </perspective> 
    </extension> 
    <extension point="org.eclipse.ui.commands"> 
      	<command defaultHandler="de.vogella.rcp.commands.first.commands.ExitHandler" 
           		id="de.vogella.rcp.commands.first.commands.Exit" 
                name="Exit"> 
        </command> 
    </extension> 
    <extension point="org.eclipse.ui.menus"> 
       	<menuContribution locationURI="menu:org.eclipse.ui.main.menu"> 
           	<menu id="fileMenu" label="File"> 
               	<command commandId="de.vogella.rcp.commands.first.commands.Exit" 
                   		label="Exit" style="push" 
                        tooltip="Exit the application"> 
                </command> 
            </menu> 
         </menuContribution> 
    </extension> 
 </plugin>

예제를 실행하면. 파일 메뉴가 보여야 하고 "Exit" 엔트리를 선택하면 어플리케이션이 종료된다.

6. Tutorial: 커멘드(Commands) 와 툴바(toolbars)

6.1. 개요

어플리케이션 툴바와 뷰 툴바에 커멘드를 추가 할 수 있다. 

6.2. 어플리케이션 툴바 (coolbar)

"de.vogella.rcp.intro.commands.toolbar" 이름의 새 프로젝트를 생성한다. 탬플릿 "RCP application with a view" 을 사용한다. "de.vogella.rcp.intro.commands.toolbar.handler.Hello"을 기본 핸들러로  "de.vogella.rcp.intro.commands.toolbar.Hello" 커멘드를 생성한다. 이 핸들러가 JFace 다이얼로그를 연다.

package de.vogella.rcp.intro.commands.toolbar.handler; 

import org.eclipse.core.commands.AbstractHandler; 
import org.eclipse.core.commands.ExecutionEvent; 
import org.eclipse.core.commands.ExecutionException; 
import org.eclipse.jface.dialogs.MessageDialog; 
import org.eclipse.ui.handlers.HandlerUtil; 

public class Hello extends AbstractHandler { 

	@Override 
    public Object execute(ExecutionEvent event) throws ExecutionException { 
    	MessageDialog.openInformation(HandlerUtil.getActiveWorkbenchWindow( event).getShell(), "Info", "Info for you"); 
        return null; 
    } 
}

"org.eclipse.ui.menus extension" 확장에 메뉴컨트리뷰션(menucontribution)을 추가한 후 "toolbar:org.eclipse.ui.main.toolbar"에 로케이션 URI(location URI)을 설정한다.  앞서 생성한 메뉴 컨트리뷰션에 자식 엘리먼트로 툴바를 추가한다.

툴바에 "de.vogella.rcp.intro.commands.toolbar.Hello" 커멘드를 추가한다. 그 커멘트에 라벨과 아이콘을 작성한다.

ApplicationWorkbenchWindowAdvisor 의 configurer.setShowCoolBar(true); 메서드 호출을 통해 어플리케이션 툴바를 활성화 시킨다.

package de.vogella.rcp.intro.commands.toolbar; 

import org.eclipse.swt.graphics.Point; 
import org.eclipse.ui.application.ActionBarAdvisor; 
import org.eclipse.ui.application.IActionBarConfigurer; 
import org.eclipse.ui.application.IWorkbenchWindowConfigurer; 
import org.eclipse.ui.application.WorkbenchWindowAdvisor; 

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(400, 300)); 
        configurer.setShowStatusLine(false); 
        configurer.setShowCoolBar(true); 
        configurer.setTitle("RCP Application"); 
    } 
}

결과는 다음처럼 보이게 된다. 만약 툴바에 엘리먼트를 선택하면 정보 대화창이 열려야 한다.

6.3. 뷰툴바에 기여

뷰 툴바에 직접적으로 커멘드를 추가할 수 있다. 그 것을 위해 이전 예제를 확장한다.  다음에  IPerspectiveFactory를 상속 받은 퍼스펙티브("Perspective") 클래스를 변경하라 (단독 실행(스탠드-얼론, stand-alone) 뷰는 자신의 툴바를 가지지 않는다.).

package de.vogella.rcp.intro.commands.toolbar; 

import org.eclipse.ui.IPageLayout; 
import org.eclipse.ui.IPerspectiveFactory; 

public class Perspective implements IPerspectiveFactory { 

	public void createInitialLayout(IPageLayout layout) { 
    	String editorArea = layout.getEditorArea(); 
        layout.setEditorAreaVisible(false); 
        layout.setFixed(true); layout.addView(View.ID, IPageLayout.LEFT, 1.0f, editorArea); 
    }
}

"toolbar:de.vogella.rcp.intro.commands.toolbar.view" 값을 locationURI: 항목에 로케이션 URI를 사용하는 "org.eclipse.ui.menus" 확장점에 새 메뉴컨트리뷰션을 생성한다.  여기에 toolbar: 접두사는 툴바에 방금 생성한 메뉴컨트리뷰션 추가하기 위해 시스템을 말하고 두번째 인수는 그 뷰의 ID이다. 

이 메뉴컨트리뷰션을 위해 새 커멘드를 생성하고 "de.vogella.rcp.intro.commands.toolbar.Hello"로 커멘드 ID를 설정한다. 그 커멘드의 라벨에 "Say Hello"를 입력한다.

새 뷰 컨트리뷰션을 보기위해 어플리케이션을 실행하라.

다음은 어플리케이션 쿨바에 드롭다운 목록을 추가한다. 

이 드롭다운 목록 결과물은 약간 낮설다. 나중에 다른 (실제) 커멘드가 할당되게 될 드롭다운 커멘드 핼퍼(도우미)를 생성한다.

따라서 "referenceToMenuId" 값을 ID로 커멘드를 생성하고 기본 핸들러를 관리 한다. 예를 들면,  "de.vogella.rcp.intro.commands.toolbar.handler.Hello"를 재사용할 수 있다.

"org.eclipse.ui.menus" 확장점에 새 메뉴컨트리뷰션을 추가하고, 그 컨트리뷰션에 "toolbar:org.eclipse.ui.main.toolbar"를 로케이션 URI(location URI)를 설정한다. 새 확장에 툴바와 그 툴바에 새 커멘드를 추가한다. 그 커멘드에 ID는 referenceToMenuId를 사용하는 ID에 라벨과 아이컨을 부여하고  "pulldown"로 스타일을 변경한다.

As the id use referenceToMenuId give it a label and an icon and change the style to "pulldown".

새 메뉴컨트리뷰션을 생성하고 "menu:referenceToMenuId"을 로케이션 URI(locationURI)로 설정한다.

referenceToMenuId 는 커멘트데서 앞서 사용했던 ID 이다. 

이 풀다운 메뉴에 존재하는 커멘드 "de.vogella.rcp.intro.commands.toolbar.Hello"를 각각 다른 라벨을 사용하여 2번 추가한다. 

어플리케이션을 실행하면, 이제 어플리케이션 툴바에 드롭다운 메뉴를 가지게 된다. 

뷰에 드롭다운 메뉴를 얻기 위해, 기존 뷰 툴바 컨트리뷰션에  "referenceToMenuId" 커멘드를 추가하라. 

7. 튜토리얼: 커멘드와 컨텍스트 메뉴

이 예제에서 SWT 테이블 위젯에 컨텍스트 메뉴를 추가한다. "RCP application with a view" 샘플을 기반으로 de.vogella.rcp.intro.commands.popup 이름의 새 프로젝트를 생성한다.

"de.vogella.rcp.intro.commands.popup.showSelected" ID 와 "Show" 라는 이름으로 새 커멘드를 생성한다.

이 예제에서 기본 핸들러를 사용하지 않게 될 것이다.  따라서 plugin.xml 파일에 "org.eclipse.ui.handlers" 확장점을 추가 하고 핸들러를 추가한다. 첫번째 파리미터는 커멘드ID(commandId)이고 두번째 파라미터는 핸들러를 위한 클래스이다. 클래스 이름으로 de.vogella.rcp.intro.commands.popup.handler.ShowSelected를 사용한다.

이제 핸들러에 이 소스를 구현한다. 이 소스는 단지 콘솔에 선택된 엘리먼트를 출력한다. 

package de.vogella.rcp.intro.commands.popup.handler; 

import java.util.Iterator; 
import org.eclipse.core.commands.AbstractHandler; 
import org.eclipse.core.commands.ExecutionEvent; 
import org.eclipse.core.commands.ExecutionException; 
import org.eclipse.jface.viewers.ISelection; 
import org.eclipse.jface.viewers.IStructuredSelection; 
import org.eclipse.ui.handlers.HandlerUtil; 

public class ShowSelected extends AbstractHandler { 
	
    @SuppressWarnings("unchecked") 
    @Override 
    public Object execute(ExecutionEvent event) throws ExecutionException { 
    
    	ISelection selection = HandlerUtil.getActiveWorkbenchWindow(event) .getActivePage().getSelection(); 
        
        if (selection != null & selection instanceof IStructuredSelection) { 
        	IStructuredSelection strucSelection = (IStructuredSelection) selection; 
            for (Iterator<Object> iterator = strucSelection.iterator(); iterator.hasNext();) { 
            	Object element = iterator.next(); 
            	System.out.println(element.toString()); 
            } 
        } 
        
        return null; 
    } 
    
}

자동적으로 생성되게 될 뷰의 ID가 "de.vogella.rcp.intro.commands.popup.view" 인 곳에  "popup:de.vogella.rcp.intro.commands.popup.view" 로 로케이션 URI를 설정한 새 메뉴컨트리뷰션을 추가한다.

새 메뉴컨트리뷰션을 오른쪽 마우스 클릭하고 New → Command를 선택한다. Assign your command to the field "commandId" 필드에 커멘드를 지정하고. 라벨 필드에  "One Item selected" 을 입력한다.

이제 뷰에 메뉴관리자(MenuManager)를 추가했다. 뷰 클래스를 선택하고 다음처럼 변경한다. 

package de.vogella.rcp.intro.commands.popup; 

import java.util.ArrayList; 
import java.util.List; 
import org.eclipse.jface.action.MenuManager; 
import org.eclipse.jface.viewers.ArrayContentProvider; 
import org.eclipse.jface.viewers.LabelProvider; 
import org.eclipse.jface.viewers.TableViewer; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.graphics.Image; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.Menu; 
import org.eclipse.ui.ISharedImages; 
import org.eclipse.ui.PlatformUI; 
import org.eclipse.ui.part.ViewPart; 

public class View extends ViewPart { 

	private TableViewer viewer; 
    
    class ViewLabelProvider extends LabelProvider { 
    
        @Override 
        public Image getImage(Object obj) { 
        	return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT); 
        } 
        
    } 
    
    @Override 
    public void createPartControl(Composite parent) { 
    
    	viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); 
        viewer.setContentProvider(ArrayContentProvider.getInstance()); 
        viewer.setLabelProvider(new ViewLabelProvider()); 
        viewer.setInput(getData()); 
        
        // 메뉴 관리자를 생성하고 컨텍스트 메뉴를 생성한다. 
        MenuManager menuManager = new MenuManager(); 
        Menu menu = menuManager.createContextMenu(viewer.getTable()); 
        
        // SWT 위젯에 메뉴를 설정한다. 
        viewer.getTable().setMenu(menu); 
        
        // 프레임워크에 메뉴를 등록한다.  
        getSite().registerContextMenu(menuManager, viewer); 
        
        // 선택 가능한 뷰어를 만든다.
        getSite().setSelectionProvider(viewer); 
	
    } 
        
    /** 
      * 뷰어의 컨트롤에 포커스 요청을 전달한다.  
      */
    @Override 
    public void setFocus() { 
      	viewer.getControl().setFocus(); 
    } 
        
    private List<String> getData() { 
       	List<String> list = new ArrayList<String>(); 
        list.add("One"); 
        list.add("Two"); 
        list.add("Three"); 
            
        return list; 
    } 
    
}

어플리케이션을 실행하라. 테이블에 오른쪽 마우스 클랙을 수행하면, 메뉴가 볼수 있게 되어야 한다. 마약 그 메뉴를 선택하면,  선택된 아이템의 이름이 콘솔에 기록되어야 한다.

8.1. 이클립스 커멘드 리소스

Eclipse Commands Advanced

Key bindings for Commands

http://wiki.eclipse.org/Platform_Command_Framework Command Framework wiki

http://wiki.eclipse.org/Command_Core_Expressions Commands Core Expressions

+ Recent posts