很久很久以前

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            34 隨筆 :: 4 文章 :: 17 評論 :: 0 Trackbacks
          上文提到的GEF工作過程中還有一些不太詳細(xì)的地方,這里做些補充。
          再GEF中UI的操作交互都是通過構(gòu)建Request,并調(diào)用EditPart中的API來完成相應(yīng)的操作,這些API可以分為四類:
          1。??EditPart getTargetEditPart(Request)
          ???boolean understandsRequest(Request)
          再我們進(jìn)行交互操作時,首先要確定激活的是那個EditPart,經(jīng)常是一個當(dāng)前被選中的viewer和通過單擊選擇的EditPart的復(fù)合體。這個被選擇的部件通過詢問每個被選擇的EditPart是否處理這個request(通過understandsRequest方法)。那個在鼠標(biāo)單擊確定的EditPart是通過viewer的幫助和getTargetEditPart方法來找到的。并不是所有的交互都有target。
          2。
          void showSourceFeedback(Request)
          void eraseSourceFeedback(Request)
          void showTargetFeedback(Request)
          void eraseTargetFeedback(Request)

          在我們的交互操作特別是托拽圖形時,就需要EditPart來回顯(Feedback),托拽源被認(rèn)為是起作用的那個editpart,目的部件被認(rèn)為是鼠標(biāo)的目的地。showXXXFeedback可能是在鼠標(biāo)移到目的地,但未作用于目的part時調(diào)用,eraseXXXFeedback則可能是在鼠標(biāo)作用于目的part后調(diào)用的。
          3。Command getCommand(Request)
          這個方法用于獲得可執(zhí)行的命令列表,命令可以對模型進(jìn)行操作,Editpart通過request詢問Editpolicy來獲得相應(yīng)的command列表。同時command也可以判斷這個交互操作是否時可能的。如果沒有command或者command不能執(zhí)行,則ui會指出這個操作是不能執(zhí)行的(鼠標(biāo)變成禁止操作的樣子)。如果一個editpart返回null作為command則它不會阻止這個交互操作,除非沒有一個command被提供。為了指示某個操作是不能執(zhí)行的則EditPart需要返回一個不能執(zhí)行的command。
          4。void performRequest(Request)
          還有一種API,它讓EditPart去do something,可能是一些并不會立即就改變model的改變,比如打開對話框或者激活直接編輯模式。

          ??????? EditPart并不直接進(jìn)行編輯,它將操作委托給EditPolicy,每個EditPolicy專著于一種編輯任務(wù)或者一組相關(guān)的操作。當(dāng)上面的API被調(diào)用后(除了performRequest方法),EditPart便委托給它的EditPolicy來處理這個request。對于不同的方法,EditPart可能是在第一個能處理request的policy處就停止調(diào)用了或者每個policy都有機會執(zhí)行這個request。GEF提供了幾個默認(rèn)的policy,不過還是需要實現(xiàn)其中的一些特定方法。

          ???????? 這里再廢話一點,在注冊相應(yīng)的EditPolicy時,需要指定Role,這是一個字符串,用來標(biāo)示這個EditPolicy,相同的Role對應(yīng)的EditPolicy會被替換,例如子類可以通過Role這個Key來覆蓋其父類所安裝的EditPolicy。EditPolicy(Role)分成兩種類型,一種是圖形的,一種是非圖形的,上文中有提到,這里詳細(xì)的描述一下:
          Non-Graphical Roles:
          1) COMPONENT_ROLE: 一個Component存在于一個parent中,并且可以從parent中刪除。更為一般的,它可以使任何只涉及到這個EditPart,而與View無關(guān)的東西。(More generally, it is anything that involves only this EditPart.)
          2) CONNECTION_ROLE 這是ConnectionEditParts應(yīng)該有的一個基本角色。Connections同Components有一點不同,刪除Connections時通常還需要其從其source和target節(jié)點中刪除,而不是從其parent中刪除。
          3) CONTAINER_ROLE 大部分擁有children的EditParts都應(yīng)該具有這個角色。一個Container會涉及到adds/orphans以及creates/deletes等操作。
          4) NODE_ROLE 如果一個EditParts用戶Connection,則其應(yīng)該具有這個角色,它可以用來創(chuàng)建,刪除,重新連接一個Connection。
          Graphical Roles:
          1) PRIMARY_DRAG_ROLE: 用來允許用戶拖動這個EditPart。用戶可以通過點擊這個EditPart然后拖動,或者點擊這個EditPart所創(chuàng)建的一個Handle來進(jìn)行拖動。
          2) LAYOUT_ROLE: Layout角色用來放在一個Container的EditPart上,這個EditPart擁有一個graphical layout。如果這個layout有constraints,則它需要通過計算來得到這個constraints。
          3) GRAPHICAL_NODE_ROLE: A node supports connections to terminals. When creating and manipulating connections, EditPolicies with this role might analyze a Request's data to perform "hit testing" on the graphical view and determine the semantics of the connection. 用于支持連接到重點的node,當(dāng)創(chuàng)建、操作連接時,包含這個Role的Editpolicy會分析request的數(shù)據(jù),來在圖形view上做“hit testing”,并且判斷這個connection的語義。
          4) CONNECTION_ENDPOINTS_ROLE: 這個Role允許用戶拖動一個ConnectionEditPart的端點。
          5) CONNECTION_BENDPOINTS_ROLE: 這個Role允許用戶能夠在一個Connection中間拖動和創(chuàng)建bendpoints。
          6) SELECTION_FEEDBACK_ROLE: 這個角色只是用來顯示feedback。當(dāng)鼠標(biāo)進(jìn)入或者在一個EditPart上暫停時,Selection Tool會發(fā)送兩個類型的request給EditPart。安裝了這個角色的EditPart能夠在此時接受這些請求來改變view的樣子,或者彈出tip,label等。
          7) TREE_CONTAINER_ROLE: SWT Tree的Layout Role。 本地SWT Tree的Layout Role的等價物。這個EditPolicy應(yīng)該在樹上顯示反饋并計算索引,就像在file explorer里拖拽一樣。
          over。

          posted on 2006-04-09 14:38 Long Long Ago 閱讀(767) 評論(0)  編輯  收藏 所屬分類: GEFEclipse
          主站蜘蛛池模板: 皮山县| 日喀则市| 林口县| 海淀区| 霸州市| 保山市| 府谷县| 张家口市| 定陶县| 西乡县| 松潘县| 黑水县| 博爱县| 繁昌县| 娄烦县| 海晏县| 辛集市| 沙田区| 库尔勒市| 板桥市| 龙江县| 宝鸡市| 光泽县| 沿河| 濮阳市| 景东| 沭阳县| 定结县| 固安县| 孟津县| 临潭县| 建湖县| 新邵县| 姚安县| 台南县| 大埔区| 巴林左旗| 德安县| 连江县| 屯昌县| 澄迈县|