OSDN Git Service

a873486eb85c4c09debfc92feed5face4d7d1676
[kybernetes/Kybernetes.git] / KyberNetes / view / BaseForm.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Windows.Forms;\r
4 using com.andoutomo.kybernetes.control;\r
5 using com.andoutomo.kybernetes.data.DAO;\r
6 using System.Drawing;\r
7 \r
8 \r
9 namespace com.andoutomo.kybernetes.view\r
10 {\r
11     public partial class BaseForm : Form\r
12     {\r
13         public BaseForm()\r
14         {\r
15             InitializeComponent();\r
16 \r
17             List<string> initialText = new List<string>();\r
18             initialText.Add("#####################################################");\r
19             initialText.Add("# " + AppInfoContainer.Title + " " + AppInfoContainer.Description);\r
20             initialText.Add("# Version " + AppInfoContainer.VersionNo);\r
21             initialText.Add("# " + AppInfoContainer.CopyRight);\r
22             initialText.Add("# ");\r
23             initialText.Add("#####################################################");\r
24             addMultiText(initialText);\r
25 \r
26             addPrompt();\r
27             history = new CmdHistory();\r
28 \r
29             this.Text = AppInfoContainer.Title + " " + AppInfoContainer.Description;\r
30             Echo = true;\r
31             \r
32 \r
33         }\r
34         private CmdHistory history;\r
35 \r
36         /// <summary>\r
37         /// カテゴリ設定ダイアログを表示します。\r
38         /// </summary>\r
39         /// <param name="arg"></param>\r
40         internal void invokeCategSettingDialog(List<CategoryData> arg)\r
41         {\r
42             CategorySetting categSetting = new CategorySetting();\r
43             categSetting.StartPosition = FormStartPosition.CenterParent;\r
44             categSetting.setCategoryList(arg);\r
45             categSetting.ShowDialog();\r
46         }\r
47 \r
48         /// <summary>\r
49         /// バージョン情報を表示します\r
50         /// </summary>\r
51         internal void invokeCreditDialog()\r
52         {\r
53             Credit creditForm = new Credit();\r
54             creditForm.StartPosition = FormStartPosition.CenterParent;\r
55             \r
56             creditForm.ShowDialog();\r
57         }\r
58         /// <summary>\r
59         /// エクスポート用のファイルダイアログを開いて選択したファイルパスを返します。\r
60         /// </summary>\r
61         /// <returns></returns>\r
62         internal string invokeExpDialog()\r
63         {\r
64             DialogResult result =this.expData.ShowDialog();\r
65             if (result == DialogResult.OK)\r
66             {\r
67                 return this.expData.FileName;\r
68             }\r
69             else\r
70             {\r
71                 return string.Empty;\r
72             }\r
73         }\r
74         /// <summary>\r
75         /// ダンプ用のファイルダイアログを開いて選択したファイルパスを返します。\r
76         /// </summary>\r
77         /// <returns></returns>\r
78         internal string invokeDmpDialog()\r
79         {\r
80             DialogResult result = this.dmpData.ShowDialog();\r
81             if (result == DialogResult.OK)\r
82             {\r
83                 return this.dmpData.FileName;\r
84             }\r
85             return string.Empty;\r
86         }\r
87 \r
88         /// <summary>\r
89         /// タイムエリア設定画面を表示します。\r
90         /// </summary>\r
91         /// <param name="arg"></param>\r
92         internal void invokeTimeareaSettingDialog(List<TimeAreaData> arg)\r
93         {\r
94             TimeAreaSetting setting = new TimeAreaSetting();\r
95             setting.StartPosition = FormStartPosition.CenterParent;\r
96             setting.setTimeareaList(arg);\r
97             setting.ShowDialog();\r
98         }\r
99 \r
100         /// <summary>\r
101         /// コンソールに文字列を表示します。\r
102         /// </summary>\r
103         /// <param name="args">表示したい文字列</param>\r
104         internal void addText(string args)\r
105         {\r
106             rConsole.AppendText(args + System.Environment.NewLine);\r
107             KybernetesLogger.Log.trace(args);\r
108         }\r
109 \r
110         /// <summary>\r
111         /// コンソールに複数文章を追加します。\r
112         /// </summary>\r
113         /// <param name="messages">追加したい文章群</param>\r
114         internal void addMultiText(List<string> messages)\r
115         {\r
116             foreach (string message in messages)\r
117             {\r
118                 addText(message);\r
119             }\r
120             rConsole.AppendText(System.Environment.NewLine);\r
121         }\r
122         private void addPrompt()\r
123         {\r
124             rConsole.AppendText("> ");\r
125         }\r
126 \r
127         internal int getPanelSize()\r
128         {\r
129             return this.pnlTask.Width;\r
130         }\r
131         /// <summary>\r
132         /// コンソールをクリアします。\r
133         /// </summary>\r
134         internal void clearText()\r
135         {\r
136             rConsole.Clear();\r
137         }\r
138 \r
139         private bool exitSwitch = false;\r
140         internal bool ExitSwitch\r
141         {\r
142             set { exitSwitch = value; }\r
143         }\r
144 \r
145         private int lastRow=17;\r
146         /// <summary>\r
147         /// パネルを追加します。\r
148         /// </summary>\r
149         /// <param name="data"></param>\r
150         internal void addPanel(TaskData data)\r
151         {\r
152             Panel targetPanel = new PanelController(this).createRow(lastRow,data);\r
153             \r
154             pnlTask.Controls.Add(targetPanel);\r
155             lastRow += targetPanel.Height-1;\r
156         }\r
157 \r
158         /// <summary>\r
159         /// パネルがダブルクリックされた時に対応します。IDをテキストボックスに転記します。\r
160         /// </summary>\r
161         /// <param name="data"></param>\r
162         internal void AddIDToText(string data)\r
163         {\r
164             this.txtInput.Text += data + " ";\r
165             txtInput.Focus();\r
166             this.txtInput.Select(this.txtInput.Text.Length, 0);\r
167 \r
168         }\r
169 \r
170         /// <summary>\r
171         /// パネルをクリアします。\r
172         /// </summary>\r
173         internal void clearPanel()\r
174         {\r
175 \r
176             int dummy = pnlTask.Controls.Count;\r
177             for (int h = dummy; h > 0; h--)\r
178             {\r
179                 Control ctrl = pnlTask.Controls[h - 1];\r
180                 for (int i = ctrl.Controls.Count; i > 0; i--)\r
181                 {\r
182                     ctrl.Controls[i - 1].Dispose();\r
183                 }\r
184                 \r
185                 ctrl.Dispose();\r
186             }\r
187 \r
188             //pnlTask.Controls.Clear();\r
189 \r
190             //先頭行は足す\r
191             pnlTask.Controls.Add(new CaptionPanelController().createRow(this.pnlTask.Width));\r
192             lastRow = 17;\r
193             \r
194         }\r
195         /// <summary>\r
196         /// コマンド内容を表示するかどうかを決定します。\r
197         /// </summary>\r
198         internal bool Echo\r
199         {\r
200             get;\r
201             set;\r
202         }\r
203         /// <summary>\r
204         /// コマンド入力を受け付けます。\r
205         /// </summary>\r
206         /// <param name="sender"></param>\r
207         /// <param name="e"></param>\r
208         private void txtInput_KeyDown(object sender, KeyEventArgs e)\r
209         {\r
210             int currentYPosition;\r
211             int currentScrollHeight = this.pnlTask.Height - 20;\r
212             switch (e.KeyCode)\r
213             {\r
214                 case Keys.Enter:\r
215                     e.SuppressKeyPress = true;\r
216                     doCommand();\r
217                     \r
218                     break;\r
219 \r
220                 case Keys.Space:\r
221                     if (e.Control)\r
222                     {\r
223                         e.SuppressKeyPress = true;\r
224                         if (txtInput.ImeMode == ImeMode.Off)\r
225                         {\r
226                             txtInput.ImeMode = ImeMode.On;\r
227                         }\r
228                         else\r
229                         {\r
230                             txtInput.ImeMode = ImeMode.Off;\r
231                         }\r
232                     }\r
233                     break;\r
234                 case Keys.Escape:\r
235                     e.SuppressKeyPress = true;\r
236                     history.resetPosition();\r
237                     txtInput.Clear();\r
238                     break;\r
239                 case Keys.Up:\r
240                     e.SuppressKeyPress = true;\r
241                     txtInput.Text = history.prevCommand();\r
242                     txtInput.Select(this.txtInput.Text.Length, 0);\r
243                     break;\r
244                 case Keys.Down:\r
245                     e.SuppressKeyPress = true;\r
246                     txtInput.Text = history.nextCommand();\r
247                     txtInput.Select(this.txtInput.Text.Length, 0);\r
248                     break;\r
249 \r
250                 case Keys.PageDown:\r
251                         currentYPosition = Math.Abs(this.pnlTask.AutoScrollPosition.Y);\r
252                         this.pnlTask.AutoScrollPosition = new Point(0, currentYPosition + currentScrollHeight);\r
253                     break;\r
254 \r
255                 case Keys.PageUp:\r
256                         currentYPosition = Math.Abs(this.pnlTask.AutoScrollPosition.Y);\r
257                         this.pnlTask.AutoScrollPosition = new Point(0, currentYPosition - currentScrollHeight);\r
258                     break;\r
259             }\r
260         }\r
261         /// <summary>\r
262         /// コマンドを実行します\r
263         /// </summary>\r
264         private void doCommand()\r
265         {\r
266             rConsole.Focus();\r
267             \r
268             if (Echo)\r
269             {\r
270                 addText(txtInput.Text);\r
271             }\r
272             KybernetesLogger.Log.trace("[dispatch]" + txtInput.Text);\r
273             CmdDispatcher dispatcher = CmdDispatcher.getDispatcher(this);\r
274             \r
275             string result = dispatcher.dispatch(txtInput.Text.Trim());\r
276             if (!string.IsNullOrEmpty(result))\r
277             {\r
278                 addText(result);\r
279             }\r
280 \r
281             addPrompt();\r
282             if (!string.IsNullOrEmpty(txtInput.Text))\r
283             {\r
284                 history.stackCmd(txtInput.Text);\r
285             }\r
286             txtInput.Clear();\r
287             txtInput.ImeMode = ImeMode.Off;\r
288             panelResize();\r
289             if (exitSwitch == true)\r
290             {\r
291                 this.Close();\r
292             }\r
293             txtInput.Focus();\r
294         }\r
295 \r
296         /// <summary>\r
297         /// 文字入力ボックスを表示します。\r
298         /// </summary>\r
299         /// <param name="prompt"></param>\r
300         /// <returns></returns>\r
301         internal string showInputBox(string prompt)\r
302         {\r
303             return this.showInputBox(prompt, string.Empty);\r
304         }\r
305         /// <summary>\r
306         /// 文字入力ボックスを表示します。\r
307         /// </summary>\r
308         /// <param name="prompt"></param>\r
309         /// <param name="defaultData"></param>\r
310         /// <returns></returns>\r
311         internal string showInputBox(string prompt, string defaultData)\r
312         {\r
313             return showInputBox(prompt, defaultData, ImeMode.Off);\r
314         }\r
315         /// <summary>\r
316         /// 文字入力ボックスを表示します。\r
317         /// </summary>\r
318         /// <param name="prompt"></param>\r
319         /// <param name="defaultData"></param>\r
320         /// <param name="imeMode"></param>\r
321         /// <returns></returns>\r
322         internal string showInputBox(string prompt, string defaultData, ImeMode imeMode)\r
323         {\r
324             InputBox inputBox = new InputBox(prompt, defaultData);\r
325             inputBox.StartPosition = FormStartPosition.CenterParent;\r
326             inputBox.ImeMode = imeMode;\r
327             inputBox.Owner = this;\r
328 \r
329 \r
330             DialogResult res = inputBox.ShowDialog();\r
331             if (res == DialogResult.OK)\r
332             {\r
333                 return InputDialogData;\r
334             }\r
335             return null;\r
336         }\r
337         /// <summary>\r
338         /// 文字入力ボックスを表示します。\r
339         /// </summary>\r
340         /// <param name="prompt"></param>\r
341         /// <param name="imeMode"></param>\r
342         /// <returns></returns>\r
343         internal string showInputBox(string prompt, ImeMode imeMode)\r
344         {\r
345             return showInputBox(prompt, string.Empty, imeMode);\r
346         }\r
347 \r
348         /// <summary>\r
349         /// 文字入力ボックスを表示します。プロンプトなし版です。\r
350         /// </summary>\r
351         /// <returns></returns>\r
352         internal string showInputBox()\r
353         {\r
354             return showInputBox("");\r
355         }\r
356 \r
357 \r
358         /// <summary>\r
359         /// プロンプトで指定した値を(プロンプトがここに)格納します。\r
360         /// </summary>\r
361         internal string InputDialogData\r
362         {\r
363             private get;\r
364             set;\r
365         }\r
366 \r
367         /// <summary>\r
368         /// ドロップダウン式リストを表示します。\r
369         /// </summary>\r
370         /// <param name="prompt"></param>\r
371         /// <returns></returns>\r
372         internal string showDropBoxInputBox(List<SimpleDataBean> list,string prompt)\r
373         {\r
374             DropBoxInputBox inputBox = new DropBoxInputBox(prompt);\r
375             inputBox.StartPosition = FormStartPosition.CenterParent;\r
376             inputBox.setDropData(list);\r
377 \r
378             inputBox.Owner = this;\r
379 \r
380             DialogResult res = inputBox.ShowDialog();\r
381             if (res == DialogResult.OK)\r
382             {\r
383                 return InputDialogData;\r
384             }\r
385             return null;\r
386         }\r
387         /// <summary>\r
388         /// ドロップダウン式リストを表示します。デフォルト表示を追加しています。\r
389         /// </summary>\r
390         /// <param name="list"></param>\r
391         /// <param name="prompt"></param>\r
392         /// <param name="defaultData"></param>\r
393         /// <returns></returns>\r
394         internal string showDropBoxInputBox(List<SimpleDataBean> list, string prompt, string defaultData)\r
395         {\r
396             DropBoxInputBox inputBox = new DropBoxInputBox(prompt,defaultData);\r
397             inputBox.StartPosition = FormStartPosition.CenterParent;\r
398             inputBox.setDropData(list);\r
399 \r
400             inputBox.Owner = this;\r
401 \r
402             DialogResult res = inputBox.ShowDialog();\r
403             if (res == DialogResult.OK)\r
404             {\r
405                 return InputDialogData;\r
406             }\r
407             return null;\r
408         }\r
409 \r
410         /// <summary>\r
411         /// マウスでコンソールをドラッグした時に、選択対象を入力ボックスに追加します。\r
412         /// </summary>\r
413         /// <param name="sender"></param>\r
414         /// <param name="e"></param>\r
415         private void rConsole_MouseUp(object sender, MouseEventArgs e)\r
416         {\r
417             txtInput.Text += rConsole.SelectedText.Trim();\r
418             txtInput.Focus();\r
419             //選択状態を解除する\r
420             this.txtInput.Select(this.txtInput.Text.Length, 0);\r
421             \r
422         }\r
423         /// <summary>\r
424         /// ウィンドウ全体のサイズ変更時イベントハンドラです。\r
425         /// </summary>\r
426         /// <param name="sender"></param>\r
427         /// <param name="e"></param>\r
428         private void BaseForm_ResizeEnd(object sender, EventArgs e)\r
429         {\r
430             panelResize();\r
431 \r
432         }\r
433         /// <summary>\r
434         /// タスクパネルの大きさ調整を行います。\r
435         /// 起動されるのは、ウィンドウ全体のサイズ変更時、及びコマンド実行時です。\r
436         /// </summary>\r
437         private void panelResize()\r
438         {\r
439             pnlTask.Size = new Size(this.Size.Width - 420, this.Size.Height - 50);\r
440         }\r
441 \r
442     }\r
443 }\r