Copy / Cut / Paste of model elements

Behavior in previous versions of the DSL Tools

In previous versions of the DSL Tools, the copy/cut/paste of model elements did not work very well. There were limitations, and even bugs that prevented very elaborate scenarios. In case you are interested, you can have to the posts on the forum describing these problems, and the pain there was in this area. Some people in the community were successful on some models (See for instance Pascal Recchia and Anthony Guérot’s article on toolbox prototypes, which uses the copy/paste mechanism:, but the feature needed reworking and this is what we had done.

New behavior in VS2010

From the VS2010 DSL SDK, the copy/paste as an image is available to all the new designers, and it’s easy to provide the feature for existing migrated designers.

What is the behavior for the DSL user?

The DSL user will be able to copy model elements, compartments items, or anything that the DSL Author thought about, or cut them, and paste them in a compatible shape, in the same, or in different designers. and this in a very natural way.

How does the DSL author control this?

If you create a new graphical designer, you don’t need to do anything, the copy/paste is enabled by default.

If you migrate an existing designer, you can benefit from this new feature very simply:

  1. Having opened the DslDefinition.dsl, go to the DSL Explorer; in the Editor node, you’ll find a new property named “Enable Copy Paste”,
  2. Set “Enable Copy Paste” to CopyPasteOnly (the default is NoGeneratedCopyPaste in case of migrated designers because we did not want to break your designers in case you were successful in implementing the copy/paste already, and CopyPasteOnly for new designers)
  3. On each domain role, determine if you want the “copy closure” to pass trough the role. For this you have a property named “Propagates Copy” that values:
    Do Not Propagate Copy, if you don’t want to “navigate” through the role when copying from the opposite domain class
    Propagate Copy To Link Only, if you want to copy the link, but not the targeted domain class
    Propagates Copy To Link And Opposite Role Player, if you want to copy the link, and the targeted domain class


    In new designers, the default is Propagates Copy To Link And Opposite Role Player for embeddings, and Do Not Propagate Copy for the others

  4. Transform All Templates


Example on the DSL class diagram template

More concretely. Let’s take the example of a class diagram unfolded form a Class diagram DSL template. The following screen shot shows a portion of the domain model (Class has attributes), and you can see that being an embedding, by default, Propagates Copy is set for the Attributes role to Propagates Copy To Link And Opposite Role Player.

What this means is each time you copy a ModelClass, you’ll copy its attributes at the same time, which is, really what most people expect.



Now let’s go a bit further, and change the behavior a bit. Let’s assume we have a base class Moveable, and copy the derived class (Plane), and paste it on the diagram. By default, you end up with a new class (Plane1) whose attributes and methods were cloned:




Now let’s assume that, as a DSL author, I want, each time we copy and paste a class (such as Plane), the inheritance, if any, to be copied as well (thus keeping the link with the base class):

To achieve this I need to:

  1. Figure out which role I navigate through when I copy Plane to get the inheritance: this is Superclass.
  2. Change the PropagateCopy property value of the Superclass role to Propagate Copy To Link Only
  3. Transform all templates
  4. Rebuild


Now, when the designer user copies the class “Plane”, he gets a clone, with the inheritance relationship still linking to the same base class … just what I wanted.


Comments (2)

  1. KevinMitchell says:

    Whilst this seems like a good development, I couldn’t see any mechanism in the DSL designer for specifying the desire to override this behaviour using custom code in some cases.  For example, I have a domain class that acts as a container.  When I copy this I don’t want to copy all the subcomponents.  Instead I’d like to create an instance of a "reference" domain class that has the same outer appearance as the element being copied, in terms of ports, properties etc, but doesn’t contain clones of the subcomponents.  The intention is that such reference nodes couldn’t be altered directly, as they would just mirror the details of the element they referenced.  But they could be embedded in other components.  So I’d really like to write custom code for describing what should be added to the clipboard if an instance of such a container class is copied.  However, having looked at the code being generated, it’s not clear to me which method I would override.  It looks like adding support for Copy/Cut/Paste is an all-or-nothing option, but perhaps I’m just looking in the wrong place?

  2. Riquel Dong says:

    hi jmprieur,

    could you give some introduction about using WPF designer to implement copy/paste feature? Really thanks!