John cfb58493fa fixed the problem where the last item in the step list was not scrolling all the way into view
logic to change background color if the item contains an annotation
2010-01-11 14:05:31 +00:00

1045 lines
34 KiB
C#

using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Windows.Forms;
using VEPROMS.CSLA.Library;
using System.Drawing;
using System.Text.RegularExpressions;
namespace Volian.Controls.Library
{
public partial class StepPanel : Panel
{
#region Fields
private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
/// <summary>
/// Procedure Item Info - Top ItemInfo
/// </summary>
private ItemInfo _MyProcedureItemInfo;
// TODO: This is not correct. There should be a dictionary of Section Layouts
private StepSectionLayoutData _MyStepSectionLayoutData;
/// <summary>
/// Lookup Table to convert ItemInfo.ItemID to StepItem
/// </summary>
internal Dictionary<int, StepItem> _LookupStepItems;
public StepItem FindItem(ItemInfo itemInfo)
{
if (itemInfo == null) return null;
if (!_LookupStepItems.ContainsKey(itemInfo.ItemID)) return null;
return _LookupStepItems[itemInfo.ItemID];
}
/// <summary>
/// Currently selected RichTextBox
/// </summary>
private StepRTB _SelectedStepRTB = null;
/// <summary>
/// Currently selected ItemInfo
/// </summary>
internal ItemInfo _SelectedItemInfo;
private int _ItemMoving = 0;
private StepPanelSettings _MyStepPanelSettings;
private int _MaxRNO = -1; // TODO: Need to calculate MaxRNO on a section basis rather than for a panel
private Font _MyFont = null;
private Font _ProcFont = new Font("Arial", 12, FontStyle.Bold);
private Font _SectFont = new Font("Arial", 10, FontStyle.Bold);
private Font _StepFont = new Font("Arial", 10);
private Color _ActiveColor = Color.SkyBlue;
#if (DEBUG)
private Color _InactiveColor = Color.Linen;
private Color _TabColor = Color.Beige;
private Color _PanelColor = Color.LightGray;
#else
private Color _InactiveColor = Color.White;
private Color _TabColor = Color.White;
private Color _PanelColor = Color.White;
#endif
// Whether panel is in view or edit mode. Toggled from steprtb
// or set based on approval/multi-user (these two will be done
// later.
public E_ViewMode PanelViewEditMode = E_ViewMode.Edit;
internal string _LastAdjust="";
private bool _ShowLines = true;
private Graphics _MyGraphics = null;
private int _DPI = 0;
#endregion
#region Item Events
/// <summary>
/// Occurs when the user clicks tab of a StepItem
/// </summary>
public event StepPanelEvent ItemClick;
/// <summary>
/// Checks to see if the 'ItemClick' event is handled and launches it
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
internal void OnItemClick(object sender, StepPanelEventArgs args)
{
if (ItemClick != null) ItemClick(sender, args);
}
private bool ItemSelectionChangeShown = false; // This keeps OnItemSelectedChanged from being called twice when an item is selected.
/// <summary>
/// Occurs when the selected StepItem changes
/// </summary>
public event ItemSelectedChangedEvent ItemSelectedChanged;
/// <summary>
/// Checks to see if the 'ItemSelectedChanged' event is handled and launches it
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
internal void OnItemSelectedChanged(object sender, ItemSelectedChangedEventArgs args)
{
ItemSelectionChangeShown = true;//Remember that you have run already
//vlnStackTrace.ShowStack(string.Format("OnItemSelectedChanged {0}",args.MyItemInfo.ItemID));
if (ItemSelectedChanged != null) ItemSelectedChanged(sender, args);
}
/// <summary>
/// Occurs when the user clicks on the Attachment Expander
/// </summary>
public event StepPanelAttachmentEvent AttachmentClicked;
/// <summary>
/// Checks to see if the 'AttachmentClicked' event is handled and launches it
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
internal void OnAttachmentClicked(object sender, StepPanelAttachmentEventArgs args)
{
if (AttachmentClicked != null) AttachmentClicked(sender, args);
else MessageBox.Show(args.MyStepItem.MyItemInfo.MyContent.MyEntry.MyDocument.DocumentTitle, "Unhandled Attachment Click", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
// Edit/View mode change
public event StepPanelModeChangeEvent ModeChange;
internal void OnModeChange(object sender, StepRTBModeChangeEventArgs args)
{
PanelViewEditMode = args.ViewMode;
ModeChange(sender, args);
}
// various selections from steptabribbon that need to filter up to frmveproms
// such as 'global search', 'bookmarks'
public event StepPanelTabDisplayEvent TabDisplay;
internal void OnTabDisplay(object sender, StepPanelTabDisplayEventArgs args)
{
TabDisplay(sender, args);
}
// close section, if deleting word doc section
public event StepPanelWordSectionCloseEvent WordSectionClose;
internal void OnWordSectionClose(object sender, WordSectionEventArgs args)
{
WordSectionClose(sender, args);
}
// if section deleted, have event to flag in other UI panels
public event StepPanelWordSectionDeletedEvent WordSectionDeleted;
internal void OnWordSectionDeleted(object sender, WordSectionEventArgs args)
{
WordSectionDeleted(sender, args);
}
#endregion
#region Link Events
/// <summary>
/// Occurs when the user moves onto or off of a Link
/// </summary>
public event StepPanelLinkEvent LinkActiveChanged;
/// <summary>
/// Checks to see if the 'LinkActiveChanged' event is handled and launches it
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
internal void OnLinkActiveChanged(object sender, StepPanelLinkEventArgs args)
{
if (LinkActiveChanged != null) LinkActiveChanged(sender, args);
else MessageBox.Show(args.LinkInfoText, "Unhandled Link Active Changed", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
/// <summary>
/// Occurs when the user chooses to Insert a Transition
/// </summary>
public event StepPanelLinkEvent LinkInsertTran;
/// <summary>
/// Checks to see if the 'LinkInsertTran' event is handled and launches it
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
internal void OnLinkInsertTran(object sender, StepPanelLinkEventArgs args)
{
if (LinkInsertTran != null) LinkInsertTran(sender, args);
else MessageBox.Show(args.LinkInfoText, "Unhandled Link Insert Tran", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
/// <summary>
/// Occurs when the user chooses to Insert an RO
/// </summary>
public event StepPanelLinkEvent LinkInsertRO;
/// <summary>
/// Checks to see if the 'LinkInsertRO' event is handled and launches it
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
internal void OnLinkInsertRO(object sender, StepPanelLinkEventArgs args)
{
if (LinkInsertRO != null) LinkInsertRO(sender, args);
else MessageBox.Show(args.LinkInfoText, "Unhandled Link Insert RO", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
/// <summary>
/// Occurs when the user clicks a Link
/// </summary>
public event StepPanelLinkEvent LinkClicked;
/// <summary>
/// Checks to see if the 'LinkClicked' event is handled and launches it
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
internal void OnLinkClicked(object sender, StepPanelLinkEventArgs args)
{
if (LinkClicked != null) LinkClicked(sender, args);
else MessageBox.Show(args.LinkInfoText, "Unhandled Link Click", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
/// <summary>
/// Occurs when the user chooses to modify a Transition
/// </summary>
public event StepPanelLinkEvent LinkModifyTran;
/// <summary>
/// Checks to see if the 'LinkModifyTran' event is handled and launches it
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
internal void OnLinkModifyTran(object sender, StepPanelLinkEventArgs args)
{
if (LinkModifyTran != null) LinkModifyTran(sender, args);
else MessageBox.Show(args.LinkInfoText, "Unhandled Link Modify Tran", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
/// <summary>
/// Occurs when the user chooses to modify an RO
/// </summary>
public event StepPanelLinkEvent LinkModifyRO;
/// <summary>
/// Checks to see if the 'LinkModifyRO' event is handled and launches it
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
internal void OnLinkModifyRO(object sender, StepPanelLinkEventArgs args)
{
if (LinkModifyRO != null) LinkModifyRO(sender, args);
else MessageBox.Show(args.LinkInfoText, "Unhandled Link Modify RO", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
#endregion
#region Constructors
public StepPanel()
{
InitializeComponent();
this.BackColorChanged += new EventHandler(StepPanel_BackColorChanged);
#if(DEBUG)
this.Paint += new PaintEventHandler(StepPanel_Paint);
this.DoubleClick += new EventHandler(StepPanel_DoubleClick); // Toggles Vertical lines on and off
#else
this.BackColor = Color.White;
#endif
this.AutoScroll = true;
}
public StepPanel(IContainer container)
{
container.Add(this);
InitializeComponent();
this.BackColorChanged += new EventHandler(StepPanel_BackColorChanged);
#if(DEBUG)
this.Paint += new PaintEventHandler(StepPanel_Paint); // Toggles Vertical lines on and off
this.DoubleClick += new EventHandler(StepPanel_DoubleClick);
#else
this.BackColor = Color.White;
#endif
this.AutoScroll = true;
}
void StepPanel_BackColorChanged(object sender, EventArgs e)
{
// Walk through controls & set colors
InactiveColor = PanelColor = BackColor;
foreach (Control ctrl in Controls)
{
if (ctrl.GetType() == typeof(StepItem))
{
StepItem rtb = (StepItem)ctrl;
rtb.BackColor = BackColor;
}
}
}
#endregion
#region Private Methods
/// <summary>
/// Expands an Item and It's Parents as need to display an item
/// </summary>
/// <param name="myItemInfo">Item to Expand</param>
private void ExpandAsNeeded(ItemInfo myItemInfo)
{
int id = myItemInfo.ItemID;
if (!_LookupStepItems.ContainsKey(id)) // If the item is not currently displayed
ExpandAsNeeded((ItemInfo)myItemInfo.ActiveParent); // Expand it's parent
if (_LookupStepItems.ContainsKey(id)) // Expanding Parent should have added it to _LookupStepItems
{
StepItem itm = _LookupStepItems[id];
ItemInfo ii = myItemInfo.ActiveParent as ItemInfo;
if (itm.Visible == false && ii != null)
ExpandAsNeeded((ItemInfo)myItemInfo.ActiveParent);
itm.AutoExpand(); // Expand it if it should expand
}
}
#endregion
#region Properties
public StepTabPanel MyStepTabPanel
{ get { return Parent as StepTabPanel; } }
/// <summary>
/// Procedure Item Info - Top ItemInfo
/// Get and Set - Set stes-up all of the
/// </summary>
public ItemInfo MyProcedureItemInfo
{
get { return _MyProcedureItemInfo; }
set
{
//// TIMING: DisplayItem.TimeIt("pMyItem Start");
_MyProcedureItemInfo = value;
if(value != null)
_MyStepSectionLayoutData = _MyProcedureItemInfo.ActiveFormat.PlantFormat.FormatData.SectData.StepSectionData.StepSectionLayoutData;
//// TIMING: DisplayItem.TimeIt("pMyItem Layout");
//this.Layout += new LayoutEventHandler(DisplayPanel_Layout);
//this.Scroll += new ScrollEventHandler(DisplayPanel_Scroll);
//// TIMING: DisplayItem.TimeIt("pMyItem Scroll");
Controls.Clear();
_LookupStepItems = new Dictionary<int, StepItem>();
//// TIMING: DisplayItem.TimeIt("pMyItem Clear");
//SuspendLayout();
StepItem tmpStepItem = new StepItem(_MyProcedureItemInfo, this, null, ChildRelation.None, false);
//ResumeLayout();
//// TIMING: DisplayItem.TimeIt("pMyItem End");
}
}
public void Reset()
{
ItemInfo parent = SelectedItemInfo.ActiveParent as ItemInfo;
if (parent != null) ItemInfo.ResetParts(parent.ItemID); // Force data to reload
// The following line actually reloads the procedure item
MyProcedureItemInfo = MyProcedureItemInfo; // see get/set above. - Load Procedure and Sections
// The following line expands the items needed to display SelectedItemInfo
ExpandAsNeeded(SelectedItemInfo);
}
/// <summary>
/// Get or Set currently selected RichTextBox (StepRTB)
/// </summary>
public StepRTB SelectedStepRTB
{
get { return _SelectedStepRTB; }
set
{
StepRTB lastRTB = _SelectedStepRTB;
if(value != null)
value.BackColor = ActiveColor; // Set the active color
if (_SelectedStepRTB == value) return; // Same - No Change
if (_SelectedStepRTB != null)
{
//_SelectedStepRTB.BackColor = InactiveColor;
_SelectedStepRTB.SetBackColor();
_SelectedStepRTB.SaveText(); // Save any changes to the text
_SelectedStepRTB.SaveConfig(); // This may be redundant
_SelectedStepRTB.RTBFillIn(false);
_SelectedStepRTB.ViewRTB = true;
}
_SelectedStepRTB = value;
if (value != null)
{
_SelectedStepRTB.ViewRTB = PanelViewEditMode == E_ViewMode.View;
_SelectedStepRTB.RTBFillIn(PanelViewEditMode != E_ViewMode.View);
if (_SelectedItemInfo.ItemID != value.MyItemInfo.ItemID)
SelectedItemInfo = value.MyItemInfo;
}
//vlnStackTrace.ShowStack("_DisplayRTB = {0}", _DisplayRTB.MyItem.ItemID);// Show StackTrace
}
}
/// <summary>
/// Gets or Sets the SelectedItemInfo
/// Activates and Expands as necessary
/// </summary>
public ItemInfo SelectedItemInfo
{
get { return _SelectedItemInfo; }
set
{
//vlnStackTrace.ShowStack("SelectedItemInfo {0} => {1}",_SelectedItemInfo, value);
_SelectedItemInfo = value;
int id = value.ItemID;
ExpandAsNeeded(value);
// reset the entire step panel if the item isn't found.
if (!_LookupStepItems.ContainsKey(id)) Reset();
StepItem itm = _LookupStepItems[id];
ItemSelectionChangeShown = false;//OnItemSelectedChanged has not run yet.
itm.ItemSelect();
if (!ItemSelectionChangeShown) OnItemSelectedChanged(this, new ItemSelectedChangedEventArgs(itm));
//vlnStackTrace.ShowStack("_ItemSelected = {0}", _ItemSelected.ItemID);// Show StackTrace
}
}
private bool _DisplayItemChanging = false;
public bool DisplayItemChanging
{
get { return _DisplayItemChanging; }
set { _DisplayItemChanging = value; }
}
/// <summary>
/// Returns the SelectedStepItem
/// </summary>
public StepItem SelectedStepItem
{
get { return (_SelectedItemInfo != null) ? _LookupStepItems[_SelectedItemInfo.ItemID] : null; }
}
/// <summary>
/// Displays the selected StepItem
/// </summary>
public void ItemShow()
{
if (_SelectedItemInfo != null)
{
SelectedStepItem.ItemShow();
OnItemSelectedChanged(this, new ItemSelectedChangedEventArgs(SelectedStepItem));
}
}
public new void MouseWheel(MouseEventArgs e)
{
base.OnMouseWheel(e);
}
/// <summary>
/// Used to track movement other than scrolling
/// 0 - Indicates no other movement
/// > 0 - Indicates that other movement is happening
/// </summary>
public int ItemMoving
{
get { return _ItemMoving; }
set { _ItemMoving = value; }
}
/// <summary>
/// Lazy loaded StepPanelSettings
/// </summary>
public StepPanelSettings MyStepPanelSettings
{
get
{
if (_MyStepPanelSettings == null) _MyStepPanelSettings = new StepPanelSettings(this);
return _MyStepPanelSettings;
}
set { _MyStepPanelSettings = value;}
}
/// <summary>
/// Gets or Sets the font for the Panel
/// </summary>
public Font MyFont
{
get { return _MyFont; }
set { _ProcFont = _SectFont = _StepFont = _MyFont = value; }
}
/// <summary>
/// Gets or sets the font for the Procedure Text
/// </summary>
public Font ProcFont
{
get { return _ProcFont; }
set { _ProcFont = value; }
}
/// <summary>
/// Gets or sets the font for the Section Text
/// </summary>
public Font SectFont
{
get { return _SectFont; }
set { _SectFont = value; }
}
/// <summary>
/// Gets or sets the Step Font
/// </summary>
public Font StepFont
{
get { return _StepFont; }
set { _StepFont = value; }
}
/// <summary>
/// Gets or Sets the Active Color for the Panel
/// </summary>
public Color ActiveColor
{
get { return _ActiveColor; }
set { _ActiveColor = value; }
}
/// <summary>
/// Gets or sets the InActive Color for the Panel
/// </summary>
public Color InactiveColor
{
get { return _InactiveColor; }
set { _InactiveColor = value; }
}
/// <summary>
/// Gets or sets the Tab Color
/// </summary>
public Color TabColor
{
get { return _TabColor; }
set { _TabColor = value; }
}
/// <summary>
/// Gets or sets the Panel Color
/// </summary>
public Color PanelColor
{
get { return _PanelColor; }
set { _PanelColor = value;
BackColor = value;
}
}
#endregion
#region DisplayConversions
/// <summary>
/// gets a Graphic object for the panel
/// </summary>
public Graphics MyGraphics
{
get
{
if (_MyGraphics == null)
_MyGraphics = CreateGraphics();
return _MyGraphics;
}
}
/// <summary>
/// Gets the DPI setting for the current graphics setting
/// </summary>
internal int DPI
{
get
{
if (_DPI == 0)
_DPI = Convert.ToInt32(MyGraphics.DpiX);
return _DPI;
}
}
/// <summary>
/// Converts an integer value from Twips to Pixels
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public int ToDisplay(int value)
{
//return (DPI * value) / 864;
return (DPI * value) / 72;
}
/// <summary>
/// Converts an integer? value from Twips to Pixels
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public int ToDisplay(int? value)
{
return ToDisplay((int)value);
}
/// <summary>
/// Converts an string value from Twips to Pixels
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public int ToDisplay(string value)
{
return ToDisplay(Convert.ToInt32(value));
}
/// <summary>
/// Converts a value from a list in a string from Twips to Pixels
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public int ToDisplay(string value,int i)
{
string s = value.Split(",".ToCharArray())[i];
return ToDisplay(s);
}
#endregion
#region Debug Methods
/// <summary>
/// Gets or sets ShowLines so that vertical lines are shown for debugging purposes
/// </summary>
public bool ShowLines
{
get { return _ShowLines; }
set { _ShowLines = value; }
}
/// <summary>
/// Draw a vertical line
/// </summary>
/// <param name="g"></param>
/// <param name="x"></param>
private void VerticalLine(Graphics g, int x)
{
Pen bluePen = new Pen(Color.CornflowerBlue,1);
g.DrawLine(bluePen, x, 0, x, this.Height);
}
/// <summary>
/// Toggle the vertical lines on and off
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void StepPanel_DoubleClick(object sender, EventArgs e)
{
ShowLines = !ShowLines;
Refresh();
}
private void StepPanel_Paint(object sender, PaintEventArgs e)
{
if (ShowLines)
{
//int fifth = Height / 5;
//Rectangle r1 = new Rectangle(0, 0, Width, Height - fifth);
////Brush b = new System.Drawing.Drawing2D.LinearGradientBrush(r1, Color.FromArgb(128, 0, 32), Color.FromArgb(96, 0, 16), 90);
//Brush b = new System.Drawing.Drawing2D.LinearGradientBrush(r1, Color.FromArgb(255,128, 0, 32), Color.FromArgb(255,96, 0, 16),System.Drawing.Drawing2D.LinearGradientMode.Vertical);
//e.Graphics.FillRectangle(b, r1);
//r1 = new Rectangle(0, Height - fifth, Width, fifth);
//b = new System.Drawing.Drawing2D.LinearGradientBrush(r1, Color.FromArgb(255,96, 0, 16), Color.FromArgb(255,128, 0, 32), 90);
//e.Graphics.FillRectangle(b, r1);
//VerticalLine(e.Graphics, 60);
//VerticalLine(e.Graphics, 102);
//VerticalLine(e.Graphics, 415);
}
}
/// <summary>
/// Output all of the StepItem controls to the log
/// </summary>
private void ListControls()
{
// Walk through the controls and find the next control for each
if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("'Item','Next'");
foreach (Control control in Controls)
if (control.GetType() == typeof(StepItem))
{
StepItem rtb = (StepItem)control;
StepItem nxt = rtb.NextDownStepItem;
if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("{0},{1}", rtb.MyID, nxt == null ? 0 : nxt.MyID);
}
}
#endregion
#region Cursor Movement Methods
/// <summary>
/// Finds the Displayed 'top' child for a given item. Used for down arrow.
/// </summary>
/// <param name="ii">ItemInfo</param>
/// <returns></returns>
private ItemInfo TopPart(ItemInfo ii)
{
ExpandAsNeeded(ii);
if (ii.Cautions != null) return TopPart(ii.Cautions[0]);
if (ii.Notes != null) return TopPart(ii.Notes[0]);
return (ii);
}
/// <summary>
/// Finds the Displayed 'bottom' child for a given item. Used for up arrow.
/// </summary>
/// <param name="ii">ItemInfo</param>
/// <returns></returns>
private ItemInfo BottomPart(ItemInfo ii)
{
ExpandAsNeeded(ii);
if (ii.RNOs != null && ii.RNOLevel >= ii.ColumnMode) return BottomPart(ii.RNOs[0]);
if (ii.Sections != null) return BottomPart(ii.Sections[0].LastSibling);
if (ii.Steps != null) return BottomPart(ii.Steps[0].LastSibling);
if (ii.Tables != null) return BottomPart(ii.Tables[0].LastSibling);
return ii;
}
/// <summary>
/// Supports cursor movement between richtext boxes, including arrow keys/page up,down/
/// ctrl Home,End
/// </summary>
/// <param name="rtb">StepRTB</param>
/// <param name="position">Point</param>
/// <param name="arrow">E_ArrowKeys</param>
public void CursorMovement(StepRTB rtb, Point position, E_ArrowKeys arrow)
{
ItemInfo ii = null;
switch (arrow)
{
case E_ArrowKeys.Up:
case E_ArrowKeys.CtrlUp:
ii = ArrowUp(rtb.MyItemInfo);
if (ii != null) SelectedStepRTB = _LookupStepItems[ii.ItemID].MyStepRTB;
break;
case E_ArrowKeys.Down:
case E_ArrowKeys.CtrlDown:
ii = ArrowDown(rtb.MyItemInfo);
if (ii != null) SelectedStepRTB = _LookupStepItems[ii.ItemID].MyStepRTB;
break;
case E_ArrowKeys.Right:
case E_ArrowKeys.CtrlRight:
if (rtb.MyItemInfo.RNOs != null)
SelectedStepRTB = _LookupStepItems[rtb.MyItemInfo.RNOs[0].ItemID].MyStepRTB;
break;
case E_ArrowKeys.Left:
case E_ArrowKeys.CtrlLeft:
if (!rtb.MyItemInfo.IsProcedure)
SelectedStepRTB = _LookupStepItems[rtb.MyItemInfo.MyParent.ItemID].MyStepRTB;
break;
default:
break;
}
}
private ItemInfo ArrowUp(ItemInfo ii)
{
// if on RNO, check display mode (1 column/2 column, etc) and how deep RNO is before going to
// parents substeps.
if (ii.IsRNO && ii.MyParent.Steps != null && ii.RNOLevel >= ii.ColumnMode) return BottomPart(ii.MyParent.Steps[0].LastSibling);
// If on top note and parent has cautions - go to bottom caution
if (ii.IsNoteStructure && ii.MyParent != null && ii.MyParent.Cautions != null) return BottomPart(ii.MyParent.Cautions[0].LastSibling);
if (ii.IsCautionStructure || ii.IsNoteStructure)
{
if (ii.MyParent.MyPrevious != null) return BottomPart(ii.MyParent.MyPrevious);
return ii.MyParent.MyParent;
}
// If has note, BottomPart of last sibling of the note
if (ii.Notes != null) return BottomPart(ii.Notes[0].LastSibling);
// If has caution, BottomPart of last sibling of the caution
if (ii.Cautions != null) return BottomPart(ii.Cautions[0].LastSibling);
// If previous sibling, BottomPart of previous sibling
if (ii.MyPrevious != null && ii.IsProcedure == false) return BottomPart(ii.MyPrevious);
// Go to parent until at procedure
if (!ii.IsProcedure) return (ii.MyParent);
return null;
}
private ItemInfo ArrowDown(ItemInfo ii)
{
return ArrowDown(ii, true, true);
}
private ItemInfo ArrowDown(ItemInfo ii, bool lookAtSub, bool lookAtRNO)
{
if (ii.IsSection || ii.IsProcedure)
{
if (lookAtSub && ii.Sections != null) return TopPart(ii.Sections[0]);
if (lookAtSub && ii.Steps != null) return TopPart(ii.Steps[0]);
if (ii.IsSection && ii.NextItems != null) return TopPart(ii.NextItems[0]);
}
else
{
// Subitems - go to top part of subitem
// (the lookAtSub prevented looping within a substep group at same level)
if (lookAtSub && ii.Steps != null) return TopPart(ii.Steps[0]);
if (lookAtSub && ii.Tables != null) return TopPart(ii.Tables[0]);
// RNOs: Use PMode (column)
if (lookAtRNO && ii.RNOs != null && ii.RNOLevel >= ii.ColumnMode) return TopPart(ii.RNOs[0]);
// Nextsibling - go to top part of sibling
// TODO: RHM - NextItems was not null when it should have been after delete of a note below a caution
if (ii.NextItems != null && ii.NextItemCount > 0) return TopPart(ii.NextItems[0]);
// If on caution, if parent has note - go to note
if (ii.IsCautionStructureFirstSib && ii.MyParent.Notes != null) return ii.MyParent.Notes[0];
// If on caution, if parent !has note or if on note go to parent
if ((ii.IsCautionStructureFirstSib && ii.MyParent.Notes == null) || ii.IsNoteStructureFirstSib) return ii.MyParent;
// Recursively call with parent until at procedure
if (!ii.IsProcedure) return (ArrowDown(ii.MyParent, false, ii.MyParent.RNOLevel==ii.RNOLevel));
}
return null;
}
internal void StepCursorKeys(StepRTB rtb, KeyEventArgs keyargs)
{
ItemInfo ii = rtb.MyItemInfo;
if (ii.IsSection || ii.IsProcedure) return;
while (!ii.IsHigh)
{
ii = ii.MyParent;
}
switch (keyargs.KeyCode)
{
// for home/end, control key must be pressed too, but this is checked
// before here.
case Keys.Home:
ii = ii.FirstSibling;
break;
case Keys.End:
ii = ii.LastSibling;
break;
case Keys.PageDown:
ii = ii.NextItems == null ? null : ii.NextItems[0];
break;
case Keys.PageUp:
ii = ii.MyPrevious;
break;
}
if (ii == null) return;
SelectedStepRTB = _LookupStepItems[ii.ItemID].MyStepRTB;
}
#endregion
}
[TypeConverter(typeof(ExpandableObjectConverter))]
public partial class StepPanelSettings
{
private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public StepPanelSettings(StepPanel panel)
{
_MyStepPanel = panel;
}
public StepPanelSettings()
{
}
private StepPanel _MyStepPanel;
[Browsable(false)]
public StepPanel MyStepPanel
{
get { return _MyStepPanel; }
set { _MyStepPanel = value; }
}
private float _CircleXOffset = -4;
[Category("Circle")]
[DisplayName("Circle Horizontal Offset")]
public float CircleXOffset
{
get { return _CircleXOffset; }
set { _CircleXOffset = value; if (_MyStepPanel != null) _MyStepPanel.Refresh(); }
}
private float _CircleYOffset = -13;
[Category("Circle")]
[DisplayName("Circle Vertical Offset")]
public float CircleYOffset
{
get { return _CircleYOffset; }
set { _CircleYOffset = value; if (_MyStepPanel != null) _MyStepPanel.Refresh(); }
}
private Font _CircleFont = new Font("Arial Unicode MS", 23);
[Category("Circle")]
[DisplayName("Circle Font")]
public Font CircleFont
{
get { return _CircleFont; }
set { _CircleFont = value; if(_MyStepPanel != null) _MyStepPanel.Refresh(); }
}
private Color _CircleColor = Color.Black;
[Category("Circle")]
[DisplayName("Circle Color")]
public Color CircleColor
{
get { return _CircleColor; }
set { _CircleColor = value; if (_MyStepPanel != null) _MyStepPanel.Refresh(); }
}
private int _CircleDiameter = 25;
[Category("Circle")]
[DisplayName("Circle Diameter")]
public int CircleDiameter
{
get { return _CircleDiameter; }
set { _CircleDiameter = value; if (_MyStepPanel != null) _MyStepPanel.Refresh(); }
}
private int _CircleWeight = 2;
[Category("Circle")]
[DisplayName("Circle Pen Weight")]
public int CircleWeight
{
get { return _CircleWeight; }
set { _CircleWeight = value; if (_MyStepPanel != null) _MyStepPanel.Refresh(); }
}
private float _NumberLocationX = 20F;
[Category("Number")]
[DisplayName("Number Location X")]
public float NumberLocationX
{
get { return _NumberLocationX; }
set { _NumberLocationX = value; if (_MyStepPanel != null) _MyStepPanel.Refresh(); }
}
private float _NumberLocationY = 4;
[Category("Number")]
[DisplayName("Number Location Y")]
public float NumberLocationY
{
get { return _NumberLocationY; }
set { _NumberLocationY = value; if (_MyStepPanel != null) _MyStepPanel.Refresh(); }
}
private SizeF _NumberSize = new SizeF(200F, 23F);
[Category("Number")]
[DisplayName("Number Size")]
public SizeF NumberSize
{
get { return _NumberSize; }
set { _NumberSize = value; if (_MyStepPanel != null) _MyStepPanel.Refresh(); }
}
private int _TableWidthAdjust = 4;
[Category("Table")]
[DisplayName("Table Width Adjust")]
public int TableWidthAdjust
{
get { return _TableWidthAdjust; }
set { _TableWidthAdjust = value; if (_MyStepPanel != null) _MyStepPanel.Refresh(); }
}
private int _CheckOffWeight = 1;
[Category("CheckOff")]
[DisplayName("CheckOff Pen Weight")]
public int CheckOffWeight
{
get { return _CheckOffWeight; }
set { _CheckOffWeight = value; if (_MyStepPanel != null) _MyStepPanel.Refresh(); }
}
private Color _CheckOffColor = Color.Black;
[Category("CheckOff")]
[DisplayName("CheckOff Color")]
public Color CheckOffColor
{
get { return _CheckOffColor; }
set { _CheckOffColor = value; if (_MyStepPanel != null) _MyStepPanel.Refresh(); }
}
private int _CheckOffSize =12;
[Category("CheckOff")]
[DisplayName("CheckOff Size")]
public int CheckOffSize
{
get { return _CheckOffSize; }
set { _CheckOffSize = value; if (_MyStepPanel != null) _MyStepPanel.Refresh(); }
}
private int _CheckOffX =0;
[Category("CheckOff")]
[DisplayName("CheckOff X")]
public int CheckOffX
{
get { return _CheckOffX; }
set { _CheckOffX = value; if (_MyStepPanel != null) _MyStepPanel.Refresh(); }
}
private int _CheckOffY =5;
[Category("CheckOff")]
[DisplayName("CheckOff Y")]
public int CheckOffY
{
get { return _CheckOffY; }
set { _CheckOffY = value; if (_MyStepPanel != null) _MyStepPanel.Refresh(); }
}
private int _ChangeBarWeight = 1;
[Category("ChangeBar")]
[DisplayName("ChangeBar Pen Weight")]
public int ChangeBarWeight
{
get { return _ChangeBarWeight; }
set { _ChangeBarWeight = value; if (_MyStepPanel != null) _MyStepPanel.Refresh(); }
}
private Color _ChangeBarColor = Color.Black;
[Category("ChangeBar")]
[DisplayName("ChangeBar Color")]
public Color ChangeBarColor
{
get { return _ChangeBarColor; }
set { _ChangeBarColor = value; if (_MyStepPanel != null) _MyStepPanel.Refresh(); }
}
}
public partial class StepPanelEventArgs
{
private StepItem _MyStepItem;
public StepItem MyStepItem
{
get { return _MyStepItem; }
set { _MyStepItem = value; }
}
private MouseEventArgs _MyMouseEventArgs;
public MouseEventArgs MyMouseEventArgs
{
get { return _MyMouseEventArgs; }
set { _MyMouseEventArgs = value; }
}
public StepPanelEventArgs(StepItem myStepItem, MouseEventArgs myMouseEventArgs)
{
_MyStepItem = myStepItem;
_MyMouseEventArgs = myMouseEventArgs;
}
}
public partial class ItemSelectedChangedEventArgs
{
private ItemInfo _MyItemInfo;
public ItemInfo MyItemInfo
{
get { return _MyItemInfo; }
set { _MyItemInfo = value; }
}
private StepItem _MyStepItem = null;
public StepItem MyStepItem
{
get { return _MyStepItem; }
set { _MyStepItem = value; }
}
public ItemSelectedChangedEventArgs(ItemInfo myItemInfo)
{
_MyItemInfo = myItemInfo;
}
public ItemSelectedChangedEventArgs(StepItem myStepItem)
{
_MyItemInfo = myStepItem.MyItemInfo;
_MyStepItem = myStepItem;
}
}
public partial class StepPanelAttachmentEventArgs
{
private StepItem _MyStepItem;
public StepItem MyStepItem
{
get { return _MyStepItem; }
set { _MyStepItem = value; }
}
public StepPanelAttachmentEventArgs(StepItem myStepItem)
{
_MyStepItem = myStepItem;
}
}
public partial class StepPanelLinkEventArgs : EventArgs
{
private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private StepItem _LinkedStepItem;
public StepItem LinkedStepItem
{
get { return _LinkedStepItem; }
//set { _LinkedStepItem = value; }
}
private string _LinkInfoText;
public string LinkInfoText
{
get { return _LinkInfoText; }
}
private LinkText _MyLinkText;
public LinkText MyLinkText
{
get { return _MyLinkText;}
}
public StepPanelLinkEventArgs(StepItem linkedStepItem, string linkInfoText)
{
_LinkedStepItem = linkedStepItem;
_LinkInfoText = linkInfoText;
_MyLinkText = new LinkText(_LinkInfoText);
//if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("\r\n LinkInfo '{0}'\r\n", linkInfo.LinkText);
}
}
public partial class StepPanelTabDisplayEventArgs : EventArgs
{
private string _PanelTabName;
public string PanelTabName
{
get { return _PanelTabName; }
}
public StepPanelTabDisplayEventArgs(string panelTabname)
{
_PanelTabName = panelTabname;
}
}
public partial class WordSectionEventArgs : EventArgs
{
private SectionInfo _MySectionInfo;
public SectionInfo MySectionInfo
{
get { return _MySectionInfo; }
}
public WordSectionEventArgs(SectionInfo mySectionInfo)
{
_MySectionInfo = mySectionInfo;
}
}
public delegate void StepPanelEvent(object sender, StepPanelEventArgs args);
public delegate void ItemSelectedChangedEvent(object sender, ItemSelectedChangedEventArgs args);
public delegate void StepPanelLinkEvent(object sender, StepPanelLinkEventArgs args);
public delegate void StepPanelAttachmentEvent(object sender, StepPanelAttachmentEventArgs args);
public delegate void StepRTBLinkEvent(object sender, StepPanelLinkEventArgs args);
public delegate void StepPanelModeChangeEvent(object sender, StepRTBModeChangeEventArgs args);
public delegate void StepPanelTabDisplayEvent(object sender, StepPanelTabDisplayEventArgs args);
public delegate void StepPanelWordSectionCloseEvent(object sender, WordSectionEventArgs args);
public delegate void StepPanelWordSectionDeletedEvent(object sender, WordSectionEventArgs args);
}