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