weidagang2046的專欄

          物格而后知致
          隨筆 - 8, 文章 - 409, 評論 - 101, 引用 - 0
          數(shù)據(jù)加載中……

          DND入門學(xué)習(xí)

          Drag and Drop是Eclipse為用戶在一個或多個SWT應(yīng)用之間重置部件或數(shù)據(jù)傳輸上提供的簡單快捷的機(jī)制。可以使用在普通SWT應(yīng)用中,也是學(xué)習(xí)GEF的基礎(chǔ)部分。下面我從以下幾個Drag and Drop所必需的部分來簡單講述:

          DragSource And DropTarget

          要實現(xiàn)Drag and Drop,就必須要有DragSource And DropTarget。DragSource是數(shù)據(jù)傳輸過程中的數(shù)據(jù)提供者,而DropTarget是數(shù)據(jù)接收者。他們分別綁定SWT的widget,需要注意的是同一widget只能幫定在一個DragSource或DropTarget上。在鼠標(biāo)拖動的過程中,我們可以通過鼠標(biāo)圖形的變化來得知當(dāng)前經(jīng)過的是否是一個有效的DropTarget,這個過程叫做“drag over effect”。鼠標(biāo)圖形同時也可以告訴我們在數(shù)據(jù)被Drop之后,什么樣的操作會被執(zhí)行,是拷貝還是移動還是別的什么。在windows中有以下幾種鼠標(biāo)圖形:
          [attachment=453]?
          如果我們drag over一個帶有item的部件,比方說tree或者table,那么item會變成高亮表明我們會將數(shù)據(jù)Drop在這個item上,這個過程我們叫“drag under effect”。

          Transfer

          有了DragSource 和 DropTarget之后,我們就需要一個載體來承載不同類型的數(shù)據(jù),讓這個載體在DragSource 和 DropTarget之間傳遞數(shù)據(jù)。Transfer實際上是一個提供數(shù)據(jù)在Java representation與platform specific representation之間交互的抽象類.在Java對象與特定的平臺之間進(jìn)行format,下面是幾個format:
          TextTransfer String "hello world"?
          RTFTransfer String "{\\rtf1\\b\\i hello world}"
          FileTransfer String[] new String[] {file1.getAbsolutePath(), file2.getAbsolutePath()}
          Transfer是傳輸?shù)妮d體,TransferData真正的利用JNI將數(shù)據(jù)和本地操作系統(tǒng)發(fā)生關(guān)系。TransferData包含了很多特定于平臺的公用的屬性,應(yīng)用不應(yīng)該直接去訪問這些屬性。如果真的有必要去訪問這些屬性,那么我們可以通過擴(kuò)展Transfer類來完成對特定平臺的額外操作。
          另外,Transfer不只是可以用在DND中,也可以單獨(dú)拿出來使用,例如實現(xiàn)Clipboard,可以在copy時將數(shù)據(jù)暫存于Clipboard中,past時再取出。這個和DND的在Drag時將數(shù)據(jù)暫存于Clipboard中,Drop時再取出類似。
          理解了拖拽的這些概念之后,下面我們就著一個簡單的例子來運(yùn)用一下。如圖所示,這個例子中,左面的tree是DragSource,右面的table是DropTarget,我們從左面的tree中選擇一條,拖進(jìn)右邊的table中:


          我們先從DragSource開始:

          //獲得一個TextTransfer的實例,TextTransfer是Transfer的一個子類,
          //他提供將普通文本以Java String的表示轉(zhuǎn)換為特定于平臺的表示的機(jī)制。
          TextTransfer textTransfer=TextTransfer.getInstance();

          //構(gòu)造一個普通的tree
          dragTree=new Tree(parent,SWT.FULL_SELECTION|SWT.SINGLE);

          //將dragTree與DragSource綁定(一個widget只能綁定在一個DragSource),
          //并允許數(shù)據(jù)可以從DragSource被MOVE或COPY
          DragSource source=new DragSource(dragTree,DND.DROP_MOVE|DND.DROP_COPY);
          //指定允許的textTransfer類型,可以是多個。
          source.setTransfer(new Transfer[] { textTransfer });
          //注冊DragSourceListener。處理拖操作的一些事件
          source.addDragListener(new MyDragSourceListener());

          在MyDragSourceListener中有以下3個方法:

          // 指定拖動開始的執(zhí)行策略。
          public void dragStart(DragSourceEvent event){
            //在這里可以設(shè)置一些條件,如果不符合條件,比方說選中的treeitem是根,
          ? ? //則不可拖動
          ? ? if(treeitem是根){
             ? event.doit=false;
          ? ? }
          }

          //dragSetData方法在dragStart通過之后才被調(diào)用。這個方法可能會因為同一種傳輸
          //類型多次set或不同的多種傳輸類型的set而被多次調(diào)用,象windows等有些平臺
          //中,dropTarget可以在鼠標(biāo)移動的過程中請求數(shù)據(jù),但是在Motif等平臺中,只可以
          //在drop操作完成之后才可以請求數(shù)據(jù),所以在這個方法中不要假設(shè)drag and drop操
          //作已經(jīng)完成.在這個方法中是無法知道data將被drop到哪里.
          //set的Data也要符合指定的Transfer的format類型。
          ? ? public void dragSetData(DragSourceEvent event){
             ? ? //在這里可以為DragSourceEvent添加數(shù)據(jù),這個方法在拖動過程中
              //會被不停的調(diào)用
          ? ? ? ? TreeItem selection = DragAndDrop.this.dragTree.getSelection()[0];
          ? ? ? ? event.data=selection.getText();
          ? ? }

          ? ? // 根據(jù)事先指定好的操作類型來處理操作結(jié)果
          ? ? public void dragFinished(DragSourceEvent event){
          ? ? ? ? if(event.detail==DND.DROP_MOVE){
          ? ? ? ? ? ? //remove selection TreeItem
          ? ? ? ? }
          ? ? }

          其次是DropTarget

          // 將dropTable指定為Drop Target,
          ? ? DropTarget target=new DropTarget(dropTable,DND.DROP_MOVE|DND.DROP_COPY|DND.DROP_DEFAULT);
          ? ? target.setTransfer(new Transfer[] {textTransfer });
          ? ? target.addDropListener(new MyDropTargetListener());

          對于MyDropTargetListener

          class MyDropTargetListener implements DropTargetListener{
          ? ? //dragEnter事件在drag and drop動作開始,并且鼠標(biāo)進(jìn)入了target widget的范圍內(nèi)時被調(diào)用。
          ? ? public void dragEnter(DropTargetEvent event){
          ? ? ? ? //在dragEnter中應(yīng)用可以定義default operation.如果一個drop target在創(chuàng)建的時候被指定為
          ? ? ? ? //帶有DND.DROP_DEFAULT,那么在拖動的過程中如果沒有輔助按鍵被按下,則drop target就是DND.DROP_DEFAULT的。
          ? ? ? ? //應(yīng)用可以通過改變event.detail來指定default operation。如果應(yīng)用沒有具體指定DND.DROP_DEFAULT的操作,
          ? ? ? ? //平臺會默認(rèn)將DND.DROP_DEFAULT設(shè)置為DND.DROP_MOVE。
          ? ? ? ? //另外DND.DROP_DEFAULT的值也可以在dragOperationChanged中設(shè)置。
          ? ? ? ?
          ? ? ? ? if(event.detail==DND.DROP_DEFAULT){
          ? ? ? ? ? //給event.detail賦的值必須是event.operations中的一個,event.operations中
          ? ? ? ? ? //的操作都是DragSource所支持的.
          ? ? ? ? ? if((event.operations&DND.DROP_COPY)!=0){
          ? ? ? ? ? ? event.detail=DND.DROP_COPY;
          ? ? ? ? ? }else{
          ? ? ? ? ? ? event.detail=DND.DROP_NONE;
          ? ? ? ? ? }
          ? ? ? ? }
          ? ? ? ?
          ? ? ? ? //drop target可以選擇性的按照傳輸類型來處理.dragEnter event有兩個屬性
          ? ? ? ? //event.currentType 是應(yīng)用設(shè)置的默認(rèn)類型,以TransferData對象形式表現(xiàn),
          ? ? ? ? //event.dataTypes 是drag source支持的所有類型的列表,以TransferData數(shù)組形式表現(xiàn),
          ? ? ? ? //我們可以將event.currentType設(shè)置成event.dataTypes中的任意一個。
          ? ? ? ? //這些屬性也可以在dragOver, dragOperationChanged以及dropAccept事件中設(shè)置。

          ? ? ? ? for(int i=0;i<event.dataTypes.length;i++){
          ? ? ? ? ? if(textTransfer.isSupportedType(event.dataTypes
          )){
          ? ? ? ? ? ? event.currentDataType=event.dataTypes
          ;
          ? ? ? ? ? ? //只允許COPY
          ? ? ? ? ? ? if(event.detail!=DND.DROP_COPY){
          ? ? ? ? ? ? ? ? event.detail=DND.DROP_NONE;
          ? ? ? ? ? ? }
          ? ? ? ? ? ? break;
          ? ? ? ? ? }
          ? ? ? ? }
          ? ? }

          ? ? //dragOver event在光標(biāo)進(jìn)入drop target widget時會被重復(fù)不停的調(diào)用.
          ? ? //如果光標(biāo)是靜止的,dragOver event依然會有規(guī)則的按一定時間間隔被調(diào)用.
          ? ? //這個方法一般在drop target是table或tree時用得比較多,可以根據(jù)不同的item而改變操作.
          ? ? public void dragOver(DropTargetEvent event){
          ? ? ? ? //event.feedback設(shè)置當(dāng)widget處于光標(biāo)下時應(yīng)該給用戶一個什么樣的feedback.
          ? ? ? ? //dragOver event.feedback 值描述
          ? ? ? ? //DND.FEEDBACK_SELECT 使光標(biāo)下的item被選中,限于table and trees.
          ? ? ? ? //DND.FEEDBACK_SCROLL 使widget可以滾動以便于用戶可以drop在當(dāng)前看不見的item上,限于table and trees.
          ? ? ? ? //DND.FEEDBACK_EXPAND 使當(dāng)前光標(biāo)下的item展開以便于用戶在sub item上drop,限于trees.
          ? ? ? ? //DND.FEEDBACK_INSERT_BEFORE 在item處于光標(biāo)下之前顯示一個插入標(biāo)記,限于tables and trees.
          ? ? ? ? //DND.FEEDBACK_INSERT_AFTER ? 在item處于光標(biāo)下之后顯示一個插入標(biāo)記,限于tables and trees.
          ? ? ? ? //DND.FEEDBACK_NONE ? 沒有任何效果.
          ? ? ? ? event.feedback=DND.FEEDBACK_SELECT|DND.FEEDBACK_SCROLL;
          ? ? ? ? if(textTransfer.isSupportedType(event.currentDataType)){
          ? ? ? ? ? String t=(String)(textTransfer.nativeToJava(event.currentDataType));
          ? ? ? ? ? if(t!=null){
          ? ? ? ? ? ? System.out.println(t);
          ? ? ? ? ? }
          ? ? ? ? }
          ? ? }

          ? ? //當(dāng)用戶按下或放開輔助按鍵時,例如Ctrl, Shift, Command, Option。則dragOperationChanged事件發(fā)生。
          ? ? //輔助按鍵可以改變即將進(jìn)行的操作。例如:
          ? ? //Ctrl key is down, a copy is requested,
          ? ? //Ctrl and Shift keys are both down, a link is requested
          ? ? //Shift key is down, a move is requested
          ? ? //When no modifier keys are pressed, the default operation is requested.
          ? ? public void dragOperationChanged(DropTargetEvent event){
          ? ? ? ? if(event.detail==DND.DROP_DEFAULT){
          ? ? ? ? ? event.detail=DND.DROP_COPY;
          ? ? ? ? }else{
          ? ? ? ? ? event.detail=DND.DROP_NONE;
          ? ? ? ? }

          ? ? ? ? // allow text to be moved but files should only be copied
          ? ? ? ? if(fileTransfer.isSupportedType(event.currentDataType)){
          ? ? ? ? ? if(event.detail!=DND.DROP_COPY){
          ? ? ? ? ? ? event.detail=DND.DROP_NONE;
          ? ? ? ? ? }
          ? ? ? ? }
          ? ? }

          ? ? //當(dāng)光標(biāo)離開drop target widget時,dragLeave事件發(fā)生. 如果你在dragEnter中分配了一些資源,
          ? ? //就應(yīng)該在dragLeave中釋放.dragLeave事件在用戶通過Escape鍵取消Drag and Drop操作時也會發(fā)生
          ? ? //剛好在drop操作被執(zhí)行之前.
          ? ? public void dragLeave(DropTargetEvent event){
          ? ? }

          ? ? //dropAccept事件為應(yīng)用提供了最后一次定義數(shù)據(jù)類型的機(jī)會,定義的數(shù)據(jù)類型將被返回到drop事件.
          ? ? //這些是通過向event.currentDataType賦event.dataTypes中的值來實現(xiàn)的.
          ? ? public void dropAccept(DropTargetEvent event){
          ? ? }

          ? ? //如果在之前的事件中得到了有效的操作和currentDataType,那么當(dāng)用戶在drop target上松開鼠標(biāo)時,drop事件會發(fā)生。
          ? ? //event.data屬性包含了請求到的數(shù)據(jù),event.type包含了Transfer的類型.
          ? ? //data是event.currentDataType中定義的類型.
          ? ? public void drop(DropTargetEvent event){
          ? ? ? ? if(textTransfer.isSupportedType(event.currentDataType)){
          ? ? ? ? ? String text=(String)event.data;
          ? ? ? ? ? TableItem item=new TableItem(dropTable,SWT.NONE);
          ? ? ? ? ? item.setText(text);
          ? ? ? ? }
          ? ? ? ? if(fileTransfer.isSupportedType(event.currentDataType)){
          ? ? ? ? ? String[] files=(String[])event.data;
          ? ? ? ? ? for(int i=0;i<files.length;i++){
          ? ? ? ? ? ? TableItem item=new TableItem(dropTable,SWT.NONE);
          ? ? ? ? ? ? item.setText(files
          );
          ? ? ? ? ? }
          ? ? ? ? }
          ? ? }
          ? }

          package ?net.advanced.eclipse.sample.views;

          import
          ?org.eclipse.swt.SWT;
          import
          ?org.eclipse.swt.dnd.DND;
          import
          ?org.eclipse.swt.dnd.DragSource;
          import
          ?org.eclipse.swt.dnd.DragSourceEvent;
          import
          ?org.eclipse.swt.dnd.DragSourceListener;
          import
          ?org.eclipse.swt.dnd.DropTarget;
          import
          ?org.eclipse.swt.dnd.DropTargetEvent;
          import
          ?org.eclipse.swt.dnd.DropTargetListener;
          import
          ?org.eclipse.swt.dnd.FileTransfer;
          import
          ?org.eclipse.swt.dnd.TextTransfer;
          import
          ?org.eclipse.swt.dnd.Transfer;
          import
          ?org.eclipse.swt.widgets.Composite;
          import
          ?org.eclipse.swt.widgets.Table;
          import
          ?org.eclipse.swt.widgets.TableColumn;
          import
          ?org.eclipse.swt.widgets.TableItem;
          import
          ?org.eclipse.swt.widgets.Tree;
          import
          ?org.eclipse.swt.widgets.TreeItem;
          import
          ?org.eclipse.ui.part.ViewPart;

          /**

          ?*?@Title:?DragAndDrop.java
          ?*?@Copyright:
          ?*?@Company:
          ?*?@Created?on?2005-12-02?14:34:40
          ?*?
          @author ?孫其弘
          ?*?
          @version
          ?$Revision:?1.11?$
          ?*?
          @since
          ?1.0
          ?
          */


          public ? class ?DragAndDrop? extends ?ViewPart{
          ????
          private
          ?Tree?dragTree;
          ????
          private
          ?Table?dropTable;
          ????
          private
          ?TextTransfer?textTransfer;
          ????
          private
          ?FileTransfer?fileTransfer;

          ????
          public ? void
          ?createPartControl(Composite?parent){
          ????????
          /*
          ?Transfer是一個可以提供數(shù)據(jù)在Java?representation與platform?specific?representation
          ?????????*?之間交互的抽象類.下面是幾個format:
          ?????????*?TextTransfer?String?"hello?world"?
          ?????????*?RTFTransfer?String?"{\\rtf1\\b\\i?hello?world}"?
          ?????????*?FileTransfer?String[]?new?String[]?{file1.getAbsolutePath(),?file2.getAbsolutePath()}?
          ?????????*?
          ?????????*?TransferData包含了很多特定于平臺的公用的屬性,應(yīng)用不應(yīng)該直接去訪問這些屬性。
          ?????????*?如果真的有必要去訪問這些屬性,那么我們可以通過擴(kuò)展Transfer類來完成對特定平臺的額外操作。
          ?????????
          */

          ????????textTransfer
          = TextTransfer.getInstance();
          ????????fileTransfer
          =
          FileTransfer.getInstance();

          ????????dragTree
          = new ?Tree(parent,SWT.FULL_SELECTION |
          SWT.SINGLE);
          ????????
          for ( int ?i = 0 ;i < 10 ;i ++
          ){
          ????????????TreeItem?item
          = new
          ?TreeItem(dragTree,SWT.NONE);
          ????????????item.setText(
          " treeitem " +
          i);
          ????????????
          for ( int ?i2 = 0 ;i2 < 5 ;i2 ++
          ){
          ????????????????TreeItem?subitem
          = new
          ?TreeItem(item,SWT.NONE);
          ????????????????subitem.setText(
          " subtreeitem " +
          i2);
          ????????????}
          ????????}

          ????????
          //
          將dragLabel指定為DragSource(一個widget只能幫定在一個DragSource),
          ????????
          // 并允許數(shù)據(jù)可以從DragSource被MOVE或COPY

          ????????DragSource?source = new ?DragSource(dragTree,DND.DROP_MOVE | DND.DROP_COPY);
          ????????source.setTransfer(
          new ?Transfer[]?{?textTransfer?}); // ?指定允許的傳輸類型

          ????????source.addDragListener( new ?MyDragSourceListener());

          ????????dropTable
          = new ?Table(parent,SWT.BORDER | SWT.FULL_SELECTION |
          SWT.SINGLE);
          ????????fillTable();

          ????????
          // ?將dropTable指定為Drop?Target,

          ????????DropTarget?target = new ?DropTarget(dropTable,DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT);
          ????????target.setTransfer(
          new
          ?Transfer[]?{textTransfer?});
          ????????target.addDropListener(
          new
          ?MyDropTargetListener());
          ????}

          ????
          class ?MyDragSourceListener? implements
          ?DragSourceListener{
          ????????
          // ?指定拖動開始的執(zhí)行策略。

          ???????? public ? void ?dragStart(DragSourceEvent?event){
          ????????????
          if (((DragSource)event.widget).getControl()? instanceof
          ?Tree){
          ????????????????TreeItem?selection?
          = ?DragAndDrop. this .dragTree.getSelection()[ 0
          ];
          ????????????????
          if (selection.getText().length() == 0
          ){
          ????????????????????event.doit
          = false
          ;
          ????????????????}?
          ????????????}
          ????????}

          ????????
          //
          dragSetData方法在dragStart通過之后才被調(diào)用。這個方法可能會因為同一種傳輸類型多次set或
          ????????
          //
          不同的多種傳輸類型的set而被多次調(diào)用,象windows等有些平臺中,dropTarget可以在鼠標(biāo)移動的
          ????????
          //
          過程中請求數(shù)據(jù),但是在Motif等平臺中,只可以在drop操作完成之后才可以請求數(shù)據(jù),所以在這個方
          ????????
          //
          法中不要假設(shè)drag?and?drop操作已經(jīng)完成.在這個方法中是無法知道data將被drop到哪里.
          ????????
          // set的Data也要符合指定的Transfer的format類型。

          ???????? public ? void ?dragSetData(DragSourceEvent?event){
          ????????????
          if
          (TextTransfer.getInstance().isSupportedType(event.dataType)){
          ????????????????
          if (((DragSource)event.widget).getControl()? instanceof
          ?Tree){
          ????????????????????TreeItem?selection?
          = ?DragAndDrop. this .dragTree.getSelection()[ 0
          ];
          ????????????????????event.data
          =
          selection.getText();
          ????????????????}
          ????????????}
          ????????}

          ????????
          // ?根據(jù)事先指定好的操作類型來處理操作結(jié)果

          ???????? public ? void ?dragFinished(DragSourceEvent?event){
          ????????????
          if (event.detail ==
          DND.DROP_MOVE){
          ????????????????
          if (((DragSource)event.widget).getControl()? instanceof
          ?Tree){
          ????????????????????TreeItem?selection?
          = ?DragAndDrop. this .dragTree.getSelection()[ 0
          ];
          ????????????????????selection.removeAll();
          ????????????????}
          ????????????}
          ????????}
          ????}

          ????
          class ?MyDropTargetListener? implements
          ?DropTargetListener{
          ????????
          // dragEnter事件在drag?and?drop動作開始,并且鼠標(biāo)進(jìn)入了target?widget的范圍內(nèi)時被調(diào)用。

          ???????? public ? void ?dragEnter(DropTargetEvent?event){
          ????????????
          //
          在dragEnter中應(yīng)用可以定義default?operation.如果一個drop?target在創(chuàng)建的時候被指定為
          ????????????
          //
          帶有DND.DROP_DEFAULT,那么在拖動的過程中如果沒有輔助按鍵被按下,則drop?target就是DND.DROP_DEFAULT的。
          ????????????
          //
          應(yīng)用可以通過改變event.detail來指定default?operation。如果應(yīng)用沒有具體指定DND.DROP_DEFAULT的操作,
          ????????????
          //
          平臺會默認(rèn)將DND.DROP_DEFAULT設(shè)置為DND.DROP_MOVE。
          ????????????
          // 另外DND.DROP_DEFAULT的值也可以在dragOperationChanged中設(shè)置。

          ????????????
          ????????????
          if (event.detail ==
          DND.DROP_DEFAULT){
          ????????????????
          //
          給event.detail賦的值必須是event.operations中的一個,event.operations中
          ????????????????
          // 的操作都是DragSource所支持的.?

          ???????????????? if ((event.operations & DND.DROP_COPY) != 0 ){
          ????????????????????event.detail
          =
          DND.DROP_COPY;
          ????????????????}
          else
          {
          ????????????????????event.detail
          =
          DND.DROP_NONE;
          ????????????????}
          ????????????}
          ????????????
          ????????????
          //
          drop?target可以選擇性的按照傳輸類型來處理.dragEnter?event有兩個屬性
          ????????????
          //
          event.currentType?是應(yīng)用設(shè)置的默認(rèn)類型,以TransferData對象形式表現(xiàn),
          ????????????
          //
          event.dataTypes?是drag?source支持的所有類型的列表,以TransferData數(shù)組形式表現(xiàn),?
          ????????????
          //
          我們可以將event.currentType設(shè)置成event.dataTypes中的任意一個。
          ????????????
          // 這些屬性也可以在dragOver,?dragOperationChanged以及dropAccept事件中設(shè)置。


          ????????????
          for ( int ?i = 0 ;i < event.dataTypes.length;i ++ ){
          ????????????????
          if
          (textTransfer.isSupportedType(event.dataTypes[i])){
          ????????????????????event.currentDataType
          =
          event.dataTypes[i];
          ????????????????????
          // 只允許COPY

          ???????????????????? if (event.detail != DND.DROP_COPY){
          ????????????????????????event.detail
          =
          DND.DROP_NONE;
          ????????????????????}
          ????????????????????
          break
          ;
          ????????????????}
          ????????????}
          ????????}

          ????????
          //
          dragOver?event在光標(biāo)進(jìn)入drop?target?widget時會被重復(fù)不停的調(diào)用.?
          ????????
          //
          如果光標(biāo)是靜止的,dragOver?event依然會有規(guī)則的按一定時間間隔被調(diào)用.?
          ????????
          // 這個方法一般在drop?target是table或tree時用得比較多,可以根據(jù)不同的item而改變操作.

          ???????? public ? void ?dragOver(DropTargetEvent?event){
          ????????????
          //
          event.feedback設(shè)置當(dāng)widget處于光標(biāo)下時應(yīng)該給用戶一個什么樣的feedback.?
          ????????????
          //
          dragOver?event.feedback?值描述?
          ????????????
          //
          DND.FEEDBACK_SELECT??使光標(biāo)下的item被選中,限于table?and?trees.?
          ????????????
          //
          DND.FEEDBACK_SCROLL??使widget可以滾動以便于用戶可以drop在當(dāng)前看不見的item上,限于table?and?trees.??
          ????????????
          //
          DND.FEEDBACK_EXPAND??使當(dāng)前光標(biāo)下的item展開以便于用戶在sub?item上drop,限于trees.?
          ????????????
          //
          DND.FEEDBACK_INSERT_BEFORE??在item處于光標(biāo)下之前顯示一個插入標(biāo)記,限于tables?and?trees.?
          ????????????
          //
          DND.FEEDBACK_INSERT_AFTER???在item處于光標(biāo)下之后顯示一個插入標(biāo)記,限于tables?and?trees.??
          ????????????
          // DND.FEEDBACK_NONE????沒有任何效果.?

          ????????????event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL;
          ????????????
          if
          (textTransfer.isSupportedType(event.currentDataType)){
          ????????????????String?t
          =
          (String)(textTransfer.nativeToJava(event.currentDataType));
          ????????????????
          if (t != null
          ){
          ????????????????????System.out.println(t);
          ????????????????}
          ????????????}
          ????????}

          ????????
          //
          當(dāng)用戶按下或放開輔助按鍵時,例如Ctrl,?Shift,?Command,?Option。則dragOperationChanged事件發(fā)生。
          ????????
          //
          輔助按鍵可以改變即將進(jìn)行的操作。例如:
          ????????
          //
          Ctrl?key?is?down,?a?copy?is?requested,
          ????????
          //
          Ctrl?and?Shift?keys?are?both?down,?a?link?is?requested
          ????????
          //
          Shift?key?is?down,?a?move?is?requested
          ????????
          // When?no?modifier?keys?are?pressed,?the?default?operation?is?requested.?

          ???????? public ? void ?dragOperationChanged(DropTargetEvent?event){
          ????????????
          if (event.detail ==
          DND.DROP_DEFAULT){
          ????????????????event.detail
          =
          DND.DROP_COPY;
          ????????????}
          else
          {
          ????????????????event.detail
          =
          DND.DROP_NONE;
          ????????????}

          ????????????
          // ?allow?text?to?be?moved?but?files?should?only?be?copied

          ???????????? if (fileTransfer.isSupportedType(event.currentDataType)){
          ????????????????
          if (event.detail !=
          DND.DROP_COPY){
          ????????????????????event.detail
          =
          DND.DROP_NONE;
          ????????????????}
          ????????????}
          ????????}

          ????????
          //
          當(dāng)光標(biāo)離開drop?target?widget時,dragLeave事件發(fā)生.?如果你在dragEnter中分配了一些資源,
          ????????
          //
          就應(yīng)該在dragLeave中釋放.dragLeave事件在用戶通過Escape鍵取消Drag?and?Drop操作時也會發(fā)生
          ????????
          // 剛好在drop操作被執(zhí)行之前.

          ???????? public ? void ?dragLeave(DropTargetEvent?event){
          ????????}

          ????????
          //
          dropAccept事件為應(yīng)用提供了最后一次定義數(shù)據(jù)類型的機(jī)會,定義的數(shù)據(jù)類型將被返回到drop事件.?
          ????????
          // 這些是通過向event.currentDataType賦event.dataTypes中的值來實現(xiàn)的.

          ???????? public ? void ?dropAccept(DropTargetEvent?event){
          ????????}

          ????????
          //
          如果在之前的事件中得到了有效的操作和currentDataType,那么當(dāng)用戶在drop?target上松開鼠標(biāo)時,drop事件會發(fā)生。
          ????????
          //
          event.data屬性包含了請求到的數(shù)據(jù),event.type包含了Transfer的類型.?
          ????????
          // data是event.currentDataType中定義的類型.

          ???????? public ? void ?drop(DropTargetEvent?event){
          ????????????
          if
          (textTransfer.isSupportedType(event.currentDataType)){
          ????????????????String?text
          =
          (String)event.data;
          ????????????????TableItem?item
          = new
          ?TableItem(dropTable,SWT.NONE);
          ????????????????item.setText(text);
          ????????????}
          ????????????
          if
          (fileTransfer.isSupportedType(event.currentDataType)){
          ????????????????String[]?files
          =
          (String[])event.data;
          ????????????????
          for ( int ?i = 0 ;i < files.length;i ++
          ){
          ????????????????????TableItem?item
          = new
          ?TableItem(dropTable,SWT.NONE);
          ????????????????????item.setText(files[i]);
          ????????????????}
          ????????????}
          ????????}
          ????}
          ????
          ????
          public ? void
          ?fillTable(){
          ????????dropTable.setHeaderVisible(
          true
          );
          ????????dropTable.setLinesVisible(
          true
          );
          ????????
          ????????TableColumn?partName?
          = new
          ?TableColumn(dropTable,SWT.LEFT);
          ????????partName.setResizable(
          true
          );
          ????????partName.setText(
          " NAME "
          );
          ????????partName.setWidth(
          250
          );
          ????????
          ????????TableColumn?employeeName
          = new
          ?TableColumn(dropTable,SWT.LEFT);
          ????????employeeName.setResizable(
          true
          );
          ????????employeeName.setText(
          " SIZE "
          );
          ????????employeeName.setWidth(
          120
          );
          ????????
          ????????
          for ( int ?i = 0 ;i < 10 ;i ++
          ){
          ????????????TableItem?item
          = new
          ?TableItem(dropTable,SWT.NONE);
          ????????????item.setText(
          new ?String[]{ " tableitem " + i, 100 + i + ""
          });
          ????????}
          ????}
          ????
          ????
          public ? void
          ?setFocus(){

          ????}
          }

          from: http://www.eclipseworld.org/bbs/read.php?tid=893&page=e&fpage=1

          posted on 2006-09-05 01:03 weidagang2046 閱讀(2567) 評論(1)  編輯  收藏 所屬分類: Java

          評論

          # re: DND入門學(xué)習(xí)  回復(fù)  更多評論   

          作為插件運(yùn)行還需要創(chuàng)建plugin.xml文件,用PDE創(chuàng)建plugin project with view可得。

          <?xml version="1.0" encoding="UTF-8"?>
          <?eclipse version="3.0"?>
          <plugin>

          <extension
          point="org.eclipse.ui.views">
          <category
          name="DND Category"
          id="com.blogspot.weidagang2046.dnd">
          </category>
          <view
          name="DND View"
          icon="icons/sample.gif"
          category="com.blogspot.weidagang2046.dnd"
          class="com.blogspot.weidagang2046.dnd.views.DNDView"
          id="com.blogspot.weidagang2046.dnd.views.DNDView">
          </view>
          </extension>
          <extension
          point="org.eclipse.ui.perspectiveExtensions">
          <perspectiveExtension
          targetID="org.eclipse.ui.resourcePerspective">
          <view
          ratio="0.5"
          relative="org.eclipse.ui.views.TaskList"
          relationship="right"
          id="com.blogspot.weidagang2046.dnd.views.DNDView">
          </view>
          </perspectiveExtension>
          </extension>

          </plugin>
          2006-09-05 05:26 | weidagang2046
          主站蜘蛛池模板: 富宁县| 河北省| 兴业县| 云霄县| 曲麻莱县| 吉木萨尔县| 泾阳县| 裕民县| 松滋市| 东台市| 偏关县| 崇信县| 亚东县| 靖宇县| 曲水县| 栾川县| 班戈县| 铁岭县| 青川县| 牙克石市| 辰溪县| 岚皋县| 吉木乃县| 洪泽县| 泰兴市| 获嘉县| 泸溪县| 胶南市| 宁津县| 黔江区| 柳州市| 隆昌县| 咸丰县| 尉氏县| 新民市| 伽师县| 九江市| 沙湾县| 思南县| 黄浦区| 霍城县|