rcp toolbar에서 label등 각종 contribution item 생성방법

RCP/SWT & JFACE|2016. 12. 24. 00:07

    ToolBarManager manager = new ToolBarManager(SWT.FLAT | SWT.HORIZONTAL);
    
LabelContributionItem labelItem = new LabelContributionItem("myLabelId");  //Label ContibutionItem 생성
    manager.add(labelItem);
    
TextContributionItem textItem = new TextContributionItem("myTextId");
    manager.add(textItem);
    
ToolBar toolbar = manager.createControl(parent);
    
return toolbar;

 

출처: <http://stackoverflow.com/questions/28900682/what-is-the-proper-way-to-add-custom-controls-to-the-eclipse-toolbar-using-work>

댓글()

rcp dialog 화면 가운데 출력

RCP/SWT & JFACE|2016. 12. 24. 00:06

 public Point getCenterPoint() {
                Shell parentShell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
                Rectangle shellBounds = parentShell.getBounds();
                return new Point(shellBounds.x + shellBounds.width / 2, (shellBounds.y + shellBounds.height) / 2);
        }

Then simply override the getInitialLocation method of Dialog;

        @Override
        protected Point getInitialLocation(Point initialSize) {
                Point shellCenter = getCenterPoint();
                return new Point(shellCenter.x - initialSize.x / 2, shellCenter.y - initialSize.y / 2);
        }

 

출처: <https://sureshkrishna.wordpress.com/2007/09/05/make-your-eclipse-dialogs-and-messages-to-cetre-of-screen/

태그 : Dialog, jface, RCP

댓글()

Eclipse GEF 개념 설명

RCP/SWT & JFACE|2016. 12. 24. 00:05

1. GEF(Graphical Editing Framework)?

 말그대로 framework. 그래픽 쪽을 다루기 위한 framework. 모델을 그래픽적으로 다룰 때 쓰는 것. 기본적으로는 MVC(Model - View - Controller) 체제에 맞추어져 있다. 어떠한 정보들은 Model이 갖고 있고, 그것을 화면에 보여주는 역할을 하는 것은 View 쪽에서, 관리하는 것은 Controller 쪽에서 하는 형식이다 각 부분별로 다음 부터 보자.

 

2. Model

GEF 에서의 Model 은 기본적으로 Object 형으로 처리한다.

그리고 모델은 항상 최상위 모델의 child 관계로 존재해야 한다. 예를 들면 최상위 모델을 보여주는 화면의 배경이라고 하면, 모든 모델은 이 배경의 child 로 존재해야 하는 것이다. 또한, Model의 변경을 Controller 에 알려주기 위해서 Listener를 구현할 필요가 있다.

 

 3. View

GEF 에서의 View 는 GEF에 포함되어 있는 draw2d 나 SWT 를 사용해서 구현한다.

 

 

 4. Controller GEF에서는 controller 부분을 EditPart 를 사용해서 구현한다. Contoller는 기본적으로 Model 과 View를 관리하는 역할을 하기 때문에 이와 관련된 부분이 존재한다. 그 중에 하나는 Model과 Controller를 연결하는 EditPartFactory이다. 또한, EditPolicy라는 것이 있는다. 이것은 EditPart에 install 되어서, Command(org.eclipse.gef.commands.command)를 이용해서 EditPart의 동작을 결정한다. Controller에서 하는 일들을 대략적으로 설명하면, user에 의해 model 의 변경이 요청이 들어온다. 이러한 요청은 Request(org.eclipse.gef.Request) 형태로 처리가 된다. 그러면 이러한 Request 형태를 갖고, EditPart는 자신에게 install 되어 있는 EditPolicy를 검토한다. EditPolicy중에 적합한 EditPolicy 를 선택하고, 이 EditPolicy 과 command(org.eclipse.gef.commands.command) 형태로 변경 명령을 내리면, model 변경이 반영되는 것이다.


댓글()

JFace Dialog에서 레이아웃 설정으로 버튼 바 숨기기

RCP/SWT & JFACE|2016. 12. 24. 00:03

JFace Dialog에서 레이아웃 설정으로 버튼 바 숨기기


protected void createButtonsForButtonBar(final Composite parent)

{

  GridLayout layout = (GridLayout)parent.getLayout();

  layout.marginHeight = 0;

 

}

태그 : button bar, jface, RCP, SWT

댓글()

java GUI 툴 SWT vs Swing vs AWT

RCP/SWT & JFACE|2016. 12. 24. 00:02

자바에서 사용되는 그래픽 유저 인터페이스(GUI)툴중 대표적인 종류는 3가지이다.


