OSDN Git Service

26fd97311a89340a7554f76a84037d7a24b8b673
[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.ComponentModel;\r
10 using System.Windows.Forms;\r
11 \r
12 namespace Handbrake\r
13 {\r
14     public partial class frmQueue : Form\r
15     {\r
16         private delegate void UpdateHandler();\r
17         Queue.QueueHandler queue;\r
18 \r
19         public frmQueue(Queue.QueueHandler q)\r
20         {\r
21             InitializeComponent();\r
22 \r
23             this.queue = q;\r
24             queue.OnEncodeStart += new EventHandler(queue_OnEncodeStart);\r
25             queue.OnQueueFinished += new EventHandler(queue_OnQueueFinished);\r
26             queue.OnPaused += new EventHandler(queue_OnPaused);\r
27         }\r
28         void queue_OnPaused(object sender, EventArgs e)\r
29         {\r
30             setUIEncodeFinished();\r
31             updateUIElements();\r
32         }\r
33         void queue_OnQueueFinished(object sender, EventArgs e)\r
34         {\r
35             setUIEncodeFinished();\r
36             resetQueue(); // Reset the Queue Window\r
37         }\r
38         void queue_OnEncodeStart(object sender, EventArgs e)\r
39         {\r
40             setUIEncodeStarted(); // make sure the UI is set correctly\r
41             setCurrentEncodeInformation();\r
42             updateUIElements(); // Redraw the Queue, a new encode has started.\r
43         }\r
44 \r
45         /// <summary>\r
46         /// Initializes the Queue list with the Arraylist from the Queue class\r
47         /// </summary>\r
48         public void setQueue()\r
49         {\r
50             updateUIElements();\r
51         }\r
52 \r
53         /// <summary>\r
54         /// Initializes the Queue list, then shows and activates the window\r
55         /// </summary>\r
56         public new void Show()\r
57         {\r
58             Show(true);\r
59         }\r
60 \r
61         /// <summary>\r
62         /// Initializes the Queue list only if doSetQueue is true, then shows and activates the window\r
63         /// </summary>\r
64         /// <param name="doSetQueue">Indicates whether to call setQueue() before showing the window</param>\r
65         public void Show(bool doSetQueue)\r
66         {\r
67             if (doSetQueue) setQueue();\r
68             base.Show();\r
69             Activate();\r
70         }\r
71 \r
72         // Start and Stop Controls\r
73         private void btn_encode_Click(object sender, EventArgs e)\r
74         {\r
75             if (queue.isPaused)\r
76             {\r
77                 setUIEncodeStarted();\r
78                 MessageBox.Show("Encoding restarted", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
79             }\r
80 \r
81             if (!queue.isEncodeStarted)\r
82                 queue.startEncode();\r
83 \r
84         }\r
85         private void btn_pause_Click(object sender, EventArgs e)\r
86         {\r
87             queue.pauseEncode();\r
88             setUIEncodeFinished();\r
89             resetQueue();\r
90             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
91         }\r
92 \r
93         // Window Display Management\r
94         private void setUIEncodeStarted()\r
95         {\r
96             if (InvokeRequired)\r
97             {\r
98                 BeginInvoke(new UpdateHandler(setUIEncodeStarted));\r
99                 return;\r
100             }\r
101             btn_encode.Enabled = false;\r
102             btn_pause.Visible = true;\r
103         }\r
104         private void setUIEncodeFinished()\r
105         {\r
106             if (InvokeRequired)\r
107             {\r
108                 BeginInvoke(new UpdateHandler(setUIEncodeFinished));\r
109                 return;\r
110             }\r
111             btn_pause.Visible = false;\r
112             btn_encode.Enabled = true;\r
113         }\r
114         private void resetQueue()\r
115         {\r
116             if (InvokeRequired)\r
117             {\r
118                 BeginInvoke(new UpdateHandler(resetQueue));\r
119                 return;\r
120             }\r
121             btn_pause.Visible = false;\r
122             btn_encode.Enabled = true;\r
123 \r
124             lbl_source.Text = "-";\r
125             lbl_dest.Text = "-";\r
126             lbl_vEnc.Text = "-";\r
127             lbl_aEnc.Text = "-";\r
128             lbl_title.Text = "-";\r
129             lbl_chapt.Text = "-";\r
130 \r
131             lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
132         }\r
133         private void redrawQueue()\r
134         {\r
135             if (InvokeRequired)\r
136             {\r
137                 BeginInvoke(new UpdateHandler(redrawQueue));\r
138                 return;\r
139             }\r
140 \r
141             list_queue.Items.Clear();\r
142             List<Queue.QueueItem> theQueue = queue.getQueue();\r
143             foreach (Queue.QueueItem queue_item in theQueue)\r
144             {\r
145                 string q_item = queue_item.Query;\r
146                 Functions.QueryParser parsed = Functions.QueryParser.Parse(q_item);\r
147 \r
148                 // Get the DVD Title\r
149                  string title = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();\r
150 \r
151                 // Get the DVD Chapters\r
152                 string chapters;\r
153                 if (parsed.DVDChapterStart == 0)\r
154                     chapters = "Auto";\r
155                 else\r
156                 {\r
157                     chapters = parsed.DVDChapterStart.ToString();\r
158                     if (parsed.DVDChapterFinish != 0)\r
159                         chapters = chapters + " - " + parsed.DVDChapterFinish;\r
160                 }\r
161 \r
162                 ListViewItem item = new ListViewItem();\r
163                 item.Text = title; // Title\r
164                 item.SubItems.Add(chapters); // Chapters\r
165                 item.SubItems.Add(queue_item.Source); // Source\r
166                 item.SubItems.Add(queue_item.Destination); // Destination\r
167                 item.SubItems.Add(parsed.VideoEncoder); // Video\r
168 \r
169                 // Display the first 4 audio tracks.\r
170                 String audio = parsed.AudioEncoder1;\r
171                 if (parsed.AudioEncoder2 != null)\r
172                     audio += ", " + parsed.AudioEncoder2;\r
173 \r
174                 if (parsed.AudioEncoder3 != null)\r
175                     audio += ", " + parsed.AudioEncoder3;\r
176 \r
177                 if (parsed.AudioEncoder4 != null)\r
178                     audio += ", " + parsed.AudioEncoder4;\r
179 \r
180                 item.SubItems.Add(audio); // Audio\r
181 \r
182                 list_queue.Items.Add(item);\r
183             }\r
184         }\r
185         private void updateUIElements()\r
186         {\r
187             if (InvokeRequired)\r
188             {\r
189                 BeginInvoke(new UpdateHandler(updateUIElements));\r
190                 return;\r
191             }\r
192 \r
193             redrawQueue();\r
194             lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
195         }\r
196         private void setCurrentEncodeInformation()\r
197         {\r
198             try\r
199             {\r
200                 if (InvokeRequired)\r
201                 {\r
202                     BeginInvoke(new UpdateHandler(setCurrentEncodeInformation));\r
203                 }\r
204 \r
205                 // found query is a global varible\r
206                 Functions.QueryParser parsed = Functions.QueryParser.Parse(queue.getLastQueryItem().Query);\r
207                 lbl_source.Text = queue.getLastQueryItem().Source;\r
208                 lbl_dest.Text = queue.getLastQueryItem().Destination;\r
209 \r
210                 lbl_title.Text = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();\r
211 \r
212                 if (Equals(parsed.DVDChapterStart, 0))\r
213                   lbl_chapt.Text = "Auto";\r
214                 else\r
215                 {\r
216                     string chapters = parsed.DVDChapterStart.ToString();\r
217                     if (parsed.DVDChapterFinish != 0)\r
218                         chapters = chapters + " - " + parsed.DVDChapterFinish;\r
219                     lbl_chapt.Text = chapters;\r
220                 }\r
221 \r
222                 lbl_vEnc.Text = parsed.VideoEncoder;\r
223                 String audio = parsed.AudioEncoder1;\r
224                 if (parsed.AudioEncoder2 != null)\r
225                     audio += ", " + parsed.AudioEncoder2;\r
226 \r
227                 if (parsed.AudioEncoder3 != null)\r
228                     audio += ", " + parsed.AudioEncoder3;\r
229 \r
230                 if (parsed.AudioEncoder4 != null)\r
231                     audio += ", " + parsed.AudioEncoder4;\r
232 \r
233                 lbl_aEnc.Text = audio;\r
234             }\r
235             catch (Exception)\r
236             {\r
237                 // Do Nothing\r
238             }\r
239         }\r
240         private void deleteSelectedItems()\r
241         {\r
242             // If there are selected items\r
243             if (list_queue.SelectedIndices.Count > 0)\r
244             {\r
245                 // Save the selected indices to select them after the move\r
246                 List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
247                 foreach (int selectedIndex in list_queue.SelectedIndices)\r
248                     selectedIndices.Add(selectedIndex);\r
249 \r
250                 int firstSelectedIndex = selectedIndices[0];\r
251 \r
252                 // Reverse the list to delete the items from last to first (preserves indices)\r
253                 selectedIndices.Reverse();\r
254                 \r
255                 // Remove each selected item\r
256                 foreach (int selectedIndex in selectedIndices)\r
257                     queue.remove(selectedIndex);\r
258 \r
259                 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
260                 updateUIElements();\r
261 \r
262                 // Select the item where the first deleted item was previously\r
263                 if (firstSelectedIndex < list_queue.Items.Count) \r
264                     list_queue.Items[firstSelectedIndex].Selected = true;\r
265             }\r
266 \r
267             list_queue.Select(); // Activate the control to show the selected items\r
268         }\r
269 \r
270         // Queue Management\r
271         private void btn_up_Click(object sender, EventArgs e)\r
272         {\r
273             // If there are selected items and the first item is not selected\r
274             if (list_queue.SelectedIndices.Count > 0 && ! list_queue.SelectedIndices.Contains(0))\r
275             {\r
276                 // Copy the selected indices to preserve them during the movement\r
277                 List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
278                 foreach (int selectedIndex in list_queue.SelectedIndices)\r
279                     selectedIndices.Add(selectedIndex);\r
280 \r
281                 // Move up each selected item\r
282                 foreach (int selectedIndex in selectedIndices)\r
283                     queue.moveUp(selectedIndex);\r
284 \r
285                 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
286                 updateUIElements();\r
287 \r
288                 // Keep the selected item(s) selected, now moved up one index\r
289                 foreach (int selectedIndex in selectedIndices)\r
290                     if (selectedIndex - 1 > -1) // Defensive programming: ensure index is good\r
291                         list_queue.Items[selectedIndex - 1].Selected = true;\r
292             }\r
293 \r
294             list_queue.Select(); // Activate the control to show the selected items\r
295         }\r
296         private void btn_down_Click(object sender, EventArgs e)\r
297         {\r
298             // If there are selected items and the last item is not selected\r
299             if (list_queue.SelectedIndices.Count > 0 && \r
300                 ! list_queue.SelectedIndices.Contains(list_queue.Items[list_queue.Items.Count-1].Index))\r
301             {\r
302                 // Copy the selected indices to preserve them during the movement\r
303                 List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
304                 foreach (int selectedIndex in list_queue.SelectedIndices)\r
305                     selectedIndices.Add(selectedIndex);\r
306 \r
307                 // Reverse the indices to move the items down from last to first (preserves indices)\r
308                 selectedIndices.Reverse();\r
309 \r
310                 // Move down each selected item\r
311                 foreach (int selectedIndex in selectedIndices)\r
312                     queue.moveDown(selectedIndex);\r
313                 \r
314                 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
315                 updateUIElements();\r
316 \r
317                 // Keep the selected item(s) selected, now moved down one index\r
318                 foreach (int selectedIndex in selectedIndices)\r
319                     if (selectedIndex + 1 < list_queue.Items.Count) // Defensive programming: ensure index is good\r
320                         list_queue.Items[selectedIndex + 1].Selected = true; \r
321             }\r
322 \r
323             list_queue.Select(); // Activate the control to show the selected items\r
324         }\r
325         private void btn_delete_Click(object sender, EventArgs e)\r
326         {\r
327             deleteSelectedItems();\r
328         }\r
329         private void list_queue_deleteKey(object sender, KeyEventArgs e)\r
330         {\r
331             if (e.KeyCode == Keys.Delete)\r
332                 deleteSelectedItems();\r
333         }\r
334 \r
335         // Queue Import/Export Features\r
336         private void mnu_batch_Click(object sender, EventArgs e)\r
337         {\r
338             SaveFile.FileName = "";\r
339             SaveFile.Filter = "Batch|.bat";\r
340             SaveFile.ShowDialog();\r
341             if (SaveFile.FileName != String.Empty)\r
342                 queue.writeBatchScript(SaveFile.FileName);\r
343         }\r
344         private void mnu_export_Click(object sender, EventArgs e)\r
345         {\r
346             SaveFile.FileName = "";\r
347             SaveFile.Filter = "HandBrake Queue|*.queue";\r
348             SaveFile.ShowDialog();\r
349             if (SaveFile.FileName != String.Empty)\r
350                 queue.write2disk(SaveFile.FileName);\r
351         }\r
352         private void mnu_import_Click(object sender, EventArgs e)\r
353         {\r
354             OpenFile.FileName = "";\r
355             OpenFile.ShowDialog();\r
356             if (OpenFile.FileName != String.Empty)\r
357                 queue.recoverQueue(OpenFile.FileName);\r
358             updateUIElements();\r
359         }\r
360         private void mnu_readd_Click(object sender, EventArgs e)\r
361         {\r
362             if (queue.getLastQueryItem() != null)\r
363             {\r
364                 queue.add(queue.getLastQueryItem().Query, queue.getLastQueryItem().Source, queue.getLastQueryItem().Destination);\r
365                 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
366                 updateUIElements();\r
367             }\r
368         }\r
369 \r
370         // Hide's the window when the user tries to "x" out of the window instead of closing it.\r
371         protected override void OnClosing(CancelEventArgs e)\r
372         {\r
373             e.Cancel = true;\r
374             this.Hide();\r
375             base.OnClosing(e);\r
376         }\r
377 \r
378         \r
379        \r
380     }\r
381 }\r