上文提到的GEF工作過(guò)程中還有一些不太詳細(xì)的地方,這里做些補(bǔ)充。
再GEF中UI的操作交互都是通過(guò)構(gòu)建Request,并調(diào)用EditPart中的API來(lái)完成相應(yīng)的操作,這些API可以分為四類(lèi):
1。??EditPart getTargetEditPart(Request)
???boolean understandsRequest(Request)
再我們進(jìn)行交互操作時(shí),首先要確定激活的是那個(gè)EditPart,經(jīng)常是一個(gè)當(dāng)前被選中的viewer和通過(guò)單擊選擇的EditPart的復(fù)合體。這個(gè)被選擇的部件通過(guò)詢(xún)問(wèn)每個(gè)被選擇的EditPart是否處理這個(gè)request(通過(guò)understandsRequest方法)。那個(gè)在鼠標(biāo)單擊確定的EditPart是通過(guò)viewer的幫助和getTargetEditPart方法來(lái)找到的。并不是所有的交互都有target。
2。
void showSourceFeedback(Request)
void eraseSourceFeedback(Request)
void showTargetFeedback(Request)
void eraseTargetFeedback(Request)
在我們的交互操作特別是托拽圖形時(shí),就需要EditPart來(lái)回顯(Feedback),托拽源被認(rèn)為是起作用的那個(gè)editpart,目的部件被認(rèn)為是鼠標(biāo)的目的地。showXXXFeedback可能是在鼠標(biāo)移到目的地,但未作用于目的part時(shí)調(diào)用,eraseXXXFeedback則可能是在鼠標(biāo)作用于目的part后調(diào)用的。
3。Command getCommand(Request)
這個(gè)方法用于獲得可執(zhí)行的命令列表,命令可以對(duì)模型進(jìn)行操作,Editpart通過(guò)request詢(xún)問(wèn)Editpolicy來(lái)獲得相應(yīng)的command列表。同時(shí)command也可以判斷這個(gè)交互操作是否時(shí)可能的。如果沒(méi)有command或者command不能執(zhí)行,則ui會(huì)指出這個(gè)操作是不能執(zhí)行的(鼠標(biāo)變成禁止操作的樣子)。如果一個(gè)editpart返回null作為command則它不會(huì)阻止這個(gè)交互操作,除非沒(méi)有一個(gè)command被提供。為了指示某個(gè)操作是不能執(zhí)行的則EditPart需要返回一個(gè)不能執(zhí)行的command。
4。void performRequest(Request)
還有一種API,它讓EditPart去do something,可能是一些并不會(huì)立即就改變model的改變,比如打開(kāi)對(duì)話框或者激活直接編輯模式。
??????? EditPart并不直接進(jìn)行編輯,它將操作委托給EditPolicy,每個(gè)EditPolicy專(zhuān)著于一種編輯任務(wù)或者一組相關(guān)的操作。當(dāng)上面的API被調(diào)用后(除了performRequest方法),EditPart便委托給它的EditPolicy來(lái)處理這個(gè)request。對(duì)于不同的方法,EditPart可能是在第一個(gè)能處理request的policy處就停止調(diào)用了或者每個(gè)policy都有機(jī)會(huì)執(zhí)行這個(gè)request。GEF提供了幾個(gè)默認(rèn)的policy,不過(guò)還是需要實(shí)現(xiàn)其中的一些特定方法。
???????? 這里再?gòu)U話一點(diǎn),在注冊(cè)相應(yīng)的EditPolicy時(shí),需要指定Role,這是一個(gè)字符串,用來(lái)標(biāo)示這個(gè)EditPolicy,相同的Role對(duì)應(yīng)的EditPolicy會(huì)被替換,例如子類(lèi)可以通過(guò)Role這個(gè)Key來(lái)覆蓋其父類(lèi)所安裝的EditPolicy。EditPolicy(Role)分成兩種類(lèi)型,一種是圖形的,一種是非圖形的,上文中有提到,這里詳細(xì)的描述一下:
Non-Graphical Roles:
1) COMPONENT_ROLE: 一個(gè)Component存在于一個(gè)parent中,并且可以從parent中刪除。更為一般的,它可以使任何只涉及到這個(gè)EditPart,而與View無(wú)關(guān)的東西。(More generally, it is anything that involves only this EditPart.)
2) CONNECTION_ROLE 這是ConnectionEditParts應(yīng)該有的一個(gè)基本角色。Connections同Components有一點(diǎn)不同,刪除Connections時(shí)通常還需要其從其source和target節(jié)點(diǎn)中刪除,而不是從其parent中刪除。
3) CONTAINER_ROLE 大部分擁有children的EditParts都應(yīng)該具有這個(gè)角色。一個(gè)Container會(huì)涉及到adds/orphans以及creates/deletes等操作。
4) NODE_ROLE 如果一個(gè)EditParts用戶(hù)Connection,則其應(yīng)該具有這個(gè)角色,它可以用來(lái)創(chuàng)建,刪除,重新連接一個(gè)Connection。
Graphical Roles:
1) PRIMARY_DRAG_ROLE: 用來(lái)允許用戶(hù)拖動(dòng)這個(gè)EditPart。用戶(hù)可以通過(guò)點(diǎn)擊這個(gè)EditPart然后拖動(dòng),或者點(diǎn)擊這個(gè)EditPart所創(chuàng)建的一個(gè)Handle來(lái)進(jìn)行拖動(dòng)。
2) LAYOUT_ROLE: Layout角色用來(lái)放在一個(gè)Container的EditPart上,這個(gè)EditPart擁有一個(gè)graphical layout。如果這個(gè)layout有constraints,則它需要通過(guò)計(jì)算來(lái)得到這個(gè)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. 用于支持連接到重點(diǎn)的node,當(dāng)創(chuàng)建、操作連接時(shí),包含這個(gè)Role的Editpolicy會(huì)分析request的數(shù)據(jù),來(lái)在圖形view上做“hit testing”,并且判斷這個(gè)connection的語(yǔ)義。
4) CONNECTION_ENDPOINTS_ROLE: 這個(gè)Role允許用戶(hù)拖動(dòng)一個(gè)ConnectionEditPart的端點(diǎn)。
5) CONNECTION_BENDPOINTS_ROLE: 這個(gè)Role允許用戶(hù)能夠在一個(gè)Connection中間拖動(dòng)和創(chuàng)建bendpoints。
6) SELECTION_FEEDBACK_ROLE: 這個(gè)角色只是用來(lái)顯示feedback。當(dāng)鼠標(biāo)進(jìn)入或者在一個(gè)EditPart上暫停時(shí),Selection Tool會(huì)發(fā)送兩個(gè)類(lèi)型的request給EditPart。安裝了這個(gè)角色的EditPart能夠在此時(shí)接受這些請(qǐng)求來(lái)改變view的樣子,或者彈出tip,label等。
7) TREE_CONTAINER_ROLE: SWT Tree的Layout Role。 本地SWT Tree的Layout Role的等價(jià)物。這個(gè)EditPolicy應(yīng)該在樹(shù)上顯示反饋并計(jì)算索引,就像在file explorer里拖拽一樣。
over。