RSS weather 3D layer
GlobeWeatherIdentifyObject.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;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.GlobeCore;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Analyst3D;

namespace RSSWeatherLayer3D
{
  /// <summary>
  /// Summary description for GlobeWeatherIdentifyObject.
  /// </summary>
  public class GlobeWeatherIdentifyObject : IIdentifyObj, IIdentifyObject, IDisposable 
  {
    private RSSWeatherLayer3DClass    m_weatherLayer  = null;
    private IPropertySet                m_propset        = null;
    private IdentifyDlg                  m_identifyDlg    = null;
    
    private System.Windows.Forms.ContextMenu m_menu;

    public GlobeWeatherIdentifyObject()
    {
      InitializeContextMenu();
    }

    #region IIdentifyObject Members

    public IPropertySet PropertySet
    {
      get
      {
        return m_propset;
      }
      set
      {
        m_propset = value;
      }
    }

    public string Name
    {
      get
      {
        return "WeatherInfo";
      }
      set
      {
        // TODO:  Add GlobeWeatherIdentifyObject.Name setter implementation
      }
    }

    #endregion

    #region IIdentifyObj Members

    public void Flash(IScreenDisplay pDisplay)
    {
      if(null == m_propset)
        return;

      long zipCode = Convert.ToInt64(m_propset.GetProperty("ZIPCODE")); 
      m_weatherLayer.Flash(zipCode);
    }

    public bool CanIdentify(ILayer pLayer)
    {
      if(!(pLayer is RSSWeatherLayer3DClass))
        return false;
      
      m_weatherLayer = (RSSWeatherLayer3DClass)pLayer;  

      return true;;
    }

    public int hWnd
    {
      get
      {
        if(null == m_identifyDlg || m_identifyDlg.Handle.ToInt32() == 0)
        {
          m_identifyDlg = new IdentifyDlg();
          m_identifyDlg.CreateControl();

          m_identifyDlg.SetProperties(m_propset);
        }
        
        return m_identifyDlg.Handle.ToInt32();
      }
    }

    string ESRI.ArcGIS.Carto.IIdentifyObj.Name
    {
      get
      {
        return "WeatherInfo";
      }
    }

    public ILayer Layer
    {
      get
      {
        return m_weatherLayer;
      }
    }


    public void PopUpMenu(int x, int y)
    {
      //System.Windows.Forms.Form.ActiveForm
      //m_menu.Show(m_identifyDlg, new System.Drawing.Point(x,y));
      
      m_menu.Show(m_identifyDlg, m_identifyDlg.PointToClient(new System.Drawing.Point(x,y)));
    }

    #endregion

    #region IDisposable Members

    public void Dispose()
    {
      if(!m_identifyDlg.IsDisposed)
        m_identifyDlg.Dispose();

      m_weatherLayer  = null;
      m_propset        = null;
      
    }

    #endregion

    private void InitializeContextMenu()
    {
      m_menu = new System.Windows.Forms.ContextMenu();
      
      System.Windows.Forms.MenuItem menuFlash = new System.Windows.Forms.MenuItem("Flash", new System.EventHandler(menuFlash_Click));
      m_menu.MenuItems.Add(menuFlash);

      System.Windows.Forms.MenuItem menuSeparator = new System.Windows.Forms.MenuItem("-");
      m_menu.MenuItems.Add(menuSeparator);

      System.Windows.Forms.MenuItem menuZoomTo = new System.Windows.Forms.MenuItem("ZoomTo", new System.EventHandler(menuZoomTo_Click));
      m_menu.MenuItems.Add(menuZoomTo);

      System.Windows.Forms.MenuItem menuSelect = new System.Windows.Forms.MenuItem("Select", new System.EventHandler(menuSelect_Click));
      m_menu.MenuItems.Add(menuSelect);
    }

    private void menuFlash_Click(System.Object sender, System.EventArgs e) 
    {
      if(null == m_propset)
        return;

      long zipCode = Convert.ToInt64(m_propset.GetProperty("ZIPCODE")); 
      m_weatherLayer.Flash(zipCode);
    }

    private void menuZoomTo_Click(System.Object sender, System.EventArgs e) 
    {
      if(null == m_propset)
        return;

      long zipCode = Convert.ToInt64(m_propset.GetProperty("ZIPCODE")); 
      m_weatherLayer.ZoomTo(zipCode);
    }

    private void menuSelect_Click(System.Object sender, System.EventArgs e) 
    {
      if(null == m_propset)
        return;

      long zipCode = Convert.ToInt64(m_propset.GetProperty("ZIPCODE")); 
      m_weatherLayer.Select(zipCode, true);
    }

  }
}