rcp프레임워크의 shell객체의 이벤트 처리 설명

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

Shell 객체는 이벤트를 위젯에 보내고 위젯은 이정보를 리스너로 불리는 인터페이스로 전달하고 리소드 메소드 중에 동작을 처리하는 이벤트 핸들러를 호출한다.

 

어댑터

어댑터는 추상클래스로서 Listener 인터페이스를 구현하고 필요한  메소드의 기본적인 구현을 제공한다.

필요한 메소드만 작성하면 된다.(리스너로 코딩하면 필요하지 않은 부분도 코딩해야 한다.)

위젯을 리스너가 아닌 어댑터와 연결한다면 조금더 편리하다.

 

케이스 1.

리스너로 코딩하기

Button.addMouseListener(new MouseListener()

{

Public void mouseDown(MosueEvent e){

Clkdevent();

}

 

어댑터로 코딩하기

Button.addMouseListener(new MouseAdapter()

{

Public void mouseDoublicClick(MouseEvent e)

{

Clkdevent();

}

}

 

 

Character : 누른 키를 나타내는 char 값을 제공한다.

stateMask : 키보드에서 기능키의 상태를 표현하는 정수를 반환한다. Alt, ctrl, shift, command 등이 눌렸는지 확인하는데 사용된다.

Keycode : SWT 퍼블릭 상수에 해당하는  코드를 제공한다.

Public void keyPressed(KeyEvent e)

{

If((e.stateMask & SWT.ALT ) != 0 ) string += "ALT-"; //stateMask 필드를 검사하여 alt,ctrl,shift, command 키가 눌렸는지 확인한다.

}

 

Event.doit true이면 해당 행동을 하게 하고 false 못하게 한다.

 

 

해당 위젯에 직접 Listener 부여하는 것을 유형 리스너라고 하고 아래처럼 별도의 리스너를 사용하는것을 무형 리스너라고 한다.

Listener listener = new Listener()

{

Public void handleEvent(Event event)

{

}

}

 

코딩의 유연성은 무형리스너가  있으나 안정성은 유형 리스너가  있다.

 

 

Jface 이벤트 처리

복잡한 사용자 인터페이스를 다룰때이벤트 핸들링 기능을 이벤트를 생성하는 GUI 컴포넌트로 부터 분리하는 것이 좋다.

-> 하나의 그룹이 GUI 처리에 대해 작업하고 다른 그룹은 외관 작업을   있다.

-> 리스너의 기능을 어떤 컴포넌트에다가 붙힐수도 있고 더욱 유연하게 사용이 가능하다.

 

그래서 Jface action actioncontributionitem 클래스를 분리해 제공한다.

간단히 말하면 actioncontributionitem gui 위젯의 기능과 그와 덧붙여진 리스너 클래스를 결합한다.

 

기본적으로 GUI 이벤트 대입하는 것도 좋으나 자주 사용하는 action 경우에는 분리해서 구성해서 여러곳에서 자유자재로 사용하는 것이 좋다. SWT 처럼 모든 위젯에 하나의 이벤트를 대입하게 되면 결국 코드가 복잡해질  있다.

 

루틴

SWT 이벤트 처리방 식처럼 Display 클래스로 시작하여 운영체제의 이벤트 큐를 모니터링 한다하지만 Display 클래스가 display shell 객체를포함하는 ApplicationWindow 정보를 전달한다. ApplicationWindow Action 클래스를 생성하여 이를  이밴트를 생성한 컨트리 뷰션으로전달한다컨트리 뷰션은 단일 이벤트 핸들러 로써 Action 클래스의 run() 메소드를 호출한다.

 

SWT 이벤트와 동일해 보이나 컨트리뷰션 기능은 좀더 복잡하다 개의 주요 컨트리 뷰션 관련 클래스는 ContributionItem 클래스와 ContributionManager 클래스 이다.

ContributionItem  클래스는 액션을 발생시키는 개별적인 GUI 컴포넌트를 제공하고 ContributionManager 클래스는 ContributionItem들을 포함할  있는 객체를 제공한다.

 두개는 모두 추상 클래스로서 하위 클래스에서 구현한다.

ActionContributionItem 클래스는 ContributionItem 많은 하위 구상 클래스중 하나지만 ApplicationWindow에서 GUI 액션을 연결하기 위해 생성구현된다외관은 없지만 fill() 메소드의 사용에 따라 버튼메뉴바 항목툴바 항목의 형태를 취한다.

 

ContributionManager 하위 클래스들은 Contributionitem  컨테이너의 역할을 하며, Contributionitem 묶어서 GUI 객체 구성 방식을 개선하고 프로그래밍을 편하게 한다. MenuManger 클래스는 contributionitem 윈도우 상위 메뉴에 통합한다또한 ToolBarManager 클래스는 객체를 메뉴 아래에 위치한 툴바를 둔다.

 

 

 

Jface 이벤트 처리 규칙

  1. 사용자 입력은 버튼툴바메뉴를 포함한다.
  2.  컴포넌트는  하나의 연관 이벤트만을 갖는다.
  3.  이벤트는  하나의 이벤트 핸들러를 갖는다.


'RCP > SWT & JFACE' 카테고리의 다른 글

Menifest 파일 설명  (0) 2016.12.24
Action 클래스 살펴보기  (0) 2016.12.24
rcp프레임워크의 shell객체의 이벤트 처리 설명  (0) 2016.12.24
event doit 설명  (0) 2016.12.24
JFace TreeViewer설명  (0) 2016.12.24
IWizardPage 인터페이스  (0) 2016.12.24

댓글()

event doit 설명

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

Public void close(Event event) {

Event.doit = false; // event 일어나지 않게 지정

 

If(true)

Event.doit = true;// 어떤 조건에서만 true 변경

 

 

}

'RCP > SWT & JFACE' 카테고리의 다른 글

Action 클래스 살펴보기  (0) 2016.12.24
rcp프레임워크의 shell객체의 이벤트 처리 설명  (0) 2016.12.24
event doit 설명  (0) 2016.12.24
JFace TreeViewer설명  (0) 2016.12.24
IWizardPage 인터페이스  (0) 2016.12.24
Draw2d 설명  (0) 2016.12.24

태그 : doit, event, jface

댓글()

JFace TreeViewer설명

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

Viewer

Viewer는 MVC 패턴을 가지고 있다.

Viewer의 하위 클래스인 ContentVier와 StructuredViewer가 있다.

 

ContentViewer는 다양한 인터페이스를 활용해서 도메인 객체 형태를 유지하면서 데이터를 다룬다. 이들 인터페이스는 이름 앞에 I를 붙인다. 이러한 인터페이스는 확장점을 표시하며 이를 사용하여 애플리케이션의 맞춘 로직을 프레임워크에 넣을 수 있다.

 

StructuredViewer는 ContentViewer에게 제공하는 데이터를 구조화 한다. 구조화는 필터링, 정렬 기능 같은 일반적인 작업을 실행하는 메도드들이 이 계층에서 구현된다.

 

각 위젯인 Tree, List, Table 등은 이에 맞는 Viewer의 하위 클래스로 ListViewer나 tableViewer 등이 있다.

 

위젯은 기껏해야 하나의 Viewer와 연결하도록 되어 있고, 연결이 완료되고 나면 모든 작업은 Viewer를 통해서만 해야한다. 위젯과 뷰어에서 동작을 섞어서 처리하다 보면 나중에 꼬일 수 있다.


viewer은 대부분 구성이 비슷하여 하나의 viewer만 잘 공부하면 나머지도 어느 정도 이해할 수 있다.

 

 

주요 Viewer 메소드

getControl()

GetSelection()

Refresh()

SetInput()

 

주요 ContentViewer 메소드

setContentProvider()

SetLabelProvider()

 

주요 StructuredViewer

addFilter()

Reveal()

SetSorter()

 

ContentViewer의 프로 바이더

프로바이더에는 두 개가 존재한다. ContentProvider, LabelProvider.

 

컨텐츠 프로바이더는 화면에 나타날  있는 항목의 전체 집합을 반환한다

 집합을 뷰어에 부착된 뷰어에 부착된 어떤필터에든 넘길  있다.


레이블 프로바이더는 이들을 어떻게 화면에 나타낼지 결정한다.

 

 

Viewer의 첫 번째 하위 클래스인 ContentViewer는 위젯에서 보일 데이터를 다루는 기능을 추가하며, MVC의 M(모델) 부분을 제공한다.

 

1) LabelProvider

레이블 프로바더는 ILabelProvider나 ITableLabelProvider를 구현하는데, 두 인터페이스 모두 IBaseLabelProvider를 확장 했다.

 

ILabelProvider와 ITableLabelProvider는 비슷한 성향을 가지며, ITableLabelProvider는 테이블열을 다루지만 ILabelProvider는 일차원 데이터만 가정한다.

 

레이블 프로바이더의 로직은 세 개의 메소드로 작성할 수 있다.

첫 번째는 isLabelProperty()로 IBaseLabelProvider에서 정의한다.

-> 객체와 프로퍼티 이름을 받아 부울 값을 반환한다. 해당 부울값은 주어진 프로퍼티를 변경할 때 시각적으로 보이는 레이블을 업데이트 해야하는지 나타낸다.

 

두 번째로 getText()와 getImage() 메소드를 통해 해당 객체에 보여줄 텍스트랑 이미지를 설정한다.

 

2) ContentProvider

ContentProvider 레이블 프로바이더로 관여하기도 하지만 컨텐트 프로바이더로도 역할을 한다.

 

레이블 프로바이더가 요소를 보이기 위한 텍스트이미지를 제공하는 반면에 컨텐츠 프로바이더는 실제적으로 요소를 보이게끔 해준다.

 

IStructuredContentProvider getElements() 메소드를 정의하는데, getElements() 메소드는 Object 입력으로 받아들여서 위젯에 보여줄 Object 배열을 반환한다. Viewer에서 setInput() 호출할 객체는 컨텐트 뷰어에게 매개변수로 전달한다컨텐트 프로바이더는 위젯에 의해 보여지는 도메인 객체들의 콜렉션을 반환하기 위해  매개변수를 이용한다.

 

 개의 메소드는 필수로 구현하지 않아도 되는데  것은 dispose() inputChanged(Viewer viewer, Object oldInput, Object newInput)이다우선 dispose() 페기될  깨끗이 정리할때 정의하는 메소드이다.

inputChanged 뷰어가 컨텐츠 프로바이더에게 최상위 입력 객체를 바꾸웠다고 통지할  사용한다.

 

 

트리(Tree)

SWT에서 제공하는 Tree 위젯과 Jface에서의 TreeViewer 트리를 사용할  있다.

 

1. SWT 트리

일반적인 Tree 특별하게 유용한 인터페이스를 가지지 않는다.

- addSelectionListener() 선택 이벤트의 통지를 가능하게 한다.

- addTreeListener()  TreeListener 인터페이스는 트리의  수준을 펼치거나 줄일  통지하기 위한 콜백을 제공한다.

- Select() / deselect() 현재 선택 사항을 변경한다.

- getSelection() 현재 선택 항목을 얻는다.

- Show() 주어진 항목을 보일 때까지 컨트롤을 스크롤 한다.

 

1-1) TreeItem

