OSDN Git Service

WinGui: Re-checkin updated stylecop settings
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmActivityWindow.cs
1 /*  frmActivityWindow.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.ComponentModel;\r
10     using System.Diagnostics;\r
11     using System.IO;\r
12     using System.Text;\r
13     using System.Threading;\r
14     using System.Windows.Forms;\r
15 \r
16     using HandBrake.ApplicationServices.Services.Interfaces;\r
17 \r
18     using Model;\r
19     using Timer = System.Threading.Timer;\r
20 \r
21     /// <summary>\r
22     /// The Activity Log Window\r
23     /// </summary>\r
24     public partial class frmActivityWindow : Form\r
25     {\r
26         /* Private Variables */\r
27 \r
28         /// <summary>\r
29         /// The current position in the log file\r
30         /// </summary>\r
31         private int position;\r
32 \r
33         /// <summary>\r
34         /// A Timer for this window\r
35         /// </summary>\r
36         private Timer windowTimer;\r
37 \r
38         /// <summary>\r
39         /// The Encode Object\r
40         /// </summary>\r
41         private IQueue encode;\r
42 \r
43         /// <summary>\r
44         /// The Scan Object\r
45         /// </summary>\r
46         private IScan scan;\r
47 \r
48         /// <summary>\r
49         /// The Type of log that the window is currently dealing with\r
50         /// </summary>\r
51         private ActivityLogMode mode;\r
52 \r
53         /* Constructor */\r
54 \r
55         /// <summary>\r
56         /// Initializes a new instance of the <see cref="frmActivityWindow"/> class.\r
57         /// </summary>\r
58         /// <param name="encode">\r
59         /// The encode.\r
60         /// </param>\r
61         /// <param name="scan">\r
62         /// The scan.\r
63         /// </param>\r
64         public frmActivityWindow(IQueue encode, IScan scan)\r
65         {\r
66             InitializeComponent();\r
67 \r
68             this.encode = encode;\r
69             this.scan = scan;\r
70             this.position = 0;\r
71 \r
72             // Listen for Scan and Encode Starting Events\r
73             scan.ScanStared += scan_ScanStared;\r
74             encode.EncodeStarted += encode_EncodeStarted;\r
75         }\r
76 \r
77         /* Delegates */\r
78 \r
79         /// <summary>\r
80         /// A callback function for updating the ui\r
81         /// </summary>\r
82         /// <param name="text">\r
83         /// The text.\r
84         /// </param>\r
85         private delegate void SetTextCallback(StringBuilder text);\r
86 \r
87         /// <summary>\r
88         /// Clear text callback\r
89         /// </summary>\r
90         private delegate void SetTextClearCallback();\r
91 \r
92         /// <summary>\r
93         /// Set mode callback\r
94         /// </summary>\r
95         /// <param name="setMode">\r
96         /// The set mode.\r
97         /// </param>\r
98         private delegate void SetModeCallback(ActivityLogMode setMode);\r
99 \r
100         /* Private Methods */\r
101 \r
102         /// <summary>\r
103         /// Set the window to scan mode\r
104         /// </summary>\r
105         /// <param name="setMode">\r
106         /// The set Mode.\r
107         /// </param>\r
108         private void SetMode(ActivityLogMode setMode)\r
109         {\r
110             if (IsHandleCreated)\r
111             {\r
112                 if (rtf_actLog.InvokeRequired)\r
113                 {\r
114                     IAsyncResult invoked = BeginInvoke(new SetModeCallback(SetMode), new object[] {setMode});\r
115                     EndInvoke(invoked);\r
116                 }\r
117                 else\r
118                 {\r
119                     Reset();\r
120                     this.mode = setMode;\r
121 \r
122                     Array values = Enum.GetValues(typeof(ActivityLogMode));\r
123                     Properties.Settings.Default.ActivityWindowLastMode = (int) values.GetValue(Convert.ToInt32(setMode));\r
124                     Properties.Settings.Default.Save();\r
125 \r
126                     this.Text = mode == ActivityLogMode.Scan\r
127                                     ? "Activity Window (Scan Log)"\r
128                                     : "Activity Window (Encode Log)";\r
129 \r
130                     if (mode == ActivityLogMode.Scan)\r
131                     {\r
132                         scan.ScanCompleted += stopWindowRefresh;\r
133                         encode.EncodeEnded -= stopWindowRefresh;\r
134                     }\r
135                     else\r
136                     {\r
137                         scan.ScanCompleted -= stopWindowRefresh;\r
138                         encode.EncodeEnded += stopWindowRefresh;\r
139                     }\r
140 \r
141                     // Start a fresh window timer\r
142                     windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);\r
143                 }\r
144             }\r
145         }\r
146 \r
147         /// <summary>\r
148         /// On Window load, start a new timer\r
149         /// </summary>\r
150         /// <param name="sender">\r
151         /// The sender.\r
152         /// </param>\r
153         /// <param name="e">\r
154         /// The e.\r
155         /// </param>\r
156         private void NewActivityWindow_Load(object sender, EventArgs e)\r
157         {\r
158             ActivityLogMode activitLogMode = (ActivityLogMode) Enum.ToObject(typeof(ActivityLogMode), Properties.Settings.Default.ActivityWindowLastMode);\r
159             SetMode(activitLogMode);        \r
160         }\r
161 \r
162         /// <summary>\r
163         /// Set the Log window to encode mode when an encode starts.\r
164         /// </summary>\r
165         /// <param name="sender">\r
166         /// The sender.\r
167         /// </param>\r
168         /// <param name="e">\r
169         /// The e.\r
170         /// </param>\r
171         private void encode_EncodeStarted(object sender, EventArgs e)\r
172         {\r
173             SetMode(ActivityLogMode.Encode);\r
174         }\r
175 \r
176         /// <summary>\r
177         /// Set the log widow to scan mode when a scan starts\r
178         /// </summary>\r
179         /// <param name="sender">\r
180         /// The sender.\r
181         /// </param>\r
182         /// <param name="e">\r
183         /// The e.\r
184         /// </param>\r
185         private void scan_ScanStared(object sender, EventArgs e)\r
186         {\r
187             SetMode(ActivityLogMode.Scan);\r
188         }\r
189 \r
190         /// <summary>\r
191         /// Stop refreshing the window when no scanning or encoding is happening.\r
192         /// </summary>\r
193         /// <param name="sender">\r
194         /// The sender.\r
195         /// </param>\r
196         /// <param name="e">\r
197         /// The e.\r
198         /// </param>\r
199         private void stopWindowRefresh(object sender, EventArgs e)\r
200         {\r
201             windowTimer.Dispose();\r
202             LogMonitor(null);\r
203         }\r
204 \r
205         /// <summary>\r
206         /// Append new text to the window\r
207         /// </summary>\r
208         /// <param name="n">\r
209         /// The n.\r
210         /// </param>\r
211         private void LogMonitor(object n)\r
212         {\r
213             AppendWindowText(GetLog());\r
214         }\r
215 \r
216         /// <summary>\r
217         /// New Code for getting the Activity log from the Services rather than reading a file.\r
218         /// </summary>\r
219         /// <returns>\r
220         /// The StringBuilder containing a log\r
221         /// </returns>\r
222         private StringBuilder GetLog()\r
223         {\r
224             StringBuilder appendText = new StringBuilder();\r
225 \r
226             if (this.mode == ActivityLogMode.Scan)\r
227             {\r
228                 if (scan == null || scan.ActivityLog == string.Empty)\r
229                 {\r
230                     appendText.AppendFormat("Waiting for the log to be generated ...\n");\r
231                     position = 0;\r
232                     ClearWindowText();\r
233                     return appendText;\r
234                 }\r
235 \r
236                 using (StringReader reader = new StringReader(scan.ActivityLog))\r
237                 {\r
238                     LogReader(reader, appendText);\r
239                 }\r
240             }\r
241             else\r
242             {\r
243                 if (encode == null || encode.ActivityLog == string.Empty)\r
244                 {\r
245                     appendText.AppendFormat("Waiting for the log to be generated ...\n");\r
246                     position = 0;\r
247                     ClearWindowText();\r
248                     return appendText;\r
249                 }\r
250 \r
251                 using (StringReader reader = new StringReader(encode.ActivityLog))\r
252                 {\r
253                     LogReader(reader, appendText);\r
254                 }\r
255             }\r
256             return appendText;\r
257         }\r
258 \r
259         /// <summary>\r
260         /// Reads the log data from a Scan or Encode object\r
261         /// </summary>\r
262         /// <param name="reader">\r
263         /// The reader.\r
264         /// </param>\r
265         /// <param name="appendText">\r
266         /// The append text.\r
267         /// </param>\r
268         private void LogReader(StringReader reader, StringBuilder appendText)\r
269         {\r
270             string line;\r
271             int i = 1;\r
272             while ((line = reader.ReadLine()) != null)\r
273             {\r
274                 if (i > position)\r
275                 {\r
276                     appendText.AppendLine(line);\r
277                     position++;\r
278                 }\r
279                 i++;\r
280             }\r
281         }\r
282 \r
283         /// <summary>\r
284         /// Append text to the RTF box\r
285         /// </summary>\r
286         /// <param name="text">\r
287         /// The text.\r
288         /// </param>\r
289         private void AppendWindowText(StringBuilder text)\r
290         {\r
291             try\r
292             {\r
293                 if (IsHandleCreated)\r
294                 {\r
295                     if (rtf_actLog.InvokeRequired)\r
296                     {\r
297                         IAsyncResult invoked = BeginInvoke(new SetTextCallback(AppendWindowText), new object[] { text });\r
298                         EndInvoke(invoked);\r
299                     }\r
300                     else\r
301                         lock (rtf_actLog)\r
302                             rtf_actLog.AppendText(text.ToString());\r
303 \r
304                     // Stop the refresh process if log has finished.\r
305                     if (text.ToString().Contains("HandBrake has Exited"))\r
306                     {\r
307                         windowTimer.Dispose();\r
308                     }\r
309                 }\r
310             }\r
311             catch (Exception)\r
312             {\r
313                 return;\r
314             }\r
315         }\r
316 \r
317         /// <summary>\r
318         /// Clear the contents of the log window\r
319         /// </summary>\r
320         private void ClearWindowText()\r
321         {\r
322             try\r
323             {\r
324                 if (IsHandleCreated)\r
325                 {\r
326                     if (rtf_actLog.InvokeRequired)\r
327                     {\r
328                         IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(ClearWindowText));\r
329                         EndInvoke(invoked);\r
330                     }\r
331                     else\r
332                         lock (rtf_actLog)\r
333                             rtf_actLog.Clear();\r
334                 }\r
335             }\r
336             catch (Exception)\r
337             {\r
338                 return;\r
339             }\r
340         }\r
341 \r
342         /// <summary>\r
343         /// Reset Everything\r
344         /// </summary>\r
345         private void Reset()\r
346         {\r
347             if (windowTimer != null)\r
348                 windowTimer.Dispose();\r
349             position = 0;\r
350             ClearWindowText();\r
351             windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);\r
352         }\r
353 \r
354         /* Menus and Buttons */\r
355 \r
356         /// <summary>\r
357         /// Copy log to clipboard\r
358         /// </summary>\r
359         /// <param name="sender">\r
360         /// The sender.\r
361         /// </param>\r
362         /// <param name="e">\r
363         /// The e.\r
364         /// </param>\r
365         private void MnuCopyLogClick(object sender, EventArgs e)\r
366         {\r
367             Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);\r
368         }\r
369 \r
370         /// <summary>\r
371         /// Open the log folder\r
372         /// </summary>\r
373         /// <param name="sender">\r
374         /// The sender.\r
375         /// </param>\r
376         /// <param name="e">\r
377         /// The e.\r
378         /// </param>\r
379         private void MnuOpenLogFolderClick(object sender, EventArgs e)\r
380         {\r
381             string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";\r
382             string windir = Environment.GetEnvironmentVariable("WINDIR");\r
383             Process prc = new Process\r
384                               {\r
385                                   StartInfo =\r
386                                       {\r
387                                           FileName = windir + @"\explorer.exe",\r
388                                           Arguments = logDir\r
389                                       }\r
390                               };\r
391             prc.Start();\r
392         }\r
393 \r
394         /// <summary>\r
395         /// Copy the log\r
396         /// </summary>\r
397         /// <param name="sender">\r
398         /// The sender.\r
399         /// </param>\r
400         /// <param name="e">\r
401         /// The e.\r
402         /// </param>\r
403         private void BtnCopyClick(object sender, EventArgs e)\r
404         {\r
405             Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);\r
406         }\r
407 \r
408         /// <summary>\r
409         /// Set scan mode\r
410         /// </summary>\r
411         /// <param name="sender">\r
412         /// The sender.\r
413         /// </param>\r
414         /// <param name="e">\r
415         /// The e.\r
416         /// </param>\r
417         private void BtnScanLogClick(object sender, EventArgs e)\r
418         {\r
419             SetMode(ActivityLogMode.Scan);\r
420         }\r
421 \r
422         /// <summary>\r
423         /// Set the encode mode\r
424         /// </summary>\r
425         /// <param name="sender">\r
426         /// The sender.\r
427         /// </param>\r
428         /// <param name="e">\r
429         /// The e.\r
430         /// </param>\r
431         private void BtnEncodeLogClick(object sender, EventArgs e)\r
432         {\r
433             SetMode(ActivityLogMode.Encode);\r
434         }\r
435 \r
436         /* Overrides */\r
437 \r
438         /// <summary>\r
439         /// override onclosing\r
440         /// </summary>\r
441         /// <param name="e">\r
442         /// The e.\r
443         /// </param>\r
444         protected override void OnClosing(CancelEventArgs e)\r
445         {\r
446             scan.ScanStared -= scan_ScanStared;\r
447             encode.EncodeStarted -= encode_EncodeStarted;\r
448 \r
449             scan.ScanCompleted -= stopWindowRefresh;\r
450             encode.EncodeEnded -= stopWindowRefresh;\r
451 \r
452             windowTimer.Dispose();\r
453             e.Cancel = true;\r
454             this.Dispose();\r
455             base.OnClosing(e);\r
456         }\r
457     }\r
458 }