OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmPreview.cs
1 /*  frmPreview.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
5 \r
6 namespace Handbrake\r
7 {\r
8     using System;\r
9     using System.Diagnostics;\r
10     using System.IO;\r
11     using System.Runtime.InteropServices;\r
12     using System.Threading;\r
13     using System.Windows;\r
14     using System.Windows.Forms;\r
15     using Functions;\r
16 \r
17     using HandBrake.ApplicationServices.Model;\r
18     using HandBrake.ApplicationServices.Services;\r
19     using HandBrake.ApplicationServices.Services.Interfaces;\r
20 \r
21     using QTOControlLib;\r
22     using QTOLibrary;\r
23 \r
24     using MessageBox = System.Windows.Forms.MessageBox;\r
25 \r
26     /// <summary>\r
27     /// The Preview Window\r
28     /// </summary>\r
29     public partial class frmPreview : Form\r
30     {\r
31         #region Private Variables\r
32 \r
33         /// <summary>\r
34         /// The Main Window\r
35         /// </summary>\r
36         private readonly frmMain mainWindow;\r
37 \r
38         /// <summary>\r
39         /// True if QT is not installed\r
40         /// </summary>\r
41         private readonly bool noQt;\r
42 \r
43         /// <summary>\r
44         /// The encode queue\r
45         /// </summary>\r
46         private readonly IEncode encodeQueue = new Encode();\r
47 \r
48         /// <summary>\r
49         /// What is currently playing\r
50         /// </summary>\r
51         private string currentlyPlaying = string.Empty;\r
52 \r
53         /// <summary>\r
54         /// Play With VLC tracker\r
55         /// </summary>\r
56         private bool playWithVlc;\r
57 \r
58         /// <summary>\r
59         /// A Thread for the video player\r
60         /// </summary>\r
61         private Thread player;\r
62 \r
63         #endregion\r
64 \r
65         /// <summary>\r
66         /// Initializes a new instance of the <see cref="frmPreview"/> class.\r
67         /// </summary>\r
68         /// <param name="mw">\r
69         /// The mw.\r
70         /// </param>\r
71         public frmPreview(frmMain mw)\r
72         {\r
73             try\r
74             {\r
75                 InitializeComponent();\r
76             }\r
77             catch (Exception)\r
78             {\r
79                 this.noQt = true;\r
80 \r
81                 int borderWidth = (this.Width - this.ClientSize.Width) / 2;\r
82                 int titlebarAndBorder = this.Height - this.ClientSize.Height;\r
83 \r
84                 this.Height = toolBar.Height + titlebarAndBorder + 1;\r
85                 btn_playQT.Enabled = false;\r
86                 btn_playQT.Visible = false;\r
87             }\r
88 \r
89             this.mainWindow = mw;\r
90 \r
91             cb_preview.SelectedIndex = 0;\r
92             cb_duration.SelectedIndex = 1;\r
93 \r
94             cb_preview.Items.Clear();\r
95             for (int i = 1; i <= Properties.Settings.Default.previewScanCount; i++)\r
96             {\r
97                 cb_preview.Items.Add(i.ToString());\r
98             }\r
99 \r
100             cb_preview.SelectedIndex = 0;\r
101 \r
102             encodeQueue.EncodeStarted += this.EncodeQueueEncodeStarted;\r
103             encodeQueue.EncodeCompleted += this.EncodeQueueEncodeEnded;\r
104         }\r
105 \r
106         #region Delegates\r
107         /// <summary>\r
108         /// Update UI Delegate\r
109         /// </summary>\r
110         /// <param name="sender">\r
111         /// The sender.\r
112         /// </param>\r
113         /// <param name="e">\r
114         /// The e.\r
115         /// </param>\r
116         private delegate void UpdateUiHandler(object sender, EventArgs e);\r
117 \r
118         /// <summary>\r
119         /// The Open Movie Handler\r
120         /// </summary>\r
121         private delegate void OpenMovieHandler();\r
122         #endregion\r
123 \r
124         #region Event Handlers\r
125         /// <summary>\r
126         /// The encode has started\r
127         /// </summary>\r
128         /// <param name="sender">\r
129         /// The sender.\r
130         /// </param>\r
131         /// <param name="e">\r
132         /// The e.\r
133         /// </param>\r
134         private void EncodeQueueEncodeStarted(object sender, EventArgs e)\r
135         {\r
136             encodeQueue.EncodeStatusChanged += this.EncodeQueueEncodeStatusChanged;\r
137         }\r
138 \r
139         /// <summary>\r
140         /// The Enocde has ended\r
141         /// </summary>\r
142         /// <param name="sender">\r
143         /// The sender.\r
144         /// </param>\r
145         /// <param name="e">\r
146         /// The e.\r
147         /// </param>\r
148         private void EncodeQueueEncodeEnded(object sender, EventArgs e)\r
149         {\r
150             encodeQueue.EncodeStatusChanged -= this.EncodeQueueEncodeStatusChanged;\r
151 \r
152             try\r
153             {\r
154                 if (this.InvokeRequired)\r
155                 {\r
156                     this.BeginInvoke(new UpdateUiHandler(EncodeQueueEncodeEnded), new[] { sender, e });\r
157                     return;\r
158                 }\r
159 \r
160                 ProgressBarStatus.Visible = false;\r
161                 lbl_encodeStatus.Visible = false;\r
162 \r
163                 if (!this.noQt)\r
164                     btn_playQT.Enabled = true;\r
165                 btn_playVLC.Enabled = true;\r
166 \r
167                 this.Text = this.Text.Replace(" (Encoding)", string.Empty);\r
168 \r
169                 // Get the sample filename\r
170                 if (this.mainWindow.text_destination.Text != string.Empty)\r
171                     this.currentlyPlaying =\r
172                         this.mainWindow.text_destination.Text.Replace(".mp4", "_sample.mp4").Replace(".m4v", "_sample.m4v").\r
173                             Replace(".mkv", "_sample.mkv");\r
174 \r
175                 // Play back in QT or VLC\r
176                 if (!playWithVlc)\r
177                     Play();\r
178                 else\r
179                     PlayVlc();\r
180             }\r
181             catch (Exception exc)\r
182             {\r
183                 Main.ShowExceptiowWindow("An Unexpected error has occured", exc.ToString());\r
184             }\r
185         }\r
186 \r
187         /// <summary>\r
188         /// Encode status has changed\r
189         /// </summary>\r
190         /// <param name="sender">\r
191         /// The sender.\r
192         /// </param>\r
193         /// <param name="e">\r
194         /// The e.\r
195         /// </param>\r
196         private void EncodeQueueEncodeStatusChanged(object sender, HandBrake.ApplicationServices.EventArgs.EncodeProgressEventArgs e)\r
197         {\r
198             if (this.InvokeRequired)\r
199             {\r
200                 this.BeginInvoke(new EncodeProgessStatus(this.EncodeQueueEncodeStatusChanged), new[] { sender, e });\r
201                 return;\r
202             }\r
203 \r
204             lbl_encodeStatus.Text = e.PercentComplete + "%";\r
205             ProgressBarStatus.Value = (int)Math.Round(e.PercentComplete);\r
206         }\r
207         #endregion\r
208 \r
209         #region Encode Sample\r
210 \r
211         /// <summary>\r
212         /// Play with VLC\r
213         /// </summary>\r
214         /// <param name="sender">\r
215         /// The sender.\r
216         /// </param>\r
217         /// <param name="e">\r
218         /// The e.\r
219         /// </param>\r
220         private void PlayVlcClick(object sender, EventArgs e)\r
221         {\r
222             ProgressBarStatus.Visible = true;\r
223             ProgressBarStatus.Value = 0;\r
224             lbl_encodeStatus.Visible = true;\r
225             playWithVlc = true;\r
226             this.panel1.Visible = false;\r
227             \r
228             try\r
229             {\r
230                 if (!this.noQt)\r
231                     QTControl.URL = string.Empty;\r
232 \r
233                 if (File.Exists(this.currentlyPlaying))\r
234                     File.Delete(this.currentlyPlaying);\r
235             }\r
236             catch (Exception)\r
237             {\r
238                 MessageBox.Show(this, "Unable to delete previous preview file. You may need to restart the application.",\r
239                                 "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
240             }\r
241 \r
242             btn_playQT.Enabled = false;\r
243             btn_playVLC.Enabled = false;\r
244             this.Text += " (Encoding)";\r
245             int duration;\r
246             int.TryParse(cb_duration.Text, out duration);\r
247             string query = QueryGenerator.GeneratePreviewQuery(this.mainWindow, duration, cb_preview.Text);\r
248             ThreadPool.QueueUserWorkItem(this.CreatePreview, query);\r
249         }\r
250 \r
251         /// <summary>\r
252         /// Encode and Play with QT\r
253         /// </summary>\r
254         /// <param name="sender">\r
255         /// The sender.\r
256         /// </param>\r
257         /// <param name="e">\r
258         /// The e.\r
259         /// </param>\r
260         private void PlayQtClick(object sender, EventArgs e)\r
261         {\r
262             playWithVlc = false;\r
263             this.panel1.Visible = true;\r
264             if (this.noQt)\r
265             {\r
266                 MessageBox.Show(this,\r
267                                 "It would appear QuickTime 7 is not installed or not accessible. Please (re)install QuickTime.",\r
268                                 "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
269                 return;\r
270             }\r
271             if (this.mainWindow.text_destination.Text.Contains(".mkv"))\r
272             {\r
273                 MessageBox.Show(this,\r
274                                 "The QuickTime Control does not support MKV files, It is recommended you use the VLC option instead.",\r
275                                 "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
276             }\r
277             else\r
278             {\r
279                 ProgressBarStatus.Visible = true;\r
280                 ProgressBarStatus.Value = 0;\r
281                 lbl_encodeStatus.Visible = true;\r
282                 try\r
283                 {\r
284                     QTControl.URL = string.Empty;\r
285                     if (File.Exists(this.currentlyPlaying))\r
286                         File.Delete(this.currentlyPlaying);\r
287                 }\r
288                 catch (Exception)\r
289                 {\r
290                     MessageBox.Show(this,\r
291                                     "Unable to delete previous preview file. You may need to restart the application.",\r
292                                     "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
293                 }\r
294 \r
295                 btn_playQT.Enabled = false;\r
296                 btn_playVLC.Enabled = false;\r
297                 this.Text += " (Encoding)";\r
298                 int duration;\r
299                 int.TryParse(cb_duration.Text, out duration);\r
300                 string query = QueryGenerator.GeneratePreviewQuery(this.mainWindow, duration, cb_preview.Text);\r
301 \r
302                 ThreadPool.QueueUserWorkItem(this.CreatePreview, query);\r
303             }\r
304         }\r
305 \r
306         /// <summary>\r
307         /// Create the Preview.\r
308         /// </summary>\r
309         /// <param name="state">\r
310         /// The state.\r
311         /// </param>\r
312         private void CreatePreview(object state)\r
313         {\r
314             // Make sure we are not already encoding and if we are then display an error.\r
315             if (encodeQueue.IsEncoding)\r
316             {\r
317                 MessageBox.Show(\r
318                     this,\r
319                     "Handbrake is already encoding a video!",\r
320                     "Warning",\r
321                     MessageBoxButtons.OK,\r
322                     MessageBoxIcon.Warning);\r
323 \r
324                 return;\r
325             }\r
326 \r
327             QueueTask task = new QueueTask((string)state);\r
328             encodeQueue.Start(task, false);\r
329         }\r
330 \r
331         #endregion\r
332 \r
333         #region Playback\r
334 \r
335         /// <summary>\r
336         /// Play the video back in the QuickTime control\r
337         /// </summary>\r
338         private void Play()\r
339         {\r
340             this.player = new Thread(OpenMovie) { IsBackground = true };\r
341             this.player.Start();\r
342         }\r
343 \r
344         /// <summary>\r
345         /// Play the video back in an external VLC Player\r
346         /// </summary>\r
347         private void PlayVlc()\r
348         {\r
349             // Launch VLC and Play video.\r
350             if (this.currentlyPlaying != string.Empty)\r
351             {\r
352                 if (File.Exists(this.currentlyPlaying))\r
353                 {\r
354                     // Attempt to find VLC if it doesn't exist in the default set location.\r
355                     string vlcPath;\r
356 \r
357                     if (8 == IntPtr.Size ||\r
358                         (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))))\r
359                         vlcPath = Environment.GetEnvironmentVariable("ProgramFiles(x86)");\r
360                     else\r
361                         vlcPath = Environment.GetEnvironmentVariable("ProgramFiles");\r
362 \r
363                     vlcPath = vlcPath != null\r
364                                   ? vlcPath + @"\VideoLAN\VLC\vlc.exe"\r
365                                   : @"C:\Program Files (x86)\VideoLAN\VLC\vlc.exe";\r
366 \r
367                     if (!File.Exists(Properties.Settings.Default.VLC_Path))\r
368                     {\r
369                         if (File.Exists(vlcPath))\r
370                         {\r
371                             Properties.Settings.Default.VLC_Path = "C:\\Program Files (x86)\\VideoLAN\\VLC\\vlc.exe";\r
372                             Properties.Settings.Default.Save(); // Save this new path if it does\r
373                         }\r
374                         else\r
375                         {\r
376                             MessageBox.Show(this,\r
377                                             "Unable to detect VLC Player. \nPlease make sure VLC is installed and the directory specified in HandBrake's options is correct. (See: \"Tools Menu > Options > Picture Tab\") ",\r
378                                             "VLC", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
379                         }\r
380                     }\r
381 \r
382                     if (File.Exists(Properties.Settings.Default.VLC_Path))\r
383                     {\r
384                         string args = "\"" + this.currentlyPlaying + "\"";\r
385                         ProcessStartInfo vlc = new ProcessStartInfo(Properties.Settings.Default.VLC_Path, args);\r
386                         Process.Start(vlc);\r
387                     }\r
388                 }\r
389                 else\r
390                     MessageBox.Show(this,\r
391                                     "Unable to find the preview file. Either the file was deleted or the encode failed. Check the activity log for details.",\r
392                                     "VLC", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
393             }\r
394         }\r
395 \r
396         /// <summary>\r
397         /// QT control - Open the file\r
398         /// </summary>\r
399         [STAThread]\r
400         private void OpenMovie()\r
401         {\r
402             try\r
403             {\r
404                 if (InvokeRequired)\r
405                 {\r
406                     BeginInvoke(new OpenMovieHandler(OpenMovie));\r
407                     return;\r
408                 }\r
409                 QTControl.URL = this.currentlyPlaying;\r
410                 QTControl.SetSizing(QTSizingModeEnum.qtControlFitsMovie, true);\r
411                 QTControl.URL = this.currentlyPlaying;\r
412                 QTControl.Show();\r
413 \r
414                 this.ClientSize = QTControl.Size;\r
415                 this.Height += toolBar.Height;\r
416             }\r
417             catch (COMException ex)\r
418             {\r
419                 QTUtils qtu = new QTUtils();\r
420                 Main.ShowExceptiowWindow("Unable to open movie.", ex + Environment.NewLine + qtu.QTErrorFromErrorCode(ex.ErrorCode));\r
421             }\r
422             catch (Exception ex)\r
423             {\r
424                 Main.ShowExceptiowWindow("Unable to open movie.", ex.ToString());\r
425             }\r
426         }\r
427 \r
428         #endregion\r
429 \r
430         /// <summary>\r
431         /// Remove any subscribed events then close.\r
432         /// </summary>\r
433         /// <param name="e">\r
434         /// The e.\r
435         /// </param>\r
436         protected override void OnClosing(System.ComponentModel.CancelEventArgs e)\r
437         {\r
438             encodeQueue.EncodeStarted -= this.EncodeQueueEncodeStarted;\r
439             encodeQueue.EncodeCompleted -= this.EncodeQueueEncodeEnded;\r
440             base.OnClosing(e);\r
441         }\r
442     }\r
443 }