OSDN Git Service

4ffa628ba98f57a5858850bf08c3fd1fc4510b7d
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmQueue.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.ComponentModel;\r
4 using System.Data;\r
5 using System.Drawing;\r
6 using System.Text;\r
7 using System.Windows.Forms;\r
8 using System.Threading;\r
9 using System.Diagnostics;\r
10 using System.Runtime.InteropServices;\r
11 \r
12 namespace Handbrake\r
13 {\r
14     public partial class frmQueue : Form\r
15     {\r
16         // Declarations\r
17         private delegate void ProgressUpdateHandler();\r
18         private delegate void getQueueItem();\r
19         private delegate void setEncoding();\r
20         private delegate void modifyQueue();\r
21 \r
22         // Everything starts Here\r
23         public frmQueue()\r
24         {\r
25             InitializeComponent();\r
26         }\r
27 \r
28         #region encode queue Handlnig\r
29 \r
30         // Declarations\r
31         Boolean cancel = false;\r
32         string foundQuery = "";\r
33         [DllImport("user32.dll")]\r
34         public static extern void LockWorkStation();\r
35         [DllImport("user32.dll")]\r
36         public static extern int ExitWindowsEx(int uFlags, int dwReason);\r
37 \r
38         // Methods\r
39         private void btn_q_encoder_Click(object sender, EventArgs e)\r
40         {\r
41             // Reset some values\r
42 \r
43             lbl_status.Visible = false;\r
44             cancel = false;\r
45 \r
46             // Start the encode\r
47             try\r
48             {\r
49                 if (listview_queue.Items.Count != 0)\r
50                 {\r
51                     // Setup or reset some values\r
52                     btn_cancel.Visible = true;\r
53                     progressBar.Value = 0;\r
54                     lbl_progressValue.Text = "0 %";\r
55                     progressBar.Step = 100 / listview_queue.Items.Count;\r
56                     progressBar.Update();\r
57                     //ThreadPool.QueueUserWorkItem(startProc);\r
58                     // Testing a new way of launching a thread. Hopefully will fix a random freeze up of the main thread.\r
59                     Thread theQ = new Thread(startProc);\r
60                     theQ.Start();\r
61                 }\r
62             }\r
63             catch (Exception exc)\r
64             {\r
65                 MessageBox.Show(exc.ToString());\r
66             }\r
67         }\r
68 \r
69         private void btn_cancel_Click(object sender, EventArgs e)\r
70         {\r
71             cancel = true;\r
72             btn_cancel.Visible = false;\r
73             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
74         }\r
75 \r
76         private void startProc(object state)\r
77         {\r
78             try\r
79             {\r
80                 while (listview_queue.Items.Count != 0)\r
81                 {\r
82                     getItem();\r
83                     string query = foundQuery;\r
84                     query = query.Replace("ListViewItem: { ", "").Replace(" }", "").Trim();\r
85                     updateUIElements();\r
86                     setEncValue();\r
87 \r
88                     Functions.CLI process = new Functions.CLI();\r
89                     Process hbProc = process.runCli(this, query, false, false, false, false);\r
90 \r
91                     hbProc.WaitForExit();\r
92                     hbProc.Close();\r
93                     hbProc.Dispose();\r
94 \r
95                     query = "";\r
96 \r
97                     if (cancel == true)\r
98                     {\r
99                         break;\r
100                     }\r
101 \r
102                 }\r
103 \r
104                 resetQueue();\r
105 \r
106                 // Do something whent he encode ends.\r
107                 switch (Properties.Settings.Default.CompletionOption)\r
108                 {\r
109                     case "Shutdown":\r
110                         System.Diagnostics.Process.Start("Shutdown", "-s -t 60");\r
111                         break;\r
112                     case "Log Off":\r
113                         ExitWindowsEx(0, 0);\r
114                         break;\r
115                     case "Suspend":\r
116                         Application.SetSuspendState(PowerState.Suspend, true, true);\r
117                         break;\r
118                     case "Hibernate":\r
119                         Application.SetSuspendState(PowerState.Hibernate, true, true);\r
120                         break;\r
121                     case "Lock System":\r
122                         LockWorkStation();\r
123                         break;\r
124                     case "Quit HandBrake":\r
125                         Application.Exit();\r
126                         break;\r
127                     default:\r
128                         break;\r
129                 }\r
130             }\r
131             catch (Exception exc)\r
132             {\r
133                 MessageBox.Show(exc.ToString());\r
134             }\r
135         }\r
136 \r
137         private void getItem()\r
138         {\r
139             try\r
140             {\r
141                 if (this.InvokeRequired)\r
142                 {\r
143                     this.BeginInvoke(new getQueueItem(getItem));\r
144                 }\r
145                 foundQuery = this.listview_queue.Items[0].ToString();\r
146             }\r
147             catch (Exception)\r
148             {\r
149                 // Do Nothing\r
150             }\r
151         }\r
152 \r
153         private void setEncValue()\r
154         {\r
155             try\r
156             {\r
157                 if (this.InvokeRequired)\r
158                 {\r
159                     this.BeginInvoke(new setEncoding(setEncValue));\r
160                 }\r
161 \r
162                 string query = null;\r
163                 ListView.SelectedListViewItemCollection name = null;\r
164                 name = listview_queue.SelectedItems;\r
165 \r
166                 if (listview_queue.SelectedItems.Count != 0)\r
167                     query = name[0].SubItems[0].Text;\r
168 \r
169                 // found query is a global varible\r
170                 Functions.QueryParser parsed = Functions.QueryParser.Parse(foundQuery);\r
171                 lbl_source.Text = parsed.Source;\r
172                 lbl_dest.Text = parsed.Destination;\r
173 \r
174 \r
175                 if (parsed.DVDTitle == 0)\r
176                     lbl_title.Text = "Auto";\r
177                 else\r
178                     lbl_title.Text = parsed.DVDTitle.ToString();\r
179 \r
180                 string chatpers = "";\r
181                 if (parsed.DVDChapterStart == 0)\r
182                 {\r
183                     lbl_chapt.Text = "Auto";\r
184                 }\r
185                 else\r
186                 {\r
187                     chatpers = parsed.DVDChapterStart.ToString();\r
188                     if (parsed.DVDChapterFinish != 0)\r
189                         chatpers = chatpers + " - " + parsed.DVDChapterFinish;\r
190                     lbl_chapt.Text = parsed.DVDChapterStart + chatpers;\r
191                 }\r
192 \r
193                 lbl_vEnc.Text = parsed.VideoEncoder;\r
194                 lbl_aEnc.Text = parsed.AudioEncoder;\r
195             }\r
196             catch (Exception)\r
197             {\r
198                 // Do Nothing\r
199             }\r
200 \r
201         }\r
202 \r
203         private void updateUIElements()\r
204         {\r
205             try\r
206             {\r
207                 if (this.InvokeRequired)\r
208                 {\r
209                     this.BeginInvoke(new ProgressUpdateHandler(updateUIElements));\r
210                     return;\r
211                 }\r
212                 this.listview_queue.Items.RemoveAt(0);\r
213 \r
214                 progressBar.PerformStep();\r
215                 lbl_progressValue.Text = string.Format("{0} %", progressBar.Value);\r
216                 progressBar.Update();\r
217             }\r
218             catch (Exception exc)\r
219             {\r
220                 MessageBox.Show(exc.ToString());\r
221             }\r
222         }\r
223 \r
224         private void resetQueue()\r
225         {\r
226             try\r
227             {\r
228                 if (this.InvokeRequired)\r
229                 {\r
230                     this.BeginInvoke(new ProgressUpdateHandler(resetQueue));\r
231                     return;\r
232                 }\r
233 \r
234                 if (cancel == true)\r
235                 {\r
236                     lbl_status.Visible = true;\r
237                     lbl_status.Text = "Encode Queue Cancelled!";\r
238                 }\r
239                 else\r
240                 {\r
241                     lbl_status.Visible = true;\r
242                     lbl_status.Text = "Encode Queue Completed!";\r
243                 }\r
244                 btn_cancel.Visible = false;\r
245 \r
246                 lbl_progressValue.Text = "0 %";\r
247                 progressBar.Value = 0;\r
248                 progressBar.Update();\r
249 \r
250                 lbl_source.Text = "-";\r
251                 lbl_dest.Text = "-";\r
252                 lbl_vEnc.Text = "-";\r
253                 lbl_aEnc.Text = "-";\r
254                 lbl_title.Text = "-";\r
255                 lbl_chapt.Text = "-";\r
256             }\r
257             catch (Exception exc)\r
258             {\r
259                 MessageBox.Show(exc.ToString());\r
260             }\r
261         }\r
262 \r
263         #endregion\r
264 \r
265         #region Queue Management\r
266         private void btn_up_Click(object sender, EventArgs e)\r
267         {\r
268             string cache;\r
269             int selIdx;\r
270             if (listview_queue.Items.Count != 0)\r
271             {\r
272                 selIdx = listview_queue.SelectedItems[0].Index;\r
273                 // ignore moveup of row(0)\r
274                 if (selIdx == 0)\r
275                     return;\r
276 \r
277                 // move the subitems for the previous row\r
278                 // to cache to make room for the selected row\r
279                 for (int i = 0; i < listview_queue.Items[selIdx].SubItems.Count; i++)\r
280                 {\r
281                     cache = listview_queue.Items[selIdx - 1].SubItems[i].Text;\r
282                     listview_queue.Items[selIdx - 1].SubItems[i].Text =\r
283                       listview_queue.Items[selIdx].SubItems[i].Text;\r
284                     listview_queue.Items[selIdx].SubItems[i].Text = cache;\r
285                 }\r
286                 listview_queue.Items[selIdx - 1].Selected = true;\r
287                 listview_queue.Refresh();\r
288                 listview_queue.Focus();\r
289             }\r
290         }\r
291 \r
292         private void btn_down_Click(object sender, EventArgs e)\r
293         {\r
294             string cache;\r
295             int selIdx;\r
296             \r
297             if (listview_queue.Items.Count != 0)\r
298             {\r
299                 selIdx = listview_queue.SelectedItems[0].Index;\r
300 \r
301                 // ignore movedown of last item\r
302                 if (selIdx == listview_queue.Items.Count - 1)\r
303                     return;\r
304                 // move the subitems for the next row\r
305                 // to cache so we can move the selected row down\r
306                 for (int i = 0; i < listview_queue.Items[selIdx].SubItems.Count; i++)\r
307                 {\r
308                     cache = listview_queue.Items[selIdx + 1].SubItems[i].Text;\r
309                     listview_queue.Items[selIdx + 1].SubItems[i].Text =\r
310                       listview_queue.Items[selIdx].SubItems[i].Text;\r
311                     listview_queue.Items[selIdx].SubItems[i].Text = cache;\r
312                 }\r
313                 listview_queue.Items[selIdx + 1].Selected = true;\r
314                 listview_queue.Refresh();\r
315             listview_queue.Focus();\r
316             }\r
317         }\r
318 \r
319         private void btn_delete_Click(object sender, EventArgs e)\r
320         {\r
321             for (int i = listview_queue.SelectedItems.Count - 1; i >= 0; i--)\r
322             {\r
323                 ListViewItem item = listview_queue.SelectedItems[i];\r
324                 listview_queue.Items.Remove(item);\r
325             }\r
326         }\r
327         #endregion\r
328 \r
329         #region Modify Queue\r
330 \r
331         int listCount = 0;\r
332         private void listview_queue_SelectedIndexChanged(object sender, EventArgs e)\r
333         {\r
334             modQ();\r
335             listCount = listview_queue.Items.Count;\r
336         }\r
337 \r
338         private void modQ()\r
339         {\r
340             try\r
341             {\r
342                 if (this.InvokeRequired)\r
343                 {\r
344                     this.BeginInvoke(new modifyQueue(modQ));\r
345                 }\r
346 \r
347                 string query = null;\r
348                 ListView.SelectedListViewItemCollection name = null;\r
349                 name = listview_queue.SelectedItems;\r
350 \r
351                 if (listview_queue.SelectedItems.Count != 0)\r
352                     query = name[0].SubItems[0].Text;\r
353 \r
354                 txt_editQuery.Text = query;\r
355 \r
356             }\r
357             catch (Exception)\r
358             {\r
359             }\r
360         }\r
361 \r
362         private void btn_update_Click(object sender, EventArgs e)\r
363         {\r
364             try\r
365             {\r
366                 if (txt_editQuery.Text != "")\r
367                 {\r
368                     if (listview_queue.Items.Count != listCount)\r
369                     {\r
370                         MessageBox.Show("Unable to modify the selected item. The number of items on the list has changed.  \nPlease avoid modifying an item when a new encode is about to start!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
371                     }\r
372                     else\r
373                     {\r
374                         if (listview_queue.SelectedItems != null)\r
375                         {\r
376                             int selectItm = listview_queue.SelectedIndices[0];\r
377                             listview_queue.Items[selectItm].Text = txt_editQuery.Text;\r
378                         }\r
379                     }\r
380                 }\r
381             }\r
382             catch (Exception exc)\r
383             {\r
384                 MessageBox.Show(exc.ToString());\r
385             }\r
386         }\r
387 \r
388         #endregion\r
389 \r
390         protected override void OnClosing(CancelEventArgs e)\r
391         {\r
392             e.Cancel = true;\r
393             this.Hide();\r
394             base.OnClosing(e);\r
395         }\r
396 \r
397         private void btn_Close_Click(object sender, EventArgs e)\r
398         {\r
399             this.Hide();\r
400         }\r
401 \r
402     }\r
403 }