티스토리 뷰

이 글은 Platform Plug-in Developer Guide의 일부분을 제 관점에서 해석한 것에 지나지 않습니다혹시 문제가 된다면즉시 삭제 하도록 하겠습니다조금더 자세한 내용을 알고 싶거나오역으로 인해서 잘 이해가 가지 않는다면 아래의 레퍼런스를 참조하시기 바랍니다.

Title : Platform Plug-in Developer Guide
Section : The JFace UI framework, Actions and contributions

Reference : http://help.eclipse.org/help32/topic/org.eclipse.platform.doc.isv/guide/jface_actions.htm
                                                                                                                                                                      

Action class는 UI에서 어떻게 표현 될지에 관계없이 User의 명령(command)를 정의 할 수 있도록 해준다. 이런 방법을 통해서 개발하는 Plug-in에서 액션의 표현 방법이 바뀌더라도 코드의 변경없이 변화에 유연하게 대처 할 수 있다. 
Contribution Class는 사용자의 명령(Command)을 실제로 나타내기 위한 UI item들을 관리 하기 위해서 사용된다. 예를 들어서 마우스 오른쪽 버튼을 눌렀을 때, Copy, Paste, Undo, Redo등과 같이 명령을 어떠한 그림 또는 글을 통해서 보이도록 해주는 역할을 한다. 직접 Conturibution class를 구현할 필요는 없다. 그러나 workbench나 JFace API에 종종 contibution class를 볼 수 있을 것이다. 

Actions

Action(IAction)은 사용자가 실행(trigger)할 수 있는 Command를 나타낸다. 일반적으로 Action은 버튼, 메뉴의 아이템, 툴바의 아이템 들과 관계가 있다. 
비록 Action이 UI상에 직접적으로 나타나는 것은 아니지만, UI와 관련된 속성(property)를 가지고 있다. 예를 들어 tool tip text, label text, image등이 Action과 관련이 있다. Action 덕분에 다른 Class들이 위젯(Widget)을 생성 할 수 있도록 해준다. 
사용자가 UI에서 액션을 실행 시키면, Action의 run method가 수행이 된다. run method의 구현은 선택된 object를 변경하거나, Workbench를 선택하도록 요청 것을 일반적인 패턴으로 사용한다. 또 다른 run method 구현 패턴으로는 Action이 선택되었을 때, 위자드(Wizard)나 대화상자(Dialog)를 시키는 방법이 있다. 

Action을 만들 때, IAction interface를 직접적으로 구현할 필요는 없다. 대신 IAction의 subclass인 Action class를 구현하면 된다. action에서 사용하는 다른 패턴들을 보고 싶다면, 이 Subclass들을 참조하기 바란다. 아래의 코드는 "About" action을 구현 한 것이다. 이것은 workbench에서 사용하는 간단한 action중의 하나이다. 

public void run() {
    new AboutDialog(workbenchWindow.getShell()).open();
}

workbench interface중 IViewActionDelegate 와 IEditorActionDelegate라는 것이있다. 이 interface들은 viwe action 이나 editor action을 workbench에서 사용 할 수 있도록 해준다. workbench action delegate는 초기화 될때 관련된 view나 editor의 주소(reference)를 가지게 된다. 이 주소 덕분에 workbench action delegate는 workbench page난 window를 볼 수 있게 된다. 또한 Action을 수행하기 위해서 필요한 정보에 대한 정보에 대해서도 접근 할 수 있다.

개발하고 있는 plug-in에서 Command를 정의 하기를 원한다면, 단지 action class를 구현하기만 하면 된다. 또한 action을 다른 view나 editor에서도 사용하기를 원한다면 action delegate를 구현 하라. 

Contribution items

