要素ツールのカスタマイズ
ある DSL の定義では要素のグループとして一つの概念を表します。 たとえばコンポーネントで固定セットのポートを含むモデルを作成する場合はポート親コンポーネントとして作成して常に必要です。 したがって1 の代わりに要素のグループを作成し要素を作成するツールをカスタマイズする必要があります。 これを行うには要素を作成するツールがどのように初期化されるかをカスタマイズできます。
ツールまたは要素を図にドラッグするとの動作をオーバーライドできます。
要素ツールのコンテンツのカスタマイズ
各要素のツールは一つ以上のモデル要素とリンクのシリアル化されたバージョンを含む ElementGroupPrototype EGP () のインスタンスを格納します。 既定では要素のツールの EGP はツールに指定したクラスの 1 種類のインスタンスが含まれています。 オーバーライドの YourLanguageToolboxHelper.CreateElementToolPrototype するとこれを変更できます。 このメソッドはDSL パッケージが読み込まれるときに呼び出されます。
メソッドのパラメーターはDSL 定義で指定したクラスの ID です。 必要なクラスとそのメソッドが呼び出されるとEGP に新しい要素を追加できます。
EGP は1 種類の主要な要素を埋め込むことから支社の要素へのリンクを含める必要があります。 また参照のリンクを含めることができます。
次の例では主要な要素と 2 個の埋め込み要素を作成します。 メイン クラスは Resistor と呼ばれTerminal という名前の要素への 2 回の埋め込みリレーションシップがあります。 プロパティ Terminal1 埋め込むにはTerminal2 でその両方 1..1 の多重度が設定されています。
using Microsoft.VisualStudio.Modeling; ...
public partial class CircuitDiagramToolboxHelper
{
protected override ElementGroupPrototype CreateElementToolPrototype(Store store, Guid domainClassId)
{
// A case for each tool to customize:
if (domainClassId == Resistor.DomainClassId)
{
// Set up the prototype elements and links:
Resistor resistor = new Resistor(store);
resistor.Terminal1 = new Terminal(store);
resistor.Terminal2 = new Terminal(store);
resistor.Terminal1.Name = "T1"; // embedding
resistor.Terminal2.Name = "T2"; // embedding
// We could also set up reference links.
// Create an element group prototype for the toolbox:
ElementGroup egp = new ElementGroup(store.DefaultPartition);
egp.AddGraph(resistor, true);
// We do not have to explicitly include embedded children.
return egp.CreatePrototype();
}
// Element tools for other classes:
else
return base.CreateElementToolPrototype(store, domainClassId);
}
}