About the Implementing a schematic rule and its property page Sample
[C#]
ReductionLinkPropertyPage.cs
using ESRI.ArcGIS;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.ADF.CATIDs;
using Schematic = ESRI.ArcGIS.Schematic;
using ESRI.ArcGIS.Framework;
using System.Windows.Forms;
using ESRI.ArcGIS.esriSystem;
using System;
using System.Collections.Generic;
using System.Text;
using CustomRulesCS;
namespace CustomRulesPageCS
{
[ClassInterface(ClassInterfaceType.None)]
[Guid(ReductionLinkPropertyPage.GUID)]
[ProgId(ReductionLinkPropertyPage.PROGID)]
public class ReductionLinkPropertyPage : IComPropertyPage
{
// Register/unregister categories for this class
#region "Component Category Registration"
[System.Runtime.InteropServices.ComRegisterFunction()]
public static void Register(string CLSID)
{
SchematicRulePropertyPages.Register(CLSID);
}
[System.Runtime.InteropServices.ComUnregisterFunction()]
public static void Unregister(string CLSID)
{
SchematicRulePropertyPages.Unregister(CLSID);
}
#endregion
public const string GUID = "9D1CD5C2-AF73-4a70-B1DD-8B092601CFE8";
public const string PROGID = "CustomRulesPageCS.ReductionLinkPropertyPage";
private frmReductionLink m_form = new frmReductionLink(); // the custom form
private ReductionLinkRule m_mySchematicRule; // the custom rule
private string m_title = "Reduction Links Rule C#"; // the form title
private int m_priority = 0; // the IComPage priority
#region IComPropertyPage Membres
public int Activate()
{
// Create a new RemoveElementForm but do not show it
if (m_form == null) m_form = new frmReductionLink();
return (int)m_form.Handle;
}
public bool Applies(ISet objects)
{
Schematic.ISchematicRule mySchematicRule;
mySchematicRule = FindMyRule(objects);
return (mySchematicRule != null);
}
public void Apply()
{
try
{
m_mySchematicRule.Description = m_form.txtDescription.Text;
m_mySchematicRule.ReductionLinkName = m_form.cboReduce.SelectedItem.ToString();
m_mySchematicRule.UsePort = m_form.chkUsePort.Checked;
m_form.IsDirty = false;
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message, "Unable to initialize rule properties", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
public void Cancel()
{
m_form.IsDirty = false;
}
public void Deactivate()
{
m_form.Close();
}
public int Height
{
get { return m_form.Height; }
}
public int get_HelpContextID(int controlID)
{
// TODO: return context ID if desired
return 0;
}
public string HelpFile
{
get { return ""; }
}
public void Hide()
{
m_form.Hide();
}
public bool IsPageDirty
{
get { return m_form.IsDirty; }
}
public IComPropertyPageSite PageSite
{
set { m_form.PageSite = value; }
}
public int Priority
{
get
{
return m_priority;
}
set
{
m_priority = value;
}
}
public void SetObjects(ISet objects)
{
// Search for the custom rule object instance
m_mySchematicRule = FindMyRule(objects);
}
public void Show()
{
try
{
if (m_form.cboReduce.Items.Count == 0)
{
Schematic.ISchematicDiagramClass diagramClass;
diagramClass = ((Schematic.ISchematicRule)m_mySchematicRule).SchematicDiagramClass;
if (diagramClass == null) return;
Schematic.ISchematicElementClass elementClass;
Schematic.IEnumSchematicElementClass enumElementClass;
enumElementClass = diagramClass.AssociatedSchematicElementClasses;
enumElementClass.Reset();
elementClass = enumElementClass.Next();
while (elementClass != null)
{
if (elementClass.SchematicElementType == Schematic.esriSchematicElementType.esriSchematicLinkType)
m_form.cboReduce.Items.Add(elementClass.Name);
elementClass = enumElementClass.Next();
}
}
m_form.cboReduce.Text = m_mySchematicRule.ReductionLinkName;
m_form.txtDescription.Text = m_mySchematicRule.Description;
m_form.chkUsePort.Checked = m_mySchematicRule.UsePort;
m_form.IsDirty = false;
m_form.Visible = true;
m_form.lblDescription.Visible = true;
m_form.lblReduce.Visible = true;
m_form.txtDescription.Visible = true;
m_form.cboReduce.Visible = true;
m_form.chkUsePort.Visible = true;
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message, "Unable to initialize property page", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
public string Title
{
get
{
return m_title;
}
set
{
m_title = value;
}
}
public int Width
{
get { return m_form.Width; }
}
#endregion
~ReductionLinkPropertyPage()
{
m_form = null;
m_mySchematicRule = null;
}
// Find and return this rule from the passed in objects
private ReductionLinkRule FindMyRule(ESRI.ArcGIS.esriSystem.ISet Objectset)
{
if (Objectset.Count == 0)
return null;
Objectset.Reset();
object obj;
obj = Objectset.Next();
while (obj != null)
{
if (obj is ReductionLinkRule)
{
break;
}
obj = Objectset.Next();
}
return (ReductionLinkRule)obj;
}
}
}
[Visual Basic .NET]
ReductionLinkPropertyPage.vb
Imports ESRI.ArcGIS
Imports System.Runtime.InteropServices
Imports ESRI.ArcGIS.ADF.CATIDs
Imports Schematic = ESRI.ArcGIS.Schematic
Imports ESRI.ArcGIS.Framework
Imports System.Windows.Forms
Imports ESRI.ArcGIS.esriSystem
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports CustomRulesVB
<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)> _
<System.Runtime.InteropServices.Guid(ReductionLinkPropertyPage.GUID)> _
<System.Runtime.InteropServices.ProgId(ReductionLinkPropertyPage.PROGID)> _
Public Class ReductionLinkPropertyPage
Implements ESRI.ArcGIS.Framework.IComPropertyPage
Public Const GUID As String = "4E3C6551-8594-4c51-9B8B-075E745CC622"
Public Const PROGID As String = "CustomRulesPageVB.ReductionLinkPropertyPage"
' Register/unregister categories for this class
#Region "Component Category Registration"
<System.Runtime.InteropServices.ComRegisterFunction()> _
Shared Sub Register(ByVal CLSID As String)
SchematicRulePropertyPages.Register(CLSID)
End Sub
<System.Runtime.InteropServices.ComUnregisterFunction()> _
Shared Sub Unregister(ByVal CLSID As String)
SchematicRulePropertyPages.Unregister(CLSID)
End Sub
#End Region
Private m_Form As frmReductionLink = New frmReductionLink() ' the custom form
Private m_mySchematicRule As ReductionLinkRule ' the custom rule
Private m_title As String = "Reduction Links Rule VBNet" ' the form title
Private m_priority As Integer = 0 ' the IComPage priority
#Region "IComPropertyPage Members"
Public Function Activate() As Integer Implements ESRI.ArcGIS.Framework.IComPropertyPage.Activate
' Create a new RemoveElementForm but do not show it
If m_Form Is Nothing Then m_Form = New frmReductionLink()
Return m_Form.Handle.ToInt32
End Function
Public Function Applies(ByVal objects As ESRI.ArcGIS.esriSystem.ISet) As Boolean Implements ESRI.ArcGIS.Framework.IComPropertyPage.Applies
Dim mySchematicRule As Schematic.ISchematicRule
mySchematicRule = FindMyRule(objects)
Return (mySchematicRule IsNot Nothing)
End Function
Public Sub Apply() Implements ESRI.ArcGIS.Framework.IComPropertyPage.Apply
Try
m_mySchematicRule.Description = m_Form.txtDescription.Text
m_mySchematicRule.ReductionLinkName = m_Form.cboReduce.SelectedItem.ToString()
m_mySchematicRule.UsePort = m_Form.chkUsePort.Checked
m_Form.IsDirty = True
Catch ex As Exception
MessageBox.Show(ex.Message, "Unable to initialize rule properties", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Try
End Sub
Public Sub Cancel() Implements ESRI.ArcGIS.Framework.IComPropertyPage.Cancel
m_Form.IsDirty = False
End Sub
Public Sub Deactivate() Implements ESRI.ArcGIS.Framework.IComPropertyPage.Deactivate
m_Form.Close()
End Sub
Public ReadOnly Property Height() As Integer Implements ESRI.ArcGIS.Framework.IComPropertyPage.Height
Get
Return m_Form.Height
End Get
End Property
Public ReadOnly Property HelpContextID(ByVal controlID As Integer) As Integer Implements ESRI.ArcGIS.Framework.IComPropertyPage.HelpContextID
Get
' TODO: return context ID if desired
Return 0
End Get
End Property
Public ReadOnly Property HelpFile() As String Implements ESRI.ArcGIS.Framework.IComPropertyPage.HelpFile
Get
Return ""
End Get
End Property
Public Sub Hide() Implements ESRI.ArcGIS.Framework.IComPropertyPage.Hide
m_Form.Hide()
End Sub
Public ReadOnly Property IsPageDirty() As Boolean Implements ESRI.ArcGIS.Framework.IComPropertyPage.IsPageDirty
Get
Return m_Form.IsDirty
End Get
End Property
Public WriteOnly Property PageSite() As ESRI.ArcGIS.Framework.IComPropertyPageSite Implements ESRI.ArcGIS.Framework.IComPropertyPage.PageSite
Set(ByVal value As ESRI.ArcGIS.Framework.IComPropertyPageSite)
m_Form.PageSite = value
End Set
End Property
Public Property Priority() As Integer Implements ESRI.ArcGIS.Framework.IComPropertyPage.Priority
Get
Return m_priority
End Get
Set(ByVal value As Integer)
m_priority = value
End Set
End Property
Public Sub SetObjects(ByVal objects As ESRI.ArcGIS.esriSystem.ISet) Implements ESRI.ArcGIS.Framework.IComPropertyPage.SetObjects
' Search for the custom rule object instance
m_mySchematicRule = FindMyRule(objects)
End Sub
Public Sub Show() Implements ESRI.ArcGIS.Framework.IComPropertyPage.Show
Try
If (m_Form.cboReduce.Items.Count = 0) Then
Dim diagramClass As Schematic.ISchematicDiagramClass
diagramClass = m_mySchematicRule.SchematicDiagramClass
If (diagramClass Is Nothing) Then Return
Dim elementClass As Schematic.ISchematicElementClass
Dim enumElementClass As Schematic.IEnumSchematicElementClass
enumElementClass = diagramClass.AssociatedSchematicElementClasses
enumElementClass.Reset()
elementClass = enumElementClass.Next()
While (elementClass IsNot Nothing)
If (elementClass.SchematicElementType = Schematic.esriSchematicElementType.esriSchematicLinkType) Then
m_Form.cboReduce.Items.Add(elementClass.Name)
End If
elementClass = enumElementClass.Next()
End While
End If
m_Form.cboReduce.Text = m_mySchematicRule.ReductionLinkName
m_Form.txtDescription.Text = m_mySchematicRule.Description
m_Form.chkUsePort.Checked = m_mySchematicRule.UsePort
m_Form.IsDirty = False
m_Form.Visible = True
m_Form.lblDescription.Visible = True
m_Form.lblReduce.Visible = True
m_Form.txtDescription.Visible = True
m_Form.cboReduce.Visible = True
m_Form.chkUsePort.Visible = True
Catch ex As Exception
MessageBox.Show(ex.Message, "Unable to initialize property page", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Try
End Sub
Public Property Title() As String Implements ESRI.ArcGIS.Framework.IComPropertyPage.Title
Get
Return m_title
End Get
Set(ByVal value As String)
m_title = value
End Set
End Property
Public ReadOnly Property Width() As Integer Implements ESRI.ArcGIS.Framework.IComPropertyPage.Width
Get
Return m_Form.Width
End Get
End Property
#End Region
Protected Overrides Sub Finalize()
m_Form = Nothing
m_mySchematicRule = Nothing
MyBase.Finalize()
End Sub
' Find and return this rule from the passed in objects
Private Function FindMyRule(ByVal Objectset As ESRI.ArcGIS.esriSystem.ISet) As ReductionLinkRule
If (Objectset.Count = 0) Then Return Nothing
Objectset.Reset()
Dim obj As Object
obj = Objectset.Next()
While (obj IsNot Nothing)
If (TypeOf (obj) Is ReductionLinkRule) Then Exit While
obj = Objectset.Next()
End While
Return CType(obj, ReductionLinkRule)
End Function
End Class