X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=win%2FC%23%2FfrmActivityWindow.cs;h=ee3d3bf750d20980f044f3efd290bbfaad629469;hb=4560ade3c833f282f02d15a9473e233488617df9;hp=dc8b7a642a0933384077f0c2c87cffda32b449ad;hpb=76a5e6eea6cce52113a35f84634d41fc2a642b1e;p=handbrake-jp%2Fhandbrake-jp-git.git
diff --git a/win/C#/frmActivityWindow.cs b/win/C#/frmActivityWindow.cs
index dc8b7a64..ee3d3bf7 100644
--- a/win/C#/frmActivityWindow.cs
+++ b/win/C#/frmActivityWindow.cs
@@ -1,82 +1,477 @@
/* frmActivityWindow.cs $
-
- This file is part of the HandBrake source code.
- Homepage: .
- It may be used under the terms of the GNU General Public License. */
-
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Text;
-using System.Windows.Forms;
-using System.IO;
-
+ This file is part of the HandBrake source code.
+ Homepage: .
+ It may be used under the terms of the GNU General Public License. */
namespace Handbrake
{
+ using System;
+ using System.ComponentModel;
+ using System.Diagnostics;
+ using System.IO;
+ using System.Text;
+ using System.Threading;
+ using System.Windows.Forms;
+
+ using HandBrake.Framework.Services;
+ using HandBrake.Framework.Services.Interfaces;
+ using HandBrake.ApplicationServices.Services.Interfaces;
+
+ using Model;
+ using Timer = System.Threading.Timer;
+
+ ///
+ /// The Activity Log Window
+ ///
public partial class frmActivityWindow : Form
{
+ /* Private Variables */
+
///
- /// This window should be used to display the RAW output of the handbrake CLI which is produced during an encode.
+ /// The Encode Object
///
- public frmActivityWindow()
+ private readonly IQueue encode;
+
+ ///
+ /// The Scan Object
+ ///
+ private readonly IScan scan;
+
+ ///
+ /// The Error service
+ ///
+ private readonly IErrorService errorService = new ErrorService();
+
+ ///
+ /// The current position in the log file
+ ///
+ private int position;
+
+ ///
+ /// A Timer for this window
+ ///
+ private Timer windowTimer;
+
+ ///
+ /// The Type of log that the window is currently dealing with
+ ///
+ private ActivityLogMode mode;
+
+ /* Constructor */
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ ///
+ /// The encode.
+ ///
+ ///
+ /// The scan.
+ ///
+ public frmActivityWindow(IQueue encode, IScan scan)
{
InitializeComponent();
- this.rtf_actLog.Text = string.Empty;
+
+ this.encode = encode;
+ this.scan = scan;
+ this.position = 0;
+
+ // Listen for Scan and Encode Starting Events
+ scan.ScanStared += scan_ScanStared;
+ encode.EncodeStarted += encode_EncodeStarted;
+ }
+
+ /* Delegates */
+
+ ///
+ /// A callback function for updating the ui
+ ///
+ ///
+ /// The text.
+ ///
+ private delegate void SetTextCallback(StringBuilder text);
+
+ ///
+ /// Clear text callback
+ ///
+ private delegate void SetTextClearCallback();
+
+ ///
+ /// Set mode callback
+ ///
+ ///
+ /// The set mode.
+ ///
+ private delegate void SetModeCallback(ActivityLogMode setMode);
+
+ /* Private Methods */
+
+ ///
+ /// Set the window to scan mode
+ ///
+ ///
+ /// The set Mode.
+ ///
+ private void SetMode(ActivityLogMode setMode)
+ {
+ if (IsHandleCreated)
+ {
+ if (rtf_actLog.InvokeRequired)
+ {
+ IAsyncResult invoked = BeginInvoke(new SetModeCallback(SetMode), new object[] { setMode });
+ EndInvoke(invoked);
+ }
+ else
+ {
+ Reset();
+ this.mode = setMode;
+
+ Array values = Enum.GetValues(typeof(ActivityLogMode));
+ Properties.Settings.Default.ActivityWindowLastMode = (int)values.GetValue(Convert.ToInt32(setMode));
+ Properties.Settings.Default.Save();
+
+ this.Text = mode == ActivityLogMode.Scan
+ ? "Activity Window (Scan Log)"
+ : "Activity Window (Encode Log)";
+
+ if (mode == ActivityLogMode.Scan)
+ {
+ scan.ScanCompleted += stopWindowRefresh;
+ encode.EncodeEnded -= stopWindowRefresh;
+ }
+ else
+ {
+ scan.ScanCompleted -= stopWindowRefresh;
+ encode.EncodeEnded += stopWindowRefresh;
+ }
+
+ // Start a fresh window timer
+ windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);
+ }
+ }
}
- private void btn_close_Click(object sender, EventArgs e)
+ ///
+ /// On Window load, start a new timer
+ ///
+ ///
+ /// The sender.
+ ///
+ ///
+ /// The EventArgs.
+ ///
+ private void ActivityWindowLoad(object sender, EventArgs e)
{
- this.Hide();
+ try
+ {
+ // Set the inital log file.
+ if (encode.IsEncoding)
+ {
+ this.logSelector.SelectedIndex = 1;
+ }
+ else if (scan.IsScanning)
+ {
+ this.logSelector.SelectedIndex = 0;
+ }
+ else
+ {
+ // Otherwise, use the last mode the window was in.
+ ActivityLogMode activitLogMode = (ActivityLogMode)Enum.ToObject(typeof(ActivityLogMode), Properties.Settings.Default.ActivityWindowLastMode);
+ this.logSelector.SelectedIndex = activitLogMode == ActivityLogMode.Scan ? 0 : 1;
+ }
+ }
+ catch (Exception exc)
+ {
+ errorService.ShowError("Error during load.", exc.ToString());
+ }
}
- private void frmActivityWindow_Load(object sender, EventArgs e)
+ ///
+ /// Set the Log window to encode mode when an encode starts.
+ ///
+ ///
+ /// The sender.
+ ///
+ ///
+ /// The e.
+ ///
+ private void encode_EncodeStarted(object sender, EventArgs e)
{
- this.rtf_actLog.Text = string.Empty;
- readFile();
+ SetMode(ActivityLogMode.Encode);
}
- private void readFile()
+ ///
+ /// Set the log widow to scan mode when a scan starts
+ ///
+ ///
+ /// The sender.
+ ///
+ ///
+ /// The e.
+ ///
+ private void scan_ScanStared(object sender, EventArgs e)
{
+ SetMode(ActivityLogMode.Scan);
+ }
+
+ ///
+ /// Stop refreshing the window when no scanning or encoding is happening.
+ ///
+ ///
+ /// The sender.
+ ///
+ ///
+ /// The e.
+ ///
+ private void stopWindowRefresh(object sender, EventArgs e)
+ {
+ windowTimer.Dispose();
+ Reset();
+ LogMonitor(null);
+ }
+
+ ///
+ /// Append new text to the window
+ ///
+ ///
+ /// The n.
+ ///
+ private void LogMonitor(object n)
+ {
+ AppendWindowText(GetLog());
+ }
+
+ ///
+ /// New Code for getting the Activity log from the Services rather than reading a file.
+ ///
+ ///
+ /// The StringBuilder containing a log
+ ///
+ private StringBuilder GetLog()
+ {
+ StringBuilder appendText = new StringBuilder();
+
try
{
- string dvdInfoPath = Path.Combine(Path.GetTempPath(), "hb_encode_log.dat");
- FileStream f = System.IO.File.Open(dvdInfoPath, FileMode.Open, FileAccess.Read, FileShare.Read);
+ if (this.mode == ActivityLogMode.Scan)
+ {
+ if (scan == null || scan.ActivityLog == string.Empty)
+ {
+ appendText.AppendFormat("Waiting for the log to be generated ...\n");
+ position = 0;
+ ClearWindowText();
+ return appendText;
+ }
- StreamReader sr = new StreamReader(f);
+ using (StringReader reader = new StringReader(scan.ActivityLog))
+ {
+ LogReader(reader, appendText);
+ }
+ }
+ else
+ {
+ if (encode == null || encode.ActivityLog == string.Empty)
+ {
+ appendText.AppendFormat("Waiting for the log to be generated ...\n");
+ position = 0;
+ ClearWindowText();
+ return appendText;
+ }
+ using (StringReader reader = new StringReader(encode.ActivityLog))
+ {
+ LogReader(reader, appendText);
+ }
+ }
+ }
+ catch (Exception exc)
+ {
+ windowTimer.Dispose();
+ errorService.ShowError("GetLog() Error", exc.ToString());
+ }
+ return appendText;
+ }
- string line = sr.ReadLine();
+ ///
+ /// Reads the log data from a Scan or Encode object
+ ///
+ ///
+ /// The reader.
+ ///
+ ///
+ /// The append text.
+ ///
+ private void LogReader(StringReader reader, StringBuilder appendText)
+ {
+ string line;
+ int i = 1;
+ while ((line = reader.ReadLine()) != null)
+ {
+ if (i > position)
+ {
+ appendText.AppendLine(line);
+ position++;
+ }
+ i++;
+ }
+ }
- while (line != null)
+ ///
+ /// Append text to the RTF box
+ ///
+ ///
+ /// The text.
+ ///
+ private void AppendWindowText(StringBuilder text)
+ {
+ try
+ {
+ if (IsHandleCreated)
{
- this.rtf_actLog.AppendText(line + System.Environment.NewLine);
- line = sr.ReadLine();
+ if (rtf_actLog.InvokeRequired)
+ {
+ IAsyncResult invoked = BeginInvoke(new SetTextCallback(AppendWindowText), new object[] { text });
+ EndInvoke(invoked);
+ }
+ else
+ lock (rtf_actLog)
+ rtf_actLog.AppendText(text.ToString());
+
+ // Stop the refresh process if log has finished.
+ if (text.ToString().Contains("HandBrake has Exited"))
+ {
+ windowTimer.Dispose();
+ }
}
- sr.Close();
}
catch (Exception)
{
- rtf_actLog.Clear();
- rtf_actLog.Text = "Please wait until the encode has finished to view the log.";
+ return;
}
}
- private void btn_copy_Click(object sender, EventArgs e)
+ ///
+ /// Clear the contents of the log window
+ ///
+ private void ClearWindowText()
{
- if (rtf_actLog.Text != "")
- Clipboard.SetText(rtf_actLog.Text, TextDataFormat.Text);
+ try
+ {
+ if (IsHandleCreated)
+ {
+ if (rtf_actLog.InvokeRequired)
+ {
+ IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(ClearWindowText));
+ EndInvoke(invoked);
+ }
+ else
+ lock (rtf_actLog)
+ rtf_actLog.Clear();
+ }
+ }
+ catch (Exception)
+ {
+ return;
+ }
+ }
+
+ ///
+ /// Reset Everything
+ ///
+ private void Reset()
+ {
+ if (windowTimer != null)
+ windowTimer.Dispose();
+ position = 0;
+ ClearWindowText();
+ windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);
+ }
+
+ /* Menus and Buttons */
+
+ ///
+ /// Copy log to clipboard
+ ///
+ ///
+ /// The sender.
+ ///
+ ///
+ /// The e.
+ ///
+ private void MnuCopyLogClick(object sender, EventArgs e)
+ {
+ Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);
}
- private void btn_refresh_Click(object sender, EventArgs e)
+ ///
+ /// Open the log folder
+ ///
+ ///
+ /// The sender.
+ ///
+ ///
+ /// The e.
+ ///
+ private void MnuOpenLogFolderClick(object sender, EventArgs e)
+ {
+ string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";
+ string windir = Environment.GetEnvironmentVariable("WINDIR");
+ Process prc = new Process
+ {
+ StartInfo =
+ {
+ FileName = windir + @"\explorer.exe",
+ Arguments = logDir
+ }
+ };
+ prc.Start();
+ }
+
+ ///
+ /// Copy the log
+ ///
+ ///
+ /// The sender.
+ ///
+ ///
+ /// The e.
+ ///
+ private void BtnCopyClick(object sender, EventArgs e)
+ {
+ Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);
+ }
+
+ ///
+ /// Change the Log file in the viewer
+ ///
+ /// The Sender
+ /// The EventArgs
+ private void LogSelectorClick(object sender, EventArgs e)
{
- rtf_actLog.Clear();
- readFile();
+ this.SetMode((string)this.logSelector.SelectedItem == "Scan Log" ? ActivityLogMode.Scan : ActivityLogMode.Encode);
}
+ /* Overrides */
+ ///
+ /// override onclosing
+ ///
+ ///
+ /// The e.
+ ///
+ protected override void OnClosing(CancelEventArgs e)
+ {
+ scan.ScanStared -= scan_ScanStared;
+ encode.EncodeStarted -= encode_EncodeStarted;
+
+ scan.ScanCompleted -= stopWindowRefresh;
+ encode.EncodeEnded -= stopWindowRefresh;
+
+ windowTimer.Dispose();
+ e.Cancel = true;
+ this.Dispose();
+ base.OnClosing(e);
+ }
}
}
\ No newline at end of file