OSDN Git Service

0fa625f969e4b8272e2c4cfaf92ae68f2f37831e
[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                     {\r
296                     }\r
297           \r
298                 }\r
299             }\r
300         }\r
301 \r
302         private void list_queue_SelectedIndexChanged(object sender, EventArgs e)\r
303         {\r
304             if (list_queue.SelectedItem != null)\r
305                 text_edit.Text = list_queue.SelectedItem.ToString();\r
306 \r
307             listCount = list_queue.Items.Count;\r
308         }\r
309 \r
310         #endregion\r
311 \r
312         #region Queue Save & Batch Script\r
313         private void btn_save_Click(object sender, EventArgs e)\r
314         {\r
315 \r
316         }\r
317 \r
318         private void btn_open_Click(object sender, EventArgs e)\r
319         {\r
320 \r
321         }\r
322 \r
323         private void btn_batch_Click(object sender, EventArgs e)\r
324         {\r
325             string queries = "";\r
326             for (int i = 0; i < list_queue.Items.Count; i++)\r
327             {\r
328                 string query = list_queue.Items[i].ToString();\r
329                 string fullQuery = '"' + Application.StartupPath.ToString()+ "\\HandBrakeCLI.exe"+ '"' + query;\r
330 \r
331                 if (queries == "")\r
332                     queries = queries + fullQuery;\r
333                 else\r
334                     queries = queries + " && " + fullQuery;\r
335             }\r
336             string strCmdLine = queries;\r
337 \r
338             SaveFile.ShowDialog();\r
339             string filename = SaveFile.FileName;\r
340 \r
341             if (filename != "")\r
342             {\r
343                 try\r
344                 {\r
345                     // Create a StreamWriter and open the file\r
346                     StreamWriter line = new StreamWriter(filename);\r
347 \r
348                     // Write the batch file query to the file\r
349                     line.WriteLine(strCmdLine);\r
350 \r
351                     // close the stream\r
352                     line.Close();\r
353 \r
354                     MessageBox.Show("Your batch script has been sucessfully saved.", "Status", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
355                 }\r
356                 catch (Exception)\r
357                 {\r
358                     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
359                 }\r
360 \r
361             }\r
362         }\r
363 \r
364         #endregion\r
365 \r
366         #region other\r
367         private void btn_Close_Click(object sender, EventArgs e)\r
368         {\r
369             this.Hide();\r
370         }\r
371 \r
372         protected override void OnClosing(CancelEventArgs e)\r
373         {\r
374             e.Cancel = true;\r
375             this.Hide();\r
376             base.OnClosing(e);\r
377         }\r
378         #endregion\r
379     }\r
380 }