using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Drawing;
using VEPROMS.CSLA.Library;
using Volian.Controls.Library;
using System.Windows.Forms;
using JR.Utils.GUI.Forms;
namespace Volian.Controls.Library
{
	public partial class StepTabPanel : DevComponents.DotNetBar.PanelDockContainer
	{
		#region Private Fields
		private DisplayTabControl _MyDisplayTabControl;
		private StepTabRibbon _MyStepTabRibbon;
		public StepTabRibbon MyStepTabRibbon
		{
			get { return _MyStepTabRibbon; }
			set { _MyStepTabRibbon = value; }
		}
		private StepPanel _MyStepPanel;
		private DisplayTabItem _MyDisplayTabItem;
		#endregion
		#region Properties
		/// 
		/// Container
		/// 
		public DisplayTabControl MyDisplayTabControl
		{
			get { return _MyDisplayTabControl; }
			//set { _MyDisplayTabControl = value; }
		}
		/// 
		/// StepPanel contained in this control.
		/// 
		public Volian.Controls.Library.StepPanel MyStepPanel
		{
			get { return _MyStepPanel; }
			//set { _MyStepPanel = value; }
		}
		/// 
		/// related DisplayTabItem
		/// 
		public DisplayTabItem MyDisplayTabItem
		{
			get { return _MyDisplayTabItem; }
			set { _MyDisplayTabItem = value; }
		}
		/// 
		/// Currently Selected ItemInfo
		/// 
		public ItemInfo SelectedItemInfo
		{
			get { return _MyStepPanel.SelectedItemInfo; }
			set 
			{
				_MyStepPanel.SelectedEditItem = _MyStepPanel.GetEditItem(value);
				if (_MyStepPanel.SelectedEditItem == null)
				{
					FlexibleMessageBox.Show("The selected item is not available in the editor. One possible cause is that the data is 'not editable', check the section properties 'Editable Data' checkbox.", "Inaccessible Data", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
					return;
				}
				if (_MyStepPanel.SelectedEditItem != null)
					_MyStepPanel.SelectedEditItem.ItemSelect();
				if (!_MyStepPanel.ItemSelectionChangeShown) _MyStepPanel.OnItemSelectedChanged(this, new ItemSelectedChangedEventArgs(_MyStepPanel.SelectedEditItem));
			}
		}
		/// 
		/// Currently Selected EditItem
		/// 
		public EditItem SelectedEditItem
		{
			get { return _MyStepPanel.SelectedEditItem; } 
		}
		/// 
		/// Procedure ItemInfo
		/// 
		public ItemInfo MyProcedureItemInfo
		{
			get { return _MyStepPanel.MyProcedureItemInfo; }
			set {	_MyStepPanel.MyProcedureItemInfo = value; }
		}
		private String _SearchString;
		public String SearchString
		{
			get { return _SearchString; }
			set { _SearchString = value; FindSearchString(); }
		}
		public void FindSearchString()
		{
			if (SelectedEditItem == null) return;// Uneditable Data
			if (SelectedEditItem.MyItemInfo.IsTable)
			{
			    // if not ro table, just make the mysteprtb active.
			    GridItem grd = SelectedEditItem as GridItem;
				grd.SetSearchCell(SearchString);
			}
			// convert the '-' to the unicode non-breaking dash (\u8209? or \u2011 hex)
			// and the '\' to the unicode backslash sybol (\u9586? or \u2572 hex)
			if (!SelectedEditItem.MyStepRTB.IsRoTable)
				SelectedEditItem.MyStepRTB.Find(SearchString.Replace('-', '\u2011').Replace('\\','\u2572'));
		}
		#endregion
		#region Contructors
		public StepTabPanel(DisplayTabControl myDisplayTabControl)
		{
			_MyDisplayTabControl = myDisplayTabControl;
			InitializeComponent();
			SetupStepTabPanel();
			SetupStepPanel();
			SetupStepTabRibbon();
		}
		#endregion
		#region Private Methods - Setup
		/// 
		/// Setup StepTabRibbon
		/// 
		private void SetupStepTabRibbon()
		{
			_MyStepTabRibbon = new StepTabRibbon();
			_MyStepTabRibbon.Dock = System.Windows.Forms.DockStyle.Top;
			_MyStepTabRibbon.Location = new System.Drawing.Point(0, 0);
			_MyStepTabRibbon.Name = "displayTabRibbon1";
			//_MyTabRibbon.MyDisplayRTB = null;
			_MyStepTabRibbon.MyEditItem = null;
			this.Controls.Add(_MyStepTabRibbon);
			_MyStepTabRibbon.Expanded = _MyDisplayTabControl.RibbonExpanded;
		}
		/// 
		/// Setup this within control
		/// 
		private void SetupStepTabPanel()
		{
			Dock = System.Windows.Forms.DockStyle.Fill;
			this.Enter += new EventHandler(StepTabPanel_Enter);
		}
		/// 
		/// Setup StepPanel
		/// 
		private void SetupStepPanel()
		{
			//this.Font = new Font("Microsoft Sans Serif", 8.25F, FontStyle.Regular, GraphicsUnit.Point, ((byte)(0)));
			_MyStepPanel = new Volian.Controls.Library.StepPanel(this.components);
			this.Controls.Add(_MyStepPanel);
			// 
			// _MyPanel
			// 
			_MyStepPanel.AutoScroll = true;
			_MyStepPanel.Dock = System.Windows.Forms.DockStyle.Fill;
			_MyStepPanel.LinkClicked +=new Volian.Controls.Library.StepPanelLinkEvent(_MyStepPanel_LinkClicked);
			_MyStepPanel.LinkActiveChanged += new Volian.Controls.Library.StepPanelLinkEvent(_MyStepPanel_LinkActiveChanged);
			_MyStepPanel.LinkInsertTran += new StepPanelLinkEvent(_MyStepPanel_LinkInsertTran);
			_MyStepPanel.LinkInsertRO += new StepPanelLinkEvent(_MyStepPanel_LinkInsertRO);
			_MyStepPanel.LinkModifyTran += new StepPanelLinkEvent(_MyStepPanel_LinkModifyTran);
			_MyStepPanel.LinkModifyRO += new StepPanelLinkEvent(_MyStepPanel_LinkModifyRO);
			_MyStepPanel.ItemClick +=new Volian.Controls.Library.StepPanelEvent(_MyStepPanel_ItemClick);
			_MyStepPanel.AttachmentClicked += new Volian.Controls.Library.StepPanelAttachmentEvent(_MyStepPanel_AttachmentClicked);
			_MyStepPanel.ItemSelectedChanged += new ItemSelectedChangedEvent(_MyStepPanel_ItemSelectedChanged);
			//_MyStepPanel.ModeChange += new Volian.Controls.Library.StepPanelModeChangeEvent(_MyStepPanel_ModeChange);
			_MyStepPanel.TabDisplay += new Volian.Controls.Library.StepPanelTabDisplayEvent(_MyStepPanel_TabDisplay);
			_MyStepPanel.WordSectionClose += new StepPanelWordSectionCloseEvent(_MyStepPanel_WordSectionClose);
			_MyStepPanel.WordSectionDeleted += new StepPanelWordSectionDeletedEvent(_MyStepPanel_WordSectionDeleted);
			_MyStepPanel.ItemPasted += new StepPanelItemPastedEvent(_MyStepPanel_ItemPasted);
		}
		
		#endregion
		#region Event Handlers
		private bool _ShowingItem = false;
		public bool ShowingItem
		{
			get { return _ShowingItem; }
			set { _ShowingItem = value; }
		}
		/// 
		/// Occurs when the user clicks on a StepTabPanel
		/// 
		/// 
		/// 
		private void StepTabPanel_Enter(object sender, EventArgs e)
		{
			if (_ShowingItem) return;
			// B2019-029: added to save a dirty annotation when the btnsave was not clicked (user just moves to another steprtb but had added annotationi text):
			if (MyDisplayTabControl.MyAnnotationDetails.AnnotationDirty) MyDisplayTabControl.MyAnnotationDetails.SaveAnnotation();
			_ShowingItem = true;
			//if (ItemSelected != null) 
			_MyStepPanel.ItemShow();
			if (_MyStepPanel.MyStepTabPanel != null) // B2014-024 if MyStepTabPanel is null then we are in the process of closing the procedure in that step panel 
				_MyStepPanel.MyStepTabPanel.MyStepTabRibbon.SetUpdRoValBtn(_MyStepPanel.MyStepTabPanel.MyStepTabRibbon.NewerRoFst());
			_ShowingItem = false;
			_MyDisplayTabControl.SelectedDisplayTabItem = MyDisplayTabItem;
		}
		/// 
		/// Occurs when the cursor moves onto or off of a link
		/// 
		/// 
		/// 
		void _MyStepPanel_LinkActiveChanged(object sender, StepPanelLinkEventArgs args)
		{
			_MyDisplayTabControl.OnLinkActiveChanged(sender, args);
		}
		/// 
		/// Occurs when the user chooses to add a transition
		/// 
		/// 
		/// 
		void _MyStepPanel_LinkInsertTran(object sender, StepPanelLinkEventArgs args)
		{
			_MyDisplayTabControl.OnLinkInsertTran(sender, args);
		}
		/// 
		/// Occurs when the user chooses to add an RO
		/// 
		/// 
		/// 
		void _MyStepPanel_LinkInsertRO(object sender, StepPanelLinkEventArgs args)
		{
			_MyDisplayTabControl.OnLinkInsertRO(sender, args);
		}
		/// 
		/// Occurs when the user chosses to modify a transition
		/// 
		/// 
		/// 
		void _MyStepPanel_LinkModifyTran(object sender, StepPanelLinkEventArgs args)
		{
			_MyDisplayTabControl.OnLinkModifyTran(sender, args);
		}
		/// 
		/// Occurs when the user chooses to Modify an RO
		/// 
		/// 
		/// 
		void _MyStepPanel_LinkModifyRO(object sender, StepPanelLinkEventArgs args)
		{
			_MyDisplayTabControl.OnLinkModifyRO(sender, args);
		}
		/// 
		/// Occurs when the Selected Item changes
		/// 
		/// 
		/// 
		void _MyStepPanel_ItemSelectedChanged(object sender, ItemSelectedChangedEventArgs args)
		{
			_MyStepTabRibbon.MyEditItem = args.MyEditItem;
			_MyDisplayTabControl.OnItemSelectedChanged(sender, args);
		}
		// Occurs when the Mode Changes
		//void _MyStepPanel_ModeChange(object sender, StepRTBModeChangeEventArgs args)
		//{
		//    _MyDisplayTabControl.OnModeChange(sender, args);
		//}
		/// 
		/// Occurs when the user clicks on the Attachment Expander
		/// 
		/// 
		/// 
		private ItemInfo curDSOItem = null;
		void _MyStepPanel_AttachmentClicked(object sender, StepPanelAttachmentEventArgs args)
		{
			if (curDSOItem != null) return;
			curDSOItem = args.MyEditItem.MyItemInfo;
			_MyDisplayTabControl.OpenItem(args.MyEditItem.MyItemInfo);
			curDSOItem = null;
		}
		/// 
		/// Occurs when the user clicks on the tab next to an item
		/// 
		/// 
		/// 
		void _MyStepPanel_ItemClick(object sender, StepPanelEventArgs args)
		{
			_MyDisplayTabControl.OnItemClick(sender, args);
		}
		/// 
		/// Occurs when the user clicks on an item
		/// 
		/// 
		/// 
		void _MyStepPanel_LinkClicked(object sender, StepPanelLinkEventArgs args)
		{
			if (args.MyLinkText.LinkInfoText.IndexOf("Transition") > -1)
			{
				// B2018-002 - Invalid Transitions - Don't fail on invalid transition
					if (args.MyLinkText.MyTransitionInfo == null)
					{
							FlexibleMessageBox.Show("This transition is invalid\r\n\r\nDelete it and replace it with \r\na valid transition", "Invalid Transition", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
							return; // Not a valid transition
					}
				ItemInfo item = args.MyLinkText.MyTranToItemInfo;
				if (item == null || item.MyDocVersion == null || (item.PreviousID == null && item.ItemPartCount == 0 && item.ItemDocVersionCount == 0))
				{
						FlexibleMessageBox.Show("This transition is invalid", "Invalid Transition", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
					return; // Not a valid transition
				}
				_MyDisplayTabControl.OpenItem(item);
			}
			else
				Console.WriteLine("Bring Up roeditor");  //TODO: Need to bring up roeditor or infopanel
		}
		void _MyStepPanel_TabDisplay(object sender, StepPanelTabDisplayEventArgs args)
		{
			_MyDisplayTabControl.OnPanelTabDisplay(sender, args);
		}
		void _MyStepPanel_WordSectionClose(object sender, WordSectionEventArgs args)
		{
			_MyDisplayTabControl.OnWordSectionClose(sender, args);
		}
		void _MyStepPanel_WordSectionDeleted(object sender, WordSectionEventArgs args)
		{
			_MyDisplayTabControl.OnWordSectionDeleted(sender, args);
		}
		void _MyStepPanel_ItemPasted(object sender, vlnTreeItemInfoPasteEventArgs args)
		{
			_MyDisplayTabControl.OnItemPaste(sender, args);
		}
		public override string ToString()
		{
			return string.Format("StepTabPanel Procedure Item {0} {1}", 
				MyDisplayTabItem.MyItemInfo.ItemID, MyDisplayTabItem.MyItemInfo.DisplayNumber);
		}
		#endregion
	}
}