上一篇我已經說過了,每一個Editor如果希望使用調色盤,必須繼承自兩個EditorPart類。對於浮動調色盤來說,Editor的內容Composite是交給一個叫splitter的Composite來實現的。下面就是類結構圖:
由於splitter之中的內嵌組件都是內部類,我們很難直接存取,因此我們想改變他們是很困難的,其實不是不行,我們可以通過反射來實現訪問,但是還是比較麻煩,最好的方法就是將這些類重寫,然後將屬性和方法統統公開,那將是最好的;但是我今天想討論另外一個問題,那就是如何Hack進入paletteViewer之中的問題;
在上一篇文章中,我說過調色盤控制項的下半部分是被一個叫pCtrl的控制項佔據的,邏輯上pCtrl顯示了由pViewer管理的調色盤工具,而每一個“工具”都有一個EditPart與之相對應,同時每一個“工具”如何繪製都有這些EditPart所管理,而且對於Drawer、Group等等系統內部的“工具”都有其相關的Figure;可以說pViewer是GEF架構之中的一個小型的GEF;
看見紅色圓角矩形包含的地區了麼,這部分地區就是我們討論的pViewer所對應的地區。PaletteComposite就是由ButtonCanvas、TitleCanvas以及這部分組成的。
那麼既然這個部分就像一個小型的GEF程式,那麼我們是不是能夠Hack進去,改變其中的一些特性呢?答案當然是可以,其奧秘就在於我們的Editor中createPaletteViewerProvider方法所返回的PaletteViewerProvider對象身上;在PaletteViewerProvider對象中有一個方法叫做configurePaletteViewer,這個方法可以配置PaletteViewer。從上一篇的介紹我們知道,PaletteViewer是需要指定EditPartFactory的,那麼我們只要在這裡指定我們自訂的PaletteEditPartFactory就可以截獲所有作為控制器的調色盤EditPart,並管理相應調色盤Figure的繪製;當然這個工作是很大的,只有真的有必要我們再去做,在我自己的例子裡,我只是改變了調色盤工具顯示的表徵圖和文字中間對其,因為我覺得這樣好看一點;從可以看出還是有些區別的;
從上面兩圖可以看出,我還改變了調色盤的Title;以及Sash的顏色;
當然,我之所以把一個兄弟姐妹們八百年也不一定有興趣改變的東西拿出來討論討論,目的不是為了讓大家都去改調色盤,而是想通過這個討論讓大家更加瞭解GEF這個優秀的架構,如果其中真的有一些有益之處的話,也不枉我把他們寫出來;