TreeItem Tree 항목을 추가하기 위해 사용되는 클래스이다.

TreeItem 내용을 나타내는 것을 덧붙여부모와 자식 항목의 관계를 유지한다.

SWT.SINGLE, SWT.MULTI 스타일을 통해 트리 스타일을 지정할  있으며 SWT.CHECK 체크박스를 사용하여 트리 옆에 checkbox 생성   있다.

TreeItem setText(), setImage() 메소드를 사용하여  보여주고자 텍스트와 이미지를 수정하기 위해 제공한다.

직접 TreeItem들을 생성하고 조작하여 트리를 구축할  있지만 너무 어렵기 때문에 Tree Viewer 사영하여 애플리케이션의 로직에 초점을 맞추고 사용자 인터페이스 요소의 상세 항목에  신경   있다.

 

1-2) TreeViewer

TreeViewer 모든 Viewer 공통적으로 제공하는 필터링과 정렬 기능 뿐만 아니라 레이블 프로바이더 기능도 제공한다


'RCP > SWT & JFACE' 카테고리의 다른 글

rcp프레임워크의 shell객체의 이벤트 처리 설명  (0) 2016.12.24
event doit 설명  (0) 2016.12.24
JFace TreeViewer설명  (0) 2016.12.24
IWizardPage 인터페이스  (0) 2016.12.24
Draw2d 설명  (0) 2016.12.24
Drag & Drop 구현 방법  (0) 2016.12.24

