OSDN Git Service

レンダー再作成時にDirectWriteのリソースも再作成するようにした
[fooeditengine/FooEditEngine.git] / WPF / FooEditEngine / AutoCompleteBox.cs
1 using System;
2 using System.Linq;
3 using System.Collections.Generic;
4 using System.Text;
5 using System.Windows;
6 using System.Windows.Controls;
7 using System.Windows.Controls.Primitives;
8 using System.Windows.Input;
9 using FooEditEngine;
10
11 namespace FooEditEngine.WPF
12 {
13     /// <summary>
14     /// 自動補完用クラス
15     /// </summary>
16     public class AutoCompleteBox : AutoCompleteBoxBase
17     {
18         private string inputedWord;
19         private ListBox listBox1 = new ListBox();
20         private Popup popup;
21         private Document doc;
22
23         /// <summary>
24         /// コンストラクター
25         /// </summary>
26         /// <param name="doc">ドキュメント</param>
27         public AutoCompleteBox(Document doc) : base(doc)
28         {
29             //リストボックスを追加する
30             this.listBox1.MouseDoubleClick += listBox1_MouseDoubleClick;
31             this.listBox1.KeyDown += listBox1_KeyDown;
32             this.listBox1.Height = 200;
33             this.doc = doc;
34         }
35
36         /// <summary>
37         /// オートコンプリートの対象となる単語のリスト
38         /// </summary>
39         public override CompleteCollection<ICompleteItem> Items
40         {
41             get
42             {
43                 return (CompleteCollection<ICompleteItem>)this.listBox1.ItemsSource;
44             }
45             set
46             {
47                 this.listBox1.ItemsSource = value;
48                 this.listBox1.DisplayMemberPath = CompleteCollection<ICompleteItem>.ShowMember;
49             }
50         }
51
52         /// <summary>
53         /// 自動補完リストが表示されているかどうか
54         /// </summary>
55         protected override bool IsCloseCompleteBox
56         {
57             get
58             {
59                 return !this.popup.IsOpen;
60             }
61         }
62
63         internal Popup TargetPopup
64         {
65             get
66             {
67                 return this.popup;
68             }
69             set
70             {
71                 this.popup = value;
72                 this.popup.Child = this.listBox1;
73                 this.popup.Height = 200;
74             }
75         }
76
77         /// <summary>
78         /// 補完候補の表示要求を処理する
79         /// </summary>
80         /// <param name="ev"></param>
81         protected override void RequestShowCompleteBox(ShowingCompleteBoxEventArgs ev)
82         {
83             this.inputedWord = ev.inputedWord;
84             this.listBox1.SelectedIndex = ev.foundIndex;
85             this.listBox1.ScrollIntoView(this.listBox1.SelectedItem);
86             this.popup.Placement = PlacementMode.Absolute;
87             this.popup.PlacementRectangle = new Rect(ev.CaretPostion, new Size(listBox1.ActualWidth, listBox1.Height));
88             this.popup.IsOpen = true;
89         }
90
91         /// <summary>
92         /// 補完候補の非表示要求を処理する
93         /// </summary>
94         protected override void RequestCloseCompleteBox()
95         {
96             this.popup.IsOpen = false;
97         }
98
99         void DecideListBoxLocation(Document doc, ListBox listbox, Point p)
100         {
101         }
102
103         internal bool ProcessKeyDown(FooTextBox textbox, KeyEventArgs e,bool isCtrl,bool isShift)
104         {
105             if (this.popup.IsOpen == false)
106             {
107                 if (e.Key == Key.Space && isCtrl)
108                 {
109                     this.OpenCompleteBox(string.Empty);
110                     e.Handled = true;
111
112                     return true;
113                 }
114                 return false;
115             }
116
117             switch (e.Key)
118             {
119                 case Key.Escape:
120                     this.RequestCloseCompleteBox();
121                     textbox.Focus();
122                     e.Handled = true;
123                     return true;
124                 case Key.Down:
125                     if (this.listBox1.SelectedIndex + 1 >= this.listBox1.Items.Count)
126                         this.listBox1.SelectedIndex = this.listBox1.Items.Count - 1;
127                     else
128                         this.listBox1.SelectedIndex++;
129                     this.listBox1.ScrollIntoView(this.listBox1.SelectedItem);
130                     e.Handled = true;
131                     return true;
132                 case Key.Up:
133                     if (this.listBox1.SelectedIndex - 1 < 0)
134                         this.listBox1.SelectedIndex = 0;
135                     else
136                         this.listBox1.SelectedIndex--;
137                     this.listBox1.ScrollIntoView(this.listBox1.SelectedItem);
138                     e.Handled = true;
139                     return true;
140                 case Key.Tab:
141                 case Key.Enter:
142                     this.RequestCloseCompleteBox();
143                     CompleteWord selWord = (CompleteWord)this.listBox1.SelectedItem;
144                     this.SelectItem(this, new SelectItemEventArgs(selWord, this.inputedWord, this.Document));
145                     e.Handled = true;
146                     return true;
147             }
148
149             return false;
150         }
151
152         private void listBox1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
153         {
154             this.popup.IsOpen = false;
155             CompleteWord selWord = (CompleteWord)this.listBox1.SelectedItem;
156             this.SelectItem(this, new SelectItemEventArgs(selWord, this.inputedWord, this.Document));
157         }
158
159         void listBox1_KeyDown(object sender, KeyEventArgs e)
160         {
161             if (e.Key == Key.Enter)
162             {
163                 this.popup.IsOpen = false;
164                 CompleteWord selWord = (CompleteWord)this.listBox1.SelectedItem;
165                 this.SelectItem(this, new SelectItemEventArgs(selWord, this.inputedWord, this.Document));
166                 e.Handled = true;
167             }
168         }
169     }
170 }