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
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 current position in the log file
\r
32 private int position;
\r
35 /// A Timer for this window
\r
37 private Timer windowTimer;
\r
40 /// The Encode Object
\r
42 private IQueue encode;
\r
50 /// The Type of log that the window is currently dealing with
\r
52 private ActivityLogMode mode;
\r
57 /// Initializes a new instance of the <see cref="frmActivityWindow"/> class.
\r
59 /// <param name="encode">
\r
62 /// <param name="scan">
\r
65 public frmActivityWindow(IQueue encode, IScan scan)
\r
67 InitializeComponent();
\r
69 this.encode = encode;
\r
73 // Listen for Scan and Encode Starting Events
\r
74 scan.ScanStared += scan_ScanStared;
\r
75 encode.EncodeStarted += encode_EncodeStarted;
\r
81 /// A callback function for updating the ui
\r
83 /// <param name="text">
\r
86 private delegate void SetTextCallback(StringBuilder text);
\r
89 /// Clear text callback
\r
91 private delegate void SetTextClearCallback();
\r
94 /// Set mode callback
\r
96 /// <param name="setMode">
\r
99 private delegate void SetModeCallback(ActivityLogMode setMode);
\r
101 /* Private Methods */
\r
104 /// Set the window to scan mode
\r
106 /// <param name="setMode">
\r
109 private void SetMode(ActivityLogMode setMode)
\r
111 if (IsHandleCreated)
\r
113 if (rtf_actLog.InvokeRequired)
\r
115 IAsyncResult invoked = BeginInvoke(new SetModeCallback(SetMode), new object[] {setMode});
\r
116 EndInvoke(invoked);
\r
121 this.mode = setMode;
\r
123 Array values = Enum.GetValues(typeof(ActivityLogMode));
\r
124 Properties.Settings.Default.ActivityWindowLastMode = (int) values.GetValue(Convert.ToInt32(setMode));
\r
125 Properties.Settings.Default.Save();
\r
127 this.Text = mode == ActivityLogMode.Scan
\r
128 ? "Activity Window (Scan Log)"
\r
129 : "Activity Window (Encode Log)";
\r
131 if (mode == ActivityLogMode.Scan)
\r
133 scan.ScanCompleted += stopWindowRefresh;
\r
134 encode.EncodeEnded -= stopWindowRefresh;
\r
138 scan.ScanCompleted -= stopWindowRefresh;
\r
139 encode.EncodeEnded += stopWindowRefresh;
\r
142 // Start a fresh window timer
\r
143 windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);
\r
149 /// On Window load, start a new timer
\r
151 /// <param name="sender">
\r
154 /// <param name="e">
\r
157 private void NewActivityWindow_Load(object sender, EventArgs e)
\r
159 ActivityLogMode activitLogMode = (ActivityLogMode) Enum.ToObject(typeof(ActivityLogMode), Properties.Settings.Default.ActivityWindowLastMode);
\r
160 SetMode(activitLogMode);
\r
164 /// Set the Log window to encode mode when an encode starts.
\r
166 /// <param name="sender">
\r
169 /// <param name="e">
\r
172 private void encode_EncodeStarted(object sender, EventArgs e)
\r
174 SetMode(ActivityLogMode.Encode);
\r
178 /// Set the log widow to scan mode when a scan starts
\r
180 /// <param name="sender">
\r
183 /// <param name="e">
\r
186 private void scan_ScanStared(object sender, EventArgs e)
\r
188 SetMode(ActivityLogMode.Scan);
\r
192 /// Stop refreshing the window when no scanning or encoding is happening.
\r
194 /// <param name="sender">
\r
197 /// <param name="e">
\r
200 private void stopWindowRefresh(object sender, EventArgs e)
\r
202 windowTimer.Dispose();
\r
207 /// Append new text to the window
\r
209 /// <param name="n">
\r
212 private void LogMonitor(object n)
\r
214 AppendWindowText(GetLog());
\r
218 /// New Code for getting the Activity log from the Services rather than reading a file.
\r
221 /// The StringBuilder containing a log
\r
223 private StringBuilder GetLog()
\r
225 StringBuilder appendText = new StringBuilder();
\r
227 if (this.mode == ActivityLogMode.Scan)
\r
229 if (scan == null || scan.ActivityLog == string.Empty)
\r
231 appendText.AppendFormat("Waiting for the log to be generated ...\n");
\r
238 using (StringReader reader = new StringReader(scan.ActivityLog))
\r
240 LogReader(reader, appendText);
\r
245 if (encode == null || encode.ActivityLog == string.Empty)
\r
247 appendText.AppendFormat("Waiting for the log to be generated ...\n");
\r
254 using (StringReader reader = new StringReader(encode.ActivityLog))
\r
256 LogReader(reader, appendText);
\r
263 /// Reads the log data from a Scan or Encode object
\r
265 /// <param name="reader">
\r
268 /// <param name="appendText">
\r
269 /// The append text.
\r
271 private void LogReader(StringReader reader, StringBuilder appendText)
\r
275 while ((line = reader.ReadLine()) != null)
\r
279 appendText.AppendLine(line);
\r
287 /// Append text to the RTF box
\r
289 /// <param name="text">
\r
292 private void AppendWindowText(StringBuilder text)
\r
296 if (IsHandleCreated)
\r
298 if (rtf_actLog.InvokeRequired)
\r
300 IAsyncResult invoked = BeginInvoke(new SetTextCallback(AppendWindowText), new object[] { text });
\r
301 EndInvoke(invoked);
\r
305 rtf_actLog.AppendText(text.ToString());
\r
307 // Stop the refresh process if log has finished.
\r
308 if (text.ToString().Contains("HandBrake has Exited"))
\r
310 windowTimer.Dispose();
\r
321 /// Clear the contents of the log window
\r
323 private void ClearWindowText()
\r
327 if (IsHandleCreated)
\r
329 if (rtf_actLog.InvokeRequired)
\r
331 IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(ClearWindowText));
\r
332 EndInvoke(invoked);
\r
336 rtf_actLog.Clear();
\r
346 /// Display the log header
\r
348 private void PrintLogHeader()
\r
352 if (IsHandleCreated)
\r
354 if (rtf_actLog.InvokeRequired)
\r
356 IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(PrintLogHeader));
\r
357 EndInvoke(invoked);
\r
363 // Print the log header. This function will be re-implimented later. Do not delete.
\r
364 StringBuilder header = new StringBuilder();
\r
366 header.Append(String.Format("### Windows GUI {1} {0} \n", Properties.Settings.Default.hb_build, Properties.Settings.Default.hb_version));
\r
367 header.Append(String.Format("### Running: {0} \n###\n", Environment.OSVersion));
\r
368 header.Append(String.Format("### CPU: {0} \n", SystemInfo.GetCpuCount));
\r
369 header.Append(String.Format("### Ram: {0} MB \n", SystemInfo.TotalPhysicalMemory));
\r
370 header.Append(String.Format("### Screen: {0}x{1} \n", SystemInfo.ScreenBounds.Bounds.Width, SystemInfo.ScreenBounds.Bounds.Height));
\r
371 header.Append(String.Format("### Temp Dir: {0} \n", Path.GetTempPath()));
\r
372 header.Append(String.Format("### Install Dir: {0} \n", Application.StartupPath));
\r
373 header.Append(String.Format("### Data Dir: {0} \n", Application.UserAppDataPath));
\r
374 header.Append("#########################################\n\n");
\r
376 rtf_actLog.AppendText(header.ToString());
\r
388 /// Reset Everything
\r
390 private void Reset()
\r
392 if (windowTimer != null)
\r
393 windowTimer.Dispose();
\r
397 windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);
\r
400 /* Menus and Buttons */
\r
403 /// Copy log to clipboard
\r
405 /// <param name="sender">
\r
408 /// <param name="e">
\r
411 private void MnuCopyLogClick(object sender, EventArgs e)
\r
413 Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);
\r
417 /// Open the log folder
\r
419 /// <param name="sender">
\r
422 /// <param name="e">
\r
425 private void MnuOpenLogFolderClick(object sender, EventArgs e)
\r
427 string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";
\r
428 string windir = Environment.GetEnvironmentVariable("WINDIR");
\r
429 Process prc = new Process
\r
433 FileName = windir + @"\explorer.exe",
\r
443 /// <param name="sender">
\r
446 /// <param name="e">
\r
449 private void BtnCopyClick(object sender, EventArgs e)
\r
451 Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);
\r
457 /// <param name="sender">
\r
460 /// <param name="e">
\r
463 private void BtnScanLogClick(object sender, EventArgs e)
\r
465 SetMode(ActivityLogMode.Scan);
\r
469 /// Set the encode mode
\r
471 /// <param name="sender">
\r
474 /// <param name="e">
\r
477 private void BtnEncodeLogClick(object sender, EventArgs e)
\r
479 SetMode(ActivityLogMode.Encode);
\r
485 /// override onclosing
\r
487 /// <param name="e">
\r
490 protected override void OnClosing(CancelEventArgs e)
\r
492 scan.ScanStared -= scan_ScanStared;
\r
493 encode.EncodeStarted -= encode_EncodeStarted;
\r
495 scan.ScanCompleted -= stopWindowRefresh;
\r
496 encode.EncodeEnded -= stopWindowRefresh;
\r
498 windowTimer.Dispose();
\r