댓글()

IWizardPage 인터페이스

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

Jface IWizardPage 인터페이스를 사용하여 마법사의 페이지 하나를 표현한다.

 

getName() : 위자드의 유일한 이름을 가진다.

getNextPage(), getPreviousPage()  메소드들은 다음이나 이전의 페이지로 이동한다.

isPageComplete() 사용자가 해당 페이지에서 필요한 모든 내용을 채웠는지 알아낸다.

canFlipToNextPage() : 다음 버튼을 사용할  있는지 체크 한다.

 

 

마법사를 담는 부분은 Iwizard 인터페이스이고  페이지는 wizardpage 나타낸다.

 

 

 

마법사 컨테이너

 

마법사 컨테이너는 하나 이상의 마법사에 대한 호스트로서의 역할을 수행한다.

 

 

Dialog Setting

DialogSetting IDialogSettings 인터페이스를 구현한다. Xml 형태로 dialog 정보를 저장한다.

 

 

//저장

IDailogSettings setting = new DialogSettings("mydialog");

Settings.put("checkboxOneChecked", true);

Settings.put("defaultName", "TestDialog");

 

Settings.save("Settings.xml");

 

//Load

IDialogSettings loadedSetttings = new DialogSettings(null);

loadedSettings.load("settings.xml");

 

loadSettings.getBoolean("checkboxonechecked");

loadedSettings.get("defaultName");

'RCP > SWT & JFACE' 카테고리의 다른 글

event doit 설명  (0) 2016.12.24
JFace TreeViewer설명  (0) 2016.12.24
IWizardPage 인터페이스  (0) 2016.12.24
Draw2d 설명  (0) 2016.12.24
Drag & Drop 구현 방법  (0) 2016.12.24
이벤트로 받은 키보드 멀티 인식 방법  (0) 2016.12.24