AWT SWING SWT/JFACE 


각각 마다 동작하는 방식이 다르기 때문에 장단점이 다르다.


서로의 특징을 알아보자


1. AWT

- Abstract Windows Toolkit (AWT)는 오리지널 자바의 GUI툴킷

- 자바의 런타임의 일부로 안정되고, 추가 설치가 필요 없음

- 대개의 경우 리소스관리를 프레임워크에서 처리

- UI 쓰레드를 신경쓰지 않아도 됨 (그러나 성능의 문제가 됨)

- 콘테이너 없이 콤포넌트 생성 및 콘테이너 변경 가능

- 풍부한 그래픽 환경 제공

- 각 OS별 최소한의 공통 기능의 wrapper를 구현함으로써 제한적 기능을 제공

- 일반적으로 사용되는 테이블, 트리, 진행 바 같은 것은 애플리케이션 레이어에서 구현해야 함

- "한번 작성하여, 어디에서나 실행되는(WORE)"라기보다 "한번 작성하여, 어디에서나 테스트 하는(WOTE)" 환경이 됨


2. Swing

- 각 OS의 콤포넌트에 대한 의존성을 최소화 (AWT의 단점을 보완)

- 대부분의 콤포넌트는 자바로 구현해 모든 OS에 같은 look & feel로 실행 가능함 (WORE)

- 자바로 구현한 콤포넌트는 각 OS의 원래 콤포넌트보다 느려질 수 있음

- 모델, 뷰, 컨트롤의 분리

- Look & Feel을 컨트롤 할 수 있음

- AWT와 마찬가지로 프레임워크에서 리소스가 관리되며 컨테이너의 전제조건이 없음

- UI 쓰레드가 있으므로, UI 변경은 이 쓰레드에서 이뤄져야 함

- 자바의 일부로 별도의 설치가 필요 없음


3. SWT/JFace

- Standard Widget Toolkit (SWT)는 AWT에 비교되는 콤포넌트 라이브러리

- JFace는 SWT를 기반으로 하는 상위레이어 UI 라이브러리

- SWT는 각 OS의 콤포넌트에 기반하고, 좀더 많은 콤포넌트를 수용함 (OS에서 콤포넌트가 지원되지 않는 경우 자바로 구현함)

- OS에 따른 콤포넌트의 기능, look & feel과 성능을 지원함 (WOTE)

- ContentProvider 등을 통한 MVC 지원

- 애플리케이션이 리소스 관리해야 함 (disposal)

- 콤포넌트는 부모 컨테이너를 지정해 생성해야 하고 변경할 수 없음

- UI는 UI 쓰레드에서 변경되어야 함

- 그래픽 기능이 자바에 비해 약함

- 자바이외에 별도의 라이브러리 설치 및 환경설정 (classpath 및 jni library path)이 필요

태그 : awt, java ui, jface, Swing, SWT

댓글()

eclipse 범용 UI JFace 소개

RCP/SWT & JFACE|2016. 12. 23. 23:59

Jface


- SWT는 윈도우에서 정의한 위젯에 대한 접근을 제공한다면, JFace는 범용 UI 개념을 위한 구조와 편의기능을 제공한다.


- JFace는 SWT와 다르게 윈도우 시스템에 독립적이며 SWT와 동시에 활용될 수 있다.


- JFace는 UI 툴킷 컴포넌트의 모든 영역을 담당한다. 이미지, 폰트, 레지스트리 텍스트 지원, 대화창 ,환경설정, 마법사를 위한 프레임워크, Action, Viewer같은 것들을 담당한다.

태그 : jface, RCP

댓글()

RCP프레임워크 재료인 SWT 소개와 단점

RCP/SWT & JFACE|2016. 12. 23. 23:58

SWT


swt 소개

 SWT는 각 운영체제마다 운영체제 고유의 UI 모양과 동작을 제공하는데, 실제로 UI를 운영체제의 자원을 이용하여 구성하고, 그 동작을 운영하는 것도 운영체제이기 때문이다. 예를 들어 윈도우즈용 SWT는 GDI(Graphic Device Interface. 마이크로 소프트 윈도우즈의 어플리케이션 개발 API)자원을 이용하여 UI를 만든다.



swt 단점 - 자원의 한계

 단점으로, 운영체제 자원을 추상화한 SWT 객체는 사용이 끝나면 dispose() 메서드를 호출해 반드시 운영체제에게 돌려주어야 한다. 만약 너무 많은 수의 운영체제 자원을 할당 받으면, 실행중인 다른 응용프로그램까지 악영향을 미칠 수 있고, 운영체제가 더이상 자원을 할당하는 것을 거부할 수 도 있다.


