ArcObjects Library Reference  

TimestampPropertyPage

About the Timestamper class extension Sample

[C#]

TimestampPropertyPage.cs

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using ESRI.ArcGIS.ADF.CATIDs;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Framework;
using ESRI.ArcGIS.Geodatabase;
using Timestamper.Properties;

namespace Timestamper
{
	/// <summary>
	/// A property page for object classes extended with the TimestampClassExtension.
	/// </summary>
	[Guid("a77c1137-bbca-4e6b-863a-0fad7e3fc4a3")]
	[ClassInterface(ClassInterfaceType.None)]
	[ProgId("Timestamper.TimestampPropertyPage")]
	[ComVisible(true)]
	public partial class TimestampPropertyPage : UserControl, IComPropertyPage
	{
		#region Member Variables
		/// <summary>
		/// Indicates whether the combo boxes have been changed.
		/// </summary>
		private Boolean dirtyFlag = false;

		/// <summary>
		/// The dialog box containing the page.
		/// </summary>
		private IComPropertyPageSite pageSite = null;

		/// <summary>
		/// The extension the property page refers to.
		/// </summary>
		private TimestampClassExtension timestampClassExtension = null;

		/// <summary>
		/// The class the extension is associated with.
		/// </summary>
		private IObjectClass objectClass = null;
		#endregion

		#region Constructors
		/// <summary>
		/// The default constructor.
		/// </summary>
		public TimestampPropertyPage()
		{
			InitializeComponent();

			// Set all combo boxes to "Not Used" by default.
			cmbCreatedField.SelectedIndex = 0;
			cmbModifiedField.SelectedIndex = 0;
			cmbUserField.SelectedIndex = 0;
		}
		#endregion

		#region Private Methods
		/// <summary>
		/// Fired by a change to the combo boxes.
		/// </summary>
		/// <param name="eventSource">The source of the event.</param>
		/// <param name="arguments">Event arguments.</param>
		private void SetDirty(object eventSource, EventArgs arguments)
		{
			dirtyFlag = true;

			if (pageSite != null && this.Visible)
			{
				pageSite.PageChanged();
			}
		}

		/// <summary>
		/// Load valid date and text fields from the class.
		/// </summary>
		private void LoadValidFields()
		{
			// Create lists for storing Date and Text fields.
			List<String> dateFieldNames = new List<String>();
			List<String> textFieldNames = new List<String>();

			// Iterate through the class' fields.
			IFields fields = objectClass.Fields;
			for (int i = 0; i < fields.FieldCount; i++)
			{
				IField field = fields.get_Field(i);
				if (field.Type == esriFieldType.esriFieldTypeDate)
				{
					dateFieldNames.Add(field.Name);
				}
				if (field.Type == esriFieldType.esriFieldTypeString)
				{
					textFieldNames.Add(field.Name);
				}
			}

			// Add the valid fields to each combo box.
			foreach (String dateFieldName in dateFieldNames)
			{
				cmbCreatedField.Items.Add(dateFieldName);
				cmbModifiedField.Items.Add(dateFieldName);
			}
			foreach (String textFieldName in textFieldNames)
			{
				cmbUserField.Items.Add(textFieldName);
			}
		}
		#endregion

		#region IComPropertyPage Members
		/// <summary>
		/// Occurs on page creation.
		/// </summary>
		/// <returns>The handle of the page.</returns>
		int IComPropertyPage.Activate()
		{
			if (timestampClassExtension != null)
			{
				// Load the potential date/text fields from the class.
				LoadValidFields();

				// Set the combo boxes selected indexes to the correct positions.
				if (cmbCreatedField.Items.Contains(timestampClassExtension.CreatedField))
				{
					cmbCreatedField.SelectedItem = timestampClassExtension.CreatedField;
				}
				if (cmbModifiedField.Items.Contains(timestampClassExtension.ModifiedField))
				{
					cmbModifiedField.SelectedItem = timestampClassExtension.ModifiedField;
				}
				if (cmbUserField.Items.Contains(timestampClassExtension.UserField))
				{
					cmbUserField.SelectedItem = timestampClassExtension.UserField;
				}

				// Register the event handler with the combo boxes.
				cmbCreatedField.SelectedIndexChanged += new EventHandler(SetDirty);
				cmbModifiedField.SelectedIndexChanged += new EventHandler(SetDirty);
				cmbUserField.SelectedIndexChanged += new EventHandler(SetDirty);
			}

			return this.Handle.ToInt32();
		}

		/// <summary>
		/// Indicates if the page applies to the specified objects.
		/// Do not hold on to the objects here.
		/// </summary>
		bool IComPropertyPage.Applies(ISet objects)
		{
			// Should only apply if a single class is selected.
			if (objects == null || objects.Count != 1)
				return false;

			// Check whether the provided object is an object class with the TimestampClassExtension.
			Boolean isApplicable = false;
			objects.Reset();
			object providedObject = objects.Next();
			IObjectClass objectClass = providedObject as IObjectClass;
			if (objectClass != null)
			{
				// Get the object class' extension.
				object classExtension = objectClass.Extension;
				if (classExtension is TimestampClassExtension)
				{
					isApplicable = true;
				}
			}

			return isApplicable;
		}

		/// <summary>
		/// Applies any changes to the class extension.
		/// </summary>
		void IComPropertyPage.Apply()
		{
			if (dirtyFlag)
			{
				try
				{
					if (timestampClassExtension != null)
					{
						// Get the field names from the combo boxes.
						String createdField = Convert.ToString(cmbCreatedField.SelectedItem);
						String modifiedField = Convert.ToString(cmbModifiedField.SelectedItem);
						String userField = Convert.ToString(cmbUserField.SelectedItem);
						
						// Check if any of the fields are set to "Not Used".
						if (cmbCreatedField.SelectedIndex == 0)
						{
							createdField = "";
						}
						if (cmbModifiedField.SelectedIndex == 0)
						{
							modifiedField = "";
						}
						if (cmbUserField.SelectedIndex == 0)
						{
							userField = "";
						}

						// Set the field names on the extension.
						timestampClassExtension.SetTimestampFields(createdField, modifiedField, userField);
					}
				}
				catch (Exception exc)
				{
					MessageBox.Show(String.Format("{0}{1}{2}", Resources.PropertyPageApplyErrorMsg,
						Environment.NewLine, exc.Message));
				}
			}
		}

		/// <summary>
		/// Cancels any changes to the class extension.
		/// </summary>
		void IComPropertyPage.Cancel()
		{
			dirtyFlag = false;
		}

		/// <summary>
		/// Destroys the page.
		/// </summary>
		void IComPropertyPage.Deactivate()
		{
			this.Dispose(true);
		}

		/// <summary>
		/// The height of the page in pixels.
		/// </summary>
		int IComPropertyPage.Height
		{
			get { return this.Height; }
		}

		/// <summary>
		/// The help context ID for the specified control on the page.
		/// </summary>
		/// <param name="controlID">The control ID.</param>
		/// <returns>In this case, 0, indicating no help context.</returns>
		int IComPropertyPage.get_HelpContextID(int controlID)
		{
			return 0;
		}

		/// <summary>
		/// The help file for the page (none).
		/// </summary>
		String IComPropertyPage.HelpFile
		{
			get { return string.Empty; }
		}

		/// <summary>
		/// Hides the page.
		/// </summary>
		void IComPropertyPage.Hide()
		{
			// No need to do anything here.
		}

		/// <summary>
		/// Indicates if any changes have been made to the page.
		/// </summary>
		Boolean IComPropertyPage.IsPageDirty
		{
			get { return dirtyFlag; }
		}

		/// <summary>
		/// The sheet that contains the page.
		/// </summary>
		IComPropertyPageSite IComPropertyPage.PageSite
		{
			set
			{
				pageSite = value;
			}
		}

		/// <summary>
		/// The page priority.
		/// </summary>
		int IComPropertyPage.Priority
		{
			get
			{
				// Low-priority.
				return 0;
			}
			set
			{
				// Do nothing.
			}
		}

		/// <summary>
		/// Supplies the page with the object(s) to be edited.
		/// </summary>
		/// <param name="objects">The object(s) this page applies to.</param>
		void IComPropertyPage.SetObjects(ISet objects)
		{
			if (objects == null || objects.Count != 1)
				return;

			// Store the provided object class in a member variable.
			objects.Reset();
			object providedObject = objects.Next();
			objectClass = providedObject as IObjectClass;
			if (objectClass != null)
			{
				// Get the object class' extension.
				timestampClassExtension = objectClass.Extension as TimestampClassExtension;
			}
		}

		/// <summary>
		/// Shows the page.
		/// </summary>
		void IComPropertyPage.Show()
		{
			// No need to do anything here.
		}

		/// <summary>
		/// The title of the property page.
		/// </summary>
		string IComPropertyPage.Title
		{
			get
			{
				return Resources.PropertyPageTitle;
			}
			set
			{
				// Do nothing.
			}
		}

		/// <summary>
		/// The width of the page in pixels.
		/// </summary>
		int IComPropertyPage.Width
		{
			get { return this.Width; }
		}
		#endregion

		#region COM Registration Functions
		/// <summary>
		/// Registers the property page in the appropriate component categories.
		/// </summary>
		/// <param name="registerType">The class description's type.</param>
		[ComRegisterFunction()]
		[ComVisible(false)]
		static void RegisterFunction(Type registerType)
		{
			string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
			TablePropertyPages.Register(regKey);
			FeatureClassPropertyPages.Register(regKey);
		}

		/// <summary>
		/// Removes the property page from the appropriate component categories.
		/// </summary>
		/// <param name="registerType">The class description's type.</param>
		[ComUnregisterFunction()]
		[ComVisible(false)]
		static void UnregisterFunction(Type registerType)
		{
			string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
			TablePropertyPages.Unregister(regKey);
			FeatureClassPropertyPages.Unregister(regKey);
		}
		#endregion
	}
}

[Visual Basic .NET]

TimestampPropertyPage.vb

Imports System
Imports System.Collections.Generic
Imports System.Runtime.InteropServices
Imports System.Windows.Forms
Imports ESRI.ArcGIS.ADF.CATIDs
Imports ESRI.ArcGIS.esriSystem
Imports ESRI.ArcGIS.Framework
Imports ESRI.ArcGIS.Geodatabase
Imports Timestamper.My.Resources

''' <summary>
''' A property page for object classes extended with the TimestampClassExtension.
''' </summary>
<Guid("2de16f54-8cd0-495e-a2a5-86319ef5d14c")> _
<ClassInterface(ClassInterfaceType.None)> _
<ProgId("Timestamper.TimestampPropertyPage")> _
<ComVisible(True)> _
Public Class TimestampPropertyPage
	Implements IComPropertyPage

#Region "Member Variables"
	''' <summary>
	''' Indicates whether the combo boxes have been changed.
	''' </summary>
	Private dirtyFlag As Boolean = False

	''' <summary>
	''' The dialog box containing the page.
	''' </summary>
	Private comPropertyPageSite As IComPropertyPageSite = Nothing

	''' <summary>
	''' The extension the property page refers to.
	''' </summary>
	Private timestampClassExtension As TimestampClassExtension = Nothing

	''' <summary>
	''' The class the extension is associated with.
	''' </summary>
	Private objectClass As IObjectClass = Nothing
#End Region

#Region "Constructors"
	''' <summary>
	''' The default constructor.
	''' </summary>
	Public Sub New()

		' This call is required by the Windows Form Designer.
		InitializeComponent()

		' Set all combo boxes to "Not Used" by default.
		cmbCreatedField.SelectedIndex = 0
		cmbModifiedField.SelectedIndex = 0
		cmbUserField.SelectedIndex = 0

	End Sub
#End Region

#Region "Private Methods"
	''' <summary>
	''' Fired by a change to the combo boxes.
	''' </summary>
	''' <param name="eventSource">The source of the event.</param>
	''' <param name="arguments">Event arguments.</param>
	Private Sub SetDirty(ByVal eventSource As Object, ByVal arguments As EventArgs)
		dirtyFlag = True

		If Not comPropertyPageSite Is Nothing And Me.Visible Then
			comPropertyPageSite.PageChanged()
		End If
	End Sub

	''' <summary>
	''' Load valid date and text fields from the class.
	''' </summary>
	Private Sub LoadValidFields()
		' Create lists for storing Date and Text fields.
		Dim dateFieldNames As List(Of String) = New List(Of String)
		Dim textFieldNames As List(Of String) = New List(Of String)

		' Iterate through the class' fields.
		Dim fields As IFields = objectClass.Fields
		For i As Integer = 0 To fields.FieldCount - 1
			Dim field As IField = fields.Field(i)

			If field.Type = esriFieldType.esriFieldTypeDate Then
				dateFieldNames.Add(field.Name)
			End If

			If field.Type = esriFieldType.esriFieldTypeString Then
				textFieldNames.Add(field.Name)
			End If
		Next

		' Add the valid fields to each combo box.
		For Each dateFieldName As String In dateFieldNames
			cmbCreatedField.Items.Add(dateFieldName)
			cmbModifiedField.Items.Add(dateFieldName)
		Next
		For Each textFieldName As String In textFieldNames
			cmbUserField.Items.Add(textFieldName)
		Next
	End Sub
#End Region

#Region "IComPropertyPage Members"
	''' <summary>
	''' Occurs on page creation.
	''' </summary>
	''' <returns>The handle of the page.</returns>
	Public Function Activate() As Integer Implements IComPropertyPage.Activate
		If Not timestampClassExtension Is Nothing Then
			' Load the potential date/text fields from the class.
			LoadValidFields()

			' Set the combo boxes selected indexes to the correct positions.
			If cmbCreatedField.Items.Contains(timestampClassExtension.CreatedField) Then
				cmbCreatedField.SelectedItem = timestampClassExtension.CreatedField
			End If

			If cmbModifiedField.Items.Contains(timestampClassExtension.ModifiedField) Then
				cmbModifiedField.SelectedItem = timestampClassExtension.ModifiedField
			End If

			If cmbUserField.Items.Contains(timestampClassExtension.UserField) Then
				cmbUserField.SelectedItem = timestampClassExtension.UserField
			End If

			' Register the event handler with the combo boxes.
			AddHandler cmbCreatedField.SelectedIndexChanged, AddressOf SetDirty
			AddHandler cmbModifiedField.SelectedIndexChanged, AddressOf SetDirty
			AddHandler cmbUserField.SelectedIndexChanged, AddressOf SetDirty
		End If

		Activate = Me.Handle.ToInt32()
	End Function

	''' <summary>
	''' Indicates if the page applies to the specified objects.
	''' Do not hold on to the objects here.
	''' </summary>
	Public Function Applies(ByVal objects As ISet) As Boolean Implements IComPropertyPage.Applies
		' Should only apply if a single class is selected.
		If (objects Is Nothing Or objects.Count <> 1) Then
			Return False
		End If

		' Check whether the provided object is an object class with the TimestampClassExtension.
		Dim isApplicable As Boolean = False
		objects.Reset()
		Dim providedObject As Object = objects.Next()
		Dim objectClass As IObjectClass = TryCast(providedObject, IObjectClass)
		If Not objectClass Is Nothing Then
			' Get the object class' extension.
			Dim classExtension As Object = objectClass.Extension
			If TypeOf classExtension Is TimestampClassExtension Then
				isApplicable = True
			End If
		End If

		Applies = isApplicable
	End Function

	''' <summary>
	''' Applies any changes to the class extension.
	''' </summary>
	Public Sub Apply() Implements IComPropertyPage.Apply
		If dirtyFlag Then
			Try
				If Not timestampClassExtension Is Nothing Then
					' Get the field names from the combo boxes.
					Dim createdField As String = CType(cmbCreatedField.SelectedItem, String)
					Dim modifiedField As String = CType(cmbModifiedField.SelectedItem, String)
					Dim userField As String = CType(cmbUserField.SelectedItem, String)

					' Check if any of the fields are set to "Not Used".
					If cmbCreatedField.SelectedIndex = 0 Then
						createdField = ""
					End If

					If cmbModifiedField.SelectedIndex = 0 Then
						modifiedField = ""
					End If

					If cmbUserField.SelectedIndex = 0 Then
						userField = ""
					End If

					' Set the field names on the extension.
					timestampClassExtension.SetTimestampFields(createdField, modifiedField, userField)
				End If
			Catch exc As Exception
				MessageBox.Show(String.Format("{0}{1}{2}", Resources.PropertyPageApplyErrorMsg, _
				 Environment.NewLine, exc.Message))
			End Try
		End If
	End Sub

	''' <summary>
	''' Cancels any changes to the class extension.
	''' </summary>
	Public Sub Cancel() Implements IComPropertyPage.Cancel
		dirtyFlag = False
	End Sub

	''' <summary>
	''' Destroys the page.
	''' </summary>
	Public Sub Deactivate() Implements IComPropertyPage.Deactivate
		Me.Dispose(True)
	End Sub

	''' <summary>
	''' The height of the page in pixels.
	''' </summary>
	Public ReadOnly Property ComPropertyPageHeight() As Integer Implements IComPropertyPage.Height
		Get
			ComPropertyPageHeight = Me.Height
		End Get
	End Property

	''' <summary>
	''' The help context ID for the specified control on the page.
	''' </summary>
	''' <param name="controlID">The control ID.</param>
	''' <returns>In this case, 0, indicating no help context.</returns>
	Public ReadOnly Property HelpContextID(ByVal controlID As Integer) As Integer Implements IComPropertyPage.HelpContextID
		Get
			HelpContextID = 0
		End Get
	End Property

	''' <summary>
	''' The help file for the page (none).
	''' </summary>
	Public ReadOnly Property HelpFile() As String Implements IComPropertyPage.HelpFile
		Get
			HelpFile = String.Empty
		End Get
	End Property

	''' <summary>
	''' Hides the page.
	''' </summary>
	Public Sub ComPropertyPageHide() Implements IComPropertyPage.Hide
		' No need to do anything here.
	End Sub

	''' <summary>
	''' Indicates if any changes have been made to the page.
	''' </summary>
	Public ReadOnly Property IsPageDirty() As Boolean Implements IComPropertyPage.IsPageDirty
		Get
			IsPageDirty = dirtyFlag
		End Get
	End Property

	''' <summary>
	''' The sheet that contains the page.
	''' </summary>
	Public WriteOnly Property PageSite() As IComPropertyPageSite Implements IComPropertyPage.PageSite
		Set(ByVal value As IComPropertyPageSite)
			comPropertyPageSite = value
		End Set
	End Property

	''' <summary>
	''' The page priority.
	''' </summary>
	''' <value>Setting a value has no effect.</value>
	Public Property Priority() As Integer Implements IComPropertyPage.Priority
		Get
			' Low-priority.
			Priority = 0
		End Get
		Set(ByVal value As Integer)
			' Do nothing.
		End Set
	End Property

	''' <summary>
	''' Supplies the page with the object(s) to be edited.
	''' </summary>
	''' <param name="objects">The object(s) this page applies to.</param>
	Public Sub SetObjects(ByVal objects As ISet) Implements IComPropertyPage.SetObjects
		If objects Is Nothing Or objects.Count <> 1 Then
			Exit Sub
		End If

		' Store the provided object class in a member variable.
		objects.Reset()
		Dim providedObject As Object = objects.Next()
		objectClass = TryCast(providedObject, IObjectClass)
		If Not objectClass Is Nothing Then
			' Get the object class' extension.
			timestampClassExtension = TryCast(objectClass.Extension, TimestampClassExtension)
		End If
	End Sub

	''' <summary>
	''' Shows the page.
	''' </summary>
	Public Sub ComPropertyPageShow() Implements IComPropertyPage.Show
		' No need to do anything here.
	End Sub

	''' <summary>
	''' The title of the property page.
	''' </summary>
	''' <value>Setting a value has no effect.</value>
	Public Property Title() As String Implements IComPropertyPage.Title
		Get
			Title = Resources.PropertyPageTitle
		End Get
		Set(ByVal value As String)
			' Do nothing.
		End Set
	End Property

	''' <summary>
	''' The width of the page in pixels.
	''' </summary>
	Public ReadOnly Property ComPropertyPageWidth() As Integer Implements IComPropertyPage.Width
		Get
			ComPropertyPageWidth = Me.Width
		End Get
	End Property
#End Region

#Region "COM Registration Functions"
	<ComRegisterFunction(), ComVisibleAttribute(False)> _
	Public Shared Sub RegisterFunction(ByVal registerType As Type)
		Dim regKey As String = String.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID)
		TablePropertyPages.Register(regKey)
		FeatureClassPropertyPages.Register(regKey)
	End Sub

	<ComUnregisterFunction(), ComVisibleAttribute(False)> _
	Public Shared Sub UnregisterFunction(ByVal registerType As Type)
		Dim regKey As String = String.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID)
		TablePropertyPages.Unregister(regKey)
		FeatureClassPropertyPages.Register(regKey)
	End Sub
#End Region

End Class