The following sample sets multiple styles for selected diagram elements (if style is available and not already set). The sample uses both the UModel API and the UModel IDE Plug-In library and is available in the following file: ..\UModelExamples\IDEPlugIn\Styles\Styles.cs.
The solution also includes two setup projects (in .vdproj format, for 32-bit and 64-bit platforms). The setup installs all necessary files, and registers the IDE plug-in for COM and UModel on your target system, so that the plug-in is automatically loaded when UModel is started the next time.
Notes:
•To build and run the sample, the same requirements as for other UModel IDE Plug-ins apply, see Build and Run the Plug-In.
•Visual Studio setup projects are not supported starting with Visual Studio 2012 and require a separate extension to be opened. See the information messages displayed by the Visual Studio migration wizard for more details.
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using UModelLib; using UModelPlugInLib; /* * Styles sample * set following styles for selected diagram elements * Fill Color * Header Gradient Begin Color * Header Gradient End Color * if style is available and not already set */ namespace Styles { public class UModelStyles : UModelPlugInLib.IUModelPlugIn { bool m_bPlugInVersionOK = true; // verify if UModel-API has been changed in a way that a recompile of this plug-in is recommended #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 "Styles sample Plug-in for UModel;This Plug-in demonstrates how to change several styles of the selected diagram elements."; } 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) { 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 // verify if UModel-API has been changed in a way that a recompile of this plug-in is recommended: IApplication iApp = (IApplication)pUModel; if (iApp == null || iApp.APIMajorVersion != 5) // this plug-in was compiled for API major version '5'! { MessageBox.Show("'Styles': This Plug-in has been made with a previous version of the UModel-API and should be recompiled.\nDisabled Plug-in commands in the meantime."); m_bPlugInVersionOK = false; } } 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; if (!m_bPlugInVersionOK) return action; // check for "fill red" if (nID == 3 || nID == 6) action = OnUpdateSetStyles((IApplication)pUModel); // check for "fill green" if (nID == 4 || nID == 7) action = OnUpdateSetStyles((IApplication)pUModel); // release unused objects GC.Collect(); return action; } public void OnCommand(int nID, object pUModel) { if (!m_bPlugInVersionOK) return; // fill red if (nID == 3 || nID == 6) OnSetStyles((IApplication)pUModel, "red"); // fill green if (nID == 4 || nID == 7) OnSetStyles((IApplication)pUModel, "green"); // release unused objects GC.Collect(); } #endregion #region SetStyles // set styles of selected diagram elements UModelUpdateAction OnUpdateSetStyles(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 selected elements on the active diagram IUMLDataList iSelection = iActiveDiagram.SelectedGuiElements; if ( iSelection == null ) return UModelUpdateAction.UModelUpdateAction_Disable; // search all selected elements, if at least one has one of the styles to change foreach ( IUMLGuiElement iSelGuiElement in iSelection ) { // verify if it is a GuiVisibleElement (with Styles) and if it may be modified if ( iSelGuiElement is IUMLGuiVisibleElement && iSelGuiElement.IsEditable ) { IUMLGuiVisibleElement iVisGuiElement = (IUMLGuiVisibleElement)iSelGuiElement; if ( iVisGuiElement.Styles.GetStyle(ENUMUMLGuiStyleKind.eUMLGuiStyle_FillColor) != null || iVisGuiElement.Styles.GetStyle(ENUMUMLGuiStyleKind.eUMLGuiStyle_HeaderGradientBeginColor) != null || iVisGuiElement.Styles.GetStyle(ENUMUMLGuiStyleKind.eUMLGuiStyle_HeaderGradientEndColor) != null ) { return UModelUpdateAction.UModelUpdateAction_Enable; } } } // nothing found => disable command return UModelUpdateAction.UModelUpdateAction_Disable; } public void OnSetStyles(IApplication pUModel, string sColor) { 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 selected elements on the active diagram IUMLDataList iSelection = iActiveDiagram.SelectedGuiElements; if (iSelection == null) return; try { // make all modifications within one UndoStep; start modification here if (!iDoc.BeginModification()) return; // search all selected elements, and change the style if the wanted value is not already used (directly applied or through style-chain) foreach (IUMLGuiElement iSelGuiElement in iSelection) { // verify if it is a GuiVisibleElement (with Styles) and if it may be modified if (iSelGuiElement is IUMLGuiVisibleElement && iSelGuiElement.IsEditable ) { IUMLGuiVisibleElement iVisGuiElement = (IUMLGuiVisibleElement)iSelGuiElement; // set Fill Color if possible and not already set IUMLGuiStyle iStyle = iVisGuiElement.Styles.GetStyle(ENUMUMLGuiStyleKind.eUMLGuiStyle_FillColor); if (iStyle != null && iStyle.UsedValue != sColor) iStyle.Value = sColor; // set Header Gradient Begin Color if possible and not already set iStyle = iVisGuiElement.Styles.GetStyle(ENUMUMLGuiStyleKind.eUMLGuiStyle_HeaderGradientBeginColor); if (iStyle != null && iStyle.UsedValue != sColor) iStyle.Value = sColor; // set Header Gradient End Color if possible and not already set iStyle = iVisGuiElement.Styles.GetStyle(ENUMUMLGuiStyleKind.eUMLGuiStyle_HeaderGradientEndColor); if (iStyle != null && iStyle.UsedValue != sColor) iStyle.Value = sColor; } } // do not forget to end modification and finish UndoStep iDoc.EndModification(); } catch( System.Exception ) { // rollback made changes iDoc.AbortModification(); // add error handling } } #endregion } } |