OSDN Git Service

2ba5b2b2c2cb3d803524ba93e511411ac17bf481
[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         Functions.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(Functions.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 \r
49         /// <summary>\r
50         /// Returns if there is currently an item being encoded by the queue\r
51         /// </summary>\r
52         /// <returns>Boolean true if encoding</returns>\r
53         public Boolean isEncoding()\r
54         {\r
55             if (hbProc == null)\r
56                 return false;\r
57             else\r
58                 return true;\r
59         }\r
60 \r
61         // Redraw's the queue with the latest data from the Queue class\r
62         private void redrawQueue()\r
63         {\r
64             list_queue.Items.Clear();\r
65             ArrayList theQueue = queue.getQueue();\r
66             foreach (ArrayList queue_item in theQueue)\r
67             {\r
68                 string q_item = queue_item[1].ToString();\r
69                 Functions.QueryParser parsed = Functions.QueryParser.Parse(q_item);\r
70 \r
71                 // Get the DVD Title\r
72                 string title = "";\r
73                 if (parsed.DVDTitle == 0)\r
74                     title = "Auto";\r
75                 else\r
76                     title = parsed.DVDTitle.ToString();\r
77 \r
78                 // Get the DVD Chapters\r
79                 string chapters = "";\r
80                 if (parsed.DVDChapterStart == 0)\r
81                     chapters = "Auto";\r
82                 else\r
83                 {\r
84                     chapters = parsed.DVDChapterStart.ToString();\r
85                     if (parsed.DVDChapterFinish != 0)\r
86                         chapters = chapters + " - " + parsed.DVDChapterFinish;\r
87                 }\r
88 \r
89                 ListViewItem item = new ListViewItem();\r
90                 item.Text = title; // Title\r
91                 item.SubItems.Add(chapters); // Chapters\r
92                 item.SubItems.Add(parsed.Source); // Source\r
93                 item.SubItems.Add(parsed.Destination); // Destination\r
94                 item.SubItems.Add(parsed.VideoEncoder); // Video\r
95                 item.SubItems.Add(parsed.AudioEncoder1); // Audio\r
96 \r
97                 list_queue.Items.Add(item);\r
98             }\r
99         }\r
100 \r
101         // Initializes the encode process\r
102         private void btn_encode_Click(object sender, EventArgs e)\r
103         {\r
104             mainWindow.setLastAction("encode");\r
105             \r
106             if (queue.count() != 0)\r
107             {\r
108                 btn_encode.Enabled = false;\r
109             }\r
110             cancel = false;\r
111 \r
112             // Start the encode\r
113             try\r
114             {\r
115                 if (queue.count() != 0)\r
116                 {\r
117                     // Setup or reset some values\r
118                     btn_stop.Visible = true;\r
119                     progressBar.Value = 0;\r
120                     lbl_progressValue.Text = "0 %";\r
121                     progressBar.Step = 100 / queue.count();\r
122                     Thread theQ = new Thread(startProc);\r
123                     theQ.IsBackground = true;\r
124                     theQ.Start();\r
125                 }\r
126             }\r
127             catch (Exception exc)\r
128             {\r
129                 MessageBox.Show(exc.ToString());\r
130             }\r
131         }\r
132 \r
133         // Starts the encoding process\r
134         private void startProc(object state)\r
135         {\r
136             try\r
137             {\r
138                 // Run through each item on the queue\r
139                 while (queue.count() != 0)\r
140                 {\r
141                     string query = queue.getNextItemForEncoding();\r
142                     queue.write2disk("hb_queue_recovery.dat"); // Update the queue recovery file\r
143 \r
144                     setEncValue();\r
145                     updateUIElements();\r
146 \r
147                     hbProc = cliObj.runCli(this, query);\r
148 \r
149                     hbProc.WaitForExit();\r
150                     hbProc.Close();\r
151                     hbProc.Dispose();\r
152                     hbProc = null;\r
153 \r
154                     query = "";\r
155 \r
156                     if (cancel == true)\r
157                     {\r
158                         break;\r
159                     }\r
160                 }\r
161 \r
162                 resetQueue();\r
163 \r
164                 // After the encode is done, we may want to shutdown, suspend etc.\r
165                 cliObj.afterEncodeAction();\r
166             }\r
167             catch (Exception exc)\r
168             {\r
169                 MessageBox.Show(exc.ToString());\r
170             }\r
171         }\r
172 \r
173         // Reset's the window to the default state.\r
174         private void resetQueue()\r
175         {\r
176             try\r
177             {\r
178                 if (this.InvokeRequired)\r
179                 {\r
180                     this.BeginInvoke(new ProgressUpdateHandler(resetQueue));\r
181                     return;\r
182 \r
183                 }\r
184                 btn_stop.Visible = false;\r
185                 btn_encode.Enabled = true;\r
186 \r
187                 if (cancel == true)\r
188                 {\r
189                     lbl_progressValue.Text = "Encode Queue Cancelled!";\r
190                 }\r
191                 else\r
192                 {\r
193                     lbl_progressValue.Text = "Encode Queue Completed!";\r
194                 }\r
195 \r
196                 progressBar.Value = 0;\r
197 \r
198                 lbl_source.Text = "-";\r
199                 lbl_dest.Text = "-";\r
200                 lbl_vEnc.Text = "-";\r
201                 lbl_aEnc.Text = "-";\r
202                 lbl_title.Text = "-";\r
203                 lbl_chapt.Text = "-";\r
204 \r
205                 lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
206             }\r
207             catch (Exception exc)\r
208             {\r
209                 MessageBox.Show(exc.ToString());\r
210             }\r
211         }\r
212 \r
213         // Stop's the queue from continuing. \r
214         private void btn_stop_Click(object sender, EventArgs e)\r
215         {\r
216             cancel = true;\r
217             btn_stop.Visible = false;\r
218             btn_encode.Enabled = true;\r
219             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
220         }\r
221 \r
222         // Updates the progress bar and progress label for a new status.\r
223         private void updateUIElements()\r
224         {\r
225             try\r
226             {\r
227                 if (this.InvokeRequired)\r
228                 {\r
229                     this.BeginInvoke(new ProgressUpdateHandler(updateUIElements));\r
230                     return;\r
231                 }\r
232 \r
233                 redrawQueue();\r
234 \r
235                 progressBar.PerformStep();\r
236                 lbl_progressValue.Text = string.Format("{0} %", progressBar.Value);\r
237                 lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
238             }\r
239             catch (Exception exc)\r
240             {\r
241                 MessageBox.Show(exc.ToString());\r
242             }\r
243         }\r
244 \r
245         // Set's the information lables about the current encode.\r
246         private void setEncValue()\r
247         {\r
248             try\r
249             {\r
250                 if (this.InvokeRequired)\r
251                 {\r
252                     this.BeginInvoke(new setEncoding(setEncValue));\r
253                 }\r
254 \r
255                 // found query is a global varible\r
256                 Functions.QueryParser parsed = Functions.QueryParser.Parse(queue.getLastQuery());\r
257                 lbl_source.Text = parsed.Source;\r
258                 lbl_dest.Text = parsed.Destination;\r
259 \r
260 \r
261                 if (parsed.DVDTitle == 0)\r
262                     lbl_title.Text = "Auto";\r
263                 else\r
264                     lbl_title.Text = parsed.DVDTitle.ToString();\r
265 \r
266                 string chapters = "";\r
267                 if (parsed.DVDChapterStart == 0)\r
268                 {\r
269                     lbl_chapt.Text = "Auto";\r
270                 }\r
271                 else\r
272                 {\r
273                     chapters = parsed.DVDChapterStart.ToString();\r
274                     if (parsed.DVDChapterFinish != 0)\r
275                         chapters = chapters + " - " + parsed.DVDChapterFinish;\r
276                     lbl_chapt.Text = chapters;\r
277                 }\r
278 \r
279                 lbl_vEnc.Text = parsed.VideoEncoder;\r
280                 lbl_aEnc.Text = parsed.AudioEncoder1;\r
281             }\r
282             catch (Exception)\r
283             {\r
284                 // Do Nothing\r
285             }\r
286         }\r
287 \r
288         // Move an item up the Queue\r
289         private void btn_up_Click(object sender, EventArgs e)\r
290         {\r
291             if (list_queue.SelectedIndices.Count != 0)\r
292             {\r
293                 int selected = list_queue.SelectedIndices[0];\r
294 \r
295                 queue.moveUp(selected);\r
296                 queue.write2disk("hb_queue_recovery.dat"); // Update the queue recovery file\r
297                 redrawQueue();\r
298 \r
299                 if (selected - 1 > 0) \r
300                     list_queue.Items[selected -1].Selected = true;\r
301 \r
302                 list_queue.Select();\r
303             }\r
304         }\r
305 \r
306         // Move an item down the Queue\r
307         private void btn_down_Click(object sender, EventArgs e)\r
308         {\r
309             if (list_queue.SelectedIndices.Count != 0)\r
310             {\r
311                 int selected = list_queue.SelectedIndices[0];\r
312 \r
313                 queue.moveDown(list_queue.SelectedIndices[0]);\r
314                 queue.write2disk("hb_queue_recovery.dat"); // Update the queue recovery file\r
315                 redrawQueue();\r
316 \r
317                 if (selected +1 < list_queue.Items.Count) \r
318                     list_queue.Items[selected + 1].Selected = true;\r
319 \r
320                 list_queue.Select();\r
321             }\r
322         }\r
323 \r
324         // Remove an item from the queue\r
325         private void btn_delete_Click(object sender, EventArgs e)\r
326         {\r
327             if (list_queue.SelectedIndices.Count != 0)\r
328             {\r
329                 queue.remove(list_queue.SelectedIndices[0]);\r
330                 queue.write2disk("hb_queue_recovery.dat"); // Update the queue recovery file\r
331                 redrawQueue();\r
332                 lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
333             }\r
334         }\r
335 \r
336         // Generate a Saveable batch script on the users request\r
337         private void mnu_batch_Click(object sender, EventArgs e)\r
338         {\r
339             SaveFile.FileName = "";\r
340             SaveFile.Filter = "Batch|.bat";\r
341             SaveFile.ShowDialog();\r
342             if (SaveFile.FileName != String.Empty)\r
343                 queue.writeBatchScript(SaveFile.FileName);\r
344         }\r
345 \r
346         // Export the HandBrake Queue to a file.\r
347         private void mnu_export_Click(object sender, EventArgs e)\r
348         {\r
349             SaveFile.FileName = "";\r
350             SaveFile.Filter = "HandBrake Queue|*.queue";\r
351             SaveFile.ShowDialog();\r
352             if (SaveFile.FileName != String.Empty)\r
353                 queue.write2disk(SaveFile.FileName);\r
354         }\r
355 \r
356         // Import an exported queue\r
357         private void mnu_import_Click(object sender, EventArgs e)\r
358         {\r
359             OpenFile.FileName = "";\r
360             OpenFile.ShowDialog();\r
361             if (OpenFile.FileName != String.Empty)\r
362                 queue.recoverQueue(OpenFile.FileName);\r
363             redrawQueue();\r
364         }\r
365 \r
366         // Delete a selected item on the queue, if the delete key is pressed.\r
367         private void list_queue_deleteKey(object sender, KeyEventArgs e)\r
368         {\r
369             if (e.KeyCode == Keys.Delete)\r
370             {\r
371                 if (list_queue.SelectedIndices.Count != 0)\r
372                 {\r
373                     queue.remove(list_queue.SelectedIndices[0]);\r
374                     queue.write2disk("hb_queue_recovery.dat"); // Update the queue recovery file\r
375                     redrawQueue();\r
376                 }\r
377             }\r
378         }\r
379 \r
380         // Hide's the window from the users view.\r
381         private void btn_Close_Click(object sender, EventArgs e)\r
382         {\r
383             this.Hide();\r
384         }\r
385 \r
386         // Hide's the window when the user tries to "x" out of the window instead of closing it.\r
387         protected override void OnClosing(CancelEventArgs e)\r
388         {\r
389             e.Cancel = true;\r
390             this.Hide();\r
391             base.OnClosing(e);\r
392         }\r
393 \r
394 \r
395     }\r
396 }