using System;
using System.IO;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Diagnostics;
using System.Globalization;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

using ActiproSoftware.Windows.Controls.Docking;
using ActiproSoftware.Windows.Controls.Ribbon.Input;

using agree;
using SysType = System.Type;

namespace agree.Wpf
{

	abstract public class CommandBase : RoutedUICommand
	{
		protected MainWindow w;
		public CommandBase(MainWindow w, String text, String name, SysType t)
			: base(text, name, t)
		{
			this.w = w;
			Debug.Assert(t == this.GetType());
		}
		CommandBinding _b = null;
		public CommandBinding CommandBinding
		{
			get { return _b = (_b ?? new CommandBinding(this, OnExecute, OnCanExecute)); }
		}

		protected abstract void OnExecute(object target, ExecutedRoutedEventArgs args);
		protected virtual void OnCanExecute(object target, CanExecuteRoutedEventArgs args)
		{
			args.Handled = true;
			args.CanExecute = true;
		}
	};


	public class ShowCommand : CommandBase
	{
		public ShowCommand(MainWindow w)
			: base(w, "Show", "Show", typeof(ShowCommand))
		{
		}

		protected override void OnExecute(object target, ExecutedRoutedEventArgs args)
		{
			args.Handled = true;
		}

#if false
		private void CanExecute(object target, CanExecuteRoutedEventArgs args)
		{
			args.Handled = true;
			args.CanExecute = true;
		}
#endif
	};


	public class ShowItemCommand : CommandBase
	{
		public ShowItemCommand(MainWindow w)
			: base(w, "Show Item", "ShowItem", typeof(ShowItemCommand))
		{
		}

		public static void BetterExecute(Object parent, Object arg)
		{
			MyDockSite mds = MyDockSite.g_docksite;
			if (arg is Instance)
			{
				Instance inst = arg as Instance;

				ExpandedWindow etw = mds.DocumentWindows.OfType<ExpandedWindow>().FirstOrDefault(d => d.Inst == inst);
				if (etw == null)
				{
					etw = new ExpandedWindow(inst);
					mds.wksp.tmc.Items.Add(etw);
				}
				//etw.Open();
				//wksp.tmc.SelectedItem = etw;
				etw.Activate();
			}
			else if (arg is Tfs)
			{
				Tfs tfs = (Tfs)arg;

				var etw = new ExpandedWindow(tfs);
				mds.wksp.tmc.Items.Add(etw);
				etw.Activate();
			}
			else if (arg is ParseChart)
			{
				ParseChart pc = arg as ParseChart;
				AgreeGrammarDocument etw = mds.DocumentWindows.OfType<ParseChartWindow>().FirstOrDefault(d => d.ParseChart == pc);
				if (etw == null)
				{
					etw = new ParseChartWindow(pc.ctrl,null);
			//		etw = new MultiParseTreeWindow(pc);
					mds.wksp.tmc.Items.Add(etw);
				}
				etw.Activate();
			}
			else if (arg is ParseControl)
			{
				ParseControl ctrl = arg as ParseControl;
				AgreeGrammarDocument etw = mds.DocumentWindows.OfType<ParseChartWindow>().FirstOrDefault(d => d.ParseChart == ctrl.chart);
				if (etw == null)
				{
					etw = new ParseChartWindow(ctrl, null);
					//		etw = new MultiParseTreeWindow(pc);
					mds.wksp.tmc.Items.Add(etw);
				}
				etw.Activate();
			}
			else if (arg is IDerivation)
			{
				ParseChart pc = parent as ParseChart;
				IDerivation cp = arg as IDerivation;
				ParseTreeWindow etw = mds.DocumentWindows.OfType<ParseTreeWindow>().FirstOrDefault(d => d.ParseTree == cp);
				if (etw == null)
				{
					etw = new ParseTreeWindow(pc.ctrl, cp);
					mds.wksp.tmc.Items.Add(etw);
				}
				etw.Activate();
			}
			//else if (arg is PassiveEdge.Completed)
			//{
			//    ParseChart pc = parent as ParseChart;
			//    PassiveEdge.Completed cp = arg as PassiveEdge.Completed;
			//    ParseTreeWindow etw = mds.DocumentWindows.OfType<ParseTreeWindow>().FirstOrDefault(d => d.ParseTree == cp);
			//    if (etw == null)
			//    {
			//        etw = new ParseTreeWindow(pc.ctrl, cp);
			//        mds.wksp.tmc.Items.Add(etw);
			//    }
			//    etw.Activate();
			//}
		}

