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