blob: 6a8de2e88738b80fcbd1600813ad8b23d8a7d89d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-s// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Linq;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Input;
using Tango.Scripting.Editors.Document;
using Tango.Scripting.Editors.Editing;
namespace Tango.Scripting.Editors.Snippets
{
sealed class SnippetInputHandler : TextAreaStackedInputHandler
{
readonly InsertionContext context;
public SnippetInputHandler(InsertionContext context)
: base(context.TextArea)
{
this.context = context;
}
public override void Attach()
{
base.Attach();
SelectElement(FindNextEditableElement(-1, false));
}
public override void Detach()
{
base.Detach();
context.Deactivate(new SnippetEventArgs(DeactivateReason.InputHandlerDetached));
}
public override void OnPreviewKeyDown(KeyEventArgs e)
{
base.OnPreviewKeyDown(e);
if (e.Key == Key.Escape) {
context.Deactivate(new SnippetEventArgs(DeactivateReason.EscapePressed));
e.Handled = true;
} else if (e.Key == Key.Return) {
context.Deactivate(new SnippetEventArgs(DeactivateReason.ReturnPressed));
e.Handled = true;
} else if (e.Key == Key.Tab) {
bool backwards = e.KeyboardDevice.Modifiers == ModifierKeys.Shift;
SelectElement(FindNextEditableElement(TextArea.Caret.Offset, backwards));
e.Handled = true;
}
}
void SelectElement(IActiveElement element)
{
if (element != null) {
TextArea.Selection = Selection.Create(TextArea, element.Segment);
TextArea.Caret.Offset = element.Segment.EndOffset;
}
}
IActiveElement FindNextEditableElement(int offset, bool backwards)
{
IEnumerable<IActiveElement> elements = context.ActiveElements.Where(e => e.IsEditable && e.Segment != null);
if (backwards) {
elements = elements.Reverse();
foreach (IActiveElement element in elements) {
if (offset > element.Segment.EndOffset)
return element;
}
} else {
foreach (IActiveElement element in elements) {
if (offset < element.Segment.Offset)
return element;
}
}
return elements.FirstOrDefault();
}
}
}
|