OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmMain.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Collections.Specialized;\r
4 using System.ComponentModel;\r
5 using System.Data;\r
6 using System.Drawing;\r
7 using System.Text;\r
8 using System.Windows.Forms;\r
9 using System.Net;\r
10 using System.IO;\r
11 using System.Diagnostics;\r
12 using System.Threading;\r
13 using System.Runtime.InteropServices;\r
14 using System.Globalization;\r
15 using System.Text.RegularExpressions;\r
16 \r
17 \r
18 namespace Handbrake\r
19 {\r
20     public partial class frmMain : Form\r
21     {\r
22         // -------------------------------------------------------------- \r
23         // Applicaiton Startup Stuff\r
24         // --------------------------------------------------------------\r
25 \r
26         #region Application Startup\r
27 \r
28         // Some stuff that needs to be Initialized. \r
29         private Process hbProc;\r
30         private Parsing.DVD thisDVD;\r
31         private frmQueue queueWindow = new frmQueue();\r
32 \r
33         // The main window beings here...\r
34         public frmMain()\r
35         {\r
36             // Load the splash screen in this thread\r
37             Form splash = new frmSplashScreen();\r
38             splash.Show();\r
39 \r
40             //Create a label that can be updated from the parent thread.\r
41             Label lblStatus = new Label();\r
42 \r
43             //Size the label\r
44             lblStatus.Size = new Size(250, 20);\r
45 \r
46             //Position the label\r
47             lblStatus.Location = new Point(10, 280);\r
48 \r
49             //Put the label on the splash form\r
50             splash.Controls.Add(lblStatus);\r
51 \r
52             //Fire a thread to wait for 2 seconds.  The splash screen will exit when the time expires\r
53             Thread timer = new Thread(splashTimer);\r
54             timer.Start();\r
55 \r
56             InitializeComponent();\r
57 \r
58             // show the form, but leave disabled until preloading is complete\r
59             this.Enabled = false;\r
60 \r
61             // Show the main form\r
62             this.Show();\r
63 \r
64             // Forces frmMain to draw\r
65             Application.DoEvents();\r
66 \r
67             // Set the Version number lable to the corect version.\r
68             Version.Text = "Version " + Properties.Settings.Default.CliVersion;\r
69 \r
70             // update the status\r
71             if (Properties.Settings.Default.updateStatus == "Checked")\r
72             {\r
73                 lblStatus.Text = "Checking for updates ...";\r
74                 // redraw the splash screen\r
75                 Application.DoEvents();\r
76                 // Run the update checker.\r
77                 Thread updateCheckThread = new Thread(startupUpdateCheck);\r
78                 updateCheckThread.Start();\r
79                 Thread.Sleep(100);\r
80             }\r
81 \r
82             // Update the presets\r
83             if (Properties.Settings.Default.updatePresets == "Checked")\r
84             {\r
85                 lblStatus.Text = "Updaing Presets ...";\r
86                 Application.DoEvents();\r
87                 grabCLIPresets();\r
88                 Thread.Sleep(200);\r
89             }\r
90 \r
91             // Load the presets for the preset box\r
92             updatePresets();\r
93 \r
94             // Now load the users default if required. (Will overide the above setting)\r
95             if (Properties.Settings.Default.defaultSettings == "Checked")\r
96             {\r
97                 lblStatus.Text = "Loading User Default Settings...";\r
98                 Application.DoEvents();\r
99                 loadUserDefaults();\r
100                 Thread.Sleep(100);\r
101             }\r
102             else\r
103             {\r
104                 loadNormalPreset();\r
105             }\r
106 \r
107             // Enable or disable tooltips\r
108             if (Properties.Settings.Default.tooltipEnable == "Checked")\r
109             {\r
110                 lblStatus.Text = "Loading Tooltips ...";\r
111                 Application.DoEvents();\r
112                 ToolTip.Active = true;\r
113                 Thread.Sleep(100);\r
114             }\r
115 \r
116             // Make sure a default cropping option is selected. Not sure why this is not defaulting like the other checkdowns,\r
117             // Can fix it later.\r
118             drp_crop.SelectedItem = "Automatic";\r
119 \r
120             //Finished Loading\r
121             lblStatus.Text = "Loading Complete!";\r
122             Application.DoEvents();\r
123             Thread.Sleep(200);\r
124 \r
125             // Wait until splash screen is done\r
126             while (timer.IsAlive)\r
127             { Thread.Sleep(100); }\r
128 \r
129             //Close the splash screen\r
130             splash.Close();\r
131             splash.Dispose();\r
132 \r
133             // Turn the interface back to the user\r
134             this.Enabled = true;\r
135         }\r
136 \r
137         private delegate void updateStatusChanger();\r
138         private void startupUpdateCheck()\r
139         {\r
140             try\r
141             {\r
142                 if (this.InvokeRequired)\r
143                 {\r
144                     this.BeginInvoke(new updateStatusChanger(startupUpdateCheck));\r
145                     return;\r
146                 }\r
147 \r
148                 Boolean update = updateCheck();\r
149                 if (update == true)\r
150                 {\r
151                     lbl_update.Visible = true;\r
152 \r
153                     frmUpdater updateWindow = new frmUpdater();\r
154                     updateWindow.Show();\r
155                 }\r
156             }\r
157             catch (Exception exc)\r
158             {\r
159                 MessageBox.Show(exc.ToString());\r
160             }\r
161         }\r
162 \r
163         private void splashTimer(object sender)\r
164         {\r
165             Thread.Sleep(1000);  //sit for 1 seconds then exit\r
166         }\r
167 \r
168         private void showSplash(object sender)\r
169         {\r
170             // Display splash screen for 1.5 Seconds\r
171             Form splash = new frmSplashScreen();\r
172             splash.Show();\r
173             Thread.Sleep(1500);\r
174             splash.Close(); // Then close.\r
175         }\r
176 \r
177         private void loadUserDefaults()\r
178         {\r
179             string userDefaults = Properties.Settings.Default.defaultUserSettings;\r
180             try\r
181             {\r
182                 // Some things that need to be done to reset some gui components:\r
183                 CheckPixelRatio.CheckState = CheckState.Unchecked;\r
184 \r
185                 // Send the query from the file to the Query Parser class\r
186                 Functions.QueryParser presetQuery = Functions.QueryParser.Parse(userDefaults);\r
187 \r
188                 // Now load the preset\r
189                 presetLoader(presetQuery, "User Defaults ");\r
190             }\r
191             catch (Exception exc)\r
192             {\r
193                 MessageBox.Show("Unable to load user Default Settings. \n\n" + exc.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
194             }\r
195         }\r
196 \r
197         #endregion\r
198 \r
199         // -------------------------------------------------------------- \r
200         // The main Menu bar.\r
201         // -------------------------------------------------------------- \r
202 \r
203         #region File Menu\r
204         private void mnu_open_Click(object sender, EventArgs e)\r
205         {\r
206             string filename;\r
207             File_Open.ShowDialog();\r
208             filename = File_Open.FileName;\r
209 \r
210             if (filename != "")\r
211             {\r
212                 try\r
213                 {\r
214                     // Some things that need to be done to reset some gui components:\r
215                     CheckPixelRatio.CheckState = CheckState.Unchecked;\r
216 \r
217                     //---------------------------\r
218                     // Get the Preset\r
219                     // ---------------------------\r
220 \r
221                     // Create StreamReader & open file\r
222                     StreamReader line = new StreamReader(filename);\r
223 \r
224                     // Send the query from the file to the Query Parser class\r
225                     Functions.QueryParser presetQuery = Functions.QueryParser.Parse(line.ReadLine());\r
226 \r
227                     // Now load the preset\r
228                     presetLoader(presetQuery, filename);\r
229 \r
230                     // Close the stream\r
231                     line.Close();\r
232                 }\r
233                 catch (Exception exc)\r
234                 {\r
235                     MessageBox.Show("Unable to load profile.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
236                     MessageBox.Show(exc.ToString());\r
237                 }\r
238             }\r
239         }\r
240 \r
241         private void mnu_save_Click(object sender, EventArgs e)\r
242         {\r
243             string filename;\r
244             File_Save.ShowDialog();\r
245             filename = File_Save.FileName;\r
246             if (filename != "")\r
247             {\r
248                 try\r
249                 {\r
250                     // Create a StreamWriter and open the file\r
251                     StreamWriter line = new StreamWriter(filename);\r
252 \r
253                     // Generate and write the query string to the file\r
254                     String query = GenerateTheQuery();\r
255                     line.WriteLine(query);\r
256 \r
257                     // close the stream\r
258                     line.Close();\r
259                     MessageBox.Show("Your profile has been sucessfully saved.", "Status", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
260                 }\r
261                 catch (Exception)\r
262                 {\r
263                     MessageBox.Show("Unable to write to the file. Please make sure the location has the correct permissions for file writing.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
264                 }\r
265 \r
266             }\r
267         }\r
268 \r
269         private void mnu_exit_Click(object sender, EventArgs e)\r
270         {\r
271             Application.Exit();\r
272         }\r
273 \r
274         #endregion\r
275 \r
276         #region Tools Menu\r
277 \r
278         private void mnu_encode_Click(object sender, EventArgs e)\r
279         {\r
280             showQueue();\r
281         }\r
282 \r
283         private void mnu_viewDVDdata_Click(object sender, EventArgs e)\r
284         {\r
285             frmDvdInfo dvdInfoWindow = new frmDvdInfo();\r
286             dvdInfoWindow.Show();\r
287         }\r
288 \r
289         private void mnu_options_Click(object sender, EventArgs e)\r
290         {\r
291             Form Options = new frmOptions();\r
292             Options.ShowDialog();\r
293         }\r
294 \r
295         private void mnu_showCommand_Click(object sender, EventArgs e)\r
296         {\r
297 \r
298             Form query = new frmQuery(GenerateTheQuery());\r
299             query.ShowDialog();\r
300         }\r
301 \r
302         #endregion\r
303 \r
304         #region Presets Menu\r
305         Boolean presetStatus;\r
306 \r
307         private void mnu_presetReset_Click(object sender, EventArgs e)\r
308         {\r
309             treeView_presets.Nodes.Clear();\r
310             grabCLIPresets();\r
311             updatePresets();\r
312             MessageBox.Show("Presets have been updated", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
313         }\r
314 \r
315         private void mnu_SelectDefault_Click(object sender, EventArgs e)\r
316         {\r
317             loadNormalPreset();\r
318         }\r
319 \r
320         #endregion\r
321 \r
322         #region Help Menu\r
323 \r
324         private void mnu_wiki_Click(object sender, EventArgs e)\r
325         {\r
326             Process.Start("http://handbrake.m0k.org/trac");\r
327         }\r
328 \r
329         private void mnu_faq_Click(object sender, EventArgs e)\r
330         {\r
331             Process.Start("http://handbrake.m0k.org/trac/wiki/WindowsGuiFaq");\r
332         }\r
333 \r
334         private void mnu_onlineDocs_Click(object sender, EventArgs e)\r
335         {\r
336             Process.Start("http://handbrake.m0k.org/?page_id=11");\r
337         }\r
338 \r
339         private void mnu_homepage_Click(object sender, EventArgs e)\r
340         {\r
341             Process.Start("http://handbrake.m0k.org");\r
342         }\r
343 \r
344         private void mnu_forum_Click(object sender, EventArgs e)\r
345         {\r
346             Process.Start("http://handbrake.m0k.org/forum");\r
347         }\r
348 \r
349         private void mnu_UpdateCheck_Click(object sender, EventArgs e)\r
350         {\r
351             Boolean update = updateCheck();\r
352             if (update == true)\r
353             {\r
354                 lbl_update.Visible = true;\r
355                 frmUpdater updateWindow = new frmUpdater();\r
356                 updateWindow.Show();\r
357             }\r
358             else\r
359             {\r
360                 MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
361             }\r
362         }\r
363 \r
364         private void mnu_about_Click(object sender, EventArgs e)\r
365         {\r
366             Form About = new frmAbout();\r
367             About.ShowDialog();\r
368         }\r
369 \r
370         #endregion\r
371 \r
372         // -------------------------------------------------------------- \r
373         // Buttons on the main Window and items that require actions\r
374         // --------------------------------------------------------------\r
375 \r
376         #region Buttons\r
377 \r
378         private void btn_Browse_Click(object sender, EventArgs e)\r
379         {\r
380             String filename = "";\r
381             text_source.Text = "";\r
382             frmDvdInfo dvdInfoWindow = new frmDvdInfo();\r
383 \r
384             if (RadioDVD.Checked)\r
385             {\r
386                 DVD_Open.ShowDialog();\r
387                 filename = DVD_Open.SelectedPath;\r
388             }\r
389             else\r
390             {\r
391                 ISO_Open.ShowDialog();\r
392                 filename = ISO_Open.FileName;\r
393             }\r
394 \r
395             if (filename != "")\r
396             {\r
397                 Form frmRD = new frmReadDVD(filename, this, dvdInfoWindow);\r
398                 text_source.Text = filename;\r
399                 frmRD.ShowDialog();\r
400             }\r
401             else\r
402                 text_source.Text = "Click 'Browse' to continue";\r
403 \r
404             // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.\r
405             if (drp_dvdtitle.Items.Count == 0)\r
406             {\r
407                 MessageBox.Show("No Title(s) found. Please make sure you have selected a valid, non-copy protected source. Please refer to the FAQ (see Help Menu).", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
408             }\r
409         }\r
410 \r
411         private void btn_destBrowse_Click(object sender, EventArgs e)\r
412         {\r
413             // This removes the file extension from the filename box on the save file dialog.\r
414             // It's daft but some users don't realise that typing an extension overrides the dropdown extension selected.\r
415             // Should be a nicer way to do this.\r
416             DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", "").Replace(".m4v", "").Replace(".mkv", "").Replace(".ogm", "").Replace(".avi", "");\r
417 \r
418             // Show the dialog and set the main form file path\r
419             DVD_Save.ShowDialog();\r
420             text_destination.Text = DVD_Save.FileName;\r
421 \r
422             // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)\r
423             if (Check_ChapterMarkers.Checked)\r
424             {\r
425                 string destination = text_destination.Text;\r
426                 destination = destination.Replace(".mp4", ".m4v");\r
427                 text_destination.Text = destination;\r
428             }\r
429         }\r
430 \r
431         private void btn_h264Clear_Click(object sender, EventArgs e)\r
432         {\r
433             rtf_h264advanced.Text = "";\r
434         }\r
435 \r
436         #endregion\r
437 \r
438         #region frmMain Actions\r
439 \r
440         private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)\r
441         {\r
442             // Reset some values on the form\r
443             lbl_Aspect.Text = "Select a Title";\r
444             lbl_RecomendedCrop.Text = "Select a Title";\r
445             drop_chapterStart.Items.Clear();\r
446             drop_chapterFinish.Items.Clear();\r
447 \r
448             // If the dropdown is set to automatic nothing else needs to be done.\r
449             // Otheriwse if its not, title data has to be loased from parsing.\r
450             if (drp_dvdtitle.Text != "Automatic")\r
451             {\r
452                 Parsing.Title selectedTitle = drp_dvdtitle.SelectedItem as Parsing.Title;\r
453 \r
454                 // Set the Aspect Ratio\r
455                 lbl_Aspect.Text = selectedTitle.AspectRatio.ToString();\r
456 \r
457                 // Set the Recommended Cropping values\r
458                 lbl_RecomendedCrop.Text = string.Format("{0}/{1}/{2}/{3}", selectedTitle.AutoCropDimensions[0], selectedTitle.AutoCropDimensions[1], selectedTitle.AutoCropDimensions[2], selectedTitle.AutoCropDimensions[3]);\r
459 \r
460                 // Populate the Start chapter Dropdown\r
461                 drop_chapterStart.Items.Clear();\r
462                 drop_chapterStart.Items.AddRange(selectedTitle.Chapters.ToArray());\r
463                 if (drop_chapterStart.Items.Count > 0)\r
464                 {\r
465                     drop_chapterStart.Text = drop_chapterStart.Items[0].ToString();\r
466                 }\r
467 \r
468                 // Populate the Final Chapter Dropdown\r
469                 drop_chapterFinish.Items.Clear();\r
470                 drop_chapterFinish.Items.AddRange(selectedTitle.Chapters.ToArray());\r
471                 if (drop_chapterFinish.Items.Count > 0)\r
472                 {\r
473                     drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();\r
474                 }\r
475 \r
476                 // Populate the Audio Channels Dropdown\r
477                 drp_track1Audio.Items.Clear();\r
478                 drp_track1Audio.Items.Add("Automatic");\r
479                 drp_track1Audio.Items.Add("None");\r
480                 drp_track1Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());\r
481                 if (drp_track1Audio.Items.Count > 0)\r
482                 {\r
483                     drp_track1Audio.Text = drp_track1Audio.Items[0].ToString();\r
484                 }\r
485                 drp_track2Audio.Items.Clear();\r
486                 drp_track2Audio.Items.Add("None");\r
487                 drp_track2Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());\r
488                 if (drp_track2Audio.Items.Count > 0)\r
489                 {\r
490                     drp_track2Audio.Text = drp_track2Audio.Items[0].ToString();\r
491                 }\r
492 \r
493 \r
494                 // Populate the Subtitles dropdown\r
495                 drp_subtitle.Items.Clear();\r
496                 drp_subtitle.Items.Add("None");\r
497                 drp_subtitle.Items.Add("Autoselect");\r
498                 drp_subtitle.Items.AddRange(selectedTitle.Subtitles.ToArray());\r
499                 if (drp_subtitle.Items.Count > 0)\r
500                 {\r
501                     drp_subtitle.Text = drp_subtitle.Items[0].ToString();\r
502                 }\r
503             }\r
504 \r
505             // Run the Autonaming function\r
506             autoName();\r
507             chapterNaming();\r
508         }\r
509 \r
510         private void drop_chapterStart_SelectedIndexChanged(object sender, EventArgs e)\r
511         {\r
512             drop_chapterStart.BackColor = Color.White;\r
513             if ((drop_chapterFinish.Text != "Auto") && (drop_chapterStart.Text != "Auto"))\r
514             {\r
515                 try\r
516                 {\r
517                     int chapterFinish = int.Parse(drop_chapterFinish.Text);\r
518                     int chapterStart = int.Parse(drop_chapterStart.Text);\r
519 \r
520                     if (chapterFinish < chapterStart)\r
521                     {\r
522                         drop_chapterStart.BackColor = Color.LightCoral;\r
523                     }\r
524                 }\r
525                 catch (Exception)\r
526                 {\r
527                     drop_chapterStart.BackColor = Color.LightCoral;\r
528                 }\r
529             }\r
530             // Run the Autonaming function\r
531             autoName();\r
532             chapterNaming();\r
533 \r
534         }\r
535 \r
536         private void drop_chapterFinish_SelectedIndexChanged(object sender, EventArgs e)\r
537         {\r
538             drop_chapterFinish.BackColor = Color.White;\r
539             if ((drop_chapterFinish.Text != "Auto") && (drop_chapterStart.Text != "Auto"))\r
540             {\r
541                 try\r
542                 {\r
543                     int chapterFinish = int.Parse(drop_chapterFinish.Text);\r
544                     int chapterStart = int.Parse(drop_chapterStart.Text);\r
545 \r
546                     if (chapterFinish < chapterStart)\r
547                     {\r
548                         drop_chapterFinish.BackColor = Color.LightCoral;\r
549                     }\r
550                 }\r
551                 catch (Exception)\r
552                 {\r
553                     drop_chapterFinish.BackColor = Color.LightCoral;\r
554                 }\r
555             }\r
556 \r
557             // Run the Autonaming function\r
558             autoName();\r
559             chapterNaming();\r
560         }\r
561 \r
562         private void text_bitrate_TextChanged(object sender, EventArgs e)\r
563         {\r
564             text_filesize.Text = "";\r
565             slider_videoQuality.Value = 0;\r
566             SliderValue.Text = "0%";\r
567         }\r
568 \r
569         private void text_filesize_TextChanged(object sender, EventArgs e)\r
570         {\r
571             text_bitrate.Text = "";\r
572             slider_videoQuality.Value = 0;\r
573             SliderValue.Text = "0%";\r
574         }\r
575 \r
576         private void slider_videoQuality_Scroll(object sender, EventArgs e)\r
577         {\r
578             SliderValue.Text = slider_videoQuality.Value.ToString() + "%";\r
579             text_bitrate.Text = "";\r
580             text_filesize.Text = "";\r
581         }\r
582 \r
583         private void label_h264_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\r
584         {\r
585             Process.Start("http://handbrake.m0k.org/trac/wiki/x264Options");\r
586         }\r
587 \r
588         private void text_width_TextChanged(object sender, EventArgs e)\r
589         {\r
590             try\r
591             {\r
592                 if (CheckPixelRatio.Checked)\r
593                 {\r
594                     text_width.Text = "";\r
595                     text_width.BackColor = Color.LightCoral;\r
596                     CheckPixelRatio.BackColor = Color.LightCoral;\r
597                 }\r
598                 else\r
599                 {\r
600                     if ((int.Parse(text_width.Text) % 16) != 0)\r
601                     {\r
602                         text_width.BackColor = Color.LightCoral;\r
603                     }\r
604                     else\r
605                     {\r
606                         text_width.BackColor = Color.LightGreen;\r
607                     }\r
608                 }\r
609 \r
610                 if (lbl_Aspect.Text != "Select a Title")\r
611                 {\r
612                     double height = int.Parse(text_width.Text) / double.Parse(lbl_Aspect.Text);\r
613                     double mod16 = height % 16;\r
614                     height = height - mod16;\r
615 \r
616                     if (text_width.Text == "")\r
617                     {\r
618                         text_height.Text = "";\r
619                         text_width.BackColor = Color.White;\r
620                     }\r
621                     else\r
622                     {\r
623                         text_height.Text = height.ToString();\r
624                     }\r
625                 }\r
626             }\r
627             catch (Exception)\r
628             {\r
629                 // No need to throw an error here.\r
630                 // Note on non english systems, this will throw an error because of double.Parse(lbl_Aspect.Text); not working.\r
631             }\r
632 \r
633 \r
634         }\r
635 \r
636         private void text_height_TextChanged(object sender, EventArgs e)\r
637         {\r
638             try\r
639             {\r
640                 if (CheckPixelRatio.Checked)\r
641                 {\r
642                     text_height.Text = "";\r
643                     text_height.BackColor = Color.LightCoral;\r
644                     CheckPixelRatio.BackColor = Color.LightCoral;\r
645                 }\r
646                 else\r
647                 {\r
648                     if ((int.Parse(text_height.Text) % 16) != 0)\r
649                     {\r
650                         text_height.BackColor = Color.LightCoral;\r
651                     }\r
652                     else\r
653                     {\r
654                         text_height.BackColor = Color.LightGreen;\r
655                     }\r
656                 }\r
657 \r
658             }\r
659             catch (Exception)\r
660             {\r
661                 // No need to alert the user.\r
662             }\r
663         }\r
664 \r
665         private void drp_crop_SelectedIndexChanged(object sender, EventArgs e)\r
666         {\r
667             if ((string)drp_crop.SelectedItem == "Custom")\r
668             {\r
669                 text_left.Enabled = true;\r
670                 text_right.Enabled = true;\r
671                 text_top.Enabled = true;\r
672                 text_bottom.Enabled = true;\r
673                 text_left.Text = "0";\r
674                 text_right.Text = "0";\r
675                 text_top.Text = "0";\r
676                 text_bottom.Text = "0";\r
677             }\r
678 \r
679             if ((string)drp_crop.SelectedItem == "Automatic")\r
680             {\r
681                 text_left.Enabled = false;\r
682                 text_right.Enabled = false;\r
683                 text_top.Enabled = false;\r
684                 text_bottom.Enabled = false;\r
685 \r
686 \r
687                 if (lbl_RecomendedCrop.Text != "Select a Title")\r
688                 {\r
689                     string[] temp = new string[4];\r
690                     temp = lbl_RecomendedCrop.Text.Split('/');\r
691                     text_left.Text = temp[2];\r
692                     text_right.Text = temp[3];\r
693                     text_top.Text = temp[0];\r
694                     text_bottom.Text = temp[1];\r
695                 }\r
696                 else\r
697                 {\r
698                     text_left.Text = "";\r
699                     text_right.Text = "";\r
700                     text_top.Text = "";\r
701                     text_bottom.Text = "";\r
702                 }\r
703             }\r
704 \r
705             if ((string)drp_crop.SelectedItem == "No Crop")\r
706             {\r
707                 text_left.Enabled = false;\r
708                 text_right.Enabled = false;\r
709                 text_top.Enabled = false;\r
710                 text_bottom.Enabled = false;\r
711                 text_left.Text = "0";\r
712                 text_right.Text = "0";\r
713                 text_top.Text = "0";\r
714                 text_bottom.Text = "0";\r
715 \r
716             }\r
717         }\r
718 \r
719         private void check_vfr_CheckedChanged(object sender, EventArgs e)\r
720         {\r
721             if (check_vfr.CheckState == CheckState.Checked)\r
722             {\r
723                 check_detelecine.Enabled = false;\r
724                 check_detelecine.CheckState = CheckState.Checked;\r
725                 drp_videoFramerate.Enabled = false;\r
726                 drp_videoFramerate.SelectedItem = "29.97";\r
727                 lbl_vfr.Visible = true;\r
728             }\r
729             else\r
730             {\r
731                 check_detelecine.Enabled = true;\r
732                 drp_videoFramerate.Enabled = true;\r
733                 drp_videoFramerate.SelectedItem = "Automatic";\r
734                 lbl_vfr.Visible = false;\r
735             }\r
736         }\r
737 \r
738         private void CheckPixelRatio_CheckedChanged(object sender, EventArgs e)\r
739         {\r
740             text_width.Text = "";\r
741             text_height.Text = "";\r
742             text_width.BackColor = Color.White;\r
743             text_height.BackColor = Color.White;\r
744             CheckPixelRatio.BackColor = TabPage1.BackColor;\r
745 \r
746             if (CheckPixelRatio.Checked)\r
747             {\r
748                 check_lAnamorphic.Enabled = false;\r
749                 check_lAnamorphic.Checked = false;\r
750             }\r
751             else\r
752                 check_lAnamorphic.Enabled = true;\r
753         }\r
754 \r
755         private void check_lAnamorphic_CheckedChanged(object sender, EventArgs e)\r
756         {\r
757             if (check_lAnamorphic.Checked)\r
758             {\r
759                 CheckPixelRatio.Enabled = false;\r
760                 CheckPixelRatio.Checked = false;\r
761             }\r
762             else\r
763                 CheckPixelRatio.Enabled = true;\r
764         }\r
765 \r
766         private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)\r
767         {\r
768             if (check_2PassEncode.CheckState.ToString() == "Checked")\r
769             {\r
770                 if (drp_videoEncoder.Text.Contains("H.264"))\r
771                 {\r
772                     check_turbo.Enabled = true;\r
773                 }\r
774             }\r
775             else\r
776             {\r
777                 check_turbo.Enabled = false;\r
778                 check_turbo.CheckState = CheckState.Unchecked;\r
779             }\r
780         }\r
781 \r
782         private void check_largeFile_CheckedChanged(object sender, EventArgs e)\r
783         {\r
784             if (!text_destination.Text.Contains(".mp4"))\r
785             {\r
786                 lbl_largeMp4Warning.Text = "Warning: Only mp4 files are supported";\r
787                 lbl_largeMp4Warning.ForeColor = Color.Red;\r
788                 check_largeFile.CheckState = CheckState.Unchecked;\r
789             }\r
790             else\r
791             {\r
792                 lbl_largeMp4Warning.Text = "Warning: Breaks iPod, @TV, PS3 compatibility.";\r
793                 lbl_largeMp4Warning.ForeColor = Color.Black;\r
794             }\r
795         }\r
796 \r
797         private void check_iPodAtom_CheckedChanged(object sender, EventArgs e)\r
798         {\r
799             if (!text_destination.Text.Contains(".mp4"))\r
800             {\r
801                 lbl_ipodAtom.Visible = true;\r
802                 check_iPodAtom.CheckState = CheckState.Unchecked;\r
803             }\r
804             else\r
805             {\r
806                 lbl_ipodAtom.Visible = false;\r
807             }\r
808         }\r
809 \r
810         private void check_optimiseMP4_CheckedChanged(object sender, EventArgs e)\r
811         {\r
812             if (!text_destination.Text.Contains(".mp4"))\r
813             {\r
814                 check_optimiseMP4.BackColor = Color.LightCoral;\r
815                 check_optimiseMP4.CheckState = CheckState.Unchecked;\r
816             }\r
817             else\r
818             {\r
819                 check_optimiseMP4.BackColor = Color.Transparent;\r
820             }\r
821         }\r
822 \r
823         private void drp_dvdtitle_Click(object sender, EventArgs e)\r
824         {\r
825             if (drp_dvdtitle.Items.Count == 0)\r
826             {\r
827                 MessageBox.Show("There are no titles to select. Please scan the DVD by clicking the 'browse' button above before trying to select a title.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
828             }\r
829         }\r
830 \r
831         private void drp_audioCodec_SelectedIndexChanged(object sender, EventArgs e)\r
832         {\r
833             if (drp_audioCodec.Text == "AAC")\r
834             {\r
835                 drp_audioMixDown.Items.Clear();\r
836                 drp_audioMixDown.Items.Add("Mono");\r
837                 drp_audioMixDown.Items.Add("Stereo");\r
838                 drp_audioMixDown.Items.Add("Dolby Surround");\r
839                 drp_audioMixDown.Items.Add("Dolby Pro Logic II");\r
840                 drp_audioMixDown.Items.Add("6 Channel Discrete");\r
841 \r
842                 drp_audioBitrate.Items.Clear();\r
843                 drp_audioBitrate.Items.Add("32");\r
844                 drp_audioBitrate.Items.Add("40");\r
845                 drp_audioBitrate.Items.Add("48");\r
846                 drp_audioBitrate.Items.Add("56");\r
847                 drp_audioBitrate.Items.Add("64");\r
848                 drp_audioBitrate.Items.Add("80");\r
849                 drp_audioBitrate.Items.Add("86");\r
850                 drp_audioBitrate.Items.Add("112");\r
851                 drp_audioBitrate.Items.Add("128");\r
852                 drp_audioBitrate.Items.Add("160");\r
853 \r
854             }\r
855             else\r
856             {\r
857                 drp_audioMixDown.Items.Clear();\r
858                 drp_audioMixDown.Items.Add("Stereo");\r
859                 drp_audioMixDown.Items.Add("Dolby Surround");\r
860                 drp_audioMixDown.Items.Add("Dolby Pro Logic II");\r
861 \r
862                 drp_audioBitrate.Items.Clear();\r
863                 drp_audioBitrate.Items.Add("32");\r
864                 drp_audioBitrate.Items.Add("40");\r
865                 drp_audioBitrate.Items.Add("48");\r
866                 drp_audioBitrate.Items.Add("56");\r
867                 drp_audioBitrate.Items.Add("64");\r
868                 drp_audioBitrate.Items.Add("80");\r
869                 drp_audioBitrate.Items.Add("86");\r
870                 drp_audioBitrate.Items.Add("112");\r
871                 drp_audioBitrate.Items.Add("128");\r
872                 drp_audioBitrate.Items.Add("160");\r
873                 drp_audioBitrate.Items.Add("192");\r
874                 drp_audioBitrate.Items.Add("224");\r
875                 drp_audioBitrate.Items.Add("256");\r
876                 drp_audioBitrate.Items.Add("320");\r
877             }\r
878         }\r
879 \r
880         private void drp_audioMixDown_SelectedIndexChanged(object sender, EventArgs e)\r
881         {\r
882             if ((drp_audioCodec.Text == "AAC") && (drp_audioMixDown.Text == "6 Channel Discrete"))\r
883             {\r
884                 drp_audioBitrate.Items.Clear();\r
885                 drp_audioBitrate.Items.Add("32");\r
886                 drp_audioBitrate.Items.Add("40");\r
887                 drp_audioBitrate.Items.Add("48");\r
888                 drp_audioBitrate.Items.Add("56");\r
889                 drp_audioBitrate.Items.Add("64");\r
890                 drp_audioBitrate.Items.Add("80");\r
891                 drp_audioBitrate.Items.Add("86");\r
892                 drp_audioBitrate.Items.Add("112");\r
893                 drp_audioBitrate.Items.Add("128");\r
894                 drp_audioBitrate.Items.Add("160");\r
895                 drp_audioBitrate.Items.Add("192");\r
896                 drp_audioBitrate.Items.Add("224");\r
897                 drp_audioBitrate.Items.Add("256");\r
898                 drp_audioBitrate.Items.Add("320");\r
899                 drp_audioBitrate.Items.Add("384");\r
900             }\r
901         }\r
902 \r
903         private void slider_drc_Scroll(object sender, EventArgs e)\r
904         {\r
905             double value = slider_drc.Value / 10.0;\r
906             value++;\r
907 \r
908             lbl_drc.Text = value.ToString();\r
909         }\r
910 \r
911         private void drp_subtitle_SelectedIndexChanged(object sender, EventArgs e)\r
912         {\r
913             if (drp_subtitle.Text.Contains("None"))\r
914             {\r
915                 check_forced.Enabled = false;\r
916                 check_forced.Checked = false;\r
917             }\r
918             else\r
919                 check_forced.Enabled = true;\r
920         }\r
921 \r
922         private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)\r
923         {\r
924             if (Check_ChapterMarkers.Checked)\r
925             {\r
926                 string destination = text_destination.Text;\r
927                 destination = destination.Replace(".mp4", ".m4v");\r
928                 text_destination.Text = destination;\r
929                 data_chpt.Rows.Clear();\r
930                 data_chpt.Enabled = true;\r
931                 chapterNaming();\r
932             }\r
933             else\r
934             {\r
935                 string destination = text_destination.Text;\r
936                 destination = destination.Replace(".m4v", ".mp4");\r
937                 text_destination.Text = destination;\r
938                 data_chpt.Rows.Clear();\r
939                 data_chpt.Enabled = false;\r
940             }\r
941         }\r
942 \r
943         private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)\r
944         {\r
945             //Turn off some options which are H.264 only when the user selects a non h.264 encoder\r
946             if (!drp_videoEncoder.Text.Contains("H.264"))\r
947             {\r
948                 check_turbo.CheckState = CheckState.Unchecked;\r
949                 check_turbo.Enabled = false;\r
950                 h264Tab.Enabled = false;\r
951                 rtf_h264advanced.Text = "";\r
952                 check_iPodAtom.Enabled = false;\r
953                 check_iPodAtom.Checked = false;\r
954                 lbl_ipodAtom.Visible = false;\r
955                 check_optimiseMP4.Enabled = false;\r
956             }\r
957             else\r
958             {\r
959                 if (check_2PassEncode.CheckState == CheckState.Checked)\r
960                 {\r
961                     check_turbo.Enabled = true;\r
962                 }\r
963                 h264Tab.Enabled = true;\r
964                 check_iPodAtom.Enabled = true;\r
965                 lbl_ipodAtom.Visible = false;\r
966                 check_optimiseMP4.Enabled = true;\r
967             }\r
968 \r
969         }\r
970 \r
971         #endregion\r
972 \r
973         // -------------------------------------------------------------- \r
974         // Main Window Preset System\r
975         // --------------------------------------------------------------\r
976 \r
977         #region Preset System\r
978 \r
979         // Import Current Presets\r
980         private void updatePresets()\r
981         {\r
982             string[] presets = new string[17];\r
983             presets[0] = "Animation";\r
984             presets[1] = "AppleTV";\r
985             presets[2] = "Bedlam";\r
986             presets[3] = "Blind";\r
987             presets[4] = "Broke";\r
988             presets[5] = "Classic";\r
989             presets[6] = "Constant Quality Rate";\r
990             presets[7] = "Deux Six Quatre";\r
991             presets[8] = "Film";\r
992             presets[9] = "iPhone / iPod Touch";\r
993             presets[10] = "iPod High-Rez";\r
994             presets[11] = "iPod Low-Rez";\r
995             presets[12] = "Normal";\r
996             presets[13] = "PS3";\r
997             presets[14] = "PSP";\r
998             presets[15] = "QuickTime";\r
999             presets[16] = "Television";\r
1000 \r
1001             TreeNode preset_treeview = new TreeNode();\r
1002 \r
1003             foreach (string preset in presets)\r
1004             {\r
1005                 preset_treeview = new TreeNode(preset);\r
1006 \r
1007                 // Now Fill Out List View with Items\r
1008                 treeView_presets.Nodes.Add(preset_treeview);\r
1009             }\r
1010         }\r
1011 \r
1012         private void grabCLIPresets()\r
1013         {\r
1014             string appPath = Application.StartupPath.ToString() + "\\";\r
1015             string strCmdLine = "cmd /c " + '"' + '"' + appPath + "HandBrakeCLI.exe" + '"' + " --preset-list >" + '"' + appPath + "presets.dat" + '"' + " 2>&1" + '"';\r
1016             Process hbproc = Process.Start("CMD.exe", strCmdLine);\r
1017             hbproc.WaitForExit();\r
1018             hbproc.Dispose();\r
1019             hbproc.Close();\r
1020         }\r
1021 \r
1022         // Function to select the default preset.\r
1023         private void loadNormalPreset()\r
1024         {\r
1025 \r
1026             int normal = 0;\r
1027             foreach (TreeNode treenode in treeView_presets.Nodes)\r
1028             {\r
1029                 if (treenode.ToString().Equals("TreeNode: Normal"))\r
1030                     normal = treenode.Index;\r
1031             }\r
1032 \r
1033             TreeNode np = treeView_presets.Nodes[normal];\r
1034 \r
1035             treeView_presets.SelectedNode = np;\r
1036 \r
1037 \r
1038 \r
1039         }\r
1040 \r
1041         // Buttons\r
1042         private void btn_setDefault_Click(object sender, EventArgs e)\r
1043         {\r
1044             String query = GenerateTheQuery();\r
1045             Properties.Settings.Default.defaultUserSettings = query;\r
1046             // Save the new default Settings\r
1047             Properties.Settings.Default.Save();\r
1048             MessageBox.Show("New default settings saved.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
1049         }\r
1050 \r
1051         // Preset Selection\r
1052         private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)\r
1053         {\r
1054             string selectedPreset = null;\r
1055             selectedPreset = treeView_presets.SelectedNode.Text;\r
1056 \r
1057             try\r
1058             {\r
1059                 string appPath = Application.StartupPath.ToString() + "\\";\r
1060                 StreamReader presetInput = new StreamReader(appPath + "presets.dat");\r
1061 \r
1062                 while (!presetInput.EndOfStream)\r
1063                 {\r
1064                     if ((char)presetInput.Peek() == '+')\r
1065                     {\r
1066                         string preset = presetInput.ReadLine().Replace("+ ", "");\r
1067                         Regex r = new Regex("(:  )"); // Split on hyphens. \r
1068                         string[] presetName = r.Split(preset);\r
1069 \r
1070 \r
1071                         if (selectedPreset == presetName[0])\r
1072                         {\r
1073                             // Need to disable anamorphic now, otherwise it may overide the width / height values later.\r
1074                             CheckPixelRatio.CheckState = CheckState.Unchecked;\r
1075 \r
1076                             // Send the query from the file to the Query Parser class\r
1077                             Functions.QueryParser presetQuery = Functions.QueryParser.Parse(preset);\r
1078 \r
1079                             // Now load the preset\r
1080                             presetLoader(presetQuery, selectedPreset);\r
1081                         }\r
1082 \r
1083                     }\r
1084                     else\r
1085                     {\r
1086                         presetInput.ReadLine();\r
1087                     }\r
1088                 }\r
1089             }\r
1090             catch (Exception exc)\r
1091             {\r
1092                 MessageBox.Show(exc.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
1093             }\r
1094         }\r
1095         #endregion\r
1096 \r
1097         //---------------------------------------------------\r
1098         // Encode / Cancel Buttons\r
1099         // Encode Progress Text Handler\r
1100         //---------------------------------------------------\r
1101 \r
1102         #region Encodeing and Queue\r
1103 \r
1104         Functions.CLI process = new Functions.CLI();\r
1105         private delegate void UpdateUIHandler();\r
1106 \r
1107         [DllImport("user32.dll")]\r
1108         public static extern void LockWorkStation();\r
1109         [DllImport("user32.dll")]\r
1110         public static extern int ExitWindowsEx(int uFlags, int dwReason);\r
1111 \r
1112         private void btn_queue_Click(object sender, EventArgs e)\r
1113         {\r
1114 \r
1115             if (text_source.Text == "" || text_source.Text == "Click 'Browse' to continue" || text_destination.Text == "")\r
1116                 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
1117             else\r
1118             {\r
1119                 string query = GenerateTheQuery();\r
1120 \r
1121                 queueWindow.list_queue.Items.Add(query);\r
1122                 queueWindow.Show();\r
1123             }\r
1124         }\r
1125 \r
1126         private void showQueue()\r
1127         {\r
1128             queueWindow.Show();\r
1129         }\r
1130 \r
1131         private void btn_encode_Click(object sender, EventArgs e)\r
1132         {\r
1133             if (text_source.Text == "" || text_source.Text == "Click 'Browse' to continue" || text_destination.Text == "")\r
1134                 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
1135             else\r
1136             {\r
1137                 string query = GenerateTheQuery();\r
1138 \r
1139                 ThreadPool.QueueUserWorkItem(procMonitor, query);\r
1140                 lbl_encode.Visible = true;\r
1141                 lbl_encode.Text = "Encoding in Progress";\r
1142             }\r
1143         }\r
1144 \r
1145         private void procMonitor(object state)\r
1146         {\r
1147             // Make sure we are not already encoding and if we are then display an error.\r
1148             if (hbProc != null)\r
1149             {\r
1150                 MessageBox.Show("Handbrake is already encoding a video!", "Status", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
1151             }\r
1152             else\r
1153             {\r
1154                 hbProc = process.runCli(this, (string)state, false, false, false, false);\r
1155                 hbProc.WaitForExit();\r
1156 \r
1157                 setEncodeLabel();\r
1158                 hbProc = null;\r
1159 \r
1160                 // Do something whent he encode ends.\r
1161                 switch (Properties.Settings.Default.CompletionOption)\r
1162                 {\r
1163                     case "Shutdown":\r
1164                         System.Diagnostics.Process.Start("Shutdown", "-s -t 60");\r
1165                         break;\r
1166                     case "Log Off":\r
1167                         ExitWindowsEx(0, 0);\r
1168                         break;\r
1169                     case "Suspend":\r
1170                         Application.SetSuspendState(PowerState.Suspend, true, true);\r
1171                         break;\r
1172                     case "Hibernate":\r
1173                         Application.SetSuspendState(PowerState.Hibernate, true, true);\r
1174                         break;\r
1175                     case "Lock System":\r
1176                         LockWorkStation();\r
1177                         break;\r
1178                     case "Quit HandBrake":\r
1179                         Application.Exit();\r
1180                         break;\r
1181                     default:\r
1182                         break;\r
1183                 }\r
1184             }\r
1185         }\r
1186 \r
1187         private void setEncodeLabel()\r
1188         {\r
1189             if (this.InvokeRequired)\r
1190             {\r
1191                 this.BeginInvoke(new UpdateUIHandler(setEncodeLabel));\r
1192                 return;\r
1193             }\r
1194             lbl_encode.Text = "Encoding Finished";\r
1195         }\r
1196 \r
1197         #endregion\r
1198 \r
1199 \r
1200         //---------------------------------------------------\r
1201         //  Some Functions\r
1202         //  - Query Generation\r
1203         //---------------------------------------------------\r
1204 \r
1205         #region Program Functions\r
1206 \r
1207         public string GenerateTheQuery()\r
1208         {\r
1209             \r
1210 \r
1211 \r
1212             // Source tab\r
1213             #region source\r
1214             string source = text_source.Text;\r
1215             string dvdTitle = drp_dvdtitle.Text;\r
1216             string chapterStart = drop_chapterStart.Text;\r
1217             string chapterFinish = drop_chapterFinish.Text;\r
1218             int totalChapters = drop_chapterFinish.Items.Count - 1;\r
1219             string dvdChapter = "";\r
1220 \r
1221             if ((source != "") || (source != "Click 'Browse' to continue"))\r
1222                 source = " -i " + '"' + source + '"';\r
1223 \r
1224             if (dvdTitle == "Automatic")\r
1225                 dvdTitle = "";\r
1226             else\r
1227             {\r
1228                 string[] titleInfo = dvdTitle.Split(' ');\r
1229                 dvdTitle = " -t " + titleInfo[0];\r
1230             }\r
1231 \r
1232             if (chapterFinish.Equals("Auto") && chapterStart.Equals("Auto"))\r
1233                 dvdChapter = "";\r
1234             else if (chapterFinish == chapterStart)\r
1235                 dvdChapter = " -c " + chapterStart;\r
1236             else\r
1237                 dvdChapter = " -c " + chapterStart + "-" + chapterFinish;\r
1238 \r
1239             string querySource = source + dvdTitle + dvdChapter;\r
1240             #endregion\r
1241 \r
1242             // Destination tab\r
1243             #region Destination\r
1244 \r
1245             string destination = text_destination.Text;\r
1246             string videoEncoder = drp_videoEncoder.Text;\r
1247             string audioEncoder = drp_audioCodec.Text;\r
1248             string width = text_width.Text;\r
1249             string height = text_height.Text;\r
1250 \r
1251             if (destination != "")\r
1252                 destination = " -o " + '"' + destination + '"'; //'"'+ \r
1253 \r
1254 \r
1255             switch (videoEncoder)\r
1256             {\r
1257                 case "Mpeg 4":\r
1258                     videoEncoder = " -e ffmpeg";\r
1259                     break;\r
1260                 case "Xvid":\r
1261                     videoEncoder = " -e xvid";\r
1262                     break;\r
1263                 case "H.264":\r
1264                     videoEncoder = " -e x264";\r
1265                     break;\r
1266                 case "H.264 (iPod)":\r
1267                     videoEncoder = " -e x264b30";\r
1268                     break;\r
1269                 default:\r
1270                     videoEncoder = " -e x264";\r
1271                     break;\r
1272             }\r
1273 \r
1274             switch (audioEncoder)\r
1275             {\r
1276                 case "AAC":\r
1277                     audioEncoder = " -E faac";\r
1278                     break;\r
1279                 case "MP3":\r
1280                     audioEncoder = " -E lame";\r
1281                     break;\r
1282                 case "Vorbis":\r
1283                     audioEncoder = " -E vorbis";\r
1284                     break;\r
1285                 case "AC3":\r
1286                     audioEncoder = " -E ac3";\r
1287                     break;\r
1288                 default:\r
1289                     audioEncoder = " -E faac";\r
1290                     break;\r
1291             }\r
1292 \r
1293             if (width != "")\r
1294                 width = " -w " + width;\r
1295 \r
1296 \r
1297             if (height == "Auto")\r
1298             {\r
1299                 height = "";\r
1300             }\r
1301             else if (height != "")\r
1302             {\r
1303                 height = " -l " + height;\r
1304             }\r
1305 \r
1306 \r
1307             string queryDestination = destination + videoEncoder + audioEncoder + width + height;\r
1308             #endregion\r
1309 \r
1310             // Picture Settings Tab\r
1311             #region Picture Settings Tab\r
1312 \r
1313             string cropSetting = drp_crop.Text;\r
1314             string cropTop = text_top.Text;\r
1315             string cropBottom = text_bottom.Text;\r
1316             string cropLeft = text_left.Text;\r
1317             string cropRight = text_right.Text;\r
1318             string cropOut = "";\r
1319             string deInterlace_Option = drp_deInterlace_option.Text;\r
1320             string deinterlace = "";\r
1321             string grayscale = "";\r
1322             string pixelRatio = "";\r
1323             string vfr = "";\r
1324             string deblock = "";\r
1325             string detelecine = "";\r
1326             string lanamorphic = "";\r
1327 \r
1328 \r
1329 \r
1330             if (cropSetting == "Automatic")\r
1331                 cropOut = "";\r
1332             else if (cropSetting == "No Crop")\r
1333                 cropOut = " --crop 0:0:0:0 ";\r
1334             else\r
1335             {\r
1336                 if (text_top.Text == "")\r
1337                     cropTop = "0";\r
1338                 if (text_bottom.Text == "")\r
1339                     cropBottom = "0";\r
1340                 if (text_left.Text == "")\r
1341                     cropLeft = "0";\r
1342                 if (text_right.Text == "")\r
1343                     cropRight = "0";\r
1344 \r
1345                 cropOut = " --crop " + cropTop + ":" + cropBottom + ":" + cropLeft + ":" + cropRight;\r
1346             }\r
1347 \r
1348             switch (deInterlace_Option)\r
1349             {\r
1350                 case "None":\r
1351                     deinterlace = "";\r
1352                     break;\r
1353                 case "Fast":\r
1354                     deinterlace = " --deinterlace=fast";\r
1355                     break;\r
1356                 case "Slow":\r
1357                     deinterlace = " --deinterlace=slow";\r
1358                     break;\r
1359                 case "Slower":\r
1360                     deinterlace = " --deinterlace=slower";\r
1361                     break;\r
1362                 case "Slowest":\r
1363                     deinterlace = " --deinterlace=slowest";\r
1364                     break;\r
1365                 default:\r
1366                     deinterlace = "";\r
1367                     break;\r
1368             }\r
1369 \r
1370             if (check_grayscale.Checked)\r
1371                 grayscale = " -g ";\r
1372 \r
1373             if (CheckPixelRatio.Checked)\r
1374                 pixelRatio = " -p ";\r
1375 \r
1376             if (check_deblock.Checked)\r
1377                 deblock = " --deblock";\r
1378 \r
1379             if (check_detelecine.Checked)\r
1380                 detelecine = " --detelecine";\r
1381 \r
1382             if (check_vfr.Checked)\r
1383                 vfr = " -V ";\r
1384 \r
1385             if (check_lAnamorphic.Checked)\r
1386                 lanamorphic = " -P ";\r
1387 \r
1388             string queryPictureSettings = cropOut + deinterlace + deblock + detelecine + vfr + grayscale + pixelRatio + lanamorphic;\r
1389             #endregion\r
1390 \r
1391             // Video Settings Tab\r
1392             #region Video Settings Tab\r
1393 \r
1394             string videoBitrate = text_bitrate.Text;\r
1395             string videoFilesize = text_filesize.Text;\r
1396             double videoQuality = slider_videoQuality.Value;\r
1397             string vidQSetting = "";\r
1398             string twoPassEncoding = "";\r
1399             string videoFramerate = drp_videoFramerate.Text;\r
1400             string turboH264 = "";\r
1401             string largeFile = "";\r
1402             string denoise = "";\r
1403             string ipodAtom = "";\r
1404             string optimizeMP4 = "";\r
1405 \r
1406             if (videoBitrate != "")\r
1407                 videoBitrate = " -b " + videoBitrate;\r
1408 \r
1409             if (videoFilesize != "")\r
1410                 videoFilesize = " -S " + videoFilesize;\r
1411 \r
1412             // Video Quality Setting\r
1413 \r
1414             if ((videoQuality == 0))\r
1415                 vidQSetting = "";\r
1416             else\r
1417             {\r
1418                 videoQuality = videoQuality / 100;\r
1419                 if (videoQuality == 1)\r
1420                 {\r
1421                     vidQSetting = "1.0";\r
1422                 }\r
1423                 vidQSetting = " -q " + videoQuality.ToString(new CultureInfo("en-US"));\r
1424             }\r
1425 \r
1426             if (check_2PassEncode.Checked)\r
1427                 twoPassEncoding = " -2 ";\r
1428 \r
1429             if (videoFramerate == "Automatic")\r
1430                 videoFramerate = "";\r
1431             else\r
1432                 videoFramerate = " -r " + videoFramerate;\r
1433 \r
1434             if (check_turbo.Checked)\r
1435                 turboH264 = " -T ";\r
1436 \r
1437             if (check_largeFile.Checked)\r
1438                 largeFile = " -4 ";\r
1439 \r
1440 \r
1441             switch (drp_deNoise.Text)\r
1442             {\r
1443                 case "None":\r
1444                     denoise = "";\r
1445                     break;\r
1446                 case "Weak":\r
1447                     denoise = " --denoise=weak";\r
1448                     break;\r
1449                 case "Medium":\r
1450                     denoise = " --denoise=medium";\r
1451                     break;\r
1452                 case "Strong":\r
1453                     denoise = " --denoise=strong";\r
1454                     break;\r
1455                 default:\r
1456                     denoise = "";\r
1457                     break;\r
1458             }\r
1459 \r
1460             if (check_iPodAtom.Checked)\r
1461                 ipodAtom = " -I ";\r
1462 \r
1463             if (check_optimiseMP4.Checked)\r
1464                 optimizeMP4 = " -O ";\r
1465 \r
1466 \r
1467             string queryVideoSettings = videoBitrate + videoFilesize + vidQSetting + twoPassEncoding + videoFramerate + turboH264 + ipodAtom + optimizeMP4 + largeFile + denoise;\r
1468             #endregion\r
1469 \r
1470             // Audio Settings Tab\r
1471             #region Audio Settings Tab\r
1472 \r
1473             string audioBitrate = drp_audioBitrate.Text;\r
1474             string audioSampleRate = drp_audioSampleRate.Text;\r
1475             string track1 = drp_track1Audio.Text;\r
1476             string track2 = drp_track2Audio.Text;\r
1477             string audioChannels = "";\r
1478             string Mixdown = drp_audioMixDown.Text;\r
1479             string SixChannelAudio = "";\r
1480             string subtitles = drp_subtitle.Text;\r
1481             string subScan = "";\r
1482             string forced = "";\r
1483             string drc = "";\r
1484 \r
1485             if (audioBitrate != "")\r
1486                 audioBitrate = " -B " + audioBitrate;\r
1487 \r
1488             if (audioSampleRate != "")\r
1489                 audioSampleRate = " -R " + audioSampleRate;\r
1490 \r
1491             // Audio Track 1\r
1492             if (track1 == "Automatic")\r
1493                 audioChannels = "";\r
1494             else if (track1 == "")\r
1495                 audioChannels = "";\r
1496             else if (track1 == "None")\r
1497                 audioChannels = " -a none";\r
1498             else\r
1499             {\r
1500                 string[] tempSub;\r
1501                 tempSub = track1.Split(' ');\r
1502                 audioChannels = " -a " + tempSub[0];\r
1503             }\r
1504 \r
1505             // Audio Track 2\r
1506             if (audioChannels != "")\r
1507             {\r
1508                 if ((track2 != "") && (track2 != "None"))\r
1509                 {\r
1510                     string[] tempSub;\r
1511                     tempSub = track2.Split(' ');\r
1512                     audioChannels = audioChannels + "," + tempSub[0];\r
1513                 }\r
1514             }\r
1515             else\r
1516             {\r
1517                 if ((track2 != "") && (track2 != "None"))\r
1518                 {\r
1519                     string[] tempSub;\r
1520                     tempSub = track2.Split(' ');\r
1521                     audioChannels = " -a " + tempSub[0];\r
1522                 }\r
1523             }\r
1524 \r
1525 \r
1526 \r
1527             switch (Mixdown)\r
1528             {\r
1529                 case "Automatic":\r
1530                     Mixdown = "";\r
1531                     break;\r
1532                 case "Mono":\r
1533                     Mixdown = "mono";\r
1534                     break;\r
1535                 case "Stereo":\r
1536                     Mixdown = "stereo";\r
1537                     break;\r
1538                 case "Dolby Surround":\r
1539                     Mixdown = "dpl1";\r
1540                     break;\r
1541                 case "Dolby Pro Logic II":\r
1542                     Mixdown = "dpl2";\r
1543                     break;\r
1544                 case "6 Channel Discrete":\r
1545                     Mixdown = "6ch";\r
1546                     break;\r
1547                 default:\r
1548                     Mixdown = "";\r
1549                     break;\r
1550             }\r
1551 \r
1552             if (Mixdown != "")\r
1553                 SixChannelAudio = " -6 " + Mixdown;\r
1554             else\r
1555                 SixChannelAudio = "";\r
1556 \r
1557             if (subtitles == "None")\r
1558                 subtitles = "";\r
1559             else if (subtitles == "")\r
1560                 subtitles = "";\r
1561             else if (subtitles == "Autoselect")\r
1562             {\r
1563                 subScan = " -U ";\r
1564                 subtitles = "";\r
1565             }\r
1566             else\r
1567             {\r
1568                 string[] tempSub;\r
1569                 tempSub = subtitles.Split(' ');\r
1570                 subtitles = " -s " + tempSub[0];\r
1571             }\r
1572 \r
1573             if (check_forced.Checked)\r
1574                 forced = " -F ";\r
1575 \r
1576             //Dynamic Range Compression (expects a float but a double is used for ease)\r
1577             double value = slider_drc.Value / 10.0;\r
1578             value++;\r
1579             drc = " -D " + value;\r
1580 \r
1581             string queryAudioSettings = audioBitrate + audioSampleRate + drc + audioChannels + SixChannelAudio + subScan + subtitles + forced;\r
1582             #endregion\r
1583 \r
1584             // Chapter Markers Tab\r
1585             #region Chapter Markers\r
1586 \r
1587             string ChapterMarkers = "";\r
1588 \r
1589             if (Check_ChapterMarkers.Checked)\r
1590             {\r
1591                 Boolean saveCSV = chapterCSVSave();\r
1592                 if (saveCSV == false)\r
1593                 {\r
1594                     MessageBox.Show("Unable to save Chapter Makrers file! \n Chapter marker names will NOT be saved in your encode \n\n", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
1595                     ChapterMarkers = " -m ";\r
1596                 }\r
1597                 else\r
1598                 {\r
1599                     string path = Application.StartupPath.ToString();\r
1600                     path = "\"" + path + "\\chapters.csv\" ";\r
1601 \r
1602                     ChapterMarkers = " --markers=" + path;\r
1603                 }\r
1604             }\r
1605 \r
1606             string chapter_markers = ChapterMarkers;\r
1607             #endregion\r
1608 \r
1609             // H264 Tab\r
1610             #region  H264 Tab\r
1611 \r
1612             string h264Advanced = rtf_h264advanced.Text;\r
1613 \r
1614             if ((h264Advanced == ""))\r
1615                 h264Advanced = "";\r
1616             else\r
1617                 h264Advanced = " -x " + h264Advanced;\r
1618 \r
1619 \r
1620             string h264Settings = h264Advanced;\r
1621             #endregion\r
1622 \r
1623             // Other\r
1624             #region Processors / Other\r
1625 \r
1626             string processors = Properties.Settings.Default.Processors;\r
1627             //  Number of Processors Handler\r
1628 \r
1629             if (processors == "Automatic")\r
1630                 processors = "";\r
1631             else\r
1632                 processors = " -C " + processors + " ";\r
1633 \r
1634 \r
1635             string queryAdvancedSettings = processors;\r
1636 \r
1637             string verbose = "";\r
1638             if (Properties.Settings.Default.verbose == "Checked")\r
1639                 verbose = " -v ";\r
1640             #endregion\r
1641 \r
1642             return querySource + queryDestination + queryPictureSettings + queryVideoSettings + h264Settings + queryAudioSettings + ChapterMarkers + queryAdvancedSettings + verbose;\r
1643         }\r
1644 \r
1645         private void presetLoader(Functions.QueryParser presetQuery, string name)\r
1646         {\r
1647             // ---------------------------\r
1648             // Setup the GUI\r
1649             // ---------------------------\r
1650 \r
1651             // Source tab\r
1652             #region source\r
1653             if (presetQuery.Source != "")\r
1654                 text_source.Text = presetQuery.Source;\r
1655 \r
1656             if (presetQuery.DVDTitle != 0)\r
1657                 drp_dvdtitle.Text = presetQuery.DVDTitle.ToString();\r
1658 \r
1659             if (presetQuery.DVDChapterStart != 0)\r
1660                 drop_chapterStart.Text = presetQuery.DVDChapterStart.ToString();\r
1661 \r
1662             if (presetQuery.DVDChapterFinish != 0)\r
1663                 drop_chapterFinish.Text = presetQuery.DVDChapterFinish.ToString();\r
1664 \r
1665             if (presetQuery.Format != "")\r
1666             {\r
1667                 string destination = text_destination.Text;\r
1668                 destination = destination.Replace(".mp4", "." + presetQuery.Format);\r
1669                 destination = destination.Replace(".m4v", "." + presetQuery.Format);\r
1670                 destination = destination.Replace(".avi", "." + presetQuery.Format);\r
1671                 destination = destination.Replace(".mkv", "." + presetQuery.Format);\r
1672                 destination = destination.Replace(".ogm", "." + presetQuery.Format);\r
1673                 text_destination.Text = destination;\r
1674             }\r
1675 \r
1676             #endregion\r
1677 \r
1678             // Destination tab\r
1679             #region destination\r
1680 \r
1681             if (presetQuery.Destination != "")\r
1682                 text_destination.Text = presetQuery.Destination;\r
1683 \r
1684             drp_videoEncoder.Text = presetQuery.VideoEncoder;\r
1685             drp_audioCodec.Text = presetQuery.AudioEncoder;\r
1686             if (presetQuery.Width != 0)\r
1687                 text_width.Text = presetQuery.Width.ToString();\r
1688             else\r
1689             {\r
1690                 text_width.Text = "";\r
1691                 text_width.BackColor = Color.White;\r
1692             }\r
1693 \r
1694             if (presetQuery.Height != 0)\r
1695                 text_height.Text = presetQuery.Height.ToString();\r
1696             else\r
1697             {\r
1698                 text_height.Text = "";\r
1699                 text_height.BackColor = Color.White;\r
1700             }\r
1701             #endregion\r
1702 \r
1703             // Picture Settings Tab\r
1704             #region Picture\r
1705             drp_crop.Text = "Manual";\r
1706             text_top.Text = presetQuery.CropTop;\r
1707             text_bottom.Text = presetQuery.CropBottom;\r
1708             text_left.Text = presetQuery.CropLeft;\r
1709             text_right.Text = presetQuery.CropRight;\r
1710 \r
1711             drp_deInterlace_option.Text = presetQuery.DeInterlace;\r
1712             drp_deNoise.Text = presetQuery.DeNoise;\r
1713 \r
1714             if (presetQuery.DeTelecine == true)\r
1715                 check_detelecine.CheckState = CheckState.Checked;\r
1716             else\r
1717                 check_detelecine.CheckState = CheckState.Unchecked;\r
1718 \r
1719 \r
1720             if (presetQuery.DeBlock == true)\r
1721                 check_deblock.CheckState = CheckState.Checked;\r
1722             else\r
1723                 check_deblock.CheckState = CheckState.Unchecked;\r
1724 \r
1725             if (presetQuery.ChapterMarkers == true)\r
1726                 Check_ChapterMarkers.CheckState = CheckState.Checked;\r
1727             else\r
1728                 Check_ChapterMarkers.CheckState = CheckState.Unchecked;\r
1729 \r
1730             if (presetQuery.Anamorphic == true)\r
1731                 CheckPixelRatio.CheckState = CheckState.Checked;\r
1732             else\r
1733                 CheckPixelRatio.CheckState = CheckState.Unchecked;\r
1734 \r
1735             if (presetQuery.LooseAnamorphic == true)\r
1736                 check_lAnamorphic.CheckState = CheckState.Checked;\r
1737             else\r
1738                 check_lAnamorphic.CheckState = CheckState.Unchecked;\r
1739 \r
1740             if (presetQuery.VFR == true)\r
1741                 check_vfr.CheckState = CheckState.Checked;\r
1742             else\r
1743                 check_vfr.CheckState = CheckState.Unchecked;\r
1744             #endregion\r
1745 \r
1746             // Video Settings Tab\r
1747             #region video\r
1748             text_bitrate.Text = presetQuery.AverageVideoBitrate;\r
1749             text_filesize.Text = presetQuery.VideoTargetSize;\r
1750             slider_videoQuality.Value = presetQuery.VideoQuality;\r
1751             if (slider_videoQuality.Value != 0)\r
1752             {\r
1753                 int ql = presetQuery.VideoQuality;\r
1754                 SliderValue.Text = ql.ToString() + "%";\r
1755             }\r
1756 \r
1757             if (presetQuery.TwoPass == true)\r
1758                 check_2PassEncode.CheckState = CheckState.Checked;\r
1759             else\r
1760                 check_2PassEncode.CheckState = CheckState.Unchecked;\r
1761 \r
1762             if (presetQuery.Grayscale == true)\r
1763                 check_grayscale.CheckState = CheckState.Checked;\r
1764             else\r
1765                 check_grayscale.CheckState = CheckState.Unchecked;\r
1766 \r
1767             drp_videoFramerate.Text = presetQuery.VideoFramerate;\r
1768 \r
1769             if (presetQuery.TurboFirstPass == true)\r
1770                 check_turbo.CheckState = CheckState.Checked;\r
1771             else\r
1772                 check_turbo.CheckState = CheckState.Unchecked;\r
1773 \r
1774             if (presetQuery.LargeMP4 == true)\r
1775                 check_largeFile.CheckState = CheckState.Checked;\r
1776             else\r
1777                 check_largeFile.CheckState = CheckState.Unchecked;\r
1778 \r
1779             if (presetQuery.IpodAtom == true)\r
1780                 check_iPodAtom.CheckState = CheckState.Checked;\r
1781             else\r
1782                 check_iPodAtom.CheckState = CheckState.Unchecked;\r
1783 \r
1784             if (presetQuery.OptimizeMP4 == true)\r
1785                 check_optimiseMP4.CheckState = CheckState.Checked;\r
1786             else\r
1787                 check_optimiseMP4.CheckState = CheckState.Unchecked;\r
1788 \r
1789             #endregion\r
1790 \r
1791             // Audio Settings Tab\r
1792             #region Audio\r
1793             drp_audioBitrate.Text = presetQuery.AudioBitrate;\r
1794             drp_audioSampleRate.Text = presetQuery.AudioSampleBitrate;\r
1795             drp_track1Audio.Text = presetQuery.AudioTrack1;\r
1796             drp_track2Audio.Text = presetQuery.AudioTrack2;\r
1797             drp_audioMixDown.Text = presetQuery.AudioTrackMix;\r
1798             drp_subtitle.Text = presetQuery.Subtitles;\r
1799 \r
1800             if (presetQuery.ForcedSubtitles == true)\r
1801             {\r
1802                 check_forced.CheckState = CheckState.Checked;\r
1803                 check_forced.Enabled = true;\r
1804             }\r
1805             else\r
1806                 check_forced.CheckState = CheckState.Unchecked;\r
1807 \r
1808             // Dynamic Range Compression (Should be a float but we use double for ease)\r
1809             double value = presetQuery.DRC;\r
1810             if (value > 0)\r
1811                 value = value - 10;\r
1812             slider_drc.Value = int.Parse(value.ToString());\r
1813 \r
1814             double actualValue = presetQuery.DRC / 10;\r
1815             lbl_drc.Text = actualValue.ToString();\r
1816 \r
1817 \r
1818             #endregion\r
1819 \r
1820             // H264 Tab & Preset Name\r
1821             #region other\r
1822             rtf_h264advanced.Text = presetQuery.H264Query;\r
1823 \r
1824             // Set the preset name\r
1825             groupBox_output.Text = "Output Settings (Preset: " + name + ")";\r
1826             #endregion\r
1827         }\r
1828 \r
1829         private Boolean updateCheck()\r
1830         {\r
1831             try\r
1832             {\r
1833                 Functions.RssReader rssRead = new Functions.RssReader();\r
1834                 string build = rssRead.build();\r
1835 \r
1836                 int latest = int.Parse(build);\r
1837                 int current = Properties.Settings.Default.build;\r
1838                 int skip = Properties.Settings.Default.skipversion;\r
1839 \r
1840                 if (latest == skip)\r
1841                 {\r
1842                     return false;\r
1843                 }\r
1844                 else\r
1845                 {\r
1846                     Boolean update = (latest > current);\r
1847                     return update;\r
1848                 }\r
1849             }\r
1850             catch (Exception exc)\r
1851             {\r
1852                 MessageBox.Show(exc.ToString());\r
1853                 return false;\r
1854             }\r
1855         }\r
1856 \r
1857         public void setStreamReader(Parsing.DVD dvd)\r
1858         {\r
1859             this.thisDVD = dvd;\r
1860         }\r
1861 \r
1862         public void autoName()\r
1863         {\r
1864             if (Properties.Settings.Default.autoNaming == "Checked")\r
1865             {\r
1866                 if (drp_dvdtitle.Text != "Automatic")\r
1867                 {\r
1868                     string source = text_source.Text;\r
1869                     string[] sourceName = source.Split('\\');\r
1870                     source = sourceName[sourceName.Length - 1].Replace(".iso", "").Replace(".mpg", "").Replace(".ts", "").Replace(".ps", "");\r
1871 \r
1872                     string title = drp_dvdtitle.Text;\r
1873                     string[] titlesplit = title.Split(' ');\r
1874                     title = titlesplit[0];\r
1875 \r
1876                     string cs = drop_chapterStart.Text;\r
1877                     string cf = drop_chapterFinish.Text;\r
1878 \r
1879                     if (title == "Automatic")\r
1880                         title = "";\r
1881                     if (cs == "Auto")\r
1882                         cs = "";\r
1883                     if (cf == "Auto")\r
1884                         cf = "";\r
1885 \r
1886                     string dash = "";\r
1887                     if (cf != "Auto")\r
1888                         dash = "-";\r
1889 \r
1890                     if (!text_destination.Text.Contains("\\"))\r
1891                     {\r
1892                         string filePath = "";\r
1893                         if (Properties.Settings.Default.autoNamePath.Trim() != "")\r
1894                             filePath = Properties.Settings.Default.autoNamePath + "\\";\r
1895                         text_destination.Text = filePath + source + "_T" + title + "_C" + cs + dash + cf + ".mp4";\r
1896                     }\r
1897                     else\r
1898                     {\r
1899                         string dest = text_destination.Text;\r
1900 \r
1901                         string[] destName = dest.Split('\\');\r
1902 \r
1903 \r
1904                         string[] extension = dest.Split('.');\r
1905                         string ext = extension[extension.Length - 1];\r
1906 \r
1907                         destName[destName.Length - 1] = source + "_T" + title + "_C" + cs + dash + cf + "." + ext;\r
1908 \r
1909                         string fullDest = "";\r
1910                         foreach (string part in destName)\r
1911                         {\r
1912                             if (fullDest != "")\r
1913                                 fullDest = fullDest + "\\" + part;\r
1914                             else\r
1915                                 fullDest = fullDest + part;\r
1916                         }\r
1917 \r
1918                         text_destination.Text = fullDest;\r
1919                     }\r
1920                 }\r
1921             }\r
1922         }\r
1923 \r
1924         private void chapterNaming()\r
1925         {\r
1926             try\r
1927             {\r
1928                 data_chpt.Rows.Clear();\r
1929                 int i = 0;\r
1930                 int rowCount = 0;\r
1931                 int start = 0;\r
1932                 int finish = 0;\r
1933                 if (drop_chapterFinish.Text != "Auto")\r
1934                     finish = int.Parse(drop_chapterFinish.Text);\r
1935 \r
1936                 if (drop_chapterStart.Text != "Auto")\r
1937                      start = int.Parse(drop_chapterStart.Text);\r
1938 \r
1939                 rowCount = finish - (start -1);\r
1940 \r
1941                 while (i < rowCount)\r
1942                 {\r
1943                     DataGridViewRow row = new DataGridViewRow();\r
1944 \r
1945                     data_chpt.Rows.Insert(i, row);\r
1946                     data_chpt.Rows[i].Cells[0].Value = (i + 1);\r
1947                     data_chpt.Rows[i].Cells[1].Value = "Chapter " + (i + 1);\r
1948                     i++;\r
1949                 }\r
1950             }\r
1951             catch (Exception exc)\r
1952             {\r
1953                 MessageBox.Show("chapterNaming() Error has occured: \n" + exc.ToString());\r
1954             }\r
1955         }\r
1956 \r
1957         private Boolean chapterCSVSave()\r
1958         {\r
1959             try\r
1960             {\r
1961                 string appPath = Application.StartupPath.ToString();\r
1962                 appPath = appPath + "\\";\r
1963 \r
1964                 string path = appPath + "chapters.csv";\r
1965 \r
1966                 StringBuilder csv = new StringBuilder();\r
1967 \r
1968                 foreach (DataGridViewRow row in data_chpt.Rows)\r
1969                 {\r
1970                     csv.Append(row.Cells[0].Value.ToString());\r
1971                     csv.Append(",");\r
1972                     csv.Append(row.Cells[1].Value.ToString());\r
1973                     csv.Append(Environment.NewLine);\r
1974 \r
1975                 }\r
1976                 StreamWriter file = new StreamWriter(path);\r
1977                 file.Write(csv.ToString());\r
1978                 file.Close();\r
1979                 file.Dispose();\r
1980                 return true;\r
1981 \r
1982             }\r
1983             catch (Exception exc)\r
1984             {\r
1985                 MessageBox.Show(exc.ToString(), "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
1986                 return false;\r
1987             }\r
1988         }\r
1989 \r
1990         #endregion\r
1991 \r
1992         // This is the END of the road ------------------------------------------------------------------------------\r
1993     }\r
1994 }