OSDN Git Service

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