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.Interfaces;
\r
19 using Timer = System.Threading.Timer;
\r
22 /// The Activity Log Window
\r
24 public partial class frmActivityWindow : Form
\r
26 /* Private Variables */
\r
29 /// The current position in the log file
\r
31 private int position;
\r
34 /// A Timer for this window
\r
36 private Timer windowTimer;
\r
39 /// The Encode Object
\r
41 private IQueue encode;
\r
49 /// The Type of log that the window is currently dealing with
\r
51 private ActivityLogMode mode;
\r
56 /// Initializes a new instance of the <see cref="frmActivityWindow"/> class.
\r
58 /// <param name="encode">
\r
61 /// <param name="scan">
\r
64 public frmActivityWindow(IQueue encode, IScan scan)
\r
66 InitializeComponent();
\r
68 this.encode = encode;
\r
72 // Listen for Scan and Encode Starting Events
\r
73 scan.ScanStared += scan_ScanStared;
\r
74 encode.EncodeStarted += encode_EncodeStarted;
\r
80 /// A callback function for updating the ui
\r
82 /// <param name="text">
\r
85 private delegate void SetTextCallback(StringBuilder text);
\r
88 /// Clear text callback
\r
90 private delegate void SetTextClearCallback();
\r
93 /// Set mode callback
\r
95 /// <param name="setMode">
\r
98 private delegate void SetModeCallback(ActivityLogMode setMode);
\r
100 /* Private Methods */
\r
103 /// Set the window to scan mode
\r
105 /// <param name="setMode">
\r
108 private void SetMode(ActivityLogMode setMode)
\r
110 if (IsHandleCreated)
\r
112 if (rtf_actLog.InvokeRequired)
\r
114 IAsyncResult invoked = BeginInvoke(new SetModeCallback(SetMode), new object[] {setMode});
\r
115 EndInvoke(invoked);
\r
120 this.mode = setMode;
\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
126 this.Text = mode == ActivityLogMode.Scan
\r
127 ? "Activity Window (Scan Log)"
\r
128 : "Activity Window (Encode Log)";
\r
130 if (mode == ActivityLogMode.Scan)
\r
132 scan.ScanCompleted += stopWindowRefresh;
\r
133 encode.EncodeEnded -= stopWindowRefresh;
\r
137 scan.ScanCompleted -= stopWindowRefresh;
\r
138 encode.EncodeEnded += stopWindowRefresh;
\r
141 // Start a fresh window timer
\r
142 windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);
\r
148 /// On Window load, start a new timer
\r
150 /// <param name="sender">
\r
153 /// <param name="e">
\r
156 private void NewActivityWindow_Load(object sender, EventArgs e)
\r
158 ActivityLogMode activitLogMode = (ActivityLogMode) Enum.ToObject(typeof(ActivityLogMode), Properties.Settings.Default.ActivityWindowLastMode);
\r
159 SetMode(activitLogMode);
\r
163 /// Set the Log window to encode mode when an encode starts.
\r
165 /// <param name="sender">
\r
168 /// <param name="e">
\r
171 private void encode_EncodeStarted(object sender, EventArgs e)
\r
173 SetMode(ActivityLogMode.Encode);
\r
177 /// Set the log widow to scan mode when a scan starts
\r
179 /// <param name="sender">
\r
182 /// <param name="e">
\r
185 private void scan_ScanStared(object sender, EventArgs e)
\r
187 SetMode(ActivityLogMode.Scan);
\r
191 /// Stop refreshing the window when no scanning or encoding is happening.
\r
193 /// <param name="sender">
\r
196 /// <param name="e">
\r
199 private void stopWindowRefresh(object sender, EventArgs e)
\r
201 windowTimer.Dispose();
\r
206 /// Append new text to the window
\r
208 /// <param name="n">
\r
211 private void LogMonitor(object n)
\r
213 AppendWindowText(GetLog());
\r
217 /// New Code for getting the Activity log from the Services rather than reading a file.
\r
220 /// The StringBuilder containing a log
\r
222 private StringBuilder GetLog()
\r
224 StringBuilder appendText = new StringBuilder();
\r
226 if (this.mode == ActivityLogMode.Scan)
\r
228 if (scan == null || scan.ActivityLog == string.Empty)
\r
230 appendText.AppendFormat("Waiting for the log to be generated ...\n");
\r
236 using (StringReader reader = new StringReader(scan.ActivityLog))
\r
238 LogReader(reader, appendText);
\r
243 if (encode == null || encode.ActivityLog == string.Empty)
\r
245 appendText.AppendFormat("Waiting for the log to be generated ...\n");
\r
251 using (StringReader reader = new StringReader(encode.ActivityLog))
\r
253 LogReader(reader, appendText);
\r
260 /// Reads the log data from a Scan or Encode object
\r
262 /// <param name="reader">
\r
265 /// <param name="appendText">
\r
266 /// The append text.
\r
268 private void LogReader(StringReader reader, StringBuilder appendText)
\r
272 while ((line = reader.ReadLine()) != null)
\r
276 appendText.AppendLine(line);
\r
284 /// Append text to the RTF box
\r
286 /// <param name="text">
\r
289 private void AppendWindowText(StringBuilder text)
\r
293 if (IsHandleCreated)
\r
295 if (rtf_actLog.InvokeRequired)
\r
297 IAsyncResult invoked = BeginInvoke(new SetTextCallback(AppendWindowText), new object[] { text });
\r
298 EndInvoke(invoked);
\r
302 rtf_actLog.AppendText(text.ToString());
\r
304 // Stop the refresh process if log has finished.
\r
305 if (text.ToString().Contains("HandBrake has Exited"))
\r
307 windowTimer.Dispose();
\r
318 /// Clear the contents of the log window
\r
320 private void ClearWindowText()
\r
324 if (IsHandleCreated)
\r
326 if (rtf_actLog.InvokeRequired)
\r
328 IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(ClearWindowText));
\r
329 EndInvoke(invoked);
\r
333 rtf_actLog.Clear();
\r
343 /// Reset Everything
\r
345 private void Reset()
\r
347 if (windowTimer != null)
\r
348 windowTimer.Dispose();
\r
351 windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);
\r
354 /* Menus and Buttons */
\r
357 /// Copy log to clipboard
\r
359 /// <param name="sender">
\r
362 /// <param name="e">
\r
365 private void MnuCopyLogClick(object sender, EventArgs e)
\r
367 Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);
\r
371 /// Open the log folder
\r
373 /// <param name="sender">
\r
376 /// <param name="e">
\r
379 private void MnuOpenLogFolderClick(object sender, EventArgs e)
\r
381 string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";
\r
382 string windir = Environment.GetEnvironmentVariable("WINDIR");
\r
383 Process prc = new Process
\r
387 FileName = windir + @"\explorer.exe",
\r
397 /// <param name="sender">
\r
400 /// <param name="e">
\r
403 private void BtnCopyClick(object sender, EventArgs e)
\r
405 Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);
\r
411 /// <param name="sender">
\r
414 /// <param name="e">
\r
417 private void BtnScanLogClick(object sender, EventArgs e)
\r
419 SetMode(ActivityLogMode.Scan);
\r
423 /// Set the encode mode
\r
425 /// <param name="sender">
\r
428 /// <param name="e">
\r
431 private void BtnEncodeLogClick(object sender, EventArgs e)
\r
433 SetMode(ActivityLogMode.Encode);
\r
439 /// override onclosing
\r
441 /// <param name="e">
\r
444 protected override void OnClosing(CancelEventArgs e)
\r
446 scan.ScanStared -= scan_ScanStared;
\r
447 encode.EncodeStarted -= encode_EncodeStarted;
\r
449 scan.ScanCompleted -= stopWindowRefresh;
\r
450 encode.EncodeEnded -= stopWindowRefresh;
\r
452 windowTimer.Dispose();
\r