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