Finding and removing a default command in DSL Tools (part 4 of Compartment Mappings)
Tags: dotnet, dsl, JaDAL, orcas, visual studio, vsxAdd comments
[Update (2008-05-21): This code is now hosted at CodePlex as part of JaDAL. And a follow-up article was published.]
Previously on…
This article is part of a series. A table of contents can be found at the end of the first article. Part 2 contains a user guide and in part 3 I showed most of the internals of the library.
The "Reroute" command
For each connector there is a command named "Reroute" in the context menu of the DSL editor. Now I have to remove this command for the compartment entry mappings. If the user would use it, the layout of my connectors will be destroyed. Unfortunately I did not find an option, an extension point or anything else where I could change or handle this particular command or the context menu of the connectors.
The generated code
First I looked at the generated code of my Dsl
and DslPackage
project. There is a GeneratedVSCT.vsct
file. In vsct
files the commands are defined, but in this one I could not find anything with "Reroute". Then I searched for the string "Reroute" in all files and found nothing.
The DSL binaries
I found no documentation for this command and was a little desperate. I needed to find the place where it comes from. I searched the whole VS SDK folder (text and binary files) for the string "reroute". A promising hint was found in the Microsoft.VisualStudio.Modeling.Sdk.Shell.dll file. Now let’s go to the Reflector and take a deeper look inside.
After a while I found the Microsoft.VisualStudio.Modeling.Shell.CommandSet class. And hey, in the msdn documentation article for this class there is also the Reroute Line command mentioned. With this knowledge one can easily find the generated CommandSet.cs
file as part of the DslPackage
. In this file there are two classes AbcCommandSetBase
and AbcCommandSet
where Abc
is the name of you DSL project.
The design pattern of this classes is called double derived and can be found quiet often within the generated DSL code. The ...Base
class stays abstract and derives from a class defined in the Microsoft Visual Studio SDK libraries, in this case from the CommandSet class I found above. All code created by the code generator is added to this ...Base
class. The other class derives from the ...Base
class and is empty – all parts of the project uses this one. Since it is declared with the partial
keyword, the user can override ALL methods and change the behavior of all aspects of this class.
And that is what we are going to do: override the GetMenuCommands()
method and remove the reroute command:
protected override IList<MenuCommand> GetMenuCommands() { // get the base list IList<MenuCommand> cmds = base.GetMenuCommands(); // find the reroute command MenuCommand rerouteCommand = cmds.First( c => c.CommandID == CommonModelingCommands.RerouteLine); // if found, remove it if (rerouteCommand != null) cmds.Remove(rerouteCommand); // and return the changed list return cmds; }
That’s it. Pretty easy, but you have to discover where to add this logic.
March 1st, 2008 at 11:03 pm
[…] the last article of this series I will explain the way of removing the "Reroute" command from the […]
May 12th, 2008 at 6:51 am
[…] 6. Finding and removing a default command in DSL Tools (part 4 of Compartment Mappings) […]