About the Layer filtering TOC view Sample
[C#]
TOCLayerFilter.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using ESRI.ArcGIS.ADF.CATIDs; using ESRI.ArcGIS.ArcMapUI; using ESRI.ArcGIS.Framework; using ESRI.ArcGIS.Carto; using System.Runtime.InteropServices; using ESRI.ArcGIS.esriSystem; namespace TOCLayerFilterCS { [Guid("aede0664-ef97-4c6c-94e6-b3c6216eedc5")] [ClassInterface(ClassInterfaceType.None)] [ProgId("TOCLayerFilterCS.TOCLayerFilter")] public partial class TOCLayerFilter : UserControl, IContentsView3 { private IApplication m_application; private bool m_visible; private object m_contextItem; private bool m_isProcessEvents; #region COM Registration Function(s) [ComRegisterFunction()] [ComVisible(false)] static void RegisterFunction(Type registerType) { // Required for ArcGIS Component Category Registrar support ArcGISCategoryRegistration(registerType); // // TODO: Add any COM registration code here // } [ComUnregisterFunction()] [ComVisible(false)] static void UnregisterFunction(Type registerType) { // Required for ArcGIS Component Category Registrar support ArcGISCategoryUnregistration(registerType); // // TODO: Add any COM unregistration code here // } #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); ContentsViews.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); ContentsViews.Unregister(regKey); } #endregion #endregion public TOCLayerFilter() { InitializeComponent(); } #region "IContentsView3 Implementations" public int Bitmap { get { string bitmapResourceName = GetType().Name + ".bmp"; System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(GetType(), bitmapResourceName); bmp.MakeTransparent(bmp.GetPixel(1, 1)); //alternatively use a .png with transparency return bmp.GetHbitmap().ToInt32(); } } public string Tooltip { get { return "Layer Types (C#)"; } } public bool Visible { get { return m_visible; } set { m_visible = value; } } string IContentsView3.Name { get { return "Layer Types (C#)"; } } public int hWnd { get { return this.Handle.ToInt32(); } } public object ContextItem //last right-clicked item { get { return m_contextItem; } set { }//Not implemented } public void Activate(int parentHWnd, IMxDocument Document) { if (m_application == null) { m_application = ((IDocument)Document).Parent; if (cboLayerType.SelectedIndex < 0) cboLayerType.SelectedIndex = 0; //this should refresh the list automatically else RefreshList(); SetUpDocumentEvent(Document as IDocument); } } public void BasicActivate(int parentHWnd, IDocument Document) { } public void Refresh(object item) { if (item != this) { //when items are added, removed, reordered tvwLayer.SuspendLayout(); RefreshList(); tvwLayer.ResumeLayout(); } } public void Deactivate() { //Any clean up? } public void AddToSelectedItems(object item) { } public object SelectedItem { get { //No Multiselect so return selected node if (tvwLayer.SelectedNode != null) return tvwLayer.SelectedNode.Tag; //Layer return null; } set { //Not implemented } } public bool ProcessEvents { set { m_isProcessEvents = value; } } public void RemoveFromSelectedItems(object item) { } public bool ShowLines { get { return tvwLayer.ShowLines; } set { tvwLayer.ShowLines = value; } } #endregion private void RefreshList() { tvwLayer.Nodes.Clear(); UID layerFilter = null; if (cboLayerType.SelectedItem.Equals("Feature Layers")) { layerFilter = new UIDClass(); layerFilter.Value = "{40A9E885-5533-11d0-98BE-00805F7CED21}"; //typeof(IFeatureLayer).GUID.ToString("B"); } else if (cboLayerType.SelectedItem.Equals("Raster Layers")) { layerFilter = new UIDClass(); layerFilter.Value = typeof(IRasterLayer).GUID.ToString("B"); } else if (cboLayerType.SelectedItem.Equals("Data Layers")) { layerFilter = new UIDClass(); layerFilter.Value = "{6CA416B1-E160-11D2-9F4E-00C04F6BC78E}"; //typeof(IDataLayer).GUID.ToString("B"); } IMxDocument document = (IMxDocument)m_application.Document; IMaps maps = document.Maps; for (int i = 0; i < maps.Count; i++) { IMap map = maps.get_Item(i); TreeNode mapNode = tvwLayer.Nodes.Add(map.Name); mapNode.Tag = map; if (map.LayerCount > 0) { IEnumLayer layers = map.get_Layers(layerFilter, true); layers.Reset(); ILayer lyr; while ((lyr = layers.Next()) != null) { TreeNode lyrNode = mapNode.Nodes.Add(lyr.Name); lyrNode.Tag = lyr; } mapNode.ExpandAll(); } } } private void cboLayerType_SelectedIndexChanged(object sender, EventArgs e) { tvwLayer.SuspendLayout(); RefreshList(); tvwLayer.ResumeLayout(); } private void tvwLayer_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { if (e.Button == MouseButtons.Right) { //Set item for context menu commands to work with m_contextItem = e.Node.Tag; //Show context menu UID menuID = new UIDClass(); if (e.Node.Tag is IMap) //data frame { menuID.Value = "{F42891B5-2C92-11D2-AE07-080009EC732A}"; //Data Frame Context Menu (TOC) } else //Layer - custom menu { menuID.Value = "{30cb4a78-6eba-4f60-b52e-38bc02bacc89}"; } ICommandBar cmdBar = (ICommandBar)m_application.Document.CommandBars.Find(menuID, false, false); cmdBar.Popup(0, 0); } } #region "Add Event Wiring for New/Open Documents" // Event member variables private IDocumentEvents_Event m_docEvents; // Wiring private void SetUpDocumentEvent(IDocument myDocument) { m_docEvents = myDocument as IDocumentEvents_Event; m_docEvents.OpenDocument += new IDocumentEvents_OpenDocumentEventHandler(RefreshList); m_docEvents.NewDocument += new IDocumentEvents_NewDocumentEventHandler(RefreshList); } #endregion } }
[Visual Basic .NET]
TOCLayerFilter.vb
Imports System.Runtime.InteropServices Imports ESRI.ArcGIS.esriSystem Imports ESRI.ArcGIS.SystemUI Imports ESRI.ArcGIS.Framework Imports ESRI.ArcGIS.ADF.CATIDs Imports ESRI.ArcGIS.ArcMapUI Imports ESRI.ArcGIS.Carto <ComClass(TOCLayerFilter.ClassId, TOCLayerFilter.InterfaceId, TOCLayerFilter.EventsId), _ ProgId("TOCLayerFilterVB.TOCLayerFilter")> _ Public Class TOCLayerFilter Implements IContentsView3 Private m_application As IApplication Private m_visible As Boolean Private m_contextItem As Object Private m_isProcessEvents As Boolean #Region "COM GUIDs" ' These GUIDs provide the COM identity for this class ' and its COM interfaces. If you change them, existing ' clients will no longer be able to access the class. Public Const ClassId As String = "33a52cdc-c942-4429-9783-1a8627532775" Public Const InterfaceId As String = "0a4a8ab9-668b-41ef-a3a7-f35adbb80a20" Public Const EventsId As String = "982ce2e2-a0f7-4b8f-bc47-fbac92d50ea6" #End Region #Region "COM Registration Function(s)" <ComRegisterFunction(), ComVisible(False)> _ Private Shared Sub RegisterFunction(ByVal registerType As Type) ' Required for ArcGIS Component Category Registrar support ArcGISCategoryRegistration(registerType) ' ' TODO: Add any COM registration code here ' End Sub <ComUnregisterFunction(), ComVisible(False)> _ Private Shared Sub UnregisterFunction(ByVal registerType As Type) ' Required for ArcGIS Component Category Registrar support ArcGISCategoryUnregistration(registerType) ' ' TODO: Add any COM unregistration code here ' 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) ContentsViews.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) ContentsViews.Unregister(regKey) End Sub #End Region #End Region Public Sub New() ' This call is required by the Windows Form Designer. InitializeComponent() ' Add any initialization after the InitializeComponent() call. End Sub Private Sub cboLayerType_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboLayerType.SelectedIndexChanged tvwLayer.SuspendLayout() RefreshList() tvwLayer.ResumeLayout() End Sub Private Sub tvwLayer_NodeMouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles tvwLayer.NodeMouseClick If e.Button = Windows.Forms.MouseButtons.Right Then 'Set item for context menu commands to work with m_contextItem = e.Node.Tag 'Show context menu Dim menuID As New UIDClass() If TypeOf e.Node.Tag Is IMap Then 'data frame menuID.Value = "{F42891B5-2C92-11D2-AE07-080009EC732A}" 'Data Frame Context Menu (TOC) Else 'Layer - custom menu menuID.Value = "{fc4032dd-323e-401e-8642-2d4a25b435c1}" 'TOCFilterLayerContextMenu class id End If Dim cmdBar As ICommandBar = DirectCast(m_application.Document.CommandBars.Find(menuID, False, False), ICommandBar) cmdBar.Popup(0, 0) End If End Sub Private Sub RefreshList() tvwLayer.Nodes.Clear() Dim layerFilter As UID = Nothing If cboLayerType.SelectedItem.Equals("Feature Layers") Then layerFilter = New UIDClass() layerFilter.Value = "{40A9E885-5533-11d0-98BE-00805F7CED21}" 'IFeatureLayer ElseIf cboLayerType.SelectedItem.Equals("Raster Layers") Then layerFilter = New UIDClass() layerFilter.Value = GetType(IRasterLayer).GUID.ToString("B") ElseIf cboLayerType.SelectedItem.Equals("Data Layers") Then layerFilter = New UIDClass() layerFilter.Value = "{6CA416B1-E160-11D2-9F4E-00C04F6BC78E}" 'IDataLayer End If Dim document As IMxDocument = DirectCast(m_application.Document, IMxDocument) Dim maps As IMaps = document.Maps For i As Integer = 0 To maps.Count - 1 Dim map As IMap = maps.Item(i) Dim mapNode As Windows.Forms.TreeNode = tvwLayer.Nodes.Add(map.Name) mapNode.Tag = map If map.LayerCount > 0 Then Dim layers As IEnumLayer = map.Layers(layerFilter, True) layers.Reset() Dim lyr As ILayer = layers.Next() Do Until lyr Is Nothing Dim lyrNode As Windows.Forms.TreeNode = mapNode.Nodes.Add(lyr.Name) lyrNode.Tag = lyr lyr = layers.Next() Loop mapNode.ExpandAll() End If Next End Sub #Region "Add Event Wiring for New/Open Documents" 'Event member variables Private m_docEvents As IDocumentEvents_Event 'Wiring Private Sub SetUpDocumentEvent(ByVal myDocument As IDocument) m_docEvents = TryCast(myDocument, IDocumentEvents_Event) AddHandler m_docEvents.OpenDocument, AddressOf RefreshList AddHandler m_docEvents.NewDocument, AddressOf RefreshList End Sub #End Region #Region "IContentsView3 Implementation" Public Sub Activate(ByVal parentHWnd As Integer, ByVal Document As ESRI.ArcGIS.ArcMapUI.IMxDocument) Implements IContentsView.Activate, IContentsView2.Activate, IContentsView3.Activate If m_application Is Nothing Then m_application = DirectCast(Document, IDocument).Parent If cboLayerType.SelectedIndex < 0 Then cboLayerType.SelectedIndex = 0 Else RefreshList() End If SetUpDocumentEvent(DirectCast(Document, IDocument)) End If End Sub Public Sub AddToSelectedItems(ByVal item As Object) Implements IContentsView.AddToSelectedItems, IContentsView2.AddToSelectedItems, IContentsView3.AddToSelectedItems End Sub Public Property ContextItem() As Object Implements IContentsView.ContextItem, IContentsView2.ContextItem, IContentsView3.ContextItem Get Return m_contextItem End Get Set(ByVal value As Object) 'not implemented End Set End Property Public Sub Deactivate() Implements IContentsView.Deactivate, IContentsView2.Deactivate, IContentsView3.Deactivate End Sub Public ReadOnly Property hWnd() As Integer Implements IContentsView.hWnd, IContentsView2.hWnd, IContentsView3.hWnd Get Return Me.Handle.ToInt32() End Get End Property Public ReadOnly Property Name1() As String Implements IContentsView.Name, IContentsView2.Name, IContentsView3.Name Get Return "Layer Types (VB.NET)" End Get End Property Public WriteOnly Property ProcessEvents() As Boolean Implements IContentsView.ProcessEvents, IContentsView2.ProcessEvents, IContentsView3.ProcessEvents Set(ByVal value As Boolean) m_isProcessEvents = value End Set End Property Public Sub Refresh1(ByVal item As Object) Implements IContentsView.Refresh, IContentsView2.Refresh, IContentsView3.Refresh If item IsNot Me Then 'when items are added, removed, reordered tvwLayer.SuspendLayout() RefreshList() tvwLayer.ResumeLayout() End If End Sub Public Sub RemoveFromSelectedItems(ByVal item As Object) Implements IContentsView.RemoveFromSelectedItems, IContentsView2.RemoveFromSelectedItems, IContentsView3.RemoveFromSelectedItems End Sub Public Property SelectedItem() As Object Implements IContentsView.SelectedItem, IContentsView2.SelectedItem, IContentsView3.SelectedItem Get 'No Multiselect so return selected node If tvwLayer.SelectedNode IsNot Nothing Then Return tvwLayer.SelectedNode.Tag 'Layer Else Return Nothing End If End Get Set(ByVal value As Object) 'not implemented End Set End Property Public Property ShowLines() As Boolean Implements IContentsView.ShowLines, IContentsView2.ShowLines, IContentsView3.ShowLines Get Return tvwLayer.ShowLines End Get Set(ByVal value As Boolean) tvwLayer.ShowLines = value End Set End Property Public Property Visible1() As Boolean Implements IContentsView.Visible, IContentsView2.Visible, IContentsView3.Visible Get Return m_visible End Get Set(ByVal value As Boolean) m_visible = value End Set End Property Public Sub BasicActivate(ByVal parentHWnd As Integer, ByVal Document As ESRI.ArcGIS.Framework.IDocument) Implements IContentsView2.BasicActivate, IContentsView3.BasicActivate End Sub Public ReadOnly Property Bitmap() As Integer Implements IContentsView3.Bitmap Get Dim bitmapResourceName As String = Me.GetType().Name + ".bmp" Dim bmp As System.Drawing.Bitmap = New System.Drawing.Bitmap(Me.GetType(), bitmapResourceName) bmp.MakeTransparent(bmp.GetPixel(1, 1)) 'alternatively use a .png with transparency Return bmp.GetHbitmap().ToInt32() End Get End Property Public ReadOnly Property Tooltip() As String Implements IContentsView3.Tooltip Get Return "Layer Types (VB.NET)" End Get End Property #End Region End Class