Transfer 만들기(SWT)
/*
1. SWT 는
http://www.eclipse.org/swt 에서
2. SWT라고 분류는 해놨지만 GEF editor에다가다 붙여도 되는듯.
*/
드래그 앤 드랍 기능을 구현하는데 제공되는 Transfer는
TextTransfer
FileTransfer
HTMLTransfer
등등이 있다.
여기서 사용자가 정의한 클래스를 Transfer 하고 싶다면
org.eclipse.swt.dnd.ByteArrayTransfer를 상속받아서
구현하면 된다
먼저 API 를 보면
하나의 예시 코드가 있다
http://help.eclipse.org/stable/nftopic/org.eclipse.
platform.doc.isv/reference/api/org/eclipse/swt/dnd/ByteArrayTransfer.htmlString, long 타입의 변수들을 필드로 갖는 MyType class 를 사용한 코드이다.
여기서는, String, long, 타입 뿐만 아니라
java.util.ArrayList 등등을 필드로 갖는 class를 transfer 시키는
Transfer를 만들겠다.
일단 전송시킬 class 를 정의해보자
이제 Transfer.
org.eclipse.swt.dnd.ByteArrayTransfer를 상속받아야 한다.
member field 부터 보면,
이제 getTypeIds(), getTypeNames(), getInstance().
다음에는 javaToNative(Object object, TransferData transferData).
br />여기서 예제와 바뀐 점이 있는데,
첫번째로,
예제에서는 object instanceof MyType[] 즉.. 배열에 대한 instance 인지를 체크한 반면
여기서는 object instanceof MyClass , 즉, 배열이 아니다.
그리고 예제에서는 DataOutputStream을 쓴 반면에
여기서는 List(Object)를 내보내기 위해서 ObjectOutputStream을 사용하였다.
이 메소드를 보면
MyClass 멤버들을 타입에 맞게 ObjectOutputStream을 사용해서 write를 한다
예를 보면
String은 길이를 writeInt를 써서 write 하고 다음에 string을 byte array로 바꾼후에 write한다
int, boolean은 각각 writeInt, writeBoolean 으로
ArrayList(Object)는 writeObject를 사용한다
그리고 마지막으로 bout의 toByteArray한 결과를 사용해서
ByteArrayTransfer의 javaToNative를 콜한다.
다음은 nativeToJava(TransferData transferData).
여기서도 마찬가지로
예제와 다르게
DataInputStream 대신에 ObjectInputStream을 사용했고
배열을 사용하지 않았다.
여기서도 방법은 javaToNative와 비슷하게
멤버 필드의 타입마다 다른 read method로 불러다가 새로운 MyClass object에다가
각 멤버 필드에 대입한 후에 그 object를 리턴한다.
string은 write했던 방법을 생각해서
먼저 길이를 읽어다가 그 길이만큼 바이트 배열을 읽으면 되고,
int, boolean 은 각각 readInt, readBoolean을 사용하고
ArrayList(Object)는 readObject를 사용한다.
이렇게 하면 Transfer 완성이다.
최종 MyClassTransfer 는 다음과 같다.
추가적으로 말하면..
이 코드는 만든 다른 Transfer 코드를 수정해서 만들고
사정이 있어서 직접 테스트를 못해봤다......ㅠㅠ