About the Custom selection extension Sample
[C#]
SelectionExtension.cs
using System; using System.Collections.Generic; using System.Text; using System.IO; using ESRI.ArcGIS.Framework; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Desktop.AddIns; namespace SelectionSample { public class SelectionExtension : ESRI.ArcGIS.Desktop.AddIns.Extension { private IMap m_map; private bool m_hasSelectableLayer; private static IDockableWindow s_dockWindow; private static SelectionExtension s_extension; // Overrides protected override void OnStartup() { s_extension = this; // Wire up events ArcMap.Events.NewDocument += ArcMap_NewOpenDocument; ArcMap.Events.OpenDocument += ArcMap_NewOpenDocument; Initialize(); } protected override void OnShutdown() { Uninitialize(); ArcMap.Events.NewDocument -= ArcMap_NewOpenDocument; ArcMap.Events.OpenDocument -= ArcMap_NewOpenDocument; m_map = null; s_dockWindow = null; s_extension = null; base.OnShutdown(); } protected override bool OnSetState(ExtensionState state) { // Optionally check for a license here this.State = state; if (state == ExtensionState.Enabled) Initialize(); else Uninitialize(); return base.OnSetState(state); } protected override ExtensionState OnGetState() { return this.State; } // Privates private void Initialize() { // If the extension hasn't been started yet or it's been turned off, bail if (s_extension == null || this.State != ExtensionState.Enabled) return; // Reset event handlers IActiveViewEvents_Event avEvent = ArcMap.Document.FocusMap as IActiveViewEvents_Event; avEvent.ItemAdded += AvEvent_ItemAdded; avEvent.ItemDeleted += AvEvent_ItemAdded; avEvent.SelectionChanged += UpdateSelCountDockWin; avEvent.ContentsChanged += avEvent_ContentsChanged; // Update the UI m_map = ArcMap.Document.FocusMap; FillComboBox(); SelCountDockWin.SetEnabled(true); UpdateSelCountDockWin(); m_hasSelectableLayer = CheckForSelectableLayer(); } private void Uninitialize() { if (s_extension == null) return; // Detach event handlers IActiveViewEvents_Event avEvent = m_map as IActiveViewEvents_Event; avEvent.ItemAdded -= AvEvent_ItemAdded; avEvent.ItemDeleted -= AvEvent_ItemAdded; avEvent.SelectionChanged -= UpdateSelCountDockWin; avEvent.ContentsChanged -= avEvent_ContentsChanged; avEvent = null; // Update UI SelectionTargetComboBox selCombo = SelectionTargetComboBox.GetSelectionComboBox(); if (selCombo != null) selCombo.ClearAll(); SelCountDockWin.SetEnabled(false); } private void UpdateSelCountDockWin() { // If the dockview hasn't been created yet if (!SelCountDockWin.Exists) return; // Update the contents of the listView, when the selection changes in the map. IFeatureLayer featureLayer; IFeatureSelection featSel; SelCountDockWin.Clear(); // Loop through the layers in the map and add the layer's name and // selection count to the list box for (int i = 0; i < m_map.LayerCount; i++) { if (m_map.get_Layer(i) is IFeatureSelection) { featureLayer = m_map.get_Layer(i) as IFeatureLayer; if (featureLayer == null) break; featSel = featureLayer as IFeatureSelection; int count = 0; if (featSel.SelectionSet != null) count = featSel.SelectionSet.Count; SelCountDockWin.AddItem(featureLayer.Name, count); } } } private void FillComboBox() { SelectionTargetComboBox selCombo = SelectionTargetComboBox.GetSelectionComboBox(); if (selCombo == null) return; selCombo.ClearAll(); IFeatureLayer featureLayer; // Loop through the layers in the map and add the layer's name to the combo box. for (int i = 0; i < m_map.LayerCount; i++) { if (m_map.get_Layer(i) is IFeatureSelection) { featureLayer = m_map.get_Layer(i) as IFeatureLayer; if (featureLayer == null) break; selCombo.AddItem(featureLayer.Name, featureLayer); } } } private bool CheckForSelectableLayer() { IMap map = ArcMap.Document.FocusMap; // Bail if map has no layers if (map.LayerCount == 0) return false; // Fetch all the feature layers in the focus map // and see if at least one is selectable UIDClass uid = new UIDClass(); uid.Value = "{40A9E885-5533-11d0-98BE-00805F7CED21}"; IEnumLayer enumLayers = map.get_Layers(uid, true); IFeatureLayer featureLayer = enumLayers.Next() as IFeatureLayer; while (featureLayer != null) { if (featureLayer.Selectable == true) return true; featureLayer = enumLayers.Next() as IFeatureLayer; } return false; } // Event handlers private void ArcMap_NewOpenDocument() { IActiveViewEvents_Event pageLayoutEvent = ArcMap.Document.PageLayout as IActiveViewEvents_Event; pageLayoutEvent.FocusMapChanged += new IActiveViewEvents_FocusMapChangedEventHandler(AVEvents_FocusMapChanged); Initialize(); } private void avEvent_ContentsChanged() { m_hasSelectableLayer = CheckForSelectableLayer(); } private void AvEvent_ItemAdded(object Item) { m_map = ArcMap.Document.FocusMap; FillComboBox(); UpdateSelCountDockWin(); m_hasSelectableLayer = CheckForSelectableLayer(); } private void AVEvents_FocusMapChanged() { Initialize(); } // Statics internal static IDockableWindow GetSelectionCountWindow() { if (s_extension == null) GetExtension(); // Only get/create the dockable window if they ask for it if (s_dockWindow == null) { // Use GetDockableWindow directly intead of FromID as we want the client IDockableWindow not the internal class UID dockWinID = new UIDClass(); dockWinID.Value = ThisAddIn.IDs.SelCountDockWin; s_dockWindow = ArcMap.DockableWindowManager.GetDockableWindow(dockWinID); s_extension.UpdateSelCountDockWin(); } return s_dockWindow; } internal static bool IsExtensionEnabled() { if (s_extension == null) GetExtension(); if (s_extension == null) return false; return s_extension.State == ExtensionState.Enabled; } internal static bool HasSelectableLayer() { if (s_extension == null) GetExtension(); if (s_extension == null) return false; return s_extension.m_hasSelectableLayer; } private static SelectionExtension GetExtension() { if (s_extension == null) { // Call FindExtension to load this just-in-time extension. UID id = new UIDClass(); id.Value = ThisAddIn.IDs.SelectionExtension; ArcMap.Application.FindExtensionByCLSID(id); } return s_extension; } } }
[Visual Basic .NET]
SelectionExtension.vb
Imports Microsoft.VisualBasic Imports System Imports System.Collections.Generic Imports System.Text Imports System.IO Imports ESRI.ArcGIS.Framework Imports ESRI.ArcGIS.esriSystem Imports ESRI.ArcGIS.Carto Imports ESRI.ArcGIS.Desktop.AddIns Imports My Namespace SelectionSample Public Class SelectionExtension Inherits ESRI.ArcGIS.Desktop.AddIns.Extension Private m_map As IMap Private m_hasSelectableLayer As Boolean Private Shared s_dockWindow As ESRI.ArcGIS.Framework.IDockableWindow Private Shared s_extension As SelectionExtension ' Overrides Protected Overrides Sub OnStartup() s_extension = Me ' Wire up events AddHandler ArcMap.Events.NewDocument, AddressOf ArcMap_NewOpenDocument AddHandler ArcMap.Events.OpenDocument, AddressOf ArcMap_NewOpenDocument Initialize() End Sub Protected Overloads Overrides Sub OnShutdown() Uninitialize() RemoveHandler ArcMap.Events.NewDocument, AddressOf ArcMap_NewOpenDocument RemoveHandler ArcMap.Events.OpenDocument, AddressOf ArcMap_NewOpenDocument m_map = Nothing s_dockWindow = Nothing s_extension = Nothing MyBase.OnShutdown() End Sub Protected Overrides Function OnSetState(ByVal state As ExtensionState) As Boolean ' Optionally check for a license here Me.State = state If state = ExtensionState.Enabled Then Initialize() Else Uninitialize() End If Return MyBase.OnSetState(state) End Function Protected Overrides Function OnGetState() As ExtensionState Return Me.State End Function ' Privates Private Sub Initialize() If s_extension Is Nothing Or Me.State <> ExtensionState.Enabled Then Return End If ' Reset event handlers Dim avEvent As IActiveViewEvents_Event = TryCast(ArcMap.Document.FocusMap, IActiveViewEvents_Event) AddHandler avEvent.ItemAdded, AddressOf AvEvent_ItemAdded AddHandler avEvent.ItemDeleted, AddressOf AvEvent_ItemAdded AddHandler avEvent.SelectionChanged, AddressOf UpdateSelCountDockWin AddHandler avEvent.ContentsChanged, AddressOf avEvent_ContentsChanged ' Update the UI m_map = ArcMap.Document.FocusMap FillComboBox() SelCountDockWin.SetEnabled(True) UpdateSelCountDockWin() m_hasSelectableLayer = CheckForSelectableLayer() End Sub Private Sub Uninitialize() If s_extension Is Nothing Then Return End If ' Detach event handlers Dim avEvent As IActiveViewEvents_Event = TryCast(m_map, IActiveViewEvents_Event) RemoveHandler avEvent.ItemAdded, AddressOf AvEvent_ItemAdded RemoveHandler avEvent.ItemDeleted, AddressOf AvEvent_ItemAdded RemoveHandler avEvent.SelectionChanged, AddressOf UpdateSelCountDockWin RemoveHandler avEvent.ContentsChanged, AddressOf avEvent_ContentsChanged avEvent = Nothing ' Update UI Dim selCombo As SelectionTargetComboBox = SelectionTargetComboBox.GetSelectionComboBox() If selCombo IsNot Nothing Then selCombo.ClearAll() End If SelCountDockWin.SetEnabled(False) End Sub Private Sub UpdateSelCountDockWin() ' If the dockview hasn't been created yet If (Not SelCountDockWin.Exists) Then Return End If ' Update the contents of the listView, when the selection changes in the map. Dim featureLayer As IFeatureLayer Dim featSel As IFeatureSelection SelCountDockWin.Clear() ' Loop through the layers in the map and add the layer's name and ' selection count to the list box For i As Integer = 0 To m_map.LayerCount - 1 If TypeOf m_map.Layer(i) Is IFeatureSelection Then featureLayer = TryCast(m_map.Layer(i), IFeatureLayer) If featureLayer Is Nothing Then Exit For End If featSel = TryCast(featureLayer, IFeatureSelection) Dim count As Integer = 0 If featSel.SelectionSet IsNot Nothing Then count = featSel.SelectionSet.Count End If SelCountDockWin.AddItem(featureLayer.Name, count) End If Next i End Sub Private Sub FillComboBox() Dim selCombo As SelectionTargetComboBox = SelectionTargetComboBox.GetSelectionComboBox() If selCombo Is Nothing Then Return End If selCombo.ClearAll() Dim featureLayer As IFeatureLayer ' Loop through the layers in the map and add the layer's name to the combo box. For i As Integer = 0 To m_map.LayerCount - 1 If TypeOf m_map.Layer(i) Is IFeatureSelection Then featureLayer = TryCast(m_map.Layer(i), IFeatureLayer) If featureLayer Is Nothing Then Exit For End If selCombo.AddItem(featureLayer.Name, featureLayer) End If Next i End Sub Private Function CheckForSelectableLayer() As Boolean Dim map As IMap = ArcMap.Document.FocusMap ' Bail if map has no layers If map.LayerCount = 0 Then Return False End If ' Fetch all the feature layers in the focus map ' and see if at least one is selectable Dim uid As New UIDClass() uid.Value = "{40A9E885-5533-11d0-98BE-00805F7CED21}" Dim enumLayers As IEnumLayer = map.Layers(uid, True) Dim featureLayer As IFeatureLayer = TryCast(enumLayers.Next(), IFeatureLayer) Do While featureLayer IsNot Nothing If featureLayer.Selectable = True Then Return True End If featureLayer = TryCast(enumLayers.Next(), IFeatureLayer) Loop Return False End Function ' Event handlers Private Sub ArcMap_NewOpenDocument() Dim pageLayoutEvent As IActiveViewEvents_Event = TryCast(ArcMap.Document.PageLayout, IActiveViewEvents_Event) AddHandler pageLayoutEvent.FocusMapChanged, AddressOf AVEvents_FocusMapChanged Initialize() End Sub Private Sub avEvent_ContentsChanged() m_hasSelectableLayer = CheckForSelectableLayer() End Sub Private Sub AvEvent_ItemAdded(ByVal Item As Object) m_map = ArcMap.Document.FocusMap FillComboBox() UpdateSelCountDockWin() m_hasSelectableLayer = CheckForSelectableLayer() End Sub Private Sub AVEvents_FocusMapChanged() Initialize() End Sub ' Statics Friend Shared Function GetSelectionCountWindow() As ESRI.ArcGIS.Framework.IDockableWindow If s_extension Is Nothing Then GetExtension() End If ' Only get/create the dockable window if they ask for it If s_dockWindow Is Nothing Then Dim dockWinID As UID = New UIDClass() dockWinID.Value = ThisAddIn.IDs.SelCountDockWin s_dockWindow = ArcMap.DockableWindowManager.GetDockableWindow(dockWinID) s_extension.UpdateSelCountDockWin() End If Return s_dockWindow End Function Friend Shared Function IsExtensionEnabled() As Boolean If s_extension Is Nothing Then GetExtension() End If If s_extension Is Nothing Then Return False End If Return s_extension.State = ExtensionState.Enabled End Function Friend Shared Function HasSelectableLayer() As Boolean If s_extension Is Nothing Then GetExtension() End If If s_extension Is Nothing Then Return False End If Return s_extension.m_hasSelectableLayer End Function Private Shared Function GetExtension() As SelectionExtension If s_extension Is Nothing Then Dim extID As UID = New UIDClass() extID.Value = ThisAddIn.IDs.SelectionExtension ' Call FindExtension to load this just-in-time extension. ArcMap.Application.FindExtensionByCLSID(extID) End If Return s_extension End Function End Class End Namespace