OSDN Git Service

WinGui:
[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' 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 mnu_up_Click(object sender, EventArgs e)\r
272         {\r
273             moveUp();\r
274         }\r
275         private void mnu_Down_Click(object sender, EventArgs e)\r
276         {\r
277             moveDown();\r
278         }\r
279         private void mnu_delete_Click(object sender, EventArgs e)\r
280         {\r
281             deleteSelectedItems();\r
282         }\r
283         private void btn_up_Click(object sender, EventArgs e)\r
284         {\r
285             moveUp();\r
286         }\r
287         private void btn_down_Click(object sender, EventArgs e)\r
288         {\r
289             moveDown();\r
290         }\r
291         private void btn_delete_Click(object sender, EventArgs e)\r
292         {\r
293             deleteSelectedItems();\r
294         }\r
295         private void list_queue_deleteKey(object sender, KeyEventArgs e)\r
296         {\r
297             if (e.KeyCode == Keys.Delete)\r
298                 deleteSelectedItems();\r
299         }\r
300         private void moveUp()\r
301         {\r
302             // If there are selected items and the first item is not selected\r
303             if (list_queue.SelectedIndices.Count > 0 && !list_queue.SelectedIndices.Contains(0))\r
304             {\r
305                 // Copy the selected indices to preserve them during the movement\r
306                 List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
307                 foreach (int selectedIndex in list_queue.SelectedIndices)\r
308                     selectedIndices.Add(selectedIndex);\r
309 \r
310                 // Move up each selected item\r
311                 foreach (int selectedIndex in selectedIndices)\r
312                     queue.moveUp(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 up one index\r
318                 foreach (int selectedIndex in selectedIndices)\r
319                     if (selectedIndex - 1 > -1) // 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 moveDown()\r
326         {\r
327             // If there are selected items and the last item is not selected\r
328             if (list_queue.SelectedIndices.Count > 0 &&\r
329                 !list_queue.SelectedIndices.Contains(list_queue.Items[list_queue.Items.Count - 1].Index))\r
330             {\r
331                 // Copy the selected indices to preserve them during the movement\r
332                 List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
333                 foreach (int selectedIndex in list_queue.SelectedIndices)\r
334                     selectedIndices.Add(selectedIndex);\r
335 \r
336                 // Reverse the indices to move the items down from last to first (preserves indices)\r
337                 selectedIndices.Reverse();\r
338 \r
339                 // Move down each selected item\r
340                 foreach (int selectedIndex in selectedIndices)\r
341                     queue.moveDown(selectedIndex);\r
342 \r
343                 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
344                 updateUIElements();\r
345 \r
346                 // Keep the selected item(s) selected, now moved down one index\r
347                 foreach (int selectedIndex in selectedIndices)\r
348                     if (selectedIndex + 1 < list_queue.Items.Count) // Defensive programming: ensure index is good\r
349                         list_queue.Items[selectedIndex + 1].Selected = true;\r
350             }\r
351 \r
352             list_queue.Select(); // Activate the control to show the selected items\r
353         }\r
354 \r
355         // Queue Import/Export Features\r
356         private void mnu_batch_Click(object sender, EventArgs e)\r
357         {\r
358             SaveFile.FileName = "";\r
359             SaveFile.Filter = "Batch|.bat";\r
360             SaveFile.ShowDialog();\r
361             if (SaveFile.FileName != String.Empty)\r
362                 queue.writeBatchScript(SaveFile.FileName);\r
363         }\r
364         private void mnu_export_Click(object sender, EventArgs e)\r
365         {\r
366             SaveFile.FileName = "";\r
367             SaveFile.Filter = "HandBrake Queue|*.queue";\r
368             SaveFile.ShowDialog();\r
369             if (SaveFile.FileName != String.Empty)\r
370                 queue.write2disk(SaveFile.FileName);\r
371         }\r
372         private void mnu_import_Click(object sender, EventArgs e)\r
373         {\r
374             OpenFile.FileName = "";\r
375             OpenFile.ShowDialog();\r
376             if (OpenFile.FileName != String.Empty)\r
377                 queue.recoverQueue(OpenFile.FileName);\r
378             updateUIElements();\r
379         }\r
380         private void mnu_readd_Click(object sender, EventArgs e)\r
381         {\r
382             if (queue.getLastQueryItem() != null)\r
383             {\r
384                 queue.add(queue.getLastQueryItem().Query, queue.getLastQueryItem().Source, queue.getLastQueryItem().Destination);\r
385                 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
386                 updateUIElements();\r
387             }\r
388         }\r
389 \r
390         // Hide's the window when the user tries to "x" out of the window instead of closing it.\r
391         protected override void OnClosing(CancelEventArgs e)\r
392         {\r
393             e.Cancel = true;\r
394             this.Hide();\r
395             base.OnClosing(e);\r
396         }\r
397 \r
398     }\r
399 }\r