Wayne的Java樂園

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            1 隨筆 :: 0 文章 :: 0 評論 :: 0 Trackbacks

          2010年7月12日 #

          GEF作為一個圖形框架,對于其中圖形元素的屬性的設定是非常重要的,這是因為每一個圖形元素的背后都是一個模型,而這些模型可以包含很多業務數據,如果我們最終選定GEF作為我們應用的解決方案的話,我們可以利用property view來實現對這些業務數據屬性的設定; 這就是我們這里即將討論的問題。
          Eclipse中property view一共有兩種,普通的property view,也就是key/value類型的property view和tabbed property view,后者將viewer分成了若干個tab page;利用tab page將不同的屬性分組;從我使用的經驗來看,我比較傾向于前者,因為前者可以解決絕大部分的問題,即便是我們希望編輯一個非常復雜的屬性,也可以自定義屬性編輯器來完成。比如我們常用的SWT Designer就是使用了第一種方式,當然我們不能否認后一種方式由于可以在property viewer中自定義布局及控件,界面比較炫,但是由于需要三個擴展點的配合,操作起來還是比較麻煩的;不過這里我不是要討論兩者的優劣,而是要討論如何使用這兩個東西,因此還是書歸正傳吧。
          org.eclipse.ui.views.properties.tabbed,這是絕不能少的。只有這樣,屬性頁面才能顯示出來;
          首先要想使用eclipse的property view,必須在相應的RCP程序或者Plugin程序中配置Dependencies,如果是第一種,需要增加org.eclipse.ui.views,如果是后一種,需要增加

          其次,如果應用為RCP,那么可以在視圖文件中以“org.eclipse.ui.views.PropertySheet”為id值,增加一個view,這個id就是Eclipse默認的屬性頁id;如果你記不住,那么用IPageLayout.ID_PROP_SHEET好了;當然這一步并不是必須的,你可以在自己的WorkbenchWindowAdvisor中配置setShowFastViewBars(true);這樣程序運行時就可以通過fast view bar來動態打開這個view了,怎么做隨你;我的建議是兩者都要,以防用戶將屬性頁關閉了,無法打開;(題外話是可以建一個Command/Action來打開屬性頁,但是我覺得沒有必要);

          經過以上兩步,我們的準備工作就完成了,下面就是如何在我們的Editor點選了某一個圖形元素時,屬性頁能夠被通知。事實上這里說的圖形元素是不確切的,而應該是這個圖形元素對應的模型元素;讓我們把眼光放得更寬廣一點,事實上并不僅僅局限于GEF,任何實現了IPropertySource接口的模型元素都可以被屬性頁顯示出來;
          模型元素實現IPropertySource后需要實現以下方法,具體含義就不說了:
          ·public Object getEditableValue();
          ·public IPropertyDescriptor[] getPropertyDescriptors();
          ·public Object getPropertyValue(Object id);
          ·public boolean isPropertySet(Object id);
          ·public void resetPropertyValue(Object id);
          ·public void setPropertyValue(Object id, Object value);
          其中最最重要的是第1、2和6個方法;尤其是第二個方法尤為重要。在定義PropertyDescriptor時,Eclipse已經提供了兩個主要的屬性描述類TextPropertyDescriptor和ComboBoxPropertyDescriptor,分別對應文本框和組合下拉框,但是如果是比較復雜的屬性,例如像字體、顏色這樣的屬性,相應的屬性描述類就要自己定義了,這時需要繼承PropertyDescriptor類定義自己的屬性描述類,而在定義這個類的過程中,必須指定相應的CellEditor,也就是屬性編輯器類,我的建議是對于非常復雜的屬性,比如屬性中包含了很多不同類型的子屬性,這些子屬性的個數會發生變化等等,那么可以定義一個DialogCellEditor的子類,以對話框的形式顯示所有的子屬性,并在對話框中對有子屬性進行顯示、操作。也就是說:
          MyPropertyDescriptor(繼承PropertyDescriptor)--->MyCellEditor(繼承CellEditor)--->MyDialog(繼承Dialog)--->子屬性顯示、操作;

          經過這些操作對于第一種property view已經足夠了,在GEF應用中當你選擇了某一個圖形時,其屬性就能顯示出來了。但是對于后者來說,這還遠遠不夠,因為它比較吊!

          對于tabbed property view來說,以上的步驟是不能缺的,除此而外還需要配置org.eclipse.ui.views.properties.tabbed.propertyContributor、org.eclipse.ui.views.properties.tabbed.propertyTabs和org.eclipse.ui.views.properties.tabbed.propertySections三個擴展點;第一個擴展點的最主要作用是通知屬性頁究竟是workbench part為屬性頁提供屬性,說白了(我的理解,就是所有我們想最終選擇的那些元素放在了哪個workbench part上),因此相應的contributorId往往是editor的id;這里需要超級注意的是對于GEF應用來說,必須要配置typeMapper,也就是定義實現ITypeMapper的類,如下:
          public Class mapType(Object object) {
            Class type = object.getClass();
            if(object instanceof EditPart) {
             type = ((EditPart)object).getModel().getClass();
            }
            return type;
           }
          沒有這一步,毛也顯示不出來;其實我們可以通過以上代碼看出,這個轉換就是將控制器轉換為模型;此外相應的editor必須繼承ITabbedPropertySheetPageContributor接口,提供getContributorId()方法,也就是返回editor的ID;而且還要重載getAdapter方法提供如下實現:
          public Object getAdapter(Class adapter) {
            if(adapter == IPropertySheetPage.class) {
              return new TabbedPropertySheetPage(this);
            }
                  return super.getAdapter(adapter);
          }

          當完成了以上所有步驟之后,分頁的屬性頁就顯示出來了。具體的Section的定義就不說了,其實不過是定義public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage)這個函數罷了;它和其他的createControl沒什么區別,只是我們可以利用getWidgetFactory()來構造界面元素,其他的沒有什么新鮮的;

          以上就是屬性頁在GEF中的應用。
          posted @ 2010-07-12 16:48 Wayne Wang 閱讀(1515) | 評論 (0)編輯 收藏

          僅列出標題  
          主站蜘蛛池模板: 保德县| 嘉峪关市| 当阳市| 迭部县| 日土县| 庆元县| 彰化县| 白城市| 星子县| 眉山市| 荔浦县| 枣阳市| 论坛| 宣化县| 固阳县| 巴林右旗| 安丘市| 寿光市| 永吉县| 五大连池市| 于都县| 古交市| 贵德县| 寿光市| 镇坪县| 光山县| 准格尔旗| 商洛市| 阿拉善左旗| 山阴县| 达州市| 磴口县| 郸城县| 修文县| 股票| 平谷区| 松滋市| 珠海市| 炉霍县| 古丈县| 登封市|