Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2929_PrioritizedGrammarEnumeration/HeuristicLab.ExtLibs/HeuristicLab.AvalonEdit/5.0.1/AvalonEdit-5.0.1/Snippets/SnippetInputHandler.cs @ 15990

Last change on this file since 15990 was 11700, checked in by jkarder, 10 years ago

#2077: created branch and added first version

File size: 3.1 KB
Line 
1// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
2//
3// Permission is hereby granted, free of charge, to any person obtaining a copy of this
4// software and associated documentation files (the "Software"), to deal in the Software
5// without restriction, including without limitation the rights to use, copy, modify, merge,
6// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
7// to whom the Software is furnished to do so, subject to the following conditions:
8//
9// The above copyright notice and this permission notice shall be included in all copies or
10// substantial portions of the Software.
11//
12// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
13// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
15// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
16// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
17// DEALINGS IN THE SOFTWARE.
18
19using System;
20using System.Collections.Generic;
21using System.Linq;
22using System.Windows.Input;
23
24using ICSharpCode.AvalonEdit.Editing;
25
26namespace ICSharpCode.AvalonEdit.Snippets
27{
28  sealed class SnippetInputHandler : TextAreaStackedInputHandler
29  {
30    readonly InsertionContext context;
31   
32    public SnippetInputHandler(InsertionContext context)
33      : base(context.TextArea)
34    {
35      this.context = context;
36    }
37   
38    public override void Attach()
39    {
40      base.Attach();
41     
42      SelectElement(FindNextEditableElement(-1, false));
43    }
44   
45    public override void Detach()
46    {
47      base.Detach();
48      context.Deactivate(new SnippetEventArgs(DeactivateReason.InputHandlerDetached));
49    }
50   
51    public override void OnPreviewKeyDown(KeyEventArgs e)
52    {
53      base.OnPreviewKeyDown(e);
54      if (e.Key == Key.Escape) {
55        context.Deactivate(new SnippetEventArgs(DeactivateReason.EscapePressed));
56        e.Handled = true;
57      } else if (e.Key == Key.Return) {
58        context.Deactivate(new SnippetEventArgs(DeactivateReason.ReturnPressed));
59        e.Handled = true;
60      } else if (e.Key == Key.Tab) {
61        bool backwards = e.KeyboardDevice.Modifiers == ModifierKeys.Shift;
62        SelectElement(FindNextEditableElement(TextArea.Caret.Offset, backwards));
63        e.Handled = true;
64      }
65    }
66   
67    void SelectElement(IActiveElement element)
68    {
69      if (element != null) {
70        TextArea.Selection = Selection.Create(TextArea, element.Segment);
71        TextArea.Caret.Offset = element.Segment.EndOffset;
72      }
73    }
74   
75    IActiveElement FindNextEditableElement(int offset, bool backwards)
76    {
77      IEnumerable<IActiveElement> elements = context.ActiveElements.Where(e => e.IsEditable && e.Segment != null);
78      if (backwards) {
79        elements = elements.Reverse();
80        foreach (IActiveElement element in elements) {
81          if (offset > element.Segment.EndOffset)
82            return element;
83        }
84      } else {
85        foreach (IActiveElement element in elements) {
86          if (offset < element.Segment.Offset)
87            return element;
88        }
89      }
90      return elements.FirstOrDefault();
91    }
92  }
93}
Note: See TracBrowser for help on using the repository browser.