태그 : iwiward, jface, RCP

댓글()

Draw2d 설명

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

Draw2d 툴은 사용자가 좋아하는 모든 외형과 기능을 포함함 GUI 컴포넌트를 만들  있게 한다.

 

Draw2d 기본 클래스

클래스

기능

유사 SWT 클래스

LightweightSystem

이미지를 만들기 위한 상위 레벨 환경

Display

Figure

LightweightSystem 내에 컴포넌트 또는 컨테이너

Shell, Control, Composite

Graphics

Figure 내에 그래픽 영역을 제공GC

GC

 

 

LightweightSystem 클래스는 Display 클래스와 유사하다시각적으로 보여주는 것은 없지만이벤트 핸들링을 제공하고 외부환경과상호 작용을 하는 역할을 한다. LightweightSystem 클래스는 운영체제와  떨어진 계층에서 작동한다.

 

Draw2d 기본적인 구조는 Canvas -> Lightweight System -> Container Figure -> 다수의 figure/Graphics

 

 

 

Figure 객체의 메소드

 

SWT Control 클래스와 마찬가지로 Figure 클래스는  프로퍼티를 조작하기 위한 많은 메소드를 가지고 있다크게 하단의 4가지로나눠서 설명할  있다.

  1. Figure 객체의 외형을 이용한 작업
  • Figure 객체의 경계위치크기 값을 얻어내고설정하는 것을 포함한다. Figure 객체의 경계선 크기와 실제 영역 뿐만 아니라 최대최소 크기도 제어할  있다또한 Figure 객체의 전경색과 배경색을 변경하고 컨트롤 외형에 관련된 매개변수를 얻어내고설정하는 방법을 제공한다.
  1. 이벤트 핸들링
  • Draw2D 이벤트 핸들링 과정 또한 SWT 비슷하지만 개의 새로운 이벤트와 리스너를 제공한다. SWT 달리, Figure 객체는 여러가지 자신만의 이벤트를 다룰  있다전체 리스터의 목록과 이벤트 핸들링 메소드는 다음과 같다.
  • Draw2d 리스너

    이벤트 핸들링 메소드

    addFocusListener()

    Handlefocusgained()

    handleFocusLost()

    addKeyListener()

     

    handleKeyPressed()

    handleKeyReleased()

    addMouseListener()

    handleMouseDoubleClicked()

    handleMousePressed()

    handleMouseReleased()

    addMouseMotionListener()

    handleMouseDragged()

    handleMouseEntered()

    handleMouseExited()

    handelMouseHovered()

    handelMouseMoved()

    addListender()

     

    addAncestorListener()

     

    addFigureListener()

     

    addPropertyChangeListener()

     

 

  1. 부모와 자식의 관계 정보 유지
  • SWT Jface Composite 클래스를 제공하여 다른 컴포넌트에 컴포넌트를 추가하는 것을 허용한다그러나 Draw2D에서는 Figure 객체에 따라 컨테이너일 수도 있고컨테이너에 포함될 수도 있다.  Figure 언급하기 위해 부모(parent)라는 용어를 사용하고내부에 포함되는 Figure 언급하기 위해 자식(child)이라는 용어를 사용한다.

메소드

기능

Add(Figure, Object, int)

주어진 제약 조건을 가진 자식 Figure 객체와 List 인덱스를 추가한다.

getChildren()

자식 Figure 객체의 List 반환한다.

getParent()

Figure 객체의 부모 Figure 객체를 반환한다.

setChildrenEnabled(boolean)

Figure 객체의 자식을 사용 가능하게 하거나 금지한다.

setConstraint(Figure, object)

주어진 자식 Figure 객체의 제약 조건을 지정한다.

 

SWT에서 button 객체와 Label 객체는 생성자에서 부모를 명시하여 Composite 자신을 추가한다. Draw2D에서는 부모 Figure 객체가 자식 List 객체에 Figure 객체를 포함하기 위해 add() 메소드를 사용한다 메소드는 부모 List 객체에 임의에 제약 사항(자식 객체의 크기 또는 위치 )이나 인덱스를 선택적으로 포함할  있따부모 Figure getChildren() 메소드를 이용하여  List 객체를 얻을수 있고자식 객체는 getParent() 이용하여 부모에게 접근할  있다부모는 또한 setChildrenEnabled() 이용하여 자식 객체를 허용하거나 금지 시킬  있고, setConstraint() 이용하여 자식의 제약사항을변경할  있다.

  1. 그래픽 관리
  • Draw2D SWT GC 대부분의 임무를 수행하는 Graphics 클래스를 제공하지만, Figure 객체는 자기만의  가지 그래픽 메소드를 가지고 있다 paint() 이용하여 화면 표시를 제어   있을  아니라어떤 부분을 보여줄지 선택하기 위한 paintBorder() paintClientArea() 사용할  있다. Figure 객체는 paintChildren() 이용하여 자식 객체를 보여줄  있고오직 자기 자신을 보여주기 위해서는 paintFigure() 사용한다또한 SWT 비슷하게 작동하는 여러 가지 repaint() 메소드도사용 가능하다. Draw2D 사용자가 선택한 위치에 대한 정보를 얻기 위한 메소드를 포함한다특히 Draw2D 정확한 마우스위치를 다루는 반면 SWT 오직 선택된 Control 고려한다는 점이 다르다관련 메소드로는 FindMouseEventAt(), FindFigureAt() 등이 있다.

 

 

