This commit is contained in:
parent
c3ea5c84f9
commit
408ba2ff26
@ -581,6 +581,151 @@ namespace Volian.Controls.Library
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endregion
|
#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.Columns - 1) 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);
|
||||||
|
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.Columns) 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) 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]);
|
||||||
|
// RNOs: Use PMode (column)
|
||||||
|
if (lookAtRNO && ii.RNOs != null && ii.RNOLevel >= ii.Columns - 1) return TopPart(ii.RNOs[0]);
|
||||||
|
// Nextsibling - go to top part of sibling
|
||||||
|
if (ii.NextItems != null) 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))]
|
[TypeConverter(typeof(ExpandableObjectConverter))]
|
||||||
public partial class StepPanelSettings
|
public partial class StepPanelSettings
|
||||||
|
@ -305,7 +305,7 @@ namespace Volian.Controls.Library
|
|||||||
}
|
}
|
||||||
private void AddSymbol(string str)
|
private void AddSymbol(string str)
|
||||||
{
|
{
|
||||||
MessageBox.Show(SelectedRtf);
|
//MessageBox.Show(SelectedRtf);
|
||||||
SelectedRtf = @"{\rtf1{\fonttbl{\f0\fcharset0 Arial Unicode MS;}}\f0\fs" + this.Font.SizeInPoints * 2 + " " + /* ConvertUnicodeChar(str) */ str + @"}";
|
SelectedRtf = @"{\rtf1{\fonttbl{\f0\fcharset0 Arial Unicode MS;}}\f0\fs" + this.Font.SizeInPoints * 2 + " " + /* ConvertUnicodeChar(str) */ str + @"}";
|
||||||
}
|
}
|
||||||
private void AddRtfLink(displayLinkElement myDisplayLinkElement)
|
private void AddRtfLink(displayLinkElement myDisplayLinkElement)
|
||||||
@ -435,6 +435,7 @@ namespace Volian.Controls.Library
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
#region EventSupport
|
#region EventSupport
|
||||||
|
|
||||||
#region LinkEvents
|
#region LinkEvents
|
||||||
private StepPanelLinkEventArgs _MyLinkClickedEventArgs;
|
private StepPanelLinkEventArgs _MyLinkClickedEventArgs;
|
||||||
public event StepRTBLinkEvent LinkChanged;
|
public event StepRTBLinkEvent LinkChanged;
|
||||||
@ -486,7 +487,7 @@ namespace Volian.Controls.Library
|
|||||||
private bool IsControlChar = false;
|
private bool IsControlChar = false;
|
||||||
void StepRTB_KeyDown(object sender, KeyEventArgs e)
|
void StepRTB_KeyDown(object sender, KeyEventArgs e)
|
||||||
{
|
{
|
||||||
if (e.Modifiers == Keys.Control)
|
if (e.Control)
|
||||||
{
|
{
|
||||||
IsControlChar = true;
|
IsControlChar = true;
|
||||||
switch (e.KeyCode)
|
switch (e.KeyCode)
|
||||||
@ -496,13 +497,63 @@ namespace Volian.Controls.Library
|
|||||||
|
|
||||||
// check if insertable?
|
// check if insertable?
|
||||||
Console.WriteLine(String.Format("in switch, keydata = {0}, keyvalue = {1}, buff = {2}", e.KeyData, e.KeyValue, buff));
|
Console.WriteLine(String.Format("in switch, keydata = {0}, keyvalue = {1}, buff = {2}", e.KeyData, e.KeyValue, buff));
|
||||||
|
return;
|
||||||
|
case Keys.Home:
|
||||||
|
StepRTB_HomeEndPressed(e);
|
||||||
|
e.Handled = true;
|
||||||
|
break;
|
||||||
|
case Keys.End:
|
||||||
|
StepRTB_HomeEndPressed(e);
|
||||||
|
e.Handled = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
switch (e.KeyCode)
|
switch (e.KeyCode)
|
||||||
{
|
{
|
||||||
|
case Keys.Left:
|
||||||
|
if (e.Control || SelectionStart == 0)
|
||||||
|
{
|
||||||
|
StepRTB_ArrowPressed(e.Control ? E_ArrowKeys.CtrlLeft : E_ArrowKeys.Left);
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Keys.Up:
|
||||||
|
int ln = GetLineFromCharIndex(SelectionStart);
|
||||||
|
if (e.Control || ln == 0)
|
||||||
|
{
|
||||||
|
StepRTB_ArrowPressed(e.Control ? E_ArrowKeys.CtrlUp : E_ArrowKeys.Up);
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Keys.Right:
|
||||||
|
if (e.Control || SelectionStart == this.Text.Length)
|
||||||
|
{
|
||||||
|
StepRTB_ArrowPressed(e.Control ? E_ArrowKeys.CtrlRight : E_ArrowKeys.Right);
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Keys.Down:
|
||||||
|
int l = GetLineFromCharIndex(SelectionStart);
|
||||||
|
Point pos = new Point();
|
||||||
|
pos.X = ClientRectangle.Width;
|
||||||
|
pos.Y = ClientRectangle.Height;
|
||||||
|
int lastIndex = this.GetCharIndexFromPosition(pos);
|
||||||
|
int lastLine = this.GetLineFromCharIndex(lastIndex);
|
||||||
|
|
||||||
|
if (e.Control || l == lastLine)
|
||||||
|
{
|
||||||
|
StepRTB_ArrowPressed(e.Control ? E_ArrowKeys.CtrlDown : E_ArrowKeys.Down);
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Keys.PageUp:
|
||||||
|
StepRTB_PageKeyPressed(e);
|
||||||
|
e.Handled = true;
|
||||||
|
break;
|
||||||
|
case Keys.PageDown:
|
||||||
|
StepRTB_PageKeyPressed(e);
|
||||||
|
e.Handled = true;
|
||||||
|
break;
|
||||||
case Keys.Delete:
|
case Keys.Delete:
|
||||||
// if it's just a link, delete the link. if the text has embedded links, i.e. text and links
|
// if it's just a link, delete the link. if the text has embedded links, i.e. text and links
|
||||||
// use DeleteTextAndLink to delete it (just setting selectedrtf to "" fails because of the
|
// use DeleteTextAndLink to delete it (just setting selectedrtf to "" fails because of the
|
||||||
@ -547,8 +598,23 @@ namespace Volian.Controls.Library
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private void StepRTB_HomeEndPressed(KeyEventArgs keyargs)
|
||||||
|
{
|
||||||
|
if (MyItemInfo.IsProcedure || MyItemInfo.IsSection) return;
|
||||||
|
// Cursor moves out of box only if control is pressed too - otherwise key is
|
||||||
|
// handled in rtb.
|
||||||
|
if (keyargs.Control)_MyStepItem.MyStepPanel.StepCursorKeys(this, keyargs);
|
||||||
|
}
|
||||||
|
private void StepRTB_PageKeyPressed(KeyEventArgs keyargs)
|
||||||
|
{
|
||||||
|
if (MyItemInfo.IsProcedure || MyItemInfo.IsSection) return;
|
||||||
|
_MyStepItem.MyStepPanel.StepCursorKeys(this, keyargs);
|
||||||
|
}
|
||||||
|
private void StepRTB_ArrowPressed(E_ArrowKeys key)
|
||||||
|
{
|
||||||
|
Point cp = PointToClient(Cursor.Position);
|
||||||
|
_MyStepItem.MyStepPanel.CursorMovement(this, cp, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DeleteTextAndLink()
|
private void DeleteTextAndLink()
|
||||||
{
|
{
|
||||||
int start = SelectionStart;
|
int start = SelectionStart;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user