Přizpůsobení nástrojů a panelu nástrojů
Položky panelu nástrojů musíte definovat pro prvky, které chcete uživatelům umožnit přidávat do jejich modelů. Existují dva druhy nástrojů: nástroje elementů a nástroje pro připojení. Vygenerovaném návrháři může uživatel vybrat nástroj prvku, který přetáhne obrazce do diagramu, a může vybrat spojovací nástroj pro kreslení propojení mezi obrazci. Obecně platí, že nástroje elementů umožňují uživatelům přidávat instance tříd domén do svých modelů a nástroje pro připojení umožňují přidávat instance relací domén.
Jak je sada nástrojů definována
V Průzkumníku DSL rozbalte uzel Editoru a uzly pod ním. Obvykle se zobrazí hierarchie podobná této:
Editor
Toolbox Tabs
MyDsl //a tab
Tools
ExampleElement // an element tool
ExampleRelationship // a connection tool
V této části Průzkumníka DSL můžete:
Vytvořte nové karty. Karty definují záhlaví oddílů v sadě nástrojů.
Vytvořte nové nástroje.
Nástroje pro kopírování a vkládání
Přesuňte nástroje v seznamu nahoru nebo dolů.
Odstraňte karty a nástroje.
Důležité
Chcete-li přidat nebo vložit položky v Průzkumníku DSL, klikněte pravým tlačítkem myši na prarodič nového uzlu. Pokud například chcete přidat nástroj, klikněte pravým tlačítkem myši na kartu a ne na uzel Nástroje . Kartu přidáte tak, že kliknete pravým tlačítkem myši na uzel Editoru .
Vlastnost Ikona panelu nástrojů každého nástroje odkazuje na rastrový soubor 16x16. Tyto soubory se obvykle uchovávají ve složce Dsl\Resources .
Vlastnost Class nástroje elementu odkazuje na konkrétní třídu domény. Ve výchozím nastavení nástroj vytvoří instance této třídy. Můžete ale napsat kód, který nástroj vytvoří skupiny prvků nebo prvků různých typů.
Vlastnost Připojení ion Builder nástroje pro připojení odkazuje na tvůrce připojení, který definuje, jaké typy prvků může nástroj propojit a jaké vztahy mezi nimi vytváří. tvůrce Připojení ionů jsou definovány jako uzly v Průzkumníku DSL. tvůrci Připojení ion se vytvářejí automaticky při definování relací domény, ale můžete napsat kód, který je přizpůsobí.
Přidání nástroje do panelu nástrojů
Po vytvoření třídy obrazce obvykle vytvoříte nástroj elementu a namapujete ho na třídu domény.
Nástroj konektoru obvykle vytvoříte po vytvoření třídy spojnice a namapujete ho na referenční relaci.
V Průzkumníku DSL rozbalte uzel Editoru a uzel Karty nástrojů.
Klikněte pravým tlačítkem myši na uzel karty panelu nástrojů a potom klepněte na příkaz Přidat nový nástroj elementu nebo přidat nový nástroj Připojení ion.
Nastavte vlastnost Ikona panelu nástrojů odkazující na rastrový obrázek 16x16.
Pokud chcete definovat novou ikonu, vytvořte rastrový soubor v Průzkumník řešení ve složce Dsl\Resources. Soubor by měl mít následující hodnoty vlastností: Build Action = Content; Kopírovat do výstupního adresáře = Nekopírovat.
Pro nástroj prvku: Nastavte vlastnost Třídy nástroje odkazovat na konkrétní třídu domény, která je namapována na obrazec.
Nástroj konektoru: Nastavte vlastnost nástroje Připojení ion Builder na jednu z položek nabízených v rozevíracím seznamu. tvůrci Připojení ion se automaticky vytvoří při mapování konektoru na vztah domény. Pokud jste nedávno vytvořili konektor, obvykle byste vybrali přidruženého tvůrce připojení.
Pokud chcete otestovat DSL, stiskněte klávesu F5 nebo CTRL+F5 a v experimentální instanci sady Visual Studio otevřete ukázkový soubor modelu. Nový nástroj by se měl zobrazit na panelu nástrojů. Přetažením na diagram ověříte, že vytvoří nový prvek.
Pokud se nástroj nezobrazí, zastavte experimentální sadu Visual Studio. V nabídce Start systému Windows zadejte resetování sady Visual Studio a spusťte příkaz Obnovit experimentální instanci sady Microsoft Visual Studio odpovídající vaší verzi sady Visual Studio. V nabídce Sestavení klepněte na tlačítko Znovu sestavit řešení. Pak znovu otestujte DSL.
Přizpůsobení nástrojů elementu
Ve výchozím nastavení nástroj vytvoří jednu instanci zadané třídy, ale můžete to změnit dvěma způsoby:
Definujte direktivy sloučení elementů v jiných třídách, které jim umožňují přijmout nové instance této třídy a umožnit jim vytvářet další odkazy při vytvoření nového prvku. Můžete například uživateli povolit, aby přehodil komentář do jiného prvku a vytvořil odkaz mezi těmito dvěma prvky.
Tato přizpůsobení také ovlivňují, co se stane, když uživatel vloží nebo přetáhne prvek.
Další informace naleznete v tématu Přizpůsobení vytváření a přesouvání elementů.
Napište kód pro přizpůsobení nástroje tak, aby mohl vytvářet skupiny prvků. Nástroj je inicializován metodami v ToolboxHelper.cs, které můžete přepsat. Další informace naleznete v tématu Vytváření skupin prvků z nástroje.
Vytváření skupin prvků z nástroje
Každý nástroj elementu obsahuje prototyp prvků, které by měl vytvořit. Ve výchozím nastavení každý nástroj elementu vytvoří jeden prvek, ale je také možné vytvořit skupinu souvisejících objektů pomocí jednoho nástroje. Uděláte to tak, že nástroj inicializujete pomocí ElementGroupPrototype položky, která obsahuje související položky.
Následující příklad je převzat z DSL, ve kterém je typ Transistor. Každý tranzistor má tři pojmenované terminály. Nástroj elementu pro tranzistory ukládá prototyp obsahující čtyři prvky modelu a tři vazby relací. Když uživatel přetáhne nástroj do diagramu, vytvoří se instance prototypu a propojil se s kořenem modelu.
Tento kód přepíše metodu definovanou v dsl\GeneratedCode\ToolboxHelper.cs.
Další informace o přizpůsobení modelu pomocí kódu programu naleznete v tématu Navigace a aktualizace modelu v kódu programu.
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;
public partial class CircuitsToolboxHelper
{
/// <summary>
/// Toolbox initialization, called for each element tool on the toolbox.
/// This version deals with each Component subtype separately.
/// </summary>
/// <param name="store"></param>
/// <param name="domainClassId">Identifies the domain class this tool should instantiate.</param>
/// <returns>prototype of the object or group of objects to be created by tool</returns>
protected override ElementGroupPrototype CreateElementToolPrototype(Store store, Guid domainClassId)
{
if (domainClassId == Transistor.DomainClassId)
{
Transistor transistor = new Transistor(store);
transistor.Base = new ComponentTerminal(store);
transistor.Collector = new ComponentTerminal(store);
transistor.Emitter = new ComponentTerminal(store);
transistor.Base.Name = "base";
transistor.Collector.Name = "collector";
transistor.Emitter.Name = "emitter";
// Create an ElementGroup for the Toolbox.
ElementGroup elementGroup = new ElementGroup(store.DefaultPartition);
elementGroup.AddGraph(transistor, true);
// AddGraph includes the embedded parts
return elementGroup.CreatePrototype();
}
else
{
return base.CreateElementToolPrototype(store, domainClassId);
} } }
Přizpůsobení nástrojů Připojení ion
Nástroj elementu obvykle vytvoříte při vytváření nové třídy konektoru. Alternativně můžete přetížit jeden nástroj tím, že umožníte typům dvou konců určit typ relace. Můžete například definovat jeden nástroj pro připojení, který by mohl vytvořit vztahy mezi osobami i vztahy mezi osobami a městy.
nástroje pro Připojení vyvolá tvůrce připojení. Pomocí tvůrce připojení můžete určit, jak můžou uživatelé propojit prvky v vygenerovaném návrháři. tvůrci Připojení ion určují prvky, které lze propojit, a druh propojení, který je mezi nimi vytvořen.
Když vytvoříte odkazový vztah mezi třídami domény, tvůrce připojení se automaticky vytvoří. Tento tvůrce připojení můžete použít při mapování nástroje pro připojení. Další informace o vytváření nástrojů pro připojení najdete v tématu Konfigurace sady nástrojů.
Výchozí tvůrce připojení můžete upravit tak, aby se mohl zabývat jiným rozsahem zdrojových a cílových typů a vytvořit různé typy relací.
Můžete také napsat vlastní kód pro tvůrce připojení, který určí zdrojové a cílové třídy připojení, definuje typ připojení a provede další akce spojené s vytvořením připojení.
Struktura tvůrce Připojení ion
Připojení tvůrci propojení obsahují jednu nebo více direktiv připojení propojení, které určují vztah domény a zdrojové a cílové elementy. Například v šabloně řešení Tok úloh se v Průzkumníku DSL zobrazí CommentReferencesSubjectsBuilder. Tento tvůrce připojení obsahuje jednu direktivu připojení propojení s názvem CommentReferencesSubjects, která je mapována na relaci domény CommentReferencesSubjects. Tato direktiva link connect obsahuje direktivu zdrojové role, která odkazuje na Comment
třídu domény, a direktivu cílové role, která odkazuje na FlowElement
třídu domény.
Použití Připojení ion Builderů k omezení zdrojových a cílových rolí
Tvůrce připojení můžete použít k omezení výskytu určitých tříd ve zdrojové roli nebo cílové roli daného vztahu domény. Můžete mít například základní třídu domény, která má vztah domény k jiné třídě domény, ale nechcete, aby všechny odvozené třídy základní třídy měly v této relaci stejné role. V řešení Tok úloh existují čtyři konkrétní třídy domény (StartPoint, EndPoint, MergeBranch a Synchronization), které dědí přímo z abstraktní třídy domény FlowElement, a dvě konkrétní třídy domény (Task a ObjectInState), které zdědí nepřímo z něj. Existuje také referenční vztah flow , který přebírá třídy domény FlowElement ve své zdrojové i cílové roli. Instance třídy domény EndPoint by ale neměla být zdrojem instance relace Flow ani instance třídy StartPoint by neměla být cílem instance relace Flow . Tvůrce připojení FlowBuilder má direktivu připojení propojení s názvem Flow, která určuje, které třídy domény mohou hrát zdrojovou roli (Task, MergeBranch, StartPoint a Synchronization) a které mohou hrát cílovou roli(MergeBranch, Koncový bod a synchronizace).
Tvůrci Připojení ion s direktivami více propojení Připojení
Do tvůrce připojení můžete přidat více než jednu direktivu připojení propojení. To vám může pomoct skrýt některé složitosti doménového modelu od uživatelů a zabránit tomu, aby sada nástrojů byla příliš nepotřebná. Do jednoho tvůrce připojení můžete přidat direktivy link connect pro několik různých relací domény. Pokud ale fungují přibližně stejnou funkci, měli byste zkombinovat relace domény.
V řešení Tok úloh se nástroj pro připojení flow používá k kreslení instancí relací domény Flow i ObjectFlow . Tvůrce připojení FlowBuilder má kromě direktivy připojení propojení Flow popsané dříve dvě direktivy propojení s názvem ObjectFlow. Tyto direktivy určují, že instance relace ObjectFlow může být nakreslena mezi instancemi ObjectInState třídy domény, nebo z instance ObjectInState na instanci Task, ale ne mezi dvěma instancemi task, nebo z instance Task do instance ObjectInState. Mezi dvěma instancemi úlohy však může být nakreslena instance relace Tok. Pokud zkompilujete a spustíte řešení Tok úloh, uvidíte, že výkres toku z instance ObjectInState do instance úlohy vytvoří instanci ObjectFlow, ale nakreslení toku mezi dvěma instancemi úlohy vytvoří instanci toku.
Vlastní kód pro tvůrce Připojení ionu
V uživatelském rozhraní jsou čtyři zaškrtávací políčka, která definují různé typy přizpůsobení tvůrce připojení:
Zaškrtávací políčko Vlastní přijmout u direktivy zdrojové nebo cílové role
Zaškrtávací políčko Vlastní připojení u direktivy zdrojové nebo cílové role
The Uses custom connect check box on a connect direktiva
Vlastnost Is Custom tvůrce připojení
Abyste mohli provést tato přizpůsobení, musíte zadat kód programu. Chcete-li zjistit, jaký kód je třeba zadat, zaškrtněte jedno z těchto políček, klikněte na transformovat všechny šablony a pak sestavte své řešení. Výsledkem bude zpráva o chybě. Poklikáním na zprávu o chybě zobrazíte komentář, který vysvětluje, jaký kód byste měli přidat.
Poznámka:
Pokud chcete přidat vlastní kód, vytvořte částečnou definici třídy v souboru kódu odděleně od souborů kódu ve složkách GeneratedCode. Abyste se vyhnuli ztrátě práce, neměli byste upravovat vygenerované soubory kódu. Další informace naleznete v tématu Přepsání a rozšíření vygenerované třídy.
Vytvoření vlastního kódu Připojení ionu
V každé direktivě připojení propojení karta Direktivy zdrojové role definuje z typů, které lze přetáhnout. Podobně karta Direktivy cílové role definuje, jaké typy můžete přetáhnout. Pro každý typ můžete dále určit, zda chcete povolit připojení (pro tuto direktivu připojení propojení) nastavením příznaku Custom Accept a zadáním dalšího kódu.
Můžete také přizpůsobit, co se stane při vytváření připojení. Můžete například přizpůsobit pouze případ, kdy dojde k přetažení do určité třídy nebo z konkrétní třídy, všechny případy, které řídí direktiva připojení jednoho propojení, nebo celý tvůrce připojení FlowBuilder. Pro každou z těchto možností můžete nastavit vlastní příznaky na odpovídající úrovni. Když transformujete všechny šablony a pokusíte se sestavit řešení, chybové zprávy vás nasměrují na komentáře, které jsou vygenerovaný kód. Tyto komentáře identifikují, co musíte zadat.
V ukázce diagramu komponent je tvůrce připojení pro vztah domény Připojení ion přizpůsobený tak, aby omezoval připojení, která se dají vytvořit mezi porty. Následující obrázek ukazuje, že připojení můžete vytvářet pouze z OutPort
prvků k InPort
prvkům, ale můžete vnořit komponenty mezi sebou.
Připojení ion přicházející do OutPortu z vnořené komponenty
Proto můžete chtít určit, že připojení může pocházet z vnořené komponenty k OutPortu. Chcete-li zadat takové připojení, nastavíte vlastní přijetí pro typ InPort jako zdrojovou roli a typ OutPort jako cílovou roli v okně Podrobnosti DSL, jak je znázorněno na následujících ilustracích:
Direktiva link Připojení v Průzkumníku DSL
Direktiva link Připojení v okně s podrobnostmi DSL
Pak je nutné zadat metody v Připojení ionBuilder třídy:
public partial class ConnectionBuilder
{
/// <summary>
/// OK if this component has children
/// </summary>
private static bool CanAcceptInPortAsSource(InPort candidate)
{
return candidate.Component.Children.Count > 0;
}
/// <summary>
/// Only if source is on parent of target.
/// </summary>
private static bool CanAcceptInPortAndInPortAsSourceAndTarget (InPort sourceInPort, InPort targetInPort)
{
return sourceInPort.Component == targetInPort.Component.Parent;
}
// And similar for OutPorts...
Další informace o přizpůsobení modelu pomocí kódu programu naleznete v tématu Navigace a aktualizace modelu v kódu programu.
Podobný kód můžete použít například k tomu, aby uživatelé nemohli vytvářet smyčky s odkazy nadřazený-podřízený. Tato omezení jsou považována za "tvrdá", protože uživatelé je nemohou kdykoli porušit. Můžete také vytvořit kontroly obnovitelného ověření, které uživatelé můžou dočasně obejít vytvořením neplatných konfigurací, které nemůžou uložit.
Osvědčený postup při definování Připojení ion Builderů
Pro vytvoření různých typů relací byste měli definovat jednoho tvůrce připojení, pouze pokud jsou koncepčně související. V ukázce toku úloh použijete stejného tvůrce k vytváření toků mezi úkoly a také mezi úkoly a objekty. Použití stejného tvůrce by ale bylo matoucí k vytváření vztahů mezi komentáři a úkoly.
Pokud definujete tvůrce připojení pro více typů relací, měli byste se ujistit, že nemůže odpovídat více typům ze stejné dvojice zdrojových a cílových objektů. V opačném případě budou výsledky nepředvídatelné.
Vlastní kód použijete k použití "pevných" omezení, měli byste ale zvážit, jestli by uživatelé měli mít možnost dočasně vytvářet neplatná připojení. Pokud by měly, můžete upravit omezení tak, aby se připojení neověřovala, dokud se uživatelé nepokusí uložit změny.