Figure  객체

결론부터 말하면 SWT 객체가 액션 리스너, view  가지고 나타내지만 Firgure 나타내는 개체와 그의 액션 리스너등을 가진 객체가 서로 상이하다.

  1. Label 객체
  • Draw2D Label 객체는 SWT Label 객체와 비슷하지만텍스트 크기 측정과 이미지 위치를 더한  많은 메소드를 포함하고 있다.
  • getTextBounds() getTextLocation() 통해 Lable 객체의 문자열 매개변수의 화면 출력 크기를 측정할  있다또한 Lable 객체와 이미지와 관련되어 있다면, getIConBounds() getIconAlignment() Image 대한 정보를 제공한다.
  1. Clickable 객체
  • Button Toggle 클래스를 포함하고 있는  클래스는 사용자에게 필요한 선정과 관련된 이진 정보를 제공한다. SWT button 객체와 같이, Button Toggle 클래스는 서로 동일하게 동작한다하지만 두개의 서로 다른점이 존재한다.
  •  째로 Clickable 객체는 Draw2D Figure 객체의 모든 외형을 가질  있다둘째 Clickable 이벤트 핸들링과 함께 동작한다.
  • Draw2D 사용자 인터페이스는 일반적으로 SWT Jface 생성된  보다  복잡하다.

 

 

LayoutManger Pane 사용

-SWT Layout 클래스처럼, LayoutManger 자식 컴포넌트를 콘테이너에 어떻게 배치하고 크기를 정할지 결정한다.

Draw2D Pane객체(ScrollPane, LayerPane) SWT Composite 같이 배경 컨테이너 역할을 한다.

 

LayoutManger 하위 클래스 이해

Figure 자신의 자식 객체들(button, Layout)등을 생성할때 먼저 figure.setLayoutManger() 통해서 설정해주어야 한다.

 

 

메소드

기능

ABstractHintlayout

다른 곳에 설정한 값을 가져와 자식 Figure 객체의 크기를 결정하는 Hint  제약 조건을 사용한다.

DelegatingLayout

자식 객체가 Locator 제약조건에 따라 자신의 크기를 지정하는 것을 허용한다.

XYLayout

Rectangel 제약 조건에 따라 자식 객체의 크기와 위치를 지정하는 책임을 부모에게 부여한다.

 

LayeredPane

  • Figure 객체를 보여주기 위한 여러 단계를 제공한다투명한 Layer객체를 사용하여 사용자 GUI 외관 그래픽을 구분할  있다 Layer 각각의 프로퍼티를 따로 갖고 있고 구분된 LayoutManger 가지고 있다.
  •  중의 하나인 FreeFormLayeredPane 원하는 방향으로 윈도우를 확장할  있다그리고 또다른 종류인 ScalableLayeredPane 윈도우 영역안에서 확장이 가능한다.

 

Graphics 클래스의 사용

  • DecisionFigure : 조건을 나타내는 도형 개의 입력과  개의 출력( 또는 아니오)
  • ProcessFigure  따라 일어나는 행동을 나타내는 도형 개의 입력과  개의 출력
  • TerminatorFigure 플로우차트의 시작 또는 끝을 나타낸다시작으로 사요한다면 오직 출력이 연결될 것이고끝으로 사용한다면 오직 입력이 연결될 것이다.

 경우에, Figure 크기는 bounds라고 불리는 변수에 의해 제어된다. Figure 텍스트는 message 문자열에 설정된다 제약 사항들은 Figure 클래스의 외부에서 제어되므로아직 그것을   없을 것이다.

 

 

Figure Figure 서로 연결하기 위해서는 FixedAnchor 불리는 ConnectionAnchor 객체가 필요하다는 것을 의미한다 

'RCP > SWT & JFACE' 카테고리의 다른 글

JFace TreeViewer설명  (0) 2016.12.24
IWizardPage 인터페이스  (0) 2016.12.24
Draw2d 설명  (0) 2016.12.24
Drag & Drop 구현 방법  (0) 2016.12.24
이벤트로 받은 키보드 멀티 인식 방법  (0) 2016.12.24
RCP 확장점 소개  (0) 2016.12.24

