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 IEncode 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(IEncode 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.EncodeCompleted -= stopWindowRefresh;\r
141                     }\r
142                     else\r
143                     {\r
144                         scan.ScanCompleted -= stopWindowRefresh;\r
145                         encode.EncodeCompleted += 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 EventArgs.\r
162         /// </param>\r
163         private void ActivityWindowLoad(object sender, EventArgs e)\r
164         {\r
165             try\r
166             {\r
167                 // Set the inital log file.\r
168                 if (encode.IsEncoding)\r
169                 {\r
170                     this.logSelector.SelectedIndex = 1;\r
171                 }\r
172                 else if (scan.IsScanning)\r
173                 {\r
174                     this.logSelector.SelectedIndex = 0;\r
175                 }\r
176                 else\r
177                 {\r
178                     // Otherwise, use the last mode the window was in.\r
179                     ActivityLogMode activitLogMode = (ActivityLogMode)Enum.ToObject(typeof(ActivityLogMode), Properties.Settings.Default.ActivityWindowLastMode);\r
180                     this.logSelector.SelectedIndex = activitLogMode == ActivityLogMode.Scan ? 0 : 1;\r
181                 }\r
182             }\r
183             catch (Exception exc)\r
184             {\r
185                 errorService.ShowError("Error during load.", exc.ToString());\r
186             }\r
187         }\r
188 \r
189         /// <summary>\r
190         /// Set the Log window to encode mode when an encode 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 encode_EncodeStarted(object sender, EventArgs e)\r
199         {\r
200             SetMode(ActivityLogMode.Encode);\r
201         }\r
202 \r
203         /// <summary>\r
204         /// Set the log widow to scan mode when a scan starts\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 scan_ScanStared(object sender, EventArgs e)\r
213         {\r
214             SetMode(ActivityLogMode.Scan);\r
215         }\r
216 \r
217         /// <summary>\r
218         /// Stop refreshing the window when no scanning or encoding is happening.\r
219         /// </summary>\r
220         /// <param name="sender">\r
221         /// The sender.\r
222         /// </param>\r
223         /// <param name="e">\r
224         /// The e.\r
225         /// </param>\r
226         private void stopWindowRefresh(object sender, EventArgs e)\r
227         {\r
228             windowTimer.Dispose();\r
229             Reset();\r
230             LogMonitor(null);\r
231         }\r
232 \r
233         /// <summary>\r
234         /// Append new text to the window\r
235         /// </summary>\r
236         /// <param name="n">\r
237         /// The n.\r
238         /// </param>\r
239         private void LogMonitor(object n)\r
240         {\r
241             AppendWindowText(GetLog());\r
242         }\r
243 \r
244         /// <summary>\r
245         /// New Code for getting the Activity log from the Services rather than reading a file.\r
246         /// </summary>\r
247         /// <returns>\r
248         /// The StringBuilder containing a log\r
249         /// </returns>\r
250         private StringBuilder GetLog()\r
251         {\r
252             StringBuilder appendText = new StringBuilder();\r
253 \r
254             try\r
255             {\r
256                 if (this.mode == ActivityLogMode.Scan)\r
257                 {\r
258                     if (scan == null || scan.ActivityLog == string.Empty)\r
259                     {\r
260                         appendText.AppendFormat("Waiting for the log to be generated ...\n");\r
261                         position = 0;\r
262                         ClearWindowText();\r
263                         return appendText;\r
264                     }\r
265 \r
266                     using (StringReader reader = new StringReader(scan.ActivityLog))\r
267                     {\r
268                         LogReader(reader, appendText);\r
269                     }\r
270                 }\r
271                 else\r
272                 {\r
273                     if (encode == null || encode.ActivityLog == string.Empty)\r
274                     {\r
275                         appendText.AppendFormat("Waiting for the log to be generated ...\n");\r
276                         position = 0;\r
277                         ClearWindowText();\r
278                         return appendText;\r
279                     }\r
280 \r
281                     using (StringReader reader = new StringReader(encode.ActivityLog))\r
282                     {\r
283                         LogReader(reader, appendText);\r
284                     }\r
285                 }\r
286             }\r
287             catch (Exception exc)\r
288             {\r
289                 windowTimer.Dispose();\r
290                 errorService.ShowError("GetLog() Error", exc.ToString());\r
291             }\r
292 \r
293             return appendText;\r
294         }\r
295 \r
296         /// <summary>\r
297         /// Reads the log data from a Scan or Encode object\r
298         /// </summary>\r
299         /// <param name="reader">\r
300         /// The reader.\r
301         /// </param>\r
302         /// <param name="appendText">\r
303         /// The append text.\r
304         /// </param>\r
305         private void LogReader(StringReader reader, StringBuilder appendText)\r
306         {\r
307             string line;\r
308             int i = 1;\r
309             while ((line = reader.ReadLine()) != null)\r
310             {\r
311                 if (i > position)\r
312                 {\r
313                     appendText.AppendLine(line);\r
314                     position++;\r
315                 }\r
316                 i++;\r
317             }\r
318         }\r
319 \r
320         /// <summary>\r
321         /// Append text to the RTF box\r
322         /// </summary>\r
323         /// <param name="text">\r
324         /// The text.\r
325         /// </param>\r
326         private void AppendWindowText(StringBuilder text)\r
327         {\r
328             try\r
329             {\r
330                 if (IsHandleCreated)\r
331                 {\r
332                     if (rtf_actLog.InvokeRequired)\r
333                     {\r
334                         IAsyncResult invoked = BeginInvoke(new SetTextCallback(AppendWindowText), new object[] { text });\r
335                         EndInvoke(invoked);\r
336                     }\r
337                     else\r
338                         lock (rtf_actLog)\r
339                             rtf_actLog.AppendText(text.ToString());\r
340 \r
341                     // Stop the refresh process if log has finished.\r
342                     if (text.ToString().Contains("HandBrake has Exited"))\r
343                     {\r
344                         windowTimer.Dispose();\r
345                     }\r
346                 }\r
347             }\r
348             catch (Exception)\r
349             {\r
350                 return;\r
351             }\r
352         }\r
353 \r
354         /// <summary>\r
355         /// Clear the contents of the log window\r
356         /// </summary>\r
357         private void ClearWindowText()\r
358         {\r
359             try\r
360             {\r
361                 if (IsHandleCreated)\r
362                 {\r
363                     if (rtf_actLog.InvokeRequired)\r
364                     {\r
365                         IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(ClearWindowText));\r
366                         EndInvoke(invoked);\r
367                     }\r
368                     else\r
369                         lock (rtf_actLog)\r
370                             rtf_actLog.Clear();\r
371                 }\r
372             }\r
373             catch (Exception)\r
374             {\r
375                 return;\r
376             }\r
377         }\r
378 \r
379         /// <summary>\r
380         /// Reset Everything\r
381         /// </summary>\r
382         private void Reset()\r
383         {\r
384             if (windowTimer != null)\r
385                 windowTimer.Dispose();\r
386             position = 0;\r
387             ClearWindowText();\r
388             windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);\r
389         }\r
390 \r
391         /* Menus and Buttons */\r
392 \r
393         /// <summary>\r
394         /// Copy log to clipboard\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 MnuCopyLogClick(object sender, EventArgs e)\r
403         {\r
404             Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);\r
405         }\r
406 \r
407         /// <summary>\r
408         /// Open the log folder\r
409         /// </summary>\r
410         /// <param name="sender">\r
411         /// The sender.\r
412         /// </param>\r
413         /// <param name="e">\r
414         /// The e.\r
415         /// </param>\r
416         private void MnuOpenLogFolderClick(object sender, EventArgs e)\r
417         {\r
418             string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";\r
419             string windir = Environment.GetEnvironmentVariable("WINDIR");\r
420             Process prc = new Process\r
421                               {\r
422                                   StartInfo =\r
423                                       {\r
424                                           FileName = windir + @"\explorer.exe",\r
425                                           Arguments = logDir\r
426                                       }\r
427                               };\r
428             prc.Start();\r
429         }\r
430 \r
431         /// <summary>\r
432         /// Copy the log\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 BtnCopyClick(object sender, EventArgs e)\r
441         {\r
442             Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);\r
443         }\r
444 \r
445         /// <summary>\r
446         /// Change the Log file in the viewer\r
447         /// </summary>\r
448         /// <param name="sender">The Sender </param>\r
449         /// <param name="e">The EventArgs</param>\r
450         private void LogSelectorClick(object sender, EventArgs e)\r
451         {\r
452             this.SetMode((string)this.logSelector.SelectedItem == "Scan Log" ? ActivityLogMode.Scan : ActivityLogMode.Encode);\r
453         }\r
454 \r
455         /* Overrides */\r
456 \r
457         /// <summary>\r
458         /// override onclosing\r
459         /// </summary>\r
460         /// <param name="e">\r
461         /// The e.\r
462         /// </param>\r
463         protected override void OnClosing(CancelEventArgs e)\r
464         {\r
465             scan.ScanStared -= scan_ScanStared;\r
466             encode.EncodeStarted -= encode_EncodeStarted;\r
467 \r
468             scan.ScanCompleted -= stopWindowRefresh;\r
469             encode.EncodeCompleted -= stopWindowRefresh;\r
470 \r
471             windowTimer.Dispose();\r
472             e.Cancel = true;\r
473             this.Dispose();\r
474             base.OnClosing(e);\r
475         }\r
476     }\r
477 }