Graphics layers ToolControl
GraphicsLayersListCtrl.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 Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Drawing
Imports System.Data
Imports System.Text
Imports System.Windows.Forms
Imports ESRI.ArcGIS.Controls
Imports ESRI.ArcGIS.Carto
Imports ESRI.ArcGIS.SystemUI
Imports ESRI.ArcGIS.esriSystem

  ''' <summary>
  ''' This user control hosts a combobox which allow the user to control over the active graphics layer 
  ''' </summary>
Partial Public Class GraphicsLayersListCtrl : Inherits UserControl
#Region "class members"
  Private m_map As IMap = Nothing
  Private m_uid As UID = Nothing
#End Region

#Region "class constructor"
  Public Sub New()
    InitializeComponent()

    'initialize the UID that will be used later to get the graphics layers
    m_uid = New UIDClass()
    m_uid.Value = "{34B2EF81-F4AC-11D1-A245-080009B6F22B}" 'graphics layers category
  End Sub
#End Region

  ''' <summary>
  ''' Get the current map and wire the ActiveViewEvents
  ''' </summary>
  Public Property Map() As IMap
    Get
      Return m_map
    End Get
    Set(ByVal value As IMap)
      m_map = value
      If Nothing Is m_map Then
        Return
      End If

      'set verbose events in order to be able to listen to the various 'ItemXXX' events 
      CType(m_map, IViewManager).VerboseEvents = True

      'register document events in order to listen to layers which gets added or removed
      AddHandler (CType(m_map, IActiveViewEvents_Event)).ItemAdded, AddressOf OnItemAdded
      AddHandler (CType(m_map, IActiveViewEvents_Event)).ItemReordered, AddressOf OnItemReordered
      AddHandler (CType(m_map, IActiveViewEvents_Event)).ItemDeleted, AddressOf OnItemDeleted

      'populate the combo with a list of the graphics layers
      PopulateCombo()
    End Set
  End Property

  ''' <summary>
  ''' occurs when the user select an item from the combo
  ''' </summary>
  ''' <param name="sender"></param>
  ''' <param name="e"></param>
  Private Sub cmbGraphicsLayerList_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles cmbGraphicsLayerList.SelectedIndexChanged
    If Nothing Is m_map Then
      Return
    End If

    'get the basic graphics layer from the map
    Dim activeLayer As ILayer = TryCast(m_map.BasicGraphicsLayer, ILayer)
    'if the name of the selected item is the basic graphics layer, make it the active graphics layer
    If activeLayer.Name = cmbGraphicsLayerList.SelectedItem.ToString() Then
      m_map.ActiveGraphicsLayer = TryCast(m_map.BasicGraphicsLayer, ILayer)
      Return
    End If
    'iterate through the graphics layers
    Dim layers As IEnumLayer = GetGraphicsLayersList()
    If Nothing Is layers Then
      Return
    End If

    layers.Reset()
    Dim layer As ILayer = layers.Next()

    Do While Not layer Is Nothing
      If TypeOf layer Is IGroupLayer Then
        Continue Do
      End If

      If TypeOf layer Is IGraphicsLayer Then
        'make the select item the active graphics layer
        If layer.Name = cmbGraphicsLayerList.SelectedItem.ToString() Then
          m_map.ActiveGraphicsLayer = layer
        End If
      End If
      layer = layers.Next()
    Loop
  End Sub

  ''' <summary>
  ''' get the list of all graphics layers in the map
  ''' </summary>
  ''' <returns></returns>
  Private Function GetGraphicsLayersList() As IEnumLayer
    Dim layers As IEnumLayer = Nothing
    If Nothing Is m_map OrElse 0 = m_map.LayerCount Then
      Return Nothing
    End If

    Try
      layers = m_map.Layers(m_uid, True)
    Catch ex As Exception
      System.Diagnostics.Trace.WriteLine(ex.Message)
      Return Nothing
    End Try

    Return layers
  End Function

  ''' <summary>
  ''' list the graphics layers in the combo and select the active graphics layer
  ''' </summary>
  Private Sub PopulateCombo()
    If Nothing Is m_map Then
      Return
    End If

    'clear the items list of the combo
    cmbGraphicsLayerList.Items.Clear()

    'add the basic graphics layer name
    cmbGraphicsLayerList.Items.Add((CType(m_map.BasicGraphicsLayer, ILayer)).Name)

    'get the active graphics layer
    Dim activeLayer As ILayer = m_map.ActiveGraphicsLayer

    'get the list of all graphics layers in the map
    Dim layers As IEnumLayer = GetGraphicsLayersList()
    If Not Nothing Is layers Then

      'add the layer names to the combo
      layers.Reset()
      Dim layer As ILayer = layers.Next()

      Do While Not layer Is Nothing
        cmbGraphicsLayerList.Items.Add(layer.Name)
        layer = layers.Next()
      Loop
    End If
    'set the selected item to be the active layer
    cmbGraphicsLayerList.SelectedItem = activeLayer.Name
  End Sub

  ''' <summary>
  ''' occurs when a layer is being deleted from the map
  ''' </summary>
  ''' <param name="Item"></param>
  Private Sub OnItemDeleted(ByVal Item As Object)
    PopulateCombo()
  End Sub

  ''' <summary>
  ''' occurs when a layer is being reordered in the TOC
  ''' </summary>
  ''' <param name="Item"></param>
  ''' <param name="toIndex"></param>
  Private Sub OnItemReordered(ByVal Item As Object, ByVal toIndex As Integer)
    PopulateCombo()
  End Sub

  ''' <summary>
  ''' occurs when a layer is being added to the map
  ''' </summary>
  ''' <param name="Item"></param>
  Private Sub OnItemAdded(ByVal Item As Object)
    PopulateCombo()
  End Sub
End Class