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.Interfaces;\r
17 \r
18     using Model;\r
19     using Timer = System.Threading.Timer;\r
20 \r
21     /// <summary>\r
22     /// The Activity Log Window\r
23     /// </summary>\r
24     public partial class frmActivityWindow : Form\r
25     {\r
26         /* Private Variables */\r
27 \r
28         /// <summary>\r
29         /// The current position in the log file\r
30         /// </summary>\r
31         private int position;\r
32 \r
33         /// <summary>\r
34         /// A Timer for this window\r
35         /// </summary>\r
36         private Timer windowTimer;\r
37 \r
38         /// <summary>\r
39         /// The Encode Object\r
40         /// </summary>\r
41         private IQueue encode;\r
42 \r
43         /// <summary>\r
44         /// The Scan Object\r
45         /// </summary>\r
46         private IScan scan;\r
47 \r
48         /// <summary>\r
49         /// The Type of log that the window is currently dealing with\r
50         /// </summary>\r
51         private ActivityLogMode mode;\r
52 \r
53         /* Constructor */\r
54 \r
55         /// <summary>\r
56         /// Initializes a new instance of the <see cref="frmActivityWindow"/> class.\r
57         /// </summary>\r
58         /// <param name="encode">\r
59         /// The encode.\r
60         /// </param>\r
61         /// <param name="scan">\r
62         /// The scan.\r
63         /// </param>\r
64         public frmActivityWindow(IQueue encode, IScan scan)\r
65         {\r
66             InitializeComponent();\r
67 \r
68             this.encode = encode;\r
69             this.scan = scan;\r
70             this.position = 0;\r
71 \r
72             // Listen for Scan and Encode Starting Events\r
73             scan.ScanStared += scan_ScanStared;\r
74             encode.EncodeStarted += encode_EncodeStarted;\r
75         }\r
76 \r
77         /* Delegates */\r
78 \r
79         /// <summary>\r
80         /// A callback function for updating the ui\r
81         /// </summary>\r
82         /// <param name="text">\r
83         /// The text.\r
84         /// </param>\r
85         private delegate void SetTextCallback(StringBuilder text);\r
86 \r
87         /// <summary>\r
88         /// Clear text callback\r
89         /// </summary>\r
90         private delegate void SetTextClearCallback();\r
91 \r
92         /// <summary>\r
93         /// Set mode callback\r
94         /// </summary>\r
95         /// <param name="setMode">\r
96         /// The set mode.\r
97         /// </param>\r
98         private delegate void SetModeCallback(ActivityLogMode setMode);\r
99 \r
100         /* Private Methods */\r
101 \r
102         /// <summary>\r
103         /// Set the window to scan mode\r
104         /// </summary>\r
105         /// <param name="setMode">\r
106         /// The set Mode.\r
107         /// </param>\r
108         private void SetMode(ActivityLogMode setMode)\r
109         {\r
110             if (IsHandleCreated)\r
111             {\r
112                 if (rtf_actLog.InvokeRequired)\r
113                 {\r
114                     IAsyncResult invoked = BeginInvoke(new SetModeCallback(SetMode), new object[] {setMode});\r
115                     EndInvoke(invoked);\r
116                 }\r
117                 else\r
118                 {\r
119                     Reset();\r
120                     this.mode = setMode;\r
121 \r
122                     Array values = Enum.GetValues(typeof(ActivityLogMode));\r
123                     Properties.Settings.Default.ActivityWindowLastMode = (int) values.GetValue(Convert.ToInt32(setMode));\r
124                     Properties.Settings.Default.Save();\r
125 \r
126                     this.Text = mode == ActivityLogMode.Scan\r
127                                     ? "Activity Window (Scan Log)"\r
128                                     : "Activity Window (Encode Log)";\r
129 \r
130                     if (mode == ActivityLogMode.Scan)\r
131                     {\r
132                         scan.ScanCompleted += stopWindowRefresh;\r
133                         encode.EncodeEnded -= stopWindowRefresh;\r
134                     }\r
135                     else\r
136                     {\r
137                         scan.ScanCompleted -= stopWindowRefresh;\r
138                         encode.EncodeEnded += stopWindowRefresh;\r
139                     }\r
140 \r
141                     // Start a fresh window timer\r
142                     windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);\r
143                 }\r
144             }\r
145         }\r
146 \r
147         /// <summary>\r
148         /// On Window load, start a new timer\r
149         /// </summary>\r
150         /// <param name="sender">\r
151         /// The sender.\r
152         /// </param>\r
153         /// <param name="e">\r
154         /// The e.\r
155         /// </param>\r
156         private void NewActivityWindow_Load(object sender, EventArgs e)\r
157         {\r
158             ActivityLogMode activitLogMode = (ActivityLogMode) Enum.ToObject(typeof(ActivityLogMode), Properties.Settings.Default.ActivityWindowLastMode);\r
159             SetMode(activitLogMode);        \r
160         }\r
161 \r
162         /// <summary>\r
163         /// Set the Log window to encode mode when an encode starts.\r
164         /// </summary>\r
165         /// <param name="sender">\r
166         /// The sender.\r
167         /// </param>\r
168         /// <param name="e">\r
169         /// The e.\r
170         /// </param>\r
171         private void encode_EncodeStarted(object sender, EventArgs e)\r
172         {\r
173             SetMode(ActivityLogMode.Encode);\r
174         }\r
175 \r
176         /// <summary>\r
177         /// Set the log widow to scan mode when a scan starts\r
178         /// </summary>\r
179         /// <param name="sender">\r
180         /// The sender.\r
181         /// </param>\r
182         /// <param name="e">\r
183         /// The e.\r
184         /// </param>\r
185         private void scan_ScanStared(object sender, EventArgs e)\r
186         {\r
187             SetMode(ActivityLogMode.Scan);\r
188         }\r
189 \r
190         /// <summary>\r
191         /// Stop refreshing the window when no scanning or encoding is happening.\r
192         /// </summary>\r
193         /// <param name="sender">\r
194         /// The sender.\r
195         /// </param>\r
196         /// <param name="e">\r
197         /// The e.\r
198         /// </param>\r
199         private void stopWindowRefresh(object sender, EventArgs e)\r
200         {\r
201             windowTimer.Dispose();\r
202             Reset();\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                     return appendText;\r
235                 }\r
236 \r
237                 using (StringReader reader = new StringReader(scan.ActivityLog))\r
238                 {\r
239                     LogReader(reader, appendText);\r
240                 }\r
241             }\r
242             else\r
243             {\r
244                 if (encode == null || encode.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(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         /// Reset Everything\r
345         /// </summary>\r
346         private void Reset()\r
347         {\r
348             if (windowTimer != null)\r
349                 windowTimer.Dispose();\r
350             position = 0;\r
351             ClearWindowText();\r
352             windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);\r
353         }\r
354 \r
355         /* Menus and Buttons */\r
356 \r
357         /// <summary>\r
358         /// Copy log to clipboard\r
359         /// </summary>\r
360         /// <param name="sender">\r
361         /// The sender.\r
362         /// </param>\r
363         /// <param name="e">\r
364         /// The e.\r
365         /// </param>\r
366         private void MnuCopyLogClick(object sender, EventArgs e)\r
367         {\r
368             Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);\r
369         }\r
370 \r
371         /// <summary>\r
372         /// Open the log folder\r
373         /// </summary>\r
374         /// <param name="sender">\r
375         /// The sender.\r
376         /// </param>\r
377         /// <param name="e">\r
378         /// The e.\r
379         /// </param>\r
380         private void MnuOpenLogFolderClick(object sender, EventArgs e)\r
381         {\r
382             string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";\r
383             string windir = Environment.GetEnvironmentVariable("WINDIR");\r
384             Process prc = new Process\r
385                               {\r
386                                   StartInfo =\r
387                                       {\r
388                                           FileName = windir + @"\explorer.exe",\r
389                                           Arguments = logDir\r
390                                       }\r
391                               };\r
392             prc.Start();\r
393         }\r
394 \r
395         /// <summary>\r
396         /// Copy the log\r
397         /// </summary>\r
398         /// <param name="sender">\r
399         /// The sender.\r
400         /// </param>\r
401         /// <param name="e">\r
402         /// The e.\r
403         /// </param>\r
404         private void BtnCopyClick(object sender, EventArgs e)\r
405         {\r
406             Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);\r
407         }\r
408 \r
409         /// <summary>\r
410         /// Set scan mode\r
411         /// </summary>\r
412         /// <param name="sender">\r
413         /// The sender.\r
414         /// </param>\r
415         /// <param name="e">\r
416         /// The e.\r
417         /// </param>\r
418         private void BtnScanLogClick(object sender, EventArgs e)\r
419         {\r
420             SetMode(ActivityLogMode.Scan);\r
421         }\r
422 \r
423         /// <summary>\r
424         /// Set the encode mode\r
425         /// </summary>\r
426         /// <param name="sender">\r
427         /// The sender.\r
428         /// </param>\r
429         /// <param name="e">\r
430         /// The e.\r
431         /// </param>\r
432         private void BtnEncodeLogClick(object sender, EventArgs e)\r
433         {\r
434             SetMode(ActivityLogMode.Encode);\r
435         }\r
436 \r
437         /* Overrides */\r
438 \r
439         /// <summary>\r
440         /// override onclosing\r
441         /// </summary>\r
442         /// <param name="e">\r
443         /// The e.\r
444         /// </param>\r
445         protected override void OnClosing(CancelEventArgs e)\r
446         {\r
447             scan.ScanStared -= scan_ScanStared;\r
448             encode.EncodeStarted -= encode_EncodeStarted;\r
449 \r
450             scan.ScanCompleted -= stopWindowRefresh;\r
451             encode.EncodeEnded -= stopWindowRefresh;\r
452 \r
453             windowTimer.Dispose();\r
454             e.Cancel = true;\r
455             this.Dispose();\r
456             base.OnClosing(e);\r
457         }\r
458     }\r
459 }