어플리케이션에 항목 드롭하기
- 등록된 컨트롤에 데이터를 올려 놓을 경우 데이터를 받아 들일 수 있으며, 이때 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를 동작시키는 작업이다.
- dragEnter() 항목을 끌고 가는 동안, 커서가 컨트롤의 경계부분으로 들어온다.
- dragOver() 커서가 항목을 끌고 가면서 컨트롤 위를 이동한다.
- dragOperationChanged() 사용자가 사용할 동작 유형을 바꿀 때마다 이 메소드를 호출 한다. 이 이벤트는 주로 Ctrl이나 Option 등의 기능키를 누르거나 뗄 때 발생한다.
- dropAccept() 사용자가 컨트롤에서 항목을 놓는다. 이 때가 애플리케이션이 이런 떨어트리는 작업을 거절하거나 수행할 동작유형을 변경할 수 있는 마지막 과정이다.
- Drop() 데이터를 놓는다. 리스너에서 주어진 데이터를 적절히 다룰 수 있는 로직을 구현해야 한다.
각 메소드 에서는 DropTargetEvent를 바등며 이 이벤트는 현재 동작 정보를 포함한다. 사용할 데이터 유형과 수행 동작을 변경하기 위해서는 각각의 currentDataType과 detail 필드를 수정한다.
여섯번재 메소드인 dragLeave()는 dropAccept() 를 호출 하기 전에 언제든지 호출 할 수 있으며, 애플리케이션에게 사용자가 커서를컨트롤 밖으로 이동햇지만 드롭하지 않았다고 알려준다.
DragSource는컨트롤을 데이터의 소스로 등록하기 위해 생성된다. DragSourListener는 드래그 동작을 시작할 때 이벤트를 받으며 해당 항목을 놓을 때의 처리로직을 구현한다.
- dragStart() 사용자는 이 컨트롤에서 데이터 드래그를 시작한다. 드래그를 진행하기 위해서는 이벤트의 doit 필드를 true로 설정해야 한다.
- dragSetData() 놓기를 수행한다. 이 메소드는 놓을 데이터를 제공하기 위해 이벤트의 data필드에 데이터를 넣는다.
- dragFinished() 놓는 동작을 성공적으로 끝낸다. 마무리 작업, 즉 원본데이터 삭제 작업 같은 작업을 여기에서 수행한다.
'RCP > SWT & JFACE' 카테고리의 다른 글
IWizardPage 인터페이스 (0) | 2016.12.24 |
---|---|
Draw2d 설명 (0) | 2016.12.24 |
이벤트로 받은 키보드 멀티 인식 방법 (0) | 2016.12.24 |
RCP 확장점 소개 (0) | 2016.12.24 |
rcp toolbar에서 label등 각종 contribution item 생성방법 (0) | 2016.12.24 |