ArcObjects Library Reference  

TranslateTreePropPage

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;

namespace ApplicativeAlgorithms
{
	[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 = "ApplicativeAlgorithms.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

<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 = "ApplicativeAlgorithms.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