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.Framework.Services;
\r
17 using HandBrake.Framework.Services.Interfaces;
\r
18 using HandBrake.ApplicationServices.Services.Interfaces;
\r
21 using Timer = System.Threading.Timer;
\r
24 /// The Activity Log Window
\r
26 public partial class frmActivityWindow : Form
\r
28 /* Private Variables */
\r
31 /// The Encode Object
\r
33 private readonly IQueue encode;
\r
38 private readonly IScan scan;
\r
41 /// The Error service
\r
43 private readonly IErrorService errorService = new ErrorService();
\r
46 /// The current position in the log file
\r
48 private int position;
\r
51 /// A Timer for this window
\r
53 private Timer windowTimer;
\r
56 /// The Type of log that the window is currently dealing with
\r
58 private ActivityLogMode mode;
\r
63 /// Initializes a new instance of the <see cref="frmActivityWindow"/> class.
\r
65 /// <param name="encode">
\r
68 /// <param name="scan">
\r
71 public frmActivityWindow(IQueue encode, IScan scan)
\r
73 InitializeComponent();
\r
75 this.encode = encode;
\r
79 // Listen for Scan and Encode Starting Events
\r
80 scan.ScanStared += scan_ScanStared;
\r
81 encode.EncodeStarted += encode_EncodeStarted;
\r
87 /// A callback function for updating the ui
\r
89 /// <param name="text">
\r
92 private delegate void SetTextCallback(StringBuilder text);
\r
95 /// Clear text callback
\r
97 private delegate void SetTextClearCallback();
\r
100 /// Set mode callback
\r
102 /// <param name="setMode">
\r
105 private delegate void SetModeCallback(ActivityLogMode setMode);
\r
107 /* Private Methods */
\r
110 /// Set the window to scan mode
\r
112 /// <param name="setMode">
\r
115 private void SetMode(ActivityLogMode setMode)
\r
117 if (IsHandleCreated)
\r
119 if (rtf_actLog.InvokeRequired)
\r
121 IAsyncResult invoked = BeginInvoke(new SetModeCallback(SetMode), new object[] { setMode });
\r
122 EndInvoke(invoked);
\r
127 this.mode = setMode;
\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
133 this.Text = mode == ActivityLogMode.Scan
\r
134 ? "Activity Window (Scan Log)"
\r
135 : "Activity Window (Encode Log)";
\r
137 if (mode == ActivityLogMode.Scan)
\r
139 scan.ScanCompleted += stopWindowRefresh;
\r
140 encode.EncodeEnded -= stopWindowRefresh;
\r
144 scan.ScanCompleted -= stopWindowRefresh;
\r
145 encode.EncodeEnded += stopWindowRefresh;
\r
148 // Start a fresh window timer
\r
149 windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);
\r
155 /// On Window load, start a new timer
\r
157 /// <param name="sender">
\r
160 /// <param name="e">
\r
163 private void NewActivityWindow_Load(object sender, EventArgs e)
\r
167 ActivityLogMode activitLogMode = (ActivityLogMode)Enum.ToObject(typeof(ActivityLogMode), Properties.Settings.Default.ActivityWindowLastMode);
\r
168 SetMode(activitLogMode);
\r
170 catch (Exception exc)
\r
172 errorService.ShowError("Error during load.", exc.ToString());
\r
177 /// Set the Log window to encode mode when an encode starts.
\r
179 /// <param name="sender">
\r
182 /// <param name="e">
\r
185 private void encode_EncodeStarted(object sender, EventArgs e)
\r
187 SetMode(ActivityLogMode.Encode);
\r
191 /// Set the log widow to scan mode when a scan starts
\r
193 /// <param name="sender">
\r
196 /// <param name="e">
\r
199 private void scan_ScanStared(object sender, EventArgs e)
\r
201 SetMode(ActivityLogMode.Scan);
\r
205 /// Stop refreshing the window when no scanning or encoding is happening.
\r
207 /// <param name="sender">
\r
210 /// <param name="e">
\r
213 private void stopWindowRefresh(object sender, EventArgs e)
\r
215 windowTimer.Dispose();
\r
221 /// Append new text to the window
\r
223 /// <param name="n">
\r
226 private void LogMonitor(object n)
\r
228 AppendWindowText(GetLog());
\r
232 /// New Code for getting the Activity log from the Services rather than reading a file.
\r
235 /// The StringBuilder containing a log
\r
237 private StringBuilder GetLog()
\r
239 StringBuilder appendText = new StringBuilder();
\r
243 if (this.mode == ActivityLogMode.Scan)
\r
245 if (scan == null || scan.ActivityLog == string.Empty)
\r
247 appendText.AppendFormat("Waiting for the log to be generated ...\n");
\r
253 using (StringReader reader = new StringReader(scan.ActivityLog))
\r
255 LogReader(reader, appendText);
\r
260 if (encode == null || encode.ActivityLog == string.Empty)
\r
262 appendText.AppendFormat("Waiting for the log to be generated ...\n");
\r
268 using (StringReader reader = new StringReader(encode.ActivityLog))
\r
270 LogReader(reader, appendText);
\r
274 catch (Exception exc)
\r
276 windowTimer.Dispose();
\r
277 errorService.ShowError("GetLog() Error", exc.ToString());
\r
284 /// Reads the log data from a Scan or Encode object
\r
286 /// <param name="reader">
\r
289 /// <param name="appendText">
\r
290 /// The append text.
\r
292 private void LogReader(StringReader reader, StringBuilder appendText)
\r
296 while ((line = reader.ReadLine()) != null)
\r
300 appendText.AppendLine(line);
\r
308 /// Append text to the RTF box
\r
310 /// <param name="text">
\r
313 private void AppendWindowText(StringBuilder text)
\r
317 if (IsHandleCreated)
\r
319 if (rtf_actLog.InvokeRequired)
\r
321 IAsyncResult invoked = BeginInvoke(new SetTextCallback(AppendWindowText), new object[] { text });
\r
322 EndInvoke(invoked);
\r
326 rtf_actLog.AppendText(text.ToString());
\r
328 // Stop the refresh process if log has finished.
\r
329 if (text.ToString().Contains("HandBrake has Exited"))
\r
331 windowTimer.Dispose();
\r
342 /// Clear the contents of the log window
\r
344 private void ClearWindowText()
\r
348 if (IsHandleCreated)
\r
350 if (rtf_actLog.InvokeRequired)
\r
352 IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(ClearWindowText));
\r
353 EndInvoke(invoked);
\r
357 rtf_actLog.Clear();
\r
367 /// Reset Everything
\r
369 private void Reset()
\r
371 if (windowTimer != null)
\r
372 windowTimer.Dispose();
\r
375 windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);
\r
378 /* Menus and Buttons */
\r
381 /// Copy log to clipboard
\r
383 /// <param name="sender">
\r
386 /// <param name="e">
\r
389 private void MnuCopyLogClick(object sender, EventArgs e)
\r
391 Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);
\r
395 /// Open the log folder
\r
397 /// <param name="sender">
\r
400 /// <param name="e">
\r
403 private void MnuOpenLogFolderClick(object sender, EventArgs e)
\r
405 string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";
\r
406 string windir = Environment.GetEnvironmentVariable("WINDIR");
\r
407 Process prc = new Process
\r
411 FileName = windir + @"\explorer.exe",
\r
421 /// <param name="sender">
\r
424 /// <param name="e">
\r
427 private void BtnCopyClick(object sender, EventArgs e)
\r
429 Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);
\r
435 /// <param name="sender">
\r
438 /// <param name="e">
\r
441 private void BtnScanLogClick(object sender, EventArgs e)
\r
443 SetMode(ActivityLogMode.Scan);
\r
447 /// Set the encode mode
\r
449 /// <param name="sender">
\r
452 /// <param name="e">
\r
455 private void BtnEncodeLogClick(object sender, EventArgs e)
\r
457 SetMode(ActivityLogMode.Encode);
\r
463 /// override onclosing
\r
465 /// <param name="e">
\r
468 protected override void OnClosing(CancelEventArgs e)
\r
470 scan.ScanStared -= scan_ScanStared;
\r
471 encode.EncodeStarted -= encode_EncodeStarted;
\r
473 scan.ScanCompleted -= stopWindowRefresh;
\r
474 encode.EncodeEnded -= stopWindowRefresh;
\r
476 windowTimer.Dispose();
\r