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;
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