OSDN Git Service

7686a0d1d97a6d512208b41c373f9b185fb5ced6
[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     using Model;\r
17     using Services;\r
18     using Timer = System.Threading.Timer;\r
19 \r
20     /// <summary>\r
21     /// The Activity Log Window\r
22     /// </summary>\r
23     public partial class frmActivityWindow : Form\r
24     {\r
25         /* Private Variables */\r
26 \r
27         /// <summary>\r
28         /// The current position in the log file\r
29         /// </summary>\r
30         private int position;\r
31 \r
32         /// <summary>\r
33         /// A Timer for this window\r
34         /// </summary>\r
35         private Timer windowTimer;\r
36 \r
37         /// <summary>\r
38         /// The Encode Object\r
39         /// </summary>\r
40         private Encode encode;\r
41 \r
42         /// <summary>\r
43         /// The Scan Object\r
44         /// </summary>\r
45         private ScanService scan;\r
46 \r
47         /// <summary>\r
48         /// The Type of log that the window is currently dealing with\r
49         /// </summary>\r
50         private ActivityLogMode mode;\r
51 \r
52         /* Constructor */\r
53 \r
54         /// <summary>\r
55         /// Initializes a new instance of the <see cref="frmActivityWindow"/> class.\r
56         /// </summary>\r
57         /// <param name="encode">\r
58         /// The encode.\r
59         /// </param>\r
60         /// <param name="scan">\r
61         /// The scan.\r
62         /// </param>\r
63         public frmActivityWindow(Encode encode, ScanService scan)\r
64         {\r
65             InitializeComponent();\r
66 \r
67             this.encode = encode;\r
68             this.scan = scan;\r
69             this.position = 0;\r
70 \r
71             // Listen for Scan and Encode Starting Events\r
72             scan.ScanStared += scan_ScanStared;\r
73             encode.EncodeStarted += encode_EncodeStarted;\r
74         }\r
75 \r
76         /* Delegates */\r
77 \r
78         /// <summary>\r
79         /// A callback function for updating the ui\r
80         /// </summary>\r
81         /// <param name="text">\r
82         /// The text.\r
83         /// </param>\r
84         private delegate void SetTextCallback(StringBuilder text);\r
85 \r
86         /// <summary>\r
87         /// Clear text callback\r
88         /// </summary>\r
89         private delegate void SetTextClearCallback();\r
90 \r
91         /// <summary>\r
92         /// Set mode callback\r
93         /// </summary>\r
94         /// <param name="setMode">\r
95         /// The set mode.\r
96         /// </param>\r
97         private delegate void SetModeCallback(ActivityLogMode setMode);\r
98 \r
99         /* Public Methods */\r
100 \r
101         /// <summary>\r
102         /// Set the window to scan mode\r
103         /// </summary>\r
104         /// <param name="setMode">\r
105         /// The set Mode.\r
106         /// </param>\r
107         private void SetMode(ActivityLogMode setMode)\r
108         {\r
109             if (IsHandleCreated)\r
110             {\r
111                 if (rtf_actLog.InvokeRequired)\r
112                 {\r
113                     IAsyncResult invoked = BeginInvoke(new SetModeCallback(SetMode), new object[] {setMode});\r
114                     EndInvoke(invoked);\r
115                 }\r
116                 else\r
117                 {\r
118                     Reset();\r
119                     this.mode = setMode;\r
120 \r
121                     Array values = Enum.GetValues(typeof(ActivityLogMode));\r
122                     Properties.Settings.Default.ActivityWindowLastMode = (int) values.GetValue(Convert.ToInt32(setMode));\r
123                     Properties.Settings.Default.Save();\r
124 \r
125                     this.Text = mode == ActivityLogMode.Scan\r
126                                     ? "Activity Window (Scan Log)"\r
127                                     : "Activity Window (Encode Log)";\r
128 \r
129                     if (mode == ActivityLogMode.Scan)\r
130                     {\r
131                         scan.ScanCompleted += stopWindowRefresh;\r
132                         encode.EncodeEnded -= stopWindowRefresh;\r
133                     }\r
134                     else\r
135                     {\r
136                         scan.ScanCompleted -= stopWindowRefresh;\r
137                         encode.EncodeEnded += stopWindowRefresh;\r
138                     }\r
139 \r
140                     // Start a fresh window timer\r
141                     windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);\r
142                 }\r
143             }\r
144         }\r
145 \r
146         /* Private Methods */\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 }