OSDN Git Service

merge 0.9.4 to jp
[handbrake-jp/handbrake-jp.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.ComponentModel;\r
10 using System.Windows.Forms;\r
11 using Handbrake.EncodeQueue;\r
12 using System.Collections.ObjectModel;\r
13 \r
14 namespace Handbrake\r
15 {\r
16     public partial class frmQueue : Form\r
17     {\r
18         private delegate void UpdateHandler();\r
19         private EncodeAndQueueHandler queue;\r
20 \r
21         public frmQueue(EncodeAndQueueHandler q)\r
22         {\r
23             InitializeComponent();\r
24 \r
25             this.queue = q;\r
26             queue.NewJobStarted += new EventHandler(queueOnEncodeStart);\r
27             queue.QueueCompleted += new EventHandler(queueOnQueueFinished);\r
28             queue.QueuePauseRequested += new EventHandler(queueOnPaused);\r
29         }\r
30         void queueOnPaused(object sender, EventArgs e)\r
31         {\r
32             setUIEncodeFinished();\r
33             updateUIElements();\r
34         }\r
35         void queueOnQueueFinished(object sender, EventArgs e)\r
36         {\r
37             setUIEncodeFinished();\r
38             resetQueue(); // Reset the Queue Window\r
39         }\r
40         void queueOnEncodeStart(object sender, EventArgs e)\r
41         {\r
42             setUIEncodeStarted(); // make sure the UI is set correctly\r
43             setCurrentEncodeInformation();\r
44             updateUIElements(); // Redraw the Queue, a new encode has started.\r
45         }\r
46 \r
47         /// <summary>\r
48         /// Initializes the Queue list with the Arraylist from the Queue class\r
49         /// </summary>\r
50         public void setQueue()\r
51         {\r
52 /* HEAD:\r
53             queue = qw;\r
54             redrawQueue();\r
55             lbl_encodesPending.Text = list_queue.Items.Count + "\8cÂ\82Ì\83W\83\87\83u\82ª\91Ò\8b@\92\86";\r
56 */\r
57             updateUIElements();\r
58         }\r
59 \r
60         /// <summary>\r
61         /// Initializes the Queue list, then shows and activates the window\r
62         /// </summary>\r
63         public new void Show()\r
64         {\r
65            Show(true);\r
66         }\r
67 \r
68         /// <summary>\r
69         /// Initializes the Queue list only if doSetQueue is true, then shows and activates the window\r
70         /// </summary>\r
71         /// <param name="doSetQueue">Indicates whether to call setQueue() before showing the window</param>\r
72         public void Show(bool doSetQueue)\r
73         {\r
74 /* HEAD:\r
75             list_queue.Items.Clear();\r
76             ArrayList theQueue = queue.getQueue();\r
77             foreach (ArrayList queue_item in theQueue)\r
78             {\r
79                 string q_item = queue_item[1].ToString();\r
80                 Functions.QueryParser parsed = Functions.QueryParser.Parse(q_item);\r
81 \r
82                 // Get the DVD Title\r
83                 string title = "";\r
84                 if (parsed.DVDTitle == 0)\r
85                     title = "Automatic";\r
86                 else\r
87                     title = parsed.DVDTitle.ToString();\r
88 \r
89                 // Get the DVD Chapters\r
90                 string chapters = "";\r
91                 if (parsed.DVDChapterStart == 0)\r
92                     chapters = "Auto";\r
93                 else\r
94                 {\r
95                     chapters = parsed.DVDChapterStart.ToString();\r
96                     if (parsed.DVDChapterFinish != 0)\r
97                         chapters = chapters + " - " + parsed.DVDChapterFinish;\r
98                 }\r
99 \r
100                 ListViewItem item = new ListViewItem();\r
101                 item.Text = title; // Title\r
102                 item.SubItems.Add(chapters); // Chapters\r
103                 item.SubItems.Add(parsed.Source); // Source\r
104                 item.SubItems.Add(parsed.Destination); // Destination\r
105                 item.SubItems.Add(parsed.VideoEncoder); // Video\r
106                 item.SubItems.Add(parsed.AudioEncoder1); // Audio\r
107 */\r
108             if (doSetQueue) setQueue();\r
109             base.Show();\r
110 \r
111             //Activate();\r
112         }\r
113 \r
114         // Start and Stop Controls\r
115         private void btn_encode_Click(object sender, EventArgs e)\r
116         {\r
117             if (queue.PauseRequested)\r
118             {\r
119                 setUIEncodeStarted();\r
120                 MessageBox.Show("Encoding restarted", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
121             }\r
122 \r
123             if (!queue.isEncoding)\r
124                 queue.StartEncodeQueue();\r
125 \r
126         }\r
127         private void btn_pause_Click(object sender, EventArgs e)\r
128         {\r
129             queue.RequestPause();\r
130             setUIEncodeFinished();\r
131             resetQueue();\r
132             MessageBox.Show("No further items on the queue will start. The current encode process will continue until it is finished. \nClick 'Encode' when you wish to continue encoding the queue.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
133         }\r
134 \r
135         // Window Display Management\r
136         private void setUIEncodeStarted()\r
137         {\r
138             if (InvokeRequired)\r
139             {\r
140                 BeginInvoke(new UpdateHandler(setUIEncodeStarted));\r
141                 return;\r
142             }\r
143             btn_encode.Enabled = false;\r
144             btn_pause.Visible = true;\r
145         }\r
146         private void setUIEncodeFinished()\r
147         {\r
148             if (InvokeRequired)\r
149             {\r
150                 BeginInvoke(new UpdateHandler(setUIEncodeFinished));\r
151                 return;\r
152             }\r
153             btn_pause.Visible = false;\r
154             btn_encode.Enabled = true;\r
155         }\r
156         private void resetQueue()\r
157         {\r
158             if (InvokeRequired)\r
159             {\r
160                 BeginInvoke(new UpdateHandler(resetQueue));\r
161                 return;\r
162             }\r
163             btn_pause.Visible = false;\r
164             btn_encode.Enabled = true;\r
165 \r
166             lbl_source.Text = "-";\r
167             lbl_dest.Text = "-";\r
168             lbl_vEnc.Text = "-";\r
169             lbl_aEnc.Text = "-";\r
170             lbl_title.Text = "-";\r
171             lbl_chapt.Text = "-";\r
172 \r
173             lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
174         }\r
175         private void redrawQueue()\r
176         {\r
177             if (InvokeRequired)\r
178             {\r
179                 BeginInvoke(new UpdateHandler(redrawQueue));\r
180                 return;\r
181             }\r
182 \r
183             list_queue.Items.Clear();\r
184             ReadOnlyCollection<Job> theQueue = queue.CurrentQueue;\r
185             foreach (Job queue_item in theQueue)\r
186             {\r
187                 string q_item = queue_item.Query;\r
188                 Functions.QueryParser parsed = Functions.QueryParser.Parse(q_item);\r
189 \r
190                 // Get the DVD Title\r
191                 string title = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();\r
192 \r
193 /* HEAD\r
194                 if (cancel == true)\r
195                 {\r
196                     lbl_progressValue.Text = "\83G\83\93\83R\81[\83h\82ª\83L\83\83\83\93\83Z\83\8b\82³\82ê\82Ü\82µ\82½";\r
197                 }\r
198                 else\r
199                 {\r
200                     lbl_progressValue.Text = "\83G\83\93\83R\81[\83h\8dì\8bÆ\82ð\8a®\97¹\82µ\82Ü\82µ\82½";\r
201 */\r
202                 // Get the DVD Chapters\r
203                 string chapters;\r
204                 if (parsed.DVDChapterStart == 0)\r
205                     chapters = "Auto";\r
206                 else\r
207                 {\r
208                     chapters = parsed.DVDChapterStart.ToString();\r
209                     if (parsed.DVDChapterFinish != 0)\r
210                         chapters = chapters + " - " + parsed.DVDChapterFinish;\r
211                 }\r
212 \r
213                 ListViewItem item = new ListViewItem();\r
214                 item.Text = title; // Title\r
215                 item.SubItems.Add(chapters); // Chapters\r
216                 item.SubItems.Add(queue_item.Source); // Source\r
217                 item.SubItems.Add(queue_item.Destination); // Destination\r
218                 item.SubItems.Add(parsed.VideoEncoder); // Video\r
219 \r
220                 // Display The Audio Track Information\r
221                 string audio = string.Empty;\r
222                 foreach (Functions.AudioTrack track in parsed.AudioInformation)\r
223                 {\r
224                     if (audio != "")\r
225                         audio += ", " + track.Encoder;\r
226                     else\r
227                         audio = track.Encoder;\r
228                 }\r
229                 item.SubItems.Add(audio); // Audio\r
230 \r
231 /* HEAD\r
232                 lbl_encodesPending.Text = list_queue.Items.Count + "\8cÂ\82Ì\83W\83\87\83u\82ª\91Ò\8b@\92\86";\r
233             }\r
234             catch (Exception exc)\r
235             {\r
236                 MessageBox.Show(exc.ToString());\r
237             }\r
238         }\r
239 \r
240         // Stop's the queue from continuing. \r
241         private void btn_stop_Click(object sender, EventArgs e)\r
242         {\r
243             cancel = true;\r
244             btn_stop.Visible = false;\r
245             btn_encode.Enabled = true;\r
246             MessageBox.Show("\83L\83\85\81[\82Ì\8eÀ\8ds\82ª\92â\8e~\82³\82ê\82Ü\82µ\82½\81B. \8c»\8dÝ\83G\83\93\83R\81[\83h\92\86\82Ì\8f\88\97\9d\82Í\8a®\97¹\82·\82é\82Ü\82Å\8cp\91±\82³\82ê\82Ü\82·\81B\n\83L\83\85\81[\82Ì\8dì\8bÆ\82ð\8dÄ\8aJ\82µ\82½\82¢\8fê\8d\87\82Í\81u\83G\83\93\83R\81[\83h\81v\82ð\83N\83\8a\83b\83N\82µ\82Ä\82­\82¾\82³\82¢\81B", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
247         }\r
248 \r
249         // Updates the progress bar and progress label for a new status.\r
250         private void updateUIElements()\r
251         {\r
252             try\r
253             {\r
254                 if (this.InvokeRequired)\r
255                 {\r
256                     this.BeginInvoke(new ProgressUpdateHandler(updateUIElements));\r
257                     return;\r
258                 }\r
259 \r
260                 redrawQueue();\r
261 \r
262                 progressBar.PerformStep();\r
263                 lbl_progressValue.Text = string.Format("{0} %", progressBar.Value);\r
264                 lbl_encodesPending.Text = list_queue.Items.Count + "\8cÂ\82Ì\83W\83\87\83u\82ª\91Ò\8b@\92\86";\r
265             }\r
266             catch (Exception exc)\r
267 */\r
268                 list_queue.Items.Add(item);\r
269             }\r
270         }\r
271         private void updateUIElements()\r
272         {\r
273             if (InvokeRequired)\r
274             {\r
275                 BeginInvoke(new UpdateHandler(updateUIElements));\r
276                 return;\r
277             }\r
278 \r
279             redrawQueue();\r
280             lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
281         }\r
282         private void setCurrentEncodeInformation()\r
283         {\r
284             try\r
285             {\r
286                 if (InvokeRequired)\r
287                 {\r
288                     BeginInvoke(new UpdateHandler(setCurrentEncodeInformation));\r
289                 }\r
290 \r
291                 // found query is a global varible\r
292                 Functions.QueryParser parsed = Functions.QueryParser.Parse(queue.LastEncode.Query);\r
293                 lbl_source.Text = queue.LastEncode.Source;\r
294                 lbl_dest.Text = queue.LastEncode.Destination;\r
295 \r
296                 lbl_title.Text = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();\r
297 \r
298 /* HEAD\r
299                 if (parsed.DVDTitle == 0)\r
300                     lbl_title.Text = "Automatic";\r
301                 else\r
302                     lbl_title.Text = parsed.DVDTitle.ToString();\r
303 \r
304                 string chapters = "";\r
305                 if (parsed.DVDChapterStart == 0)\r
306                 {\r
307 */\r
308                 if (Equals(parsed.DVDChapterStart, 0))\r
309                     lbl_chapt.Text = "Auto";\r
310                 else\r
311                 {\r
312                     string chapters = parsed.DVDChapterStart.ToString();\r
313                     if (parsed.DVDChapterFinish != 0)\r
314                         chapters = chapters + " - " + parsed.DVDChapterFinish;\r
315                     lbl_chapt.Text = chapters;\r
316                 }\r
317 \r
318                 lbl_vEnc.Text = parsed.VideoEncoder;\r
319 \r
320                 // Display The Audio Track Information\r
321                 string audio = string.Empty;\r
322                 foreach (Functions.AudioTrack track in parsed.AudioInformation)\r
323                 {\r
324                     if (audio != "")\r
325                         audio += ", " + track.Encoder;\r
326                     else\r
327                         audio = track.Encoder;\r
328                 }\r
329                 lbl_aEnc.Text = audio;\r
330             }\r
331             catch (Exception)\r
332             {\r
333                 // Do Nothing\r
334             }\r
335         }\r
336         private void deleteSelectedItems()\r
337         {\r
338             // If there are selected items\r
339             if (list_queue.SelectedIndices.Count > 0)\r
340             {\r
341                 // Save the selected indices to select them after the move\r
342                 List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
343                 foreach (int selectedIndex in list_queue.SelectedIndices)\r
344                     selectedIndices.Add(selectedIndex);\r
345 \r
346                 int firstSelectedIndex = selectedIndices[0];\r
347 \r
348                 // Reverse the list to delete the items from last to first (preserves indices)\r
349                 selectedIndices.Reverse();\r
350 \r
351                 // Remove each selected item\r
352                 foreach (int selectedIndex in selectedIndices)\r
353                     queue.RemoveJob(selectedIndex);\r
354 \r
355                 updateUIElements();\r
356 \r
357                 // Select the item where the first deleted item was previously\r
358                 if (firstSelectedIndex < list_queue.Items.Count)\r
359                     list_queue.Items[firstSelectedIndex].Selected = true;\r
360             }\r
361 \r
362             list_queue.Select(); // Activate the control to show the selected items\r
363         }\r
364 \r
365         // Queue Management\r
366         private void mnu_up_Click(object sender, EventArgs e)\r
367         {\r
368             moveUp();\r
369         }\r
370         private void mnu_Down_Click(object sender, EventArgs e)\r
371         {\r
372             moveDown();\r
373         }\r
374         private void mnu_delete_Click(object sender, EventArgs e)\r
375         {\r
376             deleteSelectedItems();\r
377         }\r
378         private void btn_up_Click(object sender, EventArgs e)\r
379         {\r
380             moveUp();\r
381         }\r
382         private void btn_down_Click(object sender, EventArgs e)\r
383         {\r
384             moveDown();\r
385         }\r
386         private void btn_delete_Click(object sender, EventArgs e)\r
387         {\r
388             deleteSelectedItems();\r
389         }\r
390         private void list_queue_deleteKey(object sender, KeyEventArgs e)\r
391         {\r
392             if (e.KeyCode == Keys.Delete)\r
393                 deleteSelectedItems();\r
394         }\r
395         private void moveUp()\r
396         {\r
397             // If there are selected items and the first item is not selected\r
398             if (list_queue.SelectedIndices.Count > 0 && !list_queue.SelectedIndices.Contains(0))\r
399             {\r
400                 // Copy the selected indices to preserve them during the movement\r
401                 List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
402                 foreach (int selectedIndex in list_queue.SelectedIndices)\r
403                     selectedIndices.Add(selectedIndex);\r
404 \r
405                 // Move up each selected item\r
406                 foreach (int selectedIndex in selectedIndices)\r
407                     queue.MoveUp(selectedIndex);\r
408 \r
409                 updateUIElements();\r
410 \r
411                 // Keep the selected item(s) selected, now moved up one index\r
412                 foreach (int selectedIndex in selectedIndices)\r
413                     if (selectedIndex - 1 > -1) // Defensive programming: ensure index is good\r
414                         list_queue.Items[selectedIndex - 1].Selected = true;\r
415             }\r
416 \r
417             list_queue.Select(); // Activate the control to show the selected items\r
418         }\r
419         private void moveDown()\r
420         {\r
421             // If there are selected items and the last item is not selected\r
422             if (list_queue.SelectedIndices.Count > 0 &&\r
423                 !list_queue.SelectedIndices.Contains(list_queue.Items[list_queue.Items.Count - 1].Index))\r
424             {\r
425 /* HEAD\r
426                 queue.remove(list_queue.SelectedIndices[0]);\r
427                 queue.write2disk("hb_queue_recovery.dat"); // Update the queue recovery file\r
428                 redrawQueue();\r
429                 lbl_encodesPending.Text = list_queue.Items.Count + "\8cÂ\82Ì\83W\83\87\83u\82ª\91Ò\8b@\92\86";\r
430 */\r
431                 // Copy the selected indices to preserve them during the movement\r
432                 List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
433                 foreach (int selectedIndex in list_queue.SelectedIndices)\r
434                     selectedIndices.Add(selectedIndex);\r
435 \r
436                 // Reverse the indices to move the items down from last to first (preserves indices)\r
437                 selectedIndices.Reverse();\r
438 \r
439                 // Move down each selected item\r
440                 foreach (int selectedIndex in selectedIndices)\r
441                     queue.MoveDown(selectedIndex);\r
442 \r
443                 updateUIElements();\r
444 \r
445                 // Keep the selected item(s) selected, now moved down one index\r
446                 foreach (int selectedIndex in selectedIndices)\r
447                     if (selectedIndex + 1 < list_queue.Items.Count) // Defensive programming: ensure index is good\r
448                         list_queue.Items[selectedIndex + 1].Selected = true;\r
449             }\r
450 \r
451             list_queue.Select(); // Activate the control to show the selected items\r
452         }\r
453 \r
454         // Queue Import/Export Features\r
455         private void mnu_batch_Click(object sender, EventArgs e)\r
456         {\r
457             SaveFile.FileName = "";\r
458             SaveFile.Filter = "Batch|.bat";\r
459             SaveFile.ShowDialog();\r
460             if (SaveFile.FileName != String.Empty)\r
461                 queue.WriteBatchScriptToFile(SaveFile.FileName);\r
462         }\r
463         private void mnu_export_Click(object sender, EventArgs e)\r
464         {\r
465             SaveFile.FileName = "";\r
466             SaveFile.Filter = "HandBrake Queue|*.queue";\r
467             SaveFile.ShowDialog();\r
468             if (SaveFile.FileName != String.Empty)\r
469                 queue.WriteQueueStateToFile(SaveFile.FileName);\r
470         }\r
471         private void mnu_import_Click(object sender, EventArgs e)\r
472         {\r
473             OpenFile.FileName = "";\r
474             OpenFile.ShowDialog();\r
475             if (OpenFile.FileName != String.Empty)\r
476                 queue.LoadQueueFromFile(OpenFile.FileName);\r
477             updateUIElements();\r
478         }\r
479         private void mnu_readd_Click(object sender, EventArgs e)\r
480         {\r
481             if (!queue.LastEncode.IsEmpty)\r
482             {\r
483                 queue.AddJob(queue.LastEncode.Query, queue.LastEncode.Source, queue.LastEncode.Destination, queue.LastEncode.CustomQuery);\r
484                 updateUIElements();\r
485             }\r
486         }\r
487 \r
488         // Hide's the window when the user tries to "x" out of the window instead of closing it.\r
489         protected override void OnClosing(CancelEventArgs e)\r
490         {\r
491             e.Cancel = true;\r
492             this.Hide();\r
493             base.OnClosing(e);\r
494         }\r
495 \r
496     }\r
497 }\r