Controls commands environment
CommandsEnvironment.cs
// Copyright 2010 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.
// 

using System;
using System.Windows.Forms;

using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS;

using ESRI.ArcGIS.ADF.CATIDs;

namespace CommandsEnvironment
{

  public class CommandsEnvironment : System.Windows.Forms.Form
  {
    internal System.Windows.Forms.ComboBox ComboBox1;
    private ESRI.ArcGIS.Controls.AxSymbologyControl axSymbologyControl1;
    private ESRI.ArcGIS.Controls.AxToolbarControl axToolbarControl1;
    private ESRI.ArcGIS.Controls.AxPageLayoutControl axPageLayoutControl1;
    private ESRI.ArcGIS.Controls.AxLicenseControl axLicenseControl1;
    private System.ComponentModel.Container components = null;
    private IGraphicProperties m_graphicProperties;

    public CommandsEnvironment()
    {
      InitializeComponent();

    }

    protected override void Dispose( bool disposing )
    {
      //Release COM objects
      ESRI.ArcGIS.ADF.COMSupport.AOUninitialize.Shutdown();

      if( disposing )
      {
        if (components != null) 
        {
          components.Dispose();
        }
      }
      base.Dispose( disposing );
    }

    #region Windows Form Designer generated code
    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
      System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(CommandsEnvironment));
      this.ComboBox1 = new System.Windows.Forms.ComboBox();
      this.axSymbologyControl1 = new ESRI.ArcGIS.Controls.AxSymbologyControl();
      this.axToolbarControl1 = new ESRI.ArcGIS.Controls.AxToolbarControl();
      this.axPageLayoutControl1 = new ESRI.ArcGIS.Controls.AxPageLayoutControl();
      this.axLicenseControl1 = new ESRI.ArcGIS.Controls.AxLicenseControl();
      ((System.ComponentModel.ISupportInitialize)(this.axSymbologyControl1)).BeginInit();
      ((System.ComponentModel.ISupportInitialize)(this.axToolbarControl1)).BeginInit();
      ((System.ComponentModel.ISupportInitialize)(this.axPageLayoutControl1)).BeginInit();
      ((System.ComponentModel.ISupportInitialize)(this.axLicenseControl1)).BeginInit();
      this.SuspendLayout();
      // 
      // ComboBox1
      // 
      this.ComboBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
      this.ComboBox1.Location = new System.Drawing.Point(456, 8);
      this.ComboBox1.Name = "ComboBox1";
      this.ComboBox1.Size = new System.Drawing.Size(264, 21);
      this.ComboBox1.TabIndex = 4;
      this.ComboBox1.Text = "ComboBox1";
      this.ComboBox1.SelectedIndexChanged += new System.EventHandler(this.ComboBox1_SelectedIndexChanged);
      // 
      // axSymbologyControl1
      // 
      this.axSymbologyControl1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right)));
      this.axSymbologyControl1.Location = new System.Drawing.Point(456, 40);
      this.axSymbologyControl1.Name = "axSymbologyControl1";
      this.axSymbologyControl1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axSymbologyControl1.OcxState")));
      this.axSymbologyControl1.Size = new System.Drawing.Size(265, 265);
      this.axSymbologyControl1.TabIndex = 5;
      this.axSymbologyControl1.OnItemSelected += new ESRI.ArcGIS.Controls.ISymbologyControlEvents_Ax_OnItemSelectedEventHandler(this.axSymbologyControl1_OnItemSelected);
      // 
      // axToolbarControl1
      // 
      this.axToolbarControl1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right)));
      this.axToolbarControl1.Location = new System.Drawing.Point(8, 8);
      this.axToolbarControl1.Name = "axToolbarControl1";
      this.axToolbarControl1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axToolbarControl1.OcxState")));
      this.axToolbarControl1.Size = new System.Drawing.Size(440, 28);
      this.axToolbarControl1.TabIndex = 6;
      // 
      // axPageLayoutControl1
      // 
      this.axPageLayoutControl1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
        | System.Windows.Forms.AnchorStyles.Left)));
      this.axPageLayoutControl1.Location = new System.Drawing.Point(8, 40);
      this.axPageLayoutControl1.Name = "axPageLayoutControl1";
      this.axPageLayoutControl1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axPageLayoutControl1.OcxState")));
      this.axPageLayoutControl1.Size = new System.Drawing.Size(440, 432);
      this.axPageLayoutControl1.TabIndex = 7;
      this.axPageLayoutControl1.OnMouseDown += new ESRI.ArcGIS.Controls.IPageLayoutControlEvents_Ax_OnMouseDownEventHandler(this.axPageLayoutControl1_OnMouseDown);
      // 
      // axLicenseControl1
      // 
      this.axLicenseControl1.Enabled = true;
      this.axLicenseControl1.Location = new System.Drawing.Point(336, 24);
      this.axLicenseControl1.Name = "axLicenseControl1";
      this.axLicenseControl1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axLicenseControl1.OcxState")));
      this.axLicenseControl1.Size = new System.Drawing.Size(32, 32);
      this.axLicenseControl1.TabIndex = 8;
      // 
      // Form1
      // 
            
            //Removed setting for AutoScaleBaseSize
            //this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);

            //set AutoScaleDimensions & AutoScaleMode to allow AdjustBounds to scale controls correctly at 120 dpi
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

      this.ClientSize = new System.Drawing.Size(728, 478);
      this.Controls.Add(this.axLicenseControl1);
      this.Controls.Add(this.axPageLayoutControl1);
      this.Controls.Add(this.axToolbarControl1);
      this.Controls.Add(this.axSymbologyControl1);
      this.Controls.Add(this.ComboBox1);
      this.Name = "Form1";
      this.Text = "Updating the Command Environment";
      this.Load += new System.EventHandler(this.Form1_Load);
      ((System.ComponentModel.ISupportInitialize)(this.axSymbologyControl1)).EndInit();
      ((System.ComponentModel.ISupportInitialize)(this.axToolbarControl1)).EndInit();
      ((System.ComponentModel.ISupportInitialize)(this.axPageLayoutControl1)).EndInit();
      ((System.ComponentModel.ISupportInitialize)(this.axLicenseControl1)).EndInit();
      this.ResumeLayout(false);

    }
    #endregion

    [STAThread]
    static void Main() 
    {
            
            if (!RuntimeManager.Bind(ProductCode.Engine))
            {
                if (!RuntimeManager.Bind(ProductCode.Desktop))
                {
                    MessageBox.Show("Unable to bind to ArcGIS runtime. Application will be shut down.");
                    return;
                }
            }

            Application.Run(new CommandsEnvironment());
    }

    private void Form1_Load(object sender, System.EventArgs e)
    {
      //Resize the controls so that they scale correctly at both 96 and 120 dpi
            AdjustBounds(this.axToolbarControl1);
            AdjustBounds(this.axLicenseControl1);
            AdjustBounds(this.axPageLayoutControl1);
            AdjustBounds(this.axSymbologyControl1);
             
            //Set the buddy control
      axToolbarControl1.SetBuddyControl(axPageLayoutControl1);

      //Add items to the ToolbarControl
      axToolbarControl1.AddItem("esriControls.ControlsOpenDocCommand", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
      axToolbarControl1.AddItem("esriControls.ControlsPageZoomInTool", -1, -1, true, 0, esriCommandStyles.esriCommandStyleIconOnly);
      axToolbarControl1.AddItem("esriControls.ControlsPageZoomOutTool", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
      axToolbarControl1.AddItem("esriControls.ControlsPageZoomWholePageCommand", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
      axToolbarControl1.AddItem("esriControls.ControlsSelectTool", -1, -1, true, 0, esriCommandStyles.esriCommandStyleIconOnly);
      axToolbarControl1.AddItem("esriControls.ControlsNewMarkerTool", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
      axToolbarControl1.AddItem("esriControls.ControlsNewLineTool", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
      axToolbarControl1.AddItem("esriControls.ControlsNewFreeHandTool", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
      axToolbarControl1.AddItem("esriControls.ControlsNewRectangleTool", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
      axToolbarControl1.AddItem("esriControls.ControlsNewPolygonTool", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

      //Get the ArcGIS install location by opening the subkey for reading      
      //Load the ESRI.ServerStyle file into the SymbologyControl
            string installationFolder = ESRI.ArcGIS.RuntimeManager.ActiveRuntime.Path;
            axSymbologyControl1.LoadStyleFile(installationFolder + "\\Styles\\ESRI.ServerStyle");

      //Add style classes to the combo box
      ComboBox1.Items.Add("Default Marker Symbol");
      ComboBox1.Items.Add("Default Line Symbol");
      ComboBox1.Items.Add("Default Fill Symbol");
      ComboBox1.Items.Add("Default Text Symbol");
      ComboBox1.SelectedIndex = 0;

      //Update each style class. This forces item to be loaded into each style class.
      //When the contents of a server style file are loaded into the SymbologyControl 
      //items are 'demand loaded'. This is done to increase performance and means 
      //items are only loaded into a SymbologyStyleClass when it is the current StyleClass.
      axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassMarkerSymbols).Update();
      axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassLineSymbols).Update();
      axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassFillSymbols).Update();
      axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassTextSymbols).Update();

      //Get the CommandsEnvironment singleton
      m_graphicProperties = new CommandsEnvironmentClass();

      //Create a new ServerStyleGalleryItem and set its name
      IStyleGalleryItem styleGalleryItem = new ServerStyleGalleryItemClass();
      styleGalleryItem.Name = "myStyle";

      ISymbologyStyleClass styleClass;

      //Get the marker symbol style class
      styleClass = axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassMarkerSymbols);
      //Set the commands environment marker symbol into the item
      styleGalleryItem.Item = m_graphicProperties.MarkerSymbol;
      //Add the item to the style class
      styleClass.AddItem(styleGalleryItem, 0);

      //Get the line symbol style class
      styleClass = axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassLineSymbols);
      //Set the commands environment line symbol into the item
      styleGalleryItem.Item = m_graphicProperties.LineSymbol;
      //Add the item to the style class
      styleClass.AddItem(styleGalleryItem, 0);

      //Get the fill symbol style class
      styleClass = axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassFillSymbols);
      //Set the commands environment fill symbol into the item
      styleGalleryItem.Item = m_graphicProperties.FillSymbol;
      //Add the item to the style class
      styleClass.AddItem(styleGalleryItem, 0);

      //Get the text symbol style class
      styleClass = axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassTextSymbols);
      //Set the commands environment text symbol into the item
      styleGalleryItem.Item = m_graphicProperties.TextSymbol;
      //Add the item to the style class
      styleClass.AddItem(styleGalleryItem, 0);

    }

    private void ComboBox1_SelectedIndexChanged(object sender, System.EventArgs e)
    {
      //Set the SymbologyControl style class
      if (ComboBox1.SelectedItem.ToString() == "Default Marker Symbol")
        axSymbologyControl1.StyleClass = esriSymbologyStyleClass.esriStyleClassMarkerSymbols;
      else if (ComboBox1.SelectedItem.ToString() == "Default Line Symbol")
        axSymbologyControl1.StyleClass = esriSymbologyStyleClass.esriStyleClassLineSymbols;
      else if (ComboBox1.SelectedItem.ToString() == "Default Fill Symbol")
        axSymbologyControl1.StyleClass = esriSymbologyStyleClass.esriStyleClassFillSymbols;
      else if (ComboBox1.SelectedItem.ToString() == "Default Text Symbol")
        axSymbologyControl1.StyleClass = esriSymbologyStyleClass.esriStyleClassTextSymbols;
    }

    private void axSymbologyControl1_OnItemSelected(object sender, ESRI.ArcGIS.Controls.ISymbologyControlEvents_OnItemSelectedEvent e)
    {
      IStyleGalleryItem styleGalleryItem = (IStyleGalleryItem) e.styleGalleryItem;

      if (styleGalleryItem.Item is IMarkerSymbol)
        //Set the default marker symbol
        m_graphicProperties.MarkerSymbol = (IMarkerSymbol) styleGalleryItem.Item;
      else if (styleGalleryItem.Item is ILineSymbol) 
        //Set the default line symbol
        m_graphicProperties.LineSymbol = (ILineSymbol) styleGalleryItem.Item;
      else if (styleGalleryItem.Item is IFillSymbol) 
        //Set the default fill symbol
        m_graphicProperties.FillSymbol = (IFillSymbol) styleGalleryItem.Item;
      else if (styleGalleryItem.Item is ITextSymbol)
        //Set the default text symbol
        m_graphicProperties.TextSymbol = (ITextSymbol) styleGalleryItem.Item;
    }

    private void axPageLayoutControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IPageLayoutControlEvents_OnMouseDownEvent e)
    {
      if (e.button != 2) return; 

      //Create a new point
      IPoint pPoint = new PointClass();
      pPoint.PutCoords(e.pageX, e.pageY);

      //Create a new text element 
      ITextElement textElement = new TextElementClass();
      //Set the text to display today's date
      textElement.Text = DateTime.Now.ToShortDateString();

      //Add element to graphics container using the CommandsEnvironment default text symbol
      axPageLayoutControl1.AddElement((IElement) textElement, pPoint, m_graphicProperties.TextSymbol, "", 0);
      //Refresh the graphics
      axPageLayoutControl1.Refresh(esriViewDrawPhase.esriViewGraphics, null, null);
    }

        private void AdjustBounds(AxHost controlToAdjust)
        {
            if (this.CurrentAutoScaleDimensions.Width != 6F)
            {
                //Adjust location: ActiveX control doesn't do this by itself 
                controlToAdjust.Left = Convert.ToInt32(controlToAdjust.Left * this.CurrentAutoScaleDimensions.Width / 6F);
                //Undo the automatic resize... 
                controlToAdjust.Width = controlToAdjust.Width / DPIX() * 96;
                //...and apply the appropriate resize
                controlToAdjust.Width = Convert.ToInt32(controlToAdjust.Width * this.CurrentAutoScaleDimensions.Width / 6F);
            }
            if (this.CurrentAutoScaleDimensions.Height != 13F)
            {
                //Adjust location: ActiveX control doesn't do this by itself 
                controlToAdjust.Top = Convert.ToInt32(controlToAdjust.Top * this.CurrentAutoScaleDimensions.Height / 13F);
                //Undo the automatic resize... 
                controlToAdjust.Height = controlToAdjust.Height / DPIY() * 96;
                //...and apply the appropriate resize 
                controlToAdjust.Height = Convert.ToInt32(controlToAdjust.Height * this.CurrentAutoScaleDimensions.Height / 13F);
            }
        }
        [System.Runtime.InteropServices.DllImport("Gdi32.dll")]
        static extern int GetDeviceCaps(IntPtr hDC, int nIndex);
        [System.Runtime.InteropServices.DllImport("Gdi32.dll")]
        static extern IntPtr CreateDC(string lpszDriver, string lpszDeviceName, string lpszOutput, IntPtr devMode);
        const int LOGPIXELSX = 88;
        const int LOGPIXELSY = 90;
        int DPIX()
        {
            return DPI(LOGPIXELSX);
        }
        int DPIY()
        {
            return DPI(LOGPIXELSY);
        }
        int DPI(int logPixelOrientation)
        {
            IntPtr displayPointer = CreateDC("DISPLAY", null, null, IntPtr.Zero);
            return Convert.ToInt32(GetDeviceCaps(displayPointer, logPixelOrientation));
        }
  } 
}