Timestamper class extension
TimestampClassDescription.vb
' Copyright 2012 ESRI
' 
' All rights reserved under the copyright laws of the United States
' and applicable international laws, treaties, and conventions.
' 
' You may freely redistribute and use this sample code, with or
' without modification, provided you include the original copyright
' notice and use restrictions.
' 
' See the use restrictions.
' 

Imports System
Imports System.Runtime.InteropServices
Imports ESRI.ArcGIS.ADF.CATIDs
Imports ESRI.ArcGIS.esriSystem
Imports ESRI.ArcGIS.Geodatabase
Imports Timestamper.My.Resources

''' <summary>
''' A custom feature class description for use with the TimestampClassExtension. The properties return
''' nearly the same values as the FeatureClassDescription class, with the exception of the Name
''' ("Timestamped Class") and DefaultFields (returns three additional fields, Date fields for features'
''' creation and modification dates and a text field for a user name).
''' </summary>
<Guid("858e76eb-18b0-47e1-b69b-288541fe1c96")> _
<ClassInterface(ClassInterfaceType.None)> _
<ProgId("Timestamper.TimestampClassDescription")> _
<ComVisible(True)> _
Public Class TimestampClassDescription
  Implements IObjectClassDescription
  Implements IFeatureClassDescription

#Region "IObjectClassDescription Members"
  ''' <summary>
  ''' The alias of the described class.
  ''' </summary>
  Public ReadOnly Property AliasName() As String Implements IObjectClassDescription.AliasName
    Get
      AliasName = String.Empty
    End Get
  End Property

  ''' <summary>
  ''' The described class' extension UID.
  ''' </summary>
  Public ReadOnly Property ClassExtensionCLSID() As ESRI.ArcGIS.esriSystem.UID Implements IObjectClassDescription.ClassExtensionCLSID
    Get
      ' Return the UID of TimestampClassExtension.
      Dim uid As UID = New UIDClass()
      uid.Value = "{becd0269-32f2-4a21-9145-619a891e7862}"
      ClassExtensionCLSID = uid
    End Get
  End Property

  ''' <summary>
  ''' The described class' instance UID.
  ''' </summary>
  Public ReadOnly Property InstanceCLSID() As ESRI.ArcGIS.esriSystem.UID Implements IObjectClassDescription.InstanceCLSID
    Get
      ' Return the UID of Feature.
      Dim uid As UID = New UIDClass()
      uid.Value = "{52353152-891A-11D0-BEC6-00805F7C4268}"
      InstanceCLSID = uid
    End Get
  End Property

  ''' <summary>
  ''' The model name of the described class.
  ''' </summary>
  Public ReadOnly Property ModelName() As String Implements IObjectClassDescription.ModelName
    Get
      ModelName = String.Empty
    End Get
  End Property

  ''' <summary>
  ''' Indicates if the model name of the described class is unique.
  ''' </summary>
  Public ReadOnly Property ModelNameUnique() As Boolean Implements IObjectClassDescription.ModelNameUnique
    Get
      ModelNameUnique = False
    End Get
  End Property

  ''' <summary>
  ''' The name of the described class.
  ''' </summary>
  Public ReadOnly Property Name() As String Implements IObjectClassDescription.Name
    Get
      Name = Resources.TimestampedClassName
    End Get
  End Property

  ''' <summary>
  ''' The set of required fields for the described class.
  ''' </summary>
  Public ReadOnly Property RequiredFields() As IFields Implements IObjectClassDescription.RequiredFields
    Get
      ' Get the feature class required fields.
      Dim fcDescription As IFeatureClassDescription = New FeatureClassDescriptionClass()
      Dim ocDescription As IObjectClassDescription = CType(fcDescription, IObjectClassDescription)
      Dim fcRequiredFields As IFields = ocDescription.RequiredFields
      Dim fcRequiredFieldsEdit As IFieldsEdit = CType(fcRequiredFields, IFieldsEdit)

      ' Add a created date field.
      Dim createdField As IField = New FieldClass()
      Dim createdFieldEdit As IFieldEdit = CType(createdField, IFieldEdit)
      createdFieldEdit.Name_2 = Resources.DefaultCreatedField
      createdFieldEdit.Required_2 = False
      createdFieldEdit.IsNullable_2 = True
      createdFieldEdit.Type_2 = esriFieldType.esriFieldTypeDate
      fcRequiredFieldsEdit.AddField(createdField)

      ' Add a modified date field.
      Dim modifiedField As IField = New FieldClass()
      Dim modifiedFieldEdit As IFieldEdit = CType(modifiedField, IFieldEdit)
      modifiedFieldEdit.Name_2 = Resources.DefaultModifiedField
      modifiedFieldEdit.Required_2 = False
      modifiedFieldEdit.IsNullable_2 = True
      modifiedFieldEdit.Type_2 = esriFieldType.esriFieldTypeDate
      fcRequiredFieldsEdit.AddField(modifiedField)

      ' Add a user text field.
      Dim userField As IField = New FieldClass()
      Dim userFieldEdit As IFieldEdit = CType(userField, IFieldEdit)
      userFieldEdit.Name_2 = Resources.DefaultUserField
      userFieldEdit.Required_2 = False
      userFieldEdit.IsNullable_2 = True
      userFieldEdit.Type_2 = esriFieldType.esriFieldTypeString
      userFieldEdit.Length_2 = 100
      fcRequiredFieldsEdit.AddField(userField)

      RequiredFields = fcRequiredFields
    End Get
  End Property
#End Region

#Region "IFeatureClassDescription Members"
  ''' <summary>
  ''' The esriFeatureType for the instances of the described class.
  ''' </summary>
  Public ReadOnly Property FeatureType() As esriFeatureType Implements IFeatureClassDescription.FeatureType
    Get
      FeatureType = esriFeatureType.esriFTSimple
    End Get
  End Property

  ''' <summary>
  ''' The name of the described class' geometry field.
  ''' </summary>
  Public ReadOnly Property ShapeFieldName() As String Implements IFeatureClassDescription.ShapeFieldName
    Get
      ' Use the feature class default.
      Dim fcDescription As IFeatureClassDescription = New FeatureClassDescriptionClass()
      ShapeFieldName = fcDescription.ShapeFieldName
    End Get
  End Property
#End Region

#Region "COM Registration Function(s)"
  <ComRegisterFunction(), ComVisibleAttribute(False)> _
  Public Shared Sub RegisterFunction(ByVal registerType As Type)
    Dim regKey As String = String.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID)
    GeoObjectClassDescriptions.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)
    GeoObjectClassDescriptions.Unregister(regKey)
  End Sub
#End Region
End Class