国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

在RCP中實現用托拽打開Editor

2019-11-18 11:53:41
字體:
來源:轉載
供稿:網友

Java align=left>    工作臺窗口的Editor區域默認是顯示的,而且它支持拖拽操作。在Eclipse里面,把一個文件拖到Editor區域,就會自動打開該文件的Editor.該特性是在IWorkbenchWindowConfigurer 中設置。
 
    在PassWord Gate中,當拖動Password Gate View中的一個Group 或者 Service到Editor區域,會在Editor顯示該項的屬性。
 
    要實現此特性,有四部分是必須的。
 
    1     實現必要的Transfer類型,而且定義Editor要支持哪些類型。在Password Gate中,Transfer是LocalSelectionTransfer.Transfer用來進行數據的序列化,它可以支持在同一個程序,或不同程序間拖拽。
 
    2        因為在拖拽傳遞的過程中Editor Input 要實現序列化,所以要實現IPersistableElement接口。
 
    3        加入一個釋放適配器,當一個元素被扔到Editor區域,它可以知道如何進行操作,其實就是打開該元素的Editor.
 
    4        使Password View能夠進行拖操作,它要提供供拖的元素。
 
    下面進行代碼實現。
 
    在RCP的WorkbenchWindowAdvisor. PReWindowOpen中定義要求Editor Area支持的拖入對象的類型,以及打開相應Editor的事件。
 
    applicationWorkbenchWindowAdvisor.preWindowOpen() 01 public void preWindowOpen() {
02     ......
03     configurer.addEditorAreaTransfer(LocalSelectionTransfer.getInstance());
04     configurer.configureEditorAreaDropListener(new EditorAreaDropAdapter(
05         configurer.getWindow())); 
06     }

    Row 03定義了Editor Area支持的Transfer為LocalSelectionTransfer, LocalSelectionTransfer為自己實現的傳輸介質類。Row 04定義了對拖入Editor Area的對象的處理方法。EditorAreaDropAdapter實現了DropTargetListener接口,用來監聽Editor Area中的Drop事件,它會打開拖入Editor Area的對象所對應的Editor,假如同時拖入多個對象,它會打開每個對象對應的Editor.

 
EditorAreaDropAdapter.java
01 public class EditorAreaDropAdapter extends DropTargetAdapter {
02   private IWorkbenchWindow window;
03   
04   public EditorAreaDropAdapter(IWorkbenchWindow window) {
05     this.window = window;
06   }
07 
08   public void dragEnter(DropTargetEvent event) {
09     // always indicate a copy
10     event.detail = DND.DROP_COPY;
11   }
12 
13   public void dragOperationChanged(DropTargetEvent event) {
14     // always indicate a copy
15     event.detail = DND.DROP_COPY;
16   }
17 
18   public void drop(final DropTargetEvent event) {
19     Display d = window.getShell().getDisplay();
20     final IWorkbenchPage page = window.getActivePage();
21     if (page != null) {
22       d.asyncExec(new Runnable() {
23         public void run() {
24           asyncDrop(event, page);
25         }
26       });
27     }
28   }
29 
30   private void asyncDrop(DropTargetEvent event, IWorkbenchPage page) {
31     if (LocalSelectionTransfer.getInstance().isSupportedType(
32         event.currentDataType)) {
33       StrUCturedSelection selection = (StructuredSelection) event.data;
34       for (Iterator iter = selection.iterator(); iter.hasNext();) {
35         Object o = iter.next();
36         if (o instanceof Record) {
37           IEditorInput input = new RecordEditorInput((Record) o);
38           try {
39             page.openEditor(input, RecordEditor.ID);
40           } catch (Exception e) {
41             PwdgatePlugin.log("open ediotr RecordEditor", e);
42           }
43         } else if (o instanceof Group) {
44           IEditorInput input = new GroupEditorInput((Group) o);
45           try {
46             page.openEditor(input, GroupEditor.ID);
47           } catch (PartInitException e) {
48             PwdgatePlugin.log("open ediotr GroupEditor", e);
49           }
50         }
51       }
52     }
53   }
54 }



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 福鼎市| 嘉义县| 波密县| 通州区| 灵台县| 惠安县| 宁夏| 梁河县| 滦南县| 翼城县| 凤阳县| 汤原县| 葫芦岛市| 新田县| 井冈山市| 门头沟区| 夹江县| 肇州县| 洪雅县| 太仆寺旗| 黔南| 瑞昌市| 会昌县| 缙云县| 远安县| 商城县| 漳浦县| 正定县| 宜兰市| 新晃| 麻栗坡县| 申扎县| 呼和浩特市| 上饶市| 中卫市| 平陆县| 德惠市| 连南| 府谷县| 广汉市| 丰镇市|