public bool OnProcessDialogKey(UIKeyEventArgs e)
{
UIKeys keyData = (UIKeys)e.KeyData;
SetCaretState(true);
if (isInVerticalPhase && (keyData != UIKeys.Up || keyData != UIKeys.Down))
{
isInVerticalPhase = false;
}
switch (e.KeyCode)
{
case UIKeys.Home:
{
OnKeyDown(e);
return(true);
}
case UIKeys.Return:
{
if (textSurfaceEventListener != null &&
TextSurfaceEventListener.NotifyPreviewEnter(textSurfaceEventListener))
{
return(true);
}
if (isMultiLine)
{
if (internalTextLayerController.SelectionRange != null)
{
InvalidateGraphicLocalArea(this, GetSelectionUpdateArea());
}
internalTextLayerController.SplitCurrentLineIntoNewLine();
if (textSurfaceEventListener != null)
{
TextSurfaceEventListener.NofitySplitNewLine(textSurfaceEventListener, e);
}
Rectangle lineArea = internalTextLayerController.CurrentLineArea;
if (lineArea.Bottom > this.ViewportBottom)
{
ScrollBy(0, lineArea.Bottom - this.ViewportBottom);
}
else
{
InvalidateGraphicOfCurrentLineArea();
}
EnsureCaretVisible();
return(true);
}
return(true);
}
case UIKeys.Left:
{
if (textSurfaceEventListener != null &&
TextSurfaceEventListener.NotifyPreviewArrow(textSurfaceEventListener, keyData))
{
return(true);
}
InvalidateGraphicOfCurrentLineArea();
if (!e.Shift)
{
internalTextLayerController.CancelSelect();
}
else
{
internalTextLayerController.StartSelectIfNoSelection();
}
Point currentCaretPos = Point.Empty;
if (!isMultiLine)
{
while (!internalTextLayerController.IsOnStartOfLine)
{
Point prvCaretPos = internalTextLayerController.CaretPos;
internalTextLayerController.CharIndex--;
currentCaretPos = internalTextLayerController.CaretPos;
if (currentCaretPos.X != prvCaretPos.X)
{
break;
}
}
}
else
{
if (internalTextLayerController.IsOnStartOfLine)
{
internalTextLayerController.CharIndex--;
currentCaretPos = internalTextLayerController.CaretPos;
}
else
{
while (!internalTextLayerController.IsOnStartOfLine)
{
Point prvCaretPos = internalTextLayerController.CaretPos;
internalTextLayerController.CharIndex--;
currentCaretPos = internalTextLayerController.CaretPos;
if (currentCaretPos.X != prvCaretPos.X)
{
break;
}
}
}
}
//-------------------
if (e.Shift)
{
internalTextLayerController.EndSelectIfNoSelection();
}
//-------------------
EnsureCaretVisible();
if (textSurfaceEventListener != null)
{
TextSurfaceEventListener.NotifyArrowKeyCaretPosChanged(textSurfaceEventListener, keyData);
}
return(true);
}
case UIKeys.Right:
{
if (textSurfaceEventListener != null &&
TextSurfaceEventListener.NotifyPreviewArrow(textSurfaceEventListener, keyData))
{
return(true);
}
InvalidateGraphicOfCurrentLineArea();
if (!e.Shift)
{
internalTextLayerController.CancelSelect();
}
else
{
internalTextLayerController.StartSelectIfNoSelection();
}
Point currentCaretPos = Point.Empty;
if (!isMultiLine)
{
while (!internalTextLayerController.IsOnEndOfLine)
{
Point prvCaretPos = internalTextLayerController.CaretPos;
internalTextLayerController.CharIndex++;
currentCaretPos = internalTextLayerController.CaretPos;
if (currentCaretPos.X != prvCaretPos.X)
{
int nextCharWidth = internalTextLayerController.GetNextCharacterWidth();
if (nextCharWidth > 0)
{
break;
}
}
}
}
else
{
if (internalTextLayerController.IsOnEndOfLine)
{
internalTextLayerController.CharIndex++;
currentCaretPos = internalTextLayerController.CaretPos;
}
else
{
while (!internalTextLayerController.IsOnEndOfLine)
{
Point prvCaretPos = internalTextLayerController.CaretPos;
internalTextLayerController.CharIndex++;
currentCaretPos = internalTextLayerController.CaretPos;
if (currentCaretPos.X != prvCaretPos.X)
{
//forward check next caret
int nextCharWidth = internalTextLayerController.GetNextCharacterWidth();
if (nextCharWidth > 0)
{
break;
}
}
}
}
}
//-------------------
if (e.Shift)
{
internalTextLayerController.EndSelectIfNoSelection();
}
//-------------------
EnsureCaretVisible();
if (textSurfaceEventListener != null)
{
TextSurfaceEventListener.NotifyArrowKeyCaretPosChanged(textSurfaceEventListener, keyData);
}
return(true);
}
case UIKeys.Down:
{
if (textSurfaceEventListener != null &&
TextSurfaceEventListener.NotifyPreviewArrow(textSurfaceEventListener, keyData))
{
return(true);
}
if (isMultiLine)
{
if (!isInVerticalPhase)
{
isInVerticalPhase = true;
verticalExpectedCharIndex = internalTextLayerController.CharIndex;
}
//----------------------------
if (!e.Shift)
{
internalTextLayerController.CancelSelect();
}
else
{
internalTextLayerController.StartSelectIfNoSelection();
}
//----------------------------
internalTextLayerController.CurrentLineNumber++;
if (verticalExpectedCharIndex > internalTextLayerController.CurrentLineCharCount - 1)
{
internalTextLayerController.CharIndex = internalTextLayerController.CurrentLineCharCount - 1;
}
else
{
internalTextLayerController.CharIndex = verticalExpectedCharIndex;
}
//----------------------------
if (e.Shift)
{
internalTextLayerController.EndSelectIfNoSelection();
}
//----------------------------
Rectangle lineArea = internalTextLayerController.CurrentLineArea;
if (lineArea.Bottom > this.ViewportBottom)
{
ScrollBy(0, lineArea.Bottom - this.ViewportBottom);
}
else
{
InvalidateGraphicOfCurrentLineArea();
}
}
if (textSurfaceEventListener != null)
{
TextSurfaceEventListener.NotifyArrowKeyCaretPosChanged(textSurfaceEventListener, keyData);
}
return(true);
}
case UIKeys.Up:
{
if (textSurfaceEventListener != null &&
TextSurfaceEventListener.NotifyPreviewArrow(textSurfaceEventListener, keyData))
{
return(true);
}
if (isMultiLine)
{
if (!isInVerticalPhase)
{
isInVerticalPhase = true;
verticalExpectedCharIndex = internalTextLayerController.CharIndex;
}
//----------------------------
if (!e.Shift)
{
internalTextLayerController.CancelSelect();
}
else
{
internalTextLayerController.StartSelectIfNoSelection();
}
//----------------------------
internalTextLayerController.CurrentLineNumber--;
if (verticalExpectedCharIndex > internalTextLayerController.CurrentLineCharCount - 1)
{
internalTextLayerController.CharIndex = internalTextLayerController.CurrentLineCharCount - 1;
}
else
{
internalTextLayerController.CharIndex = verticalExpectedCharIndex;
}
//----------------------------
if (e.Shift)
{
internalTextLayerController.EndSelectIfNoSelection();
}
Rectangle lineArea = internalTextLayerController.CurrentLineArea;
if (lineArea.Top < ViewportY)
{
ScrollBy(0, lineArea.Top - ViewportY);
}
else
{
EnsureCaretVisible();
InvalidateGraphicOfCurrentLineArea();
}
}
else
{
}
if (textSurfaceEventListener != null)
{
TextSurfaceEventListener.NotifyArrowKeyCaretPosChanged(textSurfaceEventListener, keyData);
}
return(true);
}
case UIKeys.Tab:
{
DoTab();
return(true);
}
default:
{
return(false);
}
}
}