OSDN Git Service

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