給GMF應用程式新增自定義Action

2021-09-05 15:16:39 字數 2717 閱讀 9524

假設gmf為你生成的專案名稱為com.example.diagram,現在要在右鍵選單裡增加乙個自定義命令,並關聯在名為activity的模型元素上,即只有在activity型別的元素上點右鍵,彈出選單裡才有這個自定義命令。此命令的功能是簡單的把該activity的name屬性改為「modified activity」。實現的步驟如下:

1、如果之前沒有建立過,則建立乙個名為com.example.diagram.custom的plugin專案(以下簡稱為「custom專案」),新建這個專案的目的是把自己的定製與gmf生成的**分開;

2、在custom專案裡實現org.eclipse.ui.popupmenus擴充套件點,這樣會在右鍵選單裡多出乙個"change"選單項,下面有"name"命令;

<

extension

point

="org.eclipse.ui.popupmenus"

>

<

objectcontribution

adaptable

="false"

id="com.example.custom.objectcontribution.activityeditpart"

objectclass

="com.example.diagram.edit.parts.activityeditpart"

>

<

menu

id="bmachange"

label

="&change"

path

="additions"

>

<

separator

name

="group1"

/>

menu

>

<

action

class

="com.example.diagram.popup.changeactivitynameaction"

enablesfor

="1"

id="com.example.diagram.popup.changeactivitynameaction"

label

="&name"

menubarpath

="bmachange/group1"

/>

objectcontribution

>

extension

>

3、實現上一步裡定義的action類changeactivitynameaction,這個類不僅要實現iobjectactiondelegate(popupmenus擴充套件點的要求),還要繼承自abstractactiondelegate這個類(gmf的要求)。我們要做的是實現dorun()方法,首先取得當前選中的editpart,然後建立乙個setrequest例項,它包含了改變屬性操作的所有資訊,包括目標物件、屬性的名字和新屬性值。因為gmf裡editpart的getmodel()方法不是業務模型裡的元素了,而是view物件,要再呼叫view#getelement()才能得到業務模型裡的元素,所以**裡我們利用viewutil#resolvesemanticelement()方法直接得到activity物件。另外,gmf使用了emft的transaction專案來操作模型,所以editpart.geteditingdomain()方法得到的會是乙個transactionaleditingdomain型別。

有了request,我們用它作為構造引數建立乙個setvaluecommand(),這是乙個gmf命令(實現org.eclipse.gmf.runtime.common.core.command.icommand),用來改變屬性值。最後要執行這個命令,我們知道command是要用commandstack來執行的,這樣才能undo/redo,但editpart.getdiagrameditdomain().getdiagramcommandstack()得到的commandstack只能執行gef的命令(org.eclipse.gef.commands.command),所以要把我們的command用icommandproxy()包裝一下,這樣就沒問題了。

public

class changeactivitynameaction extends

abstractactiondelegate

implements

iobjectactiondelegate

}

update: 可以用igraphicaleditpart#resolvesemanticelement()直接取得editpart對應的eobject,igraphicaleditpart#getnotationview()是得到view物件,和getmodel()作用一樣。

執行效果如下,選擇修改名字命令後,activity1的名字改為modified activity,並且可以undo/redo:

參考:

abstracttransactionalcommand command = new

abstracttransactionalcommand(

editingdomain,

"modifying the model", collections.empty_list)

};try

catch

(executionexception e)

一 在應用程式自定義訊息方法

一 在應用程式自定義訊息方法 一般自定義訊息有一定的範圍,雖然說自定義訊息從wm user開始,但是由於我們的工程裡面一般還有很多其他的控制項,他們也要占用一部分wm user訊息範圍,所以我們必須為他們留出一部分範圍,這裡,我們保留100個訊息,一般情況下,這可以滿足我們的要求。1 定義訊息的值。...

JAVA自定義協議實現網頁啟動應用程式

例如在網頁中啟動乙個計算器的應用程式如下 windows registry editor version 5.00 hkey classes root testcalc url testcalc protocol url protocol hkey classes root testcalc def...

6 自定義執行緒池 執行緒應用程式的伸縮

在網上找到了乙個自定義執行緒池的例子來代替書中的例子。原著位置 http www.cnblogs.com alexander lee archive 2009 10 31 1593647.html 1 自定義執行緒池設計概要說明 1 taskpool類 自定義執行緒池類 1 定義 private d...