using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.ADF.BaseClasses;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.SystemUI;
using KGIS.Framework.Utils.Enum;
namespace Kingo.Plugin.ResultsOfProof
{
///
/// 定义工具命令接口
///
public interface IToolCommand : IBaseCommand, ICommand, ITool
{
object CurrentTool { get; set; }
}
///
/// 定义抽象工具类
///
public abstract class BaseToolCommand : IToolCommand
{
public ESRI.ArcGIS.Geometry.IGeometry CheckGeometry { get; set; }
private ESRI.ArcGIS.Controls.ControlsEditingSketchToolClass editSketchTool = new ControlsEditingSketchToolClass();
public abstract enumProductType AttachProductType
{
get;
}
public enumProductType CurrentProduct
{
//get { return Env.Instance.Platfrom.CurrentProductType; }
get;
}
public object hook
{
get;
set;
}
public object CurrentTool
{
get;
set;
}
#region BaseTool
public virtual int Cursor
{
get { return CurrentTool is ITool ? (CurrentTool as ITool).Cursor : m_cursor.Handle.ToInt32(); }
}
public virtual bool Deactivate()
{
if (!(this.CurrentTool is ControlsEditingSketchToolClass))
{
editSketchTool.Deactivate();
}
if (CurrentTool is ITool)
{
(CurrentTool as ITool).Deactivate();
}
m_checked = false;
CurrentTool = null;
return true;
}
public virtual bool OnContextMenu(int x, int y)
{
return CurrentTool is ITool ? (CurrentTool as ITool).OnContextMenu(x, y) : false;
}
public virtual void OnDblClick()
{
//if (!base.ValidateAuthorize(this.CheckGeometry))
//{
// throw new Exception("绘制图形不在授权区域范围内!");
//}
if (CurrentTool is ITool)
{
if ((CurrentTool as ICommand).Enabled)
(this.CurrentTool as ITool).OnDblClick();
}
}
public virtual void OnKeyDown(int keyCode, int shift)
{
//判断当前工具是否是ControlsEditingSketchToolClass,如果不是,则调用editSketchTool的相应事件,以实现GIS原生功能
//此处判断是为了避免重复调用
if (!(this.CurrentTool is ControlsEditingSketchToolClass) && editSketchTool.Enabled)
{
editSketchTool.OnKeyDown(keyCode, shift);
}
if (this.CurrentTool is ITool)
{
if ((CurrentTool as ICommand).Enabled)
(this.CurrentTool as ITool).OnKeyDown(keyCode, shift);
}
}
public virtual void OnKeyUp(int keyCode, int shift)
{
//判断当前工具是否是ControlsEditingSketchToolClass,如果不是,则调用editSketchTool的相应事件,以实现GIS原生功能
//此处判断是为了避免重复调用
if (!(this.CurrentTool is ControlsEditingSketchToolClass) && editSketchTool.Enabled)
{
editSketchTool.OnKeyUp(keyCode, shift);
}
if (this.CurrentTool is ITool)
{
if ((CurrentTool as ICommand).Enabled)
(this.CurrentTool as ITool).OnKeyUp(keyCode, shift);
}
}
public virtual void OnMouseDown(int button, int shift, int x, int y)
{
if (this.CurrentTool is ITool)
{
if ((CurrentTool as ICommand).Enabled)
(this.CurrentTool as ITool).OnMouseDown(button, shift, x, y);
}
}
public virtual void OnMouseMove(int button, int shift, int x, int y)
{
//判断当前工具是否是ControlsEditingSketchToolClass,如果不是,则调用editSketchTool的相应事件,以实现GIS原生功能
//此处判断是为了避免重复调用
if (!(this.CurrentTool is ControlsEditingSketchToolClass) && editSketchTool.Enabled)
{
editSketchTool.OnMouseMove(button, shift, x, y);
}
if (this.CurrentTool is ITool)
{
if ((CurrentTool as ICommand).Enabled)
(this.CurrentTool as ITool).OnMouseMove(button, shift, x, y);
}
}
public virtual void OnMouseUp(int button, int shift, int x, int y)
{
if (this.CurrentTool is ITool)
{
if ((CurrentTool as ICommand).Enabled)
(this.CurrentTool as ITool).OnMouseUp(button, shift, x, y);
}
}
public virtual void Refresh(int hdc)
{
if (this.CurrentTool is ITool)
(this.CurrentTool as ITool).Refresh(hdc);
}
#endregion
protected Bitmap m_bitmap;
protected string m_caption;
protected string m_category;
protected bool m_checked;
protected bool m_enabled;
protected string m_helpFile;
protected int m_helpID;
protected string m_message;
protected string m_name;
protected string m_toolTip;
protected Cursor m_cursor = System.Windows.Forms.Cursors.Arrow;
#region BaseCommand
public virtual int Bitmap
{
get { return CurrentTool is ICommand ? (CurrentTool as ICommand).Bitmap : 0; }
}
public virtual string Caption
{
get { return CurrentTool is ICommand ? (CurrentTool as ICommand).Caption : m_caption; }
}
public virtual string Category
{
get { return CurrentTool is ICommand ? (CurrentTool as ICommand).Category : m_category; }
}
public virtual bool Checked
{
get { return CurrentTool is ICommand ? (CurrentTool as ICommand).Checked : m_checked; }
//get { return (CurrentTool is IToolCommand ? (CurrentTool as IToolCommand).Checked:m_checked)||(CurrentTool is ICommand ? (CurrentTool as ICommand).Checked : m_checked); }
}
public virtual bool Enabled
{
get { return CurrentTool is ICommand ? (CurrentTool as ICommand).Enabled : m_enabled; }
}
public virtual int HelpContextID
{
get { return CurrentTool is ICommand ? (CurrentTool as ICommand).HelpContextID : m_helpID; }
}
public virtual string HelpFile
{
get { return CurrentTool is ICommand ? (CurrentTool as ICommand).HelpFile : m_helpFile; }
}
public virtual string Message
{
get { return CurrentTool is ICommand ? (CurrentTool as ICommand).Message : m_message; }
}
public virtual string Name
{
get { return CurrentTool is ICommand ? (CurrentTool as ICommand).Name : m_name; }
}
public virtual void OnClick()
{
//判断当前工具是否是ControlsEditingSketchToolClass,如果不是,则调用editSketchTool的相应事件,以实现GIS原生功能
//此处判断是为了避免重复调用
if (!(this.CurrentTool is ControlsEditingSketchToolClass))
{
editSketchTool.OnClick();
}
if (CurrentTool is ICommand)
(CurrentTool as ICommand).OnClick();
m_checked = true;
}
public virtual void OnCreate(object hook)
{
//判断当前工具是否是ControlsEditingSketchToolClass,如果不是,则调用editSketchTool的相应事件,以实现GIS原生功能
//此处判断是为了避免重复调用
if (!(this.CurrentTool is ControlsEditingSketchToolClass))
{
editSketchTool.OnCreate(hook);
}
if (CurrentTool is ICommand)
(CurrentTool as ICommand).OnCreate(hook);
}
public virtual string Tooltip
{
get { return CurrentTool is ICommand ? (CurrentTool as ICommand).Tooltip : m_toolTip; }
}
#endregion
IPoint m_SnapPoint = null;
bool m_isHasSnap;
public void SnapPoint(IActiveView activeView, IPoint inPoint, IEngineSnapEnvironment m_editEnvironment)
{
if (this.m_isHasSnap && (this.m_SnapPoint != null))
{
this.DrawSnapPoint(activeView, this.m_SnapPoint);
}
this.m_isHasSnap = ((IEngineSnapEnvironment)m_editEnvironment).SnapPoint(inPoint);
if (this.m_isHasSnap)
{
this.m_SnapPoint = inPoint;
this.DrawSnapPoint(activeView, this.m_SnapPoint);
}
}
private void DrawSnapPoint(IActiveView activeView, IPoint point)
{
IScreenDisplay screenDisplay = activeView.ScreenDisplay;
screenDisplay.StartDrawing(screenDisplay.hDC, -1);
IEngineEditProperties engProperties = new EngineEditorClass();
screenDisplay.SetSymbol((ISymbol)engProperties.SnapSymbol);
screenDisplay.DrawPoint(point);
screenDisplay.FinishDrawing();
screenDisplay = null;
}
}
public interface IBaseCommand
{
///
/// 当前Command所属的模块
///
enumProductType AttachProductType { get; }
///
/// 当前有效模块
///
enumProductType CurrentProduct { get; }
object hook { set; get; }
}
}