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
18 using Timer = System.Threading.Timer;
\r
21 /// The Activity Log Window
\r
23 public partial class frmActivityWindow : Form
\r
25 /* Private Variables */
\r
28 /// The current position in the log file
\r
30 private int position;
\r
33 /// A Timer for this window
\r
35 private Timer windowTimer;
\r
38 /// The Encode Object
\r
40 private Encode encode;
\r
45 private ScanService scan;
\r
48 /// The Type of log that the window is currently dealing with
\r
50 private ActivityLogMode mode;
\r
55 /// Initializes a new instance of the <see cref="frmActivityWindow"/> class.
\r
57 /// <param name="encode">
\r
60 /// <param name="scan">
\r
63 public frmActivityWindow(Encode encode, ScanService scan)
\r
65 InitializeComponent();
\r
67 this.encode = encode;
\r
71 // Listen for Scan and Encode Starting Events
\r
72 scan.ScanStared += scan_ScanStared;
\r
73 encode.EncodeStarted += encode_EncodeStarted;
\r
79 /// A callback function for updating the ui
\r
81 /// <param name="text">
\r
84 private delegate void SetTextCallback(StringBuilder text);
\r
87 /// Clear text callback
\r
89 private delegate void SetTextClearCallback();
\r
92 /// Set mode callback
\r
94 /// <param name="setMode">
\r
97 private delegate void SetModeCallback(ActivityLogMode setMode);
\r
99 /* Private Methods */
\r
102 /// Set the window to scan mode
\r
104 /// <param name="setMode">
\r
107 private void SetMode(ActivityLogMode setMode)
\r
109 if (IsHandleCreated)
\r
111 if (rtf_actLog.InvokeRequired)
\r
113 IAsyncResult invoked = BeginInvoke(new SetModeCallback(SetMode), new object[] {setMode});
\r
114 EndInvoke(invoked);
\r
119 this.mode = setMode;
\r
121 Array values = Enum.GetValues(typeof(ActivityLogMode));
\r
122 Properties.Settings.Default.ActivityWindowLastMode = (int) values.GetValue(Convert.ToInt32(setMode));
\r
123 Properties.Settings.Default.Save();
\r
125 this.Text = mode == ActivityLogMode.Scan
\r
126 ? "Activity Window (Scan Log)"
\r
127 : "Activity Window (Encode Log)";
\r
129 if (mode == ActivityLogMode.Scan)
\r
131 scan.ScanCompleted += stopWindowRefresh;
\r
132 encode.EncodeEnded -= stopWindowRefresh;
\r
136 scan.ScanCompleted -= stopWindowRefresh;
\r
137 encode.EncodeEnded += stopWindowRefresh;
\r
140 // Start a fresh window timer
\r
141 windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);
\r
147 /// On Window load, start a new timer
\r
149 /// <param name="sender">
\r
152 /// <param name="e">
\r
155 private void NewActivityWindow_Load(object sender, EventArgs e)
\r
157 ActivityLogMode activitLogMode = (ActivityLogMode) Enum.ToObject(typeof(ActivityLogMode), Properties.Settings.Default.ActivityWindowLastMode);
\r
158 SetMode(activitLogMode);
\r
162 /// Set the Log window to encode mode when an encode starts.
\r
164 /// <param name="sender">
\r
167 /// <param name="e">
\r
170 private void encode_EncodeStarted(object sender, EventArgs e)
\r
172 SetMode(ActivityLogMode.Encode);
\r
176 /// Set the log widow to scan mode when a scan starts
\r
178 /// <param name="sender">
\r
181 /// <param name="e">
\r
184 private void scan_ScanStared(object sender, EventArgs e)
\r
186 SetMode(ActivityLogMode.Scan);
\r
190 /// Stop refreshing the window when no scanning or encoding is happening.
\r
192 /// <param name="sender">
\r
195 /// <param name="e">
\r
198 private void stopWindowRefresh(object sender, EventArgs e)
\r
200 windowTimer.Dispose();
\r
205 /// Append new text to the window
\r
207 /// <param name="n">
\r
210 private void LogMonitor(object n)
\r
212 AppendWindowText(GetLog());
\r
216 /// New Code for getting the Activity log from the Services rather than reading a file.
\r
219 /// The StringBuilder containing a log
\r
221 private StringBuilder GetLog()
\r
223 StringBuilder appendText = new StringBuilder();
\r
225 if (this.mode == ActivityLogMode.Scan)
\r
227 if (scan == null || scan.ActivityLog == string.Empty)
\r
229 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
252 using (StringReader reader = new StringReader(encode.ActivityLog))
\r
254 LogReader(reader, appendText);
\r
261 /// Reads the log data from a Scan or Encode object
\r
263 /// <param name="reader">
\r
266 /// <param name="appendText">
\r
267 /// The append text.
\r
269 private void LogReader(StringReader reader, StringBuilder appendText)
\r
273 while ((line = reader.ReadLine()) != null)
\r
277 appendText.AppendLine(line);
\r
285 /// Append text to the RTF box
\r
287 /// <param name="text">
\r
290 private void AppendWindowText(StringBuilder text)
\r
294 if (IsHandleCreated)
\r
296 if (rtf_actLog.InvokeRequired)
\r
298 IAsyncResult invoked = BeginInvoke(new SetTextCallback(AppendWindowText), new object[] { text });
\r
299 EndInvoke(invoked);
\r
303 rtf_actLog.AppendText(text.ToString());
\r
305 // Stop the refresh process if log has finished.
\r
306 if (text.ToString().Contains("HandBrake has Exited"))
\r
308 windowTimer.Dispose();
\r
319 /// Clear the contents of the log window
\r
321 private void ClearWindowText()
\r
325 if (IsHandleCreated)
\r
327 if (rtf_actLog.InvokeRequired)
\r
329 IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(ClearWindowText));
\r
330 EndInvoke(invoked);
\r
334 rtf_actLog.Clear();
\r
344 /// Display the log header
\r
346 private void PrintLogHeader()
\r
350 if (IsHandleCreated)
\r
352 if (rtf_actLog.InvokeRequired)
\r
354 IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(PrintLogHeader));
\r
355 EndInvoke(invoked);
\r
361 // Print the log header. This function will be re-implimented later. Do not delete.
\r
362 StringBuilder header = new StringBuilder();
\r
364 header.Append(String.Format("### Windows GUI {1} {0} \n", Properties.Settings.Default.hb_build, Properties.Settings.Default.hb_version));
\r
365 header.Append(String.Format("### Running: {0} \n###\n", Environment.OSVersion));
\r
366 header.Append(String.Format("### CPU: {0} \n", SystemInfo.GetCpuCount));
\r
367 header.Append(String.Format("### Ram: {0} MB \n", SystemInfo.TotalPhysicalMemory));
\r
368 header.Append(String.Format("### Screen: {0}x{1} \n", SystemInfo.ScreenBounds.Bounds.Width, SystemInfo.ScreenBounds.Bounds.Height));
\r
369 header.Append(String.Format("### Temp Dir: {0} \n", Path.GetTempPath()));
\r
370 header.Append(String.Format("### Install Dir: {0} \n", Application.StartupPath));
\r
371 header.Append(String.Format("### Data Dir: {0} \n", Application.UserAppDataPath));
\r
372 header.Append("#########################################\n\n");
\r
374 rtf_actLog.AppendText(header.ToString());
\r
386 /// Reset Everything
\r
388 private void Reset()
\r
390 if (windowTimer != null)
\r
391 windowTimer.Dispose();
\r
395 windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);
\r
398 /* Menus and Buttons */
\r
401 /// Copy log to clipboard
\r
403 /// <param name="sender">
\r
406 /// <param name="e">
\r
409 private void MnuCopyLogClick(object sender, EventArgs e)
\r
411 Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);
\r
415 /// Open the log folder
\r
417 /// <param name="sender">
\r
420 /// <param name="e">
\r
423 private void MnuOpenLogFolderClick(object sender, EventArgs e)
\r
425 string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";
\r
426 string windir = Environment.GetEnvironmentVariable("WINDIR");
\r
427 Process prc = new Process
\r
431 FileName = windir + @"\explorer.exe",
\r
441 /// <param name="sender">
\r
444 /// <param name="e">
\r
447 private void BtnCopyClick(object sender, EventArgs e)
\r
449 Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);
\r
455 /// <param name="sender">
\r
458 /// <param name="e">
\r
461 private void BtnScanLogClick(object sender, EventArgs e)
\r
463 SetMode(ActivityLogMode.Scan);
\r
467 /// Set the encode mode
\r
469 /// <param name="sender">
\r
472 /// <param name="e">
\r
475 private void BtnEncodeLogClick(object sender, EventArgs e)
\r
477 SetMode(ActivityLogMode.Encode);
\r
483 /// override onclosing
\r
485 /// <param name="e">
\r
488 protected override void OnClosing(CancelEventArgs e)
\r
490 scan.ScanStared -= scan_ScanStared;
\r
491 encode.EncodeStarted -= encode_EncodeStarted;
\r
493 scan.ScanCompleted -= stopWindowRefresh;
\r
494 encode.EncodeEnded -= stopWindowRefresh;
\r
496 windowTimer.Dispose();
\r