About the Implementing a schematic layout algorithm and its layout property page Sample
[C#]
TranslateTreePropPage.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.ADF.CATIDs;
using ESRI.ArcGIS.Schematic;
using ApplicativeAlgorithmsCS;
namespace ApplicativeAlgorithmsPageCS
{
[ClassInterface(ClassInterfaceType.None)]
[Guid(TranslateTreePropPage.GUID)]
[ProgId(TranslateTreePropPage.PROGID)]
[ComVisible(true)]
public partial class TranslateTreePropPage : PropertyPage
{
public const string GUID = "FCEB5D3A-AB6E-42eb-ABE7-074067DC0202";
private const string PROGID = "ApplicativeAlgorithmsPage.TranslateTreePropPage";
#region "Component Category Registration"
[ComRegisterFunction(), ComVisibleAttribute(true)]
public static void Reg(string sKey)
{
SchematicAlgorithmPages.Register(sKey);
}
[ComUnregisterFunction(), ComVisibleAttribute(true)]
public static void Unreg(string sKey)
{
SchematicAlgorithmPages.Unregister(sKey);
}
#endregion
#region internal methods
public TranslateTreePropPage()
{
InitializeComponent();
}
private void ChangedTexte(object sender, EventArgs e)
{
PageIsDirty = true;
}
private void TexteEnter(object sender, EventArgs e)
{
TextBox texteBox = (TextBox)sender;
texteBox.SelectAll();
}
private void btnRestore_Click(object sender, EventArgs e)
{
// Get the saved algorithm parameters from the diagram class
TranslateTree newAlgo = GetSavedAlgo();
if (newAlgo == null)
newAlgo = new TranslateTree(); // otherwise revert to default algorithm parameters
// get the values and set the edit boxes
txtXTrans.Text = newAlgo.TranslationFactorX.ToString();
txtYTrans.Text = newAlgo.TranslationFactorY.ToString();
}
private TranslateTree GetSavedAlgo()
{
TranslateTree myAlgo = FindOurAlgo();
if (myAlgo == null)
return null;
ISchematicDiagramClassName diagramClassName = myAlgo.SchematicDiagramClassName;
IName pName = diagramClassName as IName;
if (pName == null)
return null;
object unk = pName.Open();
ISchematicDiagramClass diagramClass = unk as ISchematicDiagramClass;
if (diagramClass == null)
return null;
// get the default algorithms for this diagram class
IEnumSchematicAlgorithm enumAlgorithms = diagramClass.SchematicAlgorithms;
if (enumAlgorithms == null)
return null;
TranslateTree savedAlgo = null;
enumAlgorithms.Reset();
ISchematicAlgorithm algorithm;
while ((algorithm = enumAlgorithms.Next()) != null)
{
savedAlgo = algorithm as TranslateTree;
if (savedAlgo != null)
break;
}
return savedAlgo;
}
private TranslateTree FindOurAlgo()
{
TranslateTree myAlgo = null;
// loop through the objects until the algorithm is found or not
System.Collections.IEnumerator enumCollection = Objects.GetEnumerator();
enumCollection.Reset();
while (enumCollection.MoveNext())
{
myAlgo = enumCollection.Current as TranslateTree;
if (myAlgo != null)
return myAlgo; // found it
}
return null;
}
#endregion
#region " PropertyPage "
protected override void OnPageDeactivate()
{
base.OnPageDeactivate();
}
protected override void OnActivated(System.EventArgs e)
{
base.OnActivated(e);
TranslateTree myAlgo = FindOurAlgo();
if (myAlgo != null)
{
this.txtXTrans.Text = myAlgo.TranslationFactorX.ToString();
this.txtYTrans.Text = myAlgo.TranslationFactorY.ToString();
}
PageIsDirty = false;
}
protected override void OnPageApply()
{
//OnPageApply is launched two times when you click on Apply
//and one time if you have more one page and change page
//So I use a flag to authorize or not the application of algorithm
//The timer reset the flag, in case of multi-pages
timApply.Enabled = false;
base.OnPageApply();
TranslateTree myAlgo = FindOurAlgo();
if (myAlgo != null)
{
try
{
myAlgo.TranslationFactorX = System.Convert.ToDouble(this.txtXTrans.Text);
}
finally { }
try
{
myAlgo.TranslationFactorY = System.Convert.ToDouble(this.txtYTrans.Text);
}
finally { }
}
timApply.Enabled = true;
PageIsDirty = false;
}
public override void SetPageSite(IPropertyPageSite pPageSite)
{
if (pPageSite == null)
return;
base.SetPageSite(pPageSite);
}
// make sure our algorithm is in the input array of IUnknown
// otherwise throw an exception
public override void SetObjects(uint cObjects, object[] ppUnk)
{
if (ppUnk == null || cObjects < 1)
throw new ArgumentNullException();
// remove previously stored IUnkown objects
Objects = null;
TranslateTree processedAlgo = null;
// browse input collection
System.Collections.IEnumerator enumCollection = ppUnk.GetEnumerator();
enumCollection.Reset();
while (enumCollection.MoveNext())
{
processedAlgo = enumCollection.Current as TranslateTree;
if (processedAlgo != null)
{
// assumes only one object is managed by this property page
Objects = new object[1];
Objects[0] = enumCollection.Current;
break;
}
}
if (Objects == null)
throw new ArgumentNullException();
}
#endregion
}
}
[Visual Basic .NET]
TranslateTreePropPage.vb
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
Imports System.Runtime.InteropServices
Imports ESRI.ArcGIS.esriSystem
Imports ESRI.ArcGIS.ADF.CATIDs
Imports ESRI.ArcGIS.Schematic
Imports ApplicativeAlgorithmsVB
<ClassInterface(ClassInterfaceType.None)> _
<Guid(TranslateTreePropPage.GUID)> _
<ProgId(TranslateTreePropPage.PROGID)> _
<ComVisible(True)> _
Partial Public Class TranslateTreePropPage
Inherits PropertyPage
Public Const GUID As String = "33F8A5CA-9F13-494e-8064-0CE5BAB77865"
Public Const PROGID As String = "ApplicativeAlgorithmsPage.TranslateTreePropPageVB"
#Region "Component Category Registration"
<ComRegisterFunction()> _
<ComVisibleAttribute(True)> _
Public Shared Sub Reg(ByVal sKey As String)
SchematicAlgorithmPages.Register(sKey)
End Sub
<ComUnregisterFunction()> _
<ComVisibleAttribute(True)> _
Public Shared Sub Unreg(ByVal sKey As String)
SchematicAlgorithmPages.Unregister(sKey)
End Sub
#End Region
#Region "internal methods"
Public Sub New()
InitializeComponent()
End Sub
Private Sub ChangedTexte(ByVal sender As Object, ByVal e As EventArgs) Handles txtYTrans.TextChanged, txtXTrans.TextChanged
PageIsDirty = True
End Sub
Private Sub TexteEnter(ByVal sender As Object, ByVal e As EventArgs) Handles txtYTrans.Enter, txtXTrans.Enter
Dim texteBox As TextBox = CType(sender, TextBox)
texteBox.SelectAll()
End Sub
Private Sub btnRestore_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnRestore.Click
' Get the saved algorithm parameters from the diagram class
Dim newAlgo As TranslateTree = GetSavedAlgo()
If (newAlgo Is Nothing) Then
newAlgo = New TranslateTree() ' otherwise revert to default algorithm parameters
End If
' get the values and set the edit boxes
txtXTrans.Text = newAlgo.TranslationFactorX.ToString()
txtYTrans.Text = newAlgo.TranslationFactorY.ToString()
End Sub
Private Function GetSavedAlgo() As TranslateTree
Dim myAlgo As TranslateTree = FindOurAlgo()
If (myAlgo Is Nothing) Then Return Nothing
Dim diagramClassName As ISchematicDiagramClassName = myAlgo.SchematicDiagramClassName
Dim pName As IName = CType(diagramClassName, IName)
If (pName Is Nothing) Then Return Nothing
Dim unk As Object = pName.Open()
Dim diagramClass As ISchematicDiagramClass = CType(unk, ISchematicDiagramClass)
If (diagramClass Is Nothing) Then Return Nothing
' get the default algorithms for this diagram class
Dim enumAlgorithms As IEnumSchematicAlgorithm = diagramClass.SchematicAlgorithms
If (enumAlgorithms Is Nothing) Then Return Nothing
enumAlgorithms.Reset()
Dim algorithm As ISchematicAlgorithm = enumAlgorithms.Next()
While (algorithm IsNot Nothing)
If TypeOf (algorithm) Is TranslateTree Then Return CType(algorithm, TranslateTree)
algorithm = enumAlgorithms.Next()
End While
Return Nothing
End Function
Private Function FindOurAlgo() As TranslateTree
' loop through the objects until the algorithm is found or not
Dim enumCollection As System.Collections.IEnumerator = Objects.GetEnumerator()
enumCollection.Reset()
While (enumCollection.MoveNext())
If TypeOf (enumCollection.Current) Is TranslateTree Then Return CType(enumCollection.Current, TranslateTree) ' found it
End While
Return Nothing
End Function
#End Region
#Region " PropertyPage "
Protected Overrides Sub OnPageDeactivate()
MyBase.OnPageDeactivate()
End Sub
Protected Overrides Sub OnActivated(ByVal e As System.EventArgs)
MyBase.OnActivated(e)
Dim myAlgo As TranslateTree = FindOurAlgo()
If (myAlgo IsNot Nothing) Then
Me.txtXTrans.Text = myAlgo.TranslationFactorX.ToString()
Me.txtYTrans.Text = myAlgo.TranslationFactorY.ToString()
End If
PageIsDirty = False
End Sub
Protected Overrides Sub OnPageApply()
'OnPageApply is launched two times when you click on Apply
'and one time if you have more one page and change page
'So I use a flag to authorize or not the application of algorithm
'The timer reset the flag, in case of multi-pages
timApply.Enabled = False
MyBase.OnPageApply()
Dim myAlgo As TranslateTree = FindOurAlgo()
If (myAlgo IsNot Nothing) Then
Try
myAlgo.TranslationFactorX = System.Convert.ToDouble(Me.txtXTrans.Text)
Finally
End Try
Try
myAlgo.TranslationFactorY = System.Convert.ToDouble(Me.txtYTrans.Text)
Finally
End Try
End If
timApply.Enabled = True
PageIsDirty = False
End Sub
Public Overrides Sub SetPageSite(ByVal pPageSite As IPropertyPageSite)
If (pPageSite Is Nothing) Then Return
MyBase.SetPageSite(pPageSite)
End Sub
'make sure our algorithm is in the input array of IUnknown
' otherwise throw an exception
Public Overrides Sub SetObjects(ByVal cObjects As UInteger, ByVal ppUnk() As Object)
If (ppUnk Is Nothing Or cObjects < 1) Then
Throw New ArgumentNullException()
End If
' remove previously stored IUnkown objects
Objects = Nothing
' browse input collection
Dim enumCollection As System.Collections.IEnumerator = ppUnk.GetEnumerator()
enumCollection.Reset()
While (enumCollection.MoveNext())
If TypeOf (enumCollection.Current) Is TranslateTree Then
' assumes only one object is managed by this property page
Dim newObjects(1) As Object
newObjects(0) = enumCollection.Current
Objects = newObjects
Exit While
End If
End While
If (Objects Is Nothing) Then
Throw New ArgumentNullException()
End If
End Sub
#End Region
End Class