Update Note Geometry
DockWindow.cs
// Copyright 2011 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.ComponentModel;
//using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using ESRI.ArcGISExplorer;
using ESRI.ArcGISExplorer.Application;
using ESRI.ArcGISExplorer.Mapping;
using ESRI.ArcGISExplorer.Geometry;
using ESRI.ArcGISExplorer.Data;
using ESRI.ArcGISExplorer.Threading;

namespace UpdateNoteGeometryCS
{
  enum UpdateProperty
  {
    X,
    Y,
  }

  public partial class DockWindow : ESRI.ArcGISExplorer.Application.DockWindow
  {
    MapDisplay _disp = null;
    Note _currentNote = null;
    Geometry _currentGeom = null;
    bool _selectingItem = false;
    int _selectedIndex = -1;

    #region Displaying and updating coordinates

    private void UpdateGeometryOfNote(UpdateProperty updateProperty)
    {
      // This function deals with updating the coordinates of existing 
      // Points or the coordinates of the vertices of Polylines and Polygons.

      // First check the entered value is valid.
      double newCoordinate = Double.NaN;
      bool edited = false;
      if (updateProperty == UpdateProperty.X)
        edited = double.TryParse(this.txtX.Text, out newCoordinate);
      else
        edited = double.TryParse(this.txtY.Text, out newCoordinate);

      if (edited)
      {
        // For each type of Geometry, get a Point representing the
        // existing Point, and then change the edited coordinate value;
        // this will ensure all other properties of the Point are
        // preserved (instead of creating a new Point).
        if (_currentGeom.GeometryType == GeometryType.Point)
        {
          Point pt = _currentGeom as Point;
          if (updateProperty == UpdateProperty.X)
            pt.X = newCoordinate;
          if (updateProperty == UpdateProperty.Y)
            pt.Y = newCoordinate;
          _currentNote.Graphic.Geometry = pt;
        }
        else if ((_currentGeom.GeometryType == GeometryType.Polyline) || (_currentGeom.GeometryType == GeometryType.Polygon))
        {
          // Only the first part of multipart Polygons or Polylines is edited in this sample.
          VertexGeometry vgeom = new VertexGeometry(_currentGeom);
          Point vertex = vgeom.GetPoint(_selectedIndex);
          if (updateProperty == UpdateProperty.X)
            vertex.X = newCoordinate;
          if (updateProperty == UpdateProperty.Y)
            vertex.Y = newCoordinate;
          vgeom.SetPoint(_selectedIndex, vertex);
          _currentNote.Graphic.Geometry = _currentGeom;

          RefreshListItem(_selectedIndex, vertex);
        }
      }
      else
      {
        // User entered an invalid value - reset the UI.
        ShowGeometryCoords();
      }
    }

    private void ShowGeometryCoords()
    {
      _selectingItem = true;

      SetupControlsForSelectedGeom();

      if (_currentGeom.GeometryType == ESRI.ArcGISExplorer.Geometry.GeometryType.Point)
      {
        Point pt = _currentGeom as Point;
        ShowSelectedCoords(pt);
      }
      else if ((_currentGeom.GeometryType == GeometryType.Polyline) || (_currentGeom.GeometryType == GeometryType.Polygon))
      {
        VertexGeometry vgeom = new VertexGeometry(_currentGeom);
        for (int i = 0; i < vgeom.PointCount(); i++)
        {
          AddVertexToListView(i, vgeom.GetPoint(i));
        }
      }
      _selectingItem = false;
    }

    #endregion

    #region UI Controls Updating

    private void RefreshListItem(int _selectedIndex, Point lineVertex)
    {
      ListViewItem item = this.lvwVertices.Items[_selectedIndex];
      item.SubItems[1].Text = lineVertex.X.ToString();
      item.SubItems[2].Text = lineVertex.Y.ToString();
    }

    private void ShowSelectedCoords(Point pt)
    {
      this.txtX.Text = pt.X.ToString();
      this.txtY.Text = pt.Y.ToString();
    }

    private void AddVertexToListView(int vertexIndex, Point point)
    {
      this.lvwVertices.Items.Add(new ListViewItem(
         new string[] { vertexIndex.ToString(), point.X.ToString(), point.Y.ToString() }));
    }

    private void SetupControlsForSelectedGeom()
    {
      this.txtX.Text = "";
      this.txtY.Text = "";
      this.lvwVertices.Items.Clear();

      if (_currentGeom == null)
      {
        this.splitCoordinates.Enabled = false;
        this.lvwVertices.Enabled = false;
        this.txtMultiVertex.Enabled = false;
      }
      else if (_currentGeom.GeometryType == GeometryType.Point)
      {
        this.splitCoordinates.Enabled = true;
        this.lvwVertices.Enabled = false;
        this.txtMultiVertex.Enabled = false;
      }
      else if ((_currentGeom.GeometryType == GeometryType.Polyline) || (_currentGeom.GeometryType == GeometryType.Polygon))
      {
        this.splitCoordinates.Enabled = true;
        this.lvwVertices.Enabled = true;
        this.txtMultiVertex.Enabled = true;
      }
    }

    #endregion

    #region UI event handlers functions

    public DockWindow()
    {
      InitializeComponent();

      // Set up an event sink for clicking or selecting a Note.
      _disp = ESRI.ArcGISExplorer.Application.Application.ActiveMapDisplay;
      _disp.MapItemClicked += new EventHandler<MapItemMouseEventArgs>(disp_MapItemClicked);
      ESRI.ArcGISExplorer.Application.Application.MapItemSelectionChanged += new EventHandler(Application_MapItemSelectionChanged);

      SetupControlsForSelectedGeom();
    }

    void Application_MapItemSelectionChanged(object sender, EventArgs e)
    {
      // Event handler for when a MapItem is clicked.
      SelectedItemsCollection selItems = ESRI.ArcGISExplorer.Application.Application.SelectedItems;
      if (selItems.Count == 1)
      {
        if (selItems[0] is Note)
        {
          _currentNote = selItems[0] as Note;
          _currentGeom = _currentNote.Graphic.Geometry;

          ShowGeometryCoords();
        }
      }
    }

    void disp_MapItemClicked(object sender, MapItemMouseEventArgs e)
    {
      // Event handler for when a MapItem is clicked.
      if (e.MapItems[0] is Note)
      {
        _currentNote = e.MapItems[0] as Note;
        _currentGeom = _currentNote.Graphic.Geometry;

        ShowGeometryCoords();
      }
    }

    private void txtX_TextChanged(object sender, EventArgs e)
    {
      if (_selectingItem) return;
      UpdateGeometryOfNote(UpdateProperty.X);
    }

    private void txtY_TextChanged(object sender, EventArgs e)
    {
      if (_selectingItem) return;
      UpdateGeometryOfNote(UpdateProperty.Y);
    }

    private void lvwVertices_SelectedIndexChanged(object sender, EventArgs e)
    {
      if (this.lvwVertices.SelectedItems.Count == 1)
      {
        _selectingItem = true;

        ListViewItem selected = this.lvwVertices.SelectedItems[0];
        _selectedIndex = selected.Index;
        this.txtX.Text = selected.SubItems[1].Text;
        this.txtY.Text = selected.SubItems[2].Text;

        _selectingItem = false;
      }
    }

    #endregion

  }
}