Brushing to create a selection
BrushingCS_NET_Addin\BrushingCS_NET_Addin\BrushingCS.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.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.InteropServices; 

using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.ArcMapUI;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.CartoUI;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Framework; 

namespace Brushing_Addin
{
  
  public class BrushingCS : ESRI.ArcGIS.Desktop.AddIns.Tool
  {

    private object m_gSelectTool;
    private bool m_bAction; 
  
    public BrushingCS()
    {
      m_bAction = false; 
    }

    protected override void OnUpdate()
    {
      //Enabled = ArcMap.Application != null;
    }

    #region ITool Members
    protected override void OnMouseDown(MouseEventArgs arg)
    {
      if (m_bAction == true)
      {
        return;
      }

      Type oType = Type.GetTypeFromProgID("esriArcMapUI.SelectTool");
      if (oType != null)
      {
        m_gSelectTool = Activator.CreateInstance(oType);
      }

      // create and initialize SelectTool command
      ICommand pCommand;
      pCommand = (ICommand)m_gSelectTool;
      pCommand.OnCreate(ArcMap.Application);

      // emulate mouse click for m_gSelectTool
      ITool pTool;
      pTool = (ITool)m_gSelectTool;

      pTool.OnMouseDown(GetButtonCode(arg), Convert.ToInt32(arg.Shift), arg.X, arg.Y);
      pTool.OnMouseUp(GetButtonCode(arg), Convert.ToInt32(arg.Shift), arg.X, arg.Y);   

      m_bAction = SelectFromGraphics();

      // if there's selected graphics then start moving it
      if (m_bAction == true)
      {
        pTool.OnMouseDown(GetButtonCode(arg), Convert.ToInt32(arg.Shift), arg.X, arg.Y);  
      }
      else
      {
        m_gSelectTool = null;
      } 
        
    }

    protected override void OnMouseUp(MouseEventArgs arg)
    {
      if (m_bAction == false)
      {
        return;
      }
      ITool pTool;
      pTool = (ITool)m_gSelectTool;
      pTool.OnMouseUp(GetButtonCode(arg), Convert.ToInt32(arg.Shift), arg.X, arg.Y);
      

      SelectFromGraphics();

      // release object
      m_gSelectTool = null;
      m_bAction = false;

      MouseCursor cursor;
      cursor = new MouseCursor();
      cursor.SetCursor(esriSystemMouseCursor.esriSystemMouseCursorDefault); 
    }

    protected override void OnMouseMove(MouseEventArgs arg)
    {
      if (m_bAction == false)
      {
        return;
      }

      // 1 move graphics
      // 2 set new position
      // 3 continue moving
      // 4 update selection
      ITool pTool;
      pTool = (ITool)m_gSelectTool;
      pTool.OnMouseMove(GetButtonCode(arg), Convert.ToInt32(arg.Shift), arg.X, arg.Y);
      // comment out the next 3 line to speed up, but selection only gets updated by mouse up
      // comment out the next 3 line to speed up, but selection only gets updated by mouse up
      pTool.OnMouseUp(GetButtonCode(arg), Convert.ToInt32(arg.Shift), arg.X, arg.Y);
      pTool.OnMouseDown(GetButtonCode(arg), Convert.ToInt32(arg.Shift), arg.X, arg.Y);
      SelectFromGraphics(); 
          
    }
    #endregion

    bool SelectFromGraphics()
    {
      IMxApplication pMxApp;
      IMxDocument pMxDoc;
      pMxApp = (IMxApplication)ArcMap.Application;
      pMxDoc = (IMxDocument)ArcMap.Application.Document;
      IGraphicsContainerSelect pGC;
      pGC = (IGraphicsContainerSelect)pMxDoc.FocusMap;

      // find first selected graphic object
      if (pGC.ElementSelectionCount > 0)
      {
        IElement pElem;
        pElem = pGC.SelectedElement(0);
        IGeometry pGeometry;
        pGeometry = pElem.Geometry;
        pMxDoc.FocusMap.SelectByShape(pGeometry, null, false);
        pMxDoc.ActivatedView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null);
        return true;
      }
      else
      {
        return false;
      }
    }
    
    int GetButtonCode(MouseEventArgs pArg)
    {
       int intButtonCode = -1;
       System.Windows.Forms.MouseButtons  pButton = pArg.Button;
       
       switch (pButton.ToString())
       {
          case "Left":
            intButtonCode = 1;
          break;

          case "Right":
            intButtonCode = 2;
          break;

          case "Middle":
            intButtonCode = 4;
          break;
       }
       
       return intButtonCode;
    }
    
    
    
  }
  
  

}