About the Tabbed feature inspector Sample
[C#]
TabbedInspector.cs
using System; using System.Runtime.InteropServices; using System.Windows.Forms; using ESRI.ArcGIS.ADF.CATIDs; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; namespace TabbedFeatureInspector { [Guid(TabbedInspectorCLSID)] [ClassInterface(ClassInterfaceType.None)] [ProgId("TabbedFeatureInspector.TabbedInspectorCS")] public partial class TabbedInspector : UserControl, IEngineObjectInspector, IClassExtension, IFeatureClassExtension { public const string TabbedInspectorCLSID = "65a43962-8cc0-49c0-bfa3-015d0ff8350e"; #region COM Registration Function(s) [ComRegisterFunction] [ComVisible(false)] private static void RegisterFunction(Type registerType) { // Required for ArcGIS Component Category Registrar support ArcGISCategoryRegistration(registerType); } [ComUnregisterFunction] [ComVisible(false)] private static void UnregisterFunction(Type registerType) { // Required for ArcGIS Component Category Registrar support ArcGISCategoryUnregistration(registerType); } #region ArcGIS Component Category Registrar generated code /// <summary> /// Required method for ArcGIS Component Category registration - /// Do not modify the contents of this method with the code editor. /// </summary> private static void ArcGISCategoryRegistration(Type registerType) { string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID); GeoObjectClassExtensions.Register(regKey); } /// <summary> /// Required method for ArcGIS Component Category unregistration - /// Do not modify the contents of this method with the code editor. /// </summary> private static void ArcGISCategoryUnregistration(Type registerType) { string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID); GeoObjectClassExtensions.Unregister(regKey); } #endregion #endregion private const short SW_SHOW = 5; public static string title = "Custom Feature Inspector Properties:"; private IEngineObjectInspector m_inspector; public TabbedInspector() { InitializeComponent(); if (m_inspector == null) { m_inspector = new EngineFeatureInspector(); } } #region "IEngineObjectInspector Implementations" /// <summary> /// Returns the handle for the picture box. /// </summary> public int picHwnd { get { return defaultPictureBox.Handle.ToInt32(); } } /// <summary> /// Returns the handle property of the tab page that holds the default inspector. /// </summary> public int stabHwnd { get { return standardTabPage.Handle.ToInt32(); } } /// <summary> /// Clear the inspector before inspecting another object. /// </summary> public void Clear() { m_inspector.Clear(); customListBox.Items.Clear(); } /// <summary> /// Copies the values from srcRow to the row being edited. /// </summary> /// <param name="srcRow"></param> public void Copy(IRow srcRow) { m_inspector.Copy(srcRow); } /// <summary> /// The window handle for the inspector. /// </summary> public int hWnd { get { return Handle.ToInt32(); } } /// <summary> /// Inspects the properties of the features. /// </summary> /// <param name="objects"></param> /// <param name="Editor"></param> public void Inspect(IEngineEnumRow objects, IEngineEditor Editor) { try { SetParent(m_inspector.hWnd, stabHwnd); SetParent(stabHwnd, picHwnd); ShowWindow(m_inspector.hWnd, SW_SHOW); m_inspector.Inspect(objects, Editor); IEngineEnumRow enumRow = objects; IRow row = enumRow.Next(); IFeature inspFeature = (IFeature) row; //user selected the layer name instead of a feature. if (objects.Count > 1) return; switch (inspFeature.Shape.GeometryType) { case esriGeometryType.esriGeometryPolygon: { //do this for polygons. customListBox.Items.Clear(); ReportPolygons(inspFeature); break; } case esriGeometryType.esriGeometryPolyline: { //do this for lines. customListBox.Items.Clear(); ReportPolylines(inspFeature); break; } case esriGeometryType.esriGeometryPoint: { //do this for points. customListBox.Items.Clear(); ReportPoints(inspFeature); break; } default: break; } //End switch. } catch (Exception ex) { MessageBox.Show("IObjectInspector_Inspect: " + ex.Message); } } #endregion #region IClassExtension Implementations /// <summary> /// Initializes the extension, passing in a reference to its class helper. /// </summary> /// <param name="pClassHelper"></param> /// <param name="pExtensionProperties"></param> public void Init(IClassHelper pClassHelper, IPropertySet pExtensionProperties) { } /// <summary> /// Informs the extension that its class helper is going away. /// </summary> public void Shutdown() { m_inspector = null; } #endregion [DllImport("user32.dll", CharSet = CharSet.Ansi)] private static extern int SetParent(int hWndChild, int hWndNewParent); [DllImport("user32.dll", CharSet = CharSet.Ansi)] private static extern int ShowWindow(int hWnd, int nCmdShow); /// <summary> /// Reports the area, perimeter, and number of vertices for the selected polygon /// </summary> /// <param name="inspFeature"></param> private void ReportPolygons(IFeature inspFeature) { try { IPolygon shpPolygon = (IPolygon) inspFeature.Shape; IArea polyArea = (IArea) shpPolygon; ICurve polyCurve = shpPolygon; IPointCollection polyPoints = (IPointCollection) shpPolygon; customListBox.BeginUpdate(); customListBox.Items.Add(title); customListBox.Items.Add(""); customListBox.Items.Add("FID:" + inspFeature.OID); //Report Area First customListBox.Items.Add("AREA : " + Convert.ToString(polyArea.Area)); //Then Perimeter customListBox.Items.Add("PERIMETER: " + Convert.ToString(polyCurve.Length)); //Number of vertices //polyPoints = shpPolygon customListBox.Items.Add("VERTICES: " + Convert.ToString(polyPoints.PointCount)); // Determine the width of the items in the list to get the best column width setting. int width = (int) customListBox.CreateGraphics().MeasureString(customListBox.Items[customListBox.Items.Count - 1].ToString(), customListBox.Font).Width; // Set the column width based on the width of each item in the list. customListBox.ColumnWidth = width; customListBox.EndUpdate(); } catch (FormatException ex) { MessageBox.Show("ReportPolygons: " + ex.Message); } } /// <summary> /// Reports length, FromPoint-x, FromPoint-y, ToPoint-x, ToPoint-x of selected polylines. /// </summary> /// <param name="inspFeature"></param> private void ReportPolylines(IFeature inspFeature) { ICurve lCurve = (ICurve) inspFeature.Shape; customListBox.BeginUpdate(); customListBox.Items.Add(title); customListBox.Items.Add(""); customListBox.Items.Add("FID: " + Convert.ToString(inspFeature.OID)); //Report Length First customListBox.Items.Add("LENGTH: " + Convert.ToString(lCurve.Length)); //Report Start Point next customListBox.Items.Add("FROMPOINT-X: " + Convert.ToString(lCurve.FromPoint.X)); //Report End Point customListBox.Items.Add("FROMPOINT-Y: " + Convert.ToString(lCurve.FromPoint.Y)); //Report End Point last customListBox.Items.Add("TOPOINT-X: " + Convert.ToString(lCurve.ToPoint.X)); customListBox.Items.Add("TOPOINT-Y: " + Convert.ToString(lCurve.ToPoint.Y)); // Determine the width of the items in the list to get the best column width setting. int width = (int) customListBox.CreateGraphics().MeasureString(customListBox.Items[customListBox.Items.Count - 1].ToString(), customListBox.Font).Width; // Set the column width based on the width of each item in the list. customListBox.ColumnWidth = width; customListBox.EndUpdate(); } /// <summary> /// Reports the coordinates of the selected point features. /// </summary> /// <param name="inspFeature"></param> private void ReportPoints(IFeature inspFeature) { IPoint shpPt = (IPoint) inspFeature.Shape; customListBox.BeginUpdate(); customListBox.Items.Add(title); customListBox.Items.Add(""); customListBox.Items.Add("FID: " + inspFeature.OID); //Report X and Y coordinate locations customListBox.Items.Add("X-COORD : " + Convert.ToString(shpPt.X)); customListBox.Items.Add("Y-COORD : " + Convert.ToString(shpPt.Y)); // Determine the width of the items in the list to get the best column width setting. int width = (int) customListBox.CreateGraphics().MeasureString(customListBox.Items[customListBox.Items.Count - 1].ToString(), customListBox.Font).Width; // Set the column width based on the width of each item in the list. customListBox.ColumnWidth = width; customListBox.EndUpdate(); } } }
[Visual Basic .NET]
TabbedInspector.vb
Imports System Imports System.Runtime.InteropServices Imports System.Windows.Forms Imports ESRI.ArcGIS.ADF.CATIDs Imports ESRI.ArcGIS.Controls Imports ESRI.ArcGIS.esriSystem Imports ESRI.ArcGIS.Geodatabase Imports ESRI.ArcGIS.Geometry Namespace TabbedFeatureInspector <Guid(TabbedInspectorCLSID.TabbedInspectorCLSID)> _ <ClassInterface(ClassInterfaceType.None)> _ <ProgId("TabbedFeatureInspector.TabbedInspectorCS")> _ Partial Public Class TabbedInspector Inherits UserControl Implements IEngineObjectInspector Implements IClassExtension Implements IFeatureClassExtension #Region "COM Registration Function(s)" <ComRegisterFunction()> _ <ComVisible(False)> _ Public Shared Sub RegisterFunction(ByVal registerType As Type) ' Required for ArcGIS Component Category Registrar support ArcGISCategoryRegistration(registerType) End Sub <ComUnregisterFunction()> _ <ComVisible(False)> _ Public Shared Sub UnregisterFunction(ByVal registerType As Type) ' Required for ArcGIS Component Category Registrar support ArcGISCategoryUnregistration(registerType) End Sub #Region "ArcGIS Component Category Registrar generated code" '/ <summary> '/ Required method for ArcGIS Component Category registration - '/ Do not modify the contents of this method with the code editor. '/ </summary> Private Shared Sub ArcGISCategoryRegistration(ByVal registerType As Type) Dim regKey As String = String.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID) GeoObjectClassExtensions.Register(regKey) End Sub '/ <summary> '/ Required method for ArcGIS Component Category unregistration - '/ Do not modify the contents of this method with the code editor. '/ </summary> Private Shared Sub ArcGISCategoryUnregistration(ByVal registerType As Type) Dim regKey As String = String.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID) GeoObjectClassExtensions.Unregister(regKey) End Sub #End Region #End Region Private Const SW_SHOW As Short = 5 Public Shared title As String = "Custom Feature Inspector Properties:" Private m_inspector As IEngineObjectInspector Public Sub New() InitializeComponent() If m_inspector Is Nothing Then m_inspector = New EngineFeatureInspector() End If End Sub #Region "Handles" '/ <summary> '/ Returns the handle for the picture box. '/ </summary> Public ReadOnly Property picHwnd() As Integer Get Return defaultPictureBox.Handle.ToInt32() End Get End Property '/ <summary> '/ Returns the handle property of the tab page that holds the default inspector. '/ </summary> Public ReadOnly Property stabHwnd() As Integer Get Return standardTabPage.Handle.ToInt32() End Get End Property #End Region #Region "IEngineObjectInspector Implementations" '/ <summary> '/ Clear the inspector before inspecting another object. '/ </summary> Public Sub Clear() Implements IEngineObjectInspector.Clear m_inspector.Clear() customListBox.Items.Clear() End Sub '/ <summary> '/ Copies the values from srcRow to the row being edited. '/ </summary> '/ <param name="srcRow"></param> Public Sub Copy(ByVal srcRow As IRow) Implements IEngineObjectInspector.Copy m_inspector.Copy(srcRow) End Sub '/ <summary> '/ The window handle for the inspector. '/ </summary> Public ReadOnly Property hWnd() As Integer Implements IEngineObjectInspector.hWnd Get Return Handle.ToInt32() End Get End Property '/ <summary> '/ Inspects the properties of the features. '/ </summary> '/ <param name="objects"></param> '/ <param name="Editor"></param> Public Sub Inspect(ByVal objects As IEngineEnumRow, ByVal Editor As IEngineEditor) Implements IEngineObjectInspector.Inspect Try SetParent(m_inspector.hWnd, stabHwnd) SetParent(stabHwnd, picHwnd) ShowWindow(m_inspector.hWnd, SW_SHOW) m_inspector.Inspect(objects, Editor) Dim EnumRow As IEngineEnumRow = objects Dim row As IRow = EnumRow.Next() Dim inspFeature As IFeature = DirectCast(row, IFeature) 'user selected the layer name instead of a feature. If objects.Count > 1 Then Return End If Select Case inspFeature.Shape.GeometryType Case esriGeometryType.esriGeometryPolygon 'do this for polygons. customListBox.Items.Clear() ReportPolygons(inspFeature) Exit Sub Case esriGeometryType.esriGeometryPolyline 'do this for lines. customListBox.Items.Clear() ReportPolylines(inspFeature) Exit Sub Case esriGeometryType.esriGeometryPoint 'do this for points. customListBox.Items.Clear() ReportPoints(inspFeature) Exit Sub Case Else Exit Sub End Select 'End switch. Catch ex As Exception MessageBox.Show("IObjectInspector_Inspect: " + ex.Message) End Try End Sub #End Region #Region "IClassExtension Implementations" '/ <summary> '/ Initializes the extension, passing in a reference to its class helper. '/ </summary> '/ <param name="pClassHelper"></param> '/ <param name="pExtensionProperties"></param> Public Sub Init(ByVal pClassHelper As IClassHelper, ByVal pExtensionProperties As IPropertySet) Implements IClassExtension.Init End Sub '/ <summary> '/ Informs the extension that its class helper is going away. '/ </summary> Public Sub Shutdown() Implements IClassExtension.Shutdown m_inspector = Nothing End Sub #End Region <DllImport("user32.dll", CharSet:=CharSet.Ansi)> _ Private Shared Function SetParent(ByVal hWndChild As Integer, ByVal hWndNewParent As Integer) As Integer End Function <DllImport("user32.dll", CharSet:=CharSet.Ansi)> _ Private Shared Function ShowWindow(ByVal hWnd As Integer, ByVal nCmdShow As Integer) As Integer End Function '<DllImport("user32.dll", CharSet = CharSet.Ansi)> _ 'private static extern Integer ShowWindow(Integer hWnd, Integer nCmdShow) '/ <summary> '/ Reports the area, perimeter, and number of vertices for the selected polygon '/ </summary> '/ <param name="inspFeature"></param> Private Sub ReportPolygons(ByVal inspFeature As IFeature) Try Dim shpPolygon As IPolygon = DirectCast(inspFeature.Shape, IPolygon) Dim polyArea As IArea = DirectCast(shpPolygon, IArea) Dim polyCurve As ICurve = shpPolygon Dim polyPoints As IPointCollection = DirectCast(shpPolygon, IPointCollection) customListBox.BeginUpdate() customListBox.Items.Add(title) customListBox.Items.Add("") customListBox.Items.Add("FID: " + inspFeature.OID.ToString) 'Report Area First customListBox.Items.Add("AREA : " + Convert.ToString(polyArea.Area)) 'Then Perimeter customListBox.Items.Add("PERIMETER: " + Convert.ToString(polyCurve.Length)) 'Number of vertices 'polyPoints = shpPolygon customListBox.Items.Add("VERTICES: " + Convert.ToString(polyPoints.PointCount)) ' Determine the width of the items in the list to get the best column width setting. Dim width As Integer width = customListBox.CreateGraphics() _ .MeasureString(customListBox.Items(customListBox.Items.Count - 1).ToString(), customListBox.Font).Width() ' Set the column width based on the width of each item in the list. customListBox.ColumnWidth = width customListBox.EndUpdate() Catch ex As FormatException MessageBox.Show("ReportPolygons: " + ex.Message) End Try End Sub '/ <summary> '/ Reports length, FromPoint-x, FromPoint-y, ToPoint-x, ToPoint-x of selected polylines. '/ </summary> '/ <param name="inspFeature"></param> Private Sub ReportPolylines(ByVal inspFeature As IFeature) Dim lCurve As ICurve = DirectCast(inspFeature.Shape, ICurve) customListBox.BeginUpdate() customListBox.Items.Add(title) customListBox.Items.Add("") customListBox.Items.Add("FID: " + Convert.ToString(inspFeature.OID)) 'Report Length First customListBox.Items.Add("LENGTH: " + Convert.ToString(lCurve.Length)) 'Report Start Point next customListBox.Items.Add("FROMPOINT-X: " + Convert.ToString(lCurve.FromPoint.X)) 'Report End Point customListBox.Items.Add("FROMPOINT-Y: " + Convert.ToString(lCurve.FromPoint.Y)) 'Report End Point last customListBox.Items.Add("TOPOINT-X: " + Convert.ToString(lCurve.ToPoint.X)) customListBox.Items.Add("TOPOINT-Y: " + Convert.ToString(lCurve.ToPoint.Y)) ' Determine the width of the items in the list to get the best column width setting. Dim width As Integer width = customListBox.CreateGraphics() _ .MeasureString(customListBox.Items(customListBox.Items.Count - 1).ToString(), customListBox.Font).Width ' Set the column width based on the width of each item in the list. customListBox.ColumnWidth = width customListBox.EndUpdate() End Sub '/ <summary> '/ Reports the coordinates of the selected point features. '/ </summary> '/ <param name="inspFeature"></param> Private Sub ReportPoints(ByVal inspFeature As IFeature) Dim shpPt As IPoint = DirectCast(inspFeature.Shape, IPoint) customListBox.BeginUpdate() customListBox.Items.Add(title) customListBox.Items.Add("") customListBox.Items.Add("FID: " + inspFeature.OID.ToString) 'Report X and Y coordinate locations customListBox.Items.Add("X-COORD : " + Convert.ToString(shpPt.X)) customListBox.Items.Add("Y-COORD : " + Convert.ToString(shpPt.Y)) ' Determine the width of the items in the list to get the best column width setting. Dim width As Integer width = customListBox.CreateGraphics() _ .MeasureString(customListBox.Items(customListBox.Items.Count - 1).ToString(), customListBox.Font).Width ' Set the column width based on the width of each item in the list. customListBox.ColumnWidth = width customListBox.EndUpdate() End Sub Private WithEvents customTabPage As System.Windows.Forms.TabPage Private WithEvents customListBox As System.Windows.Forms.ListBox Private WithEvents standardTabPage As System.Windows.Forms.TabPage Private WithEvents inspectorTabControl As System.Windows.Forms.TabControl Private WithEvents defaultPictureBox As System.Windows.Forms.PictureBox Private Sub InitializeComponent() Me.customTabPage = New System.Windows.Forms.TabPage Me.customListBox = New System.Windows.Forms.ListBox Me.defaultPictureBox = New System.Windows.Forms.PictureBox Me.inspectorTabControl = New System.Windows.Forms.TabControl Me.standardTabPage = New System.Windows.Forms.TabPage Me.customTabPage.SuspendLayout() DirectCast(Me.defaultPictureBox, System.ComponentModel.ISupportInitialize).BeginInit() Me.inspectorTabControl.SuspendLayout() Me.standardTabPage.SuspendLayout() Me.SuspendLayout() ' 'customTabPage ' Me.customTabPage.AutoScroll = True Me.customTabPage.Controls.Add(Me.customListBox) Me.customTabPage.Location = New System.Drawing.Point(4, 22) Me.customTabPage.Name = "customTabPage" Me.customTabPage.Padding = New System.Windows.Forms.Padding(3) Me.customTabPage.Size = New System.Drawing.Size(292, 294) Me.customTabPage.TabIndex = 1 Me.customTabPage.Text = "Custom" Me.customTabPage.UseVisualStyleBackColor = True ' 'customListBox ' Me.customListBox.Dock = System.Windows.Forms.DockStyle.Fill Me.customListBox.FormattingEnabled = True Me.customListBox.Location = New System.Drawing.Point(3, 3) Me.customListBox.MaximumSize = New System.Drawing.Size(1000, 1000) Me.customListBox.MultiColumn = True Me.customListBox.Name = "customListBox" Me.customListBox.Size = New System.Drawing.Size(286, 277) Me.customListBox.TabIndex = 0 ' 'defaultPictureBox ' Me.defaultPictureBox.BackColor = System.Drawing.SystemColors.Window Me.defaultPictureBox.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D Me.defaultPictureBox.Dock = System.Windows.Forms.DockStyle.Fill Me.defaultPictureBox.Location = New System.Drawing.Point(3, 3) Me.defaultPictureBox.MaximumSize = New System.Drawing.Size(1000, 1000) Me.defaultPictureBox.Name = "defaultPictureBox" Me.defaultPictureBox.Size = New System.Drawing.Size(136, 118) Me.defaultPictureBox.TabIndex = 0 Me.defaultPictureBox.TabStop = False ' 'inspectorTabControl ' Me.inspectorTabControl.Controls.Add(Me.standardTabPage) Me.inspectorTabControl.Controls.Add(Me.customTabPage) Me.inspectorTabControl.Dock = System.Windows.Forms.DockStyle.Fill Me.inspectorTabControl.Location = New System.Drawing.Point(0, 0) Me.inspectorTabControl.MaximumSize = New System.Drawing.Size(1000, 1000) Me.inspectorTabControl.Name = "inspectorTabControl" Me.inspectorTabControl.SelectedIndex = 0 Me.inspectorTabControl.Size = New System.Drawing.Size(150, 150) Me.inspectorTabControl.TabIndex = 1 ' 'standardTabPage ' Me.standardTabPage.AutoScroll = True Me.standardTabPage.Controls.Add(Me.defaultPictureBox) Me.standardTabPage.Location = New System.Drawing.Point(4, 22) Me.standardTabPage.Name = "standardTabPage" Me.standardTabPage.Padding = New System.Windows.Forms.Padding(3) Me.standardTabPage.Size = New System.Drawing.Size(142, 124) Me.standardTabPage.TabIndex = 0 Me.standardTabPage.Text = "Standard" Me.standardTabPage.UseVisualStyleBackColor = True ' 'TabbedInspector ' Me.Controls.Add(Me.inspectorTabControl) Me.Name = "TabbedInspector" Me.customTabPage.ResumeLayout(False) DirectCast(Me.defaultPictureBox, System.ComponentModel.ISupportInitialize).EndInit() Me.inspectorTabControl.ResumeLayout(False) Me.standardTabPage.ResumeLayout(False) Me.ResumeLayout(False) End Sub End Class End Namespace