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 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                 item.SubItems.Add(parsed.AudioEncoder1); // Audio\r
169 \r
170                 list_queue.Items.Add(item);\r
171             }\r
172         }\r
173         private void updateUIElements()\r
174         {\r
175             if (InvokeRequired)\r
176             {\r
177                 BeginInvoke(new UpdateHandler(updateUIElements));\r
178                 return;\r
179             }\r
180 \r
181             redrawQueue();\r
182             lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
183         }\r
184         private void setCurrentEncodeInformation()\r
185         {\r
186             try\r
187             {\r
188                 if (InvokeRequired)\r
189                 {\r
190                     BeginInvoke(new UpdateHandler(setCurrentEncodeInformation));\r
191                 }\r
192 \r
193                 // found query is a global varible\r
194                 Functions.QueryParser parsed = Functions.QueryParser.Parse(queue.getLastQueryItem().Query);\r
195                 lbl_source.Text = queue.getLastQueryItem().Source;\r
196                 lbl_dest.Text = queue.getLastQueryItem().Destination;\r
197 \r
198                 lbl_title.Text = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();\r
199 \r
200                 if (Equals(parsed.DVDChapterStart, 0))\r
201                   lbl_chapt.Text = "Auto";\r
202                 else\r
203                 {\r
204                     string chapters = parsed.DVDChapterStart.ToString();\r
205                     if (parsed.DVDChapterFinish != 0)\r
206                         chapters = chapters + " - " + parsed.DVDChapterFinish;\r
207                     lbl_chapt.Text = chapters;\r
208                 }\r
209 \r
210                 lbl_vEnc.Text = parsed.VideoEncoder;\r
211                 lbl_aEnc.Text = parsed.AudioEncoder1;\r
212             }\r
213             catch (Exception)\r
214             {\r
215                 // Do Nothing\r
216             }\r
217         }\r
218         private void deleteSelectedItems()\r
219         {\r
220             // If there are selected items\r
221             if (list_queue.SelectedIndices.Count > 0)\r
222             {\r
223                 // Save the selected indices to select them after the move\r
224                 List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
225                 foreach (int selectedIndex in list_queue.SelectedIndices)\r
226                     selectedIndices.Add(selectedIndex);\r
227 \r
228                 int firstSelectedIndex = selectedIndices[0];\r
229 \r
230                 // Reverse the list to delete the items from last to first (preserves indices)\r
231                 selectedIndices.Reverse();\r
232                 \r
233                 // Remove each selected item\r
234                 foreach (int selectedIndex in selectedIndices)\r
235                     queue.remove(selectedIndex);\r
236 \r
237                 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
238                 updateUIElements();\r
239 \r
240                 // Select the item where the first deleted item was previously\r
241                 if (firstSelectedIndex < list_queue.Items.Count) \r
242                     list_queue.Items[firstSelectedIndex].Selected = true;\r
243             }\r
244 \r
245             list_queue.Select(); // Activate the control to show the selected items\r
246         }\r
247 \r
248         // Queue Management\r
249         private void btn_re_add_Click(object sender, EventArgs e)\r
250         {\r
251             if (queue.getLastQueryItem() != null)\r
252             {\r
253                 queue.add(queue.getLastQueryItem().Query, queue.getLastQueryItem().Source, queue.getLastQueryItem().Destination);\r
254                 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
255                 updateUIElements();\r
256             }\r
257         }\r
258         private void btn_up_Click(object sender, EventArgs e)\r
259         {\r
260             // If there are selected items and the first item is not selected\r
261             if (list_queue.SelectedIndices.Count > 0 && ! list_queue.SelectedIndices.Contains(0))\r
262             {\r
263                 // Copy the selected indices to preserve them during the movement\r
264                 List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
265                 foreach (int selectedIndex in list_queue.SelectedIndices)\r
266                     selectedIndices.Add(selectedIndex);\r
267 \r
268                 // Move up each selected item\r
269                 foreach (int selectedIndex in selectedIndices)\r
270                     queue.moveUp(selectedIndex);\r
271 \r
272                 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
273                 updateUIElements();\r
274 \r
275                 // Keep the selected item(s) selected, now moved up one index\r
276                 foreach (int selectedIndex in selectedIndices)\r
277                     if (selectedIndex - 1 > -1) // Defensive programming: ensure index is good\r
278                         list_queue.Items[selectedIndex - 1].Selected = true;\r
279             }\r
280 \r
281             list_queue.Select(); // Activate the control to show the selected items\r
282         }\r
283         private void btn_down_Click(object sender, EventArgs e)\r
284         {\r
285             // If there are selected items and the last item is not selected\r
286             if (list_queue.SelectedIndices.Count > 0 && \r
287                 ! list_queue.SelectedIndices.Contains(list_queue.Items[list_queue.Items.Count-1].Index))\r
288             {\r
289                 // Copy the selected indices to preserve them during the movement\r
290                 List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
291                 foreach (int selectedIndex in list_queue.SelectedIndices)\r
292                     selectedIndices.Add(selectedIndex);\r
293 \r
294                 // Reverse the indices to move the items down from last to first (preserves indices)\r
295                 selectedIndices.Reverse();\r
296 \r
297                 // Move down each selected item\r
298                 foreach (int selectedIndex in selectedIndices)\r
299                     queue.moveDown(selectedIndex);\r
300                 \r
301                 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
302                 updateUIElements();\r
303 \r
304                 // Keep the selected item(s) selected, now moved down one index\r
305                 foreach (int selectedIndex in selectedIndices)\r
306                     if (selectedIndex + 1 < list_queue.Items.Count) // Defensive programming: ensure index is good\r
307                         list_queue.Items[selectedIndex + 1].Selected = true; \r
308             }\r
309 \r
310             list_queue.Select(); // Activate the control to show the selected items\r
311         }\r
312         private void btn_delete_Click(object sender, EventArgs e)\r
313         {\r
314             deleteSelectedItems();\r
315         }\r
316         private void list_queue_deleteKey(object sender, KeyEventArgs e)\r
317         {\r
318             if (e.KeyCode == Keys.Delete)\r
319                 deleteSelectedItems();\r
320         }\r
321 \r
322         // Queue Import/Export Features\r
323         private void mnu_batch_Click(object sender, EventArgs e)\r
324         {\r
325             SaveFile.FileName = "";\r
326             SaveFile.Filter = "Batch|.bat";\r
327             SaveFile.ShowDialog();\r
328             if (SaveFile.FileName != String.Empty)\r
329                 queue.writeBatchScript(SaveFile.FileName);\r
330         }\r
331         private void mnu_export_Click(object sender, EventArgs e)\r
332         {\r
333             SaveFile.FileName = "";\r
334             SaveFile.Filter = "HandBrake Queue|*.queue";\r
335             SaveFile.ShowDialog();\r
336             if (SaveFile.FileName != String.Empty)\r
337                 queue.write2disk(SaveFile.FileName);\r
338         }\r
339         private void mnu_import_Click(object sender, EventArgs e)\r
340         {\r
341             OpenFile.FileName = "";\r
342             OpenFile.ShowDialog();\r
343             if (OpenFile.FileName != String.Empty)\r
344                 queue.recoverQueue(OpenFile.FileName);\r
345             updateUIElements();\r
346         }\r
347 \r
348         // Hide's the window when the user tries to "x" out of the window instead of closing it.\r
349         protected override void OnClosing(CancelEventArgs e)\r
350         {\r
351             e.Cancel = true;\r
352             this.Hide();\r
353             base.OnClosing(e);\r
354         }\r
355 \r
356         \r
357     }\r
358 }\r