OSDN Git Service

タブキーでも補完できるようにした
[fooeditengine/FooEditEngine.git] / UWP / FooEditEngine.UWP / AutoCompleteBox.cs
1 using System;
2 using Windows.System;
3 using Windows.UI.Xaml.Controls;
4 using Windows.UI.Xaml.Controls.Primitives;
5 using Windows.UI.Xaml.Input;
6
7 namespace FooEditEngine.UWP
8 {
9     public class AutoCompleteBox : AutoCompleteBoxBase
10     {
11         private string inputedWord;
12         private ListBox listBox1 = new ListBox();
13         private Popup popup = new Popup();
14         private Document doc;
15
16         public const int CompleteListBoxHeight = 200;
17
18         public AutoCompleteBox(Document doc) : base(doc)
19         {
20             //リストボックスを追加する
21             this.popup.Child = this.listBox1;
22             this.listBox1.DoubleTapped += ListBox1_DoubleTapped;
23             this.listBox1.KeyDown += listBox1_KeyDown;
24             this.listBox1.Height = CompleteListBoxHeight;
25             this.doc = doc;
26         }
27
28         /// <summary>
29         /// オートコンプリートの対象となる単語のリスト
30         /// </summary>
31         public override CompleteCollection<ICompleteItem> Items
32         {
33             get
34             {
35                 return (CompleteCollection<ICompleteItem>)this.listBox1.ItemsSource;
36             }
37             set
38             {
39                 this.listBox1.ItemsSource = value;
40                 this.listBox1.DisplayMemberPath = CompleteCollection<ICompleteItem>.ShowMember;
41             }
42         }
43
44         protected override bool IsCloseCompleteBox
45         {
46             get
47             {
48                 return !this.popup.IsOpen;
49             }
50         }
51
52         protected override void RequestShowCompleteBox(ShowingCompleteBoxEventArgs ev)
53         {
54             this.inputedWord = ev.inputedWord;
55             this.listBox1.SelectedIndex = ev.foundIndex;
56             this.listBox1.ScrollIntoView(this.listBox1.SelectedItem);
57             this.popup.IsOpen = true;
58             Canvas.SetLeft(this.popup, ev.CaretPostion.X);
59             Canvas.SetTop(this.popup, ev.CaretPostion.Y);
60         }
61
62         protected override void RequestCloseCompleteBox()
63         {
64             this.popup.IsOpen = false;
65         }
66
67         public bool ProcessKeyDown(FooTextBox textbox, KeyRoutedEventArgs e,bool isCtrl,bool isShift)
68         {
69             if (this.popup.IsOpen == false)
70             {
71                 if (e.Key == VirtualKey.Space && isCtrl)
72                 {
73                     this.OpenCompleteBox(string.Empty);
74                     e.Handled = true;
75
76                     return true;
77                 }
78                 return false;
79             }
80
81             switch (e.Key)
82             {
83                 case VirtualKey.Escape:
84                     this.RequestCloseCompleteBox();
85                     textbox.Focus(Windows.UI.Xaml.FocusState.Programmatic);
86                     e.Handled = true;
87                     return true;
88                 case VirtualKey.Down:
89                     if (this.listBox1.SelectedIndex + 1 >= this.listBox1.Items.Count)
90                         this.listBox1.SelectedIndex = this.listBox1.Items.Count - 1;
91                     else
92                         this.listBox1.SelectedIndex++;
93                     this.listBox1.ScrollIntoView(this.listBox1.SelectedItem);
94                     e.Handled = true;
95                     return true;
96                 case VirtualKey.Up:
97                     if (this.listBox1.SelectedIndex - 1 < 0)
98                         this.listBox1.SelectedIndex = 0;
99                     else
100                         this.listBox1.SelectedIndex--;
101                     this.listBox1.ScrollIntoView(this.listBox1.SelectedItem);
102                     e.Handled = true;
103                     return true;
104                 case VirtualKey.Tab:
105                 case VirtualKey.Enter:
106                     this.RequestCloseCompleteBox();
107                     CompleteWord selWord = (CompleteWord)this.listBox1.SelectedItem;
108                     this.SelectItem(this, new SelectItemEventArgs(selWord.word, this.inputedWord, this.Document));
109                     e.Handled = true;
110                     return true;
111             }
112
113             return false;
114         }
115
116         private void ListBox1_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
117         {
118             this.popup.IsOpen = false;
119             CompleteWord selWord = (CompleteWord)this.listBox1.SelectedItem;
120             this.SelectItem(this, new SelectItemEventArgs(selWord.word, this.inputedWord, this.Document));
121         }
122
123         void listBox1_KeyDown(object sender, KeyRoutedEventArgs e)
124         {
125             if (e.Key == VirtualKey.Enter)
126             {
127                 this.popup.IsOpen = false;
128                 CompleteWord selWord = (CompleteWord)this.listBox1.SelectedItem;
129                 this.SelectItem(this, new SelectItemEventArgs(selWord.word, this.inputedWord, this.Document));
130                 e.Handled = true;
131             }
132         }
133     }
134 }