태그 : draw2D, RCP

댓글()

Drag & Drop 구현 방법

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

어플리케이션에 항목 드롭하기

  • 등록된 컨트롤에 데이터를 올려 놓을 경우 데이터를 받아 들일  있으며이때 DropTarget 인스턴스를 사용한다.
  • DropTarget 위젯이 선택할  있는 데이터의 유형과  위젯에서 수행하기로 공인된 동작 가지 모두 저장할  있다운영체제가 이러한 정보를 사용하여 항목이 해당 위젯을 지나갈 때  항목을 놓을  있는지에 대한 가시적인 피드백을 제공한다.
  • 우선 타겟을 등록하면, DropTargetListener DropTargetEvent 받으며 이벤트는 사용자가 컨트롤내에 어떤 것을 놓을 발생한다.

 

연산 상수

설명

DROP_COPY

 항목을 컨트롤 안이나 밖으로 드래그   복사한다.

DROP_MOVE

마우스를 놓은 위치로 항목을 이동시킨다.

DROP_LINK

항목을 놓으면 원본에 대한 링크를 생성한다.

DROP_NONE

항목을 놓아도 아무런 일이 일어나지 않는다.

 

 

Ex)

 

Int operation = DND.DROP_MOVE | DND.DROP_COPY

DROPTARGET tartget = new DropTarget(control, opration) // 해당 타겟을 지정하고 해당 타겟의 Drag 이벤트가 발생하였을 발생할 동작을 설정한다.

Transfer[] transfer = new Transfer[] { // 데이터의 유형을 선택한다.

TextTransfer.getInstance(),

RTFTransfer.getInstance()

};

Target.setTransfer(transfer);

Target.addDropListener(new DropTargetListener(){..});

 

 

Viewer에서 해당 드래그 이벤트를 실행시킬 경우

Transfer[] types = new Transfer[] {

FileTransfer.getInstance()

};

 

Viewer.addDropSupport(DND.DROP_COPY, types, new FileDropListener(this));

 

가장 중요한 부분은 Listener 동작시키는 작업이다.

  1. dragEnter() 항목을 끌고 가는 동안커서가 컨트롤의 경계부분으로 들어온다.
  2. dragOver() 커서가 항목을 끌고 가면서 컨트롤 위를 이동한다.
  3. dragOperationChanged() 사용자가 사용할 동작 유형을 바꿀 때마다  메소드를 호출 한다 이벤트는 주로 Ctrl이나 Option 등의 기능키를 누르거나   발생한다.
  4. dropAccept() 사용자가 컨트롤에서 항목을 놓는다 때가 애플리케이션이 이런 떨어트리는 작업을 거절하거나 수행할 동작유형을 변경할  있는 마지막 과정이다.
  5. Drop() 데이터를 놓는다리스너에서 주어진 데이터를 적절히 다룰  있는 로직을 구현해야 한다.

 

 메소드 에서는 DropTargetEvent 바등며  이벤트는 현재 동작 정보를 포함한다사용할 데이터 유형과 수행 동작을 변경하기 위해서는 각각의 currentDataType detail 필드를 수정한다.

여섯번재 메소드인 dragLeave() dropAccept()  호출 하기 전에 언제든지 호출   있으며애플리케이션에게 사용자가 커서를컨트롤 밖으로 이동햇지만 드롭하지 않았다고 알려준다.

 

DragSource는컨트롤을 데이터의 소스로 등록하기 위해 생성된다. DragSourListener 드래그 동작을 시작할  이벤트를 받으며 해당 항목을 놓을 때의 처리로직을 구현한다.

 

  1. dragStart() 사용자는  컨트롤에서 데이터 드래그를 시작한다드래그를 진행하기 위해서는 이벤트의 doit 필드를 true 설정해야 한다.
  2. dragSetData() 놓기를 수행한다 메소드 놓을 데이터를 제공하기 위해 이벤트의 data필드에 데이터를 넣는다.
  3. dragFinished() 놓는 동작을 성공적으로 끝낸다마무리 작업 원본데이터 삭제 작업 같은 작업을 여기에서 수행한다.


'RCP > SWT & JFACE' 카테고리의 다른 글

IWizardPage 인터페이스  (0) 2016.12.24
Draw2d 설명  (0) 2016.12.24
Drag & Drop 구현 방법  (0) 2016.12.24
이벤트로 받은 키보드 멀티 인식 방법  (0) 2016.12.24
RCP 확장점 소개  (0) 2016.12.24
rcp toolbar에서 label등 각종 contribution item 생성방법  (0) 2016.12.24

태그 : Drag, Drop, jface

댓글()

이벤트로 받은 키보드 멀티 인식 방법

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

(event.stateMask & SWT.CTRL) != 0 && event.keyCode == 'p'

 

Ctrl + P

