OSDN Git Service

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