OSDN Git Service

648deef8972abd39a064c70a560c0b31c6bf12ce
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmQueue.cs
1 /*  frmQueue.cs $\r
2         \r
3            This file is part of the HandBrake source code.\r
4            Homepage: <http://handbrake.fr>.\r
5            It may be used under the terms of the GNU General Public License. */\r
6 \r
7 using System;\r
8 using System.Collections.Generic;\r
9 using System.Collections;\r
10 using System.ComponentModel;\r
11 using System.Data;\r
12 using System.Drawing;\r
13 using System.Text;\r
14 using System.Windows.Forms;\r
15 using System.Threading;\r
16 using System.Diagnostics;\r
17 using System.Runtime.InteropServices;\r
18 using System.IO;\r
19 \r
20 namespace Handbrake\r
21 {\r
22     public partial class frmQueue : Form\r
23     {\r
24         private delegate void ProgressUpdateHandler();\r
25         private delegate void setEncoding();\r
26         Functions.Encode cliObj = new Functions.Encode();\r
27         Boolean cancel = false;\r
28         Process hbProc = null;\r
29         Queue.Queue queue;\r
30         frmMain mainWindow = null;\r
31 \r
32         public frmQueue(frmMain main)\r
33         {\r
34             InitializeComponent();\r
35             mainWindow = main;\r
36         }\r
37 \r
38         /// <summary>\r
39         /// Initializes the Queue list with the Arraylist from the Queue class\r
40         /// </summary>\r
41         /// <param name="qw"></param>\r
42         public void setQueue(Queue.Queue qw)\r
43         {\r
44             queue = qw;\r
45             redrawQueue();\r
46             lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
47 \r
48             // Recalculate the progress bar, but only if the queue has already started.       \r
49             if (progressBar.Value != 0)\r
50             {\r
51                 progressBar.Value = 0;\r
52                 if (queue.count() == 0)\r
53                     progressBar.Step = 100;\r
54                 else\r
55                     progressBar.Step = 100 / queue.count();\r
56                 progressBar.PerformStep();\r
57                 lbl_progressValue.Text = string.Format("{0} %", progressBar.Value);\r
58             }\r
59         }\r
60 \r
61         /// <summary>\r
62         /// Returns if there is currently an item being encoded by the queue\r
63         /// </summary>\r
64         /// <returns>Boolean true if encoding</returns>\r
65         public Boolean isEncoding()\r
66         {\r
67             if (hbProc == null)\r
68                 return false;\r
69             else\r
70                 return true;\r
71         }\r
72 \r
73         /// <summary>\r
74         /// This disables encoding from the queue when a single encode from the main window is running.\r
75         /// </summary>\r
76         public void frmMain_encode()\r
77         {\r
78             cancel = false;\r
79             // Start the encode\r
80             try\r
81             {\r
82                 if (queue.count() != 0)\r
83                 {\r
84                     // Setup or reset some values\r
85                     btn_encode.Enabled = false;\r
86                     btn_stop.Visible = true;\r
87                     progressBar.Value = 0;\r
88                     lbl_progressValue.Text = "0 %";\r
89                     if (queue.count() == 0)\r
90                         progressBar.Step = 100;\r
91                     else\r
92                         progressBar.Step = 100 / queue.count();\r
93                     Thread theQ = new Thread(startProc);\r
94                     theQ.IsBackground = true;\r
95                     theQ.Start();\r
96                 }\r
97             }\r
98             catch (Exception exc)\r
99             {\r
100                 MessageBox.Show(exc.ToString());\r
101             }\r
102         }\r
103 \r
104         // Redraw's the queue with the latest data from the Queue class\r
105         private void redrawQueue()\r
106         {\r
107             list_queue.Items.Clear();\r
108             List<Queue.QueueItem> theQueue = queue.getQueue();\r
109             foreach (Queue.QueueItem queue_item in theQueue)\r
110             {\r
111                 string q_item = queue_item.Query;\r
112                 Functions.QueryParser parsed = Functions.QueryParser.Parse(q_item);\r
113 \r
114                 // Get the DVD Title\r
115                 string title = "";\r
116                 if (parsed.DVDTitle == 0)\r
117                     title = "Auto";\r
118                 else\r
119                     title = parsed.DVDTitle.ToString();\r
120 \r
121                 // Get the DVD Chapters\r
122                 string chapters = "";\r
123                 if (parsed.DVDChapterStart == 0)\r
124                     chapters = "Auto";\r
125                 else\r
126                 {\r
127                     chapters = parsed.DVDChapterStart.ToString();\r
128                     if (parsed.DVDChapterFinish != 0)\r
129                         chapters = chapters + " - " + parsed.DVDChapterFinish;\r
130                 }\r
131 \r
132                 ListViewItem item = new ListViewItem();\r
133                 item.Text = title; // Title\r
134                 item.SubItems.Add(chapters); // Chapters\r
135                 item.SubItems.Add(queue_item.Source); // Source\r
136                 item.SubItems.Add(queue_item.Destination); // Destination\r
137                 item.SubItems.Add(parsed.VideoEncoder); // Video\r
138                 item.SubItems.Add(parsed.AudioEncoder1); // Audio\r
139 \r
140                 list_queue.Items.Add(item);\r
141             }\r
142         }\r
143 \r
144         // Initializes the encode process\r
145         private void btn_encode_Click(object sender, EventArgs e)\r
146         {\r
147             if (queue.count() != 0)\r
148             {\r
149                 btn_encode.Enabled = false;\r
150                 mainWindow.setLastAction("encode");\r
151                 mainWindow.setEncodeStatus(1);\r
152 \r
153                 cancel = false;\r
154 \r
155                 // Start the encode\r
156                 try\r
157                 {\r
158                     // Setup or reset some values\r
159                     btn_encode.Enabled = false;\r
160                     btn_stop.Visible = true;\r
161                     progressBar.Value = 0;\r
162                     lbl_progressValue.Text = "0 %";\r
163                     if (queue.count() == 0)\r
164                         progressBar.Step = 100;\r
165                     else\r
166                         progressBar.Step = 100 / queue.count();\r
167                     Thread theQ = new Thread(startProc);\r
168                     theQ.IsBackground = true;\r
169                     theQ.Start();\r
170                 }\r
171                 catch (Exception exc)\r
172                 {\r
173                     MessageBox.Show(exc.ToString());\r
174                 }\r
175             }\r
176         }\r
177 \r
178         // Starts the encoding process\r
179         private void startProc(object state)\r
180         {\r
181             try\r
182             {\r
183                 // Run through each item on the queue\r
184                 while (queue.count() != 0)\r
185                 {\r
186                     string query = queue.getNextItemForEncoding();\r
187                     queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
188 \r
189                     setEncValue();\r
190                     if (this.Created)\r
191                         updateUIElements();\r
192 \r
193                     hbProc = cliObj.runCli(this, query);\r
194 \r
195                     hbProc.WaitForExit();\r
196                     cliObj.addCLIQueryToLog(query);\r
197                     cliObj.copyLog(query, queue.getLastQuery().Destination);\r
198 \r
199                     hbProc.Close();\r
200                     hbProc.Dispose();\r
201                     hbProc = null;\r
202                     query = "";\r
203 \r
204                     if (cancel == true)\r
205                     {\r
206                         break;\r
207                     }\r
208                 }\r
209 \r
210                 resetQueue();\r
211                 mainWindow.setEncodeStatus(0); // Tell the main window encodes have finished.\r
212 \r
213                 // After the encode is done, we may want to shutdown, suspend etc.\r
214                 cliObj.afterEncodeAction();\r
215             }\r
216             catch (Exception exc)\r
217             {\r
218                 MessageBox.Show(exc.ToString());\r
219             }\r
220         }\r
221 \r
222         // Reset's the window to the default state.\r
223         private void resetQueue()\r
224         {\r
225             try\r
226             {\r
227                 if (this.InvokeRequired)\r
228                 {\r
229                     this.BeginInvoke(new ProgressUpdateHandler(resetQueue));\r
230                     return;\r
231 \r
232                 }\r
233                 btn_stop.Visible = false;\r
234                 btn_encode.Enabled = true;\r
235 \r
236                 if (cancel == true)\r
237                 {\r
238                     lbl_progressValue.Text = "Encode Queue Cancelled!";\r
239                 }\r
240                 else\r
241                 {\r
242                     lbl_progressValue.Text = "Encode Queue Completed!";\r
243                 }\r
244 \r
245                 progressBar.Value = 0;\r
246 \r
247                 lbl_source.Text = "-";\r
248                 lbl_dest.Text = "-";\r
249                 lbl_vEnc.Text = "-";\r
250                 lbl_aEnc.Text = "-";\r
251                 lbl_title.Text = "-";\r
252                 lbl_chapt.Text = "-";\r
253 \r
254                 lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
255             }\r
256             catch (Exception exc)\r
257             {\r
258                 MessageBox.Show(exc.ToString());\r
259             }\r
260         }\r
261 \r
262         // Stop's the queue from continuing. \r
263         private void btn_stop_Click(object sender, EventArgs e)\r
264         {\r
265             cancel = true;\r
266             btn_stop.Visible = false;\r
267             btn_encode.Enabled = true;\r
268             MessageBox.Show("No further items on the queue will start. The current encode process will continue until it is finished. \nClick 'Encode Video' when you wish to continue encoding the queue.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
269         }\r
270 \r
271         // Updates the progress bar and progress label for a new status.\r
272         private void updateUIElements()\r
273         {\r
274             try\r
275             {\r
276                 if (this.InvokeRequired)\r
277                 {\r
278                     this.BeginInvoke(new ProgressUpdateHandler(updateUIElements));\r
279                     return;\r
280                 }\r
281 \r
282                 redrawQueue();\r
283 \r
284                 progressBar.PerformStep();\r
285                 lbl_progressValue.Text = string.Format("{0} %", progressBar.Value);\r
286                 lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
287             }\r
288             catch (Exception exc)\r
289             {\r
290                 MessageBox.Show(exc.ToString());\r
291             }\r
292         }\r
293 \r
294         // Set's the information lables about the current encode.\r
295         private void setEncValue()\r
296         {\r
297             try\r
298             {\r
299                 if (this.InvokeRequired)\r
300                 {\r
301                     this.BeginInvoke(new setEncoding(setEncValue));\r
302                 }\r
303 \r
304                 // found query is a global varible\r
305                 Functions.QueryParser parsed = Functions.QueryParser.Parse(queue.getLastQuery().Query);\r
306                 lbl_source.Text = queue.getLastQuery().Source;\r
307                 lbl_dest.Text = queue.getLastQuery().Destination;\r
308 \r
309 \r
310                 if (parsed.DVDTitle == 0)\r
311                     lbl_title.Text = "Auto";\r
312                 else\r
313                     lbl_title.Text = parsed.DVDTitle.ToString();\r
314 \r
315                 string chapters = "";\r
316                 if (parsed.DVDChapterStart == 0)\r
317                 {\r
318                     lbl_chapt.Text = "Auto";\r
319                 }\r
320                 else\r
321                 {\r
322                     chapters = parsed.DVDChapterStart.ToString();\r
323                     if (parsed.DVDChapterFinish != 0)\r
324                         chapters = chapters + " - " + parsed.DVDChapterFinish;\r
325                     lbl_chapt.Text = chapters;\r
326                 }\r
327 \r
328                 lbl_vEnc.Text = parsed.VideoEncoder;\r
329                 lbl_aEnc.Text = parsed.AudioEncoder1;\r
330             }\r
331             catch (Exception)\r
332             {\r
333                 // Do Nothing\r
334             }\r
335         }\r
336 \r
337         // Queue Management\r
338         private void btn_up_Click(object sender, EventArgs e)\r
339         {\r
340             if (list_queue.SelectedIndices.Count != 0)\r
341             {\r
342                 int selected = list_queue.SelectedIndices[0];\r
343 \r
344                 queue.moveUp(selected);\r
345                 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
346                 redrawQueue();\r
347 \r
348                 if (selected - 1 > 0)\r
349                     list_queue.Items[selected - 1].Selected = true;\r
350 \r
351                 list_queue.Select();\r
352             }\r
353         }\r
354         private void btn_down_Click(object sender, EventArgs e)\r
355         {\r
356             if (list_queue.SelectedIndices.Count != 0)\r
357             {\r
358                 int selected = list_queue.SelectedIndices[0];\r
359 \r
360                 queue.moveDown(list_queue.SelectedIndices[0]);\r
361                 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
362                 redrawQueue();\r
363 \r
364                 if (selected + 1 < list_queue.Items.Count)\r
365                     list_queue.Items[selected + 1].Selected = true;\r
366 \r
367                 list_queue.Select();\r
368             }\r
369         }\r
370         private void btn_delete_Click(object sender, EventArgs e)\r
371         {\r
372             if (list_queue.SelectedIndices.Count != 0)\r
373             {\r
374                 queue.remove(list_queue.SelectedIndices[0]);\r
375                 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
376                 redrawQueue();\r
377                 lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
378             }\r
379         }\r
380         private void list_queue_deleteKey(object sender, KeyEventArgs e)\r
381         {\r
382             if (e.KeyCode == Keys.Delete)\r
383             {\r
384                 if (list_queue.SelectedIndices.Count != 0)\r
385                 {\r
386                     queue.remove(list_queue.SelectedIndices[0]);\r
387                     queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
388                     redrawQueue();\r
389                 }\r
390             }\r
391         }\r
392 \r
393         // Queue Import/Export Features\r
394         private void mnu_batch_Click(object sender, EventArgs e)\r
395         {\r
396             SaveFile.FileName = "";\r
397             SaveFile.Filter = "Batch|.bat";\r
398             SaveFile.ShowDialog();\r
399             if (SaveFile.FileName != String.Empty)\r
400                 queue.writeBatchScript(SaveFile.FileName);\r
401         }\r
402         private void mnu_export_Click(object sender, EventArgs e)\r
403         {\r
404             SaveFile.FileName = "";\r
405             SaveFile.Filter = "HandBrake Queue|*.queue";\r
406             SaveFile.ShowDialog();\r
407             if (SaveFile.FileName != String.Empty)\r
408                 queue.write2disk(SaveFile.FileName);\r
409         }\r
410         private void mnu_import_Click(object sender, EventArgs e)\r
411         {\r
412             OpenFile.FileName = "";\r
413             OpenFile.ShowDialog();\r
414             if (OpenFile.FileName != String.Empty)\r
415                 queue.recoverQueue(OpenFile.FileName);\r
416             redrawQueue();\r
417         }\r
418 \r
419         // Hide's the window when the user tries to "x" out of the window instead of closing it.\r
420         protected override void OnClosing(CancelEventArgs e)\r
421         {\r
422             e.Cancel = true;\r
423             this.Hide();\r
424             base.OnClosing(e);\r
425         }\r
426 \r
427     }\r
428 }