OSDN Git Service

613a1a4c2c31a912d16abb5fa1f0940996703642
[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         /* Private 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         /// <summary>\r
147         /// On Window load, start a new timer\r
148         /// </summary>\r
149         /// <param name="sender">\r
150         /// The sender.\r
151         /// </param>\r
152         /// <param name="e">\r
153         /// The e.\r
154         /// </param>\r
155         private void NewActivityWindow_Load(object sender, EventArgs e)\r
156         {\r
157             ActivityLogMode activitLogMode = (ActivityLogMode) Enum.ToObject(typeof(ActivityLogMode), Properties.Settings.Default.ActivityWindowLastMode);\r
158             SetMode(activitLogMode);        \r
159         }\r
160 \r
161         /// <summary>\r
162         /// Set the Log window to encode mode when an encode starts.\r
163         /// </summary>\r
164         /// <param name="sender">\r
165         /// The sender.\r
166         /// </param>\r
167         /// <param name="e">\r
168         /// The e.\r
169         /// </param>\r
170         private void encode_EncodeStarted(object sender, EventArgs e)\r
171         {\r
172             SetMode(ActivityLogMode.Encode);\r
173         }\r
174 \r
175         /// <summary>\r
176         /// Set the log widow to scan mode when a scan 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 scan_ScanStared(object sender, EventArgs e)\r
185         {\r
186             SetMode(ActivityLogMode.Scan);\r
187         }\r
188 \r
189         /// <summary>\r
190         /// Stop refreshing the window when no scanning or encoding is happening.\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 stopWindowRefresh(object sender, EventArgs e)\r
199         {\r
200             windowTimer.Dispose();\r
201             LogMonitor(null);\r
202         }\r
203 \r
204         /// <summary>\r
205         /// Append new text to the window\r
206         /// </summary>\r
207         /// <param name="n">\r
208         /// The n.\r
209         /// </param>\r
210         private void LogMonitor(object n)\r
211         {\r
212             AppendWindowText(GetLog());\r
213         }\r
214 \r
215         /// <summary>\r
216         /// New Code for getting the Activity log from the Services rather than reading a file.\r
217         /// </summary>\r
218         /// <returns>\r
219         /// The StringBuilder containing a log\r
220         /// </returns>\r
221         private StringBuilder GetLog()\r
222         {\r
223             StringBuilder appendText = new StringBuilder();\r
224 \r
225             if (this.mode == ActivityLogMode.Scan)\r
226             {\r
227                 if (scan == null || scan.ActivityLog == string.Empty)\r
228                 {\r
229                     appendText.AppendFormat("Waiting for the log to be generated ...\n");\r
230                     position = 0;\r
231                     ClearWindowText();\r
232                     PrintLogHeader();\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                     PrintLogHeader();\r
249                     return appendText;\r
250                 }\r
251 \r
252                 using (StringReader reader = new StringReader(encode.ActivityLog))\r
253                 {\r
254                     LogReader(reader, appendText);\r
255                 }\r
256             }\r
257             return appendText;\r
258         }\r
259 \r
260         /// <summary>\r
261         /// Reads the log data from a Scan or Encode object\r
262         /// </summary>\r
263         /// <param name="reader">\r
264         /// The reader.\r
265         /// </param>\r
266         /// <param name="appendText">\r
267         /// The append text.\r
268         /// </param>\r
269         private void LogReader(StringReader reader, StringBuilder appendText)\r
270         {\r
271             string line;\r
272             int i = 1;\r
273             while ((line = reader.ReadLine()) != null)\r
274             {\r
275                 if (i > position)\r
276                 {\r
277                     appendText.AppendLine(line);\r
278                     position++;\r
279                 }\r
280                 i++;\r
281             }\r
282         }\r
283 \r
284         /// <summary>\r
285         /// Append text to the RTF box\r
286         /// </summary>\r
287         /// <param name="text">\r
288         /// The text.\r
289         /// </param>\r
290         private void AppendWindowText(StringBuilder text)\r
291         {\r
292             try\r
293             {\r
294                 if (IsHandleCreated)\r
295                 {\r
296                     if (rtf_actLog.InvokeRequired)\r
297                     {\r
298                         IAsyncResult invoked = BeginInvoke(new SetTextCallback(AppendWindowText), new object[] { text });\r
299                         EndInvoke(invoked);\r
300                     }\r
301                     else\r
302                         lock (rtf_actLog)\r
303                             rtf_actLog.AppendText(text.ToString());\r
304 \r
305                     // Stop the refresh process if log has finished.\r
306                     if (text.ToString().Contains("HandBrake has Exited"))\r
307                     {\r
308                         windowTimer.Dispose();\r
309                     }\r
310                 }\r
311             }\r
312             catch (Exception)\r
313             {\r
314                 return;\r
315             }\r
316         }\r
317 \r
318         /// <summary>\r
319         /// Clear the contents of the log window\r
320         /// </summary>\r
321         private void ClearWindowText()\r
322         {\r
323             try\r
324             {\r
325                 if (IsHandleCreated)\r
326                 {\r
327                     if (rtf_actLog.InvokeRequired)\r
328                     {\r
329                         IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(ClearWindowText));\r
330                         EndInvoke(invoked);\r
331                     }\r
332                     else\r
333                         lock (rtf_actLog)\r
334                             rtf_actLog.Clear();\r
335                 }\r
336             }\r
337             catch (Exception)\r
338             {\r
339                 return;\r
340             }\r
341         }\r
342 \r
343         /// <summary>\r
344         /// Display the log header\r
345         /// </summary>\r
346         private void PrintLogHeader()\r
347         {\r
348             try\r
349             {\r
350                 if (IsHandleCreated)\r
351                 {\r
352                     if (rtf_actLog.InvokeRequired)\r
353                     {\r
354                         IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(PrintLogHeader));\r
355                         EndInvoke(invoked);\r
356                     }\r
357                     else\r
358                     {\r
359                         lock (rtf_actLog)\r
360                         {\r
361                             // Print the log header. This function will be re-implimented later. Do not delete.\r
362                             StringBuilder header = new StringBuilder();\r
363 \r
364                             header.Append(String.Format("### Windows GUI {1} {0} \n", Properties.Settings.Default.hb_build, Properties.Settings.Default.hb_version));\r
365                             header.Append(String.Format("### Running: {0} \n###\n", Environment.OSVersion));\r
366                             header.Append(String.Format("### CPU: {0} \n", SystemInfo.GetCpuCount));\r
367                             header.Append(String.Format("### Ram: {0} MB \n", SystemInfo.TotalPhysicalMemory));\r
368                             header.Append(String.Format("### Screen: {0}x{1} \n", SystemInfo.ScreenBounds.Bounds.Width, SystemInfo.ScreenBounds.Bounds.Height));\r
369                             header.Append(String.Format("### Temp Dir: {0} \n", Path.GetTempPath()));\r
370                             header.Append(String.Format("### Install Dir: {0} \n", Application.StartupPath));\r
371                             header.Append(String.Format("### Data Dir: {0} \n", Application.UserAppDataPath));\r
372                             header.Append("#########################################\n\n");\r
373 \r
374                             rtf_actLog.AppendText(header.ToString());\r
375                         }\r
376                     }\r
377                 }\r
378             }\r
379             catch (Exception)\r
380             {\r
381                 return;\r
382             }\r
383         }\r
384 \r
385         /// <summary>\r
386         /// Reset Everything\r
387         /// </summary>\r
388         private void Reset()\r
389         {\r
390             if (windowTimer != null)\r
391                 windowTimer.Dispose();\r
392             position = 0;\r
393             ClearWindowText();\r
394             PrintLogHeader();\r
395             windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);\r
396         }\r
397 \r
398         /* Menus and Buttons */\r
399 \r
400         /// <summary>\r
401         /// Copy log to clipboard\r
402         /// </summary>\r
403         /// <param name="sender">\r
404         /// The sender.\r
405         /// </param>\r
406         /// <param name="e">\r
407         /// The e.\r
408         /// </param>\r
409         private void MnuCopyLogClick(object sender, EventArgs e)\r
410         {\r
411             Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);\r
412         }\r
413 \r
414         /// <summary>\r
415         /// Open the log folder\r
416         /// </summary>\r
417         /// <param name="sender">\r
418         /// The sender.\r
419         /// </param>\r
420         /// <param name="e">\r
421         /// The e.\r
422         /// </param>\r
423         private void MnuOpenLogFolderClick(object sender, EventArgs e)\r
424         {\r
425             string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";\r
426             string windir = Environment.GetEnvironmentVariable("WINDIR");\r
427             Process prc = new Process\r
428                               {\r
429                                   StartInfo =\r
430                                       {\r
431                                           FileName = windir + @"\explorer.exe",\r
432                                           Arguments = logDir\r
433                                       }\r
434                               };\r
435             prc.Start();\r
436         }\r
437 \r
438         /// <summary>\r
439         /// Copy the log\r
440         /// </summary>\r
441         /// <param name="sender">\r
442         /// The sender.\r
443         /// </param>\r
444         /// <param name="e">\r
445         /// The e.\r
446         /// </param>\r
447         private void BtnCopyClick(object sender, EventArgs e)\r
448         {\r
449             Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);\r
450         }\r
451 \r
452         /// <summary>\r
453         /// Set scan mode\r
454         /// </summary>\r
455         /// <param name="sender">\r
456         /// The sender.\r
457         /// </param>\r
458         /// <param name="e">\r
459         /// The e.\r
460         /// </param>\r
461         private void BtnScanLogClick(object sender, EventArgs e)\r
462         {\r
463             SetMode(ActivityLogMode.Scan);\r
464         }\r
465 \r
466         /// <summary>\r
467         /// Set the encode mode\r
468         /// </summary>\r
469         /// <param name="sender">\r
470         /// The sender.\r
471         /// </param>\r
472         /// <param name="e">\r
473         /// The e.\r
474         /// </param>\r
475         private void BtnEncodeLogClick(object sender, EventArgs e)\r
476         {\r
477             SetMode(ActivityLogMode.Encode);\r
478         }\r
479 \r
480         /* Overrides */\r
481 \r
482         /// <summary>\r
483         /// override onclosing\r
484         /// </summary>\r
485         /// <param name="e">\r
486         /// The e.\r
487         /// </param>\r
488         protected override void OnClosing(CancelEventArgs e)\r
489         {\r
490             scan.ScanStared -= scan_ScanStared;\r
491             encode.EncodeStarted -= encode_EncodeStarted;\r
492 \r
493             scan.ScanCompleted -= stopWindowRefresh;\r
494             encode.EncodeEnded -= stopWindowRefresh;\r
495 \r
496             windowTimer.Dispose();\r
497             e.Cancel = true;\r
498             this.Dispose();\r
499             base.OnClosing(e);\r
500         }\r
501     }\r
502 }