Contribution item(IContibutionItem)은 위에서 정의한 action의 UI에서의 표현이다. 조금 더 구체적으로 말하자면, 메뉴나 툴바와 같이 공유되는 UI 자원에서 사용되는 한개의 item을 말한다.  
Contribution item은 SWT widget을 어떻게 그려야 할지에 대한 정보를 가지고 있다. 
Workbench UI에서 action을 연결할 때 contibution item을 만들어야 될지에 대해서 걱정할 필요는 없다. Contribution item들은 이미 정의된 action들을 위해서 UI item을 만들 때 함께 만들어 지기 떄문이다.

Contribution managers

Contribution manager(IcontributionManager)는 contribution item의 집합이라고 생각하면 된다. contribution id를 사용하여 contribution item을 추가하거나 삽입 할 수 있다. 물론 id를 통해서 contribution item을 삭제하거나 찾을 수 있다.
IContributionManager는 어떻게 item들을 SWT widget에 그릴지에 대해서 알고 있어야 한다. JFace는  메뉴(IMenuManager), tool bar(IToolBarManager), 상태바(IStatusLineManager를 위한 contribution manager를 기본적으로 제공한다. 

Plug-in 개발자로써 이 Interface들을 구현 할 필요는 없다. 하지만 API method내에서 이러한 manager들에 대한 참조를 볼 수 있을 것이다. 

Example

다음은 Global action인 undo를 editor에서 원하는 동작으로 설정하기 위한 예제이다.
EditorActionBarContributor를 상속 받아서 eventSpecifierActionbarContributor라는 Class를 상속 받았다.
그 후,  setAction()라는 action을 actionBar에 등록해주는 setAction이라는 함수를 작성해주었다.
필자의 경우 setAction을 editor를 init하면서 호출 하도록 설정해놓았다.

public class eventSpecifierActionbarContributor extends  EditorActionBarContributor {

    private MultiPageEditor editor;

    private UndoAction undoAction;
 
    public void setAction(MultiPageEditor ieditor) {
        editor = ieditor;
        IActionBars actionBars = getActionBars();

        undoAction = new UndoAction() {
            public void run() {
                editor.getEditingDomain().getCommandStack().undo();
                editor.refresh();
           }
        };

        actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(), undoAction);
    }
}

예제의 경우와 다르게 MultipageEditor를 사용하는 경우는 MultiPageEditorActionBarContributor 상속 받으면 setActivePage함수를 override하여 사용할 수 있다. 
비슷하게 EMF.edit에서 제공하는 EditingDomainActionBarContributor를 상속 받아서 사용 할 수도 있다. 
필자의 경우에는 EditingDomain provider를 따로 구현하지 않았기 때문에, 위의 예제 코드를 이용하여 직접 Action을 등록해주었다. 
아래의 그림은 Redo와 Undo를 구현하여 Editor를 실행시킨 결과이다. 









Example2

이번에는 Menu에 Favorite menuContributionManager을 추가해보자.(매뉴에 Fravorite 탭이 생긴다고 생각 하면 된다)
contributeToMenu에서 MeneManager를 추가해주면 새로운 탭이 생기게 된다. 
아래의 코드를 참조하자.

public class newActionbarContributor extends  EditorActionBarContributor {
...

    public void contributeToMenu(IMenuManager manager) {
        IMenuManager menu = new MenuManager("Favorite");
        manager.prependToGroup(IWorkbenchActionConstants.MB_ADDITIONS, menu);
        
        /* Create Sample Action */
        sampleAction = new Action() {
            public void run() {
                MessageDialog.openInformation(null, "ProductComposer Plug-in", "Sample Action !!");
            }
        };
 
        sampleAction.setText("Sample Action");
        sampleAction.setToolTipText("Sample Action tool tip");
        sampleAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages(). 
            getImageDescriptor(IDE.SharedImages.IMG_OBJS_TASK_TSK));
    
        menu.add(sampleAction);
    }

...
}

위의 코드는 SampleAction을 만들어서 Favorite에 추가하는 예제이다. 다음의 그림은 예제의 실행 결과이다. 


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31