About the Applying user interface customizations at startup Sample
[C#]
AcmeExt.cs
using System;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.Framework;
using ESRI.ArcGIS.ArcMapUI;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.ADF.CATIDs;
namespace ACME.GIS.SampleExt
{
[Guid("148C17C0-C680-4269-B358-09A59A771822")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("ACME.Extension")]
public class AcmeExt : IExtension, IExtensionConfig, IPersistVariant
{
#region COM Registration Functions
// Register the Extension in the ESRI MxExtensions Component Category
[ComRegisterFunction()]
[ComVisible(false)]
static void RegisterFunction(Type registerType)
{
string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
MxExtension.Register(regKey);
}
[ComUnregisterFunction()]
[ComVisible(false)]
static void UnregisterFunction(Type registerType)
{
string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
MxExtension.Unregister(regKey);
}
#endregion
private IApplication m_application;
private IApplicationStatus m_appStatus;
private esriExtensionState m_extensionState = esriExtensionState.esriESDisabled;
private bool m_isMenuPresent = false;
private IDocumentEvents_Event m_docEvents;
private IApplicationStatusEvents_Event m_mapStatusEvents;
private const string c_extName = "ACME Extension (C#)";
private const string c_menuID = "ACME.MainMenu";
private const string c_mainMenuID = "{1E739F59-E45F-11D1-9496-080009EEBECB}"; // Main menubar
#region IExtension Members
public string Name
{
get { return c_extName; }
}
public void Shutdown()
{
m_docEvents = null;
m_application = null;
}
public void Startup(ref object initializationData)
{
m_application = initializationData as IApplication;
m_appStatus = m_application as IApplicationStatus;
// Wireup the events
SetupEvents();
}
#endregion
#region IExtensionConfig Members
public string Description
{
get { return "Sample extension showing IApplicationStatusEvents"; }
}
public string ProductName
{
get { return c_extName; }
}
public esriExtensionState State
{
get
{
return m_extensionState;
}
set
{
// Bail if requested state matches current state
if (value == m_extensionState)
return;
// Cache the state
m_extensionState = value;
if (m_application == null) // Don't assume Startup has been called (JIT extensions)
return;
// Enable, add the menu
if (m_extensionState == esriExtensionState.esriESEnabled)
{
if (!m_isMenuPresent)
CheckMenuValidity();
return;
}
// Disable, remove the menu
if (m_extensionState == esriExtensionState.esriESDisabled)
{
if (m_isMenuPresent)
UnLoadCustomizations();
return;
}
}
}
#endregion
#region IPersistVariant Members
public UID ID
{
get
{
UID extUID = new UIDClass();
extUID.Value = GetType().GUID.ToString("B");
return extUID; ;
}
}
public void Load(IVariantStream Stream)
{
}
public void Save(IVariantStream Stream)
{
}
#endregion
# region Events
private void SetupEvents()
{
// Make sure we're dealing with ArcMap
if (m_application.Document.Parent is IMxApplication)
{
m_docEvents = m_application.Document as IDocumentEvents_Event;
m_docEvents.NewDocument += new IDocumentEvents_NewDocumentEventHandler(OnNewDocument);
m_docEvents.OpenDocument += new IDocumentEvents_OpenDocumentEventHandler(OnOpenDocument);
m_mapStatusEvents = m_application.Document.Parent as IApplicationStatusEvents_Event;
m_mapStatusEvents.Initialized += new IApplicationStatusEvents_InitializedEventHandler(OnInitialized);
}
}
void OnOpenDocument()
{
CheckMenuValidity();
}
void OnNewDocument()
{
CheckMenuValidity();
}
// Called when the framework is fully initialized
// After this event fires, it is safe to make UI customizations
void OnInitialized()
{
CheckMenuValidity();
}
#endregion
private void CheckMenuValidity()
{
// Wait for framework to initialize before making ui customizations
// Check framework initialization flag
if (!m_appStatus.Initialized)
return;
// Make sure the extension is enabled
if (m_extensionState != esriExtensionState.esriESEnabled)
return;
// Perform the customization
LoadCustomizations();
}
private void LoadCustomizations()
{
ICommandBar topMenuBar = GetMainBar();
if (topMenuBar == null)
return;
// Add AcmeMenu
UID uid = new UIDClass();
uid.Value = c_menuID;
Object indexObj = Type.Missing;
ICommandBar myMenu = topMenuBar.Add(uid, ref indexObj) as ICommandBar;
((ICommandItem)topMenuBar).Refresh();
m_isMenuPresent = true;
}
private void UnLoadCustomizations()
{
ICommandBar topMenuBar = GetMainBar();
if (topMenuBar == null)
return;
// Remove AcmeMenu
UID uid = new UIDClass();
uid.Value = c_menuID;
ICommandBar myMenu = topMenuBar.Find(uid, false) as ICommandBar;
ICommandItem myMenuItem = myMenu as ICommandItem;
myMenuItem.Delete();
((ICommandItem)topMenuBar).Refresh();
m_isMenuPresent = false;
}
private ICommandBar GetMainBar()
{
try
{
//Grab the root menu bar
UID uid = new UIDClass();
uid.Value = c_mainMenuID;
MxDocument mx = (MxDocument)m_application.Document;
ICommandBars cmdBars = mx.CommandBars;
ICommandItem x = cmdBars.Find(uid, false, false);
return cmdBars.Find(uid, false, false) as ICommandBar;
}
catch
{
return null;
}
}
}
}
[Visual Basic .NET]
AcmeExt.vb
Imports System
Imports System.Runtime.InteropServices
Imports ESRI.ArcGIS.Framework
Imports ESRI.ArcGIS.ArcMapUI
Imports ESRI.ArcGIS.esriSystem
Imports ESRI.ArcGIS.ADF.CATIDs
Namespace ACME.GIS.SampleExt
<Guid("CC11AED1-C9AD-4a01-B138-EA7BB0487FF0")> _
<ClassInterface(ClassInterfaceType.None)> _
<ProgId("ACME.ExtensionVB")> _
Public Class AcmeExt
Implements IExtension
Implements IExtensionConfig
Implements IPersistVariant
#Region "COM Registration Functions"
' Register the Extension in the ESRI MxExtensions Component Category
<ComRegisterFunction()> _
<ComVisible(False)> _
Private Shared Sub RegisterFunction(ByVal registerType As Type)
Dim regKey As String = String.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID)
MxExtension.Register(regKey)
End Sub
<ComUnregisterFunction()> _
<ComVisible(False)> _
Private Shared Sub UnregisterFunction(ByVal registerType As Type)
Dim regKey As String = String.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID)
MxExtension.Unregister(regKey)
End Sub
#End Region
Private m_application As IApplication
Private m_appStatus As IApplicationStatus
Private m_extensionState As esriExtensionState = esriExtensionState.esriESDisabled
Private m_isMenuPresent As Boolean = False
Private m_docEvents As IDocumentEvents_Event
Private m_mapStatusEvents As IApplicationStatusEvents_Event
Private Const c_extName As String = "ACME Extension (VB)"
Private Const c_menuID As String = "ACME.MainMenuVB"
Private Const c_mainMenuID As String = "{1E739F59-E45F-11D1-9496-080009EEBECB}" ' Main menubar
#Region "IExtension Members"
Public ReadOnly Property Name() As String Implements IExtension.Name
Get
Return c_extName
End Get
End Property
Public Sub Shutdown() Implements IExtension.Shutdown
m_docEvents = Nothing
m_application = Nothing
End Sub
Public Sub Startup(ByRef initializationData As Object) Implements IExtension.Startup
m_application = TryCast(initializationData, IApplication)
m_appStatus = TryCast(m_application, IApplicationStatus)
' Wireup the events
SetupEvents()
End Sub
#End Region
#Region "IExtensionConfig Members"
Public ReadOnly Property Description() As String Implements ESRI.ArcGIS.esriSystem.IExtensionConfig.Description
Get
Return "Sample extension showing IApplicationStatusEvents"
End Get
End Property
Public ReadOnly Property ProductName() As String Implements ESRI.ArcGIS.esriSystem.IExtensionConfig.ProductName
Get
Return c_extName
End Get
End Property
Public Property State() As ESRI.ArcGIS.esriSystem.esriExtensionState Implements ESRI.ArcGIS.esriSystem.IExtensionConfig.State
Get
Return m_extensionState
End Get
Set(ByVal value As esriExtensionState)
' Bail if requested state matches current state
If value = m_extensionState Then
Return
End If
' Cache the state
m_extensionState = value
If m_application Is Nothing Then
Return
' Don't assume Startup has been called (JIT extensions)
End If
' Enable, add the menu
If m_extensionState = esriExtensionState.esriESEnabled Then
If Not m_isMenuPresent Then
CheckMenuValidity()
End If
Return
End If
' Disable, remove the menu
If m_extensionState = esriExtensionState.esriESDisabled Then
If m_isMenuPresent Then
UnLoadCustomizations()
End If
Return
End If
End Set
End Property
#End Region
#Region "IPersistVariant Members"
Public ReadOnly Property ID() As UID Implements IPersistVariant.ID
Get
Dim extUID As UID = New UIDClass()
extUID.Value = [GetType]().GUID.ToString("B")
Return extUID
End Get
End Property
Public Sub Load(ByVal Stream As IVariantStream) Implements IPersistVariant.Load
End Sub
Public Sub Save(ByVal Stream As IVariantStream) Implements IPersistVariant.Save
End Sub
#End Region
#Region "Events"
Private Sub SetupEvents()
' Make sure we're dealing with ArcMap
If TypeOf m_application.Document.Parent Is IMxApplication Then
m_docEvents = TryCast(m_application.Document, IDocumentEvents_Event)
AddHandler m_docEvents.NewDocument, AddressOf OnNewDocument
AddHandler m_docEvents.OpenDocument, AddressOf OnOpenDocument
m_mapStatusEvents = TryCast(m_application.Document.Parent, IApplicationStatusEvents_Event)
AddHandler m_mapStatusEvents.Initialized, AddressOf OnInitialized
End If
End Sub
Private Sub OnOpenDocument()
CheckMenuValidity()
End Sub
Private Sub OnNewDocument()
CheckMenuValidity()
End Sub
' Called when the framework is fully initialized
' After this event fires, it is safe to make UI customizations
Private Sub OnInitialized()
CheckMenuValidity()
End Sub
#End Region
Private Sub CheckMenuValidity()
' Wait for framework to initialize before making ui customizations
' Check framework initialization flag
If Not m_appStatus.Initialized Then
Return
End If
' Make sure the extension is enabled
If m_extensionState <> esriExtensionState.esriESEnabled Then
Return
End If
' Perform the customization
LoadCustomizations()
End Sub
Private Sub LoadCustomizations()
Dim topMenuBar As ICommandBar = GetMainBar()
If topMenuBar Is Nothing Then
Return
End If
' Add AcmeMenu
Dim uid As UID = New UIDClass()
uid.Value = c_menuID
Dim indexObj As Object = Type.Missing
Dim myMenu As ICommandBar = TryCast(topMenuBar.Add(uid, indexObj), ICommandBar)
DirectCast(topMenuBar, ICommandItem).Refresh()
m_isMenuPresent = True
End Sub
Private Sub UnLoadCustomizations()
Dim topMenuBar As ICommandBar = GetMainBar()
If topMenuBar Is Nothing Then
Return
End If
' Remove AcmeMenu
Dim uid As UID = New UIDClass()
uid.Value = c_menuID
Dim myMenu As ICommandBar = TryCast(topMenuBar.Find(uid, False), ICommandBar)
Dim myMenuItem As ICommandItem = TryCast(myMenu, ICommandItem)
myMenuItem.Delete()
DirectCast(topMenuBar, ICommandItem).Refresh()
m_isMenuPresent = False
End Sub
Private Function GetMainBar() As ICommandBar
Try
'Grab the root menu bar
Dim uid As UID = New UIDClass()
uid.Value = c_mainMenuID
Dim mx As MxDocument = DirectCast(m_application.Document, MxDocument)
Dim cmdBars As ICommandBars = mx.CommandBars
Dim x As ICommandItem = cmdBars.Find(uid, False, False)
Return TryCast(cmdBars.Find(uid, False, False), ICommandBar)
Catch
Return Nothing
End Try
End Function
End Class
End Namespace