Recently used files—Command, MultiItem, and ComboBox
[C#]
RecentFilesCombo.cs
using System; using System.IO; using System.Drawing; using System.Runtime.InteropServices; using ESRI.ArcGIS.ADF.BaseClasses; using ESRI.ArcGIS.ADF.CATIDs; using ESRI.ArcGIS.Framework; using ESRI.ArcGIS.SystemUI; namespace RecentFilesCommandsCS { /// <summary> /// Command that works in ArcMap/Map/PageLayout, ArcScene/SceneControl /// or ArcGlobe/GlobeControl /// </summary> [Guid("39b803a3-4bbb-4099-b4d9-89273af3685d")] [ClassInterface(ClassInterfaceType.None)] [ProgId("RecentFilesCommandsCS.RecentFilesCombo")] public sealed class RecentFilesCombo : BaseCommand, IComboBox { #region COM Registration Function(s) [ComRegisterFunction()] [ComVisible(false)] static void RegisterFunction(Type registerType) { // Required for ArcGIS Component Category Registrar support ArcGISCategoryRegistration(registerType); } [ComUnregisterFunction()] [ComVisible(false)] 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); GMxCommands.Register(regKey); MxCommands.Register(regKey); SxCommands.Register(regKey); ControlsCommands.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); GMxCommands.Unregister(regKey); MxCommands.Unregister(regKey); SxCommands.Unregister(regKey); ControlsCommands.Unregister(regKey); } #endregion #endregion private IApplication m_application; private System.Collections.Generic.Dictionary<int, string> m_itemMap; private string m_strWidth = @"c:\documents\map documents"; public RecentFilesCombo() { m_itemMap = new System.Collections.Generic.Dictionary<int, string>(); base.m_category = ".NET Samples"; base.m_caption = "Recent Documents: "; base.m_message = "Recent Documents"; base.m_toolTip = "Recent Documents"; base.m_name = "RecentDocsCombo"; } #region Overriden Class Methods /// <summary> /// Occurs when this command is created /// </summary> /// <param name="hook">Instance of the application</param> public override void OnCreate(object hook) { IComboBoxHook comboHook = hook as IComboBoxHook; if (comboHook == null) { m_enabled = false; return; } m_application = comboHook.Hook as IApplication; int cookie = 0; foreach (string fileName in RecentFilesRegistryHelper.GetRecentFiles(m_application)) { if (File.Exists(fileName)) { //Add item to list cookie = comboHook.Add(fileName); m_itemMap.Add(cookie, fileName); } } } /// <summary> /// Occurs when this command is clicked /// </summary> public override void OnClick() { } #endregion #region IComboBox Members public int DropDownHeight { get { return 50; } } public string DropDownWidth { get { return m_strWidth; } } public bool Editable { get { return false; } } public string HintText { get { return "Select document"; } } public void OnEditChange(string editString) { } public void OnEnter() { } public void OnFocus(bool set) { } public void OnSelChange(int cookie) { string selectedPath = m_itemMap[cookie]; m_application.OpenDocument(selectedPath); } public bool ShowCaption { get { return false; } } public string Width { get { return m_strWidth; } } #endregion } }
[Visual Basic .NET]
RecentFilesCombo.vb
Imports System.IO Imports System.Runtime.InteropServices Imports System.Drawing Imports ESRI.ArcGIS.ADF.BaseClasses Imports ESRI.ArcGIS.ADF.CATIDs Imports ESRI.ArcGIS.Framework Imports ESRI.ArcGIS.SystemUI <ComClass(RecentFilesCombo.ClassId, RecentFilesCombo.InterfaceId, RecentFilesCombo.EventsId), _ ProgId("RecentFilesCommandsVB.RecentFilesCombo")> _ Public NotInheritable Class RecentFilesCombo Inherits BaseCommand Implements IComboBox #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 = "3b7bd3f6-246d-4761-8996-aa1409281cef" Public Const InterfaceId As String = "e88f97f3-afc2-41a0-a6a0-6375f1a3d6cf" Public Const EventsId As String = "077db9cd-d208-4452-8266-26b4fbae5ff0" #End Region #Region "COM Registration Function(s)" <ComRegisterFunction(), ComVisibleAttribute(False)> _ Public Shared Sub RegisterFunction(ByVal registerType As Type) ' Required for ArcGIS Component Category Registrar support ArcGISCategoryRegistration(registerType) 'Add any COM registration code after the ArcGISCategoryRegistration() call End Sub <ComUnregisterFunction(), ComVisibleAttribute(False)> _ Public Shared Sub UnregisterFunction(ByVal registerType As Type) ' Required for ArcGIS Component Category Registrar support ArcGISCategoryUnregistration(registerType) 'Add any COM unregistration code after the ArcGISCategoryUnregistration() call End Sub #Region "ArcGIS Component Category Registrar generated code" Private Shared Sub ArcGISCategoryRegistration(ByVal registerType As Type) Dim regKey As String = String.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID) MxCommands.Register(regKey) End Sub Private Shared Sub ArcGISCategoryUnregistration(ByVal registerType As Type) Dim regKey As String = String.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID) MxCommands.Unregister(regKey) End Sub #End Region #End Region Private m_application As IApplication Private m_itemMap As System.Collections.Generic.Dictionary(Of Integer, String) Private m_strWidth As String = "c:\documents\map documents" ' A creatable COM class must have a Public Sub New() ' with no parameters, otherwise, the class will not be ' registered in the COM registry and cannot be created ' via CreateObject. Public Sub New() MyBase.New() MyBase.m_category = ".NET Samples" MyBase.m_caption = "Recent Documents: " MyBase.m_message = "Recent Documents" MyBase.m_toolTip = "Recent Documents" MyBase.m_name = "RecentDocsCombo" m_itemMap = New System.Collections.Generic.Dictionary(Of Integer, String)() End Sub Public Overrides Sub OnCreate(ByVal hook As Object) Dim comboHook As IComboBoxHook = TryCast(hook, IComboBoxHook) If comboHook Is Nothing Then m_enabled = False Return End If m_application = TryCast(comboHook.Hook, IApplication) Dim cookie As Integer = 0 For Each fileName As String In RecentFilesRegistryHelper.GetRecentFiles(m_application) If File.Exists(fileName) Then 'Add item to list cookie = comboHook.Add(fileName) m_itemMap.Add(cookie, fileName) End If Next End Sub Public Overrides Sub OnClick() End Sub Public ReadOnly Property DropDownHeight() As Integer Implements ESRI.ArcGIS.SystemUI.IComboBox.DropDownHeight Get Return 50 End Get End Property Public ReadOnly Property DropDownWidth() As String Implements ESRI.ArcGIS.SystemUI.IComboBox.DropDownWidth Get Return m_strWidth End Get End Property Public ReadOnly Property Editable() As Boolean Implements ESRI.ArcGIS.SystemUI.IComboBox.Editable Get Return False End Get End Property Public ReadOnly Property HintText() As String Implements ESRI.ArcGIS.SystemUI.IComboBox.HintText Get Return "Select document" End Get End Property Public Sub OnEditChange(ByVal editString As String) Implements ESRI.ArcGIS.SystemUI.IComboBox.OnEditChange End Sub Public Sub OnEnter() Implements ESRI.ArcGIS.SystemUI.IComboBox.OnEnter End Sub Public Sub OnFocus(ByVal [set] As Boolean) Implements ESRI.ArcGIS.SystemUI.IComboBox.OnFocus End Sub Public Sub OnSelChange(ByVal cookie As Integer) Implements ESRI.ArcGIS.SystemUI.IComboBox.OnSelChange Dim selectedPath As String = m_itemMap(cookie) m_application.OpenDocument(selectedPath) End Sub Public ReadOnly Property ShowCaption() As Boolean Implements ESRI.ArcGIS.SystemUI.IComboBox.ShowCaption Get Return False End Get End Property Public ReadOnly Property Width() As String Implements ESRI.ArcGIS.SystemUI.IComboBox.Width Get Return m_strWidth End Get End Property End Class