OSDN Git Service

補完候補のデータ自体を渡したほうが便利だった
[fooeditengine/FooEditEngine.git] / Windows / 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.Forms;
7 using System.Windows.Input;
8 using FooEditEngine;
9
10 namespace FooEditEngine.Windows
11 {
12     /// <summary>
13     /// 自動補完用クラス
14     /// </summary>
15     public class AutoCompleteBox : AutoCompleteBoxBase
16     {
17         private string inputedWord;
18         private ListBox listBox1 = new ListBox();
19         private Document doc;
20
21         /// <summary>
22         /// コンストラクター
23         /// </summary>
24         /// <param name="textbox">対象となるテキストボックス</param>
25         internal AutoCompleteBox(FooTextBox textbox) : base(textbox.Document)
26         {
27             //リストボックスを追加する
28             this.listBox1.MouseDoubleClick += ListBox1_MouseDoubleClick;
29             this.listBox1.KeyDown += listBox1_KeyDown;
30             this.listBox1.Height = 200;
31             this.listBox1.Visible = false;
32             textbox.Controls.Add(this.listBox1);
33             this.doc = textbox.Document;
34         }
35
36         /// <summary>
37         /// オートコンプリートの対象となる単語のリスト
38         /// </summary>
39         public override CompleteCollection<ICompleteItem> Items
40         {
41             get
42             {
43                 return (CompleteCollection<ICompleteItem>)this.listBox1.DataSource;
44         }
45             set
46             {
47                 this.listBox1.DisplayMember = CompleteCollection<ICompleteItem>.ShowMember;
48                 this.listBox1.ValueMember = CompleteCollection<ICompleteItem>.ShowMember;
49                 this.listBox1.DataSource = value;
50             }
51         }
52
53         /// <summary>
54         /// 自動補完リストが表示されているかどうか
55         /// </summary>
56         protected override bool IsCloseCompleteBox
57         {
58             get
59             {
60                 return !this.listBox1.Visible;
61             }
62         }
63
64         /// <summary>
65         /// 補完候補の表示要求を処理する
66         /// </summary>
67         /// <param name="ev"></param>
68         protected override void RequestShowCompleteBox(ShowingCompleteBoxEventArgs ev)
69         {
70             this.inputedWord = ev.inputedWord;
71             this.listBox1.SelectedItem = ((CompleteCollection<ICompleteItem>)this.listBox1.DataSource)[ev.foundIndex];
72             this.listBox1.Visible = true;
73             this.listBox1.Location = ev.CaretPostion;
74         }
75
76         /// <summary>
77         /// 補完候補の非表示要求を処理する
78         /// </summary>
79         protected override void RequestCloseCompleteBox()
80         {
81             this.listBox1.Visible = false;
82         }
83
84         internal bool ProcessKeyPress(FooTextBox textbox, KeyPressEventArgs e)
85         {
86             if (this.isReqForceComplete && e.KeyChar == ' ')
87             {
88                 this.OpenCompleteBox(string.Empty);
89                 return true;
90             } else if (!this.IsCloseCompleteBox && (e.KeyChar == '\r')){
91                 this.RequestCloseCompleteBox();
92                 CompleteWord selWord = (CompleteWord)this.listBox1.SelectedItem;
93                 this.SelectItem(this, new SelectItemEventArgs(selWord, this.inputedWord, this.Document));
94                 textbox.Refresh();
95                 return true;
96             }
97             return false;
98         }
99
100         bool isReqForceComplete = false;
101
102         internal bool ProcessKeyDown(FooTextBox textbox, KeyEventArgs e,bool isCtrl,bool isShift)
103         {
104             if (this.IsCloseCompleteBox)
105             {
106                 if (e.KeyCode == Keys.Space && isCtrl)
107                 {
108                     this.isReqForceComplete = true;
109                     return true;
110                 }
111                 return false;
112             }
113
114             switch (e.KeyCode)
115             {
116                 case Keys.Escape:
117                     this.RequestCloseCompleteBox();
118                     textbox.Focus();
119                     return true;
120                 case Keys.Down:
121                     if (this.listBox1.SelectedIndex + 1 >= this.listBox1.Items.Count)
122                         this.listBox1.SelectedIndex = this.listBox1.Items.Count - 1;
123                     else
124                         this.listBox1.SelectedIndex++;
125                     return true;
126                 case Keys.Up:
127                     if (this.listBox1.SelectedIndex - 1 < 0)
128                         this.listBox1.SelectedIndex = 0;
129                     else
130                         this.listBox1.SelectedIndex--;
131                     return true;
132                 case Keys.Tab:
133                     this.RequestCloseCompleteBox();
134                     CompleteWord selWord = (CompleteWord)this.listBox1.SelectedItem;
135                     this.SelectItem(this, new SelectItemEventArgs(selWord, this.inputedWord, this.Document));
136                     textbox.Refresh();
137                     return true;
138             }
139
140             return false;
141         }
142
143         private void ListBox1_MouseDoubleClick(object sender, MouseEventArgs e)
144         {
145             this.listBox1.Visible = false;
146             CompleteWord selWord = (CompleteWord)this.listBox1.SelectedItem;
147             this.SelectItem(this, new SelectItemEventArgs(selWord, this.inputedWord, this.Document));
148         }
149
150         void listBox1_KeyDown(object sender, KeyEventArgs e)
151         {
152             if (e.KeyCode == Keys.Enter)
153             {
154                 this.listBox1.Visible = false;
155                 CompleteWord selWord = (CompleteWord)this.listBox1.SelectedItem;
156                 this.SelectItem(this, new SelectItemEventArgs(selWord, this.inputedWord, this.Document));
157                 e.Handled = true;
158             }
159         }
160     }
161 }