using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using VEPROMS.CSLA.Library;
namespace Volian.Controls.Library
{
	public partial class StepTabRibbon : UserControl
	{
		#region Properties
		private StepItem _MyStepItem;
		public StepItem MyStepItem
		{
			get { return _MyStepItem; }
			set 
			{ 
				_MyStepItem = value;
				if (value != null)
				{
					MyStepRTB = value.MyStepRTB;
				}
			}
		}
		private ItemInfo MyItemInfo
		{ get { return _MyStepRTB.MyItemInfo; } }
		private int _MyLastFormatID = -1;
		private StepRTB _MyStepRTB;
		public StepRTB MyStepRTB
		{
			get { return _MyStepRTB; }
			set 
			{ 
				_MyStepRTB = value;
				if (value != null)
				{
					//Console.WriteLine(string.Format("StepTabRibbon: In set of MyStepRTB, Selected Text = {0}", MyStepRTB.SelectedText));
					switch (_MyStepRTB.FieldToEdit)
					{
						case E_FieldToEdit.StepText:
							_ContextMenuBar.SetContextMenuEx(_MyStepRTB, btnCMRtfEdit);
							break;
						case E_FieldToEdit.Text:
						case E_FieldToEdit.Number:
							_ContextMenuBar.SetContextMenuEx(_MyStepRTB, btnCMRtfEdit3);
							break;
						default:
							break;
					}
					//_MyStepRTB.KeyDown += new KeyEventHandler(MyStepRTB_SelectionChanged);
					_MyStepRTB.KeyUp += new KeyEventHandler(MyStepRTB_SelectionChanged);
					_MyStepRTB.ModeChange += new StepRTBModeChangeEvent(_MyStepRTB_ModeChange);
					_MyStepRTB.MouseUp += new MouseEventHandler(MyStepRTB_SelectionChanged);
					_MyStepRTB.Leave += new EventHandler(MyStepRTB_Leave);
					_MyStepRTB.LinkChanged += new StepRTBLinkEvent(_MyStepRTB_LinkChanged);
					// Add symbols into the tab ribbon based on format selection. For now, only add symbols once
					// because all symbols are same!!!  If we start defining different symbols in different formats
					// this will have to change, i.e. remove the second part of 'if' statement.
					if (MyItemInfo.ActiveFormat.FormatID != _MyLastFormatID && _MyLastFormatID == -1)
					{
						// Add symbols to the tabribbon & also to the context menu getting info from the format file...
						// Note that the ButtonItems must be used in order to place the buttons on a gallery (cannot
						// use buttonx or dotnet/windows/button).  However, you cannot change the font on ButtonItems so
						// the ribbon MUST use the Arial Unicode MS Font for this to work!!!!
						FormatInfo fmt = MyItemInfo.ActiveFormat;
						SymbolList sl = fmt.PlantFormat.FormatData.SymbolList;
						if (sl == null || sl.Count <= 0)
						{
							MessageBox.Show("No symbols are available, check with administrator");
							return;
						}
						BuildSymbolGallery(sl, galleryContainerSymbolsCM);
						BuildSymbolGallery(sl, galleryContainerSymbolsCM3);
					}
					SetButtonAndMenuEnabling();
					SetStepButtonAndMenuEnabling();
					_MyLastFormatID = MyItemInfo.ActiveFormat.FormatID;
				}
			}
		}
		private void BuildSymbolGallery(SymbolList sl, DevComponents.DotNetBar.GalleryContainer gc)
		{
			foreach (Symbol sym in sl)
			{
				DevComponents.DotNetBar.ButtonItem btn = new DevComponents.DotNetBar.ButtonItem();
				btn.Text = string.Format("{0}", (char)sym.Unicode);
				// to name button use unicode rather than desc, desc may have spaces or odd chars
				btn.Name = "btn" + sym.Unicode.ToString();
				btn.Tooltip = sym.Desc;
				btn.Tag = string.Format(@"{0}", sym.Unicode);
				btn.FontBold = true;
				btn.Click += new System.EventHandler(btnSym_Click);
				galleryContainerSymbols.SubItems.Add(btn);
				DevComponents.DotNetBar.ButtonItem btnCM = new DevComponents.DotNetBar.ButtonItem();
				btnCM.Text = string.Format("{0}", (char)sym.Unicode);
				// to name button use unicode rather than desc, desc may have spaces or odd chars
				btnCM.Name = "btnCM" + sym.Unicode.ToString();
				btnCM.Tooltip = sym.Desc;
				btnCM.Tag = string.Format(@"{0}", sym.Unicode);
				btnCM.FontBold = true;
				btnCM.Click += new System.EventHandler(btnSym_Click);
				gc.SubItems.Add(btnCM);
			}
		}
		void _MyStepRTB_ModeChange(object sender, StepRTBModeChangeEventArgs args)
		{
			SetButtonAndMenuEnabling();
		}
		#endregion
		#region Constructor
		public StepTabRibbon()
		{
			InitializeComponent();
			_RibbonControl.SizeChanged += new EventHandler(_RibbonControl_SizeChanged);
		}
		void _RibbonControl_SizeChanged(object sender, EventArgs e)
		{
			this.Size = _RibbonControl.Size;
		}
		public bool Expanded
		{
			get { return _RibbonControl.Expanded; }
			set { _RibbonControl.Expanded = value; }
		}
		#endregion
		#region Events
		void _MyStepRTB_LinkChanged(object sender, StepPanelLinkEventArgs args)
		{
			// do all Transition and ReferencedObject menu items/buttons based on whether a 'link is selected' and the link type.
			btnCMGoTo.Enabled = btnGoTo.Enabled = _MyStepRTB.IsSelectionLinked(_MyStepRTB.SelectionStart, _MyStepRTB.SelectionLength);
			if (btnCMGoTo.Enabled == true && _MyStepRTB.MyLinkText != null)		// must have some link test, use it to set edit of transition or ro...
			{
				btnCMEditTran.Enabled = _MyStepRTB.MyLinkText.IndexOf("Transition") > -1;			// selected link must be a transition
				btnCMEditRO.Enabled = _MyStepRTB.MyLinkText.IndexOf("ReferencedObject") > -1;	// selected link must be ro	
			}
			else
			{
				btnCMEditTran.Enabled = false;
				btnCMEditRO.Enabled = false;
			}
		}
		void MyStepRTB_Leave(object sender, EventArgs e)
		{
			_MyStepRTB.MouseUp -= new MouseEventHandler(MyStepRTB_SelectionChanged);
			_MyStepRTB.Leave -= new EventHandler(MyStepRTB_Leave);
			_MyStepRTB.LinkChanged -= new StepRTBLinkEvent(_MyStepRTB_LinkChanged);
		}
		void MyStepRTB_SelectionChanged(object sender, EventArgs e)
		{
			//Console.WriteLine(string.Format("StepTabRibbon: In MyStepRTB_SelectionChanged, Selected Text = {0}",MyStepRTB.SelectedText));
			SetButtonAndMenuEnabling();
		}
		void btnInsStep_Click(object sender, EventArgs e)
		{
			DevComponents.DotNetBar.ButtonItem b = (DevComponents.DotNetBar.ButtonItem)sender;
			char [] sep = {' '};
			string[] insdata = b.Tag.ToString().Split(sep);
			if (insdata.Length != 2) return;
			int fromtype = Convert.ToInt32(insdata[0]);
			int contenttype = Convert.ToInt32(insdata[1]) + 20000;
			// if from type == 0, we've inserted a hls, do a after from current HLS
			// if not at HLS, go up parents until find it.
			if (fromtype == 0)
			{
				StepItem hlsStepItem = _MyStepItem;
				while (!hlsStepItem.MyItemInfo.IsHigh)
					hlsStepItem = hlsStepItem.ActiveParent;
				hlsStepItem.AddSiblingAfter((int ?)contenttype);
			}
			else
			{
				// Maybe someday for Grid Tables
				//bool addchild = true;
				//if (InsertingTable(contenttype))
				//{
				//    VlnFlexGrid grd = CreateNewTable();
				//    //					if (grd == null) // if null grd, then user changed mind, abort insert of table
				//    addchild = false;
				//}
				//if (addchild)
					_MyStepItem.AddChild((E_FromType)fromtype, contenttype);
			}
		}
		// Future Table Grid?
		//private bool InsertingTable(int contenttype)
		//{
		//    bool rtnval = false;
		//    switch (contenttype)
		//    {
		//        case 20008: // Centered table
		//        case 20010: // AER table
		//        case 20033: // AER table without boarder
		//        case 20034: // Centered table without boarder
		//            rtnval = true;
		//            break;
		//    }
		//    return rtnval;
		//}
		private void btnInsBefore_Click(object sender, EventArgs e)
		{
			_MyStepItem.AddSiblingBefore();
		}
		private void btnInsAfter_Click(object sender, EventArgs e)
		{
			_MyStepItem.AddSiblingAfter();
		}
		/// 
		/// Using style for step type, enable/disable formatting buttons
		/// 
		private void SetButtonForStyle()
		{
			btnBold.Enabled = btnCMBold.Enabled = (!((_MyStepRTB.MyStyleFont.Style & E_Style.Bold) == E_Style.Bold || (_MyStepRTB.MyStyleFont.Style & E_Style.MmBold) == E_Style.MmBold));
			btnUnderline.Enabled = btnCMUnderline.Enabled = (!((_MyStepRTB.MyStyleFont.Style & E_Style.Underline) == E_Style.Underline));
			btnItalics.Enabled = btnCMItalics.Enabled = (!((_MyStepRTB.MyStyleFont.Style & E_Style.Italics) == E_Style.Italics));
		}
		private void SetButtonMenuEnabledDisabled(bool setting)
		{
			btnCMBold.Enabled = btnBold.Enabled = setting;
			btnCMItalics.Enabled = btnItalics.Enabled = setting;
			btnCMUnderline.Enabled = btnUnderline.Enabled = setting;
			btnCMSubscript.Enabled = btnSubscript.Enabled = setting;
			btnCMSuperscript.Enabled = btnSuperscript.Enabled = setting;
			btnCMCut.Enabled = btnCMCopy.Enabled = btnCut.Enabled = btnCopy.Enabled = setting;
			btnCMUndo.Enabled = btnUndo.Enabled = setting;
			btnCMRedo.Enabled = btnRedo.Enabled = setting;
			btnCMPaste.Enabled = btnPaste.Enabled = setting;
			btnInsPgBrk.Enabled = setting;
			btnChgTyp.Enabled = setting;
			btnInsHLS.Enabled = btnInsCaut.Enabled = btnInsNote.Enabled = btnInsRNO.Enabled = btnInsFig.Enabled =
					btnInsTable.Enabled = btnInsSubstep.Enabled = btnInsBefore.Enabled = btnInsAfter.Enabled = setting;
			btnInsTrans.Enabled = btnCMTransition.Enabled = btnInsRO.Enabled = btnCMRO.Enabled = setting;
			btnCMChgCase.Enabled = btnChgCase.Enabled = setting;
			btnCMHardSpace.Enabled = btnInsHrdSpc.Enabled = setting;
			btnCMSymbol.Enabled = btnSymbols.Enabled = setting;
			btnIndent.Enabled = setting;
		}
		private void SetButtonAndMenuEnabling()
		{
			if (_MyStepRTB.FieldToEdit != E_FieldToEdit.StepText)
				return; // No need to change menu that does not get used
			if (_MyStepRTB == null) return;
			DocVersionInfo dvi = MyStepItem.MyItemInfo.MyProcedure.ActiveParent as DocVersionInfo;
			if (dvi == null) return;
			if (dvi.VersionType > 127 || MyStepItem.MyStepPanel.PanelViewEditMode == E_ViewMode.View)
			{
				SetButtonMenuEnabledDisabled(false);
			}
			else
			{
				SetButtonMenuEnabledDisabled(true);
				if (_MyStepRTB.SelectionFont != null)
				{
					btnCMBold.Checked = btnBold.Checked = RTBAPI.IsBold(_MyStepRTB);
					btnCMItalics.Checked = btnItalics.Checked = RTBAPI.IsItalic(_MyStepRTB);
					btnCMUnderline.Checked = btnUnderline.Checked = RTBAPI.IsUnderline(_MyStepRTB);
					btnCMSubscript.Checked = btnSubscript.Checked = RTBAPI.IsSubScript(_MyStepRTB);
					btnCMSuperscript.Checked = btnSuperscript.Checked = RTBAPI.IsSuperScript(_MyStepRTB);
				}
				SetButtonForStyle();
				btnCMCut.Enabled = btnCMCopy.Enabled = btnCut.Enabled = btnCopy.Enabled = _MyStepRTB.SelectionLength > 0;
				btnCMUndo.Enabled = btnUndo.Enabled = _MyStepRTB.CanUndo;
				btnCMRedo.Enabled = btnRedo.Enabled = _MyStepRTB.CanRedo;
				// for paste, see if there is clipboard data, & if so, of a type we can use.
				IDataObject iData = Clipboard.GetDataObject();
				btnCMPaste.Enabled = btnPaste.Enabled = (iData.GetDataPresent(DataFormats.Text) || iData.GetDataPresent(DataFormats.Rtf));
			}
			
			// do all Transition and ReferencedObject menu items/buttons based on whether a 'link is selected' and the link type.
			btnCMGoTo.Enabled = btnGoTo.Enabled = _MyStepRTB.IsSelectionLinked(_MyStepRTB.SelectionStart, _MyStepRTB.SelectionLength); //(_MyStepRTB.MyLinkText != null);
			if (btnCMGoTo.Enabled == true && _MyStepRTB.MyLinkText != null)		// must have some link test, use it to set edit of transition or ro...
			{
				btnCMEditTran.Enabled = _MyStepRTB.MyLinkText.IndexOf("Transition")>-1;			// selected link must be a transition
				btnCMEditRO.Enabled = _MyStepRTB.MyLinkText.IndexOf("ReferencedObject") > -1;	// selected link must be ro	
			}
			else
			{
				btnCMEditTran.Enabled = false;
				btnCMEditRO.Enabled = false;
			}
		}
		private void SetStepButtonAndMenuEnabling()
		{
			// see if manual page break - only available on HLS
			if (MyItemInfo.IsHigh)
			{
				StepConfig cfg = MyItemInfo.MyConfig as StepConfig;
				btnInsPgBrk.Checked = cfg == null ? false : cfg.Step_ManualPagebreak;
			}
			btnInsPgBrk.Enabled = MyItemInfo.IsHigh;
			// if on procedure or section 'change type' & 'insert' buttons should be disabled.
			if (MyItemInfo.IsProcedure || MyItemInfo.IsSection)
			{
				btnChgTyp.Enabled = false;
				btnInsHLS.Enabled = btnInsCaut.Enabled = btnInsNote.Enabled = btnInsRNO.Enabled = btnInsFig.Enabled =
					btnInsTable.Enabled = btnInsSubstep.Enabled = btnInsBefore.Enabled = btnInsAfter.Enabled = false;
				// if on a procedure or section title, don't allow for insert of ROs or Transitions:
				// disable buttons.  Info panels for ROs and Transitions are made invisible in frmVEPROMS.cs
				btnInsTrans.Enabled = btnCMTransition.Enabled = btnInsRO.Enabled = btnCMRO.Enabled = false;
				return;
			}
			btnChgTyp.Enabled = true;
			// set up insert buttons based on format
			E_AccStep? actable = 0;
			StepData sd = MyItemInfo.FormatStepData;
			actable = sd.StepEditData.AcTable;
			if (actable == null) actable = 0;
			btnInsHLS.Enabled = true;
			btnInsCaut.Enabled = (actable & E_AccStep.AddingCaution)>0;
			btnInsNote.Enabled = (actable & E_AccStep.AddingNote) > 0;
			btnInsRNO.Enabled = (actable & E_AccStep.AddingRNO) > 0;
			btnInsFig.Enabled = (actable & E_AccStep.AddingTable) > 0;
			btnInsTable.Enabled = (actable & E_AccStep.AddingTable) > 0;
			btnInsSubstep.Enabled = (actable & E_AccStep.AddingSub) > 0;
			btnInsBefore.Enabled = (actable & E_AccStep.AddingPrev) > 0;
			btnInsAfter.Enabled = (actable & E_AccStep.AddingNext) > 0;
			btnInsHLS.SubItems.Clear();
			btnInsCaut.SubItems.Clear();
			btnInsNote.SubItems.Clear();
			btnInsRNO.SubItems.Clear();
			btnInsFig.SubItems.Clear();
			btnInsTable.SubItems.Clear();
			btnInsSubstep.SubItems.Clear();
			// if (rno is enabled, set the tag:
			if (btnInsRNO.Enabled)
				btnInsRNO.Tag = string.Format("{0} {1}", (int)E_FromTypes.RNOs, MyStepItem.MyItemInfo.ActiveFormat.PlantFormat.FormatData.GetIndexFromType("RNOType"));
			
			// add subitems depending on whether parent type is enabled:
			if (btnInsHLS.Enabled) GalleryForSubTypes(MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList.HLS, sd, btnInsHLS, 0);
			if (btnInsCaut.Enabled) GalleryForSubTypes(MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList.Caution, sd, btnInsCaut, (int)E_FromType.Caution);
			if (btnInsNote.Enabled) GalleryForSubTypes(MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList.Note, sd, btnInsNote, (int)E_FromType.Note);
			if (btnInsFig.Enabled) GalleryForSubTypes(MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList.Fig, sd, btnInsFig, (int)E_FromType.Table);
			if (btnInsTable.Enabled) GalleryForSubTypes(MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList.Table, sd, btnInsTable, (int)E_FromType.Table);
			if (btnInsSubstep.Enabled) GalleryForSubTypes(MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList.Substep, sd, btnInsSubstep, (int)E_FromType.Step);
			
			btnInsTrans.Enabled = btnCMTransition.Enabled = btnInsRO.Enabled = btnCMRO.Enabled = true;
		}
		/// 
		/// set up a gallery of step types whose parent are defined by input StepData. Can be below 
		/// more than one level, for example. Substep, EquipmentList, EquipmentWBlank - both equipment
		/// lists would be put in gallery
		/// 
		/// StepData: find subtypes related to this
		/// StepData: this should be selected button
		/// DevComponents.DotNetBar.ButtonItem: if items in the gallery, add gallery to this button
		private void GalleryForSubTypes(StepData sdc, StepData selType, DevComponents.DotNetBar.ButtonItem btn, int fromtype)
		{
			int cursel = -1;
			// The first argument (boolean) in StepGetLevelTypes provides the option to get a complete list of step types
			// regardless of whether in the AER or RNO column (set to true).  For all types, get both except for figures
			// and tables.
			bool getall = !(btn.Name == "btnInsFig" || (btn.Name == "btnInsTable"));
			List sdl = MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepGetLevelTypes(getall, sdc, ref cursel, selType.Type, MyItemInfo);
			if (sdl != null && sdl.Count > 0)
			{
				foreach (StepDataRetval sdr in sdl)
				{
					bool addit = true;
					StepData sd = MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList[sdr.Index];
					int hlsSubType = -1;		// if on hls, use this to set default on substep menu to first child
					if (MyItemInfo.IsHigh && MyItemInfo.Steps != null)
					{
						hlsSubType = (int)MyItemInfo.Steps[0].MyContent.Type - 20000;
					}
					// unfortunately, there are some special cases to be handled.
					//	if high level step, don't put the rno button on
					//	if caution don't add note button (the StepGetLevelTypes method returns cautions/notes together
					if (btn.Name == "btnInsHLS" && sd.Type == "RNOType") addit = false;
					if (btn.Name == "btnInsCaut" && sd.Type.Length>=4 && sd.Type.Substring(0, 4) == "Note") addit = false;
					if (btn.Name == "btnInsNote" && sd.Type.Length>=7 && sd.Type.Substring(0, 7) == "Caution") addit = false;
					if (addit)
					{
						DevComponents.DotNetBar.ButtonItem bi = new DevComponents.DotNetBar.ButtonItem("btn" + sd.Type, sd.Type);
						bi.ButtonStyle = DevComponents.DotNetBar.eButtonStyle.TextOnlyAlways;
						bi.Text = sdr.Name;
						bi.Tag = string.Format("{0} {1}", fromtype, sdr.Index);			// index of type to insert it when button is clicked
						bi.Checked = (sd.Type == selType.Type);
						if (MyItemInfo.IsHigh && hlsSubType != -1 && sdr.Index == hlsSubType) bi.Checked = true;
						bi.Click += new System.EventHandler(btnInsStep_Click);
						btn.SubItems.Add(bi);
					}
				}
				// if only 1, be sure event exists on button to insert item & if more than 1 remove event because
				// we want the drop down to appear.
				btn.Click -= new System.EventHandler(btnInsStep_Click);
				if (btn.SubItems.Count == 1)
				{
					btn.SubItems.Clear();
					btn.Tag = string.Format("{0} {1}", fromtype, sdc.Index);
					btn.Click += new System.EventHandler(btnInsStep_Click);
				}
				//else
				//    btn.Click -= new System.EventHandler(btnInsStep_Click);
			}
		}
		#endregion
		#region Insert Tab
		private void btnSym_Click(object sender, EventArgs e)
		{
			DevComponents.DotNetBar.ButtonItem b = (DevComponents.DotNetBar.ButtonItem)sender;
			_MyStepRTB.InsertSymbol(Convert.ToInt32(b.Tag));
		}
		private void btnInsPgBrk_Click(object sender, EventArgs e)
		{
			if (MyItemInfo.IsProcedure || MyItemInfo.IsSection) return;
			// toggle manual page break
			StepConfig cfg = MyItemInfo.MyConfig as StepConfig;
			cfg.Step_ManualPagebreak = !cfg.Step_ManualPagebreak;
			btnInsPgBrk.Checked = cfg.Step_ManualPagebreak;
		}
		private void btnIndent_Click(object sender, EventArgs e)
		{
			_MyStepRTB.InsertIndent();
		}
		private void btnCMIndent_Click(object sender, EventArgs e)
		{
			_MyStepRTB.InsertIndent();
		}
#endregion
		#region Home Tab
		private void btnPaste_Click(object sender, EventArgs e)
		{
			IDataObject myDO = Clipboard.GetDataObject();
			if (myDO.GetDataPresent(DataFormats.Rtf))
				_MyStepRTB.SelectedRtf = myDO.GetData(DataFormats.Rtf).ToString();
			else if (myDO.GetDataPresent(DataFormats.Text))
				_MyStepRTB.SelectedText = myDO.GetData(DataFormats.Text).ToString();
			if (_MyStepRTB.SelectionLength == 0) _MyStepRTB.SelectionFont = _MyStepRTB.MyStyleFont.WindowsFont;
		}
		private void btnCut_Click(object sender, EventArgs e)
		{
			Clipboard.Clear();
			DataObject myDO = new DataObject("Rich Text Format", _MyStepRTB.SelectedRtf);
			Clipboard.SetDataObject(myDO);
			_MyStepRTB.SelectedText = "";
 		}
		private void btnCopy_Click(object sender, EventArgs e)
		{
			Clipboard.Clear();
			DataObject myDO = new DataObject("Rich Text Format", _MyStepRTB.SelectedRtf);
			Clipboard.SetDataObject(myDO);
		}
		private void btnBold_Click(object sender, EventArgs e)
		{
			RTBAPI.ToggleBold(!RTBAPI.IsBold(_MyStepRTB), _MyStepRTB, _MyStepRTB.SelectionLength == 0 ? RTBAPI.RTBSelection.SCF_DEFAULT : RTBAPI.RTBSelection.SCF_SELECTION);
			btnCMBold.Checked = btnBold.Checked = RTBAPI.IsBold(_MyStepRTB);
		}
		private void btnItalics_Click(object sender, EventArgs e)
		{
			RTBAPI.ToggleItalic(!RTBAPI.IsItalic(_MyStepRTB), _MyStepRTB, _MyStepRTB.SelectionLength == 0 ? RTBAPI.RTBSelection.SCF_DEFAULT : RTBAPI.RTBSelection.SCF_SELECTION);
			btnCMItalics.Checked = btnItalics.Checked = RTBAPI.IsItalic(_MyStepRTB);
		}
		private void btnUnderline_Click(object sender, EventArgs e)
		{
			RTBAPI.ToggleUnderline(!RTBAPI.IsUnderline(_MyStepRTB), _MyStepRTB, _MyStepRTB.SelectionLength == 0 ? RTBAPI.RTBSelection.SCF_DEFAULT : RTBAPI.RTBSelection.SCF_SELECTION);
			btnCMUnderline.Checked = btnUnderline.Checked = RTBAPI.IsUnderline(_MyStepRTB);
		}
		private void btnSuperscript_Click(object sender, EventArgs e)
		{
			RTBAPI.ToggleSuperscript(!RTBAPI.IsSuperScript(_MyStepRTB), _MyStepRTB, _MyStepRTB.SelectionLength == 0 ? RTBAPI.RTBSelection.SCF_DEFAULT : RTBAPI.RTBSelection.SCF_SELECTION);
			btnCMSuperscript.Checked = btnSuperscript.Checked = RTBAPI.IsSuperScript(_MyStepRTB);
		}
		private void btnSubscript_Click(object sender, EventArgs e)
		{
			RTBAPI.ToggleSubscript(!RTBAPI.IsSubScript(_MyStepRTB), _MyStepRTB, _MyStepRTB.SelectionLength == 0 ? RTBAPI.RTBSelection.SCF_DEFAULT : RTBAPI.RTBSelection.SCF_SELECTION);
			btnCMSubscript.Checked = btnSubscript.Checked = RTBAPI.IsSubScript(_MyStepRTB);
		}
		private void btnUppercase_Click(object sender, EventArgs e)
		{
			_MyStepRTB.SetSelectedCase('U');
		}
		private void btnLowercase_Click(object sender, EventArgs e)
		{
			_MyStepRTB.SetSelectedCase('l');
		}
		private void btnTitleCase_Click(object sender, EventArgs e)
		{
			_MyStepRTB.SetSelectedCase('T');
		}
		private void btnInsTrans_Click(object sender, EventArgs e)
		{
			// see if user is positioned 'on' a transition within the rtb, if so do a modify, otherwise,
			// insert transition.
			StepTabPanel tmp = Parent as StepTabPanel;
			tmp.MyDisplayTabControl.OnLinkModifyTran(this, new StepPanelLinkEventArgs(_MyStepItem, MyStepRTB.MyLinkText));
		}
		private void btnInsHrdSpc_Click(object sender, EventArgs e)
		{
			_MyStepRTB.InsertSymbol(@"\u160?");
		}
		private void btnInsRO_Click(object sender, EventArgs e)
		{
			// see if user is positioned 'on' an ReferencedObject within the rtb, if so do a modify, otherwise,
			// insert transition.
			StepTabPanel tmp = Parent as StepTabPanel;
			tmp.MyDisplayTabControl.OnLinkModifyRO(this, new StepPanelLinkEventArgs(_MyStepItem, MyStepRTB.MyLinkText));
		}
		private void btnRedo_Click(object sender, EventArgs e)
		{
			_MyStepRTB.Redo();
			btnCMUndo.Enabled = btnUndo.Enabled = _MyStepRTB.CanUndo;
			btnCMRedo.Enabled = btnRedo.Enabled = _MyStepRTB.CanRedo;
		}
		private void btnUndo_Click(object sender, EventArgs e)
		{
			_MyStepRTB.Undo();
			if (_MyStepRTB.WasXDelete && (_MyStepRTB.Text[_MyStepRTB.SelectionStart - 1] == 'X'))
			{
				_MyStepRTB.Undo();
				_MyStepRTB.WasXDelete = false;
				// only allow one of these - not best case, but at least can get
				// one undo
				_MyStepRTB.ClearUndo();
			}
			btnCMRedo.Enabled = btnRedo.Enabled = _MyStepRTB.CanRedo;
			btnCMUndo.Enabled = btnUndo.Enabled = _MyStepRTB.CanUndo;
		}
		private void btnGoTo_Click(object sender, EventArgs e)
		{
			// if on a transition, go to the selected transition 'to'.  If on
			// a referenced object, bring up ReferencedObject Editor (for now, just put up a message box.
			if (_MyStepRTB.MyLinkText.IndexOf("Transition") > -1)
			{
				_MyStepItem.MyStepPanel.OnLinkClicked(sender, new StepPanelLinkEventArgs(_MyStepItem, _MyStepRTB.MyLinkText));
			}
			else
			{
				_MyStepItem.MyStepPanel.OnLinkClicked(sender, new StepPanelLinkEventArgs(_MyStepItem, _MyStepRTB.MyLinkText));
				// for now bring up ro window.  Later bring up ro editor!
			}
		}
		private void btnChgTyp_Click(object sender, EventArgs e)
		{
		}
		#endregion
		#region RHM debug
#if DEBUG
		// The following code generates an XML output for the selected item for print testing.
		private void btnPageBreak_Click(object sender, EventArgs e)
		{
			// This is here temporarily to get a node and all of it's children for print testing.
			OutputAllChildren(MyStepItem);
		}
		private void OutputAllChildren(StepItem myStepItem)
		{
			OutputAllChildren(myStepItem.MyBeforeStepItems);
			OutputStepInfo(myStepItem);
			OutputAllChildren(myStepItem.MyAfterStepItems);
			OutputAllChildren(myStepItem.MyRNOStepItems);
		}
		private void OutputStepInfo(StepItem myStepItem)
		{
			Label lbl = myStepItem.MyLabel;
			if (lbl.Text.Trim() != "")
				Console.WriteLine("{4}",
					ToInches(myStepItem.Left + lbl.Left), ToInches(myStepItem.Top + lbl.Top),
					lbl.Font.FontFamily.Name,lbl.Font.SizeInPoints,lbl.Text);
			StepRTB rtb = myStepItem.MyStepRTB;
			Console.WriteLine("{3}",
				ToInches(myStepItem.Left + rtb.Left), ToInches(myStepItem.Top + rtb.Top), ToInches(rtb.Width), myStepItem.MyItemInfo.MyContent.Text);
//				ToInches(myStepItem.Left + rtb.Left), ToInches(myStepItem.Top + rtb.Top), ToInches(rtb.Width), rtb.Rtf);
		}
		private float ToInches(int val)
		{
			return Convert.ToSingle(val)/96F;
		}
		private void OutputAllChildren(List list)
		{
			if(list != null)
				foreach (StepItem itm in list)
					OutputAllChildren(itm);
		}
		
#endif
		private void btnToggleEditView_Click(object sender, EventArgs e)
		{
			MyStepRTB.ToggleEditView();
		}
		#endregion
	}
public enum E_FieldToEdit { StepText, Text, Number };
}