OSDN Git Service

WinGui: Re-checkin updated stylecop settings
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmQueue.cs
1 /*  frmQueue.cs $\r
2     This file is part of the HandBrake source code.\r
3     Homepage: <http://handbrake.fr>.\r
4     It may be used under the terms of the GNU General Public License. */\r
5 \r
6 namespace Handbrake\r
7 {\r
8     using System;\r
9     using System.Collections.Generic;\r
10     using System.Collections.ObjectModel;\r
11     using System.ComponentModel;\r
12     using System.IO;\r
13     using System.Windows.Forms;\r
14     using Functions;\r
15 \r
16     using HandBrake.ApplicationServices.Model;\r
17     using HandBrake.ApplicationServices.Services;\r
18     using HandBrake.ApplicationServices.Services.Interfaces;\r
19 \r
20     using Model;\r
21 \r
22     /// <summary>\r
23     /// The Queue Window\r
24     /// </summary>\r
25     public partial class frmQueue : Form\r
26     {\r
27         /// <summary>\r
28         /// Update Handler Delegate\r
29         /// </summary>\r
30         private delegate void UpdateHandler();\r
31 \r
32         /// <summary>\r
33         /// An instance of the Queue service\r
34         /// </summary>\r
35         private readonly IQueue queue;\r
36 \r
37         /// <summary>\r
38         /// A reference to the main application window\r
39         /// </summary>\r
40         private readonly frmMain mainWindow;\r
41 \r
42         /// <summary>\r
43         /// Initializes a new instance of the <see cref="frmQueue"/> class.\r
44         /// </summary>\r
45         /// <param name="q">\r
46         /// An instance of the queue service.\r
47         /// </param>\r
48         /// <param name="mw">\r
49         /// The main window.\r
50         /// </param>\r
51         public frmQueue(IQueue q, frmMain mw)\r
52         {\r
53             InitializeComponent();\r
54 \r
55             this.mainWindow = mw;\r
56 \r
57             this.queue = q;\r
58             queue.EncodeStarted += new EventHandler(QueueOnEncodeStart);\r
59             queue.QueueCompleted += new EventHandler(QueueOnQueueFinished);\r
60             queue.QueuePauseRequested += new EventHandler(QueueOnPaused);\r
61             queue.QueueListChanged += new EventHandler(queue_QueueListChanged);\r
62 \r
63             queue.EncodeStarted += new EventHandler(queue_EncodeStarted);\r
64             queue.EncodeEnded += new EventHandler(queue_EncodeEnded);\r
65 \r
66             drp_completeOption.Text = Properties.Settings.Default.CompletionOption;\r
67         }\r
68 \r
69         /// <summary>\r
70         /// Queue Changed\r
71         /// </summary>\r
72         /// <param name="sender">\r
73         /// The sender.\r
74         /// </param>\r
75         /// <param name="e">\r
76         /// The e.\r
77         /// </param>\r
78         private void queue_QueueListChanged(object sender, EventArgs e)\r
79         {\r
80             UpdateUiElementsOnQueueChange();\r
81         }\r
82 \r
83         /// <summary>\r
84         /// Encode Ended\r
85         /// </summary>\r
86         /// <param name="sender">\r
87         /// The sender.\r
88         /// </param>\r
89         /// <param name="e">\r
90         /// The e.\r
91         /// </param>\r
92         private void queue_EncodeEnded(object sender, EventArgs e)\r
93         {\r
94             queue.EncodeStatusChanged -= EncodeQueue_EncodeStatusChanged;\r
95             ResetEncodeText();\r
96         }\r
97 \r
98         /// <summary>\r
99         /// Queue Started\r
100         /// </summary>\r
101         /// <param name="sender">\r
102         /// The sender.\r
103         /// </param>\r
104         /// <param name="e">\r
105         /// The e.\r
106         /// </param>\r
107         private void queue_EncodeStarted(object sender, EventArgs e)\r
108         {\r
109             this.SetCurrentEncodeInformation();\r
110             queue.EncodeStatusChanged += EncodeQueue_EncodeStatusChanged;        \r
111         }\r
112 \r
113         /// <summary>\r
114         /// Display the Encode Status\r
115         /// </summary>\r
116         /// <param name="sender">\r
117         /// The sender.\r
118         /// </param>\r
119         /// <param name="e">\r
120         /// The e.\r
121         /// </param>\r
122         private void EncodeQueue_EncodeStatusChanged(object sender, HandBrake.ApplicationServices.EncodeProgressEventArgs e)\r
123         {\r
124             if (this.InvokeRequired)\r
125             {\r
126                 this.BeginInvoke(new Encode.EncodeProgessStatus(EncodeQueue_EncodeStatusChanged), new[] { sender, e });\r
127                 return;\r
128             }\r
129 \r
130             lbl_encodeStatus.Text =\r
131                 string.Format(\r
132                 "Encoding: Pass {0} of {1}, {2:00.00}% Time Remaining: {3}",\r
133                 e.Task,\r
134                 e.Task,\r
135                 e.PercentComplete,\r
136                 e.EstimatedTimeLeft);\r
137         }\r
138 \r
139         /// <summary>\r
140         /// Handle the Queue Paused event\r
141         /// </summary>\r
142         /// <param name="sender">\r
143         /// The sender.\r
144         /// </param>\r
145         /// <param name="e">\r
146         /// The EventArgs.\r
147         /// </param>\r
148         private void QueueOnPaused(object sender, EventArgs e)\r
149         {\r
150             SetUiEncodeFinished();\r
151             UpdateUiElementsOnQueueChange();\r
152         }\r
153 \r
154         /// <summary>\r
155         /// Handle the Queue Finished event.\r
156         /// </summary>\r
157         /// <param name="sender">\r
158         /// The sender.\r
159         /// </param>\r
160         /// <param name="e">\r
161         /// The EventArgs.\r
162         /// </param>\r
163         private void QueueOnQueueFinished(object sender, EventArgs e)\r
164         {\r
165             SetUiEncodeFinished();\r
166             ResetQueue(); // Reset the Queue Window\r
167         }\r
168 \r
169         /// <summary>\r
170         /// Handle the Encode Started event\r
171         /// </summary>\r
172         /// <param name="sender">\r
173         /// The sender.\r
174         /// </param>\r
175         /// <param name="e">\r
176         /// The e.\r
177         /// </param>\r
178         private void QueueOnEncodeStart(object sender, EventArgs e)\r
179         {\r
180             SetUiEncodeStarted(); // make sure the UI is set correctly\r
181             UpdateUiElementsOnQueueChange(); // Redraw the Queue, a new encode has started.\r
182         }\r
183 \r
184         /// <summary>\r
185         /// Initializes the Queue list with the Arraylist from the Queue class\r
186         /// </summary>\r
187         public void SetQueue()\r
188         {\r
189             UpdateUiElementsOnQueueChange();\r
190         }\r
191 \r
192         /// <summary>\r
193         /// Initializes the Queue list, then shows and activates the window\r
194         /// </summary>\r
195         public new void Show()\r
196         {\r
197             Show(true);\r
198         }\r
199 \r
200         /// <summary>\r
201         /// Initializes the Queue list only if doSetQueue is true, then shows and activates the window\r
202         /// </summary>\r
203         /// <param name="doSetQueue">Indicates whether to call setQueue() before showing the window</param>\r
204         public void Show(bool doSetQueue)\r
205         {\r
206             if (doSetQueue) SetQueue();\r
207             base.Show();\r
208         }\r
209 \r
210         /// <summary>\r
211         /// Handle the Encode button Click event\r
212         /// </summary>\r
213         /// <param name="sender">The sender</param>\r
214         /// <param name="e">the EventArgs</param>\r
215         private void BtnEncodeClick(object sender, EventArgs e)\r
216         {\r
217             if (queue.Paused)\r
218             {\r
219                 SetUiEncodeStarted();\r
220             }\r
221 \r
222             lbl_encodeStatus.Text = "Encoding ...";\r
223             queue.Start();\r
224         }\r
225 \r
226         /// <summary>\r
227         /// Handle the Pause button click event.\r
228         /// </summary>\r
229         /// <param name="sender">\r
230         /// The sender.\r
231         /// </param>\r
232         /// <param name="e">\r
233         /// The EventArgs.\r
234         /// </param>\r
235         private void BtnPauseClick(object sender, EventArgs e)\r
236         {\r
237             queue.Pause();\r
238             MessageBox.Show(\r
239                 "No further items on the queue will start. The current encode process will continue until it is finished. \nClick 'Encode' when you wish to continue encoding the queue.",\r
240                 "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
241         }\r
242 \r
243         // UI Work\r
244 \r
245         /// <summary>\r
246         /// Setup the UI to show that an encode has started\r
247         /// </summary>\r
248         private void SetUiEncodeStarted()\r
249         {\r
250             if (InvokeRequired)\r
251             {\r
252                 BeginInvoke(new UpdateHandler(SetUiEncodeStarted));\r
253                 return;\r
254             }\r
255             btn_encode.Enabled = false;\r
256             btn_pause.Visible = true;\r
257         }\r
258 \r
259         /// <summary>\r
260         /// Setup the UI to indicate that an encode has finished.\r
261         /// </summary>\r
262         private void SetUiEncodeFinished()\r
263         {\r
264             if (InvokeRequired)\r
265             {\r
266                 BeginInvoke(new UpdateHandler(SetUiEncodeFinished));\r
267                 return;\r
268             }\r
269             btn_pause.Visible = false;\r
270             btn_encode.Enabled = true;\r
271         }\r
272 \r
273         /// <summary>\r
274         /// Reset the Queue Window display\r
275         /// </summary>\r
276         private void ResetQueue()\r
277         {\r
278             if (InvokeRequired)\r
279             {\r
280                 BeginInvoke(new UpdateHandler(ResetQueue));\r
281                 return;\r
282             }\r
283             btn_pause.Visible = false;\r
284             btn_encode.Enabled = true;\r
285 \r
286             ResetEncodeText();\r
287         }\r
288 \r
289         /// <summary>\r
290         /// Reset the current job text\r
291         /// </summary>\r
292         private void ResetEncodeText()\r
293         {\r
294             if (InvokeRequired)\r
295             {\r
296                 BeginInvoke(new UpdateHandler(ResetEncodeText));\r
297                 return;\r
298             }\r
299             lbl_encodeStatus.Text = "Ready";\r
300 \r
301             lbl_source.Text = "-";\r
302             lbl_dest.Text = "-";\r
303             lbl_encodeOptions.Text = "-";\r
304 \r
305             lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
306         }\r
307 \r
308         /// <summary>\r
309         /// Redraw the Queue window with the latest information about HandBrakes status\r
310         /// </summary>\r
311         private void RedrawQueue()\r
312         {\r
313             if (InvokeRequired)\r
314             {\r
315                 BeginInvoke(new UpdateHandler(RedrawQueue));\r
316                 return;\r
317             }\r
318 \r
319             list_queue.Items.Clear();\r
320             ReadOnlyCollection<Job> theQueue = queue.CurrentQueue;\r
321             foreach (Job queueItem in theQueue)\r
322             {\r
323                 string qItem = queueItem.Query;\r
324                 QueryParser parsed = Functions.QueryParser.Parse(qItem);\r
325 \r
326                 // Get the DVD Title\r
327                 string title = parsed.Title == 0 ? "Auto" : parsed.Title.ToString();\r
328 \r
329                 // Get the DVD Chapters\r
330                 string chapters;\r
331                 if (parsed.ChapterStart == 0)\r
332                     chapters = "Auto";\r
333                 else\r
334                 {\r
335                     chapters = parsed.ChapterStart.ToString();\r
336                     if (parsed.ChapterFinish != 0)\r
337                         chapters = chapters + " - " + parsed.ChapterFinish;\r
338                 }\r
339 \r
340                 ListViewItem item = new ListViewItem();\r
341                 item.Text = title; // Title\r
342                 item.SubItems.Add(chapters); // Chapters\r
343                 item.SubItems.Add(queueItem.Source); // Source\r
344                 item.SubItems.Add(queueItem.Destination); // Destination\r
345                 item.SubItems.Add(parsed.VideoEncoder); // Video\r
346 \r
347                 // Display The Audio Track Information\r
348                 string audio = string.Empty;\r
349                 foreach (AudioTrack track in parsed.AudioInformation)\r
350                 {\r
351                     if (audio != string.Empty)\r
352                         audio += ", " + track.Encoder;\r
353                     else\r
354                         audio = track.Encoder;\r
355                 }\r
356                 item.SubItems.Add(audio); // Audio\r
357 \r
358                 list_queue.Items.Add(item);\r
359             }\r
360         }\r
361 \r
362         /// <summary>\r
363         /// Update the UI elements\r
364         /// </summary>\r
365         private void UpdateUiElementsOnQueueChange()\r
366         {\r
367             if (InvokeRequired)\r
368             {\r
369                 BeginInvoke(new UpdateHandler(UpdateUiElementsOnQueueChange));\r
370                 return;\r
371             }\r
372 \r
373             RedrawQueue();\r
374             lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
375         }\r
376 \r
377         /// <summary>\r
378         /// Set the window up with the current encode information\r
379         /// </summary>\r
380         private void SetCurrentEncodeInformation()\r
381         {\r
382             try\r
383             {\r
384                 if (InvokeRequired)\r
385                 {\r
386                     BeginInvoke(new UpdateHandler(SetCurrentEncodeInformation));\r
387                 }\r
388 \r
389                 QueryParser parsed = QueryParser.Parse(queue.LastEncode.Query);\r
390 \r
391                 // Get title and chapters\r
392                 string title = parsed.Title == 0 ? "Auto" : parsed.Title.ToString();\r
393                 string chapterlbl;\r
394                 if (Equals(parsed.ChapterStart, 0))\r
395                     chapterlbl = "Auto";\r
396                 else\r
397                 {\r
398                     string chapters = parsed.ChapterStart.ToString();\r
399                     if (parsed.ChapterFinish != 0)\r
400                         chapters = chapters + " - " + parsed.ChapterFinish;\r
401                     chapterlbl = chapters;\r
402                 }\r
403 \r
404                 // Get audio information\r
405                 string audio = string.Empty;\r
406                 foreach (AudioTrack track in parsed.AudioInformation)\r
407                 {\r
408                     if (audio != string.Empty) \r
409                         audio += ", " + track.Encoder;\r
410                     else\r
411                         audio = track.Encoder;\r
412                 }\r
413 \r
414                 // found query is a global varible        \r
415                 lbl_encodeStatus.Text = "Encoding ...";\r
416                 lbl_source.Text = queue.LastEncode.Source + "(Title: " + title + " Chapters: " + chapterlbl + ")";\r
417                 lbl_dest.Text = queue.LastEncode.Destination;\r
418                 lbl_encodeOptions.Text = "Video: " + parsed.VideoEncoder + " Audio: " + audio + Environment.NewLine +\r
419                                     "x264 Options: " + parsed.H264Query;\r
420                }\r
421             catch (Exception)\r
422             {\r
423                 // Do Nothing\r
424             }\r
425         }\r
426 \r
427         /* Right Click Menu */\r
428         /// <summary>\r
429         /// Handle the Move Up Menu Item\r
430         /// </summary>\r
431         /// <param name="sender">\r
432         /// The sender.\r
433         /// </param>\r
434         /// <param name="e">\r
435         /// The e.\r
436         /// </param>\r
437         private void MnuUpClick(object sender, EventArgs e)\r
438         {\r
439             MoveUp();\r
440         }\r
441 \r
442         /// <summary>\r
443         /// Handle the Move down Menu Item\r
444         /// </summary>\r
445         /// <param name="sender">\r
446         /// The sender.\r
447         /// </param>\r
448         /// <param name="e">\r
449         /// The e.\r
450         /// </param>\r
451         private void MnuDownClick(object sender, EventArgs e)\r
452         {\r
453             MoveDown();\r
454         }\r
455 \r
456         /// <summary>\r
457         /// Edit a job\r
458         /// </summary>\r
459         /// <param name="sender">\r
460         /// The sender.\r
461         /// </param>\r
462         /// <param name="e">\r
463         /// The e.\r
464         /// </param>\r
465         private void MnuEditClick(object sender, EventArgs e)\r
466         {\r
467             if (list_queue.SelectedIndices != null && list_queue.SelectedIndices.Count != 0)\r
468             {\r
469                 lock (queue)\r
470                 {\r
471                     lock (list_queue)\r
472                     {\r
473                         int index = list_queue.SelectedIndices[0];\r
474                         mainWindow.RecievingJob(queue.GetJob(index));\r
475                         queue.Remove(index);\r
476                         RedrawQueue();\r
477                     }\r
478                 }\r
479             }\r
480         }\r
481 \r
482         /// <summary>\r
483         /// Handle the delete Menu Item\r
484         /// </summary>\r
485         /// <param name="sender">\r
486         /// The sender.\r
487         /// </param>\r
488         /// <param name="e">\r
489         /// The e.\r
490         /// </param>\r
491         private void MnuDeleteClick(object sender, EventArgs e)\r
492         {\r
493             DeleteSelectedItems();\r
494         }\r
495 \r
496         /* Keyboard Shortcuts */\r
497 \r
498         /// <summary>\r
499         /// Handle the delete keyboard press\r
500         /// </summary>\r
501         /// <param name="sender">\r
502         /// The sender.\r
503         /// </param>\r
504         /// <param name="e">\r
505         /// The e.\r
506         /// </param>\r
507         private void ListQueueDeleteKey(object sender, KeyEventArgs e)\r
508         {\r
509             if (e.KeyCode == Keys.Delete)\r
510                 DeleteSelectedItems();\r
511         }\r
512 \r
513         /* Queue Management */\r
514 \r
515         /// <summary>\r
516         /// Move items up in the queue\r
517         /// </summary>\r
518         private void MoveUp()\r
519         {\r
520             // If there are selected items and the first item is not selected\r
521             if (list_queue.SelectedIndices.Count > 0 && !list_queue.SelectedIndices.Contains(0))\r
522             {\r
523                 // Copy the selected indices to preserve them during the movement\r
524                 List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
525                 foreach (int selectedIndex in list_queue.SelectedIndices)\r
526                     selectedIndices.Add(selectedIndex);\r
527 \r
528                 // Move up each selected item\r
529                 foreach (int selectedIndex in selectedIndices)\r
530                     queue.MoveUp(selectedIndex);\r
531 \r
532                 // Keep the selected item(s) selected, now moved up one index\r
533                 foreach (int selectedIndex in selectedIndices)\r
534                     if (selectedIndex - 1 > -1) // Defensive programming: ensure index is good\r
535                         list_queue.Items[selectedIndex - 1].Selected = true;\r
536             }\r
537 \r
538             list_queue.Select(); // Activate the control to show the selected items\r
539         }\r
540 \r
541         /// <summary>\r
542         /// Move items down in the queue\r
543         /// </summary>\r
544         private void MoveDown()\r
545         {\r
546             // If there are selected items and the last item is not selected\r
547             if (list_queue.SelectedIndices.Count > 0 &&\r
548                 !list_queue.SelectedIndices.Contains(list_queue.Items[list_queue.Items.Count - 1].Index))\r
549             {\r
550                 // Copy the selected indices to preserve them during the movement\r
551                 List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
552                 foreach (int selectedIndex in list_queue.SelectedIndices)\r
553                     selectedIndices.Add(selectedIndex);\r
554 \r
555                 // Reverse the indices to move the items down from last to first (preserves indices)\r
556                 selectedIndices.Reverse();\r
557 \r
558                 // Move down each selected item\r
559                 foreach (int selectedIndex in selectedIndices)\r
560                     queue.MoveDown(selectedIndex);\r
561 \r
562                 // Keep the selected item(s) selected, now moved down one index\r
563                 foreach (int selectedIndex in selectedIndices)\r
564                     if (selectedIndex + 1 < list_queue.Items.Count) // Defensive programming: ensure index is good\r
565                         list_queue.Items[selectedIndex + 1].Selected = true;\r
566             }\r
567 \r
568             list_queue.Select(); // Activate the control to show the selected items\r
569         }\r
570 \r
571         /// <summary>\r
572         /// Delete the currently selected items on the queue\r
573         /// </summary>\r
574         private void DeleteSelectedItems()\r
575         {\r
576             // If there are selected items\r
577             if (list_queue.SelectedIndices.Count > 0)\r
578             {\r
579                 // Save the selected indices to select them after the move\r
580                 List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
581                 foreach (int selectedIndex in list_queue.SelectedIndices)\r
582                     selectedIndices.Add(selectedIndex);\r
583 \r
584                 int firstSelectedIndex = selectedIndices[0];\r
585 \r
586                 // Reverse the list to delete the items from last to first (preserves indices)\r
587                 selectedIndices.Reverse();\r
588 \r
589                 // Remove each selected item\r
590                 foreach (int selectedIndex in selectedIndices)\r
591                     queue.Remove(selectedIndex);\r
592 \r
593                 // Select the item where the first deleted item was previously\r
594                 if (firstSelectedIndex < list_queue.Items.Count)\r
595                     list_queue.Items[firstSelectedIndex].Selected = true;\r
596             }\r
597 \r
598             list_queue.Select(); // Activate the control to show the selected items\r
599         }\r
600 \r
601         /* Queue Import / Export features */\r
602 \r
603         /// <summary>\r
604         /// Create a batch script\r
605         /// </summary>\r
606         /// <param name="sender">\r
607         /// The sender.\r
608         /// </param>\r
609         /// <param name="e">\r
610         /// The e.\r
611         /// </param>\r
612         private void MnuBatchClick(object sender, EventArgs e)\r
613         {\r
614             SaveFile.FileName = string.Empty;\r
615             SaveFile.Filter = "Batch|.bat";\r
616             SaveFile.ShowDialog();\r
617             if (SaveFile.FileName != String.Empty)\r
618                 queue.WriteBatchScriptToFile(SaveFile.FileName);\r
619         }\r
620 \r
621         /// <summary>\r
622         /// Export Queue\r
623         /// </summary>\r
624         /// <param name="sender">\r
625         /// The sender.\r
626         /// </param>\r
627         /// <param name="e">\r
628         /// The e.\r
629         /// </param>\r
630         private void MnuExportClick(object sender, EventArgs e)\r
631         {\r
632             SaveFile.FileName = string.Empty;\r
633             SaveFile.Filter = "HandBrake Queue|*.queue";\r
634             SaveFile.ShowDialog();\r
635             if (SaveFile.FileName != String.Empty)\r
636                 queue.WriteQueueStateToFile(SaveFile.FileName);\r
637         }\r
638 \r
639         /// <summary>\r
640         /// Import Queue\r
641         /// </summary>\r
642         /// <param name="sender">\r
643         /// The sender.\r
644         /// </param>\r
645         /// <param name="e">\r
646         /// The e.\r
647         /// </param>\r
648         private void MnuImportClick(object sender, EventArgs e)\r
649         {\r
650             OpenFile.FileName = string.Empty;\r
651             OpenFile.ShowDialog();\r
652             if (OpenFile.FileName != String.Empty)\r
653                 queue.LoadQueueFromFile(OpenFile.FileName);\r
654         }\r
655 \r
656         /// <summary>\r
657         /// Readd current job to queue\r
658         /// </summary>\r
659         /// <param name="sender">\r
660         /// The sender.\r
661         /// </param>\r
662         /// <param name="e">\r
663         /// The e.\r
664         /// </param>\r
665         private void MnuReaddClick(object sender, EventArgs e)\r
666         {\r
667             if (!queue.LastEncode.IsEmpty)\r
668             {\r
669                 queue.Add(\r
670                     queue.LastEncode.Query, \r
671                     queue.LastEncode.Title, \r
672                     queue.LastEncode.Source,\r
673                     queue.LastEncode.Destination,\r
674                     queue.LastEncode.CustomQuery);\r
675             }\r
676         }\r
677 \r
678         /* Overrides */\r
679 \r
680         /// <summary>\r
681         /// Hide's the window when the user tries to "x" out of the window instead of closing it.\r
682         /// </summary>\r
683         /// <param name="e">\r
684         /// The e.\r
685         /// </param>\r
686         protected override void OnClosing(CancelEventArgs e)\r
687         {\r
688             e.Cancel = true;\r
689             this.Hide();\r
690             base.OnClosing(e);\r
691         }\r
692 \r
693         /// <summary>\r
694         /// Change the OnComplete option setting.\r
695         /// </summary>\r
696         /// <param name="sender">\r
697         /// The sender.\r
698         /// </param>\r
699         /// <param name="e">\r
700         /// The EventArgs.\r
701         /// </param>\r
702         private void CompleteOptionChanged(object sender, EventArgs e)\r
703         {\r
704             Properties.Settings.Default.CompletionOption = drp_completeOption.Text;\r
705             Properties.Settings.Default.Save();\r
706         }\r
707     }\r
708 }