OSDN Git Service

4faff3936292babc2b16d134e963650fc6366dd8
[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 using System.IO;\r
12 \r
13 namespace Handbrake\r
14 {\r
15     public partial class frmQueue : Form\r
16     {\r
17         private delegate void ProgressUpdateHandler();\r
18         private delegate void setEncoding();\r
19 \r
20         public frmQueue()\r
21         {\r
22             InitializeComponent();\r
23         }\r
24 \r
25         #region Queue Handling\r
26         Boolean cancel = false;\r
27 \r
28         private void btn_encode_Click(object sender, EventArgs e)\r
29         {\r
30             // Reset some values\r
31 \r
32             lbl_status.Visible = false;\r
33             cancel = false;\r
34 \r
35             // Start the encode\r
36             try\r
37             {\r
38                 if (list_queue.Items.Count != 0)\r
39                 {\r
40                     // Setup or reset some values\r
41                     btn_stop.Visible = true;\r
42                     progressBar.Value = 0;\r
43                     lbl_progressValue.Text = "0 %";\r
44                     progressBar.Step = 100 / list_queue.Items.Count;\r
45                     progressBar.Update();\r
46                     //ThreadPool.QueueUserWorkItem(startProc);\r
47                     // Testing a new way of launching a thread. Hopefully will fix a random freeze up of the main thread.\r
48                     Thread theQ = new Thread(startProc);\r
49                     theQ.Start();\r
50                 }\r
51             }\r
52             catch (Exception exc)\r
53             {\r
54                 MessageBox.Show(exc.ToString());\r
55             }\r
56         }\r
57 \r
58         private void btn_stop_Click(object sender, EventArgs e)\r
59         {\r
60             cancel = true;\r
61             btn_stop.Visible = false;\r
62             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
63         }\r
64 \r
65         [DllImport("user32.dll")]\r
66         public static extern void LockWorkStation();\r
67         [DllImport("user32.dll")]\r
68         public static extern int ExitWindowsEx(int uFlags, int dwReason);\r
69 \r
70         private void startProc(object state)\r
71         {\r
72             try\r
73             {\r
74                 while (list_queue.Items.Count != 0)\r
75                 {\r
76                     string query = list_queue.Items[0].ToString();\r
77                     setEncValue();\r
78                     updateUIElements();\r
79                    \r
80                     Functions.CLI process = new Functions.CLI();\r
81                     Process hbProc = process.runCli(this, query, false, false, false, false);\r
82 \r
83                     hbProc.WaitForExit();\r
84                     hbProc.Close();\r
85                     hbProc.Dispose();\r
86 \r
87                     query = "";\r
88 \r
89                     if (cancel == true)\r
90                     {\r
91                         break;\r
92                     }\r
93                     \r
94                 }\r
95 \r
96                 resetQueue();\r
97                 \r
98                 // Do something whent he encode ends.\r
99                 switch (Properties.Settings.Default.CompletionOption)\r
100                 {\r
101                     case "Shutdown":\r
102                         System.Diagnostics.Process.Start("Shutdown", "-s -t 60");\r
103                         break;\r
104                     case "Log Off":\r
105                         ExitWindowsEx(0, 0);\r
106                         break;\r
107                     case "Suspend":\r
108                         Application.SetSuspendState(PowerState.Suspend, true, true);\r
109                         break;\r
110                     case "Hibernate":\r
111                         Application.SetSuspendState(PowerState.Hibernate, true, true);\r
112                         break;\r
113                     case "Lock System":\r
114                         LockWorkStation();\r
115                         break;\r
116                     case "Quit HandBrake":\r
117                         Application.Exit();\r
118                         break;\r
119                     default:\r
120                         break;\r
121                 }\r
122             }\r
123             catch (Exception exc)\r
124             {\r
125                 MessageBox.Show(exc.ToString());\r
126             }\r
127         }\r
128 \r
129         private void updateUIElements()\r
130         {\r
131             try\r
132             {\r
133                 if (this.InvokeRequired)\r
134                 {\r
135                     this.BeginInvoke(new ProgressUpdateHandler(updateUIElements));\r
136                     return;\r
137                 }\r
138                 this.list_queue.Items.RemoveAt(0);\r
139 \r
140                 progressBar.PerformStep();\r
141                 lbl_progressValue.Text = string.Format("{0} %", progressBar.Value);\r
142                 progressBar.Update();\r
143             }\r
144             catch (Exception exc)\r
145             {\r
146                 MessageBox.Show(exc.ToString());\r
147             }\r
148         }\r
149 \r
150         private void resetQueue()\r
151         {\r
152             try\r
153             {\r
154                 if (this.InvokeRequired)\r
155                 {\r
156                     this.BeginInvoke(new ProgressUpdateHandler(resetQueue));\r
157                     return;\r
158                 }\r
159 \r
160                 if (cancel == true)\r
161                 {\r
162                     lbl_status.Visible = true;\r
163                     lbl_status.Text = "Encode Queue Cancelled!";\r
164                     text_edit.Text = "";\r
165                 }\r
166                 else\r
167                 {\r
168                     lbl_status.Visible = true;\r
169                     lbl_status.Text = "Encode Queue Completed!";\r
170                     text_edit.Text = "";\r
171                 }\r
172                 btn_stop.Visible = false;\r
173 \r
174                 lbl_progressValue.Text = "0 %";\r
175                 progressBar.Value = 0;\r
176                 progressBar.Update();\r
177 \r
178                 lbl_source.Text = "-";\r
179                 lbl_dest.Text = "-";\r
180                 lbl_vEnc.Text = "-";\r
181                 lbl_aEnc.Text = "-";\r
182                 lbl_title.Text = "-";\r
183                 lbl_chapt.Text = "-";\r
184             }\r
185             catch (Exception exc)\r
186             {\r
187                 MessageBox.Show(exc.ToString());\r
188             }\r
189         }\r
190         \r
191         private void setEncValue()\r
192         {\r
193             try\r
194             {\r
195                 if (this.InvokeRequired)\r
196                 {\r
197                     this.BeginInvoke(new setEncoding(setEncValue));\r
198                 }\r
199 \r
200                 string query = query = list_queue.Items[0].ToString();\r
201 \r
202                 // found query is a global varible\r
203                 Functions.QueryParser parsed = Functions.QueryParser.Parse(query);\r
204                 lbl_source.Text = parsed.Source;\r
205                 lbl_dest.Text = parsed.Destination;\r
206 \r
207 \r
208                 if (parsed.DVDTitle == 0)\r
209                     lbl_title.Text = "Auto";\r
210                 else\r
211                     lbl_title.Text = parsed.DVDTitle.ToString();\r
212 \r
213                 string chapters = "";\r
214                 if (parsed.DVDChapterStart == 0)\r
215                 {\r
216                     lbl_chapt.Text = "Auto";\r
217                 }\r
218                 else\r
219                 {\r
220                     chapters = parsed.DVDChapterStart.ToString();\r
221                     if (parsed.DVDChapterFinish != 0)\r
222                         chapters = chapters + " - " + parsed.DVDChapterFinish;\r
223                     lbl_chapt.Text = chapters;\r
224                 }\r
225 \r
226                 lbl_vEnc.Text = parsed.VideoEncoder;\r
227                 lbl_aEnc.Text = parsed.AudioEncoder;\r
228             }\r
229             catch (Exception)\r
230             {\r
231                 // Do Nothing\r
232             }\r
233         }\r
234 \r
235         #endregion\r
236 \r
237         #region Queue Management\r
238 \r
239         private void btn_up_Click(object sender, EventArgs e)\r
240         {\r
241             int count = list_queue.Items.Count;\r
242             int itemToMove = list_queue.SelectedIndex;\r
243             int previousItemint = 0;\r
244             String previousItem = "";\r
245 \r
246             if (itemToMove > 0)\r
247             {\r
248                 previousItemint = itemToMove - 1;\r
249                 previousItem = list_queue.Items[previousItemint].ToString();\r
250                 list_queue.Items[previousItemint] = list_queue.Items[itemToMove];\r
251                 list_queue.Items[itemToMove] = previousItem;\r
252                 list_queue.SelectedIndex = list_queue.SelectedIndex - 1;\r
253             }\r
254         }\r
255 \r
256         private void btn_down_Click(object sender, EventArgs e)\r
257         {\r
258             int count = list_queue.Items.Count;\r
259             int itemToMove = list_queue.SelectedIndex;\r
260             int itemAfterInt = 0;\r
261             String itemAfter = "";\r
262 \r
263             if (itemToMove < (count - 1))\r
264             {\r
265                 itemAfterInt = itemToMove + 1;\r
266                 itemAfter = list_queue.Items[itemAfterInt].ToString();\r
267                 list_queue.Items[itemAfterInt] = list_queue.Items[itemToMove];\r
268                 list_queue.Items[itemToMove] = itemAfter;\r
269                 list_queue.SelectedIndex = list_queue.SelectedIndex + 1;\r
270             }\r
271         }\r
272 \r
273         private void btn_delete_Click(object sender, EventArgs e)\r
274         {\r
275             list_queue.Items.Remove(list_queue.SelectedItem);\r
276         }\r
277 \r
278         #endregion\r
279 \r
280         #region Queue Item Modification\r
281 \r
282         int listCount = 0;\r
283 \r
284         private void btn_updateQuery_Click(object sender, EventArgs e)\r
285         {\r
286             if (text_edit.Text != "")\r
287             {\r
288                 if (list_queue.Items.Count != listCount)\r
289                 {\r
290                     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
291                 }\r
292                 else\r
293                 {\r
294                     if (list_queue.SelectedItem != null)\r
295                         list_queue.Items[list_queue.SelectedIndex] = text_edit.Text;\r
296           \r
297                 }\r
298             }\r
299         }\r
300 \r
301         private void list_queue_SelectedIndexChanged(object sender, EventArgs e)\r
302         {\r
303             if (list_queue.SelectedItem != null)\r
304                 text_edit.Text = list_queue.SelectedItem.ToString();\r
305 \r
306             listCount = list_queue.Items.Count;\r
307         }\r
308 \r
309         #endregion\r
310 \r
311         #region Queue Save & Batch Script\r
312         private void btn_batch_Click(object sender, EventArgs e)\r
313         {\r
314             string queries = "";\r
315             for (int i = 0; i < list_queue.Items.Count; i++)\r
316             {\r
317                 string query = list_queue.Items[i].ToString();\r
318                 string fullQuery = '"' + Application.StartupPath.ToString()+ "\\HandBrakeCLI.exe"+ '"' + query;\r
319 \r
320                 if (queries == "")\r
321                     queries = queries + fullQuery;\r
322                 else\r
323                     queries = queries + " && " + fullQuery;\r
324             }\r
325             string strCmdLine = queries;\r
326 \r
327             SaveFile.ShowDialog();\r
328             string filename = SaveFile.FileName;\r
329 \r
330             if (filename != "")\r
331             {\r
332                 try\r
333                 {\r
334                     // Create a StreamWriter and open the file\r
335                     StreamWriter line = new StreamWriter(filename);\r
336 \r
337                     // Write the batch file query to the file\r
338                     line.WriteLine(strCmdLine);\r
339 \r
340                     // close the stream\r
341                     line.Close();\r
342 \r
343                     MessageBox.Show("Your batch script has been sucessfully saved.", "Status", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
344                 }\r
345                 catch (Exception)\r
346                 {\r
347                     MessageBox.Show("Unable to write to the file. Please make sure that the location has the correct permissions for file writing.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
348                 }\r
349 \r
350             }\r
351         }\r
352 \r
353         #endregion\r
354 \r
355         #region other\r
356         private void btn_Close_Click(object sender, EventArgs e)\r
357         {\r
358             this.Hide();\r
359         }\r
360 \r
361         protected override void OnClosing(CancelEventArgs e)\r
362         {\r
363             e.Cancel = true;\r
364             this.Hide();\r
365             base.OnClosing(e);\r
366         }\r
367         #endregion\r
368     }\r
369 }