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
9 using System.ComponentModel;
\r
10 using System.Diagnostics;
\r
13 using System.Threading;
\r
14 using System.Windows.Forms;
\r
16 using HandBrake.ApplicationServices.Services;
\r
17 using HandBrake.ApplicationServices.Services.Interfaces;
\r
20 using Timer = System.Threading.Timer;
\r
23 /// The Activity Log Window
\r
25 public partial class frmActivityWindow : Form
\r
27 /* Private Variables */
\r
30 /// The Encode Object
\r
32 private readonly IQueue encode;
\r
37 private readonly IScan scan;
\r
40 /// The Error service
\r
42 private readonly IErrorService errorService = new ErrorService();
\r
45 /// The current position in the log file
\r
47 private int position;
\r
50 /// A Timer for this window
\r
52 private Timer windowTimer;
\r
55 /// The Type of log that the window is currently dealing with
\r
57 private ActivityLogMode mode;
\r
62 /// Initializes a new instance of the <see cref="frmActivityWindow"/> class.
\r
64 /// <param name="encode">
\r
67 /// <param name="scan">
\r
70 public frmActivityWindow(IQueue encode, IScan scan)
\r
72 InitializeComponent();
\r
74 this.encode = encode;
\r
78 // Listen for Scan and Encode Starting Events
\r
79 scan.ScanStared += scan_ScanStared;
\r
80 encode.EncodeStarted += encode_EncodeStarted;
\r
86 /// A callback function for updating the ui
\r
88 /// <param name="text">
\r
91 private delegate void SetTextCallback(StringBuilder text);
\r
94 /// Clear text callback
\r
96 private delegate void SetTextClearCallback();
\r
99 /// Set mode callback
\r
101 /// <param name="setMode">
\r
104 private delegate void SetModeCallback(ActivityLogMode setMode);
\r
106 /* Private Methods */
\r
109 /// Set the window to scan mode
\r
111 /// <param name="setMode">
\r
114 private void SetMode(ActivityLogMode setMode)
\r
116 if (IsHandleCreated)
\r
118 if (rtf_actLog.InvokeRequired)
\r
120 IAsyncResult invoked = BeginInvoke(new SetModeCallback(SetMode), new object[] { setMode });
\r
121 EndInvoke(invoked);
\r
126 this.mode = setMode;
\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
132 this.Text = mode == ActivityLogMode.Scan
\r
133 ? "Activity Window (Scan Log)"
\r
134 : "Activity Window (Encode Log)";
\r
136 if (mode == ActivityLogMode.Scan)
\r
138 scan.ScanCompleted += stopWindowRefresh;
\r
139 encode.EncodeEnded -= stopWindowRefresh;
\r
143 scan.ScanCompleted -= stopWindowRefresh;
\r
144 encode.EncodeEnded += stopWindowRefresh;
\r
147 // Start a fresh window timer
\r
148 windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);
\r
154 /// On Window load, start a new timer
\r
156 /// <param name="sender">
\r
159 /// <param name="e">
\r
162 private void NewActivityWindow_Load(object sender, EventArgs e)
\r
166 ActivityLogMode activitLogMode = (ActivityLogMode)Enum.ToObject(typeof(ActivityLogMode), Properties.Settings.Default.ActivityWindowLastMode);
\r
167 SetMode(activitLogMode);
\r
169 catch (Exception exc)
\r
171 errorService.ShowError("Error during load.", exc.ToString());
\r
176 /// Set the Log window to encode mode when an encode starts.
\r
178 /// <param name="sender">
\r
181 /// <param name="e">
\r
184 private void encode_EncodeStarted(object sender, EventArgs e)
\r
186 SetMode(ActivityLogMode.Encode);
\r
190 /// Set the log widow to scan mode when a scan starts
\r
192 /// <param name="sender">
\r
195 /// <param name="e">
\r
198 private void scan_ScanStared(object sender, EventArgs e)
\r
200 SetMode(ActivityLogMode.Scan);
\r
204 /// Stop refreshing the window when no scanning or encoding is happening.
\r
206 /// <param name="sender">
\r
209 /// <param name="e">
\r
212 private void stopWindowRefresh(object sender, EventArgs e)
\r
214 windowTimer.Dispose();
\r
220 /// Append new text to the window
\r
222 /// <param name="n">
\r
225 private void LogMonitor(object n)
\r
227 AppendWindowText(GetLog());
\r
231 /// New Code for getting the Activity log from the Services rather than reading a file.
\r
234 /// The StringBuilder containing a log
\r
236 private StringBuilder GetLog()
\r
238 StringBuilder appendText = new StringBuilder();
\r
242 if (this.mode == ActivityLogMode.Scan)
\r
244 if (scan == null || scan.ActivityLog == string.Empty)
\r
246 appendText.AppendFormat("Waiting for the log to be generated ...\n");
\r
252 using (StringReader reader = new StringReader(scan.ActivityLog))
\r
254 LogReader(reader, appendText);
\r
259 if (encode == null || encode.ActivityLog == string.Empty)
\r
261 appendText.AppendFormat("Waiting for the log to be generated ...\n");
\r
267 using (StringReader reader = new StringReader(encode.ActivityLog))
\r
269 LogReader(reader, appendText);
\r
273 catch (Exception exc)
\r
275 windowTimer.Dispose();
\r
276 errorService.ShowError("GetLog() Error", exc.ToString());
\r
283 /// Reads the log data from a Scan or Encode object
\r
285 /// <param name="reader">
\r
288 /// <param name="appendText">
\r
289 /// The append text.
\r
291 private void LogReader(StringReader reader, StringBuilder appendText)
\r
295 while ((line = reader.ReadLine()) != null)
\r
299 appendText.AppendLine(line);
\r
307 /// Append text to the RTF box
\r
309 /// <param name="text">
\r
312 private void AppendWindowText(StringBuilder text)
\r
316 if (IsHandleCreated)
\r
318 if (rtf_actLog.InvokeRequired)
\r
320 IAsyncResult invoked = BeginInvoke(new SetTextCallback(AppendWindowText), new object[] { text });
\r
321 EndInvoke(invoked);
\r
325 rtf_actLog.AppendText(text.ToString());
\r
327 // Stop the refresh process if log has finished.
\r
328 if (text.ToString().Contains("HandBrake has Exited"))
\r
330 windowTimer.Dispose();
\r
341 /// Clear the contents of the log window
\r
343 private void ClearWindowText()
\r
347 if (IsHandleCreated)
\r
349 if (rtf_actLog.InvokeRequired)
\r
351 IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(ClearWindowText));
\r
352 EndInvoke(invoked);
\r
356 rtf_actLog.Clear();
\r
366 /// Reset Everything
\r
368 private void Reset()
\r
370 if (windowTimer != null)
\r
371 windowTimer.Dispose();
\r
374 windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);
\r
377 /* Menus and Buttons */
\r
380 /// Copy log to clipboard
\r
382 /// <param name="sender">
\r
385 /// <param name="e">
\r
388 private void MnuCopyLogClick(object sender, EventArgs e)
\r
390 Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);
\r
394 /// Open the log folder
\r
396 /// <param name="sender">
\r
399 /// <param name="e">
\r
402 private void MnuOpenLogFolderClick(object sender, EventArgs e)
\r
404 string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";
\r
405 string windir = Environment.GetEnvironmentVariable("WINDIR");
\r
406 Process prc = new Process
\r
410 FileName = windir + @"\explorer.exe",
\r
420 /// <param name="sender">
\r
423 /// <param name="e">
\r
426 private void BtnCopyClick(object sender, EventArgs e)
\r
428 Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);
\r
434 /// <param name="sender">
\r
437 /// <param name="e">
\r
440 private void BtnScanLogClick(object sender, EventArgs e)
\r
442 SetMode(ActivityLogMode.Scan);
\r
446 /// Set the encode mode
\r
448 /// <param name="sender">
\r
451 /// <param name="e">
\r
454 private void BtnEncodeLogClick(object sender, EventArgs e)
\r
456 SetMode(ActivityLogMode.Encode);
\r
462 /// override onclosing
\r
464 /// <param name="e">
\r
467 protected override void OnClosing(CancelEventArgs e)
\r
469 scan.ScanStared -= scan_ScanStared;
\r
470 encode.EncodeStarted -= encode_EncodeStarted;
\r
472 scan.ScanCompleted -= stopWindowRefresh;
\r
473 encode.EncodeEnded -= stopWindowRefresh;
\r
475 windowTimer.Dispose();
\r