The following sample inserts a new C# delegate at the top/left corner of the active diagram window (if this diagram is inside a C# namespace root). The sample uses both the UModel API and the UModel IDE Plug-In library and is available in the following file: ..\UModelExamples\IDEPlugIn\CSharpDelegate\UModelCSharpDelegate.cs.
 
 
using System; using System.Collections.Generic; using System.Text; using UModelLib; using UModelPlugInLib;   /*   * CSharp delegate sample  * add a new CSharp delegate on the top/left corner of the active class diagram if possible   * (i.e. when diagram is inside a C# root namespace)  */   namespace CSharpDelegate {     public class UModelCSharpDelegate : UModelPlugInLib.IUModelPlugIn     {         #region helpers           protected string GetPlugInPath()         {             string sDLLPath = System.Reflection.Assembly.GetExecutingAssembly().Location;             return System.IO.Path.GetDirectoryName(sDLLPath);         }           #endregion           #region IUModelPlugIn Members           public string GetDescription()         {             return "CSharpDelegate sample Plug-in for UModel;This Plug-in demonstrates how to create a new CSharp delegate on a class diagram.";         }           public string GetUIModifications()         {             try             {                 string sPath = GetPlugInPath();                   System.IO.StreamReader myFile = new System.IO.StreamReader(sPath + "\\config.xml");                 string sRet = myFile.ReadToEnd();                 myFile.Close();                   // this replaces the token "**path**" from the XML file with                 // the actual installation path of the plug-in to get the image file                 return sRet.Replace("**path**", sPath);             }             catch (System.Exception ex)             {                 System.Windows.Forms.MessageBox.Show("Error in GetUIModifications:" + ex.Message);                 throw ex;             }         }             public void OnInitialize(object pUModel)         {             // before processing DDE or batch commands         }           public void OnRunning(object pUModel)         {             // DDE or batch commands are processed; application is fully initialized         }           public void OnShutdown(object pUModel)         {             // application will shutdown; release all unused objects             GC.Collect();         }           public UModelUpdateAction OnUpdateCommand(int nID, object pUModel)         {             UModelUpdateAction action = UModelUpdateAction.UModelUpdateAction_Disable;               // check if we can add a new CSharpDelegate on the active diagram             if (nID == 3 || nID == 4)                 action = OnUpdateAddNewCSharpDelegate((IApplication)pUModel);               // release unused objects             GC.Collect();               return action;         }           public void OnCommand(int nID, object pUModel)         {             // add a new CSharpDelegate on the active diagram             if (nID == 3 || nID == 4)                 OnAddNewCSharpDelegate((IApplication)pUModel);               // release unused objects             GC.Collect();         }           #endregion           #region AddNewCSharpDelegate // add new CSharp delegate on active diagram                  UModelUpdateAction OnUpdateAddNewCSharpDelegate(IApplication pUModel)         {             if (pUModel == null)                 return UModelUpdateAction.UModelUpdateAction_Disable;               // get the active document of the application             IDocument iDoc = pUModel.ActiveDocument;             if (iDoc == null)                 return UModelUpdateAction.UModelUpdateAction_Disable;               // get the active diagram window             IDiagramWindow iActiveDiagram = iDoc.ActiveDiagramWindow;             if ( iActiveDiagram == null )                 return UModelUpdateAction.UModelUpdateAction_Disable;               // get the UML diagram of the diagram window             IUMLGuiDiagram iUMLDiagram = iActiveDiagram.Diagram;               // check if it is a class diagram             if ( !( iUMLDiagram is IUMLGuiClassDiagram) )                 return UModelUpdateAction.UModelUpdateAction_Disable;               // verify if the diagram may be modified             if ( !iUMLDiagram.IsEditable )                 return UModelUpdateAction.UModelUpdateAction_Disable;               // get the UML element, which "owns" the class diagram             IUMLElement iDiagramOwner = iUMLDiagram.LinkedOwner;             if (iDiagramOwner == null)                 return UModelUpdateAction.UModelUpdateAction_Disable;               // verify if we are inside a CSharp namespace root (otherwise adding a CSharp delegate makes no sense)             IUMLElement iFindNamespaceRoot = iDiagramOwner;             while( iFindNamespaceRoot != null)             {                 if ( iFindNamespaceRoot is IUMLPackage)                 {                     IUMLPackage iPackage = (IUMLPackage) iFindNamespaceRoot;                     if ( iPackage.IsCodeLangNamespaceRoot( ENUMCodeLang.eCodeLang_CSharp ) )                         return UModelUpdateAction.UModelUpdateAction_Enable;                 }                   iFindNamespaceRoot = iFindNamespaceRoot.Owner;             }               // nothing found => disable command             return UModelUpdateAction.UModelUpdateAction_Disable;         }           public void OnAddNewCSharpDelegate(IApplication pUModel)         {             if (pUModel == null)                 return;               // get the active document of the application             IDocument iDoc = pUModel.ActiveDocument;             if (iDoc == null)                 return;               // get the active diagram window             IDiagramWindow iActiveDiagram = iDoc.ActiveDiagramWindow;             if (iActiveDiagram == null)                 return;               // get the UML diagram of the diagram window             IUMLGuiDiagram iUMLDiagram = iActiveDiagram.Diagram;               // get the CSharp profile             IUMLProfile iCSharpProfile = (IUMLProfile) iDoc.RootPackage.FindPredefinedOwnedElement(ENUMUMLPredefinedElement.ePredefined_CSharp_Profile, false);             if ( iCSharpProfile == null)                 return;               try             {                 // make all modifications within one UndoStep; start modification here                 if (!iDoc.BeginModification())                     return;                   // get top left corner of the visible diagram area                 int nInsertPosX = iActiveDiagram.ScrollPosX;                 int nInsertPosY = iActiveDiagram.ScrollPosY;                   // add new class on diagram                 IUMLGuiNodeLink iClassNode = iUMLDiagram.AddUMLElement("Class", nInsertPosX + 100, nInsertPosY + 100);                   IUMLClass iClass = (IUMLClass) iClassNode.Element;                 // use SetName (instead of Name) that UModel automatically generates a valid, unique name starting with "NewDelegate"                 iClass.SetName("NewDelegate");                   // set the CSharp 'delegate' stereotype                 iClass.ApplyPredefinedStereotype( ENUMUMLPredefinedElement.ePredefined_CSharp_delegateStereotypeOfClass );                   // set attribute-section "STAThread"                 IUMLStereotypeApplication iStereotypeApp = iClass.ApplyPredefinedStereotype(ENUMUMLPredefinedElement.ePredefined_CSharp_attributesStereotypeOfClass);                 IUMLEnumerationLiteral iSTAThread = (IUMLEnumerationLiteral)iCSharpProfile.FindPredefinedOwnedElement(ENUMUMLPredefinedElement.ePredefined_CSharp_AttributePresetsEnumeration_STAThreadEnumerationLiteral, true);                 iStereotypeApp.SetPredefinedTaggedValueAt(-1, ENUMUMLPredefinedElement.ePredefined_CSharp_attributesStereotypeOfClass_sectionsProperty, iSTAThread.Name);                   // add delegate operation:                 IUMLOperation iOperation = iClass.InsertOwnedOperationAt(-1);                 iOperation.SetName( "delegate");                   // per default set operation-return type "void"                 IUMLPrimitiveType iTypeVoid = (IUMLPrimitiveType)iCSharpProfile.FindPredefinedOwnedElement(ENUMUMLPredefinedElement.ePredefined_CSharp_voidPrimitiveType, true);                 iOperation.Type = iTypeVoid;                   // do not forget to end modification and finish UndoStep                 iDoc.EndModification();                   // at last focus newly inserted delegate on the diagram:                 iActiveDiagram.SelectGuiElement(iClassNode, true);             }             catch( System.Exception )             {                 // rollback made changes                 iDoc.AbortModification();                   // add error handling             }         }           #endregion      } }  |