swt 단점 - 메모리 누수

그렇다면 사용이 끝난 후, 일일히 모든 컨트롤들의 dispose()를 호출하여 운영체제에게 자원을 돌려주어야 할까?

- 계층 구조의 운영체제 자원은 최상위 핸들만 반환하여도, 하위 자원은 자동으로 반환되기때문에 SWT도 최상위 Shell 객체를 반환하면 모두 반환될것 같지만 실제로 break point를 걸어보면 그렇지 않다. 그렇기 때문에 다음과 같은 절차를 통해서 dispose를 진행해야 메모리 누수를 막을 수 있다.


화면 전체 Shell 위에 canvas라는 자식 이 존재하는 경우에 canvas객체가 Coler이라는 운영체제 자원을 사용한다고 가정하여보자

Shell이 dispose()를 통해 반환이 되었을때 자식 객체인 Canvas 또한 반환되는 작업이 실행된다.

하지만 Canvas에서 포함되던 window 자원인 Color은 반환되지 않는다.



그렇기 때문에 메모리 누수가 진행된다. 


해결방법


public class MyCanvas extends Canvas{

  // 이 커스텀 SWT 클래스가 사용하는 운영체제 자원.

  private Color canvasColor;

 

  public MyCanvas(Color canvasColor){

    super();

    Assert.isLegal(canvasColor != null && !canvasColor.isDisposed());

    this.canvasColor = canvasColor;

    this.addListener(SWT.Dispose, new Listener(){

      handleEvent(Event e){

        handleDispose();

      }

    });

  }

 

  /**

   * 이 커스텀 컨트롤이 사용하던 자원을 모두 반환 함.

   */

  private handleDispose(){

    canvasColor.dispose();

  }

}

태그 : jface, RCP, SWT, swt 단점

댓글()

RCP 프레임워크의 Extension and Extension Points

RCP/SWT & JFACE|2016. 12. 23. 23:56

Extension and Extension Points


 모듈 소프트웨어를 만드는 기본적인 규칙은 컴포넌트간 커플링을 피하는 것이다. 만약 컴포넌트가 강력하게 통합되어 있다면, 서로 다른 설정들을 조작하거나 시스템의 변화없이 다르게 구현된 컴포넌트로 교체하는 것이 힘들게 된다.


이클립스에서 커플링을 줄이는 것은 extensions / extension points(이하 확장/확장지점)를 통해서 이루어진다. 




- Extension

자신의 플러그인에 다른 플러그인(view, editor)등을 사용하여 기능적으로 확장하고 싶은경우에 플러그인의 extension에 정의를 한다.


- Extension points

extension point는 extension이 반드시 따라야 하는 자바 인터페이스와 xml을 조합한 명세를 나타낸다. 하지만 요근래 들어 extionsion point 명세없이 extension 만으로도 확장이 가능하다.





- Extension registry


 확장 레지스트리(extionsion registry)란 플러그인 간의 관계를 정의하는 메커니즘을 추가한 기능


extension point을 선언해 자신을 확장하거나 구성 가능


확장점을 선언한 플러그인은 내게 다음의 정보를 제공하면 내가 ...을 하겠다 라는 뜻이다.


예를들어


애플리케이션에서 UI에 액션세트를 설정할 수 있는 org.eclipse.ui.actionsets를 확장점으로 지정한다.

확장점으로 지정된 actionSets은 화면 UI에 보이게 되고 사용자가 아이콘을 클릭하게 되면 액션클래스에서 run() 메소드를 호출하여 action을 실행 시켜준다.


Extension Point

org.eclipse.ui/plugin.xml

<extension-point id="actionSets" name="Action sets"/>


Extension

org.eclipse.hyperbola/plugin.xml

<extension point="org.eclipse.ui.actionSets">

<actionSet id="org.eclipsercp.wedulaccount.ActionSet">

 <action

id="addAccountAction"

class="org.eclipsercp.wedulaccout.addAccountAction"

icon="icons/addAccountAction.gif"

label="Add actions"/>

</actionSet>

</extension>



확장과 확장점은 이클립스 전체에 걸쳐 많은 부분에서 사용됨

- 뷰 및 메뉴 아이템 구성 부터 도움말 문서 연결 등 이클립스 내 모든것에서 확장과 확장점이 사용됨

- 필요할때 까지 코드를 로딩하지 않고 사용자가 동작을 실행하고자 할때 클래스를 로딩한다.

ex) 사용자가 해당 Action 수행을 시도하기 전에 클래스는 로드되지 않는다.

댓글()