'RCP > SWT & JFACE' 카테고리의 다른 글

Draw2d 설명  (0) 2016.12.24
Drag & Drop 구현 방법  (0) 2016.12.24
이벤트로 받은 키보드 멀티 인식 방법  (0) 2016.12.24
RCP 확장점 소개  (0) 2016.12.24
rcp toolbar에서 label등 각종 contribution item 생성방법  (0) 2016.12.24
rcp dialog 화면 가운데 출력  (0) 2016.12.24

댓글()

RCP 확장점 소개

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

확장점은 기능 단위를 느슨하게 결합시키기 위한 메커니즘으로 이클립스 전반에 걸쳐 사용된다하나의 플러그인은 플러그인 내역서(Menefiset.MF)에서 확장점을 선언하며다른 개발자가 사용할

최소한의 인터페이스와 관련 클래스를 노출시킨다다른 플러그인은 확장점에 대한 확장을 선언하고 적절한 인터페이스를 구현하며제공된 클래스를 기반으로 구성 요소를 참조하거나 구축한다.

 

 

<확장점>

<Extension-point

Id="favorites"

Name = "Favorites"

Schema="schema/favorites.exsd"/>

 

 

<third Party Plug-in>

<extension

Point="com.qualityeclipse.favorites.favorites">

<itemType

Name="Workbench File"

Icon=\"icons/type/file.gif"

targetClass="org.eclipse.core.resource.Ifile"

Class="com.qualityeclipse.favorites.model.type.FileFactory"

Id="WBFile">

</itemType>

</extension>

 

 확장점은 플러그인의 식별자와 마침표 뒤에 알파벳,숫자밑줄(_) 이루어진 단순 식별자를 붙여 구성한 유일한 식별자를 갖는다.

확장점을 선언할때는 단순식별자만을 사용한다확장점에 대한 확장을 선언할때는 확장점에 대한 전체 식별자를 사용한다.

 

확장점의 사용되어야할 스키마 정의를 나타내는 exsd

모든 확장점은 확장점이 어떻게 사용되어야 하는지를 정의하는 스키마를 가진다절절한 확장점 사용을 위해 반드시 스키마가 필요한것은 아니지만이클립스 PDE 스키마를 사용해 확장에 대한 기본적인 자동 검증을 수행하고 자동으로 확장점에 대한 Javadoc 느낌의 문서를 생성한다.

스키마는 XML 형식의 파일로 관섭적으로 <extension-point-id>.exsd라는 이름을 사용하며 플러그인 설치 디렉토리의 하위 디렉토리 schema 위치한다.

이클립스 설치 디렉토리/plugins/com.qualityeclipse.favorites_1.0.0/schema/favorites.exsd 같은 위치에 존재한다.

 

확장점 생성

확정점으로 생성하고 싶은 플러그인의 메니페스트 파일에서 확정점 페이지로 이동하여 추가 버튼을 클릭하고 확장점을 생성한다.

<Extension-point

Id="favorites"

Name = "Favorites"

Schema="schema/favorites.exsd"/

위에 설명한   처럼 해당 확장점은 favorites처럼 보이나 실제로는 com.qualityeclipse.favorites.fvorites 같이 길게 확장점을 사용하여야 한다.

 

확장점 스키마(exsd)작성

위의 확장점 생성 마법사가 완료되면 자동으로 schema 디렉토리에 새로 생성될 favorites.exsd 파일을 편집하는 스키마 편집기로 이동된다.

스키마 편집기를 다시 열고 싶을 경우 schema 디렉토리를 찾아 favorites.exsd 파일을 더블 클릭하거나 Favorites 플러그인 내역서에서 확장점을 찾아 마우스 오른쪽 클릭하고

스키마 열기를 선택 하면된다.

 

스키마 편집기는