		protected override void OnExecute(object target, ExecutedRoutedEventArgs args)
		{
			BetterExecute(target, args.Parameter);
			args.Handled = true;
		}

#if false
		private void CanExecute(object target, CanExecuteRoutedEventArgs args)
		{
			args.Handled = true;
			args.CanExecute = true;
		}
#endif
	};


	public class ShowHighlightedItemCommand : CommandBase
	{
		ISysObj o1;
		ISysObj o_hl;
		public ShowHighlightedItemCommand(MainWindow w, ISysObj o1, ISysObj o_hl)
			: base(w, "Show Highlighted Item", "ShowHighlightedItem", typeof(ShowHighlightedItemCommand))
		{
			this.o1 = o1;
			this.o_hl = o_hl;
		}

		protected override void OnExecute(object target, ExecutedRoutedEventArgs args)
		{
			MyDockSite mds = MyDockSite.g_docksite;
			var etw = new ExpandedWindow((Tfs)o1, (Tfs)o_hl);
			mds.wksp.tmc.Items.Add(etw);
			etw.Activate();

			args.Handled = true;
		}

#if false
		private void CanExecute(object target, CanExecuteRoutedEventArgs args)
		{
			args.Handled = true;
			args.CanExecute = true;
		}
#endif
	};

#if false
	public class OpenEdgeWindow : CommandBase
	{
		public OpenEdgeWindow(MainWindow w)
			: base(w, "Show Edge Type", "ShowEdgeType", typeof(OpenEdgeWindow))
		{
		}

		public class CommandArgs
		{
			public TfsEdge e;
			public String title;
		}

		protected override void OnExecute(object target, ExecutedRoutedEventArgs args)
		{
			CommandArgs ca = args.Parameter as CommandArgs;
			if (ca != null)
			{
				MyDockSite mds = MyDockSite.g_docksite;
				EdgeWindow etw = mds.DocumentWindows.OfType<EdgeWindow>().FirstOrDefault(d => d.Edge == ca.e);
				if (etw == null)
				{
					etw = new EdgeWindow(ca.e, ca.title);
					mds.wksp.tmc.Items.Add(etw);
				}
				//etw.Open();
				//wksp.tmc.SelectedItem = etw;
				etw.Activate();

			}
			args.Handled = true;
		}

#if false
		private void CanExecute(object target, CanExecuteRoutedEventArgs args)
		{
			args.Handled = true;
			args.CanExecute = true;
		}
#endif
	};
#endif


	public class Open3dWindow : CommandBase
	{
		public Open3dWindow(MainWindow w)
			: base(w, "Show 3d Window", "Show3dWindow", typeof(Open3dWindow))
		{
		}

		protected override void OnExecute(object target, ExecutedRoutedEventArgs args)
		{
			agree.Type t = args.Parameter as agree.Type;
			if (t != null)
			{
				MyDockSite mds = MyDockSite.g_docksite;
				T3dWindow etw = mds.DocumentWindows.OfType<T3dWindow>().FirstOrDefault(d => d.Type == t);
				if (etw == null)
				{
					etw = new T3dWindow(t);
					mds.wksp.tmc.Items.Add(etw);
				}
				//etw.Open();
				//wksp.tmc.SelectedItem = etw;
				etw.Activate();

			}
			args.Handled = true;
		}

#if false
		private void CanExecute(object target, CanExecuteRoutedEventArgs args)
		{
			args.Handled = true;
			args.CanExecute = true;
		}
#endif
	};



}