General Information(일반정보), Extension Point Elements(확장점 요소), Element Grammer(요소 문법), Documentation (문서등의  가지 주요 파트로 구성된다.

 

  1. 확장점 요소 목록은 확장점에 대해 확장으로 나타날 요소와  요소의 연관된 속성을 나타낸다.

 

  1. 요소 문법 목록은 확장에 표현될 XML 요소가 어떻게 나타나야 하는지에 대한 명세를 포함한다.(3.2 이후에는 확장점 요소로 통합 되었다.)
  2. Documentation 영역은 확장점 스키마를 사용해 확장점에 대한 도움말 페이지를 동적으로 생성하여 입력하는 부분이다.

 

 

확장점 요소와 속성

확장점 element 요소는 확장 선언에 나타나는 XML 요소에 대응한다확장점 attribute 요소는 확장 선언에 나타나는 XML 속성에 대응한다.

확장점 attribute 요소는 확장 선언에 나타나는 XML 속성에 대응한다예를 들어 다음과 같은 확장의 경우, itemType 확장점 요소이고 id, name, class, targetClass 확장점 속성이다.

<third Party Plug-in>

<extension

Point="com.qualityeclipse.favorites.favorites">

<itemType

Id="com.example.xyz.myNewFavoriteItemID"

Name="New Favorites Item Name"

targetClass="com.example.xyz.MyObjectClass"

Class="com.example.xyz.MyFavoriteItem"

>

</itemType>

</extension>

 

1. 확장점 attribute 요소는 확장점과 연관된  가지 프로퍼티를 가진다.

이름 Name : 확장 선언에 나타날 속성 이름(itemType id, name, targetClass, Class 모두가 속성 이름이다.)

타입Type : 속성의 타입은 string이나 Boolean  하나를 선택한다현재로서는 스키마 편집기와 PDE에서 인식하는 유형이   가지 뿐이다.

사용Use :  속성이 required 확장에 반드시 선언해야 하며 optional 결우 확장 선언에서 빼도 무관하다또는 default 선언하면 확장에 명시적으로 선언되지 않을

2. 경우 value 프로퍼티에 명시된 값을 기본으로 적용한다.

유형Kind : Type 프로퍼티가 string이면  프로퍼티 문자열을 어떻게 해석할지를 지정한다확장점 코드에서 자바 클래스이미지에대한 리소스 경로단순 문자열 등으로 해석   있다.

기반Based On : Kind 속성이 java 경우에  프로퍼티는 속성에서 상속 받거나 구현해야  클래스나 인터페이스의 완전 수식명을지정한다.(이클립스 3.2 이상부터는  프로퍼티를 Extend Implement 구분했다.)

Restriction : Type string이고 kind string이면  프로퍼티는 속성의 값으로 사용 가능한 문자열의 목록을 지정한다예를 들면 필드를 사용해서 속성값이 one, two, three  하나만 가능하게   있다.

변환 가능Translatable :  속성이 사람이 읽을  있는 것인지아니면 변환해야 하는지 여부를 지정한다.

기본값Value : Use 속성을 default 지정했다면 확장 속성의 값을 명시적으로 지정하지 않았을  기본으로 지정될 기본 값을 설정한다.


 

※주의 사항 : 확장점을 범용 목적으로 작성한다면 확장의 늦은 초기화를 지원할 계획을 세움으로써 다른 플러그인의 추가 로딩으로 인해 메모리를 과도하게 사용하거나

시스템이 느려 지는 일이 생기지 않도록 해야한다. targetClass 같은 명세가 주어져 있지 않을 경우 해당 클래스로 동작을 해야  경우 마다 계속해서  모든 플러그인들을

로드 해야하는 경우가 발생할  있다.

 

확장은 어떻게 확장점에 동작 구현을 제공할까?

확장이 인터페이스를 구현하거나 추상 기반 클래스를 상속 받아야 하는가인터페이스를 구현하는 확장을 요구한다면 확장 개발자가 유연하게 확장을 구현   있다.

반면 인터페이스가 변경되면 기존 확장이 모두 동작하지 않게   있다추상 기반 클래스를 상속 받는 확장을 요구한다면 느슨한 결합의 장점을 유지하면서 유연성을

어느정도 확보   있다추상 기반 클래스에 메소드를 추가해도 기존 확장은 동작을 멈추지 않으므로 확장 개발자의 유연성을 크게손해 끼치지 않는다.

-> 결론은 인터페이스로 정의  경우 수정될 때마다 문제가   있으므로 추상 클래스를 사용할 .

 

확장점 요소를 정의한 다음에는 요소 구성 방법을 기술하는 요소 문법을 정의한다요소 문법은 PDE 요소를 검증할   사용한다왼쪽의 확장점 요소를 하나 선택하면

Element Grammer 출력된다.

 

 

확장점 구현 코드

확장점을 정의한 다음에는 새로 정의한 확장점에 대한 확장에서 선언하는 정보에 따라 Favorites 항목 유형과 Favorites 객체를 구성하는 코드를 작성해야 한다.

늦은 초기화라는 이클립스 원리를 따르면서 더불어 메모리 사용량을 낮추기 위해  Favorites항목 유형과 해당 플러그인은  필요할 때만 로딩 해야한다.

그렇게 하기 위해서는 확장될 때 사용되는 class 메소드등의 리팩토링이 필요하다.

 


여기서 나오는 예제의 FavoriteItemType 확장점에 사용되는 Class 명이다.

FavoriteItemType 대해  번째로 수정할 사항은 항목 유형 인스턴스를 클래스코드에서 상수로 직접 확장하는 대신 확장 정보로부터  클래스의 인스턴스를

생성하게 하는 것이다. TYPES 배열의 이름을 cachedTypes 변경해서  필드의 목적을 좀더 정확한 의미로 표현하게 한다또한 getType() 메소드를 수정해 

확장마다 FavoriteItemType  인스턴스를 생성하도록 한다.

댓글()