summaryrefslogtreecommitdiffstats
path: root/win/CS
diff options
context:
space:
mode:
Diffstat (limited to 'win/CS')
-rw-r--r--win/CS/Controls/AdvancedEncoderOpts.Designer.cs100
-rw-r--r--win/CS/Controls/AdvancedEncoderOpts.cs59
-rw-r--r--win/CS/Controls/AdvancedEncoderOpts.resx123
-rw-r--r--win/CS/Controls/AudioPanel.Designer.cs493
-rw-r--r--win/CS/Controls/AudioPanel.cs704
-rw-r--r--win/CS/Controls/AudioPanel.resx147
-rw-r--r--win/CS/Controls/Filters.Designer.cs340
-rw-r--r--win/CS/Controls/Filters.cs336
-rw-r--r--win/CS/Controls/Filters.resx120
-rw-r--r--win/CS/Controls/PictureSettings.Designer.cs688
-rw-r--r--win/CS/Controls/PictureSettings.cs547
-rw-r--r--win/CS/Controls/PictureSettings.resx120
-rw-r--r--win/CS/Controls/Subtitles.Designer.cs487
-rw-r--r--win/CS/Controls/Subtitles.cs734
-rw-r--r--win/CS/Controls/Subtitles.resx132
-rw-r--r--win/CS/Controls/x264Panel.Designer.cs774
-rw-r--r--win/CS/Controls/x264Panel.cs1076
-rw-r--r--win/CS/Controls/x264Panel.resx241
-rw-r--r--win/CS/Functions/Main.cs749
-rw-r--r--win/CS/Functions/PresetLoader.cs310
-rw-r--r--win/CS/Functions/QueryGenerator.cs673
-rw-r--r--win/CS/Functions/ToolStripRenderOverride.cs51
-rw-r--r--win/CS/HandBrake.5.1.ReSharper379
-rw-r--r--win/CS/HandBrake.ApplicationServices/EventArgs/EncodeCompletedEventArgs.cs49
-rw-r--r--win/CS/HandBrake.ApplicationServices/EventArgs/EncodeProgressEventArgs.cs45
-rw-r--r--win/CS/HandBrake.ApplicationServices/EventArgs/QueueProgressEventArgs.cs33
-rw-r--r--win/CS/HandBrake.ApplicationServices/EventArgs/ScanCompletedEventArgs.cs49
-rw-r--r--win/CS/HandBrake.ApplicationServices/EventArgs/ScanProgressEventArgs.cs25
-rw-r--r--win/CS/HandBrake.ApplicationServices/Functions/Converters.cs189
-rw-r--r--win/CS/HandBrake.ApplicationServices/Functions/EnumHelper.cs35
-rw-r--r--win/CS/HandBrake.ApplicationServices/Functions/GrowlCommunicator.cs119
-rw-r--r--win/CS/HandBrake.ApplicationServices/Functions/PlistHelper.cs127
-rw-r--r--win/CS/HandBrake.ApplicationServices/Functions/System.cs56
-rw-r--r--win/CS/HandBrake.ApplicationServices/Functions/Win32.cs144
-rw-r--r--win/CS/HandBrake.ApplicationServices/Functions/Win7.cs73
-rw-r--r--win/CS/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj181
-rw-r--r--win/CS/HandBrake.ApplicationServices/Init.cs160
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/DriveInformation.cs44
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/EncodeTask.cs326
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/Encoding/Anamorphic.cs24
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/Encoding/AudioEncoder.cs33
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/Encoding/AudioTrack.cs56
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/Encoding/Cropping.cs63
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/Encoding/Decomb.cs17
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/Encoding/Deinterlace.cs20
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/Encoding/Denoise.cs19
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/Encoding/Detelecine.cs17
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/Encoding/FramerateMode.cs17
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/Encoding/Mixdown.cs33
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/Encoding/OutputFormat.cs24
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/Encoding/PointToPointMode.cs17
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/Encoding/SubtitleTrack.cs95
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/Encoding/SubtitleType.cs30
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/Encoding/VideoEncodeRateMode.cs17
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/Encoding/VideoEncoder.cs24
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/General/UpdateCheckInformation.cs53
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/General/UpdateCheckResult.cs71
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/Preset.cs64
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/QueueTask.cs84
-rw-r--r--win/CS/HandBrake.ApplicationServices/Parsing/AudioTrack.cs169
-rw-r--r--win/CS/HandBrake.ApplicationServices/Parsing/Chapter.cs126
-rw-r--r--win/CS/HandBrake.ApplicationServices/Parsing/Parser.cs163
-rw-r--r--win/CS/HandBrake.ApplicationServices/Parsing/Source.cs53
-rw-r--r--win/CS/HandBrake.ApplicationServices/Parsing/Subtitle.cs171
-rw-r--r--win/CS/HandBrake.ApplicationServices/Parsing/Title.cs234
-rw-r--r--win/CS/HandBrake.ApplicationServices/Properties/AssemblyInfo.cs.tmpl42
-rw-r--r--win/CS/HandBrake.ApplicationServices/Properties/Resources.Designer.cs70
-rw-r--r--win/CS/HandBrake.ApplicationServices/Properties/Resources.resx124
-rw-r--r--win/CS/HandBrake.ApplicationServices/Resources/logo64.pngbin0 -> 11967 bytes
-rw-r--r--win/CS/HandBrake.ApplicationServices/Services/Encode.cs595
-rw-r--r--win/CS/HandBrake.ApplicationServices/Services/Interfaces/IEncode.cs96
-rw-r--r--win/CS/HandBrake.ApplicationServices/Services/Interfaces/IPresetService.cs93
-rw-r--r--win/CS/HandBrake.ApplicationServices/Services/Interfaces/IQueueManager.cs113
-rw-r--r--win/CS/HandBrake.ApplicationServices/Services/Interfaces/IQueueProcessor.cs51
-rw-r--r--win/CS/HandBrake.ApplicationServices/Services/Interfaces/IScan.cs83
-rw-r--r--win/CS/HandBrake.ApplicationServices/Services/LibScan.cs328
-rw-r--r--win/CS/HandBrake.ApplicationServices/Services/PresetService.cs403
-rw-r--r--win/CS/HandBrake.ApplicationServices/Services/QueueManager.cs340
-rw-r--r--win/CS/HandBrake.ApplicationServices/Services/QueueProcessor.cs279
-rw-r--r--win/CS/HandBrake.ApplicationServices/Services/ScanService.cs355
-rw-r--r--win/CS/HandBrake.ApplicationServices/Services/UpdateService.cs97
-rw-r--r--win/CS/HandBrake.ApplicationServices/Settings.StyleCop14
-rw-r--r--win/CS/HandBrake.ApplicationServices/Utilities/AppcastReader.cs119
-rw-r--r--win/CS/HandBrake.ApplicationServices/Utilities/PlistUtility.cs664
-rw-r--r--win/CS/HandBrake.ApplicationServices/Utilities/QueryParserUtility.cs415
-rw-r--r--win/CS/HandBrake.ApplicationServices/Utilities/UtilityService.cs131
-rw-r--r--win/CS/HandBrake.ApplicationServices/app.config8
-rw-r--r--win/CS/HandBrake.sln66
-rw-r--r--win/CS/HandBrake10.5.1.ReSharper388
-rw-r--r--win/CS/HandBrake10.sln110
-rw-r--r--win/CS/HandBrakeCS.5.0.ReSharper388
-rw-r--r--win/CS/HandBrakeCS.csproj528
-rw-r--r--win/CS/HandBrakeWPF/App.xaml13
-rw-r--r--win/CS/HandBrakeWPF/App.xaml.cs27
-rw-r--r--win/CS/HandBrakeWPF/HandBrakeWPF.csproj297
-rw-r--r--win/CS/HandBrakeWPF/Properties/AssemblyInfo.cs55
-rw-r--r--win/CS/HandBrakeWPF/Properties/Resources.Designer.cs71
-rw-r--r--win/CS/HandBrakeWPF/Properties/Resources.resx117
-rw-r--r--win/CS/HandBrakeWPF/Properties/Settings.Designer.cs30
-rw-r--r--win/CS/HandBrakeWPF/Properties/Settings.settings7
-rw-r--r--win/CS/HandBrakeWPF/Services/MefBootstrapper.cs21
-rw-r--r--win/CS/HandBrakeWPF/Settings.StyleCop1
-rw-r--r--win/CS/HandBrakeWPF/ViewModels/AboutViewModel.cs20
-rw-r--r--win/CS/HandBrakeWPF/ViewModels/AddPresetViewModel.cs19
-rw-r--r--win/CS/HandBrakeWPF/ViewModels/Interfaces/IMainViewModel.cs10
-rw-r--r--win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs308
-rw-r--r--win/CS/HandBrakeWPF/ViewModels/OptionsViewModel.cs19
-rw-r--r--win/CS/HandBrakeWPF/ViewModels/PreviewViewModel.cs19
-rw-r--r--win/CS/HandBrakeWPF/ViewModels/QueueViewModel.cs19
-rw-r--r--win/CS/HandBrakeWPF/ViewModels/ViewModelBase.cs18
-rw-r--r--win/CS/HandBrakeWPF/Views/AboutView.xaml28
-rw-r--r--win/CS/HandBrakeWPF/Views/AboutView.xaml.cs15
-rw-r--r--win/CS/HandBrakeWPF/Views/AddPresetView.xaml11
-rw-r--r--win/CS/HandBrakeWPF/Views/AddPresetView.xaml.cs27
-rw-r--r--win/CS/HandBrakeWPF/Views/Controls/AdvancedView.xaml11
-rw-r--r--win/CS/HandBrakeWPF/Views/Controls/AdvancedView.xaml.cs27
-rw-r--r--win/CS/HandBrakeWPF/Views/Controls/AudioView.xaml11
-rw-r--r--win/CS/HandBrakeWPF/Views/Controls/AudioView.xaml.cs27
-rw-r--r--win/CS/HandBrakeWPF/Views/Controls/ChaptersView.xaml11
-rw-r--r--win/CS/HandBrakeWPF/Views/Controls/ChaptersView.xaml.cs27
-rw-r--r--win/CS/HandBrakeWPF/Views/Controls/FiltersView.xaml11
-rw-r--r--win/CS/HandBrakeWPF/Views/Controls/FiltersView.xaml.cs27
-rw-r--r--win/CS/HandBrakeWPF/Views/Controls/PictureSettingsView.xaml102
-rw-r--r--win/CS/HandBrakeWPF/Views/Controls/PictureSettingsView.xaml.cs27
-rw-r--r--win/CS/HandBrakeWPF/Views/Controls/QueryEditorView.xaml11
-rw-r--r--win/CS/HandBrakeWPF/Views/Controls/QueryEditorView.xaml.cs27
-rw-r--r--win/CS/HandBrakeWPF/Views/Controls/SubtitlesView.xaml11
-rw-r--r--win/CS/HandBrakeWPF/Views/Controls/SubtitlesView.xaml.cs27
-rw-r--r--win/CS/HandBrakeWPF/Views/Controls/VideoView.xaml11
-rw-r--r--win/CS/HandBrakeWPF/Views/Controls/VideoView.xaml.cs27
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/ActivityWindow.pngbin0 -> 1277 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/ActivityWindow_small.pngbin0 -> 3490 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/AddToQueue.pngbin0 -> 1913 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/AddToQueue_small.pngbin0 -> 829 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/ErrorX.pngbin0 -> 10369 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/General Preferences.pngbin0 -> 1490 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/Help16.pngbin0 -> 3499 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/Movies.pngbin0 -> 2258 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/Output_Small.pngbin0 -> 3232 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/Pause.pngbin0 -> 1715 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/Play.pngbin0 -> 1792 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/Play_small.pngbin0 -> 1166 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/Pref_Small.pngbin0 -> 3353 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/Queue.pngbin0 -> 1676 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/Queue_Small.pngbin0 -> 3573 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/copy.pngbin0 -> 3291 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/disc_small.pngbin0 -> 3575 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/download.pngbin0 -> 4569 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/folder.pngbin0 -> 463 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/hb16.pngbin0 -> 3746 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/hb32.pngbin0 -> 5935 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/info16.pngbin0 -> 3495 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/logo128.pngbin0 -> 31046 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/logo64.pngbin0 -> 11967 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/picture.pngbin0 -> 698 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/save.pngbin0 -> 3115 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/stop.pngbin0 -> 1341 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/Images/window.pngbin0 -> 935 bytes
-rw-r--r--win/CS/HandBrakeWPF/Views/MainView.xaml194
-rw-r--r--win/CS/HandBrakeWPF/Views/MainView.xaml.cs23
-rw-r--r--win/CS/HandBrakeWPF/Views/OptionsView.xaml8
-rw-r--r--win/CS/HandBrakeWPF/Views/OptionsView.xaml.cs26
-rw-r--r--win/CS/HandBrakeWPF/Views/PreviewView.xaml11
-rw-r--r--win/CS/HandBrakeWPF/Views/PreviewView.xaml.cs15
-rw-r--r--win/CS/HandBrakeWPF/Views/QueueView.xaml11
-rw-r--r--win/CS/HandBrakeWPF/Views/QueueView.xaml.cs15
-rw-r--r--win/CS/Installer/Installer.nsi360
-rw-r--r--win/CS/Installer/MakeNightly.nsi.tmpl343
-rw-r--r--win/CS/Model/ActivityLogMode.cs23
-rw-r--r--win/CS/Model/QueryEncodeMode.cs16
-rw-r--r--win/CS/Model/QueryPictureSettingsMode.cs18
-rw-r--r--win/CS/Model/SourceType.cs33
-rw-r--r--win/CS/Program.cs144
-rw-r--r--win/CS/Properties/AssemblyInfo.cs.tmpl42
-rw-r--r--win/CS/Properties/Resources.Designer.cs308
-rw-r--r--win/CS/Properties/Resources.resx226
-rw-r--r--win/CS/Properties/Settings.Designer.cs565
-rw-r--r--win/CS/Properties/Settings.settings141
-rw-r--r--win/CS/Resources/ActivityWindow.pngbin0 -> 1277 bytes
-rw-r--r--win/CS/Resources/ActivityWindow_small.pngbin0 -> 3490 bytes
-rw-r--r--win/CS/Resources/Add16.pngbin0 -> 595 bytes
-rw-r--r--win/CS/Resources/AddToQueue.pngbin0 -> 1913 bytes
-rw-r--r--win/CS/Resources/AddToQueue_small.pngbin0 -> 829 bytes
-rw-r--r--win/CS/Resources/Close.pngbin0 -> 1038 bytes
-rw-r--r--win/CS/Resources/ErrorX.pngbin0 -> 10369 bytes
-rw-r--r--win/CS/Resources/General Preferences.pngbin0 -> 1490 bytes
-rw-r--r--win/CS/Resources/Help16.pngbin0 -> 3499 bytes
-rw-r--r--win/CS/Resources/Help24.pngbin0 -> 1684 bytes
-rw-r--r--win/CS/Resources/Help32.pngbin0 -> 2531 bytes
-rw-r--r--win/CS/Resources/Movies.pngbin0 -> 2258 bytes
-rw-r--r--win/CS/Resources/Movies_Small.pngbin0 -> 3629 bytes
-rw-r--r--win/CS/Resources/Options24.pngbin0 -> 857 bytes
-rw-r--r--win/CS/Resources/Output_Small.pngbin0 -> 3232 bytes
-rw-r--r--win/CS/Resources/Pause.pngbin0 -> 1715 bytes
-rw-r--r--win/CS/Resources/Play.pngbin0 -> 1792 bytes
-rw-r--r--win/CS/Resources/Play_small.pngbin0 -> 1166 bytes
-rw-r--r--win/CS/Resources/Pref_Small.pngbin0 -> 3353 bytes
-rw-r--r--win/CS/Resources/Queue.pngbin0 -> 1676 bytes
-rw-r--r--win/CS/Resources/Queue_Small.pngbin0 -> 3573 bytes
-rw-r--r--win/CS/Resources/Restore.pngbin0 -> 541 bytes
-rw-r--r--win/CS/Resources/copy.pngbin0 -> 3291 bytes
-rw-r--r--win/CS/Resources/disc_small.pngbin0 -> 3575 bytes
-rw-r--r--win/CS/Resources/download.pngbin0 -> 4569 bytes
-rw-r--r--win/CS/Resources/folder.pngbin0 -> 463 bytes
-rw-r--r--win/CS/Resources/hb16.pngbin0 -> 3746 bytes
-rw-r--r--win/CS/Resources/hb32.pngbin0 -> 5935 bytes
-rw-r--r--win/CS/Resources/info16.pngbin0 -> 3495 bytes
-rw-r--r--win/CS/Resources/logo128.pngbin0 -> 31046 bytes
-rw-r--r--win/CS/Resources/logo64.pngbin0 -> 11967 bytes
-rw-r--r--win/CS/Resources/picture.pngbin0 -> 698 bytes
-rw-r--r--win/CS/Resources/save.pngbin0 -> 3115 bytes
-rw-r--r--win/CS/Resources/stop.pngbin0 -> 1341 bytes
-rw-r--r--win/CS/Resources/window.pngbin0 -> 935 bytes
-rw-r--r--win/CS/Settings.StyleCop244
-rw-r--r--win/CS/ToolWindows/BatchAdd.Designer.cs157
-rw-r--r--win/CS/ToolWindows/BatchAdd.cs73
-rw-r--r--win/CS/ToolWindows/BatchAdd.resx500
-rw-r--r--win/CS/ToolWindows/DownloadUpdate.Designer.cs111
-rw-r--r--win/CS/ToolWindows/DownloadUpdate.cs122
-rw-r--r--win/CS/ToolWindows/DownloadUpdate.resx670
-rw-r--r--win/CS/ToolWindows/ExceptionWindow.cs81
-rw-r--r--win/CS/ToolWindows/ExceptionWindow.designer.cs187
-rw-r--r--win/CS/ToolWindows/ExceptionWindow.resx868
-rw-r--r--win/CS/ToolWindows/PreviewOverlay.Designer.cs143
-rw-r--r--win/CS/ToolWindows/PreviewOverlay.cs59
-rw-r--r--win/CS/ToolWindows/PreviewOverlay.resx500
-rw-r--r--win/CS/ToolWindows/TitleSpecificScan.Designer.cs121
-rw-r--r--win/CS/ToolWindows/TitleSpecificScan.cs55
-rw-r--r--win/CS/ToolWindows/TitleSpecificScan.resx500
-rw-r--r--win/CS/ToolWindows/UpdateInfo.Designer.cs241
-rw-r--r--win/CS/ToolWindows/UpdateInfo.cs125
-rw-r--r--win/CS/ToolWindows/UpdateInfo.resx1021
-rw-r--r--win/CS/app.config161
-rw-r--r--win/CS/doc/AUTHORS112
-rw-r--r--win/CS/doc/COPYING340
-rw-r--r--win/CS/doc/CREDITS175
-rw-r--r--win/CS/doc/NEWS689
-rw-r--r--win/CS/doc/THANKS70
-rw-r--r--win/CS/doc/TRANSLATIONS23
-rw-r--r--win/CS/frmAbout.Designer.cs165
-rw-r--r--win/CS/frmAbout.cs41
-rw-r--r--win/CS/frmAbout.resx507
-rw-r--r--win/CS/frmActivityWindow.Designer.cs173
-rw-r--r--win/CS/frmActivityWindow.cs472
-rw-r--r--win/CS/frmActivityWindow.resx523
-rw-r--r--win/CS/frmAddPreset.Designer.cs182
-rw-r--r--win/CS/frmAddPreset.cs116
-rw-r--r--win/CS/frmAddPreset.resx503
-rw-r--r--win/CS/frmMain.Designer.cs1952
-rw-r--r--win/CS/frmMain.cs2552
-rw-r--r--win/CS/frmMain.resx1031
-rw-r--r--win/CS/frmOptions.Designer.cs1615
-rw-r--r--win/CS/frmOptions.cs522
-rw-r--r--win/CS/frmOptions.resx528
-rw-r--r--win/CS/frmPreview.Designer.cs229
-rw-r--r--win/CS/frmPreview.cs443
-rw-r--r--win/CS/frmPreview.resx512
-rw-r--r--win/CS/frmQueue.Designer.cs530
-rw-r--r--win/CS/frmQueue.cs712
-rw-r--r--win/CS/frmQueue.resx536
-rw-r--r--win/CS/handbrakepineapple.icobin0 -> 22486 bytes
-rw-r--r--win/CS/libraries/AxInterop.QTOControlLib.dllbin0 -> 28672 bytes
-rw-r--r--win/CS/libraries/Growl license.txt25
-rw-r--r--win/CS/libraries/Growl.Connector.dllbin0 -> 61440 bytes
-rw-r--r--win/CS/libraries/Growl.CoreLibrary.dllbin0 -> 28672 bytes
-rw-r--r--win/CS/libraries/HandBrakeInterop.dllbin0 -> 69120 bytes
-rw-r--r--win/CS/libraries/Microsoft.WindowsAPICodePack.Shell.dllbin0 -> 486400 bytes
-rw-r--r--win/CS/libraries/Microsoft.WindowsAPICodePack.dllbin0 -> 81920 bytes
-rw-r--r--win/CS/libraries/Source/HandBrakeInteropSource.zipbin0 -> 42736 bytes
-rw-r--r--win/CS/libraries/WPFToolkit.Extended.dllbin0 -> 133120 bytes
-rw-r--r--win/CS/libraries/caliburn/Caliburn.Core.dllbin0 -> 47104 bytes
-rw-r--r--win/CS/libraries/caliburn/Caliburn.DynamicProxy.dllbin0 -> 22016 bytes
-rw-r--r--win/CS/libraries/caliburn/Caliburn.FluentValidation.dllbin0 -> 9728 bytes
-rw-r--r--win/CS/libraries/caliburn/Caliburn.MEF.dllbin0 -> 17920 bytes
-rw-r--r--win/CS/libraries/caliburn/Caliburn.PresentationFramework.dllbin0 -> 224768 bytes
-rw-r--r--win/CS/libraries/caliburn/Caliburn.ShellFramework.dllbin0 -> 45568 bytes
-rw-r--r--win/CS/libraries/caliburn/Caliburn.Windsor.dllbin0 -> 9728 bytes
-rw-r--r--win/CS/libraries/caliburn/Castle.Core.dllbin0 -> 293376 bytes
-rw-r--r--win/CS/libraries/caliburn/Castle.Windsor.dllbin0 -> 325632 bytes
-rw-r--r--win/CS/libraries/caliburn/Changes.txt166
-rw-r--r--win/CS/libraries/caliburn/Common.Logging.dllbin0 -> 28672 bytes
-rw-r--r--win/CS/libraries/caliburn/FluentValidation.dllbin0 -> 76800 bytes
-rw-r--r--win/CS/libraries/caliburn/License.txt21
-rw-r--r--win/CS/libraries/caliburn/Microsoft.Practices.Composite.Presentation.dllbin0 -> 62464 bytes
-rw-r--r--win/CS/libraries/caliburn/Microsoft.Practices.Composite.dllbin0 -> 76800 bytes
-rw-r--r--win/CS/libraries/caliburn/Readme.txt25
-rw-r--r--win/CS/libraries/caliburn/System.CoreEx.dllbin0 -> 28672 bytes
-rw-r--r--win/CS/libraries/caliburn/System.Interactive.dllbin0 -> 61952 bytes
-rw-r--r--win/CS/libraries/caliburn/System.Reactive.dllbin0 -> 321536 bytes
-rw-r--r--win/CS/libraries/caliburn/Thanks.txt20
290 files changed, 44150 insertions, 0 deletions
diff --git a/win/CS/Controls/AdvancedEncoderOpts.Designer.cs b/win/CS/Controls/AdvancedEncoderOpts.Designer.cs
new file mode 100644
index 000000000..4ee6d85cf
--- /dev/null
+++ b/win/CS/Controls/AdvancedEncoderOpts.Designer.cs
@@ -0,0 +1,100 @@
+/* x264Panel.Designer.cs $
+
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.Controls
+{
+ partial class AdvancedEncoderOpts
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ this.label43 = new System.Windows.Forms.Label();
+ this.advancedQuery = new System.Windows.Forms.RichTextBox();
+ this.ToolTip = new System.Windows.Forms.ToolTip(this.components);
+ this.label64 = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // label43
+ //
+ this.label43.AutoSize = true;
+ this.label43.BackColor = System.Drawing.Color.Transparent;
+ this.label43.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label43.Location = new System.Drawing.Point(13, 13);
+ this.label43.Name = "label43";
+ this.label43.Size = new System.Drawing.Size(63, 13);
+ this.label43.TabIndex = 49;
+ this.label43.Text = "Advanced";
+ //
+ // advancedQuery
+ //
+ this.advancedQuery.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.advancedQuery.Location = new System.Drawing.Point(16, 53);
+ this.advancedQuery.Name = "advancedQuery";
+ this.advancedQuery.Size = new System.Drawing.Size(688, 128);
+ this.advancedQuery.TabIndex = 80;
+ this.advancedQuery.Text = "";
+ //
+ // ToolTip
+ //
+ this.ToolTip.Active = false;
+ this.ToolTip.AutomaticDelay = 1000;
+ this.ToolTip.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info;
+ //
+ // label64
+ //
+ this.label64.AutoSize = true;
+ this.label64.Location = new System.Drawing.Point(13, 35);
+ this.label64.Name = "label64";
+ this.label64.Size = new System.Drawing.Size(163, 13);
+ this.label64.TabIndex = 81;
+ this.label64.Text = "Encoder advanced option string:";
+ //
+ // x264Panel
+ //
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+ this.BackColor = System.Drawing.Color.Transparent;
+ this.Controls.Add(this.label64);
+ this.Controls.Add(this.advancedQuery);
+ this.Controls.Add(this.label43);
+ this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Size = new System.Drawing.Size(720, 305);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ internal System.Windows.Forms.Label label43;
+ internal System.Windows.Forms.RichTextBox advancedQuery;
+ private System.Windows.Forms.ToolTip ToolTip;
+ internal System.Windows.Forms.Label label64;
+ }
+}
diff --git a/win/CS/Controls/AdvancedEncoderOpts.cs b/win/CS/Controls/AdvancedEncoderOpts.cs
new file mode 100644
index 000000000..8eb2e8ae7
--- /dev/null
+++ b/win/CS/Controls/AdvancedEncoderOpts.cs
@@ -0,0 +1,59 @@
+/* AdvancedEncoderOpts.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.Controls
+{
+ using System.Windows.Forms;
+
+ /// <summary>
+ /// The x264 Panel
+ /// </summary>
+ public partial class AdvancedEncoderOpts : UserControl
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="AdvancedEncoderOpts"/> class.
+ /// </summary>
+ public AdvancedEncoderOpts()
+ {
+ InitializeComponent();
+
+ if (Properties.Settings.Default.tooltipEnable)
+ ToolTip.Active = true;
+ }
+
+ /// <summary>
+ /// Gets or sets the X264 query string
+ /// </summary>
+ public string AdavancedQuery
+ {
+ get
+ {
+ return advancedQuery.Text;
+ }
+
+ set
+ {
+ advancedQuery.Text = value;
+ }
+ }
+
+ public bool IsDisabled
+ {
+ set
+ {
+ if (value)
+ {
+ this.advancedQuery.Enabled = false;
+ this.advancedQuery.Text = "Advanced encoder option passthrough is not currently supported for the encoder you have chosen.";
+ }
+ else
+ {
+ this.advancedQuery.Enabled = true;
+ this.advancedQuery.Text = string.Empty;
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/Controls/AdvancedEncoderOpts.resx b/win/CS/Controls/AdvancedEncoderOpts.resx
new file mode 100644
index 000000000..89a8b3473
--- /dev/null
+++ b/win/CS/Controls/AdvancedEncoderOpts.resx
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="ToolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+</root> \ No newline at end of file
diff --git a/win/CS/Controls/AudioPanel.Designer.cs b/win/CS/Controls/AudioPanel.Designer.cs
new file mode 100644
index 000000000..43e5ba8ec
--- /dev/null
+++ b/win/CS/Controls/AudioPanel.Designer.cs
@@ -0,0 +1,493 @@
+/* AudioPanel.Designer.cs $
+
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.Controls
+{
+ partial class AudioPanel
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ this.audioMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.audioList_moveup = new System.Windows.Forms.ToolStripMenuItem();
+ this.audioList_movedown = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+ this.audioList_remove = new System.Windows.Forms.ToolStripMenuItem();
+ this.btn_RemoveAudioTrack = new System.Windows.Forms.Button();
+ this.btn_addAudioTrack = new System.Windows.Forms.Button();
+ this.lbl_drc = new System.Windows.Forms.Label();
+ this.lbl_drcHeader = new System.Windows.Forms.Label();
+ this.tb_drc = new System.Windows.Forms.TrackBar();
+ this.label68 = new System.Windows.Forms.Label();
+ this.lbl_sampleRate = new System.Windows.Forms.Label();
+ this.lbl_bitrate = new System.Windows.Forms.Label();
+ this.label65 = new System.Windows.Forms.Label();
+ this.lbl_mixdown = new System.Windows.Forms.Label();
+ this.drp_audioEncoder = new System.Windows.Forms.ComboBox();
+ this.label27 = new System.Windows.Forms.Label();
+ this.drp_audioMix = new System.Windows.Forms.ComboBox();
+ this.drp_audioTrack = new System.Windows.Forms.ComboBox();
+ this.drp_audioBitrate = new System.Windows.Forms.ComboBox();
+ this.drp_audioSample = new System.Windows.Forms.ComboBox();
+ this.AudioTrackGroup = new System.Windows.Forms.GroupBox();
+ this.AudioMenuRowHeightHack = new System.Windows.Forms.ImageList(this.components);
+ this.audioList = new System.Windows.Forms.DataGridView();
+ this.Track = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.Source = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.AudioCodec = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.Mixdown = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.Samplerate = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.Bitrate = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.DRC = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.audioMenu.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.tb_drc)).BeginInit();
+ this.AudioTrackGroup.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.audioList)).BeginInit();
+ this.SuspendLayout();
+ //
+ // audioMenu
+ //
+ this.audioMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.audioList_moveup,
+ this.audioList_movedown,
+ this.toolStripSeparator2,
+ this.audioList_remove});
+ this.audioMenu.Name = "audioMenu";
+ this.audioMenu.Size = new System.Drawing.Size(139, 76);
+ //
+ // audioList_moveup
+ //
+ this.audioList_moveup.Name = "audioList_moveup";
+ this.audioList_moveup.Size = new System.Drawing.Size(138, 22);
+ this.audioList_moveup.Text = "Move Up";
+ this.audioList_moveup.Click += new System.EventHandler(this.audioList_moveup_Click);
+ //
+ // audioList_movedown
+ //
+ this.audioList_movedown.Name = "audioList_movedown";
+ this.audioList_movedown.Size = new System.Drawing.Size(138, 22);
+ this.audioList_movedown.Text = "Move Down";
+ this.audioList_movedown.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.audioList_movedown.Click += new System.EventHandler(this.audioList_movedown_Click);
+ //
+ // toolStripSeparator2
+ //
+ this.toolStripSeparator2.Name = "toolStripSeparator2";
+ this.toolStripSeparator2.Size = new System.Drawing.Size(135, 6);
+ //
+ // audioList_remove
+ //
+ this.audioList_remove.Name = "audioList_remove";
+ this.audioList_remove.Size = new System.Drawing.Size(138, 22);
+ this.audioList_remove.Text = "Remove";
+ this.audioList_remove.Click += new System.EventHandler(this.audioList_remove_Click);
+ //
+ // btn_RemoveAudioTrack
+ //
+ this.btn_RemoveAudioTrack.BackColor = System.Drawing.Color.Transparent;
+ this.btn_RemoveAudioTrack.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btn_RemoveAudioTrack.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_RemoveAudioTrack.Location = new System.Drawing.Point(99, 38);
+ this.btn_RemoveAudioTrack.Name = "btn_RemoveAudioTrack";
+ this.btn_RemoveAudioTrack.Size = new System.Drawing.Size(71, 23);
+ this.btn_RemoveAudioTrack.TabIndex = 64;
+ this.btn_RemoveAudioTrack.Text = "Remove";
+ this.btn_RemoveAudioTrack.UseVisualStyleBackColor = false;
+ this.btn_RemoveAudioTrack.Click += new System.EventHandler(this.btn_RemoveAudioTrack_Click);
+ //
+ // btn_addAudioTrack
+ //
+ this.btn_addAudioTrack.BackColor = System.Drawing.Color.Transparent;
+ this.btn_addAudioTrack.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btn_addAudioTrack.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_addAudioTrack.Location = new System.Drawing.Point(16, 38);
+ this.btn_addAudioTrack.Name = "btn_addAudioTrack";
+ this.btn_addAudioTrack.Size = new System.Drawing.Size(77, 23);
+ this.btn_addAudioTrack.TabIndex = 63;
+ this.btn_addAudioTrack.Text = "Add Track";
+ this.btn_addAudioTrack.UseVisualStyleBackColor = false;
+ this.btn_addAudioTrack.Click += new System.EventHandler(this.btn_addAudioTrack_Click);
+ //
+ // lbl_drc
+ //
+ this.lbl_drc.AutoSize = true;
+ this.lbl_drc.BackColor = System.Drawing.Color.Transparent;
+ this.lbl_drc.Location = new System.Drawing.Point(658, 37);
+ this.lbl_drc.Name = "lbl_drc";
+ this.lbl_drc.Size = new System.Drawing.Size(13, 13);
+ this.lbl_drc.TabIndex = 62;
+ this.lbl_drc.Text = "0";
+ //
+ // lbl_drcHeader
+ //
+ this.lbl_drcHeader.AutoSize = true;
+ this.lbl_drcHeader.BackColor = System.Drawing.Color.Transparent;
+ this.lbl_drcHeader.Location = new System.Drawing.Point(607, 17);
+ this.lbl_drcHeader.Name = "lbl_drcHeader";
+ this.lbl_drcHeader.Size = new System.Drawing.Size(28, 13);
+ this.lbl_drcHeader.TabIndex = 61;
+ this.lbl_drcHeader.Text = "DRC";
+ //
+ // tb_drc
+ //
+ this.tb_drc.BackColor = System.Drawing.SystemColors.Window;
+ this.tb_drc.LargeChange = 0;
+ this.tb_drc.Location = new System.Drawing.Point(598, 29);
+ this.tb_drc.Margin = new System.Windows.Forms.Padding(0);
+ this.tb_drc.Maximum = 31;
+ this.tb_drc.Name = "tb_drc";
+ this.tb_drc.Size = new System.Drawing.Size(57, 45);
+ this.tb_drc.TabIndex = 60;
+ this.tb_drc.TickFrequency = 10;
+ this.tb_drc.Scroll += new System.EventHandler(this.ControlChanged);
+ //
+ // label68
+ //
+ this.label68.AutoSize = true;
+ this.label68.BackColor = System.Drawing.Color.Transparent;
+ this.label68.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label68.Location = new System.Drawing.Point(13, 13);
+ this.label68.Name = "label68";
+ this.label68.Size = new System.Drawing.Size(80, 13);
+ this.label68.TabIndex = 49;
+ this.label68.Text = "Audio Tracks";
+ //
+ // lbl_sampleRate
+ //
+ this.lbl_sampleRate.AutoSize = true;
+ this.lbl_sampleRate.BackColor = System.Drawing.Color.Transparent;
+ this.lbl_sampleRate.Location = new System.Drawing.Point(463, 17);
+ this.lbl_sampleRate.Name = "lbl_sampleRate";
+ this.lbl_sampleRate.Size = new System.Drawing.Size(61, 13);
+ this.lbl_sampleRate.TabIndex = 57;
+ this.lbl_sampleRate.Text = "Samplerate";
+ //
+ // lbl_bitrate
+ //
+ this.lbl_bitrate.AutoSize = true;
+ this.lbl_bitrate.BackColor = System.Drawing.Color.Transparent;
+ this.lbl_bitrate.Location = new System.Drawing.Point(538, 17);
+ this.lbl_bitrate.Name = "lbl_bitrate";
+ this.lbl_bitrate.Size = new System.Drawing.Size(39, 13);
+ this.lbl_bitrate.TabIndex = 59;
+ this.lbl_bitrate.Text = "Bitrate";
+ //
+ // label65
+ //
+ this.label65.AutoSize = true;
+ this.label65.BackColor = System.Drawing.Color.Transparent;
+ this.label65.Location = new System.Drawing.Point(234, 17);
+ this.label65.Name = "label65";
+ this.label65.Size = new System.Drawing.Size(67, 13);
+ this.label65.TabIndex = 53;
+ this.label65.Text = "Audio Codec";
+ //
+ // lbl_mixdown
+ //
+ this.lbl_mixdown.AutoSize = true;
+ this.lbl_mixdown.BackColor = System.Drawing.Color.Transparent;
+ this.lbl_mixdown.Location = new System.Drawing.Point(368, 17);
+ this.lbl_mixdown.Name = "lbl_mixdown";
+ this.lbl_mixdown.Size = new System.Drawing.Size(49, 13);
+ this.lbl_mixdown.TabIndex = 55;
+ this.lbl_mixdown.Text = "Mixdown";
+ //
+ // drp_audioEncoder
+ //
+ this.drp_audioEncoder.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drp_audioEncoder.FormattingEnabled = true;
+ this.drp_audioEncoder.Items.AddRange(new object[] {
+ "AAC (faac)",
+ "MP3 (lame)",
+ "Vorbis (vorbis)",
+ "AC3 Passthru",
+ "AC3 (ffmpeg)",
+ "DTS Passthru"});
+ this.drp_audioEncoder.Location = new System.Drawing.Point(215, 34);
+ this.drp_audioEncoder.Name = "drp_audioEncoder";
+ this.drp_audioEncoder.Size = new System.Drawing.Size(111, 21);
+ this.drp_audioEncoder.TabIndex = 52;
+ this.drp_audioEncoder.SelectedIndexChanged += new System.EventHandler(this.ControlChanged);
+ //
+ // label27
+ //
+ this.label27.AutoSize = true;
+ this.label27.BackColor = System.Drawing.Color.Transparent;
+ this.label27.Location = new System.Drawing.Point(86, 17);
+ this.label27.Name = "label27";
+ this.label27.Size = new System.Drawing.Size(40, 13);
+ this.label27.TabIndex = 51;
+ this.label27.Text = "Source";
+ //
+ // drp_audioMix
+ //
+ this.drp_audioMix.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drp_audioMix.FormattingEnabled = true;
+ this.drp_audioMix.Items.AddRange(new object[] {
+ "Automatic",
+ "Mono",
+ "Stereo",
+ "Dolby Surround",
+ "Dolby Pro Logic II",
+ "6 Channel Discrete"});
+ this.drp_audioMix.Location = new System.Drawing.Point(332, 34);
+ this.drp_audioMix.Name = "drp_audioMix";
+ this.drp_audioMix.Size = new System.Drawing.Size(129, 21);
+ this.drp_audioMix.TabIndex = 54;
+ this.drp_audioMix.SelectedIndexChanged += new System.EventHandler(this.ControlChanged);
+ //
+ // drp_audioTrack
+ //
+ this.drp_audioTrack.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drp_audioTrack.FormattingEnabled = true;
+ this.drp_audioTrack.Items.AddRange(new object[] {
+ "Automatic"});
+ this.drp_audioTrack.Location = new System.Drawing.Point(15, 34);
+ this.drp_audioTrack.Name = "drp_audioTrack";
+ this.drp_audioTrack.Size = new System.Drawing.Size(194, 21);
+ this.drp_audioTrack.TabIndex = 50;
+ this.drp_audioTrack.SelectedIndexChanged += new System.EventHandler(this.ControlChanged);
+ //
+ // drp_audioBitrate
+ //
+ this.drp_audioBitrate.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drp_audioBitrate.FormattingEnabled = true;
+ this.drp_audioBitrate.Items.AddRange(new object[] {
+ "32",
+ "40",
+ "48",
+ "56",
+ "64",
+ "80",
+ "96",
+ "112",
+ "128",
+ "160"});
+ this.drp_audioBitrate.Location = new System.Drawing.Point(525, 34);
+ this.drp_audioBitrate.Name = "drp_audioBitrate";
+ this.drp_audioBitrate.Size = new System.Drawing.Size(70, 21);
+ this.drp_audioBitrate.TabIndex = 58;
+ this.drp_audioBitrate.SelectedIndexChanged += new System.EventHandler(this.ControlChanged);
+ //
+ // drp_audioSample
+ //
+ this.drp_audioSample.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drp_audioSample.FormattingEnabled = true;
+ this.drp_audioSample.Items.AddRange(new object[] {
+ "Auto",
+ "48",
+ "44.1",
+ "32",
+ "24",
+ "22.05"});
+ this.drp_audioSample.Location = new System.Drawing.Point(467, 34);
+ this.drp_audioSample.Name = "drp_audioSample";
+ this.drp_audioSample.Size = new System.Drawing.Size(55, 21);
+ this.drp_audioSample.TabIndex = 56;
+ this.drp_audioSample.SelectedIndexChanged += new System.EventHandler(this.ControlChanged);
+ //
+ // AudioTrackGroup
+ //
+ this.AudioTrackGroup.BackColor = System.Drawing.Color.Transparent;
+ this.AudioTrackGroup.Controls.Add(this.drp_audioTrack);
+ this.AudioTrackGroup.Controls.Add(this.drp_audioSample);
+ this.AudioTrackGroup.Controls.Add(this.drp_audioBitrate);
+ this.AudioTrackGroup.Controls.Add(this.drp_audioMix);
+ this.AudioTrackGroup.Controls.Add(this.lbl_drc);
+ this.AudioTrackGroup.Controls.Add(this.label27);
+ this.AudioTrackGroup.Controls.Add(this.lbl_drcHeader);
+ this.AudioTrackGroup.Controls.Add(this.drp_audioEncoder);
+ this.AudioTrackGroup.Controls.Add(this.tb_drc);
+ this.AudioTrackGroup.Controls.Add(this.lbl_mixdown);
+ this.AudioTrackGroup.Controls.Add(this.label65);
+ this.AudioTrackGroup.Controls.Add(this.lbl_sampleRate);
+ this.AudioTrackGroup.Controls.Add(this.lbl_bitrate);
+ this.AudioTrackGroup.Location = new System.Drawing.Point(16, 67);
+ this.AudioTrackGroup.Name = "AudioTrackGroup";
+ this.AudioTrackGroup.Size = new System.Drawing.Size(685, 77);
+ this.AudioTrackGroup.TabIndex = 66;
+ this.AudioTrackGroup.TabStop = false;
+ this.AudioTrackGroup.Text = "Selected Track: New Track";
+ //
+ // AudioMenuRowHeightHack
+ //
+ this.AudioMenuRowHeightHack.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+ this.AudioMenuRowHeightHack.ImageSize = new System.Drawing.Size(1, 18);
+ this.AudioMenuRowHeightHack.TransparentColor = System.Drawing.Color.Transparent;
+ //
+ // audioList
+ //
+ this.audioList.AllowUserToAddRows = false;
+ this.audioList.AllowUserToResizeColumns = false;
+ this.audioList.AllowUserToResizeRows = false;
+ this.audioList.BackgroundColor = System.Drawing.Color.White;
+ this.audioList.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None;
+ this.audioList.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
+ this.audioList.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+ this.Track,
+ this.Source,
+ this.AudioCodec,
+ this.Mixdown,
+ this.Samplerate,
+ this.Bitrate,
+ this.DRC});
+ this.audioList.ContextMenuStrip = this.audioMenu;
+ this.audioList.GridColor = System.Drawing.Color.White;
+ this.audioList.Location = new System.Drawing.Point(16, 150);
+ this.audioList.Name = "audioList";
+ this.audioList.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None;
+ this.audioList.RowHeadersVisible = false;
+ this.audioList.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
+ this.audioList.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
+ this.audioList.ShowCellErrors = false;
+ this.audioList.ShowCellToolTips = false;
+ this.audioList.ShowEditingIcon = false;
+ this.audioList.ShowRowErrors = false;
+ this.audioList.Size = new System.Drawing.Size(685, 140);
+ this.audioList.TabIndex = 67;
+ this.audioList.SelectionChanged += new System.EventHandler(this.audioList_SelectionChanged);
+ //
+ // Track
+ //
+ this.Track.FillWeight = 304.2808F;
+ this.Track.HeaderText = "Track";
+ this.Track.Name = "Track";
+ this.Track.ReadOnly = true;
+ this.Track.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
+ this.Track.Width = 50;
+ //
+ // Source
+ //
+ this.Source.FillWeight = 49.69727F;
+ this.Source.HeaderText = "Source";
+ this.Source.Name = "Source";
+ this.Source.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
+ this.Source.Width = 150;
+ //
+ // AudioCodec
+ //
+ this.AudioCodec.HeaderText = "Audio Codec";
+ this.AudioCodec.Name = "AudioCodec";
+ this.AudioCodec.ReadOnly = true;
+ this.AudioCodec.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
+ //
+ // Mixdown
+ //
+ this.Mixdown.FillWeight = 49.69727F;
+ this.Mixdown.HeaderText = "Mixdown";
+ this.Mixdown.Name = "Mixdown";
+ this.Mixdown.ReadOnly = true;
+ this.Mixdown.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
+ this.Mixdown.Width = 150;
+ //
+ // Samplerate
+ //
+ this.Samplerate.FillWeight = 49.69727F;
+ this.Samplerate.HeaderText = "Samplerate";
+ this.Samplerate.Name = "Samplerate";
+ this.Samplerate.ReadOnly = true;
+ this.Samplerate.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
+ this.Samplerate.Width = 75;
+ //
+ // Bitrate
+ //
+ this.Bitrate.FillWeight = 49.69727F;
+ this.Bitrate.HeaderText = "Bitrate";
+ this.Bitrate.Name = "Bitrate";
+ this.Bitrate.ReadOnly = true;
+ this.Bitrate.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
+ this.Bitrate.Width = 75;
+ //
+ // DRC
+ //
+ this.DRC.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
+ this.DRC.FillWeight = 96.36334F;
+ this.DRC.HeaderText = "DRC";
+ this.DRC.Name = "DRC";
+ this.DRC.ReadOnly = true;
+ this.DRC.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
+ //
+ // AudioPanel
+ //
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+ this.BackColor = System.Drawing.Color.Transparent;
+ this.Controls.Add(this.audioList);
+ this.Controls.Add(this.label68);
+ this.Controls.Add(this.btn_addAudioTrack);
+ this.Controls.Add(this.AudioTrackGroup);
+ this.Controls.Add(this.btn_RemoveAudioTrack);
+ this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Name = "AudioPanel";
+ this.Size = new System.Drawing.Size(720, 310);
+ this.audioMenu.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.tb_drc)).EndInit();
+ this.AudioTrackGroup.ResumeLayout(false);
+ this.AudioTrackGroup.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.audioList)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Button btn_RemoveAudioTrack;
+ private System.Windows.Forms.Button btn_addAudioTrack;
+ internal System.Windows.Forms.Label lbl_drc;
+ internal System.Windows.Forms.Label lbl_drcHeader;
+ internal System.Windows.Forms.TrackBar tb_drc;
+ internal System.Windows.Forms.Label label68;
+ internal System.Windows.Forms.Label lbl_sampleRate;
+ internal System.Windows.Forms.Label lbl_bitrate;
+ internal System.Windows.Forms.Label label65;
+ internal System.Windows.Forms.Label lbl_mixdown;
+ internal System.Windows.Forms.ComboBox drp_audioEncoder;
+ internal System.Windows.Forms.Label label27;
+ internal System.Windows.Forms.ComboBox drp_audioMix;
+ internal System.Windows.Forms.ComboBox drp_audioTrack;
+ internal System.Windows.Forms.ComboBox drp_audioSample;
+ private System.Windows.Forms.GroupBox AudioTrackGroup;
+ private System.Windows.Forms.ImageList AudioMenuRowHeightHack;
+ private System.Windows.Forms.ContextMenuStrip audioMenu;
+ private System.Windows.Forms.ToolStripMenuItem audioList_moveup;
+ private System.Windows.Forms.ToolStripMenuItem audioList_movedown;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+ private System.Windows.Forms.ToolStripMenuItem audioList_remove;
+ internal System.Windows.Forms.ComboBox drp_audioBitrate;
+ private System.Windows.Forms.DataGridView audioList;
+ private System.Windows.Forms.DataGridViewTextBoxColumn Track;
+ private System.Windows.Forms.DataGridViewTextBoxColumn Source;
+ private System.Windows.Forms.DataGridViewTextBoxColumn AudioCodec;
+ private System.Windows.Forms.DataGridViewTextBoxColumn Mixdown;
+ private System.Windows.Forms.DataGridViewTextBoxColumn Samplerate;
+ private System.Windows.Forms.DataGridViewTextBoxColumn Bitrate;
+ private System.Windows.Forms.DataGridViewTextBoxColumn DRC;
+ }
+}
diff --git a/win/CS/Controls/AudioPanel.cs b/win/CS/Controls/AudioPanel.cs
new file mode 100644
index 000000000..6aa3fbd3e
--- /dev/null
+++ b/win/CS/Controls/AudioPanel.cs
@@ -0,0 +1,704 @@
+/* AudioPanel.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.Controls
+{
+ using System;
+ using System.Collections.Generic;
+ using System.Globalization;
+ using System.Linq;
+ using System.Windows.Forms;
+
+ using HandBrake.ApplicationServices.Model;
+ using HandBrake.ApplicationServices.Parsing;
+ using HandBrake.ApplicationServices.Utilities;
+
+ using AudioTrack = HandBrake.ApplicationServices.Model.Encoding.AudioTrack;
+
+ /// <summary>
+ /// The AudioPanel Control
+ /// </summary>
+ public partial class AudioPanel : UserControl
+ {
+ private static readonly CultureInfo Culture = new CultureInfo("en-US", false);
+ private const string AC3Passthru = "AC3 Passthru";
+ private const string DTSPassthru = "DTS Passthru";
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="AudioPanel"/> class.
+ /// Create a new instance of the Audio Panel
+ /// </summary>
+ public AudioPanel()
+ {
+ InitializeComponent();
+ drp_audioMix.SelectedItem = "Dolby Pro Logic II";
+ drp_audioSample.SelectedIndex = 1;
+ }
+
+ /// <summary>
+ /// The audio list has changed
+ /// </summary>
+ public event EventHandler AudioListChanged;
+
+ #region Public Methods
+ /// <summary>
+ /// Get the audio panel
+ /// </summary>
+ /// <returns>A listview containing the audio tracks</returns>
+ public DataGridView GetAudioPanel()
+ {
+ return audioList;
+ }
+
+ /// <summary>
+ /// Set the File Container. This funciton is used to limit the available options for each file container.
+ /// </summary>
+ /// <param name="path">
+ /// the file path
+ /// </param>
+ public void SetContainer(string path)
+ {
+ string oldval = drp_audioEncoder.Text;
+
+ drp_audioEncoder.Items.Clear();
+ drp_audioEncoder.Items.Add("AAC (faac)");
+ drp_audioEncoder.Items.Add("MP3 (lame)");
+ drp_audioEncoder.Items.Add(AC3Passthru);
+ drp_audioEncoder.Items.Add("AC3 (ffmpeg)");
+
+ if (path.Contains("MKV"))
+ {
+ drp_audioEncoder.Items.Add(DTSPassthru);
+ drp_audioEncoder.Items.Add("Vorbis (vorbis)");
+ }
+
+ if (!drp_audioEncoder.Text.Contains(oldval))
+ drp_audioEncoder.SelectedIndex = 0;
+ else
+ drp_audioEncoder.SelectedItem = oldval;
+
+ // Make sure the table is updated with new audio codecs
+ // Defaults to AAC encoding.
+ foreach (DataGridViewRow row in audioList.Rows)
+ {
+ if (!drp_audioEncoder.Items.Contains(row.Cells[2].Value))
+ row.Cells[2].Value = drp_audioEncoder.Items[0].ToString();
+ }
+ }
+
+ /// <summary>
+ /// Checks if the settings used required the .m4v (rather than .mp4) extension
+ /// </summary>
+ /// <returns>True if m4v is required</returns>
+ public bool RequiresM4V()
+ {
+ return this.audioList.Rows.Cast<DataGridViewRow>().Any(row => row.Cells[2].Value.ToString().Contains("AC3"));
+ }
+
+ /// <summary>
+ /// Load an arraylist of AudioTrack items into the list.
+ /// </summary>
+ /// <param name="audioTracks">List of audio tracks</param>
+ public void LoadTracks(List<AudioTrack> audioTracks)
+ {
+ ClearAudioList();
+
+ if (audioTracks == null)
+ return;
+
+ foreach (AudioTrack track in audioTracks)
+ {
+ DataGridViewRow newTrack = new DataGridViewRow();
+ newTrack.CreateCells(audioList);
+ newTrack.Cells[0].Value = GetNewID().ToString();
+ newTrack.Cells[1].Value = "Automatic";
+ newTrack.Cells[2].Value = track.Encoder;
+ newTrack.Cells[3].Value = track.MixDown;
+ newTrack.Cells[4].Value = track.Encoder.Contains(AC3Passthru) || track.Encoder.Contains(DTSPassthru) ? "Auto" : track.SampleRate;
+ newTrack.Cells[5].Value = track.Encoder.Contains(AC3Passthru) || track.Encoder.Contains(DTSPassthru) ? "Auto" : track.Bitrate;
+ newTrack.Cells[6].Value = track.Encoder.Contains(AC3Passthru) || track.Encoder.Contains(DTSPassthru) ? string.Empty : track.DRC;
+ AddTrackForPreset(newTrack);
+ }
+
+ this.AutomaticTrackSelection();
+ }
+
+ /// <summary>
+ /// Set the Track list dropdown from the parsed title captured during the scan
+ /// </summary>
+ /// <param name="selectedTitle">The selected title</param>
+ /// <param name="preset">A preset</param>
+ public void SetTrackListFromPreset(Title selectedTitle, Preset preset)
+ {
+ if (selectedTitle.AudioTracks.Count == 0)
+ {
+ audioList.Rows.Clear();
+ drp_audioTrack.Items.Clear();
+ drp_audioTrack.Items.Add("None Found");
+ drp_audioTrack.SelectedIndex = 0;
+ return;
+ }
+
+ // Setup the Audio track source dropdown with the new audio tracks.
+ drp_audioTrack.Items.Clear();
+ drp_audioTrack.Items.AddRange(selectedTitle.AudioTracks.ToArray());
+
+ // Add any tracks the preset has, if there is a preset and no audio tracks in the list currently
+ if (audioList.Rows.Count == 0 && preset != null)
+ {
+ EncodeTask parsed = QueryParserUtility.Parse(preset.Query);
+ foreach (AudioTrack audioTrack in parsed.AudioTracks)
+ {
+ DataGridViewRow newTrack = new DataGridViewRow();
+ newTrack.CreateCells(audioList);
+ newTrack.Cells[0].Value = GetNewID().ToString();
+ newTrack.Cells[1].Value = (audioTrack.Track);
+ newTrack.Cells[2].Value = (audioTrack.Encoder);
+ newTrack.Cells[3].Value = (audioTrack.MixDown);
+ newTrack.Cells[4].Value = (audioTrack.SampleRate);
+ newTrack.Cells[5].Value = (audioTrack.Bitrate);
+ newTrack.Cells[6].Value = (audioTrack.DRC);
+ audioList.Rows.Add(newTrack);
+ }
+ }
+
+ this.AutomaticTrackSelection();
+ }
+
+ #endregion
+
+ #region Control and ListView
+
+ /// <summary>
+ /// one of the controls has changed. Event handler
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void ControlChanged(object sender, EventArgs e)
+ {
+ Control ctl = (Control)sender;
+
+ switch (ctl.Name)
+ {
+ case "drp_audioTrack":
+ if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)
+ {
+ audioList.SelectedRows[0].Cells[1].Value = drp_audioTrack.Text;
+
+ // If the track isn't AC3, and the encoder is, change it.
+ if (audioList.SelectedRows[0].Cells[2].Value.ToString().Contains(AC3Passthru) && !audioList.SelectedRows[0].Cells[1].Value.ToString().Contains("(AC3)"))
+ {
+ // Switch to AAC
+ drp_audioEncoder.SelectedIndex = 0;
+ }
+
+ // If the track isn't DTS, and the encoder is, change it.
+ if (audioList.SelectedRows[0].Cells[2].Value.ToString().Contains(DTSPassthru) && !audioList.SelectedRows[0].Cells[1].Value.ToString().Contains("DTS"))
+ {
+ // Switch to AAC
+ drp_audioEncoder.SelectedIndex = 0;
+ }
+ }
+ break;
+ case "drp_audioEncoder":
+ SetMixDown();
+ SetBitrate();
+
+ // Configure the widgets with values
+ if (drp_audioEncoder.Text.Contains(AC3Passthru) || drp_audioEncoder.Text.Contains(DTSPassthru))
+ {
+ drp_audioMix.Enabled = drp_audioBitrate.Enabled = drp_audioSample.Enabled = tb_drc.Enabled = false;
+ lbl_bitrate.Enabled = lbl_drc.Enabled = lbl_drcHeader.Enabled = lbl_mixdown.Enabled = lbl_sampleRate.Enabled = false;
+ }
+ else
+ {
+ drp_audioMix.Enabled = drp_audioBitrate.Enabled = drp_audioSample.Enabled = tb_drc.Enabled = true;
+ lbl_bitrate.Enabled = lbl_drc.Enabled = lbl_drcHeader.Enabled = lbl_mixdown.Enabled = lbl_sampleRate.Enabled = true;
+ }
+
+ // Update an item in the Audio list if required.
+ if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)
+ audioList.SelectedRows[0].Cells[2].Value = drp_audioEncoder.Text;
+ break;
+ case "drp_audioMix":
+ SetBitrate();
+
+ if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)
+ audioList.SelectedRows[0].Cells[3].Value = drp_audioMix.Text;
+ break;
+ case "drp_audioSample":
+ if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)
+ audioList.SelectedRows[0].Cells[4].Value = drp_audioSample.Text;
+ break;
+ case "drp_audioBitrate":
+ // Update an item in the Audio list if required.
+ if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)
+ audioList.SelectedRows[0].Cells[5].Value = drp_audioBitrate.Text;
+ break;
+ case "tb_drc":
+ double value;
+ if (tb_drc.Value == 0) value = 0;
+ else
+ value = ((tb_drc.Value - 1) / 10.0) + 1;
+
+ lbl_drc.Text = value.ToString();
+
+ // Update an item in the Audio list if required.
+ if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)
+ {
+ audioList.SelectedRows[0].Cells[6].Value = value.ToString();
+ audioList.Select();
+ }
+ break;
+ }
+
+ audioList.Select();
+ }
+
+ /// <summary>
+ /// The Audio List selected index changed event handler
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void audioList_SelectionChanged(object sender, EventArgs e)
+ {
+ // Set the dropdown controls based on the selected item in the Audio List.
+ if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)
+ {
+ drp_audioTrack.SelectedItem = audioList.SelectedRows[0].Cells[1].Value;
+ drp_audioEncoder.SelectedItem = audioList.SelectedRows[0].Cells[2].Value;
+ drp_audioMix.SelectedItem = audioList.SelectedRows[0].Cells[3].Value;
+ drp_audioSample.SelectedItem = audioList.SelectedRows[0].Cells[4].Value;
+ drp_audioBitrate.SelectedItem = audioList.SelectedRows[0].Cells[5].Value;
+ double drcValue;
+ int drcCalculated;
+ double.TryParse(audioList.SelectedRows[0].Cells[6].Value.ToString(), out drcValue);
+ if (drcValue != 0)
+ drcValue = ((drcValue * 10) + 1) - 10;
+ int.TryParse(drcValue.ToString(Culture), out drcCalculated);
+ tb_drc.Value = drcCalculated;
+ lbl_drc.Text = audioList.SelectedRows[0].Cells[6].Value.ToString();
+
+ AudioTrackGroup.Text = "Selected Track: " + audioList.SelectedRows[0].Cells[0].Value;
+ }
+ else
+ AudioTrackGroup.Text = "Selected Track: None (Click \"Add Track\" to add)";
+ }
+
+ #endregion
+
+ #region Track Controls
+
+ /// <summary>
+ /// The Add Audio Track button event handler
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void btn_addAudioTrack_Click(object sender, EventArgs e)
+ {
+ if (drp_audioTrack.Text == "None Found")
+ {
+ MessageBox.Show(
+ "Your source appears to have no audio tracks that HandBrake supports.",
+ "Warning",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Warning);
+ return;
+ }
+
+ double value = 0;
+ if (tb_drc.Value != 0)
+ value = ((tb_drc.Value - 1) / 10.0) + 1;
+
+ // Create a new row for the Audio list based on the currently selected items in the dropdown.
+ DataGridViewRow newTrack = new DataGridViewRow();
+ newTrack.CreateCells(audioList);
+ newTrack.Cells[0].Value = GetNewID().ToString();
+ newTrack.Cells[1].Value = drp_audioTrack.Text;
+ newTrack.Cells[2].Value = drp_audioEncoder.Text;
+ newTrack.Cells[3].Value = drp_audioMix.Text;
+ newTrack.Cells[4].Value = drp_audioSample.Text;
+ newTrack.Cells[5].Value = drp_audioBitrate.Text;
+ newTrack.Cells[6].Value = value.ToString();
+ audioList.Rows.Add(newTrack);
+
+ // The Audio List has changed to raise the event.
+ if (this.AudioListChanged != null)
+ this.AudioListChanged(this, new EventArgs());
+
+ // Select the newly added track and select the control
+ audioList.ClearSelection();
+ audioList.Rows[audioList.Rows.Count - 1].Selected = true;
+ audioList.Select();
+ }
+
+ /// <summary>
+ /// The Remove Track button event handler
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)
+ {
+ RemoveTrack();
+ }
+
+ #endregion
+
+ #region Audio List Menu
+
+ /// <summary>
+ /// The Audio List Move Up menu item
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void audioList_moveup_Click(object sender, EventArgs e)
+ {
+ MoveTrack(true);
+ }
+
+ /// <summary>
+ /// The audio list move down menu item
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void audioList_movedown_Click(object sender, EventArgs e)
+ {
+ MoveTrack(false);
+ }
+
+ /// <summary>
+ /// The audio list remove menu item
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void audioList_remove_Click(object sender, EventArgs e)
+ {
+ RemoveTrack();
+ }
+
+ #endregion
+
+ #region Private Functions
+
+
+ private void AutomaticTrackSelection()
+ {
+ // Handle Native Language and "Dub Foreign language audio" and "Use Foreign language audio and Subtitles" Options
+ if (Properties.Settings.Default.NativeLanguage == "Any")
+ {
+ drp_audioTrack.SelectedIndex = 0;
+ foreach (DataGridViewRow item in audioList.Rows)
+ {
+ if (this.drp_audioTrack.SelectedItem != null)
+ {
+ item.Cells[1].Value = this.drp_audioTrack.SelectedItem.ToString();
+ }
+ }
+ }
+ else
+ {
+ int mode = Properties.Settings.Default.DubMode;
+ switch (mode)
+ {
+ case 1:
+ case 3:
+ // Dub Foreign Language Audio
+ // Select the prefered language audio, or the first track if it doesn't exist.
+ int i = 0;
+ foreach (object item in drp_audioTrack.Items)
+ {
+ if (item.ToString().Contains(Properties.Settings.Default.NativeLanguage))
+ {
+ drp_audioTrack.SelectedIndex = i;
+ break;
+ }
+
+ i++;
+ }
+
+ if (drp_audioTrack.SelectedItem != null)
+ foreach (DataGridViewRow item in audioList.Rows)
+ item.Cells[1].Value = drp_audioTrack.SelectedItem.ToString();
+ else
+ {
+ drp_audioTrack.SelectedIndex = 0;
+ if (drp_audioTrack.SelectedItem != null)
+ foreach (DataGridViewRow item in audioList.Rows)
+ item.Cells[1].Value = drp_audioTrack.SelectedItem.ToString();
+ }
+
+ break;
+ case 2:
+ default:
+ // Select the first track which is hopefully the default and foreign track.
+ drp_audioTrack.SelectedIndex = 0;
+
+ if (drp_audioTrack.SelectedItem != null)
+ foreach (DataGridViewRow item in audioList.Rows)
+ item.Cells[1].Value = drp_audioTrack.SelectedItem.ToString();
+ break;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Add track for preset
+ /// </summary>
+ /// <param name="item">
+ /// The item.
+ /// </param>
+ private void AddTrackForPreset(DataGridViewRow item)
+ {
+ audioList.Rows.Add(item);
+ if (this.AudioListChanged != null)
+ this.AudioListChanged(this, new EventArgs());
+ }
+
+ /// <summary>
+ /// Clear the audio list
+ /// </summary>
+ private void ClearAudioList()
+ {
+ audioList.Rows.Clear();
+ if (this.AudioListChanged != null)
+ this.AudioListChanged(this, new EventArgs());
+ }
+
+ /// <summary>
+ /// Get a new ID for the next audio track
+ /// </summary>
+ /// <returns>
+ /// an int
+ /// </returns>
+ private int GetNewID()
+ {
+ return audioList.Rows.Count + 1;
+ }
+
+ /// <summary>
+ /// Remove an audio track from the list
+ /// </summary>
+ private void RemoveTrack()
+ {
+ // Remove the Item and reselect the control if the following conditions are met.
+ if (audioList.SelectedRows.Count != 0)
+ {
+ // The Audio List is about to change so raise the event.
+ if (this.AudioListChanged != null)
+ this.AudioListChanged(this, new EventArgs());
+
+ // Record the current selected index.
+ int currentPosition = audioList.SelectedRows[0].Index;
+
+ audioList.Rows.Remove(audioList.SelectedRows[0]);
+
+ // Now reslect the correct item and give focus to the audio list.
+ if (audioList.Rows.Count != 0)
+ {
+ audioList.ClearSelection();
+ if (currentPosition <= (audioList.Rows.Count - 1))
+ audioList.Rows[currentPosition].Selected = true;
+ else if (currentPosition > (audioList.Rows.Count - 1))
+ audioList.Rows[audioList.Rows.Count - 1].Selected = true;
+
+ audioList.Select();
+ }
+ // Regenerate the ID numers
+ ReGenerateListIDs();
+ }
+ }
+
+ /// <summary>
+ /// Move an audio track up or down the audio list
+ /// </summary>
+ /// <param name="up">
+ /// The up.
+ /// </param>
+ private void MoveTrack(bool up)
+ {
+ if (audioList.SelectedRows.Count == 0) return;
+
+ DataGridViewRow item = audioList.SelectedRows[0];
+ int index = item.Index;
+
+ if (up) index--;
+ else index++;
+
+ if (index < audioList.Rows.Count || (audioList.Rows.Count > index && index >= 0))
+ {
+ audioList.Rows.Remove(item);
+ audioList.Rows.Insert(index, item);
+ audioList.ClearSelection();
+ item.Selected = true;
+ }
+ }
+
+ /// <summary>
+ /// Regenerate all the audio track id's on the audio list
+ /// </summary>
+ private void ReGenerateListIDs()
+ {
+ int i = 1;
+ foreach (DataGridViewRow item in audioList.Rows)
+ {
+ item.Cells[0].Value = i.ToString();
+ i++;
+ }
+ }
+
+ /// <summary>
+ /// Set the bitrate dropdown
+ /// </summary>
+ private void SetBitrate()
+ {
+ int max = 0;
+ string defaultRate = "160";
+
+ // Remove defaults
+ drp_audioBitrate.Items.Remove("Auto");
+ drp_audioBitrate.Items.Remove("192");
+ drp_audioBitrate.Items.Remove("224");
+ drp_audioBitrate.Items.Remove("256");
+ drp_audioBitrate.Items.Remove("320");
+ drp_audioBitrate.Items.Remove("384");
+ drp_audioBitrate.Items.Remove("448");
+ drp_audioBitrate.Items.Remove("640");
+ drp_audioBitrate.Items.Remove("768");
+
+ // Find Max and Defaults based on encoders
+ switch (drp_audioEncoder.Text)
+ {
+ case "AAC (faac)":
+ max = drp_audioMix.Text.Contains("6 Channel") ? 768 : 320;
+ defaultRate = "160";
+ break;
+ case "MP3 (lame)":
+ max = 320;
+ defaultRate = "160";
+ break;
+ case "Vorbis (vorbis)":
+ defaultRate = "160";
+ max = 384;
+ break;
+ case "AC3 (ffmpeg)":
+ defaultRate = "640";
+ max = 640;
+ break;
+ case AC3Passthru:
+ drp_audioBitrate.Items.Add("Auto");
+ defaultRate = "Auto";
+ drp_audioSample.SelectedItem = "Auto";
+ break;
+ case DTSPassthru:
+ drp_audioBitrate.Items.Add("Auto");
+ defaultRate = "Auto";
+ drp_audioSample.SelectedItem = "Auto";
+ break;
+ }
+
+ // Re-add appropiate options
+ if (max > 160)
+ {
+ drp_audioBitrate.Items.Add("192");
+ drp_audioBitrate.Items.Add("224");
+ drp_audioBitrate.Items.Add("256");
+ drp_audioBitrate.Items.Add("320");
+ }
+
+ if (max > 320)
+ {
+ drp_audioBitrate.Items.Add("384");
+ }
+
+ if (max >= 640)
+ {
+ drp_audioBitrate.Items.Add("448");
+ drp_audioBitrate.Items.Add("640");
+ }
+
+ if (max == 768)
+ {
+ drp_audioBitrate.Items.Add("768");
+ }
+
+ // Set the default bit-rate
+ drp_audioBitrate.SelectedItem = defaultRate;
+ }
+
+ /// <summary>
+ /// Set the mixdown dropdown
+ /// </summary>
+ private void SetMixDown()
+ {
+ drp_audioMix.Items.Clear();
+ drp_audioMix.Items.Add("Mono");
+ drp_audioMix.Items.Add("Stereo");
+ drp_audioMix.Items.Add("Dolby Surround");
+ drp_audioMix.Items.Add("Dolby Pro Logic II");
+ drp_audioMix.Items.Add("6 Channel Discrete");
+ drp_audioMix.Items.Add(AC3Passthru);
+ drp_audioMix.Items.Add(DTSPassthru);
+
+ drp_audioMix.SelectedItem = "Dolby Pro Logic II";
+
+ switch (drp_audioEncoder.Text)
+ {
+ case "AAC (faac)":
+ drp_audioMix.Items.Remove(AC3Passthru);
+ drp_audioMix.Items.Remove(DTSPassthru);
+ break;
+ case "MP3 (lame)":
+ drp_audioMix.Items.Remove("6 Channel Discrete");
+ drp_audioMix.Items.Remove(AC3Passthru);
+ drp_audioMix.Items.Remove(DTSPassthru);
+ break;
+ case "Vorbis (vorbis)":
+ drp_audioMix.Items.Remove(AC3Passthru);
+ drp_audioMix.Items.Remove(DTSPassthru);
+ break;
+ case "AC3 (ffmpeg)":
+ drp_audioMix.Items.Remove(AC3Passthru);
+ drp_audioMix.Items.Remove(DTSPassthru);
+ break;
+ case "AC3 Passthru":
+ drp_audioMix.SelectedItem = AC3Passthru;
+ break;
+ case "DTS Passthru":
+ drp_audioMix.SelectedItem = DTSPassthru;
+ break;
+ }
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/win/CS/Controls/AudioPanel.resx b/win/CS/Controls/AudioPanel.resx
new file mode 100644
index 000000000..ac50d9273
--- /dev/null
+++ b/win/CS/Controls/AudioPanel.resx
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="audioMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>216, 16</value>
+ </metadata>
+ <metadata name="AudioMenuRowHeightHack.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>35, 17</value>
+ </metadata>
+ <metadata name="Track.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <value>True</value>
+ </metadata>
+ <metadata name="Source.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <value>True</value>
+ </metadata>
+ <metadata name="AudioCodec.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <value>True</value>
+ </metadata>
+ <metadata name="Mixdown.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <value>True</value>
+ </metadata>
+ <metadata name="Samplerate.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <value>True</value>
+ </metadata>
+ <metadata name="Bitrate.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <value>True</value>
+ </metadata>
+ <metadata name="DRC.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <value>True</value>
+ </metadata>
+</root> \ No newline at end of file
diff --git a/win/CS/Controls/Filters.Designer.cs b/win/CS/Controls/Filters.Designer.cs
new file mode 100644
index 000000000..33531caa1
--- /dev/null
+++ b/win/CS/Controls/Filters.Designer.cs
@@ -0,0 +1,340 @@
+namespace Handbrake.Controls
+{
+ partial class Filters
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.text_customDT = new System.Windows.Forms.TextBox();
+ this.label18 = new System.Windows.Forms.Label();
+ this.drop_detelecine = new System.Windows.Forms.ComboBox();
+ this.text_customDC = new System.Windows.Forms.TextBox();
+ this.label1 = new System.Windows.Forms.Label();
+ this.drop_decomb = new System.Windows.Forms.ComboBox();
+ this.text_customDI = new System.Windows.Forms.TextBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.drop_deinterlace = new System.Windows.Forms.ComboBox();
+ this.text_customDN = new System.Windows.Forms.TextBox();
+ this.label3 = new System.Windows.Forms.Label();
+ this.drop_denoise = new System.Windows.Forms.ComboBox();
+ this.slider_deblock = new System.Windows.Forms.TrackBar();
+ this.check_grayscale = new System.Windows.Forms.CheckBox();
+ this.label8 = new System.Windows.Forms.Label();
+ this.lbl_deblockVal = new System.Windows.Forms.Label();
+ this.label68 = new System.Windows.Forms.Label();
+ this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
+ ((System.ComponentModel.ISupportInitialize)(this.slider_deblock)).BeginInit();
+ this.tableLayoutPanel1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // text_customDT
+ //
+ this.text_customDT.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.text_customDT.Location = new System.Drawing.Point(251, 3);
+ this.text_customDT.Name = "text_customDT";
+ this.text_customDT.Size = new System.Drawing.Size(115, 21);
+ this.text_customDT.TabIndex = 47;
+ this.text_customDT.Visible = false;
+ //
+ // label18
+ //
+ this.label18.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.label18.AutoSize = true;
+ this.label18.BackColor = System.Drawing.Color.Transparent;
+ this.label18.Location = new System.Drawing.Point(0, 7);
+ this.label18.Margin = new System.Windows.Forms.Padding(0, 3, 3, 3);
+ this.label18.Name = "label18";
+ this.label18.Size = new System.Drawing.Size(61, 13);
+ this.label18.TabIndex = 46;
+ this.label18.Text = "Detelecine:";
+ //
+ // drop_detelecine
+ //
+ this.drop_detelecine.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.drop_detelecine.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_detelecine.FormattingEnabled = true;
+ this.drop_detelecine.Items.AddRange(new object[] {
+ "Off",
+ "Custom",
+ "Default"});
+ this.drop_detelecine.Location = new System.Drawing.Point(71, 3);
+ this.drop_detelecine.Name = "drop_detelecine";
+ this.drop_detelecine.Size = new System.Drawing.Size(174, 21);
+ this.drop_detelecine.TabIndex = 45;
+ this.drop_detelecine.SelectedIndexChanged += new System.EventHandler(this.DropDetelecineSelectedIndexChanged);
+ //
+ // text_customDC
+ //
+ this.text_customDC.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.text_customDC.Location = new System.Drawing.Point(251, 30);
+ this.text_customDC.Name = "text_customDC";
+ this.text_customDC.Size = new System.Drawing.Size(115, 21);
+ this.text_customDC.TabIndex = 50;
+ this.text_customDC.Visible = false;
+ //
+ // label1
+ //
+ this.label1.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.label1.AutoSize = true;
+ this.label1.BackColor = System.Drawing.Color.Transparent;
+ this.label1.Location = new System.Drawing.Point(0, 34);
+ this.label1.Margin = new System.Windows.Forms.Padding(0, 3, 3, 3);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(49, 13);
+ this.label1.TabIndex = 49;
+ this.label1.Text = "Decomb:";
+ //
+ // drop_decomb
+ //
+ this.drop_decomb.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.drop_decomb.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_decomb.FormattingEnabled = true;
+ this.drop_decomb.Items.AddRange(new object[] {
+ "Off",
+ "Custom",
+ "Default"});
+ this.drop_decomb.Location = new System.Drawing.Point(71, 30);
+ this.drop_decomb.Name = "drop_decomb";
+ this.drop_decomb.Size = new System.Drawing.Size(174, 21);
+ this.drop_decomb.TabIndex = 48;
+ this.drop_decomb.SelectedIndexChanged += new System.EventHandler(this.DropDecombSelectedIndexChanged);
+ //
+ // text_customDI
+ //
+ this.text_customDI.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.text_customDI.Location = new System.Drawing.Point(251, 57);
+ this.text_customDI.Name = "text_customDI";
+ this.text_customDI.Size = new System.Drawing.Size(115, 21);
+ this.text_customDI.TabIndex = 53;
+ this.text_customDI.Visible = false;
+ //
+ // label2
+ //
+ this.label2.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.label2.AutoSize = true;
+ this.label2.BackColor = System.Drawing.Color.Transparent;
+ this.label2.Location = new System.Drawing.Point(0, 61);
+ this.label2.Margin = new System.Windows.Forms.Padding(0, 3, 3, 3);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(65, 13);
+ this.label2.TabIndex = 52;
+ this.label2.Text = "Deinterlace:";
+ //
+ // drop_deinterlace
+ //
+ this.drop_deinterlace.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.drop_deinterlace.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_deinterlace.FormattingEnabled = true;
+ this.drop_deinterlace.Items.AddRange(new object[] {
+ "Off",
+ "Custom",
+ "Fast",
+ "Slow",
+ "Slower"});
+ this.drop_deinterlace.Location = new System.Drawing.Point(71, 57);
+ this.drop_deinterlace.Name = "drop_deinterlace";
+ this.drop_deinterlace.Size = new System.Drawing.Size(174, 21);
+ this.drop_deinterlace.TabIndex = 51;
+ this.drop_deinterlace.SelectedIndexChanged += new System.EventHandler(this.DropDeinterlaceSelectedIndexChanged);
+ //
+ // text_customDN
+ //
+ this.text_customDN.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.text_customDN.Location = new System.Drawing.Point(251, 84);
+ this.text_customDN.Name = "text_customDN";
+ this.text_customDN.Size = new System.Drawing.Size(115, 21);
+ this.text_customDN.TabIndex = 56;
+ this.text_customDN.Visible = false;
+ //
+ // label3
+ //
+ this.label3.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.label3.AutoSize = true;
+ this.label3.BackColor = System.Drawing.Color.Transparent;
+ this.label3.Location = new System.Drawing.Point(0, 88);
+ this.label3.Margin = new System.Windows.Forms.Padding(0, 3, 3, 3);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(49, 13);
+ this.label3.TabIndex = 55;
+ this.label3.Text = "Denoise:";
+ //
+ // drop_denoise
+ //
+ this.drop_denoise.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.drop_denoise.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_denoise.FormattingEnabled = true;
+ this.drop_denoise.Items.AddRange(new object[] {
+ "Off",
+ "Custom",
+ "Weak",
+ "Medium",
+ "Strong"});
+ this.drop_denoise.Location = new System.Drawing.Point(71, 84);
+ this.drop_denoise.Name = "drop_denoise";
+ this.drop_denoise.Size = new System.Drawing.Size(174, 21);
+ this.drop_denoise.TabIndex = 54;
+ this.drop_denoise.SelectedIndexChanged += new System.EventHandler(this.DropDenoiseSelectedIndexChanged);
+ //
+ // slider_deblock
+ //
+ this.slider_deblock.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.slider_deblock.BackColor = System.Drawing.SystemColors.Window;
+ this.slider_deblock.Location = new System.Drawing.Point(71, 111);
+ this.slider_deblock.Maximum = 15;
+ this.slider_deblock.Minimum = 4;
+ this.slider_deblock.Name = "slider_deblock";
+ this.slider_deblock.Size = new System.Drawing.Size(174, 45);
+ this.slider_deblock.TabIndex = 58;
+ this.slider_deblock.Value = 4;
+ this.slider_deblock.Scroll += new System.EventHandler(this.SliderDeblockScroll);
+ //
+ // check_grayscale
+ //
+ this.check_grayscale.AutoSize = true;
+ this.check_grayscale.BackColor = System.Drawing.Color.Transparent;
+ this.check_grayscale.Location = new System.Drawing.Point(71, 162);
+ this.check_grayscale.Name = "check_grayscale";
+ this.check_grayscale.Size = new System.Drawing.Size(119, 17);
+ this.check_grayscale.TabIndex = 57;
+ this.check_grayscale.Text = "Grayscale Encoding";
+ this.check_grayscale.UseVisualStyleBackColor = false;
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.BackColor = System.Drawing.Color.Transparent;
+ this.label8.Location = new System.Drawing.Point(0, 115);
+ this.label8.Margin = new System.Windows.Forms.Padding(0, 7, 3, 3);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(48, 13);
+ this.label8.TabIndex = 60;
+ this.label8.Text = "Deblock:";
+ //
+ // lbl_deblockVal
+ //
+ this.lbl_deblockVal.AutoSize = true;
+ this.lbl_deblockVal.BackColor = System.Drawing.Color.Transparent;
+ this.lbl_deblockVal.Location = new System.Drawing.Point(251, 115);
+ this.lbl_deblockVal.Margin = new System.Windows.Forms.Padding(3, 7, 3, 3);
+ this.lbl_deblockVal.Name = "lbl_deblockVal";
+ this.lbl_deblockVal.Size = new System.Drawing.Size(23, 13);
+ this.lbl_deblockVal.TabIndex = 59;
+ this.lbl_deblockVal.Text = "Off";
+ //
+ // label68
+ //
+ this.label68.AutoSize = true;
+ this.label68.BackColor = System.Drawing.Color.Transparent;
+ this.label68.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label68.Location = new System.Drawing.Point(13, 13);
+ this.label68.Name = "label68";
+ this.label68.Size = new System.Drawing.Size(42, 13);
+ this.label68.TabIndex = 61;
+ this.label68.Text = "Filters";
+ //
+ // tableLayoutPanel1
+ //
+ this.tableLayoutPanel1.AutoSize = true;
+ this.tableLayoutPanel1.ColumnCount = 3;
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel1.Controls.Add(this.label18, 0, 0);
+ this.tableLayoutPanel1.Controls.Add(this.label1, 0, 1);
+ this.tableLayoutPanel1.Controls.Add(this.lbl_deblockVal, 2, 4);
+ this.tableLayoutPanel1.Controls.Add(this.check_grayscale, 1, 5);
+ this.tableLayoutPanel1.Controls.Add(this.text_customDN, 2, 3);
+ this.tableLayoutPanel1.Controls.Add(this.slider_deblock, 1, 4);
+ this.tableLayoutPanel1.Controls.Add(this.text_customDI, 2, 2);
+ this.tableLayoutPanel1.Controls.Add(this.label2, 0, 2);
+ this.tableLayoutPanel1.Controls.Add(this.text_customDC, 2, 1);
+ this.tableLayoutPanel1.Controls.Add(this.label3, 0, 3);
+ this.tableLayoutPanel1.Controls.Add(this.text_customDT, 2, 0);
+ this.tableLayoutPanel1.Controls.Add(this.label8, 0, 4);
+ this.tableLayoutPanel1.Controls.Add(this.drop_detelecine, 1, 0);
+ this.tableLayoutPanel1.Controls.Add(this.drop_denoise, 1, 3);
+ this.tableLayoutPanel1.Controls.Add(this.drop_decomb, 1, 1);
+ this.tableLayoutPanel1.Controls.Add(this.drop_deinterlace, 1, 2);
+ this.tableLayoutPanel1.Location = new System.Drawing.Point(19, 29);
+ this.tableLayoutPanel1.Name = "tableLayoutPanel1";
+ this.tableLayoutPanel1.RowCount = 6;
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel1.Size = new System.Drawing.Size(369, 182);
+ this.tableLayoutPanel1.TabIndex = 62;
+ //
+ // Filters
+ //
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+ this.BackColor = System.Drawing.Color.Transparent;
+ this.Controls.Add(this.tableLayoutPanel1);
+ this.Controls.Add(this.label68);
+ this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Name = "Filters";
+ this.Size = new System.Drawing.Size(592, 270);
+ ((System.ComponentModel.ISupportInitialize)(this.slider_deblock)).EndInit();
+ this.tableLayoutPanel1.ResumeLayout(false);
+ this.tableLayoutPanel1.PerformLayout();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TextBox text_customDT;
+ private System.Windows.Forms.Label label18;
+ internal System.Windows.Forms.ComboBox drop_detelecine;
+ private System.Windows.Forms.TextBox text_customDC;
+ internal System.Windows.Forms.Label label1;
+ internal System.Windows.Forms.ComboBox drop_decomb;
+ private System.Windows.Forms.TextBox text_customDI;
+ internal System.Windows.Forms.Label label2;
+ internal System.Windows.Forms.ComboBox drop_deinterlace;
+ private System.Windows.Forms.TextBox text_customDN;
+ internal System.Windows.Forms.Label label3;
+ internal System.Windows.Forms.ComboBox drop_denoise;
+ internal System.Windows.Forms.TrackBar slider_deblock;
+ internal System.Windows.Forms.CheckBox check_grayscale;
+ internal System.Windows.Forms.Label label8;
+ internal System.Windows.Forms.Label lbl_deblockVal;
+ internal System.Windows.Forms.Label label68;
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
+ }
+}
diff --git a/win/CS/Controls/Filters.cs b/win/CS/Controls/Filters.cs
new file mode 100644
index 000000000..0f47b4b75
--- /dev/null
+++ b/win/CS/Controls/Filters.cs
@@ -0,0 +1,336 @@
+/* Filters.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.Controls
+{
+ using System;
+ using System.Windows.Forms;
+
+ using HandBrake.ApplicationServices.Model.Encoding;
+
+ /// <summary>
+ /// The Filters Panel
+ /// </summary>
+ public partial class Filters : UserControl
+ {
+ /// <summary>
+ /// The Filter settings have changed
+ /// </summary>
+ public event EventHandler FilterSettingsChanged;
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Filters"/> class.
+ /// Creates a new instance of Filters
+ /// </summary>
+ public Filters()
+ {
+ InitializeComponent();
+ drop_decomb.SelectedIndex = 0;
+ drop_deinterlace.SelectedIndex = 0;
+ drop_denoise.SelectedIndex = 0;
+ drop_detelecine.SelectedIndex = 0;
+ }
+
+ /// <summary>
+ /// Gets the CLI query for the query generator.
+ /// </summary>
+ public string GetCliQuery
+ {
+ get
+ {
+ string query = string.Empty;
+
+ switch (drop_detelecine.Text) // DeTelecine
+ {
+ case "Off":
+ query += string.Empty;
+ break;
+ case "Default":
+ query += " --detelecine";
+ break;
+ case "Custom":
+ query += " --detelecine=\"" + text_customDT.Text + "\"";
+ break;
+ default:
+ query += string.Empty;
+ break;
+ }
+
+ switch (drop_decomb.Text) // Decomb
+ {
+ case "Off":
+ query += string.Empty;
+ break;
+ case "Default":
+ query += " --decomb";
+ break;
+ case "Custom":
+ query += " --decomb=\"" + text_customDC.Text + "\"";
+ break;
+ default:
+ query += string.Empty;
+ break;
+ }
+
+ switch (drop_deinterlace.Text) // DeInterlace
+ {
+ case "None":
+ query += string.Empty;
+ break;
+ case "Fast":
+ query += " --deinterlace=\"fast\"";
+ break;
+ case "Slow":
+ query += " --deinterlace=\"slow\"";
+ break;
+ case "Slower":
+ query += " --deinterlace=\"slower\"";
+ break;
+ case "Custom":
+ query += " --deinterlace=\"" + text_customDI.Text + "\"";
+ break;
+ default:
+ query += string.Empty;
+ break;
+ }
+
+ switch (drop_denoise.Text) // Denoise
+ {
+ case "None":
+ query += string.Empty;
+ break;
+ case "Weak":
+ query += " --denoise=\"weak\"";
+ break;
+ case "Medium":
+ query += " --denoise=\"medium\"";
+ break;
+ case "Strong":
+ query += " --denoise=\"strong\"";
+ break;
+ case "Custom":
+ query += " --denoise=\"" + text_customDN.Text + "\"";
+ break;
+ default:
+ query += string.Empty;
+ break;
+ }
+
+ if (slider_deblock.Value != 4)
+ query += " --deblock=" + slider_deblock.Value;
+
+ if (check_grayscale.Checked)
+ query += " -g ";
+
+ return query;
+ }
+ }
+
+ /// <summary>
+ /// Set the Detelecine control
+ /// </summary>
+ /// <param name="value">
+ /// The value part of the CLI string
+ /// </param>
+ /// <param name="custom">
+ /// The Custom Detelecine setting
+ /// </param>
+ public void SetDeTelecine(Detelecine value, string custom)
+ {
+ text_customDT.Text = string.Empty;
+ text_customDT.Visible = false;
+ switch (value)
+ {
+ case Detelecine.Off:
+ drop_detelecine.SelectedIndex = 0;
+ break;
+ case Detelecine.Default:
+ drop_detelecine.SelectedIndex = 2;
+ break;
+ default:
+ drop_detelecine.SelectedIndex = 1;
+ text_customDT.Text = custom;
+ text_customDT.Visible = true;
+ break;
+ }
+ }
+
+ /// <summary>
+ /// Set the Denoise control
+ /// </summary>
+ /// <param name="value">
+ /// The value part of the CLI string
+ /// </param>
+ /// <param name="custom">
+ /// The custom denoise setting.
+ /// </param>
+ public void SetDeNoise(Denoise value, string custom)
+ {
+ text_customDN.Text = string.Empty;
+ text_customDN.Visible = false;
+ switch (value)
+ {
+ case Denoise.Off:
+ drop_denoise.SelectedIndex = 0;
+ break;
+ case Denoise.Weak:
+ drop_denoise.SelectedIndex = 2;
+ break;
+ case Denoise.Medium:
+ drop_denoise.SelectedIndex = 3;
+ break;
+ case Denoise.Strong:
+ drop_denoise.SelectedIndex = 4;
+ break;
+ default:
+ drop_denoise.SelectedIndex = 1;
+ text_customDN.Text = custom;
+ text_customDN.Visible = true;
+ break;
+ }
+ }
+
+ /// <summary>
+ /// Set the Deinterlace Control
+ /// </summary>
+ /// <param name="value">
+ /// The value part of the CLI string
+ /// </param>
+ /// <param name="custom">
+ /// The Custom Detinerlace Settings
+ /// </param>
+ public void SetDeInterlace(Deinterlace value, string custom)
+ {
+ text_customDI.Text = string.Empty;
+ text_customDI.Visible = false;
+ switch (value)
+ {
+ case Deinterlace.Off:
+ drop_deinterlace.SelectedIndex = 0;
+ break;
+ case Deinterlace.Fast:
+ drop_deinterlace.SelectedIndex = 2;
+ break;
+ case Deinterlace.Slow:
+ drop_deinterlace.SelectedIndex = 3;
+ break;
+ case Deinterlace.Slower:
+ drop_deinterlace.SelectedIndex = 4;
+
+ break;
+ default:
+ drop_deinterlace.SelectedIndex = 1;
+ text_customDI.Text = custom;
+ text_customDI.Visible = true;
+ break;
+ }
+ }
+
+ /// <summary>
+ /// Set the Decomb Control
+ /// </summary>
+ /// <param name="value">
+ /// The value part of the CLI string
+ /// </param>
+ /// <param name="custom">
+ /// The custom option string
+ /// </param>
+ public void SetDecomb(Decomb value, string custom)
+ {
+ text_customDC.Text = string.Empty;
+ text_customDC.Visible = false;
+ switch (value)
+ {
+ case Decomb.Off:
+ drop_decomb.SelectedIndex = 0;
+ break;
+ case Decomb.Default:
+ drop_decomb.SelectedIndex = 2;
+ break;
+ default:
+ drop_decomb.SelectedIndex = 1;
+ text_customDC.Text = custom;
+ text_customDC.Visible = true;
+ break;
+ }
+ }
+
+ /// <summary>
+ /// Set the Deblock Control
+ /// </summary>
+ /// <param name="value">The deblock value</param>
+ public void SetDeBlock(int value)
+ {
+ if (value != 0)
+ {
+ slider_deblock.Value = value;
+ lbl_deblockVal.Text = value.ToString();
+ }
+ else
+ {
+ slider_deblock.Value = 4;
+ lbl_deblockVal.Text = "Off";
+ }
+ }
+
+ /// <summary>
+ /// Set the grayscale control
+ /// </summary>
+ /// <param name="value">Boolean value</param>
+ public void SetGrayScale(bool value)
+ {
+ check_grayscale.CheckState = value ? CheckState.Checked : CheckState.Unchecked;
+ }
+
+ // Controls
+ private void DropDetelecineSelectedIndexChanged(object sender, EventArgs e)
+ {
+ text_customDT.Visible = drop_detelecine.Text == "Custom";
+ // A Filter has changed so raise a FilterSettingsChanged event.
+ if (this.FilterSettingsChanged != null)
+ this.FilterSettingsChanged(this, new EventArgs());
+ }
+
+ private void DropDecombSelectedIndexChanged(object sender, EventArgs e)
+ {
+ text_customDC.Visible = drop_decomb.Text == "Custom";
+ if (drop_decomb.SelectedIndex != 0 && drop_deinterlace.SelectedIndex != 0)
+ drop_deinterlace.SelectedIndex = 0;
+
+ // A Filter has changed so raise a FilterSettingsChanged event.
+ if (this.FilterSettingsChanged != null)
+ this.FilterSettingsChanged(this, new EventArgs());
+ }
+
+ private void DropDeinterlaceSelectedIndexChanged(object sender, EventArgs e)
+ {
+ text_customDI.Visible = drop_deinterlace.Text == "Custom";
+ if (drop_decomb.SelectedIndex != 0 && drop_deinterlace.SelectedIndex != 0)
+ drop_decomb.SelectedIndex = 0;
+
+ // A Filter has changed so raise a FilterSettingsChanged event.
+ if (this.FilterSettingsChanged != null)
+ this.FilterSettingsChanged(this, new EventArgs());
+ }
+
+ private void DropDenoiseSelectedIndexChanged(object sender, EventArgs e)
+ {
+ text_customDN.Visible = drop_denoise.Text == "Custom";
+
+ // A Filter has changed so raise a FilterSettingsChanged event.
+ if (this.FilterSettingsChanged != null)
+ this.FilterSettingsChanged(this, new EventArgs());
+ }
+
+ private void SliderDeblockScroll(object sender, EventArgs e)
+ {
+ lbl_deblockVal.Text = slider_deblock.Value == 4 ? "Off" : slider_deblock.Value.ToString();
+
+ // A Filter has changed so raise a FilterSettingsChanged event.
+ if (this.FilterSettingsChanged != null)
+ this.FilterSettingsChanged(this, new EventArgs());
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/Controls/Filters.resx b/win/CS/Controls/Filters.resx
new file mode 100644
index 000000000..ff31a6db5
--- /dev/null
+++ b/win/CS/Controls/Filters.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root> \ No newline at end of file
diff --git a/win/CS/Controls/PictureSettings.Designer.cs b/win/CS/Controls/PictureSettings.Designer.cs
new file mode 100644
index 000000000..2dfbd9735
--- /dev/null
+++ b/win/CS/Controls/PictureSettings.Designer.cs
@@ -0,0 +1,688 @@
+namespace Handbrake.Controls
+{
+ partial class PictureSettings
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();
+ this.Label15 = new System.Windows.Forms.Label();
+ this.crop_left = new System.Windows.Forms.NumericUpDown();
+ this.crop_right = new System.Windows.Forms.NumericUpDown();
+ this.check_autoCrop = new System.Windows.Forms.RadioButton();
+ this.Label51 = new System.Windows.Forms.Label();
+ this.crop_top = new System.Windows.Forms.NumericUpDown();
+ this.Label53 = new System.Windows.Forms.Label();
+ this.Label52 = new System.Windows.Forms.Label();
+ this.crop_bottom = new System.Windows.Forms.NumericUpDown();
+ this.check_customCrop = new System.Windows.Forms.RadioButton();
+ this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
+ this.label7 = new System.Windows.Forms.Label();
+ this.lbl_src_res = new System.Windows.Forms.Label();
+ this.Label55 = new System.Windows.Forms.Label();
+ this.text_width = new System.Windows.Forms.NumericUpDown();
+ this.label4 = new System.Windows.Forms.Label();
+ this.text_height = new System.Windows.Forms.NumericUpDown();
+ this.check_KeepAR = new System.Windows.Forms.CheckBox();
+ this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
+ this.updownParHeight = new System.Windows.Forms.NumericUpDown();
+ this.label6 = new System.Windows.Forms.Label();
+ this.labelDisplaySize = new System.Windows.Forms.Label();
+ this.lbl_parHeight = new System.Windows.Forms.Label();
+ this.labelStaticDisplaySize = new System.Windows.Forms.Label();
+ this.updownParWidth = new System.Windows.Forms.NumericUpDown();
+ this.drp_anamorphic = new System.Windows.Forms.ComboBox();
+ this.lbl_parWidth = new System.Windows.Forms.Label();
+ this.updownDisplayWidth = new System.Windows.Forms.NumericUpDown();
+ this.lbl_modulus = new System.Windows.Forms.Label();
+ this.lbl_displayWidth = new System.Windows.Forms.Label();
+ this.drp_modulus = new System.Windows.Forms.ComboBox();
+ this.label8 = new System.Windows.Forms.Label();
+ this.label26 = new System.Windows.Forms.Label();
+ this.lbl_presetCropWarning = new System.Windows.Forms.Label();
+ this.tableLayoutPanel3.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.crop_left)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.crop_right)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.crop_top)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.crop_bottom)).BeginInit();
+ this.tableLayoutPanel2.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.text_width)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.text_height)).BeginInit();
+ this.tableLayoutPanel1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.updownParHeight)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.updownParWidth)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.updownDisplayWidth)).BeginInit();
+ this.SuspendLayout();
+ //
+ // tableLayoutPanel3
+ //
+ this.tableLayoutPanel3.AutoSize = true;
+ this.tableLayoutPanel3.ColumnCount = 5;
+ this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel3.Controls.Add(this.Label15, 0, 4);
+ this.tableLayoutPanel3.Controls.Add(this.crop_left, 1, 4);
+ this.tableLayoutPanel3.Controls.Add(this.crop_right, 3, 4);
+ this.tableLayoutPanel3.Controls.Add(this.check_autoCrop, 0, 0);
+ this.tableLayoutPanel3.Controls.Add(this.Label51, 4, 4);
+ this.tableLayoutPanel3.Controls.Add(this.crop_top, 2, 3);
+ this.tableLayoutPanel3.Controls.Add(this.Label53, 2, 6);
+ this.tableLayoutPanel3.Controls.Add(this.Label52, 2, 2);
+ this.tableLayoutPanel3.Controls.Add(this.crop_bottom, 2, 5);
+ this.tableLayoutPanel3.Controls.Add(this.check_customCrop, 0, 1);
+ this.tableLayoutPanel3.Location = new System.Drawing.Point(419, 35);
+ this.tableLayoutPanel3.Name = "tableLayoutPanel3";
+ this.tableLayoutPanel3.RowCount = 7;
+ this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel3.Size = new System.Drawing.Size(217, 165);
+ this.tableLayoutPanel3.TabIndex = 117;
+ //
+ // Label15
+ //
+ this.Label15.Anchor = System.Windows.Forms.AnchorStyles.Right;
+ this.Label15.AutoSize = true;
+ this.Label15.BackColor = System.Drawing.Color.Transparent;
+ this.Label15.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.Label15.Location = new System.Drawing.Point(0, 99);
+ this.Label15.Margin = new System.Windows.Forms.Padding(0, 3, 3, 3);
+ this.Label15.Name = "Label15";
+ this.Label15.Size = new System.Drawing.Size(26, 13);
+ this.Label15.TabIndex = 97;
+ this.Label15.Text = "Left";
+ //
+ // crop_left
+ //
+ this.crop_left.Enabled = false;
+ this.crop_left.Increment = new decimal(new int[] {
+ 2,
+ 0,
+ 0,
+ 0});
+ this.crop_left.Location = new System.Drawing.Point(32, 95);
+ this.crop_left.Maximum = new decimal(new int[] {
+ 128000,
+ 0,
+ 0,
+ 0});
+ this.crop_left.Name = "crop_left";
+ this.crop_left.Size = new System.Drawing.Size(44, 21);
+ this.crop_left.TabIndex = 98;
+ this.crop_left.ValueChanged += new System.EventHandler(this.CropValueChanged);
+ //
+ // crop_right
+ //
+ this.crop_right.Enabled = false;
+ this.crop_right.Increment = new decimal(new int[] {
+ 2,
+ 0,
+ 0,
+ 0});
+ this.crop_right.Location = new System.Drawing.Point(132, 95);
+ this.crop_right.Maximum = new decimal(new int[] {
+ 128000,
+ 0,
+ 0,
+ 0});
+ this.crop_right.Name = "crop_right";
+ this.crop_right.Size = new System.Drawing.Size(44, 21);
+ this.crop_right.TabIndex = 101;
+ this.crop_right.ValueChanged += new System.EventHandler(this.CropValueChanged);
+ //
+ // check_autoCrop
+ //
+ this.check_autoCrop.AutoSize = true;
+ this.check_autoCrop.Checked = true;
+ this.tableLayoutPanel3.SetColumnSpan(this.check_autoCrop, 5);
+ this.check_autoCrop.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.check_autoCrop.Location = new System.Drawing.Point(0, 3);
+ this.check_autoCrop.Margin = new System.Windows.Forms.Padding(0, 3, 3, 3);
+ this.check_autoCrop.Name = "check_autoCrop";
+ this.check_autoCrop.Size = new System.Drawing.Size(73, 17);
+ this.check_autoCrop.TabIndex = 105;
+ this.check_autoCrop.TabStop = true;
+ this.check_autoCrop.Text = "Automatic";
+ this.check_autoCrop.UseVisualStyleBackColor = true;
+ this.check_autoCrop.CheckedChanged += new System.EventHandler(this.CheckAutoCropCheckedChanged);
+ //
+ // Label51
+ //
+ this.Label51.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.Label51.AutoSize = true;
+ this.Label51.BackColor = System.Drawing.Color.Transparent;
+ this.Label51.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.Label51.Location = new System.Drawing.Point(182, 99);
+ this.Label51.Margin = new System.Windows.Forms.Padding(3);
+ this.Label51.Name = "Label51";
+ this.Label51.Size = new System.Drawing.Size(32, 13);
+ this.Label51.TabIndex = 102;
+ this.Label51.Text = "Right";
+ //
+ // crop_top
+ //
+ this.crop_top.Enabled = false;
+ this.crop_top.Increment = new decimal(new int[] {
+ 2,
+ 0,
+ 0,
+ 0});
+ this.crop_top.Location = new System.Drawing.Point(82, 68);
+ this.crop_top.Maximum = new decimal(new int[] {
+ 128000,
+ 0,
+ 0,
+ 0});
+ this.crop_top.Name = "crop_top";
+ this.crop_top.Size = new System.Drawing.Size(44, 21);
+ this.crop_top.TabIndex = 100;
+ this.crop_top.ValueChanged += new System.EventHandler(this.CropValueChanged);
+ //
+ // Label53
+ //
+ this.Label53.Anchor = System.Windows.Forms.AnchorStyles.Top;
+ this.Label53.AutoSize = true;
+ this.Label53.BackColor = System.Drawing.Color.Transparent;
+ this.Label53.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.Label53.Location = new System.Drawing.Point(83, 149);
+ this.Label53.Margin = new System.Windows.Forms.Padding(3);
+ this.Label53.Name = "Label53";
+ this.Label53.Size = new System.Drawing.Size(41, 13);
+ this.Label53.TabIndex = 104;
+ this.Label53.Text = "Bottom";
+ //
+ // Label52
+ //
+ this.Label52.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
+ this.Label52.AutoSize = true;
+ this.Label52.BackColor = System.Drawing.Color.Transparent;
+ this.Label52.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.Label52.Location = new System.Drawing.Point(91, 49);
+ this.Label52.Margin = new System.Windows.Forms.Padding(3);
+ this.Label52.Name = "Label52";
+ this.Label52.Size = new System.Drawing.Size(25, 13);
+ this.Label52.TabIndex = 99;
+ this.Label52.Text = "Top";
+ //
+ // crop_bottom
+ //
+ this.crop_bottom.Enabled = false;
+ this.crop_bottom.Increment = new decimal(new int[] {
+ 2,
+ 0,
+ 0,
+ 0});
+ this.crop_bottom.Location = new System.Drawing.Point(82, 122);
+ this.crop_bottom.Maximum = new decimal(new int[] {
+ 128000,
+ 0,
+ 0,
+ 0});
+ this.crop_bottom.Name = "crop_bottom";
+ this.crop_bottom.Size = new System.Drawing.Size(44, 21);
+ this.crop_bottom.TabIndex = 103;
+ this.crop_bottom.ValueChanged += new System.EventHandler(this.CropValueChanged);
+ //
+ // check_customCrop
+ //
+ this.check_customCrop.AutoSize = true;
+ this.tableLayoutPanel3.SetColumnSpan(this.check_customCrop, 5);
+ this.check_customCrop.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.check_customCrop.Location = new System.Drawing.Point(0, 26);
+ this.check_customCrop.Margin = new System.Windows.Forms.Padding(0, 3, 3, 3);
+ this.check_customCrop.Name = "check_customCrop";
+ this.check_customCrop.Size = new System.Drawing.Size(61, 17);
+ this.check_customCrop.TabIndex = 106;
+ this.check_customCrop.Text = "Custom";
+ this.check_customCrop.UseVisualStyleBackColor = true;
+ //
+ // tableLayoutPanel2
+ //
+ this.tableLayoutPanel2.AutoSize = true;
+ this.tableLayoutPanel2.ColumnCount = 5;
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel2.Controls.Add(this.label7, 0, 0);
+ this.tableLayoutPanel2.Controls.Add(this.lbl_src_res, 1, 0);
+ this.tableLayoutPanel2.Controls.Add(this.Label55, 0, 1);
+ this.tableLayoutPanel2.Controls.Add(this.text_width, 1, 1);
+ this.tableLayoutPanel2.Controls.Add(this.label4, 2, 1);
+ this.tableLayoutPanel2.Controls.Add(this.text_height, 3, 1);
+ this.tableLayoutPanel2.Controls.Add(this.check_KeepAR, 1, 2);
+ this.tableLayoutPanel2.Location = new System.Drawing.Point(16, 35);
+ this.tableLayoutPanel2.Name = "tableLayoutPanel2";
+ this.tableLayoutPanel2.RowCount = 3;
+ this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel2.Size = new System.Drawing.Size(376, 69);
+ this.tableLayoutPanel2.TabIndex = 116;
+ //
+ // label7
+ //
+ this.label7.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.label7.AutoSize = true;
+ this.label7.BackColor = System.Drawing.Color.Transparent;
+ this.label7.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label7.Location = new System.Drawing.Point(0, 3);
+ this.label7.Margin = new System.Windows.Forms.Padding(0, 3, 3, 3);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(44, 13);
+ this.label7.TabIndex = 76;
+ this.label7.Text = "Source:";
+ //
+ // lbl_src_res
+ //
+ this.lbl_src_res.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.lbl_src_res.AutoSize = true;
+ this.lbl_src_res.BackColor = System.Drawing.Color.Transparent;
+ this.lbl_src_res.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.lbl_src_res.Location = new System.Drawing.Point(50, 3);
+ this.lbl_src_res.Margin = new System.Windows.Forms.Padding(3);
+ this.lbl_src_res.Name = "lbl_src_res";
+ this.lbl_src_res.Size = new System.Drawing.Size(15, 13);
+ this.lbl_src_res.TabIndex = 77;
+ this.lbl_src_res.Text = "--";
+ //
+ // Label55
+ //
+ this.Label55.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.Label55.AutoSize = true;
+ this.Label55.BackColor = System.Drawing.Color.Transparent;
+ this.Label55.ForeColor = System.Drawing.Color.Black;
+ this.Label55.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.Label55.Location = new System.Drawing.Point(0, 26);
+ this.Label55.Margin = new System.Windows.Forms.Padding(0, 3, 3, 3);
+ this.Label55.Name = "Label55";
+ this.Label55.Size = new System.Drawing.Size(39, 13);
+ this.Label55.TabIndex = 80;
+ this.Label55.Text = "Width:";
+ //
+ // text_width
+ //
+ this.text_width.Location = new System.Drawing.Point(50, 22);
+ this.text_width.Maximum = new decimal(new int[] {
+ 1280000,
+ 0,
+ 0,
+ 0});
+ this.text_width.Name = "text_width";
+ this.text_width.Size = new System.Drawing.Size(64, 21);
+ this.text_width.TabIndex = 85;
+ this.text_width.ValueChanged += new System.EventHandler(this.TextWidthValueChanged);
+ //
+ // label4
+ //
+ this.label4.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.label4.AutoSize = true;
+ this.label4.BackColor = System.Drawing.Color.Transparent;
+ this.label4.ForeColor = System.Drawing.Color.Black;
+ this.label4.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label4.Location = new System.Drawing.Point(120, 26);
+ this.label4.Margin = new System.Windows.Forms.Padding(3);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(42, 13);
+ this.label4.TabIndex = 84;
+ this.label4.Text = "Height:";
+ //
+ // text_height
+ //
+ this.text_height.Location = new System.Drawing.Point(168, 22);
+ this.text_height.Maximum = new decimal(new int[] {
+ 1280000,
+ 0,
+ 0,
+ 0});
+ this.text_height.Name = "text_height";
+ this.text_height.Size = new System.Drawing.Size(64, 21);
+ this.text_height.TabIndex = 86;
+ this.text_height.ValueChanged += new System.EventHandler(this.TextHeightValueChanged);
+ //
+ // check_KeepAR
+ //
+ this.check_KeepAR.AutoSize = true;
+ this.check_KeepAR.Checked = true;
+ this.check_KeepAR.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.tableLayoutPanel2.SetColumnSpan(this.check_KeepAR, 3);
+ this.check_KeepAR.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.check_KeepAR.Location = new System.Drawing.Point(50, 49);
+ this.check_KeepAR.Name = "check_KeepAR";
+ this.check_KeepAR.Size = new System.Drawing.Size(114, 17);
+ this.check_KeepAR.TabIndex = 95;
+ this.check_KeepAR.Text = "Keep Aspect Ratio";
+ this.check_KeepAR.UseVisualStyleBackColor = true;
+ this.check_KeepAR.CheckedChanged += new System.EventHandler(this.CheckKeepArCheckedChanged);
+ //
+ // tableLayoutPanel1
+ //
+ this.tableLayoutPanel1.AutoSize = true;
+ this.tableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+ this.tableLayoutPanel1.ColumnCount = 2;
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel1.Controls.Add(this.updownParHeight, 1, 4);
+ this.tableLayoutPanel1.Controls.Add(this.label6, 0, 0);
+ this.tableLayoutPanel1.Controls.Add(this.labelDisplaySize, 1, 5);
+ this.tableLayoutPanel1.Controls.Add(this.lbl_parHeight, 0, 4);
+ this.tableLayoutPanel1.Controls.Add(this.labelStaticDisplaySize, 0, 5);
+ this.tableLayoutPanel1.Controls.Add(this.updownParWidth, 1, 3);
+ this.tableLayoutPanel1.Controls.Add(this.drp_anamorphic, 1, 0);
+ this.tableLayoutPanel1.Controls.Add(this.lbl_parWidth, 0, 3);
+ this.tableLayoutPanel1.Controls.Add(this.updownDisplayWidth, 1, 2);
+ this.tableLayoutPanel1.Controls.Add(this.lbl_modulus, 0, 1);
+ this.tableLayoutPanel1.Controls.Add(this.lbl_displayWidth, 0, 2);
+ this.tableLayoutPanel1.Controls.Add(this.drp_modulus, 1, 1);
+ this.tableLayoutPanel1.Location = new System.Drawing.Point(16, 110);
+ this.tableLayoutPanel1.Name = "tableLayoutPanel1";
+ this.tableLayoutPanel1.RowCount = 6;
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel1.Size = new System.Drawing.Size(195, 154);
+ this.tableLayoutPanel1.TabIndex = 115;
+ //
+ // updownParHeight
+ //
+ this.updownParHeight.Location = new System.Drawing.Point(82, 111);
+ this.updownParHeight.Maximum = new decimal(new int[] {
+ 1280000,
+ 0,
+ 0,
+ 0});
+ this.updownParHeight.Name = "updownParHeight";
+ this.updownParHeight.Size = new System.Drawing.Size(53, 21);
+ this.updownParHeight.TabIndex = 112;
+ this.updownParHeight.ValueChanged += new System.EventHandler(this.TextWidthValueChanged);
+ //
+ // label6
+ //
+ this.label6.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.label6.AutoSize = true;
+ this.label6.BackColor = System.Drawing.Color.Transparent;
+ this.label6.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label6.Location = new System.Drawing.Point(0, 7);
+ this.label6.Margin = new System.Windows.Forms.Padding(0, 3, 3, 3);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(67, 13);
+ this.label6.TabIndex = 81;
+ this.label6.Text = "Anamorphic:";
+ //
+ // labelDisplaySize
+ //
+ this.labelDisplaySize.AutoSize = true;
+ this.labelDisplaySize.BackColor = System.Drawing.Color.Transparent;
+ this.labelDisplaySize.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.labelDisplaySize.Location = new System.Drawing.Point(82, 138);
+ this.labelDisplaySize.Margin = new System.Windows.Forms.Padding(3);
+ this.labelDisplaySize.Name = "labelDisplaySize";
+ this.labelDisplaySize.Size = new System.Drawing.Size(15, 13);
+ this.labelDisplaySize.TabIndex = 108;
+ this.labelDisplaySize.Text = "--";
+ //
+ // lbl_parHeight
+ //
+ this.lbl_parHeight.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.lbl_parHeight.AutoSize = true;
+ this.lbl_parHeight.BackColor = System.Drawing.Color.Transparent;
+ this.lbl_parHeight.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.lbl_parHeight.Location = new System.Drawing.Point(0, 115);
+ this.lbl_parHeight.Margin = new System.Windows.Forms.Padding(0, 3, 3, 3);
+ this.lbl_parHeight.Name = "lbl_parHeight";
+ this.lbl_parHeight.Size = new System.Drawing.Size(65, 13);
+ this.lbl_parHeight.TabIndex = 94;
+ this.lbl_parHeight.Text = "PAR Height:";
+ //
+ // labelStaticDisplaySize
+ //
+ this.labelStaticDisplaySize.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.labelStaticDisplaySize.AutoSize = true;
+ this.labelStaticDisplaySize.BackColor = System.Drawing.Color.Transparent;
+ this.labelStaticDisplaySize.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.labelStaticDisplaySize.Location = new System.Drawing.Point(0, 138);
+ this.labelStaticDisplaySize.Margin = new System.Windows.Forms.Padding(0, 3, 3, 3);
+ this.labelStaticDisplaySize.Name = "labelStaticDisplaySize";
+ this.labelStaticDisplaySize.Size = new System.Drawing.Size(67, 13);
+ this.labelStaticDisplaySize.TabIndex = 107;
+ this.labelStaticDisplaySize.Text = "Display Size:";
+ //
+ // updownParWidth
+ //
+ this.updownParWidth.Location = new System.Drawing.Point(82, 84);
+ this.updownParWidth.Maximum = new decimal(new int[] {
+ 1280000,
+ 0,
+ 0,
+ 0});
+ this.updownParWidth.Name = "updownParWidth";
+ this.updownParWidth.Size = new System.Drawing.Size(53, 21);
+ this.updownParWidth.TabIndex = 111;
+ this.updownParWidth.ValueChanged += new System.EventHandler(this.TextWidthValueChanged);
+ //
+ // drp_anamorphic
+ //
+ this.drp_anamorphic.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drp_anamorphic.FormattingEnabled = true;
+ this.drp_anamorphic.Items.AddRange(new object[] {
+ "None",
+ "Strict",
+ "Loose",
+ "Custom"});
+ this.drp_anamorphic.Location = new System.Drawing.Point(82, 3);
+ this.drp_anamorphic.Name = "drp_anamorphic";
+ this.drp_anamorphic.Size = new System.Drawing.Size(110, 21);
+ this.drp_anamorphic.TabIndex = 82;
+ this.drp_anamorphic.SelectedIndexChanged += new System.EventHandler(this.DrpAnamorphicSelectedIndexChanged);
+ //
+ // lbl_parWidth
+ //
+ this.lbl_parWidth.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.lbl_parWidth.AutoSize = true;
+ this.lbl_parWidth.BackColor = System.Drawing.Color.Transparent;
+ this.lbl_parWidth.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.lbl_parWidth.Location = new System.Drawing.Point(0, 88);
+ this.lbl_parWidth.Margin = new System.Windows.Forms.Padding(0, 3, 3, 3);
+ this.lbl_parWidth.Name = "lbl_parWidth";
+ this.lbl_parWidth.Size = new System.Drawing.Size(62, 13);
+ this.lbl_parWidth.TabIndex = 92;
+ this.lbl_parWidth.Text = "PAR Width:";
+ //
+ // updownDisplayWidth
+ //
+ this.updownDisplayWidth.Location = new System.Drawing.Point(82, 57);
+ this.updownDisplayWidth.Maximum = new decimal(new int[] {
+ 1280000,
+ 0,
+ 0,
+ 0});
+ this.updownDisplayWidth.Name = "updownDisplayWidth";
+ this.updownDisplayWidth.Size = new System.Drawing.Size(53, 21);
+ this.updownDisplayWidth.TabIndex = 110;
+ this.updownDisplayWidth.ValueChanged += new System.EventHandler(this.UpdownDisplayWidthValueChanged);
+ //
+ // lbl_modulus
+ //
+ this.lbl_modulus.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.lbl_modulus.AutoSize = true;
+ this.lbl_modulus.BackColor = System.Drawing.Color.Transparent;
+ this.lbl_modulus.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.lbl_modulus.Location = new System.Drawing.Point(0, 34);
+ this.lbl_modulus.Margin = new System.Windows.Forms.Padding(0, 3, 3, 3);
+ this.lbl_modulus.Name = "lbl_modulus";
+ this.lbl_modulus.Size = new System.Drawing.Size(50, 13);
+ this.lbl_modulus.TabIndex = 87;
+ this.lbl_modulus.Text = "Modulus:";
+ //
+ // lbl_displayWidth
+ //
+ this.lbl_displayWidth.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.lbl_displayWidth.AutoSize = true;
+ this.lbl_displayWidth.BackColor = System.Drawing.Color.Transparent;
+ this.lbl_displayWidth.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.lbl_displayWidth.Location = new System.Drawing.Point(0, 61);
+ this.lbl_displayWidth.Margin = new System.Windows.Forms.Padding(0, 3, 3, 3);
+ this.lbl_displayWidth.Name = "lbl_displayWidth";
+ this.lbl_displayWidth.Size = new System.Drawing.Size(76, 13);
+ this.lbl_displayWidth.TabIndex = 90;
+ this.lbl_displayWidth.Text = "Display Width:";
+ //
+ // drp_modulus
+ //
+ this.drp_modulus.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drp_modulus.FormattingEnabled = true;
+ this.drp_modulus.Items.AddRange(new object[] {
+ "16",
+ "8",
+ "4",
+ "2"});
+ this.drp_modulus.Location = new System.Drawing.Point(82, 30);
+ this.drp_modulus.Name = "drp_modulus";
+ this.drp_modulus.Size = new System.Drawing.Size(110, 21);
+ this.drp_modulus.TabIndex = 88;
+ this.drp_modulus.SelectedIndexChanged += new System.EventHandler(this.DrpModulusSelectedIndexChanged);
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.BackColor = System.Drawing.Color.Transparent;
+ this.label8.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label8.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label8.Location = new System.Drawing.Point(416, 13);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(57, 13);
+ this.label8.TabIndex = 114;
+ this.label8.Text = "Cropping";
+ //
+ // label26
+ //
+ this.label26.AutoSize = true;
+ this.label26.BackColor = System.Drawing.Color.Transparent;
+ this.label26.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label26.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label26.Location = new System.Drawing.Point(13, 13);
+ this.label26.Name = "label26";
+ this.label26.Size = new System.Drawing.Size(30, 13);
+ this.label26.TabIndex = 113;
+ this.label26.Text = "Size";
+ //
+ // lbl_presetCropWarning
+ //
+ this.lbl_presetCropWarning.AutoSize = true;
+ this.lbl_presetCropWarning.ForeColor = System.Drawing.Color.Black;
+ this.lbl_presetCropWarning.Location = new System.Drawing.Point(479, 13);
+ this.lbl_presetCropWarning.Name = "lbl_presetCropWarning";
+ this.lbl_presetCropWarning.Size = new System.Drawing.Size(140, 13);
+ this.lbl_presetCropWarning.TabIndex = 118;
+ this.lbl_presetCropWarning.Text = "( Preset values are in use! )";
+ //
+ // PictureSettings
+ //
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+ this.BackColor = System.Drawing.Color.Transparent;
+ this.Controls.Add(this.lbl_presetCropWarning);
+ this.Controls.Add(this.tableLayoutPanel3);
+ this.Controls.Add(this.tableLayoutPanel2);
+ this.Controls.Add(this.tableLayoutPanel1);
+ this.Controls.Add(this.label8);
+ this.Controls.Add(this.label26);
+ this.Enabled = false;
+ this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Name = "PictureSettings";
+ this.Size = new System.Drawing.Size(666, 279);
+ this.tableLayoutPanel3.ResumeLayout(false);
+ this.tableLayoutPanel3.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.crop_left)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.crop_right)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.crop_top)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.crop_bottom)).EndInit();
+ this.tableLayoutPanel2.ResumeLayout(false);
+ this.tableLayoutPanel2.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.text_width)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.text_height)).EndInit();
+ this.tableLayoutPanel1.ResumeLayout(false);
+ this.tableLayoutPanel1.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.updownParHeight)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.updownParWidth)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.updownDisplayWidth)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3;
+ internal System.Windows.Forms.Label Label15;
+ internal System.Windows.Forms.NumericUpDown crop_left;
+ internal System.Windows.Forms.NumericUpDown crop_right;
+ internal System.Windows.Forms.RadioButton check_autoCrop;
+ internal System.Windows.Forms.Label Label51;
+ internal System.Windows.Forms.NumericUpDown crop_top;
+ internal System.Windows.Forms.Label Label53;
+ internal System.Windows.Forms.Label Label52;
+ internal System.Windows.Forms.NumericUpDown crop_bottom;
+ internal System.Windows.Forms.RadioButton check_customCrop;
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
+ internal System.Windows.Forms.Label label7;
+ internal System.Windows.Forms.Label lbl_src_res;
+ internal System.Windows.Forms.Label Label55;
+ internal System.Windows.Forms.Label label4;
+ internal System.Windows.Forms.CheckBox check_KeepAR;
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
+ internal System.Windows.Forms.NumericUpDown updownParHeight;
+ internal System.Windows.Forms.Label label6;
+ internal System.Windows.Forms.Label labelDisplaySize;
+ internal System.Windows.Forms.Label lbl_parHeight;
+ internal System.Windows.Forms.Label labelStaticDisplaySize;
+ internal System.Windows.Forms.NumericUpDown updownParWidth;
+ internal System.Windows.Forms.ComboBox drp_anamorphic;
+ internal System.Windows.Forms.Label lbl_parWidth;
+ internal System.Windows.Forms.NumericUpDown updownDisplayWidth;
+ internal System.Windows.Forms.Label lbl_modulus;
+ internal System.Windows.Forms.Label lbl_displayWidth;
+ internal System.Windows.Forms.ComboBox drp_modulus;
+ internal System.Windows.Forms.Label label8;
+ internal System.Windows.Forms.Label label26;
+ internal System.Windows.Forms.NumericUpDown text_width;
+ internal System.Windows.Forms.NumericUpDown text_height;
+ private System.Windows.Forms.Label lbl_presetCropWarning;
+
+
+
+ }
+}
diff --git a/win/CS/Controls/PictureSettings.cs b/win/CS/Controls/PictureSettings.cs
new file mode 100644
index 000000000..c4ae909c0
--- /dev/null
+++ b/win/CS/Controls/PictureSettings.cs
@@ -0,0 +1,547 @@
+/* PictureSetting.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.Controls
+{
+ using System;
+ using System.Drawing;
+ using System.Globalization;
+ using System.Windows.Forms;
+
+ using HandBrake.ApplicationServices.Model;
+ using HandBrake.ApplicationServices.Parsing;
+
+ /// <summary>
+ /// The Picture Settings Panel
+ /// </summary>
+ public partial class PictureSettings : UserControl
+ {
+ private readonly CultureInfo culture = new CultureInfo("en-US", false);
+ private bool preventChangingWidth;
+ private bool preventChangingHeight;
+ private bool preventChangingCustom;
+ private bool preventChangingDisplayWidth;
+ private double cachedDar;
+ private Title sourceTitle;
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="PictureSettings"/> class.
+ /// Creates a new instance of the Picture Settings Class
+ /// </summary>
+ public PictureSettings()
+ {
+ InitializeComponent();
+
+ drp_anamorphic.SelectedIndex = 1;
+ drp_modulus.SelectedIndex = 0;
+ }
+
+ /// <summary>
+ /// Picture Settings Changed Event Handler
+ /// </summary>
+ public event EventHandler PictureSettingsChanged;
+
+ /// <summary>
+ /// Gets or sets the source media used by this control.
+ /// </summary>
+ public Title Source
+ {
+ private get
+ {
+ return sourceTitle;
+ }
+
+ set
+ {
+ sourceTitle = value;
+ Enabled = sourceTitle != null;
+ NewSourceSet();
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets the currently selected preset.
+ /// </summary>
+ public Preset CurrentlySelectedPreset { get; set; }
+
+ /// <summary>
+ /// Gets or sets the maximum allowable size for the encoded resolution. Set a value to
+ /// "0" if the maximum does not matter.
+ /// </summary>
+ public Size PresetMaximumResolution { get; set; }
+
+ /// <summary>
+ /// Set the Preset Crop Warning Label
+ /// </summary>
+ /// <param name="selectedPreset">
+ /// The Selected preset
+ /// </param>
+ public void SetPresetCropWarningLabel(Preset selectedPreset)
+ {
+ if (this.check_customCrop.Checked)
+ {
+ lbl_presetCropWarning.Visible = true;
+ if (selectedPreset != null && selectedPreset.CropSettings == false) lbl_presetCropWarning.Visible = false;
+ else if (selectedPreset == null) lbl_presetCropWarning.Visible = false;
+ }
+ else
+ {
+ lbl_presetCropWarning.Visible = false;
+ }
+ }
+
+ /// <summary>
+ /// Setup the UI. The Source has just changed.
+ /// </summary>
+ private void NewSourceSet()
+ {
+ // Set the Aspect Ratio
+ lbl_src_res.Text = sourceTitle.Resolution.Width + " x " + sourceTitle.Resolution.Height;
+
+ // Set the Recommended Cropping values, but only if a preset doesn't have hard set picture settings.
+ if ((CurrentlySelectedPreset != null && CurrentlySelectedPreset.CropSettings == false) || CurrentlySelectedPreset == null)
+ {
+ crop_top.Value = GetCropMod2Clean(sourceTitle.AutoCropDimensions.Top);
+ crop_bottom.Value = GetCropMod2Clean(sourceTitle.AutoCropDimensions.Bottom);
+ crop_left.Value = GetCropMod2Clean(sourceTitle.AutoCropDimensions.Left);
+ crop_right.Value = GetCropMod2Clean(sourceTitle.AutoCropDimensions.Right);
+ }
+
+ SetPresetCropWarningLabel(CurrentlySelectedPreset);
+
+ // Set the Resolution Boxes
+ if (drp_anamorphic.SelectedIndex == 0)
+ {
+ int width = sourceTitle.Resolution.Width;
+
+ if (width > PresetMaximumResolution.Width && PresetMaximumResolution.Width != 0) // If the preset has a Max width set, don't use a width larger than it.
+ width = PresetMaximumResolution.Width;
+
+ if (text_width.Value == 0 || (text_width.Value > PresetMaximumResolution.Width && PresetMaximumResolution.Width != 0)) // Only update the values if the fields don't already have values.
+ text_width.Value = width;
+
+ check_KeepAR.Checked = true; // Forces Resolution to be correct.
+ }
+ else
+ {
+ int width = sourceTitle.Resolution.Width;
+ if (width > PresetMaximumResolution.Width && PresetMaximumResolution.Width != 0) // If the preset has a Max width set, don't use a width larger than it.
+ width = PresetMaximumResolution.Width;
+
+ int height = sourceTitle.Resolution.Height;
+ if (height > PresetMaximumResolution.Height && PresetMaximumResolution.Height != 0) // If the preset has a Max height set, don't use a width larger than it.
+ height = PresetMaximumResolution.Height;
+
+ text_width.Value = width;
+ text_height.Value = height - (int)crop_top.Value - (int)crop_bottom.Value;
+
+ labelDisplaySize.Text = CalculateAnamorphicSizes().Width + "x" + CalculateAnamorphicSizes().Height;
+ }
+
+ updownParWidth.Value = sourceTitle.ParVal.Width;
+ updownParHeight.Value = sourceTitle.ParVal.Height;
+
+ Size croppedDar = CalculateAnamorphicSizes();
+ cachedDar = (double)croppedDar.Width / croppedDar.Height;
+ updownDisplayWidth.Value = croppedDar.Width;
+ }
+
+ // Picture Controls
+ private void TextWidthValueChanged(object sender, EventArgs e)
+ {
+ if (preventChangingWidth)
+ return;
+
+ // Make sure the new value doesn't exceed the maximum
+ if (Source != null)
+ if (text_width.Value > Source.Resolution.Width)
+ text_width.Value = Source.Resolution.Width;
+
+ switch (drp_anamorphic.SelectedIndex)
+ {
+ case 0:
+ if (check_KeepAR.Checked && Source != null)
+ {
+ preventChangingHeight = true;
+
+ int width = (int)text_width.Value;
+
+ double crop_width = Source.Resolution.Width - (int)crop_left.Value - (int)crop_right.Value;
+ double crop_height = Source.Resolution.Height - (int)crop_top.Value - (int)crop_bottom.Value;
+
+ if (SourceAspect.Width == 0 && SourceAspect.Height == 0)
+ break;
+
+ double newHeight = ((double)width * Source.Resolution.Width * SourceAspect.Height * crop_height) /
+ (Source.Resolution.Height * SourceAspect.Width * crop_width);
+ text_height.Value = (decimal)GetModulusValue(newHeight);
+
+ preventChangingHeight = false;
+ }
+ break;
+ case 3:
+ if (check_KeepAR.CheckState == CheckState.Unchecked && Source != null)
+ {
+ if (preventChangingCustom)
+ break;
+
+ preventChangingDisplayWidth = true;
+ updownDisplayWidth.Value = text_width.Value * updownParWidth.Value / updownParHeight.Value;
+ preventChangingDisplayWidth = false;
+
+ labelDisplaySize.Text = Math.Truncate(updownDisplayWidth.Value) + "x" + text_height.Value;
+ }
+
+ if (check_KeepAR.CheckState == CheckState.Checked && Source != null)
+ {
+ updownParWidth.Value = updownDisplayWidth.Value;
+ updownParHeight.Value = text_width.Value;
+ }
+ break;
+ default:
+ labelDisplaySize.Text = CalculateAnamorphicSizes().Width + "x" + CalculateAnamorphicSizes().Height;
+ break;
+ }
+
+ preventChangingWidth = false;
+ }
+
+ private void TextHeightValueChanged(object sender, EventArgs e)
+ {
+ if (preventChangingHeight)
+ return;
+
+ if (Source != null)
+ if (text_height.Value > Source.Resolution.Height)
+ text_height.Value = Source.Resolution.Height;
+
+ switch (drp_anamorphic.SelectedIndex)
+ {
+ case 0:
+ if (check_KeepAR.Checked && Source != null)
+ {
+ preventChangingWidth = true;
+
+ double crop_width = Source.Resolution.Width - (int)crop_left.Value - (int)crop_right.Value;
+ double crop_height = Source.Resolution.Height - (int)crop_top.Value - (int)crop_bottom.Value;
+
+ double new_width = ((double)text_height.Value * Source.Resolution.Height * SourceAspect.Width *
+ crop_width) /
+ (Source.Resolution.Width * SourceAspect.Height * crop_height);
+
+ text_width.Value = (decimal)GetModulusValue(new_width);
+
+ preventChangingWidth = false;
+ }
+ break;
+ case 3:
+ labelDisplaySize.Text = Math.Truncate(updownDisplayWidth.Value) + "x" + text_height.Value;
+
+ if (check_KeepAR.CheckState == CheckState.Checked && Source != null)
+ {
+ // - Changes DISPLAY WIDTH to keep DAR
+ // - Changes PIXEL WIDTH to new DISPLAY WIDTH
+ // - Changes PIXEL HEIGHT to STORAGE WIDTH
+ // DAR = DISPLAY WIDTH / DISPLAY HEIGHT (cache after every modification)
+
+ double rawCalculatedDisplayWidth = (double)text_height.Value * cachedDar;
+
+ preventChangingDisplayWidth = true; // Start Guards
+ preventChangingWidth = true;
+
+ updownDisplayWidth.Value = (decimal)rawCalculatedDisplayWidth;
+ updownParWidth.Value = updownDisplayWidth.Value;
+ updownParHeight.Value = text_width.Value;
+
+ preventChangingWidth = false; // Reset Guards
+ preventChangingDisplayWidth = false;
+ }
+
+ break;
+ default:
+ labelDisplaySize.Text = CalculateAnamorphicSizes().Width + "x" + CalculateAnamorphicSizes().Height;
+ break;
+ }
+
+ preventChangingHeight = false;
+ }
+
+ private void CheckKeepArCheckedChanged(object sender, EventArgs e)
+ {
+ // Force TextWidth to recalc height
+ if (check_KeepAR.Checked)
+ TextWidthValueChanged(this, new EventArgs());
+
+ // Disable the Custom Anamorphic Par Controls if checked.
+ if (drp_anamorphic.SelectedIndex == 3)
+ {
+ updownParWidth.Enabled = !check_KeepAR.Checked;
+ updownParHeight.Enabled = !check_KeepAR.Checked;
+ }
+
+ // Raise the Picture Settings Changed Event
+ if (PictureSettingsChanged != null)
+ PictureSettingsChanged(this, new EventArgs());
+ }
+
+ private void UpdownDisplayWidthValueChanged(object sender, EventArgs e)
+ {
+ if (preventChangingDisplayWidth == false && check_KeepAR.CheckState == CheckState.Unchecked)
+ {
+ preventChangingCustom = true;
+ updownParWidth.Value = updownDisplayWidth.Value;
+ updownParHeight.Value = text_width.Value;
+ preventChangingCustom = false;
+ }
+
+ if (preventChangingDisplayWidth == false && check_KeepAR.CheckState == CheckState.Checked)
+ {
+ // - Changes HEIGHT to keep DAR
+ // - Changes PIXEL WIDTH to new DISPLAY WIDTH
+ // - Changes PIXEL HEIGHT to STORAGE WIDTH
+ // DAR = DISPLAY WIDTH / DISPLAY HEIGHT (cache after every modification)
+
+ // Calculate new Height Value
+ int modulus;
+ if (!int.TryParse(drp_modulus.SelectedItem.ToString(), out modulus))
+ modulus = 16;
+
+ int rawCalculatedHeight = (int)((int)updownDisplayWidth.Value / cachedDar);
+ int modulusHeight = rawCalculatedHeight - (rawCalculatedHeight % modulus);
+
+ // Update value
+ preventChangingHeight = true;
+ text_height.Value = (decimal)modulusHeight;
+ updownParWidth.Value = updownDisplayWidth.Value;
+ updownParHeight.Value = text_width.Value;
+ preventChangingHeight = false;
+ }
+ }
+
+ // Anamorphic Controls
+ private void DrpAnamorphicSelectedIndexChanged(object sender, EventArgs e)
+ {
+ switch (drp_anamorphic.SelectedIndex)
+ {
+ case 0: // None
+ text_width.Enabled = true;
+ text_height.Enabled = true;
+ check_KeepAR.Enabled = true;
+
+ SetCustomAnamorphicOptionsVisible(false);
+ labelStaticDisplaySize.Visible = false;
+ labelDisplaySize.Visible = false;
+ drp_modulus.Visible = true;
+ lbl_modulus.Visible = true;
+
+ // check_KeepAR.Checked = true;
+
+ if (check_KeepAR.Checked)
+ TextWidthValueChanged(this, new EventArgs());
+ // Don't update display size if we're not using anamorphic
+ return;
+ case 1: // Strict
+ text_width.Enabled = false;
+ text_height.Enabled = false;
+ check_KeepAR.Enabled = false;
+
+ SetCustomAnamorphicOptionsVisible(false);
+ labelStaticDisplaySize.Visible = true;
+ labelDisplaySize.Visible = true;
+
+ check_KeepAR.Checked = true;
+ break;
+ case 2: // Loose
+ text_width.Enabled = true;
+ text_height.Enabled = false;
+ check_KeepAR.Enabled = false;
+
+ SetCustomAnamorphicOptionsVisible(false);
+ labelStaticDisplaySize.Visible = true;
+ labelDisplaySize.Visible = true;
+ drp_modulus.Visible = true;
+ lbl_modulus.Visible = true;
+
+ check_KeepAR.Checked = true;
+ break;
+ case 3: // Custom
+ text_width.Enabled = true;
+ text_height.Enabled = true;
+ check_KeepAR.Enabled = true;
+
+ SetCustomAnamorphicOptionsVisible(true);
+ labelStaticDisplaySize.Visible = true;
+ labelDisplaySize.Visible = true;
+
+ check_KeepAR.Checked = true;
+ updownParWidth.Enabled = !check_KeepAR.Checked;
+ updownParHeight.Enabled = !check_KeepAR.Checked;
+ break;
+ }
+
+ labelDisplaySize.Text = CalculateAnamorphicSizes().Width + "x" + CalculateAnamorphicSizes().Height;
+
+ if (check_KeepAR.Checked)
+ TextWidthValueChanged(this, new EventArgs());
+
+ if (PictureSettingsChanged != null)
+ PictureSettingsChanged(this, new EventArgs());
+ }
+
+ private void DrpModulusSelectedIndexChanged(object sender, EventArgs e)
+ {
+ preventChangingWidth = true;
+ preventChangingHeight = true;
+
+ text_width.Value = (decimal)GetModulusValue((double)text_width.Value);
+ text_height.Value = (decimal)GetModulusValue((double)text_height.Value);
+
+ preventChangingWidth = false;
+ preventChangingHeight = false;
+
+ text_width.Increment = int.Parse(drp_modulus.SelectedItem.ToString());
+ text_height.Increment = int.Parse(drp_modulus.SelectedItem.ToString());
+
+ if (PictureSettingsChanged != null)
+ PictureSettingsChanged(this, new EventArgs());
+ }
+
+ // Cropping Controls
+ private void CheckAutoCropCheckedChanged(object sender, EventArgs e)
+ {
+ crop_top.Enabled = check_customCrop.Checked;
+ crop_bottom.Enabled = check_customCrop.Checked;
+ crop_left.Enabled = check_customCrop.Checked;
+ crop_right.Enabled = check_customCrop.Checked;
+
+ if (Source != null)
+ {
+ crop_top.Value = Source.AutoCropDimensions.Top;
+ crop_bottom.Value = Source.AutoCropDimensions.Bottom;
+ crop_left.Value = Source.AutoCropDimensions.Left;
+ crop_right.Value = Source.AutoCropDimensions.Right;
+ }
+ }
+
+ private void CropValueChanged(object sender, EventArgs e)
+ {
+ TextWidthValueChanged(this, new EventArgs());
+ }
+
+ // GUI Functions
+ private void SetCustomAnamorphicOptionsVisible(bool visible)
+ {
+ lbl_modulus.Visible = visible;
+ lbl_displayWidth.Visible = visible;
+ lbl_parWidth.Visible = visible;
+ lbl_parHeight.Visible = visible;
+
+ drp_modulus.Visible = visible;
+ updownDisplayWidth.Visible = visible;
+ updownParWidth.Visible = visible;
+ updownParHeight.Visible = visible;
+ }
+
+ // Calculation Functions
+ private Size SourceAspect
+ {
+ get
+ {
+ if (Source != null) // display aspect = (width * par_width) / (height * par_height)
+ return new Size((Source.ParVal.Width * Source.Resolution.Width),
+ (Source.ParVal.Height * Source.Resolution.Height));
+
+ return new Size(0, 0); // Fall over to 16:9 and hope for the best
+ }
+ }
+
+ private Size CalculateAnamorphicSizes()
+ {
+ if (Source != null)
+ {
+ /* Set up some variables to make the math easier to follow. */
+ int croppedWidth = Source.Resolution.Width - (int)crop_left.Value - (int)crop_right.Value;
+ int croppedHeight = Source.Resolution.Height - (int)crop_top.Value - (int)crop_bottom.Value;
+ double storageAspect = (double)croppedWidth / croppedHeight;
+
+ /* Figure out what width the source would display at. */
+ double sourceDisplayWidth = (double)croppedWidth * Source.ParVal.Width / Source.ParVal.Height;
+
+ /*
+ 3 different ways of deciding output dimensions:
+ - 1: Strict anamorphic, preserve source dimensions
+ - 2: Loose anamorphic, round to mod16 and preserve storage aspect ratio
+ - 3: Power user anamorphic, specify everything
+ */
+ double width, height;
+ switch (drp_anamorphic.SelectedIndex)
+ {
+ default:
+ case 1:
+ /* Strict anamorphic */
+ double displayWidth = ((double)croppedWidth * Source.ParVal.Width / Source.ParVal.Height);
+ displayWidth = Math.Round(displayWidth, 0);
+ Size output = new Size((int)displayWidth, croppedHeight);
+ return output;
+ case 2:
+ /* "Loose" anamorphic.
+ - Uses mod16-compliant dimensions,
+ - Allows users to set the width
+ */
+ width = (int)text_width.Value;
+ width = GetModulusValue(width); /* Time to get picture width that divide cleanly.*/
+
+ height = (width / storageAspect) + 0.5;
+ height = GetModulusValue(height); /* Time to get picture height that divide cleanly.*/
+
+ /* The film AR is the source's display width / cropped source height.
+ The output display width is the output height * film AR.
+ The output PAR is the output display width / output storage width. */
+ double pixelAspectWidth = height * sourceDisplayWidth / croppedHeight;
+ double pixelAspectHeight = width;
+
+ double disWidthLoose = (width * pixelAspectWidth / pixelAspectHeight);
+ if (double.IsNaN(disWidthLoose))
+ disWidthLoose = 0;
+ return new Size((int)disWidthLoose, (int)height);
+ case 3:
+
+ // Get the User Interface Values
+ double UIdisplayWidth;
+ double.TryParse(updownDisplayWidth.Text, out UIdisplayWidth);
+
+ /* Anamorphic 3: Power User Jamboree - Set everything based on specified values */
+ height = GetModulusValue((double)text_height.Value);
+
+ if (check_KeepAR.Checked)
+ return new Size((int)Math.Truncate(UIdisplayWidth), (int)height);
+
+ return new Size((int)Math.Truncate(UIdisplayWidth), (int)height);
+ }
+ }
+
+ // Return a default value of 0,0 to indicate failure
+ return new Size(0, 0);
+ }
+
+ private double GetModulusValue(double value)
+ {
+ int mod = int.Parse(drp_modulus.SelectedItem.ToString());
+ double remainder = value % mod;
+
+ if (remainder == 0)
+ return value;
+
+ return remainder >= ((double)mod / 2) ? value + (mod - remainder) : value - remainder;
+ }
+
+ private static int GetCropMod2Clean(int value)
+ {
+ int remainder = value % 2;
+ if (remainder == 0) return value;
+ return (value + remainder);
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/Controls/PictureSettings.resx b/win/CS/Controls/PictureSettings.resx
new file mode 100644
index 000000000..c7e0d4bdf
--- /dev/null
+++ b/win/CS/Controls/PictureSettings.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root> \ No newline at end of file
diff --git a/win/CS/Controls/Subtitles.Designer.cs b/win/CS/Controls/Subtitles.Designer.cs
new file mode 100644
index 000000000..b38b6e4d5
--- /dev/null
+++ b/win/CS/Controls/Subtitles.Designer.cs
@@ -0,0 +1,487 @@
+namespace Handbrake.Controls
+{
+ partial class Subtitles
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ this.btn_addTrack = new System.Windows.Forms.Button();
+ this.btn_RemoveSubTrack = new System.Windows.Forms.Button();
+ this.lv_subList = new System.Windows.Forms.ListView();
+ this.col_Source = new System.Windows.Forms.ColumnHeader();
+ this.col_forced = new System.Windows.Forms.ColumnHeader();
+ this.col_burned = new System.Windows.Forms.ColumnHeader();
+ this.col_defaultTrack = new System.Windows.Forms.ColumnHeader();
+ this.col_srtLang = new System.Windows.Forms.ColumnHeader();
+ this.col_srtChar = new System.Windows.Forms.ColumnHeader();
+ this.col_srtOffset = new System.Windows.Forms.ColumnHeader();
+ this.subMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.mnu_moveup = new System.Windows.Forms.ToolStripMenuItem();
+ this.mnu_movedown = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+ this.mnu_remove = new System.Windows.Forms.ToolStripMenuItem();
+ this.label68 = new System.Windows.Forms.Label();
+ this.SubGroupBox = new System.Windows.Forms.GroupBox();
+ this.drp_subtitleTracks = new System.Windows.Forms.ComboBox();
+ this.label10 = new System.Windows.Forms.Label();
+ this.label9 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.srt_offset = new System.Windows.Forms.NumericUpDown();
+ this.srt_lang = new System.Windows.Forms.ComboBox();
+ this.label8 = new System.Windows.Forms.Label();
+ this.srt_charcode = new System.Windows.Forms.ComboBox();
+ this.label4 = new System.Windows.Forms.Label();
+ this.check_forced = new System.Windows.Forms.CheckBox();
+ this.label7 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.check_default = new System.Windows.Forms.CheckBox();
+ this.check_burned = new System.Windows.Forms.CheckBox();
+ this.btn_srtAdd = new System.Windows.Forms.Button();
+ this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+ this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+ this.subMenu.SuspendLayout();
+ this.SubGroupBox.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.srt_offset)).BeginInit();
+ this.SuspendLayout();
+ //
+ // btn_addTrack
+ //
+ this.btn_addTrack.BackColor = System.Drawing.Color.Transparent;
+ this.btn_addTrack.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btn_addTrack.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_addTrack.Location = new System.Drawing.Point(16, 38);
+ this.btn_addTrack.Name = "btn_addTrack";
+ this.btn_addTrack.Size = new System.Drawing.Size(57, 23);
+ this.btn_addTrack.TabIndex = 68;
+ this.btn_addTrack.Text = "Add";
+ this.toolTip.SetToolTip(this.btn_addTrack, "Add a new subtitle track to the list below");
+ this.btn_addTrack.UseVisualStyleBackColor = false;
+ this.btn_addTrack.Click += new System.EventHandler(this.BtnAddSubTrackClick);
+ //
+ // btn_RemoveSubTrack
+ //
+ this.btn_RemoveSubTrack.BackColor = System.Drawing.Color.Transparent;
+ this.btn_RemoveSubTrack.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btn_RemoveSubTrack.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_RemoveSubTrack.Location = new System.Drawing.Point(79, 38);
+ this.btn_RemoveSubTrack.Name = "btn_RemoveSubTrack";
+ this.btn_RemoveSubTrack.Size = new System.Drawing.Size(73, 23);
+ this.btn_RemoveSubTrack.TabIndex = 69;
+ this.btn_RemoveSubTrack.Text = "Remove";
+ this.btn_RemoveSubTrack.UseVisualStyleBackColor = false;
+ this.btn_RemoveSubTrack.Click += new System.EventHandler(this.BtnRemoveSubTrackClick);
+ //
+ // lv_subList
+ //
+ this.lv_subList.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+ this.col_Source,
+ this.col_forced,
+ this.col_burned,
+ this.col_defaultTrack,
+ this.col_srtLang,
+ this.col_srtChar,
+ this.col_srtOffset});
+ this.lv_subList.ContextMenuStrip = this.subMenu;
+ this.lv_subList.FullRowSelect = true;
+ this.lv_subList.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+ this.lv_subList.HideSelection = false;
+ this.lv_subList.LabelWrap = false;
+ this.lv_subList.Location = new System.Drawing.Point(16, 146);
+ this.lv_subList.MultiSelect = false;
+ this.lv_subList.Name = "lv_subList";
+ this.lv_subList.Size = new System.Drawing.Size(688, 137);
+ this.lv_subList.TabIndex = 70;
+ this.lv_subList.UseCompatibleStateImageBehavior = false;
+ this.lv_subList.View = System.Windows.Forms.View.Details;
+ this.lv_subList.SelectedIndexChanged += new System.EventHandler(this.LbSubListSelectedIndexChanged);
+ //
+ // col_Source
+ //
+ this.col_Source.Text = "Track";
+ this.col_Source.Width = 139;
+ //
+ // col_forced
+ //
+ this.col_forced.Text = "Forced Only";
+ this.col_forced.Width = 74;
+ //
+ // col_burned
+ //
+ this.col_burned.Text = "Burned In";
+ this.col_burned.Width = 64;
+ //
+ // col_defaultTrack
+ //
+ this.col_defaultTrack.Text = "Default";
+ this.col_defaultTrack.Width = 56;
+ //
+ // col_srtLang
+ //
+ this.col_srtLang.Text = "Srt Lang";
+ //
+ // col_srtChar
+ //
+ this.col_srtChar.Text = "Srt CharCode";
+ this.col_srtChar.Width = 110;
+ //
+ // col_srtOffset
+ //
+ this.col_srtOffset.Text = "Srt Offset";
+ this.col_srtOffset.Width = 70;
+ //
+ // subMenu
+ //
+ this.subMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.mnu_moveup,
+ this.mnu_movedown,
+ this.toolStripSeparator2,
+ this.mnu_remove});
+ this.subMenu.Name = "audioMenu";
+ this.subMenu.Size = new System.Drawing.Size(139, 76);
+ //
+ // mnu_moveup
+ //
+ this.mnu_moveup.Name = "mnu_moveup";
+ this.mnu_moveup.Size = new System.Drawing.Size(138, 22);
+ this.mnu_moveup.Text = "Move Up";
+ this.mnu_moveup.Click += new System.EventHandler(this.MnuMoveupClick);
+ //
+ // mnu_movedown
+ //
+ this.mnu_movedown.Name = "mnu_movedown";
+ this.mnu_movedown.Size = new System.Drawing.Size(138, 22);
+ this.mnu_movedown.Text = "Move Down";
+ this.mnu_movedown.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.mnu_movedown.Click += new System.EventHandler(this.MnuMovedownClick);
+ //
+ // toolStripSeparator2
+ //
+ this.toolStripSeparator2.Name = "toolStripSeparator2";
+ this.toolStripSeparator2.Size = new System.Drawing.Size(135, 6);
+ //
+ // mnu_remove
+ //
+ this.mnu_remove.Name = "mnu_remove";
+ this.mnu_remove.Size = new System.Drawing.Size(138, 22);
+ this.mnu_remove.Text = "Remove";
+ this.mnu_remove.Click += new System.EventHandler(this.MnuRemoveClick);
+ //
+ // label68
+ //
+ this.label68.AutoSize = true;
+ this.label68.BackColor = System.Drawing.Color.Transparent;
+ this.label68.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label68.Location = new System.Drawing.Point(13, 13);
+ this.label68.Name = "label68";
+ this.label68.Size = new System.Drawing.Size(57, 13);
+ this.label68.TabIndex = 67;
+ this.label68.Text = "Subtitles";
+ //
+ // SubGroupBox
+ //
+ this.SubGroupBox.BackColor = System.Drawing.Color.Transparent;
+ this.SubGroupBox.Controls.Add(this.drp_subtitleTracks);
+ this.SubGroupBox.Controls.Add(this.label10);
+ this.SubGroupBox.Controls.Add(this.label9);
+ this.SubGroupBox.Controls.Add(this.label2);
+ this.SubGroupBox.Controls.Add(this.srt_offset);
+ this.SubGroupBox.Controls.Add(this.srt_lang);
+ this.SubGroupBox.Controls.Add(this.label8);
+ this.SubGroupBox.Controls.Add(this.srt_charcode);
+ this.SubGroupBox.Controls.Add(this.label4);
+ this.SubGroupBox.Controls.Add(this.check_forced);
+ this.SubGroupBox.Controls.Add(this.label7);
+ this.SubGroupBox.Controls.Add(this.label3);
+ this.SubGroupBox.Controls.Add(this.check_default);
+ this.SubGroupBox.Controls.Add(this.check_burned);
+ this.SubGroupBox.Location = new System.Drawing.Point(16, 67);
+ this.SubGroupBox.Name = "SubGroupBox";
+ this.SubGroupBox.Size = new System.Drawing.Size(688, 73);
+ this.SubGroupBox.TabIndex = 72;
+ this.SubGroupBox.TabStop = false;
+ this.SubGroupBox.Text = "Selected Track: New Track";
+ //
+ // drp_subtitleTracks
+ //
+ this.drp_subtitleTracks.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drp_subtitleTracks.FormattingEnabled = true;
+ this.drp_subtitleTracks.Location = new System.Drawing.Point(6, 35);
+ this.drp_subtitleTracks.Name = "drp_subtitleTracks";
+ this.drp_subtitleTracks.Size = new System.Drawing.Size(164, 21);
+ this.drp_subtitleTracks.TabIndex = 74;
+ this.drp_subtitleTracks.SelectedIndexChanged += new System.EventHandler(this.DrpSubtitleTracksSelectedIndexChanged);
+ //
+ // label10
+ //
+ this.label10.AutoSize = true;
+ this.label10.Location = new System.Drawing.Point(308, 19);
+ this.label10.Name = "label10";
+ this.label10.Size = new System.Drawing.Size(42, 13);
+ this.label10.TabIndex = 81;
+ this.label10.Text = "Default";
+ //
+ // label9
+ //
+ this.label9.AutoSize = true;
+ this.label9.Location = new System.Drawing.Point(248, 19);
+ this.label9.Name = "label9";
+ this.label9.Size = new System.Drawing.Size(54, 13);
+ this.label9.TabIndex = 80;
+ this.label9.Text = "Burned In";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(371, 19);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(71, 13);
+ this.label2.TabIndex = 72;
+ this.label2.Text = "Srt Language";
+ //
+ // srt_offset
+ //
+ this.srt_offset.Enabled = false;
+ this.srt_offset.Increment = new decimal(new int[] {
+ 10,
+ 0,
+ 0,
+ 0});
+ this.srt_offset.Location = new System.Drawing.Point(549, 35);
+ this.srt_offset.Maximum = new decimal(new int[] {
+ 1000000000,
+ 0,
+ 0,
+ 0});
+ this.srt_offset.Minimum = new decimal(new int[] {
+ 1000000000,
+ 0,
+ 0,
+ -2147483648});
+ this.srt_offset.Name = "srt_offset";
+ this.srt_offset.Size = new System.Drawing.Size(58, 21);
+ this.srt_offset.TabIndex = 79;
+ this.srt_offset.ValueChanged += new System.EventHandler(this.SrtOffsetValueChanged);
+ //
+ // srt_lang
+ //
+ this.srt_lang.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.srt_lang.Enabled = false;
+ this.srt_lang.FormattingEnabled = true;
+ this.srt_lang.Location = new System.Drawing.Point(356, 35);
+ this.srt_lang.Name = "srt_lang";
+ this.srt_lang.Size = new System.Drawing.Size(103, 21);
+ this.srt_lang.TabIndex = 50;
+ this.srt_lang.SelectedIndexChanged += new System.EventHandler(this.SrtLangSelectedIndexChanged);
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.Location = new System.Drawing.Point(177, 19);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(65, 13);
+ this.label8.TabIndex = 79;
+ this.label8.Text = "Forced Only";
+ //
+ // srt_charcode
+ //
+ this.srt_charcode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.srt_charcode.Enabled = false;
+ this.srt_charcode.FormattingEnabled = true;
+ this.srt_charcode.Items.AddRange(new object[] {
+ "ANSI_X3.4-1968",
+ "ANSI_X3.4-1986",
+ "ANSI_X3.4",
+ "ANSI_X3.110-1983",
+ "ANSI_X3.110",
+ "ASCII",
+ "ECMA-114",
+ "ECMA-118",
+ "ECMA-128",
+ "ECMA-CYRILLIC",
+ "IEC_P27-1",
+ "ISO-8859-1",
+ "ISO-8859-2",
+ "ISO-8859-3",
+ "ISO-8859-4",
+ "ISO-8859-5",
+ "ISO-8859-6",
+ "ISO-8859-7",
+ "ISO-8859-8",
+ "ISO-8859-9",
+ "ISO-8859-9E",
+ "ISO-8859-10",
+ "ISO-8859-11",
+ "ISO-8859-13",
+ "ISO-8859-14",
+ "ISO-8859-15",
+ "ISO-8859-16",
+ "UTF-7",
+ "UTF-8",
+ "UTF-16",
+ "UTF-32"});
+ this.srt_charcode.Location = new System.Drawing.Point(465, 35);
+ this.srt_charcode.Name = "srt_charcode";
+ this.srt_charcode.Size = new System.Drawing.Size(78, 21);
+ this.srt_charcode.TabIndex = 73;
+ this.srt_charcode.SelectedIndexChanged += new System.EventHandler(this.SrtCharcodeSelectedIndexChanged);
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(548, 19);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(62, 13);
+ this.label4.TabIndex = 76;
+ this.label4.Text = "Offset (ms)";
+ //
+ // check_forced
+ //
+ this.check_forced.AutoSize = true;
+ this.check_forced.Location = new System.Drawing.Point(199, 38);
+ this.check_forced.Name = "check_forced";
+ this.check_forced.Size = new System.Drawing.Size(15, 14);
+ this.check_forced.TabIndex = 75;
+ this.check_forced.UseVisualStyleBackColor = true;
+ this.check_forced.CheckedChanged += new System.EventHandler(this.CheckForcedCheckedChanged);
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.Location = new System.Drawing.Point(69, 19);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(37, 13);
+ this.label7.TabIndex = 78;
+ this.label7.Text = "Track:";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(471, 19);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(58, 13);
+ this.label3.TabIndex = 74;
+ this.label3.Text = "Char Code";
+ //
+ // check_default
+ //
+ this.check_default.AutoSize = true;
+ this.check_default.Location = new System.Drawing.Point(320, 38);
+ this.check_default.Name = "check_default";
+ this.check_default.Size = new System.Drawing.Size(15, 14);
+ this.check_default.TabIndex = 77;
+ this.check_default.UseVisualStyleBackColor = true;
+ this.check_default.CheckedChanged += new System.EventHandler(this.CheckDefaultCheckedChanged);
+ //
+ // check_burned
+ //
+ this.check_burned.AutoSize = true;
+ this.check_burned.Location = new System.Drawing.Point(260, 38);
+ this.check_burned.Name = "check_burned";
+ this.check_burned.Size = new System.Drawing.Size(15, 14);
+ this.check_burned.TabIndex = 76;
+ this.check_burned.UseVisualStyleBackColor = true;
+ this.check_burned.CheckedChanged += new System.EventHandler(this.CheckBurnedCheckedChanged);
+ //
+ // btn_srtAdd
+ //
+ this.btn_srtAdd.BackColor = System.Drawing.Color.Transparent;
+ this.btn_srtAdd.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btn_srtAdd.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_srtAdd.Location = new System.Drawing.Point(158, 38);
+ this.btn_srtAdd.Name = "btn_srtAdd";
+ this.btn_srtAdd.Size = new System.Drawing.Size(88, 23);
+ this.btn_srtAdd.TabIndex = 73;
+ this.btn_srtAdd.Text = "Import SRT";
+ this.toolTip.SetToolTip(this.btn_srtAdd, "Add a new SRT file to the \"track\" dropdown menu.");
+ this.btn_srtAdd.UseVisualStyleBackColor = false;
+ this.btn_srtAdd.Click += new System.EventHandler(this.BtnSrtAddClick);
+ //
+ // openFileDialog
+ //
+ this.openFileDialog.DefaultExt = "srt";
+ this.openFileDialog.Filter = "SRT Files |*.srt";
+ //
+ // Subtitles
+ //
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+ this.BackColor = System.Drawing.Color.Transparent;
+ this.Controls.Add(this.SubGroupBox);
+ this.Controls.Add(this.btn_addTrack);
+ this.Controls.Add(this.label68);
+ this.Controls.Add(this.btn_RemoveSubTrack);
+ this.Controls.Add(this.lv_subList);
+ this.Controls.Add(this.btn_srtAdd);
+ this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Name = "Subtitles";
+ this.Size = new System.Drawing.Size(719, 300);
+ this.subMenu.ResumeLayout(false);
+ this.SubGroupBox.ResumeLayout(false);
+ this.SubGroupBox.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.srt_offset)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Button btn_RemoveSubTrack;
+ private System.Windows.Forms.Button btn_addTrack;
+ internal System.Windows.Forms.ListView lv_subList;
+ private System.Windows.Forms.ColumnHeader col_Source;
+ private System.Windows.Forms.ColumnHeader col_forced;
+ private System.Windows.Forms.ColumnHeader col_burned;
+ internal System.Windows.Forms.Label label68;
+ private System.Windows.Forms.ColumnHeader col_defaultTrack;
+ private System.Windows.Forms.ContextMenuStrip subMenu;
+ private System.Windows.Forms.ToolStripMenuItem mnu_moveup;
+ private System.Windows.Forms.ToolStripMenuItem mnu_movedown;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+ private System.Windows.Forms.ToolStripMenuItem mnu_remove;
+ private System.Windows.Forms.Button btn_srtAdd;
+ private System.Windows.Forms.ColumnHeader col_srtChar;
+ private System.Windows.Forms.ColumnHeader col_srtOffset;
+ private System.Windows.Forms.GroupBox SubGroupBox;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.Label label3;
+ internal System.Windows.Forms.ComboBox srt_charcode;
+ private System.Windows.Forms.Label label2;
+ internal System.Windows.Forms.ComboBox srt_lang;
+ private System.Windows.Forms.NumericUpDown srt_offset;
+ private System.Windows.Forms.OpenFileDialog openFileDialog;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.CheckBox check_default;
+ private System.Windows.Forms.CheckBox check_burned;
+ private System.Windows.Forms.CheckBox check_forced;
+ internal System.Windows.Forms.ComboBox drp_subtitleTracks;
+ private System.Windows.Forms.Label label8;
+ private System.Windows.Forms.Label label9;
+ private System.Windows.Forms.Label label10;
+ private System.Windows.Forms.ColumnHeader col_srtLang;
+ private System.Windows.Forms.ToolTip toolTip;
+ }
+}
diff --git a/win/CS/Controls/Subtitles.cs b/win/CS/Controls/Subtitles.cs
new file mode 100644
index 000000000..0a5240955
--- /dev/null
+++ b/win/CS/Controls/Subtitles.cs
@@ -0,0 +1,734 @@
+/* Subtitles.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.Controls
+{
+ using System;
+ using System.Collections.Generic;
+ using System.IO;
+ using System.Linq;
+ using System.Windows.Forms;
+ using Functions;
+
+ using HandBrake.ApplicationServices.Model;
+ using HandBrake.ApplicationServices.Model.Encoding;
+
+ using Model;
+
+ /// <summary>
+ /// The Subtitles Tab
+ /// </summary>
+ public partial class Subtitles : UserControl
+ {
+ #region Priavate Variables and Collections
+
+ /// <summary>
+ /// Map of languages to language codes
+ /// </summary>
+ private readonly IDictionary<string, string> langMap = new Dictionary<string, string>();
+
+ /// <summary>
+ /// A List of SRT Files
+ /// </summary>
+ private readonly IDictionary<string, string> srtFiles = new Dictionary<string, string>();
+
+ /// <summary>
+ /// The Subtitle List
+ /// </summary>
+ private readonly List<SubtitleTrack> subList = new List<SubtitleTrack>();
+
+ #endregion
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Subtitles"/> class.
+ /// </summary>
+ public Subtitles()
+ {
+ InitializeComponent();
+
+ langMap = Main.MapLanguages();
+ foreach (string key in langMap.Keys)
+ srt_lang.Items.Add(key);
+
+ srt_charcode.SelectedIndex = 28;
+ srt_lang.SelectedIndex = 40;
+ }
+
+ #region Public Methods
+ /// <summary>
+ /// Gets the CLI Query for this panel
+ /// </summary>
+ /// <returns>A CliQuery string</returns>
+ public string GetCliQuery
+ {
+ get
+ {
+ string query = string.Empty;
+ if (lv_subList.Items.Count != 0) // If we have subtitle tracks
+ {
+ // BitMap and CC's
+ string subtitleTracks = String.Empty;
+ string subtitleForced = String.Empty;
+ string subtitleBurn = String.Empty;
+ string subtitleDefault = String.Empty;
+
+ // SRT
+ string srtFile = String.Empty;
+ string srtCodeset = String.Empty;
+ string srtOffset = String.Empty;
+ string srtLang = String.Empty;
+ string srtDefault = String.Empty;
+ int srtCount = 0;
+ int subCount = 0;
+
+ foreach (SubtitleTrack item in subList)
+ {
+ string itemToAdd;
+
+ if (item.IsSrtSubtitle) // We have an SRT file
+ {
+ srtCount++; // SRT track id.
+
+ srtLang += srtLang == string.Empty ? langMap[item.SrtLang] : "," + langMap[item.SrtLang];
+ srtCodeset += srtCodeset == string.Empty ? item.SrtCharCode : "," + item.SrtCharCode;
+
+ if (item.Default)
+ srtDefault = srtCount.ToString();
+
+ itemToAdd = item.SrtPath;
+ srtFile += srtFile == string.Empty ? itemToAdd : "," + itemToAdd;
+
+ itemToAdd = item.SrtOffset.ToString();
+ srtOffset += srtOffset == string.Empty ? itemToAdd : "," + itemToAdd;
+ }
+ else // We have Bitmap or CC
+ {
+ subCount++;
+
+ // Find --subtitle <string>
+ if (item.Track.Contains("Foreign Audio Search"))
+ itemToAdd = "scan";
+ else
+ {
+ string[] tempSub = item.Track.Split(' ');
+ itemToAdd = tempSub[0];
+ }
+
+ subtitleTracks += subtitleTracks == string.Empty ? itemToAdd : "," + itemToAdd;
+
+ // Find --subtitle-forced
+ if (item.Forced)
+ subtitleForced += subtitleForced == string.Empty ? subCount.ToString() : "," + subCount;
+
+ // Find --subtitle-burn
+ if (item.Burned)
+ subtitleBurn = subCount.ToString();
+
+ // Find --subtitle-default
+ if (item.Default)
+ subtitleDefault = subCount.ToString();
+ }
+ }
+
+ // Build The CLI Subtitles Query
+ if (subtitleTracks != string.Empty)
+ {
+ query += " --subtitle " + subtitleTracks;
+
+ if (subtitleForced != string.Empty)
+ query += " --subtitle-forced=" + subtitleForced;
+ if (subtitleBurn != string.Empty)
+ query += " --subtitle-burn=" + subtitleBurn;
+ if (subtitleDefault != string.Empty)
+ query += " --subtitle-default=" + subtitleDefault;
+ }
+
+ if (srtFile != string.Empty) // SRTs
+ {
+ query += " --srt-file " + "\"" + srtFile + "\"";
+
+ if (srtCodeset != string.Empty)
+ query += " --srt-codeset " + srtCodeset;
+ if (srtOffset != string.Empty)
+ query += " --srt-offset " + srtOffset;
+ if (srtLang != string.Empty)
+ query += " --srt-lang " + srtLang;
+ if (srtDefault != string.Empty)
+ query += " --srt-default=" + srtDefault;
+ }
+ }
+ return query;
+ }
+ }
+
+ /// <summary>
+ /// Checks of the current settings will require the m4v file extension
+ /// </summary>
+ /// <returns>True if Yes</returns>
+ public bool RequiresM4V()
+ {
+ return this.subList.Any(track => track.SubtitleType != SubtitleType.VobSub);
+ }
+
+ /// <summary>
+ /// Automatically setup the subtitle tracks.
+ /// This handles the automatic setup of subitles which the user can control from the program options
+ /// </summary>
+ /// <param name="subs">List of Subtitles</param>
+ public void SetSubtitleTrackAuto(object[] subs)
+ {
+ drp_subtitleTracks.Items.Clear();
+ drp_subtitleTracks.Items.Add("Foreign Audio Search (Bitmap)");
+ drp_subtitleTracks.Items.AddRange(subs);
+ drp_subtitleTracks.SelectedIndex = 0;
+ Clear();
+
+ this.AutomaticSubtitleSelection();
+ }
+
+ /// <summary>
+ /// Automatic Subtitle Selection based on user preferences.
+ /// </summary>
+ public void AutomaticSubtitleSelection()
+ {
+ // Handle Native Language and "Dub Foreign language audio" and "Use Foreign language audio and Subtitles" Options
+ if (Properties.Settings.Default.NativeLanguage != "Any")
+ {
+ if (Properties.Settings.Default.DubMode != 1) // We need to add a subtitle track if this is false.
+ {
+ foreach (object item in drp_subtitleTracks.Items)
+ {
+ if (item.ToString().Contains(Properties.Settings.Default.NativeLanguage))
+ {
+ drp_subtitleTracks.SelectedItem = item;
+ BtnAddSubTrackClick(this, new EventArgs());
+ }
+ }
+
+ if (drp_subtitleTracks.SelectedIndex == 0 && Properties.Settings.Default.useClosedCaption)
+ {
+ foreach (object item in drp_subtitleTracks.Items)
+ {
+ if (item.ToString().Contains("Closed"))
+ {
+ drp_subtitleTracks.SelectedItem = item;
+ BtnAddSubTrackClick(this, new EventArgs());
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// Clear the Subtitle List
+ /// </summary>
+ public void Clear()
+ {
+ lv_subList.Items.Clear();
+ subList.Clear();
+ }
+ #endregion
+
+ #region Primary Controls
+
+ /// <summary>
+ /// Add a Subtitle track.
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void BtnAddSubTrackClick(object sender, EventArgs e)
+ {
+ // Logic
+ string forcedVal = check_forced.CheckState == CheckState.Checked ? "Yes" : "No";
+ string defaultSub = check_default.CheckState == CheckState.Checked ? "Yes" : "No";
+ string burnedVal = check_burned.CheckState == CheckState.Checked &&
+ (drp_subtitleTracks.Text.Contains("(VOBSUB)") || drp_subtitleTracks.Text.Contains("(SSA)"))
+ ? "Yes"
+ : "No";
+ string srtCode = "-", srtLangVal = "-", srtPath = "-", srtFile = "-";
+ int srtOffsetMs = 0;
+
+ if (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))
+ {
+ srtFiles.TryGetValue(drp_subtitleTracks.SelectedItem.ToString(), out srtPath);
+ srtFile = drp_subtitleTracks.SelectedItem.ToString();
+ srtLangVal = srt_lang.SelectedItem.ToString();
+ srtCode = srt_charcode.SelectedItem.ToString();
+ srtOffsetMs = (int)srt_offset.Value;
+ if (defaultSub == "Yes") this.SetDefaultToOffForAllSRTTracks();
+ }
+ else
+ {
+ if (defaultSub == "Yes") this.SetDefaultToOffForAllTracks();
+ if (burnedVal == "Yes") this.SetBurnedToOffForAllTracks();
+ }
+
+ string trackName = (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))
+ ? srtLangVal + " (" + srtFile + ")"
+ : drp_subtitleTracks.SelectedItem.ToString();
+
+ SubtitleTrack track = new SubtitleTrack
+ {
+ Track = trackName,
+ Forced = check_forced.Checked,
+ Burned = check_burned.Checked,
+ Default = check_default.Checked,
+ SrtLang = srtLangVal,
+ SrtCharCode = srtCode,
+ SrtOffset = srtOffsetMs,
+ SrtPath = srtPath,
+ SrtFileName = srtFile
+ };
+
+ lv_subList.Items.Add(track.ListView);
+ subList.Add(track);
+ }
+
+ /// <summary>
+ /// Import an SRT Subtitle Track
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void BtnSrtAddClick(object sender, EventArgs e)
+ {
+ if (openFileDialog.ShowDialog() != DialogResult.OK)
+ return;
+
+ if (srtFiles.ContainsKey(Path.GetFileName(openFileDialog.FileName)))
+ {
+ MessageBox.Show(
+ "A Subtitle track with the same name has already been imported.",
+ "Warning",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Warning);
+ return;
+ }
+
+ drp_subtitleTracks.Items.Add(Path.GetFileName(openFileDialog.FileName));
+ drp_subtitleTracks.SelectedItem = Path.GetFileName(openFileDialog.FileName);
+ srtFiles.Add(Path.GetFileName(openFileDialog.FileName), openFileDialog.FileName);
+ }
+
+ /// <summary>
+ /// Remove a subtitle track
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void BtnRemoveSubTrackClick(object sender, EventArgs e)
+ {
+ this.RemoveSelectedTrack();
+ }
+
+ /// <summary>
+ /// The Subtitle List selected index has changed
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void LbSubListSelectedIndexChanged(object sender, EventArgs e)
+ {
+ // Set the dropdown controls based on the selected item in the List.
+ if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)
+ {
+ SubtitleTrack track = subList[lv_subList.SelectedIndices[0]];
+
+ int c = 0;
+ if (lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text.ToLower().Contains(".srt"))
+ // We have an SRT
+ {
+ foreach (var item in drp_subtitleTracks.Items)
+ {
+ if (item.ToString() == track.SrtFileName)
+ drp_subtitleTracks.SelectedIndex = c;
+ c++;
+ }
+ srt_lang.SelectedItem = track.SrtLang;
+ srt_offset.Value = track.SrtOffset;
+ srt_charcode.SelectedItem = track.SrtCharCode;
+ check_default.CheckState = track.Default ? CheckState.Checked : CheckState.Unchecked;
+ SubGroupBox.Text = "Selected Track: " + track.Track;
+ }
+ else // We have Bitmap/CC
+ {
+ foreach (var item in drp_subtitleTracks.Items)
+ {
+ if (item.ToString() == track.Track)
+ drp_subtitleTracks.SelectedIndex = c;
+ c++;
+ }
+ check_forced.CheckState = track.Forced ? CheckState.Checked : CheckState.Unchecked;
+ check_burned.CheckState = track.Burned ? CheckState.Checked : CheckState.Unchecked;
+ check_default.CheckState = track.Default ? CheckState.Checked : CheckState.Unchecked;
+ SubGroupBox.Text = "Selected Track: " +
+ lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text;
+ }
+ }
+ else
+ SubGroupBox.Text = "Selected Track: None (Click \"Add\" to add another track to the list)";
+ }
+
+ #endregion
+
+ #region Subtitle Controls
+
+ /// <summary>
+ /// Handle the Subtitle track dropdown changed event
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void DrpSubtitleTracksSelectedIndexChanged(object sender, EventArgs e)
+ {
+ if (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))
+ {
+ check_forced.Enabled = false;
+ check_burned.Enabled = false;
+ srt_lang.Enabled = true;
+ srt_charcode.Enabled = true;
+ srt_offset.Enabled = true;
+ }
+ else
+ {
+ check_forced.Enabled = true;
+ check_burned.Enabled = true;
+ srt_lang.Enabled = false;
+ srt_charcode.Enabled = false;
+ srt_offset.Enabled = false;
+ }
+ // Update an item in the list if required.
+ if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;
+
+ if (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))
+ {
+ lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text = srt_lang.SelectedItem + "(" +
+ drp_subtitleTracks.SelectedItem + ")";
+ lv_subList.Select();
+
+ string srtPath;
+ srtFiles.TryGetValue(drp_subtitleTracks.SelectedItem.ToString(), out srtPath);
+ subList[lv_subList.SelectedIndices[0]].SrtPath = srtPath;
+ }
+ else
+ {
+ lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text =
+ drp_subtitleTracks.SelectedItem.ToString();
+ lv_subList.Select();
+ }
+
+ subList[lv_subList.SelectedIndices[0]].Track = drp_subtitleTracks.SelectedItem.ToString();
+ }
+
+ /// <summary>
+ /// Foreced Subtitles checkbox changed
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void CheckForcedCheckedChanged(object sender, EventArgs e)
+ {
+ if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;
+
+ lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[1].Text = check_forced.Checked ? "Yes" : "No";
+ lv_subList.Select();
+
+ subList[lv_subList.SelectedIndices[0]].Forced = check_forced.Checked;
+ // Update SubList List<SubtitleInfo>
+ }
+
+ /// <summary>
+ /// Burned in subtitles checkbox changed
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void CheckBurnedCheckedChanged(object sender, EventArgs e)
+ {
+ if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;
+
+ if (check_burned.Checked) // Make sure we only have 1 burned track
+ this.SetBurnedToOffForAllTracks();
+
+ lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[2].Text = check_burned.Checked ? "Yes" : "No";
+ lv_subList.Select();
+
+ subList[lv_subList.SelectedIndices[0]].Burned = check_burned.Checked;
+ // Update SubList List<SubtitleInfo>
+ }
+
+ /// <summary>
+ /// Default Subitle track check changed
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void CheckDefaultCheckedChanged(object sender, EventArgs e)
+ {
+ if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;
+
+ if (check_default.Checked) // Make sure we only have 1 default track
+ if (lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text.Contains(".srt"))
+ this.SetDefaultToOffForAllSRTTracks();
+ else
+ this.SetDefaultToOffForAllTracks();
+
+ lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[3].Text = check_default.Checked ? "Yes" : "No";
+ lv_subList.Select();
+
+ subList[lv_subList.SelectedIndices[0]].Default = check_default.Checked;
+ // Update SubList List<SubtitleInfo>
+ }
+
+ /// <summary>
+ /// Srt Offset Numeric Control Changed
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void SrtOffsetValueChanged(object sender, EventArgs e)
+ {
+ // Update an item in the list if required.
+ if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0)
+ return;
+
+ lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[6].Text = srt_offset.Value.ToString();
+ lv_subList.Select();
+
+ subList[lv_subList.SelectedIndices[0]].SrtOffset = (int)srt_offset.Value;
+ // Update SubList List<SubtitleInfo>
+ }
+
+ /// <summary>
+ /// The SRT Charcode changed
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void SrtCharcodeSelectedIndexChanged(object sender, EventArgs e)
+ {
+ if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;
+
+ lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[5].Text = srt_charcode.SelectedItem.ToString();
+ lv_subList.Select();
+
+ subList[lv_subList.SelectedIndices[0]].SrtCharCode = srt_charcode.SelectedItem.ToString();
+ // Update SubList List<SubtitleInfo>
+ }
+
+ /// <summary>
+ /// The Srt Language code changed
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void SrtLangSelectedIndexChanged(object sender, EventArgs e)
+ {
+ if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;
+
+ lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[4].Text = srt_lang.SelectedItem.ToString();
+ lv_subList.Select();
+
+ subList[lv_subList.SelectedIndices[0]].SrtLang = srt_lang.SelectedItem.ToString();
+ // Update SubList List<SubtitleInfo>
+ }
+
+ #endregion
+
+ #region Right Click Menu
+
+ /// <summary>
+ /// Move an item in the subtitle list up
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void MnuMoveupClick(object sender, EventArgs e)
+ {
+ if (lv_subList.SelectedIndices.Count != 0)
+ {
+ ListViewItem item = lv_subList.SelectedItems[0];
+ int index = item.Index;
+ index--;
+
+ if (lv_subList.Items.Count > index && index >= 0)
+ {
+ lv_subList.Items.Remove(item);
+ lv_subList.Items.Insert(index, item);
+ item.Selected = true;
+ lv_subList.Focus();
+ }
+ }
+ }
+
+ /// <summary>
+ /// Move an item in the subtitle list down
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void MnuMovedownClick(object sender, EventArgs e)
+ {
+ if (lv_subList.SelectedIndices.Count != 0)
+ {
+ ListViewItem item = lv_subList.SelectedItems[0];
+ int index = item.Index;
+ index++;
+
+ if (index < lv_subList.Items.Count)
+ {
+ lv_subList.Items.Remove(item);
+ lv_subList.Items.Insert(index, item);
+ item.Selected = true;
+ lv_subList.Focus();
+ }
+ }
+ }
+
+ /// <summary>
+ /// Remove a selected subtitle track.
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void MnuRemoveClick(object sender, EventArgs e)
+ {
+ this.RemoveSelectedTrack();
+ }
+
+ #endregion
+
+ #region Helpers
+ /// <summary>
+ /// Set all Non SRT tracks to Default = NO
+ /// </summary>
+ private void SetDefaultToOffForAllTracks()
+ {
+ int c = 0;
+ foreach (ListViewItem item in lv_subList.Items)
+ {
+ if (subList[c].SrtPath == "-")
+ {
+ if (item.SubItems[3].Text == "Yes")
+ {
+ item.SubItems[3].Text = "No";
+ subList[c].Default = false;
+ }
+ }
+ c++;
+ }
+ }
+
+ /// <summary>
+ /// Set all subtitle tracks so that they have no default.
+ /// </summary>
+ private void SetDefaultToOffForAllSRTTracks()
+ {
+ int c = 0;
+ foreach (ListViewItem item in lv_subList.Items)
+ {
+ if (!subList[c].IsSrtSubtitle)
+ {
+ if (item.SubItems[3].Text == "Yes")
+ {
+ item.SubItems[3].Text = "No";
+ subList[c].Default = false;
+ }
+ }
+ c++;
+ }
+ }
+
+ /// <summary>
+ /// Set all tracks to Burned = No
+ /// </summary>
+ private void SetBurnedToOffForAllTracks()
+ {
+ int c = 0;
+ foreach (ListViewItem item in lv_subList.Items)
+ {
+ if (item.SubItems[2].Text == "Yes")
+ {
+ item.SubItems[2].Text = "No";
+ subList[c].Burned = false;
+ }
+ c++;
+ }
+ }
+
+ /// <summary>
+ /// Remove a selected track
+ /// </summary>
+ private void RemoveSelectedTrack()
+ {
+ // Remove the Item and reselect the control if the following conditions are met.
+ if (lv_subList.SelectedItems.Count != 0)
+ {
+ // Record the current selected index.
+ int currentPosition = lv_subList.SelectedIndices[0];
+ int selectedInd = lv_subList.SelectedIndices[0];
+
+ lv_subList.Items.RemoveAt(selectedInd);
+ subList.RemoveAt(selectedInd);
+
+ // Now reslect the correct item and give focus to the list.
+ if (lv_subList.Items.Count != 0)
+ {
+ if (currentPosition <= (lv_subList.Items.Count - 1))
+ lv_subList.Items[currentPosition].Selected = true;
+ else if (currentPosition > (lv_subList.Items.Count - 1))
+ lv_subList.Items[lv_subList.Items.Count - 1].Selected = true;
+
+ lv_subList.Select();
+ }
+ }
+ }
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/win/CS/Controls/Subtitles.resx b/win/CS/Controls/Subtitles.resx
new file mode 100644
index 000000000..9be4767af
--- /dev/null
+++ b/win/CS/Controls/Subtitles.resx
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>237, 17</value>
+ </metadata>
+ <metadata name="subMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+ <metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>113, 17</value>
+ </metadata>
+ <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>237, 17</value>
+ </metadata>
+</root> \ No newline at end of file
diff --git a/win/CS/Controls/x264Panel.Designer.cs b/win/CS/Controls/x264Panel.Designer.cs
new file mode 100644
index 000000000..e445c179b
--- /dev/null
+++ b/win/CS/Controls/x264Panel.Designer.cs
@@ -0,0 +1,774 @@
+/* x264Panel.Designer.cs $
+
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.Controls
+{
+ partial class x264Panel
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(x264Panel));
+ this.slider_psytrellis = new System.Windows.Forms.TrackBar();
+ this.lbl_psytrellis = new System.Windows.Forms.Label();
+ this.lbl_psyrd = new System.Windows.Forms.Label();
+ this.slider_psyrd = new System.Windows.Forms.TrackBar();
+ this.lbl_adaptBFrames = new System.Windows.Forms.Label();
+ this.drop_adaptBFrames = new System.Windows.Forms.ComboBox();
+ this.label43 = new System.Windows.Forms.Label();
+ this.btn_reset = new System.Windows.Forms.Button();
+ this.rtf_x264Query = new System.Windows.Forms.RichTextBox();
+ this.check_Cabac = new System.Windows.Forms.CheckBox();
+ this.check_noDCTDecimate = new System.Windows.Forms.CheckBox();
+ this.lbl_trellis = new System.Windows.Forms.Label();
+ this.drop_trellis = new System.Windows.Forms.ComboBox();
+ this.drop_deblockBeta = new System.Windows.Forms.ComboBox();
+ this.label41 = new System.Windows.Forms.Label();
+ this.drop_deblockAlpha = new System.Windows.Forms.ComboBox();
+ this.check_8x8DCT = new System.Windows.Forms.CheckBox();
+ this.label45 = new System.Windows.Forms.Label();
+ this.drop_analysis = new System.Windows.Forms.ComboBox();
+ this.label48 = new System.Windows.Forms.Label();
+ this.drop_subpixelMotionEstimation = new System.Windows.Forms.ComboBox();
+ this.lbl_merange = new System.Windows.Forms.Label();
+ this.drop_MotionEstimationRange = new System.Windows.Forms.ComboBox();
+ this.label54 = new System.Windows.Forms.Label();
+ this.drop_MotionEstimationMethod = new System.Windows.Forms.ComboBox();
+ this.lbl_direct_prediction = new System.Windows.Forms.Label();
+ this.drop_directPrediction = new System.Windows.Forms.ComboBox();
+ this.label62 = new System.Windows.Forms.Label();
+ this.drop_bFrames = new System.Windows.Forms.ComboBox();
+ this.label64 = new System.Windows.Forms.Label();
+ this.drop_refFrames = new System.Windows.Forms.ComboBox();
+ this.ToolTip = new System.Windows.Forms.ToolTip(this.components);
+ this.check_weightp = new System.Windows.Forms.CheckBox();
+ this.slider_adaptiveQuantStrength = new System.Windows.Forms.TrackBar();
+ this.combo_pyrmidalBFrames = new System.Windows.Forms.ComboBox();
+ this.lbl_adaptiveQuantStrength = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ this.lbl_prymidalBframes = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ ((System.ComponentModel.ISupportInitialize)(this.slider_psytrellis)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.slider_psyrd)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.slider_adaptiveQuantStrength)).BeginInit();
+ this.SuspendLayout();
+ //
+ // slider_psytrellis
+ //
+ this.slider_psytrellis.BackColor = System.Drawing.SystemColors.Window;
+ this.slider_psytrellis.Location = new System.Drawing.Point(427, 231);
+ this.slider_psytrellis.Maximum = 20;
+ this.slider_psytrellis.Name = "slider_psytrellis";
+ this.slider_psytrellis.Size = new System.Drawing.Size(131, 45);
+ this.slider_psytrellis.TabIndex = 86;
+ this.ToolTip.SetToolTip(this.slider_psytrellis, "Psychovisual Trellis tries to retain more sharpness and detail, but can cause art" +
+ "ifacting. \r\nIt is considered experimental, which is why it\'s off by default. Goo" +
+ "d values are 0.1 to 0.2.");
+ this.slider_psytrellis.Scroll += new System.EventHandler(this.widgetControlChanged);
+ //
+ // lbl_psytrellis
+ //
+ this.lbl_psytrellis.AutoSize = true;
+ this.lbl_psytrellis.Location = new System.Drawing.Point(309, 231);
+ this.lbl_psytrellis.Name = "lbl_psytrellis";
+ this.lbl_psytrellis.Size = new System.Drawing.Size(102, 13);
+ this.lbl_psytrellis.TabIndex = 85;
+ this.lbl_psytrellis.Text = "Psychovisual Trellis:";
+ //
+ // lbl_psyrd
+ //
+ this.lbl_psyrd.AutoSize = true;
+ this.lbl_psyrd.Location = new System.Drawing.Point(264, 199);
+ this.lbl_psyrd.Name = "lbl_psyrd";
+ this.lbl_psyrd.Size = new System.Drawing.Size(147, 13);
+ this.lbl_psyrd.TabIndex = 84;
+ this.lbl_psyrd.Text = "Psychovisual Rate Distortion:";
+ //
+ // slider_psyrd
+ //
+ this.slider_psyrd.BackColor = System.Drawing.SystemColors.Window;
+ this.slider_psyrd.Location = new System.Drawing.Point(425, 199);
+ this.slider_psyrd.Maximum = 20;
+ this.slider_psyrd.Name = "slider_psyrd";
+ this.slider_psyrd.Size = new System.Drawing.Size(131, 45);
+ this.slider_psyrd.TabIndex = 83;
+ this.ToolTip.SetToolTip(this.slider_psyrd, resources.GetString("slider_psyrd.ToolTip"));
+ this.slider_psyrd.Value = 10;
+ this.slider_psyrd.Scroll += new System.EventHandler(this.widgetControlChanged);
+ //
+ // lbl_adaptBFrames
+ //
+ this.lbl_adaptBFrames.AutoSize = true;
+ this.lbl_adaptBFrames.Location = new System.Drawing.Point(309, 28);
+ this.lbl_adaptBFrames.Name = "lbl_adaptBFrames";
+ this.lbl_adaptBFrames.Size = new System.Drawing.Size(102, 13);
+ this.lbl_adaptBFrames.TabIndex = 81;
+ this.lbl_adaptBFrames.Text = "Adaptive B-Frames:";
+ //
+ // drop_adaptBFrames
+ //
+ this.drop_adaptBFrames.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_adaptBFrames.FormattingEnabled = true;
+ this.drop_adaptBFrames.Items.AddRange(new object[] {
+ "Default (Fast)",
+ "Off",
+ "Fast",
+ "Optimal"});
+ this.drop_adaptBFrames.Location = new System.Drawing.Point(417, 24);
+ this.drop_adaptBFrames.Name = "drop_adaptBFrames";
+ this.drop_adaptBFrames.Size = new System.Drawing.Size(106, 21);
+ this.drop_adaptBFrames.TabIndex = 82;
+ this.ToolTip.SetToolTip(this.drop_adaptBFrames, resources.GetString("drop_adaptBFrames.ToolTip"));
+ this.drop_adaptBFrames.SelectedIndexChanged += new System.EventHandler(this.widgetControlChanged);
+ //
+ // label43
+ //
+ this.label43.AutoSize = true;
+ this.label43.BackColor = System.Drawing.Color.Transparent;
+ this.label43.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label43.Location = new System.Drawing.Point(13, 13);
+ this.label43.Name = "label43";
+ this.label43.Size = new System.Drawing.Size(60, 13);
+ this.label43.TabIndex = 49;
+ this.label43.Text = "Encoding:";
+ //
+ // btn_reset
+ //
+ this.btn_reset.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btn_reset.ForeColor = System.Drawing.Color.DarkOrange;
+ this.btn_reset.Location = new System.Drawing.Point(634, 230);
+ this.btn_reset.Name = "btn_reset";
+ this.btn_reset.Size = new System.Drawing.Size(75, 23);
+ this.btn_reset.TabIndex = 79;
+ this.btn_reset.Text = "Reset All";
+ this.btn_reset.UseVisualStyleBackColor = true;
+ this.btn_reset.Click += new System.EventHandler(this.btn_reset_Click);
+ //
+ // rtf_x264Query
+ //
+ this.rtf_x264Query.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.rtf_x264Query.Location = new System.Drawing.Point(16, 259);
+ this.rtf_x264Query.Name = "rtf_x264Query";
+ this.rtf_x264Query.Size = new System.Drawing.Size(698, 43);
+ this.rtf_x264Query.TabIndex = 80;
+ this.rtf_x264Query.Text = "";
+ this.rtf_x264Query.TextChanged += new System.EventHandler(this.rtf_x264Query_TextChanged);
+ //
+ // check_Cabac
+ //
+ this.check_Cabac.AutoSize = true;
+ this.check_Cabac.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.check_Cabac.Checked = true;
+ this.check_Cabac.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.check_Cabac.Location = new System.Drawing.Point(3, 89);
+ this.check_Cabac.Name = "check_Cabac";
+ this.check_Cabac.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.check_Cabac.Size = new System.Drawing.Size(141, 17);
+ this.check_Cabac.TabIndex = 78;
+ this.check_Cabac.Text = "CABAC Entropy Coding:";
+ this.check_Cabac.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.ToolTip.SetToolTip(this.check_Cabac, resources.GetString("check_Cabac.ToolTip"));
+ this.check_Cabac.UseVisualStyleBackColor = true;
+ this.check_Cabac.CheckedChanged += new System.EventHandler(this.widgetControlChanged);
+ //
+ // check_noDCTDecimate
+ //
+ this.check_noDCTDecimate.AutoSize = true;
+ this.check_noDCTDecimate.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.check_noDCTDecimate.Location = new System.Drawing.Point(30, 212);
+ this.check_noDCTDecimate.Name = "check_noDCTDecimate";
+ this.check_noDCTDecimate.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.check_noDCTDecimate.Size = new System.Drawing.Size(114, 17);
+ this.check_noDCTDecimate.TabIndex = 77;
+ this.check_noDCTDecimate.Text = "No DCT-Decimate:";
+ this.check_noDCTDecimate.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.ToolTip.SetToolTip(this.check_noDCTDecimate, resources.GetString("check_noDCTDecimate.ToolTip"));
+ this.check_noDCTDecimate.UseVisualStyleBackColor = true;
+ this.check_noDCTDecimate.CheckedChanged += new System.EventHandler(this.widgetControlChanged);
+ //
+ // lbl_trellis
+ //
+ this.lbl_trellis.AutoSize = true;
+ this.lbl_trellis.Location = new System.Drawing.Point(563, 43);
+ this.lbl_trellis.Name = "lbl_trellis";
+ this.lbl_trellis.Size = new System.Drawing.Size(38, 13);
+ this.lbl_trellis.TabIndex = 67;
+ this.lbl_trellis.Text = "Trellis:";
+ //
+ // drop_trellis
+ //
+ this.drop_trellis.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_trellis.FormattingEnabled = true;
+ this.drop_trellis.Items.AddRange(new object[] {
+ "Default (Encode Only)",
+ "Off",
+ "Encode Only",
+ "Always"});
+ this.drop_trellis.Location = new System.Drawing.Point(615, 40);
+ this.drop_trellis.Name = "drop_trellis";
+ this.drop_trellis.Size = new System.Drawing.Size(94, 21);
+ this.drop_trellis.TabIndex = 75;
+ this.ToolTip.SetToolTip(this.drop_trellis, resources.GetString("drop_trellis.ToolTip"));
+ this.drop_trellis.SelectedIndexChanged += new System.EventHandler(this.widgetControlChanged);
+ //
+ // drop_deblockBeta
+ //
+ this.drop_deblockBeta.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_deblockBeta.FormattingEnabled = true;
+ this.drop_deblockBeta.Items.AddRange(new object[] {
+ "Default (0)",
+ "-6",
+ "-5",
+ "-4",
+ "-3",
+ "-2",
+ "-1",
+ "0",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6"});
+ this.drop_deblockBeta.Location = new System.Drawing.Point(631, 175);
+ this.drop_deblockBeta.Name = "drop_deblockBeta";
+ this.drop_deblockBeta.Size = new System.Drawing.Size(78, 21);
+ this.drop_deblockBeta.TabIndex = 74;
+ this.ToolTip.SetToolTip(this.drop_deblockBeta, resources.GetString("drop_deblockBeta.ToolTip"));
+ this.drop_deblockBeta.SelectedIndexChanged += new System.EventHandler(this.widgetControlChanged);
+ //
+ // label41
+ //
+ this.label41.AutoSize = true;
+ this.label41.Location = new System.Drawing.Point(563, 152);
+ this.label41.Name = "label41";
+ this.label41.Size = new System.Drawing.Size(62, 13);
+ this.label41.TabIndex = 66;
+ this.label41.Text = "Deblocking:";
+ //
+ // drop_deblockAlpha
+ //
+ this.drop_deblockAlpha.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_deblockAlpha.FormattingEnabled = true;
+ this.drop_deblockAlpha.Items.AddRange(new object[] {
+ "Default (0)",
+ "-6",
+ "-5",
+ "-4",
+ "-3",
+ "-2",
+ "-1",
+ "0",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6"});
+ this.drop_deblockAlpha.Location = new System.Drawing.Point(631, 149);
+ this.drop_deblockAlpha.Name = "drop_deblockAlpha";
+ this.drop_deblockAlpha.Size = new System.Drawing.Size(78, 21);
+ this.drop_deblockAlpha.TabIndex = 73;
+ this.ToolTip.SetToolTip(this.drop_deblockAlpha, resources.GetString("drop_deblockAlpha.ToolTip"));
+ this.drop_deblockAlpha.SelectedIndexChanged += new System.EventHandler(this.widgetControlChanged);
+ //
+ // check_8x8DCT
+ //
+ this.check_8x8DCT.AutoSize = true;
+ this.check_8x8DCT.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.check_8x8DCT.Location = new System.Drawing.Point(44, 111);
+ this.check_8x8DCT.Name = "check_8x8DCT";
+ this.check_8x8DCT.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.check_8x8DCT.Size = new System.Drawing.Size(100, 17);
+ this.check_8x8DCT.TabIndex = 72;
+ this.check_8x8DCT.Text = "8x8 Transform:";
+ this.check_8x8DCT.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.ToolTip.SetToolTip(this.check_8x8DCT, resources.GetString("check_8x8DCT.ToolTip"));
+ this.check_8x8DCT.UseVisualStyleBackColor = true;
+ this.check_8x8DCT.CheckedChanged += new System.EventHandler(this.widgetControlChanged);
+ //
+ // label45
+ //
+ this.label45.AutoSize = true;
+ this.label45.Location = new System.Drawing.Point(563, 16);
+ this.label45.Name = "label45";
+ this.label45.Size = new System.Drawing.Size(78, 13);
+ this.label45.TabIndex = 64;
+ this.label45.Text = "Partition Type:";
+ //
+ // drop_analysis
+ //
+ this.drop_analysis.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_analysis.FormattingEnabled = true;
+ this.drop_analysis.Items.AddRange(new object[] {
+ "Default (most)",
+ "None",
+ "Some",
+ "All"});
+ this.drop_analysis.Location = new System.Drawing.Point(646, 13);
+ this.drop_analysis.Name = "drop_analysis";
+ this.drop_analysis.Size = new System.Drawing.Size(63, 21);
+ this.drop_analysis.TabIndex = 71;
+ this.ToolTip.SetToolTip(this.drop_analysis, resources.GetString("drop_analysis.ToolTip"));
+ this.drop_analysis.SelectedIndexChanged += new System.EventHandler(this.widgetControlChanged);
+ //
+ // label48
+ //
+ this.label48.AutoSize = true;
+ this.label48.Location = new System.Drawing.Point(262, 110);
+ this.label48.Name = "label48";
+ this.label48.Size = new System.Drawing.Size(149, 13);
+ this.label48.TabIndex = 62;
+ this.label48.Text = "Subpixel ME && Mode Decision:";
+ //
+ // drop_subpixelMotionEstimation
+ //
+ this.drop_subpixelMotionEstimation.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_subpixelMotionEstimation.FormattingEnabled = true;
+ this.drop_subpixelMotionEstimation.Items.AddRange(new object[] {
+ "Default (7)",
+ "0: SAD, no subpel (super fast!)",
+ "1: SAD, qpel",
+ "2: SATD, qpel",
+ "3: SATD, multi-qpel",
+ "4: SATD, qpel on all",
+ "5: SATD, multi-qpel on all",
+ "6: RD in I/P-frames",
+ "7: RD in all frames",
+ "8: RD refine in I/P-frames",
+ "9: RD refine in all frames",
+ "10: QPRD in all frames"});
+ this.drop_subpixelMotionEstimation.Location = new System.Drawing.Point(417, 105);
+ this.drop_subpixelMotionEstimation.Name = "drop_subpixelMotionEstimation";
+ this.drop_subpixelMotionEstimation.Size = new System.Drawing.Size(139, 21);
+ this.drop_subpixelMotionEstimation.TabIndex = 70;
+ this.ToolTip.SetToolTip(this.drop_subpixelMotionEstimation, resources.GetString("drop_subpixelMotionEstimation.ToolTip"));
+ this.drop_subpixelMotionEstimation.SelectedIndexChanged += new System.EventHandler(this.widgetControlChanged);
+ //
+ // lbl_merange
+ //
+ this.lbl_merange.AutoSize = true;
+ this.lbl_merange.Location = new System.Drawing.Point(282, 135);
+ this.lbl_merange.Name = "lbl_merange";
+ this.lbl_merange.Size = new System.Drawing.Size(129, 13);
+ this.lbl_merange.TabIndex = 61;
+ this.lbl_merange.Text = "Motion Estimation Range:";
+ //
+ // drop_MotionEstimationRange
+ //
+ this.drop_MotionEstimationRange.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_MotionEstimationRange.FormattingEnabled = true;
+ this.drop_MotionEstimationRange.Items.AddRange(new object[] {
+ "Default (16)",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24",
+ "25",
+ "26",
+ "27",
+ "28",
+ "29",
+ "30",
+ "31",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "40",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "47",
+ "48",
+ "49",
+ "50",
+ "51",
+ "52",
+ "53",
+ "54",
+ "55",
+ "56",
+ "57",
+ "58",
+ "59",
+ "60",
+ "61",
+ "62",
+ "63",
+ "64"});
+ this.drop_MotionEstimationRange.Location = new System.Drawing.Point(417, 132);
+ this.drop_MotionEstimationRange.Name = "drop_MotionEstimationRange";
+ this.drop_MotionEstimationRange.Size = new System.Drawing.Size(139, 21);
+ this.drop_MotionEstimationRange.TabIndex = 69;
+ this.ToolTip.SetToolTip(this.drop_MotionEstimationRange, resources.GetString("drop_MotionEstimationRange.ToolTip"));
+ this.drop_MotionEstimationRange.SelectedIndexChanged += new System.EventHandler(this.widgetControlChanged);
+ //
+ // label54
+ //
+ this.label54.AutoSize = true;
+ this.label54.Location = new System.Drawing.Point(277, 81);
+ this.label54.Name = "label54";
+ this.label54.Size = new System.Drawing.Size(134, 13);
+ this.label54.TabIndex = 60;
+ this.label54.Text = "Motion Estimation Method:";
+ //
+ // drop_MotionEstimationMethod
+ //
+ this.drop_MotionEstimationMethod.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_MotionEstimationMethod.FormattingEnabled = true;
+ this.drop_MotionEstimationMethod.ItemHeight = 13;
+ this.drop_MotionEstimationMethod.Items.AddRange(new object[] {
+ "Default (Hexagon)",
+ "Diamond",
+ "Hexagon",
+ "Uneven Multi-Hexagon",
+ "Exhaustive",
+ "Transformed Exhaustive"});
+ this.drop_MotionEstimationMethod.Location = new System.Drawing.Point(417, 78);
+ this.drop_MotionEstimationMethod.Name = "drop_MotionEstimationMethod";
+ this.drop_MotionEstimationMethod.Size = new System.Drawing.Size(139, 21);
+ this.drop_MotionEstimationMethod.TabIndex = 68;
+ this.ToolTip.SetToolTip(this.drop_MotionEstimationMethod, resources.GetString("drop_MotionEstimationMethod.ToolTip"));
+ this.drop_MotionEstimationMethod.SelectedIndexChanged += new System.EventHandler(this.widgetControlChanged);
+ //
+ // lbl_direct_prediction
+ //
+ this.lbl_direct_prediction.AutoSize = true;
+ this.lbl_direct_prediction.Location = new System.Drawing.Point(297, 54);
+ this.lbl_direct_prediction.Name = "lbl_direct_prediction";
+ this.lbl_direct_prediction.Size = new System.Drawing.Size(114, 13);
+ this.lbl_direct_prediction.TabIndex = 53;
+ this.lbl_direct_prediction.Text = "Adaptive Direct Mode:";
+ //
+ // drop_directPrediction
+ //
+ this.drop_directPrediction.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_directPrediction.FormattingEnabled = true;
+ this.drop_directPrediction.Items.AddRange(new object[] {
+ "Default (Spatial)",
+ "None",
+ "Spatial",
+ "Temporal",
+ "Automatic"});
+ this.drop_directPrediction.Location = new System.Drawing.Point(417, 51);
+ this.drop_directPrediction.Name = "drop_directPrediction";
+ this.drop_directPrediction.Size = new System.Drawing.Size(106, 21);
+ this.drop_directPrediction.TabIndex = 57;
+ this.ToolTip.SetToolTip(this.drop_directPrediction, resources.GetString("drop_directPrediction.ToolTip"));
+ this.drop_directPrediction.SelectedIndexChanged += new System.EventHandler(this.widgetControlChanged);
+ //
+ // label62
+ //
+ this.label62.AutoSize = true;
+ this.label62.Location = new System.Drawing.Point(21, 64);
+ this.label62.Name = "label62";
+ this.label62.Size = new System.Drawing.Size(103, 13);
+ this.label62.TabIndex = 52;
+ this.label62.Text = "Maximum B-Frames:";
+ //
+ // drop_bFrames
+ //
+ this.drop_bFrames.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_bFrames.FormattingEnabled = true;
+ this.drop_bFrames.Items.AddRange(new object[] {
+ "Default (3)",
+ "0",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16"});
+ this.drop_bFrames.Location = new System.Drawing.Point(129, 61);
+ this.drop_bFrames.Name = "drop_bFrames";
+ this.drop_bFrames.Size = new System.Drawing.Size(106, 21);
+ this.drop_bFrames.TabIndex = 56;
+ this.ToolTip.SetToolTip(this.drop_bFrames, resources.GetString("drop_bFrames.ToolTip"));
+ this.drop_bFrames.SelectedIndexChanged += new System.EventHandler(this.widgetControlChanged);
+ //
+ // label64
+ //
+ this.label64.AutoSize = true;
+ this.label64.Location = new System.Drawing.Point(25, 38);
+ this.label64.Name = "label64";
+ this.label64.Size = new System.Drawing.Size(99, 13);
+ this.label64.TabIndex = 50;
+ this.label64.Text = "Reference Frames:";
+ //
+ // drop_refFrames
+ //
+ this.drop_refFrames.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_refFrames.FormattingEnabled = true;
+ this.drop_refFrames.Items.AddRange(new object[] {
+ "Default (3)",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16"});
+ this.drop_refFrames.Location = new System.Drawing.Point(129, 35);
+ this.drop_refFrames.Name = "drop_refFrames";
+ this.drop_refFrames.Size = new System.Drawing.Size(106, 21);
+ this.drop_refFrames.TabIndex = 54;
+ this.ToolTip.SetToolTip(this.drop_refFrames, resources.GetString("drop_refFrames.ToolTip"));
+ this.drop_refFrames.SelectedIndexChanged += new System.EventHandler(this.widgetControlChanged);
+ //
+ // ToolTip
+ //
+ this.ToolTip.Active = false;
+ this.ToolTip.AutomaticDelay = 1000;
+ this.ToolTip.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info;
+ //
+ // check_weightp
+ //
+ this.check_weightp.AutoSize = true;
+ this.check_weightp.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.check_weightp.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.check_weightp.Location = new System.Drawing.Point(20, 134);
+ this.check_weightp.Name = "check_weightp";
+ this.check_weightp.RightToLeft = System.Windows.Forms.RightToLeft.No;
+ this.check_weightp.Size = new System.Drawing.Size(124, 17);
+ this.check_weightp.TabIndex = 87;
+ this.check_weightp.Text = "Weighted P-Frames:";
+ this.ToolTip.SetToolTip(this.check_weightp, resources.GetString("check_weightp.ToolTip"));
+ this.check_weightp.UseVisualStyleBackColor = true;
+ this.check_weightp.CheckedChanged += new System.EventHandler(this.widgetControlChanged);
+ //
+ // slider_adaptiveQuantStrength
+ //
+ this.slider_adaptiveQuantStrength.BackColor = System.Drawing.SystemColors.Window;
+ this.slider_adaptiveQuantStrength.Location = new System.Drawing.Point(425, 167);
+ this.slider_adaptiveQuantStrength.Maximum = 20;
+ this.slider_adaptiveQuantStrength.Name = "slider_adaptiveQuantStrength";
+ this.slider_adaptiveQuantStrength.Size = new System.Drawing.Size(131, 45);
+ this.slider_adaptiveQuantStrength.TabIndex = 88;
+ this.ToolTip.SetToolTip(this.slider_adaptiveQuantStrength, "Adaptive quantization controls how the encoder distributes bits across the frame." +
+ " \r\nHigher values take more bits away from edges and complex areas to improve ar" +
+ "eas with finer detail");
+ this.slider_adaptiveQuantStrength.Value = 10;
+ this.slider_adaptiveQuantStrength.Scroll += new System.EventHandler(this.widgetControlChanged);
+ //
+ // combo_pyrmidalBFrames
+ //
+ this.combo_pyrmidalBFrames.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.combo_pyrmidalBFrames.FormattingEnabled = true;
+ this.combo_pyrmidalBFrames.Items.AddRange(new object[] {
+ "Default (Normal)",
+ "Off",
+ "Strict"});
+ this.combo_pyrmidalBFrames.Location = new System.Drawing.Point(129, 157);
+ this.combo_pyrmidalBFrames.Name = "combo_pyrmidalBFrames";
+ this.combo_pyrmidalBFrames.Size = new System.Drawing.Size(106, 21);
+ this.combo_pyrmidalBFrames.TabIndex = 92;
+ this.ToolTip.SetToolTip(this.combo_pyrmidalBFrames, resources.GetString("combo_pyrmidalBFrames.ToolTip"));
+ this.combo_pyrmidalBFrames.SelectedIndexChanged += new System.EventHandler(this.widgetControlChanged);
+ //
+ // lbl_adaptiveQuantStrength
+ //
+ this.lbl_adaptiveQuantStrength.AutoSize = true;
+ this.lbl_adaptiveQuantStrength.Location = new System.Drawing.Point(248, 171);
+ this.lbl_adaptiveQuantStrength.Name = "lbl_adaptiveQuantStrength";
+ this.lbl_adaptiveQuantStrength.Size = new System.Drawing.Size(163, 13);
+ this.lbl_adaptiveQuantStrength.TabIndex = 89;
+ this.lbl_adaptiveQuantStrength.Text = "Adaptive Quantization Strength:";
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.BackColor = System.Drawing.Color.Transparent;
+ this.label1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label1.Location = new System.Drawing.Point(13, 193);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(83, 13);
+ this.label1.TabIndex = 90;
+ this.label1.Text = "Psychovisual:";
+ //
+ // lbl_prymidalBframes
+ //
+ this.lbl_prymidalBframes.AutoSize = true;
+ this.lbl_prymidalBframes.Location = new System.Drawing.Point(20, 160);
+ this.lbl_prymidalBframes.Name = "lbl_prymidalBframes";
+ this.lbl_prymidalBframes.Size = new System.Drawing.Size(105, 13);
+ this.lbl_prymidalBframes.TabIndex = 91;
+ this.lbl_prymidalBframes.Text = "Pyramidal B-Frames:";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.BackColor = System.Drawing.Color.Transparent;
+ this.label3.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label3.Location = new System.Drawing.Point(248, 13);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(57, 13);
+ this.label3.TabIndex = 93;
+ this.label3.Text = "Analysis:";
+ //
+ // x264Panel
+ //
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+ this.BackColor = System.Drawing.Color.Transparent;
+ this.Controls.Add(this.label3);
+ this.Controls.Add(this.rtf_x264Query);
+ this.Controls.Add(this.lbl_prymidalBframes);
+ this.Controls.Add(this.combo_pyrmidalBFrames);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.slider_psytrellis);
+ this.Controls.Add(this.slider_psyrd);
+ this.Controls.Add(this.lbl_adaptiveQuantStrength);
+ this.Controls.Add(this.slider_adaptiveQuantStrength);
+ this.Controls.Add(this.check_weightp);
+ this.Controls.Add(this.lbl_psytrellis);
+ this.Controls.Add(this.lbl_psyrd);
+ this.Controls.Add(this.lbl_adaptBFrames);
+ this.Controls.Add(this.drop_adaptBFrames);
+ this.Controls.Add(this.label43);
+ this.Controls.Add(this.btn_reset);
+ this.Controls.Add(this.check_Cabac);
+ this.Controls.Add(this.check_noDCTDecimate);
+ this.Controls.Add(this.lbl_trellis);
+ this.Controls.Add(this.drop_trellis);
+ this.Controls.Add(this.drop_deblockBeta);
+ this.Controls.Add(this.label41);
+ this.Controls.Add(this.drop_deblockAlpha);
+ this.Controls.Add(this.check_8x8DCT);
+ this.Controls.Add(this.label45);
+ this.Controls.Add(this.drop_analysis);
+ this.Controls.Add(this.label48);
+ this.Controls.Add(this.drop_subpixelMotionEstimation);
+ this.Controls.Add(this.lbl_merange);
+ this.Controls.Add(this.drop_MotionEstimationRange);
+ this.Controls.Add(this.label54);
+ this.Controls.Add(this.drop_MotionEstimationMethod);
+ this.Controls.Add(this.lbl_direct_prediction);
+ this.Controls.Add(this.drop_directPrediction);
+ this.Controls.Add(this.label62);
+ this.Controls.Add(this.drop_bFrames);
+ this.Controls.Add(this.label64);
+ this.Controls.Add(this.drop_refFrames);
+ this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Name = "x264Panel";
+ this.Size = new System.Drawing.Size(720, 305);
+ ((System.ComponentModel.ISupportInitialize)(this.slider_psytrellis)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.slider_psyrd)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.slider_adaptiveQuantStrength)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ internal System.Windows.Forms.TrackBar slider_psytrellis;
+ internal System.Windows.Forms.Label lbl_psytrellis;
+ internal System.Windows.Forms.Label lbl_psyrd;
+ internal System.Windows.Forms.TrackBar slider_psyrd;
+ internal System.Windows.Forms.Label lbl_adaptBFrames;
+ internal System.Windows.Forms.ComboBox drop_adaptBFrames;
+ internal System.Windows.Forms.Label label43;
+ internal System.Windows.Forms.Button btn_reset;
+ internal System.Windows.Forms.RichTextBox rtf_x264Query;
+ internal System.Windows.Forms.CheckBox check_Cabac;
+ internal System.Windows.Forms.CheckBox check_noDCTDecimate;
+ internal System.Windows.Forms.Label lbl_trellis;
+ internal System.Windows.Forms.ComboBox drop_trellis;
+ internal System.Windows.Forms.ComboBox drop_deblockBeta;
+ internal System.Windows.Forms.Label label41;
+ internal System.Windows.Forms.ComboBox drop_deblockAlpha;
+ internal System.Windows.Forms.CheckBox check_8x8DCT;
+ internal System.Windows.Forms.Label label45;
+ internal System.Windows.Forms.ComboBox drop_analysis;
+ internal System.Windows.Forms.Label label48;
+ internal System.Windows.Forms.ComboBox drop_subpixelMotionEstimation;
+ internal System.Windows.Forms.Label lbl_merange;
+ internal System.Windows.Forms.ComboBox drop_MotionEstimationRange;
+ internal System.Windows.Forms.Label label54;
+ internal System.Windows.Forms.ComboBox drop_MotionEstimationMethod;
+ internal System.Windows.Forms.Label lbl_direct_prediction;
+ internal System.Windows.Forms.ComboBox drop_directPrediction;
+ internal System.Windows.Forms.Label label62;
+ internal System.Windows.Forms.ComboBox drop_bFrames;
+ internal System.Windows.Forms.Label label64;
+ internal System.Windows.Forms.ComboBox drop_refFrames;
+ private System.Windows.Forms.ToolTip ToolTip;
+ internal System.Windows.Forms.CheckBox check_weightp;
+ internal System.Windows.Forms.Label lbl_adaptiveQuantStrength;
+ internal System.Windows.Forms.TrackBar slider_adaptiveQuantStrength;
+ internal System.Windows.Forms.Label label1;
+ internal System.Windows.Forms.Label lbl_prymidalBframes;
+ internal System.Windows.Forms.ComboBox combo_pyrmidalBFrames;
+ internal System.Windows.Forms.Label label3;
+ }
+}
diff --git a/win/CS/Controls/x264Panel.cs b/win/CS/Controls/x264Panel.cs
new file mode 100644
index 000000000..7678539f2
--- /dev/null
+++ b/win/CS/Controls/x264Panel.cs
@@ -0,0 +1,1076 @@
+/* x264Panel.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.Controls
+{
+ using System;
+ using System.Globalization;
+ using System.Windows.Forms;
+
+ /// <summary>
+ /// The x264 Panel
+ /// </summary>
+ public partial class x264Panel : UserControl
+ {
+ /*
+ * TODO This code was ported from the obj-c MacGUI code. It's really messy and could really do with being cleaned up
+ * at some point.
+ */
+
+ private CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="x264Panel"/> class.
+ /// Initializes a new instance of the x264 panel user control
+ /// </summary>
+ public x264Panel()
+ {
+ InitializeComponent();
+
+ if (Properties.Settings.Default.tooltipEnable)
+ ToolTip.Active = true;
+
+ Reset2Defaults();
+ }
+
+ /// <summary>
+ /// Gets or sets the X264 query string
+ /// </summary>
+ public string X264Query
+ {
+ get
+ {
+ return rtf_x264Query.Text;
+ }
+ set
+ {
+ rtf_x264Query.Text = value;
+ }
+ }
+
+ /// <summary>
+ /// Reset all components to defaults and clears the x264 rtf box
+ /// </summary>
+ public void Reset2Defaults()
+ {
+ check_8x8DCT.CheckState = CheckState.Checked;
+ check_Cabac.CheckState = CheckState.Checked;
+ check_weightp.CheckState = CheckState.Checked;
+ check_noDCTDecimate.CheckState = CheckState.Unchecked;
+ combo_pyrmidalBFrames.SelectedIndex = 0;
+ drop_analysis.SelectedIndex = 0;
+ drop_bFrames.SelectedIndex = 0;
+ drop_deblockAlpha.SelectedIndex = 0;
+ drop_deblockBeta.SelectedIndex = 0;
+ drop_directPrediction.SelectedIndex = 0;
+ drop_MotionEstimationMethod.SelectedIndex = 0;
+ drop_MotionEstimationRange.SelectedIndex = 0;
+ drop_refFrames.SelectedIndex = 0;
+ drop_subpixelMotionEstimation.SelectedIndex = 0;
+ drop_trellis.SelectedIndex = 0;
+ slider_psyrd.Value = 10;
+ slider_psytrellis.Value = 0;
+ drop_adaptBFrames.SelectedIndex = 0;
+ slider_adaptiveQuantStrength.Value = slider_adaptiveQuantStrength.Maximum / 2;
+
+ rtf_x264Query.Text = string.Empty;
+ }
+
+ #region Standardize Option String
+ /// <summary>
+ /// Iterate over every x264 option, standardize it, write the full string to the x264 rtf box
+ /// </summary>
+ public void StandardizeOptString()
+ {
+ /* Set widgets depending on the opt string in field */
+ string thisOpt; // The separated option such as "bframes=3"
+ string optName; // The option name such as "bframes"
+ string optValue; // The option value such as "3"
+ string changedOptString = string.Empty;
+ string[] currentOptsArray;
+
+ /*First, we get an opt string to process */
+ string currentOptString = rtf_x264Query.Text;
+
+ /*verify there is an opt string to process */
+ if (currentOptString.Contains("="))
+ {
+ /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
+ currentOptsArray = currentOptString.Split(':');
+
+ /*iterate through the array and get <opts> and <values*/
+ int loopcounter;
+ int currentOptsArrayCount = currentOptsArray.Length;
+ for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)
+ {
+ thisOpt = currentOptsArray[loopcounter];
+ if (currentOptsArray[currentOptsArrayCount - 1] == string.Empty)
+ break;
+
+ string[] splitOptRange = thisOpt.Split('=');
+ if (thisOpt != string.Empty)
+ {
+ if (thisOpt.Contains("="))
+ {
+ optName = splitOptRange[0];
+ optValue = splitOptRange[1];
+
+ /* Standardize the names here depending on whats in the string */
+ optName = StandardizeOptName(optName);
+ thisOpt = optName + "=" + optValue;
+ }
+ else // No value given so we use a default of "1"
+ {
+ optName = thisOpt;
+ /* Standardize the names here depending on whats in the string */
+ optName = StandardizeOptName(optName);
+ thisOpt = optName + "=1";
+ }
+ }
+
+ /* Construct New String for opts here */
+ if (thisOpt == string.Empty)
+ changedOptString = changedOptString + thisOpt;
+ else
+ {
+ if (changedOptString == string.Empty)
+ changedOptString = thisOpt;
+ else
+ changedOptString = changedOptString + ":" + thisOpt;
+ }
+ }
+ }
+
+ /* Change the option string to reflect the new standardized option string */
+ if (changedOptString != string.Empty)
+ rtf_x264Query.Text = changedOptString;
+ }
+
+ /// <summary>
+ /// Take a single option and standardize it. Returns as a String
+ /// Input: String. - Single X264 Option. Name only
+ /// Output: String - Single X264 Option. Name only. Changed to standard format
+ /// </summary>
+ /// <param name="cleanOptNameString">a string of x264 options to clean</param>
+ /// <returns>A string containing standardized x264 option names</returns>
+ private static string StandardizeOptName(string cleanOptNameString)
+ {
+ string input = cleanOptNameString;
+
+ /* Reference Frames */
+ if (input.Equals("ref") || input.Equals("frameref"))
+ cleanOptNameString = "ref";
+
+ /*No Dict Decimate*/
+ if (input.Equals("no-dct-decimate") || input.Equals("no_dct_decimate") || input.Equals("nodct_decimate"))
+ cleanOptNameString = "no-dct-decimate";
+
+ /*Subme*/
+ if (input.Equals("subme"))
+ cleanOptNameString = "subq";
+
+ /*ME Range*/
+ if (input.Equals("me-range") || input.Equals("me_range"))
+ cleanOptNameString = "merange";
+
+ /*B Pyramid*/
+ if (input.Equals("b_pyramid"))
+ cleanOptNameString = "b-pyramid";
+
+ /*Direct Prediction*/
+ if (input.Equals("direct-pred") || input.Equals("direct_pred"))
+ cleanOptNameString = "direct";
+
+ /*Deblocking*/
+ if (input.Equals("filter"))
+ cleanOptNameString = "deblock";
+
+ /*Analysis*/
+ if (input.Equals("partitions"))
+ cleanOptNameString = "analyse";
+
+ return cleanOptNameString;
+ }
+ #endregion
+
+ /// <summary>
+ /// Resets the GUI widgets to the contents of the option string.
+ /// </summary>
+ public void SetCurrentSettingsInPanel()
+ {
+ /* Set widgets depending on the opt string in field */
+ string thisOpt; // The separated option such as "bframes=3"
+ string optName; // The option name such as "bframes"
+ string optValue; // The option value such as "3"
+ string[] currentOptsArray;
+
+ // Set currentOptString to the contents of the text box.
+ string currentOptString = rtf_x264Query.Text.Replace("\n", string.Empty);
+
+ /*verify there is an opt string to process */
+ if (currentOptString.Contains("="))
+ {
+ /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
+ currentOptsArray = currentOptString.Split(':');
+
+ /*iterate through the array and get <opts> and <values*/
+ int loopcounter;
+ int currentOptsArrayCount = currentOptsArray.Length;
+
+ /*iterate through the array and get <opts> and <values*/
+ for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)
+ {
+ thisOpt = currentOptsArray[loopcounter];
+ string[] splitOptRange = thisOpt.Split('=');
+
+ if (thisOpt.Contains("="))
+ {
+ optName = splitOptRange[0];
+ optValue = splitOptRange[1];
+
+ /*Run through the available widgets for x264 opts and set them, as you add widgets,
+ they need to be added here. This should be moved to its own method probably*/
+ switch (optName)
+ {
+ case "bframes":
+ drop_bFrames.SelectedItem = optValue;
+ continue;
+ case "ref":
+ drop_refFrames.SelectedItem = optValue;
+ continue;
+ case "weightp":
+ this.check_weightp.CheckState = optValue == "0" ? CheckState.Unchecked : CheckState.Checked;
+ continue;
+ case "no-dct-decimate":
+ check_noDCTDecimate.CheckState = CheckState.Checked;
+ continue;
+ case "subq":
+ int subqValue;
+ if (int.TryParse(optValue, out subqValue))
+ {
+ drop_subpixelMotionEstimation.SelectedIndex = subqValue + 1;
+ }
+ continue;
+ case "trellis":
+ switch (optValue)
+ {
+ case "0":
+ drop_trellis.SelectedIndex = 1;
+ break;
+ case "1":
+ drop_trellis.SelectedIndex = 2;
+ break;
+ case "2":
+ drop_trellis.SelectedIndex = 3;
+ break;
+ }
+ continue;
+ case "me":
+ if (optValue.Equals("dia"))
+ drop_MotionEstimationMethod.SelectedItem = "Diamond";
+ else if (optValue.Equals("hex"))
+ drop_MotionEstimationMethod.SelectedItem = "Hexagon";
+ else if (optValue.Equals("umh"))
+ drop_MotionEstimationMethod.SelectedItem = "Uneven Multi-Hexagon";
+ else if (optValue.Equals("esa"))
+ drop_MotionEstimationMethod.SelectedItem = "Exhaustive";
+ else if (optValue.Equals("tesa"))
+ drop_MotionEstimationMethod.SelectedItem = "Transformed Exhaustive";
+ continue;
+ case "merange":
+ drop_MotionEstimationRange.SelectedItem = optValue;
+ continue;
+ case "b-adapt":
+ int badapt;
+ int.TryParse(optValue, out badapt);
+ drop_adaptBFrames.SelectedIndex = (badapt + 1);
+ continue;
+ case "b-pyramid":
+ switch (optValue)
+ {
+ case "normal":
+ combo_pyrmidalBFrames.SelectedIndex = 0;
+ break;
+ case "strict":
+ combo_pyrmidalBFrames.SelectedIndex = 2;
+ break;
+ case "none":
+ combo_pyrmidalBFrames.SelectedIndex = 1;
+ break;
+ }
+ continue;
+ case "direct":
+ if (optValue == "auto")
+ optValue = "Automatic";
+
+ if (optValue != string.Empty)
+ {
+ char[] letters = optValue.ToCharArray();
+ letters[0] = Char.ToUpper(letters[0]);
+ optValue = new string(letters);
+ }
+
+ drop_directPrediction.SelectedItem = optValue;
+ continue;
+ case "deblock":
+ string[] splitDeblock = optValue.Split(',');
+ string alphaDeblock = splitDeblock[0];
+ string betaDeblock = splitDeblock[1];
+
+ if (alphaDeblock.Equals("0") && betaDeblock.Replace("\n", string.Empty).Equals("0"))
+ {
+ drop_deblockAlpha.SelectedItem = "Default (0)";
+ drop_deblockBeta.SelectedItem = "Default (0)";
+ }
+ else
+ {
+ drop_deblockAlpha.SelectedItem = !alphaDeblock.Equals("0") ? alphaDeblock : "0";
+
+ drop_deblockBeta.SelectedItem = !betaDeblock.Replace("\n", string.Empty).Equals("0")
+ ? betaDeblock.Replace("\n", string.Empty)
+ : "0";
+ }
+ continue;
+ case "analyse":
+ if (optValue.Equals("p8x8,b8x8,i8x8,i4x4"))
+ drop_analysis.SelectedItem = "Default (most)";
+ if (optValue.Equals("none"))
+ drop_analysis.SelectedItem = "None";
+ if (optValue.Equals("i4x4,i8x8"))
+ drop_analysis.SelectedItem = "Some";
+ if (optValue.Equals("all"))
+ drop_analysis.SelectedItem = "All";
+ continue;
+ case "8x8dct":
+ check_8x8DCT.CheckState = optValue == "1" ? CheckState.Checked : CheckState.Unchecked;
+ continue;
+ case "aq-strength":
+ float value;
+ float.TryParse(optValue, NumberStyles.Float, CultureInfo.InvariantCulture, out value);
+ int sliderValue;
+ int.TryParse((value * 10).ToString(), out sliderValue);
+ slider_adaptiveQuantStrength.Value = sliderValue;
+ continue;
+ case "cabac":
+ check_Cabac.CheckState = CheckState.Unchecked;
+ continue;
+ case "psy-rd":
+ string[] x = optValue.Split(',');
+
+ double psyrd, psytrellis;
+ int val, val2;
+
+ // default psy-rd = 1 (10 for the slider)
+ psyrd = double.TryParse(x[0], NumberStyles.Float, CultureInfo.InvariantCulture, out psyrd) ? psyrd * 10 : 10.0;
+ // default psy-trellis = 0
+ psytrellis = double.TryParse(x[1], NumberStyles.Float, CultureInfo.InvariantCulture, out psytrellis) ? psytrellis * 20 : 0.0;
+
+ int.TryParse(psyrd.ToString(), out val);
+ int.TryParse(psytrellis.ToString(), out val2);
+
+ slider_psyrd.Value = val;
+ slider_psytrellis.Value = val2;
+ continue;
+ }
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// This function will update the X264 Query when one of the GUI widgets changes.
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ private void OnX264WidgetChange(string sender)
+ {
+ Animate(sender);
+ string optNameToChange = sender;
+ string currentOptString = rtf_x264Query.Text;
+
+ /*First, we create a pattern to check for ":"optNameToChange"=" to modify the option if the name falls after
+ the first character of the opt string (hence the ":") */
+ string checkOptNameToChange = ":" + optNameToChange + "=";
+ string checkOptNameToChangeBegin = optNameToChange + "=";
+
+ // IF the current H264 Option String Contains Multiple Items or Just 1 Item
+ if ((currentOptString.Contains(checkOptNameToChange)) || (currentOptString.StartsWith(checkOptNameToChangeBegin)))
+ HasOptions(currentOptString, optNameToChange);
+ else // IF there is no options in the rich text box!
+ HasNoOptions(optNameToChange);
+ }
+
+ /// <summary>
+ /// Called when the current x264 option string contains multiple (or a single) item(s) in it seperated by :
+ /// it updates the current option that the widget corrosponds to, if it is already in thes string.
+ /// </summary>
+ /// <param name="currentOptString">The Current Option String</param>
+ /// <param name="optNameToChange">Name of the option to change</param>
+ private void HasOptions(string currentOptString, string optNameToChange)
+ {
+ string thisOpt; // The separated option such as "bframes=3"
+ string optName; // The option name such as "bframes"
+ string[] currentOptsArray;
+
+ /* Create new empty opt string*/
+ string changedOptString = string.Empty;
+
+ /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
+ currentOptsArray = currentOptString.Split(':');
+
+ /*iterate through the array and get <opts> and <values*/
+ for (int loopcounter = 0; loopcounter < currentOptsArray.Length; loopcounter++)
+ {
+ thisOpt = currentOptsArray[loopcounter];
+
+ if (thisOpt.Contains("="))
+ {
+ string[] splitOptRange = thisOpt.Split('=');
+
+ optName = splitOptRange[0]; // e.g bframes
+
+ /*
+ * Run through the available widgets for x264 opts and set them, as you add widgets,
+ * they need to be added here. This should be moved to its own method probably
+ * If the optNameToChange is found, appropriately change the value or delete it if
+ * "unspecified" is set.
+ */
+ if (optName.Equals(optNameToChange))
+ {
+ if (optNameToChange.Equals("deblock"))
+ {
+ string da = drop_deblockAlpha.SelectedItem.ToString();
+ string db = drop_deblockBeta.SelectedItem.ToString();
+
+ if (((da.Contains("Default")) && (db.Contains("Default"))) ||
+ ((da.Contains("0")) && (db.Contains("0"))))
+ {
+ drop_deblockBeta.SelectedItem = "Default (0)";
+ drop_deblockAlpha.SelectedItem = "Default (0)";
+ thisOpt = string.Empty;
+ }
+ else if ((!da.Contains("Default")) && (db.Contains("Default")))
+ {
+ drop_deblockBeta.SelectedItem = "0";
+ thisOpt = "deblock=" + da + ",0";
+ }
+ else if ((da.Contains("Default")) && (!db.Contains("Default")))
+ {
+ drop_deblockAlpha.SelectedItem = "0";
+ thisOpt = "deblock=0," + db;
+ }
+ else if ((!da.Contains("Default")) && (!db.Contains("Default")))
+ thisOpt = "deblock=" + da + "," + db;
+ }
+ else if (optNameToChange.Equals("aq-strength"))
+ {
+ if (slider_adaptiveQuantStrength.Value == 10)
+ thisOpt = string.Empty;
+ else
+ {
+ double value = slider_adaptiveQuantStrength.Value * 0.1;
+ string aqs = value.ToString("f1", culture);
+ thisOpt = "aq-strength=" + aqs;
+ }
+ }
+ else if (optNameToChange.Equals("psy-rd"))
+ {
+ if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)
+ thisOpt = string.Empty;
+ else
+ {
+ double psyrd = slider_psyrd.Value * 0.1;
+ double psytre = slider_psytrellis.Value * 0.05;
+
+ string rd = psyrd.ToString("f2", culture);
+ string rt = psytre.ToString("f2", culture);
+
+ thisOpt = "psy-rd=" + rd + "," + rt;
+ }
+ }
+ else if (optNameToChange.Equals("b-pyramid"))
+ {
+ switch (combo_pyrmidalBFrames.SelectedIndex)
+ {
+ case 0: // Default
+ thisOpt = string.Empty;
+ break;
+ case 1: // Off
+ thisOpt = "b-pyramid=none";
+ break;
+ case 2: // Strict
+ thisOpt = "b-pyramid=strict";
+ break;
+ }
+ }
+ else if (optNameToChange.Equals("no-dct-decimate"))
+ thisOpt = check_noDCTDecimate.CheckState == CheckState.Checked ? "no-dct-decimate=1" : string.Empty;
+ else if (optNameToChange.Equals("8x8dct"))
+ thisOpt = check_8x8DCT.CheckState == CheckState.Unchecked ? "8x8dct=0" : string.Empty;
+ else if (optNameToChange.Equals("cabac"))
+ thisOpt = check_Cabac.CheckState == CheckState.Checked ? string.Empty : "cabac=0";
+ else if (optNameToChange.Equals("weightp"))
+ thisOpt = check_weightp.CheckState == CheckState.Checked ? string.Empty : "weightp=0";
+ else if (optNameToChange.Equals("me"))
+ {
+ switch (drop_MotionEstimationMethod.SelectedIndex)
+ {
+ case 1:
+ thisOpt = "me=dia";
+ break;
+
+ case 2:
+ thisOpt = "me=hex";
+ break;
+
+ case 3:
+ thisOpt = "me=umh";
+ break;
+
+ case 4:
+ thisOpt = "me=esa";
+ break;
+
+ case 5:
+ thisOpt = "me=tesa";
+ break;
+
+ default:
+ thisOpt = string.Empty;
+ break;
+ }
+ }
+ else if (optNameToChange.Equals("direct"))
+ {
+ switch (drop_directPrediction.SelectedIndex)
+ {
+ case 1:
+ thisOpt = "direct=none";
+ break;
+
+ case 2:
+ thisOpt = "direct=spatial";
+ break;
+
+ case 3:
+ thisOpt = "direct=temporal";
+ break;
+
+ case 4:
+ thisOpt = "direct=auto";
+ break;
+
+ default:
+ thisOpt = string.Empty;
+ break;
+ }
+ }
+ else if (optNameToChange.Equals("analyse"))
+ {
+ switch (drop_analysis.SelectedIndex)
+ {
+ case 1:
+ thisOpt = "analyse=none";
+ break;
+
+ case 2:
+ thisOpt = "analyse=some";
+ break;
+
+ case 3:
+ thisOpt = "analyse=all";
+ break;
+
+ default:
+ thisOpt = string.Empty;
+ break;
+ }
+ }
+ else if (optNameToChange.Equals("merange"))
+ {
+ thisOpt = !drop_MotionEstimationRange.SelectedItem.ToString().Contains("Default")
+ ? "merange=" + drop_MotionEstimationRange.SelectedItem
+ : string.Empty;
+ }
+ else if (optNameToChange.Equals("b-adapt"))
+ {
+ thisOpt = !drop_adaptBFrames.SelectedItem.ToString().Contains("Default")
+ ? "b-adapt=" + (drop_adaptBFrames.SelectedIndex - 1)
+ : string.Empty;
+ }
+ else if (optNameToChange.Equals("ref"))
+ {
+ thisOpt = !drop_refFrames.SelectedItem.ToString().Contains("Default")
+ ? "ref=" + drop_refFrames.SelectedItem
+ : string.Empty;
+ }
+ else if (optNameToChange.Equals("bframes"))
+ {
+ string value = drop_bFrames.SelectedItem.ToString();
+ thisOpt = !drop_bFrames.SelectedItem.ToString().Contains("Default")
+ ? "bframes=" + value
+ : string.Empty;
+ }
+ else if (optNameToChange.Equals("subq"))
+ {
+ string value = drop_subpixelMotionEstimation.SelectedItem.ToString();
+ string[] val = value.Split(':');
+ thisOpt = !drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default")
+ ? "subq=" + val[0]
+ : string.Empty;
+ }
+ else if (optNameToChange.Equals("trellis"))
+ {
+ switch (drop_trellis.SelectedIndex)
+ {
+ case 1: // Off
+ thisOpt = "trellis=0";
+ break;
+ case 2: // Encode Only
+ thisOpt = "trellis=1";
+ break;
+ case 3: // Always
+ thisOpt = "trellis=2";
+ break;
+ default:
+ thisOpt = string.Empty;
+ break;
+ }
+ }
+ }
+ }
+
+ /* Construct New String for opts here */
+ if (!thisOpt.Equals(string.Empty))
+ changedOptString = changedOptString.Equals(string.Empty) ? thisOpt : changedOptString + ":" + thisOpt;
+ }
+
+ /* Change the option string to reflect the new mod settings */
+ rtf_x264Query.Text = changedOptString;
+ }
+
+ /// <summary>
+ /// Add's an option to the x264 query string.
+ /// Handles 2 cases. 1 Where rtf_x264Query.Text is empty, and one where there is an option with no value,
+ /// e.g no-fast-pskip
+ /// </summary>
+ /// <param name="optNameToChange">The Option Name to Change</param>
+ private void HasNoOptions(IEquatable<string> optNameToChange)
+ {
+ string colon = string.Empty;
+ if (rtf_x264Query.Text != string.Empty)
+ colon = ":";
+
+ string query = rtf_x264Query.Text;
+ if (optNameToChange.Equals("me"))
+ {
+ switch (drop_MotionEstimationMethod.SelectedIndex)
+ {
+ case 1:
+ query = query + colon + "me=dia";
+ break;
+
+ case 2:
+ query = query + colon + "me=hex";
+ break;
+
+ case 3:
+ query = query + colon + "me=umh";
+ break;
+
+ case 4:
+ query = query + colon + "me=esa";
+ break;
+
+ case 5:
+ query = query + colon + "me=tesa";
+ break;
+
+ default:
+ break;
+ }
+ }
+ else if (optNameToChange.Equals("direct"))
+ {
+ switch (drop_directPrediction.SelectedIndex)
+ {
+ case 1:
+ query = query + colon + "direct=none";
+ break;
+
+ case 2:
+ query = query + colon + "direct=spatial";
+ break;
+
+ case 3:
+ query = query + colon + "direct=temporal";
+ break;
+
+ case 4:
+ query = query + colon + "direct=auto";
+ break;
+
+ default:
+ break;
+ }
+ }
+ else if (optNameToChange.Equals("analyse"))
+ {
+ switch (drop_analysis.SelectedIndex)
+ {
+ case 1:
+ query = query + colon + "analyse=none";
+ break;
+
+ case 2:
+ query = query + colon + "analyse=some";
+ break;
+
+ case 3:
+ query = query + colon + "analyse=all";
+ break;
+
+ default:
+ break;
+ }
+ }
+ else if (optNameToChange.Equals("merange"))
+ {
+ int value = drop_MotionEstimationRange.SelectedIndex + 3;
+ query = query + colon + "merange=" + value;
+ }
+ else if (optNameToChange.Equals("b-adapt"))
+ {
+ int value = drop_adaptBFrames.SelectedIndex - 1;
+ query = query + colon + "b-adapt=" + value;
+ }
+ else if (optNameToChange.Equals("deblock"))
+ {
+ string da = drop_deblockAlpha.SelectedItem.ToString();
+ string db = drop_deblockBeta.Text;
+
+ if (((da.Contains("Default")) && (db.Contains("Default"))) || ((da.Contains("0")) && (db.Contains("0"))))
+ {
+ drop_deblockBeta.SelectedItem = "Default (0)";
+ drop_deblockAlpha.SelectedItem = "Default (0)";
+ }
+ else
+ {
+ if (db.Contains("Default"))
+ db = "0";
+
+ if (da.Contains("Default"))
+ da = "0";
+
+ query = query + colon + "deblock=" + da + "," + db;
+ }
+ }
+ else if (optNameToChange.Equals("aq-strength"))
+ {
+ if (slider_adaptiveQuantStrength.Value == 10)
+ query = string.Empty;
+ else
+ {
+ double value = slider_adaptiveQuantStrength.Value * 0.1;
+ string aqs = value.ToString("f1", culture);
+ query += colon + "aq-strength=" + aqs;
+ }
+ }
+ else if (optNameToChange.Equals("psy-rd"))
+ {
+ if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)
+ query += string.Empty;
+ else
+ {
+ double psyrd = slider_psyrd.Value * 0.1;
+ double psytre = slider_psytrellis.Value * 0.05;
+
+ string rd = psyrd.ToString("f1", culture);
+ string rt = psytre.ToString("f2", culture);
+
+ query += colon + "psy-rd=" + rd + "," + rt;
+ }
+ }
+ else if (optNameToChange.Equals("b-pyramid"))
+ {
+ switch (combo_pyrmidalBFrames.SelectedIndex)
+ {
+ case 0:
+ break;
+ case 1:
+ query = query + colon + "b-pyramid=none";
+ break;
+ case 2:
+ query = query + colon + "b-pyramid=strict";
+ break;
+ }
+ }
+ else if (optNameToChange.Equals("no-dct-decimate"))
+ {
+ if (check_noDCTDecimate.CheckState == CheckState.Checked)
+ query = query + colon + "no-dct-decimate=1";
+ }
+ else if (optNameToChange.Equals("8x8dct"))
+ {
+ if (check_8x8DCT.CheckState == CheckState.Unchecked)
+ query = query + colon + "8x8dct=0";
+ }
+ else if (optNameToChange.Equals("cabac"))
+ {
+ if (check_Cabac.CheckState != CheckState.Checked)
+ query = query + colon + "cabac=0";
+ }
+ else if (optNameToChange.Equals("weightp"))
+ {
+ if (check_weightp.CheckState == CheckState.Unchecked)
+ query = query + colon + "weightp=0";
+ }
+ else if (optNameToChange.Equals("ref"))
+ {
+ if (!drop_refFrames.SelectedItem.ToString().Contains("Default"))
+ query = query + colon + "ref=" + drop_refFrames.SelectedItem;
+ }
+ else if (optNameToChange.Equals("bframes"))
+ {
+ string value = drop_bFrames.SelectedItem.ToString();
+ if (!drop_bFrames.SelectedItem.ToString().Contains("Default"))
+ query = query + colon + "bframes=" + value;
+ }
+ else if (optNameToChange.Equals("subq"))
+ {
+ string value = drop_subpixelMotionEstimation.SelectedItem.ToString();
+ if (!drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default"))
+ {
+ string[] val = value.Split(':');
+ query = query + colon + "subq=" + val[0];
+ }
+ }
+ else if (optNameToChange.Equals("trellis"))
+ {
+ switch (drop_trellis.SelectedIndex)
+ {
+ case 1: // Off
+ query = query + colon + "trellis=0";
+ break;
+ case 2: // Encode Only
+ query = query + colon + "trellis=1";
+ break;
+ case 3: // Always
+ query = query + colon + "trellis=2";
+ break;
+ default:
+ break;
+ }
+ }
+
+ rtf_x264Query.Text = query;
+ }
+
+ /// <summary>
+ /// Shows and hides controls based on the values of other controls.
+ /// </summary>
+ /// <param name="sender">The Sender</param>
+ private void Animate(string sender)
+ {
+ /* Lots of situations to cover.
+ - B-frames (when 0 turn of b-frame specific stuff, when < 2 disable b-pyramid)
+ - CABAC (when 0 turn off trellis and psy-trel
+ - subme (if under 6, turn off psy-rd and psy-trel)
+ - trellis (if 0, turn off psy-trel)
+ */
+
+ switch (sender)
+ {
+ case "bframes":
+ if (drop_bFrames.SelectedIndex == 1)
+ {
+ /* If the b-frame widget is at 1, the user has chosen
+ not to use b-frames at all. So disable the options
+ that can only be used when b-frames are enabled. */
+ combo_pyrmidalBFrames.Visible = false;
+ lbl_prymidalBframes.Visible = false;
+ drop_directPrediction.Visible = false;
+ lbl_direct_prediction.Visible = false;
+
+ combo_pyrmidalBFrames.SelectedIndex = 0;
+ drop_directPrediction.SelectedIndex = 0;
+
+ drop_adaptBFrames.Visible = false;
+ lbl_adaptBFrames.Visible = false;
+ drop_adaptBFrames.SelectedIndex = 0;
+ }
+ else if (drop_bFrames.SelectedIndex == 2)
+ {
+ /* Only 1 b-frame? Disable b-pyramid. */
+ combo_pyrmidalBFrames.Visible = false;
+ lbl_prymidalBframes.Visible = false;
+ combo_pyrmidalBFrames.SelectedIndex = 0;
+
+ drop_directPrediction.Visible = true;
+ lbl_direct_prediction.Visible = true;
+
+ drop_adaptBFrames.Visible = true;
+ lbl_adaptBFrames.Visible = true;
+ }
+ else
+ {
+ combo_pyrmidalBFrames.Visible = true;
+ lbl_prymidalBframes.Visible = true;
+ drop_directPrediction.Visible = true;
+ lbl_direct_prediction.Visible = true;
+
+ drop_adaptBFrames.Visible = true;
+ lbl_adaptBFrames.Visible = true;
+ }
+ break;
+ case "me": // Motion Estimation
+ if (drop_MotionEstimationMethod.SelectedIndex < 3)
+ {
+ drop_MotionEstimationRange.Visible = false;
+ lbl_merange.Visible = false;
+ drop_MotionEstimationRange.SelectedIndex = 0;
+ }
+ else
+ {
+ drop_MotionEstimationRange.Visible = true;
+ lbl_merange.Visible = true;
+ }
+ break;
+ case "subq": // subme
+ if (drop_subpixelMotionEstimation.SelectedIndex != 0 &&
+ drop_subpixelMotionEstimation.SelectedIndex < 7)
+ {
+ slider_psyrd.Visible = false;
+ slider_psyrd.Value = 10;
+ lbl_psyrd.Visible = false;
+
+ slider_psytrellis.Visible = false;
+ slider_psytrellis.Value = 0;
+ lbl_psytrellis.Visible = false;
+ }
+ else
+ {
+ slider_psyrd.Visible = true;
+ lbl_psyrd.Visible = true;
+
+ if (drop_trellis.SelectedIndex >= 2 && slider_psytrellis.Visible == false)
+ {
+ slider_psytrellis.Visible = true;
+ lbl_psytrellis.Visible = true;
+ }
+ }
+ break;
+ case "trellis": // subme
+ if (drop_trellis.SelectedIndex > 0 && drop_trellis.SelectedIndex < 2)
+ {
+ slider_psytrellis.Visible = false;
+ slider_psytrellis.Value = 0;
+ lbl_psytrellis.Visible = false;
+ }
+ else
+ {
+ if ((drop_subpixelMotionEstimation.SelectedIndex == 0 || drop_subpixelMotionEstimation.SelectedIndex >= 7) && slider_psytrellis.Visible == false)
+ {
+ slider_psytrellis.Visible = true;
+ lbl_psytrellis.Visible = true;
+ }
+ }
+ break;
+ }
+ }
+
+ /* UI Events */
+
+ private void widgetControlChanged(object sender, EventArgs e)
+ {
+ Control changedControlName = (Control) sender;
+ string controlName = string.Empty;
+
+ switch (changedControlName.Name.Trim())
+ {
+ case "drop_refFrames":
+ controlName = "ref";
+ break;
+ case "drop_bFrames":
+ controlName = "bframes";
+ break;
+ case "drop_directPrediction":
+ controlName = "direct";
+ break;
+ case "check_weightp":
+ controlName = "weightp";
+ break;
+ case "combo_pyrmidalBFrames":
+ controlName = "b-pyramid";
+ break;
+ case "drop_MotionEstimationMethod":
+ controlName = "me";
+ break;
+ case "drop_MotionEstimationRange":
+ controlName = "merange";
+ break;
+ case "drop_subpixelMotionEstimation":
+ controlName = "subq";
+ break;
+ case "drop_analysis":
+ controlName = "analyse";
+ break;
+ case "check_8x8DCT":
+ controlName = "8x8dct";
+ break;
+ case "drop_deblockAlpha":
+ controlName = "deblock";
+ break;
+ case "drop_deblockBeta":
+ controlName = "deblock";
+ break;
+ case "drop_trellis":
+ controlName = "trellis";
+ break;
+ case "check_noDCTDecimate":
+ controlName = "no-dct-decimate";
+ break;
+ case "check_Cabac":
+ controlName = "cabac";
+ break;
+ case "slider_psyrd":
+ controlName = "psy-rd";
+ break;
+ case "slider_psytrellis":
+ controlName = "psy-rd";
+ break;
+ case "slider_adaptiveQuantStrength":
+ controlName = "aq-strength";
+ break;
+ case "drop_adaptBFrames":
+ controlName = "b-adapt";
+ break;
+ }
+ OnX264WidgetChange(controlName);
+ }
+
+ private void rtf_x264Query_TextChanged(object sender, EventArgs e)
+ {
+ if (rtf_x264Query.Text.EndsWith("\n"))
+ {
+ string query = rtf_x264Query.Text.Replace("\n", string.Empty);
+ Reset2Defaults();
+ rtf_x264Query.Text = query;
+ this.StandardizeOptString();
+ this.SetCurrentSettingsInPanel();
+
+ if (rtf_x264Query.Text == string.Empty)
+ Reset2Defaults();
+ }
+ }
+
+ private void btn_reset_Click(object sender, EventArgs e)
+ {
+ rtf_x264Query.Text = string.Empty;
+ Reset2Defaults();
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/Controls/x264Panel.resx b/win/CS/Controls/x264Panel.resx
new file mode 100644
index 000000000..094e31ae0
--- /dev/null
+++ b/win/CS/Controls/x264Panel.resx
@@ -0,0 +1,241 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="ToolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+ <data name="slider_psyrd.ToolTip" xml:space="preserve">
+ <value>Psychovisual Rate Distortion Optimization sure is a mouthful, isn't it? Basically, it means x264 tries to retain detail, for better quality to the human eye,
+as opposed to trying to maximize quality the way a computer understands it, through signal-to-noise ratios that have trouble telling apart fine detail and noise.</value>
+ </data>
+ <data name="drop_adaptBFrames.ToolTip" xml:space="preserve">
+ <value>x264 has a variety of algorithms to decide when to use B-frames and how many to use.
+
+Fast mode takes roughly the same amount of time no matter how many B-frames you specify. However, while fast, its decisions are often suboptimal.
+
+Optimal mode gets slower as the maximum number of B-Frames increases, but makes much more accurate decisions, especially when used with B-pyramid.</value>
+ </data>
+ <data name="check_Cabac.ToolTip" xml:space="preserve">
+ <value>After the encoder has done its work, it has a bunch of data that needs to be compressed losslessly, similar to ZIP or RAR.
+H.264 provides two options for this: CAVLC and CABAC. CABAC decodes a lot slower but compresses significantly better (10-30%), especially at lower bitrates.
+If you're looking to minimize CPU requirements for video playback, disable this option.
+Baseline profile, as required for iPods and similar devices, requires CABAC to be disabled.</value>
+ </data>
+ <data name="check_noDCTDecimate.ToolTip" xml:space="preserve">
+ <value>x264 normally zeroes out nearly-empty data blocks to save bits to be better used for some other purpose in the video.
+However, this can sometimes have slight negative effects on retention of subtle grain and dither.
+Don't touch this unless you're having banding issues or other such cases where you are having trouble keeping fine noise.</value>
+ </data>
+ <data name="drop_trellis.ToolTip" xml:space="preserve">
+ <value>Trellis fine-tunes the rounding of transform coefficients to squeeze out 3-5% more compression at the cost of some speed.
+"Always" uses trellis not only during the main encoding process, but also during analysis, which improves compression even
+more, albeit at great speed cost.
+
+Trellis costs more speed at higher bitrates</value>
+ </data>
+ <data name="drop_deblockBeta.ToolTip" xml:space="preserve">
+ <value>H.264 has a built-in deblocking filter that smooths out blocking artifacts after decoding each frame. This not only improves visual quality, but also helps compression significantly.
+The deblocking filter takes a lot of CPU power, so if you're looking to minimize CPU requirements for video playback, disable it.
+
+The deblocking filter has two adjustable parameters, \"strength\" and \"threshold\".
+The former controls how strong (or weak) the deblocker is, while the latter controls how many (or few) edges it applies to.
+Lower values mean less deblocking, higher values mean more deblocking. The default is 0 (normal strength) for both parameters.</value>
+ </data>
+ <data name="drop_deblockAlpha.ToolTip" xml:space="preserve">
+ <value>H.264 has a built-in deblocking filter that smooths out blocking artifacts after decoding each frame. This not only improves visual quality, but also helps compression significantly.
+The deblocking filter takes a lot of CPU power, so if you're looking to minimize CPU requirements for video playback, disable it.
+
+The deblocking filter has two adjustable parameters, \"strength\" and \"threshold\".
+The former controls how strong (or weak) the deblocker is, while the latter controls how many (or few) edges it applies to.
+Lower values mean less deblocking, higher values mean more deblocking. The default is 0 (normal strength) for both parameters.</value>
+ </data>
+ <data name="check_8x8DCT.ToolTip" xml:space="preserve">
+ <value>The 8x8 transform is the single most useful feature of x264 in terms of compression-per-speed.
+It improves compression by at least 5% at a very small speed cost and may provide an unusually high visual quality benefit compared to its compression gain.
+However, it requires High Profile, which many devices may not support.</value>
+ </data>
+ <data name="drop_analysis.ToolTip" xml:space="preserve">
+ <value>Mode decision picks from a variety of options to make its decision: this option chooses what options those are.
+Fewer partitions to check means faster encoding, at the cost of worse decisions, since the best option might have been one that was turned off.</value>
+ </data>
+ <data name="drop_subpixelMotionEstimation.ToolTip" xml:space="preserve">
+ <value>This setting controls both subpixel-precision motion estimation and mode decision methods.
+
+Subpixel motion estimation is used for refining motion estimates beyond mere pixel accuracy, improving compression.
+
+Mode decision is the method used to choose how to encode each block of the frame: a very important decision.
+
+SAD is the fastest method, followed by SATD, RD, RD refinement, and the slowest, QPRD.
+6 or higher is strongly recommended: Psy-RD, a very powerful psy optimization that helps retain detail, requires RD.
+10, the most powerful and slowest option, requires trellis=2.</value>
+ </data>
+ <data name="drop_MotionEstimationRange.ToolTip" xml:space="preserve">
+ <value>This is the distance x264 searches from its best guess at the motion of a block in order to try to find its actual motion.
+Doesn't apply to Diamond or Hexagon search options.
+The default is fine for most content, but extremely high motion video, especially at HD resolutions, may benefit from higher ranges, albeit at a high speed cost.</value>
+ </data>
+ <data name="drop_MotionEstimationMethod.ToolTip" xml:space="preserve">
+ <value>Controls the motion estimation method. Motion estimation is how the encoder estimates how each block of pixels in a frame has moved.
+A better motion search method improves compression at the cost of speed.
+
+Diamond: performs an extremely fast and simple search using a diamond pattern.
+
+Hexagon: performs a somewhat more effective but slightly slower search using a hexagon pattern.
+
+Uneven Multi-Hex: performs a very wide search using a variety of patterns, more accurately capturing complex motion.
+
+Exhaustive: performs a \"dumb\" search of every pixel in a wide area. Significantly slower for only a small compression gain.
+
+Transformed Exhaustive: Like exhaustive, but makes even more accurate decisions. Accordingly, somewhat slower, also for only a small improvement.</value>
+ </data>
+ <data name="drop_directPrediction.ToolTip" xml:space="preserve">
+ <value>H.264 allows for two different prediction modes, spatial and temporal, in B-frames.
+
+Spatial, the default, is almost always better, but temporal is sometimes useful too.
+
+x264 can, at the cost of a small amount of speed (and accordingly for a small compression gain), adaptively select which is better for each particular frame.</value>
+ </data>
+ <data name="drop_bFrames.ToolTip" xml:space="preserve">
+ <value>Sane values are ~2-5.
+This specifies the maximum number of sequential B-frames that the encoder can use.
+ Large numbers generally won't help significantly unless Adaptive B-frames is set to Optimal.
+Cel-animated source material and B-pyramid also significantly increase the usefulness of larger values.
+Baseline profile, as required for iPods and similar devices, requires B-frames to be set to 0 (off).</value>
+ </data>
+ <data name="drop_refFrames.ToolTip" xml:space="preserve">
+ <value>Sane values are ~1-6.
+The more you add, the better the compression, but the slower the encode.
+Cel animation tends to benefit from more reference frames a lot more than film content.
+Note that many hardware devices have limitations on the number of supported reference frames, so if you're encoding for a handheld or standalone player,
+don't touch this unless you're absolutely sure you know what you're doing!</value>
+ </data>
+ <data name="check_weightp.ToolTip" xml:space="preserve">
+ <value>Performs extra analysis to decide upon weighting parameters for each frame.
+This improves overall compression slightly and improves the quality of fades greatly.
+Baseline profile, as required for iPods and similar devices, requires weighted P-frame prediction to be disabled.
+Note that some devices and players, even those that support Main Profile,
+may have problems with Weighted P-frame prediction: the Apple TV is completely incompatible with it, for example.</value>
+ </data>
+ <data name="combo_pyrmidalBFrames.ToolTip" xml:space="preserve">
+ <value>B-pyramid improves compression by creating a pyramidal structure (hence the name) of B-frames, allowing B-frames to
+reference each other to improve compression.
+
+Requires Max B-frames greater than 1; optimal adaptive B-frames is strongly recommended for full compression benefit.</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/win/CS/Functions/Main.cs b/win/CS/Functions/Main.cs
new file mode 100644
index 000000000..ae53efe90
--- /dev/null
+++ b/win/CS/Functions/Main.cs
@@ -0,0 +1,749 @@
+/* Main.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.Functions
+{
+ using System;
+ using System.Collections.Generic;
+ using System.Diagnostics;
+ using System.IO;
+ using System.Linq;
+ using System.Security.Cryptography;
+ using System.Text;
+ using System.Text.RegularExpressions;
+ using System.Windows.Forms;
+ using System.Xml.Serialization;
+
+
+ using HandBrake.ApplicationServices.Model;
+ using HandBrake.ApplicationServices.Parsing;
+ using HandBrake.ApplicationServices.Services.Interfaces;
+
+ using Handbrake.ToolWindows;
+
+ /// <summary>
+ /// Useful functions which various screens can use.
+ /// </summary>
+ public static class Main
+ {
+ /// <summary>
+ /// The XML Serializer
+ /// </summary>
+ private static readonly XmlSerializer Ser = new XmlSerializer(typeof(List<QueueTask>));
+
+ /// <summary>
+ /// Calculate the duration of the selected title and chapters
+ /// </summary>
+ /// <param name="chapterStart">
+ /// The chapter Start.
+ /// </param>
+ /// <param name="chapterEnd">
+ /// The chapter End.
+ /// </param>
+ /// <param name="selectedTitle">
+ /// The selected Title.
+ /// </param>
+ /// <returns>
+ /// The calculated duration.
+ /// </returns>
+ public static TimeSpan CalculateDuration(int chapterStart, int chapterEnd, Title selectedTitle)
+ {
+ TimeSpan duration = TimeSpan.FromSeconds(0.0);
+ chapterStart++;
+ chapterEnd++;
+ if (chapterStart != 0 && chapterEnd != 0 && chapterEnd <= selectedTitle.Chapters.Count)
+ {
+ for (int i = chapterStart; i <= chapterEnd; i++)
+ duration += selectedTitle.Chapters[i - 1].Duration;
+ }
+
+ return duration;
+ }
+
+ /// <summary>
+ /// Set's up the DataGridView on the Chapters tab (frmMain)
+ /// </summary>
+ /// <param name="title">
+ /// The currently selected title object.
+ /// This will be used to get chapter names if they exist.
+ /// </param>
+ /// <param name="dataChpt">
+ /// The DataGridView Control
+ /// </param>
+ /// <param name="chapterEnd">
+ /// The chapter End.
+ /// </param>
+ /// <returns>
+ /// The chapter naming.
+ /// </returns>
+ public static DataGridView ChapterNaming(Title title, DataGridView dataChpt, string chapterEnd)
+ {
+ int i = 0, finish = 0;
+
+ if (chapterEnd != "Auto")
+ int.TryParse(chapterEnd, out finish);
+
+ while (i < finish)
+ {
+ string chapterName = string.Empty;
+ if (title != null)
+ {
+ if (title.Chapters.Count <= i && title.Chapters[i] != null)
+ {
+ chapterName = title.Chapters[i].ChapterName;
+ }
+ }
+
+ int n = dataChpt.Rows.Add();
+ dataChpt.Rows[n].Cells[0].Value = i + 1;
+ dataChpt.Rows[n].Cells[1].Value = string.IsNullOrEmpty(chapterName) ? "Chapter " + (i + 1) : chapterName;
+ dataChpt.Rows[n].Cells[0].ValueType = typeof(int);
+ dataChpt.Rows[n].Cells[1].ValueType = typeof(string);
+ i++;
+ }
+
+ return dataChpt;
+ }
+
+ /// <summary>
+ /// Import a CSV file which contains Chapter Names
+ /// </summary>
+ /// <param name="dataChpt">
+ /// The DataGridView Control
+ /// </param>
+ /// <param name="filename">
+ /// The filepath and name
+ /// </param>
+ /// <returns>A Populated DataGridView</returns>
+ public static DataGridView ImportChapterNames(DataGridView dataChpt, string filename)
+ {
+ IDictionary<int, string> chapterMap = new Dictionary<int, string>();
+ try
+ {
+ StreamReader sr = new StreamReader(filename);
+ string csv = sr.ReadLine();
+ while (csv != null)
+ {
+ if (csv.Trim() != string.Empty)
+ {
+ csv = csv.Replace("\\,", "<!comma!>");
+ string[] contents = csv.Split(',');
+ int chapter;
+ int.TryParse(contents[0], out chapter);
+ chapterMap.Add(chapter, contents[1].Replace("<!comma!>", ","));
+ }
+ csv = sr.ReadLine();
+ }
+ }
+ catch (Exception)
+ {
+ return null;
+ }
+
+ foreach (DataGridViewRow item in dataChpt.Rows)
+ {
+ string name;
+ chapterMap.TryGetValue((int)item.Cells[0].Value, out name);
+ item.Cells[1].Value = name ?? "Chapter " + item.Cells[0].Value;
+ }
+
+ return dataChpt;
+ }
+
+ /// <summary>
+ /// Create a CSV file with the data from the Main Window Chapters tab
+ /// </summary>
+ /// <param name="mainWindow">Main Window</param>
+ /// <param name="filePathName">Path to save the csv file</param>
+ /// <returns>True if successful </returns>
+ public static bool SaveChapterMarkersToCsv(frmMain mainWindow, string filePathName)
+ {
+ try
+ {
+ string csv = string.Empty;
+
+ foreach (DataGridViewRow row in mainWindow.data_chpt.Rows)
+ {
+ csv += row.Cells[0].Value.ToString();
+ csv += ",";
+ csv += row.Cells[1].Value.ToString().Replace(",", "\\,");
+ csv += Environment.NewLine;
+ }
+ StreamWriter file = new StreamWriter(filePathName);
+ file.Write(csv);
+ file.Close();
+ file.Dispose();
+ return true;
+ }
+ catch (Exception exc)
+ {
+ ShowExceptiowWindow("Unable to save Chapter Makrers file! \nChapter marker names will NOT be saved in your encode", exc.ToString());
+ return false;
+ }
+ }
+
+ /// <summary>
+ /// Function which generates the filename and path automatically based on
+ /// the Source Name, DVD title and DVD Chapters
+ /// </summary>
+ /// <param name="mainWindow">
+ /// The main Window.
+ /// </param>
+ /// <returns>
+ /// The Generated FileName
+ /// </returns>
+ public static string AutoName(frmMain mainWindow)
+ {
+ string autoNamePath = string.Empty;
+ if (mainWindow.drp_dvdtitle.Text != "Automatic")
+ {
+ // Get the Source Name and remove any invalid characters
+
+ string sourceName = Path.GetInvalidFileNameChars().Aggregate(Path.GetFileNameWithoutExtension(mainWindow.SourceName), (current, character) => current.Replace(character.ToString(), string.Empty));
+
+ if (Properties.Settings.Default.AutoNameRemoveUnderscore)
+ sourceName = sourceName.Replace("_", " ");
+
+ if (Properties.Settings.Default.AutoNameTitleCase)
+ sourceName = TitleCase(sourceName);
+
+ // Get the Selected Title Number
+ string[] titlesplit = mainWindow.drp_dvdtitle.Text.Split(' ');
+ string dvdTitle = titlesplit[0].Replace("Automatic", string.Empty);
+
+ // Get the Chapter Start and Chapter End Numbers
+ string chapterStart = mainWindow.drop_chapterStart.Text.Replace("Auto", string.Empty);
+ string chapterFinish = mainWindow.drop_chapterFinish.Text.Replace("Auto", string.Empty);
+ string combinedChapterTag = chapterStart;
+ if (chapterFinish != chapterStart && chapterFinish != string.Empty)
+ combinedChapterTag = chapterStart + "-" + chapterFinish;
+
+ // Get the destination filename.
+ string destinationFilename;
+ if (Properties.Settings.Default.autoNameFormat != string.Empty)
+ {
+ destinationFilename = Properties.Settings.Default.autoNameFormat;
+ destinationFilename = destinationFilename.Replace("{source}", sourceName)
+ .Replace("{title}", dvdTitle)
+ .Replace("{chapters}", combinedChapterTag);
+ }
+ else
+ destinationFilename = sourceName + "_T" + dvdTitle + "_C" + combinedChapterTag;
+
+ // Add the appropriate file extension
+ if (mainWindow.drop_format.SelectedIndex == 0)
+ {
+ destinationFilename += Properties.Settings.Default.useM4v == 0 || Properties.Settings.Default.useM4v == 2 || mainWindow.Check_ChapterMarkers.Checked ||
+ mainWindow.AudioSettings.RequiresM4V() || mainWindow.Subtitles.RequiresM4V()
+ ? ".m4v"
+ : ".mp4";
+ }
+ else if (mainWindow.drop_format.SelectedIndex == 1)
+ destinationFilename += ".mkv";
+
+ // Now work out the path where the file will be stored.
+ // First case: If the destination box doesn't already contain a path, make one.
+ if (!mainWindow.text_destination.Text.Contains(Path.DirectorySeparatorChar.ToString()))
+ {
+ // If there is an auto name path, use it...
+ if (Properties.Settings.Default.autoNamePath.Trim() == "{source_path}" && !string.IsNullOrEmpty(mainWindow.sourcePath))
+ {
+ autoNamePath = Path.Combine(Path.GetDirectoryName(mainWindow.sourcePath), destinationFilename);
+ if (autoNamePath == mainWindow.sourcePath)
+ {
+ // Append out_ to files that already exist or is the source file
+ autoNamePath = Path.Combine(Path.GetDirectoryName(mainWindow.sourcePath), "output_" + destinationFilename);
+ }
+ }
+ else if (Properties.Settings.Default.autoNamePath.Trim() != string.Empty && Properties.Settings.Default.autoNamePath.Trim() != "Click 'Browse' to set the default location")
+ {
+ autoNamePath = Path.Combine(Properties.Settings.Default.autoNamePath, destinationFilename);
+ }
+ else // ...otherwise, output to the source directory
+ autoNamePath = null;
+ }
+ else // Otherwise, use the path that is already there.
+ {
+ // Use the path and change the file extension to match the previous destination
+ autoNamePath = Path.Combine(Path.GetDirectoryName(mainWindow.text_destination.Text), destinationFilename);
+
+ if (Path.HasExtension(mainWindow.text_destination.Text))
+ autoNamePath = Path.ChangeExtension(autoNamePath,
+ Path.GetExtension(mainWindow.text_destination.Text));
+ }
+ }
+
+ return autoNamePath;
+ }
+
+ /// <summary>
+ /// Get's HandBrakes version data from the CLI.
+ /// </summary>
+ public static void SetCliVersionData()
+ {
+ string line;
+
+ // 0 = SVN Build / Version
+ // 1 = Build Date
+
+ // Get the SHA1 Hash of HandBrakeCLI
+ byte[] hash;
+ using (Stream stream = File.OpenRead(Path.Combine(Application.StartupPath, "HandBrakeCLI.exe")))
+ {
+ hash = SHA1.Create().ComputeHash(stream);
+ }
+ string base64Hash = Convert.ToBase64String(hash);
+
+ // Compare the hash with the last known hash. If it's the same, return.
+ if (Properties.Settings.Default.CliExeHash == base64Hash)
+ {
+ return;
+ }
+
+ // It's not the same, so start the CLI to get it's version data.
+ Process cliProcess = new Process();
+ ProcessStartInfo handBrakeCli = new ProcessStartInfo("HandBrakeCLI.exe", " -u -v0")
+ {
+ UseShellExecute = false,
+ RedirectStandardError = true,
+ RedirectStandardOutput = true,
+ CreateNoWindow = true
+ };
+ cliProcess.StartInfo = handBrakeCli;
+
+ try
+ {
+ cliProcess.Start();
+
+ // Retrieve standard output and report back to parent thread until the process is complete
+ TextReader stdOutput = cliProcess.StandardError;
+
+ while (!cliProcess.HasExited)
+ {
+ line = stdOutput.ReadLine() ?? string.Empty;
+ Match m = Regex.Match(line, @"HandBrake ([svnM0-9.]*) \(([0-9]*)\)");
+ Match platform = Regex.Match(line, @"- ([A-Za-z0-9\s ]*) -");
+
+ if (m.Success)
+ {
+ string version = m.Groups[1].Success ? m.Groups[1].Value : string.Empty;
+ string build = m.Groups[2].Success ? m.Groups[2].Value : string.Empty;
+
+ int buildValue;
+ int.TryParse(build, out buildValue);
+
+ Properties.Settings.Default.hb_build = buildValue;
+ Properties.Settings.Default.hb_version = version;
+ }
+
+ if (platform.Success)
+ {
+ Properties.Settings.Default.hb_platform = platform.Value.Replace("-", string.Empty).Trim();
+ }
+
+ if (cliProcess.TotalProcessorTime.Seconds > 10) // Don't wait longer than 10 seconds.
+ {
+ Process cli = Process.GetProcessById(cliProcess.Id);
+ if (!cli.HasExited)
+ {
+ cli.Kill();
+ }
+ }
+ }
+
+ Properties.Settings.Default.CliExeHash = base64Hash;
+
+ Properties.Settings.Default.Save();
+ }
+ catch (Exception e)
+ {
+ Properties.Settings.Default.hb_build = 0;
+ Properties.Settings.Default.CliExeHash = null;
+ Properties.Settings.Default.Save();
+
+ ShowExceptiowWindow("Unable to retrieve version information from the CLI.", e.ToString());
+ }
+ }
+
+ /// <summary>
+ /// Check if the queue recovery file contains records.
+ /// If it does, it means the last queue did not complete before HandBrake closed.
+ /// So, return a boolean if true.
+ /// </summary>
+ /// <returns>
+ /// True if there is a queue to recover.
+ /// </returns>
+ public static List<string> CheckQueueRecovery()
+ {
+ try
+ {
+ string tempPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"HandBrake\");
+ List<string> queueFiles = new List<string>();
+
+ DirectoryInfo info = new DirectoryInfo(tempPath);
+ FileInfo[] logFiles = info.GetFiles("*.xml");
+ foreach (FileInfo file in logFiles)
+ {
+ if (!file.Name.Contains("hb_queue_recovery"))
+ continue;
+
+ using (FileStream strm = new FileStream(Path.Combine(file.DirectoryName, file.Name), FileMode.Open, FileAccess.Read))
+ {
+ List<QueueTask> list = Ser.Deserialize(strm) as List<QueueTask>;
+ if (list != null)
+ {
+ if (list.Count != 0)
+ {
+ queueFiles.Add(file.Name);
+ }
+ }
+ }
+ }
+
+ return queueFiles;
+ }
+ catch (Exception)
+ {
+ return new List<string>(); // Keep quiet about the error.
+ }
+ }
+
+ /// <summary>
+ /// Recover a queue from file.
+ /// </summary>
+ /// <param name="encodeQueue">
+ /// The encode Queue.
+ /// </param>
+ public static void RecoverQueue(IQueueProcessor encodeQueue)
+ {
+ string appDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"HandBrake\");
+
+ DialogResult result = DialogResult.None;
+ List<string> queueFiles = CheckQueueRecovery();
+ if (queueFiles.Count == 1)
+ {
+ result = MessageBox.Show(
+ "HandBrake has detected unfinished items on the queue from the last time the application was launched. Would you like to recover these?",
+ "Queue Recovery Possible", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
+ }
+ else if (queueFiles.Count > 1)
+ {
+ result = MessageBox.Show(
+ "HandBrake has detected multiple unfinished queue files. These will be from multiple instances of HandBrake running. Would you like to recover all unfinished jobs?",
+ "Queue Recovery Possible", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
+ }
+
+ if (result == DialogResult.Yes)
+ {
+ foreach (string file in queueFiles)
+ {
+ encodeQueue.QueueManager.RestoreQueue(appDataPath + file); // Start Recovery
+ }
+ }
+ else
+ {
+ if (IsMultiInstance) return; // Don't tamper with the files if we are multi instance
+
+ foreach (string file in queueFiles)
+ {
+ if (File.Exists(Path.Combine(appDataPath, file)))
+ File.Delete(Path.Combine(appDataPath, file));
+ }
+ }
+ }
+
+ /// <summary>
+ /// Gets a value indicating whether HandBrake is running in multi instance mode
+ /// </summary>
+ /// <returns>True if the UI has another instance running</returns>
+ public static bool IsMultiInstance
+ {
+ get
+ {
+ return Process.GetProcessesByName("HandBrake").Length > 0 ? true : false;
+ }
+ }
+
+ /// <summary>
+ /// Map languages and their iso639_2 value into a IDictionary
+ /// </summary>
+ /// <returns>A Dictionary containing the language and iso code</returns>
+ public static IDictionary<string, string> MapLanguages()
+ {
+ IDictionary<string, string> languageMap = new Dictionary<string, string>
+ {
+ {"Any", "und"},
+ {"Afar", "aar"},
+ {"Abkhazian", "abk"},
+ {"Afrikaans", "afr"},
+ {"Akan", "aka"},
+ {"Albanian", "sqi"},
+ {"Amharic", "amh"},
+ {"Arabic", "ara"},
+ {"Aragonese", "arg"},
+ {"Armenian", "hye"},
+ {"Assamese", "asm"},
+ {"Avaric", "ava"},
+ {"Avestan", "ave"},
+ {"Aymara", "aym"},
+ {"Azerbaijani", "aze"},
+ {"Bashkir", "bak"},
+ {"Bambara", "bam"},
+ {"Basque", "eus"},
+ {"Belarusian", "bel"},
+ {"Bengali", "ben"},
+ {"Bihari", "bih"},
+ {"Bislama", "bis"},
+ {"Bosnian", "bos"},
+ {"Breton", "bre"},
+ {"Bulgarian", "bul"},
+ {"Burmese", "mya"},
+ {"Catalan", "cat"},
+ {"Chamorro", "cha"},
+ {"Chechen", "che"},
+ {"Chinese", "zho"},
+ {"Church Slavic", "chu"},
+ {"Chuvash", "chv"},
+ {"Cornish", "cor"},
+ {"Corsican", "cos"},
+ {"Cree", "cre"},
+ {"Czech", "ces"},
+ {"Dansk", "dan"},
+ {"Divehi", "div"},
+ {"Nederlands", "nld"},
+ {"Dzongkha", "dzo"},
+ {"English", "eng"},
+ {"Esperanto", "epo"},
+ {"Estonian", "est"},
+ {"Ewe", "ewe"},
+ {"Faroese", "fao"},
+ {"Fijian", "fij"},
+ {"Suomi", "fin"},
+ {"Francais", "fra"},
+ {"Western Frisian", "fry"},
+ {"Fulah", "ful"},
+ {"Georgian", "kat"},
+ {"Deutsch", "deu"},
+ {"Gaelic (Scots)", "gla"},
+ {"Irish", "gle"},
+ {"Galician", "glg"},
+ {"Manx", "glv"},
+ {"Greek Modern", "ell"},
+ {"Guarani", "grn"},
+ {"Gujarati", "guj"},
+ {"Haitian", "hat"},
+ {"Hausa", "hau"},
+ {"Hebrew", "heb"},
+ {"Herero", "her"},
+ {"Hindi", "hin"},
+ {"Hiri Motu", "hmo"},
+ {"Magyar", "hun"},
+ {"Igbo", "ibo"},
+ {"Islenska", "isl"},
+ {"Ido", "ido"},
+ {"Sichuan Yi", "iii"},
+ {"Inuktitut", "iku"},
+ {"Interlingue", "ile"},
+ {"Interlingua", "ina"},
+ {"Indonesian", "ind"},
+ {"Inupiaq", "ipk"},
+ {"Italiano", "ita"},
+ {"Javanese", "jav"},
+ {"Japanese", "jpn"},
+ {"Kalaallisut", "kal"},
+ {"Kannada", "kan"},
+ {"Kashmiri", "kas"},
+ {"Kanuri", "kau"},
+ {"Kazakh", "kaz"},
+ {"Central Khmer", "khm"},
+ {"Kikuyu", "kik"},
+ {"Kinyarwanda", "kin"},
+ {"Kirghiz", "kir"},
+ {"Komi", "kom"},
+ {"Kongo", "kon"},
+ {"Korean", "kor"},
+ {"Kuanyama", "kua"},
+ {"Kurdish", "kur"},
+ {"Lao", "lao"},
+ {"Latin", "lat"},
+ {"Latvian", "lav"},
+ {"Limburgan", "lim"},
+ {"Lingala", "lin"},
+ {"Lithuanian", "lit"},
+ {"Luxembourgish", "ltz"},
+ {"Luba-Katanga", "lub"},
+ {"Ganda", "lug"},
+ {"Macedonian", "mkd"},
+ {"Marshallese", "mah"},
+ {"Malayalam", "mal"},
+ {"Maori", "mri"},
+ {"Marathi", "mar"},
+ {"Malay", "msa"},
+ {"Malagasy", "mlg"},
+ {"Maltese", "mlt"},
+ {"Moldavian", "mol"},
+ {"Mongolian", "mon"},
+ {"Nauru", "nau"},
+ {"Navajo", "nav"},
+ {"Ndebele, South", "nbl"},
+ {"Ndebele, North", "nde"},
+ {"Ndonga", "ndo"},
+ {"Nepali", "nep"},
+ {"Norwegian Nynorsk", "nno"},
+ {"Norwegian Bokm�l", "nob"},
+ {"Norsk", "nor"},
+ {"Chichewa; Nyanja", "nya"},
+ {"Occitan", "oci"},
+ {"Ojibwa", "oji"},
+ {"Oriya", "ori"},
+ {"Oromo", "orm"},
+ {"Ossetian", "oss"},
+ {"Panjabi", "pan"},
+ {"Persian", "fas"},
+ {"Pali", "pli"},
+ {"Polish", "pol"},
+ {"Portugues", "por"},
+ {"Pushto", "pus"},
+ {"Quechua", "que"},
+ {"Romansh", "roh"},
+ {"Romanian", "ron"},
+ {"Rundi", "run"},
+ {"Russian", "rus"},
+ {"Sango", "sag"},
+ {"Sanskrit", "san"},
+ {"Serbian", "srp"},
+ {"Hrvatski", "hrv"},
+ {"Sinhala", "sin"},
+ {"Slovak", "slk"},
+ {"Slovenian", "slv"},
+ {"Northern Sami", "sme"},
+ {"Samoan", "smo"},
+ {"Shona", "sna"},
+ {"Sindhi", "snd"},
+ {"Somali", "som"},
+ {"Sotho Southern", "sot"},
+ {"Espanol", "spa"},
+ {"Sardinian", "srd"},
+ {"Swati", "ssw"},
+ {"Sundanese", "sun"},
+ {"Swahili", "swa"},
+ {"Svenska", "swe"},
+ {"Tahitian", "tah"},
+ {"Tamil", "tam"},
+ {"Tatar", "tat"},
+ {"Telugu", "tel"},
+ {"Tajik", "tgk"},
+ {"Tagalog", "tgl"},
+ {"Thai", "tha"},
+ {"Tibetan", "bod"},
+ {"Tigrinya", "tir"},
+ {"Tonga", "ton"},
+ {"Tswana", "tsn"},
+ {"Tsonga", "tso"},
+ {"Turkmen", "tuk"},
+ {"Turkish", "tur"},
+ {"Twi", "twi"},
+ {"Uighur", "uig"},
+ {"Ukrainian", "ukr"},
+ {"Urdu", "urd"},
+ {"Uzbek", "uzb"},
+ {"Venda", "ven"},
+ {"Vietnamese", "vie"},
+ {"Volap�k", "vol"},
+ {"Welsh", "cym"},
+ {"Walloon", "wln"},
+ {"Wolof", "wol"},
+ {"Xhosa", "xho"},
+ {"Yiddish", "yid"},
+ {"Yoruba", "yor"},
+ {"Zhuang", "zha"},
+ {"Zulu", "zul"}
+ };
+ return languageMap;
+ }
+
+ /// <summary>
+ /// Change a string to Title Case/
+ /// </summary>
+ /// <param name="input">
+ /// The input.
+ /// </param>
+ /// <returns>
+ /// A string in title case.
+ /// </returns>
+ public static string TitleCase(string input)
+ {
+ string[] tokens = input.Split(' ');
+ StringBuilder sb = new StringBuilder(input.Length);
+ foreach (string s in tokens)
+ {
+ if (!string.IsNullOrEmpty(s))
+ {
+ sb.Append(s[0].ToString().ToUpper());
+ sb.Append(s.Substring(1).ToLower());
+ sb.Append(" ");
+ }
+ }
+
+ return sb.ToString().Trim();
+ }
+
+ /// <summary>
+ /// Show the Exception Window
+ /// </summary>
+ /// <param name="shortError">
+ /// The short error.
+ /// </param>
+ /// <param name="longError">
+ /// The long error.
+ /// </param>
+ public static void ShowExceptiowWindow(string shortError, string longError)
+ {
+ ExceptionWindow window = new ExceptionWindow();
+ window.Setup(shortError, longError);
+ window.ShowDialog();
+ }
+
+ /// <summary>
+ /// Get The Source from the CLI Query
+ /// </summary>
+ /// <param name="query">Full CLI Query</param>
+ /// <returns>The Source Path</returns>
+ public static string GetSourceFromQuery(string query)
+ {
+ int startIndex = query.IndexOf("-i \"");
+ if (startIndex != -1)
+ {
+ string input = query.Substring(startIndex).Replace("-i \"", string.Empty).Trim();
+
+ int closeIndex = input.IndexOf('"');
+
+ return closeIndex == -1 ? "Unknown" : input.Substring(0, closeIndex);
+ }
+
+ return "Unknown";
+ }
+
+ /// <summary>
+ /// Get the Destination from the CLI Query
+ /// </summary>
+ /// <param name="query">Full CLI Query</param>
+ /// <returns>The Destination path</returns>
+ public static string GetDestinationFromQuery(string query)
+ {
+ int startIndex = query.IndexOf("-o \"");
+ if (startIndex != -1)
+ {
+ string output = query.Substring(startIndex).Replace("-o \"", string.Empty).Trim();
+
+ int closeIndex = output.IndexOf('"');
+
+ return closeIndex == -1 ? "Unknown" : output.Substring(0, closeIndex);
+ }
+
+ return "Unknown";
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/Functions/PresetLoader.cs b/win/CS/Functions/PresetLoader.cs
new file mode 100644
index 000000000..00e8aa46b
--- /dev/null
+++ b/win/CS/Functions/PresetLoader.cs
@@ -0,0 +1,310 @@
+/* PresetLoader.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.Functions
+{
+ using System.Drawing;
+ using System.Windows.Forms;
+
+ using HandBrake.ApplicationServices.Model;
+ using HandBrake.ApplicationServices.Model.Encoding;
+
+ /// <summary>
+ /// Load a preset into the main Window
+ /// </summary>
+ public class PresetLoader
+ {
+ /// <summary>
+ /// This function takes in a Query which has been parsed by QueryParser and
+ /// set's all the GUI widgets correctly.
+ /// </summary>
+ /// <param name="mainWindow">
+ /// FrmMain window
+ /// </param>
+ /// <param name="presetQuery">
+ /// The Parsed CLI Query
+ /// </param>
+ /// <param name="name">
+ /// Name of the preset
+ /// </param>
+ public static void LoadPreset(frmMain mainWindow, EncodeTask presetQuery, string name)
+ {
+ #region Source
+
+ // Reset some vaules to stock first to prevent errors.
+ mainWindow.check_iPodAtom.CheckState = CheckState.Unchecked;
+
+ // Now load all the new settings onto the main window
+ string destination = mainWindow.text_destination.Text;
+ destination = destination.Replace(".mp4", "." + presetQuery.OutputFormat);
+ destination = destination.Replace(".m4v", "." + presetQuery.OutputFormat);
+ destination = destination.Replace(".mkv", "." + presetQuery.OutputFormat);
+ mainWindow.text_destination.Text = destination;
+
+ #endregion
+
+ #region Destination and Output Settings
+
+ if (presetQuery.OutputFormat == OutputFormat.Mp4 || presetQuery.OutputFormat == OutputFormat.M4V)
+ {
+ if (mainWindow.drop_format.SelectedIndex == 0)
+ {
+ mainWindow.SetExtension(".mp4");
+ }
+ else
+ {
+ mainWindow.drop_format.SelectedIndex = 0;
+ }
+ }
+ else if (presetQuery.OutputFormat == OutputFormat.Mkv)
+ {
+ if (mainWindow.drop_format.SelectedIndex == 1)
+ {
+ mainWindow.SetExtension(".mkv");
+ }
+ else
+ {
+ mainWindow.drop_format.SelectedIndex = 1;
+ }
+ }
+
+ mainWindow.check_iPodAtom.CheckState = presetQuery.IPod5GSupport ? CheckState.Checked : CheckState.Unchecked;
+
+ mainWindow.check_optimiseMP4.CheckState = presetQuery.OptimizeMP4
+ ? CheckState.Checked
+ : CheckState.Unchecked;
+
+ mainWindow.check_largeFile.CheckState = presetQuery.LargeFile ? CheckState.Checked : CheckState.Unchecked;
+
+ mainWindow.setContainerOpts(); // select the container options according to the selected format
+
+ #endregion
+
+ #region Picture
+
+ mainWindow.PictureSettings.check_autoCrop.Checked = true;
+ if (presetQuery.IsCustomCropping)
+ {
+ mainWindow.PictureSettings.check_customCrop.Checked = true;
+ mainWindow.PictureSettings.crop_top.Value = presetQuery.Cropping.Top;
+ mainWindow.PictureSettings.crop_bottom.Value = presetQuery.Cropping.Bottom;
+ mainWindow.PictureSettings.crop_left.Value = presetQuery.Cropping.Left;
+ mainWindow.PictureSettings.crop_right.Value = presetQuery.Cropping.Right;
+ }
+
+ // Set the anamorphic mode 0,1,2,3
+
+ switch (presetQuery.Anamorphic)
+ {
+ case Anamorphic.None:
+ mainWindow.PictureSettings.drp_anamorphic.SelectedIndex = 0;
+ break;
+ case Anamorphic.Strict:
+ mainWindow.PictureSettings.drp_anamorphic.SelectedIndex = 1;
+ break;
+ case Anamorphic.Loose:
+ mainWindow.PictureSettings.drp_anamorphic.SelectedIndex = 2;
+ break;
+ case Anamorphic.Custom:
+ mainWindow.PictureSettings.drp_anamorphic.SelectedIndex = 3;
+ break;
+ }
+
+ // Keep Aspect Ration Anamorphic Setting.
+ mainWindow.PictureSettings.check_KeepAR.CheckState = presetQuery.KeepDisplayAspect
+ ? CheckState.Checked
+ : CheckState.Unchecked;
+
+ // Set the Width and height as Required.
+ if (presetQuery.Width != 0)
+ {
+ mainWindow.PictureSettings.text_width.Value = presetQuery.Width;
+ }
+
+ if (presetQuery.Height != 0)
+ {
+ mainWindow.PictureSettings.text_height.Value = presetQuery.Height;
+ }
+
+ // Max Width/Height override Width/Height
+ if (presetQuery.MaxWidth != 0)
+ {
+ mainWindow.PictureSettings.text_width.Value = presetQuery.MaxWidth;
+ }
+
+ if (presetQuery.MaxHeight != 0)
+ {
+ mainWindow.PictureSettings.text_height.Value = presetQuery.MaxHeight;
+ }
+
+ mainWindow.PictureSettings.PresetMaximumResolution = new Size(presetQuery.MaxWidth, presetQuery.MaxHeight);
+
+ // Case where both height and max height are 0 - For built-in presets
+ if (presetQuery.MaxHeight == 0 && presetQuery.Height == 0)
+ {
+ mainWindow.PictureSettings.text_height.Value = 0;
+ }
+
+ if (presetQuery.MaxWidth == 0 && presetQuery.Width == 0)
+ {
+ if (mainWindow.selectedTitle != null && mainWindow.selectedTitle.Resolution.Width != 0)
+ {
+ mainWindow.PictureSettings.text_width.Value = mainWindow.selectedTitle.Resolution.Width;
+ }
+ }
+
+ // Aspect Ratio for non anamorphic sources
+ if (presetQuery.Anamorphic == Anamorphic.None)
+ {
+ mainWindow.PictureSettings.check_KeepAR.CheckState = presetQuery.Height == 0
+ ? CheckState.Checked
+ : CheckState.Unchecked;
+ }
+
+ // Custom Anamorphic Controls
+ mainWindow.PictureSettings.updownDisplayWidth.Text = presetQuery.DisplayWidth.ToString();
+ mainWindow.PictureSettings.updownParHeight.Text = presetQuery.PixelAspectY.ToString();
+ mainWindow.PictureSettings.updownParWidth.Text = presetQuery.PixelAspectX.ToString();
+ mainWindow.PictureSettings.drp_modulus.SelectedItem = presetQuery.Modulus.ToString();
+
+ #endregion
+
+ #region Filters
+
+ mainWindow.Filters.SetDecomb(presetQuery.Decomb, presetQuery.CustomDecomb);
+ mainWindow.Filters.SetDeInterlace(presetQuery.Deinterlace, presetQuery.CustomDeinterlace);
+ mainWindow.Filters.SetDeNoise(presetQuery.Denoise, presetQuery.CustomDenoise);
+ mainWindow.Filters.SetDeTelecine(presetQuery.Detelecine, presetQuery.CustomDetelecine);
+ mainWindow.Filters.SetDeBlock(presetQuery.Deblock);
+ mainWindow.Filters.SetGrayScale(presetQuery.Grayscale);
+
+ #endregion
+
+ #region Video
+
+ switch (presetQuery.VideoEncoder)
+ {
+ case VideoEncoder.X264:
+ mainWindow.drp_videoEncoder.SelectedIndex = 1;
+ break;
+ case VideoEncoder.FFMpeg:
+ mainWindow.drp_videoEncoder.SelectedIndex = 0;
+ break;
+ case VideoEncoder.Theora:
+ mainWindow.drp_videoEncoder.SelectedIndex = 2;
+ break;
+ }
+
+ if (presetQuery.VideoBitrate != null)
+ {
+ mainWindow.radio_avgBitrate.Checked = true;
+ mainWindow.text_bitrate.Text = presetQuery.VideoBitrate.ToString();
+ }
+
+ // Quality
+ if (presetQuery.Quality != null)
+ {
+ mainWindow.radio_cq.Checked = true;
+ mainWindow.slider_videoQuality.Value = QualityToSliderValue(
+ presetQuery.VideoEncoder, presetQuery.Quality);
+ }
+
+ mainWindow.check_2PassEncode.CheckState = presetQuery.TwoPass ? CheckState.Checked : CheckState.Unchecked;
+
+ if (presetQuery.Framerate != null)
+ {
+ mainWindow.drp_videoFramerate.Text = presetQuery.Framerate.ToString();
+ }
+ else
+ {
+ mainWindow.drp_videoFramerate.SelectedIndex = 0;
+ }
+
+
+ if (presetQuery.Framerate != null)
+ {
+ // Constant or Peak Framerate for a set framerate.
+
+ if (presetQuery.FramerateMode == FramerateMode.CFR)
+ mainWindow.radio_constantFramerate.Checked = true;
+ else
+ mainWindow.radio_peakAndVariable.Checked = true;
+ }
+ else
+ {
+ // Constant or Variable Framerate for Same as Source.
+ if (presetQuery.FramerateMode == FramerateMode.CFR)
+ mainWindow.radio_constantFramerate.Checked = true;
+ else
+ mainWindow.radio_peakAndVariable.Checked = true;
+ }
+
+ mainWindow.check_turbo.CheckState = presetQuery.TurboFirstPass ? CheckState.Checked : CheckState.Unchecked;
+
+ #endregion
+
+ #region Chapter Markers
+
+ if (presetQuery.IncludeChapterMarkers)
+ {
+ mainWindow.Check_ChapterMarkers.CheckState = CheckState.Checked;
+ mainWindow.Check_ChapterMarkers.Enabled = true;
+ }
+ else
+ {
+ mainWindow.Check_ChapterMarkers.CheckState = CheckState.Unchecked;
+ }
+
+ #endregion
+
+ #region Audio
+
+ mainWindow.AudioSettings.LoadTracks(presetQuery.AudioTracks);
+
+ #endregion
+
+ #region Other
+
+ mainWindow.x264Panel.X264Query = presetQuery.AdvancedEncoderOptions;
+
+ // Set the preset name
+ mainWindow.labelPreset.Text = "Output Settings (Preset: " + name + ")";
+
+ #endregion
+ }
+
+ /// <summary>
+ /// Convert a Quality Value to a position value for the Video Quality slider
+ /// </summary>
+ /// <param name="videoEncoder">The selected video encoder</param>
+ /// <param name="value">The Quality value</param>
+ /// <returns>The position on the video quality slider</returns>
+ private static int QualityToSliderValue(VideoEncoder videoEncoder, double? value)
+ {
+ if (!value.HasValue)
+ {
+ // Default to a sensible level.
+ return 20;
+ }
+
+ int sliderValue = 0;
+ switch (videoEncoder)
+ {
+ case VideoEncoder.FFMpeg:
+ sliderValue = 32 - (int)value;
+ break;
+ case VideoEncoder.X264:
+ double cqStep = Properties.Settings.Default.x264cqstep;
+ sliderValue = (int)((51.0 / cqStep) - (value / cqStep));
+ break;
+ case VideoEncoder.Theora:
+ sliderValue = (int)value;
+ break;
+ }
+
+ return sliderValue;
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/Functions/QueryGenerator.cs b/win/CS/Functions/QueryGenerator.cs
new file mode 100644
index 000000000..97499962b
--- /dev/null
+++ b/win/CS/Functions/QueryGenerator.cs
@@ -0,0 +1,673 @@
+/* QueryGenerator.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.Functions
+{
+ using System;
+ using System.Collections.Generic;
+ using System.Globalization;
+ using System.IO;
+ using System.Windows.Forms;
+
+ using Handbrake.Model;
+
+ /// <summary>
+ /// Generate a CLI Query for HandBrakeCLI
+ /// </summary>
+ public class QueryGenerator
+ {
+ public static string GenerateQueryForPreset(frmMain mainWindow, QueryPictureSettingsMode mode, bool filters, int width, int height)
+ {
+ string query = string.Empty;
+
+ query += GenerateTabbedComponentsQuery(mainWindow, filters, mode, width, height);
+
+ return query;
+ }
+
+ public static string GeneratePreviewQuery(frmMain mainWindow, int duration, string preview)
+ {
+ string query = string.Empty;
+
+ query += SourceQuery(mainWindow, 3, duration, preview);
+
+ query += DestinationQuery(mainWindow, QueryEncodeMode.Preview);
+
+ query += GenerateTabbedComponentsQuery(mainWindow, true, QueryPictureSettingsMode.UserInterfaceSettings, 0, 0);
+
+ return query;
+ }
+
+ public static string GenerateFullQuery(frmMain mainWindow)
+ {
+ string query = string.Empty;
+
+ query += SourceQuery(mainWindow, mainWindow.drop_mode.SelectedIndex, 0, null);
+
+ query += DestinationQuery(mainWindow, QueryEncodeMode.Standard);
+
+ query += GenerateTabbedComponentsQuery(mainWindow, true, QueryPictureSettingsMode.UserInterfaceSettings, 0, 0);
+
+ return query;
+ }
+
+ #region Individual Query Sections
+
+ private static string GenerateTabbedComponentsQuery(frmMain mainWindow, bool filters, QueryPictureSettingsMode mode, int width, int height)
+ {
+ string query = string.Empty;
+
+ // Output Settings
+ query += OutputSettingsQuery(mainWindow);
+
+ // Filters Panel
+ if (filters)
+ query += FiltersQuery(mainWindow);
+
+ // Picture Settings
+ query += PictureSettingsQuery(mainWindow, mode, width, height);
+
+ // Video Settings
+ query += VideoSettingsQuery(mainWindow);
+
+ // Audio Settings
+ query += AudioSettingsQuery(mainWindow);
+
+ // Subtitles Panel
+ query += mainWindow.Subtitles.GetCliQuery;
+
+ // Chapter Markers
+ query += ChapterMarkersQuery(mainWindow);
+
+ // X264 Panel
+ query += X264Query(mainWindow);
+
+ // Extra Settings
+ query += ExtraSettings();
+
+ return query;
+ }
+
+ private static string SourceQuery(frmMain mainWindow, int mode, int duration, string preview)
+ {
+ string query = string.Empty;
+
+ if (!string.IsNullOrEmpty(mainWindow.sourcePath) && mainWindow.sourcePath.Trim() != "Select \"Source\" to continue")
+ {
+ if (mainWindow.sourcePath.EndsWith("\\"))
+ {
+ query = " -i " + mainWindow.sourcePath;
+ }
+ else
+ {
+ query = " -i " + '"' + mainWindow.sourcePath + '"';
+ }
+ }
+
+ if (mainWindow.drp_dvdtitle.Text != string.Empty)
+ {
+ string[] titleInfo = mainWindow.drp_dvdtitle.Text.Split(' ');
+ query += " -t " + titleInfo[0];
+ }
+
+ if (!Properties.Settings.Default.noDvdNav && mainWindow.drop_angle.Items.Count != 0)
+ query += " --angle " + mainWindow.drop_angle.SelectedItem;
+
+ // Decide what part of the video we want to encode.
+ switch (mode)
+ {
+ case 0: // Chapters
+ if (mainWindow.drop_chapterFinish.Text == mainWindow.drop_chapterStart.Text &&
+ mainWindow.drop_chapterStart.Text != string.Empty)
+ query += string.Format(" -c {0}", mainWindow.drop_chapterStart.Text);
+ else if (mainWindow.drop_chapterStart.Text != string.Empty &&
+ mainWindow.drop_chapterFinish.Text != string.Empty)
+ query += string.Format(" -c {0}-{1}", mainWindow.drop_chapterStart.Text,
+ mainWindow.drop_chapterFinish.Text);
+ break;
+ case 1: // Seconds
+ int start, end;
+ int.TryParse(mainWindow.drop_chapterStart.Text, out start);
+ int.TryParse(mainWindow.drop_chapterFinish.Text, out end);
+ int calculatedDuration = end - start;
+
+ query += string.Format(" --start-at duration:{0} --stop-at duration:{1}", mainWindow.drop_chapterStart.Text, calculatedDuration);
+ break;
+ case 2: // Frames
+ int.TryParse(mainWindow.drop_chapterStart.Text, out start);
+ int.TryParse(mainWindow.drop_chapterFinish.Text, out end);
+ calculatedDuration = end - start;
+
+ query += string.Format(" --start-at frame:{0} --stop-at frame:{1}", mainWindow.drop_chapterStart.Text, calculatedDuration);
+ break;
+ case 3: // Preview
+ query += " --previews " + Properties.Settings.Default.previewScanCount + " ";
+ query += " --start-at-preview " + preview;
+ query += " --stop-at duration:" + duration + " ";
+ break;
+ default:
+ break;
+ }
+
+ return query;
+ }
+
+ private static string DestinationQuery(frmMain mainWindow, QueryEncodeMode mode)
+ {
+ string query = string.Empty;
+
+ if (mode != QueryEncodeMode.Preview)
+ query += string.Format(" -o \"{0}\" ", mainWindow.text_destination.Text);
+ else
+ {
+ if (mainWindow.text_destination.Text != string.Empty)
+ query += string.Format(" -o \"{0}\" ", mainWindow.text_destination.Text.Replace(".m", "_sample.m"));
+ }
+
+ return query;
+ }
+
+ private static string OutputSettingsQuery(frmMain mainWindow)
+ {
+ string query = string.Empty;
+
+ query += " -f " + mainWindow.drop_format.Text.ToLower().Replace(" file", string.Empty);
+
+ // These are output settings features
+ if (mainWindow.check_largeFile.Checked)
+ query += " -4 ";
+
+ if (mainWindow.check_iPodAtom.Checked)
+ query += " -I ";
+
+ if (mainWindow.check_optimiseMP4.Checked)
+ query += " -O ";
+
+ return query;
+ }
+
+ private static string PictureSettingsQuery(frmMain mainWindow, QueryPictureSettingsMode mode, int width, int height)
+ {
+ string query = string.Empty;
+
+ if (mode == QueryPictureSettingsMode.UserInterfaceSettings)
+ {
+ if (mainWindow.PictureSettings.text_width.Value != 0)
+ if (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex != 1) // Prevent usage for strict anamorphic
+ query += " -w " + mainWindow.PictureSettings.text_width.Text;
+
+ if (mainWindow.PictureSettings.text_height.Value != 0 &&
+ mainWindow.PictureSettings.text_height.Text != string.Empty)
+ if (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex == 0 ||
+ mainWindow.PictureSettings.drp_anamorphic.SelectedIndex == 3) // Prevent usage for strict anamorphic
+ query += " -l " + mainWindow.PictureSettings.text_height.Text;
+ }
+ else if (mode == QueryPictureSettingsMode.Custom) // For Add Preset Only.
+ {
+ query += " -X " + width;
+ query += " -Y " + height;
+ }
+ else if (mode == QueryPictureSettingsMode.SourceMaximum) // For Add Preset Only.
+ {
+ if (mainWindow.PictureSettings.text_width.Value != 0)
+ if (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex != 1) // Prevent usage for strict anamorphic
+ query += " -X " + mainWindow.PictureSettings.text_width.Text;
+
+ if (mainWindow.PictureSettings.text_height.Value != 0 &&
+ mainWindow.PictureSettings.text_height.Text != string.Empty)
+ if (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex == 0 ||
+ mainWindow.PictureSettings.drp_anamorphic.SelectedIndex == 3) // Prevent usage for strict anamorphic
+ query += " -Y " + mainWindow.PictureSettings.text_height.Text;
+ }
+
+ string cropTop = mainWindow.PictureSettings.crop_top.Text;
+ string cropBottom = mainWindow.PictureSettings.crop_bottom.Text;
+ string cropLeft = mainWindow.PictureSettings.crop_left.Text;
+ string cropRight = mainWindow.PictureSettings.crop_right.Text;
+
+ if (mainWindow.PictureSettings.check_customCrop.Checked && mode != QueryPictureSettingsMode.None)
+ {
+ if (mainWindow.PictureSettings.crop_top.Text == string.Empty)
+ cropTop = "0";
+ if (mainWindow.PictureSettings.crop_bottom.Text == string.Empty)
+ cropBottom = "0";
+ if (mainWindow.PictureSettings.crop_left.Text == string.Empty)
+ cropLeft = "0";
+ if (mainWindow.PictureSettings.crop_right.Text == string.Empty)
+ cropRight = "0";
+
+ query += " --crop " + cropTop + ":" + cropBottom + ":" + cropLeft + ":" + cropRight;
+ }
+
+ switch (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex)
+ {
+ case 0:
+ if (mainWindow.PictureSettings.drp_modulus.SelectedIndex != 0)
+ query += " --modulus " + mainWindow.PictureSettings.drp_modulus.SelectedItem;
+ break;
+ case 1:
+ query += " --strict-anamorphic ";
+ break;
+ case 2:
+ query += " --loose-anamorphic ";
+ if (mainWindow.PictureSettings.drp_modulus.SelectedIndex != 0)
+ query += " --modulus " + mainWindow.PictureSettings.drp_modulus.SelectedItem;
+ break;
+ case 3:
+ query += " --custom-anamorphic ";
+
+ if (mainWindow.PictureSettings.drp_modulus.SelectedIndex != 0)
+ query += " --modulus " + mainWindow.PictureSettings.drp_modulus.SelectedItem;
+
+ if (mainWindow.PictureSettings.check_KeepAR.Checked)
+ query += " --display-width " + mainWindow.PictureSettings.updownDisplayWidth.Text + " ";
+
+ if (mainWindow.PictureSettings.check_KeepAR.Checked)
+ query += " --keep-display-aspect ";
+
+ if (!mainWindow.PictureSettings.check_KeepAR.Checked)
+ if (mainWindow.PictureSettings.updownParWidth.Text != string.Empty &&
+ mainWindow.PictureSettings.updownParHeight.Text != string.Empty)
+ query += " --pixel-aspect " + mainWindow.PictureSettings.updownParWidth.Text + ":" +
+ mainWindow.PictureSettings.updownParHeight.Text + " ";
+ break;
+ }
+
+ return query;
+ }
+
+ private static string FiltersQuery(frmMain mainWindow)
+ {
+ return mainWindow.Filters.GetCliQuery;
+ }
+
+ private static string VideoSettingsQuery(frmMain mainWindow)
+ {
+ string query = string.Empty;
+
+ switch (mainWindow.drp_videoEncoder.Text)
+ {
+ case "MPEG-4 (FFmpeg)":
+ query += " -e ffmpeg";
+ break;
+ case "H.264 (x264)":
+ query += " -e x264";
+ break;
+ case "VP3 (Theora)":
+ query += " -e theora";
+ break;
+ default:
+ query += " -e x264";
+ break;
+ }
+
+ // Video Settings
+ if (mainWindow.radio_avgBitrate.Checked)
+ query += " -b " + mainWindow.text_bitrate.Text;
+
+ // Video Quality Setting
+ if (mainWindow.radio_cq.Checked)
+ {
+ double cqStep = Properties.Settings.Default.x264cqstep;
+ double value;
+ switch (mainWindow.drp_videoEncoder.Text)
+ {
+ case "MPEG-4 (FFmpeg)":
+ value = 31 - (mainWindow.slider_videoQuality.Value - 1);
+ query += " -q " + value.ToString(new CultureInfo("en-US"));
+ break;
+ case "H.264 (x264)":
+ CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");
+ value = 51 - (mainWindow.slider_videoQuality.Value * cqStep);
+ value = Math.Round(value, 2);
+ query += " -q " + value.ToString(culture);
+ break;
+ case "VP3 (Theora)":
+ value = mainWindow.slider_videoQuality.Value;
+ query += " -q " + value.ToString(new CultureInfo("en-US"));
+ break;
+ }
+ }
+
+ if (mainWindow.check_2PassEncode.Checked)
+ query += " -2 ";
+
+ if (mainWindow.check_turbo.Checked)
+ query += " -T ";
+
+ if (mainWindow.drp_videoFramerate.Text != "Same as source")
+ query += " -r " + mainWindow.drp_videoFramerate.Text;
+
+ if (mainWindow.drp_videoFramerate.SelectedIndex == 0)
+ {
+ // If we use Same as Source, we can either output CFR or VFR
+ query += mainWindow.radio_constantFramerate.Checked ? " --cfr " : " --vfr ";
+ }
+ else
+ {
+ // We have a hard framerate set, so we can either be Constant or peak (VFR) framerate
+ query += mainWindow.radio_constantFramerate.Checked ? " --cfr " : " --pfr ";
+ }
+
+ return query;
+ }
+
+ private static string AudioSettingsQuery(frmMain mainWindow)
+ {
+ string query = string.Empty;
+
+ DataGridView audioTracks = mainWindow.AudioSettings.GetAudioPanel();
+ List<string> tracks = new List<string>();
+ List<string> codecs = new List<string>();
+ List<string> mixdowns = new List<string>();
+ List<string> samplerates = new List<string>();
+ List<string> bitrates = new List<string>();
+ List<string> drcs = new List<string>();
+
+ // No Audio
+ if (audioTracks.Rows.Count == 0)
+ query += " -a none ";
+
+ // Gather information about each audio track and store them in the declared lists.
+ foreach (DataGridViewRow row in audioTracks.Rows)
+ {
+ // Audio Track (-a)
+ if (row.Cells[1].Value.ToString() == "Automatic")
+ tracks.Add("1");
+ else if (row.Cells[1].Value.ToString() != "None")
+ {
+ string[] tempSub = row.Cells[1].Value.ToString().Split(' ');
+ tracks.Add(tempSub[0]);
+ }
+
+ // Audio Codec (-E)
+ if (row.Cells[2].Value.ToString() != String.Empty)
+ codecs.Add(GetAudioEncoder(row.Cells[2].Value.ToString()));
+
+ // Audio Mixdown (-6)
+ if (row.Cells[3].Value.ToString() != String.Empty)
+ mixdowns.Add(GetMixDown(row.Cells[3].Value.ToString()));
+
+ // Sample Rate (-R)
+ if (row.Cells[4].Value.ToString() != String.Empty)
+ samplerates.Add(row.Cells[4].Value.ToString());
+
+ // Audio Bitrate (-B)
+ if (row.Cells[5].Value.ToString() != String.Empty)
+ bitrates.Add(row.Cells[5].Value.ToString().Replace("Auto", "auto"));
+
+ // DRC (-D)
+ if (row.Cells[6].Value.ToString() != String.Empty)
+ drcs.Add(row.Cells[6].Value.ToString());
+ }
+
+ // Audio Track (-a)
+ string audioItems = string.Empty;
+ bool firstLoop = true;
+
+ foreach (string item in tracks)
+ {
+ if (firstLoop)
+ {
+ audioItems = item;
+ firstLoop = false;
+ }
+ else
+ audioItems += "," + item;
+ }
+ if (audioItems.Trim() != String.Empty)
+ query += " -a " + audioItems;
+ firstLoop = true;
+ audioItems = string.Empty; // Reset for another pass.
+
+ // Audio Codec (-E)
+ foreach (string item in codecs)
+ {
+ if (firstLoop)
+ {
+ audioItems = item;
+ firstLoop = false;
+ }
+ else
+ audioItems += "," + item;
+ }
+ if (audioItems.Trim() != String.Empty)
+ query += " -E " + audioItems;
+ firstLoop = true;
+ audioItems = string.Empty; // Reset for another pass.
+
+ // Audio Mixdown (-6)
+ foreach (string item in mixdowns)
+ {
+ if (firstLoop)
+ {
+ audioItems = item;
+ firstLoop = false;
+ }
+ else
+ audioItems += "," + item;
+ }
+ if (audioItems.Trim() != String.Empty)
+ query += " -6 " + audioItems;
+ firstLoop = true;
+ audioItems = string.Empty; // Reset for another pass.
+
+ // Sample Rate (-R)
+ foreach (string item in samplerates)
+ {
+ if (firstLoop)
+ {
+ audioItems = item;
+ firstLoop = false;
+ }
+ else
+ audioItems += "," + item;
+ }
+ if (audioItems.Trim() != String.Empty)
+ query += " -R " + audioItems;
+ firstLoop = true;
+ audioItems = string.Empty; // Reset for another pass.
+
+ // Audio Bitrate (-B)
+ foreach (string item in bitrates)
+ {
+ if (firstLoop)
+ {
+ audioItems = item;
+ firstLoop = false;
+ }
+ else
+ audioItems += "," + item;
+ }
+ if (audioItems.Trim() != String.Empty)
+ query += " -B " + audioItems;
+ firstLoop = true;
+ audioItems = string.Empty; // Reset for another pass.
+
+ // DRC (-D)
+ foreach (var itm in drcs)
+ {
+ string item = itm.ToString(new CultureInfo("en-US"));
+ if (firstLoop)
+ {
+ audioItems = item;
+ firstLoop = false;
+ }
+ else
+ audioItems += "," + item;
+ }
+ if (audioItems.Trim() != String.Empty)
+ query += " -D " + audioItems;
+
+ return query;
+ }
+
+ private static string ChapterMarkersQuery(frmMain mainWindow)
+ {
+ string query = string.Empty;
+
+ // Attach Source name and dvd title to the start of the chapters.csv filename.
+ // This is for the queue. It allows different chapter name files for each title.
+ string[] destNameSplit = mainWindow.text_destination.Text.Split('\\');
+ string destName = destNameSplit[destNameSplit.Length - 1];
+ destName = destName.Replace("\"", string.Empty);
+ destName = destName.Replace(".mp4", string.Empty).Replace(".m4v", string.Empty).Replace(".mkv", string.Empty);
+
+ string sourceTitle = mainWindow.drp_dvdtitle.Text;
+ string[] titlesplit = sourceTitle.Split(' ');
+ sourceTitle = titlesplit[0];
+
+ if (mainWindow.Check_ChapterMarkers.Checked && mainWindow.Check_ChapterMarkers.Enabled)
+ {
+ if (destName.Trim() != String.Empty)
+ {
+ string path = sourceTitle != "Automatic"
+ ? Path.Combine(Path.GetTempPath(), destName + "-" + sourceTitle + "-chapters.csv")
+ : Path.Combine(Path.GetTempPath(), destName + "-chapters.csv");
+
+ if (ChapterCsvSave(mainWindow, path) == false)
+ query += " -m ";
+ else
+ query += " --markers=" + "\"" + path + "\"";
+ }
+ else
+ query += " -m";
+ }
+
+ return query;
+ }
+
+ private static string X264Query(frmMain mainWindow)
+ {
+ string advancedOptions = string.Empty;
+ switch (mainWindow.drp_videoEncoder.SelectedIndex)
+ {
+ case 0: // ffmpeg
+ advancedOptions = string.IsNullOrEmpty(mainWindow.x264Panel.X264Query)
+ ? string.Empty
+ : mainWindow.x264Panel.X264Query;
+ break;
+ case 1: // x264
+ advancedOptions = string.IsNullOrEmpty(mainWindow.x264Panel.X264Query)
+ ? string.Empty
+ : mainWindow.x264Panel.X264Query;
+ break;
+ case 2: // VP3
+ advancedOptions = string.Empty;
+ break;
+ }
+
+
+ return " -x " + advancedOptions;
+ }
+
+ private static string ExtraSettings()
+ {
+ string query = string.Empty;
+
+ // Verbosity Level
+ query += " --verbose=" + Properties.Settings.Default.verboseLevel;
+
+ // LibDVDNav
+ if (Properties.Settings.Default.noDvdNav)
+ query += " --no-dvdnav";
+
+ return query;
+ }
+
+ #endregion
+
+ #region Helpers
+
+ /// <summary>
+ /// Return the CLI Mixdown name
+ /// </summary>
+ /// <param name="selectedAudio">GUI mixdown name</param>
+ /// <returns>CLI mixdown name</returns>
+ private static string GetMixDown(string selectedAudio)
+ {
+ switch (selectedAudio)
+ {
+ case "Automatic":
+ return "auto";
+ case "Mono":
+ return "mono";
+ case "Stereo":
+ return "stereo";
+ case "Dolby Surround":
+ return "dpl1";
+ case "Dolby Pro Logic II":
+ return "dpl2";
+ case "6 Channel Discrete":
+ return "6ch";
+ default:
+ return "auto";
+ }
+ }
+
+ /// <summary>
+ /// Get the CLI Audio Encoder name
+ /// </summary>
+ /// <param name="selectedEncoder">
+ /// String The GUI Encode name
+ /// </param>
+ /// <returns>
+ /// String CLI encoder name
+ /// </returns>
+ private static string GetAudioEncoder(string selectedEncoder)
+ {
+ switch (selectedEncoder)
+ {
+ case "AAC (faac)":
+ return "faac";
+ case "MP3 (lame)":
+ return "lame";
+ case "Vorbis (vorbis)":
+ return "vorbis";
+ case "AC3 Passthru":
+ return "copy:ac3";
+ case "DTS Passthru":
+ return "copy:dts";
+ case "AC3 (ffmpeg)":
+ return "ac3";
+ default:
+ return string.Empty;
+ }
+ }
+
+ /// <summary>
+ /// Create a CSV file with the data from the Main Window Chapters tab
+ /// </summary>
+ /// <param name="mainWindow">Main Window</param>
+ /// <param name="filePathName">Path to save the csv file</param>
+ /// <returns>True if successful </returns>
+ private static bool ChapterCsvSave(frmMain mainWindow, string filePathName)
+ {
+ try
+ {
+ string csv = string.Empty;
+
+ foreach (DataGridViewRow row in mainWindow.data_chpt.Rows)
+ {
+ csv += row.Cells[0].Value.ToString();
+ csv += ",";
+ csv += row.Cells[1].Value.ToString().Replace(",", "\\,");
+ csv += Environment.NewLine;
+ }
+ StreamWriter file = new StreamWriter(filePathName);
+ file.Write(csv);
+ file.Close();
+ file.Dispose();
+ return true;
+ }
+ catch (Exception exc)
+ {
+ MessageBox.Show("Unable to save Chapter Makrers file! \nChapter marker names will NOT be saved in your encode \n\n" + exc, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ return false;
+ }
+ }
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/win/CS/Functions/ToolStripRenderOverride.cs b/win/CS/Functions/ToolStripRenderOverride.cs
new file mode 100644
index 000000000..28845c2ed
--- /dev/null
+++ b/win/CS/Functions/ToolStripRenderOverride.cs
@@ -0,0 +1,51 @@
+/* ToolStripRenderOverride.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.Functions
+{
+ using System.Windows.Forms;
+
+ public class ToolStripRenderOverride : ToolStripProfessionalRenderer
+ {
+ ToolStripSystemRenderer render = new ToolStripSystemRenderer();
+
+ public ToolStripRenderOverride()
+ {
+ }
+
+ /// <summary>
+ /// Fix for a bug in .NET where a white line appears at the bottom of the control.
+ /// http://connect.microsoft.com/VisualStudio/feedback/details/92862/toolstrip-always-draws-a-border-on-the-bottom-with-rendermode-system-and-docked-left-or-right
+ /// </summary>
+ /// <param name="e">
+ /// ToolStripRenderEventArgs
+ /// </param>
+ protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
+ {
+ //base.OnRenderToolStripBorder(e);
+ }
+
+ /// <summary>
+ /// Change the Button Hover Background style to the system button style
+ /// </summary>
+ /// <param name="e">
+ /// ToolStripRenderEventArgs
+ /// </param>
+ protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e)
+ {
+ render.DrawButtonBackground(e);
+ }
+
+ protected override void OnRenderDropDownButtonBackground(ToolStripItemRenderEventArgs e)
+ {
+ render.DrawDropDownButtonBackground(e);
+ }
+
+ protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e)
+ {
+ //base.OnRenderToolStripBackground(e);
+ }
+ }
+}
diff --git a/win/CS/HandBrake.5.1.ReSharper b/win/CS/HandBrake.5.1.ReSharper
new file mode 100644
index 000000000..22ca79976
--- /dev/null
+++ b/win/CS/HandBrake.5.1.ReSharper
@@ -0,0 +1,379 @@
+<Configuration>
+ <CodeStyleSettings>
+ <ExternalPath IsNull="False">
+ </ExternalPath>
+ <Sharing>SOLUTION</Sharing>
+ <CSharp>
+ <FormatSettings>
+ <ALIGN_MULTILINE_ARGUMENT>False</ALIGN_MULTILINE_ARGUMENT>
+ <BLANK_LINES_AROUND_SINGLE_LINE_FIELD>1</BLANK_LINES_AROUND_SINGLE_LINE_FIELD>
+ <BLANK_LINES_AROUND_SINGLE_LINE_INVOCABLE>1</BLANK_LINES_AROUND_SINGLE_LINE_INVOCABLE>
+ <BLANK_LINES_BETWEEN_USING_GROUPS>1</BLANK_LINES_BETWEEN_USING_GROUPS>
+ <FORCE_ATTRIBUTE_STYLE>SEPARATE</FORCE_ATTRIBUTE_STYLE>
+ <FORCE_FOR_BRACES_STYLE>ALWAYS_ADD</FORCE_FOR_BRACES_STYLE>
+ <FORCE_FOREACH_BRACES_STYLE>ALWAYS_ADD</FORCE_FOREACH_BRACES_STYLE>
+ <FORCE_IFELSE_BRACES_STYLE>ALWAYS_ADD</FORCE_IFELSE_BRACES_STYLE>
+ <FORCE_WHILE_BRACES_STYLE>ALWAYS_ADD</FORCE_WHILE_BRACES_STYLE>
+ <INDENT_ANONYMOUS_METHOD_BLOCK>False</INDENT_ANONYMOUS_METHOD_BLOCK>
+ <INDENT_EMBRACED_INITIALIZER_BLOCK>False</INDENT_EMBRACED_INITIALIZER_BLOCK>
+ <KEEP_BLANK_LINES_IN_CODE>1</KEEP_BLANK_LINES_IN_CODE>
+ <KEEP_BLANK_LINES_IN_DECLARATIONS>1</KEEP_BLANK_LINES_IN_DECLARATIONS>
+ <KEEP_USER_LINEBREAKS>False</KEEP_USER_LINEBREAKS>
+ <MODIFIERS_ORDER IsNull="False">
+ <Item>public</Item>
+ <Item>protected</Item>
+ <Item>internal</Item>
+ <Item>private</Item>
+ <Item>new</Item>
+ <Item>abstract</Item>
+ <Item>virtual</Item>
+ <Item>override</Item>
+ <Item>sealed</Item>
+ <Item>static</Item>
+ <Item>readonly</Item>
+ <Item>extern</Item>
+ <Item>unsafe</Item>
+ <Item>volatile</Item>
+ </MODIFIERS_ORDER>
+ <PLACE_CONSTRUCTOR_INITIALIZER_ON_SAME_LINE>False</PLACE_CONSTRUCTOR_INITIALIZER_ON_SAME_LINE>
+ <PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE>False</PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE>
+ <PLACE_SIMPLE_ACCESSOR_ON_SINGLE_LINE>False</PLACE_SIMPLE_ACCESSOR_ON_SINGLE_LINE>
+ <PLACE_TYPE_CONSTRAINTS_ON_SAME_LINE>False</PLACE_TYPE_CONSTRAINTS_ON_SAME_LINE>
+ <PLACE_WHILE_ON_NEW_LINE>True</PLACE_WHILE_ON_NEW_LINE>
+ <REDUNDANT_THIS_QUALIFIER_STYLE>ALWAYS_USE</REDUNDANT_THIS_QUALIFIER_STYLE>
+ <SIMPLE_EMBEDDED_STATEMENT_STYLE>ON_SINGLE_LINE</SIMPLE_EMBEDDED_STATEMENT_STYLE>
+ <SPACE_AFTER_TYPECAST_PARENTHESES>False</SPACE_AFTER_TYPECAST_PARENTHESES>
+ <SPACE_AROUND_MULTIPLICATIVE_OP>True</SPACE_AROUND_MULTIPLICATIVE_OP>
+ <SPACE_BEFORE_SIZEOF_PARENTHESES>False</SPACE_BEFORE_SIZEOF_PARENTHESES>
+ <SPACE_BEFORE_TYPEOF_PARENTHESES>False</SPACE_BEFORE_TYPEOF_PARENTHESES>
+ <SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES>True</SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES>
+ <STICK_COMMENT>False</STICK_COMMENT>
+ <WRAP_AFTER_DECLARATION_LPAR>True</WRAP_AFTER_DECLARATION_LPAR>
+ <WRAP_AFTER_INVOCATION_LPAR>True</WRAP_AFTER_INVOCATION_LPAR>
+ <WRAP_ARGUMENTS_STYLE>CHOP_IF_LONG</WRAP_ARGUMENTS_STYLE>
+ <WRAP_BEFORE_FIRST_TYPE_PARAMETER_CONSTRAINT>True</WRAP_BEFORE_FIRST_TYPE_PARAMETER_CONSTRAINT>
+ <WRAP_EXTENDS_LIST_STYLE>CHOP_IF_LONG</WRAP_EXTENDS_LIST_STYLE>
+ <WRAP_PARAMETERS_STYLE>CHOP_IF_LONG</WRAP_PARAMETERS_STYLE>
+ </FormatSettings>
+ <UsingsSettings>
+ <AddImportsToDeepestScope>True</AddImportsToDeepestScope>
+ <QualifiedUsingAtNestedScope>True</QualifiedUsingAtNestedScope>
+ </UsingsSettings>
+ <Naming2>
+ <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>
+ <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>
+ <ExceptionName IsNull="False">
+ </ExceptionName>
+ <OverrideDefaultSettings>True</OverrideDefaultSettings>
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="TypesAndNamespaces" />
+ <PredefinedRule Inspect="True" Prefix="I" Suffix="" Style="AaBb" ElementKind="Interfaces" />
+ <PredefinedRule Inspect="True" Prefix="T" Suffix="" Style="AaBb" ElementKind="TypeParameters" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="MethodPropertyEvent" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="Locals" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="LocalConstants" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="Parameters" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PublicFields" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="Constants" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="StaticReadonly" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="EnumMember" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="Other" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="PrivateInstanceFields" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="PrivateStaticFields" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateConstants" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateStaticReadonly" />
+ </Naming2>
+ <CustomMemberReorderingPatterns><![CDATA[<?xml version="1.0" encoding="utf-8"?>
+<Patterns xmlns="urn:shemas-jetbrains-com:member-reordering-patterns">
+
+ <!-- Do not reorder COM interfaces -->
+ <Pattern>
+ <Match>
+ <And Weight="2000">
+ <Kind Is="interface"/>
+ <HasAttribute CLRName="System.Runtime.InteropServices.InterfaceTypeAttribute"
+ Inherit="true"/>
+ </And>
+ </Match>
+ </Pattern>
+
+ <!-- Do not reorder P/Invoke structs -->
+ <Pattern>
+ <Match>
+ <And Weight="2000">
+ <Or>
+ <Kind Is="struct"/>
+ <Kind Is="class"/>
+ </Or>
+ <HasAttribute CLRName="System.Runtime.InteropServices.StructLayoutAttribute"
+ Inherit="true"/>
+ </And>
+ </Match>
+ </Pattern>
+
+ <!-- Do not reorder P/Invoke classes (called xxxNativeMethods) -->
+ <Pattern>
+ <Match>
+ <And Weight="2000">
+ <Kind Is="class"/>
+ <Name Is=".*NativeMethods" />
+ </And>
+ </Match>
+ </Pattern>
+
+ <!-- StyleCop pattern -->
+ <Pattern RemoveAllRegions="true">
+ <Match>
+ <Or Weight="1000" >
+ <Kind Is="class" />
+ <Kind Is="struct" />
+ <Kind Is="interface"/>
+ </Or>
+ </Match>
+
+ <!-- constants and fields -->
+ <Entry>
+ <Match>
+ <Or>
+ <Kind Is="constant"/>
+ <Kind Is="field"/>
+ </Or>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private"/>
+ <Kind Order="constant field"/>
+ <Readonly/>
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Constants and Fields"/>
+ </Entry>
+
+ <!-- constructors -->
+ <Entry>
+ <Match>
+ <Or Weight="200">
+ <Kind Is="constructor"/>
+ <Kind Is="destructor"/>
+ </Or>
+ </Match>
+ <Sort>
+ <Static/>
+ <Kind Order="constructor destructor"/>
+ <Access Order="public internal protected-internal protected private"/>
+ </Sort>
+ <Group Region="Constructors and Destructors"/>
+ </Entry>
+
+ <!-- delegates -->
+ <Entry>
+ <Match>
+ <Kind Is="delegate"/>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private" />
+ <Static />
+ <Name/>
+ </Sort>
+ <Group Region="Delegates"/>
+ </Entry>
+
+ <!-- events -->
+ <Entry>
+ <Match>
+ <Kind Is="event"/>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private" />
+ <Static />
+ <Name/>
+ </Sort>
+ <Group Region="Events"/>
+ </Entry>
+
+ <!-- enum -->
+ <Entry>
+ <Match>
+ <Kind Is="enum"/>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private" />
+ <Name/>
+ </Sort>
+ <Group Region="Enums"/>
+ </Entry>
+
+ <!-- interfaces -->
+ <Entry>
+ <Match>
+ <Kind Is="interface" />
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private" />
+ <Name/>
+ </Sort>
+ <Group Region="Interfaces"/>
+ </Entry>
+
+ <!-- properties -->
+ <Entry>
+ <Match>
+ <Kind Is="property"/>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private"/>
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Properties"/>
+ </Entry>
+
+ <!-- indexers -->
+ <Entry>
+ <Match>
+ <Kind Is="indexer"
+ Weight="300" />
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private" />
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Indexers"/>
+ </Entry>
+
+ <!-- operator -->
+ <Entry>
+ <Match>
+ <Kind Is="operator"/>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private" />
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Operators"/>
+ </Entry>
+
+ <!-- public methods -->
+ <Entry>
+ <Match>
+ <And>
+ <Kind Is="method"/>
+ <Access Is="public"/>
+ </And>
+ </Match>
+ <Sort>
+ <Access Order="public"/>
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Public Methods"/>
+ </Entry>
+
+ <!-- Implemented Interfaces -->
+ <Entry>
+ <Match>
+ <And Weight="500">
+ <Kind Is="method"/>
+ <ImplementsInterface CLRName=".*"/>
+ </And>
+ </Match>
+ <Sort>
+ <ImplementsInterface />
+ <Access Order="public internal protected-internal protected private"/>
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Implemented Interfaces">
+ <ImplementsInterface Region="${ImplementsInterface}" />
+ </Group>
+ </Entry>
+
+ <!-- other methods -->
+ <Entry>
+ <Match>
+ <Kind Is="method"/>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private"/>
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Methods"/>
+ </Entry>
+
+ <!-- Nested structs -->
+ <Entry>
+ <Match>
+ <Kind Is="struct"
+ Weight="600" />
+ </Match>
+ <Sort>
+ <Static />
+ <Access Order="public internal protected-internal protected private" />
+ <Name/>
+ </Sort>
+ </Entry>
+
+ <!-- Nested classes -->
+ <Entry>
+ <Match>
+ <Kind Is="class"
+ Weight="700" />
+ </Match>
+ <Sort>
+ <Static />
+ <Access Order="public internal protected-internal protected private" />
+ <Name/>
+ </Sort>
+ </Entry>
+
+ <!-- all other members -->
+ <Entry/>
+
+ </Pattern>
+</Patterns>
+]]></CustomMemberReorderingPatterns>
+ </CSharp>
+ <VB>
+ <FormatSettings />
+ <ImportsSettings />
+ <Naming2>
+ <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>
+ <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>
+ </Naming2>
+ </VB>
+ <Web>
+ <Naming2 />
+ </Web>
+ <Xaml>
+ <Naming2 />
+ </Xaml>
+ <XML>
+ <FormatSettings />
+ </XML>
+ <GenerateMemberBody />
+ <Naming2>
+ <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>
+ <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>
+ <ExceptionName IsNull="False">
+ </ExceptionName>
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="aaBb" ElementKind="Locals" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="aaBb" ElementKind="Parameters" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="TypesAndNamespaces" />
+ <PredefinedRule Inspect="False" Prefix="I" Suffix="" Style="AaBb" ElementKind="Interfaces" />
+ <PredefinedRule Inspect="False" Prefix="T" Suffix="" Style="AaBb" ElementKind="TypeParameters" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="MethodPropertyEvent" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="aaBb" ElementKind="LocalConstants" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="PublicFields" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="Constants" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="StaticReadonly" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="EnumMember" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="Other" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateConstants" />
+ <PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PrivateInstanceFields" />
+ <PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PrivateStaticFields" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateStaticReadonly" />
+ </Naming2>
+ </CodeStyleSettings>
+</Configuration> \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/EventArgs/EncodeCompletedEventArgs.cs b/win/CS/HandBrake.ApplicationServices/EventArgs/EncodeCompletedEventArgs.cs
new file mode 100644
index 000000000..2d613f6d5
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/EventArgs/EncodeCompletedEventArgs.cs
@@ -0,0 +1,49 @@
+/* EncodeCompletedEventArgs.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.EventArgs
+{
+ using System;
+
+ /// <summary>
+ /// Encode Progress Event Args
+ /// </summary>
+ public class EncodeCompletedEventArgs : EventArgs
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="EncodeCompletedEventArgs"/> class.
+ /// </summary>
+ /// <param name="sucessful">
+ /// The sucessful.
+ /// </param>
+ /// <param name="exception">
+ /// The exception.
+ /// </param>
+ /// <param name="errorInformation">
+ /// The error information.
+ /// </param>
+ public EncodeCompletedEventArgs(bool sucessful, Exception exception, string errorInformation)
+ {
+ this.Successful = sucessful;
+ this.Exception = exception;
+ this.ErrorInformation = errorInformation;
+ }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether Successful.
+ /// </summary>
+ public bool Successful { get; set; }
+
+ /// <summary>
+ /// Gets or sets Exception.
+ /// </summary>
+ public Exception Exception { get; set; }
+
+ /// <summary>
+ /// Gets or sets ErrorInformation.
+ /// </summary>
+ public string ErrorInformation { get; set; }
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/EventArgs/EncodeProgressEventArgs.cs b/win/CS/HandBrake.ApplicationServices/EventArgs/EncodeProgressEventArgs.cs
new file mode 100644
index 000000000..b4d6b9a64
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/EventArgs/EncodeProgressEventArgs.cs
@@ -0,0 +1,45 @@
+/* EncodeProgressEventArgs.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.EventArgs
+{
+ using System;
+
+ /// <summary>
+ /// Encode Progress Event Args
+ /// </summary>
+ public class EncodeProgressEventArgs : EventArgs
+ {
+ /// <summary>
+ /// Gets or sets PercentComplete.
+ /// </summary>
+ public float PercentComplete { get; set; }
+
+ /// <summary>
+ /// Gets or sets CurrentFrameRate.
+ /// </summary>
+ public float CurrentFrameRate { get; set; }
+
+ /// <summary>
+ /// Gets or sets AverageFrameRate.
+ /// </summary>
+ public float AverageFrameRate { get; set; }
+
+ /// <summary>
+ /// Gets or sets EstimatedTimeLeft.
+ /// </summary>
+ public TimeSpan EstimatedTimeLeft { get; set; }
+
+ /// <summary>
+ /// Gets or sets Task.
+ /// </summary>
+ public int Task { get; set; }
+
+ /// <summary>
+ /// Gets or sets TaskCount.
+ /// </summary>
+ public int TaskCount { get; set; }
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/EventArgs/QueueProgressEventArgs.cs b/win/CS/HandBrake.ApplicationServices/EventArgs/QueueProgressEventArgs.cs
new file mode 100644
index 000000000..8613187bc
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/EventArgs/QueueProgressEventArgs.cs
@@ -0,0 +1,33 @@
+/* QueueProgressEventArgs.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.EventArgs
+{
+ using System;
+
+ using HandBrake.ApplicationServices.Model;
+
+ /// <summary>
+ /// Queue Progress Event Args
+ /// </summary>
+ public class QueueProgressEventArgs : EventArgs
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="QueueProgressEventArgs"/> class.
+ /// </summary>
+ /// <param name="newJob">
+ /// The new job.
+ /// </param>
+ public QueueProgressEventArgs(QueueTask newJob)
+ {
+ this.NewJob = newJob;
+ }
+
+ /// <summary>
+ /// Gets or sets the new job which is about to be processed.
+ /// </summary>
+ public QueueTask NewJob { get; set; }
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/EventArgs/ScanCompletedEventArgs.cs b/win/CS/HandBrake.ApplicationServices/EventArgs/ScanCompletedEventArgs.cs
new file mode 100644
index 000000000..9b0437ac7
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/EventArgs/ScanCompletedEventArgs.cs
@@ -0,0 +1,49 @@
+/* ScanCompletedEventArgs.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.EventArgs
+{
+ using System;
+
+ /// <summary>
+ /// Scan Progress Event Args
+ /// </summary>
+ public class ScanCompletedEventArgs : EventArgs
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="ScanCompletedEventArgs"/> class.
+ /// </summary>
+ /// <param name="sucessful">
+ /// The sucessful.
+ /// </param>
+ /// <param name="exception">
+ /// The exception.
+ /// </param>
+ /// <param name="errorInformation">
+ /// The error information.
+ /// </param>
+ public ScanCompletedEventArgs(bool sucessful, Exception exception, string errorInformation)
+ {
+ this.Successful = sucessful;
+ this.Exception = exception;
+ this.ErrorInformation = errorInformation;
+ }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether Successful.
+ /// </summary>
+ public bool Successful { get; set; }
+
+ /// <summary>
+ /// Gets or sets Exception.
+ /// </summary>
+ public Exception Exception { get; set; }
+
+ /// <summary>
+ /// Gets or sets ErrorInformation.
+ /// </summary>
+ public string ErrorInformation { get; set; }
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/EventArgs/ScanProgressEventArgs.cs b/win/CS/HandBrake.ApplicationServices/EventArgs/ScanProgressEventArgs.cs
new file mode 100644
index 000000000..1a6bdb0a1
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/EventArgs/ScanProgressEventArgs.cs
@@ -0,0 +1,25 @@
+/* ScanProgressEventArgs.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.EventArgs
+{
+ using System;
+
+ /// <summary>
+ /// Scan Progress Event Args
+ /// </summary>
+ public class ScanProgressEventArgs : EventArgs
+ {
+ /// <summary>
+ /// Gets or sets the title currently being scanned.
+ /// </summary>
+ public int CurrentTitle { get; set; }
+
+ /// <summary>
+ /// Gets or sets the total number of Titles.
+ /// </summary>
+ public int Titles { get; set; }
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Functions/Converters.cs b/win/CS/HandBrake.ApplicationServices/Functions/Converters.cs
new file mode 100644
index 000000000..1dd817e23
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Functions/Converters.cs
@@ -0,0 +1,189 @@
+/* Converters.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Functions
+{
+ using System;
+ using System.Text.RegularExpressions;
+
+ using HandBrake.ApplicationServices.Model.Encoding;
+
+ /// <summary>
+ /// A class to convert various things to native C# objects
+ /// </summary>
+ public class Converters
+ {
+ /**
+ * TODO:
+ * - Many of these converters can be ditched at a later point. Should be able to model all this within the enums themsevles.
+ *
+ **/
+
+ /// <summary>
+ /// Convert HandBrakes time remaining into a TimeSpan
+ /// </summary>
+ /// <param name="time">
+ /// The time remaining for the encode.
+ /// </param>
+ /// <returns>
+ /// A TimepSpan object
+ /// </returns>
+ public static TimeSpan EncodeToTimespan(string time)
+ {
+ TimeSpan converted = new TimeSpan(0, 0, 0, 0);
+
+ Match m = Regex.Match(time.Trim(), @"^([0-9]{2}:[0-9]{2}:[0-9]{2})");
+ if (m.Success)
+ {
+ TimeSpan.TryParse(m.Groups[0].Value, out converted);
+ }
+
+ return converted;
+ }
+
+ /// <summary>
+ /// Get the GUI equiv to a CLI mixdown
+ /// </summary>
+ /// <param name="mixdown">The Audio Mixdown</param>
+ /// <returns>The GUI representation of the mixdown</returns>
+ public static string GetMixDown(string mixdown)
+ {
+ switch (mixdown.Trim())
+ {
+ case "mono":
+ return "Mono";
+ case "stereo":
+ return "Stereo";
+ case "dpl1":
+ return "Dolby Surround";
+ case "dpl2":
+ return "Dolby Pro Logic II";
+ case "6ch":
+ return "6 Channel Discrete";
+ default:
+ return "Automatic";
+ }
+ }
+
+ /// <summary>
+ /// Get the GUI equiv to a CLI audio encoder
+ /// </summary>
+ /// <param name="audioEnc">The Audio Encoder</param>
+ /// <returns>The GUI representation of that audio encoder</returns>
+ public static string GetGUIAudioEncoder(string audioEnc)
+ {
+ switch (audioEnc)
+ {
+ case "faac":
+ return "AAC (faac)";
+ case "lame":
+ return "MP3 (lame)";
+ case "vorbis":
+ return "Vorbis (vorbis)";
+ case "ac3":
+ return "AC3 (ffmpeg)";
+ case "copy:ac3":
+ return "AC3 Passthru";
+ case "copy:dts":
+ return "DTS Passthru";
+ default:
+ return "AAC (faac)";
+ }
+ }
+
+ /// <summary>
+ /// Get the Video Encoder for a given string
+ /// </summary>
+ /// <param name="encoder">
+ /// The encoder name
+ /// </param>
+ /// <returns>
+ /// VideoEncoder enum object
+ /// </returns>
+ public static VideoEncoder GetVideoEncoder(string encoder)
+ {
+ switch (encoder)
+ {
+ case "ffmpeg":
+ return VideoEncoder.FFMpeg;
+ case "x264":
+ return VideoEncoder.X264;
+ case "theora":
+ return VideoEncoder.Theora;
+ default:
+ return VideoEncoder.X264;
+ }
+ }
+
+ /// <summary>
+ /// Get a GUI name for a given video Encoder.
+ /// </summary>
+ /// <param name="encoder">
+ /// A VideoEncoder Enum object
+ /// </param>
+ /// <returns>
+ /// A GUI encoder name, default is x264
+ /// </returns>
+ public static string GetGUIVideoEncoder(VideoEncoder encoder)
+ {
+ switch (encoder)
+ {
+ case VideoEncoder.FFMpeg:
+ return "MPEG-4 (FFmpeg)";
+ case VideoEncoder.X264:
+ return "H.264 (x264)";
+ case VideoEncoder.Theora:
+ return "VP3 (Theora)";
+ default:
+ return "H.264 (x264)";
+ }
+ }
+
+
+ /// <summary>
+ /// Get the OutputFormat Enum for a given string
+ /// </summary>
+ /// <param name="format">
+ /// OutputFormat as a string
+ /// </param>
+ /// <returns>
+ /// An OutputFormat Enum
+ /// </returns>
+ public static OutputFormat GetFileFormat(string format)
+ {
+ switch (format.ToLower())
+ {
+ default:
+ return OutputFormat.Mp4;
+ case "m4v":
+ return OutputFormat.M4V;
+ case "mkv":
+ return OutputFormat.Mkv;
+ }
+ }
+
+ /// <summary>
+ /// Get the OutputFormat Enum for a given string
+ /// </summary>
+ /// <param name="format">
+ /// OutputFormat as a string
+ /// </param>
+ /// <returns>
+ /// An OutputFormat Enum
+ /// </returns>
+ public static string GetFileFormat(OutputFormat format)
+ {
+ switch (format)
+ {
+ default:
+ return "mp4";
+ case OutputFormat.M4V:
+ return "m4v";
+ case OutputFormat.Mkv:
+ return "mkv";
+ }
+ }
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Functions/EnumHelper.cs b/win/CS/HandBrake.ApplicationServices/Functions/EnumHelper.cs
new file mode 100644
index 000000000..0bbc746d7
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Functions/EnumHelper.cs
@@ -0,0 +1,35 @@
+/* EnumHelper.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Functions
+{
+ using System;
+ using System.ComponentModel;
+ using System.Reflection;
+
+ /// <summary>
+ /// Enum Helpers
+ /// </summary>
+ public class EnumHelper
+ {
+ /// <summary>
+ /// Get the description of an Enum
+ /// </summary>
+ /// <param name="value">
+ /// The value.
+ /// </param>
+ /// <returns>
+ /// The Description string
+ /// </returns>
+ public static string GetDescription(Enum value)
+ {
+ FieldInfo fieldInfo = value.GetType().GetField(value.ToString());
+ DescriptionAttribute[] attributes =
+ (DescriptionAttribute[])fieldInfo.GetCustomAttributes(
+ typeof(DescriptionAttribute), false);
+ return (attributes.Length > 0) ? attributes[0].Description : value.ToString();
+ }
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Functions/GrowlCommunicator.cs b/win/CS/HandBrake.ApplicationServices/Functions/GrowlCommunicator.cs
new file mode 100644
index 000000000..a28457836
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Functions/GrowlCommunicator.cs
@@ -0,0 +1,119 @@
+/* GrowlCommunicator.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Functions
+{
+ using System;
+
+ using Growl.Connector;
+
+ /// <summary>
+ /// Provides all functionality for communicating with Growl for Windows.
+ /// </summary>
+ /// <remarks>
+ /// This class is implemented as a static class because:
+ /// 1. It allows nearly all of the Growl-related code to be in one place
+ /// 2. It prevents the main form, queue handler, and any other part of Handbrake from having to declare
+ /// or track any new instance variables
+ /// </remarks>
+ public static class GrowlCommunicator
+ {
+ /// <summary>
+ /// The <see cref="GrowlConnector"/> that actually talks to Growl
+ /// </summary>
+ private static GrowlConnector growl;
+
+ /// <summary>
+ /// The Handbrake application instance that is registered with Growl
+ /// </summary>
+ private static Application application;
+
+ /// <summary>
+ /// Notification shown upon completion of encoding
+ /// </summary>
+ private static NotificationType encodeOrQueueCompleted = new NotificationType("EncodeOrQueue", "HandBrake Status");
+
+ /// <summary>
+ /// Checks to see if Growl is currently running on the local machine.
+ /// </summary>
+ /// <returns>
+ /// <c>true</c> if Growl is running;
+ /// <c>false</c> otherwise
+ /// </returns>
+ public static bool IsRunning()
+ {
+ Initialize();
+
+ return GrowlConnector.IsGrowlRunningLocally();
+ }
+
+ /// <summary>
+ /// Registers Handbrake with the local Growl instance
+ /// </summary>
+ /// <remarks>
+ /// This should usually be called at application start-up
+ /// </remarks>
+ public static void Register()
+ {
+ Initialize();
+ growl.Register(application, new[] {encodeOrQueueCompleted});
+ }
+
+ /// <summary>
+ /// Sends a notification to Growl. (Since Handbrake currently only supports one type of notification with
+ /// static text, this is a shortcut method).
+ /// </summary>
+ /// <param name="title">
+ /// The title.
+ /// </param>
+ /// <param name="text">
+ /// The text to display.
+ /// </param>
+ public static void Notify(string title, string text)
+ {
+ Notification notification = new Notification(application.Name, encodeOrQueueCompleted.Name, String.Empty,
+ title, text);
+ growl.Notify(notification);
+ }
+
+ /// <summary>
+ /// Sends a notification to Growl. (This is the more generic version that could be used in the future if
+ /// more notification types are implemented)
+ /// </summary>
+ /// <param name="notificationType">The <see cref="NotificationType">type</see> of notification to send</param>
+ /// <param name="title">The notification title</param>
+ /// <param name="text">The notification text</param>
+ /// <param name="imageUrl">The notification image as a url</param>
+ public static void Notify(NotificationType notificationType, string title, string text, string imageUrl)
+ {
+ Notification notification = new Notification(application.Name, notificationType.Name, String.Empty, title,
+ text)
+ {
+ Icon = imageUrl
+ };
+
+ growl.Notify(notification);
+ }
+
+ /// <summary>
+ /// Initializes the GrowlCommunicator
+ /// </summary>
+ private static void Initialize()
+ {
+ if (growl == null)
+ {
+ growl = new GrowlConnector
+ {
+ EncryptionAlgorithm = Cryptography.SymmetricAlgorithmType.PlainText
+ };
+
+ application = new Application("Handbrake")
+ {
+ Icon = Properties.Resources.logo64
+ };
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Functions/PlistHelper.cs b/win/CS/HandBrake.ApplicationServices/Functions/PlistHelper.cs
new file mode 100644
index 000000000..fab40a27c
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Functions/PlistHelper.cs
@@ -0,0 +1,127 @@
+/* PlistHelper.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+
+namespace HandBrake.ApplicationServices.Functions
+{
+ using System;
+ using System.Collections.Generic;
+ using System.IO;
+ using System.Xml;
+
+ /// <summary>
+ /// A Plist Helper
+ /// </summary>
+ public class PlistHelper
+ {
+ /// <summary>
+ /// Get the Audio Track XML Nodes from a plist preset file
+ /// </summary>
+ /// <param name="filename">
+ /// A Plist preset file
+ /// </param>
+ /// <returns>
+ /// A List of XmlNodes which contain audio tracks
+ /// </returns>
+ public static List<XmlNode> GetAudioTracks(string filename)
+ {
+ // Data Store
+ List<XmlNode> audioTracks = new List<XmlNode>();
+
+ // Load the file and get the Root note, or return if none found
+ XmlNode root = LoadFile(filename);
+ if (root == null)
+ {
+ return null;
+ }
+
+ // Get the Audio Tracks
+ XmlNode audioListDict = root.ChildNodes[2].ChildNodes[0].FirstChild.ChildNodes[1];
+ for (int i = 0; i < audioListDict.ChildNodes.Count; i++)
+ {
+ XmlNode audioChannel = audioListDict.ChildNodes[i]; // <dict>
+ audioTracks.Add(audioChannel);
+ }
+
+ return audioTracks;
+ }
+
+ /// <summary>
+ /// Get the settings portion of a presets file
+ /// </summary>
+ /// <param name="filename">
+ /// A Plist preset file
+ /// </param>
+ /// <returns>
+ /// A Dictionary of plist key against an XML node containing the setting.
+ /// </returns>
+ public static Dictionary<string, XmlNode> GetPresetSettings(string filename)
+ {
+ // Data Store
+ Dictionary<string, XmlNode> settings = new Dictionary<string, XmlNode>();
+
+ // Load the file and get the Root note, or return if none found
+ XmlNode root = LoadFile(filename);
+ if (root == null)
+ {
+ return null;
+ }
+
+ // Get the Preset Settings, starting from the 3rd node (skipping the audio notes we've just prcessed)
+ XmlNode presetSettings = root.ChildNodes[2].ChildNodes[0].FirstChild;
+ for (int i = 2; i < presetSettings.ChildNodes.Count; i += 2)
+ {
+ string key = presetSettings.ChildNodes[i].InnerText;
+ XmlNode node = presetSettings.ChildNodes[i + 1];
+ settings.Add(key, node);
+ }
+
+ return settings;
+ }
+
+ /// <summary>
+ /// Load a Plist Preset file and return it as an XML document
+ /// </summary>
+ /// <param name="filename">
+ /// A Plist preset file
+ /// </param>
+ /// <returns>
+ /// An XML document
+ /// </returns>
+ private static XmlNode LoadFile(string filename)
+ {
+ try
+ {
+ if (!File.Exists(filename))
+ {
+ return null;
+ }
+
+ StreamReader sr = File.OpenText(filename);
+ string fromfile = string.Empty;
+ int fileChar;
+ while ((fileChar = sr.Read()) != -1)
+ {
+ fromfile += Convert.ToChar(fileChar);
+ }
+
+ XmlDocument doc = new XmlDocument();
+ doc.LoadXml(fromfile);
+
+ XmlNode root = doc;
+ if (!root.HasChildNodes)
+ {
+ return null;
+ }
+
+ return root;
+ }
+ catch (Exception)
+ {
+ return null;
+ }
+ }
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Functions/System.cs b/win/CS/HandBrake.ApplicationServices/Functions/System.cs
new file mode 100644
index 000000000..9b08a4be2
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Functions/System.cs
@@ -0,0 +1,56 @@
+/* System.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Functions
+{
+ using System.Windows.Forms;
+
+ using Microsoft.Win32;
+
+ /// <summary>
+ /// The System Information.
+ /// </summary>
+ public class SystemInfo
+ {
+ /// <summary>
+ /// Gets the total physical ram in a system
+ /// </summary>
+ /// <returns>The total memory in the system</returns>
+ public static ulong TotalPhysicalMemory
+ {
+ get
+ {
+ Win32.MEMORYSTATUSEX memStat = new Win32.MEMORYSTATUSEX { dwLength = 64 };
+ Win32.GlobalMemoryStatusEx(ref memStat);
+
+ ulong value = memStat.ullTotalPhys / 1024 / 1024;
+ return value;
+ }
+ }
+
+ /// <summary>
+ /// Gets the number of CPU Cores
+ /// </summary>
+ /// <returns>Object</returns>
+ public static object GetCpuCount
+ {
+ get
+ {
+ RegistryKey regKey = Registry.LocalMachine;
+ regKey = regKey.OpenSubKey("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0");
+ return regKey == null ? 0 : regKey.GetValue("ProcessorNameString");
+ }
+ }
+
+ /// <summary>
+ /// Gets the System screen size information.
+ /// </summary>
+ /// <returns>System.Windows.Forms.Scree</returns>
+ public static Screen ScreenBounds
+ {
+ get { return Screen.PrimaryScreen; }
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Functions/Win32.cs b/win/CS/HandBrake.ApplicationServices/Functions/Win32.cs
new file mode 100644
index 000000000..8cb464b80
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Functions/Win32.cs
@@ -0,0 +1,144 @@
+/* win32.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Functions
+{
+ using System;
+ using System.Runtime.InteropServices;
+
+ /// <summary>
+ /// Win32 API calls
+ /// </summary>
+ public class Win32
+ {
+ /// <summary>
+ /// Set the Forground Window
+ /// </summary>
+ /// <param name="hWnd">
+ /// The h wnd.
+ /// </param>
+ /// <returns>
+ /// A Boolean true when complete.
+ /// </returns>
+ [DllImport("user32.dll")]
+ public static extern bool SetForegroundWindow(int hWnd);
+
+ /// <summary>
+ /// Lock the workstation
+ /// </summary>
+ [DllImport("user32.dll")]
+ public static extern void LockWorkStation();
+
+ /// <summary>
+ /// Exit Windows
+ /// </summary>
+ /// <param name="uFlags">
+ /// The u flags.
+ /// </param>
+ /// <param name="dwReason">
+ /// The dw reason.
+ /// </param>
+ /// <returns>
+ /// an integer
+ /// </returns>
+ [DllImport("user32.dll")]
+ public static extern int ExitWindowsEx(int uFlags, int dwReason);
+
+ /// <summary>
+ /// Memory Status EX Struct
+ /// </summary>
+ public struct MEMORYSTATUSEX
+ {
+ public int dwLength;
+ public int dwMemoryLoad;
+ public ulong ullTotalPhys;
+ public ulong ullAvailPhys;
+ public ulong ullTotalPageFile;
+ public ulong ullAvailPageFile;
+ public ulong ullTotalVirtual;
+ public ulong ullAvailVirtual;
+ public ulong ullAvailExtendedVirtual;
+ }
+
+ /// <summary>
+ /// Get the System Memory information
+ /// </summary>
+ /// <param name="lpBuffer">
+ /// The lp buffer.
+ /// </param>
+ /// <returns>
+ /// A boolean.
+ /// </returns>
+ [DllImport("kernel32.dll", SetLastError = true)]
+ public static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer);
+
+
+ /// <summary>
+ /// Generate a Console Ctrl Event
+ /// </summary>
+ /// <param name="sigevent">
+ /// The sigevent.
+ /// </param>
+ /// <param name="dwProcessGroupId">
+ /// The dw process group id.
+ /// </param>
+ /// <returns>
+ /// Bool true is sucess
+ /// </returns>
+ [DllImport("kernel32.dll", SetLastError = true)]
+ public static extern bool GenerateConsoleCtrlEvent(ConsoleCtrlEvent sigevent, int dwProcessGroupId);
+
+ /// <summary>
+ /// Console Ctrl Event
+ /// </summary>
+ public enum ConsoleCtrlEvent
+ {
+ /// <summary>
+ /// Ctrl - C
+ /// </summary>
+ CTRL_C = 0,
+
+ /// <summary>
+ /// Ctrl - Break
+ /// </summary>
+ CTRL_BREAK = 1,
+
+ /// <summary>
+ /// Ctrl - Close
+ /// </summary>
+ CTRL_CLOSE = 2,
+ }
+
+ [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
+ static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
+
+ /// <summary>
+ /// Execution State
+ /// </summary>
+ [FlagsAttribute]
+ public enum EXECUTION_STATE : uint
+ {
+ ES_SYSTEM_REQUIRED = 0x00000001,
+ ES_CONTINUOUS = 0x80000000,
+ ES_AWAYMODE_REQUIRED = 0x00000040
+ }
+
+ /// <summary>
+ /// Prevent the system from sleeping
+ /// </summary>
+ public static void PreventSleep()
+ {
+ SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_AWAYMODE_REQUIRED);
+ }
+
+ /// <summary>
+ /// Allow the system to sleep.
+ /// </summary>
+ public static void AllowSleep()
+ {
+ SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);
+ }
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Functions/Win7.cs b/win/CS/HandBrake.ApplicationServices/Functions/Win7.cs
new file mode 100644
index 000000000..8d694d2f8
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Functions/Win7.cs
@@ -0,0 +1,73 @@
+/* Win7.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Functions
+{
+ using System;
+ using Microsoft.WindowsAPICodePack.Taskbar;
+
+ /// <summary>
+ /// A class implimenting Windows 7 Specific features
+ /// </summary>
+ public class Win7
+ {
+ /// <summary>
+ /// The Windows Taskbar
+ /// </summary>
+ private TaskbarManager windowsTaskbar;
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Win7"/> class.
+ /// </summary>
+ public Win7()
+ {
+ if (IsWindowsSeven)
+ {
+ windowsTaskbar = TaskbarManager.Instance;
+ }
+ }
+
+ /// <summary>
+ /// Gets a value indicating whether this is Windows Seven.
+ /// </summary>
+ public bool IsWindowsSeven
+ {
+ get
+ {
+ OperatingSystem os = Environment.OSVersion;
+ return os.Version.Major >= 6 && os.Version.Minor >= 1;
+ }
+ }
+
+ /// <summary>
+ /// Set the Task Bar Percentage.
+ /// </summary>
+ /// <param name="percentage">
+ /// The percentage.
+ /// </param>
+ public void SetTaskBarProgress(int percentage)
+ {
+ if (!IsWindowsSeven)
+ {
+ return;
+ }
+ windowsTaskbar.SetProgressState(TaskbarProgressBarState.Normal);
+ windowsTaskbar.SetProgressValue(percentage, 100);
+ }
+
+ /// <summary>
+ /// Disable Task Bar Progress
+ /// </summary>
+ public void SetTaskBarProgressToNoProgress()
+ {
+ if (!IsWindowsSeven)
+ {
+ return;
+ }
+
+ windowsTaskbar.SetProgressState(TaskbarProgressBarState.NoProgress);
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj b/win/CS/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj
new file mode 100644
index 000000000..07aef5609
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>9.0.21022</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{087A2BA8-BAC2-4577-A46F-07FF9D420016}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>HandBrake.ApplicationServices</RootNamespace>
+ <AssemblyName>HandBrake.ApplicationServices</AssemblyName>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <FileUpgradeFlags>
+ </FileUpgradeFlags>
+ <OldToolsVersion>3.5</OldToolsVersion>
+ <UpgradeBackupLocation />
+ <TargetFrameworkProfile>Client</TargetFrameworkProfile>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <PlatformTarget>AnyCPU</PlatformTarget>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'NightlyBuild|AnyCPU' ">
+ <OutputPath>bin\NightlyBuild\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <Optimize>true</Optimize>
+ <DebugType>pdbonly</DebugType>
+ <PlatformTarget>AnyCPU</PlatformTarget>
+ <ErrorReport>prompt</ErrorReport>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="Growl.Connector, Version=2.0.0.0, Culture=neutral, PublicKeyToken=980c2339411be384, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\libraries\Growl.Connector.dll</HintPath>
+ </Reference>
+ <Reference Include="Growl.CoreLibrary, Version=2.0.0.0, Culture=neutral, PublicKeyToken=13e59d82e007b064, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\libraries\Growl.CoreLibrary.dll</HintPath>
+ </Reference>
+ <Reference Include="HandBrakeInterop">
+ <HintPath>..\libraries\HandBrakeInterop.dll</HintPath>
+ </Reference>
+ <Reference Include="Microsoft.WindowsAPICodePack, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\libraries\Microsoft.WindowsAPICodePack.dll</HintPath>
+ </Reference>
+ <Reference Include="Microsoft.WindowsAPICodePack.Shell, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\libraries\Microsoft.WindowsAPICodePack.Shell.dll</HintPath>
+ </Reference>
+ <Reference Include="PresentationCore" />
+ <Reference Include="PresentationFramework" />
+ <Reference Include="System" />
+ <Reference Include="System.Core">
+ <RequiredTargetFramework>3.5</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="System.Drawing" />
+ <Reference Include="System.Windows.Forms" />
+ <Reference Include="System.Xml.Linq">
+ <RequiredTargetFramework>3.5</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="System.Data.DataSetExtensions">
+ <RequiredTargetFramework>3.5</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="System.Data" />
+ <Reference Include="System.Xml" />
+ <Reference Include="WindowsBase" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="EventArgs\EncodeCompletedEventArgs.cs" />
+ <Compile Include="EventArgs\EncodeProgressEventArgs.cs" />
+ <Compile Include="EventArgs\QueueProgressEventArgs.cs" />
+ <Compile Include="EventArgs\ScanCompletedEventArgs.cs" />
+ <Compile Include="EventArgs\ScanProgressEventArgs.cs" />
+ <Compile Include="Functions\Converters.cs" />
+ <Compile Include="Functions\EnumHelper.cs" />
+ <Compile Include="Functions\GrowlCommunicator.cs" />
+ <Compile Include="Functions\PlistHelper.cs" />
+ <Compile Include="Functions\System.cs" />
+ <Compile Include="Functions\Win32.cs" />
+ <Compile Include="Functions\Win7.cs" />
+ <Compile Include="Init.cs" />
+ <Compile Include="Model\DriveInformation.cs" />
+ <Compile Include="Model\Encoding\AudioTrack.cs" />
+ <Compile Include="Model\Encoding\Anamorphic.cs" />
+ <Compile Include="Model\Encoding\AudioEncoder.cs" />
+ <Compile Include="Model\Encoding\FramerateMode.cs" />
+ <Compile Include="Model\Encoding\Mixdown.cs" />
+ <Compile Include="Model\Encoding\PointToPointMode.cs" />
+ <Compile Include="Model\Encoding\Cropping.cs" />
+ <Compile Include="Model\EncodeTask.cs" />
+ <Compile Include="Model\Encoding\Decomb.cs" />
+ <Compile Include="Model\Encoding\Deinterlace.cs" />
+ <Compile Include="Model\Encoding\Denoise.cs" />
+ <Compile Include="Model\Encoding\Detelecine.cs" />
+ <Compile Include="Model\Encoding\OutputFormat.cs" />
+ <Compile Include="Model\Encoding\SubtitleTrack.cs" />
+ <Compile Include="Model\Encoding\VideoEncoder.cs" />
+ <Compile Include="Model\Encoding\VideoEncodeRateMode.cs" />
+ <Compile Include="Model\General\UpdateCheckInformation.cs" />
+ <Compile Include="Model\General\UpdateCheckResult.cs" />
+ <Compile Include="Model\Preset.cs" />
+ <Compile Include="Model\QueueTask.cs" />
+ <Compile Include="Model\Encoding\SubtitleType.cs" />
+ <Compile Include="Parsing\AudioTrack.cs" />
+ <Compile Include="Parsing\Chapter.cs" />
+ <Compile Include="Parsing\Source.cs" />
+ <Compile Include="Parsing\Parser.cs" />
+ <Compile Include="Parsing\Subtitle.cs" />
+ <Compile Include="Parsing\Title.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="Properties\Resources.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DesignTime>True</DesignTime>
+ <DependentUpon>Resources.resx</DependentUpon>
+ </Compile>
+ <Compile Include="Services\Encode.cs" />
+ <Compile Include="Services\Interfaces\IEncode.cs" />
+ <Compile Include="Services\Interfaces\IQueueManager.cs" />
+ <Compile Include="Services\Interfaces\IQueueProcessor.cs" />
+ <Compile Include="Services\Interfaces\IScan.cs" />
+ <Compile Include="Services\Interfaces\IPresetService.cs" />
+ <Compile Include="Services\LibScan.cs" />
+ <Compile Include="Services\PresetService.cs" />
+ <Compile Include="Services\QueueManager.cs" />
+ <Compile Include="Services\QueueProcessor.cs" />
+ <Compile Include="Services\ScanService.cs" />
+ <Compile Include="Services\UpdateService.cs" />
+ <Compile Include="Utilities\AppcastReader.cs" />
+ <Compile Include="Utilities\PlistUtility.cs" />
+ <Compile Include="Utilities\QueryParserUtility.cs" />
+ <Compile Include="Utilities\UtilityService.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="Properties\AssemblyInfo.cs.tmpl" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Properties\Resources.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+ </EmbeddedResource>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="Resources\logo64.png" />
+ </ItemGroup>
+ <ItemGroup />
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <Import Project="$(ProgramFiles)\MSBuild\Microsoft\StyleCop\v4.4\Microsoft.StyleCop.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+ <PropertyGroup>
+ <PreBuildEvent>
+ subwcrev.exe "$(ProjectDir)." "$(ProjectDir)Properties\AssemblyInfo.cs.tmpl" "$(ProjectDir)Properties\AssemblyInfo.cs"
+ subwcrev.exe "$(ProjectDir)." "$(ProjectDir)Properties\AssemblyInfo.cs.tmpl" "$(ProjectDir)Properties\AssemblyInfo.cs"
+ </PreBuildEvent>
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Init.cs b/win/CS/HandBrake.ApplicationServices/Init.cs
new file mode 100644
index 000000000..e51683ab8
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Init.cs
@@ -0,0 +1,160 @@
+/* Init.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices
+{
+ using System;
+ using System.Reflection;
+
+ /// <summary>
+ /// Initialize ApplicationServices
+ /// </summary>
+ public class Init
+ {
+ /**
+ * I really dislike this, Need to replace this sooner rather than later.
+ **/
+
+ /// <summary>
+ /// Setup the Settings used by the applicaiton with this library
+ /// </summary>
+ /// <param name="versionString">
+ /// The version / name of the application that's using this DLL.
+ /// </param>
+ /// <param name="instanceId">
+ /// The Instance ID
+ /// </param>
+ /// <param name="completionOption">
+ /// The completion option.
+ /// </param>
+ /// <param name="disableDvdNav">
+ /// The disable dvd nav.
+ /// </param>
+ /// <param name="growlEncode">
+ /// The growl encode.
+ /// </param>
+ /// <param name="growlQueue">
+ /// The growl queue.
+ /// </param>
+ /// <param name="processPriority">
+ /// The process priority.
+ /// </param>
+ /// <param name="saveLogPath">
+ /// The save log path.
+ /// </param>
+ /// <param name="saveLogToSpecifiedPath">
+ /// The save log to specified path.
+ /// </param>
+ /// <param name="saveLogWithVideo">
+ /// The save log with video.
+ /// </param>
+ /// <param name="showCliForInGuiEncodeStatus">
+ /// The show cli for in gui encode status.
+ /// </param>
+ /// <param name="preventSleep">
+ /// Prevent the system from sleeping
+ /// </param>
+ public static void SetupSettings(string versionString, string version, int build, int instanceId, string completionOption, bool disableDvdNav,
+ bool growlEncode, bool growlQueue, string processPriority, string saveLogPath, bool saveLogToSpecifiedPath,
+ bool saveLogWithVideo, bool showCliForInGuiEncodeStatus, bool preventSleep)
+ {
+ InstanceId = instanceId;
+ HandBrakeGuiVersionString = versionString;
+ Version = version;
+ Build = build;
+ CompletionOption = completionOption;
+ DisableDvdNav = disableDvdNav;
+ GrowlEncode = growlEncode;
+ GrowlQueue = growlQueue;
+ ProcessPriority = processPriority;
+ SaveLogPath = saveLogPath;
+ SaveLogToSpecifiedPath = saveLogToSpecifiedPath;
+ SaveLogWithVideo = saveLogWithVideo;
+ ShowCliForInGuiEncodeStatus = showCliForInGuiEncodeStatus;
+ PreventSleep = preventSleep;
+ }
+
+ /// <summary>
+ /// Gets the Assembly version.
+ /// </summary>
+ /// <returns>
+ /// Version data
+ /// </returns>
+ public static Version AssemblyVersion()
+ {
+ return Assembly.GetExecutingAssembly().GetName().Version;
+ }
+
+ /// <summary>
+ /// The instance ID used by the Main Applicaiton
+ /// </summary>
+ public static int InstanceId;
+
+ /// <summary>
+ /// The Applicaiton that uses this DLL can pass in it's version string.
+ /// </summary>
+ public static string HandBrakeGuiVersionString;
+
+ /// <summary>
+ /// HandBrakes Version or Svn revision
+ /// </summary>
+ public static string Version;
+
+ /// <summary>
+ /// Handbrakes Build number
+ /// </summary>
+ public static int Build;
+
+ /// <summary>
+ /// What to do when the encode completes.
+ /// </summary>
+ public static string CompletionOption;
+
+ /// <summary>
+ /// Disable LibDvdNav
+ /// </summary>
+ public static bool DisableDvdNav;
+
+ /// <summary>
+ /// Growl when an encode has finished.
+ /// </summary>
+ public static bool GrowlEncode;
+
+ /// <summary>
+ /// Growl when a queue has finished.
+ /// </summary>
+ public static bool GrowlQueue;
+
+ /// <summary>
+ /// The Process Priority for HandBrakeCLI
+ /// </summary>
+ public static string ProcessPriority;
+
+ /// <summary>
+ /// Path to save log files to.
+ /// </summary>
+ public static string SaveLogPath;
+
+ /// <summary>
+ /// Copy log files to the SaveLogPath
+ /// </summary>
+ public static bool SaveLogToSpecifiedPath;
+
+ /// <summary>
+ /// Save a copy of the log files with the video
+ /// </summary>
+ public static bool SaveLogWithVideo;
+
+ /// <summary>
+ /// Show the CLI window when encoding.
+ /// </summary>
+ public static bool ShowCliForInGuiEncodeStatus;
+
+ /// <summary>
+ /// Prevent system sleep
+ /// </summary>
+ public static bool PreventSleep;
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Model/DriveInformation.cs b/win/CS/HandBrake.ApplicationServices/Model/DriveInformation.cs
new file mode 100644
index 000000000..65708cee2
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/DriveInformation.cs
@@ -0,0 +1,44 @@
+/* DriveInformation.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model
+{
+ /// <summary>
+ /// Information about a DVD drive
+ /// </summary>
+ public class DriveInformation
+ {
+ /// <summary>
+ /// Gets or sets A Unique ID That represemts this model.
+ /// </summary>
+ public int Id { get; set; }
+
+ /// <summary>
+ /// Gets or sets The Drive Volume Name
+ /// </summary>
+ public string VolumeLabel { get; set; }
+
+ /// <summary>
+ /// Gets or sets The Root Directory
+ /// </summary>
+ public string RootDirectory { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether this is a BluRay Drive.
+ /// </summary>
+ public bool IsBluRay { get; set; }
+
+ /// <summary>
+ /// Returns "Drive" + Id (e.g Drive2)
+ /// </summary>
+ /// <returns>
+ /// A String that contrains "Drive" and it's ID
+ /// </returns>
+ public override string ToString()
+ {
+ return "Drive" + this.Id;
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Model/EncodeTask.cs b/win/CS/HandBrake.ApplicationServices/Model/EncodeTask.cs
new file mode 100644
index 000000000..d600ba81c
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/EncodeTask.cs
@@ -0,0 +1,326 @@
+/* EncodeTask.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model
+{
+ using System.Collections.Generic;
+
+ using HandBrake.ApplicationServices.Model.Encoding;
+
+ /// <summary>
+ /// An Encode Task
+ /// </summary>
+ public class EncodeTask
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="EncodeTask"/> class.
+ /// </summary>
+ public EncodeTask()
+ {
+ this.Cropping = new Cropping();
+ }
+
+ #region Source
+ /// <summary>
+ /// Gets or sets Source.
+ /// </summary>
+ public string Source { get; set; }
+
+ /// <summary>
+ /// Gets or sets Title.
+ /// </summary>
+ public int Title { get; set; }
+
+ /// <summary>
+ /// Gets or sets the Angle
+ /// </summary>
+ public int Angle { get; set; }
+
+ /// <summary>
+ /// Gets or sets PointToPointMode.
+ /// </summary>
+ public PointToPointMode PointToPointMode { get; set; }
+
+ /// <summary>
+ /// Gets or sets StartPoint.
+ /// </summary>
+ public int StartPoint { get; set; }
+
+ /// <summary>
+ /// Gets or sets EndPoint.
+ /// </summary>
+ public int EndPoint { get; set; }
+ #endregion
+
+ #region Destination
+
+ /// <summary>
+ /// Gets or sets Destination.
+ /// </summary>
+ public string Destination { get; set; }
+
+ #endregion
+
+ #region Output Settings
+ /// <summary>
+ /// Gets or sets OutputFormat.
+ /// </summary>
+ public OutputFormat OutputFormat { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether LargeFile.
+ /// </summary>
+ public bool LargeFile { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether Optimize.
+ /// </summary>
+ public bool OptimizeMP4 { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether IPod5GSupport.
+ /// </summary>
+ public bool IPod5GSupport { get; set; }
+ #endregion
+
+ #region Picture
+
+ /// <summary>
+ /// Gets or sets Width.
+ /// </summary>
+ public int Width { get; set; }
+
+ /// <summary>
+ /// Gets or sets Height.
+ /// </summary>
+ public int Height { get; set; }
+
+ /// <summary>
+ /// Gets or sets MaxWidth.
+ /// </summary>
+ public int MaxWidth { get; set; }
+
+ /// <summary>
+ /// Gets or sets MaxHeight.
+ /// </summary>
+ public int MaxHeight { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether CustomCropping.
+ /// </summary>
+ public bool IsCustomCropping { get; set; }
+
+ /// <summary>
+ /// Gets or sets Cropping.
+ /// </summary>
+ public Cropping Cropping { get; set; }
+
+ /// <summary>
+ /// Gets or sets Anamorphic.
+ /// </summary>
+ public Anamorphic Anamorphic { get; set; }
+
+ /// <summary>
+ /// Gets or sets DisplayWidth.
+ /// </summary>
+ public double DisplayWidth { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether KeepDisplayAspect.
+ /// </summary>
+ public bool KeepDisplayAspect { get; set; }
+
+ /// <summary>
+ /// Gets or sets PixelAspectX.
+ /// </summary>
+ public int PixelAspectX { get; set; }
+
+ /// <summary>
+ /// Gets or sets PixelAspectY.
+ /// </summary>
+ public int PixelAspectY { get; set; }
+
+ /// <summary>
+ /// Gets or sets Modulus.
+ /// </summary>
+ public int Modulus { get; set; }
+ #endregion
+
+ #region Filters
+
+ /// <summary>
+ /// Gets or sets Deinterlace.
+ /// </summary>
+ public Deinterlace Deinterlace { get; set; }
+
+ /// <summary>
+ /// Gets or sets CustomDeinterlace.
+ /// </summary>
+ public string CustomDeinterlace { get; set; }
+
+ /// <summary>
+ /// Gets or sets Decomb.
+ /// </summary>
+ public Decomb Decomb { get; set; }
+
+ /// <summary>
+ /// Gets or sets CustomDecomb.
+ /// </summary>
+ public string CustomDecomb { get; set; }
+
+ /// <summary>
+ /// Gets or sets Detelecine.
+ /// </summary>
+ public Detelecine Detelecine { get; set; }
+
+ /// <summary>
+ /// Gets or sets CustomDetelecine.
+ /// </summary>
+ public string CustomDetelecine { get; set; }
+
+ /// <summary>
+ /// Gets or sets Denoise.
+ /// </summary>
+ public Denoise Denoise { get; set; }
+
+ /// <summary>
+ /// Gets or sets CustomDenoise.
+ /// </summary>
+ public string CustomDenoise { get; set; }
+
+ /// <summary>
+ /// Gets or sets Deblock.
+ /// </summary>
+ public int Deblock { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether Grayscale.
+ /// </summary>
+ public bool Grayscale { get; set; }
+ #endregion
+
+ #region Video
+
+ /// <summary>
+ /// Gets or sets VideoEncodeRateType.
+ /// </summary>
+ public VideoEncodeRateMode VideoEncodeRateType { get; set; }
+
+ /// <summary>
+ /// Gets or sets the VideoEncoder
+ /// </summary>
+ public VideoEncoder VideoEncoder { get; set; }
+
+ /// <summary>
+ /// Gets or sets the Video Encode Mode
+ /// </summary>
+ public FramerateMode FramerateMode { get; set; }
+
+ /// <summary>
+ /// Gets or sets Quality.
+ /// </summary>
+ public double? Quality { get; set; }
+
+ /// <summary>
+ /// Gets or sets VideoBitrate.
+ /// </summary>
+ public int? VideoBitrate { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether TwoPass.
+ /// </summary>
+ public bool TwoPass { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether TurboFirstPass.
+ /// </summary>
+ public bool TurboFirstPass { get; set; }
+
+ /// <summary>
+ /// Gets or sets Framerate.
+ /// Null = Same as Source
+ /// </summary>
+ public double? Framerate { get; set; }
+
+ #endregion
+
+ #region Audio
+
+ /// <summary>
+ /// Gets or sets AudioEncodings.
+ /// </summary>
+ public List<AudioTrack> AudioTracks { get; set; }
+ #endregion
+
+ #region Subtitles
+
+ /// <summary>
+ /// Gets or sets SubtitleTracks.
+ /// </summary>
+ public List<SubtitleTrack> SubtitleTracks { get; set; }
+ #endregion
+
+ #region Chapters
+
+ /// <summary>
+ /// Gets or sets a value indicating whether IncludeChapterMarkers.
+ /// </summary>
+ public bool IncludeChapterMarkers { get; set; }
+
+ /// <summary>
+ /// Gets or sets ChapterMarkersFilePath.
+ /// </summary>
+ public string ChapterMarkersFilePath { get; set; }
+
+ #endregion
+
+ #region Advanced
+
+ /// <summary>
+ /// Gets or sets AdvancedEncoderOptions.
+ /// </summary>
+ public string AdvancedEncoderOptions { get; set; }
+
+ #endregion
+
+ #region Preset Information (TODO This should probably be dropped)
+
+ /// <summary>
+ /// Gets or sets PresetBuildNumber.
+ /// </summary>
+ public int PresetBuildNumber { get; set; }
+
+ /// <summary>
+ /// Gets or sets PresetDescription.
+ /// </summary>
+ public string PresetDescription { get; set; }
+
+ /// <summary>
+ /// Gets or sets PresetName.
+ /// </summary>
+ public string PresetName { get; set; }
+
+ /// <summary>
+ /// Gets or sets Type.
+ /// </summary>
+ public string Type { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether UsesMaxPictureSettings.
+ /// </summary>
+ public bool UsesMaxPictureSettings { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether UsesPictureFilters.
+ /// </summary>
+ public bool UsesPictureFilters { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether UsesPictureSettings.
+ /// </summary>
+ public bool UsesPictureSettings { get; set; }
+ #endregion
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Encoding/Anamorphic.cs b/win/CS/HandBrake.ApplicationServices/Model/Encoding/Anamorphic.cs
new file mode 100644
index 000000000..c958b777c
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/Encoding/Anamorphic.cs
@@ -0,0 +1,24 @@
+/* Anamorphic.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model.Encoding
+{
+ using System.ComponentModel;
+
+ /// <summary>
+ /// Anamorphic Mode
+ /// </summary>
+ public enum Anamorphic
+ {
+ [Description("None")]
+ None = 0,
+ [Description("Strict")]
+ Strict,
+ [Description("Loose")]
+ Loose,
+ [Description("Custom")]
+ Custom
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Encoding/AudioEncoder.cs b/win/CS/HandBrake.ApplicationServices/Model/Encoding/AudioEncoder.cs
new file mode 100644
index 000000000..c6f838ed7
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/Encoding/AudioEncoder.cs
@@ -0,0 +1,33 @@
+/* AudioEncoder.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model.Encoding
+{
+ using System.ComponentModel;
+
+ public enum AudioEncoder
+ {
+ [Description("AAC (faac)")]
+ Faac = 0,
+
+ [Description("MP3 (lame)")]
+ Lame,
+
+ [Description("AC3 (ffmpeg)")]
+ Ac3,
+
+ [Description("Passthrough (AC3/DTS)")]
+ Passthrough,
+
+ [Description("Passthrough (AC3)")]
+ Ac3Passthrough,
+
+ [Description("Passthrough (DTS)")]
+ DtsPassthrough,
+
+ [Description("Vorbis (vorbis)")]
+ Vorbis
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Encoding/AudioTrack.cs b/win/CS/HandBrake.ApplicationServices/Model/Encoding/AudioTrack.cs
new file mode 100644
index 000000000..bcfb27089
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/Encoding/AudioTrack.cs
@@ -0,0 +1,56 @@
+/* AudioTrack.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model.Encoding
+{
+ /// <summary>
+ /// An Audio Track for the Audio Panel
+ /// </summary>
+ public class AudioTrack
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="AudioTrack"/> class.
+ /// </summary>
+ public AudioTrack()
+ {
+ // Default Values
+ this.Track = "Automatic";
+ this.MixDown = "Automatic";
+ this.SampleRate = "Auto";
+ this.Bitrate = "Auto";
+ this.DRC = "1";
+ }
+
+ /// <summary>
+ /// Gets or sets Audio Track Name
+ /// </summary>
+ public string Track { get; set; }
+
+ /// <summary>
+ /// Gets or sets Audio Mixdown
+ /// </summary>
+ public string MixDown { get; set; }
+
+ /// <summary>
+ /// Gets or sets Audio Encoder
+ /// </summary>
+ public string Encoder { get; set; }
+
+ /// <summary>
+ /// Gets or sets Audio Bitrate
+ /// </summary>
+ public string Bitrate { get; set; }
+
+ /// <summary>
+ /// Gets or sets Audio SampleRate
+ /// </summary>
+ public string SampleRate { get; set; }
+
+ /// <summary>
+ /// Gets or sets Dynamic Range Compression
+ /// </summary>
+ public string DRC { get; set; }
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Encoding/Cropping.cs b/win/CS/HandBrake.ApplicationServices/Model/Encoding/Cropping.cs
new file mode 100644
index 000000000..2ec98aaca
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/Encoding/Cropping.cs
@@ -0,0 +1,63 @@
+/* Cropping.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model.Encoding
+{
+ /// <summary>
+ /// Cropping T B L R
+ /// </summary>
+ public class Cropping
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Cropping"/> class.
+ /// </summary>
+ public Cropping()
+ {
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Cropping"/> class.
+ /// </summary>
+ /// <param name="top">
+ /// The Top Value
+ /// </param>
+ /// <param name="bottom">
+ /// The Bottom Value
+ /// </param>
+ /// <param name="left">
+ /// The Left Value
+ /// </param>
+ /// <param name="right">
+ /// The Right Value
+ /// </param>
+ public Cropping(int top, int bottom, int left, int right)
+ {
+ this.Top = top;
+ this.Bottom = bottom;
+ this.Left = left;
+ this.Right = right;
+ }
+
+ /// <summary>
+ /// Gets or sets Top.
+ /// </summary>
+ public int Top { get; set; }
+
+ /// <summary>
+ /// Gets or sets Bottom.
+ /// </summary>
+ public int Bottom { get; set; }
+
+ /// <summary>
+ /// Gets or sets Left.
+ /// </summary>
+ public int Left { get; set; }
+
+ /// <summary>
+ /// Gets or sets Right.
+ /// </summary>
+ public int Right { get; set; }
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Encoding/Decomb.cs b/win/CS/HandBrake.ApplicationServices/Model/Encoding/Decomb.cs
new file mode 100644
index 000000000..ae8b8a3d4
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/Encoding/Decomb.cs
@@ -0,0 +1,17 @@
+/* Decomb.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model.Encoding
+{
+ /// <summary>
+ /// Decomb Mode
+ /// </summary>
+ public enum Decomb
+ {
+ Off = 0,
+ Default,
+ Custom
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Encoding/Deinterlace.cs b/win/CS/HandBrake.ApplicationServices/Model/Encoding/Deinterlace.cs
new file mode 100644
index 000000000..38dadd04e
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/Encoding/Deinterlace.cs
@@ -0,0 +1,20 @@
+/* Deinterlace.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model.Encoding
+{
+ /// <summary>
+ /// The Deinterlace Filter
+ /// </summary>
+ public enum Deinterlace
+ {
+ Off = 0,
+ Fast,
+ Slow,
+ Slower,
+ Slowest,
+ Custom
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Encoding/Denoise.cs b/win/CS/HandBrake.ApplicationServices/Model/Encoding/Denoise.cs
new file mode 100644
index 000000000..fc81e9f20
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/Encoding/Denoise.cs
@@ -0,0 +1,19 @@
+/* Denoise.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model.Encoding
+{
+ /// <summary>
+ /// The Denose Filters
+ /// </summary>
+ public enum Denoise
+ {
+ Off = 0,
+ Weak,
+ Medium,
+ Strong,
+ Custom
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Encoding/Detelecine.cs b/win/CS/HandBrake.ApplicationServices/Model/Encoding/Detelecine.cs
new file mode 100644
index 000000000..09c948dbd
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/Encoding/Detelecine.cs
@@ -0,0 +1,17 @@
+/* Detelecine.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model.Encoding
+{
+ /// <summary>
+ /// Detelecine Filter
+ /// </summary>
+ public enum Detelecine
+ {
+ Off = 0,
+ Default,
+ Custom
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Encoding/FramerateMode.cs b/win/CS/HandBrake.ApplicationServices/Model/Encoding/FramerateMode.cs
new file mode 100644
index 000000000..508e63ced
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/Encoding/FramerateMode.cs
@@ -0,0 +1,17 @@
+/* VideoEncoderMode.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model.Encoding
+{
+ /// <summary>
+ /// The Mode of Video Encoding. CFR, VFR, PFR
+ /// </summary>
+ public enum FramerateMode
+ {
+ CFR = 0,
+ PFR,
+ VFR
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Encoding/Mixdown.cs b/win/CS/HandBrake.ApplicationServices/Model/Encoding/Mixdown.cs
new file mode 100644
index 000000000..12611b454
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/Encoding/Mixdown.cs
@@ -0,0 +1,33 @@
+/* Mixdown.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model.Encoding
+{
+ using System.ComponentModel;
+
+ /// <summary>
+ /// The Mixdown Mode
+ /// </summary>
+ public enum Mixdown
+ {
+ [Description("Dolby Pro Logic II")]
+ DolbyProLogicII = 0,
+
+ [Description("Auto")]
+ Auto,
+
+ [Description("Mono")]
+ Mono,
+
+ [Description("Stereo")]
+ Stereo,
+
+ [Description("Dolby Surround")]
+ DolbySurround,
+
+ [Description("6 Channel Discrete")]
+ SixChannelDiscrete
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Encoding/OutputFormat.cs b/win/CS/HandBrake.ApplicationServices/Model/Encoding/OutputFormat.cs
new file mode 100644
index 000000000..fa5c3225f
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/Encoding/OutputFormat.cs
@@ -0,0 +1,24 @@
+/* OutputFormat.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model.Encoding
+{
+ using System.ComponentModel;
+
+ /// <summary>
+ /// The Output format.
+ /// </summary>
+ public enum OutputFormat
+ {
+ [Description("MP4")]
+ Mp4,
+
+ [Description("M4V")]
+ M4V,
+
+ [Description("MKV")]
+ Mkv
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Encoding/PointToPointMode.cs b/win/CS/HandBrake.ApplicationServices/Model/Encoding/PointToPointMode.cs
new file mode 100644
index 000000000..dcee4cac4
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/Encoding/PointToPointMode.cs
@@ -0,0 +1,17 @@
+/* PointToPoint.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model.Encoding
+{
+ /// <summary>
+ /// Point to Point Mode
+ /// </summary>
+ public enum PointToPointMode
+ {
+ Chapters = 0,
+ Seconds,
+ Frames
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Encoding/SubtitleTrack.cs b/win/CS/HandBrake.ApplicationServices/Model/Encoding/SubtitleTrack.cs
new file mode 100644
index 000000000..f69abed7d
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/Encoding/SubtitleTrack.cs
@@ -0,0 +1,95 @@
+/* SubtitleTrack.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model.Encoding
+{
+ using System.Windows.Forms;
+
+ /// <summary>
+ /// Subtitle Information
+ /// </summary>
+ public class SubtitleTrack
+ {
+ /// <summary>
+ /// Gets or sets Track.
+ /// </summary>
+ public string Track { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether Forced.
+ /// </summary>
+ public bool Forced { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether Burned.
+ /// </summary>
+ public bool Burned { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether Default.
+ /// </summary>
+ public bool Default { get; set; }
+
+ #region SRT Specific Options
+
+ /// <summary>
+ /// Gets or sets the SRT Language
+ /// </summary>
+ public string SrtLang { get; set; }
+
+ /// <summary>
+ /// Gets or sets the SRT Character Code
+ /// </summary>
+ public string SrtCharCode { get; set; }
+
+ /// <summary>
+ /// Gets or sets the SRT Offset
+ /// </summary>
+ public int SrtOffset { get; set; }
+
+ /// <summary>
+ /// Gets or sets the Path to the SRT file
+ /// </summary>
+ public string SrtPath { get; set; }
+
+ /// <summary>
+ /// Gets or sets the SRT Filename
+ /// </summary>
+ public string SrtFileName { get; set; }
+
+ /// <summary>
+ /// Gets a value indicating whether this is an SRT subtitle.
+ /// </summary>
+ public bool IsSrtSubtitle
+ {
+ get { return this.SrtFileName != "-"; }
+ }
+
+ #endregion
+
+ /// <summary>
+ /// Gets or sets the type of the subtitle
+ /// </summary>
+ public SubtitleType SubtitleType { get; set; }
+
+ /// <summary>
+ /// Gets A ListViewItem Containing information about this subitlte
+ /// </summary>
+ public ListViewItem ListView
+ {
+ get
+ {
+ var listTrack = new ListViewItem(this.Track);
+ listTrack.SubItems.Add(this.Forced ? "Yes" : "No");
+ listTrack.SubItems.Add(this.Burned ? "Yes" : "No");
+ listTrack.SubItems.Add(this.Default ? "Yes" : "No");
+ listTrack.SubItems.Add(this.SrtLang);
+ listTrack.SubItems.Add(this.SrtCharCode);
+ listTrack.SubItems.Add(this.SrtOffset.ToString());
+ return listTrack;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Encoding/SubtitleType.cs b/win/CS/HandBrake.ApplicationServices/Model/Encoding/SubtitleType.cs
new file mode 100644
index 000000000..5a69d0105
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/Encoding/SubtitleType.cs
@@ -0,0 +1,30 @@
+/* SubtitleType.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model.Encoding
+{
+ using System.ComponentModel;
+
+ /// <summary>
+ /// Subtitle Type.
+ /// </summary>
+ public enum SubtitleType
+ {
+ [Description("SSA")]
+ SSA,
+ [Description("SRT")]
+ SRT,
+ [Description("VobSub")]
+ VobSub,
+ [Description("CC")]
+ CC,
+ [Description("UTF8")]
+ UTF8Sub,
+ [Description("TX3G")]
+ TX3G,
+ [Description("Unknown")]
+ Unknown
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Encoding/VideoEncodeRateMode.cs b/win/CS/HandBrake.ApplicationServices/Model/Encoding/VideoEncodeRateMode.cs
new file mode 100644
index 000000000..636d7829d
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/Encoding/VideoEncodeRateMode.cs
@@ -0,0 +1,17 @@
+/* VideoEncoderRateMode.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model.Encoding
+{
+ /// <summary>
+ /// The Mode of Video Encoding. Bitrate, Filesize or Quality
+ /// </summary>
+ public enum VideoEncodeRateMode
+ {
+ TargetSize = 0,
+ AverageBitrate,
+ ConstantQuality
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Encoding/VideoEncoder.cs b/win/CS/HandBrake.ApplicationServices/Model/Encoding/VideoEncoder.cs
new file mode 100644
index 000000000..b5a2556e3
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/Encoding/VideoEncoder.cs
@@ -0,0 +1,24 @@
+/* VideoEncoder.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model.Encoding
+{
+ using System.ComponentModel;
+
+ /// <summary>
+ /// The Video Encoder
+ /// </summary>
+ public enum VideoEncoder
+ {
+ [Description("H.264 (x264)")]
+ X264 = 0,
+
+ [Description("MPEG-4 (FFMpeg)")]
+ FFMpeg,
+
+ [Description("VP3 (Theora)")]
+ Theora
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Model/General/UpdateCheckInformation.cs b/win/CS/HandBrake.ApplicationServices/Model/General/UpdateCheckInformation.cs
new file mode 100644
index 000000000..5932aa402
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/General/UpdateCheckInformation.cs
@@ -0,0 +1,53 @@
+/* UpdateCheckInformation.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model.General
+{
+ using System;
+
+ /// <summary>
+ /// Provides information about an update check.
+ /// </summary>
+ public struct UpdateCheckInformation
+ {
+ /// <summary>
+ /// Gets or sets a value indicating whether a New Version is Available.
+ /// </summary>
+ public bool NewVersionAvailable { get; set; }
+
+ /// <summary>
+ /// Gets a value indicating whether an Error Occured.
+ /// </summary>
+ public bool ErrorOccured
+ {
+ get { return this.Error != null; }
+ }
+
+ /// <summary>
+ /// Gets or sets Information about an update to HandBrake
+ /// </summary>
+ public Uri DescriptionUrl { get; set; }
+
+ /// <summary>
+ /// Gets or sets HandBrake's version from the appcast.xml file.
+ /// </summary>
+ public string Version { get; set; }
+
+ /// <summary>
+ /// Gets or sets HandBrake's Build from the appcast.xml file.
+ /// </summary>
+ public string Build { get; set; }
+
+ /// <summary>
+ /// Gets or sets the URL for update file.
+ /// </summary>
+ public string DownloadFile { get; set; }
+
+ /// <summary>
+ /// Gets or sets the error that occurred, if any. This will be null if no error occured.
+ /// </summary>
+ public Exception Error { get; set; }
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Model/General/UpdateCheckResult.cs b/win/CS/HandBrake.ApplicationServices/Model/General/UpdateCheckResult.cs
new file mode 100644
index 000000000..2f7c7e874
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/General/UpdateCheckResult.cs
@@ -0,0 +1,71 @@
+/* UpdateCheckResult.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model.General
+{
+ using System;
+ using System.Threading;
+
+ /// <summary>
+ /// Used in EndUpdateCheck() for update checking and the IAsyncResult design pattern.
+ /// </summary>
+ public class UpdateCheckResult : IAsyncResult
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="UpdateCheckResult"/> class.
+ /// </summary>
+ /// <param name="asyncState">
+ /// The async state.
+ /// </param>
+ /// <param name="info">
+ /// The info.
+ /// </param>
+ public UpdateCheckResult(object asyncState, ApplicationServices.Model.General.UpdateCheckInformation info)
+ {
+ this.AsyncState = asyncState;
+ this.Result = info;
+ }
+
+ /// <summary>
+ /// Gets whether the check was executed in debug mode.
+ /// </summary>
+ public object AsyncState { get; private set; }
+
+ /// <summary>
+ /// Gets the result of the update check.
+ /// </summary>
+ public ApplicationServices.Model.General.UpdateCheckInformation Result { get; private set; }
+
+ /// <summary>
+ /// Gets AsyncWaitHandle.
+ /// </summary>
+ /// <exception cref="NotImplementedException">
+ /// </exception>
+ public WaitHandle AsyncWaitHandle
+ {
+ get { throw new NotImplementedException(); }
+ }
+
+ /// <summary>
+ /// Gets a value indicating whether CompletedSynchronously.
+ /// </summary>
+ /// <exception cref="NotImplementedException">
+ /// </exception>
+ public bool CompletedSynchronously
+ {
+ get { throw new NotImplementedException(); }
+ }
+
+ /// <summary>
+ /// Gets a value indicating whether IsCompleted.
+ /// </summary>
+ /// <exception cref="NotImplementedException">
+ /// </exception>
+ public bool IsCompleted
+ {
+ get { throw new NotImplementedException(); }
+ }
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Model/Preset.cs b/win/CS/HandBrake.ApplicationServices/Model/Preset.cs
new file mode 100644
index 000000000..e20ad2dee
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/Preset.cs
@@ -0,0 +1,64 @@
+/* Preset.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model
+{
+ /// <summary>
+ /// A Preset for encoding with.
+ /// </summary>
+ public class Preset
+ {
+ /// <summary>
+ /// Gets or sets the category which the preset resides under
+ /// </summary>
+ public string Category { get; set; }
+
+ /// <summary>
+ /// Gets or sets the preset name
+ /// </summary>
+ public string Name { get; set; }
+
+ /// <summary>
+ /// Gets or sets the preset query
+ /// </summary>
+ public string Query { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether to use picture Settings in presets.
+ /// </summary>
+ public bool CropSettings { get; set; }
+
+ /// <summary>
+ /// Gets or sets the Settings for this encode/preset. Can be used in place of Query property.
+ /// </summary>
+ public EncodeTask EncodeSettings { get; set; }
+
+ /// <summary>
+ /// Gets or sets The version number which associates this preset with a HB build
+ /// </summary>
+ public string Version { get; set; }
+
+ /// <summary>
+ /// Gets or sets the Description for the preset
+ /// </summary>
+ public string Description { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether this is a built in preset
+ /// </summary>
+ public bool IsBuildIn { get; set; }
+
+ /// <summary>
+ /// Override the ToString Method
+ /// </summary>
+ /// <returns>
+ /// The Preset Name
+ /// </returns>
+ public override string ToString()
+ {
+ return this.Name;
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Model/QueueTask.cs b/win/CS/HandBrake.ApplicationServices/Model/QueueTask.cs
new file mode 100644
index 000000000..83948a1f3
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/QueueTask.cs
@@ -0,0 +1,84 @@
+/* QueueTask.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model
+{
+ /// <summary>
+ /// The QueueTask.
+ /// </summary>
+ public class QueueTask
+ {
+ /*
+ * TODO
+ * - Update the Query property to generate the query from the EncodeTask object.
+ * - Remove Sourcee, Destination and Title when they are no longer used.
+ */
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="QueueTask"/> class.
+ /// </summary>
+ public QueueTask()
+ {
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="QueueTask"/> class.
+ /// </summary>
+ /// <param name="query">
+ /// The query.
+ /// </param>
+ public QueueTask(string query)
+ {
+ this.Query = query;
+ }
+
+ /// <summary>
+ /// Gets or sets the job ID.
+ /// </summary>
+ public int Id { get; set; }
+
+ /// <summary>
+ /// Gets or sets Title.
+ /// </summary>
+ public int Title { get; set; }
+
+ /// <summary>
+ /// Gets or sets Source.
+ /// </summary>
+ public string Source { get; set; }
+
+ /// <summary>
+ /// Gets or sets Destination.
+ /// </summary>
+ public string Destination { get; set; }
+
+ /// <summary>
+ /// Gets or sets the query string.
+ /// </summary>
+ public string Query { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether if this is a user or GUI generated query
+ /// </summary>
+ public bool CustomQuery { get; set; }
+
+ /// <summary>
+ /// Gets or sets the Encode Task.
+ /// </summary>
+ public EncodeTask Task { get; set; }
+
+ /// <summary>
+ /// Gets a value indicating whether or not this instance is empty.
+ /// </summary>
+ public bool IsEmpty
+ {
+ get
+ {
+ return this.Id == 0 && string.IsNullOrEmpty(this.Query) && string.IsNullOrEmpty(this.Task.Source) &&
+ string.IsNullOrEmpty(this.Task.Destination);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Parsing/AudioTrack.cs b/win/CS/HandBrake.ApplicationServices/Parsing/AudioTrack.cs
new file mode 100644
index 000000000..0597f4d1b
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Parsing/AudioTrack.cs
@@ -0,0 +1,169 @@
+/* AudioTrack.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Parsing
+{
+ using System.Collections.Generic;
+ using System.IO;
+ using System.Text.RegularExpressions;
+
+ /// <summary>
+ /// An object represending an AudioTrack associated with a Title, in a DVD
+ /// </summary>
+ public class AudioTrack
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="AudioTrack"/> class.
+ /// </summary>
+ public AudioTrack()
+ {
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="AudioTrack"/> class.
+ /// </summary>
+ /// <param name="trackNumber">
+ /// The track number.
+ /// </param>
+ /// <param name="language">
+ /// The language.
+ /// </param>
+ /// <param name="languageCode">
+ /// The language code.
+ /// </param>
+ /// <param name="description">
+ /// The description.
+ /// </param>
+ /// <param name="format">
+ /// The format.
+ /// </param>
+ /// <param name="sampleRate">
+ /// The sample rate.
+ /// </param>
+ /// <param name="bitrate">
+ /// The bitrate.
+ /// </param>
+ public AudioTrack(int trackNumber, string language, string languageCode, string description, string format, int sampleRate, int bitrate)
+ {
+ this.TrackNumber = trackNumber;
+ this.Language = language;
+ this.LanguageCode = languageCode;
+ this.Description = description;
+ this.Format = format;
+ this.SampleRate = sampleRate;
+ this.Bitrate = bitrate;
+ }
+
+ /// <summary>
+ /// Gets or sets The track number of this Audio Track
+ /// </summary>
+ public int TrackNumber { get; set; }
+
+ /// <summary>
+ /// Gets or sets The language (if detected) of this Audio Track
+ /// </summary>
+ public string Language { get; set; }
+
+ /// <summary>
+ /// Gets or sets LanguageCode.
+ /// </summary>
+ public string LanguageCode { get; set; }
+
+ /// <summary>
+ /// Gets or sets Description.
+ /// </summary>
+ public string Description { get; set; }
+
+ /// <summary>
+ /// Gets or sets The primary format of this Audio Track
+ /// </summary>
+ public string Format { get; set; }
+
+ /// <summary>
+ /// Gets or sets The frequency (in MHz) of this Audio Track
+ /// </summary>
+ public int SampleRate { get; set; }
+
+ /// <summary>
+ /// Gets or sets The bitrate (in kbps) of this Audio Track
+ /// </summary>
+ public int Bitrate { get; set; }
+
+ /// <summary>
+ /// Parse the CLI input to an Audio Track object
+ /// </summary>
+ /// <param name="output">
+ /// The output.
+ /// </param>
+ /// <returns>
+ /// An Audio Track obkect
+ /// </returns>
+ public static AudioTrack Parse(StringReader output)
+ {
+ string audioTrack = output.ReadLine();
+ Match m = Regex.Match(audioTrack, @"^ \+ ([0-9]*), ([A-Za-z0-9,\s]*) \((.*)\) \((.*)\)");
+ Match track = Regex.Match(audioTrack, @"^ \+ ([0-9]*), ([A-Za-z0-9,\s]*) \((.*)\)"); // ID and Language
+ Match iso639_2 = Regex.Match(audioTrack, @"iso639-2: ([a-zA-Z]*)\)");
+ Match samplerate = Regex.Match(audioTrack, @"([0-9]*)Hz");
+ Match bitrate = Regex.Match(audioTrack, @"([0-9]*)bps");
+
+ string subformat = m.Groups[4].Value.Trim().Contains("iso639") ? null : m.Groups[4].Value;
+ string samplerateVal = samplerate.Success ? samplerate.Groups[0].Value.Replace("Hz", string.Empty).Trim() : "0";
+ string bitrateVal = bitrate.Success ? bitrate.Groups[0].Value.Replace("bps", string.Empty).Trim() : "0";
+
+ if (track.Success)
+ {
+ var thisTrack = new AudioTrack
+ {
+ TrackNumber = int.Parse(track.Groups[1].Value.Trim()),
+ Language = track.Groups[2].Value,
+ Format = m.Groups[3].Value,
+ Description = subformat,
+ SampleRate = int.Parse(samplerateVal),
+ Bitrate = int.Parse(bitrateVal),
+ LanguageCode = iso639_2.Value.Replace("iso639-2: ", string.Empty).Replace(")", string.Empty)
+ };
+ return thisTrack;
+ }
+
+ return null;
+ }
+
+ /// <summary>
+ /// Pase a list of audio tracks
+ /// </summary>
+ /// <param name="output">
+ /// The output.
+ /// </param>
+ /// <returns>
+ /// An array of audio tracks
+ /// </returns>
+ public static AudioTrack[] ParseList(StringReader output)
+ {
+ var tracks = new List<AudioTrack>();
+ while (true)
+ {
+ AudioTrack thisTrack = Parse(output);
+ if (thisTrack != null)
+ tracks.Add(thisTrack);
+ else
+ break;
+ }
+ return tracks.ToArray();
+ }
+
+ /// <summary>
+ /// Override of the ToString method to make this object easier to use in the UI
+ /// </summary>
+ /// <returns>A string formatted as: {track #} {language} ({format}) ({sub-format})</returns>
+ public override string ToString()
+ {
+ if (Description == null)
+ return string.Format("{0} {1} ({2})", TrackNumber, Language, Format);
+
+ return string.Format("{0} {1} ({2}) ({3})", TrackNumber, Language, Format, Description);
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Parsing/Chapter.cs b/win/CS/HandBrake.ApplicationServices/Parsing/Chapter.cs
new file mode 100644
index 000000000..4ec76fa1c
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Parsing/Chapter.cs
@@ -0,0 +1,126 @@
+/* Chapter.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Parsing
+{
+ using System;
+ using System.Collections.Generic;
+ using System.IO;
+ using System.Text.RegularExpressions;
+
+ /// <summary>
+ /// An object representing a Chapter aosciated with a Title, in a DVD
+ /// </summary>
+ public class Chapter
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Chapter"/> class.
+ /// </summary>
+ public Chapter()
+ {
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Chapter"/> class.
+ /// </summary>
+ /// <param name="number">
+ /// The number.
+ /// </param>
+ /// <param name="Name">
+ /// The name.
+ /// </param>
+ /// <param name="duration">
+ /// The duration.
+ /// </param>
+ public Chapter(int number, string Name, TimeSpan duration)
+ {
+ this.ChapterName = Name;
+ this.ChapterNumber = number;
+ this.Duration = duration;
+ }
+
+ /// <summary>
+ /// Gets or sets The number of this Chapter, in regards to it's parent Title
+ /// </summary>
+ public int ChapterNumber { get; set; }
+
+ /// <summary>
+ /// Gets or sets ChapterName.
+ /// </summary>
+ public string ChapterName { get; set; }
+
+ /// <summary>
+ /// Gets or sets The length in time this Chapter spans
+ /// </summary>
+ public TimeSpan Duration { get; set; }
+
+ /// <summary>
+ /// Parse a CLI string to a Chapter object
+ /// </summary>
+ /// <param name="output">
+ /// The output.
+ /// </param>
+ /// <returns>
+ /// A chapter Object
+ /// </returns>
+ public static Chapter Parse(StringReader output)
+ {
+ // TODO add support for reading chapter names to the regex.
+ Match m = Regex.Match(
+ output.ReadLine(),
+ @"^ \+ ([0-9]*): cells ([0-9]*)->([0-9]*), ([0-9]*) blocks, duration ([0-9]{2}:[0-9]{2}:[0-9]{2})");
+ if (m.Success)
+ {
+ var thisChapter = new Chapter
+ {
+ ChapterNumber = int.Parse(m.Groups[1].Value.Trim()),
+ ChapterName = string.Empty,
+ Duration = TimeSpan.Parse(m.Groups[5].Value)
+ };
+ return thisChapter;
+ }
+ return null;
+ }
+
+ /// <summary>
+ /// Prase a list of strings / chatpers
+ /// </summary>
+ /// <param name="output">
+ /// The output.
+ /// </param>
+ /// <returns>
+ /// An array of chapter objects
+ /// </returns>
+ public static Chapter[] ParseList(StringReader output)
+ {
+ var chapters = new List<Chapter>();
+
+ // this is to read the " + chapters:" line from the buffer
+ // so we can start reading the chapters themselvs
+ output.ReadLine();
+
+ while (true)
+ {
+ // Start of the chapter list for this Title
+ Chapter thisChapter = Parse(output);
+
+ if (thisChapter != null)
+ chapters.Add(thisChapter);
+ else
+ break;
+ }
+ return chapters.ToArray();
+ }
+
+ /// <summary>
+ /// Override of the ToString method to make this object easier to use in the UI
+ /// </summary>
+ /// <returns>A string formatted as: {chapter #}</returns>
+ public override string ToString()
+ {
+ return ChapterNumber.ToString();
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Parsing/Parser.cs b/win/CS/HandBrake.ApplicationServices/Parsing/Parser.cs
new file mode 100644
index 000000000..e46afea28
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Parsing/Parser.cs
@@ -0,0 +1,163 @@
+/* Parser.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Parsing
+{
+ using System;
+ using System.Globalization;
+ using System.IO;
+ using System.Text;
+ using System.Text.RegularExpressions;
+
+ /// <summary>
+ /// A delegate to handle custom events regarding data being parsed from the buffer
+ /// </summary>
+ /// <param name="sender">The object which raised this delegate</param>
+ /// <param name="data">The data parsed from the stream</param>
+ public delegate void DataReadEventHandler(object sender, string data);
+
+ /// <summary>
+ /// A delegate to handle events regarding progress during DVD scanning
+ /// </summary>
+ /// <param name="sender">The object who's raising the event</param>
+ /// <param name="currentTitle">The title number currently being processed</param>
+ /// <param name="titleCount">The total number of titiles to be processed</param>
+ public delegate void ScanProgressEventHandler(object sender, int currentTitle, int titleCount);
+
+ /// <summary>
+ /// A delegate to handle encode progress updates // EXPERIMENTAL
+ /// </summary>
+ /// <param name="sender">The object which raised the event</param>
+ /// <param name="currentTask">The current task being processed from the queue</param>
+ /// <param name="taskCount">The total number of tasks in queue</param>
+ /// <param name="percentComplete">The percentage this task is complete</param>
+ /// <param name="currentFps">The current encoding fps</param>
+ /// <param name="averageFps">The average encoding fps for this task</param>
+ /// <param name="timeRemaining">The estimated time remaining for this task to complete</param>
+ public delegate void EncodeProgressEventHandler(object sender, int currentTask, int taskCount, float percentComplete, float currentFps, float averageFps, string timeRemaining);
+
+ /// <summary>
+ /// A simple wrapper around a StreamReader to keep track of the entire output from a cli process
+ /// </summary>
+ public class Parser : StreamReader
+ {
+ /// <summary>
+ /// The Buffer StringBuilder
+ /// </summary>
+ private readonly StringBuilder buffer = new StringBuilder(string.Empty);
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Parser"/> class.
+ /// Default constructor for this object
+ /// </summary>
+ /// <param name="baseStream">
+ /// The stream to parse from
+ /// </param>
+ public Parser(Stream baseStream) : base(baseStream)
+ {
+ }
+
+ /// <summary>
+ /// Raised upon a new line being read from stdout/stderr
+ /// </summary>
+ public event DataReadEventHandler OnReadLine;
+
+ /// <summary>
+ /// Raised upon the entire stdout/stderr stream being read in a single call
+ /// </summary>
+ public event DataReadEventHandler OnReadToEnd;
+
+ /// <summary>
+ /// Raised upon the catching of a "Scanning title # of #..." in the stream
+ /// </summary>
+ public event ScanProgressEventHandler OnScanProgress;
+
+ /// <summary>
+ /// Raised upon the catching of a "Scanning title # of #..." in the stream
+ /// </summary>
+ public event EncodeProgressEventHandler OnEncodeProgress;
+
+ /// <summary>
+ /// Gets the buffer of data that came from the CLI standard input/error
+ /// </summary>
+ public StringBuilder Buffer
+ {
+ get { return buffer; }
+ }
+
+ /// <summary>
+ /// Read a line from standard in/err
+ /// </summary>
+ /// <returns>
+ /// The read line
+ /// </returns>
+ public override string ReadLine()
+ {
+ string tmp = base.ReadLine();
+
+ buffer.Append(tmp + Environment.NewLine);
+
+ Match m = null;
+ if (tmp.Contains("Scanning title"))
+ m = Regex.Match(tmp, "^Scanning title ([0-9]*) of ([0-9]*)");
+
+ if (OnReadLine != null)
+ OnReadLine(this, tmp);
+
+ if (m != null)
+ if (m.Success && OnScanProgress != null)
+ OnScanProgress(this, int.Parse(m.Groups[1].Value), int.Parse(m.Groups[2].Value));
+
+ return tmp;
+ }
+
+ /// <summary>
+ /// Read to the end of the input stream
+ /// </summary>
+ /// <returns>
+ /// A string of the input data
+ /// </returns>
+ public override string ReadToEnd()
+ {
+ string tmp = base.ReadToEnd();
+
+ buffer.Append(tmp + Environment.NewLine);
+ if (OnReadToEnd != null)
+ OnReadToEnd(this, tmp);
+
+ return tmp;
+ }
+
+ /// <summary>
+ /// Pase the CLI status output (from standard output)
+ /// </summary>
+ public void ReadEncodeStatus()
+ {
+ CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");
+ string tmp = base.ReadLine();
+
+ Match m = Regex.Match(tmp, @"^Encoding: task ([0-9]*) of ([0-9]*), ([0-9]*\.[0-9]*) %( \(([0-9]*\.[0-9]*) fps, avg ([0-9]*\.[0-9]*) fps, ETA ([0-9]{2})h([0-9]{2})m([0-9]{2})s\))?");
+ if (m.Success && OnEncodeProgress != null)
+ {
+ int currentTask = int.Parse(m.Groups[1].Value);
+ int totalTasks = int.Parse(m.Groups[2].Value);
+ float percent = float.Parse(m.Groups[3].Value, culture);
+ float currentFps = m.Groups[5].Value == string.Empty ? 0.0F : float.Parse(m.Groups[5].Value, culture);
+ float avgFps = m.Groups[6].Value == string.Empty ? 0.0F : float.Parse(m.Groups[6].Value, culture);
+ string remaining = string.Empty;
+ if (m.Groups[7].Value != string.Empty)
+ {
+ remaining = m.Groups[7].Value + ":" + m.Groups[8].Value + ":" + m.Groups[9].Value;
+ }
+ if (string.IsNullOrEmpty(remaining))
+ {
+ remaining = "Calculating ...";
+ }
+
+ OnEncodeProgress(this, currentTask, totalTasks, percent, currentFps, avgFps, remaining);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Parsing/Source.cs b/win/CS/HandBrake.ApplicationServices/Parsing/Source.cs
new file mode 100644
index 000000000..0ed9c0033
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Parsing/Source.cs
@@ -0,0 +1,53 @@
+/* Source.cs $ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Parsing
+{
+ using System.Collections.Generic;
+ using System.IO;
+
+ /// <summary>
+ /// An object representing a scanned DVD
+ /// </summary>
+ public class Source
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Source"/> class.
+ /// Default constructor for this object
+ /// </summary>
+ public Source()
+ {
+ Titles = new List<Title>();
+ }
+
+ /// <summary>
+ /// Gets or sets Titles. A list of titles from the source
+ /// </summary>
+ public List<Title> Titles { get; set; }
+
+ /// <summary>
+ /// Parse the StreamReader output into a List of Titles
+ /// </summary>
+ /// <param name="output">
+ /// The output.
+ /// </param>
+ /// <returns>
+ /// A DVD object which contains a list of title inforamtion
+ /// </returns>
+ public static Source Parse(StreamReader output)
+ {
+ var thisDVD = new Source();
+
+ while (!output.EndOfStream)
+ {
+ if ((char) output.Peek() == '+')
+ thisDVD.Titles.AddRange(Title.ParseList(output.ReadToEnd()));
+ else
+ output.ReadLine();
+ }
+
+ return thisDVD;
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Parsing/Subtitle.cs b/win/CS/HandBrake.ApplicationServices/Parsing/Subtitle.cs
new file mode 100644
index 000000000..1ac827037
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Parsing/Subtitle.cs
@@ -0,0 +1,171 @@
+/* Subtitle.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Parsing
+{
+ using System.Collections.Generic;
+ using System.IO;
+ using System.Text.RegularExpressions;
+
+ using HandBrake.ApplicationServices.Functions;
+ using HandBrake.ApplicationServices.Model.Encoding;
+
+ /// <summary>
+ /// An object that represents a subtitle associated with a Title, in a DVD
+ /// </summary>
+ public class Subtitle
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Subtitle"/> class.
+ /// </summary>
+ public Subtitle()
+ {
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Subtitle"/> class.
+ /// </summary>
+ /// <param name="trackNumber">
+ /// The track number.
+ /// </param>
+ /// <param name="language">
+ /// The language.
+ /// </param>
+ /// <param name="languageCode">
+ /// The language code.
+ /// </param>
+ /// <param name="subtitleType">
+ /// The subtitle type.
+ /// </param>
+ public Subtitle(int trackNumber, string language, string languageCode, SubtitleType subtitleType)
+ {
+ this.TrackNumber = trackNumber;
+ this.Language = language;
+ this.LanguageCode = languageCode;
+ this.SubtitleType = subtitleType;
+ }
+
+
+ /// <summary>
+ /// Gets or sets the track number of this Subtitle
+ /// </summary>
+ public int TrackNumber { get; set; }
+
+ /// <summary>
+ /// Gets or sets the The language (if detected) of this Subtitle
+ /// </summary>
+ public string Language { get; set; }
+
+ /// <summary>
+ /// Gets or sets the Langauage Code
+ /// </summary>
+ public string LanguageCode { get; set; }
+
+ /// <summary>
+ /// Gets or sets the Subtitle Type
+ /// </summary>
+ public SubtitleType SubtitleType { get; set; }
+
+ /// <summary>
+ /// Gets Subtitle Type
+ /// </summary>
+ public string TypeString
+ {
+ get
+ {
+ return EnumHelper.GetDescription(this.SubtitleType);
+ }
+ }
+
+ /// <summary>
+ /// Parse the input strings related to subtitles
+ /// </summary>
+ /// <param name="output">
+ /// The output.
+ /// </param>
+ /// <returns>
+ /// A Subitle object
+ /// </returns>
+ public static Subtitle Parse(StringReader output)
+ {
+ string curLine = output.ReadLine();
+
+ // + 1, English (iso639-2: eng) (Text)(SSA)
+ // + 1, English (iso639-2: eng) (Text)(UTF-8)
+ Match m = Regex.Match(curLine, @"^ \+ ([0-9]*), ([A-Za-z, ]*) \((.*)\) \(([a-zA-Z]*)\)\(([a-zA-Z0-9\-]*)\)");
+
+ if (m.Success && !curLine.Contains("HandBrake has exited."))
+ {
+ var thisSubtitle = new Subtitle
+ {
+ TrackNumber = int.Parse(m.Groups[1].Value.Trim()),
+ Language = m.Groups[2].Value,
+ LanguageCode = m.Groups[3].Value,
+ };
+
+ switch (m.Groups[5].Value)
+ {
+ case "VOBSUB":
+ thisSubtitle.SubtitleType = SubtitleType.VobSub;
+ break;
+ case "SRT":
+ thisSubtitle.SubtitleType = SubtitleType.SRT;
+ break;
+ case "CC":
+ thisSubtitle.SubtitleType = SubtitleType.CC;
+ break;
+ case "UTF-8":
+ thisSubtitle.SubtitleType = SubtitleType.UTF8Sub;
+ break;
+ case "TX3G":
+ thisSubtitle.SubtitleType = SubtitleType.TX3G;
+ break;
+ case "SSA":
+ thisSubtitle.SubtitleType = SubtitleType.SSA;
+ break;
+ default:
+ thisSubtitle.SubtitleType = SubtitleType.Unknown;
+ break;
+ }
+
+ return thisSubtitle;
+ }
+ return null;
+ }
+
+ /// <summary>
+ /// Parse a list of Subtitle tracks from an input string.
+ /// </summary>
+ /// <param name="output">
+ /// The output.
+ /// </param>
+ /// <returns>
+ /// An array of Subtitle objects
+ /// </returns>
+ public static IEnumerable<Subtitle> ParseList(StringReader output)
+ {
+ var subtitles = new List<Subtitle>();
+ while ((char)output.Peek() != '+')
+ {
+ Subtitle thisSubtitle = Parse(output);
+
+ if (thisSubtitle != null)
+ subtitles.Add(thisSubtitle);
+ else
+ break;
+ }
+ return subtitles.ToArray();
+ }
+
+ /// <summary>
+ /// Override of the ToString method to make this object easier to use in the UI
+ /// </summary>
+ /// <returns>A string formatted as: {track #} {language}</returns>
+ public override string ToString()
+ {
+ return string.Format("{0} {1} ({2})", TrackNumber, Language, TypeString);
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Parsing/Title.cs b/win/CS/HandBrake.ApplicationServices/Parsing/Title.cs
new file mode 100644
index 000000000..3a9e6a56a
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Parsing/Title.cs
@@ -0,0 +1,234 @@
+/* Title.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Parsing
+{
+ using System;
+ using System.Collections.Generic;
+ using System.Drawing;
+ using System.Globalization;
+ using System.IO;
+ using System.Text.RegularExpressions;
+
+ using HandBrake.ApplicationServices.Model;
+ using HandBrake.ApplicationServices.Model.Encoding;
+
+ /// <summary>
+ /// An object that represents a single Title of a DVD
+ /// </summary>
+ public class Title
+ {
+ /// <summary>
+ /// The Culture Info
+ /// </summary>
+ private static readonly CultureInfo Culture = new CultureInfo("en-US", false);
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Title"/> class.
+ /// </summary>
+ public Title()
+ {
+ this.AudioTracks = new List<AudioTrack>();
+ this.Chapters = new List<Chapter>();
+ this.Subtitles = new List<Subtitle>();
+ }
+
+ #region Properties
+
+ /// <summary>
+ /// Gets or sets a Collection of chapters in this Title
+ /// </summary>
+ public List<Chapter> Chapters { get; set; }
+
+ /// <summary>
+ /// Gets or sets a Collection of audio tracks associated with this Title
+ /// </summary>
+ public List<AudioTrack> AudioTracks { get; set; }
+
+ /// <summary>
+ /// Gets or sets a Collection of subtitles associated with this Title
+ /// </summary>
+ public List<Subtitle> Subtitles { get; set; }
+
+ /// <summary>
+ /// Gets or sets The track number of this Title
+ /// </summary>
+ public int TitleNumber { get; set; }
+
+ /// <summary>
+ /// Gets or sets the length in time of this Title
+ /// </summary>
+ public TimeSpan Duration { get; set; }
+
+ /// <summary>
+ /// Gets or sets the resolution (width/height) of this Title
+ /// </summary>
+ public Size Resolution { get; set; }
+
+ /// <summary>
+ /// Gets or sets the aspect ratio of this Title
+ /// </summary>
+ public double AspectRatio { get; set; }
+
+ /// <summary>
+ /// Gets or sets AngleCount.
+ /// </summary>
+ public int AngleCount { get; set; }
+
+ /// <summary>
+ /// Gets or sets Par Value
+ /// </summary>
+ public Size ParVal { get; set; }
+
+ /// <summary>
+ /// Gets or sets the automatically detected crop region for this Title.
+ /// This is an int array with 4 items in it as so:
+ /// 0: T
+ /// 1: B
+ /// 2: L
+ /// 3: R
+ /// </summary>
+ public Cropping AutoCropDimensions { get; set; }
+
+ /// <summary>
+ /// Gets or sets the FPS of the source.
+ /// </summary>
+ public double Fps { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether this is a MainTitle.
+ /// </summary>
+ public bool MainTitle { get; set; }
+
+ /// <summary>
+ /// Gets or sets the Source Name
+ /// </summary>
+ public string SourceName { get; set; }
+
+ #endregion
+
+ /// <summary>
+ /// Parse the Title Information
+ /// </summary>
+ /// <param name="output">A StringReader of output data</param>
+ /// <returns>A Title Object</returns>
+ public static Title Parse(StringReader output)
+ {
+ var thisTitle = new Title();
+ string nextLine = output.ReadLine();
+
+ // Get the Title Number
+ Match m = Regex.Match(nextLine, @"^\+ title ([0-9]*):");
+ if (m.Success)
+ thisTitle.TitleNumber = int.Parse(m.Groups[1].Value.Trim());
+ nextLine = output.ReadLine();
+
+ // Detect if this is the main feature
+ m = Regex.Match(nextLine, @" \+ Main Feature");
+ if (m.Success)
+ {
+ thisTitle.MainTitle = true;
+ nextLine = output.ReadLine();
+ }
+
+ // Get the stream name for file import
+ m = Regex.Match(nextLine, @"^ \+ stream:");
+ if (m.Success)
+ {
+ thisTitle.SourceName = nextLine.Replace("+ stream:", string.Empty).Trim();
+ nextLine = output.ReadLine();
+ }
+
+ // Jump over the VTS and blocks line
+ m = Regex.Match(nextLine, @"^ \+ vts:");
+ if (nextLine.Contains("blocks") || nextLine.Contains("+ vts "))
+ {
+ nextLine = output.ReadLine();
+ }
+
+ // Multi-Angle Support if LibDvdNav is enabled
+ if (!Init.DisableDvdNav)
+ {
+ m = Regex.Match(nextLine, @" \+ angle\(s\) ([0-9])");
+ if (m.Success)
+ {
+ string angleList = m.Value.Replace("+ angle(s) ", string.Empty).Trim();
+ int angleCount;
+ int.TryParse(angleList, out angleCount);
+
+ thisTitle.AngleCount = angleCount;
+ nextLine = output.ReadLine();
+ }
+ }
+
+ // Get duration for this title
+ m = Regex.Match(nextLine, @"^ \+ duration: ([0-9]{2}:[0-9]{2}:[0-9]{2})");
+ if (m.Success)
+ thisTitle.Duration = TimeSpan.Parse(m.Groups[1].Value);
+
+ // Get resolution, aspect ratio and FPS for this title
+ m = Regex.Match(output.ReadLine(), @"^ \+ size: ([0-9]*)x([0-9]*), pixel aspect: ([0-9]*)/([0-9]*), display aspect: ([0-9]*\.[0-9]*), ([0-9]*\.[0-9]*) fps");
+ if (m.Success)
+ {
+ thisTitle.Resolution = new Size(int.Parse(m.Groups[1].Value), int.Parse(m.Groups[2].Value));
+ thisTitle.ParVal = new Size(int.Parse(m.Groups[3].Value), int.Parse(m.Groups[4].Value));
+ thisTitle.AspectRatio = float.Parse(m.Groups[5].Value, Culture);
+ thisTitle.Fps = float.Parse(m.Groups[6].Value, Culture);
+ }
+
+ // Get autocrop region for this title
+ m = Regex.Match(output.ReadLine(), @"^ \+ autocrop: ([0-9]*)/([0-9]*)/([0-9]*)/([0-9]*)");
+ if (m.Success)
+ {
+ thisTitle.AutoCropDimensions = new Cropping
+ {
+ Top = int.Parse(m.Groups[1].Value),
+ Bottom = int.Parse(m.Groups[2].Value),
+ Left = int.Parse(m.Groups[3].Value),
+ Right = int.Parse(m.Groups[4].Value)
+ };
+ }
+
+ thisTitle.Chapters.AddRange(Chapter.ParseList(output));
+
+ thisTitle.AudioTracks.AddRange(AudioTrack.ParseList(output));
+
+ thisTitle.Subtitles.AddRange(Subtitle.ParseList(output));
+
+ return thisTitle;
+ }
+
+ /// <summary>
+ /// Return a list of parsed titles
+ /// </summary>
+ /// <param name="output">The Output</param>
+ /// <returns>A List of titles</returns>
+ public static Title[] ParseList(string output)
+ {
+ var titles = new List<Title>();
+ var sr = new StringReader(output);
+
+ while (sr.Peek() == '+' || sr.Peek() == ' ')
+ {
+ // If the the character is a space, then chances are the line
+ if (sr.Peek() == ' ') // If the character is a space, then chances are it's the combing detected line.
+ sr.ReadLine(); // Skip over it
+ else
+ titles.Add(Parse(sr));
+ }
+
+ return titles.ToArray();
+ }
+
+ /// <summary>
+ /// Override of the ToString method to provide an easy way to use this object in the UI
+ /// </summary>
+ /// <returns>A string representing this track in the format: {title #} (00:00:00)</returns>
+ public override string ToString()
+ {
+ return string.Format("{0} ({1:00}:{2:00}:{3:00})", TitleNumber, Duration.Hours, Duration.Minutes, Duration.Seconds);
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Properties/AssemblyInfo.cs.tmpl b/win/CS/HandBrake.ApplicationServices/Properties/AssemblyInfo.cs.tmpl
new file mode 100644
index 000000000..5669415aa
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Properties/AssemblyInfo.cs.tmpl
@@ -0,0 +1,42 @@
+/* AssemblyInfo.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HandBrake")]
+[assembly: AssemblyDescription("HandBrake is a GPL-licensed, multiplatform, multithreaded video transcoder.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HandBrake Team")]
+[assembly: AssemblyProduct("HandBrake")]
+[assembly: AssemblyCopyright("Copyright © 2011")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("5e4e3f97-5252-41f6-aae9-3846f62cbc66")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("0.9.5.$WCREV$")]
+[assembly: NeutralResourcesLanguage("")]
diff --git a/win/CS/HandBrake.ApplicationServices/Properties/Resources.Designer.cs b/win/CS/HandBrake.ApplicationServices/Properties/Resources.Designer.cs
new file mode 100644
index 000000000..c1dd66e55
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Properties/Resources.Designer.cs
@@ -0,0 +1,70 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.1
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HandBrake.ApplicationServices.Properties {
+ using System;
+
+
+ /// <summary>
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ /// </summary>
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ /// <summary>
+ /// Returns the cached ResourceManager instance used by this class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HandBrake.ApplicationServices.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ /// <summary>
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ internal static System.Drawing.Bitmap logo64 {
+ get {
+ object obj = ResourceManager.GetObject("logo64", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Properties/Resources.resx b/win/CS/HandBrake.ApplicationServices/Properties/Resources.resx
new file mode 100644
index 000000000..2e1c2842b
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Properties/Resources.resx
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <data name="logo64" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\logo64.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Resources/logo64.png b/win/CS/HandBrake.ApplicationServices/Resources/logo64.png
new file mode 100644
index 000000000..12808f636
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Resources/logo64.png
Binary files differ
diff --git a/win/CS/HandBrake.ApplicationServices/Services/Encode.cs b/win/CS/HandBrake.ApplicationServices/Services/Encode.cs
new file mode 100644
index 000000000..4a6333da7
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Services/Encode.cs
@@ -0,0 +1,595 @@
+/* Encode.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Services
+{
+ using System;
+ using System.ComponentModel;
+ using System.Diagnostics;
+ using System.IO;
+ using System.Text;
+ using System.Threading;
+ using System.Windows.Forms;
+
+ using HandBrake.ApplicationServices.EventArgs;
+ using HandBrake.ApplicationServices.Functions;
+ using HandBrake.ApplicationServices.Model;
+ using HandBrake.ApplicationServices.Parsing;
+ using HandBrake.ApplicationServices.Services.Interfaces;
+ using HandBrake.ApplicationServices.Utilities;
+
+ /// <summary>
+ /// Class which handles the CLI
+ /// </summary>
+ public class Encode : IEncode
+ {
+ #region Private Variables
+
+ /// <summary>
+ /// The Log Buffer
+ /// </summary>
+ private StringBuilder logBuffer;
+
+ /// <summary>
+ /// The Log file writer
+ /// </summary>
+ private StreamWriter fileWriter;
+
+ /// <summary>
+ /// Gets The Process Handle
+ /// </summary>
+ private IntPtr processHandle;
+
+ /// <summary>
+ /// Gets the Process ID
+ /// </summary>
+ private int processId;
+
+ /// <summary>
+ /// Windows 7 API Pack wrapper
+ /// </summary>
+ private Win7 windowsSeven = new Win7();
+
+ /// <summary>
+ /// A Lock for the filewriter
+ /// </summary>
+ static readonly object fileWriterLock = new object();
+
+ #endregion
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Encode"/> class.
+ /// </summary>
+ public Encode()
+ {
+ this.EncodeStarted += this.EncodeEncodeStarted;
+ GrowlCommunicator.Register();
+ }
+
+ #region Delegates and Event Handlers
+
+ /// <summary>
+ /// Fires when a new CLI QueueTask starts
+ /// </summary>
+ public event EventHandler EncodeStarted;
+
+ /// <summary>
+ /// Fires when a CLI QueueTask finishes.
+ /// </summary>
+ public event EncodeCompletedStatus EncodeCompleted;
+
+ /// <summary>
+ /// Encode process has progressed
+ /// </summary>
+ public event EncodeProgessStatus EncodeStatusChanged;
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets or sets The HB Process
+ /// </summary>
+ protected Process HbProcess { get; set; }
+
+ /// <summary>
+ /// Gets a value indicating whether IsEncoding.
+ /// </summary>
+ public bool IsEncoding { get; private set; }
+
+ /// <summary>
+ /// Gets ActivityLog.
+ /// </summary>
+ public string ActivityLog
+ {
+ get
+ {
+ if (this.IsEncoding == false)
+ {
+ try
+ {
+ ReadFile(); // Read the last log file back in if it exists
+ }
+ catch (Exception exc)
+ {
+ return exc.ToString();
+ }
+ }
+
+ return string.IsNullOrEmpty(this.logBuffer.ToString()) ? "No log data available..." : this.logBuffer.ToString();
+ }
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Execute a HandBrakeCLI process.
+ /// </summary>
+ /// <param name="encodeQueueTask">
+ /// The encodeQueueTask.
+ /// </param>
+ /// <param name="enableLogging">
+ /// Enable Logging. When Disabled we onlt parse Standard Ouput for progress info. Standard Error log data is ignored.
+ /// </param>
+ public void Start(QueueTask encodeQueueTask, bool enableLogging)
+ {
+ try
+ {
+ QueueTask queueTask = encodeQueueTask;
+
+ if (queueTask == null)
+ {
+ throw new ArgumentNullException("QueueTask was null");
+ }
+
+ if (IsEncoding)
+ {
+ throw new Exception("HandBrake is already encodeing.");
+ }
+
+ IsEncoding = true;
+
+ if (enableLogging)
+ {
+ try
+ {
+ SetupLogging(queueTask);
+ }
+ catch (Exception)
+ {
+ IsEncoding = false;
+ throw;
+ }
+ }
+
+ if (Init.PreventSleep)
+ {
+ Win32.PreventSleep();
+ }
+
+ string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");
+ ProcessStartInfo cliStart = new ProcessStartInfo(handbrakeCLIPath, queueTask.Query)
+ {
+ RedirectStandardOutput = true,
+ RedirectStandardError = enableLogging ? true : false,
+ UseShellExecute = false,
+ CreateNoWindow = !Init.ShowCliForInGuiEncodeStatus ? true : false
+ };
+
+ this.HbProcess = new Process { StartInfo = cliStart };
+
+ this.HbProcess.Start();
+
+ if (enableLogging)
+ {
+ this.HbProcess.ErrorDataReceived += HbProcErrorDataReceived;
+ this.HbProcess.BeginErrorReadLine();
+ }
+
+ this.processId = HbProcess.Id;
+ this.processHandle = HbProcess.Handle;
+
+ // Set the process Priority
+ if (this.processId != -1)
+ {
+ this.HbProcess.EnableRaisingEvents = true;
+ this.HbProcess.Exited += this.HbProcessExited;
+ }
+
+ // Set the Process Priority
+ switch (Init.ProcessPriority)
+ {
+ case "Realtime":
+ this.HbProcess.PriorityClass = ProcessPriorityClass.RealTime;
+ break;
+ case "High":
+ this.HbProcess.PriorityClass = ProcessPriorityClass.High;
+ break;
+ case "Above Normal":
+ this.HbProcess.PriorityClass = ProcessPriorityClass.AboveNormal;
+ break;
+ case "Normal":
+ this.HbProcess.PriorityClass = ProcessPriorityClass.Normal;
+ break;
+ case "Low":
+ this.HbProcess.PriorityClass = ProcessPriorityClass.Idle;
+ break;
+ default:
+ this.HbProcess.PriorityClass = ProcessPriorityClass.BelowNormal;
+ break;
+ }
+
+ // Fire the Encode Started Event
+ if (this.EncodeStarted != null)
+ this.EncodeStarted(this, new EventArgs());
+ }
+ catch (Exception exc)
+ {
+ if (this.EncodeCompleted != null)
+ this.EncodeCompleted(this, new EncodeCompletedEventArgs(false, exc, "An Error has occured in EncodeService.Run()"));
+ }
+ }
+
+ /// <summary>
+ /// Stop the Encode
+ /// </summary>
+ public void Stop()
+ {
+ this.Stop(null);
+ }
+
+ /// <summary>
+ /// Kill the CLI process
+ /// </summary>
+ /// <param name="exc">
+ /// The Exception that has occured.
+ /// This will get bubbled up through the EncodeCompletedEventArgs
+ /// </param>
+ public void Stop(Exception exc)
+ {
+ try
+ {
+ if (this.HbProcess != null && !this.HbProcess.HasExited)
+ {
+ this.HbProcess.Kill();
+ }
+ }
+ catch (Exception)
+ {
+ // No need to report anything to the user. If it fails, it's probably already stopped.
+ }
+
+
+ if (exc == null)
+ {
+ if (this.EncodeCompleted != null)
+ this.EncodeCompleted(this, new EncodeCompletedEventArgs(true, null, string.Empty));
+ }
+ else
+ {
+ if (this.EncodeCompleted != null)
+ this.EncodeCompleted(this, new EncodeCompletedEventArgs(false, exc, "An Error has occured."));
+ }
+ }
+
+ /// <summary>
+ /// Attempt to Safely kill a DirectRun() CLI
+ /// NOTE: This will not work with a MinGW CLI
+ /// Note: http://www.cygwin.com/ml/cygwin/2006-03/msg00330.html
+ /// </summary>
+ public void SafelyStop()
+ {
+ if ((int)this.processHandle == 0)
+ return;
+
+ // Allow the CLI to exit cleanly
+ Win32.SetForegroundWindow((int)this.processHandle);
+ SendKeys.Send("^C");
+ SendKeys.Flush();
+
+ /*/if (HbProcess != null)
+ //{
+ // HbProcess.StandardInput.AutoFlush = true;
+ // HbProcess.StandardInput.WriteLine("^c^z");
+ //}*/
+ }
+
+ /// <summary>
+ /// Save a copy of the log to the users desired location or a default location
+ /// if this feature is enabled in options.
+ /// </summary>
+ /// <param name="destination">
+ /// The Destination File Path
+ /// </param>
+ public void ProcessLogs(string destination)
+ {
+ try
+ {
+ string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) +
+ "\\HandBrake\\logs";
+ string tempLogFile = Path.Combine(logDir, string.Format("last_encode_log{0}.txt", Init.InstanceId));
+
+ string encodeDestinationPath = Path.GetDirectoryName(destination);
+ string destinationFile = Path.GetFileName(destination);
+ string encodeLogFile = destinationFile + " " +
+ DateTime.Now.ToString().Replace("/", "-").Replace(":", "-") + ".txt";
+
+ // Make sure the log directory exists.
+ if (!Directory.Exists(logDir))
+ Directory.CreateDirectory(logDir);
+
+ // Copy the Log to HandBrakes log folder in the users applciation data folder.
+ File.Copy(tempLogFile, Path.Combine(logDir, encodeLogFile));
+
+ // Save a copy of the log file in the same location as the enocde.
+ if (Init.SaveLogWithVideo)
+ File.Copy(tempLogFile, Path.Combine(encodeDestinationPath, encodeLogFile));
+
+ // Save a copy of the log file to a user specified location
+ if (Directory.Exists(Init.SaveLogPath))
+ if (Init.SaveLogPath != String.Empty && Init.SaveLogToSpecifiedPath)
+ File.Copy(tempLogFile, Path.Combine(Init.SaveLogPath, encodeLogFile));
+ }
+ catch (Exception exc)
+ {
+ // This exception doesn't warrent user interaction, but it should be logged (TODO)
+ }
+ }
+
+ #endregion
+
+ #region Private Helper Methods
+
+ /// <summary>
+ /// The HandBrakeCLI process has exited.
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The EventArgs.
+ /// </param>
+ private void HbProcessExited(object sender, EventArgs e)
+ {
+ IsEncoding = false;
+ if (windowsSeven.IsWindowsSeven)
+ {
+ windowsSeven.SetTaskBarProgressToNoProgress();
+ }
+
+ if (Init.PreventSleep)
+ {
+ Win32.AllowSleep();
+ }
+
+ try
+ {
+ lock (fileWriterLock)
+ {
+ // This is just a quick hack to ensure that we are done processing the logging data.
+ // Logging data comes in after the exit event has processed sometimes. We should really impliment ISyncronizingInvoke
+ // and set the SyncObject on the process. I think this may resolve this properly.
+ // For now, just wait 2.5 seconds to let any trailing log messages come in and be processed.
+ Thread.Sleep(2500);
+
+ this.HbProcess.CancelErrorRead();
+
+ if (fileWriter != null)
+ {
+ fileWriter.Close();
+ fileWriter.Dispose();
+ }
+
+ fileWriter = null;
+ }
+ }
+ catch (Exception exc)
+ {
+ // This exception doesn't warrent user interaction, but it should be logged (TODO)
+ }
+
+ if (this.EncodeCompleted != null)
+ this.EncodeCompleted(this, new EncodeCompletedEventArgs(true, null, string.Empty));
+ }
+
+ /// <summary>
+ /// Read the log file
+ /// </summary>
+ private void ReadFile()
+ {
+ logBuffer = new StringBuilder();
+ lock (logBuffer)
+ {
+ // last_encode_log.txt is the primary log file. Since .NET can't read this file whilst the CLI is outputing to it (Not even in read only mode),
+ // we'll need to make a copy of it.
+ string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";
+ string logFile = Path.Combine(logDir, string.Format("last_encode_log{0}.txt", Init.InstanceId));
+ string logFile2 = Path.Combine(logDir, string.Format("tmp_appReadable_log{0}.txt", Init.InstanceId));
+ int logFilePosition = 0;
+
+ try
+ {
+ // Copy the log file.
+ if (File.Exists(logFile))
+ File.Copy(logFile, logFile2, true);
+ else
+ return;
+
+ // Start the Reader
+ // Only use text which continues on from the last read line
+ using (StreamReader sr = new StreamReader(logFile2))
+ {
+ string line;
+ int i = 1;
+ while ((line = sr.ReadLine()) != null)
+ {
+ if (i > logFilePosition)
+ {
+ logBuffer.AppendLine(line);
+ logFilePosition++;
+ }
+ i++;
+ }
+ sr.Close();
+ }
+ }
+ catch (Exception exc)
+ {
+ logBuffer.Append(
+ Environment.NewLine + "Unable to read Log file..." + Environment.NewLine + exc +
+ Environment.NewLine);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Setup the logging.
+ /// </summary>
+ /// <param name="encodeQueueTask">
+ /// The encode QueueTask.
+ /// </param>
+ private void SetupLogging(QueueTask encodeQueueTask)
+ {
+ string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";
+ string logFile = Path.Combine(logDir, string.Format("last_encode_log{0}.txt", Init.InstanceId));
+ string logFile2 = Path.Combine(logDir, string.Format("tmp_appReadable_log{0}.txt", Init.InstanceId));
+
+ try
+ {
+ logBuffer = new StringBuilder();
+
+ // Clear the current Encode Logs
+ if (File.Exists(logFile)) File.Delete(logFile);
+ if (File.Exists(logFile2)) File.Delete(logFile2);
+
+ fileWriter = new StreamWriter(logFile) { AutoFlush = true };
+
+ fileWriter.WriteLine(UtilityService.CreateCliLogHeader(encodeQueueTask));
+ logBuffer.AppendLine(UtilityService.CreateCliLogHeader(encodeQueueTask));
+ }
+ catch (Exception)
+ {
+ if (fileWriter != null)
+ {
+ fileWriter.Close();
+ fileWriter.Dispose();
+ }
+ throw;
+ }
+ }
+
+ /// <summary>
+ /// Recieve the Standard Error information and process it
+ /// </summary>
+ /// <param name="sender">
+ /// The Sender Object
+ /// </param>
+ /// <param name="e">
+ /// DataReceived EventArgs
+ /// </param>
+ private void HbProcErrorDataReceived(object sender, DataReceivedEventArgs e)
+ {
+ if (!String.IsNullOrEmpty(e.Data))
+ {
+ try
+ {
+ lock (logBuffer)
+ logBuffer.AppendLine(e.Data);
+
+ lock (fileWriterLock)
+ {
+ if (fileWriter != null && fileWriter.BaseStream.CanWrite)
+ {
+ fileWriter.WriteLine(e.Data);
+
+ // If the logging grows past 100MB, kill the encode and stop.
+ if (fileWriter.BaseStream.Length > 100000000)
+ {
+ this.Stop(
+ new Exception(
+ "The encode has been stopped. The log file has grown to over 100MB which indicates a serious problem has occured with the encode." +
+ "Please check the encode log for an indication of what the problem is."));
+ }
+ }
+ }
+ }
+ catch (Exception exc)
+ {
+ // Do Nothing.
+ }
+ }
+ }
+
+ /// <summary>
+ /// Encode Started
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The EventArgs.
+ /// </param>
+ private void EncodeEncodeStarted(object sender, EventArgs e)
+ {
+ Thread monitor = new Thread(EncodeMonitor);
+ monitor.Start();
+ }
+
+ /// <summary>
+ /// Monitor the QueueTask
+ /// </summary>
+ private void EncodeMonitor()
+ {
+ try
+ {
+ Parser encode = new Parser(HbProcess.StandardOutput.BaseStream);
+ encode.OnEncodeProgress += EncodeOnEncodeProgress;
+ while (!encode.EndOfStream)
+ encode.ReadEncodeStatus();
+ }
+ catch (Exception exc)
+ {
+ EncodeOnEncodeProgress(null, 0, 0, 0, 0, 0, "Unknown, status not available..");
+ }
+ }
+
+ /// <summary>
+ /// Displays the Encode status in the GUI
+ /// </summary>
+ /// <param name="sender">The sender</param>
+ /// <param name="currentTask">The current task</param>
+ /// <param name="taskCount">Number of tasks</param>
+ /// <param name="percentComplete">Percent complete</param>
+ /// <param name="currentFps">Current encode speed in fps</param>
+ /// <param name="avg">Avg encode speed</param>
+ /// <param name="timeRemaining">Time Left</param>
+ private void EncodeOnEncodeProgress(object sender, int currentTask, int taskCount, float percentComplete, float currentFps, float avg, string timeRemaining)
+ {
+ EncodeProgressEventArgs eventArgs = new EncodeProgressEventArgs
+ {
+ AverageFrameRate = avg,
+ CurrentFrameRate = currentFps,
+ EstimatedTimeLeft = Converters.EncodeToTimespan(timeRemaining),
+ PercentComplete = percentComplete,
+ Task = currentTask,
+ TaskCount = taskCount
+ };
+
+ if (this.EncodeStatusChanged != null)
+ this.EncodeStatusChanged(this, eventArgs);
+
+ if (windowsSeven.IsWindowsSeven)
+ {
+ int percent;
+ int.TryParse(Math.Round(percentComplete).ToString(), out percent);
+
+ windowsSeven.SetTaskBarProgress(percent);
+ }
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IEncode.cs b/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IEncode.cs
new file mode 100644
index 000000000..7ba739617
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IEncode.cs
@@ -0,0 +1,96 @@
+/* IEncode.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Services.Interfaces
+{
+ using System;
+
+ using HandBrake.ApplicationServices.EventArgs;
+ using HandBrake.ApplicationServices.Model;
+
+ /// <summary>
+ /// Encode Progess Status
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The EncodeProgressEventArgs.
+ /// </param>
+ public delegate void EncodeProgessStatus(object sender, EncodeProgressEventArgs e);
+
+ /// <summary>
+ /// Encode Progess Status
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The EncodeProgressEventArgs.
+ /// </param>
+ public delegate void EncodeCompletedStatus(object sender, EncodeCompletedEventArgs e);
+
+ /// <summary>
+ /// The IEncode Interface
+ /// </summary>
+ public interface IEncode
+ {
+ /// <summary>
+ /// Fires when a new CLI Job starts
+ /// </summary>
+ event EventHandler EncodeStarted;
+
+ /// <summary>
+ /// Fires when a CLI job finishes.
+ /// </summary>
+ event EncodeCompletedStatus EncodeCompleted;
+
+ /// <summary>
+ /// Encode process has progressed
+ /// </summary>
+ event EncodeProgessStatus EncodeStatusChanged;
+
+ /// <summary>
+ /// Gets a value indicating whether IsEncoding.
+ /// </summary>
+ bool IsEncoding { get; }
+
+ /// <summary>
+ /// Gets ActivityLog.
+ /// </summary>
+ string ActivityLog { get; }
+
+ /// <summary>
+ /// Start with a LibHb EncodeJob Object
+ /// </summary>
+ /// <param name="job">
+ /// The job.
+ /// </param>
+ /// <param name="enableLogging">
+ /// The enable Logging.
+ /// </param>
+ void Start(QueueTask job, bool enableLogging);
+
+ /// <summary>
+ /// Kill the CLI process
+ /// </summary>
+ void Stop();
+
+ /// <summary>
+ /// Attempt to Safely kill a DirectRun() CLI
+ /// NOTE: This will not work with a MinGW CLI
+ /// Note: http://www.cygwin.com/ml/cygwin/2006-03/msg00330.html
+ /// </summary>
+ void SafelyStop();
+
+ /// <summary>
+ /// Copy the log file to the desired destinations
+ /// </summary>
+ /// <param name="destination">
+ /// The destination.
+ /// </param>
+ void ProcessLogs(string destination);
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IPresetService.cs b/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IPresetService.cs
new file mode 100644
index 000000000..30d6b2f3a
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IPresetService.cs
@@ -0,0 +1,93 @@
+/* IPresetService.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Services.Interfaces
+{
+ using System.Collections.ObjectModel;
+
+ using HandBrake.ApplicationServices.Model;
+
+ /// <summary>
+ /// The Preset Service Interface
+ /// </summary>
+ public interface IPresetService
+ {
+ /// <summary>
+ /// Gets or sets a Collection of presets.
+ /// </summary>
+ ObservableCollection<Preset> Presets { get; set; }
+
+ /// <summary>
+ /// Add a new preset to the system
+ /// </summary>
+ /// <param name="preset">
+ /// A Preset to add
+ /// </param>
+ /// <returns>
+ /// True if added,
+ /// False if name already exists
+ /// </returns>
+ bool Add(Preset preset);
+
+ /// <summary>
+ /// Remove a preset with a given name from either the built in or user preset list.
+ /// </summary>
+ /// <param name="preset">
+ /// The Preset to remove
+ /// </param>
+ void Remove(Preset preset);
+
+ /// <summary>
+ /// Remove a group of presets by category
+ /// </summary>
+ /// <param name="category">
+ /// The Category to remove
+ /// </param>
+ void RemoveGroup(string category);
+
+ /// <summary>
+ /// Get a Preset
+ /// </summary>
+ /// <param name="name">
+ /// The name of the preset to get
+ /// </param>
+ /// <returns>
+ /// A Preset or null object
+ /// </returns>
+ Preset GetPreset(string name);
+
+ /// <summary>
+ /// Clear Built-in Presets
+ /// </summary>
+ void ClearBuiltIn();
+
+ /// <summary>
+ /// Clear all presets
+ /// </summary>
+ void ClearAll();
+
+ /// <summary>
+ /// Reads the CLI's CLI output format and load's them into the preset List Preset
+ /// </summary>
+ /// <param name="cliPath">
+ /// The Path to the CLI, leave blank for current folder.
+ /// </param>
+ void UpdateBuiltInPresets(string cliPath);
+
+ /// <summary>
+ /// Check if the built in Presets stored are not out of date.
+ /// Update them if they are.
+ /// </summary>
+ /// <returns>true if out of date</returns>
+ bool CheckIfPresetsAreOutOfDate();
+
+ /// <summary>
+ /// Check if the preset "name" exists in either Presets or UserPresets lists.
+ /// </summary>
+ /// <param name="name">Name of the preset</param>
+ /// <returns>True if found</returns>
+ bool CheckIfPresetExists(string name);
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IQueueManager.cs b/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IQueueManager.cs
new file mode 100644
index 000000000..2c9005cfb
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IQueueManager.cs
@@ -0,0 +1,113 @@
+/* IQueueManager.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Services.Interfaces
+{
+ using System;
+ using System.Collections.ObjectModel;
+
+ using HandBrake.ApplicationServices.Model;
+
+ /// <summary>
+ /// The Queue Manager Interface
+ /// </summary>
+ public interface IQueueManager
+ {
+ /// <summary>
+ /// Fires when a job is Added, Removed or Re-Ordered.
+ /// Should be used for triggering an update of the Queue Window.
+ /// </summary>
+ event EventHandler QueueChanged;
+
+ /// <summary>
+ /// Gets or sets Last Processed Job.
+ /// This is set when the job is poped of the queue by GetNextJobForProcessing();
+ /// </summary>
+ QueueTask LastProcessedJob { get; set; }
+
+ /// <summary>
+ /// Gets The current queue.
+ /// </summary>
+ ReadOnlyCollection<QueueTask> Queue { get; }
+
+ /// <summary>
+ /// Gets the number of jobs in the queue
+ /// </summary>
+ int Count { get; }
+
+ /// <summary>
+ /// Add a job to the Queue.
+ /// This method is Thread Safe.
+ /// </summary>
+ /// <param name="job">
+ /// The encode Job object.
+ /// </param>
+ void Add(QueueTask job);
+
+ /// <summary>
+ /// Remove a job from the Queue.
+ /// This method is Thread Safe
+ /// </summary>
+ /// <param name="job">
+ /// The job.
+ /// </param>
+ void Remove(QueueTask job);
+
+ /// <summary>
+ /// Get the first job on the queue for processing.
+ /// This also removes the job from the Queue and sets the LastProcessedJob
+ /// </summary>
+ /// <returns>
+ /// An encode Job object.
+ /// </returns>
+ QueueTask GetNextJobForProcessing();
+
+ /// <summary>
+ /// Moves an item up one position in the queue.
+ /// </summary>
+ /// <param name="index">The zero-based location of the job in the queue.</param>
+ void MoveUp(int index);
+
+ /// <summary>
+ /// Moves an item down one position in the queue.
+ /// </summary>
+ /// <param name="index">The zero-based location of the job in the queue.</param>
+ void MoveDown(int index);
+
+ /// <summary>
+ /// Backup any changes to the queue file
+ /// </summary>
+ /// <param name="exportPath">
+ /// If this is not null or empty, this will be used instead of the standard backup location.
+ /// </param>
+ void BackupQueue(string exportPath);
+
+ /// <summary>
+ /// Restore a Queue from file or from the queue backup file.
+ /// </summary>
+ /// <param name="importPath">
+ /// The import path. String.Empty or null will result in the default file being loaded.
+ /// </param>
+ void RestoreQueue(string importPath);
+
+ /// <summary>
+ /// Checks the current queue for an existing instance of the specified destination.
+ /// </summary>
+ /// <param name="destination">The destination of the encode.</param>
+ /// <returns>Whether or not the supplied destination is already in the queue.</returns>
+ bool CheckForDestinationPathDuplicates(string destination);
+
+ /// <summary>
+ /// Create a batch script from the queue
+ /// </summary>
+ /// <param name="path">
+ /// The path to the location for the script to be saved.
+ /// </param>
+ /// <returns>
+ /// True if sucessful
+ /// </returns>
+ bool WriteBatchScriptToFile(string path);
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IQueueProcessor.cs b/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IQueueProcessor.cs
new file mode 100644
index 000000000..3d71688cb
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IQueueProcessor.cs
@@ -0,0 +1,51 @@
+namespace HandBrake.ApplicationServices.Services.Interfaces
+{
+ using System;
+
+ /// <summary>
+ /// The Queue Processor
+ /// </summary>
+ public interface IQueueProcessor
+ {
+ /// <summary>
+ /// Fires when the Queue has started
+ /// </summary>
+ event QueueProcessor.QueueProgressStatus JobProcessingStarted;
+
+ /// <summary>
+ /// Fires when a pause to the encode queue has been requested.
+ /// </summary>
+ event EventHandler QueuePaused;
+
+ /// <summary>
+ /// Fires when the entire encode queue has completed.
+ /// </summary>
+ event EventHandler QueueCompleted;
+
+ /// <summary>
+ /// Gets the IEncodeService instance.
+ /// </summary>
+ IEncode EncodeService { get; }
+
+ /// <summary>
+ /// Gets the IQueueManager instance.
+ /// </summary>
+ IQueueManager QueueManager { get; }
+
+ /// <summary>
+ /// Gets a value indicating whether IsProcessing.
+ /// </summary>
+ bool IsProcessing { get; }
+
+ /// <summary>
+ /// Starts encoding the first job in the queue and continues encoding until all jobs
+ /// have been encoded.
+ /// </summary>
+ void Start();
+
+ /// <summary>
+ /// Requests a pause of the encode queue.
+ /// </summary>
+ void Pause();
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IScan.cs b/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IScan.cs
new file mode 100644
index 000000000..6cbce5273
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IScan.cs
@@ -0,0 +1,83 @@
+/* IScan.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Services.Interfaces
+{
+ using System;
+
+ using HandBrake.ApplicationServices.EventArgs;
+ using HandBrake.ApplicationServices.Parsing;
+
+ /// <summary>
+ /// Encode Progess Status
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The EncodeProgressEventArgs.
+ /// </param>
+ public delegate void ScanProgessStatus(object sender, ScanProgressEventArgs e);
+
+ /// <summary>
+ /// Encode Progess Status
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The ScanCompletedEventArgs.
+ /// </param>
+ public delegate void ScanCompletedStatus(object sender, ScanCompletedEventArgs e);
+
+ /// <summary>
+ /// The IScan Interface
+ /// </summary>
+ public interface IScan
+ {
+ /// <summary>
+ /// Scan has Started
+ /// </summary>
+ event EventHandler ScanStared;
+
+ /// <summary>
+ /// Scan has completed
+ /// </summary>
+ event ScanCompletedStatus ScanCompleted;
+
+ /// <summary>
+ /// Scan process has changed to a new title
+ /// </summary>
+ event ScanProgessStatus ScanStatusChanged;
+
+ /// <summary>
+ /// Gets a value indicating whether IsScanning.
+ /// </summary>
+ bool IsScanning { get; }
+
+ /// <summary>
+ /// Gets the Souce Data.
+ /// </summary>
+ Source SouceData { get; }
+
+ /// <summary>
+ /// Gets ActivityLog.
+ /// </summary>
+ string ActivityLog { get; }
+
+ /// <summary>
+ /// Scan a Source Path.
+ /// Title 0: scan all
+ /// </summary>
+ /// <param name="sourcePath">Path to the file to scan</param>
+ /// <param name="title">int title number. 0 for scan all</param>
+ void Scan(string sourcePath, int title);
+
+ /// <summary>
+ /// Kill the scan
+ /// </summary>
+ void Stop();
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Services/LibScan.cs b/win/CS/HandBrake.ApplicationServices/Services/LibScan.cs
new file mode 100644
index 000000000..6f200e447
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Services/LibScan.cs
@@ -0,0 +1,328 @@
+/* LibScan.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Services
+{
+ using System;
+ using System.Collections.Generic;
+ using System.Text;
+ using System.Threading;
+
+ using HandBrake.ApplicationServices.EventArgs;
+ using HandBrake.ApplicationServices.Model.Encoding;
+ using HandBrake.ApplicationServices.Parsing;
+ using HandBrake.ApplicationServices.Services.Interfaces;
+ using HandBrake.Interop;
+
+ using AudioTrack = HandBrake.ApplicationServices.Parsing.AudioTrack;
+ using Cropping = HandBrake.ApplicationServices.Model.Encoding.Cropping;
+ using ScanProgressEventArgs = HandBrake.Interop.ScanProgressEventArgs;
+ using Size = System.Drawing.Size;
+
+ /// <summary>
+ /// Scan a Source
+ /// </summary>
+ public class LibScan : IScan
+ {
+ /*
+ * TODO
+ * 1. Expose the Previews code.
+ * 2. Expose the Logging.
+ *
+ */
+
+ #region Private Variables
+
+ /// <summary>
+ /// Lock for the log file
+ /// </summary>
+ static readonly object LogLock = new object();
+
+ /// <summary>
+ /// LibHB Instance
+ /// </summary>
+ private readonly HandBrakeInstance instance;
+
+ /// <summary>
+ /// Log data from HandBrakeInstance
+ /// </summary>
+ private readonly StringBuilder logging;
+
+ #endregion
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="LibScan"/> class.
+ /// </summary>
+ public LibScan()
+ {
+ logging = new StringBuilder();
+
+ instance = new HandBrakeInstance();
+ instance.Initialize(1);
+ instance.ScanProgress += this.InstanceScanProgress;
+ instance.ScanCompleted += this.InstanceScanCompleted;
+
+ HandBrakeUtils.MessageLogged += this.HandBrakeInstanceMessageLogged;
+ HandBrakeUtils.ErrorLogged += this.HandBrakeInstanceErrorLogged;
+ }
+
+ #region Events
+
+ /// <summary>
+ /// Scan has Started
+ /// </summary>
+ public event EventHandler ScanStared;
+
+ /// <summary>
+ /// Scan has completed
+ /// </summary>
+ public event ScanCompletedStatus ScanCompleted;
+
+ /// <summary>
+ /// Encode process has progressed
+ /// </summary>
+ public event ScanProgessStatus ScanStatusChanged;
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets a value indicating whether IsScanning.
+ /// </summary>
+ public bool IsScanning { get; private set; }
+
+ /// <summary>
+ /// Gets the Souce Data.
+ /// </summary>
+ public Source SouceData { get; private set; }
+
+ /// <summary>
+ /// Gets ActivityLog.
+ /// </summary>
+ public string ActivityLog
+ {
+ get
+ {
+ return logging.ToString();
+ }
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Scan a Source Path.
+ /// Title 0: scan all
+ /// </summary>
+ /// <param name="sourcePath">Path to the file to scan</param>
+ /// <param name="title">int title number. 0 for scan all</param>
+ public void Scan(string sourcePath, int title)
+ {
+ Thread t = new Thread(unused => this.ScanSource(sourcePath, title));
+ t.Start();
+ }
+
+ /// <summary>
+ /// Kill the scan
+ /// </summary>
+ public void Stop()
+ {
+ instance.StopScan();
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ /// <summary>
+ /// Start a scan for a given source path and title
+ /// </summary>
+ /// <param name="sourcePath">Path to the source file</param>
+ /// <param name="title">the title number to look at</param>
+ private void ScanSource(object sourcePath, int title)
+ {
+ try
+ {
+ IsScanning = true;
+ if (this.ScanStared != null)
+ this.ScanStared(this, new EventArgs());
+
+ if (title != 0)
+ instance.StartScan(sourcePath.ToString(), 10, title);
+ else
+ instance.StartScan(sourcePath.ToString(), 10);
+ }
+ catch (Exception exc)
+ {
+ this.Stop();
+
+ if (this.ScanCompleted != null)
+ this.ScanCompleted(this, new ScanCompletedEventArgs(false, exc, "An Error has occured in ScanService.ScanSource()"));
+ }
+ }
+
+ #endregion
+
+ #region HandBrakeInstance Event Handlers
+ /// <summary>
+ /// Scan Completed Event Handler
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The EventArgs.
+ /// </param>
+ private void InstanceScanCompleted(object sender, EventArgs e)
+ {
+ this.SouceData = new Source { Titles = ConvertTitles(this.instance.Titles) };
+
+ IsScanning = false;
+
+ if (this.ScanCompleted != null)
+ this.ScanCompleted(this, new ScanCompletedEventArgs(true, null, string.Empty));
+ }
+
+ /// <summary>
+ /// Scan Progress Event Handler
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The EventArgs.
+ /// </param>
+ private void InstanceScanProgress(object sender, ScanProgressEventArgs e)
+ {
+ if (this.ScanStatusChanged != null)
+ {
+ ApplicationServices.EventArgs.ScanProgressEventArgs eventArgs =
+ new ApplicationServices.EventArgs.ScanProgressEventArgs
+ {
+ CurrentTitle = e.CurrentTitle,
+ Titles = e.Titles
+ };
+
+ this.ScanStatusChanged(this, eventArgs);
+ }
+ }
+
+ /// <summary>
+ /// Log a message
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The MessageLoggedEventArgs.
+ /// </param>
+ private void HandBrakeInstanceErrorLogged(object sender, MessageLoggedEventArgs e)
+ {
+ lock (LogLock)
+ {
+ this.logging.AppendLine(e.Message);
+ }
+ }
+
+ /// <summary>
+ /// Log a message
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The MessageLoggedEventArgs.
+ /// </param>
+ private void HandBrakeInstanceMessageLogged(object sender, MessageLoggedEventArgs e)
+ {
+ lock (LogLock)
+ {
+ this.logging.AppendLine(e.Message);
+ }
+ }
+
+ /// <summary>
+ /// Convert Interop Title objects to App Services Title object
+ /// </summary>
+ /// <param name="titles">
+ /// The titles.
+ /// </param>
+ /// <returns>
+ /// The convert titles.
+ /// </returns>
+ private static List<Title> ConvertTitles(IEnumerable<SourceData.Title> titles)
+ {
+ List<Title> titleList = new List<Title>();
+ foreach (SourceData.Title title in titles)
+ {
+ Title converted = new Title
+ {
+ TitleNumber = title.TitleNumber,
+ Duration = title.Duration,
+ Resolution = new Size(title.Resolution.Width, title.Resolution.Height),
+ AspectRatio = title.AspectRatio,
+ AngleCount = title.AngleCount,
+ ParVal = new Size(title.ParVal.Width, title.ParVal.Height),
+ AutoCropDimensions =
+ new Cropping(
+ title.AutoCropDimensions.Top,
+ title.AutoCropDimensions.Bottom,
+ title.AutoCropDimensions.Left,
+ title.AutoCropDimensions.Right),
+ Fps = title.Framerate
+ };
+
+ foreach (SourceData.Chapter chapter in title.Chapters)
+ {
+ converted.Chapters.Add(new Chapter(chapter.ChapterNumber, string.Empty, chapter.Duration));
+ }
+
+ foreach (SourceData.AudioTrack track in title.AudioTracks)
+ {
+ converted.AudioTracks.Add(new AudioTrack(track.TrackNumber, track.Language, track.LanguageCode, track.Description, string.Empty, track.SampleRate, track.Bitrate));
+ }
+
+ foreach (SourceData.Subtitle track in title.Subtitles)
+ {
+ SubtitleType convertedType = new SubtitleType();
+
+ switch (track.SubtitleSource)
+ {
+ case SourceData.SubtitleSource.VobSub:
+ convertedType = SubtitleType.VobSub;
+ break;
+ case SourceData.SubtitleSource.UTF8:
+ convertedType = SubtitleType.UTF8Sub;
+ break;
+ case SourceData.SubtitleSource.TX3G:
+ convertedType = SubtitleType.TX3G;
+ break;
+ case SourceData.SubtitleSource.SSA:
+ convertedType = SubtitleType.SSA;
+ break;
+ case SourceData.SubtitleSource.SRT:
+ convertedType = SubtitleType.SRT;
+ break;
+ case SourceData.SubtitleSource.CC608:
+ convertedType = SubtitleType.CC;
+ break;
+ case SourceData.SubtitleSource.CC708:
+ convertedType = SubtitleType.CC;
+ break;
+ }
+
+ converted.Subtitles.Add(new Subtitle(track.TrackNumber, track.Language, track.LanguageCode, convertedType));
+ }
+
+ titleList.Add(converted);
+ }
+
+ return titleList;
+ }
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Services/PresetService.cs b/win/CS/HandBrake.ApplicationServices/Services/PresetService.cs
new file mode 100644
index 000000000..f46a8bad1
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Services/PresetService.cs
@@ -0,0 +1,403 @@
+/* PresetService.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Services
+{
+ using System;
+ using System.Collections.Generic;
+ using System.Collections.ObjectModel;
+ using System.ComponentModel;
+ using System.Diagnostics;
+ using System.IO;
+ using System.Linq;
+ using System.Text.RegularExpressions;
+ using System.Windows.Data;
+ using System.Xml.Serialization;
+
+ using HandBrake.ApplicationServices.Model;
+ using HandBrake.ApplicationServices.Services.Interfaces;
+
+ /// <summary>
+ /// The preset service manages HandBrake's presets
+ /// </summary>
+ public class PresetService : IPresetService
+ {
+ /**
+ * TODO:
+ * - Wire this into the Forms and WPF UI's
+ * - Note: This is untested so far. It'll likely need fixes before it can be used.
+ * - Maybe change the collection to a dictionary to allow easier lookups?
+ **/
+
+ #region Private Variables
+
+ /// <summary>
+ /// XML Serializer
+ /// </summary>
+ private static readonly XmlSerializer Ser = new XmlSerializer(typeof(List<Preset>));
+
+ /// <summary>
+ /// The User Preset file
+ /// </summary>
+ private readonly string userPresetFile = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\user_presets.xml";
+
+ /// <summary>
+ /// The Built In Presets File
+ /// </summary>
+ private readonly string builtInPresetFile = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\presets.xml";
+
+ /// <summary>
+ /// A Collection of presets
+ /// </summary>
+ private ObservableCollection<Preset> presets = new ObservableCollection<Preset>();
+
+ #endregion
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="PresetService"/> class.
+ /// </summary>
+ public PresetService()
+ {
+ // this.Presets = CollectionViewSource.GetDefaultView(this.presets);
+ this.LoadPresets();
+ }
+
+ /// <summary>
+ /// Gets or sets a Collection of presets.
+ /// </summary>
+ public ObservableCollection<Preset> Presets
+ {
+ get
+ {
+ return this.presets;
+ }
+
+ set
+ {
+ this.presets = value;
+ }
+ }
+
+ /// <summary>
+ /// The last preset added.
+ /// </summary>
+ public Preset LastPresetAdded { get; set; }
+
+ #region Public Methods
+
+ /// <summary>
+ /// Add a new preset to the system
+ /// </summary>
+ /// <param name="preset">
+ /// A Preset to add
+ /// </param>
+ /// <returns>
+ /// True if added,
+ /// False if name already exists
+ /// </returns>
+ public bool Add(Preset preset)
+ {
+ if (this.CheckIfPresetExists(preset.Name) == false)
+ {
+ this.presets.Add(preset);
+ this.LastPresetAdded = preset;
+
+ // Update the presets file
+ this.UpdatePresetFiles();
+ return true;
+ }
+
+ return false;
+ }
+
+ /// <summary>
+ /// Update a preset
+ /// </summary>
+ /// <param name="update">
+ /// The updated preset
+ /// </param>
+ public void Update(Preset update)
+ {
+ // TODO - Change this to be a lookup
+ foreach (Preset preset in this.presets)
+ {
+ if (preset.Name == update.Name)
+ {
+ preset.Query = update.Query;
+ break;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Remove a preset with a given name from either the built in or user preset list.
+ /// </summary>
+ /// <param name="preset">
+ /// The Preset to remove
+ /// </param>
+ public void Remove(Preset preset)
+ {
+ this.presets.Remove(preset);
+ this.UpdatePresetFiles();
+ }
+
+ /// <summary>
+ /// Remove a group of presets by category
+ /// </summary>
+ /// <param name="category">
+ /// The Category to remove
+ /// </param>
+ public void RemoveGroup(string category)
+ {
+ List<Preset> removeList = this.presets.Where(p => p.Category == category).ToList();
+ foreach (Preset preset in removeList)
+ {
+ this.presets.Remove(preset);
+ }
+
+ this.UpdatePresetFiles();
+ }
+
+ /// <summary>
+ /// Get a Preset
+ /// </summary>
+ /// <param name="name">
+ /// The name of the preset to get
+ /// </param>
+ /// <returns>
+ /// A Preset or null object
+ /// </returns>
+ public Preset GetPreset(string name)
+ {
+ return this.presets.FirstOrDefault(item => item.Name == name);
+ }
+
+ /// <summary>
+ /// Clear Built-in Presets
+ /// </summary>
+ public void ClearBuiltIn()
+ {
+ List<Preset> remove = this.presets.Where(p => p.IsBuildIn).ToList();
+ foreach (Preset preset in remove)
+ {
+ this.presets.Remove(preset);
+ }
+ }
+
+ /// <summary>
+ /// Clear all presets
+ /// </summary>
+ public void ClearAll()
+ {
+ this.presets.Clear();
+ }
+
+ /// <summary>
+ /// Reads the CLI's CLI output format and load's them into the preset List Preset
+ /// </summary>
+ /// <param name="cliPath">
+ /// The Path to the CLI, leave blank for current folder.
+ /// </param>
+ public void UpdateBuiltInPresets(string cliPath)
+ {
+ // Create a new tempory file and execute the CLI to get the built in Presets.
+ string handbrakeCLIPath = Path.Combine(cliPath, "HandBrakeCLI.exe");
+ string presetsPath = Path.Combine(Path.GetTempPath(), "temp_presets.dat");
+ string strCmdLine = String.Format(@"cmd /c """"{0}"" --preset-list >""{1}"" 2>&1""", handbrakeCLIPath, presetsPath);
+
+ ProcessStartInfo getPresets = new ProcessStartInfo("CMD.exe", strCmdLine) { WindowStyle = ProcessWindowStyle.Hidden };
+
+ Process hbproc = Process.Start(getPresets);
+ hbproc.WaitForExit();
+ hbproc.Dispose();
+ hbproc.Close();
+
+ // Clear the current built in Presets and now parse the tempory Presets file.
+ this.ClearBuiltIn();
+
+ if (File.Exists(presetsPath))
+ {
+ StreamReader presetInput = new StreamReader(presetsPath);
+
+ string category = String.Empty;
+
+ while (!presetInput.EndOfStream)
+ {
+ string line = presetInput.ReadLine();
+
+ // Found the beginning of a preset block
+ if (line != null && line.Contains("<") && !line.Contains("<<"))
+ {
+ category = line.Replace("<", string.Empty).Trim();
+ }
+
+ // Found a preset
+ if (line != null && line.Contains("+"))
+ {
+ Regex r = new Regex("(: )"); // Split on hyphens.
+ string[] presetName = r.Split(line);
+
+ bool pic = false;
+ if (presetName[2].Contains("crop"))
+ {
+ pic = true;
+ }
+
+ Preset newPreset = new Preset
+ {
+ Category = category,
+ Name = presetName[0].Replace("+", string.Empty).Trim(),
+ Query = presetName[2],
+ Version = Init.Version,
+ CropSettings = pic,
+ Description = string.Empty, // Maybe one day we will populate this.
+ IsBuildIn = true
+ };
+ this.presets.Add(newPreset);
+ }
+ }
+ presetInput.Close();
+ presetInput.Dispose();
+ }
+
+ // Finally, Create a new or update the current Presets.xml file
+ this.UpdatePresetFiles();
+ }
+
+ /// <summary>
+ /// Check if the built in Presets stored are not out of date.
+ /// Update them if they are.
+ /// </summary>
+ /// <returns>true if out of date</returns>
+ public bool CheckIfPresetsAreOutOfDate()
+ {
+ // Update built-in Presets if the built-in Presets belong to an older version.
+ if (this.presets.Count != 0)
+ {
+ if (this.presets[0].Version != Init.Version)
+ {
+ this.UpdateBuiltInPresets(string.Empty);
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /// <summary>
+ /// Check if the preset "name" exists in either Presets or UserPresets lists.
+ /// </summary>
+ /// <param name="name">Name of the preset</param>
+ /// <returns>True if found</returns>
+ public bool CheckIfPresetExists(string name)
+ {
+ return name == string.Empty || this.presets.Any(item => item.Name == name);
+ }
+
+ #endregion
+
+ #region Private Helpers
+
+ /// <summary>
+ /// Recover from a courrpted preset file
+ /// Add .old to the current filename, and delete the current file.
+ /// </summary>
+ /// <param name="file">
+ /// The broken presets file.
+ /// </param>
+ private static void RecoverFromCorruptedPresetFile(string file)
+ {
+ // Recover from Error.
+ if (File.Exists(file))
+ {
+ string disabledFile = file + ".old";
+ File.Move(file, disabledFile);
+ if (File.Exists(file))
+ {
+ File.Delete(file);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Load in the Built-in and User presets into the collection
+ /// </summary>
+ private void LoadPresets()
+ {
+ // First clear the Presets arraylists
+ this.presets.Clear();
+
+ // Load in the users Presets from UserPresets.xml
+ try
+ {
+ if (File.Exists(this.builtInPresetFile))
+ {
+ StreamReader reader = new StreamReader(this.builtInPresetFile);
+ List<Preset> list = (List<Preset>)Ser.Deserialize(reader);
+ foreach (Preset preset in list)
+ {
+ this.presets.Add(preset);
+ }
+
+ reader.Close();
+ }
+ }
+ catch (Exception)
+ {
+ RecoverFromCorruptedPresetFile(this.builtInPresetFile);
+ this.UpdateBuiltInPresets(string.Empty);
+ }
+
+ // Load in the users Presets from UserPresets.xml
+ try
+ {
+ if (File.Exists(this.userPresetFile))
+ {
+ StreamReader reader = new StreamReader(this.userPresetFile);
+ List<Preset> list = (List<Preset>)Ser.Deserialize(reader);
+ foreach (Preset preset in list)
+ {
+ this.presets.Add(preset);
+ }
+
+ reader.Close();
+ }
+ }
+ catch (Exception)
+ {
+ RecoverFromCorruptedPresetFile(this.userPresetFile);
+ }
+ }
+
+ /// <summary>
+ /// Update the preset files
+ /// </summary>
+ private void UpdatePresetFiles()
+ {
+ try
+ {
+ using (FileStream strm = new FileStream(this.builtInPresetFile, FileMode.Create, FileAccess.Write))
+ {
+ Ser.Serialize(strm, this.presets.Where(p => p.IsBuildIn).ToList());
+ strm.Close();
+ strm.Dispose();
+ }
+
+ using (FileStream strm = new FileStream(this.userPresetFile, FileMode.Create, FileAccess.Write))
+ {
+ Ser.Serialize(strm, this.presets.Where(p => p.IsBuildIn == false).ToList());
+ strm.Close();
+ strm.Dispose();
+ }
+ }
+ catch (Exception exc)
+ {
+ throw new Exception("Unable to write to the file. Please make sure the location has the correct permissions for file writing.\n Error Information: \n\n", exc);
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Services/QueueManager.cs b/win/CS/HandBrake.ApplicationServices/Services/QueueManager.cs
new file mode 100644
index 000000000..7f723b8b4
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Services/QueueManager.cs
@@ -0,0 +1,340 @@
+/* QueueManager.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Services
+{
+ using System;
+ using System.Collections.Generic;
+ using System.Collections.ObjectModel;
+ using System.IO;
+ using System.Linq;
+ using System.Windows.Forms;
+ using System.Xml.Serialization;
+
+ using HandBrake.ApplicationServices.Model;
+ using HandBrake.ApplicationServices.Services.Interfaces;
+
+ using EventArgs = System.EventArgs;
+
+ /// <summary>
+ /// The Queue Manager.
+ /// Thread Safe.
+ /// </summary>
+ public class QueueManager : IQueueManager
+ {
+ /*
+ * TODO
+ * - Rewrite the batch script generator.
+ * - QueueTask, switch everything to use the Task property, which is a model of all settings.
+ */
+
+ #region Private Variables
+
+ /// <summary>
+ /// A Lock object to maintain thread safety
+ /// </summary>
+ static readonly object QueueLock = new object();
+
+ /// <summary>
+ /// The Queue of Job objects
+ /// </summary>
+ private readonly List<QueueTask> queue = new List<QueueTask>();
+
+ /// <summary>
+ /// HandBrakes Queue file with a place holder for an extra string.
+ /// </summary>
+ private readonly string queueFile;
+
+ /// <summary>
+ /// The ID of the job last added
+ /// </summary>
+ private int lastJobId;
+
+ /// <summary>
+ /// The instance Id of this HandBrake instance.
+ /// </summary>
+ private int instanceId;
+
+ #endregion
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="QueueManager"/> class.
+ /// </summary>
+ /// <param name="instanceId">
+ /// The instance Id.
+ /// </param>
+ public QueueManager(int instanceId)
+ {
+ this.instanceId = instanceId;
+
+ // If this is the first instance, just use the main queue file, otherwise add the instance id to the filename.
+ this.queueFile = instanceId == 0 ? "hb_queue_recovery.xml" : string.Format("hb_queue_recovery{0}.xml", instanceId);
+ }
+
+ #region Events
+ /// <summary>
+ /// Fires when a job is Added, Removed or Re-Ordered.
+ /// Should be used for triggering an update of the Queue Window.
+ /// </summary>
+ public event EventHandler QueueChanged;
+
+ /// <summary>
+ /// Invoke the Queue Changed Event
+ /// </summary>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void InvokeQueueChanged(EventArgs e)
+ {
+ try
+ {
+ this.BackupQueue(string.Empty);
+ }
+ catch (Exception)
+ {
+ // Do Nothing.
+ }
+
+ EventHandler handler = this.QueueChanged;
+ if (handler != null)
+ {
+ handler(this, e);
+ }
+ }
+
+ #endregion
+
+ #region Public Properties
+
+ /// <summary>
+ /// Gets or sets Last Processed Job.
+ /// This is set when the job is poped of the queue by GetNextJobForProcessing();
+ /// </summary>
+ public QueueTask LastProcessedJob { get; set; }
+
+ /// <summary>
+ /// Gets the number of jobs in the queue;
+ /// </summary>
+ public int Count
+ {
+ get
+ {
+ return this.queue.Count;
+ }
+ }
+
+ /// <summary>
+ /// Gets The current queue.
+ /// </summary>
+ public ReadOnlyCollection<QueueTask> Queue
+ {
+ get
+ {
+ return this.queue.AsReadOnly();
+ }
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Add a job to the Queue.
+ /// This method is Thread Safe.
+ /// </summary>
+ /// <param name="job">
+ /// The encode Job object.
+ /// </param>
+ public void Add(QueueTask job)
+ {
+ lock (QueueLock)
+ {
+ // Tag the job with an ID
+ job.Id = lastJobId++;
+ queue.Add(job);
+ InvokeQueueChanged(EventArgs.Empty);
+ }
+ }
+
+ /// <summary>
+ /// Remove a job from the Queue.
+ /// This method is Thread Safe
+ /// </summary>
+ /// <param name="job">
+ /// The job.
+ /// </param>
+ public void Remove(QueueTask job)
+ {
+ lock (QueueLock)
+ {
+ queue.Remove(job);
+ InvokeQueueChanged(EventArgs.Empty);
+ }
+ }
+
+ /// <summary>
+ /// Get the first job on the queue for processing.
+ /// This also removes the job from the Queue and sets the LastProcessedJob
+ /// </summary>
+ /// <returns>
+ /// An encode Job object.
+ /// </returns>
+ public QueueTask GetNextJobForProcessing()
+ {
+ if (this.queue.Count > 0)
+ {
+ QueueTask job = this.queue[0];
+ this.LastProcessedJob = job;
+ this.Remove(job); // Remove the item which we are about to pass out.
+
+ return job;
+ }
+
+ return null;
+ }
+
+ /// <summary>
+ /// Moves an item up one position in the queue.
+ /// </summary>
+ /// <param name="index">The zero-based location of the job in the queue.</param>
+ public void MoveUp(int index)
+ {
+ if (index > 0)
+ {
+ QueueTask item = queue[index];
+
+ queue.RemoveAt(index);
+ queue.Insert((index - 1), item);
+ }
+
+ this.InvokeQueueChanged(EventArgs.Empty);
+ }
+
+ /// <summary>
+ /// Moves an item down one position in the queue.
+ /// </summary>
+ /// <param name="index">The zero-based location of the job in the queue.</param>
+ public void MoveDown(int index)
+ {
+ if (index < this.queue.Count - 1)
+ {
+ QueueTask item = this.queue[index];
+
+ this.queue.RemoveAt(index);
+ this.queue.Insert((index + 1), item);
+ }
+
+ this.InvokeQueueChanged(EventArgs.Empty);
+ }
+
+ /// <summary>
+ /// Backup any changes to the queue file
+ /// </summary>
+ /// <param name="exportPath">
+ /// If this is not null or empty, this will be used instead of the standard backup location.
+ /// </param>
+ public void BackupQueue(string exportPath)
+ {
+ string appDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"HandBrake\");
+ string tempPath = !string.IsNullOrEmpty(exportPath) ? exportPath : appDataPath + string.Format(this.queueFile, string.Empty);
+
+ using (FileStream strm = new FileStream(tempPath, FileMode.Create, FileAccess.Write))
+ {
+ XmlSerializer serializer = new XmlSerializer(typeof(List<QueueTask>));
+ serializer.Serialize(strm, queue);
+ strm.Close();
+ strm.Dispose();
+ }
+ }
+
+ /// <summary>
+ /// Restore a Queue from file or from the queue backup file.
+ /// </summary>
+ /// <param name="importPath">
+ /// The import path. String.Empty or null will result in the default file being loaded.
+ /// </param>
+ public void RestoreQueue(string importPath)
+ {
+ string appDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"HandBrake\");
+ string tempPath = !string.IsNullOrEmpty(importPath) ? importPath : (appDataPath + string.Format(this.queueFile, string.Empty));
+
+ if (File.Exists(tempPath))
+ {
+ using (FileStream strm = new FileStream((!string.IsNullOrEmpty(importPath) ? importPath : tempPath), FileMode.Open, FileAccess.Read))
+ {
+ if (strm.Length != 0)
+ {
+ XmlSerializer serializer = new XmlSerializer(typeof(List<QueueTask>));
+
+ List<QueueTask> list = serializer.Deserialize(strm) as List<QueueTask>;
+
+ if (list != null)
+ foreach (QueueTask item in list)
+ this.queue.Add(item);
+
+ this.InvokeQueueChanged(EventArgs.Empty);
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// Checks the current queue for an existing instance of the specified destination.
+ /// </summary>
+ /// <param name="destination">The destination of the encode.</param>
+ /// <returns>Whether or not the supplied destination is already in the queue.</returns>
+ public bool CheckForDestinationPathDuplicates(string destination)
+ {
+ return this.queue.Any(checkItem => checkItem.Destination.Contains(destination.Replace("\\\\", "\\")));
+ }
+
+ /// <summary>
+ /// Writes the current state of the queue in the form of a batch (.bat) file.
+ /// </summary>
+ /// <param name="file">
+ /// The location of the file to write the batch file to.
+ /// </param>
+ /// <returns>
+ /// The write batch script to file.
+ /// </returns>
+ public bool WriteBatchScriptToFile(string file)
+ {
+ string queries = string.Empty;
+ foreach (QueueTask queueItem in this.queue)
+ {
+ string qItem = queueItem.Query;
+ string fullQuery = '"' + Application.StartupPath + "\\HandBrakeCLI.exe" + '"' + qItem;
+
+ if (queries == string.Empty)
+ queries = queries + fullQuery;
+ else
+ queries = queries + " && " + fullQuery;
+ }
+ string strCmdLine = queries;
+
+ if (file != string.Empty)
+ {
+ try
+ {
+ // Create a StreamWriter and open the file, Write the batch file query to the file and
+ // Close the stream
+ using (StreamWriter line = new StreamWriter(file))
+ {
+ line.WriteLine(strCmdLine);
+ }
+
+ return true;
+ }
+ catch (Exception exc)
+ {
+ throw new Exception("Unable to write to the file. Please make sure that the location has the correct permissions for file writing.", exc);
+ }
+ }
+ return false;
+ }
+
+ #endregion
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Services/QueueProcessor.cs b/win/CS/HandBrake.ApplicationServices/Services/QueueProcessor.cs
new file mode 100644
index 000000000..130e1fc46
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Services/QueueProcessor.cs
@@ -0,0 +1,279 @@
+/* Queue.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Services
+{
+ using System;
+ using System.Diagnostics;
+ using System.Windows.Forms;
+
+ using HandBrake.ApplicationServices.EventArgs;
+ using HandBrake.ApplicationServices.Functions;
+ using HandBrake.ApplicationServices.Model;
+ using HandBrake.ApplicationServices.Services.Interfaces;
+
+ /// <summary>
+ /// The HandBrake Queue
+ /// </summary>
+ public class QueueProcessor : IQueueProcessor
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="QueueProcessor"/> class.
+ /// </summary>
+ /// <param name="queueManager">
+ /// The queue manager.
+ /// </param>
+ /// <param name="encodeService">
+ /// The encode Service.
+ /// </param>
+ /// <exception cref="ArgumentNullException">
+ /// </exception>
+ public QueueProcessor(IQueueManager queueManager, IEncode encodeService)
+ {
+ this.QueueManager = queueManager;
+ this.EncodeService = encodeService;
+
+ if (this.QueueManager == null)
+ {
+ throw new ArgumentNullException("queueManager");
+ }
+
+ if (this.QueueManager == null)
+ {
+ throw new ArgumentNullException("queueManager");
+ }
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="QueueProcessor"/> class.
+ /// This call also initializes the Encode and QueueManager services
+ /// </summary>
+ /// <param name="instanceId">
+ /// The instance id.
+ /// </param>
+ public QueueProcessor(int instanceId)
+ {
+ this.EncodeService = new Encode();
+ this.QueueManager = new QueueManager(instanceId);
+ }
+
+ #region Events
+
+ /// <summary>
+ /// Queue Progess Status
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The QueueProgressEventArgs.
+ /// </param>
+ public delegate void QueueProgressStatus(object sender, QueueProgressEventArgs e);
+
+ /// <summary>
+ /// Fires when the Queue has started
+ /// </summary>
+ public event QueueProgressStatus JobProcessingStarted;
+
+ /// <summary>
+ /// Fires when a pause to the encode queue has been requested.
+ /// </summary>
+ public event EventHandler QueuePaused;
+
+ /// <summary>
+ /// Fires when the entire encode queue has completed.
+ /// </summary>
+ public event EventHandler QueueCompleted;
+
+ /// <summary>
+ /// Invoke the JobProcessingStarted event
+ /// </summary>
+ /// <param name="e">
+ /// The QueueProgressEventArgs.
+ /// </param>
+ private void InvokeJobProcessingStarted(QueueProgressEventArgs e)
+ {
+ QueueProgressStatus handler = this.JobProcessingStarted;
+ if (handler != null)
+ {
+ handler(this, e);
+ }
+ }
+
+ /// <summary>
+ /// Invoke the QueuePaused event
+ /// </summary>
+ /// <param name="e">
+ /// The EventArgs.
+ /// </param>
+ private void InvokeQueuePaused(EventArgs e)
+ {
+ EventHandler handler = this.QueuePaused;
+ if (handler != null)
+ {
+ handler(this, e);
+ }
+ }
+
+ /// <summary>
+ /// Invoke the QueueCompleted event.
+ /// </summary>
+ /// <param name="e">
+ /// The EventArgs.
+ /// </param>
+ private void InvokeQueueCompleted(EventArgs e)
+ {
+ this.IsProcessing = false;
+
+ EventHandler handler = this.QueueCompleted;
+ if (handler != null)
+ {
+ handler(this, e);
+ }
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets a value indicating whether IsProcessing.
+ /// </summary>
+ public bool IsProcessing { get; private set; }
+
+ /// <summary>
+ /// Gets the IEncodeService instance.
+ /// </summary>
+ public IEncode EncodeService { get; private set; }
+
+ /// <summary>
+ /// Gets the IQueueManager instance.
+ /// </summary>
+ public IQueueManager QueueManager { get; private set; }
+
+ #endregion
+
+ /// <summary>
+ /// Starts encoding the first job in the queue and continues encoding until all jobs
+ /// have been encoded.
+ /// </summary>
+ public void Start()
+ {
+ if (IsProcessing)
+ {
+ throw new Exception("Already Processing the Queue");
+ }
+
+ IsProcessing = true;
+ this.EncodeService.EncodeCompleted += this.EncodeServiceEncodeCompleted;
+ this.ProcessNextJob();
+ }
+
+ /// <summary>
+ /// Requests a pause of the encode queue.
+ /// </summary>
+ public void Pause()
+ {
+ this.EncodeService.EncodeCompleted -= this.EncodeServiceEncodeCompleted;
+ this.InvokeQueuePaused(EventArgs.Empty);
+ this.IsProcessing = false;
+ }
+
+ /// <summary>
+ /// After an encode is complete, move onto the next job.
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The EncodeCompletedEventArgs.
+ /// </param>
+ private void EncodeServiceEncodeCompleted(object sender, EncodeCompletedEventArgs e)
+ {
+ // Growl
+ if (Init.GrowlEncode)
+ GrowlCommunicator.Notify("Encode Completed",
+ "Put down that cocktail...\nyour Handbrake encode is done.");
+
+ if (!e.Successful)
+ {
+ this.Pause();
+ MessageBox.Show(e.Exception + e.ErrorInformation);
+ }
+
+ // Handling Log Data
+ this.EncodeService.ProcessLogs(this.QueueManager.LastProcessedJob.Destination);
+
+ // Move onto the next job.
+ this.ProcessNextJob();
+ }
+
+ /// <summary>
+ /// Run through all the jobs on the queue.
+ /// </summary>
+ private void ProcessNextJob()
+ {
+ if (this.EncodeService.IsEncoding || !this.IsProcessing)
+ {
+ // We don't want to try start a second encode, so just return out. The event will trigger the next encode automatically.
+ // Also, we don't want to start a new encode if we are paused.
+ return;
+ }
+
+ QueueTask job = this.QueueManager.GetNextJobForProcessing();
+ if (job != null)
+ {
+ this.EncodeService.Start(job, true);
+ this.InvokeJobProcessingStarted(new QueueProgressEventArgs(job));
+ }
+ else
+ {
+ // No more jobs to process, so unsubscribe the event
+ this.EncodeService.EncodeCompleted -= this.EncodeServiceEncodeCompleted;
+
+ // Fire the event to tell connected services.
+ this.InvokeQueueCompleted(EventArgs.Empty);
+
+ // Run the After encode completeion work
+ Finish();
+ }
+ }
+
+ /// <summary>
+ /// Perform an action after an encode. e.g a shutdown, standby, restart etc.
+ /// </summary>
+ private static void Finish()
+ {
+ // Growl
+ if (Init.GrowlQueue)
+ GrowlCommunicator.Notify("Queue Completed", "Put down that cocktail...\nyour Handbrake queue is done.");
+
+ // Do something whent he encode ends.
+ switch (Init.CompletionOption)
+ {
+ case "Shutdown":
+ Process.Start("Shutdown", "-s -t 60");
+ break;
+ case "Log off":
+ Win32.ExitWindowsEx(0, 0);
+ break;
+ case "Suspend":
+ Application.SetSuspendState(PowerState.Suspend, true, true);
+ break;
+ case "Hibernate":
+ Application.SetSuspendState(PowerState.Hibernate, true, true);
+ break;
+ case "Lock System":
+ Win32.LockWorkStation();
+ break;
+ case "Quit HandBrake":
+ Application.Exit();
+ break;
+ default:
+ break;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Services/ScanService.cs b/win/CS/HandBrake.ApplicationServices/Services/ScanService.cs
new file mode 100644
index 000000000..7064d9358
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Services/ScanService.cs
@@ -0,0 +1,355 @@
+/* Scan.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Services
+{
+ using System;
+ using System.Diagnostics;
+ using System.IO;
+ using System.Text;
+ using System.Threading;
+ using System.Windows.Forms;
+
+ using HandBrake.ApplicationServices.EventArgs;
+ using HandBrake.ApplicationServices.Parsing;
+ using HandBrake.ApplicationServices.Services.Interfaces;
+ using HandBrake.ApplicationServices.Utilities;
+
+ /// <summary>
+ /// Scan a Source
+ /// </summary>
+ public class ScanService : IScan
+ {
+ #region Private Variables
+
+ /// <summary>
+ /// A Lock object
+ /// </summary>
+ private static readonly object locker = new object();
+
+ /// <summary>
+ /// The CLI data parser
+ /// </summary>
+ private Parser readData;
+
+ /// <summary>
+ /// The Log Buffer
+ /// </summary>
+ private StringBuilder logBuffer;
+
+ /// <summary>
+ /// The line number thats been read to in the log file
+ /// </summary>
+ private int logFilePosition;
+
+ /// <summary>
+ /// The Process belonging to the CLI
+ /// </summary>
+ private Process hbProc;
+
+ #endregion
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="ScanService"/> class.
+ /// </summary>
+ public ScanService()
+ {
+ }
+
+ #region Events
+
+ /// <summary>
+ /// Scan has Started
+ /// </summary>
+ public event EventHandler ScanStared;
+
+ /// <summary>
+ /// Scan has completed
+ /// </summary>
+ public event ScanCompletedStatus ScanCompleted;
+
+ /// <summary>
+ /// Encode process has progressed
+ /// </summary>
+ public event ScanProgessStatus ScanStatusChanged;
+
+ #endregion
+
+ #region Public Properties
+
+ /// <summary>
+ /// Gets a value indicating whether IsScanning.
+ /// </summary>
+ public bool IsScanning { get; private set; }
+
+ /// <summary>
+ /// Gets the Souce Data.
+ /// </summary>
+ public Source SouceData { get; private set; }
+
+ /// <summary>
+ /// Gets ActivityLog.
+ /// </summary>
+ public string ActivityLog
+ {
+ get
+ {
+ if (IsScanning)
+ return readData.Buffer.ToString();
+
+ if (logBuffer == null)
+ {
+ ResetLogReader(false);
+ ReadLastScanFile();
+ }
+
+ return logBuffer != null ? logBuffer.ToString() : string.Empty;
+ }
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Scan a Source Path.
+ /// Title 0: scan all
+ /// </summary>
+ /// <param name="sourcePath">Path to the file to scan</param>
+ /// <param name="title">int title number. 0 for scan all</param>
+ public void Scan(string sourcePath, int title)
+ {
+ Thread t = new Thread(unused => this.ScanSource(sourcePath, title));
+ t.Start();
+ }
+
+ /// <summary>
+ /// Kill the scan
+ /// </summary>
+ public void Stop()
+ {
+ try
+ {
+ // Try to clean things up as best as possible.
+ if (this.readData != null)
+ {
+ this.readData.OnScanProgress -= this.OnScanProgress;
+ }
+
+ if (hbProc != null && !hbProc.HasExited)
+ hbProc.Kill();
+ }
+ catch
+ {
+ // We don't really need to notify the user of any errors here.
+ }
+ }
+ #endregion
+
+ #region Private Methods
+
+ /// <summary>
+ /// Start a scan for a given source path and title
+ /// </summary>
+ /// <param name="sourcePath">Path to the source file</param>
+ /// <param name="title">the title number to look at</param>
+ private void ScanSource(object sourcePath, int title)
+ {
+ try
+ {
+ IsScanning = true;
+ if (this.ScanStared != null)
+ {
+ this.ScanStared(this, new EventArgs());
+ }
+
+ ResetLogReader(true);
+
+ string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");
+ string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) +
+ "\\HandBrake\\logs";
+ string dvdInfoPath = Path.Combine(
+ logDir,
+ string.Format("last_scan_log{0}.txt", Init.InstanceId == 0 ? string.Empty : Init.InstanceId.ToString()));
+
+ // Make we don't pick up a stale last_encode_log.txt (and that we have rights to the file)
+ if (File.Exists(dvdInfoPath))
+ {
+ File.Delete(dvdInfoPath);
+ }
+
+ string extraArguments = string.Empty;
+ if (Init.DisableDvdNav)
+ {
+ extraArguments = " --no-dvdnav";
+ }
+
+ if (title > 0)
+ {
+ extraArguments += " --scan ";
+ }
+
+ // Quick fix for "F:\\" style paths. Just get rid of the \\ so the CLI doesn't fall over.
+ // Sould probably clean up the escaping of the strings later.
+ string source = sourcePath.ToString().EndsWith("\\") ? sourcePath.ToString() : "\"" + sourcePath + "\"";
+
+ this.hbProc = new Process
+ {
+ StartInfo =
+ {
+ FileName = handbrakeCLIPath,
+ Arguments = String.Format(@" -i ""{0}"" -t{1} {2} -v ", sourcePath, title, extraArguments),
+ RedirectStandardOutput = true,
+ RedirectStandardError = true,
+ UseShellExecute = false,
+ CreateNoWindow = true
+ }
+ };
+
+ string command = String.Format(@" -i {0} -t{1} {2} -v ", source, title, extraArguments);
+
+ this.hbProc = new Process
+ {
+ StartInfo =
+ {
+ FileName = handbrakeCLIPath,
+ Arguments = command,
+ RedirectStandardOutput = true,
+ RedirectStandardError = true,
+ UseShellExecute = false,
+ CreateNoWindow = true
+ }
+ };
+
+ // Start the Scan
+ this.hbProc.Start();
+
+ this.readData = new Parser(this.hbProc.StandardError.BaseStream);
+ this.readData.OnScanProgress += this.OnScanProgress;
+ this.SouceData = Source.Parse(this.readData);
+
+ // Write the Buffer out to file.
+ using (StreamWriter scanLog = new StreamWriter(dvdInfoPath))
+ {
+ // Only write the log file to disk if it's less than 100MB.
+ if (this.readData.Buffer.Length < 100000000)
+ {
+ scanLog.WriteLine(UtilityService.CreateCliLogHeader(null));
+ scanLog.Write(this.readData.Buffer);
+ logBuffer.AppendLine(this.readData.Buffer.ToString());
+ }
+ else
+ {
+ throw new Exception(
+ "The Log file has not been written to disk as it has grown above the 100MB limit. This indicates there was a problem during the scan process.");
+ }
+ }
+
+ IsScanning = false;
+
+ if (this.ScanCompleted != null)
+ {
+ this.ScanCompleted(this, new ScanCompletedEventArgs(true, null, string.Empty));
+ }
+ }
+ catch (Exception exc)
+ {
+ this.Stop();
+
+ if (this.ScanCompleted != null)
+ this.ScanCompleted(this, new ScanCompletedEventArgs(false, exc, "An Error has occured in ScanService.ScanSource()"));
+ }
+ }
+
+ /// <summary>
+ /// Read the log file
+ /// </summary>
+ private void ReadLastScanFile()
+ {
+ lock (locker)
+ {
+ // last_encode_log.txt is the primary log file. Since .NET can't read this file whilst the CLI is outputing to it (Not even in read only mode),
+ // we'll need to make a copy of it.
+ string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) +
+ "\\HandBrake\\logs";
+ string logFile = Path.Combine(logDir, string.Format("last_scan_log{0}.txt", Init.InstanceId == 0 ? string.Empty : Init.InstanceId.ToString()));
+ string logFile2 = Path.Combine(logDir, string.Format("tmp_appReadable_log{0}.txt", Init.InstanceId == 0 ? string.Empty : Init.InstanceId.ToString()));
+
+ try
+ {
+ // Make sure the application readable log file does not already exist. FileCopy fill fail if it does.
+ if (File.Exists(logFile2))
+ File.Delete(logFile2);
+
+ // Copy the log file.
+ if (File.Exists(logFile))
+ File.Copy(logFile, logFile2, true);
+ else
+ {
+ ResetLogReader(true);
+ return;
+ }
+
+ // Start the Reader
+ // Only use text which continues on from the last read line
+ StreamReader sr = new StreamReader(logFile2);
+ string line;
+ int i = 1;
+ while ((line = sr.ReadLine()) != null)
+ {
+ if (i > logFilePosition)
+ {
+ logBuffer.AppendLine(line);
+ logFilePosition++;
+ }
+ i++;
+ }
+ sr.Close();
+ sr.Dispose();
+ }
+ catch (Exception exc)
+ {
+ ResetLogReader(true);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Reset the Log Reader
+ /// </summary>
+ /// <param name="addHeader">
+ /// The add Header.
+ /// </param>
+ private void ResetLogReader(bool addHeader)
+ {
+ logFilePosition = 0;
+ logBuffer = new StringBuilder();
+ if (addHeader)
+ logBuffer.AppendLine(UtilityService.CreateCliLogHeader(null));
+ }
+
+ /// <summary>
+ /// Fire an event when the scan process progresses
+ /// </summary>
+ /// <param name="sender">the sender</param>
+ /// <param name="currentTitle">the current title being scanned</param>
+ /// <param name="titleCount">the total number of titles</param>
+ private void OnScanProgress(object sender, int currentTitle, int titleCount)
+ {
+ ScanProgressEventArgs eventArgs = new ScanProgressEventArgs
+ {
+ CurrentTitle = currentTitle,
+ Titles = titleCount
+ };
+
+ if (this.ScanStatusChanged != null)
+ {
+ this.ScanStatusChanged(this, eventArgs);
+ }
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Services/UpdateService.cs b/win/CS/HandBrake.ApplicationServices/Services/UpdateService.cs
new file mode 100644
index 000000000..5e65021e5
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Services/UpdateService.cs
@@ -0,0 +1,97 @@
+namespace HandBrake.ApplicationServices.Services
+{
+ using System;
+ using System.IO;
+ using System.Net;
+ using System.Threading;
+
+ using HandBrake.ApplicationServices.Model.General;
+ using HandBrake.ApplicationServices.Utilities;
+
+ /// <summary>
+ /// The Update Service
+ /// </summary>
+ public class UpdateService
+ {
+ /// <summary>
+ /// Begins checking for an update to HandBrake.
+ /// </summary>
+ /// <param name="callback">
+ /// The method that will be called when the check is finished.
+ /// </param>
+ /// <param name="debug">
+ /// Whether or not to execute this in debug mode.
+ /// </param>
+ /// <param name="url">
+ /// The url.
+ /// </param>
+ /// <param name="currentBuild">
+ /// The current Build.
+ /// </param>
+ /// <param name="skipBuild">
+ /// The skip Build.
+ /// </param>
+ /// <param name="currentVersion">
+ /// The current Version.
+ /// </param>
+ public static void BeginCheckForUpdates(AsyncCallback callback, bool debug, string url, int currentBuild, int skipBuild, string currentVersion)
+ {
+ ThreadPool.QueueUserWorkItem(delegate
+ {
+ try
+ {
+ // Initialize variables
+ WebRequest request = WebRequest.Create(url);
+ WebResponse response = request.GetResponse();
+ AppcastReader reader = new AppcastReader();
+
+ // Get the data, convert it to a string, and parse it into the AppcastReader
+ reader.GetUpdateInfo(new StreamReader(response.GetResponseStream()).ReadToEnd());
+
+ // Further parse the information
+ string build = reader.Build;
+
+ int latest = int.Parse(build);
+ int current = currentBuild;
+ int skip = skipBuild;
+
+ // If the user wanted to skip this version, don't report the update
+ if (latest == skip)
+ {
+ UpdateCheckInformation info = new UpdateCheckInformation { NewVersionAvailable = false };
+ callback(new UpdateCheckResult(debug, info));
+ return;
+ }
+
+ UpdateCheckInformation info2 = new UpdateCheckInformation
+ {
+ NewVersionAvailable = latest > current,
+ DescriptionUrl = reader.DescriptionUrl,
+ DownloadFile = reader.DownloadFile,
+ Build = reader.Build,
+ Version = reader.Version,
+ };
+ callback(new UpdateCheckResult(debug, info2));
+ }
+ catch (Exception exc)
+ {
+ callback(new UpdateCheckResult(debug, new UpdateCheckInformation { Error = exc }));
+ }
+ });
+ }
+
+ /// <summary>
+ /// End Check for Updates
+ /// </summary>
+ /// <param name="result">
+ /// The result.
+ /// </param>
+ /// <returns>
+ /// Update Check information
+ /// </returns>
+ public static UpdateCheckInformation EndCheckForUpdates(IAsyncResult result)
+ {
+ return ((UpdateCheckResult)result).Result;
+ }
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Settings.StyleCop b/win/CS/HandBrake.ApplicationServices/Settings.StyleCop
new file mode 100644
index 000000000..e61afbf69
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Settings.StyleCop
@@ -0,0 +1,14 @@
+<StyleCopSettings Version="4.3">
+ <Analyzers>
+ <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.DocumentationRules">
+ <Rules>
+ <Rule Name="ElementsMustBeDocumented">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">True</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ </Rules>
+ <AnalyzerSettings />
+ </Analyzer>
+ </Analyzers>
+</StyleCopSettings> \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Utilities/AppcastReader.cs b/win/CS/HandBrake.ApplicationServices/Utilities/AppcastReader.cs
new file mode 100644
index 000000000..8b0053a86
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Utilities/AppcastReader.cs
@@ -0,0 +1,119 @@
+/* AppcastReader.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Utilities
+{
+ using System;
+ using System.IO;
+ using System.Text.RegularExpressions;
+ using System.Xml;
+
+ /// <summary>
+ /// Appcast Reader - Used for parsing HandBrakes update file
+ /// </summary>
+ public class AppcastReader
+ {
+ /// <summary>
+ /// Gets Information about an update to HandBrake
+ /// </summary>
+ public Uri DescriptionUrl { get; private set; }
+
+ /// <summary>
+ /// Gets HandBrake's version from the appcast.xml file.
+ /// </summary>
+ public string Version { get; private set; }
+
+ /// <summary>
+ /// Gets HandBrake's Build from the appcast.xml file.
+ /// </summary>
+ public string Build { get; private set; }
+
+ /// <summary>
+ /// Gets the URL for update file.
+ /// </summary>
+ public string DownloadFile { get; private set; }
+
+ /// <summary>
+ /// Get the build information from the required appcasts. Run before accessing the public vars.
+ /// </summary>
+ /// <param name="input">
+ /// The input.
+ /// </param>
+ public void GetUpdateInfo(string input)
+ {
+ try
+ {
+ // Get the correct Appcast and set input.
+ XmlNode nodeItem = ReadRss(new XmlTextReader(new StringReader(input)));
+ string result = nodeItem.InnerXml;
+
+ // Regular Expressions
+ Match ver = Regex.Match(result, @"sparkle:version=""([0-9]*)\""");
+ Match verShort = Regex.Match(result, @"sparkle:shortVersionString=""(([svn]*)([0-9.\s]*))\""");
+
+ this.Build = ver.ToString().Replace("sparkle:version=", string.Empty).Replace("\"", string.Empty);
+ this.Version = verShort.ToString().Replace("sparkle:shortVersionString=", string.Empty).Replace(
+ "\"", string.Empty);
+ this.DownloadFile = nodeItem["windows"].InnerText;
+ this.DescriptionUrl = new Uri(nodeItem["sparkle:releaseNotesLink"].InnerText);
+ }
+ catch (Exception)
+ {
+ return;
+ }
+ }
+
+ /// <summary>
+ /// Read the RSS file.
+ /// </summary>
+ /// <param name="rssReader">
+ /// The RSS reader
+ /// </param>
+ /// <returns>
+ /// The read rss.
+ /// </returns>
+ private static XmlNode ReadRss(XmlReader rssReader)
+ {
+ XmlNode nodeItem = null;
+ XmlNode nodeChannel = null;
+ XmlNode nodeRss = null;
+
+ XmlDocument rssDoc = new XmlDocument();
+ rssDoc.Load(rssReader);
+
+ foreach (XmlNode t in rssDoc.ChildNodes)
+ {
+ if (t.Name == "rss")
+ {
+ nodeRss = t;
+ }
+ }
+
+ if (nodeRss != null)
+ {
+ foreach (XmlNode t in nodeRss.ChildNodes)
+ {
+ if (t.Name == "channel")
+ {
+ nodeChannel = t;
+ }
+ }
+ }
+
+ if (nodeChannel != null)
+ {
+ foreach (XmlNode t in nodeChannel.ChildNodes)
+ {
+ if (t.Name == "item")
+ {
+ nodeItem = t;
+ }
+ }
+ }
+
+ return nodeItem;
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Utilities/PlistUtility.cs b/win/CS/HandBrake.ApplicationServices/Utilities/PlistUtility.cs
new file mode 100644
index 000000000..ee1ab225a
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Utilities/PlistUtility.cs
@@ -0,0 +1,664 @@
+/* PlistPresetHandler.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Utilities
+{
+ using System;
+ using System.Collections.Generic;
+ using System.IO;
+ using System.Text;
+ using System.Windows.Forms;
+ using System.Xml;
+
+ using HandBrake.ApplicationServices.Functions;
+ using HandBrake.ApplicationServices.Model;
+ using HandBrake.ApplicationServices.Model.Encoding;
+
+ /// <summary>
+ /// Plist Preset Converter
+ /// </summary>
+ public class PlistPresetHandler
+ {
+ /**
+ * TODO:
+ * - Update with the new vfr,pfr,cfr keys
+ * - Clean up this code, it's pretty nasty right now.
+ **/
+
+ #region Import
+
+ public static EncodeTask Import(string filename)
+ {
+ XmlNode root = loadFile(filename);
+ if (root == null) return null;
+
+ // We'll query a query parser object and use it's public var structures to store all the data.
+ // This will allow the preset loader logic to be used instead of writing custom logic just for this file.
+ EncodeTask parsed = new EncodeTask();
+ string qualityMode = string.Empty;
+
+ #region Get a List of Audio Track Objects
+ XmlNode audioListDict = root.ChildNodes[2].ChildNodes[0].FirstChild.ChildNodes[1];
+ List<AudioTrack> audioTracks = new List<AudioTrack>();
+
+ for (int i = 0; i < audioListDict.ChildNodes.Count; i++)
+ {
+ XmlNode audioChannel = audioListDict.ChildNodes[i];
+ AudioTrack track = new AudioTrack();
+
+ for (int subi = 0; subi < audioChannel.ChildNodes.Count; subi += 2)
+ {
+ // Audio Channel Information is here.
+ string key = audioChannel.ChildNodes[subi].InnerText;
+ string value = audioChannel.ChildNodes[subi + 1].InnerText;
+ switch (key)
+ {
+ case "AudioBitrate":
+ track.Bitrate = value;
+ break;
+ case "AudioEncoder":
+ track.Encoder = value.Replace("AAC (CoreAudio)", "AAC (faac)");
+ break;
+ case "AudioMixdown":
+ track.MixDown = value;
+ break;
+ case "AudioSamplerate":
+ track.SampleRate = value;
+ break;
+ case "AudioTrack":
+ track.Track = value;
+ break;
+ case "AudioTrackDRCSlider":
+ track.DRC = value;
+ break;
+ }
+ }
+ audioTracks.Add(track);
+ parsed.AudioTracks = audioTracks;
+ }
+ #endregion
+
+ #region Parse the reset of the plist keys into local variables
+
+ XmlNode presetSettings = root.ChildNodes[2].ChildNodes[0].FirstChild;
+
+ // Start from 2 to avoid the audio settings which we don't need.
+ for (int i = 2; i < presetSettings.ChildNodes.Count; i += 2)
+ {
+ string key = presetSettings.ChildNodes[i].InnerText;
+ string value = presetSettings.ChildNodes[i + 1].InnerText;
+
+ switch (key)
+ {
+ // Output Settings
+ case "FileFormat":
+ parsed.OutputFormat = Converters.GetFileFormat(value);
+ break;
+ case "Mp4HttpOptimize":
+ parsed.OptimizeMP4 = value == "1";
+ break;
+ case "Mp4LargeFile":
+ parsed.IPod5GSupport = value == "1";
+ break;
+ case "Mp4iPodCompatible":
+ parsed.IPod5GSupport = value == "1";
+ break;
+
+ // Picture Settings
+ case "PictureAutoCrop":
+ // Not used
+ break;
+ case "PictureTopCrop":
+ parsed.Cropping.Top = int.Parse(value);
+ break;
+ case "PictureBottomCrop":
+ parsed.Cropping.Bottom = int.Parse(value);
+ break;
+ case "PictureLeftCrop":
+ parsed.Cropping.Left = int.Parse(value);
+ break;
+ case "PictureRightCrop":
+ parsed.Cropping.Right = int.Parse(value);
+ break;
+ case "PictureHeight":
+ parsed.Height = int.Parse(value);
+ break;
+ case "PictureWidth":
+ parsed.Width = int.Parse(value);
+ break;
+ case "PictureKeepRatio":
+ parsed.KeepDisplayAspect = value == "1";
+ break;
+ case "PicturePAR":
+ switch (value)
+ {
+
+ case "0":
+ parsed.Anamorphic = Anamorphic.None;
+ break;
+ default:
+ parsed.Anamorphic = Anamorphic.Strict;
+ break;
+ case "2":
+ parsed.Anamorphic = Anamorphic.Loose;
+ break;
+ case "3":
+ parsed.Anamorphic = Anamorphic.Custom;
+ break;
+
+ }
+ break;
+
+ // Filters
+ case "PictureDeblock":
+ parsed.Deblock = int.Parse(value);
+ break;
+ case "PictureDecomb":
+ parsed.Decomb = Decomb.Off;
+ // Don't place custom here as it's handled in the filter panel
+ if (value == "2") parsed.Decomb = Decomb.Default;
+ break;
+ case "PictureDecombCustom":
+ if (value != string.Empty)
+ parsed.CustomDecomb = value;
+ break;
+ case "PictureDecombDeinterlace":
+ // Not Used
+ break;
+ case "PictureDeinterlace":
+ switch (value)
+ {
+ case "0":
+ parsed.Deinterlace = Deinterlace.Off;
+ break;
+ // Don't place custom here as it's handled in the filter panel
+ case "2":
+ parsed.Deinterlace = Deinterlace.Fast;
+ break;
+ case "3":
+ parsed.Deinterlace = Deinterlace.Slow;
+ break;
+ case "4":
+ parsed.Deinterlace = Deinterlace.Slower;
+ break;
+ }
+ break;
+ case "PictureDeinterlaceCustom":
+ if (value != string.Empty)
+ parsed.CustomDeinterlace = value;
+ break;
+ case "PictureDenoise":
+ switch (value)
+ {
+ case "0":
+ parsed.Denoise = Denoise.Off;
+ break;
+ // Don't place custom here as it's handled in the filter panel
+ case "2":
+ parsed.Denoise = Denoise.Weak;
+ break;
+ case "3":
+ parsed.Denoise = Denoise.Medium;
+ break;
+ case "4":
+ parsed.Denoise = Denoise.Strong;
+ break;
+ }
+
+ break;
+ case "PictureDenoiseCustom":
+ if (value != string.Empty)
+ parsed.CustomDenoise = value;
+ break;
+ case "PictureDetelecine":
+ parsed.Detelecine = Detelecine.Off;
+ if (value == "1") parsed.Detelecine = Detelecine.Default;
+ break;
+ case "PictureDetelecineCustom":
+ if (value != string.Empty)
+ parsed.CustomDetelecine = value;
+ break;
+
+ // Video Tab
+ case "VideoAvgBitrate":
+ parsed.VideoBitrate = int.Parse(value);
+ break;
+ case "VideoEncoder":
+ parsed.VideoEncoder = Converters.GetVideoEncoder(value);
+ break;
+ case "VideoFramerate":
+ parsed.Framerate = int.Parse(value);
+ break;
+ case "VideoGrayScale":
+ parsed.Grayscale = value == "1";
+ break;
+ case "VideoQualitySlider":
+ parsed.Quality = double.Parse(value);
+ break;
+ case "VideoQualityType": // The Type of Quality Mode used
+ qualityMode = value;
+ break;
+ case "VideoTurboTwoPass":
+ parsed.TurboFirstPass = value == "1";
+ break;
+ case "VideoTwoPass":
+ parsed.TwoPass = value == "1";
+ break;
+
+ // Chapter Markers Tab
+ case "ChapterMarkers":
+ parsed.IncludeChapterMarkers = value == "1";
+ break;
+
+ // Advanced x264 tab
+ case "x264Option":
+ parsed.AdvancedEncoderOptions = value;
+ break;
+
+ // Preset Information
+ case "PresetBuildNumber":
+ parsed.PresetBuildNumber = int.Parse(value);
+ break;
+ case "PresetDescription":
+ parsed.PresetDescription = value;
+ break;
+ case "PresetName":
+ parsed.PresetName = value;
+ break;
+ case "Type":
+ parsed.Type = value;
+ break;
+ case "UsesMaxPictureSettings":
+ parsed.UsesMaxPictureSettings = value == "1";
+ break;
+ case "UsesPictureFilters":
+ parsed.UsesPictureFilters = value == "1";
+ break;
+ case "UsesPictureSettings":
+ parsed.UsesPictureSettings = value == "1";
+ break;
+ }
+ }
+
+ // Kill any Quality values we don't need.
+ switch (qualityMode)
+ {
+ case "0": // FileSize
+ parsed.Quality = null;
+ parsed.VideoBitrate = null;
+ break;
+ case "1": // Avg Bitrate
+ parsed.Quality = null;
+ break;
+ case "2": // CQ
+ parsed.VideoBitrate = null;
+ break;
+ }
+ #endregion
+
+ return parsed;
+ }
+
+ private static XmlNode loadFile(string filename)
+ {
+ try
+ {
+ XmlNode root;
+
+ if (!File.Exists(filename))
+ return null;
+
+ StreamReader sr = File.OpenText(filename);
+ string fromfile = string.Empty;
+ int fileChar;
+ while ((fileChar = sr.Read()) != -1)
+ fromfile += Convert.ToChar(fileChar);
+
+ XmlDocument doc = new XmlDocument();
+ doc.LoadXml(fromfile);
+
+ root = doc;
+ if (!root.HasChildNodes)
+ {
+ MessageBox.Show(
+ "The Preset file you selected appears to be invlaid or from an older version of HandBrake",
+ "Error",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return null;
+ }
+
+ return root;
+ }
+ catch (Exception)
+ {
+ MessageBox.Show(
+ "The Preset file you selected appears to be invlaid or from an older version of HandBrake.\n\n Please note, if you are exporting from the MacGui you may need to rebuild your preset so that it uses the current preset plist format.\n The MacGui does not currently update user presets automatically.",
+ "Error",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return null;
+ }
+ }
+ #endregion
+
+ #region Export
+
+ /// <summary>
+ /// Export a MacGui style plist preset.
+ /// </summary>
+ /// <param name="path">
+ /// The path.
+ /// </param>
+ /// <param name="preset">
+ /// The preset.
+ /// </param>
+ public static void Export(string path, Preset preset)
+ {
+ EncodeTask parsed = QueryParserUtility.Parse(preset.Query);
+ XmlTextWriter xmlWriter = new XmlTextWriter(path, Encoding.UTF8) { Formatting = Formatting.Indented };
+
+ // Header
+ xmlWriter.WriteStartDocument();
+ xmlWriter.WriteDocType("plist", "-//Apple//DTD PLIST 1.0//EN",
+ @"http://www.apple.com/DTDs/PropertyList-1.0.dtd", null);
+
+ xmlWriter.WriteStartElement("plist");
+ xmlWriter.WriteStartElement("array");
+
+ // Add New Preset Here. Can write multiple presets here if required in future.
+ WritePreset(xmlWriter, parsed, preset);
+
+ // Footer
+ xmlWriter.WriteEndElement();
+ xmlWriter.WriteEndElement();
+
+ xmlWriter.WriteEndDocument();
+
+ // Closeout
+ xmlWriter.Close();
+ }
+
+ /// <summary>
+ /// Write the Preset to a file
+ /// </summary>
+ /// <param name="xmlWriter">
+ /// The xml writer.
+ /// </param>
+ /// <param name="parsed">
+ /// The parsed.
+ /// </param>
+ /// <param name="preset">
+ /// The preset.
+ /// </param>
+ private static void WritePreset(XmlTextWriter xmlWriter, EncodeTask parsed, Preset preset)
+ {
+ xmlWriter.WriteStartElement("dict");
+ AudioListArrayDict(xmlWriter, parsed);
+ AddEncodeSettings(xmlWriter, parsed, preset);
+
+ xmlWriter.WriteEndElement();
+ }
+
+ /// <summary>
+ /// Add the encode settings to the preset
+ /// </summary>
+ /// <param name="xmlWriter">
+ /// The xml writer.
+ /// </param>
+ /// <param name="parsed">
+ /// The parsed.
+ /// </param>
+ /// <param name="preset">
+ /// The preset.
+ /// </param>
+ private static void AddEncodeSettings(XmlTextWriter xmlWriter, EncodeTask parsed, Preset preset)
+ {
+ AddEncodeElement(xmlWriter, "ChapterMarkers", "integer", parsed.IncludeChapterMarkers ? "1" : "0");
+ AddEncodeElement(xmlWriter, "Default", "integer", "0");
+ AddEncodeElement(xmlWriter, "FileFormat", "string", Converters.GetFileFormat(parsed.OutputFormat) + " file");
+ AddBooleanElement(xmlWriter, "Folder", false);
+ AddEncodeElement(xmlWriter, "Mp4HttpOptimize", "integer", parsed.OptimizeMP4 ? "1" : "0");
+ AddEncodeElement(xmlWriter, "Mp4LargeFile", "integer", parsed.LargeFile ? "1" : "0");
+ AddEncodeElement(xmlWriter, "Mp4iPodCompatible", "integer", parsed.IPod5GSupport ? "1" : "0");
+ AddEncodeElement(xmlWriter, "PictureAutoCrop", "integer", "1");
+ AddEncodeElement(xmlWriter, "PictureBottomCrop", "integer", parsed.Cropping.Bottom.ToString());
+
+ // Filters
+ AddEncodeElement(xmlWriter, "PictureDeblock", "integer", parsed.Deblock.ToString());
+
+ switch (parsed.Decomb)
+ {
+ case Decomb.Off:
+ AddEncodeElement(xmlWriter, "PictureDecomb", "integer", "0");
+ AddEncodeElement(xmlWriter, "PictureDecombCustom", "string", string.Empty);
+ break;
+ case Decomb.Default:
+ AddEncodeElement(xmlWriter, "PictureDecomb", "integer", "1");
+ AddEncodeElement(xmlWriter, "PictureDecombCustom", "string", string.Empty);
+ break;
+ default:
+ AddEncodeElement(xmlWriter, "PictureDecomb", "integer", "2");
+ AddEncodeElement(xmlWriter, "PictureDecombCustom", "string", parsed.CustomDecomb);
+ break;
+ }
+ AddEncodeElement(xmlWriter, "PictureDecombDeinterlace", "integer", parsed.Decomb != Decomb.Off ? "0" : "1");
+
+ switch (parsed.Deinterlace)
+ {
+ case Deinterlace.Off:
+ AddEncodeElement(xmlWriter, "PictureDeinterlace", "integer", "0");
+ AddEncodeElement(xmlWriter, "PictureDeinterlaceCustom", "string", string.Empty);
+ break;
+ case Deinterlace.Fast:
+ AddEncodeElement(xmlWriter, "PictureDeinterlace", "integer", "1");
+ AddEncodeElement(xmlWriter, "PictureDeinterlaceCustom", "string", string.Empty);
+ break;
+ case Deinterlace.Slow:
+ AddEncodeElement(xmlWriter, "PictureDeinterlace", "integer", "2");
+ AddEncodeElement(xmlWriter, "PictureDeinterlaceCustom", "string", string.Empty);
+ break;
+ case Deinterlace.Slower:
+ AddEncodeElement(xmlWriter, "PictureDeinterlace", "integer", "3");
+ AddEncodeElement(xmlWriter, "PictureDeinterlaceCustom", "string", string.Empty);
+ break;
+ default:
+ AddEncodeElement(xmlWriter, "PictureDeinterlace", "integer", "4");
+ AddEncodeElement(xmlWriter, "PictureDeinterlaceCustom", "string", parsed.CustomDeinterlace);
+ break;
+ }
+
+ switch (parsed.Denoise)
+ {
+ case Denoise.Off:
+ AddEncodeElement(xmlWriter, "PictureDenoise", "integer", "0");
+ AddEncodeElement(xmlWriter, "PictureDenoiseCustom", "string", string.Empty);
+ break;
+ case Denoise.Weak:
+ AddEncodeElement(xmlWriter, "PictureDenoise", "integer", "1");
+ AddEncodeElement(xmlWriter, "PictureDenoiseCustom", "string", string.Empty);
+ break;
+ case Denoise.Medium:
+ AddEncodeElement(xmlWriter, "PictureDenoise", "integer", "2");
+ AddEncodeElement(xmlWriter, "PictureDenoiseCustom", "string", string.Empty);
+ break;
+ case Denoise.Strong:
+ AddEncodeElement(xmlWriter, "PictureDenoise", "integer", "3");
+ AddEncodeElement(xmlWriter, "PictureDenoiseCustom", "string", string.Empty);
+ break;
+ default:
+ AddEncodeElement(xmlWriter, "PictureDenoise", "integer", "4");
+ AddEncodeElement(xmlWriter, "PictureDenoiseCustom", "string", parsed.CustomDenoise);
+ break;
+ }
+
+ int detelecine;
+ switch (parsed.Detelecine)
+ {
+ case Detelecine.Off:
+ detelecine = 0;
+ break;
+ case Detelecine.Default:
+ detelecine = 2;
+ break;
+ default:
+ detelecine = 1;
+ break;
+ }
+
+ AddEncodeElement(xmlWriter, "PictureDetelecine", "integer", detelecine.ToString());
+ AddEncodeElement(xmlWriter, "PictureDetelecineCustom", "string", detelecine == 1 ? parsed.CustomDecomb : string.Empty);
+
+ // Picture Settings
+ AddEncodeElement(xmlWriter, "PictureHeight", "integer", parsed.Height.ToString());
+ AddEncodeElement(xmlWriter, "PictureKeepRatio", "integer", parsed.KeepDisplayAspect ? "1" : "0");
+ AddEncodeElement(xmlWriter, "PictureLeftCrop", "integer", parsed.Cropping.Left.ToString());
+ AddEncodeElement(xmlWriter, "PictureModulus", "integer", parsed.Modulus.ToString());
+ AddEncodeElement(xmlWriter, "PicturePAR", "integer", ((int)parsed.Anamorphic).ToString());
+ AddEncodeElement(xmlWriter, "PictureRightCrop", "integer", parsed.Cropping.Right.ToString());
+ AddEncodeElement(xmlWriter, "PictureTopCrop", "integer", parsed.Cropping.Top.ToString());
+ AddEncodeElement(xmlWriter, "PictureWidth", "integer", parsed.Width.ToString());
+
+ // Preset Information
+ AddEncodeElement(xmlWriter, "PresetBuildNumber", "string", Init.Build.ToString());
+ AddEncodeElement(xmlWriter, "PresetDescription", "string", "No Description");
+ AddEncodeElement(xmlWriter, "PresetName", "string", preset.Name);
+ AddEncodeElement(xmlWriter, "Type", "integer", "1"); // 1 is user preset, 0 is built in
+
+ // Preset Settings
+ AddEncodeElement(xmlWriter, "UsesMaxPictureSettings", "integer", (parsed.MaxWidth != 0 || parsed.MaxHeight != 0) ? "1" : "0");
+ AddEncodeElement(xmlWriter, "UsesPictureFilters", "integer", "1");
+ AddEncodeElement(xmlWriter, "UsesPictureSettings", "integer", "2");
+
+ // Video Settings
+ AddEncodeElement(xmlWriter, "VideoAvgBitrate", "string", parsed.VideoBitrate.ToString());
+ AddEncodeElement(xmlWriter, "VideoEncoder", "string", Converters.GetGUIVideoEncoder(parsed.VideoEncoder));
+ AddEncodeElement(xmlWriter, "VideoFramerate", "string", parsed.Framerate.ToString());
+ AddEncodeElement(xmlWriter, "VideFrameratePFR", "integer", parsed.FramerateMode == FramerateMode.PFR ? "1" : "0");
+ AddEncodeElement(xmlWriter, "VideoGrayScale", "integer", parsed.Grayscale ? "1" : "0");
+ AddEncodeElement(xmlWriter, "VideoQualitySlider", "real", parsed.Quality.ToString());
+
+ int videoQualityType = 0;
+ if (parsed.VideoBitrate != null) videoQualityType = 1;
+ else if (parsed.Quality != null) videoQualityType = 2;
+
+ AddEncodeElement(xmlWriter, "VideoQualityType", "integer", videoQualityType.ToString());
+ AddEncodeElement(xmlWriter, "VideoTargetSize", "string", string.Empty);
+ AddEncodeElement(xmlWriter, "VideoTurboTwoPass", "integer", parsed.TurboFirstPass ? "1" : "0");
+ AddEncodeElement(xmlWriter, "VideoTwoPass", "integer", parsed.TwoPass ? "1" : "0");
+
+ // x264 string
+ AddEncodeElement(xmlWriter, "x264Option", "string", parsed.AdvancedEncoderOptions);
+ }
+
+ /// <summary>
+ /// Add a boolean element
+ /// </summary>
+ /// <param name="xmlWriter">
+ /// The xml writer.
+ /// </param>
+ /// <param name="keyName">
+ /// The key name.
+ /// </param>
+ /// <param name="value">
+ /// The value.
+ /// </param>
+ private static void AddBooleanElement(XmlTextWriter xmlWriter, string keyName, bool value)
+ {
+ xmlWriter.WriteStartElement("key");
+ xmlWriter.WriteString(keyName);
+ xmlWriter.WriteEndElement();
+ xmlWriter.WriteStartElement(value ? "true" : "false");
+ xmlWriter.WriteEndElement();
+ }
+
+ /// <summary>
+ /// Add an encode setting element
+ /// </summary>
+ /// <param name="xmlWriter">
+ /// The xml writer.
+ /// </param>
+ /// <param name="keyName">
+ /// The key name.
+ /// </param>
+ /// <param name="type">
+ /// The type.
+ /// </param>
+ /// <param name="value">
+ /// The value.
+ /// </param>
+ private static void AddEncodeElement(XmlTextWriter xmlWriter, string keyName, string type, string value)
+ {
+ xmlWriter.WriteElementString("key", keyName);
+
+ // This is a hack for Apples XML parser. It doesn't understand <integer /> so instead, always set a default value
+ // of 0 if the value is empty.
+ if (type == "integer" && string.IsNullOrEmpty(value))
+ {
+ value = "0";
+ }
+ xmlWriter.WriteElementString(type, value);
+ }
+
+ /// <summary>
+ /// Add an Audio Track Array Dict
+ /// </summary>
+ /// <param name="xmlWriter">
+ /// The xml writer.
+ /// </param>
+ /// <param name="parsed">
+ /// The parsed.
+ /// </param>
+ private static void AudioListArrayDict(XmlTextWriter xmlWriter, EncodeTask parsed)
+ {
+ xmlWriter.WriteStartElement("key");
+ xmlWriter.WriteString("AudioList");
+ xmlWriter.WriteEndElement();
+
+ xmlWriter.WriteStartElement("array");
+ foreach (AudioTrack track in parsed.AudioTracks)
+ {
+ AddAudioItem(xmlWriter, track);
+ }
+ xmlWriter.WriteEndElement();
+ }
+
+ /// <summary>
+ /// Add an audio track
+ /// </summary>
+ /// <param name="xmlWriter">
+ /// The xml writer.
+ /// </param>
+ /// <param name="audioTrack">
+ /// The audio track.
+ /// </param>
+ private static void AddAudioItem(XmlTextWriter xmlWriter, AudioTrack audioTrack)
+ {
+ xmlWriter.WriteStartElement("dict");
+
+ xmlWriter.WriteElementString("key", "AudioBitrate");
+ xmlWriter.WriteElementString("string", audioTrack.Bitrate);
+
+ xmlWriter.WriteElementString("key", "AudioEncoder");
+ xmlWriter.WriteElementString("string", audioTrack.Encoder);
+
+ xmlWriter.WriteElementString("key", "AudioMixdown");
+ xmlWriter.WriteElementString("string", audioTrack.MixDown);
+
+ xmlWriter.WriteElementString("key", "AudioSamplerate");
+ xmlWriter.WriteElementString("string", audioTrack.SampleRate);
+
+ xmlWriter.WriteElementString("key", "AudioTrack");
+ xmlWriter.WriteElementString("integer", audioTrack.Track);
+
+ xmlWriter.WriteElementString("key", "AudioTrackDRCSlider");
+ xmlWriter.WriteElementString("real", audioTrack.DRC);
+
+ xmlWriter.WriteElementString("key", "AudioTrackDescription");
+ xmlWriter.WriteElementString("string", "Unknown");
+
+ xmlWriter.WriteEndElement();
+ }
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Utilities/QueryParserUtility.cs b/win/CS/HandBrake.ApplicationServices/Utilities/QueryParserUtility.cs
new file mode 100644
index 000000000..ab90cf010
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Utilities/QueryParserUtility.cs
@@ -0,0 +1,415 @@
+/* QueryParser.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Utilities
+{
+ using System;
+ using System.Collections;
+ using System.Collections.Generic;
+ using System.Globalization;
+ using System.Text.RegularExpressions;
+
+ using HandBrake.ApplicationServices.Functions;
+ using HandBrake.ApplicationServices.Model;
+ using HandBrake.ApplicationServices.Model.Encoding;
+
+ /// <summary>
+ /// Parse a CLI Query
+ /// </summary>
+ public class QueryParserUtility
+ {
+
+ /**
+ * TODO
+ * - Add support for PointToPointMode = Seconds or Frames
+ **/
+
+ /// <summary>
+ /// The Culture
+ /// </summary>
+ private static readonly CultureInfo Culture = new CultureInfo("en-US", false);
+
+ /// <summary>
+ /// Takes in a query which can be in any order and parses it.
+ /// All varibles are then set so they can be used elsewhere.
+ /// </summary>
+ /// <param name="input">A ClI Query</param>
+ /// <returns>A Parsed Query</returns>
+ public static EncodeTask Parse(string input)
+ {
+ var parsed = new EncodeTask();
+
+ #region Regular Expressions
+
+ // Source
+ Match title = Regex.Match(input, @"-t ([0-9]*)");
+ Match chapters = Regex.Match(input, @"-c ([0-9-]*)");
+
+ // Output Settings
+ Match format = Regex.Match(input, @"-f ([a-zA-Z0-9]*)");
+ Match grayscale = Regex.Match(input, @" -g");
+ Match largerMp4 = Regex.Match(input, @" -4");
+ Match ipodAtom = Regex.Match(input, @" -I");
+
+ // Picture Settings Tab
+ Match width = Regex.Match(input, @"-w ([0-9]*)");
+ Match height = Regex.Match(input, @"-l ([0-9]*)");
+ Match maxWidth = Regex.Match(input, @"-X ([0-9]*)");
+ Match maxHeight = Regex.Match(input, @"-Y ([0-9]*)");
+ Match crop = Regex.Match(input, @"--crop ([0-9]*):([0-9]*):([0-9]*):([0-9]*)");
+
+ Match looseAnamorphic = Regex.Match(input, @"--loose-anamorphic");
+ Match strictAnamorphic = Regex.Match(input, @"--strict-anamorphic");
+ Match customAnamorphic = Regex.Match(input, @"--custom-anamorphic");
+
+ Match keepDisplayAsect = Regex.Match(input, @"--keep-display-aspect");
+ Match displayWidth = Regex.Match(input, @"--display-width ([0-9]*)");
+ Match pixelAspect = Regex.Match(input, @"--pixel-aspect ([0-9]*):([0-9]*)");
+ Match modulus = Regex.Match(input, @"--modulus ([0-9]*)");
+
+ // Picture Settings - Filters
+ Match decomb = Regex.Match(input, @" --decomb");
+ Match decombValue = Regex.Match(input, @" --decomb=\""([a-zA-Z0-9.:]*)\""");
+ Match deinterlace = Regex.Match(input, @"--deinterlace=\""([a-zA-Z0-9.:]*)\""");
+ Match denoise = Regex.Match(input, @"--denoise=\""([a-zA-Z0-9.:]*)\""");
+ Match deblock = Regex.Match(input, @"--deblock=([0-9:]*)");
+ Match detelecine = Regex.Match(input, @"--detelecine");
+ Match detelecineValue = Regex.Match(input, @" --detelecine=\""([a-zA-Z0-9.:]*)\""");
+
+ // Video Settings Tab
+ Match videoEncoder = Regex.Match(input, @"-e ([a-zA-Z0-9]*)");
+ Match videoFramerate = Regex.Match(input, @"-r ([0-9.]*)");
+ Match videoBitrate = Regex.Match(input, @"-b ([0-9]*)");
+ Match videoQuality = Regex.Match(input, @"-q ([0-9.]*)");
+ Match twoPass = Regex.Match(input, @" -2");
+ Match turboFirstPass = Regex.Match(input, @" -T");
+ Match optimizeMP4 = Regex.Match(input, @" -O");
+ Match pfr = Regex.Match(input, @" --pfr");
+ Match vfr = Regex.Match(input, @" --vfr");
+ Match cfr = Regex.Match(input, @" --cfr");
+
+ // Audio Settings Tab
+ Match noAudio = Regex.Match(input, @"-a none");
+ Match audioTracks = Regex.Match(input, @"-a ([0-9,]*)");
+ Match audioTrackMixes = Regex.Match(input, @"-6 ([0-9a-zA-Z,]*)");
+ Match audioEncoders = Regex.Match(input, @"-E ([a-zA-Z0-9+,:]*)");
+ Match audioBitrates = Regex.Match(input, @"-B ([0-9a-zA-Z,]*)"); // Auto = a-z
+ Match audioSampleRates = Regex.Match(input, @"-R ([0-9a-zA-Z.,]*)"); // Auto = a-z
+ Match drcValues = Regex.Match(input, @"-D ([0-9.,]*)");
+
+ // Chapters Tab
+ Match chapterMarkers = Regex.Match(input, @" -m");
+ Match chapterMarkersFileMode = Regex.Match(input, @"--markers");
+
+ // Advanced Tab
+ Match advanced = Regex.Match(input, @"-x ([.,/a-zA-Z0-9=:-]*)");
+
+ #endregion
+
+ #region Set Varibles
+
+ try
+ {
+ #region Source Tab
+
+ if (title.Success)
+ {
+ parsed.Title = int.Parse(title.ToString().Replace("-t ", string.Empty));
+ }
+
+ if (chapters.Success)
+ {
+ parsed.PointToPointMode = PointToPointMode.Chapters;
+ string[] actTitles = chapters.ToString().Replace("-c ", string.Empty).Split('-');
+ parsed.StartPoint = int.Parse(actTitles[0]);
+ if (actTitles.Length > 1)
+ {
+ parsed.EndPoint = int.Parse(actTitles[1]);
+ }
+
+ if ((parsed.StartPoint == 1) && (parsed.EndPoint == 0))
+ {
+ parsed.EndPoint = parsed.StartPoint;
+ }
+ }
+
+ #endregion
+
+ #region Output Settings
+
+ if (format.Success)
+ {
+ parsed.OutputFormat = Converters.GetFileFormat(format.Groups[1].ToString());
+ }
+ parsed.LargeFile = largerMp4.Success;
+ parsed.IPod5GSupport = ipodAtom.Success;
+ parsed.OptimizeMP4 = optimizeMP4.Success;
+
+ #endregion
+
+ #region Picture Tab
+
+ if (width.Success)
+ parsed.Width = int.Parse(width.Groups[0].Value.Replace("-w ", string.Empty));
+
+ if (height.Success)
+ parsed.Height = int.Parse(height.Groups[0].Value.Replace("-l ", string.Empty));
+
+ if (maxWidth.Success)
+ parsed.MaxWidth = int.Parse(maxWidth.Groups[0].Value.Replace("-X ", string.Empty));
+
+ if (maxHeight.Success)
+ parsed.MaxHeight = int.Parse(maxHeight.Groups[0].Value.Replace("-Y ", string.Empty));
+
+ if (crop.Success)
+ {
+ try
+ {
+ string values = crop.ToString().Replace("--crop ", string.Empty);
+ string[] actCropValues = values.Split(':');
+ parsed.Cropping = new Cropping(
+ int.Parse(actCropValues[0]),
+ int.Parse(actCropValues[1]),
+ int.Parse(actCropValues[2]),
+ int.Parse(actCropValues[3]));
+ }
+ catch (Exception)
+ {
+ // No need to do anything.
+ }
+ }
+
+ if (strictAnamorphic.Success)
+ parsed.Anamorphic = Anamorphic.Strict;
+ else if (looseAnamorphic.Success)
+ parsed.Anamorphic = Anamorphic.Loose;
+ else if (customAnamorphic.Success)
+ parsed.Anamorphic = Anamorphic.Custom;
+ else
+ parsed.Anamorphic = Anamorphic.None;
+
+ parsed.KeepDisplayAspect = keepDisplayAsect.Success;
+
+ if (displayWidth.Success)
+ parsed.DisplayWidth =
+ double.Parse(displayWidth.Groups[0].Value.Replace("--display-width ", string.Empty));
+
+ if (pixelAspect.Success)
+ parsed.PixelAspectX = int.Parse(pixelAspect.Groups[1].Value.Replace("--pixel-aspect ", string.Empty));
+
+ if (pixelAspect.Success && pixelAspect.Groups.Count >= 3)
+ parsed.PixelAspectY = int.Parse(pixelAspect.Groups[2].Value.Replace("--pixel-aspect ", string.Empty));
+
+ if (modulus.Success)
+ parsed.Modulus = int.Parse(modulus.Groups[0].Value.Replace("--modulus ", string.Empty));
+
+ #endregion
+
+ #region Filters
+
+ parsed.Decomb = Decomb.Off;
+ if (decomb.Success)
+ {
+ parsed.Decomb = Decomb.Default;
+ if (decombValue.Success)
+ {
+ parsed.CustomDecomb = decombValue.ToString().Replace("--decomb=", string.Empty).Replace("\"", string.Empty);
+ }
+ }
+
+ parsed.Deinterlace = Deinterlace.Off;
+ if (deinterlace.Success)
+ {
+ switch (deinterlace.ToString().Replace("--deinterlace=", string.Empty).Replace("\"", string.Empty).ToLower())
+ {
+ case "fast":
+ parsed.Deinterlace = Deinterlace.Fast;
+ break;
+ case "slow":
+ parsed.Deinterlace = Deinterlace.Slow;
+ break;
+ case "slower":
+ parsed.Deinterlace = Deinterlace.Slower;
+ break;
+ case "slowest":
+ parsed.Deinterlace = Deinterlace.Slowest;
+ break;
+ default:
+ parsed.Deinterlace = Deinterlace.Custom;
+ parsed.CustomDeinterlace = deinterlace.ToString().Replace("--deinterlace=", string.Empty).Replace("\"", string.Empty).ToLower();
+ break;
+ }
+ }
+
+ parsed.Denoise = Denoise.Off;
+ if (denoise.Success)
+ {
+ switch (denoise.ToString().Replace("--denoise=", string.Empty).Replace("\"", string.Empty))
+ {
+ case "weak":
+ parsed.Denoise = Denoise.Weak;
+ break;
+ case "medium":
+ parsed.Denoise = Denoise.Medium;
+ break;
+ case "strong":
+ parsed.Denoise = Denoise.Strong;
+ break;
+ default:
+ parsed.Denoise = Denoise.Custom;
+ parsed.CustomDenoise = denoise.ToString().Replace("--denoise=", string.Empty).Replace("\"", string.Empty);
+ break;
+ }
+ }
+
+ parsed.Deblock = 0;
+ if (deblock.Success)
+ {
+ int dval;
+ int.TryParse(deblock.ToString().Replace("--deblock=", string.Empty), out dval);
+ parsed.Deblock = dval;
+ }
+
+ parsed.Detelecine = Detelecine.Off;
+ if (detelecine.Success)
+ {
+ parsed.Detelecine = Detelecine.Default;
+ if (detelecineValue.Success)
+ {
+ parsed.CustomDetelecine = detelecineValue.ToString().Replace("--detelecine=", string.Empty).Replace("\"", string.Empty);
+ parsed.Detelecine = Detelecine.Custom;
+ }
+ }
+
+ #endregion
+
+ #region Video Settings Tab
+
+ parsed.VideoEncoder = Converters.GetVideoEncoder(videoEncoder.ToString().Replace("-e ", string.Empty));
+
+ if (videoFramerate.Success)
+ {
+ double fps;
+ double.TryParse(videoFramerate.Groups[1].ToString(), out fps);
+ parsed.Framerate = fps;
+ }
+
+ if (pfr.Success)
+ parsed.FramerateMode = FramerateMode.PFR;
+ else if (cfr.Success)
+ parsed.FramerateMode = FramerateMode.CFR;
+ else
+ parsed.FramerateMode = FramerateMode.VFR; // Default to VFR
+
+ parsed.Grayscale = grayscale.Success;
+ parsed.TwoPass = twoPass.Success;
+ parsed.TurboFirstPass = turboFirstPass.Success;
+
+ if (videoBitrate.Success)
+ {
+ parsed.VideoEncodeRateType = VideoEncodeRateMode.AverageBitrate;
+ parsed.VideoBitrate = int.Parse(videoBitrate.ToString().Replace("-b ", string.Empty));
+ }
+
+ if (videoQuality.Success)
+ {
+ float quality = float.Parse(videoQuality.ToString().Replace("-q ", string.Empty), Culture);
+ parsed.Quality = quality;
+ }
+
+ #endregion
+
+ #region Audio Tab
+
+ // Find out how many tracks we need to add by checking how many encoders or audio tracks are selected.
+ int encoderCount = 0;
+ if (audioEncoders.Success)
+ {
+ string[] audioDataCounters = audioEncoders.ToString().Replace("-E ", string.Empty).Split(',');
+ encoderCount = audioDataCounters.Length;
+ }
+
+ // Get the data from the regular expression results
+ string[] trackData = null;
+ string[] trackMixes = null;
+ string[] trackEncoders = null;
+ string[] trackBitrates = null;
+ string[] trackSamplerates = null;
+ string[] trackDRCvalues = null;
+
+ if (audioTracks.Success)
+ trackData = audioTracks.ToString().Replace("-a ", string.Empty).Split(',');
+ if (audioTrackMixes.Success)
+ trackMixes = audioTrackMixes.ToString().Replace("-6 ", string.Empty).Split(',');
+ if (audioEncoders.Success)
+ trackEncoders = audioEncoders.ToString().Replace("-E ", string.Empty).Split(',');
+ if (audioBitrates.Success)
+ trackBitrates = audioBitrates.ToString().Replace("-B ", string.Empty).Split(',');
+ if (audioSampleRates.Success)
+ trackSamplerates = audioSampleRates.ToString().Replace("-R ", string.Empty).Split(',');
+ if (drcValues.Success)
+ trackDRCvalues = drcValues.ToString().Replace("-D ", string.Empty).Split(',');
+
+ // Create new Audio Track Classes and store them in the ArrayList
+ List<AudioTrack> allAudioTrackInfo = new List<AudioTrack>();
+ for (int x = 0; x < encoderCount; x++)
+ {
+ AudioTrack track = new AudioTrack();
+ if (trackData != null)
+ if (trackData.Length >= (x + 1)) // Audio Track
+ track.Track = trackData[x].Trim();
+
+ if (trackMixes != null)
+ if (trackMixes.Length >= (x + 1)) // Audio Mix
+ track.MixDown = Converters.GetMixDown(trackMixes[x].Trim());
+
+ if (trackEncoders != null)
+ if (trackEncoders.Length >= (x + 1)) // Audio Mix
+ track.Encoder = Converters.GetGUIAudioEncoder(trackEncoders[x].Trim());
+
+ if (trackBitrates != null)
+ if (trackBitrates.Length >= (x + 1)) // Audio Encoder
+ track.Bitrate = trackBitrates[x].Trim() == "auto" ? "Auto" : trackBitrates[x].Trim();
+
+ if (trackSamplerates != null)
+ if (trackSamplerates.Length >= (x + 1)) // Audio SampleRate
+ track.SampleRate = trackSamplerates[x].Trim() == "0" ? "Auto" : trackSamplerates[x].Trim();
+
+ if (trackDRCvalues != null)
+ if (trackDRCvalues.Length >= (x + 1)) // Audio DRC Values
+ track.DRC = trackDRCvalues[x].Trim();
+
+ allAudioTrackInfo.Add(track);
+ }
+
+ parsed.AudioTracks = allAudioTrackInfo;
+
+ #endregion
+
+ #region Chapters Tab
+
+ if (chapterMarkersFileMode.Success || chapterMarkers.Success)
+ parsed.IncludeChapterMarkers = true;
+
+ #endregion
+
+ #region Advanced and other
+
+ if (advanced.Success)
+ parsed.AdvancedEncoderOptions = advanced.ToString().Replace("-x ", string.Empty);
+
+ #endregion
+ }
+ catch (Exception exc)
+ {
+ throw new Exception("An error has occured in the QueryParser Utility.", exc);
+ }
+
+ #endregion
+
+ return parsed;
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrake.ApplicationServices/Utilities/UtilityService.cs b/win/CS/HandBrake.ApplicationServices/Utilities/UtilityService.cs
new file mode 100644
index 000000000..3cddf5e0b
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Utilities/UtilityService.cs
@@ -0,0 +1,131 @@
+/* UtilityService.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Utilities
+{
+ using System;
+ using System.Collections.Generic;
+ using System.Diagnostics;
+ using System.IO;
+ using System.Text;
+ using System.Windows.Forms;
+
+ using HandBrake.ApplicationServices.Functions;
+ using HandBrake.ApplicationServices.Model;
+
+ /// <summary>
+ /// A Set of Static Utilites
+ /// </summary>
+ public class UtilityService
+ {
+ /// <summary>
+ /// The Default Log Directory
+ /// </summary>
+ private static readonly string LogDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";
+
+ /// <summary>
+ /// Clear all the log files older than 30 Days
+ /// </summary>
+ /// <param name="daysToKeep">
+ /// The Number of Days to Keep
+ /// </param>
+ public static void ClearLogFiles(int daysToKeep)
+ {
+ if (Directory.Exists(LogDir))
+ {
+ // Get all the log files
+ DirectoryInfo info = new DirectoryInfo(LogDir);
+ FileInfo[] logFiles = info.GetFiles("*.txt");
+
+ // Delete Them
+ foreach (FileInfo file in logFiles)
+ {
+ if (file.LastWriteTime < DateTime.Now.AddDays(-daysToKeep))
+ {
+ if (!file.Name.Contains("last_scan_log.txt") && !file.Name.Contains("last_encode_log.txt"))
+ {
+ File.Delete(file.FullName);
+ }
+ else if (file.Length > 104857600)
+ {
+ File.Delete(file.FullName);
+ }
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// Get a list of available DVD drives which are ready and contain DVD content.
+ /// </summary>
+ /// <returns>A List of Drives with their details</returns>
+ public static List<DriveInformation> GetDrives()
+ {
+ List<DriveInformation> drives = new List<DriveInformation>();
+ DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();
+ int id = 0;
+ foreach (DriveInfo curDrive in theCollectionOfDrives)
+ {
+ if (curDrive.DriveType == DriveType.CDRom && curDrive.IsReady)
+ {
+ if (Directory.Exists(curDrive.RootDirectory + "VIDEO_TS") || Directory.Exists(curDrive.RootDirectory + "BDMV"))
+ {
+ drives.Add(
+ new DriveInformation
+ {
+ Id = id,
+ VolumeLabel = curDrive.VolumeLabel,
+ RootDirectory = curDrive.RootDirectory.ToString()
+ });
+ id++;
+ }
+ }
+ }
+
+ return drives;
+ }
+
+ /// <summary>
+ /// Get the Process ID of HandBrakeCLI for the current instance.
+ /// </summary>
+ /// <returns>A list of processes</returns>
+ public static Process[] GetCliProcess()
+ {
+ return Process.GetProcessesByName("HandBrakeCLI");
+ }
+
+ /// <summary>
+ /// Add the CLI Query to the Log File.
+ /// </summary>
+ /// <param name="encJob">
+ /// The Encode Job Object
+ /// </param>
+ /// <returns>
+ /// The create cli log header.
+ /// </returns>
+ public static string CreateCliLogHeader(QueueTask encJob)
+ {
+ StringBuilder logHeader = new StringBuilder();
+
+ logHeader.AppendLine(String.Format("# {0}", Init.HandBrakeGuiVersionString));
+ logHeader.AppendLine(String.Format("# Running: {0}", Environment.OSVersion));
+ logHeader.AppendLine(String.Format("# CPU: {0}", SystemInfo.GetCpuCount));
+ logHeader.AppendLine(String.Format("# Ram: {0} MB", SystemInfo.TotalPhysicalMemory));
+ logHeader.AppendLine(String.Format("# Screen: {0}x{1}", SystemInfo.ScreenBounds.Bounds.Width, SystemInfo.ScreenBounds.Bounds.Height));
+ logHeader.AppendLine(String.Format("# Temp Dir: {0}", Path.GetTempPath()));
+ logHeader.AppendLine(String.Format("# Install Dir: {0}", Application.StartupPath));
+ logHeader.AppendLine(String.Format("# Data Dir: {0}\n", Application.UserAppDataPath));
+
+ if (encJob != null)
+ {
+ logHeader.AppendLine(String.Format("# CLI Query: {0}", encJob.Query));
+ logHeader.AppendLine(String.Format("# User Query: {0}", encJob.CustomQuery));
+ }
+ logHeader.AppendLine("-------------------------------------------");
+
+ return logHeader.ToString();
+ }
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/app.config b/win/CS/HandBrake.ApplicationServices/app.config
new file mode 100644
index 000000000..e092c6c7c
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/app.config
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<configuration>
+ <configSections>
+ <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <section name="HandBrake.ApplicationServices.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
+ </sectionGroup>
+ </configSections>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/></startup></configuration>
diff --git a/win/CS/HandBrake.sln b/win/CS/HandBrake.sln
new file mode 100644
index 000000000..c51ae7b99
--- /dev/null
+++ b/win/CS/HandBrake.sln
@@ -0,0 +1,66 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HandBrakeCS", "HandBrakeCS.csproj", "{A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HandBrake.ApplicationServices", "HandBrake.ApplicationServices\HandBrake.ApplicationServices.csproj", "{087A2BA8-BAC2-4577-A46F-07FF9D420016}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HandBrake.Framework", "HandBrake.Framework\HandBrake.Framework.csproj", "{49AD42C1-BF9B-4D78-A644-020878FAADE6}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|x86 = Debug|x86
+ Install|Any CPU = Install|Any CPU
+ Install|x86 = Install|x86
+ NightlyBuild|Any CPU = NightlyBuild|Any CPU
+ NightlyBuild|x86 = NightlyBuild|x86
+ Release|Any CPU = Release|Any CPU
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Debug|x86.ActiveCfg = Debug|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Debug|x86.Build.0 = Debug|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Install|Any CPU.ActiveCfg = Install|Any CPU
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Install|Any CPU.Build.0 = Install|Any CPU
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Install|x86.ActiveCfg = Install|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Install|x86.Build.0 = Install|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.NightlyBuild|Any CPU.ActiveCfg = NightlyBuild|Any CPU
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.NightlyBuild|Any CPU.Build.0 = NightlyBuild|Any CPU
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.NightlyBuild|x86.ActiveCfg = NightlyBuild|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.NightlyBuild|x86.Build.0 = NightlyBuild|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Release|x86.ActiveCfg = Release|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Release|x86.Build.0 = Release|x86
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Install|Any CPU.ActiveCfg = Release|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Install|Any CPU.Build.0 = Release|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Install|x86.ActiveCfg = Release|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.NightlyBuild|Any CPU.ActiveCfg = NightlyBuild|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.NightlyBuild|Any CPU.Build.0 = NightlyBuild|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.NightlyBuild|x86.ActiveCfg = Release|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Release|Any CPU.Build.0 = Release|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Release|x86.ActiveCfg = Release|Any CPU
+ {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Install|Any CPU.ActiveCfg = NightlyBuild|Any CPU
+ {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Install|Any CPU.Build.0 = NightlyBuild|Any CPU
+ {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Install|x86.ActiveCfg = NightlyBuild|Any CPU
+ {49AD42C1-BF9B-4D78-A644-020878FAADE6}.NightlyBuild|Any CPU.ActiveCfg = NightlyBuild|Any CPU
+ {49AD42C1-BF9B-4D78-A644-020878FAADE6}.NightlyBuild|Any CPU.Build.0 = NightlyBuild|Any CPU
+ {49AD42C1-BF9B-4D78-A644-020878FAADE6}.NightlyBuild|x86.ActiveCfg = NightlyBuild|Any CPU
+ {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Release|x86.ActiveCfg = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/win/CS/HandBrake10.5.1.ReSharper b/win/CS/HandBrake10.5.1.ReSharper
new file mode 100644
index 000000000..da45302cf
--- /dev/null
+++ b/win/CS/HandBrake10.5.1.ReSharper
@@ -0,0 +1,388 @@
+<Configuration>
+ <CodeStyleSettings>
+ <ExternalPath IsNull="False">
+ </ExternalPath>
+ <Sharing>SOLUTION</Sharing>
+ <CSharp>
+ <FormatSettings>
+ <ALIGN_MULTILINE_ARGUMENT>False</ALIGN_MULTILINE_ARGUMENT>
+ <BLANK_LINES_AROUND_SINGLE_LINE_FIELD>1</BLANK_LINES_AROUND_SINGLE_LINE_FIELD>
+ <BLANK_LINES_AROUND_SINGLE_LINE_INVOCABLE>1</BLANK_LINES_AROUND_SINGLE_LINE_INVOCABLE>
+ <BLANK_LINES_BETWEEN_USING_GROUPS>1</BLANK_LINES_BETWEEN_USING_GROUPS>
+ <FORCE_ATTRIBUTE_STYLE>SEPARATE</FORCE_ATTRIBUTE_STYLE>
+ <FORCE_FOR_BRACES_STYLE>ALWAYS_ADD</FORCE_FOR_BRACES_STYLE>
+ <FORCE_FOREACH_BRACES_STYLE>ALWAYS_ADD</FORCE_FOREACH_BRACES_STYLE>
+ <FORCE_IFELSE_BRACES_STYLE>ALWAYS_ADD</FORCE_IFELSE_BRACES_STYLE>
+ <FORCE_WHILE_BRACES_STYLE>ALWAYS_ADD</FORCE_WHILE_BRACES_STYLE>
+ <INDENT_ANONYMOUS_METHOD_BLOCK>False</INDENT_ANONYMOUS_METHOD_BLOCK>
+ <INDENT_EMBRACED_INITIALIZER_BLOCK>False</INDENT_EMBRACED_INITIALIZER_BLOCK>
+ <KEEP_BLANK_LINES_IN_CODE>1</KEEP_BLANK_LINES_IN_CODE>
+ <KEEP_BLANK_LINES_IN_DECLARATIONS>1</KEEP_BLANK_LINES_IN_DECLARATIONS>
+ <KEEP_USER_LINEBREAKS>False</KEEP_USER_LINEBREAKS>
+ <MODIFIERS_ORDER IsNull="False">
+ <Item>public</Item>
+ <Item>protected</Item>
+ <Item>internal</Item>
+ <Item>private</Item>
+ <Item>new</Item>
+ <Item>abstract</Item>
+ <Item>virtual</Item>
+ <Item>override</Item>
+ <Item>sealed</Item>
+ <Item>static</Item>
+ <Item>readonly</Item>
+ <Item>extern</Item>
+ <Item>unsafe</Item>
+ <Item>volatile</Item>
+ </MODIFIERS_ORDER>
+ <PLACE_CONSTRUCTOR_INITIALIZER_ON_SAME_LINE>False</PLACE_CONSTRUCTOR_INITIALIZER_ON_SAME_LINE>
+ <PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE>False</PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE>
+ <PLACE_SIMPLE_ACCESSOR_ON_SINGLE_LINE>False</PLACE_SIMPLE_ACCESSOR_ON_SINGLE_LINE>
+ <PLACE_TYPE_CONSTRAINTS_ON_SAME_LINE>False</PLACE_TYPE_CONSTRAINTS_ON_SAME_LINE>
+ <PLACE_WHILE_ON_NEW_LINE>True</PLACE_WHILE_ON_NEW_LINE>
+ <REDUNDANT_THIS_QUALIFIER_STYLE>ALWAYS_USE</REDUNDANT_THIS_QUALIFIER_STYLE>
+ <SIMPLE_EMBEDDED_STATEMENT_STYLE>ON_SINGLE_LINE</SIMPLE_EMBEDDED_STATEMENT_STYLE>
+ <SPACE_AFTER_TYPECAST_PARENTHESES>False</SPACE_AFTER_TYPECAST_PARENTHESES>
+ <SPACE_AROUND_MULTIPLICATIVE_OP>True</SPACE_AROUND_MULTIPLICATIVE_OP>
+ <SPACE_BEFORE_SIZEOF_PARENTHESES>False</SPACE_BEFORE_SIZEOF_PARENTHESES>
+ <SPACE_BEFORE_TYPEOF_PARENTHESES>False</SPACE_BEFORE_TYPEOF_PARENTHESES>
+ <SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES>True</SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES>
+ <STICK_COMMENT>False</STICK_COMMENT>
+ <WRAP_AFTER_DECLARATION_LPAR>True</WRAP_AFTER_DECLARATION_LPAR>
+ <WRAP_AFTER_INVOCATION_LPAR>True</WRAP_AFTER_INVOCATION_LPAR>
+ <WRAP_ARGUMENTS_STYLE>CHOP_IF_LONG</WRAP_ARGUMENTS_STYLE>
+ <WRAP_BEFORE_FIRST_TYPE_PARAMETER_CONSTRAINT>True</WRAP_BEFORE_FIRST_TYPE_PARAMETER_CONSTRAINT>
+ <WRAP_EXTENDS_LIST_STYLE>CHOP_IF_LONG</WRAP_EXTENDS_LIST_STYLE>
+ <WRAP_PARAMETERS_STYLE>CHOP_IF_LONG</WRAP_PARAMETERS_STYLE>
+ </FormatSettings>
+ <UsingsSettings>
+ <AddImportsToDeepestScope>True</AddImportsToDeepestScope>
+ <QualifiedUsingAtNestedScope>True</QualifiedUsingAtNestedScope>
+ </UsingsSettings>
+ <Naming2>
+ <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>
+ <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>
+ <ExceptionName IsNull="False">
+ </ExceptionName>
+ <OverrideDefaultSettings>True</OverrideDefaultSettings>
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="TypesAndNamespaces" />
+ <PredefinedRule Inspect="True" Prefix="I" Suffix="" Style="AaBb" ElementKind="Interfaces" />
+ <PredefinedRule Inspect="True" Prefix="T" Suffix="" Style="AaBb" ElementKind="TypeParameters" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="MethodPropertyEvent" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="Locals" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="LocalConstants" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="Parameters" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PublicFields" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="Constants" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="StaticReadonly" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="EnumMember" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="Other" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="PrivateInstanceFields" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="PrivateStaticFields" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateConstants" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateStaticReadonly" />
+ <Abbreviation Text="SSA" />
+ <Abbreviation Text="CC" />
+ <Abbreviation Text="UTF" />
+ <Abbreviation Text="TX" />
+ <Abbreviation Text="SRT" />
+ <Abbreviation Text="CLI" />
+ <Abbreviation Text="MP" />
+ <Abbreviation Text="II" />
+ <Abbreviation Text="GUI" />
+ </Naming2>
+ <CustomMemberReorderingPatterns><![CDATA[<?xml version="1.0" encoding="utf-8"?>
+<Patterns xmlns="urn:shemas-jetbrains-com:member-reordering-patterns">
+
+ <!-- Do not reorder COM interfaces -->
+ <Pattern>
+ <Match>
+ <And Weight="2000">
+ <Kind Is="interface"/>
+ <HasAttribute CLRName="System.Runtime.InteropServices.InterfaceTypeAttribute"
+ Inherit="true"/>
+ </And>
+ </Match>
+ </Pattern>
+
+ <!-- Do not reorder P/Invoke structs -->
+ <Pattern>
+ <Match>
+ <And Weight="2000">
+ <Or>
+ <Kind Is="struct"/>
+ <Kind Is="class"/>
+ </Or>
+ <HasAttribute CLRName="System.Runtime.InteropServices.StructLayoutAttribute"
+ Inherit="true"/>
+ </And>
+ </Match>
+ </Pattern>
+
+ <!-- Do not reorder P/Invoke classes (called xxxNativeMethods) -->
+ <Pattern>
+ <Match>
+ <And Weight="2000">
+ <Kind Is="class"/>
+ <Name Is=".*NativeMethods" />
+ </And>
+ </Match>
+ </Pattern>
+
+ <!-- StyleCop pattern -->
+ <Pattern RemoveAllRegions="true">
+ <Match>
+ <Or Weight="1000" >
+ <Kind Is="class" />
+ <Kind Is="struct" />
+ <Kind Is="interface"/>
+ </Or>
+ </Match>
+
+ <!-- constants and fields -->
+ <Entry>
+ <Match>
+ <Or>
+ <Kind Is="constant"/>
+ <Kind Is="field"/>
+ </Or>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private"/>
+ <Kind Order="constant field"/>
+ <Readonly/>
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Constants and Fields"/>
+ </Entry>
+
+ <!-- constructors -->
+ <Entry>
+ <Match>
+ <Or Weight="200">
+ <Kind Is="constructor"/>
+ <Kind Is="destructor"/>
+ </Or>
+ </Match>
+ <Sort>
+ <Static/>
+ <Kind Order="constructor destructor"/>
+ <Access Order="public internal protected-internal protected private"/>
+ </Sort>
+ <Group Region="Constructors and Destructors"/>
+ </Entry>
+
+ <!-- delegates -->
+ <Entry>
+ <Match>
+ <Kind Is="delegate"/>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private" />
+ <Static />
+ <Name/>
+ </Sort>
+ <Group Region="Delegates"/>
+ </Entry>
+
+ <!-- events -->
+ <Entry>
+ <Match>
+ <Kind Is="event"/>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private" />
+ <Static />
+ <Name/>
+ </Sort>
+ <Group Region="Events"/>
+ </Entry>
+
+ <!-- enum -->
+ <Entry>
+ <Match>
+ <Kind Is="enum"/>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private" />
+ <Name/>
+ </Sort>
+ <Group Region="Enums"/>
+ </Entry>
+
+ <!-- interfaces -->
+ <Entry>
+ <Match>
+ <Kind Is="interface" />
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private" />
+ <Name/>
+ </Sort>
+ <Group Region="Interfaces"/>
+ </Entry>
+
+ <!-- properties -->
+ <Entry>
+ <Match>
+ <Kind Is="property"/>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private"/>
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Properties"/>
+ </Entry>
+
+ <!-- indexers -->
+ <Entry>
+ <Match>
+ <Kind Is="indexer"
+ Weight="300" />
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private" />
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Indexers"/>
+ </Entry>
+
+ <!-- operator -->
+ <Entry>
+ <Match>
+ <Kind Is="operator"/>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private" />
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Operators"/>
+ </Entry>
+
+ <!-- public methods -->
+ <Entry>
+ <Match>
+ <And>
+ <Kind Is="method"/>
+ <Access Is="public"/>
+ </And>
+ </Match>
+ <Sort>
+ <Access Order="public"/>
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Public Methods"/>
+ </Entry>
+
+ <!-- Implemented Interfaces -->
+ <Entry>
+ <Match>
+ <And Weight="500">
+ <Kind Is="method"/>
+ <ImplementsInterface CLRName=".*"/>
+ </And>
+ </Match>
+ <Sort>
+ <ImplementsInterface />
+ <Access Order="public internal protected-internal protected private"/>
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Implemented Interfaces">
+ <ImplementsInterface Region="${ImplementsInterface}" />
+ </Group>
+ </Entry>
+
+ <!-- other methods -->
+ <Entry>
+ <Match>
+ <Kind Is="method"/>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private"/>
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Methods"/>
+ </Entry>
+
+ <!-- Nested structs -->
+ <Entry>
+ <Match>
+ <Kind Is="struct"
+ Weight="600" />
+ </Match>
+ <Sort>
+ <Static />
+ <Access Order="public internal protected-internal protected private" />
+ <Name/>
+ </Sort>
+ </Entry>
+
+ <!-- Nested classes -->
+ <Entry>
+ <Match>
+ <Kind Is="class"
+ Weight="700" />
+ </Match>
+ <Sort>
+ <Static />
+ <Access Order="public internal protected-internal protected private" />
+ <Name/>
+ </Sort>
+ </Entry>
+
+ <!-- all other members -->
+ <Entry/>
+
+ </Pattern>
+</Patterns>
+]]></CustomMemberReorderingPatterns>
+ </CSharp>
+ <VB>
+ <FormatSettings />
+ <ImportsSettings />
+ <Naming2>
+ <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>
+ <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>
+ </Naming2>
+ </VB>
+ <Web>
+ <Naming2 />
+ </Web>
+ <Xaml>
+ <Naming2 />
+ </Xaml>
+ <XML>
+ <FormatSettings />
+ </XML>
+ <GenerateMemberBody />
+ <Naming2>
+ <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>
+ <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>
+ <ExceptionName IsNull="False">
+ </ExceptionName>
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="aaBb" ElementKind="Locals" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="aaBb" ElementKind="Parameters" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="TypesAndNamespaces" />
+ <PredefinedRule Inspect="False" Prefix="I" Suffix="" Style="AaBb" ElementKind="Interfaces" />
+ <PredefinedRule Inspect="False" Prefix="T" Suffix="" Style="AaBb" ElementKind="TypeParameters" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="MethodPropertyEvent" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="aaBb" ElementKind="LocalConstants" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="PublicFields" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="Constants" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="StaticReadonly" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="EnumMember" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="Other" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateConstants" />
+ <PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PrivateInstanceFields" />
+ <PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PrivateStaticFields" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateStaticReadonly" />
+ </Naming2>
+ </CodeStyleSettings>
+</Configuration> \ No newline at end of file
diff --git a/win/CS/HandBrake10.sln b/win/CS/HandBrake10.sln
new file mode 100644
index 000000000..f6a702238
--- /dev/null
+++ b/win/CS/HandBrake10.sln
@@ -0,0 +1,110 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HandBrakeCS", "HandBrakeCS.csproj", "{A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HandBrake.ApplicationServices", "HandBrake.ApplicationServices\HandBrake.ApplicationServices.csproj", "{087A2BA8-BAC2-4577-A46F-07FF9D420016}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HandBrakeWPF", "HandBrakeWPF\HandBrakeWPF.csproj", "{DADE66CB-0E12-4959-ADE5-0ACD31D27C59}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|Mixed Platforms = Debug|Mixed Platforms
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Install|Any CPU = Install|Any CPU
+ Install|Mixed Platforms = Install|Mixed Platforms
+ Install|x64 = Install|x64
+ Install|x86 = Install|x86
+ NightlyBuild|Any CPU = NightlyBuild|Any CPU
+ NightlyBuild|Mixed Platforms = NightlyBuild|Mixed Platforms
+ NightlyBuild|x64 = NightlyBuild|x64
+ NightlyBuild|x86 = NightlyBuild|x86
+ Release|Any CPU = Release|Any CPU
+ Release|Mixed Platforms = Release|Mixed Platforms
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Debug|Any CPU.Build.0 = Debug|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Debug|Mixed Platforms.Build.0 = Debug|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Debug|x64.ActiveCfg = Debug|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Debug|x86.ActiveCfg = Debug|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Debug|x86.Build.0 = Debug|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Install|Any CPU.ActiveCfg = Install|Any CPU
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Install|Any CPU.Build.0 = Install|Any CPU
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Install|Mixed Platforms.ActiveCfg = Install|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Install|Mixed Platforms.Build.0 = Install|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Install|x64.ActiveCfg = Install|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Install|x86.ActiveCfg = Install|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Install|x86.Build.0 = Install|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.NightlyBuild|Any CPU.ActiveCfg = NightlyBuild|Any CPU
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.NightlyBuild|Any CPU.Build.0 = NightlyBuild|Any CPU
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.NightlyBuild|Mixed Platforms.ActiveCfg = NightlyBuild|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.NightlyBuild|Mixed Platforms.Build.0 = NightlyBuild|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.NightlyBuild|x64.ActiveCfg = NightlyBuild|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.NightlyBuild|x86.ActiveCfg = NightlyBuild|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.NightlyBuild|x86.Build.0 = NightlyBuild|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Release|Mixed Platforms.ActiveCfg = Release|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Release|Mixed Platforms.Build.0 = Release|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Release|x64.ActiveCfg = Release|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Release|x86.ActiveCfg = Release|x86
+ {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Release|x86.Build.0 = Release|x86
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Install|Any CPU.ActiveCfg = Release|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Install|Any CPU.Build.0 = Release|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Install|Mixed Platforms.ActiveCfg = NightlyBuild|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Install|Mixed Platforms.Build.0 = NightlyBuild|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Install|x64.ActiveCfg = NightlyBuild|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Install|x86.ActiveCfg = Release|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.NightlyBuild|Any CPU.ActiveCfg = NightlyBuild|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.NightlyBuild|Any CPU.Build.0 = NightlyBuild|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.NightlyBuild|Mixed Platforms.ActiveCfg = NightlyBuild|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.NightlyBuild|Mixed Platforms.Build.0 = NightlyBuild|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.NightlyBuild|x64.ActiveCfg = NightlyBuild|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.NightlyBuild|x86.ActiveCfg = Release|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Release|Any CPU.Build.0 = Release|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Release|x64.ActiveCfg = Release|Any CPU
+ {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Release|x86.ActiveCfg = Release|Any CPU
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.Debug|Mixed Platforms.Build.0 = Debug|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.Debug|x64.ActiveCfg = Debug|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.Debug|x86.ActiveCfg = Debug|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.Debug|x86.Build.0 = Debug|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.Install|Any CPU.ActiveCfg = Release|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.Install|Mixed Platforms.ActiveCfg = Release|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.Install|Mixed Platforms.Build.0 = Release|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.Install|x64.ActiveCfg = Release|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.Install|x86.ActiveCfg = Release|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.Install|x86.Build.0 = Release|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.NightlyBuild|Any CPU.ActiveCfg = Release|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.NightlyBuild|Mixed Platforms.ActiveCfg = Release|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.NightlyBuild|Mixed Platforms.Build.0 = Release|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.NightlyBuild|x64.ActiveCfg = Release|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.NightlyBuild|x86.ActiveCfg = Release|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.NightlyBuild|x86.Build.0 = Release|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.Release|Any CPU.ActiveCfg = Release|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.Release|Mixed Platforms.ActiveCfg = Release|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.Release|Mixed Platforms.Build.0 = Release|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.Release|x64.ActiveCfg = Release|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.Release|x86.ActiveCfg = Release|x86
+ {DADE66CB-0E12-4959-ADE5-0ACD31D27C59}.Release|x86.Build.0 = Release|x86
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/win/CS/HandBrakeCS.5.0.ReSharper b/win/CS/HandBrakeCS.5.0.ReSharper
new file mode 100644
index 000000000..59f681991
--- /dev/null
+++ b/win/CS/HandBrakeCS.5.0.ReSharper
@@ -0,0 +1,388 @@
+<Configuration>
+ <CodeStyleSettings>
+ <ExternalPath IsNull="False">
+ </ExternalPath>
+ <Sharing>SOLUTION</Sharing>
+ <CSharp>
+ <FormatSettings>
+ <ALIGN_MULTILINE_ARGUMENT>False</ALIGN_MULTILINE_ARGUMENT>
+ <BLANK_LINES_AROUND_SINGLE_LINE_FIELD>1</BLANK_LINES_AROUND_SINGLE_LINE_FIELD>
+ <BLANK_LINES_AROUND_SINGLE_LINE_INVOCABLE>1</BLANK_LINES_AROUND_SINGLE_LINE_INVOCABLE>
+ <BLANK_LINES_BETWEEN_USING_GROUPS>1</BLANK_LINES_BETWEEN_USING_GROUPS>
+ <FORCE_ATTRIBUTE_STYLE>SEPARATE</FORCE_ATTRIBUTE_STYLE>
+ <FORCE_FOR_BRACES_STYLE>ALWAYS_ADD</FORCE_FOR_BRACES_STYLE>
+ <FORCE_FOREACH_BRACES_STYLE>ALWAYS_ADD</FORCE_FOREACH_BRACES_STYLE>
+ <FORCE_IFELSE_BRACES_STYLE>ALWAYS_ADD</FORCE_IFELSE_BRACES_STYLE>
+ <FORCE_WHILE_BRACES_STYLE>ALWAYS_ADD</FORCE_WHILE_BRACES_STYLE>
+ <INDENT_ANONYMOUS_METHOD_BLOCK>False</INDENT_ANONYMOUS_METHOD_BLOCK>
+ <INDENT_EMBRACED_INITIALIZER_BLOCK>False</INDENT_EMBRACED_INITIALIZER_BLOCK>
+ <KEEP_BLANK_LINES_IN_CODE>1</KEEP_BLANK_LINES_IN_CODE>
+ <KEEP_BLANK_LINES_IN_DECLARATIONS>1</KEEP_BLANK_LINES_IN_DECLARATIONS>
+ <KEEP_USER_LINEBREAKS>False</KEEP_USER_LINEBREAKS>
+ <MODIFIERS_ORDER IsNull="False">
+ <Item>public</Item>
+ <Item>protected</Item>
+ <Item>internal</Item>
+ <Item>private</Item>
+ <Item>new</Item>
+ <Item>abstract</Item>
+ <Item>virtual</Item>
+ <Item>override</Item>
+ <Item>sealed</Item>
+ <Item>static</Item>
+ <Item>readonly</Item>
+ <Item>extern</Item>
+ <Item>unsafe</Item>
+ <Item>volatile</Item>
+ </MODIFIERS_ORDER>
+ <PLACE_CONSTRUCTOR_INITIALIZER_ON_SAME_LINE>False</PLACE_CONSTRUCTOR_INITIALIZER_ON_SAME_LINE>
+ <PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE>False</PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE>
+ <PLACE_SIMPLE_ACCESSOR_ON_SINGLE_LINE>False</PLACE_SIMPLE_ACCESSOR_ON_SINGLE_LINE>
+ <PLACE_TYPE_CONSTRAINTS_ON_SAME_LINE>False</PLACE_TYPE_CONSTRAINTS_ON_SAME_LINE>
+ <PLACE_WHILE_ON_NEW_LINE>True</PLACE_WHILE_ON_NEW_LINE>
+ <REDUNDANT_THIS_QUALIFIER_STYLE>ALWAYS_USE</REDUNDANT_THIS_QUALIFIER_STYLE>
+ <SIMPLE_EMBEDDED_STATEMENT_STYLE>ON_SINGLE_LINE</SIMPLE_EMBEDDED_STATEMENT_STYLE>
+ <SPACE_AFTER_TYPECAST_PARENTHESES>False</SPACE_AFTER_TYPECAST_PARENTHESES>
+ <SPACE_AROUND_MULTIPLICATIVE_OP>True</SPACE_AROUND_MULTIPLICATIVE_OP>
+ <SPACE_BEFORE_SIZEOF_PARENTHESES>False</SPACE_BEFORE_SIZEOF_PARENTHESES>
+ <SPACE_BEFORE_TYPEOF_PARENTHESES>False</SPACE_BEFORE_TYPEOF_PARENTHESES>
+ <SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES>True</SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES>
+ <STICK_COMMENT>False</STICK_COMMENT>
+ <WRAP_AFTER_DECLARATION_LPAR>True</WRAP_AFTER_DECLARATION_LPAR>
+ <WRAP_AFTER_INVOCATION_LPAR>True</WRAP_AFTER_INVOCATION_LPAR>
+ <WRAP_ARGUMENTS_STYLE>CHOP_IF_LONG</WRAP_ARGUMENTS_STYLE>
+ <WRAP_BEFORE_FIRST_TYPE_PARAMETER_CONSTRAINT>True</WRAP_BEFORE_FIRST_TYPE_PARAMETER_CONSTRAINT>
+ <WRAP_EXTENDS_LIST_STYLE>CHOP_IF_LONG</WRAP_EXTENDS_LIST_STYLE>
+ <WRAP_PARAMETERS_STYLE>CHOP_IF_LONG</WRAP_PARAMETERS_STYLE>
+ </FormatSettings>
+ <UsingsSettings>
+ <AddImportsToDeepestScope>True</AddImportsToDeepestScope>
+ <QualifiedUsingAtNestedScope>True</QualifiedUsingAtNestedScope>
+ </UsingsSettings>
+ <Naming2>
+ <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>
+ <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>
+ <ExceptionName IsNull="False">
+ </ExceptionName>
+ <OverrideDefaultSettings>True</OverrideDefaultSettings>
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="TypesAndNamespaces" />
+ <PredefinedRule Inspect="True" Prefix="I" Suffix="" Style="AaBb" ElementKind="Interfaces" />
+ <PredefinedRule Inspect="True" Prefix="T" Suffix="" Style="AaBb" ElementKind="TypeParameters" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="MethodPropertyEvent" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="Locals" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="LocalConstants" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="Parameters" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PublicFields" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="Constants" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="StaticReadonly" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="EnumMember" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="Other" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="PrivateInstanceFields" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="PrivateStaticFields" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateConstants" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateStaticReadonly" />
+ </Naming2>
+ <CustomMemberReorderingPatterns><![CDATA[<?xml version="1.0" encoding="utf-8"?>
+<Patterns xmlns="urn:shemas-jetbrains-com:member-reordering-patterns">
+
+ <!-- Do not reorder COM interfaces -->
+ <Pattern>
+ <Match>
+ <And Weight="2000">
+ <Kind Is="interface"/>
+ <HasAttribute CLRName="System.Runtime.InteropServices.InterfaceTypeAttribute"
+ Inherit="true"/>
+ </And>
+ </Match>
+ </Pattern>
+
+ <!-- Do not reorder P/Invoke structs -->
+ <Pattern>
+ <Match>
+ <And Weight="2000">
+ <Or>
+ <Kind Is="struct"/>
+ <Kind Is="class"/>
+ </Or>
+ <HasAttribute CLRName="System.Runtime.InteropServices.StructLayoutAttribute"
+ Inherit="true"/>
+ </And>
+ </Match>
+ </Pattern>
+
+ <!-- Do not reorder P/Invoke classes (called xxxNativeMethods) -->
+ <Pattern>
+ <Match>
+ <And Weight="2000">
+ <Kind Is="class"/>
+ <Name Is=".*NativeMethods" />
+ </And>
+ </Match>
+ </Pattern>
+
+ <!-- StyleCop pattern -->
+ <Pattern RemoveAllRegions="true">
+ <Match>
+ <Or Weight="1000" >
+ <Kind Is="class" />
+ <Kind Is="struct" />
+ <Kind Is="interface"/>
+ </Or>
+ </Match>
+
+ <!-- constants and fields -->
+ <Entry>
+ <Match>
+ <Or>
+ <Kind Is="constant"/>
+ <Kind Is="field"/>
+ </Or>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private"/>
+ <Kind Order="constant field"/>
+ <Readonly/>
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Constants and Fields"/>
+ </Entry>
+
+ <!-- constructors -->
+ <Entry>
+ <Match>
+ <Or Weight="200">
+ <Kind Is="constructor"/>
+ <Kind Is="destructor"/>
+ </Or>
+ </Match>
+ <Sort>
+ <Static/>
+ <Kind Order="constructor destructor"/>
+ <Access Order="public internal protected-internal protected private"/>
+ </Sort>
+ <Group Region="Constructors and Destructors"/>
+ </Entry>
+
+ <!-- delegates -->
+ <Entry>
+ <Match>
+ <Kind Is="delegate"/>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private" />
+ <Static />
+ <Name/>
+ </Sort>
+ <Group Region="Delegates"/>
+ </Entry>
+
+ <!-- events -->
+ <Entry>
+ <Match>
+ <Kind Is="event"/>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private" />
+ <Static />
+ <Name/>
+ </Sort>
+ <Group Region="Events"/>
+ </Entry>
+
+ <!-- enum -->
+ <Entry>
+ <Match>
+ <Kind Is="enum"/>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private" />
+ <Name/>
+ </Sort>
+ <Group Region="Enums"/>
+ </Entry>
+
+ <!-- interfaces -->
+ <Entry>
+ <Match>
+ <Kind Is="interface" />
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private" />
+ <Name/>
+ </Sort>
+ <Group Region="Interfaces"/>
+ </Entry>
+
+ <!-- properties -->
+ <Entry>
+ <Match>
+ <Kind Is="property"/>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private"/>
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Properties"/>
+ </Entry>
+
+ <!-- indexers -->
+ <Entry>
+ <Match>
+ <Kind Is="indexer"
+ Weight="300" />
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private" />
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Indexers"/>
+ </Entry>
+
+ <!-- operator -->
+ <Entry>
+ <Match>
+ <Kind Is="operator"/>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private" />
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Operators"/>
+ </Entry>
+
+ <!-- public methods -->
+ <Entry>
+ <Match>
+ <And>
+ <Kind Is="method"/>
+ <Access Is="public"/>
+ </And>
+ </Match>
+ <Sort>
+ <Access Order="public"/>
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Public Methods"/>
+ </Entry>
+
+ <!-- Implemented Interfaces -->
+ <Entry>
+ <Match>
+ <And Weight="500">
+ <Kind Is="method"/>
+ <ImplementsInterface CLRName=".*"/>
+ </And>
+ </Match>
+ <Sort>
+ <ImplementsInterface />
+ <Access Order="public internal protected-internal protected private"/>
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Implemented Interfaces">
+ <ImplementsInterface Region="${ImplementsInterface}" />
+ </Group>
+ </Entry>
+
+ <!-- other methods -->
+ <Entry>
+ <Match>
+ <Kind Is="method"/>
+ </Match>
+ <Sort>
+ <Access Order="public internal protected-internal protected private"/>
+ <Static/>
+ <Name/>
+ </Sort>
+ <Group Region="Methods"/>
+ </Entry>
+
+ <!-- Nested structs -->
+ <Entry>
+ <Match>
+ <Kind Is="struct"
+ Weight="600" />
+ </Match>
+ <Sort>
+ <Static />
+ <Access Order="public internal protected-internal protected private" />
+ <Name/>
+ </Sort>
+ </Entry>
+
+ <!-- Nested classes -->
+ <Entry>
+ <Match>
+ <Kind Is="class"
+ Weight="700" />
+ </Match>
+ <Sort>
+ <Static />
+ <Access Order="public internal protected-internal protected private" />
+ <Name/>
+ </Sort>
+ </Entry>
+
+ <!-- all other members -->
+ <Entry/>
+
+ </Pattern>
+</Patterns>
+]]></CustomMemberReorderingPatterns>
+ </CSharp>
+ <VB>
+ <FormatSettings />
+ <ImportsSettings />
+ <Naming2>
+ <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>
+ <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>
+ </Naming2>
+ </VB>
+ <Web>
+ <Naming2 />
+ </Web>
+ <Xaml>
+ <Naming2 />
+ </Xaml>
+ <XML>
+ <FormatSettings />
+ </XML>
+ <FileHeader><![CDATA[/* file.cs$
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>
+ It may be used under the terms of the GNU General Public License. */]]></FileHeader>
+ <GenerateMemberBody />
+ <Naming2>
+ <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>
+ <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>
+ <ExceptionName IsNull="False">
+ </ExceptionName>
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="aaBb" ElementKind="Locals" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="aaBb" ElementKind="Parameters" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="TypesAndNamespaces" />
+ <PredefinedRule Inspect="False" Prefix="I" Suffix="" Style="AaBb" ElementKind="Interfaces" />
+ <PredefinedRule Inspect="False" Prefix="T" Suffix="" Style="AaBb" ElementKind="TypeParameters" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="MethodPropertyEvent" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="aaBb" ElementKind="LocalConstants" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="PublicFields" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="Constants" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="StaticReadonly" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="EnumMember" />
+ <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="Other" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateConstants" />
+ <PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PrivateInstanceFields" />
+ <PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PrivateStaticFields" />
+ <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateStaticReadonly" />
+ <Abbreviation Text="CLI" />
+ <Abbreviation Text="DRC" />
+ <Abbreviation Text="ID" />
+ <Abbreviation Text="MP" />
+ <Abbreviation Text="DVD" />
+ </Naming2>
+ </CodeStyleSettings>
+</Configuration> \ No newline at end of file
diff --git a/win/CS/HandBrakeCS.csproj b/win/CS/HandBrakeCS.csproj
new file mode 100644
index 000000000..b35ba3c8d
--- /dev/null
+++ b/win/CS/HandBrakeCS.csproj
@@ -0,0 +1,528 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>9.0.21022</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}</ProjectGuid>
+ <OutputType>WinExe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>Handbrake</RootNamespace>
+ <AssemblyName>Handbrake</AssemblyName>
+ <ApplicationIcon>handbrakepineapple.ico</ApplicationIcon>
+ <StartupObject>Handbrake.Program</StartupObject>
+ <TargetZone>LocalIntranet</TargetZone>
+ <GenerateManifests>false</GenerateManifests>
+ <FileUpgradeFlags>
+ </FileUpgradeFlags>
+ <UpgradeBackupLocation>
+ </UpgradeBackupLocation>
+ <OldToolsVersion>3.5</OldToolsVersion>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ <IsWebBootstrapper>false</IsWebBootstrapper>
+ <SignManifests>false</SignManifests>
+ <PublishUrl>publish\</PublishUrl>
+ <Install>true</Install>
+ <InstallFrom>Disk</InstallFrom>
+ <UpdateEnabled>false</UpdateEnabled>
+ <UpdateMode>Foreground</UpdateMode>
+ <UpdateInterval>7</UpdateInterval>
+ <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+ <UpdatePeriodically>false</UpdatePeriodically>
+ <UpdateRequired>false</UpdateRequired>
+ <MapFileExtensions>true</MapFileExtensions>
+ <ApplicationRevision>0</ApplicationRevision>
+ <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+ <UseApplicationTrust>false</UseApplicationTrust>
+ <BootstrapperEnabled>true</BootstrapperEnabled>
+ <TargetFrameworkProfile>Client</TargetFrameworkProfile>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <LangVersion>default</LangVersion>
+ <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+ <NoStdLib>false</NoStdLib>
+ <DocumentationFile>
+ </DocumentationFile>
+ <PlatformTarget>x86</PlatformTarget>
+ <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>full</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+ <UseVSHostingProcess>false</UseVSHostingProcess>
+ <DocumentationFile>
+ </DocumentationFile>
+ <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
+ <NoStdLib>false</NoStdLib>
+ <DebugSymbols>true</DebugSymbols>
+ <FileAlignment>512</FileAlignment>
+ <PlatformTarget>x86</PlatformTarget>
+ <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+ <PlatformTarget>x86</PlatformTarget>
+ <OutputPath>bin\x86\Debug\</OutputPath>
+ <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+ <PlatformTarget>x86</PlatformTarget>
+ <OutputPath>bin\x86\Release\</OutputPath>
+ <UseVSHostingProcess>false</UseVSHostingProcess>
+ <DefineConstants>TRACE;DEBUG</DefineConstants>
+ <Optimize>true</Optimize>
+ <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Build|AnyCPU' ">
+ <OutputPath>bin\Build\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <DebugType>pdbonly</DebugType>
+ <PlatformTarget>x86</PlatformTarget>
+ <ErrorReport>prompt</ErrorReport>
+ <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Build|x86' ">
+ <OutputPath>bin\x86\Build\</OutputPath>
+ <PlatformTarget>x86</PlatformTarget>
+ <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Install|AnyCPU'">
+ <DebugSymbols>true</DebugSymbols>
+ <OutputPath>bin\Install\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
+ <Optimize>true</Optimize>
+ <DebugType>full</DebugType>
+ <PlatformTarget>x86</PlatformTarget>
+ <CodeAnalysisLogFile>bin\Release\Handbrake.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+ <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+ <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+ <UseVSHostingProcess>false</UseVSHostingProcess>
+ <ErrorReport>prompt</ErrorReport>
+ <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSetDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+ <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+ <CodeAnalysisRuleDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+ <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+ <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Install|x86'">
+ <OutputPath>bin\x86\Install\</OutputPath>
+ <DefineConstants>TRACE;DEBUG</DefineConstants>
+ <Optimize>true</Optimize>
+ <PlatformTarget>x86</PlatformTarget>
+ <CodeAnalysisLogFile>bin\x86\Release\Handbrake.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+ <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+ <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+ <UseVSHostingProcess>false</UseVSHostingProcess>
+ <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSetDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+ <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+ <CodeAnalysisRuleDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+ <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+ <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'NightlyBuild|AnyCPU'">
+ <OutputPath>bin\NightlyBuild\</OutputPath>
+ <Optimize>true</Optimize>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'NightlyBuild|x86'">
+ <OutputPath>bin\x86\NightlyBuild\</OutputPath>
+ <DefineConstants>TRACE;DEBUG</DefineConstants>
+ <Optimize>true</Optimize>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="AxInterop.QTOControlLib">
+ <HintPath>libraries\AxInterop.QTOControlLib.dll</HintPath>
+ </Reference>
+ <Reference Include="Growl.Connector, Version=2.0.0.0, Culture=neutral, PublicKeyToken=980c2339411be384, processorArchitecture=x86">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>libraries\Growl.Connector.dll</HintPath>
+ <Private>True</Private>
+ </Reference>
+ <Reference Include="Growl.CoreLibrary, Version=2.0.0.0, Culture=neutral, PublicKeyToken=13e59d82e007b064, processorArchitecture=x86">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>libraries\Growl.CoreLibrary.dll</HintPath>
+ <Private>True</Private>
+ </Reference>
+ <Reference Include="PresentationCore">
+ <RequiredTargetFramework>3.0</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="PresentationFramework">
+ <RequiredTargetFramework>3.0</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="System" />
+ <Reference Include="System.Core">
+ <RequiredTargetFramework>3.5</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="System.Data" />
+ <Reference Include="System.Deployment" />
+ <Reference Include="System.Drawing" />
+ <Reference Include="System.Messaging" />
+ <Reference Include="System.Windows.Forms" />
+ <Reference Include="System.XML" />
+ <Reference Include="WindowsBase" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Controls\AudioPanel.cs">
+ <SubType>UserControl</SubType>
+ </Compile>
+ <Compile Include="Controls\AudioPanel.Designer.cs">
+ <DependentUpon>AudioPanel.cs</DependentUpon>
+ </Compile>
+ <Compile Include="Controls\AdvancedEncoderOpts.cs">
+ <SubType>UserControl</SubType>
+ </Compile>
+ <Compile Include="Controls\AdvancedEncoderOpts.Designer.cs">
+ <DependentUpon>AdvancedEncoderOpts.cs</DependentUpon>
+ </Compile>
+ <Compile Include="Controls\Filters.cs">
+ <SubType>UserControl</SubType>
+ </Compile>
+ <Compile Include="Controls\Filters.Designer.cs">
+ <DependentUpon>Filters.cs</DependentUpon>
+ </Compile>
+ <Compile Include="Controls\PictureSettings.cs">
+ <SubType>UserControl</SubType>
+ </Compile>
+ <Compile Include="Controls\PictureSettings.designer.cs">
+ <DependentUpon>PictureSettings.cs</DependentUpon>
+ </Compile>
+ <Compile Include="Controls\Subtitles.cs">
+ <SubType>UserControl</SubType>
+ </Compile>
+ <Compile Include="Controls\Subtitles.Designer.cs">
+ <DependentUpon>Subtitles.cs</DependentUpon>
+ </Compile>
+ <Compile Include="Controls\x264Panel.cs">
+ <SubType>UserControl</SubType>
+ </Compile>
+ <Compile Include="Controls\x264Panel.Designer.cs">
+ <DependentUpon>x264Panel.cs</DependentUpon>
+ </Compile>
+ <Compile Include="Functions\ToolStripRenderOverride.cs" />
+ <Compile Include="Model\ActivityLogMode.cs" />
+ <Compile Include="Model\QueryPictureSettingsMode.cs" />
+ <Compile Include="Model\QueryEncodeMode.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="frmPreview.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="frmPreview.Designer.cs">
+ <DependentUpon>frmPreview.cs</DependentUpon>
+ </Compile>
+ <Compile Include="frmAbout.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="frmAbout.Designer.cs">
+ <DependentUpon>frmAbout.cs</DependentUpon>
+ </Compile>
+ <Compile Include="frmAddPreset.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="frmAddPreset.Designer.cs">
+ <DependentUpon>frmAddPreset.cs</DependentUpon>
+ </Compile>
+ <Compile Include="frmMain.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="frmMain.Designer.cs">
+ <DependentUpon>frmMain.cs</DependentUpon>
+ </Compile>
+ <Compile Include="frmOptions.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="frmOptions.Designer.cs">
+ <DependentUpon>frmOptions.cs</DependentUpon>
+ </Compile>
+ <Compile Include="frmQueue.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="frmQueue.Designer.cs">
+ <DependentUpon>frmQueue.cs</DependentUpon>
+ </Compile>
+ <Compile Include="Functions\PresetLoader.cs" />
+ <Compile Include="Functions\QueryGenerator.cs" />
+ <Compile Include="Functions\Main.cs" />
+ <Compile Include="frmActivityWindow.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="frmActivityWindow.Designer.cs">
+ <DependentUpon>frmActivityWindow.cs</DependentUpon>
+ </Compile>
+ <Compile Include="Model\SourceType.cs" />
+ <Compile Include="Program.cs" />
+ <Compile Include="ToolWindows\BatchAdd.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="ToolWindows\BatchAdd.Designer.cs">
+ <DependentUpon>BatchAdd.cs</DependentUpon>
+ </Compile>
+ <Compile Include="ToolWindows\DownloadUpdate.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="ToolWindows\DownloadUpdate.Designer.cs">
+ <DependentUpon>DownloadUpdate.cs</DependentUpon>
+ </Compile>
+ <Compile Include="ToolWindows\ExceptionWindow.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="ToolWindows\ExceptionWindow.designer.cs">
+ <DependentUpon>ExceptionWindow.cs</DependentUpon>
+ </Compile>
+ <Compile Include="ToolWindows\PreviewOverlay.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="ToolWindows\PreviewOverlay.Designer.cs">
+ <DependentUpon>PreviewOverlay.cs</DependentUpon>
+ </Compile>
+ <Compile Include="ToolWindows\TitleSpecificScan.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="ToolWindows\TitleSpecificScan.Designer.cs">
+ <DependentUpon>TitleSpecificScan.cs</DependentUpon>
+ </Compile>
+ <Compile Include="ToolWindows\UpdateInfo.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="ToolWindows\UpdateInfo.Designer.cs">
+ <DependentUpon>UpdateInfo.cs</DependentUpon>
+ </Compile>
+ <EmbeddedResource Include="Controls\AudioPanel.resx">
+ <DependentUpon>AudioPanel.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Controls\AdvancedEncoderOpts.resx">
+ <DependentUpon>AdvancedEncoderOpts.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Controls\Filters.resx">
+ <DependentUpon>Filters.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Controls\PictureSettings.resx">
+ <DependentUpon>PictureSettings.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Controls\Subtitles.resx">
+ <DependentUpon>Subtitles.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Controls\x264Panel.resx">
+ <DependentUpon>x264Panel.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="frmPreview.resx">
+ <DependentUpon>frmPreview.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="frmAbout.resx">
+ <SubType>Designer</SubType>
+ <DependentUpon>frmAbout.cs</DependentUpon>
+ </EmbeddedResource>
+ <EmbeddedResource Include="frmAddPreset.resx">
+ <DependentUpon>frmAddPreset.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="frmMain.resx">
+ <SubType>Designer</SubType>
+ <DependentUpon>frmMain.cs</DependentUpon>
+ </EmbeddedResource>
+ <EmbeddedResource Include="frmOptions.resx">
+ <SubType>Designer</SubType>
+ <DependentUpon>frmOptions.cs</DependentUpon>
+ </EmbeddedResource>
+ <EmbeddedResource Include="frmQueue.resx">
+ <SubType>Designer</SubType>
+ <DependentUpon>frmQueue.cs</DependentUpon>
+ </EmbeddedResource>
+ <EmbeddedResource Include="frmActivityWindow.resx">
+ <DependentUpon>frmActivityWindow.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Properties\Resources.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <Compile Include="Properties\Resources.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Resources.resx</DependentUpon>
+ <DesignTime>True</DesignTime>
+ </Compile>
+ <EmbeddedResource Include="ToolWindows\BatchAdd.resx">
+ <DependentUpon>BatchAdd.cs</DependentUpon>
+ </EmbeddedResource>
+ <EmbeddedResource Include="ToolWindows\DownloadUpdate.resx">
+ <DependentUpon>DownloadUpdate.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="ToolWindows\ExceptionWindow.resx">
+ <DependentUpon>ExceptionWindow.cs</DependentUpon>
+ </EmbeddedResource>
+ <EmbeddedResource Include="ToolWindows\PreviewOverlay.resx">
+ <DependentUpon>PreviewOverlay.cs</DependentUpon>
+ </EmbeddedResource>
+ <EmbeddedResource Include="ToolWindows\TitleSpecificScan.resx">
+ <DependentUpon>TitleSpecificScan.cs</DependentUpon>
+ </EmbeddedResource>
+ <EmbeddedResource Include="ToolWindows\UpdateInfo.resx">
+ <DependentUpon>UpdateInfo.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <None Include="app.config" />
+ <None Include="Installer\MakeNightly.nsi.tmpl" />
+ <None Include="Installer\MakeNightly.nsi" />
+ <None Include="Installer\Installer.nsi" />
+ <None Include="Properties\Settings.settings">
+ <Generator>SettingsSingleFileGenerator</Generator>
+ <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+ </None>
+ <Compile Include="Properties\Settings.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Settings.settings</DependentUpon>
+ <DesignTimeSharedInput>True</DesignTimeSharedInput>
+ </Compile>
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="handbrakepineapple.ico" />
+ <None Include="Properties\AssemblyInfo.cs.tmpl" />
+ <None Include="Resources\logo64.png" />
+ <None Include="Resources\logo128.png" />
+ <None Include="Resources\ActivityWindow.png" />
+ <None Include="Resources\AddToQueue.png" />
+ <Content Include="Resources\ActivityWindow_small.png" />
+ <None Include="Resources\AddToQueue_small.png" />
+ <None Include="Resources\Add16.png" />
+ <Content Include="Resources\copy.png" />
+ <Content Include="Resources\disc_small.png" />
+ <None Include="Resources\hb32.png" />
+ <None Include="Resources\hb16.png" />
+ <None Include="Resources\Help16.png" />
+ <None Include="Resources\info16.png" />
+ <None Include="Resources\folder.png" />
+ <None Include="Resources\download.png" />
+ <None Include="Resources\ErrorX.png" />
+ <None Include="Resources\Help32.png" />
+ <None Include="Resources\Help24.png" />
+ <None Include="Resources\Options24.png" />
+ <Content Include="Resources\Output_Small.png" />
+ <None Include="Resources\Pause.png" />
+ <None Include="Resources\Play.png" />
+ <None Include="Resources\picture.png" />
+ <None Include="Resources\Play_small.png" />
+ <Content Include="Resources\Pref_Small.png" />
+ <Content Include="Resources\Queue.png" />
+ <Content Include="Resources\Queue_Small.png" />
+ <Content Include="Resources\window.png" />
+ <None Include="Resources\save.png" />
+ <None Include="Resources\stop.png" />
+ <None Include="Resources\Movies.png" />
+ <None Include="Resources\General Preferences.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+ <Visible>False</Visible>
+ <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+ <Install>false</Install>
+ </BootstrapperPackage>
+ <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+ <Visible>False</Visible>
+ <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+ <Install>false</Install>
+ </BootstrapperPackage>
+ <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+ <Visible>False</Visible>
+ <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+ <Install>false</Install>
+ </BootstrapperPackage>
+ <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+ <Visible>False</Visible>
+ <ProductName>.NET Framework 3.5</ProductName>
+ <Install>true</Install>
+ </BootstrapperPackage>
+ <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+ <Visible>False</Visible>
+ <ProductName>.NET Framework 3.5 SP1</ProductName>
+ <Install>false</Install>
+ </BootstrapperPackage>
+ <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+ <Visible>False</Visible>
+ <ProductName>Windows Installer 3.1</ProductName>
+ <Install>true</Install>
+ </BootstrapperPackage>
+ </ItemGroup>
+ <ItemGroup>
+ <COMReference Include="QTOControlLib">
+ <Guid>{7B92F833-027D-402B-BFF9-A67697366F4E}</Guid>
+ <VersionMajor>1</VersionMajor>
+ <VersionMinor>0</VersionMinor>
+ <Lcid>0</Lcid>
+ <WrapperTool>tlbimp</WrapperTool>
+ <Isolated>False</Isolated>
+ </COMReference>
+ <COMReference Include="QTOLibrary">
+ <Guid>{29866AED-1E14-417D-BA0F-1A2BE6F5A19E}</Guid>
+ <VersionMajor>1</VersionMajor>
+ <VersionMinor>0</VersionMinor>
+ <Lcid>0</Lcid>
+ <WrapperTool>tlbimp</WrapperTool>
+ <Isolated>False</Isolated>
+ </COMReference>
+ <COMReference Include="stdole">
+ <Guid>{00020430-0000-0000-C000-000000000046}</Guid>
+ <VersionMajor>2</VersionMajor>
+ <VersionMinor>0</VersionMinor>
+ <Lcid>0</Lcid>
+ <WrapperTool>primary</WrapperTool>
+ <Isolated>False</Isolated>
+ </COMReference>
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="HandBrake.ApplicationServices\HandBrake.ApplicationServices.csproj">
+ <Project>{087A2BA8-BAC2-4577-A46F-07FF9D420016}</Project>
+ <Name>HandBrake.ApplicationServices</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+ <Import Project="$(ProgramFiles)\MSBuild\Microsoft\StyleCop\v4.4\Microsoft.StyleCop.targets" />
+ <PropertyGroup Condition=" '$(Configuration)' == 'Install' ">
+ <PostBuildEvent>
+ makensis Installer.nsi
+ </PostBuildEvent>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)' == 'NightlyBuild' ">
+ <PostBuildEvent>
+ copy "$(ProjectDir)Installer\MakeNightly.nsi" "$(ProjectDir)bin\NightlyBuild" /Y
+ copy "$(ProjectDir)handbrakepineapple.ico" "$(ProjectDir)bin\NightlyBuild" /Y
+ xcopy "$(ProjectDir)doc" "$(ProjectDir)bin\NightlyBuild\doc" /I /Y
+ makensis "$(ProjectDir)bin\NightlyBuild\MakeNightly.nsi"
+ </PostBuildEvent>
+ </PropertyGroup>
+ <PropertyGroup>
+ <PreBuildEvent>
+ subwcrev.exe "$(ProjectDir)." "$(ProjectDir)Properties\AssemblyInfo.cs.tmpl" "$(ProjectDir)Properties\AssemblyInfo.cs"
+ subwcrev.exe "$(ProjectDir)." "$(ProjectDir)Properties\AssemblyInfo.cs.tmpl" "$(ProjectDir)Properties\AssemblyInfo.cs"
+ subwcrev.exe "$(ProjectDir)." "$(ProjectDir)Installer\MakeNightly.nsi.tmpl" "$(ProjectDir)Installer\MakeNightly.nsi"</PreBuildEvent>
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/win/CS/HandBrakeWPF/App.xaml b/win/CS/HandBrakeWPF/App.xaml
new file mode 100644
index 000000000..a00960ad3
--- /dev/null
+++ b/win/CS/HandBrakeWPF/App.xaml
@@ -0,0 +1,13 @@
+<Application x:Class="HandBrakeWPF.App"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:HandBrakeWPF.Services">
+ <Application.Resources>
+ <ResourceDictionary>
+ <ResourceDictionary.MergedDictionaries>
+ <ResourceDictionary>
+ <local:MefBootstrapper x:Key="bootstrapper" />
+ </ResourceDictionary>
+ </ResourceDictionary.MergedDictionaries>
+ </ResourceDictionary>
+ </Application.Resources>
+</Application>
diff --git a/win/CS/HandBrakeWPF/App.xaml.cs b/win/CS/HandBrakeWPF/App.xaml.cs
new file mode 100644
index 000000000..8b47a6291
--- /dev/null
+++ b/win/CS/HandBrakeWPF/App.xaml.cs
@@ -0,0 +1,27 @@
+/* App.xaml.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrakeWPF
+{
+ /// <summary>
+ /// Interaction logic for App.xaml
+ /// </summary>
+ public partial class App
+ {
+ /*
+ * TODO:
+ * - Setup Castle Windsor support for services.
+ *
+ *
+ */
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="App"/> class.
+ /// </summary>
+ public App()
+ {
+ }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/HandBrakeWPF.csproj b/win/CS/HandBrakeWPF/HandBrakeWPF.csproj
new file mode 100644
index 000000000..0937aea29
--- /dev/null
+++ b/win/CS/HandBrakeWPF/HandBrakeWPF.csproj
@@ -0,0 +1,297 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
+ <ProductVersion>8.0.30703</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{DADE66CB-0E12-4959-ADE5-0ACD31D27C59}</ProjectGuid>
+ <OutputType>WinExe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>HandBrakeWPF</RootNamespace>
+ <AssemblyName>HandBrakeWPF</AssemblyName>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ <TargetFrameworkProfile>Client</TargetFrameworkProfile>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+ <PlatformTarget>x86</PlatformTarget>
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+ <PlatformTarget>x86</PlatformTarget>
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="Caliburn.Core">
+ <HintPath>..\libraries\caliburn\Caliburn.Core.dll</HintPath>
+ </Reference>
+ <Reference Include="Caliburn.DynamicProxy">
+ <HintPath>..\libraries\caliburn\Caliburn.DynamicProxy.dll</HintPath>
+ </Reference>
+ <Reference Include="Caliburn.FluentValidation">
+ <HintPath>..\libraries\caliburn\Caliburn.FluentValidation.dll</HintPath>
+ </Reference>
+ <Reference Include="Caliburn.MEF">
+ <HintPath>..\libraries\caliburn\Caliburn.MEF.dll</HintPath>
+ </Reference>
+ <Reference Include="Caliburn.PresentationFramework">
+ <HintPath>..\libraries\caliburn\Caliburn.PresentationFramework.dll</HintPath>
+ </Reference>
+ <Reference Include="Caliburn.ShellFramework">
+ <HintPath>..\libraries\caliburn\Caliburn.ShellFramework.dll</HintPath>
+ </Reference>
+ <Reference Include="Caliburn.Windsor">
+ <HintPath>..\libraries\caliburn\Caliburn.Windsor.dll</HintPath>
+ </Reference>
+ <Reference Include="Castle.Core">
+ <HintPath>..\libraries\caliburn\Castle.Core.dll</HintPath>
+ </Reference>
+ <Reference Include="Castle.Windsor">
+ <HintPath>..\libraries\caliburn\Castle.Windsor.dll</HintPath>
+ </Reference>
+ <Reference Include="Common.Logging">
+ <HintPath>..\libraries\caliburn\Common.Logging.dll</HintPath>
+ </Reference>
+ <Reference Include="FluentValidation">
+ <HintPath>..\libraries\caliburn\FluentValidation.dll</HintPath>
+ </Reference>
+ <Reference Include="Microsoft.Practices.Composite">
+ <HintPath>..\libraries\caliburn\Microsoft.Practices.Composite.dll</HintPath>
+ </Reference>
+ <Reference Include="Microsoft.Practices.Composite.Presentation">
+ <HintPath>..\libraries\caliburn\Microsoft.Practices.Composite.Presentation.dll</HintPath>
+ </Reference>
+ <Reference Include="System" />
+ <Reference Include="System.ComponentModel.Composition" />
+ <Reference Include="System.CoreEx">
+ <HintPath>..\libraries\caliburn\System.CoreEx.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Data" />
+ <Reference Include="System.Interactive">
+ <HintPath>..\libraries\caliburn\System.Interactive.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive">
+ <HintPath>..\libraries\caliburn\System.Reactive.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Xml" />
+ <Reference Include="Microsoft.CSharp" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.Xml.Linq" />
+ <Reference Include="System.Data.DataSetExtensions" />
+ <Reference Include="System.Xaml">
+ <RequiredTargetFramework>4.0</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="WindowsBase" />
+ <Reference Include="PresentationCore" />
+ <Reference Include="PresentationFramework" />
+ <Reference Include="WPFToolkit.Extended">
+ <HintPath>..\libraries\WPFToolkit.Extended.dll</HintPath>
+ </Reference>
+ </ItemGroup>
+ <ItemGroup>
+ <ApplicationDefinition Include="App.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </ApplicationDefinition>
+ <Compile Include="Services\MefBootstrapper.cs" />
+ <Compile Include="ViewModels\AboutViewModel.cs" />
+ <Compile Include="ViewModels\AddPresetViewModel.cs" />
+ <Compile Include="ViewModels\Interfaces\IMainViewModel.cs" />
+ <Compile Include="ViewModels\PreviewViewModel.cs" />
+ <Compile Include="ViewModels\QueueViewModel.cs" />
+ <Compile Include="ViewModels\OptionsViewModel.cs" />
+ <Compile Include="ViewModels\ViewModelBase.cs" />
+ <Compile Include="Views\AboutView.xaml.cs">
+ <DependentUpon>AboutView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="App.xaml.cs">
+ <DependentUpon>App.xaml</DependentUpon>
+ <SubType>Code</SubType>
+ </Compile>
+ <Compile Include="ViewModels\MainViewModel.cs" />
+ <Compile Include="Views\Controls\AdvancedView.xaml.cs">
+ <DependentUpon>AdvancedView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\Controls\AudioView.xaml.cs">
+ <DependentUpon>AudioView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\Controls\ChaptersView.xaml.cs">
+ <DependentUpon>ChaptersView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\AddPresetView.xaml.cs">
+ <DependentUpon>AddPresetView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\PreviewView.xaml.cs">
+ <DependentUpon>PreviewView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\QueueView.xaml.cs">
+ <DependentUpon>QueueView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\Controls\FiltersView.xaml.cs">
+ <DependentUpon>FiltersView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\MainView.xaml.cs">
+ <DependentUpon>MainView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\Controls\PictureSettingsView.xaml.cs">
+ <DependentUpon>PictureSettingsView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\Controls\QueryEditorView.xaml.cs">
+ <DependentUpon>QueryEditorView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\Controls\SubtitlesView.xaml.cs">
+ <DependentUpon>SubtitlesView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\Controls\VideoView.xaml.cs">
+ <DependentUpon>VideoView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\OptionsView.xaml.cs">
+ <DependentUpon>OptionsView.xaml</DependentUpon>
+ </Compile>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Properties\AssemblyInfo.cs">
+ <SubType>Code</SubType>
+ </Compile>
+ <Compile Include="Properties\Resources.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DesignTime>True</DesignTime>
+ <DependentUpon>Resources.resx</DependentUpon>
+ </Compile>
+ <Compile Include="Properties\Settings.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Settings.settings</DependentUpon>
+ <DesignTimeSharedInput>True</DesignTimeSharedInput>
+ </Compile>
+ <EmbeddedResource Include="Properties\Resources.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+ </EmbeddedResource>
+ <None Include="Properties\Settings.settings">
+ <Generator>SettingsSingleFileGenerator</Generator>
+ <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+ </None>
+ <AppDesigner Include="Properties\" />
+ </ItemGroup>
+ <ItemGroup>
+ <Page Include="Views\AboutView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="Views\Controls\AdvancedView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="Views\Controls\AudioView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="Views\Controls\ChaptersView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="Views\AddPresetView.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Views\PreviewView.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Views\QueueView.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Views\Controls\FiltersView.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Views\MainView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="Views\Controls\PictureSettingsView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="Views\Controls\QueryEditorView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="Views\Controls\SubtitlesView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="Views\Controls\VideoView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="Views\OptionsView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ </ItemGroup>
+ <ItemGroup>
+ <Folder Include="Model\" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Views\Images\ActivityWindow.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Views\Images\ActivityWindow_small.png" />
+ <Resource Include="Views\Images\copy.png" />
+ <Resource Include="Views\Images\disc_small.png" />
+ <Resource Include="Views\Images\Output_Small.png" />
+ <Resource Include="Views\Images\Pref_Small.png" />
+ <Resource Include="Views\Images\Queue.png" />
+ <Resource Include="Views\Images\Queue_Small.png" />
+ <Resource Include="Views\Images\stop.png" />
+ <Resource Include="Views\Images\save.png" />
+ <Resource Include="Views\Images\Play_small.png" />
+ <Resource Include="Views\Images\Play.png" />
+ <Resource Include="Views\Images\picture.png" />
+ <Resource Include="Views\Images\Pause.png" />
+ <Resource Include="Views\Images\Movies.png" />
+ <Resource Include="Views\Images\logo64.png" />
+ <Resource Include="Views\Images\logo128.png" />
+ <Resource Include="Views\Images\info16.png" />
+ <Resource Include="Views\Images\Help16.png" />
+ <Resource Include="Views\Images\hb32.png" />
+ <Resource Include="Views\Images\hb16.png" />
+ <Resource Include="Views\Images\General Preferences.png" />
+ <Resource Include="Views\Images\folder.png" />
+ <Resource Include="Views\Images\ErrorX.png" />
+ <Resource Include="Views\Images\download.png" />
+ <Resource Include="Views\Images\AddToQueue_small.png" />
+ <Resource Include="Views\Images\AddToQueue.png" />
+ <Resource Include="Views\Images\window.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\HandBrake.ApplicationServices\HandBrake.ApplicationServices.csproj">
+ <Project>{087A2BA8-BAC2-4577-A46F-07FF9D420016}</Project>
+ <Name>HandBrake.ApplicationServices</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project> \ No newline at end of file
diff --git a/win/CS/HandBrakeWPF/Properties/AssemblyInfo.cs b/win/CS/HandBrakeWPF/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..0e7cf6f8c
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Properties/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Windows;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HandBrake")]
+[assembly: AssemblyDescription("A WPF MVVM based GUI for HandBrake.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HandBrake Team")]
+[assembly: AssemblyProduct("HandBrake")]
+[assembly: AssemblyCopyright("Copyright © HandBrake Team 2011")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+//In order to begin building localizable applications, set
+//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
+//inside a <PropertyGroup>. For example, if you are using US english
+//in your source files, set the <UICulture> to en-US. Then uncomment
+//the NeutralResourceLanguage attribute below. Update the "en-US" in
+//the line below to match the UICulture setting in the project file.
+
+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
+
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
+
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("0.9.5.0")]
+[assembly: AssemblyFileVersion("0.9.5.0")]
diff --git a/win/CS/HandBrakeWPF/Properties/Resources.Designer.cs b/win/CS/HandBrakeWPF/Properties/Resources.Designer.cs
new file mode 100644
index 000000000..b9eb47749
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.1
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HandBrakeWPF.Properties
+{
+
+
+ /// <summary>
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ /// </summary>
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources
+ {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources()
+ {
+ }
+
+ /// <summary>
+ /// Returns the cached ResourceManager instance used by this class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager
+ {
+ get
+ {
+ if ((resourceMan == null))
+ {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HandBrakeWPF.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ /// <summary>
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture
+ {
+ get
+ {
+ return resourceCulture;
+ }
+ set
+ {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/Properties/Resources.resx b/win/CS/HandBrakeWPF/Properties/Resources.resx
new file mode 100644
index 000000000..ffecec851
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Properties/Resources.resx
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root> \ No newline at end of file
diff --git a/win/CS/HandBrakeWPF/Properties/Settings.Designer.cs b/win/CS/HandBrakeWPF/Properties/Settings.Designer.cs
new file mode 100644
index 000000000..ae1b86547
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.1
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HandBrakeWPF.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/Properties/Settings.settings b/win/CS/HandBrakeWPF/Properties/Settings.settings
new file mode 100644
index 000000000..8f2fd95d6
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Properties/Settings.settings
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
+ <Profiles>
+ <Profile Name="(Default)" />
+ </Profiles>
+ <Settings />
+</SettingsFile> \ No newline at end of file
diff --git a/win/CS/HandBrakeWPF/Services/MefBootstrapper.cs b/win/CS/HandBrakeWPF/Services/MefBootstrapper.cs
new file mode 100644
index 000000000..bd05356c0
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Services/MefBootstrapper.cs
@@ -0,0 +1,21 @@
+namespace HandBrakeWPF.Services
+{
+ using System.ComponentModel.Composition.Hosting;
+ using System.Linq;
+
+ using Caliburn.Core.InversionOfControl;
+ using Caliburn.MEF;
+ using Caliburn.PresentationFramework.ApplicationModel;
+
+ using HandBrakeWPF.ViewModels.Interfaces;
+
+ public class MefBootstrapper : Bootstrapper<IMainViewModel>
+ {
+ protected override IServiceLocator CreateContainer()
+ {
+ var container = new CompositionContainer(new AggregateCatalog(SelectAssemblies().Select(x => new AssemblyCatalog(x))));
+
+ return new MEFAdapter(container);
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrakeWPF/Settings.StyleCop b/win/CS/HandBrakeWPF/Settings.StyleCop
new file mode 100644
index 000000000..7f55ce6c6
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Settings.StyleCop
@@ -0,0 +1 @@
+<StyleCopSettings Version="4.3" /> \ No newline at end of file
diff --git a/win/CS/HandBrakeWPF/ViewModels/AboutViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/AboutViewModel.cs
new file mode 100644
index 000000000..aeb0ee822
--- /dev/null
+++ b/win/CS/HandBrakeWPF/ViewModels/AboutViewModel.cs
@@ -0,0 +1,20 @@
+/* AboutViewModel.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrakeWPF.ViewModels
+{
+ using Caliburn.PresentationFramework.ApplicationModel;
+
+ /// <summary>
+ /// The About View Model
+ /// </summary>
+ public class AboutViewModel : ViewModelBase
+ {
+ public AboutViewModel(IWindowManager windowManager) : base(windowManager)
+ {
+ }
+
+ }
+}
diff --git a/win/CS/HandBrakeWPF/ViewModels/AddPresetViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/AddPresetViewModel.cs
new file mode 100644
index 000000000..6a44bb1a5
--- /dev/null
+++ b/win/CS/HandBrakeWPF/ViewModels/AddPresetViewModel.cs
@@ -0,0 +1,19 @@
+/* AddPresetViewModel.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrakeWPF.ViewModels
+{
+ using Caliburn.PresentationFramework.ApplicationModel;
+
+ /// <summary>
+ /// The Add Preset View Model
+ /// </summary>
+ public class AddPresetViewModel : ViewModelBase
+ {
+ public AddPresetViewModel(IWindowManager windowManager) : base(windowManager)
+ {
+ }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/ViewModels/Interfaces/IMainViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/Interfaces/IMainViewModel.cs
new file mode 100644
index 000000000..31ce54db0
--- /dev/null
+++ b/win/CS/HandBrakeWPF/ViewModels/Interfaces/IMainViewModel.cs
@@ -0,0 +1,10 @@
+namespace HandBrakeWPF.ViewModels.Interfaces
+{
+ public interface IMainViewModel
+ {
+ /// <summary>
+ /// Shutdown the Application
+ /// </summary>
+ void ExitApplication();
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs
new file mode 100644
index 000000000..dc8a62a48
--- /dev/null
+++ b/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs
@@ -0,0 +1,308 @@
+/* MainViewModel.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrakeWPF.ViewModels
+{
+ using System;
+ using System.Collections.ObjectModel;
+ using System.ComponentModel.Composition;
+ using System.Diagnostics;
+ using System.IO;
+ using System.Windows;
+
+ using Caliburn.PresentationFramework.ApplicationModel;
+
+ using HandBrake.ApplicationServices.Model;
+ using HandBrake.ApplicationServices.Parsing;
+ using HandBrake.ApplicationServices.Services;
+ using HandBrake.ApplicationServices.Services.Interfaces;
+
+ using HandBrakeWPF.ViewModels.Interfaces;
+
+ /// <summary>
+ /// HandBrakes Main Window
+ /// </summary>
+ [Export(typeof(IMainViewModel))]
+ public class MainViewModel : ViewModelBase, IMainViewModel
+ {
+ #region Private Variables and Services
+
+ /// <summary>
+ /// The Source Scan Service.
+ /// </summary>
+ private readonly IScan scanService;
+
+ /// <summary>
+ /// The Encode Service
+ /// </summary>
+ private readonly IQueueProcessor queueProcessor;
+
+ /// <summary>
+ /// The preset service
+ /// </summary>
+ private readonly IPresetService presetService;
+
+ /// <summary>
+ /// HandBrakes Main Window Title
+ /// </summary>
+ private string windowName;
+
+ /// <summary>
+ /// The Source Label
+ /// </summary>
+ private string sourceLabel;
+
+ /// <summary>
+ /// The Toolbar Status Label
+ /// </summary>
+ private string programStatusLabel;
+
+ #endregion
+
+ #region Properties
+
+ [ImportingConstructor]
+ public MainViewModel(IWindowManager windowManager) : base(windowManager)
+ {
+ // Setup Services (TODO - Bring Castle back into the project to wire these up for us)
+ this.scanService = File.Exists("hb.dll") ? (IScan)new LibScan() : new ScanService();
+ this.queueProcessor = new QueueProcessor(Process.GetProcessesByName("HandBrake").Length);
+ this.presetService = new PresetService();
+
+ // Setup Properties
+ this.WindowTitle = "HandBrake WPF Test Application";
+
+ // Setup Events
+ this.scanService.ScanStared += this.ScanStared;
+ this.scanService.ScanCompleted += this.ScanCompleted;
+ this.scanService.ScanStatusChanged += this.ScanStatusChanged;
+
+ this.queueProcessor.QueueCompleted += this.QueueCompleted;
+ this.queueProcessor.QueuePaused += this.QueuePaused;
+ this.queueProcessor.EncodeService.EncodeStarted += this.EncodeStarted;
+ this.queueProcessor.EncodeService.EncodeStatusChanged += this.EncodeStatusChanged;
+ }
+
+ /// <summary>
+ /// Gets or sets TestProperty.
+ /// </summary>
+ public string WindowTitle
+ {
+ get
+ {
+ return this.windowName;
+ }
+
+ set
+ {
+ if (!object.Equals(this.windowName, value))
+ {
+ this.windowName = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Gets a list of presets
+ /// </summary>
+ public ObservableCollection<Preset> Presets
+ {
+ get
+ {
+ return this.presetService.Presets;
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets The Current Encode Task that the user is building
+ /// </summary>
+ public EncodeTask CurrentTask { get; set; }
+
+ /// <summary>
+ /// Gets or sets the Last Scanned Source
+ /// This object contains information about the scanned source.
+ /// </summary>
+ public Source ScannedSource { get; set; }
+
+ /// <summary>
+ /// Gets or sets the Source Label
+ /// This indicates the status of scans.
+ /// </summary>
+ public string SourceLabel
+ {
+ get
+ {
+ return string.IsNullOrEmpty(this.sourceLabel) ? "Select 'Source' to continue" : this.sourceLabel;
+ }
+
+ set
+ {
+ if (!object.Equals(this.sourceLabel, value))
+ {
+ this.sourceLabel = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets the Program Status Toolbar Label
+ /// This indicates the status of HandBrake
+ /// </summary>
+ public string ProgramStatusLabel
+ {
+ get
+ {
+ return string.IsNullOrEmpty(this.programStatusLabel) ? "Ready" : this.sourceLabel;
+ }
+
+ set
+ {
+ if (!object.Equals(this.programStatusLabel, value))
+ {
+ this.programStatusLabel = value;
+ }
+ }
+ }
+
+ #endregion
+
+ /// <summary>
+ /// Shutdown this View
+ /// </summary>
+ public void Shutdown()
+ {
+ // Unsubscribe from Events.
+ this.scanService.ScanStared -= this.ScanStared;
+ this.scanService.ScanCompleted -= this.ScanCompleted;
+ this.scanService.ScanStatusChanged -= this.ScanStatusChanged;
+
+ this.queueProcessor.QueueCompleted -= this.QueueCompleted;
+ this.queueProcessor.QueuePaused -= this.QueuePaused;
+ this.queueProcessor.EncodeService.EncodeStarted -= this.EncodeStarted;
+ this.queueProcessor.EncodeService.EncodeStatusChanged -= this.EncodeStatusChanged;
+ }
+
+
+ #region Menu and Taskbar
+
+ public void AboutApplication()
+ {
+ }
+
+ /// <summary>
+ /// Shutdown the Application
+ /// </summary>
+ public void ExitApplication()
+ {
+ Application.Current.Shutdown();
+ }
+
+ #endregion
+
+
+ #region Event Handlers
+ /// <summary>
+ /// Handle the Scan Status Changed Event.
+ /// </summary>
+ /// <param name="sender">
+ /// The Sender
+ /// </param>
+ /// <param name="e">
+ /// The EventArgs
+ /// </param>
+ private void ScanStatusChanged(object sender, HandBrake.ApplicationServices.EventArgs.ScanProgressEventArgs e)
+ {
+ this.SourceLabel = "Scanning Title " + e.CurrentTitle + " of " + e.Titles;
+ }
+
+ /// <summary>
+ /// Handle the Scan Completed Event
+ /// </summary>
+ /// <param name="sender">
+ /// The Sender
+ /// </param>
+ /// <param name="e">
+ /// The EventArgs
+ /// </param>
+ private void ScanCompleted(object sender, HandBrake.ApplicationServices.EventArgs.ScanCompletedEventArgs e)
+ {
+ if (e.Successful)
+ {
+ this.ScannedSource = this.scanService.SouceData;
+ }
+ }
+
+ /// <summary>
+ /// Handle the Scan Started Event
+ /// </summary>
+ /// <param name="sender">
+ /// The Sender
+ /// </param>
+ /// <param name="e">
+ /// The EventArgs
+ /// </param>
+ private void ScanStared(object sender, EventArgs e)
+ {
+ // TODO - Disable relevant parts of the UI.
+ }
+
+ /// <summary>
+ /// The Encode Status has changed Handler
+ /// </summary>
+ /// <param name="sender">
+ /// The Sender
+ /// </param>
+ /// <param name="e">
+ /// The Encode Progress Event Args
+ /// </param>
+ private void EncodeStatusChanged(object sender, HandBrake.ApplicationServices.EventArgs.EncodeProgressEventArgs e)
+ {
+ //
+ }
+
+ /// <summary>
+ /// Encode Started Handler
+ /// </summary>
+ /// <param name="sender">
+ /// The Sender
+ /// </param>
+ /// <param name="e">
+ /// The EventArgs
+ /// </param>
+ private void EncodeStarted(object sender, EventArgs e)
+ {
+ // TODO Handle Updating the UI
+ }
+
+ /// <summary>
+ /// The Queue has been paused handler
+ /// </summary>
+ /// <param name="sender">
+ /// The Sender
+ /// </param>
+ /// <param name="e">
+ /// The EventArgs
+ /// </param>
+ private void QueuePaused(object sender, EventArgs e)
+ {
+ // TODO Handle Updating the UI
+ }
+
+ /// <summary>
+ /// The Queue has completed handler
+ /// </summary>
+ /// <param name="sender">
+ /// The Sender
+ /// </param>
+ /// <param name="e">
+ /// The EventArgs
+ /// </param>
+ private void QueueCompleted(object sender, EventArgs e)
+ {
+ // TODO Handle Updating the UI
+ }
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/win/CS/HandBrakeWPF/ViewModels/OptionsViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/OptionsViewModel.cs
new file mode 100644
index 000000000..6d634bbbb
--- /dev/null
+++ b/win/CS/HandBrakeWPF/ViewModels/OptionsViewModel.cs
@@ -0,0 +1,19 @@
+/* OptionsViewModel.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrakeWPF.ViewModels
+{
+ using Caliburn.PresentationFramework.ApplicationModel;
+
+ /// <summary>
+ /// The Options View Model
+ /// </summary>
+ public class OptionsViewModel : ViewModelBase
+ {
+ public OptionsViewModel(IWindowManager windowManager) : base(windowManager)
+ {
+ }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/ViewModels/PreviewViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/PreviewViewModel.cs
new file mode 100644
index 000000000..b41fd69f5
--- /dev/null
+++ b/win/CS/HandBrakeWPF/ViewModels/PreviewViewModel.cs
@@ -0,0 +1,19 @@
+/* PreviewViewModel.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrakeWPF.ViewModels
+{
+ using Caliburn.PresentationFramework.ApplicationModel;
+
+ /// <summary>
+ /// The About View Model
+ /// </summary>
+ public class PreviewViewModel : ViewModelBase
+ {
+ public PreviewViewModel(IWindowManager windowManager) : base(windowManager)
+ {
+ }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/ViewModels/QueueViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/QueueViewModel.cs
new file mode 100644
index 000000000..07f3f486f
--- /dev/null
+++ b/win/CS/HandBrakeWPF/ViewModels/QueueViewModel.cs
@@ -0,0 +1,19 @@
+/* QueueViewModel.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrakeWPF.ViewModels
+{
+ using Caliburn.PresentationFramework.ApplicationModel;
+
+ /// <summary>
+ /// The Preview View Model
+ /// </summary>
+ public class QueueViewModel : ViewModelBase
+ {
+ public QueueViewModel(IWindowManager windowManager) : base(windowManager)
+ {
+ }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/ViewModels/ViewModelBase.cs b/win/CS/HandBrakeWPF/ViewModels/ViewModelBase.cs
new file mode 100644
index 000000000..b946d7c7e
--- /dev/null
+++ b/win/CS/HandBrakeWPF/ViewModels/ViewModelBase.cs
@@ -0,0 +1,18 @@
+namespace HandBrakeWPF.ViewModels
+{
+ using Caliburn.PresentationFramework.ApplicationModel;
+ using Caliburn.PresentationFramework.Screens;
+
+ /// <summary>
+ /// A Base Class for the View Models which contains reusable code.
+ /// </summary>
+ public class ViewModelBase : Screen
+ {
+ public ViewModelBase(IWindowManager windowManager)
+ {
+ this.WindowManager = windowManager;
+ }
+
+ public IWindowManager WindowManager { get; private set; }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/Views/AboutView.xaml b/win/CS/HandBrakeWPF/Views/AboutView.xaml
new file mode 100644
index 000000000..7316ab49a
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/AboutView.xaml
@@ -0,0 +1,28 @@
+<Window x:Class="HandBrakeWPF.Views.AboutView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:PresentationFramework="clr-namespace:Caliburn.PresentationFramework;assembly=Caliburn.PresentationFramework" xmlns:RoutedMessaging="clr-namespace:Caliburn.PresentationFramework.RoutedMessaging;assembly=Caliburn.PresentationFramework" Title="AboutView" Height="268" Width="511">
+
+ <StackPanel Orientation="Horizontal">
+ <Image Source="Images/logo64.png" Width="64" Height="64" SnapsToDevicePixels="True" Margin="10,10,10,10" HorizontalAlignment="Left" VerticalAlignment="Top" />
+
+ <StackPanel Orientation="Vertical">
+ <Label Content="HandBrake WPF Demo App" FontWeight="Bold" FontSize="14" Margin="0,10,0,0" />
+ <Label Content="Copyright 2003-2011 HandBrake Team" />
+
+ <Label Content="License:" />
+ <TextBox Width="380" Height="100" IsReadOnly="True" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Margin="10,0,10,10">
+ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ </TextBox>
+
+ <Button Content="OK" RoutedMessaging:Message.Attach="[Event Click] = [Action Close]"
+ HorizontalAlignment="Right" Padding="10,2" Margin="0,0,10,10" />
+
+ </StackPanel>
+
+
+ </StackPanel>
+</Window>
diff --git a/win/CS/HandBrakeWPF/Views/AboutView.xaml.cs b/win/CS/HandBrakeWPF/Views/AboutView.xaml.cs
new file mode 100644
index 000000000..22de6967b
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/AboutView.xaml.cs
@@ -0,0 +1,15 @@
+namespace HandBrakeWPF.Views
+{
+ using System.Windows;
+
+ /// <summary>
+ /// Interaction logic for AboutView.xaml
+ /// </summary>
+ public partial class AboutView : Window
+ {
+ public AboutView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/Views/AddPresetView.xaml b/win/CS/HandBrakeWPF/Views/AddPresetView.xaml
new file mode 100644
index 000000000..74d79f0c8
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/AddPresetView.xaml
@@ -0,0 +1,11 @@
+<UserControl x:Class="HandBrakeWPF.Views.AddPresetView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ mc:Ignorable="d"
+ d:DesignHeight="300" d:DesignWidth="300">
+ <Grid Background="Beige">
+
+ </Grid>
+</UserControl>
diff --git a/win/CS/HandBrakeWPF/Views/AddPresetView.xaml.cs b/win/CS/HandBrakeWPF/Views/AddPresetView.xaml.cs
new file mode 100644
index 000000000..b99e48b26
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/AddPresetView.xaml.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace HandBrakeWPF.Views
+{
+ /// <summary>
+ /// Interaction logic for VideoView.xaml
+ /// </summary>
+ public partial class AddPresetView : UserControl
+ {
+ public AddPresetView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/Views/Controls/AdvancedView.xaml b/win/CS/HandBrakeWPF/Views/Controls/AdvancedView.xaml
new file mode 100644
index 000000000..3adb82821
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Controls/AdvancedView.xaml
@@ -0,0 +1,11 @@
+<UserControl x:Class="HandBrakeWPF.Views.AdvancedView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ mc:Ignorable="d"
+ d:DesignHeight="300" d:DesignWidth="300">
+ <Grid Background="Beige">
+
+ </Grid>
+</UserControl>
diff --git a/win/CS/HandBrakeWPF/Views/Controls/AdvancedView.xaml.cs b/win/CS/HandBrakeWPF/Views/Controls/AdvancedView.xaml.cs
new file mode 100644
index 000000000..b7ad6ef86
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Controls/AdvancedView.xaml.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace HandBrakeWPF.Views
+{
+ /// <summary>
+ /// Interaction logic for AdvancedView.xaml
+ /// </summary>
+ public partial class AdvancedView : UserControl
+ {
+ public AdvancedView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/Views/Controls/AudioView.xaml b/win/CS/HandBrakeWPF/Views/Controls/AudioView.xaml
new file mode 100644
index 000000000..6087c7d07
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Controls/AudioView.xaml
@@ -0,0 +1,11 @@
+<UserControl x:Class="HandBrakeWPF.Views.AudioView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ mc:Ignorable="d"
+ d:DesignHeight="300" d:DesignWidth="300">
+ <Grid Background="Beige">
+
+ </Grid>
+</UserControl>
diff --git a/win/CS/HandBrakeWPF/Views/Controls/AudioView.xaml.cs b/win/CS/HandBrakeWPF/Views/Controls/AudioView.xaml.cs
new file mode 100644
index 000000000..3518eea56
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Controls/AudioView.xaml.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace HandBrakeWPF.Views
+{
+ /// <summary>
+ /// Interaction logic for AudioView.xaml
+ /// </summary>
+ public partial class AudioView : UserControl
+ {
+ public AudioView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/Views/Controls/ChaptersView.xaml b/win/CS/HandBrakeWPF/Views/Controls/ChaptersView.xaml
new file mode 100644
index 000000000..ac39a7062
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Controls/ChaptersView.xaml
@@ -0,0 +1,11 @@
+<UserControl x:Class="HandBrakeWPF.Views.ChaptersView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ mc:Ignorable="d"
+ d:DesignHeight="300" d:DesignWidth="300">
+ <Grid Background="Beige">
+
+ </Grid>
+</UserControl>
diff --git a/win/CS/HandBrakeWPF/Views/Controls/ChaptersView.xaml.cs b/win/CS/HandBrakeWPF/Views/Controls/ChaptersView.xaml.cs
new file mode 100644
index 000000000..f61b201c9
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Controls/ChaptersView.xaml.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace HandBrakeWPF.Views
+{
+ /// <summary>
+ /// Interaction logic for ChaptersView.xaml
+ /// </summary>
+ public partial class ChaptersView : UserControl
+ {
+ public ChaptersView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/Views/Controls/FiltersView.xaml b/win/CS/HandBrakeWPF/Views/Controls/FiltersView.xaml
new file mode 100644
index 000000000..6ac8f5a10
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Controls/FiltersView.xaml
@@ -0,0 +1,11 @@
+<UserControl x:Class="HandBrakeWPF.Views.FiltersView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ mc:Ignorable="d"
+ d:DesignHeight="300" d:DesignWidth="300">
+ <Grid Background="Beige">
+
+ </Grid>
+</UserControl>
diff --git a/win/CS/HandBrakeWPF/Views/Controls/FiltersView.xaml.cs b/win/CS/HandBrakeWPF/Views/Controls/FiltersView.xaml.cs
new file mode 100644
index 000000000..27f38be95
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Controls/FiltersView.xaml.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace HandBrakeWPF.Views
+{
+ /// <summary>
+ /// Interaction logic for VideoFilters.xaml
+ /// </summary>
+ public partial class FiltersView : UserControl
+ {
+ public FiltersView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/Views/Controls/PictureSettingsView.xaml b/win/CS/HandBrakeWPF/Views/Controls/PictureSettingsView.xaml
new file mode 100644
index 000000000..80b82c52f
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Controls/PictureSettingsView.xaml
@@ -0,0 +1,102 @@
+<UserControl x:Class="HandBrakeWPF.Views.PictureSettingsView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:Controls="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit.Extended"
+ >
+
+ <StackPanel Orientation="Horizontal" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
+
+ <!-- Size Panel-->
+ <StackPanel Name="SizePanel" Orientation="Vertical" >
+ <Label Content="Size" FontWeight="Bold" />
+
+ <!-- Row 1-->
+ <StackPanel Orientation="Horizontal" Margin="5,0,5,0">
+ <Label Content="Source" Grid.Row="0" Grid.Column="0" />
+ <Label Content="---" Name="sourceResolution" Grid.Row="0" Grid.Column="1" />
+ </StackPanel>
+
+ <!-- Row 2-->
+ <StackPanel Orientation="Horizontal" Margin="5,0,5,0">
+ <Label Content="Width:" Grid.Row="1" Grid.Column="0" />
+ <Controls:NumericUpDown Name="width" Minimum="0" Grid.Row="1" Grid.Column="1" Width="45" />
+ <Label Content="Height:" Grid.Row="1" Grid.Column="2" />
+ <Controls:NumericUpDown Name="height" Minimum="0" Grid.Row="1" Grid.Column="3" Width="45" />
+ <CheckBox Content="Keep Aspect Ratio" VerticalAlignment="Center" Margin="5,0,0,0" />
+ </StackPanel>
+
+ <!-- Row 3-->
+ <Grid Margin="5,15,5,0">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="Auto" />
+ </Grid.RowDefinitions>
+
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto" />
+ <ColumnDefinition Width="Auto" />
+ </Grid.ColumnDefinitions>
+
+ <Label Content="Anamorphic:" Grid.Row="0" Grid.Column="0" />
+ <Label Content="Modulus:" Grid.Row="1" Grid.Column="0" />
+ <Label Content="Display Width:" Grid.Row="2" Grid.Column="0" />
+ <Label Content="PAR Width:" Grid.Row="3" Grid.Column="0" />
+ <Label Content="PAR Height:" Grid.Row="4" Grid.Column="0" />
+ <Label Content="Display Size:" Grid.Row="5" Grid.Column="0" />
+
+ <ComboBox Width="110" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Left" Margin="0,0,0,5" />
+ <ComboBox Width="110" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left" Margin="0,0,0,5" />
+ <Controls:NumericUpDown Width="45" Grid.Row="2" Grid.Column="1" HorizontalAlignment="Left" Margin="0,0,0,5" />
+ <Controls:NumericUpDown Width="45" Grid.Row="3" Grid.Column="1" HorizontalAlignment="Left" Margin="0,0,0,5" />
+ <Controls:NumericUpDown Width="45" Grid.Row="4" Grid.Column="1" HorizontalAlignment="Left" Margin="0,0,0,5" />
+ <Label Content="---" Grid.Row="5" Grid.Column="1" HorizontalAlignment="Left" Margin="0,0,0,5" />
+ </Grid>
+ </StackPanel>
+
+
+ <StackPanel Name="CropPanel" Margin="50,0,0,0" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
+ <Label Content="Cropping" FontWeight="Bold" />
+ <RadioButton Content="Automatic" Margin="10,0,0,0"/>
+ <RadioButton Content="Custom" Margin="10,0,0,0" />
+
+ <Grid Margin="0,10,0,0">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="Auto" />
+ </Grid.RowDefinitions>
+
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto" />
+ <ColumnDefinition Width="Auto" />
+ <ColumnDefinition Width="Auto" />
+ <ColumnDefinition Width="Auto" />
+ <ColumnDefinition Width="Auto" />
+ </Grid.ColumnDefinitions>
+
+ <Label Content="Top" Grid.Row="0" Grid.Column="2" VerticalAlignment="Center" />
+ <Label Content="Bottom" Grid.Row="4" Grid.Column="2" VerticalAlignment="Center" />
+ <Label Content="Left" Grid.Row="2" Grid.Column="0" HorizontalAlignment="Center" />
+ <Label Content="Right" Grid.Row="2" Grid.Column="4" HorizontalAlignment="Center" />
+
+ <Controls:NumericUpDown Width="45" Grid.Row="1" Grid.Column="2" HorizontalAlignment="Left" Margin="0,0,0,5" />
+ <Controls:NumericUpDown Width="45" Grid.Row="3" Grid.Column="2" HorizontalAlignment="Left" Margin="0,0,0,5" />
+ <Controls:NumericUpDown Width="45" Grid.Row="2" Grid.Column="1" HorizontalAlignment="Left" Margin="0,0,0,5" />
+ <Controls:NumericUpDown Width="45" Grid.Row="2" Grid.Column="3" HorizontalAlignment="Left" Margin="0,0,0,5" />
+
+ </Grid>
+
+
+ </StackPanel>
+
+
+ </StackPanel>
+</UserControl>
diff --git a/win/CS/HandBrakeWPF/Views/Controls/PictureSettingsView.xaml.cs b/win/CS/HandBrakeWPF/Views/Controls/PictureSettingsView.xaml.cs
new file mode 100644
index 000000000..9401168dc
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Controls/PictureSettingsView.xaml.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace HandBrakeWPF.Views
+{
+ /// <summary>
+ /// Interaction logic for PictureSettingsView.xaml
+ /// </summary>
+ public partial class PictureSettingsView : UserControl
+ {
+ public PictureSettingsView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/Views/Controls/QueryEditorView.xaml b/win/CS/HandBrakeWPF/Views/Controls/QueryEditorView.xaml
new file mode 100644
index 000000000..694dcd8df
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Controls/QueryEditorView.xaml
@@ -0,0 +1,11 @@
+<UserControl x:Class="HandBrakeWPF.Views.QueryEditorView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ mc:Ignorable="d"
+ d:DesignHeight="300" d:DesignWidth="300">
+ <Grid Background="Beige">
+
+ </Grid>
+</UserControl>
diff --git a/win/CS/HandBrakeWPF/Views/Controls/QueryEditorView.xaml.cs b/win/CS/HandBrakeWPF/Views/Controls/QueryEditorView.xaml.cs
new file mode 100644
index 000000000..d67b7eb5c
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Controls/QueryEditorView.xaml.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace HandBrakeWPF.Views
+{
+ /// <summary>
+ /// Interaction logic for QueryEditorView.xaml
+ /// </summary>
+ public partial class QueryEditorView : UserControl
+ {
+ public QueryEditorView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/Views/Controls/SubtitlesView.xaml b/win/CS/HandBrakeWPF/Views/Controls/SubtitlesView.xaml
new file mode 100644
index 000000000..4594f62b5
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Controls/SubtitlesView.xaml
@@ -0,0 +1,11 @@
+<UserControl x:Class="HandBrakeWPF.Views.SubtitlesView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ mc:Ignorable="d"
+ d:DesignHeight="300" d:DesignWidth="300">
+ <Grid Background="Beige">
+
+ </Grid>
+</UserControl>
diff --git a/win/CS/HandBrakeWPF/Views/Controls/SubtitlesView.xaml.cs b/win/CS/HandBrakeWPF/Views/Controls/SubtitlesView.xaml.cs
new file mode 100644
index 000000000..589462c40
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Controls/SubtitlesView.xaml.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace HandBrakeWPF.Views
+{
+ /// <summary>
+ /// Interaction logic for SubtitlesView.xaml
+ /// </summary>
+ public partial class SubtitlesView : UserControl
+ {
+ public SubtitlesView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/Views/Controls/VideoView.xaml b/win/CS/HandBrakeWPF/Views/Controls/VideoView.xaml
new file mode 100644
index 000000000..72ab1f67c
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Controls/VideoView.xaml
@@ -0,0 +1,11 @@
+<UserControl x:Class="HandBrakeWPF.Views.VideoView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ mc:Ignorable="d"
+ d:DesignHeight="300" d:DesignWidth="300">
+ <Grid Background="Beige">
+
+ </Grid>
+</UserControl>
diff --git a/win/CS/HandBrakeWPF/Views/Controls/VideoView.xaml.cs b/win/CS/HandBrakeWPF/Views/Controls/VideoView.xaml.cs
new file mode 100644
index 000000000..f59435f02
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Controls/VideoView.xaml.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace HandBrakeWPF.Views
+{
+ /// <summary>
+ /// Interaction logic for VideoView.xaml
+ /// </summary>
+ public partial class VideoView : UserControl
+ {
+ public VideoView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/Views/Images/ActivityWindow.png b/win/CS/HandBrakeWPF/Views/Images/ActivityWindow.png
new file mode 100644
index 000000000..315e0fa17
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/ActivityWindow.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/ActivityWindow_small.png b/win/CS/HandBrakeWPF/Views/Images/ActivityWindow_small.png
new file mode 100644
index 000000000..916b6ef4a
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/ActivityWindow_small.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/AddToQueue.png b/win/CS/HandBrakeWPF/Views/Images/AddToQueue.png
new file mode 100644
index 000000000..8eb079b3d
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/AddToQueue.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/AddToQueue_small.png b/win/CS/HandBrakeWPF/Views/Images/AddToQueue_small.png
new file mode 100644
index 000000000..5bb08184f
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/AddToQueue_small.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/ErrorX.png b/win/CS/HandBrakeWPF/Views/Images/ErrorX.png
new file mode 100644
index 000000000..75c63c08a
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/ErrorX.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/General Preferences.png b/win/CS/HandBrakeWPF/Views/Images/General Preferences.png
new file mode 100644
index 000000000..9814afcc1
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/General Preferences.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/Help16.png b/win/CS/HandBrakeWPF/Views/Images/Help16.png
new file mode 100644
index 000000000..bb5ef99ce
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/Help16.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/Movies.png b/win/CS/HandBrakeWPF/Views/Images/Movies.png
new file mode 100644
index 000000000..ec03eb576
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/Movies.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/Output_Small.png b/win/CS/HandBrakeWPF/Views/Images/Output_Small.png
new file mode 100644
index 000000000..a1017d6fb
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/Output_Small.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/Pause.png b/win/CS/HandBrakeWPF/Views/Images/Pause.png
new file mode 100644
index 000000000..a20833967
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/Pause.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/Play.png b/win/CS/HandBrakeWPF/Views/Images/Play.png
new file mode 100644
index 000000000..23fce8283
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/Play.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/Play_small.png b/win/CS/HandBrakeWPF/Views/Images/Play_small.png
new file mode 100644
index 000000000..3e4647a15
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/Play_small.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/Pref_Small.png b/win/CS/HandBrakeWPF/Views/Images/Pref_Small.png
new file mode 100644
index 000000000..a28fb5b27
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/Pref_Small.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/Queue.png b/win/CS/HandBrakeWPF/Views/Images/Queue.png
new file mode 100644
index 000000000..51962a1b0
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/Queue.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/Queue_Small.png b/win/CS/HandBrakeWPF/Views/Images/Queue_Small.png
new file mode 100644
index 000000000..02c7391a9
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/Queue_Small.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/copy.png b/win/CS/HandBrakeWPF/Views/Images/copy.png
new file mode 100644
index 000000000..c11c6a753
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/copy.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/disc_small.png b/win/CS/HandBrakeWPF/Views/Images/disc_small.png
new file mode 100644
index 000000000..dca0ad228
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/disc_small.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/download.png b/win/CS/HandBrakeWPF/Views/Images/download.png
new file mode 100644
index 000000000..c3206626b
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/download.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/folder.png b/win/CS/HandBrakeWPF/Views/Images/folder.png
new file mode 100644
index 000000000..a54316ea6
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/folder.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/hb16.png b/win/CS/HandBrakeWPF/Views/Images/hb16.png
new file mode 100644
index 000000000..a9f720775
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/hb16.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/hb32.png b/win/CS/HandBrakeWPF/Views/Images/hb32.png
new file mode 100644
index 000000000..5054264d3
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/hb32.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/info16.png b/win/CS/HandBrakeWPF/Views/Images/info16.png
new file mode 100644
index 000000000..6b6b9f01f
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/info16.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/logo128.png b/win/CS/HandBrakeWPF/Views/Images/logo128.png
new file mode 100644
index 000000000..69d76459d
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/logo128.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/logo64.png b/win/CS/HandBrakeWPF/Views/Images/logo64.png
new file mode 100644
index 000000000..12808f636
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/logo64.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/picture.png b/win/CS/HandBrakeWPF/Views/Images/picture.png
new file mode 100644
index 000000000..0072ccfb6
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/picture.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/save.png b/win/CS/HandBrakeWPF/Views/Images/save.png
new file mode 100644
index 000000000..40885d2d3
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/save.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/stop.png b/win/CS/HandBrakeWPF/Views/Images/stop.png
new file mode 100644
index 000000000..c544b5ee4
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/stop.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/Images/window.png b/win/CS/HandBrakeWPF/Views/Images/window.png
new file mode 100644
index 000000000..48a14a35b
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/Images/window.png
Binary files differ
diff --git a/win/CS/HandBrakeWPF/Views/MainView.xaml b/win/CS/HandBrakeWPF/Views/MainView.xaml
new file mode 100644
index 000000000..496afc4ee
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/MainView.xaml
@@ -0,0 +1,194 @@
+<Window x:Class="HandBrakeWPF.Views.MainView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:Views="clr-namespace:HandBrakeWPF.Views"
+ xmlns:Data="clr-namespace:System.Windows.Data;assembly=PresentationFramework"
+ xmlns:RoutedMessaging="clr-namespace:Caliburn.PresentationFramework.RoutedMessaging;assembly=Caliburn.PresentationFramework"
+ Title="{Data:Binding Path=WindowTitle}" Height="655" Width="1015" FontSize="11">
+
+ <Grid>
+ <StackPanel Orientation="Vertical" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
+ <!-- Menu and Taskbar-->
+ <StackPanel Orientation="Vertical" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
+ <!-- Main Menu -->
+ <Menu Height="23" VerticalAlignment="Top" HorizontalAlignment="Stretch">
+ <MenuItem Header="File">
+ <MenuItem Header="Cancel Scan" />
+ <MenuItem Header="Exit" RoutedMessaging:Message.Attach="[Event Click] = [Action ExitApplication]" />
+ </MenuItem>
+
+ <MenuItem Header="Tools">
+ <MenuItem Header="Show Queue" RoutedMessaging:Message.Attach="[Event Click] = [Action ExitApplication]" />
+ <MenuItem Header="Activity Window" RoutedMessaging:Message.Attach="[Event Click] = [Action ExitApplication]" />
+ </MenuItem>
+
+ <MenuItem Header="Presets">
+ <MenuItem Header="Reset Built-in Presets" RoutedMessaging:Message.Attach="[Event Click] = [Action ExitApplication]" />
+ <MenuItem Header="Delete Built-in Presets" RoutedMessaging:Message.Attach="[Event Click] = [Action ExitApplication]" />
+ <Separator />
+ <MenuItem Header="Save As New Preset" RoutedMessaging:Message.Attach="[Event Click] = [Action ExitApplication]" />
+ <MenuItem Header="Import" RoutedMessaging:Message.Attach="[Event Click] = [Action ExitApplication]" />
+ <MenuItem Header="Export" RoutedMessaging:Message.Attach="[Event Click] = [Action ExitApplication]" />
+ <MenuItem Header="Set as Default" RoutedMessaging:Message.Attach="[Event Click] = [Action ExitApplication]" />
+ </MenuItem>
+
+ <MenuItem Header="Help">
+ <MenuItem Header="HandBrake User Guide" RoutedMessaging:Message.Attach="[Event Click] = [Action ExitApplication]" />
+ <Separator />
+ <MenuItem Header="Check for Updates" RoutedMessaging:Message.Attach="[Event Click] = [Action ExitApplication]" />
+ <Separator />
+ <MenuItem Header="About..." RoutedMessaging:Message.Attach="[Event Click] = [Action AboutApplication]" />
+ </MenuItem>
+ </Menu>
+
+ <!-- ToolBar -->
+ <ToolBar Name="mainToolBar" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" SnapsToDevicePixels="False">
+
+ <Button Name="Source">
+ <StackPanel Orientation="Horizontal">
+ <Image Source="Images/Movies.png" Height="32" Width="32" />
+ <Label Content="Source" Margin="8,0,0,0" VerticalAlignment="Center" />
+ </StackPanel>
+ </Button>
+
+ <Separator />
+
+ <Button Name="Start">
+ <StackPanel Orientation="Horizontal">
+ <Image Source="Images/Play.png" Height="32" Width="32" />
+ <Label Content="Start" Margin="8,0,0,0" VerticalAlignment="Center" />
+ </StackPanel>
+ </Button>
+ <Button Name="AddToQueue">
+ <StackPanel Orientation="Horizontal">
+ <Image Source="Images/AddToQueue.png" Height="32" Width="32" />
+ <Label Content="Add To Queue" Margin="8,0,0,0" VerticalAlignment="Center" />
+ </StackPanel>
+ </Button>
+
+ <Button Name="ShowQueue">
+ <StackPanel Orientation="Horizontal">
+ <Image Source="Images/Queue.png" Height="32" Width="32" />
+ <Label Content="Show Queue" Margin="8,0,0,0" VerticalAlignment="Center" />
+ </StackPanel>
+ </Button>
+
+ <Separator />
+
+ <Button Name="Preview">
+ <StackPanel Orientation="Horizontal">
+ <Image Source="Images/window.png" Height="32" Width="32" />
+ <Label Content="Preview" Margin="8,0,0,0" VerticalAlignment="Center" />
+ </StackPanel>
+ </Button>
+ <Button Name="ActivityWindow">
+ <StackPanel Orientation="Horizontal">
+ <Image Source="Images/ActivityWindow.png" Height="32" Width="32" />
+ <Label Content="Activity Window" Margin="8,0,0,0" VerticalAlignment="Center" />
+ </StackPanel>
+ </Button>
+ </ToolBar>
+ </StackPanel>
+
+ <!-- Main Body-->
+ <StackPanel Orientation="Horizontal">
+
+ <!-- Main Controls-->
+ <StackPanel Orientation="Vertical">
+ <!-- Source -->
+ <StackPanel Margin="10,5,10,5" MaxWidth="725" Width="725" HorizontalAlignment="Left">
+ <StackPanel Orientation="Horizontal">
+ <Label Content="Source" FontWeight="Bold" />
+ <Label Content="{Binding Path=SourceLabel}" />
+ </StackPanel>
+
+ <StackPanel Orientation="Horizontal">
+ <Label Content="Title" Margin="8,0,0,0" />
+ <ComboBox Name="Titles" Margin="8,0,0,0" MinWidth="100" SelectedItem="{Binding Path=CurrentTask.Title}" />
+
+ <Label Content="Angle" Margin="8,0,0,0" />
+ <ComboBox Name="Angles" Margin="8,0,0,0" MinWidth="60" SelectedItem="{Binding Path=CurrentTask.Angle}"/>
+
+ <ComboBox Name="PointToPointMode" Margin="8,0,0,0" MinWidth="80" SelectedItem="{Binding Path=CurrentTask.PointToPointMode}" />
+ <ComboBox Name="StartPoint" Margin="8,0,0,0" MinWidth="60" SelectedItem="{Binding Path=CurrentTask.StartPoint}" />
+ <Label Content="through" Margin="8,0,0,0" />
+ <ComboBox Name="EndPoint" Margin="8,0,0,0" MinWidth="60" SelectedItem="{Binding Path=CurrentTask.EndPoint}" />
+ <Label Content="Duration" Margin="8,0,0,0" />
+ <Label Content="--:--:--" Margin="8,0,0,0" />
+ </StackPanel>
+ </StackPanel>
+
+ <!-- Destination -->
+ <StackPanel Margin="10,5,10,5" MaxWidth="725" Width="725" HorizontalAlignment="Left">
+ <Label Content="Destination" FontWeight="Bold" />
+ <StackPanel Orientation="Horizontal">
+ <Label Content="File" Margin="8,0,0,0" />
+ <TextBox Name="Destination" Margin="8,0,0,0" Width="600" Text="{}" />
+ <Button Name="DestinationBrowser" Margin="8,0,0,0" Padding="8,0,8,0" Content="Browse" />
+ </StackPanel>
+ </StackPanel>
+
+ <!-- Output Options -->
+ <StackPanel Margin="10,5,10,5" MaxWidth="725" Width="725" HorizontalAlignment="Left">
+ <Label Content="Output Settings (Preset: None)" FontWeight="Bold" />
+ <StackPanel Orientation="Horizontal">
+ <Label Content="Container" Margin="8,0,0,0" />
+ <ComboBox Name="Container" Margin="8,0,0,0" MinWidth="100" SelectedItem="{Binding Path=CurrentTask.OutputFormat}" />
+
+ <CheckBox Name="LargeFileMp4" Content="Large File Size" IsChecked="{Binding Path=CurrentTask.LargeFile}" VerticalAlignment="Center" Margin="8,0,0,0" />
+ <CheckBox Name="WebOptimized" Content="Web Optimized" IsChecked="{Binding Path=CurrentTask.OptimizeMP4}" VerticalAlignment="Center" Margin="8,0,0,0" />
+ <CheckBox Name="iPod5G" Content="iPod 5G Support" IsChecked="{Binding Path=CurrentTask.IPod5GSupport}" VerticalAlignment="Center" Margin="8,0,0,0" />
+ </StackPanel>
+ </StackPanel>
+
+ <!-- Tab Control -->
+ <TabControl HorizontalAlignment="Left" VerticalAlignment="Stretch" Width="725" Height="330" Margin="10,10,10,10" Name="tabControl" >
+ <TabItem Header="Picture" Name="pictureTab">
+ <Views:PictureSettingsView x:Name="pictureSettingsView"></Views:PictureSettingsView>
+ </TabItem>
+ <TabItem Header="Video Filters" Name="filtersTab">
+ <Views:FiltersView></Views:FiltersView>
+ </TabItem>
+ <TabItem Header="Video" Name="videoTab">
+ <Views:VideoView></Views:VideoView>
+ </TabItem>
+ <TabItem Header="Audio" Name="audioTab">
+ <Views:AudioView></Views:AudioView>
+ </TabItem>
+ <TabItem Header="Chapters" Name="chaptersTab">
+ <Views:ChaptersView></Views:ChaptersView>
+ </TabItem>
+ <TabItem Header="Advanced" Name="advancedTab">
+ <Views:AdvancedView></Views:AdvancedView>
+ </TabItem>
+ </TabControl>
+
+ </StackPanel>
+
+ <!-- Presets -->
+ <StackPanel Margin="5,5,5,5" Orientation="Vertical">
+ <GroupBox Header="Presets" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
+ <StackPanel Orientation="Vertical">
+ <TreeView ItemsSource="{Binding Presets}" Width="240" Height="460" >
+
+ </TreeView>
+
+ <StackPanel Orientation="Horizontal">
+ <Button Content="Add" Margin="5,5,5,5" />
+ <Button Content="Remove" Margin="5,5,5,5" />
+ <Button Content="Set Default" Margin="5,5,5,5" />
+ </StackPanel>
+ </StackPanel>
+ </GroupBox>
+ </StackPanel>
+
+ </StackPanel>
+
+ <!-- Status Bar -->
+ <StatusBar Grid.Row="6" Height="30" Grid.ColumnSpan="2" VerticalAlignment="Bottom">
+ <Label Content="{Binding Path=ProgramStatusLabel}" FontSize="10" VerticalAlignment="Center" />
+ </StatusBar>
+
+ </StackPanel>
+ </Grid>
+</Window>
diff --git a/win/CS/HandBrakeWPF/Views/MainView.xaml.cs b/win/CS/HandBrakeWPF/Views/MainView.xaml.cs
new file mode 100644
index 000000000..efb3e7d6e
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/MainView.xaml.cs
@@ -0,0 +1,23 @@
+/* MainView.xaml.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrakeWPF.Views
+{
+ using System.Windows;
+
+ /// <summary>
+ /// Interaction logic for MainView.xaml
+ /// </summary>
+ public partial class MainView : Window
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MainView"/> class.
+ /// </summary>
+ public MainView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/Views/OptionsView.xaml b/win/CS/HandBrakeWPF/Views/OptionsView.xaml
new file mode 100644
index 000000000..7573415b7
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/OptionsView.xaml
@@ -0,0 +1,8 @@
+<Window x:Class="HandBrakeWPF.Views.OptionsView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ Title="OptionsView" Height="300" Width="300">
+ <Grid>
+
+ </Grid>
+</Window>
diff --git a/win/CS/HandBrakeWPF/Views/OptionsView.xaml.cs b/win/CS/HandBrakeWPF/Views/OptionsView.xaml.cs
new file mode 100644
index 000000000..9d0fc947c
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/OptionsView.xaml.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+
+namespace HandBrakeWPF.Views
+{
+ /// <summary>
+ /// Interaction logic for OptionsView.xaml
+ /// </summary>
+ public partial class OptionsView : Window
+ {
+ public OptionsView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/Views/PreviewView.xaml b/win/CS/HandBrakeWPF/Views/PreviewView.xaml
new file mode 100644
index 000000000..e3bd0be52
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/PreviewView.xaml
@@ -0,0 +1,11 @@
+<UserControl x:Class="HandBrakeWPF.Views.PreviewView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ mc:Ignorable="d"
+ d:DesignHeight="300" d:DesignWidth="300">
+ <Grid Background="Beige">
+
+ </Grid>
+</UserControl>
diff --git a/win/CS/HandBrakeWPF/Views/PreviewView.xaml.cs b/win/CS/HandBrakeWPF/Views/PreviewView.xaml.cs
new file mode 100644
index 000000000..0bbf84b0a
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/PreviewView.xaml.cs
@@ -0,0 +1,15 @@
+namespace HandBrakeWPF.Views
+{
+ using System.Windows.Controls;
+
+ /// <summary>
+ /// Interaction logic for VideoView.xaml
+ /// </summary>
+ public partial class PreviewView : UserControl
+ {
+ public PreviewView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/win/CS/HandBrakeWPF/Views/QueueView.xaml b/win/CS/HandBrakeWPF/Views/QueueView.xaml
new file mode 100644
index 000000000..f3fae9b26
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/QueueView.xaml
@@ -0,0 +1,11 @@
+<UserControl x:Class="HandBrakeWPF.Views.QueueView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ mc:Ignorable="d"
+ d:DesignHeight="300" d:DesignWidth="300">
+ <Grid Background="Beige">
+
+ </Grid>
+</UserControl>
diff --git a/win/CS/HandBrakeWPF/Views/QueueView.xaml.cs b/win/CS/HandBrakeWPF/Views/QueueView.xaml.cs
new file mode 100644
index 000000000..ae0743166
--- /dev/null
+++ b/win/CS/HandBrakeWPF/Views/QueueView.xaml.cs
@@ -0,0 +1,15 @@
+namespace HandBrakeWPF.Views
+{
+ using System.Windows.Controls;
+
+ /// <summary>
+ /// Interaction logic for VideoView.xaml
+ /// </summary>
+ public partial class QueueView : UserControl
+ {
+ public QueueView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/win/CS/Installer/Installer.nsi b/win/CS/Installer/Installer.nsi
new file mode 100644
index 000000000..a4d70f3e0
--- /dev/null
+++ b/win/CS/Installer/Installer.nsi
@@ -0,0 +1,360 @@
+/* Resources.Designer.cs $
+
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
+
+; Script generated by the HM NIS Edit Script Wizard.
+
+; HM NIS Edit Wizard helper defines
+!define PRODUCT_NAME "HandBrake"
+!define PRODUCT_VERSION "0.9.6"
+!define PRODUCT_VERSION_NUMBER "0.9.6"
+!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\Handbrake.exe"
+!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
+!define PRODUCT_UNINST_ROOT_KEY "HKLM"
+
+;Required .NET framework
+!define MIN_FRA_MAJOR "4"
+!define MIN_FRA_MINOR "0"
+!define MIN_FRA_BUILD "*"
+
+SetCompressor lzma
+
+; MUI 1.67 compatible ------
+!include "MUI.nsh"
+
+; MUI Settings
+!define MUI_ABORTWARNING
+!define MUI_ICON "handbrakepineapple.ico"
+!define MUI_UNICON "handbrakepineapple.ico"
+
+; Welcome page
+!insertmacro MUI_PAGE_WELCOME
+; License page
+!insertmacro MUI_PAGE_LICENSE "doc\COPYING"
+; Directory page
+!insertmacro MUI_PAGE_DIRECTORY
+; Instfiles page
+!insertmacro MUI_PAGE_INSTFILES
+; Finish page
+!define MUI_FINISHPAGE_RUN "$INSTDIR\Handbrake.exe"
+!insertmacro MUI_PAGE_FINISH
+
+; Uninstaller pages
+!insertmacro MUI_UNPAGE_INSTFILES
+
+; Language files
+!insertmacro MUI_LANGUAGE "English"
+
+; MUI end ------
+
+Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
+OutFile "HandBrake-${PRODUCT_VERSION_NUMBER}-Win_GUI.exe"
+
+!include WordFunc.nsh
+!insertmacro VersionCompare
+!include LogicLib.nsh
+
+InstallDir "$PROGRAMFILES\Handbrake"
+InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
+ShowInstDetails show
+ShowUnInstDetails show
+
+Var InstallDotNET
+
+Function .onInit
+
+ ; Begin Only allow one version
+ System::Call 'kernel32::CreateMutexA(i 0, i 0, t "myMutex") i .r1 ?e'
+ Pop $R0
+
+ StrCmp $R0 0 +3
+ MessageBox MB_OK|MB_ICONEXCLAMATION "The installer is already running."
+ Abort
+
+ ;Remove previous version
+ ReadRegStr $R0 HKLM \
+ "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}\" \
+ "UninstallString"
+ StrCmp $R0 "" done
+
+ MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \
+ "${PRODUCT_NAME} is already installed. $\n$\nClick `OK` to remove the \
+ previous version or `Cancel` to continue." \
+ IDOK uninst
+ goto done
+
+ ;Run the uninstaller
+ uninst:
+ Exec $INSTDIR\uninst.exe
+ done:
+FunctionEnd
+
+Section "Handbrake" SEC01
+ SetOutPath "$INSTDIR"
+ SetOverwrite ifnewer
+
+ ; Begin Check .NET version
+ StrCpy $InstallDotNET "No"
+ Call CheckFramework
+ StrCmp $0 "1" +3
+ StrCpy $InstallDotNET "Yes"
+ MessageBox MB_OK|MB_ICONINFORMATION "${PRODUCT_NAME} requires that the .NET Framework 4.0 is installed. The latest .NET Framework will be downloaded and installed automatically during installation of ${PRODUCT_NAME}."
+ Pop $0
+
+ ; Get .NET if required
+ ${If} $InstallDotNET == "Yes"
+ SetDetailsView hide
+ inetc::get /caption "Downloading .NET Framework 4.0" /canceltext "Cancel" "http://www.microsoft.com/downloads/info.aspx?na=41&SrcFamilyId=9CFB2D51-5FF4-4491-B0E5-B386F32C0992&SrcDisplayLang=en&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f1%2fB%2fE%2f1BE39E79-7E39-46A3-96FF-047F95396215%2fdotNetFx40_Full_setup.exe" "$INSTDIR\dotnetfx.exe" /end
+ Pop $1
+
+ ${If} $1 != "OK"
+ Delete "$INSTDIR\dotnetfx.exe"
+ Abort "Installation cancelled, ${PRODUCT_NAME} requires the .NET 4.0 Framework"
+ ${EndIf}
+
+ ExecWait "$INSTDIR\dotnetfx.exe"
+ Delete "$INSTDIR\dotnetfx.exe"
+
+ SetDetailsView show
+ ${EndIf}
+
+ ; Install Files
+ File "Handbrake.exe"
+ File "HandBrakeCLI.exe"
+ CreateDirectory "$SMPROGRAMS\Handbrake"
+ CreateShortCut "$SMPROGRAMS\Handbrake\Handbrake.lnk" "$INSTDIR\Handbrake.exe"
+ CreateShortCut "$DESKTOP\Handbrake.lnk" "$INSTDIR\Handbrake.exe"
+ File "Interop.QTOLibrary.dll"
+ File "Interop.QTOControlLib.dll"
+ File "AxInterop.QTOControlLib.dll"
+ File "Growl.Connector.dll"
+ File "Growl.CoreLibrary.dll"
+ File "Handbrake.exe.config"
+ File "HandBrake.ApplicationServices.dll"
+ File "Microsoft.WindowsAPICodePack.Shell.dll"
+ File "Microsoft.WindowsAPICodePack.dll"
+ File "HandBrakeInterop.dll"
+
+ ;File "Caliburn.Castle.dll"
+ ;File "Caliburn.Core.dll"
+ ;File "Castle.Core.dll"
+ ;File "Castle.DynamicProxy2.dll"
+ ;File "Castle.MicroKernel.dll"
+ ;File "Castle.Windsor.dll"
+ ;File "Microsoft.Practices.ServiceLocation.dll"
+
+ ; Copy the standard doc set into the doc folder
+ SetOutPath "$INSTDIR\doc"
+ SetOverwrite ifnewer
+ File "doc\AUTHORS"
+ File "doc\COPYING"
+ File "doc\CREDITS"
+ File "doc\NEWS"
+ File "doc\THANKS"
+ File "doc\TRANSLATIONS"
+SectionEnd
+
+Section -AdditionalIcons
+ CreateShortCut "$SMPROGRAMS\Handbrake\Uninstall.lnk" "$INSTDIR\uninst.exe"
+SectionEnd
+
+Section -Post
+ WriteUninstaller "$INSTDIR\uninst.exe"
+ WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\Handbrake.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\Handbrake.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
+SectionEnd
+
+
+Function un.onUninstSuccess
+ HideWindow
+ MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) was successfully removed from your computer."
+FunctionEnd
+
+Function un.onInit
+ MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Are you sure you want to completely remove $(^Name) and all of its components?" IDYES +2
+ Abort
+FunctionEnd
+
+Section Uninstall
+ Delete "$INSTDIR\uninst.exe"
+
+ Delete "$INSTDIR\Interop.QTOLibrary.dll"
+ Delete "$INSTDIR\Interop.QTOControlLib.dll"
+ Delete "$INSTDIR\AxInterop.QTOControlLib.dll"
+ Delete "$INSTDIR\HandBrakeCLI.exe"
+ Delete "$INSTDIR\handbrakepineapple.ico"
+ Delete "$INSTDIR\Handbrake.exe"
+ Delete "$INSTDIR\Handbrake.exe.config"
+ Delete "$INSTDIR\Growl.Connector.dll"
+ Delete "$INSTDIR\Growl.CoreLibrary.dll"
+ Delete "$INSTDIR\libgcc_s_sjlj-1.dll"
+ Delete "$INSTDIR\HandBrake.ApplicationServices.dll"
+ Delete "$INSTDIR\HandBrake.Framework.dll"
+ Delete "$INSTDIR\Microsoft.WindowsAPICodePack.Shell.dll"
+ Delete "$INSTDIR\Microsoft.WindowsAPICodePack.dll"
+ Delete "$INSTDIR\HandBrakeInterop.dll"
+
+ Delete "$INSTDIR\Caliburn.Castle.dll"
+ Delete "$INSTDIR\Caliburn.Core.dll"
+ Delete "$INSTDIR\Castle.Core.dll"
+ Delete "$INSTDIR\Castle.DynamicProxy2.dll"
+ Delete "$INSTDIR\Castle.MicroKernel.dll"
+ Delete "$INSTDIR\Castle.Windsor.dll"
+ Delete "$INSTDIR\Microsoft.Practices.ServiceLocation.dll"
+
+ Delete "$INSTDIR\doc\AUTHORS"
+ Delete "$INSTDIR\doc\COPYING"
+ Delete "$INSTDIR\doc\CREDITS"
+ Delete "$INSTDIR\doc\NEWS"
+ Delete "$INSTDIR\doc\THANKS"
+ Delete "$INSTDIR\doc\TRANSLATIONS"
+ RMDir "$INSTDIR"
+ Delete "$SMPROGRAMS\Handbrake\Uninstall.lnk"
+ Delete "$DESKTOP\Handbrake.lnk"
+ Delete "$SMPROGRAMS\Handbrake\Handbrake.lnk"
+ RMDir "$SMPROGRAMS\Handbrake"
+ RMDir "$INSTDIR"
+
+ DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
+ DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
+ SetAutoClose true
+SectionEnd
+
+;Check for .NET framework
+Function CheckFrameWork
+
+ ;Save the variables in case something else is using them
+ Push $0
+ Push $1
+ Push $2
+ Push $3
+ Push $4
+ Push $R1
+ Push $R2
+ Push $R3
+ Push $R4
+ Push $R5
+ Push $R6
+ Push $R7
+ Push $R8
+
+ StrCpy $R5 "0"
+ StrCpy $R6 "0"
+ StrCpy $R7 "0"
+ StrCpy $R8 "0.0.0"
+ StrCpy $0 0
+
+ loop:
+
+ ;Get each sub key under "SOFTWARE\Microsoft\NET Framework Setup\NDP"
+ EnumRegKey $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP" $0
+ StrCmp $1 "" done ;jump to end if no more registry keys
+ IntOp $0 $0 + 1
+ StrCpy $2 $1 1 ;Cut off the first character
+ StrCpy $3 $1 "" 1 ;Remainder of string
+
+ ;Loop if first character is not a 'v'
+ StrCmpS $2 "v" start_parse loop
+
+ ;Parse the string
+ start_parse:
+ StrCpy $R1 ""
+ StrCpy $R2 ""
+ StrCpy $R3 ""
+ StrCpy $R4 $3
+
+ StrCpy $4 1
+
+ parse:
+ StrCmp $3 "" parse_done ;If string is empty, we are finished
+ StrCpy $2 $3 1 ;Cut off the first character
+ StrCpy $3 $3 "" 1 ;Remainder of string
+ StrCmp $2 "." is_dot not_dot ;Move to next part if it's a dot
+
+ is_dot:
+ IntOp $4 $4 + 1 ; Move to the next section
+ goto parse ;Carry on parsing
+
+ not_dot:
+ IntCmp $4 1 major_ver
+ IntCmp $4 2 minor_ver
+ IntCmp $4 3 build_ver
+ IntCmp $4 4 parse_done
+
+ major_ver:
+ StrCpy $R1 $R1$2
+ goto parse ;Carry on parsing
+
+ minor_ver:
+ StrCpy $R2 $R2$2
+ goto parse ;Carry on parsing
+
+ build_ver:
+ StrCpy $R3 $R3$2
+ goto parse ;Carry on parsing
+
+ parse_done:
+
+ IntCmp $R1 $R5 this_major_same loop this_major_more
+ this_major_more:
+ StrCpy $R5 $R1
+ StrCpy $R6 $R2
+ StrCpy $R7 $R3
+ StrCpy $R8 $R4
+
+ goto loop
+
+ this_major_same:
+ IntCmp $R2 $R6 this_minor_same loop this_minor_more
+ this_minor_more:
+ StrCpy $R6 $R2
+ StrCpy $R7 R3
+ StrCpy $R8 $R4
+ goto loop
+
+ this_minor_same:
+ IntCmp $R3 $R7 loop loop this_build_more
+ this_build_more:
+ StrCpy $R7 $R3
+ StrCpy $R8 $R4
+ goto loop
+
+ done:
+
+ ;Have we got the framework we need?
+ IntCmp $R5 ${MIN_FRA_MAJOR} max_major_same fail OK
+ max_major_same:
+ IntCmp $R6 ${MIN_FRA_MINOR} max_minor_same fail OK
+ max_minor_same:
+ IntCmp $R7 ${MIN_FRA_BUILD} OK fail OK
+
+ ;Version on machine is greater than what we need
+ OK:
+ StrCpy $0 "1"
+ goto end
+
+ fail:
+ StrCmp $R8 "0.0.0" end
+
+
+ end:
+
+ ;Pop the variables we pushed earlier
+ Pop $R8
+ Pop $R7
+ Pop $R6
+ Pop $R5
+ Pop $R4
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+FunctionEnd \ No newline at end of file
diff --git a/win/CS/Installer/MakeNightly.nsi.tmpl b/win/CS/Installer/MakeNightly.nsi.tmpl
new file mode 100644
index 000000000..3c5768a20
--- /dev/null
+++ b/win/CS/Installer/MakeNightly.nsi.tmpl
@@ -0,0 +1,343 @@
+/* Resources.Designer.cs $
+
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
+
+; Script generated by the HM NIS Edit Script Wizard.
+
+; HM NIS Edit Wizard helper defines
+!define PRODUCT_NAME "Handbrake"
+!define PRODUCT_VERSION "$WCREV$ Nightly"
+!define PRODUCT_VERSION_NUMBER "svn$WCREV$"
+!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\Handbrake.exe"
+!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
+!define PRODUCT_UNINST_ROOT_KEY "HKLM"
+
+;Required .NET framework
+!define MIN_FRA_MAJOR "4"
+!define MIN_FRA_MINOR "0"
+!define MIN_FRA_BUILD "*"
+
+SetCompressor lzma
+
+; MUI 1.67 compatible ------
+!include "MUI.nsh"
+
+; MUI Settings
+!define MUI_ABORTWARNING
+!define MUI_ICON "handbrakepineapple.ico"
+!define MUI_UNICON "handbrakepineapple.ico"
+
+; Welcome page
+!insertmacro MUI_PAGE_WELCOME
+; License page
+!insertmacro MUI_PAGE_LICENSE "doc\COPYING"
+; Directory page
+!insertmacro MUI_PAGE_DIRECTORY
+; Instfiles page
+!insertmacro MUI_PAGE_INSTFILES
+; Finish page
+!define MUI_FINISHPAGE_RUN "$INSTDIR\Handbrake.exe"
+!insertmacro MUI_PAGE_FINISH
+
+; Uninstaller pages
+!insertmacro MUI_UNPAGE_INSTFILES
+
+; Language files
+!insertmacro MUI_LANGUAGE "English"
+
+; MUI end ------
+
+Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
+OutFile "HandBrake-${PRODUCT_VERSION_NUMBER}-Win_GUI.exe"
+
+!include WordFunc.nsh
+!insertmacro VersionCompare
+!include LogicLib.nsh
+
+InstallDir "$PROGRAMFILES\Handbrake"
+InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
+ShowInstDetails show
+ShowUnInstDetails show
+
+Var InstallDotNET
+
+Function .onInit
+
+ ; Begin Only allow one version
+ System::Call 'kernel32::CreateMutexA(i 0, i 0, t "myMutex") i .r1 ?e'
+ Pop $R0
+
+ StrCmp $R0 0 +3
+ MessageBox MB_OK|MB_ICONEXCLAMATION "The installer is already running."
+ Abort
+
+ ;Remove previous version
+ ReadRegStr $R0 HKLM \
+ "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}\" \
+ "UninstallString"
+ StrCmp $R0 "" done
+
+ MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \
+ "${PRODUCT_NAME} is already installed. $\n$\nClick `OK` to remove the \
+ previous version or `Cancel` to continue." \
+ IDOK uninst
+ goto done
+
+ ;Run the uninstaller
+ uninst:
+ Exec $INSTDIR\uninst.exe
+ done:
+FunctionEnd
+
+Section "Handbrake" SEC01
+ SetOutPath "$INSTDIR"
+ SetOverwrite ifnewer
+
+ ; Begin Check .NET version
+ StrCpy $InstallDotNET "No"
+ Call CheckFramework
+ StrCmp $0 "1" +3
+ StrCpy $InstallDotNET "Yes"
+ MessageBox MB_OK|MB_ICONINFORMATION "${PRODUCT_NAME} requires that the .NET Framework 4.0 is installed. The latest .NET Framework will be downloaded and installed automatically during installation of ${PRODUCT_NAME}."
+ Pop $0
+
+ ; Get .NET if required
+ ${If} $InstallDotNET == "Yes"
+ SetDetailsView hide
+ inetc::get /caption "Downloading .NET Framework 4.0" /canceltext "Cancel" "http://www.microsoft.com/downloads/info.aspx?na=41&SrcFamilyId=9CFB2D51-5FF4-4491-B0E5-B386F32C0992&SrcDisplayLang=en&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f1%2fB%2fE%2f1BE39E79-7E39-46A3-96FF-047F95396215%2fdotNetFx40_Full_setup.exe" "$INSTDIR\dotnetfx.exe" /end
+ Pop $1
+
+ ${If} $1 != "OK"
+ Delete "$INSTDIR\dotnetfx.exe"
+ Abort "Installation cancelled, ${PRODUCT_NAME} requires the .NET 4.0 Framework"
+ ${EndIf}
+
+ ExecWait "$INSTDIR\dotnetfx.exe"
+ Delete "$INSTDIR\dotnetfx.exe"
+
+ SetDetailsView show
+ ${EndIf}
+
+ ; Install Files
+ File "Handbrake.exe"
+ File "HandBrakeCLI.exe"
+ CreateDirectory "$SMPROGRAMS\Handbrake"
+ CreateShortCut "$SMPROGRAMS\Handbrake\Handbrake.lnk" "$INSTDIR\Handbrake.exe"
+ CreateShortCut "$DESKTOP\Handbrake.lnk" "$INSTDIR\Handbrake.exe"
+ File "Interop.QTOLibrary.dll"
+ File "Interop.QTOControlLib.dll"
+ File "AxInterop.QTOControlLib.dll"
+ File "Growl.Connector.dll"
+ File "Growl.CoreLibrary.dll"
+ File "Handbrake.exe.config"
+ File "HandBrake.ApplicationServices.dll"
+ File "Microsoft.WindowsAPICodePack.Shell.dll"
+ File "Microsoft.WindowsAPICodePack.dll"
+ File "HandBrakeInterop.dll"
+
+ ; Copy the standard doc set into the doc folder
+ SetOutPath "$INSTDIR\doc"
+ SetOverwrite ifnewer
+ File "doc\AUTHORS"
+ File "doc\COPYING"
+ File "doc\CREDITS"
+ File "doc\NEWS"
+ File "doc\THANKS"
+ File "doc\TRANSLATIONS"
+SectionEnd
+
+Section -AdditionalIcons
+ CreateShortCut "$SMPROGRAMS\Handbrake\Uninstall.lnk" "$INSTDIR\uninst.exe"
+SectionEnd
+
+Section -Post
+ WriteUninstaller "$INSTDIR\uninst.exe"
+ WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\Handbrake.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\Handbrake.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
+SectionEnd
+
+
+Function un.onUninstSuccess
+ HideWindow
+ MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) was successfully removed from your computer."
+FunctionEnd
+
+Function un.onInit
+ MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Are you sure you want to completely remove $(^Name) and all of its components?" IDYES +2
+ Abort
+FunctionEnd
+
+Section Uninstall
+ Delete "$INSTDIR\uninst.exe"
+
+ Delete "$INSTDIR\Interop.QTOLibrary.dll"
+ Delete "$INSTDIR\Interop.QTOControlLib.dll"
+ Delete "$INSTDIR\AxInterop.QTOControlLib.dll"
+ Delete "$INSTDIR\HandBrakeCLI.exe"
+ Delete "$INSTDIR\handbrakepineapple.ico"
+ Delete "$INSTDIR\Handbrake.exe"
+ Delete "$INSTDIR\Handbrake.exe.config"
+ Delete "$INSTDIR\Growl.Connector.dll"
+ Delete "$INSTDIR\Growl.CoreLibrary.dll"
+ Delete "$INSTDIR\libgcc_s_sjlj-1.dll"
+ Delete "$INSTDIR\HandBrake.ApplicationServices.dll"
+ Delete "$INSTDIR\Microsoft.WindowsAPICodePack.Shell.dll"
+ Delete "$INSTDIR\Microsoft.WindowsAPICodePack.dll"
+ Delete "$INSTDIR\HandBrakeInterop.dll"
+
+ Delete "$INSTDIR\doc\AUTHORS"
+ Delete "$INSTDIR\doc\COPYING"
+ Delete "$INSTDIR\doc\CREDITS"
+ Delete "$INSTDIR\doc\NEWS"
+ Delete "$INSTDIR\doc\THANKS"
+ Delete "$INSTDIR\doc\TRANSLATIONS"
+ RMDir "$INSTDIR"
+ Delete "$SMPROGRAMS\Handbrake\Uninstall.lnk"
+ Delete "$DESKTOP\Handbrake.lnk"
+ Delete "$SMPROGRAMS\Handbrake\Handbrake.lnk"
+ RMDir "$SMPROGRAMS\Handbrake"
+ RMDir "$INSTDIR"
+
+ DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
+ DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
+ SetAutoClose true
+SectionEnd
+
+;Check for .NET framework
+Function CheckFrameWork
+
+ ;Save the variables in case something else is using them
+ Push $0
+ Push $1
+ Push $2
+ Push $3
+ Push $4
+ Push $R1
+ Push $R2
+ Push $R3
+ Push $R4
+ Push $R5
+ Push $R6
+ Push $R7
+ Push $R8
+
+ StrCpy $R5 "0"
+ StrCpy $R6 "0"
+ StrCpy $R7 "0"
+ StrCpy $R8 "0.0.0"
+ StrCpy $0 0
+
+ loop:
+
+ ;Get each sub key under "SOFTWARE\Microsoft\NET Framework Setup\NDP"
+ EnumRegKey $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP" $0
+ StrCmp $1 "" done ;jump to end if no more registry keys
+ IntOp $0 $0 + 1
+ StrCpy $2 $1 1 ;Cut off the first character
+ StrCpy $3 $1 "" 1 ;Remainder of string
+
+ ;Loop if first character is not a 'v'
+ StrCmpS $2 "v" start_parse loop
+
+ ;Parse the string
+ start_parse:
+ StrCpy $R1 ""
+ StrCpy $R2 ""
+ StrCpy $R3 ""
+ StrCpy $R4 $3
+
+ StrCpy $4 1
+
+ parse:
+ StrCmp $3 "" parse_done ;If string is empty, we are finished
+ StrCpy $2 $3 1 ;Cut off the first character
+ StrCpy $3 $3 "" 1 ;Remainder of string
+ StrCmp $2 "." is_dot not_dot ;Move to next part if it's a dot
+
+ is_dot:
+ IntOp $4 $4 + 1 ; Move to the next section
+ goto parse ;Carry on parsing
+
+ not_dot:
+ IntCmp $4 1 major_ver
+ IntCmp $4 2 minor_ver
+ IntCmp $4 3 build_ver
+ IntCmp $4 4 parse_done
+
+ major_ver:
+ StrCpy $R1 $R1$2
+ goto parse ;Carry on parsing
+
+ minor_ver:
+ StrCpy $R2 $R2$2
+ goto parse ;Carry on parsing
+
+ build_ver:
+ StrCpy $R3 $R3$2
+ goto parse ;Carry on parsing
+
+ parse_done:
+
+ IntCmp $R1 $R5 this_major_same loop this_major_more
+ this_major_more:
+ StrCpy $R5 $R1
+ StrCpy $R6 $R2
+ StrCpy $R7 $R3
+ StrCpy $R8 $R4
+
+ goto loop
+
+ this_major_same:
+ IntCmp $R2 $R6 this_minor_same loop this_minor_more
+ this_minor_more:
+ StrCpy $R6 $R2
+ StrCpy $R7 R3
+ StrCpy $R8 $R4
+ goto loop
+
+ this_minor_same:
+ IntCmp $R3 $R7 loop loop this_build_more
+ this_build_more:
+ StrCpy $R7 $R3
+ StrCpy $R8 $R4
+ goto loop
+
+ done:
+
+ ;Have we got the framework we need?
+ IntCmp $R5 ${MIN_FRA_MAJOR} max_major_same fail OK
+ max_major_same:
+ IntCmp $R6 ${MIN_FRA_MINOR} max_minor_same fail OK
+ max_minor_same:
+ IntCmp $R7 ${MIN_FRA_BUILD} OK fail OK
+
+ ;Version on machine is greater than what we need
+ OK:
+ StrCpy $0 "1"
+ goto end
+
+ fail:
+ StrCmp $R8 "0.0.0" end
+
+
+ end:
+
+ ;Pop the variables we pushed earlier
+ Pop $R8
+ Pop $R7
+ Pop $R6
+ Pop $R5
+ Pop $R4
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+FunctionEnd \ No newline at end of file
diff --git a/win/CS/Model/ActivityLogMode.cs b/win/CS/Model/ActivityLogMode.cs
new file mode 100644
index 000000000..1ab699ea3
--- /dev/null
+++ b/win/CS/Model/ActivityLogMode.cs
@@ -0,0 +1,23 @@
+/* ActivityLogMode.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.Model
+{
+ /// <summary>
+ /// The Log Mode, either scan or encode
+ /// </summary>
+ public enum ActivityLogMode
+ {
+ /// <summary>
+ /// Scan Mode
+ /// </summary>
+ Scan,
+
+ /// <summary>
+ /// Encode mode
+ /// </summary>
+ Encode
+ }
+}
diff --git a/win/CS/Model/QueryEncodeMode.cs b/win/CS/Model/QueryEncodeMode.cs
new file mode 100644
index 000000000..63e6eccff
--- /dev/null
+++ b/win/CS/Model/QueryEncodeMode.cs
@@ -0,0 +1,16 @@
+/* AddPresetMode.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.Model
+{
+ /// <summary>
+ /// Picture Settings Mode when adding presets
+ /// </summary>
+ public enum QueryEncodeMode
+ {
+ Preview,
+ Standard
+ }
+} \ No newline at end of file
diff --git a/win/CS/Model/QueryPictureSettingsMode.cs b/win/CS/Model/QueryPictureSettingsMode.cs
new file mode 100644
index 000000000..539027145
--- /dev/null
+++ b/win/CS/Model/QueryPictureSettingsMode.cs
@@ -0,0 +1,18 @@
+/* AddPresetMode.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.Model
+{
+ /// <summary>
+ /// Picture Settings Mode when adding presets
+ /// </summary>
+ public enum QueryPictureSettingsMode
+ {
+ None,
+ Custom,
+ SourceMaximum,
+ UserInterfaceSettings
+ }
+} \ No newline at end of file
diff --git a/win/CS/Model/SourceType.cs b/win/CS/Model/SourceType.cs
new file mode 100644
index 000000000..2081ce985
--- /dev/null
+++ b/win/CS/Model/SourceType.cs
@@ -0,0 +1,33 @@
+/* SourceType.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.Model
+{
+ /// <summary>
+ /// The Type of source that the user has scanned
+ /// </summary>
+ public enum SourceType
+ {
+ /// <summary>
+ /// No Source Selected
+ /// </summary>
+ None = 0,
+
+ /// <summary>
+ /// The soruce selected is a folder
+ /// </summary>
+ Folder,
+
+ /// <summary>
+ /// The source selected is a DVD drive
+ /// </summary>
+ DvdDrive,
+
+ /// <summary>
+ /// The source selected is a Video File
+ /// </summary>
+ VideoFile
+ }
+} \ No newline at end of file
diff --git a/win/CS/Program.cs b/win/CS/Program.cs
new file mode 100644
index 000000000..f8a9c8683
--- /dev/null
+++ b/win/CS/Program.cs
@@ -0,0 +1,144 @@
+/* Program.cs
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake
+{
+ using System;
+ using System.Diagnostics;
+ using System.Drawing;
+ using System.IO;
+ using System.Windows.Forms;
+
+ using HandBrake.ApplicationServices;
+ using HandBrake.ApplicationServices.Services;
+
+ using Handbrake.Properties;
+ using Handbrake.ToolWindows;
+
+ /// <summary>
+ /// HandBrake Starts Here
+ /// </summary>
+ public static class Program
+ {
+ /// <summary>
+ /// The main entry point for the application.
+ /// </summary>
+ /// <param name="args">
+ /// The args.
+ /// </param>
+ [STAThread]
+ public static void Main(string[] args)
+ {
+ InstanceId = Process.GetProcessesByName("HandBrake").Length;
+
+ // Handle any unhandled exceptions
+ AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException;
+
+ // Check that HandBrakeCLI is availabl.
+ string failedInstall = "HandBrake is not installed properly. Please reinstall HandBrake. \n\n";
+ string missingFiles = string.Empty;
+
+ // Verify HandBrakeCLI.exe exists
+ if (!File.Exists(Path.Combine(Application.StartupPath, "HandBrakeCLI.exe")))
+ {
+ missingFiles += "\"HandBrakeCLI.exe\" was not found.";
+ }
+
+ if (missingFiles != string.Empty)
+ {
+ MessageBox.Show(
+ failedInstall + missingFiles,
+ "Error",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
+ return;
+ }
+
+ // Attempt to upgrade / keep the users settings between versions
+ if (Settings.Default.UpdateRequired)
+ {
+ Settings.Default.Upgrade();
+ // Reset some settings
+ Settings.Default.UpdateRequired = false;
+ Settings.Default.CliExeHash = null;
+ Settings.Default.hb_build = 0;
+ Settings.Default.hb_platform = null;
+ Settings.Default.hb_version = null;
+
+ // Re-detect the CLI version data.
+ Functions.Main.SetCliVersionData();
+ }
+
+ // Check were not running on a screen that's going to cause some funnies to happen.
+ Screen scr = Screen.PrimaryScreen;
+ if ((scr.Bounds.Width < 1024) || (scr.Bounds.Height < 620))
+ {
+ MessageBox.Show(
+ "Your system does not meet the minimum requirements for HandBrake. \n" +
+ "Your screen is running at: " + scr.Bounds.Width + "x" + scr.Bounds.Height +
+ " \nScreen resolution is too Low. Must be 1024x620 or greater.\n\n",
+ "Error",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
+ }
+ else
+ {
+ string logDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"HandBrake\logs");
+ if (!Directory.Exists(logDir))
+ Directory.CreateDirectory(logDir);
+
+ if (!File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"HandBrake\presets.xml")))
+ {
+ PresetService x = new PresetService();
+ x.UpdateBuiltInPresets(string.Empty);
+ }
+
+ InitializeApplicationServices();
+
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new frmMain(args));
+ }
+ }
+
+ /// <summary>
+ /// Initialize App Services
+ /// </summary>
+ private static void InitializeApplicationServices()
+ {
+ string versionId = String.Format("Windows GUI {1} {0}", Settings.Default.hb_build, Settings.Default.hb_version);
+ Init.SetupSettings(versionId, Settings.Default.hb_version, Settings.Default.hb_build, InstanceId, Settings.Default.CompletionOption, Settings.Default.noDvdNav,
+ Settings.Default.growlEncode, Settings.Default.growlQueue,
+ Settings.Default.processPriority, Settings.Default.saveLogPath, Settings.Default.saveLogToSpecifiedPath,
+ Settings.Default.saveLogWithVideo, Settings.Default.showCliForInGuiEncodeStatus, Settings.Default.preventSleep);
+ }
+
+ /// <summary>
+ /// Throw up an error message for any unhandled exceptions.
+ /// </summary>
+ /// <param name="sender">The sender</param>
+ /// <param name="e">Unhandled Exception EventArgs </param>
+ private static void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
+ {
+ try
+ {
+ ExceptionWindow window = new ExceptionWindow();
+ window.Setup("An Unknown Error has occured.", e.ExceptionObject.ToString());
+ window.ShowDialog();
+ }
+ catch (Exception)
+ {
+ MessageBox.Show(
+ "An Unknown Error has occured. \n\n Exception:" + e.ExceptionObject,
+ "Unhandled Exception",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
+ }
+
+ }
+
+ public static int InstanceId;
+ }
+} \ No newline at end of file
diff --git a/win/CS/Properties/AssemblyInfo.cs.tmpl b/win/CS/Properties/AssemblyInfo.cs.tmpl
new file mode 100644
index 000000000..5e3c9f92d
--- /dev/null
+++ b/win/CS/Properties/AssemblyInfo.cs.tmpl
@@ -0,0 +1,42 @@
+/* AssemblyInfo.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+using System.Reflection;
+using System.Resources;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+
+[assembly: AssemblyTitle("HandBrake")]
+[assembly: AssemblyDescription("HandBrake is a GPL-licensed, multiplatform, multithreaded video transcoder.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HandBrake")]
+[assembly: AssemblyProduct("HandBrake")]
+[assembly: AssemblyCopyright("Copyright © 2011")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+
+[assembly: Guid("5e4e3f97-5252-41f6-aae9-3846f62cbc66")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+
+[assembly: AssemblyVersion("0.9.5.$WCREV$")]
+[assembly: NeutralResourcesLanguage("")] \ No newline at end of file
diff --git a/win/CS/Properties/Resources.Designer.cs b/win/CS/Properties/Resources.Designer.cs
new file mode 100644
index 000000000..81617ccdb
--- /dev/null
+++ b/win/CS/Properties/Resources.Designer.cs
@@ -0,0 +1,308 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.1
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Handbrake.Properties {
+ using System;
+
+
+ /// <summary>
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ /// </summary>
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ /// <summary>
+ /// Returns the cached ResourceManager instance used by this class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Handbrake.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ /// <summary>
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ internal static System.Drawing.Bitmap ActivityWindow {
+ get {
+ object obj = ResourceManager.GetObject("ActivityWindow", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap ActivityWindow_small {
+ get {
+ object obj = ResourceManager.GetObject("ActivityWindow_small", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap Add16 {
+ get {
+ object obj = ResourceManager.GetObject("Add16", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap AddToQueue {
+ get {
+ object obj = ResourceManager.GetObject("AddToQueue", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap AddToQueue_small {
+ get {
+ object obj = ResourceManager.GetObject("AddToQueue_small", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap Close {
+ get {
+ object obj = ResourceManager.GetObject("Close", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap copy {
+ get {
+ object obj = ResourceManager.GetObject("copy", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap disc_small {
+ get {
+ object obj = ResourceManager.GetObject("disc_small", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap Download {
+ get {
+ object obj = ResourceManager.GetObject("Download", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap ErrorX {
+ get {
+ object obj = ResourceManager.GetObject("ErrorX", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap folder {
+ get {
+ object obj = ResourceManager.GetObject("folder", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap General_Preferences {
+ get {
+ object obj = ResourceManager.GetObject("General_Preferences", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap hb16 {
+ get {
+ object obj = ResourceManager.GetObject("hb16", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap hb32 {
+ get {
+ object obj = ResourceManager.GetObject("hb32", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap Help16 {
+ get {
+ object obj = ResourceManager.GetObject("Help16", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap Help24 {
+ get {
+ object obj = ResourceManager.GetObject("Help24", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap Help32 {
+ get {
+ object obj = ResourceManager.GetObject("Help32", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap info16 {
+ get {
+ object obj = ResourceManager.GetObject("info16", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap logo128 {
+ get {
+ object obj = ResourceManager.GetObject("logo128", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap logo64 {
+ get {
+ object obj = ResourceManager.GetObject("logo64", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap Movies {
+ get {
+ object obj = ResourceManager.GetObject("Movies", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap Movies_Small {
+ get {
+ object obj = ResourceManager.GetObject("Movies_Small", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap Options24 {
+ get {
+ object obj = ResourceManager.GetObject("Options24", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap Output_Small {
+ get {
+ object obj = ResourceManager.GetObject("Output_Small", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap Pause {
+ get {
+ object obj = ResourceManager.GetObject("Pause", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap picture {
+ get {
+ object obj = ResourceManager.GetObject("picture", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap Play {
+ get {
+ object obj = ResourceManager.GetObject("Play", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap Play_small {
+ get {
+ object obj = ResourceManager.GetObject("Play_small", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap Pref_Small {
+ get {
+ object obj = ResourceManager.GetObject("Pref_Small", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap Queue {
+ get {
+ object obj = ResourceManager.GetObject("Queue", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap Queue_Small {
+ get {
+ object obj = ResourceManager.GetObject("Queue_Small", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap Restore {
+ get {
+ object obj = ResourceManager.GetObject("Restore", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap save {
+ get {
+ object obj = ResourceManager.GetObject("save", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap stop {
+ get {
+ object obj = ResourceManager.GetObject("stop", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap window {
+ get {
+ object obj = ResourceManager.GetObject("window", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+ }
+}
diff --git a/win/CS/Properties/Resources.resx b/win/CS/Properties/Resources.resx
new file mode 100644
index 000000000..9b2288d09
--- /dev/null
+++ b/win/CS/Properties/Resources.resx
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <data name="General_Preferences" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\General Preferences.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="Pref_Small" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\Pref_Small.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="ActivityWindow" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\ActivityWindow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="Play" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\Play.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="Pause" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\Pause.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="Output_Small" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\Output_Small.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="Queue_Small" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\Queue_Small.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="Movies" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\Movies.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="Movies_Small" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\Movies_Small.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="AddToQueue" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\AddToQueue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="disc_small" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\resources\disc_small.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="ActivityWindow_small" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\resources\activitywindow_small.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="hb16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\hb16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="hb32" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\hb32.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="Help16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\Help16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="info16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\info16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="logo64" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\logo64.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="stop" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\stop.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="folder" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\folder.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="save" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\save.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="Queue" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\Queue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="copy" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\resources\copy.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="window" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\resources\window.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="picture" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\picture.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="AddToQueue_small" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\AddToQueue_small.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="Play_small" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\Play_small.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="Download" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\download.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="Restore" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\Restore.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="logo128" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\logo128.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="ErrorX" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\ErrorX.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="Help24" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\Help24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="Help32" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\Help32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="Add16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\Add16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="Options24" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\Options24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="Close" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\Close.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/win/CS/Properties/Settings.Designer.cs b/win/CS/Properties/Settings.Designer.cs
new file mode 100644
index 000000000..5e1a2bfb9
--- /dev/null
+++ b/win/CS/Properties/Settings.Designer.cs
@@ -0,0 +1,565 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.1
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Handbrake.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Below Normal")]
+ public string processPriority {
+ get {
+ return ((string)(this["processPriority"]));
+ }
+ set {
+ this["processPriority"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool updateStatus {
+ get {
+ return ((bool)(this["updateStatus"]));
+ }
+ set {
+ this["updateStatus"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("{hb_version}")]
+ public string hb_version {
+ get {
+ return ((string)(this["hb_version"]));
+ }
+ set {
+ this["hb_version"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool tooltipEnable {
+ get {
+ return ((bool)(this["tooltipEnable"]));
+ }
+ set {
+ this["tooltipEnable"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Do Nothing")]
+ public string CompletionOption {
+ get {
+ return ((string)(this["CompletionOption"]));
+ }
+ set {
+ this["CompletionOption"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string defaultPreset {
+ get {
+ return ((string)(this["defaultPreset"]));
+ }
+ set {
+ this["defaultPreset"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0")]
+ public int hb_build {
+ get {
+ return ((int)(this["hb_build"]));
+ }
+ set {
+ this["hb_build"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0")]
+ public int skipversion {
+ get {
+ return ((int)(this["skipversion"]));
+ }
+ set {
+ this["skipversion"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool autoNaming {
+ get {
+ return ((bool)(this["autoNaming"]));
+ }
+ set {
+ this["autoNaming"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string autoNamePath {
+ get {
+ return ((string)(this["autoNamePath"]));
+ }
+ set {
+ this["autoNamePath"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("http://handbrake.fr/appcast.xml")]
+ public string appcast {
+ get {
+ return ((string)(this["appcast"]));
+ }
+ set {
+ this["appcast"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("http://handbrake.fr/appcast_unstable.xml")]
+ public string appcast_unstable {
+ get {
+ return ((string)(this["appcast_unstable"]));
+ }
+ set {
+ this["appcast_unstable"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("{source}-{title}")]
+ public string autoNameFormat {
+ get {
+ return ((string)(this["autoNameFormat"]));
+ }
+ set {
+ this["autoNameFormat"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool saveLogToSpecifiedPath {
+ get {
+ return ((bool)(this["saveLogToSpecifiedPath"]));
+ }
+ set {
+ this["saveLogToSpecifiedPath"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string saveLogPath {
+ get {
+ return ((string)(this["saveLogPath"]));
+ }
+ set {
+ this["saveLogPath"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool saveLogWithVideo {
+ get {
+ return ((bool)(this["saveLogWithVideo"]));
+ }
+ set {
+ this["saveLogWithVideo"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("C:\\Program Files\\VideoLAN\\vlc\\vlc.exe")]
+ public string VLC_Path {
+ get {
+ return ((string)(this["VLC_Path"]));
+ }
+ set {
+ this["VLC_Path"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool MainWindowMinimize {
+ get {
+ return ((bool)(this["MainWindowMinimize"]));
+ }
+ set {
+ this["MainWindowMinimize"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool QueryEditorTab {
+ get {
+ return ((bool)(this["QueryEditorTab"]));
+ }
+ set {
+ this["QueryEditorTab"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0.25")]
+ public double x264cqstep {
+ get {
+ return ((double)(this["x264cqstep"]));
+ }
+ set {
+ this["x264cqstep"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("1")]
+ public int verboseLevel {
+ get {
+ return ((int)(this["verboseLevel"]));
+ }
+ set {
+ this["verboseLevel"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool noDvdNav {
+ get {
+ return ((bool)(this["noDvdNav"]));
+ }
+ set {
+ this["noDvdNav"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool presetNotification {
+ get {
+ return ((bool)(this["presetNotification"]));
+ }
+ set {
+ this["presetNotification"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool trayIconAlerts {
+ get {
+ return ((bool)(this["trayIconAlerts"]));
+ }
+ set {
+ this["trayIconAlerts"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.DateTime lastUpdateCheckDate {
+ get {
+ return ((global::System.DateTime)(this["lastUpdateCheckDate"]));
+ }
+ set {
+ this["lastUpdateCheckDate"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("7")]
+ public int daysBetweenUpdateCheck {
+ get {
+ return ((int)(this["daysBetweenUpdateCheck"]));
+ }
+ set {
+ this["daysBetweenUpdateCheck"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0")]
+ public int useM4v {
+ get {
+ return ((int)(this["useM4v"]));
+ }
+ set {
+ this["useM4v"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool PromptOnUnmatchingQueries {
+ get {
+ return ((bool)(this["PromptOnUnmatchingQueries"]));
+ }
+ set {
+ this["PromptOnUnmatchingQueries"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Any")]
+ public string NativeLanguage {
+ get {
+ return ((string)(this["NativeLanguage"]));
+ }
+ set {
+ this["NativeLanguage"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0")]
+ public int DubMode {
+ get {
+ return ((int)(this["DubMode"]));
+ }
+ set {
+ this["DubMode"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string hb_platform {
+ get {
+ return ((string)(this["hb_platform"]));
+ }
+ set {
+ this["hb_platform"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool growlQueue {
+ get {
+ return ((bool)(this["growlQueue"]));
+ }
+ set {
+ this["growlQueue"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool growlEncode {
+ get {
+ return ((bool)(this["growlEncode"]));
+ }
+ set {
+ this["growlEncode"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string CliExeHash {
+ get {
+ return ((string)(this["CliExeHash"]));
+ }
+ set {
+ this["CliExeHash"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("10")]
+ public int previewScanCount {
+ get {
+ return ((int)(this["previewScanCount"]));
+ }
+ set {
+ this["previewScanCount"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool clearOldLogs {
+ get {
+ return ((bool)(this["clearOldLogs"]));
+ }
+ set {
+ this["clearOldLogs"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool showCliForInGuiEncodeStatus {
+ get {
+ return ((bool)(this["showCliForInGuiEncodeStatus"]));
+ }
+ set {
+ this["showCliForInGuiEncodeStatus"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool AutoNameTitleCase {
+ get {
+ return ((bool)(this["AutoNameTitleCase"]));
+ }
+ set {
+ this["AutoNameTitleCase"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool AutoNameRemoveUnderscore {
+ get {
+ return ((bool)(this["AutoNameRemoveUnderscore"]));
+ }
+ set {
+ this["AutoNameRemoveUnderscore"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool UpdateRequired {
+ get {
+ return ((bool)(this["UpdateRequired"]));
+ }
+ set {
+ this["UpdateRequired"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0")]
+ public int ActivityWindowLastMode {
+ get {
+ return ((int)(this["ActivityWindowLastMode"]));
+ }
+ set {
+ this["ActivityWindowLastMode"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool preventSleep {
+ get {
+ return ((bool)(this["preventSleep"]));
+ }
+ set {
+ this["preventSleep"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool useClosedCaption {
+ get {
+ return ((bool)(this["useClosedCaption"]));
+ }
+ set {
+ this["useClosedCaption"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("35")]
+ public int batchMinDuration {
+ get {
+ return ((int)(this["batchMinDuration"]));
+ }
+ set {
+ this["batchMinDuration"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("47")]
+ public int batchMaxDuration {
+ get {
+ return ((int)(this["batchMaxDuration"]));
+ }
+ set {
+ this["batchMaxDuration"] = value;
+ }
+ }
+ }
+}
diff --git a/win/CS/Properties/Settings.settings b/win/CS/Properties/Settings.settings
new file mode 100644
index 000000000..08849f0ea
--- /dev/null
+++ b/win/CS/Properties/Settings.settings
@@ -0,0 +1,141 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="Handbrake.Properties" GeneratedClassName="Settings">
+ <Profiles />
+ <Settings>
+ <Setting Name="processPriority" Type="System.String" Scope="User">
+ <Value Profile="(Default)">Below Normal</Value>
+ </Setting>
+ <Setting Name="updateStatus" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="hb_version" Type="System.String" Scope="User">
+ <Value Profile="(Default)">{hb_version}</Value>
+ </Setting>
+ <Setting Name="tooltipEnable" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="CompletionOption" Type="System.String" Scope="User">
+ <Value Profile="(Default)">Do Nothing</Value>
+ </Setting>
+ <Setting Name="defaultPreset" Type="System.String" Scope="User">
+ <Value Profile="(Default)" />
+ </Setting>
+ <Setting Name="hb_build" Type="System.Int32" Scope="User">
+ <Value Profile="(Default)">0</Value>
+ </Setting>
+ <Setting Name="skipversion" Type="System.Int32" Scope="User">
+ <Value Profile="(Default)">0</Value>
+ </Setting>
+ <Setting Name="autoNaming" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="autoNamePath" Type="System.String" Scope="User">
+ <Value Profile="(Default)" />
+ </Setting>
+ <Setting Name="appcast" Type="System.String" Scope="User">
+ <Value Profile="(Default)">http://handbrake.fr/appcast.xml</Value>
+ </Setting>
+ <Setting Name="appcast_unstable" Type="System.String" Scope="User">
+ <Value Profile="(Default)">http://handbrake.fr/appcast_unstable.xml</Value>
+ </Setting>
+ <Setting Name="autoNameFormat" Type="System.String" Scope="User">
+ <Value Profile="(Default)">{source}-{title}</Value>
+ </Setting>
+ <Setting Name="saveLogToSpecifiedPath" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="saveLogPath" Type="System.String" Scope="User">
+ <Value Profile="(Default)" />
+ </Setting>
+ <Setting Name="saveLogWithVideo" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="VLC_Path" Type="System.String" Scope="User">
+ <Value Profile="(Default)">C:\Program Files\VideoLAN\vlc\vlc.exe</Value>
+ </Setting>
+ <Setting Name="MainWindowMinimize" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="QueryEditorTab" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="x264cqstep" Type="System.Double" Scope="User">
+ <Value Profile="(Default)">0.25</Value>
+ </Setting>
+ <Setting Name="verboseLevel" Type="System.Int32" Scope="User">
+ <Value Profile="(Default)">1</Value>
+ </Setting>
+ <Setting Name="noDvdNav" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="presetNotification" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="trayIconAlerts" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="lastUpdateCheckDate" Type="System.DateTime" Scope="User">
+ <Value Profile="(Default)" />
+ </Setting>
+ <Setting Name="daysBetweenUpdateCheck" Type="System.Int32" Scope="User">
+ <Value Profile="(Default)">7</Value>
+ </Setting>
+ <Setting Name="useM4v" Type="System.Int32" Scope="User">
+ <Value Profile="(Default)">0</Value>
+ </Setting>
+ <Setting Name="PromptOnUnmatchingQueries" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="NativeLanguage" Type="System.String" Scope="User">
+ <Value Profile="(Default)">Any</Value>
+ </Setting>
+ <Setting Name="DubMode" Type="System.Int32" Scope="User">
+ <Value Profile="(Default)">0</Value>
+ </Setting>
+ <Setting Name="hb_platform" Type="System.String" Scope="User">
+ <Value Profile="(Default)" />
+ </Setting>
+ <Setting Name="growlQueue" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="growlEncode" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="CliExeHash" Type="System.String" Scope="User">
+ <Value Profile="(Default)" />
+ </Setting>
+ <Setting Name="previewScanCount" Type="System.Int32" Scope="User">
+ <Value Profile="(Default)">10</Value>
+ </Setting>
+ <Setting Name="clearOldLogs" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="showCliForInGuiEncodeStatus" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="AutoNameTitleCase" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="AutoNameRemoveUnderscore" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="UpdateRequired" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="ActivityWindowLastMode" Type="System.Int32" Scope="User">
+ <Value Profile="(Default)">0</Value>
+ </Setting>
+ <Setting Name="preventSleep" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="useClosedCaption" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="batchMinDuration" Type="System.Int32" Scope="User">
+ <Value Profile="(Default)">35</Value>
+ </Setting>
+ <Setting Name="batchMaxDuration" Type="System.Int32" Scope="User">
+ <Value Profile="(Default)">47</Value>
+ </Setting>
+ </Settings>
+</SettingsFile> \ No newline at end of file
diff --git a/win/CS/Resources/ActivityWindow.png b/win/CS/Resources/ActivityWindow.png
new file mode 100644
index 000000000..315e0fa17
--- /dev/null
+++ b/win/CS/Resources/ActivityWindow.png
Binary files differ
diff --git a/win/CS/Resources/ActivityWindow_small.png b/win/CS/Resources/ActivityWindow_small.png
new file mode 100644
index 000000000..916b6ef4a
--- /dev/null
+++ b/win/CS/Resources/ActivityWindow_small.png
Binary files differ
diff --git a/win/CS/Resources/Add16.png b/win/CS/Resources/Add16.png
new file mode 100644
index 000000000..bad13b66a
--- /dev/null
+++ b/win/CS/Resources/Add16.png
Binary files differ
diff --git a/win/CS/Resources/AddToQueue.png b/win/CS/Resources/AddToQueue.png
new file mode 100644
index 000000000..8eb079b3d
--- /dev/null
+++ b/win/CS/Resources/AddToQueue.png
Binary files differ
diff --git a/win/CS/Resources/AddToQueue_small.png b/win/CS/Resources/AddToQueue_small.png
new file mode 100644
index 000000000..5bb08184f
--- /dev/null
+++ b/win/CS/Resources/AddToQueue_small.png
Binary files differ
diff --git a/win/CS/Resources/Close.png b/win/CS/Resources/Close.png
new file mode 100644
index 000000000..7d84e5b80
--- /dev/null
+++ b/win/CS/Resources/Close.png
Binary files differ
diff --git a/win/CS/Resources/ErrorX.png b/win/CS/Resources/ErrorX.png
new file mode 100644
index 000000000..75c63c08a
--- /dev/null
+++ b/win/CS/Resources/ErrorX.png
Binary files differ
diff --git a/win/CS/Resources/General Preferences.png b/win/CS/Resources/General Preferences.png
new file mode 100644
index 000000000..9814afcc1
--- /dev/null
+++ b/win/CS/Resources/General Preferences.png
Binary files differ
diff --git a/win/CS/Resources/Help16.png b/win/CS/Resources/Help16.png
new file mode 100644
index 000000000..bb5ef99ce
--- /dev/null
+++ b/win/CS/Resources/Help16.png
Binary files differ
diff --git a/win/CS/Resources/Help24.png b/win/CS/Resources/Help24.png
new file mode 100644
index 000000000..1c6e13069
--- /dev/null
+++ b/win/CS/Resources/Help24.png
Binary files differ
diff --git a/win/CS/Resources/Help32.png b/win/CS/Resources/Help32.png
new file mode 100644
index 000000000..e3dc78d0b
--- /dev/null
+++ b/win/CS/Resources/Help32.png
Binary files differ
diff --git a/win/CS/Resources/Movies.png b/win/CS/Resources/Movies.png
new file mode 100644
index 000000000..ec03eb576
--- /dev/null
+++ b/win/CS/Resources/Movies.png
Binary files differ
diff --git a/win/CS/Resources/Movies_Small.png b/win/CS/Resources/Movies_Small.png
new file mode 100644
index 000000000..80f240368
--- /dev/null
+++ b/win/CS/Resources/Movies_Small.png
Binary files differ
diff --git a/win/CS/Resources/Options24.png b/win/CS/Resources/Options24.png
new file mode 100644
index 000000000..ac5ca9678
--- /dev/null
+++ b/win/CS/Resources/Options24.png
Binary files differ
diff --git a/win/CS/Resources/Output_Small.png b/win/CS/Resources/Output_Small.png
new file mode 100644
index 000000000..a1017d6fb
--- /dev/null
+++ b/win/CS/Resources/Output_Small.png
Binary files differ
diff --git a/win/CS/Resources/Pause.png b/win/CS/Resources/Pause.png
new file mode 100644
index 000000000..a20833967
--- /dev/null
+++ b/win/CS/Resources/Pause.png
Binary files differ
diff --git a/win/CS/Resources/Play.png b/win/CS/Resources/Play.png
new file mode 100644
index 000000000..23fce8283
--- /dev/null
+++ b/win/CS/Resources/Play.png
Binary files differ
diff --git a/win/CS/Resources/Play_small.png b/win/CS/Resources/Play_small.png
new file mode 100644
index 000000000..3e4647a15
--- /dev/null
+++ b/win/CS/Resources/Play_small.png
Binary files differ
diff --git a/win/CS/Resources/Pref_Small.png b/win/CS/Resources/Pref_Small.png
new file mode 100644
index 000000000..a28fb5b27
--- /dev/null
+++ b/win/CS/Resources/Pref_Small.png
Binary files differ
diff --git a/win/CS/Resources/Queue.png b/win/CS/Resources/Queue.png
new file mode 100644
index 000000000..51962a1b0
--- /dev/null
+++ b/win/CS/Resources/Queue.png
Binary files differ
diff --git a/win/CS/Resources/Queue_Small.png b/win/CS/Resources/Queue_Small.png
new file mode 100644
index 000000000..02c7391a9
--- /dev/null
+++ b/win/CS/Resources/Queue_Small.png
Binary files differ
diff --git a/win/CS/Resources/Restore.png b/win/CS/Resources/Restore.png
new file mode 100644
index 000000000..d0e2f3b2c
--- /dev/null
+++ b/win/CS/Resources/Restore.png
Binary files differ
diff --git a/win/CS/Resources/copy.png b/win/CS/Resources/copy.png
new file mode 100644
index 000000000..c11c6a753
--- /dev/null
+++ b/win/CS/Resources/copy.png
Binary files differ
diff --git a/win/CS/Resources/disc_small.png b/win/CS/Resources/disc_small.png
new file mode 100644
index 000000000..dca0ad228
--- /dev/null
+++ b/win/CS/Resources/disc_small.png
Binary files differ
diff --git a/win/CS/Resources/download.png b/win/CS/Resources/download.png
new file mode 100644
index 000000000..c3206626b
--- /dev/null
+++ b/win/CS/Resources/download.png
Binary files differ
diff --git a/win/CS/Resources/folder.png b/win/CS/Resources/folder.png
new file mode 100644
index 000000000..a54316ea6
--- /dev/null
+++ b/win/CS/Resources/folder.png
Binary files differ
diff --git a/win/CS/Resources/hb16.png b/win/CS/Resources/hb16.png
new file mode 100644
index 000000000..a9f720775
--- /dev/null
+++ b/win/CS/Resources/hb16.png
Binary files differ
diff --git a/win/CS/Resources/hb32.png b/win/CS/Resources/hb32.png
new file mode 100644
index 000000000..5054264d3
--- /dev/null
+++ b/win/CS/Resources/hb32.png
Binary files differ
diff --git a/win/CS/Resources/info16.png b/win/CS/Resources/info16.png
new file mode 100644
index 000000000..6b6b9f01f
--- /dev/null
+++ b/win/CS/Resources/info16.png
Binary files differ
diff --git a/win/CS/Resources/logo128.png b/win/CS/Resources/logo128.png
new file mode 100644
index 000000000..69d76459d
--- /dev/null
+++ b/win/CS/Resources/logo128.png
Binary files differ
diff --git a/win/CS/Resources/logo64.png b/win/CS/Resources/logo64.png
new file mode 100644
index 000000000..12808f636
--- /dev/null
+++ b/win/CS/Resources/logo64.png
Binary files differ
diff --git a/win/CS/Resources/picture.png b/win/CS/Resources/picture.png
new file mode 100644
index 000000000..0072ccfb6
--- /dev/null
+++ b/win/CS/Resources/picture.png
Binary files differ
diff --git a/win/CS/Resources/save.png b/win/CS/Resources/save.png
new file mode 100644
index 000000000..40885d2d3
--- /dev/null
+++ b/win/CS/Resources/save.png
Binary files differ
diff --git a/win/CS/Resources/stop.png b/win/CS/Resources/stop.png
new file mode 100644
index 000000000..c544b5ee4
--- /dev/null
+++ b/win/CS/Resources/stop.png
Binary files differ
diff --git a/win/CS/Resources/window.png b/win/CS/Resources/window.png
new file mode 100644
index 000000000..48a14a35b
--- /dev/null
+++ b/win/CS/Resources/window.png
Binary files differ
diff --git a/win/CS/Settings.StyleCop b/win/CS/Settings.StyleCop
new file mode 100644
index 000000000..a9622d880
--- /dev/null
+++ b/win/CS/Settings.StyleCop
@@ -0,0 +1,244 @@
+<StyleCopSettings Version="4.3">
+ <Parsers>
+ <Parser ParserId="Microsoft.StyleCop.CSharp.CsParser">
+ <ParserSettings>
+ <BooleanProperty Name="AnalyzeDesignerFiles">False</BooleanProperty>
+ </ParserSettings>
+ </Parser>
+ </Parsers>
+ <Analyzers>
+ <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.DocumentationRules">
+ <Rules>
+ <Rule Name="PropertyDocumentationMustHaveValueText">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">True</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="DocumentationTextMustMeetMinimumCharacterLength">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="DocumentationTextMustContainWhitespace">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="EnumerationItemsMustBeDocumented">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="FileMustHaveHeader">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="FileHeaderMustShowCopyright">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="FileHeaderMustHaveCopyrightText">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="FileHeaderMustContainFileName">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="FileHeaderFileNameDocumentationMustMatchFileName">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="FileHeaderMustHaveValidCompanyText">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="ElementsMustBeDocumented">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ </Rules>
+ <AnalyzerSettings>
+ <StringProperty Name="CompanyName">HandBrake Project (http://handbrake.fr)</StringProperty>
+ <StringProperty Name="Copyright">This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.</StringProperty>
+ </AnalyzerSettings>
+ </Analyzer>
+ <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.MaintainabilityRules">
+ <Rules>
+ <Rule Name="StatementMustNotUseUnnecessaryParenthesis">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="FieldsMustBePrivate">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="ArithmeticExpressionsMustDeclarePrecedence">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="AccessModifierMustBeDeclared">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ </Rules>
+ <AnalyzerSettings />
+ </Analyzer>
+ <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.SpacingRules">
+ <Rules>
+ <Rule Name="OpeningCurlyBracketsMustBeSpacedCorrectly">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="ClosingCurlyBracketsMustBeSpacedCorrectly">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="ClosingParenthesisMustBeSpacedCorrectly">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ </Rules>
+ <AnalyzerSettings />
+ </Analyzer>
+ <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.LayoutRules">
+ <Rules>
+ <Rule Name="SingleLineCommentsMustNotBeFollowedByBlankLine">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="SingleLineCommentMustBePrecededByBlankLine">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="ClosingCurlyBracketMustBeFollowedByBlankLine">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="CurlyBracketsMustNotBeOmitted">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="ElementsMustBeSeparatedByBlankLine">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ </Rules>
+ <AnalyzerSettings />
+ </Analyzer>
+ <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.ReadabilityRules">
+ <Rules>
+ <Rule Name="BlockStatementsMustNotContainEmbeddedComments">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="DoNotPlaceRegionsWithinElements">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="ParametersMustBeOnSameLineOrSeparateLines">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="ParameterMustFollowComma">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="SplitParametersMustStartOnLineAfterDeclaration">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="UseBuiltInTypeAlias">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="PrefixLocalCallsWithThis">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="CommentsMustContainText">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ </Rules>
+ <AnalyzerSettings />
+ </Analyzer>
+ <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.NamingRules">
+ <Rules>
+ <Rule Name="FieldNamesMustNotUseHungarianNotation">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="ElementMustBeginWithUpperCaseLetter">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="AccessibleFieldsMustBeginWithUpperCaseLetter">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="FieldNamesMustBeginWithLowerCaseLetter">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ </Rules>
+ <AnalyzerSettings />
+ </Analyzer>
+ <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.OrderingRules">
+ <Rules>
+ <Rule Name="ElementsMustBeOrderedByAccess">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="ElementsMustAppearInTheCorrectOrder">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="StaticElementsMustAppearBeforeInstanceElements">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ <Rule Name="UsingDirectivesMustBeOrderedAlphabeticallyByNamespace">
+ <RuleSettings>
+ <BooleanProperty Name="Enabled">False</BooleanProperty>
+ </RuleSettings>
+ </Rule>
+ </Rules>
+ <AnalyzerSettings />
+ </Analyzer>
+ </Analyzers>
+</StyleCopSettings> \ No newline at end of file
diff --git a/win/CS/ToolWindows/BatchAdd.Designer.cs b/win/CS/ToolWindows/BatchAdd.Designer.cs
new file mode 100644
index 000000000..e8f832339
--- /dev/null
+++ b/win/CS/ToolWindows/BatchAdd.Designer.cs
@@ -0,0 +1,157 @@
+namespace Handbrake.ToolWindows
+{
+ partial class BatchAdd
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(BatchAdd));
+ this.label1 = new System.Windows.Forms.Label();
+ this.minDuration = new System.Windows.Forms.TextBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.btnAdd = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.maxDuration = new System.Windows.Forms.TextBox();
+ this.label3 = new System.Windows.Forms.Label();
+ this.label4 = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(12, 9);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(114, 13);
+ this.label1.TabIndex = 1;
+ this.label1.Text = "Add all Titles between:";
+ //
+ // minDuration
+ //
+ this.minDuration.Location = new System.Drawing.Point(53, 34);
+ this.minDuration.Name = "minDuration";
+ this.minDuration.Size = new System.Drawing.Size(51, 20);
+ this.minDuration.TabIndex = 2;
+ this.minDuration.Text = "0";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(17, 68);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(250, 26);
+ this.label2.TabIndex = 3;
+ this.label2.Text = "Warning: This may lead to wasted encodes.\r\nDifferent titles may require different" +
+ " encode settings.";
+ //
+ // btnAdd
+ //
+ this.btnAdd.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnAdd.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnAdd.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btnAdd.Location = new System.Drawing.Point(232, 108);
+ this.btnAdd.Name = "btnAdd";
+ this.btnAdd.Size = new System.Drawing.Size(90, 22);
+ this.btnAdd.TabIndex = 4;
+ this.btnAdd.TabStop = false;
+ this.btnAdd.Text = "Add Titles";
+ this.btnAdd.UseVisualStyleBackColor = true;
+ this.btnAdd.Click += new System.EventHandler(this.BtnScanClick);
+ //
+ // btnCancel
+ //
+ this.btnCancel.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnCancel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnCancel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btnCancel.Location = new System.Drawing.Point(15, 108);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(60, 22);
+ this.btnCancel.TabIndex = 5;
+ this.btnCancel.TabStop = false;
+ this.btnCancel.Text = "Cancel";
+ this.btnCancel.UseVisualStyleBackColor = true;
+ this.btnCancel.Click += new System.EventHandler(this.BtnCancelClick);
+ //
+ // maxDuration
+ //
+ this.maxDuration.Location = new System.Drawing.Point(141, 34);
+ this.maxDuration.Name = "maxDuration";
+ this.maxDuration.Size = new System.Drawing.Size(51, 20);
+ this.maxDuration.TabIndex = 6;
+ this.maxDuration.Text = "0";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(110, 37);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(25, 13);
+ this.label3.TabIndex = 7;
+ this.label3.Text = "and";
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(198, 37);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(69, 13);
+ this.label4.TabIndex = 8;
+ this.label4.Text = "minutes long.";
+ //
+ // BatchAdd
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(334, 137);
+ this.Controls.Add(this.label4);
+ this.Controls.Add(this.label3);
+ this.Controls.Add(this.maxDuration);
+ this.Controls.Add(this.btnCancel);
+ this.Controls.Add(this.btnAdd);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.minDuration);
+ this.Controls.Add(this.label1);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Name = "BatchAdd";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "Batch Add";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.TextBox minDuration;
+ private System.Windows.Forms.Label label2;
+ internal System.Windows.Forms.Button btnAdd;
+ internal System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.TextBox maxDuration;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Label label4;
+ }
+} \ No newline at end of file
diff --git a/win/CS/ToolWindows/BatchAdd.cs b/win/CS/ToolWindows/BatchAdd.cs
new file mode 100644
index 000000000..08bf62092
--- /dev/null
+++ b/win/CS/ToolWindows/BatchAdd.cs
@@ -0,0 +1,73 @@
+/* TitleSpecificScan.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.ToolWindows
+{
+ using System;
+ using System.Windows.Forms;
+
+ /// <summary>
+ /// Title Specific Scan
+ /// </summary>
+ public partial class BatchAdd : Form
+ {
+ public BatchAdd()
+ {
+ InitializeComponent();
+
+ // Get the Default values for batch encoding.
+ this.minDuration.Text = Properties.Settings.Default.batchMinDuration.ToString();
+ this.maxDuration.Text = Properties.Settings.Default.batchMaxDuration.ToString();
+ }
+
+ /// <summary>
+ /// Button Cancel Click Event Handler
+ /// </summary>
+ /// <param name="sender">The Sender</param>
+ /// <param name="e">The EventArgs</param>
+ private void BtnCancelClick(object sender, EventArgs e)
+ {
+ this.DialogResult = DialogResult.Cancel;
+ }
+
+ /// <summary>
+ /// Button Scan Click Event Handler
+ /// </summary>
+ /// <param name="sender">The Sender</param>
+ /// <param name="e">The EventArgs</param>
+ private void BtnScanClick(object sender, EventArgs e)
+ {
+ this.DialogResult = DialogResult.OK;
+ }
+
+ /// <summary>
+ /// Gets the minimum duration that the user entered.
+ /// </summary>
+ public int Min
+ {
+ get
+ {
+ int title;
+ int.TryParse(this.minDuration.Text, out title);
+
+ return title;
+ }
+ }
+
+ /// <summary>
+ /// Gets the maximum duration that the user entered.
+ /// </summary>
+ public int Max
+ {
+ get
+ {
+ int title;
+ int.TryParse(this.maxDuration.Text, out title);
+
+ return title;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/ToolWindows/BatchAdd.resx b/win/CS/ToolWindows/BatchAdd.resx
new file mode 100644
index 000000000..ff217dc4f
--- /dev/null
+++ b/win/CS/ToolWindows/BatchAdd.resx
@@ -0,0 +1,500 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA
+ IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA
+ AACACgAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8A/wAAAAD/AAAAAIAAgICAAICAAAAAgAAAAICAAIAA
+ AACAAIAAgP//ACAgIADg4OAAIAAAAAAgAABg4CAAQOBAAGBgYAAgYAAAQKDgAAAAIABAwCAAIEAAAECg
+ AABg4AAAIGCAAECAoABgoMAAYECgAGDAAABgICAAoKCgAOAAAAAgIAAAAGAAAEDgAABgAAAAIAAgAEAg
+ IAAgQGAAIIDAAADg4ABgAGAAgOD/ACCA/wCgAAAAQGAAACCAAAAAoAAAYCAAAAAgIAAgIEAAYGBAAEBg
+ YAAAIIAAAGCAAGCAgABAAKAAAICgAACgoACAoKAAIKDAAECgwAAAAOAAQADgAADA4ABgwOAAIODgAADg
+ AADA4AAAAEAgAKDgIAAA4EAAYABAAABAYACAAGAAgCBgAGAggABA4KAAAECgAGBAwADgIOAAIEDgAACA
+ 4ADgoOAAYAD/ACBg/wAAoP8A4KD/AGD//wAICAgACAAAAAgIAAAAAJgACAAIAAAACAAACAAACBAQACA4
+ SAAgYIgAOHCIADhw+AAIGAAAEBAIACg4QAAwYHgAAACIACA4QAAoQFAAKFh4AHh4eAAwaIAAIGiQADh4
+ mAAACAgAEAgIABAYGAAgGBgASEhIABhIYAAoUGAAIFBoAChQaAAoWGgAMFhoAChoiAAweJgAKHioACiA
+ sAAIEAAACAgQAAgQGAAQGCAAGCAoABhAUAAoSFgAaGhoABhQcAAgWHAAKFhwADhgcAAYWIAAOGiAAIiI
+ iAAoaJAAKHCYACh4oAA4gKAAMICoAKioqAAwmNAAEDgAAChYAAAweAAAMIgQAAgYGAAYGBgACBggABAg
+ KAAgKCgAKCgoACAwOAA4ODgAKDhIADBQWABYWFgAGEhoADBYcAAYUHgAGFh4ACBYeAAoYHgAKGCAABhY
+ iAAgaJgAKICoACiIuAC4uLgAMJDIADiw6AAQCAAAABgAAAggAAAAOAAAMGgAABgQCAAwgAgAEAgQABgQ
+ EAAwmBgAGBggAAgYKAAAICgACCAoABgoMAAgKDAAGDBAABg4QAAYOFAAEEBYACBIWAAwSFgAOEhYACBI
+ YAAQSGgAOFhoABhIcAAoUHAAQFhwACBgeABAaIAAIGiIADBwiABAcIgAGGCQADhwkABYeJAACBCgAChw
+ oAAweKAAKIC4ACiQwAAwmMgAOKjgADBg6ABAsOgAELD4AAgoAAAIMAAAGDAAABhIAAAYUAAAKHgAAACY
+ AAAwmAAAAMgAABAACAAIEAgAEBgIABA4CAAYOAgAMHgIABAYEAAYGBAAIBgQACh4EAAwmBAAEBAYABgg
+ GAAoIBgAGCAgAAgIKAAgICgAGAgwAAggMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAn2KfdXV1XAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoo2+QIJCJb28Sd3em
+ nQAAAFuKqW0aqsd6Y5/DXAAAAAAAAAAAAAAAAAAAAAAAAAB3kAWQkG8SpqaJb28gsncAbIeSroyii21x
+ kczIwwAAAAAAAAAAAAAAAAAAAAAAAABoo4mJkLKylm9vb5BvdwwAcZO/fox7z2NjqsOss2MAWwAAAAAA
+ AAAAAAAAAAAAAAAAvaGmo5ANlgUFEiBvo1xjq3p6qMTJroBkxXt9cGzFnAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAL2ylgV3vQAAAGOvxMXXq41uh6yVjxqp1YhknwAAAAAAAAAAAAAAAAAAAAAAAAAAAABvsolbAAAA
+ +5KneouS2Kx4pZF9ndywsXuvkocAAAAAAAAAAAAAAAAAAAAAAAAAAAB3sncAAAAAdayHca95bH9+cKmv
+ fMVucG2B4MYAAAAAAAAAAAAAAAAAAAAAAAAAAAChsqMAAAAAe3VkyHF5kW59cN3eZc/XyXutyot7AAAA
+ AAAAAAAAAAAAAAAAAAAAAACjIKEAAACgfv94gX+PituLDI0/aoBxqxqOY8PgbQAAAAAAAAAAAAAAAAAA
+ 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
+ OAAABwAA//wYAAADAAD/+BgAAAMAAP/AAAAAAwAA/wAAAAADAAD8AAAAAAMAAPwAAAAAAwAA+AAAAAAD
+ AADwAAAAAAMAAPAAAAAAAwAA8AAAAAADAADwAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAQAA8AAPAA
+ ABgADwAA+AAAHgAHAAD8AAAfgAMAAP4QAA+ADwAA/gAADgADAAD8AAAfAAMAAPAfxD/ABwAA4B/n/+AB
+ AADgB+B/wB8AAOADgB+ADwAA8AOAHhAPAAD4BwB/8kcAAPz/gf/nLwAA+P/5/+8/AADwf/n//z8AAPh/
+ /P//vwAA+P////+fAAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//
+ /wAAAP8AAP//AAAAgACAgIAAgAAAAACAAAAAgIAAgIAAAECg4ABAgKAAYOAgAEDgQAAAIAAAACAgACAg
+ IABgIIAAIAAAACBAAAAAYAAAIIAAAGAgIABAYGAAAACgAGCAoACgoKAA4ODgAGDAAAAAACAAYABgAIAg
+ YAAAYMAAICAAACBgAABgYAAAQKAAAKDAAAAA4AAAYOAAAABAIAAgQCAAYAAgACBAQABgYEAAIABgACAg
+ YAAgQGAAYGBgACBggABgYIAAgACgAKCAoABgIMAAQKDAAGCgwAAgwMAAAADgAIDA4ACgwOAAAODgAIDg
+ 4ACA4AAAgIAgAEDgIACgACAAQABgAIAggAAgYP8AAKD/AAgIAAAICAgACAAAABhAWAAoUGAAaGhoADBg
+ eAAoaIgAMICoAChggAAACAgAEAgIABgYGAAoUGgAKFhwAChwkAAIGAgACBAQABAgKAAQKDgAIEhgACBQ
+ aAAAAHgAIFh4AChgeAAAeHgAeHh4AChogAAwaIAAIGCIADBoiAA4cIgAIGiQADhwkAAoeKgAKICwAAgQ
+ AAAIIAAACAAIABhICAAICBAAMIgQABAYGAAYICgAGCgwAEhISAAwSFgAGFBoAChYaAAICHgAOGiAACh4
+ oAAweKAAGAAAAAAIAAAAGAAACBgAABAoAAAYUAAAKGAAAChoAAAAeAAAAAAIAAgQCAAQEAgAGP8IACAY
+ EAAIEBgAMJAYABggIAAAACgACBAoACgwMAAAKDgAEDA4ADg4OAAoOEAAGDhIACA4SAAAQEgAMEBIAEhQ
+ UAAISFgAIEhYAChIWAAwUFgAIEhoAEhYaAAYUHAAMFhwABhYeAAoWHgAIFiAAEhwgACIiIgAGGCQAAAA
+ mAAgcJgAKHCYADB4mACYmJgAACjIAEBw+ACo//8ASAAAAFgAAABoAAAAeAAAABAIAABICAAAGCgAAAA4
+ AAAYOAAACEAAAAhIAAAoUAAAAFgAACBYAAAAaAAAIGgAADB4AAAAiAAAMIgAAGiIAACAmAAAGAAIADAI
+ CABgCAgAEBgIAAggCAAQIAgAECgIAAgwCAAQMAgAODAIABA4CAAYOAgAEEAIABhACAAgQAgAIFAIAChg
+ CAAwgAgAMJAIADCoCAAACBAAGBAQABggEAAoIBAAKGAQAChoEAAgeBAAKHgQAEh4EAAY+BAACAAYAAAI
+ GAAICBgAEAgYAAAQGAAQEBgAABgYAAgYGAAYMBgAKHgYADCYGAAwoBgAMKgYAGj/GABgCCAACBAgAAgY
+ IAAQGCAAGBggACggIABIcCAACAAoABAAKAAAECgAEBAoAAggKAAACDAASAgwAAgQMAAIKDAAECgwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAARxBSUlJHAAAAAABYWFlY8kYAAAAAAAAAAAAAAAAAAJFgqqRLSzAwBXMAkKJbW1pdSVmE
+ AAAAAAAAAAAAAAAAEJdLqhpgYKQFkf9NmVRanHVJVZRQAAAAAAAAAAAAAAAAUY6RO6qXMHNYW5MxdFpm
+ TVtPSpAAAAAAAAAAAAAAAAAAAAAFpIYAAFSeW09PU15KU05MaEkAAAAAAAAAAAAAAAAAAEtgAAAAk55j
+ ml5Mp2haXUqpW3IAAAAAAAAAAAAAAAAAS0sAAEpJoE5PpZpMZVWnMZyZVQAAAAAAAAAAAAAAAABLMAAA
+ cqCeSnppZGZKWzFNaV2ecAAAAAAAAAAAAAAAAEtLAACLVF6iZHROp2eiW1paeWnxAAAAAAAAAAAAAABI
+ GmAAAElJSmh6SWNVSk5hZqJ1VXUAAAAAAAAAAAAAlpmjeJAAk12eZXZ5p3WndnZpaUlbZgAAAAAAAAAA
+ m2lFRTw8PDZeWV1OlE0xeWlNeVVdZmmZUAAAAAAAjzYKRaysRUVFRa02SXSnYaFNTUxpTFSoTmKTAAAA
+ AI8KOkSrrKysrKxErDullF6fVWhiVakLaVWbVZoAAAAAqK2sRKZEqyCsRKummKBZT0xPTHppZVMLqVN4
+ cQAAAAA6O6sYGKYYGKsYphgELjejY09KTTZNaWdMNpkAAAAA+zc6XFxcd3d3XASmXEw6PZZiZ6g2ZUw2
+ T2QLnwAAAAAdoTtcLcV3pndfLi2jraMtcmNkT05np0xnaXhUAAAAAAD5NKL87xgYd1+eLZ06+1wAVE6o
+ p2cKZ2WjjgAAAAAAAAAQo67EcuZuj5jkACue9gAAkTEKeJfbioptRgAAAAAAAACIr0dLVwBXmEeL5Qg4
+ AAAAAOnqwNbVb9O5AAAAAAAAAP38RmDae3tfkDqIX0UAAABq3W9v6+2BtssAAAAAAAD9q6v7AFl1dV9f
+ mpgIXwAAAABrtG9v7O2BagAAAACSF52fL/AAAAAAAHUAAAAAAAAAAACC1NS+3s/ZzAAAAJ03MjqjdJ0A
+ AAC3FIMUtwAAAAAAzr27goK5awAAAAAAWaNgGho3dAAAyr+/v4ODtQAAAMmAAM+2zxMTawAAAAAAAK6z
+ kZ1xAAC1un3HVwAAAAAAAAAAawB/ftAAAAAAAABCNUIAAAAAAAAAAF8AAAAAAAAAAEcAAGpGAAAAAAAA
+ AEKsEQAAAAAAAAAAlZUAAAAAAAAAAAAAAEgAAAAAAAAAAC3hAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAA
+ AAD///////////4BwH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAA
+ AAHgAAAB4AAAAeAAAAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9
+ /s/j/P/v8///7ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AFEl
+ swBJDW0ABEMwAAJHSQAFDwIAXl9ZAHJtagBwfYQAQVNqAAFtAAAAZgAAAz0CABQ/AQAXQwAAGkAAAA8g
+ AQAhSJQAM1SRABw6fgAFVk0ADE48AAplaQAgWgIAMYcMACl7CwAOJwMAAAMtABwPNwAhIQAABxACAA9S
+ UAAnQUgAAISfACRoDAAxmwQAK4MHABMpAAA8P1kATBMbACQSVwAKL1EADS5CADFMVQABIF4AJ3CGADB2
+ kAAzdlEAMnY1ABMnEwBARooAVVq5ABgATwAWBn0ABh56AAULaQBOeKYAT3WSACpNZwAucpgAMHifADFx
+ nwA1b5YAMF93AEBalgBvjecADCLAAAkPpQAbJr4AFiLGAAAJjgAzbIEANGh8AClhgAAzfKEAMHWWADJz
+ kwAsW3MAQ4mvADyY9AAtgf8AIpr/ACuk/wBdk9UAG0tkACladQAqbI4AK3GUAC5vjwArbpEALWJ7ACdl
+ aAAOaoQAJJ20ABx0gQAeTF8AJ116ACViggAgZosAJmeJAChvlAAhZIgAH1ZyAHVmYwAaPVMAJ19+ACto
+ hgAmaIwAKGB9ACFdfAAgY4YAGU5qAFtgYQAYQVgAIVx7ACtrjgAtZYIAJmKAACNhgQAmX3wAIUpdAHp6
+ ewARN0wAH1R0ACdXcgApXnoAJ2B+ACligQAdSmAAKiopAGZlZQCRkZEAbm9vAFFSUwAWO08AJFRuACFP
+ agAhUm0AHD9RAAMKDgA3NjUAWlpaADk5OQA3NzcAPDk3AAYSGQAVNUgAFjFAAA8jLwABAgQAVQAAAP//
+ /wBWAAAA/f//AFcAAAD8//8AWAAAAPz//wBZAAAA/P//AFoAAAD9//8AWwAAAP7//wBcAAAA////AF4A
+ AAABAAAAXwAAAAEAAABgAAAAAQAAAGEAAAABAAAAYgAAAAEAAAB3IFIAbWFuAAAAAAAAAAAAAAAAAAAA
+ AAC0VWMAtFVjALwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAEAAAAAADgDAACfAQAAPwAAAAEA
+ AABAAAAAAQAAAEEAAAABAAAAQgAAAAEAAABFAAAA////AEYAAAD+//8ARwAAAP3//wBIAAAA/P//AEkA
+ AAD8//8ASgAAAPz//wBLAAAA/f//AEwAAAD///8ATQAAAAMAAABOAAAABwAAAE8AAAALAAAAUAAAABAA
+ AABRAAAAFQAAAFIAAAAZAAAAUwAAABwAAABUAAAAHgAAAFUAAAAeAAAAVgAAAB0AAABXAAAAGgAAAFgA
+ AAAWAAAAWQAAABIAAABaAAAADQAAAFsAAAAIAAAAXAAAAAQAAABeAAAA/v//AF8AAAD8//8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAI2Oj5CRkpOUlZYAAAAAAACCg4SFhoeIiYqLjAAAAAAAAAB6AHt8fX5/gIEAAAAA
+ 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
+</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/win/CS/ToolWindows/DownloadUpdate.Designer.cs b/win/CS/ToolWindows/DownloadUpdate.Designer.cs
new file mode 100644
index 000000000..74b0affe7
--- /dev/null
+++ b/win/CS/ToolWindows/DownloadUpdate.Designer.cs
@@ -0,0 +1,111 @@
+/* frmDownload.Designer.cs
+
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.ToolWindows
+{
+ partial class DownloadUpdate
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DownloadUpdate));
+ this.lblProgress = new System.Windows.Forms.Label();
+ this.progress_download = new System.Windows.Forms.ProgressBar();
+ this.btn_cancel = new System.Windows.Forms.Button();
+ this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
+ this.PictureBox1 = new System.Windows.Forms.PictureBox();
+ this.tableLayoutPanel1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).BeginInit();
+ this.SuspendLayout();
+ //
+ // lblProgress
+ //
+ resources.ApplyResources(this.lblProgress, "lblProgress");
+ this.lblProgress.Name = "lblProgress";
+ //
+ // progress_download
+ //
+ resources.ApplyResources(this.progress_download, "progress_download");
+ this.progress_download.Name = "progress_download";
+ this.progress_download.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
+ //
+ // btn_cancel
+ //
+ resources.ApplyResources(this.btn_cancel, "btn_cancel");
+ this.btn_cancel.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btn_cancel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_cancel.Name = "btn_cancel";
+ this.btn_cancel.TabStop = false;
+ this.btn_cancel.UseVisualStyleBackColor = true;
+ this.btn_cancel.Click += new System.EventHandler(this.BtnCancelClick);
+ //
+ // tableLayoutPanel1
+ //
+ resources.ApplyResources(this.tableLayoutPanel1, "tableLayoutPanel1");
+ this.tableLayoutPanel1.Controls.Add(this.PictureBox1, 0, 0);
+ this.tableLayoutPanel1.Controls.Add(this.btn_cancel, 1, 2);
+ this.tableLayoutPanel1.Controls.Add(this.progress_download, 1, 0);
+ this.tableLayoutPanel1.Controls.Add(this.lblProgress, 1, 1);
+ this.tableLayoutPanel1.Name = "tableLayoutPanel1";
+ //
+ // PictureBox1
+ //
+ this.PictureBox1.Image = global::Handbrake.Properties.Resources.Download;
+ resources.ApplyResources(this.PictureBox1, "PictureBox1");
+ this.PictureBox1.Name = "PictureBox1";
+ this.tableLayoutPanel1.SetRowSpan(this.PictureBox1, 3);
+ this.PictureBox1.TabStop = false;
+ //
+ // DownloadUpdate
+ //
+ resources.ApplyResources(this, "$this");
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.tableLayoutPanel1);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "DownloadUpdate";
+ this.ShowIcon = false;
+ this.ShowInTaskbar = false;
+ this.tableLayoutPanel1.ResumeLayout(false);
+ this.tableLayoutPanel1.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label lblProgress;
+ private System.Windows.Forms.ProgressBar progress_download;
+ internal System.Windows.Forms.Button btn_cancel;
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
+ internal System.Windows.Forms.PictureBox PictureBox1;
+ }
+} \ No newline at end of file
diff --git a/win/CS/ToolWindows/DownloadUpdate.cs b/win/CS/ToolWindows/DownloadUpdate.cs
new file mode 100644
index 000000000..f359e09a4
--- /dev/null
+++ b/win/CS/ToolWindows/DownloadUpdate.cs
@@ -0,0 +1,122 @@
+/* DownloadUpdate.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.ToolWindows
+{
+ using System;
+ using System.Diagnostics;
+ using System.IO;
+ using System.Net;
+ using System.Threading;
+ using System.Windows.Forms;
+
+ /// <summary>
+ /// The Download Window
+ /// </summary>
+ public partial class DownloadUpdate : Form
+ {
+ private readonly Thread downloadThread;
+ private Stream responceStream;
+ private Stream localStream;
+ private HttpWebRequest webRequest;
+ private HttpWebResponse webResponse;
+ private static int progress;
+ private bool killThread;
+
+ private delegate void UpdateProgessCallback(long bytesRead, long totalBytes);
+
+ private delegate void DownloadCompleteCallback();
+
+ private delegate void DownloadFailedCallback();
+
+ public DownloadUpdate(string filename)
+ {
+ InitializeComponent();
+
+ this.downloadThread = new Thread(Download);
+ this.downloadThread.Start(filename);
+ }
+
+ private void Download(object file)
+ {
+ string tempPath = Path.Combine(Path.GetTempPath(), "handbrake-setup.exe");
+ string hbUpdate = (string)file;
+ WebClient wcDownload = new WebClient();
+
+ try
+ {
+ if (File.Exists(tempPath))
+ File.Delete(tempPath);
+
+ this.webRequest = (HttpWebRequest)WebRequest.Create(hbUpdate);
+ this.webRequest.Credentials = CredentialCache.DefaultCredentials;
+ this.webResponse = (HttpWebResponse)this.webRequest.GetResponse();
+ long fileSize = this.webResponse.ContentLength;
+
+ this.responceStream = wcDownload.OpenRead(hbUpdate);
+ this.localStream = new FileStream(tempPath, FileMode.Create, FileAccess.Write, FileShare.None);
+
+ int bytesSize;
+ byte[] downBuffer = new byte[2048];
+
+ long flength = 0;
+ while ((bytesSize = this.responceStream.Read(downBuffer, 0, downBuffer.Length)) > 0)
+ {
+ if (this.killThread)
+ return;
+ this.localStream.Write(downBuffer, 0, bytesSize);
+ flength = this.localStream.Length;
+ Invoke(new UpdateProgessCallback(this.UpdateProgress), new object[] {this.localStream.Length, fileSize});
+ }
+
+ this.responceStream.Close();
+ this.localStream.Close();
+
+ if (flength != fileSize)
+ Invoke(new DownloadFailedCallback(this.DownloadFailed));
+ else
+ Invoke(new DownloadCompleteCallback(this.DownloadComplete));
+ }
+ catch
+ {
+ lblProgress.Text = "An Error Occured. Please try again later.";
+ }
+ }
+
+ private void UpdateProgress(long bytesRead, long totalBytes)
+ {
+ long p = (bytesRead * 100) / totalBytes;
+ int.TryParse(p.ToString(), out progress);
+ progress_download.Value = progress;
+ lblProgress.Text = (bytesRead / 1024) + "k of " + (totalBytes / 1024) + "k ";
+ }
+
+ private void DownloadComplete()
+ {
+ lblProgress.Text = "Download Complete";
+ btn_cancel.Text = "Close";
+
+ Process.Start(Path.Combine(Path.GetTempPath(), "handbrake-setup.exe"));
+ this.Close();
+ Application.Exit();
+ }
+
+ private void DownloadFailed()
+ {
+ lblProgress.Text = "Download Failed";
+ btn_cancel.Text = "Close";
+ }
+
+ private void BtnCancelClick(object sender, EventArgs e)
+ {
+ this.killThread = true;
+ lblProgress.Text = "Cancelling ...";
+ if (this.webResponse != null) this.webResponse.Close();
+ if (this.responceStream != null) this.responceStream.Close();
+ if (this.localStream != null) this.localStream.Close();
+ this.Close();
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/ToolWindows/DownloadUpdate.resx b/win/CS/ToolWindows/DownloadUpdate.resx
new file mode 100644
index 000000000..db4b953de
--- /dev/null
+++ b/win/CS/ToolWindows/DownloadUpdate.resx
@@ -0,0 +1,670 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <data name="lblProgress.AutoSize" type="System.Boolean, mscorlib">
+ <value>True</value>
+ </data>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="lblProgress.Location" type="System.Drawing.Point, System.Drawing">
+ <value>73, 29</value>
+ </data>
+ <data name="lblProgress.Size" type="System.Drawing.Size, System.Drawing">
+ <value>98, 13</value>
+ </data>
+ <data name="lblProgress.TabIndex" type="System.Int32, mscorlib">
+ <value>10</value>
+ </data>
+ <data name="lblProgress.Text" xml:space="preserve">
+ <value>Awaiting Download</value>
+ </data>
+ <data name="&gt;&gt;lblProgress.Name" xml:space="preserve">
+ <value>lblProgress</value>
+ </data>
+ <data name="&gt;&gt;lblProgress.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;lblProgress.Parent" xml:space="preserve">
+ <value>tableLayoutPanel1</value>
+ </data>
+ <data name="&gt;&gt;lblProgress.ZOrder" xml:space="preserve">
+ <value>3</value>
+ </data>
+ <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <data name="progress_download.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+ <value>Left, Right</value>
+ </data>
+ <data name="progress_download.Location" type="System.Drawing.Point, System.Drawing">
+ <value>73, 3</value>
+ </data>
+ <data name="progress_download.Size" type="System.Drawing.Size, System.Drawing">
+ <value>277, 23</value>
+ </data>
+ <data name="progress_download.TabIndex" type="System.Int32, mscorlib">
+ <value>9</value>
+ </data>
+ <data name="&gt;&gt;progress_download.Name" xml:space="preserve">
+ <value>progress_download</value>
+ </data>
+ <data name="&gt;&gt;progress_download.Type" xml:space="preserve">
+ <value>System.Windows.Forms.ProgressBar, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;progress_download.Parent" xml:space="preserve">
+ <value>tableLayoutPanel1</value>
+ </data>
+ <data name="&gt;&gt;progress_download.ZOrder" xml:space="preserve">
+ <value>2</value>
+ </data>
+ <data name="btn_cancel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+ <value>Right</value>
+ </data>
+ <data name="btn_cancel.Font" type="System.Drawing.Font, System.Drawing">
+ <value>Tahoma, 8.25pt, style=Bold</value>
+ </data>
+ <data name="btn_cancel.Location" type="System.Drawing.Point, System.Drawing">
+ <value>279, 46</value>
+ </data>
+ <data name="btn_cancel.Size" type="System.Drawing.Size, System.Drawing">
+ <value>71, 22</value>
+ </data>
+ <data name="btn_cancel.TabIndex" type="System.Int32, mscorlib">
+ <value>26</value>
+ </data>
+ <data name="btn_cancel.Text" xml:space="preserve">
+ <value>Cancel</value>
+ </data>
+ <data name="&gt;&gt;btn_cancel.Name" xml:space="preserve">
+ <value>btn_cancel</value>
+ </data>
+ <data name="&gt;&gt;btn_cancel.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;btn_cancel.Parent" xml:space="preserve">
+ <value>tableLayoutPanel1</value>
+ </data>
+ <data name="&gt;&gt;btn_cancel.ZOrder" xml:space="preserve">
+ <value>1</value>
+ </data>
+ <data name="tableLayoutPanel1.ColumnCount" type="System.Int32, mscorlib">
+ <value>2</value>
+ </data>
+ <data name="PictureBox1.InitialImage" type="System.Resources.ResXNullRef, System.Windows.Forms">
+ <value />
+ </data>
+ <data name="PictureBox1.Location" type="System.Drawing.Point, System.Drawing">
+ <value>3, 3</value>
+ </data>
+ <data name="PictureBox1.Size" type="System.Drawing.Size, System.Drawing">
+ <value>64, 64</value>
+ </data>
+ <data name="PictureBox1.TabIndex" type="System.Int32, mscorlib">
+ <value>25</value>
+ </data>
+ <data name="&gt;&gt;PictureBox1.Name" xml:space="preserve">
+ <value>PictureBox1</value>
+ </data>
+ <data name="&gt;&gt;PictureBox1.Type" xml:space="preserve">
+ <value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;PictureBox1.Parent" xml:space="preserve">
+ <value>tableLayoutPanel1</value>
+ </data>
+ <data name="&gt;&gt;PictureBox1.ZOrder" xml:space="preserve">
+ <value>0</value>
+ </data>
+ <data name="tableLayoutPanel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+ <value>Fill</value>
+ </data>
+ <data name="tableLayoutPanel1.Location" type="System.Drawing.Point, System.Drawing">
+ <value>9, 9</value>
+ </data>
+ <data name="tableLayoutPanel1.RowCount" type="System.Int32, mscorlib">
+ <value>3</value>
+ </data>
+ <data name="tableLayoutPanel1.Size" type="System.Drawing.Size, System.Drawing">
+ <value>353, 73</value>
+ </data>
+ <data name="tableLayoutPanel1.TabIndex" type="System.Int32, mscorlib">
+ <value>27</value>
+ </data>
+ <data name="&gt;&gt;tableLayoutPanel1.Name" xml:space="preserve">
+ <value>tableLayoutPanel1</value>
+ </data>
+ <data name="&gt;&gt;tableLayoutPanel1.Type" xml:space="preserve">
+ <value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;tableLayoutPanel1.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name="&gt;&gt;tableLayoutPanel1.ZOrder" xml:space="preserve">
+ <value>0</value>
+ </data>
+ <data name="tableLayoutPanel1.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
+ <value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="PictureBox1" Row="0" RowSpan="3" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="btn_cancel" Row="2" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;Control Name="progress_download" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;Control Name="lblProgress" Row="1" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="AutoSize,0,AutoSize,0" /&gt;&lt;Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0" /&gt;&lt;/TableLayoutSettings&gt;</value>
+ </data>
+ <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <value>True</value>
+ </metadata>
+ <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
+ <value>6, 13</value>
+ </data>
+ <data name="$this.AutoSize" type="System.Boolean, mscorlib">
+ <value>True</value>
+ </data>
+ <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
+ <value>371, 91</value>
+ </data>
+ <data name="$this.Font" type="System.Drawing.Font, System.Drawing">
+ <value>Tahoma, 8.25pt</value>
+ </data>
+ <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA
+ IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA
+ AACACgAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8A/wAAAAD/AAAAAIAAgICAAICAAAAAgAAAAICAAIAA
+ AACAAIAAgP//ACAgIADg4OAAIAAAAAAgAABg4CAAQOBAAGBgYAAgYAAAQKDgAAAAIABAwCAAIEAAAECg
+ AABg4AAAIGCAAECAoABgoMAAYECgAGDAAABgICAAoKCgAOAAAAAgIAAAAGAAAEDgAABgAAAAIAAgAEAg
+ IAAgQGAAIIDAAADg4ABgAGAAgOD/ACCA/wCgAAAAQGAAACCAAAAAoAAAYCAAAAAgIAAgIEAAYGBAAEBg
+ YAAAIIAAAGCAAGCAgABAAKAAAICgAACgoACAoKAAIKDAAECgwAAAAOAAQADgAADA4ABgwOAAIODgAADg
+ AADA4AAAAEAgAKDgIAAA4EAAYABAAABAYACAAGAAgCBgAGAggABA4KAAAECgAGBAwADgIOAAIEDgAACA
+ 4ADgoOAAYAD/ACBg/wAAoP8A4KD/AGD//wAICAgACAAAAAgIAAAAAJgACAAIAAAACAAACAAACBAQACA4
+ SAAgYIgAOHCIADhw+AAIGAAAEBAIACg4QAAwYHgAAACIACA4QAAoQFAAKFh4AHh4eAAwaIAAIGiQADh4
+ mAAACAgAEAgIABAYGAAgGBgASEhIABhIYAAoUGAAIFBoAChQaAAoWGgAMFhoAChoiAAweJgAKHioACiA
+ sAAIEAAACAgQAAgQGAAQGCAAGCAoABhAUAAoSFgAaGhoABhQcAAgWHAAKFhwADhgcAAYWIAAOGiAAIiI
+ iAAoaJAAKHCYACh4oAA4gKAAMICoAKioqAAwmNAAEDgAAChYAAAweAAAMIgQAAgYGAAYGBgACBggABAg
+ KAAgKCgAKCgoACAwOAA4ODgAKDhIADBQWABYWFgAGEhoADBYcAAYUHgAGFh4ACBYeAAoYHgAKGCAABhY
+ iAAgaJgAKICoACiIuAC4uLgAMJDIADiw6AAQCAAAABgAAAggAAAAOAAAMGgAABgQCAAwgAgAEAgQABgQ
+ EAAwmBgAGBggAAgYKAAAICgACCAoABgoMAAgKDAAGDBAABg4QAAYOFAAEEBYACBIWAAwSFgAOEhYACBI
+ YAAQSGgAOFhoABhIcAAoUHAAQFhwACBgeABAaIAAIGiIADBwiABAcIgAGGCQADhwkABYeJAACBCgAChw
+ oAAweKAAKIC4ACiQwAAwmMgAOKjgADBg6ABAsOgAELD4AAgoAAAIMAAAGDAAABhIAAAYUAAAKHgAAACY
+ AAAwmAAAAMgAABAACAAIEAgAEBgIABA4CAAYOAgAMHgIABAYEAAYGBAAIBgQACh4EAAwmBAAEBAYABgg
+ GAAoIBgAGCAgAAgIKAAgICgAGAgwAAggMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAn2KfdXV1XAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoo2+QIJCJb28Sd3em
+ nQAAAFuKqW0aqsd6Y5/DXAAAAAAAAAAAAAAAAAAAAAAAAAB3kAWQkG8SpqaJb28gsncAbIeSroyii21x
+ kczIwwAAAAAAAAAAAAAAAAAAAAAAAABoo4mJkLKylm9vb5BvdwwAcZO/fox7z2NjqsOss2MAWwAAAAAA
+ AAAAAAAAAAAAAAAAvaGmo5ANlgUFEiBvo1xjq3p6qMTJroBkxXt9cGzFnAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAL2ylgV3vQAAAGOvxMXXq41uh6yVjxqp1YhknwAAAAAAAAAAAAAAAAAAAAAAAAAAAABvsolbAAAA
+ +5KneouS2Kx4pZF9ndywsXuvkocAAAAAAAAAAAAAAAAAAAAAAAAAAAB3sncAAAAAdayHca95bH9+cKmv
+ fMVucG2B4MYAAAAAAAAAAAAAAAAAAAAAAAAAAAChsqMAAAAAe3VkyHF5kW59cN3eZc/XyXutyot7AAAA
+ AAAAAAAAAAAAAAAAAAAAAACjIKEAAACgfv94gX+PituLDI0/aoBxqxqOY8PgbQAAAAAAAAAAAAAAAAAA
+ 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
+ OAAABwAA//wYAAADAAD/+BgAAAMAAP/AAAAAAwAA/wAAAAADAAD8AAAAAAMAAPwAAAAAAwAA+AAAAAAD
+ AADwAAAAAAMAAPAAAAAAAwAA8AAAAAADAADwAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAQAA8AAPAA
+ ABgADwAA+AAAHgAHAAD8AAAfgAMAAP4QAA+ADwAA/gAADgADAAD8AAAfAAMAAPAfxD/ABwAA4B/n/+AB
+ AADgB+B/wB8AAOADgB+ADwAA8AOAHhAPAAD4BwB/8kcAAPz/gf/nLwAA+P/5/+8/AADwf/n//z8AAPh/
+ /P//vwAA+P////+fAAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//
+ /wAAAP8AAP//AAAAgACAgIAAgAAAAACAAAAAgIAAgIAAAECg4ABAgKAAYOAgAEDgQAAAIAAAACAgACAg
+ IABgIIAAIAAAACBAAAAAYAAAIIAAAGAgIABAYGAAAACgAGCAoACgoKAA4ODgAGDAAAAAACAAYABgAIAg
+ YAAAYMAAICAAACBgAABgYAAAQKAAAKDAAAAA4AAAYOAAAABAIAAgQCAAYAAgACBAQABgYEAAIABgACAg
+ YAAgQGAAYGBgACBggABgYIAAgACgAKCAoABgIMAAQKDAAGCgwAAgwMAAAADgAIDA4ACgwOAAAODgAIDg
+ 4ACA4AAAgIAgAEDgIACgACAAQABgAIAggAAgYP8AAKD/AAgIAAAICAgACAAAABhAWAAoUGAAaGhoADBg
+ eAAoaIgAMICoAChggAAACAgAEAgIABgYGAAoUGgAKFhwAChwkAAIGAgACBAQABAgKAAQKDgAIEhgACBQ
+ aAAAAHgAIFh4AChgeAAAeHgAeHh4AChogAAwaIAAIGCIADBoiAA4cIgAIGiQADhwkAAoeKgAKICwAAgQ
+ AAAIIAAACAAIABhICAAICBAAMIgQABAYGAAYICgAGCgwAEhISAAwSFgAGFBoAChYaAAICHgAOGiAACh4
+ oAAweKAAGAAAAAAIAAAAGAAACBgAABAoAAAYUAAAKGAAAChoAAAAeAAAAAAIAAgQCAAQEAgAGP8IACAY
+ EAAIEBgAMJAYABggIAAAACgACBAoACgwMAAAKDgAEDA4ADg4OAAoOEAAGDhIACA4SAAAQEgAMEBIAEhQ
+ UAAISFgAIEhYAChIWAAwUFgAIEhoAEhYaAAYUHAAMFhwABhYeAAoWHgAIFiAAEhwgACIiIgAGGCQAAAA
+ mAAgcJgAKHCYADB4mACYmJgAACjIAEBw+ACo//8ASAAAAFgAAABoAAAAeAAAABAIAABICAAAGCgAAAA4
+ AAAYOAAACEAAAAhIAAAoUAAAAFgAACBYAAAAaAAAIGgAADB4AAAAiAAAMIgAAGiIAACAmAAAGAAIADAI
+ CABgCAgAEBgIAAggCAAQIAgAECgIAAgwCAAQMAgAODAIABA4CAAYOAgAEEAIABhACAAgQAgAIFAIAChg
+ CAAwgAgAMJAIADCoCAAACBAAGBAQABggEAAoIBAAKGAQAChoEAAgeBAAKHgQAEh4EAAY+BAACAAYAAAI
+ GAAICBgAEAgYAAAQGAAQEBgAABgYAAgYGAAYMBgAKHgYADCYGAAwoBgAMKgYAGj/GABgCCAACBAgAAgY
+ IAAQGCAAGBggACggIABIcCAACAAoABAAKAAAECgAEBAoAAggKAAACDAASAgwAAgQMAAIKDAAECgwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAARxBSUlJHAAAAAABYWFlY8kYAAAAAAAAAAAAAAAAAAJFgqqRLSzAwBXMAkKJbW1pdSVmE
+ AAAAAAAAAAAAAAAAEJdLqhpgYKQFkf9NmVRanHVJVZRQAAAAAAAAAAAAAAAAUY6RO6qXMHNYW5MxdFpm
+ TVtPSpAAAAAAAAAAAAAAAAAAAAAFpIYAAFSeW09PU15KU05MaEkAAAAAAAAAAAAAAAAAAEtgAAAAk55j
+ ml5Mp2haXUqpW3IAAAAAAAAAAAAAAAAAS0sAAEpJoE5PpZpMZVWnMZyZVQAAAAAAAAAAAAAAAABLMAAA
+ cqCeSnppZGZKWzFNaV2ecAAAAAAAAAAAAAAAAEtLAACLVF6iZHROp2eiW1paeWnxAAAAAAAAAAAAAABI
+ GmAAAElJSmh6SWNVSk5hZqJ1VXUAAAAAAAAAAAAAlpmjeJAAk12eZXZ5p3WndnZpaUlbZgAAAAAAAAAA
+ m2lFRTw8PDZeWV1OlE0xeWlNeVVdZmmZUAAAAAAAjzYKRaysRUVFRa02SXSnYaFNTUxpTFSoTmKTAAAA
+ AI8KOkSrrKysrKxErDullF6fVWhiVakLaVWbVZoAAAAAqK2sRKZEqyCsRKummKBZT0xPTHppZVMLqVN4
+ cQAAAAA6O6sYGKYYGKsYphgELjejY09KTTZNaWdMNpkAAAAA+zc6XFxcd3d3XASmXEw6PZZiZ6g2ZUw2
+ T2QLnwAAAAAdoTtcLcV3pndfLi2jraMtcmNkT05np0xnaXhUAAAAAAD5NKL87xgYd1+eLZ06+1wAVE6o
+ p2cKZ2WjjgAAAAAAAAAQo67EcuZuj5jkACue9gAAkTEKeJfbioptRgAAAAAAAACIr0dLVwBXmEeL5Qg4
+ AAAAAOnqwNbVb9O5AAAAAAAAAP38RmDae3tfkDqIX0UAAABq3W9v6+2BtssAAAAAAAD9q6v7AFl1dV9f
+ mpgIXwAAAABrtG9v7O2BagAAAACSF52fL/AAAAAAAHUAAAAAAAAAAACC1NS+3s/ZzAAAAJ03MjqjdJ0A
+ AAC3FIMUtwAAAAAAzr27goK5awAAAAAAWaNgGho3dAAAyr+/v4ODtQAAAMmAAM+2zxMTawAAAAAAAK6z
+ kZ1xAAC1un3HVwAAAAAAAAAAawB/ftAAAAAAAABCNUIAAAAAAAAAAF8AAAAAAAAAAEcAAGpGAAAAAAAA
+ AEKsEQAAAAAAAAAAlZUAAAAAAAAAAAAAAEgAAAAAAAAAAC3hAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAA
+ AAD///////////4BwH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAA
+ AAHgAAAB4AAAAeAAAAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9
+ /s/j/P/v8///7ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AFEl
+ swBJDW0ABEMwAAJHSQAFDwIAXl9ZAHJtagBwfYQAQVNqAAFtAAAAZgAAAz0CABQ/AQAXQwAAGkAAAA8g
+ AQAhSJQAM1SRABw6fgAFVk0ADE48AAplaQAgWgIAMYcMACl7CwAOJwMAAAMtABwPNwAhIQAABxACAA9S
+ UAAnQUgAAISfACRoDAAxmwQAK4MHABMpAAA8P1kATBMbACQSVwAKL1EADS5CADFMVQABIF4AJ3CGADB2
+ kAAzdlEAMnY1ABMnEwBARooAVVq5ABgATwAWBn0ABh56AAULaQBOeKYAT3WSACpNZwAucpgAMHifADFx
+ nwA1b5YAMF93AEBalgBvjecADCLAAAkPpQAbJr4AFiLGAAAJjgAzbIEANGh8AClhgAAzfKEAMHWWADJz
+ kwAsW3MAQ4mvADyY9AAtgf8AIpr/ACuk/wBdk9UAG0tkACladQAqbI4AK3GUAC5vjwArbpEALWJ7ACdl
+ aAAOaoQAJJ20ABx0gQAeTF8AJ116ACViggAgZosAJmeJAChvlAAhZIgAH1ZyAHVmYwAaPVMAJ19+ACto
+ hgAmaIwAKGB9ACFdfAAgY4YAGU5qAFtgYQAYQVgAIVx7ACtrjgAtZYIAJmKAACNhgQAmX3wAIUpdAHp6
+ ewARN0wAH1R0ACdXcgApXnoAJ2B+ACligQAdSmAAKiopAGZlZQCRkZEAbm9vAFFSUwAWO08AJFRuACFP
+ agAhUm0AHD9RAAMKDgA3NjUAWlpaADk5OQA3NzcAPDk3AAYSGQAVNUgAFjFAAA8jLwABAgQAVQAAAP//
+ /wBWAAAA/f//AFcAAAD8//8AWAAAAPz//wBZAAAA/P//AFoAAAD9//8AWwAAAP7//wBcAAAA////AF4A
+ AAABAAAAXwAAAAEAAABgAAAAAQAAAGEAAAABAAAAYgAAAAEAAAB3IFIAbWFuAAAAAAAAAAAAAAAAAAAA
+ AAC0VWMAtFVjALwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAEAAAAAADgDAACfAQAAPwAAAAEA
+ AABAAAAAAQAAAEEAAAABAAAAQgAAAAEAAABFAAAA////AEYAAAD+//8ARwAAAP3//wBIAAAA/P//AEkA
+ AAD8//8ASgAAAPz//wBLAAAA/f//AEwAAAD///8ATQAAAAMAAABOAAAABwAAAE8AAAALAAAAUAAAABAA
+ AABRAAAAFQAAAFIAAAAZAAAAUwAAABwAAABUAAAAHgAAAFUAAAAeAAAAVgAAAB0AAABXAAAAGgAAAFgA
+ AAAWAAAAWQAAABIAAABaAAAADQAAAFsAAAAIAAAAXAAAAAQAAABeAAAA/v//AF8AAAD8//8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAI2Oj5CRkpOUlZYAAAAAAACCg4SFhoeIiYqLjAAAAAAAAAB6AHt8fX5/gIEAAAAA
+ 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
+</value>
+ </data>
+ <data name="$this.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
+ <value>9, 9, 9, 9</value>
+ </data>
+ <data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
+ <value>CenterScreen</value>
+ </data>
+ <data name="$this.Text" xml:space="preserve">
+ <value>Downloading Update</value>
+ </data>
+ <data name="&gt;&gt;$this.Name" xml:space="preserve">
+ <value>DownloadUpdate</value>
+ </data>
+ <data name="&gt;&gt;$this.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/win/CS/ToolWindows/ExceptionWindow.cs b/win/CS/ToolWindows/ExceptionWindow.cs
new file mode 100644
index 000000000..d329ad0cc
--- /dev/null
+++ b/win/CS/ToolWindows/ExceptionWindow.cs
@@ -0,0 +1,81 @@
+/* ExceptionWindow.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.ToolWindows
+{
+ using System;
+ using System.Windows.Forms;
+
+ /// <summary>
+ /// A window to display Exceptions in a form which can be easily copied and reported by users.
+ /// </summary>
+ public partial class ExceptionWindow : Form
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="ExceptionWindow"/> class.
+ /// </summary>
+ public ExceptionWindow()
+ {
+ InitializeComponent();
+ }
+
+ /// <summary>
+ /// Setup the window with the error message.
+ /// </summary>
+ /// <param name="shortError">
+ /// The short error.
+ /// </param>
+ /// <param name="longError">
+ /// The long error.
+ /// </param>
+ public void Setup(string shortError, string longError)
+ {
+ lbl_shortError.Text = shortError;
+ rtf_exceptionFull.Text = shortError + Environment.NewLine + longError;
+ }
+
+ /// <summary>
+ /// Copy the Exception Information to the Clipboard.
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void BtnCopyClick(object sender, EventArgs e)
+ {
+ Clipboard.SetDataObject(rtf_exceptionFull.SelectedText != string.Empty ? rtf_exceptionFull.SelectedText : rtf_exceptionFull.Text, true);
+ }
+
+ /// <summary>
+ /// Copy from the right click menu
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void MnuCopyLogClick(object sender, EventArgs e)
+ {
+ Clipboard.SetDataObject(rtf_exceptionFull.SelectedText != string.Empty ? rtf_exceptionFull.SelectedText : rtf_exceptionFull.Text, true);
+ }
+
+ /// <summary>
+ /// Close the window
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void BtnCloseClick(object sender, EventArgs e)
+ {
+ this.Close();
+ }
+ }
+}
diff --git a/win/CS/ToolWindows/ExceptionWindow.designer.cs b/win/CS/ToolWindows/ExceptionWindow.designer.cs
new file mode 100644
index 000000000..4865f3f21
--- /dev/null
+++ b/win/CS/ToolWindows/ExceptionWindow.designer.cs
@@ -0,0 +1,187 @@
+namespace Handbrake.ToolWindows
+{
+ partial class ExceptionWindow
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ExceptionWindow));
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.panel2 = new System.Windows.Forms.Panel();
+ this.PictureBox1 = new System.Windows.Forms.PictureBox();
+ this.label3 = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ this.lbl_shortError = new System.Windows.Forms.Label();
+ this.panel3 = new System.Windows.Forms.Panel();
+ this.panel5 = new System.Windows.Forms.Panel();
+ this.panel4 = new System.Windows.Forms.Panel();
+ this.panel6 = new System.Windows.Forms.Panel();
+ this.btn_close = new System.Windows.Forms.Button();
+ this.btn_copy = new System.Windows.Forms.Button();
+ this.rtf_exceptionFull = new System.Windows.Forms.RichTextBox();
+ this.mnu_copy_log = new System.Windows.Forms.ToolStripMenuItem();
+ this.panel1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).BeginInit();
+ this.panel4.SuspendLayout();
+ this.panel6.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // panel1
+ //
+ this.panel1.BackColor = System.Drawing.Color.White;
+ this.panel1.Controls.Add(this.panel2);
+ this.panel1.Controls.Add(this.PictureBox1);
+ this.panel1.Controls.Add(this.label3);
+ this.panel1.Controls.Add(this.label1);
+ this.panel1.Controls.Add(this.lbl_shortError);
+ resources.ApplyResources(this.panel1, "panel1");
+ this.panel1.Name = "panel1";
+ //
+ // panel2
+ //
+ this.panel2.BackColor = System.Drawing.SystemColors.Control;
+ resources.ApplyResources(this.panel2, "panel2");
+ this.panel2.MaximumSize = new System.Drawing.Size(0, 10);
+ this.panel2.MinimumSize = new System.Drawing.Size(0, 10);
+ this.panel2.Name = "panel2";
+ //
+ // PictureBox1
+ //
+ this.PictureBox1.Image = Properties.Resources.ErrorX;
+ resources.ApplyResources(this.PictureBox1, "PictureBox1");
+ this.PictureBox1.Name = "PictureBox1";
+ this.PictureBox1.TabStop = false;
+ //
+ // label3
+ //
+ resources.ApplyResources(this.label3, "label3");
+ this.label3.Name = "label3";
+ //
+ // label1
+ //
+ resources.ApplyResources(this.label1, "label1");
+ this.label1.Name = "label1";
+ //
+ // lbl_shortError
+ //
+ resources.ApplyResources(this.lbl_shortError, "lbl_shortError");
+ this.lbl_shortError.Name = "lbl_shortError";
+ //
+ // panel3
+ //
+ resources.ApplyResources(this.panel3, "panel3");
+ this.panel3.Name = "panel3";
+ //
+ // panel5
+ //
+ resources.ApplyResources(this.panel5, "panel5");
+ this.panel5.Name = "panel5";
+ //
+ // panel4
+ //
+ this.panel4.Controls.Add(this.panel6);
+ resources.ApplyResources(this.panel4, "panel4");
+ this.panel4.Name = "panel4";
+ //
+ // panel6
+ //
+ this.panel6.Controls.Add(this.btn_close);
+ this.panel6.Controls.Add(this.btn_copy);
+ resources.ApplyResources(this.panel6, "panel6");
+ this.panel6.Name = "panel6";
+ //
+ // btn_close
+ //
+ this.btn_close.BackColor = System.Drawing.Color.Transparent;
+ this.btn_close.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ resources.ApplyResources(this.btn_close, "btn_close");
+ this.btn_close.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_close.Name = "btn_close";
+ this.btn_close.UseVisualStyleBackColor = false;
+ this.btn_close.Click += new System.EventHandler(this.BtnCloseClick);
+ //
+ // btn_copy
+ //
+ this.btn_copy.BackColor = System.Drawing.Color.Transparent;
+ this.btn_copy.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ resources.ApplyResources(this.btn_copy, "btn_copy");
+ this.btn_copy.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_copy.Image = Properties.Resources.copy;
+ this.btn_copy.Name = "btn_copy";
+ this.btn_copy.UseVisualStyleBackColor = false;
+ this.btn_copy.Click += new System.EventHandler(this.BtnCopyClick);
+ //
+ // rtf_exceptionFull
+ //
+ resources.ApplyResources(this.rtf_exceptionFull, "rtf_exceptionFull");
+ this.rtf_exceptionFull.Name = "rtf_exceptionFull";
+ //
+ // mnu_copy_log
+ //
+ this.mnu_copy_log.Image = Properties.Resources.copy;
+ this.mnu_copy_log.Name = "mnu_copy_log";
+ resources.ApplyResources(this.mnu_copy_log, "mnu_copy_log");
+ this.mnu_copy_log.Click += new System.EventHandler(this.MnuCopyLogClick);
+ //
+ // ExceptionWindow
+ //
+ resources.ApplyResources(this, "$this");
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.rtf_exceptionFull);
+ this.Controls.Add(this.panel3);
+ this.Controls.Add(this.panel5);
+ this.Controls.Add(this.panel4);
+ this.Controls.Add(this.panel1);
+ this.Name = "ExceptionWindow";
+ this.TopMost = true;
+ this.panel1.ResumeLayout(false);
+ this.panel1.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).EndInit();
+ this.panel4.ResumeLayout(false);
+ this.panel6.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.Panel panel2;
+ internal System.Windows.Forms.PictureBox PictureBox1;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label lbl_shortError;
+ private System.Windows.Forms.Panel panel3;
+ private System.Windows.Forms.Panel panel5;
+ private System.Windows.Forms.Panel panel4;
+ private System.Windows.Forms.RichTextBox rtf_exceptionFull;
+ internal System.Windows.Forms.Button btn_close;
+ private System.Windows.Forms.Panel panel6;
+ internal System.Windows.Forms.Button btn_copy;
+ private System.Windows.Forms.ContextMenuStrip rightClickMenu;
+ private System.Windows.Forms.ToolStripMenuItem mnu_copy_log;
+ }
+} \ No newline at end of file
diff --git a/win/CS/ToolWindows/ExceptionWindow.resx b/win/CS/ToolWindows/ExceptionWindow.resx
new file mode 100644
index 000000000..6492d0740
--- /dev/null
+++ b/win/CS/ToolWindows/ExceptionWindow.resx
@@ -0,0 +1,868 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <data name="panel2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+ <value>Bottom</value>
+ </data>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="panel2.Location" type="System.Drawing.Point, System.Drawing">
+ <value>0, 87</value>
+ </data>
+ <data name="panel2.Size" type="System.Drawing.Size, System.Drawing">
+ <value>669, 10</value>
+ </data>
+ <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <data name="panel2.TabIndex" type="System.Int32, mscorlib">
+ <value>59</value>
+ </data>
+ <data name="&gt;&gt;panel2.Name" xml:space="preserve">
+ <value>panel2</value>
+ </data>
+ <data name="&gt;&gt;panel2.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;panel2.Parent" xml:space="preserve">
+ <value>panel1</value>
+ </data>
+ <data name="&gt;&gt;panel2.ZOrder" xml:space="preserve">
+ <value>0</value>
+ </data>
+ <data name="PictureBox1.InitialImage" type="System.Resources.ResXNullRef, System.Windows.Forms">
+ <value />
+ </data>
+ <data name="PictureBox1.Location" type="System.Drawing.Point, System.Drawing">
+ <value>12, 12</value>
+ </data>
+ <data name="PictureBox1.Size" type="System.Drawing.Size, System.Drawing">
+ <value>64, 64</value>
+ </data>
+ <data name="PictureBox1.TabIndex" type="System.Int32, mscorlib">
+ <value>24</value>
+ </data>
+ <data name="&gt;&gt;PictureBox1.Name" xml:space="preserve">
+ <value>PictureBox1</value>
+ </data>
+ <data name="&gt;&gt;PictureBox1.Type" xml:space="preserve">
+ <value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;PictureBox1.Parent" xml:space="preserve">
+ <value>panel1</value>
+ </data>
+ <data name="&gt;&gt;PictureBox1.ZOrder" xml:space="preserve">
+ <value>1</value>
+ </data>
+ <data name="label3.AutoSize" type="System.Boolean, mscorlib">
+ <value>True</value>
+ </data>
+ <data name="label3.Font" type="System.Drawing.Font, System.Drawing">
+ <value>Tahoma, 8.25pt, style=Bold</value>
+ </data>
+ <data name="label3.Location" type="System.Drawing.Point, System.Drawing">
+ <value>84, 63</value>
+ </data>
+ <data name="label3.Size" type="System.Drawing.Size, System.Drawing">
+ <value>80, 13</value>
+ </data>
+ <data name="label3.TabIndex" type="System.Int32, mscorlib">
+ <value>57</value>
+ </data>
+ <data name="label3.Text" xml:space="preserve">
+ <value>Error Details:</value>
+ </data>
+ <data name="&gt;&gt;label3.Name" xml:space="preserve">
+ <value>label3</value>
+ </data>
+ <data name="&gt;&gt;label3.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;label3.Parent" xml:space="preserve">
+ <value>panel1</value>
+ </data>
+ <data name="&gt;&gt;label3.ZOrder" xml:space="preserve">
+ <value>2</value>
+ </data>
+ <data name="label1.AutoSize" type="System.Boolean, mscorlib">
+ <value>True</value>
+ </data>
+ <data name="label1.Font" type="System.Drawing.Font, System.Drawing">
+ <value>Tahoma, 9.75pt, style=Bold</value>
+ </data>
+ <data name="label1.Location" type="System.Drawing.Point, System.Drawing">
+ <value>84, 12</value>
+ </data>
+ <data name="label1.Size" type="System.Drawing.Size, System.Drawing">
+ <value>150, 16</value>
+ </data>
+ <data name="label1.TabIndex" type="System.Int32, mscorlib">
+ <value>25</value>
+ </data>
+ <data name="label1.Text" xml:space="preserve">
+ <value>An Error has occured.</value>
+ </data>
+ <data name="&gt;&gt;label1.Name" xml:space="preserve">
+ <value>label1</value>
+ </data>
+ <data name="&gt;&gt;label1.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;label1.Parent" xml:space="preserve">
+ <value>panel1</value>
+ </data>
+ <data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
+ <value>3</value>
+ </data>
+ <data name="lbl_shortError.Location" type="System.Drawing.Point, System.Drawing">
+ <value>84, 33</value>
+ </data>
+ <data name="lbl_shortError.Size" type="System.Drawing.Size, System.Drawing">
+ <value>573, 30</value>
+ </data>
+ <data name="lbl_shortError.TabIndex" type="System.Int32, mscorlib">
+ <value>58</value>
+ </data>
+ <data name="lbl_shortError.Text" xml:space="preserve">
+ <value>An Unknown Error has occured.</value>
+ </data>
+ <data name="&gt;&gt;lbl_shortError.Name" xml:space="preserve">
+ <value>lbl_shortError</value>
+ </data>
+ <data name="&gt;&gt;lbl_shortError.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;lbl_shortError.Parent" xml:space="preserve">
+ <value>panel1</value>
+ </data>
+ <data name="&gt;&gt;lbl_shortError.ZOrder" xml:space="preserve">
+ <value>4</value>
+ </data>
+ <data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+ <value>Top</value>
+ </data>
+ <data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
+ <value>0, 0</value>
+ </data>
+ <data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
+ <value>669, 97</value>
+ </data>
+ <data name="panel1.TabIndex" type="System.Int32, mscorlib">
+ <value>61</value>
+ </data>
+ <data name="&gt;&gt;panel1.Name" xml:space="preserve">
+ <value>panel1</value>
+ </data>
+ <data name="&gt;&gt;panel1.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;panel1.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name="&gt;&gt;panel1.ZOrder" xml:space="preserve">
+ <value>4</value>
+ </data>
+ <data name="panel3.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+ <value>Left</value>
+ </data>
+ <data name="panel3.Location" type="System.Drawing.Point, System.Drawing">
+ <value>0, 97</value>
+ </data>
+ <data name="panel3.Size" type="System.Drawing.Size, System.Drawing">
+ <value>76, 216</value>
+ </data>
+ <data name="panel3.TabIndex" type="System.Int32, mscorlib">
+ <value>68</value>
+ </data>
+ <data name="&gt;&gt;panel3.Name" xml:space="preserve">
+ <value>panel3</value>
+ </data>
+ <data name="&gt;&gt;panel3.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;panel3.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name="&gt;&gt;panel3.ZOrder" xml:space="preserve">
+ <value>1</value>
+ </data>
+ <data name="panel5.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+ <value>Right</value>
+ </data>
+ <data name="panel5.Location" type="System.Drawing.Point, System.Drawing">
+ <value>640, 97</value>
+ </data>
+ <data name="panel5.Size" type="System.Drawing.Size, System.Drawing">
+ <value>29, 216</value>
+ </data>
+ <data name="panel5.TabIndex" type="System.Int32, mscorlib">
+ <value>69</value>
+ </data>
+ <data name="&gt;&gt;panel5.Name" xml:space="preserve">
+ <value>panel5</value>
+ </data>
+ <data name="&gt;&gt;panel5.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;panel5.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name="&gt;&gt;panel5.ZOrder" xml:space="preserve">
+ <value>2</value>
+ </data>
+ <data name="btn_close.Font" type="System.Drawing.Font, System.Drawing">
+ <value>Verdana, 8.25pt, style=Bold</value>
+ </data>
+ <data name="btn_close.Location" type="System.Drawing.Point, System.Drawing">
+ <value>105, 8</value>
+ </data>
+ <data name="btn_close.Size" type="System.Drawing.Size, System.Drawing">
+ <value>70, 25</value>
+ </data>
+ <data name="btn_close.TabIndex" type="System.Int32, mscorlib">
+ <value>56</value>
+ </data>
+ <data name="btn_close.Text" xml:space="preserve">
+ <value>OK</value>
+ </data>
+ <data name="&gt;&gt;btn_close.Name" xml:space="preserve">
+ <value>btn_close</value>
+ </data>
+ <data name="&gt;&gt;btn_close.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;btn_close.Parent" xml:space="preserve">
+ <value>panel6</value>
+ </data>
+ <data name="&gt;&gt;btn_close.ZOrder" xml:space="preserve">
+ <value>0</value>
+ </data>
+ <data name="btn_copy.Font" type="System.Drawing.Font, System.Drawing">
+ <value>Verdana, 8.25pt, style=Bold</value>
+ </data>
+ <data name="btn_copy.ImageAlign" type="System.Drawing.ContentAlignment, System.Drawing">
+ <value>MiddleLeft</value>
+ </data>
+ <data name="btn_copy.Location" type="System.Drawing.Point, System.Drawing">
+ <value>14, 8</value>
+ </data>
+ <data name="btn_copy.Size" type="System.Drawing.Size, System.Drawing">
+ <value>85, 25</value>
+ </data>
+ <data name="btn_copy.TabIndex" type="System.Int32, mscorlib">
+ <value>57</value>
+ </data>
+ <data name="btn_copy.Text" xml:space="preserve">
+ <value>Copy</value>
+ </data>
+ <data name="&gt;&gt;btn_copy.Name" xml:space="preserve">
+ <value>btn_copy</value>
+ </data>
+ <data name="&gt;&gt;btn_copy.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;btn_copy.Parent" xml:space="preserve">
+ <value>panel6</value>
+ </data>
+ <data name="&gt;&gt;btn_copy.ZOrder" xml:space="preserve">
+ <value>1</value>
+ </data>
+ <data name="panel6.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+ <value>Right</value>
+ </data>
+ <data name="panel6.Location" type="System.Drawing.Point, System.Drawing">
+ <value>491, 0</value>
+ </data>
+ <data name="panel6.Size" type="System.Drawing.Size, System.Drawing">
+ <value>178, 42</value>
+ </data>
+ <data name="panel6.TabIndex" type="System.Int32, mscorlib">
+ <value>58</value>
+ </data>
+ <data name="&gt;&gt;panel6.Name" xml:space="preserve">
+ <value>panel6</value>
+ </data>
+ <data name="&gt;&gt;panel6.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;panel6.Parent" xml:space="preserve">
+ <value>panel4</value>
+ </data>
+ <data name="&gt;&gt;panel6.ZOrder" xml:space="preserve">
+ <value>0</value>
+ </data>
+ <data name="panel4.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+ <value>Bottom</value>
+ </data>
+ <data name="panel4.Location" type="System.Drawing.Point, System.Drawing">
+ <value>0, 313</value>
+ </data>
+ <data name="panel4.Size" type="System.Drawing.Size, System.Drawing">
+ <value>669, 42</value>
+ </data>
+ <data name="panel4.TabIndex" type="System.Int32, mscorlib">
+ <value>69</value>
+ </data>
+ <data name="&gt;&gt;panel4.Name" xml:space="preserve">
+ <value>panel4</value>
+ </data>
+ <data name="&gt;&gt;panel4.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;panel4.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name="&gt;&gt;panel4.ZOrder" xml:space="preserve">
+ <value>3</value>
+ </data>
+ <data name="rtf_exceptionFull.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+ <value>Fill</value>
+ </data>
+ <data name="rtf_exceptionFull.Location" type="System.Drawing.Point, System.Drawing">
+ <value>76, 97</value>
+ </data>
+ <data name="rtf_exceptionFull.Size" type="System.Drawing.Size, System.Drawing">
+ <value>564, 216</value>
+ </data>
+ <data name="rtf_exceptionFull.TabIndex" type="System.Int32, mscorlib">
+ <value>70</value>
+ </data>
+ <data name="rtf_exceptionFull.Text" xml:space="preserve">
+ <value />
+ </data>
+ <data name="&gt;&gt;rtf_exceptionFull.Name" xml:space="preserve">
+ <value>rtf_exceptionFull</value>
+ </data>
+ <data name="&gt;&gt;rtf_exceptionFull.Type" xml:space="preserve">
+ <value>System.Windows.Forms.RichTextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;rtf_exceptionFull.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name="&gt;&gt;rtf_exceptionFull.ZOrder" xml:space="preserve">
+ <value>0</value>
+ </data>
+ <data name="mnu_copy_log.Size" type="System.Drawing.Size, System.Drawing">
+ <value>152, 22</value>
+ </data>
+ <data name="mnu_copy_log.Text" xml:space="preserve">
+ <value>Copy</value>
+ </data>
+ <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <value>True</value>
+ </metadata>
+ <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
+ <value>6, 13</value>
+ </data>
+ <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
+ <value>669, 355</value>
+ </data>
+ <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA
+ IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA
+ AACACgAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8A/wAAAAD/AAAAAIAAgICAAICAAAAAgAAAAICAAIAA
+ AACAAIAAgP//ACAgIADg4OAAIAAAAAAgAABg4CAAQOBAAGBgYAAgYAAAQKDgAAAAIABAwCAAIEAAAECg
+ AABg4AAAIGCAAECAoABgoMAAYECgAGDAAABgICAAoKCgAOAAAAAgIAAAAGAAAEDgAABgAAAAIAAgAEAg
+ IAAgQGAAIIDAAADg4ABgAGAAgOD/ACCA/wCgAAAAQGAAACCAAAAAoAAAYCAAAAAgIAAgIEAAYGBAAEBg
+ YAAAIIAAAGCAAGCAgABAAKAAAICgAACgoACAoKAAIKDAAECgwAAAAOAAQADgAADA4ABgwOAAIODgAADg
+ AADA4AAAAEAgAKDgIAAA4EAAYABAAABAYACAAGAAgCBgAGAggABA4KAAAECgAGBAwADgIOAAIEDgAACA
+ 4ADgoOAAYAD/ACBg/wAAoP8A4KD/AGD//wAICAgACAAAAAgIAAAAAJgACAAIAAAACAAACAAACBAQACA4
+ SAAgYIgAOHCIADhw+AAIGAAAEBAIACg4QAAwYHgAAACIACA4QAAoQFAAKFh4AHh4eAAwaIAAIGiQADh4
+ mAAACAgAEAgIABAYGAAgGBgASEhIABhIYAAoUGAAIFBoAChQaAAoWGgAMFhoAChoiAAweJgAKHioACiA
+ sAAIEAAACAgQAAgQGAAQGCAAGCAoABhAUAAoSFgAaGhoABhQcAAgWHAAKFhwADhgcAAYWIAAOGiAAIiI
+ iAAoaJAAKHCYACh4oAA4gKAAMICoAKioqAAwmNAAEDgAAChYAAAweAAAMIgQAAgYGAAYGBgACBggABAg
+ KAAgKCgAKCgoACAwOAA4ODgAKDhIADBQWABYWFgAGEhoADBYcAAYUHgAGFh4ACBYeAAoYHgAKGCAABhY
+ iAAgaJgAKICoACiIuAC4uLgAMJDIADiw6AAQCAAAABgAAAggAAAAOAAAMGgAABgQCAAwgAgAEAgQABgQ
+ EAAwmBgAGBggAAgYKAAAICgACCAoABgoMAAgKDAAGDBAABg4QAAYOFAAEEBYACBIWAAwSFgAOEhYACBI
+ YAAQSGgAOFhoABhIcAAoUHAAQFhwACBgeABAaIAAIGiIADBwiABAcIgAGGCQADhwkABYeJAACBCgAChw
+ oAAweKAAKIC4ACiQwAAwmMgAOKjgADBg6ABAsOgAELD4AAgoAAAIMAAAGDAAABhIAAAYUAAAKHgAAACY
+ AAAwmAAAAMgAABAACAAIEAgAEBgIABA4CAAYOAgAMHgIABAYEAAYGBAAIBgQACh4EAAwmBAAEBAYABgg
+ GAAoIBgAGCAgAAgIKAAgICgAGAgwAAggMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAn2KfdXV1XAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoo2+QIJCJb28Sd3em
+ nQAAAFuKqW0aqsd6Y5/DXAAAAAAAAAAAAAAAAAAAAAAAAAB3kAWQkG8SpqaJb28gsncAbIeSroyii21x
+ kczIwwAAAAAAAAAAAAAAAAAAAAAAAABoo4mJkLKylm9vb5BvdwwAcZO/fox7z2NjqsOss2MAWwAAAAAA
+ AAAAAAAAAAAAAAAAvaGmo5ANlgUFEiBvo1xjq3p6qMTJroBkxXt9cGzFnAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAL2ylgV3vQAAAGOvxMXXq41uh6yVjxqp1YhknwAAAAAAAAAAAAAAAAAAAAAAAAAAAABvsolbAAAA
+ +5KneouS2Kx4pZF9ndywsXuvkocAAAAAAAAAAAAAAAAAAAAAAAAAAAB3sncAAAAAdayHca95bH9+cKmv
+ fMVucG2B4MYAAAAAAAAAAAAAAAAAAAAAAAAAAAChsqMAAAAAe3VkyHF5kW59cN3eZc/XyXutyot7AAAA
+ AAAAAAAAAAAAAAAAAAAAAACjIKEAAACgfv94gX+PituLDI0/aoBxqxqOY8PgbQAAAAAAAAAAAAAAAAAA
+ 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
+ OAAABwAA//wYAAADAAD/+BgAAAMAAP/AAAAAAwAA/wAAAAADAAD8AAAAAAMAAPwAAAAAAwAA+AAAAAAD
+ AADwAAAAAAMAAPAAAAAAAwAA8AAAAAADAADwAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAQAA8AAPAA
+ ABgADwAA+AAAHgAHAAD8AAAfgAMAAP4QAA+ADwAA/gAADgADAAD8AAAfAAMAAPAfxD/ABwAA4B/n/+AB
+ AADgB+B/wB8AAOADgB+ADwAA8AOAHhAPAAD4BwB/8kcAAPz/gf/nLwAA+P/5/+8/AADwf/n//z8AAPh/
+ /P//vwAA+P////+fAAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//
+ /wAAAP8AAP//AAAAgACAgIAAgAAAAACAAAAAgIAAgIAAAECg4ABAgKAAYOAgAEDgQAAAIAAAACAgACAg
+ IABgIIAAIAAAACBAAAAAYAAAIIAAAGAgIABAYGAAAACgAGCAoACgoKAA4ODgAGDAAAAAACAAYABgAIAg
+ YAAAYMAAICAAACBgAABgYAAAQKAAAKDAAAAA4AAAYOAAAABAIAAgQCAAYAAgACBAQABgYEAAIABgACAg
+ YAAgQGAAYGBgACBggABgYIAAgACgAKCAoABgIMAAQKDAAGCgwAAgwMAAAADgAIDA4ACgwOAAAODgAIDg
+ 4ACA4AAAgIAgAEDgIACgACAAQABgAIAggAAgYP8AAKD/AAgIAAAICAgACAAAABhAWAAoUGAAaGhoADBg
+ eAAoaIgAMICoAChggAAACAgAEAgIABgYGAAoUGgAKFhwAChwkAAIGAgACBAQABAgKAAQKDgAIEhgACBQ
+ aAAAAHgAIFh4AChgeAAAeHgAeHh4AChogAAwaIAAIGCIADBoiAA4cIgAIGiQADhwkAAoeKgAKICwAAgQ
+ AAAIIAAACAAIABhICAAICBAAMIgQABAYGAAYICgAGCgwAEhISAAwSFgAGFBoAChYaAAICHgAOGiAACh4
+ oAAweKAAGAAAAAAIAAAAGAAACBgAABAoAAAYUAAAKGAAAChoAAAAeAAAAAAIAAgQCAAQEAgAGP8IACAY
+ EAAIEBgAMJAYABggIAAAACgACBAoACgwMAAAKDgAEDA4ADg4OAAoOEAAGDhIACA4SAAAQEgAMEBIAEhQ
+ UAAISFgAIEhYAChIWAAwUFgAIEhoAEhYaAAYUHAAMFhwABhYeAAoWHgAIFiAAEhwgACIiIgAGGCQAAAA
+ mAAgcJgAKHCYADB4mACYmJgAACjIAEBw+ACo//8ASAAAAFgAAABoAAAAeAAAABAIAABICAAAGCgAAAA4
+ AAAYOAAACEAAAAhIAAAoUAAAAFgAACBYAAAAaAAAIGgAADB4AAAAiAAAMIgAAGiIAACAmAAAGAAIADAI
+ CABgCAgAEBgIAAggCAAQIAgAECgIAAgwCAAQMAgAODAIABA4CAAYOAgAEEAIABhACAAgQAgAIFAIAChg
+ CAAwgAgAMJAIADCoCAAACBAAGBAQABggEAAoIBAAKGAQAChoEAAgeBAAKHgQAEh4EAAY+BAACAAYAAAI
+ GAAICBgAEAgYAAAQGAAQEBgAABgYAAgYGAAYMBgAKHgYADCYGAAwoBgAMKgYAGj/GABgCCAACBAgAAgY
+ IAAQGCAAGBggACggIABIcCAACAAoABAAKAAAECgAEBAoAAggKAAACDAASAgwAAgQMAAIKDAAECgwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAARxBSUlJHAAAAAABYWFlY8kYAAAAAAAAAAAAAAAAAAJFgqqRLSzAwBXMAkKJbW1pdSVmE
+ AAAAAAAAAAAAAAAAEJdLqhpgYKQFkf9NmVRanHVJVZRQAAAAAAAAAAAAAAAAUY6RO6qXMHNYW5MxdFpm
+ TVtPSpAAAAAAAAAAAAAAAAAAAAAFpIYAAFSeW09PU15KU05MaEkAAAAAAAAAAAAAAAAAAEtgAAAAk55j
+ ml5Mp2haXUqpW3IAAAAAAAAAAAAAAAAAS0sAAEpJoE5PpZpMZVWnMZyZVQAAAAAAAAAAAAAAAABLMAAA
+ cqCeSnppZGZKWzFNaV2ecAAAAAAAAAAAAAAAAEtLAACLVF6iZHROp2eiW1paeWnxAAAAAAAAAAAAAABI
+ GmAAAElJSmh6SWNVSk5hZqJ1VXUAAAAAAAAAAAAAlpmjeJAAk12eZXZ5p3WndnZpaUlbZgAAAAAAAAAA
+ m2lFRTw8PDZeWV1OlE0xeWlNeVVdZmmZUAAAAAAAjzYKRaysRUVFRa02SXSnYaFNTUxpTFSoTmKTAAAA
+ AI8KOkSrrKysrKxErDullF6fVWhiVakLaVWbVZoAAAAAqK2sRKZEqyCsRKummKBZT0xPTHppZVMLqVN4
+ cQAAAAA6O6sYGKYYGKsYphgELjejY09KTTZNaWdMNpkAAAAA+zc6XFxcd3d3XASmXEw6PZZiZ6g2ZUw2
+ T2QLnwAAAAAdoTtcLcV3pndfLi2jraMtcmNkT05np0xnaXhUAAAAAAD5NKL87xgYd1+eLZ06+1wAVE6o
+ p2cKZ2WjjgAAAAAAAAAQo67EcuZuj5jkACue9gAAkTEKeJfbioptRgAAAAAAAACIr0dLVwBXmEeL5Qg4
+ AAAAAOnqwNbVb9O5AAAAAAAAAP38RmDae3tfkDqIX0UAAABq3W9v6+2BtssAAAAAAAD9q6v7AFl1dV9f
+ mpgIXwAAAABrtG9v7O2BagAAAACSF52fL/AAAAAAAHUAAAAAAAAAAACC1NS+3s/ZzAAAAJ03MjqjdJ0A
+ AAC3FIMUtwAAAAAAzr27goK5awAAAAAAWaNgGho3dAAAyr+/v4ODtQAAAMmAAM+2zxMTawAAAAAAAK6z
+ kZ1xAAC1un3HVwAAAAAAAAAAawB/ftAAAAAAAABCNUIAAAAAAAAAAF8AAAAAAAAAAEcAAGpGAAAAAAAA
+ AEKsEQAAAAAAAAAAlZUAAAAAAAAAAAAAAEgAAAAAAAAAAC3hAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAA
+ AAD///////////4BwH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAA
+ AAHgAAAB4AAAAeAAAAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9
+ /s/j/P/v8///7ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AFEl
+ swBJDW0ABEMwAAJHSQAFDwIAXl9ZAHJtagBwfYQAQVNqAAFtAAAAZgAAAz0CABQ/AQAXQwAAGkAAAA8g
+ AQAhSJQAM1SRABw6fgAFVk0ADE48AAplaQAgWgIAMYcMACl7CwAOJwMAAAMtABwPNwAhIQAABxACAA9S
+ UAAnQUgAAISfACRoDAAxmwQAK4MHABMpAAA8P1kATBMbACQSVwAKL1EADS5CADFMVQABIF4AJ3CGADB2
+ kAAzdlEAMnY1ABMnEwBARooAVVq5ABgATwAWBn0ABh56AAULaQBOeKYAT3WSACpNZwAucpgAMHifADFx
+ nwA1b5YAMF93AEBalgBvjecADCLAAAkPpQAbJr4AFiLGAAAJjgAzbIEANGh8AClhgAAzfKEAMHWWADJz
+ kwAsW3MAQ4mvADyY9AAtgf8AIpr/ACuk/wBdk9UAG0tkACladQAqbI4AK3GUAC5vjwArbpEALWJ7ACdl
+ aAAOaoQAJJ20ABx0gQAeTF8AJ116ACViggAgZosAJmeJAChvlAAhZIgAH1ZyAHVmYwAaPVMAJ19+ACto
+ hgAmaIwAKGB9ACFdfAAgY4YAGU5qAFtgYQAYQVgAIVx7ACtrjgAtZYIAJmKAACNhgQAmX3wAIUpdAHp6
+ ewARN0wAH1R0ACdXcgApXnoAJ2B+ACligQAdSmAAKiopAGZlZQCRkZEAbm9vAFFSUwAWO08AJFRuACFP
+ agAhUm0AHD9RAAMKDgA3NjUAWlpaADk5OQA3NzcAPDk3AAYSGQAVNUgAFjFAAA8jLwABAgQAVQAAAP//
+ /wBWAAAA/f//AFcAAAD8//8AWAAAAPz//wBZAAAA/P//AFoAAAD9//8AWwAAAP7//wBcAAAA////AF4A
+ AAABAAAAXwAAAAEAAABgAAAAAQAAAGEAAAABAAAAYgAAAAEAAAB3IFIAbWFuAAAAAAAAAAAAAAAAAAAA
+ AAC0VWMAtFVjALwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAEAAAAAADgDAACfAQAAPwAAAAEA
+ AABAAAAAAQAAAEEAAAABAAAAQgAAAAEAAABFAAAA////AEYAAAD+//8ARwAAAP3//wBIAAAA/P//AEkA
+ AAD8//8ASgAAAPz//wBLAAAA/f//AEwAAAD///8ATQAAAAMAAABOAAAABwAAAE8AAAALAAAAUAAAABAA
+ AABRAAAAFQAAAFIAAAAZAAAAUwAAABwAAABUAAAAHgAAAFUAAAAeAAAAVgAAAB0AAABXAAAAGgAAAFgA
+ AAAWAAAAWQAAABIAAABaAAAADQAAAFsAAAAIAAAAXAAAAAQAAABeAAAA/v//AF8AAAD8//8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAI2Oj5CRkpOUlZYAAAAAAACCg4SFhoeIiYqLjAAAAAAAAAB6AHt8fX5/gIEAAAAA
+ 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
+</value>
+ </data>
+ <data name="$this.Text" xml:space="preserve">
+ <value>Error</value>
+ </data>
+ <data name="&gt;&gt;mnu_copy_log.Name" xml:space="preserve">
+ <value>mnu_copy_log</value>
+ </data>
+ <data name="&gt;&gt;mnu_copy_log.Type" xml:space="preserve">
+ <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;$this.Name" xml:space="preserve">
+ <value>ExceptionWindow</value>
+ </data>
+ <data name="&gt;&gt;$this.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/win/CS/ToolWindows/PreviewOverlay.Designer.cs b/win/CS/ToolWindows/PreviewOverlay.Designer.cs
new file mode 100644
index 000000000..0ce54f82a
--- /dev/null
+++ b/win/CS/ToolWindows/PreviewOverlay.Designer.cs
@@ -0,0 +1,143 @@
+namespace Handbrake.ToolWindows
+{
+ partial class PreviewOverlay
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PreviewOverlay));
+ this.PlayWithQT = new System.Windows.Forms.Button();
+ this.progressBar1 = new System.Windows.Forms.ProgressBar();
+ this.drp_preview = new System.Windows.Forms.ComboBox();
+ this.drp_duration = new System.Windows.Forms.ComboBox();
+ this.label1 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // PlayWithQT
+ //
+ this.PlayWithQT.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.PlayWithQT.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.PlayWithQT.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.PlayWithQT.Location = new System.Drawing.Point(347, 45);
+ this.PlayWithQT.Name = "PlayWithQT";
+ this.PlayWithQT.Size = new System.Drawing.Size(90, 22);
+ this.PlayWithQT.TabIndex = 4;
+ this.PlayWithQT.TabStop = false;
+ this.PlayWithQT.Text = "Play";
+ this.PlayWithQT.UseVisualStyleBackColor = true;
+ this.PlayWithQT.Click += new System.EventHandler(this.PlayWithQtClick);
+ //
+ // progressBar1
+ //
+ this.progressBar1.Location = new System.Drawing.Point(12, 12);
+ this.progressBar1.Name = "progressBar1";
+ this.progressBar1.Size = new System.Drawing.Size(425, 10);
+ this.progressBar1.TabIndex = 6;
+ //
+ // drp_preview
+ //
+ this.drp_preview.FormattingEnabled = true;
+ this.drp_preview.Location = new System.Drawing.Point(63, 47);
+ this.drp_preview.Name = "drp_preview";
+ this.drp_preview.Size = new System.Drawing.Size(56, 21);
+ this.drp_preview.TabIndex = 7;
+ //
+ // drp_duration
+ //
+ this.drp_duration.FormattingEnabled = true;
+ this.drp_duration.Location = new System.Drawing.Point(195, 47);
+ this.drp_duration.Name = "drp_duration";
+ this.drp_duration.Size = new System.Drawing.Size(73, 21);
+ this.drp_duration.TabIndex = 8;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(125, 50);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(64, 13);
+ this.label1.TabIndex = 9;
+ this.label1.Text = "Duration (s):";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(12, 50);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(48, 13);
+ this.label2.TabIndex = 10;
+ this.label2.Text = "Preview:";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(12, 25);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(140, 13);
+ this.label3.TabIndex = 11;
+ this.label3.Text = "Select a frame and duration:";
+ //
+ // PreviewOverlay
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(453, 80);
+ this.Controls.Add(this.label3);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.drp_duration);
+ this.Controls.Add(this.drp_preview);
+ this.Controls.Add(this.progressBar1);
+ this.Controls.Add(this.PlayWithQT);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "PreviewOverlay";
+ this.Opacity = 0.75D;
+ this.ShowIcon = false;
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "Title Scan";
+ this.TopMost = true;
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ internal System.Windows.Forms.Button PlayWithQT;
+ private System.Windows.Forms.ProgressBar progressBar1;
+ private System.Windows.Forms.ComboBox drp_preview;
+ private System.Windows.Forms.ComboBox drp_duration;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label3;
+ }
+} \ No newline at end of file
diff --git a/win/CS/ToolWindows/PreviewOverlay.cs b/win/CS/ToolWindows/PreviewOverlay.cs
new file mode 100644
index 000000000..fda971664
--- /dev/null
+++ b/win/CS/ToolWindows/PreviewOverlay.cs
@@ -0,0 +1,59 @@
+/* TitleSpecificScan.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.ToolWindows
+{
+ using System;
+ using System.Windows.Forms;
+
+ /// <summary>
+ /// Title Specific Scan
+ /// </summary>
+ public partial class PreviewOverlay : Form
+ {
+ public PreviewOverlay()
+ {
+ InitializeComponent();
+ }
+
+ /// <summary>
+ /// Gets the preview frame that the user entered.
+ /// </summary>
+ public int Preview
+ {
+ get
+ {
+ int value;
+ int.TryParse(drp_preview.SelectedItem.ToString(), out value);
+
+ return value;
+ }
+ }
+
+ /// <summary>
+ /// Gets the duration that the user entered.
+ /// </summary>
+ public int Duration
+ {
+ get
+ {
+ int value;
+ int.TryParse(drp_preview.SelectedItem.ToString(), out value);
+
+ return value;
+ }
+ }
+
+ /// <summary>
+ /// Play the video with Quicktime
+ /// </summary>
+ /// <param name="sender">The Sender</param>
+ /// <param name="e">The EventArgs</param>
+ private void PlayWithQtClick(object sender, EventArgs e)
+ {
+ this.DialogResult = DialogResult.OK;
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/ToolWindows/PreviewOverlay.resx b/win/CS/ToolWindows/PreviewOverlay.resx
new file mode 100644
index 000000000..ff217dc4f
--- /dev/null
+++ b/win/CS/ToolWindows/PreviewOverlay.resx
@@ -0,0 +1,500 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA
+ IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA
+ AACACgAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8A/wAAAAD/AAAAAIAAgICAAICAAAAAgAAAAICAAIAA
+ AACAAIAAgP//ACAgIADg4OAAIAAAAAAgAABg4CAAQOBAAGBgYAAgYAAAQKDgAAAAIABAwCAAIEAAAECg
+ AABg4AAAIGCAAECAoABgoMAAYECgAGDAAABgICAAoKCgAOAAAAAgIAAAAGAAAEDgAABgAAAAIAAgAEAg
+ IAAgQGAAIIDAAADg4ABgAGAAgOD/ACCA/wCgAAAAQGAAACCAAAAAoAAAYCAAAAAgIAAgIEAAYGBAAEBg
+ YAAAIIAAAGCAAGCAgABAAKAAAICgAACgoACAoKAAIKDAAECgwAAAAOAAQADgAADA4ABgwOAAIODgAADg
+ AADA4AAAAEAgAKDgIAAA4EAAYABAAABAYACAAGAAgCBgAGAggABA4KAAAECgAGBAwADgIOAAIEDgAACA
+ 4ADgoOAAYAD/ACBg/wAAoP8A4KD/AGD//wAICAgACAAAAAgIAAAAAJgACAAIAAAACAAACAAACBAQACA4
+ SAAgYIgAOHCIADhw+AAIGAAAEBAIACg4QAAwYHgAAACIACA4QAAoQFAAKFh4AHh4eAAwaIAAIGiQADh4
+ mAAACAgAEAgIABAYGAAgGBgASEhIABhIYAAoUGAAIFBoAChQaAAoWGgAMFhoAChoiAAweJgAKHioACiA
+ sAAIEAAACAgQAAgQGAAQGCAAGCAoABhAUAAoSFgAaGhoABhQcAAgWHAAKFhwADhgcAAYWIAAOGiAAIiI
+ iAAoaJAAKHCYACh4oAA4gKAAMICoAKioqAAwmNAAEDgAAChYAAAweAAAMIgQAAgYGAAYGBgACBggABAg
+ KAAgKCgAKCgoACAwOAA4ODgAKDhIADBQWABYWFgAGEhoADBYcAAYUHgAGFh4ACBYeAAoYHgAKGCAABhY
+ iAAgaJgAKICoACiIuAC4uLgAMJDIADiw6AAQCAAAABgAAAggAAAAOAAAMGgAABgQCAAwgAgAEAgQABgQ
+ EAAwmBgAGBggAAgYKAAAICgACCAoABgoMAAgKDAAGDBAABg4QAAYOFAAEEBYACBIWAAwSFgAOEhYACBI
+ YAAQSGgAOFhoABhIcAAoUHAAQFhwACBgeABAaIAAIGiIADBwiABAcIgAGGCQADhwkABYeJAACBCgAChw
+ oAAweKAAKIC4ACiQwAAwmMgAOKjgADBg6ABAsOgAELD4AAgoAAAIMAAAGDAAABhIAAAYUAAAKHgAAACY
+ AAAwmAAAAMgAABAACAAIEAgAEBgIABA4CAAYOAgAMHgIABAYEAAYGBAAIBgQACh4EAAwmBAAEBAYABgg
+ GAAoIBgAGCAgAAgIKAAgICgAGAgwAAggMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAn2KfdXV1XAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoo2+QIJCJb28Sd3em
+ nQAAAFuKqW0aqsd6Y5/DXAAAAAAAAAAAAAAAAAAAAAAAAAB3kAWQkG8SpqaJb28gsncAbIeSroyii21x
+ kczIwwAAAAAAAAAAAAAAAAAAAAAAAABoo4mJkLKylm9vb5BvdwwAcZO/fox7z2NjqsOss2MAWwAAAAAA
+ AAAAAAAAAAAAAAAAvaGmo5ANlgUFEiBvo1xjq3p6qMTJroBkxXt9cGzFnAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAL2ylgV3vQAAAGOvxMXXq41uh6yVjxqp1YhknwAAAAAAAAAAAAAAAAAAAAAAAAAAAABvsolbAAAA
+ +5KneouS2Kx4pZF9ndywsXuvkocAAAAAAAAAAAAAAAAAAAAAAAAAAAB3sncAAAAAdayHca95bH9+cKmv
+ fMVucG2B4MYAAAAAAAAAAAAAAAAAAAAAAAAAAAChsqMAAAAAe3VkyHF5kW59cN3eZc/XyXutyot7AAAA
+ AAAAAAAAAAAAAAAAAAAAAACjIKEAAACgfv94gX+PituLDI0/aoBxqxqOY8PgbQAAAAAAAAAAAAAAAAAA
+ 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
+ OAAABwAA//wYAAADAAD/+BgAAAMAAP/AAAAAAwAA/wAAAAADAAD8AAAAAAMAAPwAAAAAAwAA+AAAAAAD
+ AADwAAAAAAMAAPAAAAAAAwAA8AAAAAADAADwAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAQAA8AAPAA
+ ABgADwAA+AAAHgAHAAD8AAAfgAMAAP4QAA+ADwAA/gAADgADAAD8AAAfAAMAAPAfxD/ABwAA4B/n/+AB
+ AADgB+B/wB8AAOADgB+ADwAA8AOAHhAPAAD4BwB/8kcAAPz/gf/nLwAA+P/5/+8/AADwf/n//z8AAPh/
+ /P//vwAA+P////+fAAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//
+ /wAAAP8AAP//AAAAgACAgIAAgAAAAACAAAAAgIAAgIAAAECg4ABAgKAAYOAgAEDgQAAAIAAAACAgACAg
+ IABgIIAAIAAAACBAAAAAYAAAIIAAAGAgIABAYGAAAACgAGCAoACgoKAA4ODgAGDAAAAAACAAYABgAIAg
+ YAAAYMAAICAAACBgAABgYAAAQKAAAKDAAAAA4AAAYOAAAABAIAAgQCAAYAAgACBAQABgYEAAIABgACAg
+ YAAgQGAAYGBgACBggABgYIAAgACgAKCAoABgIMAAQKDAAGCgwAAgwMAAAADgAIDA4ACgwOAAAODgAIDg
+ 4ACA4AAAgIAgAEDgIACgACAAQABgAIAggAAgYP8AAKD/AAgIAAAICAgACAAAABhAWAAoUGAAaGhoADBg
+ eAAoaIgAMICoAChggAAACAgAEAgIABgYGAAoUGgAKFhwAChwkAAIGAgACBAQABAgKAAQKDgAIEhgACBQ
+ aAAAAHgAIFh4AChgeAAAeHgAeHh4AChogAAwaIAAIGCIADBoiAA4cIgAIGiQADhwkAAoeKgAKICwAAgQ
+ AAAIIAAACAAIABhICAAICBAAMIgQABAYGAAYICgAGCgwAEhISAAwSFgAGFBoAChYaAAICHgAOGiAACh4
+ oAAweKAAGAAAAAAIAAAAGAAACBgAABAoAAAYUAAAKGAAAChoAAAAeAAAAAAIAAgQCAAQEAgAGP8IACAY
+ EAAIEBgAMJAYABggIAAAACgACBAoACgwMAAAKDgAEDA4ADg4OAAoOEAAGDhIACA4SAAAQEgAMEBIAEhQ
+ UAAISFgAIEhYAChIWAAwUFgAIEhoAEhYaAAYUHAAMFhwABhYeAAoWHgAIFiAAEhwgACIiIgAGGCQAAAA
+ mAAgcJgAKHCYADB4mACYmJgAACjIAEBw+ACo//8ASAAAAFgAAABoAAAAeAAAABAIAABICAAAGCgAAAA4
+ AAAYOAAACEAAAAhIAAAoUAAAAFgAACBYAAAAaAAAIGgAADB4AAAAiAAAMIgAAGiIAACAmAAAGAAIADAI
+ CABgCAgAEBgIAAggCAAQIAgAECgIAAgwCAAQMAgAODAIABA4CAAYOAgAEEAIABhACAAgQAgAIFAIAChg
+ CAAwgAgAMJAIADCoCAAACBAAGBAQABggEAAoIBAAKGAQAChoEAAgeBAAKHgQAEh4EAAY+BAACAAYAAAI
+ GAAICBgAEAgYAAAQGAAQEBgAABgYAAgYGAAYMBgAKHgYADCYGAAwoBgAMKgYAGj/GABgCCAACBAgAAgY
+ IAAQGCAAGBggACggIABIcCAACAAoABAAKAAAECgAEBAoAAggKAAACDAASAgwAAgQMAAIKDAAECgwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAARxBSUlJHAAAAAABYWFlY8kYAAAAAAAAAAAAAAAAAAJFgqqRLSzAwBXMAkKJbW1pdSVmE
+ AAAAAAAAAAAAAAAAEJdLqhpgYKQFkf9NmVRanHVJVZRQAAAAAAAAAAAAAAAAUY6RO6qXMHNYW5MxdFpm
+ TVtPSpAAAAAAAAAAAAAAAAAAAAAFpIYAAFSeW09PU15KU05MaEkAAAAAAAAAAAAAAAAAAEtgAAAAk55j
+ ml5Mp2haXUqpW3IAAAAAAAAAAAAAAAAAS0sAAEpJoE5PpZpMZVWnMZyZVQAAAAAAAAAAAAAAAABLMAAA
+ cqCeSnppZGZKWzFNaV2ecAAAAAAAAAAAAAAAAEtLAACLVF6iZHROp2eiW1paeWnxAAAAAAAAAAAAAABI
+ GmAAAElJSmh6SWNVSk5hZqJ1VXUAAAAAAAAAAAAAlpmjeJAAk12eZXZ5p3WndnZpaUlbZgAAAAAAAAAA
+ m2lFRTw8PDZeWV1OlE0xeWlNeVVdZmmZUAAAAAAAjzYKRaysRUVFRa02SXSnYaFNTUxpTFSoTmKTAAAA
+ AI8KOkSrrKysrKxErDullF6fVWhiVakLaVWbVZoAAAAAqK2sRKZEqyCsRKummKBZT0xPTHppZVMLqVN4
+ cQAAAAA6O6sYGKYYGKsYphgELjejY09KTTZNaWdMNpkAAAAA+zc6XFxcd3d3XASmXEw6PZZiZ6g2ZUw2
+ T2QLnwAAAAAdoTtcLcV3pndfLi2jraMtcmNkT05np0xnaXhUAAAAAAD5NKL87xgYd1+eLZ06+1wAVE6o
+ p2cKZ2WjjgAAAAAAAAAQo67EcuZuj5jkACue9gAAkTEKeJfbioptRgAAAAAAAACIr0dLVwBXmEeL5Qg4
+ AAAAAOnqwNbVb9O5AAAAAAAAAP38RmDae3tfkDqIX0UAAABq3W9v6+2BtssAAAAAAAD9q6v7AFl1dV9f
+ mpgIXwAAAABrtG9v7O2BagAAAACSF52fL/AAAAAAAHUAAAAAAAAAAACC1NS+3s/ZzAAAAJ03MjqjdJ0A
+ AAC3FIMUtwAAAAAAzr27goK5awAAAAAAWaNgGho3dAAAyr+/v4ODtQAAAMmAAM+2zxMTawAAAAAAAK6z
+ kZ1xAAC1un3HVwAAAAAAAAAAawB/ftAAAAAAAABCNUIAAAAAAAAAAF8AAAAAAAAAAEcAAGpGAAAAAAAA
+ AEKsEQAAAAAAAAAAlZUAAAAAAAAAAAAAAEgAAAAAAAAAAC3hAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAA
+ AAD///////////4BwH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAA
+ AAHgAAAB4AAAAeAAAAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9
+ /s/j/P/v8///7ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AFEl
+ swBJDW0ABEMwAAJHSQAFDwIAXl9ZAHJtagBwfYQAQVNqAAFtAAAAZgAAAz0CABQ/AQAXQwAAGkAAAA8g
+ AQAhSJQAM1SRABw6fgAFVk0ADE48AAplaQAgWgIAMYcMACl7CwAOJwMAAAMtABwPNwAhIQAABxACAA9S
+ UAAnQUgAAISfACRoDAAxmwQAK4MHABMpAAA8P1kATBMbACQSVwAKL1EADS5CADFMVQABIF4AJ3CGADB2
+ kAAzdlEAMnY1ABMnEwBARooAVVq5ABgATwAWBn0ABh56AAULaQBOeKYAT3WSACpNZwAucpgAMHifADFx
+ nwA1b5YAMF93AEBalgBvjecADCLAAAkPpQAbJr4AFiLGAAAJjgAzbIEANGh8AClhgAAzfKEAMHWWADJz
+ kwAsW3MAQ4mvADyY9AAtgf8AIpr/ACuk/wBdk9UAG0tkACladQAqbI4AK3GUAC5vjwArbpEALWJ7ACdl
+ aAAOaoQAJJ20ABx0gQAeTF8AJ116ACViggAgZosAJmeJAChvlAAhZIgAH1ZyAHVmYwAaPVMAJ19+ACto
+ hgAmaIwAKGB9ACFdfAAgY4YAGU5qAFtgYQAYQVgAIVx7ACtrjgAtZYIAJmKAACNhgQAmX3wAIUpdAHp6
+ ewARN0wAH1R0ACdXcgApXnoAJ2B+ACligQAdSmAAKiopAGZlZQCRkZEAbm9vAFFSUwAWO08AJFRuACFP
+ agAhUm0AHD9RAAMKDgA3NjUAWlpaADk5OQA3NzcAPDk3AAYSGQAVNUgAFjFAAA8jLwABAgQAVQAAAP//
+ /wBWAAAA/f//AFcAAAD8//8AWAAAAPz//wBZAAAA/P//AFoAAAD9//8AWwAAAP7//wBcAAAA////AF4A
+ AAABAAAAXwAAAAEAAABgAAAAAQAAAGEAAAABAAAAYgAAAAEAAAB3IFIAbWFuAAAAAAAAAAAAAAAAAAAA
+ AAC0VWMAtFVjALwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAEAAAAAADgDAACfAQAAPwAAAAEA
+ AABAAAAAAQAAAEEAAAABAAAAQgAAAAEAAABFAAAA////AEYAAAD+//8ARwAAAP3//wBIAAAA/P//AEkA
+ AAD8//8ASgAAAPz//wBLAAAA/f//AEwAAAD///8ATQAAAAMAAABOAAAABwAAAE8AAAALAAAAUAAAABAA
+ AABRAAAAFQAAAFIAAAAZAAAAUwAAABwAAABUAAAAHgAAAFUAAAAeAAAAVgAAAB0AAABXAAAAGgAAAFgA
+ AAAWAAAAWQAAABIAAABaAAAADQAAAFsAAAAIAAAAXAAAAAQAAABeAAAA/v//AF8AAAD8//8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAI2Oj5CRkpOUlZYAAAAAAACCg4SFhoeIiYqLjAAAAAAAAAB6AHt8fX5/gIEAAAAA
+ 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
+</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/win/CS/ToolWindows/TitleSpecificScan.Designer.cs b/win/CS/ToolWindows/TitleSpecificScan.Designer.cs
new file mode 100644
index 000000000..61976f910
--- /dev/null
+++ b/win/CS/ToolWindows/TitleSpecificScan.Designer.cs
@@ -0,0 +1,121 @@
+namespace Handbrake.ToolWindows
+{
+ partial class TitleSpecificScan
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TitleSpecificScan));
+ this.label1 = new System.Windows.Forms.Label();
+ this.titleNumber = new System.Windows.Forms.TextBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.btnScan = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(12, 9);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(92, 13);
+ this.label1.TabIndex = 1;
+ this.label1.Text = "Scan title number:";
+ //
+ // titleNumber
+ //
+ this.titleNumber.Location = new System.Drawing.Point(110, 6);
+ this.titleNumber.Name = "titleNumber";
+ this.titleNumber.Size = new System.Drawing.Size(51, 20);
+ this.titleNumber.TabIndex = 2;
+ this.titleNumber.Text = "0";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(12, 29);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(309, 13);
+ this.label2.TabIndex = 3;
+ this.label2.Text = "Note: (entering 0 or leaving blank will result in a full source scan)";
+ //
+ // btnScan
+ //
+ this.btnScan.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnScan.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnScan.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btnScan.Location = new System.Drawing.Point(231, 56);
+ this.btnScan.Name = "btnScan";
+ this.btnScan.Size = new System.Drawing.Size(90, 22);
+ this.btnScan.TabIndex = 4;
+ this.btnScan.TabStop = false;
+ this.btnScan.Text = "Open Title";
+ this.btnScan.UseVisualStyleBackColor = true;
+ this.btnScan.Click += new System.EventHandler(this.BtnScanClick);
+ //
+ // btnCancel
+ //
+ this.btnCancel.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnCancel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnCancel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btnCancel.Location = new System.Drawing.Point(15, 56);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(60, 22);
+ this.btnCancel.TabIndex = 5;
+ this.btnCancel.TabStop = false;
+ this.btnCancel.Text = "Cancel";
+ this.btnCancel.UseVisualStyleBackColor = true;
+ this.btnCancel.Click += new System.EventHandler(this.BtnCancelClick);
+ //
+ // TitleSpecificScan
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(334, 89);
+ this.Controls.Add(this.btnCancel);
+ this.Controls.Add(this.btnScan);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.titleNumber);
+ this.Controls.Add(this.label1);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Name = "TitleSpecificScan";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "Title Scan";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.TextBox titleNumber;
+ private System.Windows.Forms.Label label2;
+ internal System.Windows.Forms.Button btnScan;
+ internal System.Windows.Forms.Button btnCancel;
+ }
+} \ No newline at end of file
diff --git a/win/CS/ToolWindows/TitleSpecificScan.cs b/win/CS/ToolWindows/TitleSpecificScan.cs
new file mode 100644
index 000000000..6c938342e
--- /dev/null
+++ b/win/CS/ToolWindows/TitleSpecificScan.cs
@@ -0,0 +1,55 @@
+/* TitleSpecificScan.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.ToolWindows
+{
+ using System;
+ using System.Windows.Forms;
+
+ /// <summary>
+ /// Title Specific Scan
+ /// </summary>
+ public partial class TitleSpecificScan : Form
+ {
+ public TitleSpecificScan()
+ {
+ InitializeComponent();
+ }
+
+ /// <summary>
+ /// Button Cancel Click Event Handler
+ /// </summary>
+ /// <param name="sender">The Sender</param>
+ /// <param name="e">The EventArgs</param>
+ private void BtnCancelClick(object sender, EventArgs e)
+ {
+ this.DialogResult = DialogResult.Cancel;
+ }
+
+ /// <summary>
+ /// Button Scan Click Event Handler
+ /// </summary>
+ /// <param name="sender">The Sender</param>
+ /// <param name="e">The EventArgs</param>
+ private void BtnScanClick(object sender, EventArgs e)
+ {
+ this.DialogResult = DialogResult.OK;
+ }
+
+ /// <summary>
+ /// Gets the title that the user entered.
+ /// </summary>
+ public int Title
+ {
+ get
+ {
+ int title;
+ int.TryParse(this.titleNumber.Text, out title);
+
+ return title;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/ToolWindows/TitleSpecificScan.resx b/win/CS/ToolWindows/TitleSpecificScan.resx
new file mode 100644
index 000000000..ff217dc4f
--- /dev/null
+++ b/win/CS/ToolWindows/TitleSpecificScan.resx
@@ -0,0 +1,500 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA
+ IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA
+ AACACgAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8A/wAAAAD/AAAAAIAAgICAAICAAAAAgAAAAICAAIAA
+ AACAAIAAgP//ACAgIADg4OAAIAAAAAAgAABg4CAAQOBAAGBgYAAgYAAAQKDgAAAAIABAwCAAIEAAAECg
+ AABg4AAAIGCAAECAoABgoMAAYECgAGDAAABgICAAoKCgAOAAAAAgIAAAAGAAAEDgAABgAAAAIAAgAEAg
+ IAAgQGAAIIDAAADg4ABgAGAAgOD/ACCA/wCgAAAAQGAAACCAAAAAoAAAYCAAAAAgIAAgIEAAYGBAAEBg
+ YAAAIIAAAGCAAGCAgABAAKAAAICgAACgoACAoKAAIKDAAECgwAAAAOAAQADgAADA4ABgwOAAIODgAADg
+ AADA4AAAAEAgAKDgIAAA4EAAYABAAABAYACAAGAAgCBgAGAggABA4KAAAECgAGBAwADgIOAAIEDgAACA
+ 4ADgoOAAYAD/ACBg/wAAoP8A4KD/AGD//wAICAgACAAAAAgIAAAAAJgACAAIAAAACAAACAAACBAQACA4
+ SAAgYIgAOHCIADhw+AAIGAAAEBAIACg4QAAwYHgAAACIACA4QAAoQFAAKFh4AHh4eAAwaIAAIGiQADh4
+ mAAACAgAEAgIABAYGAAgGBgASEhIABhIYAAoUGAAIFBoAChQaAAoWGgAMFhoAChoiAAweJgAKHioACiA
+ sAAIEAAACAgQAAgQGAAQGCAAGCAoABhAUAAoSFgAaGhoABhQcAAgWHAAKFhwADhgcAAYWIAAOGiAAIiI
+ iAAoaJAAKHCYACh4oAA4gKAAMICoAKioqAAwmNAAEDgAAChYAAAweAAAMIgQAAgYGAAYGBgACBggABAg
+ KAAgKCgAKCgoACAwOAA4ODgAKDhIADBQWABYWFgAGEhoADBYcAAYUHgAGFh4ACBYeAAoYHgAKGCAABhY
+ iAAgaJgAKICoACiIuAC4uLgAMJDIADiw6AAQCAAAABgAAAggAAAAOAAAMGgAABgQCAAwgAgAEAgQABgQ
+ EAAwmBgAGBggAAgYKAAAICgACCAoABgoMAAgKDAAGDBAABg4QAAYOFAAEEBYACBIWAAwSFgAOEhYACBI
+ YAAQSGgAOFhoABhIcAAoUHAAQFhwACBgeABAaIAAIGiIADBwiABAcIgAGGCQADhwkABYeJAACBCgAChw
+ oAAweKAAKIC4ACiQwAAwmMgAOKjgADBg6ABAsOgAELD4AAgoAAAIMAAAGDAAABhIAAAYUAAAKHgAAACY
+ AAAwmAAAAMgAABAACAAIEAgAEBgIABA4CAAYOAgAMHgIABAYEAAYGBAAIBgQACh4EAAwmBAAEBAYABgg
+ GAAoIBgAGCAgAAgIKAAgICgAGAgwAAggMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAn2KfdXV1XAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoo2+QIJCJb28Sd3em
+ nQAAAFuKqW0aqsd6Y5/DXAAAAAAAAAAAAAAAAAAAAAAAAAB3kAWQkG8SpqaJb28gsncAbIeSroyii21x
+ kczIwwAAAAAAAAAAAAAAAAAAAAAAAABoo4mJkLKylm9vb5BvdwwAcZO/fox7z2NjqsOss2MAWwAAAAAA
+ AAAAAAAAAAAAAAAAvaGmo5ANlgUFEiBvo1xjq3p6qMTJroBkxXt9cGzFnAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAL2ylgV3vQAAAGOvxMXXq41uh6yVjxqp1YhknwAAAAAAAAAAAAAAAAAAAAAAAAAAAABvsolbAAAA
+ +5KneouS2Kx4pZF9ndywsXuvkocAAAAAAAAAAAAAAAAAAAAAAAAAAAB3sncAAAAAdayHca95bH9+cKmv
+ fMVucG2B4MYAAAAAAAAAAAAAAAAAAAAAAAAAAAChsqMAAAAAe3VkyHF5kW59cN3eZc/XyXutyot7AAAA
+ AAAAAAAAAAAAAAAAAAAAAACjIKEAAACgfv94gX+PituLDI0/aoBxqxqOY8PgbQAAAAAAAAAAAAAAAAAA
+ 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
+ OAAABwAA//wYAAADAAD/+BgAAAMAAP/AAAAAAwAA/wAAAAADAAD8AAAAAAMAAPwAAAAAAwAA+AAAAAAD
+ AADwAAAAAAMAAPAAAAAAAwAA8AAAAAADAADwAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAQAA8AAPAA
+ ABgADwAA+AAAHgAHAAD8AAAfgAMAAP4QAA+ADwAA/gAADgADAAD8AAAfAAMAAPAfxD/ABwAA4B/n/+AB
+ AADgB+B/wB8AAOADgB+ADwAA8AOAHhAPAAD4BwB/8kcAAPz/gf/nLwAA+P/5/+8/AADwf/n//z8AAPh/
+ /P//vwAA+P////+fAAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//
+ /wAAAP8AAP//AAAAgACAgIAAgAAAAACAAAAAgIAAgIAAAECg4ABAgKAAYOAgAEDgQAAAIAAAACAgACAg
+ IABgIIAAIAAAACBAAAAAYAAAIIAAAGAgIABAYGAAAACgAGCAoACgoKAA4ODgAGDAAAAAACAAYABgAIAg
+ YAAAYMAAICAAACBgAABgYAAAQKAAAKDAAAAA4AAAYOAAAABAIAAgQCAAYAAgACBAQABgYEAAIABgACAg
+ YAAgQGAAYGBgACBggABgYIAAgACgAKCAoABgIMAAQKDAAGCgwAAgwMAAAADgAIDA4ACgwOAAAODgAIDg
+ 4ACA4AAAgIAgAEDgIACgACAAQABgAIAggAAgYP8AAKD/AAgIAAAICAgACAAAABhAWAAoUGAAaGhoADBg
+ eAAoaIgAMICoAChggAAACAgAEAgIABgYGAAoUGgAKFhwAChwkAAIGAgACBAQABAgKAAQKDgAIEhgACBQ
+ aAAAAHgAIFh4AChgeAAAeHgAeHh4AChogAAwaIAAIGCIADBoiAA4cIgAIGiQADhwkAAoeKgAKICwAAgQ
+ AAAIIAAACAAIABhICAAICBAAMIgQABAYGAAYICgAGCgwAEhISAAwSFgAGFBoAChYaAAICHgAOGiAACh4
+ oAAweKAAGAAAAAAIAAAAGAAACBgAABAoAAAYUAAAKGAAAChoAAAAeAAAAAAIAAgQCAAQEAgAGP8IACAY
+ EAAIEBgAMJAYABggIAAAACgACBAoACgwMAAAKDgAEDA4ADg4OAAoOEAAGDhIACA4SAAAQEgAMEBIAEhQ
+ UAAISFgAIEhYAChIWAAwUFgAIEhoAEhYaAAYUHAAMFhwABhYeAAoWHgAIFiAAEhwgACIiIgAGGCQAAAA
+ mAAgcJgAKHCYADB4mACYmJgAACjIAEBw+ACo//8ASAAAAFgAAABoAAAAeAAAABAIAABICAAAGCgAAAA4
+ AAAYOAAACEAAAAhIAAAoUAAAAFgAACBYAAAAaAAAIGgAADB4AAAAiAAAMIgAAGiIAACAmAAAGAAIADAI
+ CABgCAgAEBgIAAggCAAQIAgAECgIAAgwCAAQMAgAODAIABA4CAAYOAgAEEAIABhACAAgQAgAIFAIAChg
+ CAAwgAgAMJAIADCoCAAACBAAGBAQABggEAAoIBAAKGAQAChoEAAgeBAAKHgQAEh4EAAY+BAACAAYAAAI
+ GAAICBgAEAgYAAAQGAAQEBgAABgYAAgYGAAYMBgAKHgYADCYGAAwoBgAMKgYAGj/GABgCCAACBAgAAgY
+ IAAQGCAAGBggACggIABIcCAACAAoABAAKAAAECgAEBAoAAggKAAACDAASAgwAAgQMAAIKDAAECgwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAARxBSUlJHAAAAAABYWFlY8kYAAAAAAAAAAAAAAAAAAJFgqqRLSzAwBXMAkKJbW1pdSVmE
+ AAAAAAAAAAAAAAAAEJdLqhpgYKQFkf9NmVRanHVJVZRQAAAAAAAAAAAAAAAAUY6RO6qXMHNYW5MxdFpm
+ TVtPSpAAAAAAAAAAAAAAAAAAAAAFpIYAAFSeW09PU15KU05MaEkAAAAAAAAAAAAAAAAAAEtgAAAAk55j
+ ml5Mp2haXUqpW3IAAAAAAAAAAAAAAAAAS0sAAEpJoE5PpZpMZVWnMZyZVQAAAAAAAAAAAAAAAABLMAAA
+ cqCeSnppZGZKWzFNaV2ecAAAAAAAAAAAAAAAAEtLAACLVF6iZHROp2eiW1paeWnxAAAAAAAAAAAAAABI
+ GmAAAElJSmh6SWNVSk5hZqJ1VXUAAAAAAAAAAAAAlpmjeJAAk12eZXZ5p3WndnZpaUlbZgAAAAAAAAAA
+ m2lFRTw8PDZeWV1OlE0xeWlNeVVdZmmZUAAAAAAAjzYKRaysRUVFRa02SXSnYaFNTUxpTFSoTmKTAAAA
+ AI8KOkSrrKysrKxErDullF6fVWhiVakLaVWbVZoAAAAAqK2sRKZEqyCsRKummKBZT0xPTHppZVMLqVN4
+ cQAAAAA6O6sYGKYYGKsYphgELjejY09KTTZNaWdMNpkAAAAA+zc6XFxcd3d3XASmXEw6PZZiZ6g2ZUw2
+ T2QLnwAAAAAdoTtcLcV3pndfLi2jraMtcmNkT05np0xnaXhUAAAAAAD5NKL87xgYd1+eLZ06+1wAVE6o
+ p2cKZ2WjjgAAAAAAAAAQo67EcuZuj5jkACue9gAAkTEKeJfbioptRgAAAAAAAACIr0dLVwBXmEeL5Qg4
+ AAAAAOnqwNbVb9O5AAAAAAAAAP38RmDae3tfkDqIX0UAAABq3W9v6+2BtssAAAAAAAD9q6v7AFl1dV9f
+ mpgIXwAAAABrtG9v7O2BagAAAACSF52fL/AAAAAAAHUAAAAAAAAAAACC1NS+3s/ZzAAAAJ03MjqjdJ0A
+ AAC3FIMUtwAAAAAAzr27goK5awAAAAAAWaNgGho3dAAAyr+/v4ODtQAAAMmAAM+2zxMTawAAAAAAAK6z
+ kZ1xAAC1un3HVwAAAAAAAAAAawB/ftAAAAAAAABCNUIAAAAAAAAAAF8AAAAAAAAAAEcAAGpGAAAAAAAA
+ AEKsEQAAAAAAAAAAlZUAAAAAAAAAAAAAAEgAAAAAAAAAAC3hAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAA
+ AAD///////////4BwH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAA
+ AAHgAAAB4AAAAeAAAAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9
+ /s/j/P/v8///7ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AFEl
+ swBJDW0ABEMwAAJHSQAFDwIAXl9ZAHJtagBwfYQAQVNqAAFtAAAAZgAAAz0CABQ/AQAXQwAAGkAAAA8g
+ AQAhSJQAM1SRABw6fgAFVk0ADE48AAplaQAgWgIAMYcMACl7CwAOJwMAAAMtABwPNwAhIQAABxACAA9S
+ UAAnQUgAAISfACRoDAAxmwQAK4MHABMpAAA8P1kATBMbACQSVwAKL1EADS5CADFMVQABIF4AJ3CGADB2
+ kAAzdlEAMnY1ABMnEwBARooAVVq5ABgATwAWBn0ABh56AAULaQBOeKYAT3WSACpNZwAucpgAMHifADFx
+ nwA1b5YAMF93AEBalgBvjecADCLAAAkPpQAbJr4AFiLGAAAJjgAzbIEANGh8AClhgAAzfKEAMHWWADJz
+ kwAsW3MAQ4mvADyY9AAtgf8AIpr/ACuk/wBdk9UAG0tkACladQAqbI4AK3GUAC5vjwArbpEALWJ7ACdl
+ aAAOaoQAJJ20ABx0gQAeTF8AJ116ACViggAgZosAJmeJAChvlAAhZIgAH1ZyAHVmYwAaPVMAJ19+ACto
+ hgAmaIwAKGB9ACFdfAAgY4YAGU5qAFtgYQAYQVgAIVx7ACtrjgAtZYIAJmKAACNhgQAmX3wAIUpdAHp6
+ ewARN0wAH1R0ACdXcgApXnoAJ2B+ACligQAdSmAAKiopAGZlZQCRkZEAbm9vAFFSUwAWO08AJFRuACFP
+ agAhUm0AHD9RAAMKDgA3NjUAWlpaADk5OQA3NzcAPDk3AAYSGQAVNUgAFjFAAA8jLwABAgQAVQAAAP//
+ /wBWAAAA/f//AFcAAAD8//8AWAAAAPz//wBZAAAA/P//AFoAAAD9//8AWwAAAP7//wBcAAAA////AF4A
+ AAABAAAAXwAAAAEAAABgAAAAAQAAAGEAAAABAAAAYgAAAAEAAAB3IFIAbWFuAAAAAAAAAAAAAAAAAAAA
+ AAC0VWMAtFVjALwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAEAAAAAADgDAACfAQAAPwAAAAEA
+ AABAAAAAAQAAAEEAAAABAAAAQgAAAAEAAABFAAAA////AEYAAAD+//8ARwAAAP3//wBIAAAA/P//AEkA
+ AAD8//8ASgAAAPz//wBLAAAA/f//AEwAAAD///8ATQAAAAMAAABOAAAABwAAAE8AAAALAAAAUAAAABAA
+ AABRAAAAFQAAAFIAAAAZAAAAUwAAABwAAABUAAAAHgAAAFUAAAAeAAAAVgAAAB0AAABXAAAAGgAAAFgA
+ AAAWAAAAWQAAABIAAABaAAAADQAAAFsAAAAIAAAAXAAAAAQAAABeAAAA/v//AF8AAAD8//8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAI2Oj5CRkpOUlZYAAAAAAACCg4SFhoeIiYqLjAAAAAAAAAB6AHt8fX5/gIEAAAAA
+ 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
+</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/win/CS/ToolWindows/UpdateInfo.Designer.cs b/win/CS/ToolWindows/UpdateInfo.Designer.cs
new file mode 100644
index 000000000..9e0aa0d65
--- /dev/null
+++ b/win/CS/ToolWindows/UpdateInfo.Designer.cs
@@ -0,0 +1,241 @@
+/* frmUpdater.Designer.cs
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.ToolWindows
+{
+ partial class UpdateInfo
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UpdateInfo));
+ this.label1 = new System.Windows.Forms.Label();
+ this.label6 = new System.Windows.Forms.Label();
+ this.btn_skip = new System.Windows.Forms.Button();
+ this.btn_installUpdate = new System.Windows.Forms.Button();
+ this.btn_remindLater = new System.Windows.Forms.Button();
+ this.label3 = new System.Windows.Forms.Label();
+ this.lbl_update_text = new System.Windows.Forms.Label();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.panel2 = new System.Windows.Forms.Panel();
+ this.PictureBox1 = new System.Windows.Forms.PictureBox();
+ this.statusStrip1 = new System.Windows.Forms.StatusStrip();
+ this.panel3 = new System.Windows.Forms.Panel();
+ this.panel5 = new System.Windows.Forms.Panel();
+ this.wBrowser = new System.Windows.Forms.WebBrowser();
+ this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+ this.button_container = new System.Windows.Forms.SplitContainer();
+ this.panel1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
+ this.splitContainer1.Panel1.SuspendLayout();
+ this.splitContainer1.Panel2.SuspendLayout();
+ this.splitContainer1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.button_container)).BeginInit();
+ this.button_container.Panel1.SuspendLayout();
+ this.button_container.Panel2.SuspendLayout();
+ this.button_container.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ resources.ApplyResources(this.label1, "label1");
+ this.label1.Name = "label1";
+ //
+ // label6
+ //
+ resources.ApplyResources(this.label6, "label6");
+ this.label6.Name = "label6";
+ //
+ // btn_skip
+ //
+ resources.ApplyResources(this.btn_skip, "btn_skip");
+ this.btn_skip.BackColor = System.Drawing.Color.Transparent;
+ this.btn_skip.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btn_skip.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_skip.Name = "btn_skip";
+ this.btn_skip.UseVisualStyleBackColor = false;
+ this.btn_skip.Click += new System.EventHandler(this.BtnSkipClick);
+ //
+ // btn_installUpdate
+ //
+ resources.ApplyResources(this.btn_installUpdate, "btn_installUpdate");
+ this.btn_installUpdate.BackColor = System.Drawing.Color.Transparent;
+ this.btn_installUpdate.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btn_installUpdate.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_installUpdate.Name = "btn_installUpdate";
+ this.btn_installUpdate.UseVisualStyleBackColor = false;
+ this.btn_installUpdate.Click += new System.EventHandler(this.BtnInstallUpdateClick);
+ //
+ // btn_remindLater
+ //
+ resources.ApplyResources(this.btn_remindLater, "btn_remindLater");
+ this.btn_remindLater.BackColor = System.Drawing.Color.Transparent;
+ this.btn_remindLater.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btn_remindLater.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_remindLater.Name = "btn_remindLater";
+ this.btn_remindLater.UseVisualStyleBackColor = false;
+ this.btn_remindLater.Click += new System.EventHandler(this.BtnRemindLaterClick);
+ //
+ // label3
+ //
+ resources.ApplyResources(this.label3, "label3");
+ this.label3.Name = "label3";
+ //
+ // lbl_update_text
+ //
+ resources.ApplyResources(this.lbl_update_text, "lbl_update_text");
+ this.lbl_update_text.Name = "lbl_update_text";
+ //
+ // panel1
+ //
+ this.panel1.BackColor = System.Drawing.Color.White;
+ this.panel1.Controls.Add(this.panel2);
+ this.panel1.Controls.Add(this.PictureBox1);
+ this.panel1.Controls.Add(this.label3);
+ this.panel1.Controls.Add(this.label1);
+ this.panel1.Controls.Add(this.lbl_update_text);
+ this.panel1.Controls.Add(this.label6);
+ resources.ApplyResources(this.panel1, "panel1");
+ this.panel1.Name = "panel1";
+ //
+ // panel2
+ //
+ this.panel2.BackColor = System.Drawing.SystemColors.Control;
+ resources.ApplyResources(this.panel2, "panel2");
+ this.panel2.MaximumSize = new System.Drawing.Size(0, 10);
+ this.panel2.MinimumSize = new System.Drawing.Size(0, 10);
+ this.panel2.Name = "panel2";
+ //
+ // PictureBox1
+ //
+ this.PictureBox1.Image = global::Handbrake.Properties.Resources.logo64;
+ resources.ApplyResources(this.PictureBox1, "PictureBox1");
+ this.PictureBox1.Name = "PictureBox1";
+ this.PictureBox1.TabStop = false;
+ //
+ // statusStrip1
+ //
+ resources.ApplyResources(this.statusStrip1, "statusStrip1");
+ this.statusStrip1.Name = "statusStrip1";
+ //
+ // panel3
+ //
+ resources.ApplyResources(this.panel3, "panel3");
+ this.panel3.Name = "panel3";
+ //
+ // panel5
+ //
+ resources.ApplyResources(this.panel5, "panel5");
+ this.panel5.Name = "panel5";
+ //
+ // wBrowser
+ //
+ resources.ApplyResources(this.wBrowser, "wBrowser");
+ this.wBrowser.MinimumSize = new System.Drawing.Size(20, 20);
+ this.wBrowser.Name = "wBrowser";
+ //
+ // splitContainer1
+ //
+ resources.ApplyResources(this.splitContainer1, "splitContainer1");
+ this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+ this.splitContainer1.Name = "splitContainer1";
+ //
+ // splitContainer1.Panel1
+ //
+ this.splitContainer1.Panel1.Controls.Add(this.wBrowser);
+ //
+ // splitContainer1.Panel2
+ //
+ this.splitContainer1.Panel2.Controls.Add(this.button_container);
+ //
+ // button_container
+ //
+ resources.ApplyResources(this.button_container, "button_container");
+ this.button_container.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+ this.button_container.Name = "button_container";
+ //
+ // button_container.Panel1
+ //
+ this.button_container.Panel1.Controls.Add(this.btn_skip);
+ //
+ // button_container.Panel2
+ //
+ this.button_container.Panel2.Controls.Add(this.btn_remindLater);
+ this.button_container.Panel2.Controls.Add(this.btn_installUpdate);
+ //
+ // UpdateInfo
+ //
+ resources.ApplyResources(this, "$this");
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.splitContainer1);
+ this.Controls.Add(this.panel5);
+ this.Controls.Add(this.panel3);
+ this.Controls.Add(this.statusStrip1);
+ this.Controls.Add(this.panel1);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
+ this.MaximizeBox = false;
+ this.Name = "UpdateInfo";
+ this.panel1.ResumeLayout(false);
+ this.panel1.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).EndInit();
+ this.splitContainer1.Panel1.ResumeLayout(false);
+ this.splitContainer1.Panel2.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
+ this.splitContainer1.ResumeLayout(false);
+ this.button_container.Panel1.ResumeLayout(false);
+ this.button_container.Panel1.PerformLayout();
+ this.button_container.Panel2.ResumeLayout(false);
+ this.button_container.Panel2.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.button_container)).EndInit();
+ this.button_container.ResumeLayout(false);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ internal System.Windows.Forms.PictureBox PictureBox1;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label label6;
+ internal System.Windows.Forms.Button btn_skip;
+ internal System.Windows.Forms.Button btn_installUpdate;
+ internal System.Windows.Forms.Button btn_remindLater;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Label lbl_update_text;
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.StatusStrip statusStrip1;
+ private System.Windows.Forms.Panel panel3;
+ private System.Windows.Forms.Panel panel5;
+ private System.Windows.Forms.WebBrowser wBrowser;
+ private System.Windows.Forms.SplitContainer splitContainer1;
+ private System.Windows.Forms.SplitContainer button_container;
+ private System.Windows.Forms.Panel panel2;
+ }
+} \ No newline at end of file
diff --git a/win/CS/ToolWindows/UpdateInfo.cs b/win/CS/ToolWindows/UpdateInfo.cs
new file mode 100644
index 000000000..f86b0dbd7
--- /dev/null
+++ b/win/CS/ToolWindows/UpdateInfo.cs
@@ -0,0 +1,125 @@
+/* UpdateInfo.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake.ToolWindows
+{
+ using System;
+ using System.Windows.Forms;
+
+ using HandBrake.ApplicationServices.Model.General;
+
+ /// <summary>
+ /// A window to display update information.
+ /// </summary>
+ public partial class UpdateInfo : Form
+ {
+ /// <summary>
+ /// An instance of the Appcast Reader
+ /// </summary>
+ private readonly UpdateCheckInformation appcast;
+
+ /// <summary>
+ /// The Current Version
+ /// </summary>
+ private readonly string currentVersion;
+
+ /// <summary>
+ /// The Current Build
+ /// </summary>
+ private readonly string currentBuild;
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="UpdateInfo"/> class.
+ /// </summary>
+ /// <param name="reader">
+ /// The appcast reader.
+ /// </param>
+ /// <param name="currentVersion">
+ /// The current Version.
+ /// </param>
+ /// <param name="currentBuild">
+ /// The current Build.
+ /// </param>
+ public UpdateInfo(UpdateCheckInformation reader, string currentVersion, string currentBuild)
+ {
+ InitializeComponent();
+
+ appcast = reader;
+ this.currentVersion = currentVersion;
+ this.currentBuild = currentBuild;
+ GetRss();
+ SetVersions();
+ }
+
+ /// <summary>
+ /// Gets the SkipVersion number
+ /// </summary>
+ public int SkipVersion { get; private set; }
+
+
+ /// <summary>
+ /// Get the RSS feed
+ /// </summary>
+ private void GetRss()
+ {
+ wBrowser.Url = appcast.DescriptionUrl;
+ }
+
+ /// <summary>
+ /// Set the versions
+ /// </summary>
+ private void SetVersions()
+ {
+ string old = string.Format("(You have: {0} / {1})", this.currentVersion, this.currentBuild);
+ string newBuild = appcast.Version.Trim() + " (" + appcast.Build + ")";
+ lbl_update_text.Text = string.Format("HandBrake {0} is now available. {1}", newBuild, old);
+ }
+
+ /// <summary>
+ /// Handle the Install Update button click event.
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The EventArgs.
+ /// </param>
+ private void BtnInstallUpdateClick(object sender, EventArgs e)
+ {
+ DownloadUpdate download = new DownloadUpdate(appcast.DownloadFile);
+ download.ShowDialog();
+ this.DialogResult = DialogResult.OK;
+ }
+
+ /// <summary>
+ /// Handle the Remind Later button click event
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The EventArgs.
+ /// </param>
+ private void BtnRemindLaterClick(object sender, EventArgs e)
+ {
+ this.DialogResult = DialogResult.Cancel;
+ }
+
+ /// <summary>
+ /// Handle the Skip update button click event
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void BtnSkipClick(object sender, EventArgs e)
+ {
+ this.SkipVersion = int.Parse(appcast.Build);
+ this.DialogResult = DialogResult.OK;
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/ToolWindows/UpdateInfo.resx b/win/CS/ToolWindows/UpdateInfo.resx
new file mode 100644
index 000000000..4503c923b
--- /dev/null
+++ b/win/CS/ToolWindows/UpdateInfo.resx
@@ -0,0 +1,1021 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <data name="label1.AutoSize" type="System.Boolean, mscorlib">
+ <value>True</value>
+ </data>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="label1.Font" type="System.Drawing.Font, System.Drawing">
+ <value>Tahoma, 9.75pt, style=Bold</value>
+ </data>
+ <data name="label1.Location" type="System.Drawing.Point, System.Drawing">
+ <value>84, 12</value>
+ </data>
+ <data name="label1.Size" type="System.Drawing.Size, System.Drawing">
+ <value>273, 16</value>
+ </data>
+ <data name="label1.TabIndex" type="System.Int32, mscorlib">
+ <value>25</value>
+ </data>
+ <data name="label1.Text" xml:space="preserve">
+ <value>A New Version of Handbrake is available!</value>
+ </data>
+ <data name="&gt;&gt;label1.Name" xml:space="preserve">
+ <value>label1</value>
+ </data>
+ <data name="&gt;&gt;label1.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;label1.Parent" xml:space="preserve">
+ <value>panel1</value>
+ </data>
+ <data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
+ <value>3</value>
+ </data>
+ <data name="label6.AutoSize" type="System.Boolean, mscorlib">
+ <value>True</value>
+ </data>
+ <data name="label6.Location" type="System.Drawing.Point, System.Drawing">
+ <value>84, 46</value>
+ </data>
+ <data name="label6.Size" type="System.Drawing.Size, System.Drawing">
+ <value>175, 13</value>
+ </data>
+ <data name="label6.TabIndex" type="System.Int32, mscorlib">
+ <value>30</value>
+ </data>
+ <data name="label6.Text" xml:space="preserve">
+ <value>Would you like to download it now?</value>
+ </data>
+ <data name="&gt;&gt;label6.Name" xml:space="preserve">
+ <value>label6</value>
+ </data>
+ <data name="&gt;&gt;label6.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;label6.Parent" xml:space="preserve">
+ <value>panel1</value>
+ </data>
+ <data name="&gt;&gt;label6.ZOrder" xml:space="preserve">
+ <value>5</value>
+ </data>
+ <data name="btn_skip.AutoSize" type="System.Boolean, mscorlib">
+ <value>True</value>
+ </data>
+ <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <data name="btn_skip.AutoSizeMode" type="System.Windows.Forms.AutoSizeMode, System.Windows.Forms">
+ <value>GrowAndShrink</value>
+ </data>
+ <data name="btn_skip.Font" type="System.Drawing.Font, System.Drawing">
+ <value>Verdana, 8.25pt, style=Bold</value>
+ </data>
+ <data name="btn_skip.Location" type="System.Drawing.Point, System.Drawing">
+ <value>0, 3</value>
+ </data>
+ <data name="btn_skip.Size" type="System.Drawing.Size, System.Drawing">
+ <value>129, 23</value>
+ </data>
+ <data name="btn_skip.TabIndex" type="System.Int32, mscorlib">
+ <value>54</value>
+ </data>
+ <data name="btn_skip.Text" xml:space="preserve">
+ <value>Skip This Version</value>
+ </data>
+ <data name="&gt;&gt;btn_skip.Name" xml:space="preserve">
+ <value>btn_skip</value>
+ </data>
+ <data name="&gt;&gt;btn_skip.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;btn_skip.Parent" xml:space="preserve">
+ <value>button_container.Panel1</value>
+ </data>
+ <data name="&gt;&gt;btn_skip.ZOrder" xml:space="preserve">
+ <value>0</value>
+ </data>
+ <data name="btn_installUpdate.AutoSize" type="System.Boolean, mscorlib">
+ <value>True</value>
+ </data>
+ <data name="btn_installUpdate.AutoSizeMode" type="System.Windows.Forms.AutoSizeMode, System.Windows.Forms">
+ <value>GrowAndShrink</value>
+ </data>
+ <data name="btn_installUpdate.Font" type="System.Drawing.Font, System.Drawing">
+ <value>Verdana, 8.25pt, style=Bold</value>
+ </data>
+ <data name="btn_installUpdate.Location" type="System.Drawing.Point, System.Drawing">
+ <value>153, 3</value>
+ </data>
+ <data name="btn_installUpdate.Size" type="System.Drawing.Size, System.Drawing">
+ <value>109, 23</value>
+ </data>
+ <data name="btn_installUpdate.TabIndex" type="System.Int32, mscorlib">
+ <value>55</value>
+ </data>
+ <data name="btn_installUpdate.Text" xml:space="preserve">
+ <value>Install Update</value>
+ </data>
+ <data name="&gt;&gt;btn_installUpdate.Name" xml:space="preserve">
+ <value>btn_installUpdate</value>
+ </data>
+ <data name="&gt;&gt;btn_installUpdate.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;btn_installUpdate.Parent" xml:space="preserve">
+ <value>button_container.Panel2</value>
+ </data>
+ <data name="&gt;&gt;btn_installUpdate.ZOrder" xml:space="preserve">
+ <value>1</value>
+ </data>
+ <data name="btn_remindLater.AutoSize" type="System.Boolean, mscorlib">
+ <value>True</value>
+ </data>
+ <data name="btn_remindLater.AutoSizeMode" type="System.Windows.Forms.AutoSizeMode, System.Windows.Forms">
+ <value>GrowAndShrink</value>
+ </data>
+ <data name="btn_remindLater.Font" type="System.Drawing.Font, System.Drawing">
+ <value>Verdana, 8.25pt, style=Bold</value>
+ </data>
+ <data name="btn_remindLater.Location" type="System.Drawing.Point, System.Drawing">
+ <value>19, 3</value>
+ </data>
+ <data name="btn_remindLater.Size" type="System.Drawing.Size, System.Drawing">
+ <value>127, 23</value>
+ </data>
+ <data name="btn_remindLater.TabIndex" type="System.Int32, mscorlib">
+ <value>56</value>
+ </data>
+ <data name="btn_remindLater.Text" xml:space="preserve">
+ <value>Remind me Later</value>
+ </data>
+ <data name="&gt;&gt;btn_remindLater.Name" xml:space="preserve">
+ <value>btn_remindLater</value>
+ </data>
+ <data name="&gt;&gt;btn_remindLater.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;btn_remindLater.Parent" xml:space="preserve">
+ <value>button_container.Panel2</value>
+ </data>
+ <data name="&gt;&gt;btn_remindLater.ZOrder" xml:space="preserve">
+ <value>0</value>
+ </data>
+ <data name="label3.AutoSize" type="System.Boolean, mscorlib">
+ <value>True</value>
+ </data>
+ <data name="label3.Font" type="System.Drawing.Font, System.Drawing">
+ <value>Tahoma, 8.25pt, style=Bold</value>
+ </data>
+ <data name="label3.Location" type="System.Drawing.Point, System.Drawing">
+ <value>84, 63</value>
+ </data>
+ <data name="label3.Size" type="System.Drawing.Size, System.Drawing">
+ <value>90, 13</value>
+ </data>
+ <data name="label3.TabIndex" type="System.Int32, mscorlib">
+ <value>57</value>
+ </data>
+ <data name="label3.Text" xml:space="preserve">
+ <value>Release Notes:</value>
+ </data>
+ <data name="&gt;&gt;label3.Name" xml:space="preserve">
+ <value>label3</value>
+ </data>
+ <data name="&gt;&gt;label3.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;label3.Parent" xml:space="preserve">
+ <value>panel1</value>
+ </data>
+ <data name="&gt;&gt;label3.ZOrder" xml:space="preserve">
+ <value>2</value>
+ </data>
+ <data name="lbl_update_text.AutoSize" type="System.Boolean, mscorlib">
+ <value>True</value>
+ </data>
+ <data name="lbl_update_text.Location" type="System.Drawing.Point, System.Drawing">
+ <value>84, 33</value>
+ </data>
+ <data name="lbl_update_text.Size" type="System.Drawing.Size, System.Drawing">
+ <value>409, 13</value>
+ </data>
+ <data name="lbl_update_text.TabIndex" type="System.Int32, mscorlib">
+ <value>58</value>
+ </data>
+ <data name="lbl_update_text.Text" xml:space="preserve">
+ <value>HandBrake {0.0.0} (000000000) is now available. (You have: {0.0.0} (000000000))</value>
+ </data>
+ <data name="&gt;&gt;lbl_update_text.Name" xml:space="preserve">
+ <value>lbl_update_text</value>
+ </data>
+ <data name="&gt;&gt;lbl_update_text.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;lbl_update_text.Parent" xml:space="preserve">
+ <value>panel1</value>
+ </data>
+ <data name="&gt;&gt;lbl_update_text.ZOrder" xml:space="preserve">
+ <value>4</value>
+ </data>
+ <data name="panel2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+ <value>Bottom</value>
+ </data>
+ <data name="panel2.Location" type="System.Drawing.Point, System.Drawing">
+ <value>0, 87</value>
+ </data>
+ <data name="panel2.Size" type="System.Drawing.Size, System.Drawing">
+ <value>710, 10</value>
+ </data>
+ <data name="panel2.TabIndex" type="System.Int32, mscorlib">
+ <value>59</value>
+ </data>
+ <data name="&gt;&gt;panel2.Name" xml:space="preserve">
+ <value>panel2</value>
+ </data>
+ <data name="&gt;&gt;panel2.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;panel2.Parent" xml:space="preserve">
+ <value>panel1</value>
+ </data>
+ <data name="&gt;&gt;panel2.ZOrder" xml:space="preserve">
+ <value>0</value>
+ </data>
+ <data name="PictureBox1.InitialImage" type="System.Resources.ResXNullRef, System.Windows.Forms">
+ <value />
+ </data>
+ <data name="PictureBox1.Location" type="System.Drawing.Point, System.Drawing">
+ <value>12, 12</value>
+ </data>
+ <data name="PictureBox1.Size" type="System.Drawing.Size, System.Drawing">
+ <value>64, 64</value>
+ </data>
+ <data name="PictureBox1.TabIndex" type="System.Int32, mscorlib">
+ <value>24</value>
+ </data>
+ <data name="&gt;&gt;PictureBox1.Name" xml:space="preserve">
+ <value>PictureBox1</value>
+ </data>
+ <data name="&gt;&gt;PictureBox1.Type" xml:space="preserve">
+ <value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;PictureBox1.Parent" xml:space="preserve">
+ <value>panel1</value>
+ </data>
+ <data name="&gt;&gt;PictureBox1.ZOrder" xml:space="preserve">
+ <value>1</value>
+ </data>
+ <data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+ <value>Top</value>
+ </data>
+ <data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
+ <value>0, 0</value>
+ </data>
+ <data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
+ <value>710, 97</value>
+ </data>
+ <data name="panel1.TabIndex" type="System.Int32, mscorlib">
+ <value>60</value>
+ </data>
+ <data name="&gt;&gt;panel1.Name" xml:space="preserve">
+ <value>panel1</value>
+ </data>
+ <data name="&gt;&gt;panel1.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;panel1.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name="&gt;&gt;panel1.ZOrder" xml:space="preserve">
+ <value>4</value>
+ </data>
+ <metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+ <data name="statusStrip1.Location" type="System.Drawing.Point, System.Drawing">
+ <value>0, 346</value>
+ </data>
+ <data name="statusStrip1.Size" type="System.Drawing.Size, System.Drawing">
+ <value>710, 22</value>
+ </data>
+ <data name="statusStrip1.TabIndex" type="System.Int32, mscorlib">
+ <value>65</value>
+ </data>
+ <data name="statusStrip1.Text" xml:space="preserve">
+ <value>statusStrip1</value>
+ </data>
+ <data name="&gt;&gt;statusStrip1.Name" xml:space="preserve">
+ <value>statusStrip1</value>
+ </data>
+ <data name="&gt;&gt;statusStrip1.Type" xml:space="preserve">
+ <value>System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;statusStrip1.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name="&gt;&gt;statusStrip1.ZOrder" xml:space="preserve">
+ <value>3</value>
+ </data>
+ <data name="panel3.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+ <value>Left</value>
+ </data>
+ <data name="panel3.Location" type="System.Drawing.Point, System.Drawing">
+ <value>0, 97</value>
+ </data>
+ <data name="panel3.Size" type="System.Drawing.Size, System.Drawing">
+ <value>87, 249</value>
+ </data>
+ <data name="panel3.TabIndex" type="System.Int32, mscorlib">
+ <value>67</value>
+ </data>
+ <data name="&gt;&gt;panel3.Name" xml:space="preserve">
+ <value>panel3</value>
+ </data>
+ <data name="&gt;&gt;panel3.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;panel3.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name="&gt;&gt;panel3.ZOrder" xml:space="preserve">
+ <value>2</value>
+ </data>
+ <data name="panel5.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+ <value>Right</value>
+ </data>
+ <data name="panel5.Location" type="System.Drawing.Point, System.Drawing">
+ <value>681, 97</value>
+ </data>
+ <data name="panel5.Size" type="System.Drawing.Size, System.Drawing">
+ <value>29, 249</value>
+ </data>
+ <data name="panel5.TabIndex" type="System.Int32, mscorlib">
+ <value>68</value>
+ </data>
+ <data name="&gt;&gt;panel5.Name" xml:space="preserve">
+ <value>panel5</value>
+ </data>
+ <data name="&gt;&gt;panel5.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;panel5.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name="&gt;&gt;panel5.ZOrder" xml:space="preserve">
+ <value>1</value>
+ </data>
+ <data name="wBrowser.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+ <value>Fill</value>
+ </data>
+ <data name="wBrowser.Location" type="System.Drawing.Point, System.Drawing">
+ <value>0, 0</value>
+ </data>
+ <data name="wBrowser.Size" type="System.Drawing.Size, System.Drawing">
+ <value>594, 203</value>
+ </data>
+ <data name="wBrowser.TabIndex" type="System.Int32, mscorlib">
+ <value>31</value>
+ </data>
+ <data name="&gt;&gt;wBrowser.Name" xml:space="preserve">
+ <value>wBrowser</value>
+ </data>
+ <data name="&gt;&gt;wBrowser.Type" xml:space="preserve">
+ <value>System.Windows.Forms.WebBrowser, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;wBrowser.Parent" xml:space="preserve">
+ <value>splitContainer1.Panel1</value>
+ </data>
+ <data name="&gt;&gt;wBrowser.ZOrder" xml:space="preserve">
+ <value>0</value>
+ </data>
+ <data name="splitContainer1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+ <value>Fill</value>
+ </data>
+ <data name="splitContainer1.Location" type="System.Drawing.Point, System.Drawing">
+ <value>87, 97</value>
+ </data>
+ <data name="splitContainer1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
+ <value>0, 0, 0, 0</value>
+ </data>
+ <data name="splitContainer1.Orientation" type="System.Windows.Forms.Orientation, System.Windows.Forms">
+ <value>Horizontal</value>
+ </data>
+ <data name="&gt;&gt;splitContainer1.Panel1.Name" xml:space="preserve">
+ <value>splitContainer1.Panel1</value>
+ </data>
+ <data name="&gt;&gt;splitContainer1.Panel1.Type" xml:space="preserve">
+ <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;splitContainer1.Panel1.Parent" xml:space="preserve">
+ <value>splitContainer1</value>
+ </data>
+ <data name="&gt;&gt;splitContainer1.Panel1.ZOrder" xml:space="preserve">
+ <value>0</value>
+ </data>
+ <data name="button_container.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+ <value>Fill</value>
+ </data>
+ <data name="button_container.Location" type="System.Drawing.Point, System.Drawing">
+ <value>0, 0</value>
+ </data>
+ <data name="&gt;&gt;button_container.Panel1.Name" xml:space="preserve">
+ <value>button_container.Panel1</value>
+ </data>
+ <data name="&gt;&gt;button_container.Panel1.Type" xml:space="preserve">
+ <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;button_container.Panel1.Parent" xml:space="preserve">
+ <value>button_container</value>
+ </data>
+ <data name="&gt;&gt;button_container.Panel1.ZOrder" xml:space="preserve">
+ <value>0</value>
+ </data>
+ <data name="&gt;&gt;button_container.Panel2.Name" xml:space="preserve">
+ <value>button_container.Panel2</value>
+ </data>
+ <data name="&gt;&gt;button_container.Panel2.Type" xml:space="preserve">
+ <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;button_container.Panel2.Parent" xml:space="preserve">
+ <value>button_container</value>
+ </data>
+ <data name="&gt;&gt;button_container.Panel2.ZOrder" xml:space="preserve">
+ <value>1</value>
+ </data>
+ <data name="button_container.Size" type="System.Drawing.Size, System.Drawing">
+ <value>594, 42</value>
+ </data>
+ <data name="button_container.SplitterDistance" type="System.Int32, mscorlib">
+ <value>318</value>
+ </data>
+ <data name="button_container.TabIndex" type="System.Int32, mscorlib">
+ <value>0</value>
+ </data>
+ <data name="&gt;&gt;button_container.Name" xml:space="preserve">
+ <value>button_container</value>
+ </data>
+ <data name="&gt;&gt;button_container.Type" xml:space="preserve">
+ <value>System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;button_container.Parent" xml:space="preserve">
+ <value>splitContainer1.Panel2</value>
+ </data>
+ <data name="&gt;&gt;button_container.ZOrder" xml:space="preserve">
+ <value>0</value>
+ </data>
+ <data name="&gt;&gt;splitContainer1.Panel2.Name" xml:space="preserve">
+ <value>splitContainer1.Panel2</value>
+ </data>
+ <data name="&gt;&gt;splitContainer1.Panel2.Type" xml:space="preserve">
+ <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;splitContainer1.Panel2.Parent" xml:space="preserve">
+ <value>splitContainer1</value>
+ </data>
+ <data name="&gt;&gt;splitContainer1.Panel2.ZOrder" xml:space="preserve">
+ <value>1</value>
+ </data>
+ <data name="splitContainer1.Size" type="System.Drawing.Size, System.Drawing">
+ <value>594, 249</value>
+ </data>
+ <data name="splitContainer1.SplitterDistance" type="System.Int32, mscorlib">
+ <value>203</value>
+ </data>
+ <data name="splitContainer1.TabIndex" type="System.Int32, mscorlib">
+ <value>69</value>
+ </data>
+ <data name="&gt;&gt;splitContainer1.Name" xml:space="preserve">
+ <value>splitContainer1</value>
+ </data>
+ <data name="&gt;&gt;splitContainer1.Type" xml:space="preserve">
+ <value>System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;splitContainer1.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name="&gt;&gt;splitContainer1.ZOrder" xml:space="preserve">
+ <value>0</value>
+ </data>
+ <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <value>True</value>
+ </metadata>
+ <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
+ <value>6, 13</value>
+ </data>
+ <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
+ <value>710, 368</value>
+ </data>
+ <data name="$this.Font" type="System.Drawing.Font, System.Drawing">
+ <value>Tahoma, 8.25pt</value>
+ </data>
+ <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA
+ IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA
+ AACACgAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8A/wAAAAD/AAAAAIAAgICAAICAAAAAgAAAAICAAIAA
+ AACAAIAAgP//ACAgIADg4OAAIAAAAAAgAABg4CAAQOBAAGBgYAAgYAAAQKDgAAAAIABAwCAAIEAAAECg
+ AABg4AAAIGCAAECAoABgoMAAYECgAGDAAABgICAAoKCgAOAAAAAgIAAAAGAAAEDgAABgAAAAIAAgAEAg
+ IAAgQGAAIIDAAADg4ABgAGAAgOD/ACCA/wCgAAAAQGAAACCAAAAAoAAAYCAAAAAgIAAgIEAAYGBAAEBg
+ YAAAIIAAAGCAAGCAgABAAKAAAICgAACgoACAoKAAIKDAAECgwAAAAOAAQADgAADA4ABgwOAAIODgAADg
+ AADA4AAAAEAgAKDgIAAA4EAAYABAAABAYACAAGAAgCBgAGAggABA4KAAAECgAGBAwADgIOAAIEDgAACA
+ 4ADgoOAAYAD/ACBg/wAAoP8A4KD/AGD//wAICAgACAAAAAgIAAAAAJgACAAIAAAACAAACAAACBAQACA4
+ SAAgYIgAOHCIADhw+AAIGAAAEBAIACg4QAAwYHgAAACIACA4QAAoQFAAKFh4AHh4eAAwaIAAIGiQADh4
+ mAAACAgAEAgIABAYGAAgGBgASEhIABhIYAAoUGAAIFBoAChQaAAoWGgAMFhoAChoiAAweJgAKHioACiA
+ sAAIEAAACAgQAAgQGAAQGCAAGCAoABhAUAAoSFgAaGhoABhQcAAgWHAAKFhwADhgcAAYWIAAOGiAAIiI
+ iAAoaJAAKHCYACh4oAA4gKAAMICoAKioqAAwmNAAEDgAAChYAAAweAAAMIgQAAgYGAAYGBgACBggABAg
+ KAAgKCgAKCgoACAwOAA4ODgAKDhIADBQWABYWFgAGEhoADBYcAAYUHgAGFh4ACBYeAAoYHgAKGCAABhY
+ iAAgaJgAKICoACiIuAC4uLgAMJDIADiw6AAQCAAAABgAAAggAAAAOAAAMGgAABgQCAAwgAgAEAgQABgQ
+ EAAwmBgAGBggAAgYKAAAICgACCAoABgoMAAgKDAAGDBAABg4QAAYOFAAEEBYACBIWAAwSFgAOEhYACBI
+ YAAQSGgAOFhoABhIcAAoUHAAQFhwACBgeABAaIAAIGiIADBwiABAcIgAGGCQADhwkABYeJAACBCgAChw
+ oAAweKAAKIC4ACiQwAAwmMgAOKjgADBg6ABAsOgAELD4AAgoAAAIMAAAGDAAABhIAAAYUAAAKHgAAACY
+ AAAwmAAAAMgAABAACAAIEAgAEBgIABA4CAAYOAgAMHgIABAYEAAYGBAAIBgQACh4EAAwmBAAEBAYABgg
+ GAAoIBgAGCAgAAgIKAAgICgAGAgwAAggMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAn2KfdXV1XAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoo2+QIJCJb28Sd3em
+ nQAAAFuKqW0aqsd6Y5/DXAAAAAAAAAAAAAAAAAAAAAAAAAB3kAWQkG8SpqaJb28gsncAbIeSroyii21x
+ kczIwwAAAAAAAAAAAAAAAAAAAAAAAABoo4mJkLKylm9vb5BvdwwAcZO/fox7z2NjqsOss2MAWwAAAAAA
+ AAAAAAAAAAAAAAAAvaGmo5ANlgUFEiBvo1xjq3p6qMTJroBkxXt9cGzFnAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAL2ylgV3vQAAAGOvxMXXq41uh6yVjxqp1YhknwAAAAAAAAAAAAAAAAAAAAAAAAAAAABvsolbAAAA
+ +5KneouS2Kx4pZF9ndywsXuvkocAAAAAAAAAAAAAAAAAAAAAAAAAAAB3sncAAAAAdayHca95bH9+cKmv
+ fMVucG2B4MYAAAAAAAAAAAAAAAAAAAAAAAAAAAChsqMAAAAAe3VkyHF5kW59cN3eZc/XyXutyot7AAAA
+ AAAAAAAAAAAAAAAAAAAAAACjIKEAAACgfv94gX+PituLDI0/aoBxqxqOY8PgbQAAAAAAAAAAAAAAAAAA
+ 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
+ OAAABwAA//wYAAADAAD/+BgAAAMAAP/AAAAAAwAA/wAAAAADAAD8AAAAAAMAAPwAAAAAAwAA+AAAAAAD
+ AADwAAAAAAMAAPAAAAAAAwAA8AAAAAADAADwAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAQAA8AAPAA
+ ABgADwAA+AAAHgAHAAD8AAAfgAMAAP4QAA+ADwAA/gAADgADAAD8AAAfAAMAAPAfxD/ABwAA4B/n/+AB
+ AADgB+B/wB8AAOADgB+ADwAA8AOAHhAPAAD4BwB/8kcAAPz/gf/nLwAA+P/5/+8/AADwf/n//z8AAPh/
+ /P//vwAA+P////+fAAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//
+ /wAAAP8AAP//AAAAgACAgIAAgAAAAACAAAAAgIAAgIAAAECg4ABAgKAAYOAgAEDgQAAAIAAAACAgACAg
+ IABgIIAAIAAAACBAAAAAYAAAIIAAAGAgIABAYGAAAACgAGCAoACgoKAA4ODgAGDAAAAAACAAYABgAIAg
+ YAAAYMAAICAAACBgAABgYAAAQKAAAKDAAAAA4AAAYOAAAABAIAAgQCAAYAAgACBAQABgYEAAIABgACAg
+ YAAgQGAAYGBgACBggABgYIAAgACgAKCAoABgIMAAQKDAAGCgwAAgwMAAAADgAIDA4ACgwOAAAODgAIDg
+ 4ACA4AAAgIAgAEDgIACgACAAQABgAIAggAAgYP8AAKD/AAgIAAAICAgACAAAABhAWAAoUGAAaGhoADBg
+ eAAoaIgAMICoAChggAAACAgAEAgIABgYGAAoUGgAKFhwAChwkAAIGAgACBAQABAgKAAQKDgAIEhgACBQ
+ aAAAAHgAIFh4AChgeAAAeHgAeHh4AChogAAwaIAAIGCIADBoiAA4cIgAIGiQADhwkAAoeKgAKICwAAgQ
+ AAAIIAAACAAIABhICAAICBAAMIgQABAYGAAYICgAGCgwAEhISAAwSFgAGFBoAChYaAAICHgAOGiAACh4
+ oAAweKAAGAAAAAAIAAAAGAAACBgAABAoAAAYUAAAKGAAAChoAAAAeAAAAAAIAAgQCAAQEAgAGP8IACAY
+ EAAIEBgAMJAYABggIAAAACgACBAoACgwMAAAKDgAEDA4ADg4OAAoOEAAGDhIACA4SAAAQEgAMEBIAEhQ
+ UAAISFgAIEhYAChIWAAwUFgAIEhoAEhYaAAYUHAAMFhwABhYeAAoWHgAIFiAAEhwgACIiIgAGGCQAAAA
+ mAAgcJgAKHCYADB4mACYmJgAACjIAEBw+ACo//8ASAAAAFgAAABoAAAAeAAAABAIAABICAAAGCgAAAA4
+ AAAYOAAACEAAAAhIAAAoUAAAAFgAACBYAAAAaAAAIGgAADB4AAAAiAAAMIgAAGiIAACAmAAAGAAIADAI
+ CABgCAgAEBgIAAggCAAQIAgAECgIAAgwCAAQMAgAODAIABA4CAAYOAgAEEAIABhACAAgQAgAIFAIAChg
+ CAAwgAgAMJAIADCoCAAACBAAGBAQABggEAAoIBAAKGAQAChoEAAgeBAAKHgQAEh4EAAY+BAACAAYAAAI
+ GAAICBgAEAgYAAAQGAAQEBgAABgYAAgYGAAYMBgAKHgYADCYGAAwoBgAMKgYAGj/GABgCCAACBAgAAgY
+ IAAQGCAAGBggACggIABIcCAACAAoABAAKAAAECgAEBAoAAggKAAACDAASAgwAAgQMAAIKDAAECgwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAARxBSUlJHAAAAAABYWFlY8kYAAAAAAAAAAAAAAAAAAJFgqqRLSzAwBXMAkKJbW1pdSVmE
+ AAAAAAAAAAAAAAAAEJdLqhpgYKQFkf9NmVRanHVJVZRQAAAAAAAAAAAAAAAAUY6RO6qXMHNYW5MxdFpm
+ TVtPSpAAAAAAAAAAAAAAAAAAAAAFpIYAAFSeW09PU15KU05MaEkAAAAAAAAAAAAAAAAAAEtgAAAAk55j
+ ml5Mp2haXUqpW3IAAAAAAAAAAAAAAAAAS0sAAEpJoE5PpZpMZVWnMZyZVQAAAAAAAAAAAAAAAABLMAAA
+ cqCeSnppZGZKWzFNaV2ecAAAAAAAAAAAAAAAAEtLAACLVF6iZHROp2eiW1paeWnxAAAAAAAAAAAAAABI
+ GmAAAElJSmh6SWNVSk5hZqJ1VXUAAAAAAAAAAAAAlpmjeJAAk12eZXZ5p3WndnZpaUlbZgAAAAAAAAAA
+ m2lFRTw8PDZeWV1OlE0xeWlNeVVdZmmZUAAAAAAAjzYKRaysRUVFRa02SXSnYaFNTUxpTFSoTmKTAAAA
+ AI8KOkSrrKysrKxErDullF6fVWhiVakLaVWbVZoAAAAAqK2sRKZEqyCsRKummKBZT0xPTHppZVMLqVN4
+ cQAAAAA6O6sYGKYYGKsYphgELjejY09KTTZNaWdMNpkAAAAA+zc6XFxcd3d3XASmXEw6PZZiZ6g2ZUw2
+ T2QLnwAAAAAdoTtcLcV3pndfLi2jraMtcmNkT05np0xnaXhUAAAAAAD5NKL87xgYd1+eLZ06+1wAVE6o
+ p2cKZ2WjjgAAAAAAAAAQo67EcuZuj5jkACue9gAAkTEKeJfbioptRgAAAAAAAACIr0dLVwBXmEeL5Qg4
+ AAAAAOnqwNbVb9O5AAAAAAAAAP38RmDae3tfkDqIX0UAAABq3W9v6+2BtssAAAAAAAD9q6v7AFl1dV9f
+ mpgIXwAAAABrtG9v7O2BagAAAACSF52fL/AAAAAAAHUAAAAAAAAAAACC1NS+3s/ZzAAAAJ03MjqjdJ0A
+ AAC3FIMUtwAAAAAAzr27goK5awAAAAAAWaNgGho3dAAAyr+/v4ODtQAAAMmAAM+2zxMTawAAAAAAAK6z
+ kZ1xAAC1un3HVwAAAAAAAAAAawB/ftAAAAAAAABCNUIAAAAAAAAAAF8AAAAAAAAAAEcAAGpGAAAAAAAA
+ AEKsEQAAAAAAAAAAlZUAAAAAAAAAAAAAAEgAAAAAAAAAAC3hAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAA
+ AAD///////////4BwH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAA
+ AAHgAAAB4AAAAeAAAAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9
+ /s/j/P/v8///7ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AFEl
+ swBJDW0ABEMwAAJHSQAFDwIAXl9ZAHJtagBwfYQAQVNqAAFtAAAAZgAAAz0CABQ/AQAXQwAAGkAAAA8g
+ AQAhSJQAM1SRABw6fgAFVk0ADE48AAplaQAgWgIAMYcMACl7CwAOJwMAAAMtABwPNwAhIQAABxACAA9S
+ UAAnQUgAAISfACRoDAAxmwQAK4MHABMpAAA8P1kATBMbACQSVwAKL1EADS5CADFMVQABIF4AJ3CGADB2
+ kAAzdlEAMnY1ABMnEwBARooAVVq5ABgATwAWBn0ABh56AAULaQBOeKYAT3WSACpNZwAucpgAMHifADFx
+ nwA1b5YAMF93AEBalgBvjecADCLAAAkPpQAbJr4AFiLGAAAJjgAzbIEANGh8AClhgAAzfKEAMHWWADJz
+ kwAsW3MAQ4mvADyY9AAtgf8AIpr/ACuk/wBdk9UAG0tkACladQAqbI4AK3GUAC5vjwArbpEALWJ7ACdl
+ aAAOaoQAJJ20ABx0gQAeTF8AJ116ACViggAgZosAJmeJAChvlAAhZIgAH1ZyAHVmYwAaPVMAJ19+ACto
+ hgAmaIwAKGB9ACFdfAAgY4YAGU5qAFtgYQAYQVgAIVx7ACtrjgAtZYIAJmKAACNhgQAmX3wAIUpdAHp6
+ ewARN0wAH1R0ACdXcgApXnoAJ2B+ACligQAdSmAAKiopAGZlZQCRkZEAbm9vAFFSUwAWO08AJFRuACFP
+ agAhUm0AHD9RAAMKDgA3NjUAWlpaADk5OQA3NzcAPDk3AAYSGQAVNUgAFjFAAA8jLwABAgQAVQAAAP//
+ /wBWAAAA/f//AFcAAAD8//8AWAAAAPz//wBZAAAA/P//AFoAAAD9//8AWwAAAP7//wBcAAAA////AF4A
+ AAABAAAAXwAAAAEAAABgAAAAAQAAAGEAAAABAAAAYgAAAAEAAAB3IFIAbWFuAAAAAAAAAAAAAAAAAAAA
+ AAC0VWMAtFVjALwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAEAAAAAADgDAACfAQAAPwAAAAEA
+ AABAAAAAAQAAAEEAAAABAAAAQgAAAAEAAABFAAAA////AEYAAAD+//8ARwAAAP3//wBIAAAA/P//AEkA
+ AAD8//8ASgAAAPz//wBLAAAA/f//AEwAAAD///8ATQAAAAMAAABOAAAABwAAAE8AAAALAAAAUAAAABAA
+ AABRAAAAFQAAAFIAAAAZAAAAUwAAABwAAABUAAAAHgAAAFUAAAAeAAAAVgAAAB0AAABXAAAAGgAAAFgA
+ AAAWAAAAWQAAABIAAABaAAAADQAAAFsAAAAIAAAAXAAAAAQAAABeAAAA/v//AF8AAAD8//8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAI2Oj5CRkpOUlZYAAAAAAACCg4SFhoeIiYqLjAAAAAAAAAB6AHt8fX5/gIEAAAAA
+ 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
+</value>
+ </data>
+ <data name="$this.MinimumSize" type="System.Drawing.Size, System.Drawing">
+ <value>540, 300</value>
+ </data>
+ <data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
+ <value>CenterScreen</value>
+ </data>
+ <data name="$this.Text" xml:space="preserve">
+ <value>Update</value>
+ </data>
+ <data name="&gt;&gt;$this.Name" xml:space="preserve">
+ <value>UpdateInfo</value>
+ </data>
+ <data name="&gt;&gt;$this.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/win/CS/app.config b/win/CS/app.config
new file mode 100644
index 000000000..c4155cd07
--- /dev/null
+++ b/win/CS/app.config
@@ -0,0 +1,161 @@
+<?xml version="1.0"?>
+<configuration>
+ <configSections>
+ <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"/>
+
+ <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <section name="Handbrake.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
+ </sectionGroup>
+ </configSections>
+
+ <userSettings>
+ <Handbrake.Properties.Settings>
+ <setting name="processPriority" serializeAs="String">
+ <value>Below Normal</value>
+ </setting>
+ <setting name="updateStatus" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="hb_version" serializeAs="String">
+ <value>{hb_version}</value>
+ </setting>
+ <setting name="tooltipEnable" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="CompletionOption" serializeAs="String">
+ <value>Do Nothing</value>
+ </setting>
+ <setting name="defaultPreset" serializeAs="String">
+ <value />
+ </setting>
+ <setting name="hb_build" serializeAs="String">
+ <value>0</value>
+ </setting>
+ <setting name="skipversion" serializeAs="String">
+ <value>0</value>
+ </setting>
+ <setting name="autoNaming" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="autoNamePath" serializeAs="String">
+ <value />
+ </setting>
+ <setting name="appcast" serializeAs="String">
+ <value>http://handbrake.fr/appcast.xml</value>
+ </setting>
+ <setting name="appcast_unstable" serializeAs="String">
+ <value>http://handbrake.fr/appcast_unstable.xml</value>
+ </setting>
+ <setting name="autoNameFormat" serializeAs="String">
+ <value>{source}-{title}</value>
+ </setting>
+ <setting name="saveLogToSpecifiedPath" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="saveLogPath" serializeAs="String">
+ <value />
+ </setting>
+ <setting name="saveLogWithVideo" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="VLC_Path" serializeAs="String">
+ <value>C:\Program Files\VideoLAN\vlc\vlc.exe</value>
+ </setting>
+ <setting name="MainWindowMinimize" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="QueryEditorTab" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="x264cqstep" serializeAs="String">
+ <value>0.25</value>
+ </setting>
+ <setting name="verboseLevel" serializeAs="String">
+ <value>1</value>
+ </setting>
+ <setting name="noDvdNav" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="presetNotification" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="trayIconAlerts" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="lastUpdateCheckDate" serializeAs="String">
+ <value />
+ </setting>
+ <setting name="daysBetweenUpdateCheck" serializeAs="String">
+ <value>7</value>
+ </setting>
+ <setting name="useM4v" serializeAs="String">
+ <value>0</value>
+ </setting>
+ <setting name="PromptOnUnmatchingQueries" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="NativeLanguage" serializeAs="String">
+ <value>Any</value>
+ </setting>
+ <setting name="DubMode" serializeAs="String">
+ <value>0</value>
+ </setting>
+ <setting name="hb_platform" serializeAs="String">
+ <value />
+ </setting>
+ <setting name="growlQueue" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="growlEncode" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="CliExeHash" serializeAs="String">
+ <value />
+ </setting>
+ <setting name="previewScanCount" serializeAs="String">
+ <value>10</value>
+ </setting>
+ <setting name="clearOldLogs" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="showCliForInGuiEncodeStatus" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="AutoNameTitleCase" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="AutoNameRemoveUnderscore" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="UpdateRequired" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="ActivityWindowLastMode" serializeAs="String">
+ <value>0</value>
+ </setting>
+ <setting name="preventSleep" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="useClosedCaption" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="batchMinDuration" serializeAs="String">
+ <value>35</value>
+ </setting>
+ <setting name="batchMaxDuration" serializeAs="String">
+ <value>47</value>
+ </setting>
+ </Handbrake.Properties.Settings>
+ </userSettings>
+
+ <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/></startup>
+
+ <!--<castle>
+ <components>
+ <component id="IErrorService"
+ service="HandBrake.Framework.Services.Interfaces.IErrorService, HandBrake.Framework"
+ type="HandBrake.Framework.Services.ErrorService, HandBrake.Framework"/>
+ </components>
+ </castle>-->
+
+</configuration>
diff --git a/win/CS/doc/AUTHORS b/win/CS/doc/AUTHORS
new file mode 100644
index 000000000..be6664e91
--- /dev/null
+++ b/win/CS/doc/AUTHORS
@@ -0,0 +1,112 @@
+AUTHORS file for HandBrake <http://handbrake.fr/>
+
+Eric Petit <[email protected]>
+ + Core (construct, multithreading, BeOS/OS X/Linux ports)
+ + MPEG demuxer
+ + MPEG-2, AC3 and MPGA decoders (w/ libmpeg2/liba52/libavcodec)
+ + LPCM "decoder"
+ + MPEG-4, MP3 and AAC encoders (w/ libavcodec/libxvidcore/libmp3lame/
+ libfaac)
+ + AC-3 pass-through
+ + AVI muxer
+ + MP4 muxer (w/ libmp4v2)
+ + BeOS interface
+ + OS X interface
+ + French translation
+
+Laurent Aimar <[email protected]>
+ + H264 and Vorbis encoders (w/ libx264/libvorbis)
+ + OGG/OGM muxer (w/ libogg)
+ + Gtk2 interface
+ + wxWidgets interface
+
+Van Jacobson <[email protected]> (van)
+ + Universal input architecture
+ + MPEG Standard Target Decoder timing model
+ + Auto-typing MPEG stream files
+ + Minor bug fixing in MPEG stream support
+ + Minor dvd reader fixes
+ + Chapter mark bug fixes
+
+John Allen (?) <[email protected]> (johnallen)
+ + Core enhancements
+ + Threading enhancements
+ + Simplified Mac OS X GUI
+
+Joe Crain <[email protected]> (dynaflash)
+ + Mac OS X GUI enhancements/rewrite
+
+Damiano Galassi <[email protected]> (ritsuka)
+ + Mac OS X GUI enhancements
+
+Edward Groenendaal <[email protected]> (eddyg)
+ + Major bug fixes
+ + Subtitle scan & Colour
+ + Performance improvements
+
+David Foster <unknown> (davidfstr)
+ + Subtitles from file inputs
+ + SSA subtitle support
+
+Rodney Hester <[email protected]> (rhester)
+ + iPod firmware 1.2+ 640x480 MPEG-4/H.264 support
+
+Andrew Kimpton <[email protected]> (awk)
+ + MPEG Audio fixes
+ + MPEG Stream Support
+
+Chris Lee <[email protected]>
+ + PAR/anamorphic support
+ + dvdread enhancements
+ + Linux GUI
+
+Chris Long <[email protected]> (chrislong)
+ + iPod firmware 1.2+ 640x480 MPEG-4/H.264 support
+
+Brian Mario <Unknown> (brianmario)
+ + Windows GUI
+
+Maurj <[email protected]> (maurj)
+ + Dolby Surround and Dolby Pro Logic II mixdowns
+ + 6-channel AAC audio from 5.1 source
+ + Mono AAC audio from mono source
+ + PAR/anamorphic support in mp4 file format
+ + Chapter markers in mp4 file format
+ + Mac OS X GUI enhancements
+ + Support for DTS audio sources
+
+Mirkwood <[email protected]> (mirkwood)
+ + Windows CLI port
+
+Nyx <unknown> (Nyx)
+ + Frame re-ordering and flushing in mp4
+
+Philippe Rigaux <[email protected]> (prigaux)
+ + 3rd party library integration
+ + Mac OS X GUI enhancements
+ + PAR/anamorphic support
+ + Universal binary build process
+ + Conversion from jam to make for compiles
+
+Jonathon Rubin <[email protected]> (jbrjake)
+ + Massive core enhancements
+ + Significant improvements to H.264 support
+
+Scott <unknown> (s55)
+ + Windows GUI
+
+John Stebbins <[email protected]> (j45)
+ + GTK GUI
+ + TrueHD demuxing
+ + libavcodec video encoding quality enhancements
+ + Numerous bug fixes
+
+Chris Thoman <[email protected]> (huevos_rancheros)
+ + Ported video filters from libmpcodec
+
+Mark Krenek <[email protected]> (travistex)
+ + Mac OS X GUI enhancements
+ + Mac OS X GUI Queueing system
+
+Kona 'mike' Blend <[email protected]> (KonaBlend)
+ + Build System and related guides
diff --git a/win/CS/doc/COPYING b/win/CS/doc/COPYING
new file mode 100644
index 000000000..d60c31a97
--- /dev/null
+++ b/win/CS/doc/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/win/CS/doc/CREDITS b/win/CS/doc/CREDITS
new file mode 100644
index 000000000..92ae696c6
--- /dev/null
+++ b/win/CS/doc/CREDITS
@@ -0,0 +1,175 @@
+CREDITS file for HandBrake <http://handbrake.fr/>
+
+HandBrake uses many cool libraries from the GNU/Linux world.
+Thank their authors!
+
+liba52 authors:
+ Aaron Holtzman
+ Michel Lespinasse
+ Gildas Bazin
+ Billy Biggs
+ Eduard Hasenleithner
+ H�kan Hjort
+ Charles M. Hannum
+ Chris Hodges
+ Michael Holzt
+ Angelos Keromytis
+ David I. Lehn
+ Don Mahurin
+ Jim Miller
+ Takefumi Sayo
+ Shoji Tokunaga
+
+libavcodec authors:
+ Fabrice Bellard
+ Alex Beregszaszi
+ Brian Foley
+ Arpad Gereoffy
+ Philip Gladstone
+ Falk Hueffner
+ Zdenek Kabelac
+ Nick Kurshev
+ Michael Niedermayer
+ Fran�ois Revol
+ Dieter Shirley
+ Juan J. Sierralta
+ Lionel Ulmer
+
+libdca authors:
+ Gildas Bazin
+ Sam Hocevar
+
+libdvdread authors:
+ Bj�rn Englund
+ H�kan Hjort
+ Billy Biggs
+ Christian Wolff
+
+libfaac authors:
+ M. Bakker
+ Tony Lenox
+ RageOMatic
+ thebard
+ Ivan Dimkovic
+ Krzysztof Nikiel
+
+libfaad2 authors:
+ M. Bakker
+ Alexander Kurpiers
+ Volker Fischer
+ Gian-Carlo Pascutto
+
+libmp3lame authors:
+ Mike Cheng
+ Robert Hegemann
+ Frank Klemm
+ Alexander Leidinger
+ Naoki Shibata
+ Mark Taylor
+ Takehiro Tominiga
+ Iv�n Cavero Belaunde
+ Gabriel Bouvigne
+ Florian Bomers
+ CISC
+ John Dahlstrom
+ John Dee
+ Albert Faber
+ Peter Gubanov
+ Lars Magne Ingebrigtsen
+ Yosi Markovich
+ Zdenek Kabelac
+ Iwasa Kazmi
+ Guillaume Lessard
+ Steve Lhomme
+ Don Melton
+ Viral Shah
+ Acy Stapp
+ Roel VdB
+
+libmp4v2 authors:
+ Dave Mackie
+ Alix Marchandise-Franquet
+ Bill May
+ Massimo Villari
+ Waqar Mohsin
+ Richard Chen
+ Rob Arnold
+ Howdy Pierce
+ Steven Schultz
+ Sean Gilligan
+ Michael Rossberg
+ Luis F. Ramirez
+ Petter Reinholdtsen
+
+libmpeg2 authors:
+ Aaron Holtzman
+ Michel Lespinasse
+ Bruno Barreyra
+ Gildas Bazin
+ Alexander W. Chin
+ Stephen Crowley
+ Didier Gautheron
+ Ryan C. Gordon
+ Peter Gubanov
+ H�kan Hjort
+ Nicolas Joly
+ Gerd Knorr
+ David I. Lehn
+ Olie Lho
+ Rick Niles
+ Real Ouellet
+ Bajusz Peter
+ Franck Sicard
+ Brion Vibber
+ Martin Vogt
+ Fredrik Vraalsen
+
+libogg authors:
+ Christopher Montgomery
+
+libmkv authors:
+ John A. Stebbins
+ Nathan Caldwell
+ Mike Matsnev
+ Nathan Caldwell
+ Christophe Devine
+
+libsamplerate authors:
+ Erik de Castro Lopo
+
+libvorbis authors:
+ Christopher Montgomery
+
+libx264 authors:
+ Laurent Aimar
+
+libtheora authors:
+ Monty
+ Ralph Giles
+ Timothy B. Terriberry
+ Dan B. Miller
+ Rudolf Marek
+ Wim Tayman
+ Dan Lenski
+ Nils Pipenbrinck
+ Aaron Colwell
+ Thomas Vander Stichele
+ Jan Gerber
+ Conrad Parker
+ Cristian Adam
+ Sebastian Pippin
+ Simon Hosie
+ Mauricio Piacentini
+ Silvia Pfeiffer
+ Michael Smith
+ Andre Pang
+ calc
+ Chris Cheney
+ Brendan Cully
+ Edward Hervey
+ Adam Moss
+ Colin Ward
+ Jeremy C. Reed
+ Arc Riley
+ Rodolphe Ortalo
diff --git a/win/CS/doc/NEWS b/win/CS/doc/NEWS
new file mode 100644
index 000000000..ed7b57d26
--- /dev/null
+++ b/win/CS/doc/NEWS
@@ -0,0 +1,689 @@
+NEWS file for HandBrake <http://handbrake.fr/>
+
+Changes between 0.9.3 and 0.9.4:
+
+Core:
+
+* New build system, allowing 64-bit binaries (around 10% faster)
+* Soft subtitles and Closed Captions:
+ - DVD Closed Captions
+ - ATSC Closed Captions
+ - SRT subtitle import
+ - Text soft subtitles in MP4 and MKV output
+ - Bitmap soft subtitles in MKV output
+* Better support for DVD inputs:
+ - Uses libdvdnav
+ - DVD angles support
+ - Workaround for libdvdread malloc bomb on invalid PGC entry
+ - DVD drive region detection support in Linux
+ - Handles DVD programs with more than 16 streams
+ - No longer tries to detect and discard duplicate titles when scanning
+ - Libdvdnav patched to perform read error recovery
+ - Libdvdread patched to allow raw device access in Windows
+ - Handles poorly mastered DVDs that had the menus ripped out of them
+* Better support for non-DVD inputs:
+ - Preserves MP4 metadata
+ - TrueHD
+ - DTS-HD demuxing
+ - 8 bit audio
+ - Better handling of transport streams where audio starts first
+ - Better handling of transport streams that have been spliced together, leading to duplicate timestamps
+ - Better VC-1 frame detection
+ - Fixes bug that was causing one sec. of audio to be dropped on many ffmpeg files
+ - Looks harder for aspect ratio info from DV sources
+ - No longer truncates the last (dummy) chapter
+ - Allows specifying field parity for detelecine and decomb
+* Better AV sync
+* Support for sources with no audio
+* DTS passthrough for MKV
+* x264 bumped from r1169 to r1347, which means speed optimizations, new default settings (see r2742 commit comment), the magic of macroblock tree rate control (mbtree), a new CRF curve (meaning you will get different, generally lower bitrates at the same RF, with similar quality metrics), and weighted P-Frames (disabled by default for Baseline encodes and the AppleTV preset).
+* Better sample interleaving
+* Better, optional deinterlacer for decomb (EEDI2)
+* New mode structure for the decomb filter
+* Variable verbose logging levels
+* Fixed timing for first two frames coming out of filters
+* Libtheora bumped to 1.1.0
+* Improvements to our theora implementation (2 pass encoding + soft target rate control)
+* Caters to Theora's insistence on content having mod16 framing dimensions specified
+* Flushes LAME encoder's final packets
+* Fixed interjob framerate calculation
+* Fixed pthreads regression in cygwin
+* Tweaks for packaging tools
+* Solaris 10 build support
+
+All interfaces:
+
+* Live video preview
+* New subtitle tab
+* New filters and picture settings inspector
+* Custom anamorphic mode
+* Updated Sparkle
+* Custom number of preview images
+* Quality slider now works off actual rate factor/quantizer values instead of percentages
+* Partially updated advanced x264 tab
+* New built-in presets
+* Use libdvdnav by default on DVD sources
+* Removed Constant QP encoding option for x264 (use CRF)
+* Various bug fixes and UI tweaks
+* x264 turbo 1st pass mode now uses subme=2 not subme=1
+
+Mac:
+
+* Core Audio AAC encoding
+* H.264 video source decoding crash fixed
+* Queue displays varying row heights based on encode settings
+* Fixed EyeTV package scanning
+* 64bit / 32 bit VLC detection
+* Preset import/export
+
+Windows:
+
+* New audio tab
+* AAC audio source decoding bug fixed
+* Tray minimization is now optional
+* Queue can now be started from main window
+* Growl for Windows notification support
+* General UI improvements
+* Preset import
+* Preferred language control for audio dubs and subtitles
+* Fixed file extensions resetting to m4v when enabling chapter markers in mkv
+* Faster updating of GUI elements from CLI data
+* Cleanup / Improved some of the programs options. (Growl, use m4v, drive detection)
+* Numerous fixes in the Picture Settings Panel and CLI Query Handling code.
+* Bug Fixes and Usability improvements.
+
+Linux:
+
+* General UI improvements
+* Inhibits sleep mode while encoding
+* Single title scan
+* Chapter duration display
+* Notifications when encodes complete
+* Tray minimization
+* Full screen preview
+* Preset import/export
+* Preferred language control for audio dubs and subtitles
+* Preferences rearrangement
+* Preference to auto-apply .m4v extension
+* New system tray icon behavior
+* Preference for what to do when encode completes
+* Preference for how often to delete activity logs
+* Preference to disable automatic scanning
+* New Gnome session manager support
+* Improved "auto" audio selection
+* Use .m4v as the default extension for the MPEG-4 container
+* Use .m4v when soft subs are enabled
+* Alternate angle encoding fix
+* Only strips drive letters for Windows builds
+* Show correct audio format info when it's been sanitized for incompatibilities
+* Preserve chapter list modifications made to queued jobs
+* Fixed error when navigating chapter titles with the keyboard
+* Bug Fixes.
+
+CLI:
+
+* Options to handle new subtitle, anamorphic, and preview features
+* --srt-file, --srt-codeset, --srt-offset, --srt-lang, --srt-default
+* --native-dub option lets users request dubbing instead of subs when the audio isn't in their native language
+* Allow encoding sources with no audio without explicitly stating -a none
+* Update checker on MinGW built exe should now work correctly.
+* Matches GUIs' default verbosity level of 1
+
+Changes between 0.9.2 and 0.9.3:
+
+0.9.3 Snapshot 5 -> 0.9.3 Final
+- Better PMT processing
+- Basic underlying support for live previews (encode from a seek point for a set number of frames)
+- Better searching for IDR frames in H.264 streams
+- Preset changes (iPhone goes CRF, some old Apple presets resurrected as Legacy)
+- Assorted bug fixes
+
+0.9.3 Snapshot 4 -> 0.9.3 Snapshot 5 (r1913)
+Core Library
+- VC-1 stream input
+- Newer libmp4v2, which fixes the issue with output > 2 gigs in Linux
+- Proper allocation for preview frames
+- Avoids corruption of previews of sources that use widths that aren't cleanly divisible by 8
+- Decodes DTS internally instead of using ffmpeg, to allow mixdowns
+- Better support for DTS in MKV files with implicit timestamps or large timestamp errors
+- Ensures proper chroma size by rounding up when dealing with odd dimensions
+- Ensures "auto" samplerate sends a valid value to faac (22050, 24000, 32000, 44100, or 48000)
+- Bumped Theora to 1.0 final
+- Bumped x264 to r1024, which includes Nehalem optimizations as well as speed boosts for things such as b-adapt=2
+
+Mac GUI
+- Allows multibyte characters in chapter titles
+
+Windows GUI
+- Fixes issue parsing presets that use maxWidth and maxHeight (-X and -Y)
+- DRC defaults to 1 now
+- Chapter markers disabled for non-DVD sources
+- Makes sure Normal preset gets loaded
+- Fixes arithmetic overflow crash when scanning
+
+Linux GUI
+- Update checker
+- Limits range of chapters to encode to the number of chapters on the DVD
+- Disabled entry of dimensions larger than the source
+
+CLI
+- Allows overriding of audio (tracks, bitrates, samplerates, codecs, mixdowns) and x264 options in built-in presets
+
+Documentation
+- Documentation updates have begun on the wiki, although they are not yet complete
+
+0.9.3 Snapshot 3 -> 0.9.3 Snapshot 4 (r1896)
+Core Library
+- Converts video in other color spaces to YUV420 (this means DV support)
+- Official, standards-based AC3-in-MP4
+- Tries to base the AV timing for streams off audio when possible
+- Keeps some audio fixes for lost packets in over the air streams from interfering with other sources
+- Handles rendering of sources where the picture resolution changes mid-stream (this fixes the long-standing bug reading a particular episode of Doctor Who)
+- Wider window for clock references (AV sync)
+- Fixed a crash when closing out data for AAC encoding on aborted encodes
+- Rejiggered verbose activity log display to be more laconic by default
+- Updated x264 to r1016, which means b-rdo and bime are gone and replaced with new subme modes
+- DTS and HDMV DTS audio support in streams
+- Doesn't show the audio track button on iPhones/iPod Touches unless there's more than 1 track
+- Tries to avoid garbage data from AC3 sync by searching for two agreeing packets
+- As the MPEG4IP project is defunct, switched to an independently maintained libmp4v2 which has folded in all our cumbersome patches
+- Fixed SunOS compilation
+- Fixed conflict between maxHeight and maxWidth and loose anamorphic
+- Warn in the log when titles are being ignored during scan for lack of audio
+- Fixed bug with Slow/Slowest deinterlacing and decomb which could leave a flickering line at the top or bottom of the screen
+- Extracts audio and subtitle types from DVD sources, to do things like label commentary tracks
+- Better handling of the beginning of AVI and WMV sources that start after time 0
+- Optimize MP4 for web download works with AC3 tracks now
+
+Mac GUI
+- Nested presets
+- Individual activity logs for each encode (stored by default in ~/Application Support/HandBrake, can be co-located with encoded file destination by preference)
+- Allows reading from ZFS volumes
+- Fixed target size mode. It keeps breaking itself. Maybe it should just be put out of its misery...
+- Assorted other improvements
+
+Windows GUI
+- Nested presets
+- Individual activity logs for each encode
+- Slow and slower deinterlacing and decomb work now in Windows
+- Added resizeable update window
+- Fixed parsing of non-DVD source audio formats
+- Restored Copy to Clipboard to the Activity Log Window, among other enhancements to it
+- Fixed bug with MKV presets showing up as .m4v
+- Assorted other improvements
+
+Linux GUI (GTK)
+- Nested presets
+- Individual activity logs for each encode
+- Allows pending queue items to be removed, and reloaded in the main window for editing
+- Better handling of HD previews
+- Assorted other improvements
+
+CLI
+- Updated presets to the equivalent of the nested ones in the GUIs
+- Allows setting custom audio track names in MP4 files
+- Allows selection of the COLR atom in MP4 files, between Bt.601 and Bt.709
+- Fixed reading of device paths in OS X
+
+A special note on the new presets (they're collapsible-triangle-folder-thing-errific!)
+- Deux Six Quatre, Blind, Broke, and Bedlam are gone. They were dead weight.
+- iPod Low-Rez is now iPod Classic & iPod Nano
+- iPod High-Rez is now iPod Legacy
+- iPhone / iPod Touch is now iPhone & iPod Touch, so take care CLI users
+- Animation and Television now use the decomb and detelecine (VFR) filters
+- High Profile presets now use psy-trellis and the new subme 9 mode with B-frame RD refinement
+- AppleTV is now CRF, so sizes will vary with content
+- PS3 preset should be fixed
+- Constant Quality Rate still needs its quality % lowered, probably
+
+The keen reader is already asking "iPod Legacy? WTF is iPod High-Rez called iPod Legacy now?"
+
+The answer is Universal.
+
+The Universal preset is designed to play on all modern iPods (anything newer than the iPod 5.5G). It also plays on iPhones. It also plays on AppleTVs. It should also play just about anywhere else, hence the name. It is full anamorphic DVD resolution--no tricks with downscaling like stuff from the iTunes Store. It includes chapters, and has the first audio track in both AAC (DPL2 downmixed) and AC3 pass-thru, just like the AppleTV preset. In fact, it should give the same quality as the AppleTV preset, but faster...and at a larger file size. Like the AppleTV preset, it used CRF, so sizes will vary.
+
+0.9.3 Snapshot2 -> 0.9.3 Snapshot 3 (r1797)
+Core Library:
+- Universal input support, utilizing libavcodec from the FFmpeg project for decoding non-MPEG-2 video
+- Newer, faster, better version of the x264 codec, including psychovisual optimizations
+- Better AV sync through full compliance with the MPEG Standard Target Decoder timing model
+- More accurate auto-cropping
+- Support for New Zealand and Norwegian HDTV broadcasts (H.264 and AAC-LATM in MPEG-TS)
+- Detelecine is now "VFR detelecine" by default, dropping some frames and extending others to make up lost time, old behavior of keeping duplicate frames is enabled by selecting a framerate besides "Same as source"
+- Threaded deinterlacing in Slow and Slower modes
+- Threaded and entirely rewritten decomb filter
+- Better audio resampling interpolator
+- Better gamma in QuickTime through the use of the COLR MP4 atom
+- Better constant quality encoding when using FFmpeg
+- Hopefully better cache and virtual memory performance by recycling buffers that were most recently used instead of least
+- Fix for MP4s with "negative duration" errors.
+- Set the detelecine filter to work better with PAL by using "loose" breaks
+- Fix for missing initial H.264 NAL units, improves reliability of 8x8dct
+- Fix for subtitle-scan with XviD encoding
+- Fix for crash at the end of 2nd pass using x264
+- Deblock filter works now
+- Rewritten update system, so the core library can read a portion of Sparkle appcasts.
+- Updates for libsamplerate, libogg, xvidcore, libtheora, libmpeg2, lame, faac, and of course ffmpeg and x264.
+
+Mac GUI
+- Entirely rewritten and far more flexible queue that can be saved between sessions, capable of preserving queued items after a crash
+- Now requires vlc 0.9.xx to read protected dvd's in the users /Applications folder
+- Fix for 4x3 loose anamorphic to keep it from downscaling
+- Countless other improvements
+
+Windows GUI
+- Resolution calculation
+- Better preset bar
+- Better queue (including queue recovery feature)
+- Better activity log window
+- Improved UI (layout changes, animated x264 options, DVD drive detection, duration displayed)
+- More options - includes support for custom auto name format & starting the CLI minimized
+- Countless other improvements
+
+Linux GUI (GTK)
+- It's alive!
+
+Known Issues in Snapshot 3
+- Possibility of a flickering line at the top or bottom of the frame after Slow or Slower deinterlacing or decombing
+- Input bitrate display may be off by a factor of 100 for H.264-in-TS sources
+- Constant Quality Rate preset probably needs a lower quality level (60% - 55%)
+- With non-DVD sources that don't have AC3 audio, you can't encode 1 input audio track to multiple output audio tracks
+- Slow and Slower deinterlacing and decombing are BROKEN in Windows
+- QuickTime won't read Xvid-in-MP4 output, although VLC will
+- Windows GUI does not detect all audio tracks from non-DVD sources
+
+0.9.3 Snapshot 1 -> 0.9.3 Snapshot 2 (r1477)
+Core Library:
+- Anamorphic PAR for the AVI container
+- Allow constant frame rates when they different from the source's frame rate (otherwise pass through the variable MPEG-2 frame durations )
+- Decomb filter (selectively deinterlaces when it sees interlacing in the frame)
+- Filter bug fixed, that would skip any filters after detelecine, if VFR wasn't enabled
+- Loose anamorphic + FFmpeg video bug fixed
+
+Windows GUI:
+- Title dropdown list bug fixed
+- Missing log file bug fixed
+
+CLI:
+- Default audio samplerate changed to 48kHz, audio bitrate changed to 160kbps.
+- Samplerate entry bug fixed
+
+0.9.2 -> 0.9.3 Snapshot 1 (r1457)
+Core Library:
+- New audio subsystem (no more AAC+AC3, control each track's codec and settings individually)
+- Removed libdvdcss (HandBrake no longer decrypts DVDs on its own, will use VLC to do so if it's available)
+- Added Theora encoder
+- Fixed x264-in-avi and ffmpeg-in-avi
+- Fixed xvid
+- More accurate scaling
+- Major sync improvements
+- Major stream improvements
+- AAC+AC3 support in MKV
+- MKV seeking fixes
+- Make sure subtitles get displayed long enough to read them
+- Updated VBV 2-pass and VBV 1-pass patch for x264
+- Adaptive Quantization for x264
+- Recover from bad preview scans
+- Recover from invalid PGNs
+- Fixed vorbis bitrate control
+- Snapshot builds
+
+Mac:
+- New audio interface
+- Loads libdvdcss from VLC at runtime if it's present on the user's system
+- No more general-purpose "Codecs" menu -- set video and audio codecs individually
+- More robust preset system, in preparation for nested presets
+- Made 64-bit MP4 file widget more prominent
+- Only allow useful x264 options in the advanced tab
+- Various fixes and improvements
+
+Windows:
+- New x264 tab
+- New audio interface
+- Various fixes and improvements
+
+CLI:
+- New audio interface
+
+Changes between 0.9.1 and 0.9.2:
+
+CORE
+
+- AC3 in MP4 support
+- Multi-track audio support for Apple devices
+- Better handling of audio discontinuities
+- More flexible, "loose" anamorphic
+- Variable frame rate encoding
+- MP4 optimization for progressive downloads
+- Dynamic range compression for encoding from AC3 audio
+- Ability to encode an audio stream and pass it through at the same time
+- iPhone-compatible anamorphic (pasp atom)
+- Robust program and transport stream support
+- Better handling of DVD read errors from invalid VOB units
+- Detects and works around missing end of cell markers
+- Recovers from loss of signal in a stream
+- Drops subtitles less often
+- Keeps chapter markers in better sync and prevents duplicates
+- Better handling of B-Frames
+- Tunes FIFO sizes by CPU count
+- Finally squashes the bug that cut off the end of movies
+- Preset changes
+- Standardizes on standard out for progress and standard error for everything else.
+- Correct channel counts when passing AC3 audio to Matroska
+- Tag MP4 files as encoded with HandBrake
+- No more merging short chapters
+- Newer copies of x264,
+- VBV 2-pass patch for x264
+- Sets keyframes for x264 by frame rate.
+- Support for >2GB MKV files in Linux
+- Code audio languages in a way QuickTime understands
+- Better subtitle positioning
+- Fewer crashes in 2-pass encoding
+
+MAC
+
+- Leopard Only
+- Sparkle
+- Reads .eyetv files as well as .dvdmedia files
+- Much better queue
+- More white space
+- Code restructuring
+- Activity window logging, complete with a "black box recorder" for crashes
+- Ability to open a single title for a DVD instead of scanning the whole thing
+- Warns people when they try to queue up two files with the same name
+- Maintains picture filter states between jobs
+- .xib Interface Builder files SVN can track
+- Switches to NSImageView for previews, so no more useless OpenGL effects
+- Temporary loss of localizations for foreign languages (the old system was broken anyway)
+- Separate filter settings for every queued job
+
+WIN
+
+- Revamped preset system
+- Sparkle-compatible update checker
+- Activity log window
+- CLI built-in preset parsing
+- No more admin rights required in Vista
+- Handles more display resolutions
+
+CLI
+
+- Built-in presets
+- Short names for denoising (weak, medium, strong) and deinterlacing (fast, slow, slower)
+- Solaris port
+- No more x264b30 (use -e x264 -I -x level=30:cabac=0 instead or better yet an iPod preset)
+- Chapter marker .csv input fixed
+- CRF as default quality mode for x264, now -q is CRF and if you want CQP add -Q to it
+
+Changes between 0.9.0 and 0.9.1:
+
+ Core HandBrake Changes:
+ + Added: Forced subtitle support
+ + Added: 6-channel Vorbis audio
+ + Changed: Much better buffer management, leading to impressive speed-ups all over the place
+ + Changed: Color subtitles now display in color, instead of being transparent.
+ + Changed: All errors to stderr with hb_log() instead of to stdout with fprintf()
+ + Changed: Accept stream input where the file type is in caps (.VOB instead of just .vob, etc)
+ + Changed: Better quality Vorbis codec (AoTuV)
+ + Changed: Faster (threaded) ffmpeg
+ + Changed: Force x264 to use a key frame at chapter markers
+ + Changed: Try to recover from bad preview scans instead of crashing
+ + Fixed: No more hanging when using MKV with chapter markers
+ + Fixed: "Same as source" FPS now works correctly when the end-credits of a progressive film are interlaced.
+ + Fixed: "Slow" deinterlacing no longer doubles up the chapter markers
+ + Fixed: Proper display of fading subtitles
+ + Fixed: Nasty artifacts from inaccurate rounding in the video scaler
+ + Fixed: Improved compatibility with streams that have missing/misplaced PMTs
+ Assorted other changes
+
+ Mac Changes:
+ + Changed: Bigger buffer for the Activity Log
+ + Changed: Redesigned Queueing window
+ + Changed: Redesigned Preferences window
+ + Changed: Structural reorganization of the code into more segmented files
+ + Fixed: Closing the main window no longer causes HandBrake to quit
+ + Fixed: Changing dimensions in Picture Settings no longer causes a crash
+ + Fixed: Target size bitrate calculation
+ + Fixed: Picture Settings previews now scale to display resolution and screen size
+ Assorted other changes
+
+ Windows Changes:
+ + Added: More robust exception handling
+ + Added: On-completion options to shutdown, suspend, etc
+ + Added: Turn tooltips on or off
+ + Changed: Open source, NullSoft installer
+ + Fixed: Add-to-queue issues
+ + Fixed: Foreign language issues
+ Assorted other changes
+
+Changes between 0.8.5b1 and 0.9.0:
+
+ Core HandBrake Changes
+ + Added: Matroska (MKV) container output
+ + Added: Limited MPEG-2 transport stream (.VOB and .TS) input support
+ + Added: Option to write MP4 files larger than 4GB
+ + Added: Video filters (pullup, yadif, mcdeint, hqdn3d, pp7)
+ + Added: DTS audio input
+ + Changed: Switched to Lanczos scaling from libswscale
+ + Changed: Precise chapter marker location
+ + Changed: Newer libraries
+ + Changed: Much faster (threaded) iPod encoding
+ + Changed: "Same as source" works differently (better?) now
+ + Fixed: Audio drops should be thoroughly banished now
+ + Fixed: MP2 audio support
+ Assorted other changes
+
+ CLI Changes:
+ + Added: Chapter naming
+ + Added: Many new command line options for subtitles and filters.
+ + Added: Turbo for 2-pass x264 encodes
+ Assorted other changes
+
+ Mac Changes:
+ + Added: Chapter naming
+ + Added: Growl support
+ + Added: Advanced x264 settings tab
+ + Added: Logging window
+ + Added: Turbo for 2-pass x264 encodes
+ + Added: Many new presets
+ + Added: Unified toolbar
+ + Changed: Default settings
+ + Changed: Further integration of the queue and active queuing
+ + Changed: Browse DVDs like any other volumes
+ + Fixed: No more floating window syndrome (Mac)
+ + Fixed: Presets retain "magic sauce" when you change settings
+ Assorted other changes
+
+ Windows Changes:
+ + Changed: New C#-based Windows GUI front-end
+ + Changed: Improved queuing
+ + Changed: DVD information parser
+ Assorted other changes
+
+Changes between 0.8.0b1 and 0.8.5b1
+
+ Core HandBrake Changes
+ + Added: iTunes-style chapter markers.
+ + Added: 5.1 AAC surround sound.
+ + Added: Dolby Pro Logic I and II downmixing of discrete surround sound.
+ + Added: 1-channel AAC sound from monophonic sources.
+ + Added: Advanced x264 options. (including High Profile support)
+ + Added: B-frames in x264 + .mp4
+ + Added: PPC Linux Support.
+ + Added: Preserve language IDs from the DVD in .mp4
+ + Added: Snapshot build method.
+ + Added: Anamorphic video display in QuickTime.
+ + Changed: Renamed back to HandBrake.
+ + Changed: Libraries updated.
+ + Changed: Enabled Update Checker.
+ + Fixed: Multiple Audio tracks.
+ + Fixed: Sped up DVD scanning time by being nicer to libdvdread.
+ + Fixed: .dmg is now mountable in Mac OS X versions older than 10.4
+ + Fixed: Proper output size from x264 in target size mode.
+ + Fixed: Allows output sizes larger than 2 gigs in Linux.
+ + Fixed: Several small memory leaks have been plugged.
+ + Fixed: Fixes for 64-bit systems.
+ + Fixed: Keep Aspect Ratio is no longer forced, so user-set height values are respected.
+
+ CLI Interface Changes
+ + Added: Customize maximum width and height while keeping aspect ratio
+ + Changed: Much prettier help screen
+ + Changed: HBTest/MediaForkCLI renamed to HandBrakeCLI
+ + Fixed: Better display of audio and subtitle ids
+
+ Mac GUI Changes
+ + Added: Presets! Includes initial ones for AppleTV, iPod, and PS3.
+ + Added: Preference option to auto-name output files with the DVD name and title number.
+ + Added: Preset support for x264 options.
+ + Changed: Remembers last destination path.
+ + Changed: Remembers last source path.
+ + Changed: Copy and paste in text fields.
+ + Changed: Updates target size more quickly.
+ + Changed: Mac GUI no longer retains target size values between enqueued jobs. (http://HandBrake.m0k.org/forum/viewtopic.php?t=249)
+ + Fixed: Preview frames are no longer distorted in anamorphic mode.
+ + Fixed: Mac GUI no longer floats above other windows.
+ + Fixed: Browse by file no longer dims the browse button preventing you from changing browse locations without switching back and forth between it and drive selection. (http://HandBrake.m0k.org/forum/viewtopic.php?t=342)
+ + Fixed: Makes sure destination directory is valid.
+ + Fixed: Fills in the file save field with the current output name instead of leaving it blank.
+ + Fixed: Update destination field with the current path instead of using the last one, which could have been a DVD.
+
+ Windows GUI Changes ñ Version 2.2 beta 1
+ + Added: A few presets for the iPod in the menu.
+ + Added: Ability to set default settings for all program encode options.
+ + Added: Ability to turn off Automatic Update check on start-up. See Tools > Options
+ + Added: Mod 16 check on the Height and Width boxes.
+ + Added: Check the amount of hard disk space left is not running low when saving file.
+ + Added: Option to have a Read DVD window showup on start-up.
+ + Added: ìView DVD dataî Menu item in the tools menu.
+ + Added: Links to the Homepage, forum, wiki and documentation page in the Help menu.
+ + Added: Chapter markers check box (New feature in 0.8.5b1 CLI)
+ + Changed: View DVD Information no longer appears after clicking the ìBrowseî button.
+ + Changed: A few changes to the GUI - replaced textboxes with Dropdowns which auto-populate.
+ + Changed: Auto Crop and Aspect text now automatically update when a new title is selected.
+ + Changed: Several tweaks to the GUI design, remove a few text items that are no longer needed.
+ + Changed: Ability to Queue videos enabled with completely re-written code.
+ + Changed: Ability to queue stuff up while the encoding process is running.
+ + Changed: Ability to remove items from the encode queue while is running.
+ + Changed: Anamorphic option blanks out resolution boxes.
+ + Changed: Re-written update checker.
+ + Changed: Ability to turn off update check on start-up in Tools > Options
+ + Changed: Auto Crop option now fills in figures into text boxes when selected.
+ + Changed: Mp4 now default output file extension.
+ + Changed: Enabled 5.1 AAC option.
+ + Changed: Enabled h264 advanced options.
+ + Changed: Updated the FAQ.
+ + Changed: Included new version of HandBrake. Version 0.8.5b1.
+ + Fixed: Pixel Ratio Not being saved with the profile.
+ + Removed: Both ìView Dataî buttons on the Title Selection Window.
+ + Removed: The ìRead DVDî button. - Automatically reads the DVD after selecting a source now.
+ + Removed: The Help and Support window. Been replaced with a few Web Links.
+
+
+Changes between 0.7.1 and 0.8.0
+ + MediaFork project forked from HandBrake source <http://handbrake.m0k.org/>
+ + Updated libraries (meaning better quality, hopefully fewer bugs, and increased speeds)
+ + iPod 5.5G support
+ + Revamped graphical interface (Mac OS X)
+ + Anamorphic encoding with pixel aspect ratio
+ + Brighter color reproduction in QuickTime
+ + Lists disks by DVD name instead of by drive name (Mac OS X)
+ + Titles output movies based on the DVD name (Mac OS X)
+ + 32Khz audio output
+ + Constant rate factor encoding with x264
+ + New preference item to turn deinterlacing on by default (Mac OS X)
+ + New preference item to select the default audio language (Mac OS X)
+ + Bugfix for reading straight from a DVD
+
+Changes between 0.7.0 and 0.7.1
+ + Universal Binary for PPC and Intel
+ + Bugfixes for missing subtitles, audio glitches with LPCM tracks and more
+
+Changes between 0.7.0-beta3 and 0.7.0
+ + Multithreaded H.264 encoding with x264
+ + Added option for H.264 Baseline (suitable for iPods)
+ + (Very) experimental queue support
+ + Fixes for some DVD titles HandBrake would not recognize
+ + Fixes audio gliches when encoding from LPCM tracks
+
+Changes between 0.6.2 and 0.7.0-beta3
+ + Chapters selection
+ + Custom framerate
+ + Subtitle support
+ + Check for updates
+ + Custom aspect ratio
+ + Audio samplerate selection
+ + mp4/H.264 output
+ + Proper NTSC support
+ + AC3 pass-through
+ + Progress bar in the dock icon (OS X)
+ + 2-pass H.264 encoding
+ + Constant quality encoding
+ + Grayscale encoding
+ + Up-to-date BeOS UI
+
+Changes between 0.6.1 and 0.6.2
+ + Support for DVDs with MPEG audio tracks
+ + Rewrote the DVD navigation code
+ + High quality resampler included
+ + Better AVI compliance
+ + Updated encoders
+ + Internal improvements
+ + Bugfixes
+
+Changes between 0.6.0 and 0.6.1
+ + Fixed LPCM endianness issue
+
+Changes between 0.5.2 and 0.6.0
+ + MP4 and OGM output
+ + AAC and Vorbis encoding
+ + Experimental H264 encoding
+ + LPCM DVDs support
+ + Autocrop
+ + GTK2 linux interface
+ + OS X interface localization
+
+Changes between 0.5.1 and 0.5.2
+ + Bugfixes
+
+Changes between 0.5 and 0.5.1
+ + 2-pass XviD encoding
+ + Bugfixes
+
+Changes between 0.4 and 0.5
+ + Bugfixes, rewrite of large parts of the core
+ + XviD encoding (1-pass only)
+
+Changes between 0.3 and 0.4
+ + Better multithreading
+ + Allow the user to specify a target size instead of bitrate
+ + Misc GUI enhancements
+ + Use low-priority threads on OS X
+
+Changes between 0.2 and 0.3
+ + OSX & Linux ports
+ + Allow 2-pass encoding
+ + Many internal changes & fixes
+
+Changes between 0.1.1 and 0.2
+ + Fixed a major bug that made HandBrake probably crash after ~ 15
+ minutes encoded
+ + Fixed a few minor memory leaks
+
+Changes between 0.1 and 0.1.1
+ + Fixed a stupid bug that prevented to scan volumes correctly if
+ FAT/NTFS/etc volumes were mounted
+
+Changes between 0.1-alpha2 and 0.1 :
+ + Automatically detect ripped DVDs on BFS volumes
+ + Allow picture cropping and resizing
+ + Allow dual-audio encoding
+ + Created files are quite compliant now (tested with OSX/Quicktime
+ and BSPlayer)
+ + Better A/V sync with some DVDs
+
+Changes between 0.1-alpha and 0.1-alpha2 :
+ + Show length for each title
+ + Fixed the screwed-audio bug
+ + Many bugfixes...
+
+First version is 0.1-alpha.
diff --git a/win/CS/doc/THANKS b/win/CS/doc/THANKS
new file mode 100644
index 000000000..cb388aefd
--- /dev/null
+++ b/win/CS/doc/THANKS
@@ -0,0 +1,70 @@
+THANKS file for HandBrake <http://handbrake.fr/>
+
+Several people noticeably contributed to MediaFork and HandBrake development
+without writing code (submitting/checking translations, DVD samples, etc).
+Let's thank them here!
+
+Chris (audley)
+ + Inspiration and example of patching mpeg4ip for iPod atom support
+
+Omar Ahmad Bhatti
+ + Intensive beta testing, suggestions. Convinced me to port HandBrake
+ to OS X, which finally was a pretty good idea.
+
+Hanna Bauer
+Adrien Marquette
+Norbert Rittel
+ + German translation
+
+Paul B�n�chet
+Luidgi Esposito
+Andrea Gianarro
+Emilio Gelosi
+ + Italian translation
+
+Adam
+ + Polish translation
+
+Nik Roby
+ + Russian translation
+
+Leendert
+ + Dutch translation
+
+Eric Kornblum
+ + Sent me a sample DVD with LPCM tracks
+
+migol Superkid
+ + Spanish translation
+
+pgjw
+ + Portuguese translation
+
+cygma
+ + Japanese translation
+
+Michelle De Sio
+ + Sent me a sample DVD with MPEG audio tracks
+
+Ian Rickard
+ + Enhanced icon
+
+S�bastien No�l
+ + Debian packages (http://www.twolife.org/debian/repository.php)
+
+People who sent me an iTunes gift certificate: a BIG thanks!
+
+Paul (baggss)
+ + Forum Moderator
+
+Du'Wayne Caviness (Cavalicious)
+ + Forum Moderator
+
+Edward Jackson. (TedJ)
+ + Forum Moderator
+
+Chuck (cvk_b)
+ + Testing Team Member
+
+Nate Thompson (nightstrm)
+ + Forum Moderator \ No newline at end of file
diff --git a/win/CS/doc/TRANSLATIONS b/win/CS/doc/TRANSLATIONS
new file mode 100644
index 000000000..c88258829
--- /dev/null
+++ b/win/CS/doc/TRANSLATIONS
@@ -0,0 +1,23 @@
+$Id: TRANSLATIONS,v 1.2 2004/03/22 18:20:30 titer Exp $
+
+TRANSLATIONS file for HandBrake <http://handbrake.fr/>
+
+Translating HandBrake
+=====================
+
+***** HandBrake does not currently have a localization scheme for any of its interfaces.
+***** Information below is obsolete and only useful for historical purposes:
+
+Only the OS X interface of HandBrake can be translated at the moment.
+Localization is not implemented in BeOS and GTK GUIs.
+
+HandBrake uses the NSLocalizedString() OS X function to translate every
+item in the interface. Therefore, you don't need (and mustn't) modify
+the nib files. All you have to do is to write a Localizable.strings for
+your language. You can get it (for the latest release) at
+<http://handbrake.m0k.org/Localizable.strings>.
+
+Edit it with Xcode, save it to HandBrake/macosx/i18n/xx.strings (where
+'xx' are the two letters representing your language), then add 'xx' to
+the language list in the Jamrules file.
+
diff --git a/win/CS/frmAbout.Designer.cs b/win/CS/frmAbout.Designer.cs
new file mode 100644
index 000000000..00d2f76cc
--- /dev/null
+++ b/win/CS/frmAbout.Designer.cs
@@ -0,0 +1,165 @@
+/* frmAbout.Designer.cs
+
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake
+{
+ partial class frmAbout
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmAbout));
+ this.Label3 = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ this.PictureBox1 = new System.Windows.Forms.PictureBox();
+ this.btn_close = new System.Windows.Forms.Button();
+ this.richTextBox1 = new System.Windows.Forms.RichTextBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.lbl_GUIBuild = new System.Windows.Forms.Label();
+ ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).BeginInit();
+ this.SuspendLayout();
+ //
+ // Label3
+ //
+ this.Label3.AutoSize = true;
+ this.Label3.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Label3.Location = new System.Drawing.Point(124, 12);
+ this.Label3.Margin = new System.Windows.Forms.Padding(3, 3, 3, 1);
+ this.Label3.Name = "Label3";
+ this.Label3.Size = new System.Drawing.Size(99, 19);
+ this.Label3.TabIndex = 25;
+ this.Label3.Text = "HandBrake";
+ this.Label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(125, 36);
+ this.label1.Margin = new System.Windows.Forms.Padding(3);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(224, 13);
+ this.label1.TabIndex = 33;
+ this.label1.Text = "Copyright 2003-2011 HandBrake Developers";
+ this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // PictureBox1
+ //
+ this.PictureBox1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+ this.PictureBox1.Image = global::Handbrake.Properties.Resources.logo128;
+ this.PictureBox1.InitialImage = null;
+ this.PictureBox1.Location = new System.Drawing.Point(9, 9);
+ this.PictureBox1.Margin = new System.Windows.Forms.Padding(0);
+ this.PictureBox1.Name = "PictureBox1";
+ this.PictureBox1.Size = new System.Drawing.Size(96, 96);
+ this.PictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.PictureBox1.TabIndex = 33;
+ this.PictureBox1.TabStop = false;
+ //
+ // btn_close
+ //
+ this.btn_close.DialogResult = System.Windows.Forms.DialogResult.OK;
+ this.btn_close.Location = new System.Drawing.Point(468, 270);
+ this.btn_close.Name = "btn_close";
+ this.btn_close.Size = new System.Drawing.Size(75, 23);
+ this.btn_close.TabIndex = 35;
+ this.btn_close.Text = "OK";
+ this.btn_close.UseVisualStyleBackColor = true;
+ this.btn_close.Click += new System.EventHandler(this.btn_close_Click);
+ //
+ // richTextBox1
+ //
+ this.richTextBox1.Location = new System.Drawing.Point(128, 102);
+ this.richTextBox1.Name = "richTextBox1";
+ this.richTextBox1.Size = new System.Drawing.Size(415, 162);
+ this.richTextBox1.TabIndex = 36;
+ this.richTextBox1.Text = resources.GetString("richTextBox1.Text");
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(125, 83);
+ this.label2.Margin = new System.Windows.Forms.Padding(3);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(46, 13);
+ this.label2.TabIndex = 37;
+ this.label2.Text = "License:";
+ this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // lbl_GUIBuild
+ //
+ this.lbl_GUIBuild.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lbl_GUIBuild.Location = new System.Drawing.Point(229, 17);
+ this.lbl_GUIBuild.Margin = new System.Windows.Forms.Padding(3, 1, 3, 3);
+ this.lbl_GUIBuild.Name = "lbl_GUIBuild";
+ this.lbl_GUIBuild.Size = new System.Drawing.Size(224, 13);
+ this.lbl_GUIBuild.TabIndex = 38;
+ this.lbl_GUIBuild.Text = "{GUI Version}";
+ this.lbl_GUIBuild.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // frmAbout
+ //
+ this.AcceptButton = this.btn_close;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
+ this.CancelButton = this.btn_close;
+ this.ClientSize = new System.Drawing.Size(555, 302);
+ this.Controls.Add(this.lbl_GUIBuild);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.richTextBox1);
+ this.Controls.Add(this.btn_close);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.PictureBox1);
+ this.Controls.Add(this.Label3);
+ this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "frmAbout";
+ this.ShowIcon = false;
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "About HandBrake";
+ ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ internal System.Windows.Forms.Label Label3;
+ internal System.Windows.Forms.Label label1;
+ internal System.Windows.Forms.PictureBox PictureBox1;
+ private System.Windows.Forms.Button btn_close;
+ private System.Windows.Forms.RichTextBox richTextBox1;
+ internal System.Windows.Forms.Label label2;
+ internal System.Windows.Forms.Label lbl_GUIBuild;
+ }
+} \ No newline at end of file
diff --git a/win/CS/frmAbout.cs b/win/CS/frmAbout.cs
new file mode 100644
index 000000000..70fc92250
--- /dev/null
+++ b/win/CS/frmAbout.cs
@@ -0,0 +1,41 @@
+/* frmAbout.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake
+{
+ using System;
+ using System.Windows.Forms;
+
+ /// <summary>
+ /// The About Window
+ /// </summary>
+ public partial class frmAbout : Form
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="frmAbout"/> class.
+ /// </summary>
+ public frmAbout()
+ {
+ InitializeComponent();
+
+ string nightly = Properties.Settings.Default.hb_version.Contains("svn") ? " (SVN / Nightly Build)" : string.Empty;
+ lbl_GUIBuild.Text = Properties.Settings.Default.hb_version + " (" + Properties.Settings.Default.hb_build + ") " + nightly;
+ }
+
+ /// <summary>
+ /// Button - Close the window
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void btn_close_Click(object sender, EventArgs e)
+ {
+ this.Close();
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/frmAbout.resx b/win/CS/frmAbout.resx
new file mode 100644
index 000000000..796f0d5e9
--- /dev/null
+++ b/win/CS/frmAbout.resx
@@ -0,0 +1,507 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <data name="richTextBox1.Text" xml:space="preserve">
+ <value>This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</value>
+ </data>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA
+ IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA
+ AACACgAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8A/wAAAAD/AAAAAIAAgICAAICAAAAAgAAAAICAAIAA
+ AACAAIAAgP//ACAgIADg4OAAIAAAAAAgAABg4CAAQOBAAGBgYAAgYAAAQKDgAAAAIABAwCAAIEAAAECg
+ AABg4AAAIGCAAECAoABgoMAAYECgAGDAAABgICAAoKCgAOAAAAAgIAAAAGAAAEDgAABgAAAAIAAgAEAg
+ IAAgQGAAIIDAAADg4ABgAGAAgOD/ACCA/wCgAAAAQGAAACCAAAAAoAAAYCAAAAAgIAAgIEAAYGBAAEBg
+ YAAAIIAAAGCAAGCAgABAAKAAAICgAACgoACAoKAAIKDAAECgwAAAAOAAQADgAADA4ABgwOAAIODgAADg
+ AADA4AAAAEAgAKDgIAAA4EAAYABAAABAYACAAGAAgCBgAGAggABA4KAAAECgAGBAwADgIOAAIEDgAACA
+ 4ADgoOAAYAD/ACBg/wAAoP8A4KD/AGD//wAICAgACAAAAAgIAAAAAJgACAAIAAAACAAACAAACBAQACA4
+ SAAgYIgAOHCIADhw+AAIGAAAEBAIACg4QAAwYHgAAACIACA4QAAoQFAAKFh4AHh4eAAwaIAAIGiQADh4
+ mAAACAgAEAgIABAYGAAgGBgASEhIABhIYAAoUGAAIFBoAChQaAAoWGgAMFhoAChoiAAweJgAKHioACiA
+ sAAIEAAACAgQAAgQGAAQGCAAGCAoABhAUAAoSFgAaGhoABhQcAAgWHAAKFhwADhgcAAYWIAAOGiAAIiI
+ iAAoaJAAKHCYACh4oAA4gKAAMICoAKioqAAwmNAAEDgAAChYAAAweAAAMIgQAAgYGAAYGBgACBggABAg
+ KAAgKCgAKCgoACAwOAA4ODgAKDhIADBQWABYWFgAGEhoADBYcAAYUHgAGFh4ACBYeAAoYHgAKGCAABhY
+ iAAgaJgAKICoACiIuAC4uLgAMJDIADiw6AAQCAAAABgAAAggAAAAOAAAMGgAABgQCAAwgAgAEAgQABgQ
+ EAAwmBgAGBggAAgYKAAAICgACCAoABgoMAAgKDAAGDBAABg4QAAYOFAAEEBYACBIWAAwSFgAOEhYACBI
+ YAAQSGgAOFhoABhIcAAoUHAAQFhwACBgeABAaIAAIGiIADBwiABAcIgAGGCQADhwkABYeJAACBCgAChw
+ oAAweKAAKIC4ACiQwAAwmMgAOKjgADBg6ABAsOgAELD4AAgoAAAIMAAAGDAAABhIAAAYUAAAKHgAAACY
+ AAAwmAAAAMgAABAACAAIEAgAEBgIABA4CAAYOAgAMHgIABAYEAAYGBAAIBgQACh4EAAwmBAAEBAYABgg
+ GAAoIBgAGCAgAAgIKAAgICgAGAgwAAggMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAn2KfdXV1XAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoo2+QIJCJb28Sd3em
+ nQAAAFuKqW0aqsd6Y5/DXAAAAAAAAAAAAAAAAAAAAAAAAAB3kAWQkG8SpqaJb28gsncAbIeSroyii21x
+ kczIwwAAAAAAAAAAAAAAAAAAAAAAAABoo4mJkLKylm9vb5BvdwwAcZO/fox7z2NjqsOss2MAWwAAAAAA
+ AAAAAAAAAAAAAAAAvaGmo5ANlgUFEiBvo1xjq3p6qMTJroBkxXt9cGzFnAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAL2ylgV3vQAAAGOvxMXXq41uh6yVjxqp1YhknwAAAAAAAAAAAAAAAAAAAAAAAAAAAABvsolbAAAA
+ +5KneouS2Kx4pZF9ndywsXuvkocAAAAAAAAAAAAAAAAAAAAAAAAAAAB3sncAAAAAdayHca95bH9+cKmv
+ fMVucG2B4MYAAAAAAAAAAAAAAAAAAAAAAAAAAAChsqMAAAAAe3VkyHF5kW59cN3eZc/XyXutyot7AAAA
+ AAAAAAAAAAAAAAAAAAAAAACjIKEAAACgfv94gX+PituLDI0/aoBxqxqOY8PgbQAAAAAAAAAAAAAAAAAA
+ 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
+ OAAABwAA//wYAAADAAD/+BgAAAMAAP/AAAAAAwAA/wAAAAADAAD8AAAAAAMAAPwAAAAAAwAA+AAAAAAD
+ AADwAAAAAAMAAPAAAAAAAwAA8AAAAAADAADwAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAQAA8AAPAA
+ ABgADwAA+AAAHgAHAAD8AAAfgAMAAP4QAA+ADwAA/gAADgADAAD8AAAfAAMAAPAfxD/ABwAA4B/n/+AB
+ AADgB+B/wB8AAOADgB+ADwAA8AOAHhAPAAD4BwB/8kcAAPz/gf/nLwAA+P/5/+8/AADwf/n//z8AAPh/
+ /P//vwAA+P////+fAAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//
+ /wAAAP8AAP//AAAAgACAgIAAgAAAAACAAAAAgIAAgIAAAECg4ABAgKAAYOAgAEDgQAAAIAAAACAgACAg
+ IABgIIAAIAAAACBAAAAAYAAAIIAAAGAgIABAYGAAAACgAGCAoACgoKAA4ODgAGDAAAAAACAAYABgAIAg
+ YAAAYMAAICAAACBgAABgYAAAQKAAAKDAAAAA4AAAYOAAAABAIAAgQCAAYAAgACBAQABgYEAAIABgACAg
+ YAAgQGAAYGBgACBggABgYIAAgACgAKCAoABgIMAAQKDAAGCgwAAgwMAAAADgAIDA4ACgwOAAAODgAIDg
+ 4ACA4AAAgIAgAEDgIACgACAAQABgAIAggAAgYP8AAKD/AAgIAAAICAgACAAAABhAWAAoUGAAaGhoADBg
+ eAAoaIgAMICoAChggAAACAgAEAgIABgYGAAoUGgAKFhwAChwkAAIGAgACBAQABAgKAAQKDgAIEhgACBQ
+ aAAAAHgAIFh4AChgeAAAeHgAeHh4AChogAAwaIAAIGCIADBoiAA4cIgAIGiQADhwkAAoeKgAKICwAAgQ
+ AAAIIAAACAAIABhICAAICBAAMIgQABAYGAAYICgAGCgwAEhISAAwSFgAGFBoAChYaAAICHgAOGiAACh4
+ oAAweKAAGAAAAAAIAAAAGAAACBgAABAoAAAYUAAAKGAAAChoAAAAeAAAAAAIAAgQCAAQEAgAGP8IACAY
+ EAAIEBgAMJAYABggIAAAACgACBAoACgwMAAAKDgAEDA4ADg4OAAoOEAAGDhIACA4SAAAQEgAMEBIAEhQ
+ UAAISFgAIEhYAChIWAAwUFgAIEhoAEhYaAAYUHAAMFhwABhYeAAoWHgAIFiAAEhwgACIiIgAGGCQAAAA
+ mAAgcJgAKHCYADB4mACYmJgAACjIAEBw+ACo//8ASAAAAFgAAABoAAAAeAAAABAIAABICAAAGCgAAAA4
+ AAAYOAAACEAAAAhIAAAoUAAAAFgAACBYAAAAaAAAIGgAADB4AAAAiAAAMIgAAGiIAACAmAAAGAAIADAI
+ CABgCAgAEBgIAAggCAAQIAgAECgIAAgwCAAQMAgAODAIABA4CAAYOAgAEEAIABhACAAgQAgAIFAIAChg
+ CAAwgAgAMJAIADCoCAAACBAAGBAQABggEAAoIBAAKGAQAChoEAAgeBAAKHgQAEh4EAAY+BAACAAYAAAI
+ GAAICBgAEAgYAAAQGAAQEBgAABgYAAgYGAAYMBgAKHgYADCYGAAwoBgAMKgYAGj/GABgCCAACBAgAAgY
+ IAAQGCAAGBggACggIABIcCAACAAoABAAKAAAECgAEBAoAAggKAAACDAASAgwAAgQMAAIKDAAECgwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAARxBSUlJHAAAAAABYWFlY8kYAAAAAAAAAAAAAAAAAAJFgqqRLSzAwBXMAkKJbW1pdSVmE
+ AAAAAAAAAAAAAAAAEJdLqhpgYKQFkf9NmVRanHVJVZRQAAAAAAAAAAAAAAAAUY6RO6qXMHNYW5MxdFpm
+ TVtPSpAAAAAAAAAAAAAAAAAAAAAFpIYAAFSeW09PU15KU05MaEkAAAAAAAAAAAAAAAAAAEtgAAAAk55j
+ ml5Mp2haXUqpW3IAAAAAAAAAAAAAAAAAS0sAAEpJoE5PpZpMZVWnMZyZVQAAAAAAAAAAAAAAAABLMAAA
+ cqCeSnppZGZKWzFNaV2ecAAAAAAAAAAAAAAAAEtLAACLVF6iZHROp2eiW1paeWnxAAAAAAAAAAAAAABI
+ GmAAAElJSmh6SWNVSk5hZqJ1VXUAAAAAAAAAAAAAlpmjeJAAk12eZXZ5p3WndnZpaUlbZgAAAAAAAAAA
+ m2lFRTw8PDZeWV1OlE0xeWlNeVVdZmmZUAAAAAAAjzYKRaysRUVFRa02SXSnYaFNTUxpTFSoTmKTAAAA
+ AI8KOkSrrKysrKxErDullF6fVWhiVakLaVWbVZoAAAAAqK2sRKZEqyCsRKummKBZT0xPTHppZVMLqVN4
+ cQAAAAA6O6sYGKYYGKsYphgELjejY09KTTZNaWdMNpkAAAAA+zc6XFxcd3d3XASmXEw6PZZiZ6g2ZUw2
+ T2QLnwAAAAAdoTtcLcV3pndfLi2jraMtcmNkT05np0xnaXhUAAAAAAD5NKL87xgYd1+eLZ06+1wAVE6o
+ p2cKZ2WjjgAAAAAAAAAQo67EcuZuj5jkACue9gAAkTEKeJfbioptRgAAAAAAAACIr0dLVwBXmEeL5Qg4
+ AAAAAOnqwNbVb9O5AAAAAAAAAP38RmDae3tfkDqIX0UAAABq3W9v6+2BtssAAAAAAAD9q6v7AFl1dV9f
+ mpgIXwAAAABrtG9v7O2BagAAAACSF52fL/AAAAAAAHUAAAAAAAAAAACC1NS+3s/ZzAAAAJ03MjqjdJ0A
+ AAC3FIMUtwAAAAAAzr27goK5awAAAAAAWaNgGho3dAAAyr+/v4ODtQAAAMmAAM+2zxMTawAAAAAAAK6z
+ kZ1xAAC1un3HVwAAAAAAAAAAawB/ftAAAAAAAABCNUIAAAAAAAAAAF8AAAAAAAAAAEcAAGpGAAAAAAAA
+ AEKsEQAAAAAAAAAAlZUAAAAAAAAAAAAAAEgAAAAAAAAAAC3hAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAA
+ AAD///////////4BwH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAA
+ AAHgAAAB4AAAAeAAAAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9
+ /s/j/P/v8///7ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AFEl
+ swBJDW0ABEMwAAJHSQAFDwIAXl9ZAHJtagBwfYQAQVNqAAFtAAAAZgAAAz0CABQ/AQAXQwAAGkAAAA8g
+ AQAhSJQAM1SRABw6fgAFVk0ADE48AAplaQAgWgIAMYcMACl7CwAOJwMAAAMtABwPNwAhIQAABxACAA9S
+ UAAnQUgAAISfACRoDAAxmwQAK4MHABMpAAA8P1kATBMbACQSVwAKL1EADS5CADFMVQABIF4AJ3CGADB2
+ kAAzdlEAMnY1ABMnEwBARooAVVq5ABgATwAWBn0ABh56AAULaQBOeKYAT3WSACpNZwAucpgAMHifADFx
+ nwA1b5YAMF93AEBalgBvjecADCLAAAkPpQAbJr4AFiLGAAAJjgAzbIEANGh8AClhgAAzfKEAMHWWADJz
+ kwAsW3MAQ4mvADyY9AAtgf8AIpr/ACuk/wBdk9UAG0tkACladQAqbI4AK3GUAC5vjwArbpEALWJ7ACdl
+ aAAOaoQAJJ20ABx0gQAeTF8AJ116ACViggAgZosAJmeJAChvlAAhZIgAH1ZyAHVmYwAaPVMAJ19+ACto
+ hgAmaIwAKGB9ACFdfAAgY4YAGU5qAFtgYQAYQVgAIVx7ACtrjgAtZYIAJmKAACNhgQAmX3wAIUpdAHp6
+ ewARN0wAH1R0ACdXcgApXnoAJ2B+ACligQAdSmAAKiopAGZlZQCRkZEAbm9vAFFSUwAWO08AJFRuACFP
+ agAhUm0AHD9RAAMKDgA3NjUAWlpaADk5OQA3NzcAPDk3AAYSGQAVNUgAFjFAAA8jLwABAgQAVQAAAP//
+ /wBWAAAA/f//AFcAAAD8//8AWAAAAPz//wBZAAAA/P//AFoAAAD9//8AWwAAAP7//wBcAAAA////AF4A
+ AAABAAAAXwAAAAEAAABgAAAAAQAAAGEAAAABAAAAYgAAAAEAAAB3IFIAbWFuAAAAAAAAAAAAAAAAAAAA
+ AAC0VWMAtFVjALwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAEAAAAAADgDAACfAQAAPwAAAAEA
+ AABAAAAAAQAAAEEAAAABAAAAQgAAAAEAAABFAAAA////AEYAAAD+//8ARwAAAP3//wBIAAAA/P//AEkA
+ AAD8//8ASgAAAPz//wBLAAAA/f//AEwAAAD///8ATQAAAAMAAABOAAAABwAAAE8AAAALAAAAUAAAABAA
+ AABRAAAAFQAAAFIAAAAZAAAAUwAAABwAAABUAAAAHgAAAFUAAAAeAAAAVgAAAB0AAABXAAAAGgAAAFgA
+ AAAWAAAAWQAAABIAAABaAAAADQAAAFsAAAAIAAAAXAAAAAQAAABeAAAA/v//AF8AAAD8//8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAI2Oj5CRkpOUlZYAAAAAAACCg4SFhoeIiYqLjAAAAAAAAAB6AHt8fX5/gIEAAAAA
+ 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
+</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/win/CS/frmActivityWindow.Designer.cs b/win/CS/frmActivityWindow.Designer.cs
new file mode 100644
index 000000000..b71122f64
--- /dev/null
+++ b/win/CS/frmActivityWindow.Designer.cs
@@ -0,0 +1,173 @@
+/* frmDvdInfo.Designer.cs
+
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake
+{
+ partial class frmActivityWindow
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmActivityWindow));
+ this.rtf_actLog = new System.Windows.Forms.RichTextBox();
+ this.rightClickMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.mnu_copy_log = new System.Windows.Forms.ToolStripMenuItem();
+ this.mnu_openLogFolder = new System.Windows.Forms.ToolStripMenuItem();
+ this.ToolTip = new System.Windows.Forms.ToolTip(this.components);
+ this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+ this.btn_copy = new System.Windows.Forms.ToolStripButton();
+ this.logSelector = new System.Windows.Forms.ToolStripComboBox();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.rightClickMenu.SuspendLayout();
+ this.toolStrip1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // rtf_actLog
+ //
+ this.rtf_actLog.ContextMenuStrip = this.rightClickMenu;
+ this.rtf_actLog.Cursor = System.Windows.Forms.Cursors.IBeam;
+ this.rtf_actLog.DetectUrls = false;
+ this.rtf_actLog.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.rtf_actLog.Location = new System.Drawing.Point(0, 25);
+ this.rtf_actLog.Name = "rtf_actLog";
+ this.rtf_actLog.ReadOnly = true;
+ this.rtf_actLog.Size = new System.Drawing.Size(404, 552);
+ this.rtf_actLog.TabIndex = 29;
+ this.rtf_actLog.Text = "";
+ //
+ // rightClickMenu
+ //
+ this.rightClickMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.mnu_copy_log,
+ this.mnu_openLogFolder});
+ this.rightClickMenu.Name = "rightClickMenu";
+ this.rightClickMenu.Size = new System.Drawing.Size(254, 48);
+ //
+ // mnu_copy_log
+ //
+ this.mnu_copy_log.Image = global::Handbrake.Properties.Resources.copy;
+ this.mnu_copy_log.Name = "mnu_copy_log";
+ this.mnu_copy_log.Size = new System.Drawing.Size(253, 22);
+ this.mnu_copy_log.Text = "Copy";
+ this.mnu_copy_log.Click += new System.EventHandler(this.MnuCopyLogClick);
+ //
+ // mnu_openLogFolder
+ //
+ this.mnu_openLogFolder.Image = global::Handbrake.Properties.Resources.folder;
+ this.mnu_openLogFolder.Name = "mnu_openLogFolder";
+ this.mnu_openLogFolder.Size = new System.Drawing.Size(253, 22);
+ this.mnu_openLogFolder.Text = "Open Individual Log File Directory";
+ this.mnu_openLogFolder.Click += new System.EventHandler(this.MnuOpenLogFolderClick);
+ //
+ // ToolTip
+ //
+ this.ToolTip.Active = false;
+ //
+ // toolStrip1
+ //
+ this.toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
+ this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.btn_copy,
+ this.logSelector});
+ this.toolStrip1.Location = new System.Drawing.Point(0, 0);
+ this.toolStrip1.Name = "toolStrip1";
+ this.toolStrip1.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional;
+ this.toolStrip1.Size = new System.Drawing.Size(404, 25);
+ this.toolStrip1.TabIndex = 96;
+ this.toolStrip1.Text = "toolStrip1";
+ //
+ // btn_copy
+ //
+ this.btn_copy.Image = ((System.Drawing.Image)(resources.GetObject("btn_copy.Image")));
+ this.btn_copy.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.btn_copy.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btn_copy.Name = "btn_copy";
+ this.btn_copy.Size = new System.Drawing.Size(122, 22);
+ this.btn_copy.Text = "Copy to clipboard";
+ this.btn_copy.Click += new System.EventHandler(this.BtnCopyClick);
+ //
+ // logSelector
+ //
+ this.logSelector.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.logSelector.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.logSelector.Items.AddRange(new object[] {
+ "Scan Log",
+ "Encode Log"});
+ this.logSelector.Name = "logSelector";
+ this.logSelector.Size = new System.Drawing.Size(121, 25);
+ this.logSelector.SelectedIndexChanged += new System.EventHandler(this.LogSelectorClick);
+ //
+ // panel1
+ //
+ this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.panel1.Location = new System.Drawing.Point(0, 25);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(404, 552);
+ this.panel1.TabIndex = 97;
+ //
+ // frmActivityWindow
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.SystemColors.ControlLight;
+ this.ClientSize = new System.Drawing.Size(404, 577);
+ this.Controls.Add(this.rtf_actLog);
+ this.Controls.Add(this.panel1);
+ this.Controls.Add(this.toolStrip1);
+ this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "frmActivityWindow";
+ this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "Activity Window";
+ this.Load += new System.EventHandler(this.ActivityWindowLoad);
+ this.rightClickMenu.ResumeLayout(false);
+ this.toolStrip1.ResumeLayout(false);
+ this.toolStrip1.PerformLayout();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ internal System.Windows.Forms.RichTextBox rtf_actLog;
+ internal System.Windows.Forms.ToolTip ToolTip;
+ private System.Windows.Forms.ToolStrip toolStrip1;
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.ToolStripButton btn_copy;
+ private System.Windows.Forms.ContextMenuStrip rightClickMenu;
+ private System.Windows.Forms.ToolStripMenuItem mnu_copy_log;
+ private System.Windows.Forms.ToolStripMenuItem mnu_openLogFolder;
+ private System.Windows.Forms.ToolStripComboBox logSelector;
+ }
+} \ No newline at end of file
diff --git a/win/CS/frmActivityWindow.cs b/win/CS/frmActivityWindow.cs
new file mode 100644
index 000000000..b5e81ba37
--- /dev/null
+++ b/win/CS/frmActivityWindow.cs
@@ -0,0 +1,472 @@
+/* frmActivityWindow.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake
+{
+ using System;
+ using System.ComponentModel;
+ using System.Diagnostics;
+ using System.IO;
+ using System.Text;
+ using System.Threading;
+ using System.Windows.Forms;
+
+ using HandBrake.ApplicationServices.Services.Interfaces;
+
+ using Handbrake.Functions;
+
+ using Model;
+ using Timer = System.Threading.Timer;
+
+ /// <summary>
+ /// The Activity Log Window
+ /// </summary>
+ public partial class frmActivityWindow : Form
+ {
+ /* Private Variables */
+
+ /// <summary>
+ /// The Encode Object
+ /// </summary>
+ private readonly IEncode encode;
+
+ /// <summary>
+ /// The Scan Object
+ /// </summary>
+ private readonly IScan scan;
+
+ /// <summary>
+ /// The current position in the log file
+ /// </summary>
+ private int position;
+
+ /// <summary>
+ /// A Timer for this window
+ /// </summary>
+ private Timer windowTimer;
+
+ /// <summary>
+ /// The Type of log that the window is currently dealing with
+ /// </summary>
+ private ActivityLogMode mode;
+
+ /* Constructor */
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="frmActivityWindow"/> class.
+ /// </summary>
+ /// <param name="encode">
+ /// The encode.
+ /// </param>
+ /// <param name="scan">
+ /// The scan.
+ /// </param>
+ public frmActivityWindow(IEncode encode, IScan scan)
+ {
+ InitializeComponent();
+
+ this.encode = encode;
+ this.scan = scan;
+ this.position = 0;
+
+ // Listen for Scan and Encode Starting Events
+ scan.ScanStared += scan_ScanStared;
+ encode.EncodeStarted += encode_EncodeStarted;
+ }
+
+ /* Delegates */
+
+ /// <summary>
+ /// A callback function for updating the ui
+ /// </summary>
+ /// <param name="text">
+ /// The text.
+ /// </param>
+ private delegate void SetTextCallback(StringBuilder text);
+
+ /// <summary>
+ /// Clear text callback
+ /// </summary>
+ private delegate void SetTextClearCallback();
+
+ /// <summary>
+ /// Set mode callback
+ /// </summary>
+ /// <param name="setMode">
+ /// The set mode.
+ /// </param>
+ private delegate void SetModeCallback(ActivityLogMode setMode);
+
+ /* Private Methods */
+
+ /// <summary>
+ /// Set the window to scan mode
+ /// </summary>
+ /// <param name="setMode">
+ /// The set Mode.
+ /// </param>
+ private void SetMode(ActivityLogMode setMode)
+ {
+ if (IsHandleCreated)
+ {
+ if (rtf_actLog.InvokeRequired)
+ {
+ IAsyncResult invoked = BeginInvoke(new SetModeCallback(SetMode), new object[] { setMode });
+ EndInvoke(invoked);
+ }
+ else
+ {
+ Reset();
+ this.mode = setMode;
+
+ Array values = Enum.GetValues(typeof(ActivityLogMode));
+ Properties.Settings.Default.ActivityWindowLastMode = (int)values.GetValue(Convert.ToInt32(setMode));
+ Properties.Settings.Default.Save();
+
+ this.Text = mode == ActivityLogMode.Scan
+ ? "Activity Window (Scan Log)"
+ : "Activity Window (Encode Log)";
+
+ if (mode == ActivityLogMode.Scan)
+ {
+ scan.ScanCompleted += stopWindowRefresh;
+ encode.EncodeCompleted -= stopWindowRefresh;
+ }
+ else
+ {
+ scan.ScanCompleted -= stopWindowRefresh;
+ encode.EncodeCompleted += stopWindowRefresh;
+ }
+
+ // Start a fresh window timer
+ windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);
+ }
+ }
+ }
+
+ /// <summary>
+ /// On Window load, start a new timer
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The EventArgs.
+ /// </param>
+ private void ActivityWindowLoad(object sender, EventArgs e)
+ {
+ try
+ {
+ // Set the inital log file.
+ if (encode.IsEncoding)
+ {
+ this.logSelector.SelectedIndex = 1;
+ }
+ else if (scan.IsScanning)
+ {
+ this.logSelector.SelectedIndex = 0;
+ }
+ else
+ {
+ // Otherwise, use the last mode the window was in.
+ ActivityLogMode activitLogMode = (ActivityLogMode)Enum.ToObject(typeof(ActivityLogMode), Properties.Settings.Default.ActivityWindowLastMode);
+ this.logSelector.SelectedIndex = activitLogMode == ActivityLogMode.Scan ? 0 : 1;
+ }
+ }
+ catch (Exception exc)
+ {
+ Main.ShowExceptiowWindow("Error during load.", exc.ToString());
+ }
+ }
+
+ /// <summary>
+ /// Set the Log window to encode mode when an encode starts.
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void encode_EncodeStarted(object sender, EventArgs e)
+ {
+ SetMode(ActivityLogMode.Encode);
+ }
+
+ /// <summary>
+ /// Set the log widow to scan mode when a scan starts
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void scan_ScanStared(object sender, EventArgs e)
+ {
+ SetMode(ActivityLogMode.Scan);
+ }
+
+ /// <summary>
+ /// Stop refreshing the window when no scanning or encoding is happening.
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void stopWindowRefresh(object sender, EventArgs e)
+ {
+ windowTimer.Dispose();
+ Reset();
+ LogMonitor(null);
+ }
+
+ /// <summary>
+ /// Append new text to the window
+ /// </summary>
+ /// <param name="n">
+ /// The n.
+ /// </param>
+ private void LogMonitor(object n)
+ {
+ AppendWindowText(GetLog());
+ }
+
+ /// <summary>
+ /// New Code for getting the Activity log from the Services rather than reading a file.
+ /// </summary>
+ /// <returns>
+ /// The StringBuilder containing a log
+ /// </returns>
+ private StringBuilder GetLog()
+ {
+ StringBuilder appendText = new StringBuilder();
+
+ try
+ {
+ if (this.mode == ActivityLogMode.Scan)
+ {
+ if (scan == null || scan.ActivityLog == string.Empty)
+ {
+ appendText.AppendFormat("Waiting for the log to be generated ...\n");
+ position = 0;
+ ClearWindowText();
+ return appendText;
+ }
+
+ using (StringReader reader = new StringReader(scan.ActivityLog))
+ {
+ LogReader(reader, appendText);
+ }
+ }
+ else
+ {
+ if (encode == null || encode.ActivityLog == string.Empty)
+ {
+ appendText.AppendFormat("Waiting for the log to be generated ...\n");
+ position = 0;
+ ClearWindowText();
+ return appendText;
+ }
+
+ using (StringReader reader = new StringReader(encode.ActivityLog))
+ {
+ LogReader(reader, appendText);
+ }
+ }
+ }
+ catch (Exception exc)
+ {
+ windowTimer.Dispose();
+ Main.ShowExceptiowWindow("GetLog() Error.", exc.ToString());
+ }
+
+ return appendText;
+ }
+
+ /// <summary>
+ /// Reads the log data from a Scan or Encode object
+ /// </summary>
+ /// <param name="reader">
+ /// The reader.
+ /// </param>
+ /// <param name="appendText">
+ /// The append text.
+ /// </param>
+ private void LogReader(StringReader reader, StringBuilder appendText)
+ {
+ string line;
+ int i = 1;
+ while ((line = reader.ReadLine()) != null)
+ {
+ if (i > position)
+ {
+ appendText.AppendLine(line);
+ position++;
+ }
+ i++;
+ }
+ }
+
+ /// <summary>
+ /// Append text to the RTF box
+ /// </summary>
+ /// <param name="text">
+ /// The text.
+ /// </param>
+ private void AppendWindowText(StringBuilder text)
+ {
+ try
+ {
+ if (IsHandleCreated)
+ {
+ if (rtf_actLog.InvokeRequired)
+ {
+ IAsyncResult invoked = BeginInvoke(new SetTextCallback(AppendWindowText), new object[] { text });
+ EndInvoke(invoked);
+ }
+ else
+ lock (rtf_actLog)
+ rtf_actLog.AppendText(text.ToString());
+
+ // Stop the refresh process if log has finished.
+ if (text.ToString().Contains("HandBrake has Exited"))
+ {
+ windowTimer.Dispose();
+ }
+ }
+ }
+ catch (Exception)
+ {
+ return;
+ }
+ }
+
+ /// <summary>
+ /// Clear the contents of the log window
+ /// </summary>
+ private void ClearWindowText()
+ {
+ try
+ {
+ if (IsHandleCreated)
+ {
+ if (rtf_actLog.InvokeRequired)
+ {
+ IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(ClearWindowText));
+ EndInvoke(invoked);
+ }
+ else
+ lock (rtf_actLog)
+ rtf_actLog.Clear();
+ }
+ }
+ catch (Exception)
+ {
+ return;
+ }
+ }
+
+ /// <summary>
+ /// Reset Everything
+ /// </summary>
+ private void Reset()
+ {
+ if (windowTimer != null)
+ windowTimer.Dispose();
+ position = 0;
+ ClearWindowText();
+ windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);
+ }
+
+ /* Menus and Buttons */
+
+ /// <summary>
+ /// Copy log to clipboard
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void MnuCopyLogClick(object sender, EventArgs e)
+ {
+ Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);
+ }
+
+ /// <summary>
+ /// Open the log folder
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void MnuOpenLogFolderClick(object sender, EventArgs e)
+ {
+ string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";
+ string windir = Environment.GetEnvironmentVariable("WINDIR");
+ Process prc = new Process
+ {
+ StartInfo =
+ {
+ FileName = windir + @"\explorer.exe",
+ Arguments = logDir
+ }
+ };
+ prc.Start();
+ }
+
+ /// <summary>
+ /// Copy the log
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void BtnCopyClick(object sender, EventArgs e)
+ {
+ Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);
+ }
+
+ /// <summary>
+ /// Change the Log file in the viewer
+ /// </summary>
+ /// <param name="sender">The Sender </param>
+ /// <param name="e">The EventArgs</param>
+ private void LogSelectorClick(object sender, EventArgs e)
+ {
+ this.SetMode((string)this.logSelector.SelectedItem == "Scan Log" ? ActivityLogMode.Scan : ActivityLogMode.Encode);
+ }
+
+ /* Overrides */
+
+ /// <summary>
+ /// override onclosing
+ /// </summary>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ protected override void OnClosing(CancelEventArgs e)
+ {
+ scan.ScanStared -= scan_ScanStared;
+ encode.EncodeStarted -= encode_EncodeStarted;
+
+ scan.ScanCompleted -= stopWindowRefresh;
+ encode.EncodeCompleted -= stopWindowRefresh;
+
+ windowTimer.Dispose();
+ e.Cancel = true;
+ this.Dispose();
+ base.OnClosing(e);
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/frmActivityWindow.resx b/win/CS/frmActivityWindow.resx
new file mode 100644
index 000000000..ab607e8cf
--- /dev/null
+++ b/win/CS/frmActivityWindow.resx
@@ -0,0 +1,523 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="rightClickMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>205, 18</value>
+ </metadata>
+ <metadata name="ToolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+ <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>105, 17</value>
+ </metadata>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="btn_copy.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHlSURBVDhPpZPfT5JhGIb9U0rHXHXsH9BaWa0222oe1EFb
+ 2TriQI86atlsyzVstIkhzcLSAfYhNJdSiRCIEmEi9gMX2Vawoe77lET0w67gZUnQhm4+23323tfz3O/z
+ vjU1+y2n9zMFSe6okGU0TL9ziqnge/bELpgry+wIcK39GRNe7+4Q+3i0zJ/b/k33wCtc/igXW7twT3iq
+ QyxjMwLgioH0ASJxhQfml0g+BZtXxuqReTwmox9eEXrtmy8H9jsDOxNsbuVQ1rIkUmkBqKyOwSUaWvw4
+ XKESxGTziHN9/i10owq3pJ+0PYkz8Gb5P0CrMYVzWuFIswNpZLIIMeTzFnKvZ1SW5AyLiVU+xpcxjSQF
+ oFPKCUUWVrmsS3K4+QWHzg9R3/S0CCjk3ciqO521phjXDfPcty6WTaD8Uln4sYF/bg2jFEJz9lEJoKSz
+ fPqWYuZLgkDkO+53X2nvK6735mAarSHJpXsxzt2eFTJKQTSne0qAhlNXqFSbflYA1Hy8lKwyF19nPKxg
+ f7vCw6EAdY366uu92jEtAP92/jtBj22S2uO66oALNzxkNrcxDYfptYcwPg+KzgWzweLj4LG71QGNWlf+
+ tq1C9U1mNGd6qTvZTe2Jrry5kwNH7+z+zPf0mfZ76A/LmeTprDhiYwAAAABJRU5ErkJggg==
+</value>
+ </data>
+ <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA
+ IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA
+ AACACgAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8A/wAAAAD/AAAAAIAAgICAAICAAAAAgAAAAICAAIAA
+ AACAAIAAgP//ACAgIADg4OAAIAAAAAAgAABg4CAAQOBAAGBgYAAgYAAAQKDgAAAAIABAwCAAIEAAAECg
+ AABg4AAAIGCAAECAoABgoMAAYECgAGDAAABgICAAoKCgAOAAAAAgIAAAAGAAAEDgAABgAAAAIAAgAEAg
+ IAAgQGAAIIDAAADg4ABgAGAAgOD/ACCA/wCgAAAAQGAAACCAAAAAoAAAYCAAAAAgIAAgIEAAYGBAAEBg
+ YAAAIIAAAGCAAGCAgABAAKAAAICgAACgoACAoKAAIKDAAECgwAAAAOAAQADgAADA4ABgwOAAIODgAADg
+ AADA4AAAAEAgAKDgIAAA4EAAYABAAABAYACAAGAAgCBgAGAggABA4KAAAECgAGBAwADgIOAAIEDgAACA
+ 4ADgoOAAYAD/ACBg/wAAoP8A4KD/AGD//wAICAgACAAAAAgIAAAAAJgACAAIAAAACAAACAAACBAQACA4
+ SAAgYIgAOHCIADhw+AAIGAAAEBAIACg4QAAwYHgAAACIACA4QAAoQFAAKFh4AHh4eAAwaIAAIGiQADh4
+ mAAACAgAEAgIABAYGAAgGBgASEhIABhIYAAoUGAAIFBoAChQaAAoWGgAMFhoAChoiAAweJgAKHioACiA
+ sAAIEAAACAgQAAgQGAAQGCAAGCAoABhAUAAoSFgAaGhoABhQcAAgWHAAKFhwADhgcAAYWIAAOGiAAIiI
+ iAAoaJAAKHCYACh4oAA4gKAAMICoAKioqAAwmNAAEDgAAChYAAAweAAAMIgQAAgYGAAYGBgACBggABAg
+ KAAgKCgAKCgoACAwOAA4ODgAKDhIADBQWABYWFgAGEhoADBYcAAYUHgAGFh4ACBYeAAoYHgAKGCAABhY
+ iAAgaJgAKICoACiIuAC4uLgAMJDIADiw6AAQCAAAABgAAAggAAAAOAAAMGgAABgQCAAwgAgAEAgQABgQ
+ EAAwmBgAGBggAAgYKAAAICgACCAoABgoMAAgKDAAGDBAABg4QAAYOFAAEEBYACBIWAAwSFgAOEhYACBI
+ YAAQSGgAOFhoABhIcAAoUHAAQFhwACBgeABAaIAAIGiIADBwiABAcIgAGGCQADhwkABYeJAACBCgAChw
+ oAAweKAAKIC4ACiQwAAwmMgAOKjgADBg6ABAsOgAELD4AAgoAAAIMAAAGDAAABhIAAAYUAAAKHgAAACY
+ AAAwmAAAAMgAABAACAAIEAgAEBgIABA4CAAYOAgAMHgIABAYEAAYGBAAIBgQACh4EAAwmBAAEBAYABgg
+ GAAoIBgAGCAgAAgIKAAgICgAGAgwAAggMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAn2KfdXV1XAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoo2+QIJCJb28Sd3em
+ nQAAAFuKqW0aqsd6Y5/DXAAAAAAAAAAAAAAAAAAAAAAAAAB3kAWQkG8SpqaJb28gsncAbIeSroyii21x
+ kczIwwAAAAAAAAAAAAAAAAAAAAAAAABoo4mJkLKylm9vb5BvdwwAcZO/fox7z2NjqsOss2MAWwAAAAAA
+ AAAAAAAAAAAAAAAAvaGmo5ANlgUFEiBvo1xjq3p6qMTJroBkxXt9cGzFnAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAL2ylgV3vQAAAGOvxMXXq41uh6yVjxqp1YhknwAAAAAAAAAAAAAAAAAAAAAAAAAAAABvsolbAAAA
+ +5KneouS2Kx4pZF9ndywsXuvkocAAAAAAAAAAAAAAAAAAAAAAAAAAAB3sncAAAAAdayHca95bH9+cKmv
+ fMVucG2B4MYAAAAAAAAAAAAAAAAAAAAAAAAAAAChsqMAAAAAe3VkyHF5kW59cN3eZc/XyXutyot7AAAA
+ AAAAAAAAAAAAAAAAAAAAAACjIKEAAACgfv94gX+PituLDI0/aoBxqxqOY8PgbQAAAAAAAAAAAAAAAAAA
+ AAAAAAChkAwAAACieap4k3CVZIB/apWlxNTgepXbf4caagAAAAAAAAAAAAAAAAAAAAAAAAChkJ0AAABc
+ es1kxaLVl5eNkqnebHp6eK20amSvxlsAAAAAAAAAAAAAAAAAAAAAAACjlqMAAABcY5VurYBlfcuUgciB
+ fWSRxceHepPbgAAAAAAAAAAAAAAAAAAAAAAAAACJsqMAAACdeWOIgMeXbcN+35esZdeAedtxxYG0q54A
+ AAAAAAAAAAAAAAAAAAAAAKGyshJbAAD/ZGNp2LGUi9caennJh+DYi2Rx1J6LipMAAAAAAAAAAAAAAAAA
+ AAAAAKNvEqa9AACGccdxe3Jw1KmBioqAkm1pi5ezkofQq7BcAAAAAAAAAAAAAAAAvaUIPEI+QkI+esFc
+ asenr9X9bt6zqoDPsYeX1X7gq2SOfhrAAAAAAAAAAAAAAGJlQ+Mq4+PjKioqREOxS4aI3nJueox6eN7e
+ ktWO3WV4ybHb38NiAAAAAAAAAABcSxws4+MtZi3j4+Pj4+MNQzhszH1kjmp72Hnfen+OgHxtgXyXZXLG
+ AAAAAAAAAADNLCxYLWZmZmYtZi3jLS0UAUM4o4bYs4+BqYFjcH2Xl86UjpNqjJOtAAAAAAAAAM1DDWYt
+ U1Bm4eFmZmYtZuHaFEMpx63MiKR+25WPsX+NcNa0eLNpeZN5AAAAAAAAFWYNQ2ZmUF5m4V7hZmbhZuFe
+ a0sI/4aOampq1XIbzd0/bGVy4mVw0xtpAAAAAAAANywNZlNQ2l7a2l7aUOFT2tpeBMg7xTZyZWTXfaDV
+ l7SUfo5lZXDIZMpbAAAAAAAA2w2y2l5eXl5eXl5eXtraXl5eXl5reyw2jXHIZZFuj+J9sa/iaWWX4GwA
+ AAAAAAAAUA2WXl5eXl5ra2trXl5eXl5eBMU5Cws2aZU/2HHN4sptleKUbnIbcs4AAAAAAACDa1myBP7+
+ /v4EBAQ0///+NAQ0PQsLPWNppXqNY5eX4o+z2KWop9ulG8kAAAAAAAAA/BwNBAQ3Lh832tra0gg0NzSl
+ Cwul/ASGcM2zfXySiJTN23LLtLGNGwAAAAAAAAAAvTcNUdo0LjTa2tprNDzHBDekCxz8BP4Axty0G39x
+ sWW039gbGxvK+wAAAAAAAAAAW1umlvwnCcAENzQ3/giqNMe8pT0EXmAAAHZ8eZeK4G0blaE2ozXxYQAA
+ AAAAAAAAAAAAIG0lCWGj+gAAAMYIXF1bAMhL/FwAAAAAW9Xg4tN3menrvvf2t/EAAAAAAAAAAAAA/WkO
+ umB3vwBgAHNLYlsAAMI8QjgAAAAAAABg+Ofr6xj3vr6bmea3AAAAAAAAAAAAALUuaAANiQAAALU8xlw2
+ bFzBKkLBAAAAAADm9haa9773uZqZ7wAAAAAAAAAAAAAA/zc081uJEgBbW1zSCHYLHADBQjycAAAAAGH2
+ vru5FpoW95nnmABgAAAAAAAAAAAVUFNTN1tidQyhoAzGPAB3bcY8PsMAAAAAAObwgua5FrubEZu5F4IA
+ AAAAAAAAwJ68NzfaNwAAAAAAAABbPMgAxjg4AAAAAAAAAAAAt+e5vpuavhbp6GcAAAAAAACi2dPZ2dnR
+ hQAAAAAAAAAACM0AAAAAAAAAAAAAAAAAAOmam/K7ufbwmGdbXwAAAACk2dFt2c7Ry9NpAAAAAAAA7rjk
+ uOTuAAAAAAAAAAAA8euZ6bnpmpmCAAAAAAAAAADKLLI5DQ09xM7ZhgAAAGEj7Afs6gfquOQAAAAAAADw
+ 6ZhnE5no6JmZZwAAAAAAAAAAwzlvErIFlhyiYgAAAOXqMeoxI+oHB4IAAAAAYGcTtwCY6LeY54K55QAA
+ AAAAAAAAAB8nCTYSPRzEAAAAXyMHIyO4YWEAAAAAAAAAAAAAAACYYQBnmABntwAAAAAAAAAAAAAOJQAA
+ AAAAAAAAALa4XAD/xgAAAAAAAAAAAAAAAFsAAAAAt10AAAAAAAAAAAAAAARBOgAAAAAAAAAAAAAAAAAI
+ PAAAAAAAAAAAAAAAAFsAAAAAgmEAAAAAAAAAAAAAAEFZUf4AAAAAAAAAAAAAAADCCAAAAAAAAAAAAAAA
+ AAAAAAAAWwAAAAAAAAAAAAAAADpROoMAAAAAAAAAAAAAAAAAnGIAAAAAAAAAAAAAAAAAAAAAAFsAAAAA
+ AAAAAAAAAAD+YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxbAAAAAAD///////8AAP//
+ /////wAA//4/////AAD/wAPgA/8AAP+AAAAA/wAA/wAAAAB/AAD/gAAAAD8AAP/AAAAAPwAA//AGAAA/
+ AAD//BwAAD8AAP/+PAAAHwAA//48AAAfAAD//jgAAA8AAP/+OAAADwAA//44AAAHAAD//jgAAAcAAP/8
+ OAAABwAA//wYAAADAAD/+BgAAAMAAP/AAAAAAwAA/wAAAAADAAD8AAAAAAMAAPwAAAAAAwAA+AAAAAAD
+ AADwAAAAAAMAAPAAAAAAAwAA8AAAAAADAADwAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAQAA8AAPAA
+ ABgADwAA+AAAHgAHAAD8AAAfgAMAAP4QAA+ADwAA/gAADgADAAD8AAAfAAMAAPAfxD/ABwAA4B/n/+AB
+ AADgB+B/wB8AAOADgB+ADwAA8AOAHhAPAAD4BwB/8kcAAPz/gf/nLwAA+P/5/+8/AADwf/n//z8AAPh/
+ /P//vwAA+P////+fAAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//
+ /wAAAP8AAP//AAAAgACAgIAAgAAAAACAAAAAgIAAgIAAAECg4ABAgKAAYOAgAEDgQAAAIAAAACAgACAg
+ IABgIIAAIAAAACBAAAAAYAAAIIAAAGAgIABAYGAAAACgAGCAoACgoKAA4ODgAGDAAAAAACAAYABgAIAg
+ YAAAYMAAICAAACBgAABgYAAAQKAAAKDAAAAA4AAAYOAAAABAIAAgQCAAYAAgACBAQABgYEAAIABgACAg
+ YAAgQGAAYGBgACBggABgYIAAgACgAKCAoABgIMAAQKDAAGCgwAAgwMAAAADgAIDA4ACgwOAAAODgAIDg
+ 4ACA4AAAgIAgAEDgIACgACAAQABgAIAggAAgYP8AAKD/AAgIAAAICAgACAAAABhAWAAoUGAAaGhoADBg
+ eAAoaIgAMICoAChggAAACAgAEAgIABgYGAAoUGgAKFhwAChwkAAIGAgACBAQABAgKAAQKDgAIEhgACBQ
+ aAAAAHgAIFh4AChgeAAAeHgAeHh4AChogAAwaIAAIGCIADBoiAA4cIgAIGiQADhwkAAoeKgAKICwAAgQ
+ AAAIIAAACAAIABhICAAICBAAMIgQABAYGAAYICgAGCgwAEhISAAwSFgAGFBoAChYaAAICHgAOGiAACh4
+ oAAweKAAGAAAAAAIAAAAGAAACBgAABAoAAAYUAAAKGAAAChoAAAAeAAAAAAIAAgQCAAQEAgAGP8IACAY
+ EAAIEBgAMJAYABggIAAAACgACBAoACgwMAAAKDgAEDA4ADg4OAAoOEAAGDhIACA4SAAAQEgAMEBIAEhQ
+ UAAISFgAIEhYAChIWAAwUFgAIEhoAEhYaAAYUHAAMFhwABhYeAAoWHgAIFiAAEhwgACIiIgAGGCQAAAA
+ mAAgcJgAKHCYADB4mACYmJgAACjIAEBw+ACo//8ASAAAAFgAAABoAAAAeAAAABAIAABICAAAGCgAAAA4
+ AAAYOAAACEAAAAhIAAAoUAAAAFgAACBYAAAAaAAAIGgAADB4AAAAiAAAMIgAAGiIAACAmAAAGAAIADAI
+ CABgCAgAEBgIAAggCAAQIAgAECgIAAgwCAAQMAgAODAIABA4CAAYOAgAEEAIABhACAAgQAgAIFAIAChg
+ CAAwgAgAMJAIADCoCAAACBAAGBAQABggEAAoIBAAKGAQAChoEAAgeBAAKHgQAEh4EAAY+BAACAAYAAAI
+ GAAICBgAEAgYAAAQGAAQEBgAABgYAAgYGAAYMBgAKHgYADCYGAAwoBgAMKgYAGj/GABgCCAACBAgAAgY
+ IAAQGCAAGBggACggIABIcCAACAAoABAAKAAAECgAEBAoAAggKAAACDAASAgwAAgQMAAIKDAAECgwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAARxBSUlJHAAAAAABYWFlY8kYAAAAAAAAAAAAAAAAAAJFgqqRLSzAwBXMAkKJbW1pdSVmE
+ AAAAAAAAAAAAAAAAEJdLqhpgYKQFkf9NmVRanHVJVZRQAAAAAAAAAAAAAAAAUY6RO6qXMHNYW5MxdFpm
+ TVtPSpAAAAAAAAAAAAAAAAAAAAAFpIYAAFSeW09PU15KU05MaEkAAAAAAAAAAAAAAAAAAEtgAAAAk55j
+ ml5Mp2haXUqpW3IAAAAAAAAAAAAAAAAAS0sAAEpJoE5PpZpMZVWnMZyZVQAAAAAAAAAAAAAAAABLMAAA
+ cqCeSnppZGZKWzFNaV2ecAAAAAAAAAAAAAAAAEtLAACLVF6iZHROp2eiW1paeWnxAAAAAAAAAAAAAABI
+ GmAAAElJSmh6SWNVSk5hZqJ1VXUAAAAAAAAAAAAAlpmjeJAAk12eZXZ5p3WndnZpaUlbZgAAAAAAAAAA
+ m2lFRTw8PDZeWV1OlE0xeWlNeVVdZmmZUAAAAAAAjzYKRaysRUVFRa02SXSnYaFNTUxpTFSoTmKTAAAA
+ AI8KOkSrrKysrKxErDullF6fVWhiVakLaVWbVZoAAAAAqK2sRKZEqyCsRKummKBZT0xPTHppZVMLqVN4
+ cQAAAAA6O6sYGKYYGKsYphgELjejY09KTTZNaWdMNpkAAAAA+zc6XFxcd3d3XASmXEw6PZZiZ6g2ZUw2
+ T2QLnwAAAAAdoTtcLcV3pndfLi2jraMtcmNkT05np0xnaXhUAAAAAAD5NKL87xgYd1+eLZ06+1wAVE6o
+ p2cKZ2WjjgAAAAAAAAAQo67EcuZuj5jkACue9gAAkTEKeJfbioptRgAAAAAAAACIr0dLVwBXmEeL5Qg4
+ AAAAAOnqwNbVb9O5AAAAAAAAAP38RmDae3tfkDqIX0UAAABq3W9v6+2BtssAAAAAAAD9q6v7AFl1dV9f
+ mpgIXwAAAABrtG9v7O2BagAAAACSF52fL/AAAAAAAHUAAAAAAAAAAACC1NS+3s/ZzAAAAJ03MjqjdJ0A
+ AAC3FIMUtwAAAAAAzr27goK5awAAAAAAWaNgGho3dAAAyr+/v4ODtQAAAMmAAM+2zxMTawAAAAAAAK6z
+ kZ1xAAC1un3HVwAAAAAAAAAAawB/ftAAAAAAAABCNUIAAAAAAAAAAF8AAAAAAAAAAEcAAGpGAAAAAAAA
+ AEKsEQAAAAAAAAAAlZUAAAAAAAAAAAAAAEgAAAAAAAAAAC3hAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAA
+ AAD///////////4BwH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAA
+ AAHgAAAB4AAAAeAAAAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9
+ /s/j/P/v8///7ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AFEl
+ swBJDW0ABEMwAAJHSQAFDwIAXl9ZAHJtagBwfYQAQVNqAAFtAAAAZgAAAz0CABQ/AQAXQwAAGkAAAA8g
+ AQAhSJQAM1SRABw6fgAFVk0ADE48AAplaQAgWgIAMYcMACl7CwAOJwMAAAMtABwPNwAhIQAABxACAA9S
+ UAAnQUgAAISfACRoDAAxmwQAK4MHABMpAAA8P1kATBMbACQSVwAKL1EADS5CADFMVQABIF4AJ3CGADB2
+ kAAzdlEAMnY1ABMnEwBARooAVVq5ABgATwAWBn0ABh56AAULaQBOeKYAT3WSACpNZwAucpgAMHifADFx
+ nwA1b5YAMF93AEBalgBvjecADCLAAAkPpQAbJr4AFiLGAAAJjgAzbIEANGh8AClhgAAzfKEAMHWWADJz
+ kwAsW3MAQ4mvADyY9AAtgf8AIpr/ACuk/wBdk9UAG0tkACladQAqbI4AK3GUAC5vjwArbpEALWJ7ACdl
+ aAAOaoQAJJ20ABx0gQAeTF8AJ116ACViggAgZosAJmeJAChvlAAhZIgAH1ZyAHVmYwAaPVMAJ19+ACto
+ hgAmaIwAKGB9ACFdfAAgY4YAGU5qAFtgYQAYQVgAIVx7ACtrjgAtZYIAJmKAACNhgQAmX3wAIUpdAHp6
+ ewARN0wAH1R0ACdXcgApXnoAJ2B+ACligQAdSmAAKiopAGZlZQCRkZEAbm9vAFFSUwAWO08AJFRuACFP
+ agAhUm0AHD9RAAMKDgA3NjUAWlpaADk5OQA3NzcAPDk3AAYSGQAVNUgAFjFAAA8jLwABAgQAVQAAAP//
+ /wBWAAAA/f//AFcAAAD8//8AWAAAAPz//wBZAAAA/P//AFoAAAD9//8AWwAAAP7//wBcAAAA////AF4A
+ AAABAAAAXwAAAAEAAABgAAAAAQAAAGEAAAABAAAAYgAAAAEAAAB3IFIAbWFuAAAAAAAAAAAAAAAAAAAA
+ AAC0VWMAtFVjALwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAEAAAAAADgDAACfAQAAPwAAAAEA
+ AABAAAAAAQAAAEEAAAABAAAAQgAAAAEAAABFAAAA////AEYAAAD+//8ARwAAAP3//wBIAAAA/P//AEkA
+ AAD8//8ASgAAAPz//wBLAAAA/f//AEwAAAD///8ATQAAAAMAAABOAAAABwAAAE8AAAALAAAAUAAAABAA
+ AABRAAAAFQAAAFIAAAAZAAAAUwAAABwAAABUAAAAHgAAAFUAAAAeAAAAVgAAAB0AAABXAAAAGgAAAFgA
+ AAAWAAAAWQAAABIAAABaAAAADQAAAFsAAAAIAAAAXAAAAAQAAABeAAAA/v//AF8AAAD8//8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAI2Oj5CRkpOUlZYAAAAAAACCg4SFhoeIiYqLjAAAAAAAAAB6AHt8fX5/gIEAAAAA
+ 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
+</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/win/CS/frmAddPreset.Designer.cs b/win/CS/frmAddPreset.Designer.cs
new file mode 100644
index 000000000..530122101
--- /dev/null
+++ b/win/CS/frmAddPreset.Designer.cs
@@ -0,0 +1,182 @@
+/* AudioTrack.cs $
+
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake
+{
+ partial class frmAddPreset
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmAddPreset));
+ this.lbl_name = new System.Windows.Forms.Label();
+ this.txt_preset_name = new System.Windows.Forms.TextBox();
+ this.btn_add = new System.Windows.Forms.Button();
+ this.btn_cancel = new System.Windows.Forms.Button();
+ this.check_useFilters = new System.Windows.Forms.CheckBox();
+ this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+ this.cb_usePictureSettings = new System.Windows.Forms.ComboBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // lbl_name
+ //
+ this.lbl_name.AutoSize = true;
+ this.lbl_name.Location = new System.Drawing.Point(12, 18);
+ this.lbl_name.Name = "lbl_name";
+ this.lbl_name.Size = new System.Drawing.Size(75, 13);
+ this.lbl_name.TabIndex = 1;
+ this.lbl_name.Text = "Preset Name: ";
+ //
+ // txt_preset_name
+ //
+ this.txt_preset_name.Location = new System.Drawing.Point(130, 15);
+ this.txt_preset_name.Name = "txt_preset_name";
+ this.txt_preset_name.Size = new System.Drawing.Size(172, 21);
+ this.txt_preset_name.TabIndex = 0;
+ //
+ // btn_add
+ //
+ this.btn_add.BackColor = System.Drawing.Color.Transparent;
+ this.btn_add.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btn_add.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btn_add.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_add.Location = new System.Drawing.Point(185, 133);
+ this.btn_add.Name = "btn_add";
+ this.btn_add.Size = new System.Drawing.Size(57, 22);
+ this.btn_add.TabIndex = 2;
+ this.btn_add.Text = "Add";
+ this.btn_add.UseVisualStyleBackColor = false;
+ this.btn_add.Click += new System.EventHandler(this.BtnAddClick);
+ //
+ // btn_cancel
+ //
+ this.btn_cancel.BackColor = System.Drawing.Color.Transparent;
+ this.btn_cancel.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btn_cancel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btn_cancel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_cancel.Location = new System.Drawing.Point(248, 133);
+ this.btn_cancel.Name = "btn_cancel";
+ this.btn_cancel.Size = new System.Drawing.Size(57, 22);
+ this.btn_cancel.TabIndex = 3;
+ this.btn_cancel.Text = "Cancel";
+ this.btn_cancel.UseVisualStyleBackColor = false;
+ this.btn_cancel.Click += new System.EventHandler(this.BtnCancelClick);
+ //
+ // check_useFilters
+ //
+ this.check_useFilters.AutoSize = true;
+ this.check_useFilters.Location = new System.Drawing.Point(130, 106);
+ this.check_useFilters.Name = "check_useFilters";
+ this.check_useFilters.Size = new System.Drawing.Size(112, 17);
+ this.check_useFilters.TabIndex = 1;
+ this.check_useFilters.Text = "Use Picture Filters";
+ this.toolTip.SetToolTip(this.check_useFilters, "Save Picture Width/Height and Crop Values");
+ this.check_useFilters.UseVisualStyleBackColor = true;
+ //
+ // cb_usePictureSettings
+ //
+ this.cb_usePictureSettings.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.cb_usePictureSettings.FormattingEnabled = true;
+ this.cb_usePictureSettings.Items.AddRange(new object[] {
+ "None",
+ "Source Maximum"});
+ this.cb_usePictureSettings.Location = new System.Drawing.Point(130, 79);
+ this.cb_usePictureSettings.Name = "cb_usePictureSettings";
+ this.cb_usePictureSettings.Size = new System.Drawing.Size(172, 21);
+ this.cb_usePictureSettings.TabIndex = 6;
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label2.Location = new System.Drawing.Point(12, 57);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(100, 13);
+ this.label2.TabIndex = 7;
+ this.label2.Text = "Picture Settings:";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(12, 82);
+ this.label3.Margin = new System.Windows.Forms.Padding(3);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(87, 13);
+ this.label3.TabIndex = 8;
+ this.label3.Text = "Use Picture Size:";
+ //
+ // frmAddPreset
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
+ this.AutoSize = true;
+ this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+ this.ClientSize = new System.Drawing.Size(319, 166);
+ this.Controls.Add(this.label3);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.cb_usePictureSettings);
+ this.Controls.Add(this.lbl_name);
+ this.Controls.Add(this.txt_preset_name);
+ this.Controls.Add(this.check_useFilters);
+ this.Controls.Add(this.btn_cancel);
+ this.Controls.Add(this.btn_add);
+ this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "frmAddPreset";
+ this.Padding = new System.Windows.Forms.Padding(9);
+ this.ShowIcon = false;
+ this.ShowInTaskbar = false;
+ this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "Add New Preset";
+ this.TopMost = true;
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label lbl_name;
+ private System.Windows.Forms.TextBox txt_preset_name;
+ internal System.Windows.Forms.Button btn_add;
+ internal System.Windows.Forms.Button btn_cancel;
+ private System.Windows.Forms.CheckBox check_useFilters;
+ private System.Windows.Forms.ToolTip toolTip;
+ private System.Windows.Forms.ComboBox cb_usePictureSettings;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label3;
+ }
+} \ No newline at end of file
diff --git a/win/CS/frmAddPreset.cs b/win/CS/frmAddPreset.cs
new file mode 100644
index 000000000..bfc804cd5
--- /dev/null
+++ b/win/CS/frmAddPreset.cs
@@ -0,0 +1,116 @@
+/* frmAddPreset.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake
+{
+ using System;
+ using System.Windows.Forms;
+
+ using HandBrake.ApplicationServices.Model;
+ using HandBrake.ApplicationServices.Services;
+
+ using Handbrake.Functions;
+ using Handbrake.Model;
+
+ /// <summary>
+ /// The Add Preset Window
+ /// </summary>
+ public partial class frmAddPreset : Form
+ {
+ private readonly frmMain mainWindow;
+
+ /// <summary>
+ /// The Preset Handler
+ /// </summary>
+ private readonly PresetService presetCode;
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="frmAddPreset"/> class.
+ /// </summary>
+ /// <param name="mainWindow">
+ /// The Main Window
+ /// </param>
+ /// <param name="presetHandler">
+ /// The preset handler.
+ /// </param>
+ public frmAddPreset(frmMain mainWindow, PresetService presetHandler)
+ {
+ InitializeComponent();
+ this.mainWindow = mainWindow;
+ presetCode = presetHandler;
+
+ cb_usePictureSettings.SelectedIndex = 0;
+ }
+
+ /// <summary>
+ /// Handle the Add button event.
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void BtnAddClick(object sender, EventArgs e)
+ {
+ if (string.IsNullOrEmpty(txt_preset_name.Text.Trim()))
+ {
+ MessageBox.Show("You must enter a preset name!", "Warning",
+ MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ return;
+ }
+
+ QueryPictureSettingsMode pictureSettingsMode;
+
+ switch (cb_usePictureSettings.SelectedIndex)
+ {
+ case 0:
+ pictureSettingsMode = QueryPictureSettingsMode.None;
+ break;
+ case 1:
+ pictureSettingsMode = QueryPictureSettingsMode.SourceMaximum;
+ break;
+ default:
+ pictureSettingsMode = QueryPictureSettingsMode.None;
+ break;
+ }
+
+ string query = QueryGenerator.GenerateQueryForPreset(mainWindow, pictureSettingsMode, check_useFilters.Checked, 0, 0);
+
+
+ Preset preset = new Preset
+ {
+ Name = this.txt_preset_name.Text,
+ Query = query,
+ CropSettings = pictureSettingsMode != QueryPictureSettingsMode.None,
+ Description = string.Empty
+ };
+
+ if (presetCode.Add(preset))
+ {
+ this.DialogResult = DialogResult.OK;
+ this.Close();
+ }
+ else
+ MessageBox.Show("Sorry, that preset name already exists. Please choose another!", "Warning",
+ MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ }
+
+ /// <summary>
+ /// Handle the Cancel button event
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void BtnCancelClick(object sender, EventArgs e)
+ {
+ this.DialogResult = DialogResult.Cancel;
+ this.Close();
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/frmAddPreset.resx b/win/CS/frmAddPreset.resx
new file mode 100644
index 000000000..341225412
--- /dev/null
+++ b/win/CS/frmAddPreset.resx
@@ -0,0 +1,503 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA
+ IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA
+ AACACgAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8A/wAAAAD/AAAAAIAAgICAAICAAAAAgAAAAICAAIAA
+ AACAAIAAgP//ACAgIADg4OAAIAAAAAAgAABg4CAAQOBAAGBgYAAgYAAAQKDgAAAAIABAwCAAIEAAAECg
+ AABg4AAAIGCAAECAoABgoMAAYECgAGDAAABgICAAoKCgAOAAAAAgIAAAAGAAAEDgAABgAAAAIAAgAEAg
+ IAAgQGAAIIDAAADg4ABgAGAAgOD/ACCA/wCgAAAAQGAAACCAAAAAoAAAYCAAAAAgIAAgIEAAYGBAAEBg
+ YAAAIIAAAGCAAGCAgABAAKAAAICgAACgoACAoKAAIKDAAECgwAAAAOAAQADgAADA4ABgwOAAIODgAADg
+ AADA4AAAAEAgAKDgIAAA4EAAYABAAABAYACAAGAAgCBgAGAggABA4KAAAECgAGBAwADgIOAAIEDgAACA
+ 4ADgoOAAYAD/ACBg/wAAoP8A4KD/AGD//wAICAgACAAAAAgIAAAAAJgACAAIAAAACAAACAAACBAQACA4
+ SAAgYIgAOHCIADhw+AAIGAAAEBAIACg4QAAwYHgAAACIACA4QAAoQFAAKFh4AHh4eAAwaIAAIGiQADh4
+ mAAACAgAEAgIABAYGAAgGBgASEhIABhIYAAoUGAAIFBoAChQaAAoWGgAMFhoAChoiAAweJgAKHioACiA
+ sAAIEAAACAgQAAgQGAAQGCAAGCAoABhAUAAoSFgAaGhoABhQcAAgWHAAKFhwADhgcAAYWIAAOGiAAIiI
+ iAAoaJAAKHCYACh4oAA4gKAAMICoAKioqAAwmNAAEDgAAChYAAAweAAAMIgQAAgYGAAYGBgACBggABAg
+ KAAgKCgAKCgoACAwOAA4ODgAKDhIADBQWABYWFgAGEhoADBYcAAYUHgAGFh4ACBYeAAoYHgAKGCAABhY
+ iAAgaJgAKICoACiIuAC4uLgAMJDIADiw6AAQCAAAABgAAAggAAAAOAAAMGgAABgQCAAwgAgAEAgQABgQ
+ EAAwmBgAGBggAAgYKAAAICgACCAoABgoMAAgKDAAGDBAABg4QAAYOFAAEEBYACBIWAAwSFgAOEhYACBI
+ YAAQSGgAOFhoABhIcAAoUHAAQFhwACBgeABAaIAAIGiIADBwiABAcIgAGGCQADhwkABYeJAACBCgAChw
+ oAAweKAAKIC4ACiQwAAwmMgAOKjgADBg6ABAsOgAELD4AAgoAAAIMAAAGDAAABhIAAAYUAAAKHgAAACY
+ AAAwmAAAAMgAABAACAAIEAgAEBgIABA4CAAYOAgAMHgIABAYEAAYGBAAIBgQACh4EAAwmBAAEBAYABgg
+ GAAoIBgAGCAgAAgIKAAgICgAGAgwAAggMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAn2KfdXV1XAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoo2+QIJCJb28Sd3em
+ nQAAAFuKqW0aqsd6Y5/DXAAAAAAAAAAAAAAAAAAAAAAAAAB3kAWQkG8SpqaJb28gsncAbIeSroyii21x
+ kczIwwAAAAAAAAAAAAAAAAAAAAAAAABoo4mJkLKylm9vb5BvdwwAcZO/fox7z2NjqsOss2MAWwAAAAAA
+ AAAAAAAAAAAAAAAAvaGmo5ANlgUFEiBvo1xjq3p6qMTJroBkxXt9cGzFnAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAL2ylgV3vQAAAGOvxMXXq41uh6yVjxqp1YhknwAAAAAAAAAAAAAAAAAAAAAAAAAAAABvsolbAAAA
+ +5KneouS2Kx4pZF9ndywsXuvkocAAAAAAAAAAAAAAAAAAAAAAAAAAAB3sncAAAAAdayHca95bH9+cKmv
+ fMVucG2B4MYAAAAAAAAAAAAAAAAAAAAAAAAAAAChsqMAAAAAe3VkyHF5kW59cN3eZc/XyXutyot7AAAA
+ AAAAAAAAAAAAAAAAAAAAAACjIKEAAACgfv94gX+PituLDI0/aoBxqxqOY8PgbQAAAAAAAAAAAAAAAAAA
+ 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
+ OAAABwAA//wYAAADAAD/+BgAAAMAAP/AAAAAAwAA/wAAAAADAAD8AAAAAAMAAPwAAAAAAwAA+AAAAAAD
+ AADwAAAAAAMAAPAAAAAAAwAA8AAAAAADAADwAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAQAA8AAPAA
+ ABgADwAA+AAAHgAHAAD8AAAfgAMAAP4QAA+ADwAA/gAADgADAAD8AAAfAAMAAPAfxD/ABwAA4B/n/+AB
+ AADgB+B/wB8AAOADgB+ADwAA8AOAHhAPAAD4BwB/8kcAAPz/gf/nLwAA+P/5/+8/AADwf/n//z8AAPh/
+ /P//vwAA+P////+fAAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//
+ /wAAAP8AAP//AAAAgACAgIAAgAAAAACAAAAAgIAAgIAAAECg4ABAgKAAYOAgAEDgQAAAIAAAACAgACAg
+ IABgIIAAIAAAACBAAAAAYAAAIIAAAGAgIABAYGAAAACgAGCAoACgoKAA4ODgAGDAAAAAACAAYABgAIAg
+ YAAAYMAAICAAACBgAABgYAAAQKAAAKDAAAAA4AAAYOAAAABAIAAgQCAAYAAgACBAQABgYEAAIABgACAg
+ YAAgQGAAYGBgACBggABgYIAAgACgAKCAoABgIMAAQKDAAGCgwAAgwMAAAADgAIDA4ACgwOAAAODgAIDg
+ 4ACA4AAAgIAgAEDgIACgACAAQABgAIAggAAgYP8AAKD/AAgIAAAICAgACAAAABhAWAAoUGAAaGhoADBg
+ eAAoaIgAMICoAChggAAACAgAEAgIABgYGAAoUGgAKFhwAChwkAAIGAgACBAQABAgKAAQKDgAIEhgACBQ
+ aAAAAHgAIFh4AChgeAAAeHgAeHh4AChogAAwaIAAIGCIADBoiAA4cIgAIGiQADhwkAAoeKgAKICwAAgQ
+ AAAIIAAACAAIABhICAAICBAAMIgQABAYGAAYICgAGCgwAEhISAAwSFgAGFBoAChYaAAICHgAOGiAACh4
+ oAAweKAAGAAAAAAIAAAAGAAACBgAABAoAAAYUAAAKGAAAChoAAAAeAAAAAAIAAgQCAAQEAgAGP8IACAY
+ EAAIEBgAMJAYABggIAAAACgACBAoACgwMAAAKDgAEDA4ADg4OAAoOEAAGDhIACA4SAAAQEgAMEBIAEhQ
+ UAAISFgAIEhYAChIWAAwUFgAIEhoAEhYaAAYUHAAMFhwABhYeAAoWHgAIFiAAEhwgACIiIgAGGCQAAAA
+ mAAgcJgAKHCYADB4mACYmJgAACjIAEBw+ACo//8ASAAAAFgAAABoAAAAeAAAABAIAABICAAAGCgAAAA4
+ AAAYOAAACEAAAAhIAAAoUAAAAFgAACBYAAAAaAAAIGgAADB4AAAAiAAAMIgAAGiIAACAmAAAGAAIADAI
+ CABgCAgAEBgIAAggCAAQIAgAECgIAAgwCAAQMAgAODAIABA4CAAYOAgAEEAIABhACAAgQAgAIFAIAChg
+ CAAwgAgAMJAIADCoCAAACBAAGBAQABggEAAoIBAAKGAQAChoEAAgeBAAKHgQAEh4EAAY+BAACAAYAAAI
+ GAAICBgAEAgYAAAQGAAQEBgAABgYAAgYGAAYMBgAKHgYADCYGAAwoBgAMKgYAGj/GABgCCAACBAgAAgY
+ IAAQGCAAGBggACggIABIcCAACAAoABAAKAAAECgAEBAoAAggKAAACDAASAgwAAgQMAAIKDAAECgwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAARxBSUlJHAAAAAABYWFlY8kYAAAAAAAAAAAAAAAAAAJFgqqRLSzAwBXMAkKJbW1pdSVmE
+ AAAAAAAAAAAAAAAAEJdLqhpgYKQFkf9NmVRanHVJVZRQAAAAAAAAAAAAAAAAUY6RO6qXMHNYW5MxdFpm
+ TVtPSpAAAAAAAAAAAAAAAAAAAAAFpIYAAFSeW09PU15KU05MaEkAAAAAAAAAAAAAAAAAAEtgAAAAk55j
+ ml5Mp2haXUqpW3IAAAAAAAAAAAAAAAAAS0sAAEpJoE5PpZpMZVWnMZyZVQAAAAAAAAAAAAAAAABLMAAA
+ cqCeSnppZGZKWzFNaV2ecAAAAAAAAAAAAAAAAEtLAACLVF6iZHROp2eiW1paeWnxAAAAAAAAAAAAAABI
+ GmAAAElJSmh6SWNVSk5hZqJ1VXUAAAAAAAAAAAAAlpmjeJAAk12eZXZ5p3WndnZpaUlbZgAAAAAAAAAA
+ m2lFRTw8PDZeWV1OlE0xeWlNeVVdZmmZUAAAAAAAjzYKRaysRUVFRa02SXSnYaFNTUxpTFSoTmKTAAAA
+ AI8KOkSrrKysrKxErDullF6fVWhiVakLaVWbVZoAAAAAqK2sRKZEqyCsRKummKBZT0xPTHppZVMLqVN4
+ cQAAAAA6O6sYGKYYGKsYphgELjejY09KTTZNaWdMNpkAAAAA+zc6XFxcd3d3XASmXEw6PZZiZ6g2ZUw2
+ T2QLnwAAAAAdoTtcLcV3pndfLi2jraMtcmNkT05np0xnaXhUAAAAAAD5NKL87xgYd1+eLZ06+1wAVE6o
+ p2cKZ2WjjgAAAAAAAAAQo67EcuZuj5jkACue9gAAkTEKeJfbioptRgAAAAAAAACIr0dLVwBXmEeL5Qg4
+ AAAAAOnqwNbVb9O5AAAAAAAAAP38RmDae3tfkDqIX0UAAABq3W9v6+2BtssAAAAAAAD9q6v7AFl1dV9f
+ mpgIXwAAAABrtG9v7O2BagAAAACSF52fL/AAAAAAAHUAAAAAAAAAAACC1NS+3s/ZzAAAAJ03MjqjdJ0A
+ AAC3FIMUtwAAAAAAzr27goK5awAAAAAAWaNgGho3dAAAyr+/v4ODtQAAAMmAAM+2zxMTawAAAAAAAK6z
+ kZ1xAAC1un3HVwAAAAAAAAAAawB/ftAAAAAAAABCNUIAAAAAAAAAAF8AAAAAAAAAAEcAAGpGAAAAAAAA
+ AEKsEQAAAAAAAAAAlZUAAAAAAAAAAAAAAEgAAAAAAAAAAC3hAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAA
+ AAD///////////4BwH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAA
+ AAHgAAAB4AAAAeAAAAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9
+ /s/j/P/v8///7ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AFEl
+ swBJDW0ABEMwAAJHSQAFDwIAXl9ZAHJtagBwfYQAQVNqAAFtAAAAZgAAAz0CABQ/AQAXQwAAGkAAAA8g
+ AQAhSJQAM1SRABw6fgAFVk0ADE48AAplaQAgWgIAMYcMACl7CwAOJwMAAAMtABwPNwAhIQAABxACAA9S
+ UAAnQUgAAISfACRoDAAxmwQAK4MHABMpAAA8P1kATBMbACQSVwAKL1EADS5CADFMVQABIF4AJ3CGADB2
+ kAAzdlEAMnY1ABMnEwBARooAVVq5ABgATwAWBn0ABh56AAULaQBOeKYAT3WSACpNZwAucpgAMHifADFx
+ nwA1b5YAMF93AEBalgBvjecADCLAAAkPpQAbJr4AFiLGAAAJjgAzbIEANGh8AClhgAAzfKEAMHWWADJz
+ kwAsW3MAQ4mvADyY9AAtgf8AIpr/ACuk/wBdk9UAG0tkACladQAqbI4AK3GUAC5vjwArbpEALWJ7ACdl
+ aAAOaoQAJJ20ABx0gQAeTF8AJ116ACViggAgZosAJmeJAChvlAAhZIgAH1ZyAHVmYwAaPVMAJ19+ACto
+ hgAmaIwAKGB9ACFdfAAgY4YAGU5qAFtgYQAYQVgAIVx7ACtrjgAtZYIAJmKAACNhgQAmX3wAIUpdAHp6
+ ewARN0wAH1R0ACdXcgApXnoAJ2B+ACligQAdSmAAKiopAGZlZQCRkZEAbm9vAFFSUwAWO08AJFRuACFP
+ agAhUm0AHD9RAAMKDgA3NjUAWlpaADk5OQA3NzcAPDk3AAYSGQAVNUgAFjFAAA8jLwABAgQAVQAAAP//
+ /wBWAAAA/f//AFcAAAD8//8AWAAAAPz//wBZAAAA/P//AFoAAAD9//8AWwAAAP7//wBcAAAA////AF4A
+ AAABAAAAXwAAAAEAAABgAAAAAQAAAGEAAAABAAAAYgAAAAEAAAB3IFIAbWFuAAAAAAAAAAAAAAAAAAAA
+ AAC0VWMAtFVjALwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAEAAAAAADgDAACfAQAAPwAAAAEA
+ AABAAAAAAQAAAEEAAAABAAAAQgAAAAEAAABFAAAA////AEYAAAD+//8ARwAAAP3//wBIAAAA/P//AEkA
+ AAD8//8ASgAAAPz//wBLAAAA/f//AEwAAAD///8ATQAAAAMAAABOAAAABwAAAE8AAAALAAAAUAAAABAA
+ AABRAAAAFQAAAFIAAAAZAAAAUwAAABwAAABUAAAAHgAAAFUAAAAeAAAAVgAAAB0AAABXAAAAGgAAAFgA
+ AAAWAAAAWQAAABIAAABaAAAADQAAAFsAAAAIAAAAXAAAAAQAAABeAAAA/v//AF8AAAD8//8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAI2Oj5CRkpOUlZYAAAAAAACCg4SFhoeIiYqLjAAAAAAAAAB6AHt8fX5/gIEAAAAA
+ AAAAcQByc3R1dnd4eQAAAAAAAGgAaWprbG1ub3AAAAAAXF1eX2BhYmNkZWZnAAAAT1BRUlNUVVZXWFla
+ WwAAQUJDREVGR0hJSktMTU4AADM0NTY3ODk6Ozw9Pj9AAAAAJygpKissLQAuLzAxMgAAABwdHh8gISIA
+ ACMkJSYAABITFAAAFRYXAAAYGRobAAAHCAkKAAsMDQAADg8QEQAAAAMAAAAEBQAAAAAABgAAAAACAAAA
+ AAAAAAAAAAAAAP//AADgBwAA4AMAAPoDAAD6AQAA+gEAAOABAADAAQAAgAEAAIABAADAQQAAwGEAAIxh
+ AACEYQAA3PsAAN//AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAAGAAAACAAA
+ AAcAAAAHAAAABgAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxIOAwgFBAEOAQAAEgAA
+ ABgAAAAbAAAAHQAAAB0AAAAcAQEAGQAAABYAAAAQAAAADQAAAAwAAAAKAAAACgAAAAsAAAAQAAAAFwMH
+ CRwBAgMhAAMEIwEEBSUAAgMmAQICIwEBAR8AAAAYAAAAEQAAAAkAAAADAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAAgBAgATAQEBIAcI
+ CCwFBgc2BQUGQAYGBkgGBgVOBAQEVQUFBVUEBARTAQICTQcHB0UGBgY+BwcHNgICAi4AAAAoAAAAJAAA
+ ACcBAgIsAAABKQAAADAAAAA7AAAARwAAAE0BAABOAAAATAAAAEgAAAJCAQUHOAEAACwAAAAeAAAAEgAA
+ AAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGRIMEgAA
+ AB8AAAAxAAAAOwAAAFUAAAB2AAAAjQAAAKgAAAC1AAAAsQAAALIAAACrAAAAmQAAAIcAAABuAAAAWgAA
+ AEoAAABAAAAAQQABAzwAAAA8AAAAfA4eJZoGDA/AEx8m2A8YHNoSFxjaEBgbxwcAAJgDAACDAAAAagAA
+ AFUAAABHAAAAMwAAACAAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAIAAAAQBQMCIAAAADMBAABMEA4Nkjc2Ndh9e3r4kI+P/J+fn/+IiIn/b29v/3Jycv9xcnL/Xlxb+0lK
+ SvJGRkbaUVBQzBoaGqIAAAB4AAAAUwEAAF4MCwu/G1Fw/xtTdf8iQVD/ImCB/xtXdv8YN0n/HE1s/x46
+ S/8QIy35EiUw4QoDAKMAAABwAAAAXAIAAEIAAAArAAAAGAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAQAAAASAAAAIwUFBjIAAABkQ0ND/46Ojv9/gID8hoaG/YmJif1ycnL8YWJh/VVV
+ Vf1bW1v+ZGVl/nNzc/94eHj/np+f/7Ozs/9HSEn6AAECmR41QuYaP1L/KW2V+xZbh/spVm38Gi85/B1X
+ dPwpQE78H2OO/CZoj/0eSmP+Dz1a/w8oN/0AAACtAAABdgAAAGAAAABEAAAAKwAAABcAAAAGAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAMAAAAGwEBAC4AAAA9Dg0LtDUzMv9nZ2b/bm5u/oWF
+ hfu7u7v9v7+//qioqP5xcXH+cnJy/nl5efuQkJD6cXFx/FBQUP8kJCLuAwAAvyJpj/8mdJ77FRsd/ipp
+ iv4sW3L+KFNs/hZLbf4kOUb/HDlJ/htae/4XKjX+KF17/DCTxf4jPEj5AQAAyQUEBHEAAABRAAAAOgAA
+ ACIAAAAPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACgAAABgAAAAlAAAANhMQ
+ DoYqKCfbVVNT/zIxMf+Li4v/4uPi/qurq/99fX3+fX19/2FhYf+UlZX/fHt8/zIzNNEFAQCqHjdF8yNZ
+ dvwkUGj+Hk1q/y9adP8hKi3/IERa/xhah/8kdKT/IGOG/xEwQP4lUWj/MlVo/zJmfP4hNT3+Ey88/wkV
+ G9MAAABZAAIDPAAAACYAAAATAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAIAAAAJAAAAEQAAABAAAAAlAAAAUAAAAH4TExPdtbW1/qysrPx+fn7+QUBA9RUUE48AAABzSFNQRQAA
+ AEseOkvoI2iW/yArMf0TM0P/G2SS/h5VeP41XXH/J1d0/h0+UP8rYXz/NISq/zxrf/8hXH/+FFB4/ixt
+ jP8oSFn+IWKJ+w0iK/8DBAScAAMFOQAAASEAAAARAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAABMREANaW1oDDQsJAQcICAAEAwNqdHR0/8PDxPhmZmf/DAwMmHt6
+ egAiLzUAbImSABsgIZQoc5z/G0hn+iNQaP8fU27+Jm+W/zFwkP8qXXv/GUJc/y9QXv8papD/MFZq/xca
+ Gv8zfKD/KH6q/zSMtv4sUmj/G2WX+ydxlf4aPE3MAAAAHAoYHxcAAAAIMSgjAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQEAAgIBAgAAAAMAAAArSEhI+8TE
+ xP1LTEz7AAAAMwAAAAIbLDUHJj9NABAVGK8oYHz+F0BV+xxkkv4kapr/Jkte/yA1Pv8veJv/KWmH/zRo
+ g/8TTXb/ImyW/ydVaf8ZMkP/Klx4/zFmfv8nQ07+L4ex/jap4P0WNUP1AAAAUgAAAQAAAAACfmteAAoJ
+ CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOrr
+ 6gD+/v4ELzAw0rS0tP8xMTHkAgECDl5eXgARBwEADwcBLiZRZ/EOGBz+H2KH/RM/W/8eYpH/LU9f/yZk
+ jf8kWHf/MlRh/zFmf/8mg7r/K43C/zZviP8VSG//G2KR/x1FV/8mU2z/LWGE/y5LV/0jWXL+K1Rm9ggA
+ AEofEA4AJx8aAQoFAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAKSlpQGvsLAAMDExqJubm/4oJya3eHp7AGRsbwUrRVEAHSYpkClqjP8KJzf6GEpk/yeB
+ r/8sdZz/OGV6/xVMbv8icKP/I1Zt/x0cHP83YHD/OpC2/zNjef8idaT/IGmP/yJcdf8kWn//FlSA/iM6
+ Rv8RKjb8Oqnb/yRCUOMnHBgMIBsYAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAENDQwJFRUUALi4uh42Ojv8cHR6hRkhJAEFVXgWh3uQAHy0zuiZL
+ Xv4YVXv7F0Ri/iR6ov80aYH/MYCl/xxijP8hcqb/MXma/y5edv82hK3/MU9b/yUtMv8eZof/M6vj/x9O
+ Yv8ufqf/IXOh/y90lf4XP1T+IV+A/C1hef8AAAI7AAECAA4REQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKampgGysrIALS4uopGRkf4VFRWhNTc5ACQm
+ JwYsIBcADAQBqh9Sbf8TSGr7H16H/xsyPP8iMjn/MW+L/zCazf81ndH/OV5t/yVwnP8TUnv/MY28/yM5
+ Qf8iU23/HlFp/xhIXv8pZoH/Oa/l/zBjev8cXYX+IGaZ+Ro2RP4IBQZgCQYGAAwMCwMbEgwAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAAAAAAG5ubgDIyMgIPTw83KWl
+ pv80MzPEw8TFAXt7egQBAAAACAQDZx84Rv8tfaj7JFp1/ydef/8reKf/NG2I/y9UZP83TFX/NoGj/yR9
+ sv8QOVr/K4Ox/zRVZf8eXIX/JmeR/xgyPf8UO07/Gz5O/yBQZv8hdKH/JHKj+iZ8pv4AAACbAgoOAAYT
+ GgIQCgYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALCgkAERAPBAAA
+ AAAAAABWZ2Zm/7Ozs/46OzvvCwsLFrq9vwEuQT8AGRscdypNX/8kOkT7J0hW/yV5qf8LME//NZ/X/yVE
+ Uf8UJzH/KWmG/zCXyf8zmNH/K2B4/ztwiv8ZYI7/J3al/yVOYv8gcp7/IWqT/w4vPv8og67+Nq/o/R1c
+ ef4JGyPuCQ4SHQYDBAAIBAIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA
+ AAQNEBABHSIjACAkJQovLi7YwcDA/bS0tPpeXl7/CQkJZAAAAADA9f8CCR4txhxeif8cOEX7JTpD/zdz
+ kP8lhbX/NoCj/yRWbv8bZI7/Hl6D/yJPZP8kUWT/HEda/x9BT/89q+D/NXKN/yNZc/8bXYn/HmKQ/x9l
+ if8JGB//H1lz/hlVcPwldpz/AQAAZQEAAAAECgwHAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAA
+ AAH/AAEDERgdAAAAAAAKAAABAAAANwAAAKw1ODr/cnR1/F1fYf1OUVP9FRMT6wkAAEA+eaMAFCAnqyFk
+ j/8TO1L7H2OP/y1PZ/84eZb/K2V//yBliP8YUHX/Jnyx/xpTbv8ZUnD/JXyn/yVzmP8lQk7/KDY8/xxW
+ cv8wnNL/L5LH/yRxlf8XPVH/JlFv/iFadvonf6j+BQECgwYFBQAMFBoIAAAAAAAAAAAAAAAAAAAAAABs
+ ogACAAAAAAIDA/8CAgCBAAAAAAAAJBQRFGstTlnBBnOK/wCYtv8ArtX9AKLM/wCkz/8ArNX+CJa6/x5Y
+ aPwAJS6sBwICty1gff8VO1D8Fkdn/x1uof8xbIj/HSMm/yRbdf8rkMT/LZPF/xtbd/8ne6v/F0lz/yqH
+ t/8XPEz/M57V/zBui/8maIb/NKvi/x9cef8dX4f/GlmE/ytkhPsfYHz/CBslmhVIYQAMICoIAAAAAAAA
+ AAAAAAAAJNT/AABilAACAAECAgABAAQAABcADRSWPHWH9Fu00P8dxPT/BNT//RG8//wOvf//B9D//gHX
+ //4C0///BNb//SrU//5tzO//L5Kr/wNBU/8XIyr/KElb/yuOv/84eZb/J1Z0/yROZ/8lWXL/GlFq/xtL
+ Yf8qjb//K4zE/yd0mf8vb47/GViE/ymDtv81b4r/GUlg/yBEU/8rhrX/IXKh/jiVwvwbKzP/AgwRxxeB
+ tgEHGyUFAAAAAAAAAAADBgoAJ+b/AAA6VwEAAAAACAAAUwBBVuBbr8z/ddn//w66//sVnfn9JJD0/jps
+ 9f4jkvT+EK/2/xan9/8Psvn+D7P4/wmm9f4luP38xOX//WnG7v8AUHb+HjVB/yFKXv8xVWX/HV2F/xZX
+ gv8yXnT/J1Jn/zNwkv8kTWD/LZjJ/yFRaP8udZn/GFmB/yZ5p/8nVWv/ID9O/y6BsP8qVmr/MZ/S/zZx
+ i/09eJP/GzZC8gAAABwJAgAAAAAAAAAAAAAAAAAABSAtAQE0TgAKAQE7AEty/2/P//+Bz//6B6D0/TCA
+ +P48cvn+O2z5/jtw+v87dvv/LIP1/ztt9/8lj/b/HJz4/i+J+P8XiPb+ZY32/vnv//9lyf/+AGeR/zI7
+ PP8bIyb/NG+N/zSUxP83aH3/KoCt/xZPev8sgbL/HThE/zJngP8yW2z/Mp3Q/zCf1P81Wmr/OYGo/xVW
+ g/8sdJ3/LWJ5/ytbcf0neqD/KmN/9QAAACIAAAAAAAAAAAYFBwAAAAAABBkqAQggKxIAS3DeUsb//s3M
+ +vsrefP/Lob8/ilE1v4ULbz/PXr//zRm8f8vXun/PnL9/zls9/82c/f/L4b6/0Bz//8uU9//ESq7/2+O
+ 8v+Qo/D/IHPN/xc0Tf8nYYT/Ikpf/ypJVv8oPEX/LGuM/x5wov8tfaj/OWyD/ymFtP8vdJf/NV5u/zFl
+ fP89cIf/O7Lv/xdEX/8vk8b/KDtC/yxQX/0mdpz/KVFi6WJRShIAAAAAAAAAAAYFBgAyWHQCD0h0AAIH
+ Ioc6fOD/4ev/+3ma+f8uZ/r+RoD//xYuvf8AAJP/OXL5/yxV4P8DCZr/MWbv/z15//87cvv/MVzp/zdx
+ +P8sWOH/AACV/wAAiP8ANF3/AnSB/wUmOf8VHiv/GlyB/zBid/8yY3z/L2F5/y5xkP86epb/RYyw/xJG
+ bP8rgrb/Q5zE/x82Qf80a4f/O3mV/0G17P82cIn/LWOE/z9nffxNjan/JjtCwqHT5gBhf4oGAAAAAAYE
+ AwAvS0wAE1NlFwwsd++PrP/91dbz/Txx9P4lUd7/FCu5/wwYrf8AAJX/Bw6l/wkTqP8AAJH/Chaq/xUt
+ u/8vX+j/HT3J/wcPoP8KFqn/AACg/wIBZP8MPFr/Enyp/wEuQf9CW1T/NHaW/zxxiP8lYob/G2KQ/zFX
+ af8eJCX/MHGP/zOb0/80q+n/O4Cf/yRlif8XVn3/PG2J/ztvhP8zZoH/Ez1d/iJhh/stSFT+BgcHeAoa
+ IAAFBwcHAAAAAAkVLgIAAAAAAAAAOSNTuv/C1//9oKDd/gUNov4CBJr/AACQ/wAAlf8AAJr/AACZ/wAA
+ mP8AAJ7/AACb/wAAkv8FDKH/DRus/wAAkf8AAJT/AACY/wECp/8CAKL/CgiI/y1Ja/+V6uX/PVxf/zNd
+ cf8eZ47/EkBd/ztwiv8sao7/J1l2/zhofP9Jrtn/L1ls/yyHu/8cZpf/PrDp/yU4P/83cIr/MpzT/jqq
+ 4/sgNj//AwMEZgMAAAAGBgUHAAAAAAAEJwIAAQgAAAEDQRIrof7I2f38l5rd/QAAmP8AAKP/AACd/wAA
+ oP8AAJf/AQGJ/wEBi/8AAIr/AACL/wAAlP8AAJr/AACb/wAAof8AAKX/AACc/wAAYf8XJk7/UIOF/p77
+ +P+g/Pj+OlhZ/iQ4Q/41gqb+QZ7K/jl0kf8iZpP/E0lr/0Cx6P80SlT/JT5K/zB/pP9Dwfb/OX6e/yta
+ ef87dZn+SY2r/Td3lPw1V2T8BAMDSgUFAwALDQ0FAAAAAAQCNAMFBCkACAcXVQAAhf6zuvP6rbLl/QAA
+ cv8EA1D+BwlD/xoBLf8aBDX/Dw1r/w0LZf8QDmT/FhBX/wcjO/8BFUP/CgRF/wgIV/8EA2L/CxJJ/2Og
+ lf+a+vD/q////3W3sf8iOUf+LDVB/jFTYPwhUW3/Ol5y/h45Rv4vmM//NpvR/0G79v82aYD/NZLD/zJw
+ lf8uTFj/Mltv/xdIav4hcKH/MU1a+kCJqv8aRVi+JFlxACtPXwEAAAAAAAAAAAICHgIBARMAAAAUPwIB
+ Q/52ebj72OD5/QcHdf0CAYT9BhV3/pgEAP9RDCj+FRqM/yYdkP8GB6f+GQmP/xRncv4CmIf+HQZS/xMW
+ h/4QB1r/OldT/6r///+V8/X/ME1J/gAARP8AAIT+Gxwm/zNpgP8ORG37NIrA/jJZaf8oVmv+LXKR/iVK
+ Wv83fZ7/E0Zn/x9vov85dpL/NkxT/zqs5f8zh7T9OGR1/kCMr/g/Ozk5Q0lLACAzOwIAAAAAAAAAAAAA
+ AAAHCAYAUlQJBxIPD+AeG3X/wMbw/0ZIvP8PCpr/JyBV/6EAAv4qE1P/CQuy/xUQwv8KCbL/DQiO/hYZ
+ T/8Atar/GSVS/xAJff8gF4T+LDdK/qL//v52wLn/AAA2/gEDYv8CBE37AAAATRs2Qb8weKH/Obbt/z+F
+ pfsvdJv+HGiU/zWJs/41bYX/Na3o/y+Wyv88d4//Royw/0N8nf5CfZz8L0tX+RYfI4xXVFsZRD9FAwAA
+ AAAAAAAAAAAAAAAAAAAMDAwCJCUQAAoLCHMKCQffS05etpedu9MICyrpQA8X+YoAAP4NFzH6FhB++xcT
+ c/ocF177GRlt/BwGR/sAfnr9D2Rt/x4LR/4gH17/DwcV/zRYVv9wppf+BQBc+wAAl/4AAxGxAAFhAGgA
+ ABEcGhyXK1hn6yRMXv8xmM7+F05y+jOj3/0nQ03/SYen/jyDs/4qLTL/M2dj/zlMKv1AbDf+IToL3gEH
+ AG4bXAARLGsAAAEDAgIBAAEAAAAAAAAAAAAAAAAAAAAEAQQDBAkDAwOmAAAArJWcspIoR0ueRwAA7nAA
+ AP8ABgDPRUEqxCkpGckAAADVAAIA2gAAANcAQkL5AHl4/gYAAMgECQCsCgwJrwAAAOgIS1X/AkVd+gIK
+ Nf8LAABoEQsKAB4YGwAHAAAAAAAAGggFBnwwcZD9OabY/z+y6P9BZoD+OVND/ydMGP8icQD/LJoC/y+u
+ Gv0pnBP+G24V1QoeA2gcPQZQDhIJJgEAAgABAAEDAAAAAAAAAAAAAAAABgYFAQsLCwANDQ0kAgICwiEi
+ K8EnMkLGPQAC/iEMDN0BAwWPS0pQixsbH5EAAAKWAgMGngMCA5sCCAjJAFBQ/wkND+IKCQvEAAAArAAA
+ AKIFISrbAZmv/wDH2vsDXnLyCAsKPQ8YGAAEIScFFRQQABEAAAADAAApAQMOcQ8SHakgSRD+LY8G/i6S
+ AP4zqQn/MZEN/zCZGv8ylxv/M4kO/yNSAf8WLQD/Dh0BpgAAATEBAAACAAAAAAAAAAAAAAAACAcIAAkJ
+ BAEDAwQAAwMCFwIBAMARAADKmAAA/xQMC5IAAABJ4uHgXGpqaVwAAABcAgMDXgADA1MQAQGBA5qa+wBD
+ Q9AKAQGyQWpq/yI4OOAFAADIAiAo7QDX//sAwO3/AyUsgAQ1QAAFUmQDFw4HAQ8AAAUOIggsHjEAgCZ6
+ Ddkwux/9MnwE/TGREP4wnhT/MJoP/zFjAP4udQD8I1AA/REVBKgWHQc0GicKIgAAAAYAAAAAAAAAAAwT
+ GgAHDxYABQUGAQkIEAUFAQAFDAoGKwUQOtQFGGL+GxNB/w8UErkMDAqFbm9wfGJiYmwEBARrCgoKawgL
+ DGkOAABrDmxs9gB5efUfGxvrsP///2qqqv0AAACRAyEoqgDN+/wDl7j/CRYWUgsWGAADHSQEAAAAAAAA
+ AF0DBgD4JW4U/ymvJv8tfQf/LmoA/zGvIf4weQT/MMIp/zGWE/8rWwD+GEYA/REzA/UAAAKjAQAGWggG
+ BjUKCAcAAAAAAA0VHQAIDxcAAAAAAAMPPAAEDTYAAgYbkQArw/8AOe75ADnr/gEWYv8GBgWfCgwQfBMU
+ FJwdHh+tJSYnrh4oKbAcHyCpDjc31ACdnv0BAAC+QE9O/CxJS/8AOETLAaC+/wGlx/8MLTWeF3d3ARNM
+ XAIAAAAAAAAAAAAAABURLAFbDjUIXAkQAKkYMwDyK2IA/DG2Jv4vfgn/MI8N/jDXN/4tiA7+LmEA/CRF
+ A/wIDwHVBAMBngkOAj8JBwYAAAAAAAwTGgAECQ0AAAAAHwsTKGsJDyJbDQwQmwold/0AHpD7ACCv/QAa
+ df0HAwQ1BwEAAAAAAAcAAAAHAAAACAgIBwsICgoHBQYFUQGVk/8ASkh3AG1pPwA2OaUBbYDfAWZ6yAEB
+ A2YAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAANGwAAER8AKxEkAG0XRwWpL20A/jGmHvwwhxH/MHEA/zGX
+ F/8txy3+JHoG/xxNAf0IGAKPAAADNgQACAQCAQEAAAAAARopNwASIjACIC05yVZ0kP9KZHz/UWyH/1t4
+ jf9adYr8PlVu/w8VHeMAAAAaAAAAACEaEwAAAAEABgwOAAwBAAAKAAAABwAADAJwc+0BXGXeA5moFQB4
+ hi8AAAACAAAAAAADAAAAAwIADQAAAA0AAAAAAAAACwgIAAAAAAAZPgIICRUDFAAABSAkdALsM30A/S+I
+ E/4wdwr+MYMA/jJuAP0ldA39DjgS1xExAuAHHADrCQUHvQgCC30HBQUtBAMDBQAAAAAAAAAhKjlG+Vt4
+ kfpDWG36KzxM/VNyj/89U2r+RmB3/jZKW/lJY3vgKTZEuRIQECoUFhgACg8RAyAAIAABAAMIABcASAYR
+ CeEBQgn/BSwA5ABEAP0BLAPEAhIGnwIAAh8DAAINEwAMACQCGAAAAAAAIRkXABgdDQJHcxIADAAQDhc1
+ BtYwmwD/LF0A/yZvBfwybwH+KnoA/y10AP4rVQD/CA0CpSx5AQ4teAAdBwAGPwQFADwAAAAPAwEBAzRH
+ VwA7XWAXM0VT567W9P+2xdf4XnCA/sjd7/652vv+epWr/h8oL/89Umf/YoWn/xciLI8uQ1UAJTc/BgcA
+ BAUDDAKDAWAA/wDJAP4AgwD+AMsD/wCQAv8AhwD/AJQA/gE6AfcEKgNpBjIEAAgiBQMAAAAAHhYVACxr
+ CwAAABIrFDgF0SN2AP8SPQDQCRQAuiFtAPMpWQD+GlAA/BxVAO8qVQDzIVIA/wYaAmUOMQMACBgDAAYF
+ AgAAAAAABQMCACg2QQIlODsACBIbTxoqM/RYcH7/dnR0/2daV/61ur//g4GB/6CnsvyApMT7Hys2/wkM
+ D1gLDRIADxoRAQ4ACQkFMgPgAJMA+gCrAPgAlgD8AKMA/QBeAf0AkwP/AIAD/wZxBOQDEgJRARAAAAAN
+ AAISDQ0BCQIJAAMACFkMGgTYHWQA4QgeAXwAAAAjDzUAmBlRAv8PHgCuEjsAxxRLAM8PEgBcLmkA/xAt
+ APoABQI7Ag0DAAQDAwMAAAAAAwAAAGiNrAAAAAABCxMbACIAAC1UIiyVSyco8YAAAP5MWmT7V2Bv/4ii
+ wP91mrf+ISs0yAAAABURIBcBAgIAAAkABlMEVAP8AIIA/wBWA/8AUAP/ADYA/QAMAP8BCgDnAAAAeRlj
+ EgwJPgYABgAEAAAwAABXQj8AAAAAAAAOABYAAAAUAQADBQUEAwAJFAISDzUB9wAOAIIGCwA8CRoBchA1
+ Af4AAAAYChgAYBEiAdUBAAKvAgAEMwUEAwACAQEDAAAAAENabQAAAAAAAwAAAlIIBQBvAAAlKQAA508B
+ AO0AAAAxAAAAMgAAAEIAAAAyAAAAAgQFBgAWIhkBCQAGAAAEADcAGwBzATwBjQkBAK0CAADIATA0/wQ3
+ Or0VmJwUBLCzAAAAAAAQVwoBBAQCAAAYAAAyJiQAAQABAAAAAAADAwIAEBIKAAwNBwAKCgWKBAQDqDkq
+ JwMACgARETQGIwokAf8FBwNlAgMCAAAAAFQAAgA2AAMACQAAAAAKBwcAAAAAAAAAAAABAAAAAgICAAAC
+ ACAcA23yYBTX/zcMmPsNBxFLFgkmABwKMwAAAAAAAAAAAAAAAAAVIxkACgAHAAEEAQAAKwAAAdMBABHn
+ 8gAJ19YFA3Jy5wGhodMA+/kAAtXUAgAdAAAOUAkAAwQCAAAAAAAAAAAAAAAAAAAAAAATDw0CEAwLAAoH
+ ByUHBQWnVUU8BRANCwABDwACEEkDAAQNAcsCBgGhAwsBAgECAAIAAAA7AAAACQAAAAAAAAAAAAAAAAAA
+ AAAPCRECCgAWAAMAAFVfDdn/rH7/+IhI//8cAEmtRAC1AkgIpwYDAwMCAAAAAAAAAAAKCwcADQMJAAcF
+ BQEBCgEDAP8AAwZbWQUGeXgACCwrggF+f/8CAAA6AwAAAAQFBAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAABAAAAAAAAADwAAAAbBQQDAAAAAAEKCQcCBAAEAAYEBGIEBAPJAwICAAAAAAAAAAAKAAAAFAAA
+ AAAAAAAAAAAAAAAAAAAJBQoBBwQPAAQCByc7B43pfDbo/E8bp/kFAhJiDwM2ABwFQAIAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAEGAAAABAAAGwQaGdkEFBNWBRwcAAUNDQIAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAADAoJAAAAAAAeGBQABgcEAAYFBAcGBQSpAQAAIgEB
+ AQAEAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAOCA8AGwszABcHLQABAQJ8HQBT4gAABbUAHAAAAH4AAAA4
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAANAAAAFQwJAAoAABgBAAAMAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAdFhMACQcGAwgG
+ BQAFBANhBgUEUQgGBQAKCAYDAAAAAQAAAAAAAAAA////////AAD///////8AAP/+P////wAA/8AD4AP/
+ AAD/gAAAAP8AAP8AAAAAfwAA/4AAAAA/AAD/wAAAAD8AAP/wBgAAPwAA//wcAAA/AAD//jwAAB8AAP/+
+ PAAAHwAA//44AAAPAAD//jgAAA8AAP/+OAAABwAA//44AAAHAAD//DgAAAcAAP/8GAAAAwAA//gYAAAD
+ AAD/wAAAAAMAAP8AAAAAAwAA/AAAAAADAAD8AAAAAAMAAPgAAAAAAwAA8AAAAAADAADwAAAAAAMAAPAA
+ AAAAAwAA8AAAAAAHAADgAAAAAAcAAPAAAAAADwAA8AAAEAAPAADwAAAYAA8AAPgAAB4ABwAA/AAAH4AD
+ AAD+EAAPgA8AAP4AAA4AAwAA/AAAHwADAADwH8Q/wAcAAOAf5//gAQAA4Afgf8AfAADgA4AfgA8AAPAD
+ gB4QDwAA+AcAf/JHAAD8/4H/5y8AAPj/+f/vPwAA8H/5//8/AAD4f/z//78AAPj/////nwAAKAAAACAA
+ AABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAQEBAAAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlDWggSKjYNDyIsDQsc
+ JAwoQlEJFB4jAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMD
+ AgAMDQAGDA0OEQAAABoAAAAmAAAAMAAAADYAAAA1AAAALwsLCycYGRkfDAwMGwAAABkEDBAbAAAAHAAA
+ ACgAAAA0AAAAOAAAADMAAAAqAAYKHwABAhIAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAACCwkGEgEAACkAAABDCAYFeR0cHJ0bGxy1FxcXtxcXF7MMCwqhAAAAggAAAGEAAABCAAAANwAA
+ AEgMICqQDyAotxMrN84QHybQEBkeuAcFA5IBAABsAQAARwEAAC0AAAASAAAAAgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAsHBgYkAAAASTk4ONV6eXn/lpaW/4uMjP9mZmb/ZmZm/2NjYv9iYmL4gICA60tL
+ S8gBAgSFFy453x1bgv8iT2n/H1Bp/x9GXP8iWHn/GkBW/w4nOPEBAwacAAAAWwAAADwAAAAaAAAAAwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAABgICAhsAAAAzIiAftFJRUf9oaGj/lpaW/7i4uP16enr9c3Nz/42N
+ jv+AgYH/ODEt7g8lMOAlaIv/IEVZ+ipWbfwdSWP9IEpl/RtMZ/0bQFT8LWyO/x0/TvcDBQauAAABUAAA
+ AC8GFBoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwEBAA4AAAAaDQsJXS8tLKI7OjrixcXF/pKT
+ k/5TUlLzWlpbu0dISI0OHyqxIk1o+hw9TfwfXYT+LEtc/x9HYP4laZD+LGeE/yNSbf8pY4L9KVBk/hIw
+ Qf8DBASNBQoNLAUAABQGDBABAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAgIBAAAAAAAAAAAAAAAAAAAA
+ AD+EhIP7iYmJ/w0NDHAGAAAAAAAACyRXdPAfUnL/IFNw/SVhgf8rZIP+JVBn/ypde/8oTF7+JlNq/y6A
+ qv8tYHv7JHil/hlBU8mk//8MCjZOCFSt1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAF7e3sBjY2NB2pqauB2dnb7AAAAHAALEwEVJS1NHDpI/xlPbfweX4v+KEpd/iZdev8yYXX/ImuZ/yp7
+ pP8eRmH+IVRy/iZNYf4ydpn8I1Rq+RkqMXQzU1cAJkxeAj5vggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAO3t7QH09PQAaGhouGVlZeLd3d0DGoW6AClOYbYYQlj+GVd4+y9+pf8qYH3/G2OS/yZK
+ Wf8zY3j/N2+J/yRsk/8icZj/Il2A/x5Laf4fSFn+LnOS/yYyMTAmNz8AHSwyAwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA3NzcAuTk5ABlZWa0Xl5f1gAAAAA8j74AGSkwxRtUd/4aUXL8Kk9d/i14
+ nP8ui73/MmuI/yNpk/8qUWT/IlJo/yFlg/8lZob+M4u1/x5UdfofUnL9ERcXZw8UFAAWIycIAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAQDAsAEgAAAP///wKFhoYEmJucB2dqauZsb2/mS05PCwAJFQMXHyKVJ1dw/yVc
+ evsgW4D/MW2K/y9LVP8xfqT/HGyg/zFwj/8kWn7/HlBu/xpIXf8eTWL+JHWh+yd/sP4IFx2iP3WMAA4s
+ OwgAAAAAAAAAAAAAAAABKDQAAAAAAA4JBwIAAAACSk1MABoWFgAGAABrpp2b/3xycfwAAAA8M36tABk/
+ V8EfQFP/K09f/CV3pP8veJz/GEFZ/yJkhv8rb5D/JU5g/zCAq/8rZYP/H2WP/xtbgf8aTWT9I26P/xdL
+ ZPI3PUAcBA0SAAAAAAAAAAAAAAAAAAEUGgAAvPsCGRISAAAAAABOODYfL0NFch9RWfBRgI38O2t2/hk0
+ O85JhZw1FjNIwR1TdP8dUXP8NG2L/yZVaf8hcqH/I3Kd/xlPa/8gbJb/JlZr/ylXa/8qg7D/LY6+/xhC
+ W/4hUW/+IWqM/wAAADoAAAAAAAAAAAAAAAAAPlsAAQ4TAQAQFAAAAAA8MFNfsimZs/MAr93/Bbz7/wDH
+ +v4A0P7+C8Px/zydt/8hZXfwCyw6/yJXeP4wfaT/Ij1O/yZoif8gXnr/JXag/yeAtP8kZIX/JnSj/y5x
+ kf8hW3T/I2uS/yuBs/wfQ1P+AgYJXAAAAAAMEyYAAAAAAAA2SAEAPEgAACg5hUWZuP9Oy///Hqv//y+E
+ /fwygvv+HKD3/xqm+v8Pr/z9JrH//6je//9CkrL/FENW/y5KVv8ka5f/LGWB/yhbd/8nZoj/J2uJ/y1i
+ fP8if7P/LGF7/yRVcf8qcJX+MoOn+zBmf/8XM0CSGjpJAAsSJQAZbI0DBl+EAAAtSl9PodT/grz//B1/
+ +PspQtP+PW77/zVn8f49cPv+NnT3/jSK/v8nY+/+T2LZ/pG7/v8WXJP+IDhH/ypeeP8xW2z/JGyT/yl4
+ pf8vZX//L2+P/zR3lP89e5f/K4Cw/yVsk/8uTlv7K3KT/yVKWowtVmgACw8aAlOIjgAPZW4TMl2q6rvV
+ //1Hd/r8Llnm/wMHm/4kStb/Dh2v/yNI0v84cPb/LVjj/yRF0f8AAJH/BS9s/wdieP8RJDT/KmSB/y9e
+ df8pZIP/NGN1/zB3nv8qjMT/NHCL/yZSa/9AjbH/M3WV/ihRbv07aX3+GCImUxIZGgAUKlkJAAAoAAAA
+ IE94l+P/naLn/AgctP8CBKH+AAGh/wAAmf8AAJz/AACc/wsZtP8KFrD/AACX/wAAnP8AAIH+Cih2/2uq
+ p/5Fcn3+IWGG/yVihP4rT2L/K2WE/0GXv/8saor/I4G4/zdxjv4yYHf+LpDD/yJBUP4AAAAoAAAAAAUO
+ egoBBFAAAANBYXOD2f2Lj9f6AAB4/gACe/4AAHn+BQR6/wYFeP8GBnT/AABw/wAAfP8BAY3/AwV2/zhW
+ f/+GztH/hNHL/jFDSP4tZYD9OnSP/yVslf4vkMP+OnKK/y1hfP87krb/K2B+/y5nifxChqL/Lltv4Ud7
+ hxFAk6QEAwFFCgAAKAAAAB5cQkKR/6iv4v4AAHf/Jw9L/2EGCf4VGID9Ew6V/RQWcv0Ib2L+FRRc/ggA
+ Wf1TgYT9q////kVxfP8CA1L/Hi44/iNihf8ya4z6K2N+/DGBpf4zdJL+IHCf/zNieP80cY7+LH2t+zlr
+ g/4pV25kVpy5ADlpfQcJCAADAQAAAAcIBRsTEC3ri47B7CcxnftKCy/9Ywsc/wkRp/8WEqj/Fwd7/wt3
+ f/4UQXL/GAVq/0Jgbv99x779AABM/gAAWN8/SHBHJ1dy2DKIsf8ucJX/InCd/jRzj/83ltD+N2yQ/kJy
+ i/1CbXL+HzAuxxMfEgxia2sAKCIeAg0LAwAHBwgCBwgLAAAAAGgjISC9U3F5p0gAAPMxBgfuHyo3zxIR
+ GN0KBBTgAjA38wVQT/kRBhTIAAAAxxVBQvgHPHj/BQIlpBUTZwAVOkcQPzw8YSRffN4ymdD7OGaF/Dhc
+ RP8lYQ/+Lo4W/S+PFv4VRgawBwwAYwAPABgAAAAACgkPAAcGBgADAQACBAMABwMEA3sdFRDHVgEA8wwH
+ Botna2xsCgwNeQAAAHYDEhCaAVdX9wcHBcATISHAAg4TzQCInvkBoL/0AAwCPQg1RQBLamcACQAAGRgy
+ GYondBryLooA/jCkCf4wjgr+MIoP/iZdBvQhTwCwFzQFRGqJAAAAAAAAAAAAAAQSRwAHDy8ABgwZOgYR
+ TPAwFD72BQYCjYN5YXgoIhJ4EgAAdRgAAH0FeHjyEjo75H28vf8fFQ6/AGyH1wOy3P8HKS05ADpMAExK
+ QBMJDgSqI3cS9CyND/8whAz+MJgW/zGnGv4rYgD9GDgA8RAtBIUHGAZBBgIGAwAAAAAAAAAAAB2KAwAf
+ jRYCD0SbACvE/wApx/8BDTezBhxnQwwaTGkOYGFuDmRlZwZlZcYAZ2XMJ05NrwpJVeAAiKTqBmp0eQaI
+ mQABcnkBABMAAwIQAC4HIQRjFScAyS6KEP0xjxH9MJ4X/i6vIP0nXQD/BhEAyjAsA00LGAUAi4+UBI+V
+ nQAnND+hO1Jj8TtQZu09V3j8JTtm/goRI30ABCwABAwqAAdaWwAEYGIABDpDTQFdaeMAPEo3AA8nTwAA
+ ABgIV18ABEWBAAaKZAAQGAYATWADAIGZAgwkaQHAMoMG/zCCDfozeQD+J3sR+RE/CcsWIhG8OjMFcwge
+ Ay7X4uoAi56jB0ZZa+iDnLf/XXOF/4qrwvxUaXr6MUJR9UVbatEAAAAcLDJABBYACCQFRACvAWQB/wF3
+ AP0AYwDmAkAAsBAHBEwEHwAACC4JAhtEBwAiTAgJHDwHoyJpAP8iVgDnLGwB/yVqAPsoUwD/DRwChERu
+ IAIYTwEkKGoMDUxbaAYtQVAAESw6ZlRzgvh3bHL9o52k/4+eqv99la//MURW/SsuLRcAQQAAAy0CmwCR
+ AP8ArQH9AIsA/gB0AP8AcgD/ATIAdgNjAwAHQwMDFkUEDg4lBZMXUQC6AxQASBJDAM4SMgDHET4A0RxB
+ AZcdQQD/DSIAUxIrAQAGCgMAvdz2AAAAAAFkAAAAewAALEMAAOVFBwDFSDU7o0xgbq0aIylWUENTAAUR
+ BQkDOAKkAlQA3AEWAPIAIg7+AhMNnQQLDCQDBgYAAwADABr8BQBq/xUDCRUCDgoUBAAKFgRDChwCq0Z6
+ ERQNKgG2BxgBXxdABFIAAAKIAAACCgUFAwOUrcEAQAmRAmAEjgE+AlJ6Vxuw+zEMY5xnFIcASwCEACw7
+ RwAAAAAAAP//ABT2DQAKSVkGCYaPIAJ0d+0DeXo/A4iIAAN0dQMEAAMAGv8IAAMIAABIRkgAAwACDAcE
+ BXcBAAESDBwEAAUOAlsECwGjETkGAAACACEAAgAEAAAAAQAAAABzE+QCiQ/0ADYGk7GISv//Sh2XyspG
+ +wWqLu0EJzM9AwAAAAAAAAAAAAAAAAB2dQECgYAABD8+kQJDQ5YCXFwCAm9vAwIgAgAAAAAAAAAAAA4R
+ DwAAAAAKAAAADgAAAAADAAMBBQMEDwUDBI4AAAAKAAAABgUEAwQAAAEAAAAAABABMwMNATkAEwImSyoA
+ besJABliNglYAC0JUgMAAAAAAAAAAAAAAAAAAAAAAAAAAwkAAAQDAAAXBwAAQAoAAAAaAAABAAAAAAAA
+ AAAAAAAAFxgZAAAAAAAAAAAAAAAAAwoJBgEGBQMABQQDVAYKAyQFBAMADwwKAAAAAAD///////////4B
+ wH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAAAAHgAAAB4AAAAeAA
+ AAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9/s/j/P/v8///7ygA
+ AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoJuXACEgIQBvbm4AAAAAAP//
+ /wMAAAAAyMPAABAuPwDY//8A////CQAAAAAAAAAAAAAAAKoKCgARKDMAAAAAAIJ9eAAuMTUWNzY1c1pa
+ Wqo5OTmzNzc3oDw5N28GEhlZFTVIqRYxQL8PIy+lAQIEXgAAABeOCwwCBB8uAAAAAABqaGcAGBgYFCoq
+ KZ9mZWX8kZGR/25vb/9RUlPfFjtP8CRUbv8hT2r/IVJt/xw/UfIDCg5vbQ0PDQkcJgAAAAAAAAAAABIS
+ EwBISUoAOTg4H3p6e+xXRTpCETdMfB9UdP8nV3L4KV56/CdgfvgpYoH/HUpgynTAwQk4dZICAwwQAAAA
+ AAAjIyQAtra4Bevu7wBbYGGpTSscEhhBWMMhXHv+K2uO/C1lgv4mYoD/I2GB+iZffP8hSl1gL2J9ABBS
+ aAA4bHQAKygpACwpKQBkV1MIdWZj2DwOBBkaPVO/J19+/ytohvwmaIz/KGB9/iFdfPsgY4b+GU5qryqJ
+ tQAWYnsBO3B1AC1CQwEnZWhWDmqEvCSdtP8cdIG2Hkxf3iddev8lYoL9IGaL/yZnif4ob5T9IWSI/h9W
+ ct5+vckEQXiGA1R/iAdDia+zPJj0/y2B//8imv/9K6T//12T1f8bS2T+KVp1/ipsjv8rcZT+Lm+P/itu
+ kf8tYnvuAAAAIG2MwgBAWpZgb43n/wwiwPgJD6X7Gya+/hYixvsACY79M2yB/zRofP8pYYD8M3yh/zB1
+ lvwyc5P+LFtz30jA2gR0gMUAQEaKf1Vauf8YAE/9FgZ9/wYeev8FC2n/Tnim/091kvoqTWf/LnKY/zB4
+ n/8xcZ/7NW+W/zBfd41EhKMACQIAAA0EADA8P1nFTBMb6iQSV9sKL1HoDS5C6zFMVeoBIF7WFFpuSydw
+ hrswdpD2M3ZR/TJ2NfgTJxNYSm8RAwAIPQgJFFcAAAMtbxwPN9shIQBkBxAChQ9SUNknQUjcAISf6A+o
+ 0QYeRhc1JGgM3TGbBPorgwf9EykAs0JpBxM7bbwCIUiUdDNUkeIcOn7oRE1QOwxjSxsFVk2ZDE48qgpl
+ aVUZfEQDX5EmDyBaAq8xhwz/KXsL+w4nA5onaQkwiHt1AF5fWYBybWrzcH2E+kFTaoAFKQofAW0A+gBm
+ APQDPQJ5CE0AABJBAjQUPwGYF0MAxhpAAMgPIAFWFzkDCE0AUABQFFYRSQ1t0SsXOz8eEDYKAj4rFgRD
+ MFwCR0mXBU9PBAJJSwIGBQMCBQUEJQQHAyUFDwJcBAYCIxM9BAEtDpYAHAByLFEls+ERAC4EEgIuAAkf
+ IwAGUV0ABDQzSwkyMgQBNTQAFCIPAAYCBQUGBAQABAAEOwUEBAAAAAEB//8AAOAHAADgAwAA+gMAAPoB
+ AAD6AQAA4AEAAMABAACAAQAAgAEAAMBBAADAYQAAjGEAAIRhAADc+wAA3/8AAA==
+</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/win/CS/frmMain.Designer.cs b/win/CS/frmMain.Designer.cs
new file mode 100644
index 000000000..1171afa78
--- /dev/null
+++ b/win/CS/frmMain.Designer.cs
@@ -0,0 +1,1952 @@
+/* frmMain.Designer.cs
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+using System;
+using System.Windows.Forms;
+
+namespace Handbrake
+{
+ partial class frmMain
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.Windows.Forms.ContextMenuStrip notifyIconMenu;
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain));
+ System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
+ this.btn_restore = new System.Windows.Forms.ToolStripMenuItem();
+ this.DVD_Save = new System.Windows.Forms.SaveFileDialog();
+ this.ToolTip = new System.Windows.Forms.ToolTip(this.components);
+ this.text_destination = new System.Windows.Forms.TextBox();
+ this.drp_videoEncoder = new System.Windows.Forms.ComboBox();
+ this.check_largeFile = new System.Windows.Forms.CheckBox();
+ this.check_turbo = new System.Windows.Forms.CheckBox();
+ this.drp_videoFramerate = new System.Windows.Forms.ComboBox();
+ this.slider_videoQuality = new System.Windows.Forms.TrackBar();
+ this.text_bitrate = new System.Windows.Forms.TextBox();
+ this.check_optimiseMP4 = new System.Windows.Forms.CheckBox();
+ this.check_iPodAtom = new System.Windows.Forms.CheckBox();
+ this.data_chpt = new System.Windows.Forms.DataGridView();
+ this.number = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.name = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.ChaptersMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.mnu_resetChapters = new System.Windows.Forms.ToolStripMenuItem();
+ this.btn_file_source = new System.Windows.Forms.ToolStripMenuItem();
+ this.drop_format = new System.Windows.Forms.ComboBox();
+ this.drop_chapterFinish = new System.Windows.Forms.ComboBox();
+ this.drop_chapterStart = new System.Windows.Forms.ComboBox();
+ this.drop_angle = new System.Windows.Forms.ComboBox();
+ this.drp_dvdtitle = new System.Windows.Forms.ComboBox();
+ this.btn_importChapters = new System.Windows.Forms.Button();
+ this.btn_export = new System.Windows.Forms.Button();
+ this.drop_mode = new System.Windows.Forms.ComboBox();
+ this.btn_generate_Query = new System.Windows.Forms.Button();
+ this.radio_cq = new System.Windows.Forms.RadioButton();
+ this.radio_avgBitrate = new System.Windows.Forms.RadioButton();
+ this.check_2PassEncode = new System.Windows.Forms.CheckBox();
+ this.treeView_presets = new System.Windows.Forms.TreeView();
+ this.presets_menu = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.pmnu_expandAll = new System.Windows.Forms.ToolStripMenuItem();
+ this.pmnu_collapse = new System.Windows.Forms.ToolStripMenuItem();
+ this.sep1 = new System.Windows.Forms.ToolStripSeparator();
+ this.pmnu_import = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+ this.pmnu_saveChanges = new System.Windows.Forms.ToolStripMenuItem();
+ this.pmnu_delete = new System.Windows.Forms.ToolStripMenuItem();
+ this.DVD_Open = new System.Windows.Forms.FolderBrowserDialog();
+ this.File_Open = new System.Windows.Forms.OpenFileDialog();
+ this.ISO_Open = new System.Windows.Forms.OpenFileDialog();
+ this.FileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.mnu_killCLI = new System.Windows.Forms.ToolStripMenuItem();
+ this.mnu_exit = new System.Windows.Forms.ToolStripMenuItem();
+ this.mnu_open3 = new System.Windows.Forms.ToolStripMenuItem();
+ this.ToolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.mnu_encode = new System.Windows.Forms.ToolStripMenuItem();
+ this.mnu_encodeLog = new System.Windows.Forms.ToolStripMenuItem();
+ this.ToolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
+ this.mnu_options = new System.Windows.Forms.ToolStripMenuItem();
+ this.frmMainMenu = new System.Windows.Forms.MenuStrip();
+ this.label5 = new System.Windows.Forms.Label();
+ this.Label47 = new System.Windows.Forms.Label();
+ this.Label3 = new System.Windows.Forms.Label();
+ this.tab_audio = new System.Windows.Forms.TabPage();
+ this.AudioSettings = new Handbrake.Controls.AudioPanel();
+ this.AudioMenuRowHeightHack = new System.Windows.Forms.ImageList(this.components);
+ this.tab_video = new System.Windows.Forms.TabPage();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.radio_constantFramerate = new System.Windows.Forms.RadioButton();
+ this.radio_peakAndVariable = new System.Windows.Forms.RadioButton();
+ this.label25 = new System.Windows.Forms.Label();
+ this.Label2 = new System.Windows.Forms.Label();
+ this.lbl_SliderValue = new System.Windows.Forms.Label();
+ this.lbl_framerate = new System.Windows.Forms.Label();
+ this.tab_picture = new System.Windows.Forms.TabPage();
+ this.PictureSettings = new Handbrake.Controls.PictureSettings();
+ this.Check_ChapterMarkers = new System.Windows.Forms.CheckBox();
+ this.tabs_panel = new System.Windows.Forms.TabControl();
+ this.tab_filters = new System.Windows.Forms.TabPage();
+ this.Filters = new Handbrake.Controls.Filters();
+ this.tab_subtitles = new System.Windows.Forms.TabPage();
+ this.Subtitles = new Handbrake.Controls.Subtitles();
+ this.tab_chapters = new System.Windows.Forms.TabPage();
+ this.label31 = new System.Windows.Forms.Label();
+ this.tab_advanced = new System.Windows.Forms.TabPage();
+ this.advancedEncoderOpts = new Handbrake.Controls.AdvancedEncoderOpts();
+ this.x264Panel = new Handbrake.Controls.x264Panel();
+ this.tab_query = new System.Windows.Forms.TabPage();
+ this.btn_clear = new System.Windows.Forms.Button();
+ this.label34 = new System.Windows.Forms.Label();
+ this.label33 = new System.Windows.Forms.Label();
+ this.rtf_query = new System.Windows.Forms.RichTextBox();
+ this.groupBox2 = new System.Windows.Forms.GroupBox();
+ this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+ this.presetsToolStrip = new System.Windows.Forms.ToolStrip();
+ this.BtnAddPreset = new System.Windows.Forms.ToolStripButton();
+ this.BtnRemovePreset = new System.Windows.Forms.ToolStripButton();
+ this.toolStripDropDownButton2 = new System.Windows.Forms.ToolStripDropDownButton();
+ this.MnuSetDefaultPreset = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
+ this.MnuImportPreset = new System.Windows.Forms.ToolStripMenuItem();
+ this.MnuExportPreset = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
+ this.MnuResetBuiltInPresets = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+ this.btn_source = new System.Windows.Forms.ToolStripDropDownButton();
+ this.btn_dvd_source = new System.Windows.Forms.ToolStripMenuItem();
+ this.btnTitleSpecific = new System.Windows.Forms.ToolStripMenuItem();
+ this.FileTitleSpecificScan = new System.Windows.Forms.ToolStripMenuItem();
+ this.FolderTitleSpecificScan = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+ this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator();
+ this.btn_start = new System.Windows.Forms.ToolStripButton();
+ this.btn_add2Queue = new System.Windows.Forms.ToolStripButton();
+ this.btn_showQueue = new System.Windows.Forms.ToolStripButton();
+ this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
+ this.tb_preview = new System.Windows.Forms.ToolStripButton();
+ this.btn_ActivityWindow = new System.Windows.Forms.ToolStripButton();
+ this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator();
+ this.toolStripDropDownButton1 = new System.Windows.Forms.ToolStripDropDownButton();
+ this.MnuUserGuide = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator();
+ this.MnuCheckForUpdates = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator();
+ this.MnuAboutHandBrake = new System.Windows.Forms.ToolStripMenuItem();
+ this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components);
+ this.StatusStrip = new System.Windows.Forms.StatusStrip();
+ this.ProgressBarStatus = new System.Windows.Forms.ToolStripProgressBar();
+ this.lbl_encode = new System.Windows.Forms.ToolStripStatusLabel();
+ this.lbl_updateCheck = new System.Windows.Forms.ToolStripStatusLabel();
+ this.hbproc = new System.Diagnostics.Process();
+ this.File_Save = new System.Windows.Forms.SaveFileDialog();
+ this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
+ this.btn_destBrowse = new System.Windows.Forms.Button();
+ this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();
+ this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
+ this.Label10 = new System.Windows.Forms.Label();
+ this.lbl_angle = new System.Windows.Forms.Label();
+ this.Label13 = new System.Windows.Forms.Label();
+ this.label_duration = new System.Windows.Forms.Label();
+ this.lbl_duration = new System.Windows.Forms.Label();
+ this.labelStaticDestination = new System.Windows.Forms.Label();
+ this.labelPreset = new System.Windows.Forms.Label();
+ this.labelSource = new System.Windows.Forms.Label();
+ this.labelStaticSource = new System.Windows.Forms.Label();
+ this.SourceLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();
+ this.openPreset = new System.Windows.Forms.OpenFileDialog();
+ this.File_ChapterImport = new System.Windows.Forms.OpenFileDialog();
+ notifyIconMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
+ notifyIconMenu.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.slider_videoQuality)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.data_chpt)).BeginInit();
+ this.ChaptersMenu.SuspendLayout();
+ this.presets_menu.SuspendLayout();
+ this.frmMainMenu.SuspendLayout();
+ this.tab_audio.SuspendLayout();
+ this.tab_video.SuspendLayout();
+ this.panel1.SuspendLayout();
+ this.tab_picture.SuspendLayout();
+ this.tabs_panel.SuspendLayout();
+ this.tab_filters.SuspendLayout();
+ this.tab_subtitles.SuspendLayout();
+ this.tab_chapters.SuspendLayout();
+ this.tab_advanced.SuspendLayout();
+ this.tab_query.SuspendLayout();
+ this.groupBox2.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
+ this.splitContainer1.Panel1.SuspendLayout();
+ this.splitContainer1.Panel2.SuspendLayout();
+ this.splitContainer1.SuspendLayout();
+ this.presetsToolStrip.SuspendLayout();
+ this.toolStrip1.SuspendLayout();
+ this.StatusStrip.SuspendLayout();
+ this.tableLayoutPanel2.SuspendLayout();
+ this.tableLayoutPanel3.SuspendLayout();
+ this.tableLayoutPanel1.SuspendLayout();
+ this.SourceLayoutPanel.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // notifyIconMenu
+ //
+ notifyIconMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.btn_restore});
+ notifyIconMenu.Name = "notifyIconMenu";
+ notifyIconMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional;
+ notifyIconMenu.Size = new System.Drawing.Size(114, 26);
+ //
+ // btn_restore
+ //
+ this.btn_restore.Image = global::Handbrake.Properties.Resources.Restore;
+ this.btn_restore.Name = "btn_restore";
+ this.btn_restore.Size = new System.Drawing.Size(113, 22);
+ this.btn_restore.Text = "Restore";
+ this.btn_restore.Click += new System.EventHandler(this.btn_restore_Click);
+ //
+ // DVD_Save
+ //
+ this.DVD_Save.Filter = "mp4|*.mp4;*.m4v|mkv|*.mkv";
+ this.DVD_Save.SupportMultiDottedExtensions = true;
+ //
+ // ToolTip
+ //
+ this.ToolTip.Active = false;
+ this.ToolTip.AutomaticDelay = 1000;
+ this.ToolTip.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info;
+ this.ToolTip.ToolTipTitle = "Tooltip";
+ //
+ // text_destination
+ //
+ this.text_destination.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.text_destination.Location = new System.Drawing.Point(36, 3);
+ this.text_destination.Name = "text_destination";
+ this.text_destination.Size = new System.Drawing.Size(603, 21);
+ this.text_destination.TabIndex = 1;
+ this.ToolTip.SetToolTip(this.text_destination, "Location where the encoded file will be saved.");
+ this.text_destination.TextChanged += new System.EventHandler(this.text_destination_TextChanged);
+ //
+ // drp_videoEncoder
+ //
+ this.drp_videoEncoder.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drp_videoEncoder.FormattingEnabled = true;
+ this.drp_videoEncoder.Items.AddRange(new object[] {
+ "MPEG-4 (FFmpeg)",
+ "H.264 (x264)",
+ "VP3 (Theora)"});
+ this.drp_videoEncoder.Location = new System.Drawing.Point(125, 35);
+ this.drp_videoEncoder.Name = "drp_videoEncoder";
+ this.drp_videoEncoder.Size = new System.Drawing.Size(126, 21);
+ this.drp_videoEncoder.TabIndex = 6;
+ this.ToolTip.SetToolTip(this.drp_videoEncoder, "Select a video encoder");
+ this.drp_videoEncoder.SelectedIndexChanged += new System.EventHandler(this.drp_videoEncoder_SelectedIndexChanged);
+ //
+ // check_largeFile
+ //
+ this.check_largeFile.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.check_largeFile.AutoSize = true;
+ this.check_largeFile.BackColor = System.Drawing.Color.Transparent;
+ this.check_largeFile.Location = new System.Drawing.Point(179, 5);
+ this.check_largeFile.Name = "check_largeFile";
+ this.check_largeFile.Size = new System.Drawing.Size(91, 17);
+ this.check_largeFile.TabIndex = 2;
+ this.check_largeFile.Text = "Large file size";
+ this.ToolTip.SetToolTip(this.check_largeFile, "Caution: This option will likely break device compatibility with all but the Appl" +
+ "eTV Take 2.\r\nChecking this box enables a 64bit mp4 file which can be over 4GB.");
+ this.check_largeFile.UseVisualStyleBackColor = false;
+ //
+ // check_turbo
+ //
+ this.check_turbo.AutoSize = true;
+ this.check_turbo.BackColor = System.Drawing.Color.Transparent;
+ this.check_turbo.Enabled = false;
+ this.check_turbo.Location = new System.Drawing.Point(495, 134);
+ this.check_turbo.Name = "check_turbo";
+ this.check_turbo.Size = new System.Drawing.Size(99, 17);
+ this.check_turbo.TabIndex = 9;
+ this.check_turbo.Text = "Turbo first Pass";
+ this.ToolTip.SetToolTip(this.check_turbo, "Makes the first pass of a 2 pass encode faster.");
+ this.check_turbo.UseVisualStyleBackColor = false;
+ //
+ // drp_videoFramerate
+ //
+ this.drp_videoFramerate.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drp_videoFramerate.FormattingEnabled = true;
+ this.drp_videoFramerate.Items.AddRange(new object[] {
+ "Same as source",
+ "5",
+ "10",
+ "12",
+ "15",
+ "23.976",
+ "24",
+ "25",
+ "29.97"});
+ this.drp_videoFramerate.Location = new System.Drawing.Point(125, 62);
+ this.drp_videoFramerate.Name = "drp_videoFramerate";
+ this.drp_videoFramerate.Size = new System.Drawing.Size(125, 21);
+ this.drp_videoFramerate.TabIndex = 2;
+ this.ToolTip.SetToolTip(this.drp_videoFramerate, "Can be left to \"Same as source\" in most cases.");
+ this.drp_videoFramerate.SelectedIndexChanged += new System.EventHandler(this.drp_videoFramerate_SelectedIndexChanged);
+ //
+ // slider_videoQuality
+ //
+ this.slider_videoQuality.BackColor = System.Drawing.SystemColors.Window;
+ this.slider_videoQuality.Enabled = false;
+ this.slider_videoQuality.Location = new System.Drawing.Point(377, 60);
+ this.slider_videoQuality.Margin = new System.Windows.Forms.Padding(0);
+ this.slider_videoQuality.Maximum = 100;
+ this.slider_videoQuality.Name = "slider_videoQuality";
+ this.slider_videoQuality.Size = new System.Drawing.Size(322, 45);
+ this.slider_videoQuality.TabIndex = 13;
+ this.slider_videoQuality.TickFrequency = 17;
+ this.ToolTip.SetToolTip(this.slider_videoQuality, resources.GetString("slider_videoQuality.ToolTip"));
+ this.slider_videoQuality.ValueChanged += new System.EventHandler(this.slider_videoQuality_Scroll);
+ //
+ // text_bitrate
+ //
+ this.text_bitrate.Location = new System.Drawing.Point(489, 107);
+ this.text_bitrate.Name = "text_bitrate";
+ this.text_bitrate.Size = new System.Drawing.Size(81, 21);
+ this.text_bitrate.TabIndex = 14;
+ this.ToolTip.SetToolTip(this.text_bitrate, resources.GetString("text_bitrate.ToolTip"));
+ //
+ // check_optimiseMP4
+ //
+ this.check_optimiseMP4.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.check_optimiseMP4.AutoSize = true;
+ this.check_optimiseMP4.BackColor = System.Drawing.Color.Transparent;
+ this.check_optimiseMP4.Location = new System.Drawing.Point(276, 5);
+ this.check_optimiseMP4.Name = "check_optimiseMP4";
+ this.check_optimiseMP4.Size = new System.Drawing.Size(96, 17);
+ this.check_optimiseMP4.TabIndex = 3;
+ this.check_optimiseMP4.Text = "Web optimized";
+ this.ToolTip.SetToolTip(this.check_optimiseMP4, "MP4 files can be optimized for progressive downloads over the Web,\r\nbut note that" +
+ " QuickTime can only read the files as long as the file extension is .mp4\r\nCan on" +
+ "ly be used with H.264 ");
+ this.check_optimiseMP4.UseVisualStyleBackColor = false;
+ //
+ // check_iPodAtom
+ //
+ this.check_iPodAtom.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.check_iPodAtom.AutoSize = true;
+ this.check_iPodAtom.BackColor = System.Drawing.Color.Transparent;
+ this.check_iPodAtom.Location = new System.Drawing.Point(378, 5);
+ this.check_iPodAtom.Name = "check_iPodAtom";
+ this.check_iPodAtom.Size = new System.Drawing.Size(102, 17);
+ this.check_iPodAtom.TabIndex = 4;
+ this.check_iPodAtom.Text = "iPod 5G support";
+ this.ToolTip.SetToolTip(this.check_iPodAtom, "Support for legacy 5th Generation iPods.\r\nEncodes will not sync if this option is" +
+ " not enabled for H.264 encodes.");
+ this.check_iPodAtom.UseVisualStyleBackColor = false;
+ //
+ // data_chpt
+ //
+ this.data_chpt.AllowUserToAddRows = false;
+ this.data_chpt.AllowUserToDeleteRows = false;
+ this.data_chpt.AllowUserToResizeRows = false;
+ this.data_chpt.BackgroundColor = System.Drawing.Color.White;
+ this.data_chpt.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None;
+ this.data_chpt.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
+ this.data_chpt.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+ this.number,
+ this.name});
+ this.data_chpt.ContextMenuStrip = this.ChaptersMenu;
+ this.data_chpt.Location = new System.Drawing.Point(16, 55);
+ this.data_chpt.MultiSelect = false;
+ this.data_chpt.Name = "data_chpt";
+ this.data_chpt.RowHeadersVisible = false;
+ this.data_chpt.Size = new System.Drawing.Size(684, 236);
+ this.data_chpt.TabIndex = 3;
+ this.ToolTip.SetToolTip(this.data_chpt, resources.GetString("data_chpt.ToolTip"));
+ //
+ // number
+ //
+ dataGridViewCellStyle1.Format = "N0";
+ dataGridViewCellStyle1.NullValue = null;
+ this.number.DefaultCellStyle = dataGridViewCellStyle1;
+ this.number.Frozen = true;
+ this.number.HeaderText = "Chapter Number";
+ this.number.MaxInputLength = 3;
+ this.number.Name = "number";
+ this.number.Resizable = System.Windows.Forms.DataGridViewTriState.False;
+ this.number.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
+ this.number.Width = 165;
+ //
+ // name
+ //
+ this.name.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
+ this.name.HeaderText = "Chapter Name";
+ this.name.Name = "name";
+ this.name.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
+ //
+ // ChaptersMenu
+ //
+ this.ChaptersMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.mnu_resetChapters});
+ this.ChaptersMenu.Name = "presets_menu";
+ this.ChaptersMenu.OwnerItem = this.btn_file_source;
+ this.ChaptersMenu.Size = new System.Drawing.Size(188, 26);
+ this.ChaptersMenu.Text = ";";
+ //
+ // mnu_resetChapters
+ //
+ this.mnu_resetChapters.Name = "mnu_resetChapters";
+ this.mnu_resetChapters.Size = new System.Drawing.Size(187, 22);
+ this.mnu_resetChapters.Text = "Reset Chapter Names";
+ this.mnu_resetChapters.Click += new System.EventHandler(this.mnu_resetChapters_Click);
+ //
+ // btn_file_source
+ //
+ this.btn_file_source.Image = global::Handbrake.Properties.Resources.Movies_Small;
+ this.btn_file_source.Name = "btn_file_source";
+ this.btn_file_source.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));
+ this.btn_file_source.Size = new System.Drawing.Size(182, 22);
+ this.btn_file_source.Text = "Video File";
+ this.btn_file_source.Click += new System.EventHandler(this.BtnFileScanClicked);
+ //
+ // drop_format
+ //
+ this.drop_format.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_format.FormattingEnabled = true;
+ this.drop_format.Items.AddRange(new object[] {
+ "MP4 File",
+ "MKV File"});
+ this.drop_format.Location = new System.Drawing.Point(67, 3);
+ this.drop_format.Name = "drop_format";
+ this.drop_format.Size = new System.Drawing.Size(106, 21);
+ this.drop_format.TabIndex = 1;
+ this.ToolTip.SetToolTip(this.drop_format, "Select the file container format.\r\nHandBrake supports MKV and MP4(M4v)");
+ this.drop_format.SelectedIndexChanged += new System.EventHandler(this.drop_format_SelectedIndexChanged);
+ //
+ // drop_chapterFinish
+ //
+ this.drop_chapterFinish.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_chapterFinish.FormattingEnabled = true;
+ this.drop_chapterFinish.Location = new System.Drawing.Point(509, 3);
+ this.drop_chapterFinish.Name = "drop_chapterFinish";
+ this.drop_chapterFinish.Size = new System.Drawing.Size(69, 21);
+ this.drop_chapterFinish.TabIndex = 7;
+ this.ToolTip.SetToolTip(this.drop_chapterFinish, "Select the chapter range you would like to enocde. (default: All Chapters)");
+ this.drop_chapterFinish.SelectedIndexChanged += new System.EventHandler(this.chapersChanged);
+ //
+ // drop_chapterStart
+ //
+ this.drop_chapterStart.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_chapterStart.FormattingEnabled = true;
+ this.drop_chapterStart.Location = new System.Drawing.Point(383, 3);
+ this.drop_chapterStart.Name = "drop_chapterStart";
+ this.drop_chapterStart.Size = new System.Drawing.Size(69, 21);
+ this.drop_chapterStart.TabIndex = 5;
+ this.ToolTip.SetToolTip(this.drop_chapterStart, "Select the chapter range you would like to enocde. (default: All Chapters)");
+ this.drop_chapterStart.SelectedIndexChanged += new System.EventHandler(this.chapersChanged);
+ //
+ // drop_angle
+ //
+ this.drop_angle.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_angle.FormattingEnabled = true;
+ this.drop_angle.Location = new System.Drawing.Point(209, 3);
+ this.drop_angle.Name = "drop_angle";
+ this.drop_angle.Size = new System.Drawing.Size(45, 21);
+ this.drop_angle.TabIndex = 3;
+ this.ToolTip.SetToolTip(this.drop_angle, "Select the chapter range you would like to enocde. (default: All Chapters)");
+ //
+ // drp_dvdtitle
+ //
+ this.drp_dvdtitle.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drp_dvdtitle.FormattingEnabled = true;
+ this.drp_dvdtitle.Items.AddRange(new object[] {
+ "Automatic"});
+ this.drp_dvdtitle.Location = new System.Drawing.Point(40, 3);
+ this.drp_dvdtitle.Name = "drp_dvdtitle";
+ this.drp_dvdtitle.Size = new System.Drawing.Size(119, 21);
+ this.drp_dvdtitle.TabIndex = 1;
+ this.ToolTip.SetToolTip(this.drp_dvdtitle, "Select the title you wish to encode.\r\n\r\nWhen a DVD is in use, HandBrake will try " +
+ "to determine the \"Main Feature\" title automatically.\r\nPlease note, this is not a" +
+ "lways accurate and should be checked.");
+ this.drp_dvdtitle.SelectedIndexChanged += new System.EventHandler(this.drp_dvdtitle_SelectedIndexChanged);
+ this.drp_dvdtitle.Click += new System.EventHandler(this.drp_dvdtitle_Click);
+ //
+ // btn_importChapters
+ //
+ this.btn_importChapters.AutoSize = true;
+ this.btn_importChapters.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btn_importChapters.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_importChapters.Location = new System.Drawing.Point(544, 28);
+ this.btn_importChapters.Name = "btn_importChapters";
+ this.btn_importChapters.Size = new System.Drawing.Size(75, 23);
+ this.btn_importChapters.TabIndex = 1;
+ this.btn_importChapters.Text = "Import";
+ this.ToolTip.SetToolTip(this.btn_importChapters, resources.GetString("btn_importChapters.ToolTip"));
+ this.btn_importChapters.UseVisualStyleBackColor = true;
+ this.btn_importChapters.Click += new System.EventHandler(this.btn_importChapters_Click);
+ //
+ // btn_export
+ //
+ this.btn_export.AutoSize = true;
+ this.btn_export.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btn_export.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_export.Location = new System.Drawing.Point(625, 28);
+ this.btn_export.Name = "btn_export";
+ this.btn_export.Size = new System.Drawing.Size(75, 23);
+ this.btn_export.TabIndex = 0;
+ this.btn_export.Text = "Export";
+ this.ToolTip.SetToolTip(this.btn_export, resources.GetString("btn_export.ToolTip"));
+ this.btn_export.UseVisualStyleBackColor = true;
+ this.btn_export.Click += new System.EventHandler(this.btn_export_Click);
+ //
+ // drop_mode
+ //
+ this.drop_mode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_mode.FormattingEnabled = true;
+ this.drop_mode.Items.AddRange(new object[] {
+ "Chapters",
+ "Seconds",
+ "Frames"});
+ this.drop_mode.Location = new System.Drawing.Point(295, 3);
+ this.drop_mode.Name = "drop_mode";
+ this.drop_mode.Size = new System.Drawing.Size(77, 21);
+ this.drop_mode.TabIndex = 4;
+ this.ToolTip.SetToolTip(this.drop_mode, resources.GetString("drop_mode.ToolTip"));
+ this.drop_mode.SelectedIndexChanged += new System.EventHandler(this.drop_mode_SelectedIndexChanged);
+ //
+ // btn_generate_Query
+ //
+ this.btn_generate_Query.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btn_generate_Query.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btn_generate_Query.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_generate_Query.Location = new System.Drawing.Point(16, 104);
+ this.btn_generate_Query.Name = "btn_generate_Query";
+ this.btn_generate_Query.Size = new System.Drawing.Size(126, 22);
+ this.btn_generate_Query.TabIndex = 2;
+ this.btn_generate_Query.Text = "Generate Query";
+ this.ToolTip.SetToolTip(this.btn_generate_Query, "This will allow you to override the generated query.\r\nNote, The query in the box " +
+ "below will always override any automatically generated query, even if you change" +
+ " title or source.");
+ this.btn_generate_Query.UseVisualStyleBackColor = true;
+ this.btn_generate_Query.Click += new System.EventHandler(this.btn_generate_Query_Click);
+ //
+ // radio_cq
+ //
+ this.radio_cq.AutoSize = true;
+ this.radio_cq.BackColor = System.Drawing.Color.Transparent;
+ this.radio_cq.Location = new System.Drawing.Point(366, 37);
+ this.radio_cq.Name = "radio_cq";
+ this.radio_cq.Size = new System.Drawing.Size(105, 17);
+ this.radio_cq.TabIndex = 3;
+ this.radio_cq.Text = "Constant Quality:";
+ this.ToolTip.SetToolTip(this.radio_cq, resources.GetString("radio_cq.ToolTip"));
+ this.radio_cq.UseVisualStyleBackColor = false;
+ this.radio_cq.CheckedChanged += new System.EventHandler(this.radio_cq_CheckedChanged);
+ //
+ // radio_avgBitrate
+ //
+ this.radio_avgBitrate.AutoSize = true;
+ this.radio_avgBitrate.BackColor = System.Drawing.Color.Transparent;
+ this.radio_avgBitrate.Checked = true;
+ this.radio_avgBitrate.Location = new System.Drawing.Point(367, 108);
+ this.radio_avgBitrate.Name = "radio_avgBitrate";
+ this.radio_avgBitrate.Size = new System.Drawing.Size(112, 17);
+ this.radio_avgBitrate.TabIndex = 4;
+ this.radio_avgBitrate.TabStop = true;
+ this.radio_avgBitrate.Text = "Avg Bitrate (kbps):";
+ this.ToolTip.SetToolTip(this.radio_avgBitrate, resources.GetString("radio_avgBitrate.ToolTip"));
+ this.radio_avgBitrate.UseVisualStyleBackColor = false;
+ this.radio_avgBitrate.CheckedChanged += new System.EventHandler(this.radio_avgBitrate_CheckedChanged);
+ //
+ // check_2PassEncode
+ //
+ this.check_2PassEncode.AutoSize = true;
+ this.check_2PassEncode.BackColor = System.Drawing.Color.Transparent;
+ this.check_2PassEncode.Location = new System.Drawing.Point(385, 134);
+ this.check_2PassEncode.Name = "check_2PassEncode";
+ this.check_2PassEncode.Size = new System.Drawing.Size(106, 17);
+ this.check_2PassEncode.TabIndex = 10;
+ this.check_2PassEncode.Text = "2-Pass Encoding";
+ this.ToolTip.SetToolTip(this.check_2PassEncode, resources.GetString("check_2PassEncode.ToolTip"));
+ this.check_2PassEncode.UseVisualStyleBackColor = false;
+ this.check_2PassEncode.CheckedChanged += new System.EventHandler(this.check_2PassEncode_CheckedChanged);
+ //
+ // treeView_presets
+ //
+ this.treeView_presets.ContextMenuStrip = this.presets_menu;
+ this.treeView_presets.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.treeView_presets.ForeColor = System.Drawing.Color.DarkBlue;
+ this.treeView_presets.FullRowSelect = true;
+ this.treeView_presets.HideSelection = false;
+ this.treeView_presets.ItemHeight = 21;
+ this.treeView_presets.Location = new System.Drawing.Point(0, 0);
+ this.treeView_presets.Margin = new System.Windows.Forms.Padding(3, 3, 3, 0);
+ this.treeView_presets.Name = "treeView_presets";
+ this.treeView_presets.ShowLines = false;
+ this.treeView_presets.Size = new System.Drawing.Size(240, 424);
+ this.treeView_presets.TabIndex = 0;
+ this.treeView_presets.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView_presets_AfterSelect);
+ this.treeView_presets.KeyUp += new System.Windows.Forms.KeyEventHandler(this.treeView_presets_deleteKey);
+ this.treeView_presets.MouseMove += new System.Windows.Forms.MouseEventHandler(this.TreeViewPresetsMouseMove);
+ this.treeView_presets.MouseUp += new System.Windows.Forms.MouseEventHandler(this.treeview_presets_mouseUp);
+ //
+ // presets_menu
+ //
+ this.presets_menu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.pmnu_expandAll,
+ this.pmnu_collapse,
+ this.sep1,
+ this.pmnu_import,
+ this.toolStripSeparator2,
+ this.pmnu_saveChanges,
+ this.pmnu_delete});
+ this.presets_menu.Name = "presets_menu";
+ this.presets_menu.Size = new System.Drawing.Size(148, 126);
+ this.presets_menu.Text = ";";
+ this.presets_menu.Opening += new System.ComponentModel.CancelEventHandler(this.presets_menu_Opening);
+ //
+ // pmnu_expandAll
+ //
+ this.pmnu_expandAll.Name = "pmnu_expandAll";
+ this.pmnu_expandAll.Size = new System.Drawing.Size(147, 22);
+ this.pmnu_expandAll.Text = "Expand All";
+ this.pmnu_expandAll.Click += new System.EventHandler(this.pmnu_expandAll_Click);
+ //
+ // pmnu_collapse
+ //
+ this.pmnu_collapse.Name = "pmnu_collapse";
+ this.pmnu_collapse.Size = new System.Drawing.Size(147, 22);
+ this.pmnu_collapse.Text = "Collapse All";
+ this.pmnu_collapse.Click += new System.EventHandler(this.pmnu_collapse_Click);
+ //
+ // sep1
+ //
+ this.sep1.Name = "sep1";
+ this.sep1.Size = new System.Drawing.Size(144, 6);
+ //
+ // pmnu_import
+ //
+ this.pmnu_import.Name = "pmnu_import";
+ this.pmnu_import.Size = new System.Drawing.Size(147, 22);
+ this.pmnu_import.Text = "Import";
+ this.pmnu_import.Click += new System.EventHandler(this.pmnu_import_Click);
+ //
+ // toolStripSeparator2
+ //
+ this.toolStripSeparator2.Name = "toolStripSeparator2";
+ this.toolStripSeparator2.Size = new System.Drawing.Size(144, 6);
+ //
+ // pmnu_saveChanges
+ //
+ this.pmnu_saveChanges.Name = "pmnu_saveChanges";
+ this.pmnu_saveChanges.Size = new System.Drawing.Size(147, 22);
+ this.pmnu_saveChanges.Text = "Save Changes";
+ this.pmnu_saveChanges.Click += new System.EventHandler(this.pmnu_saveChanges_Click);
+ //
+ // pmnu_delete
+ //
+ this.pmnu_delete.Name = "pmnu_delete";
+ this.pmnu_delete.Size = new System.Drawing.Size(147, 22);
+ this.pmnu_delete.Text = "Delete";
+ this.pmnu_delete.Click += new System.EventHandler(this.pmnu_delete_click);
+ //
+ // DVD_Open
+ //
+ this.DVD_Open.Description = "Select the \"VIDEO_TS\" folder from your DVD Drive.";
+ //
+ // File_Open
+ //
+ this.File_Open.DefaultExt = "hb";
+ this.File_Open.Filter = "hb|*.hb";
+ //
+ // ISO_Open
+ //
+ this.ISO_Open.DefaultExt = "ISO";
+ this.ISO_Open.Filter = "All Files|*.*";
+ this.ISO_Open.RestoreDirectory = true;
+ this.ISO_Open.SupportMultiDottedExtensions = true;
+ //
+ // FileToolStripMenuItem
+ //
+ this.FileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.mnu_killCLI,
+ this.mnu_exit});
+ this.FileToolStripMenuItem.Name = "FileToolStripMenuItem";
+ this.FileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
+ this.FileToolStripMenuItem.Text = "&File";
+ //
+ // mnu_killCLI
+ //
+ this.mnu_killCLI.Name = "mnu_killCLI";
+ this.mnu_killCLI.Size = new System.Drawing.Size(138, 22);
+ this.mnu_killCLI.Text = "Cancel Scan";
+ this.mnu_killCLI.Visible = false;
+ this.mnu_killCLI.Click += new System.EventHandler(this.mnu_killCLI_Click);
+ //
+ // mnu_exit
+ //
+ this.mnu_exit.Name = "mnu_exit";
+ this.mnu_exit.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4)));
+ this.mnu_exit.Size = new System.Drawing.Size(138, 22);
+ this.mnu_exit.Text = "E&xit";
+ this.mnu_exit.Click += new System.EventHandler(this.mnu_exit_Click);
+ //
+ // mnu_open3
+ //
+ this.mnu_open3.Name = "mnu_open3";
+ this.mnu_open3.Size = new System.Drawing.Size(32, 19);
+ //
+ // ToolsToolStripMenuItem
+ //
+ this.ToolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.mnu_encode,
+ this.mnu_encodeLog,
+ this.ToolStripSeparator5,
+ this.mnu_options});
+ this.ToolsToolStripMenuItem.Name = "ToolsToolStripMenuItem";
+ this.ToolsToolStripMenuItem.Size = new System.Drawing.Size(48, 20);
+ this.ToolsToolStripMenuItem.Text = "&Tools";
+ //
+ // mnu_encode
+ //
+ this.mnu_encode.Image = global::Handbrake.Properties.Resources.Queue_Small;
+ this.mnu_encode.Name = "mnu_encode";
+ this.mnu_encode.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Q)));
+ this.mnu_encode.Size = new System.Drawing.Size(201, 22);
+ this.mnu_encode.Text = "Show Queue";
+ this.mnu_encode.Click += new System.EventHandler(this.mnu_encode_Click);
+ //
+ // mnu_encodeLog
+ //
+ this.mnu_encodeLog.Image = global::Handbrake.Properties.Resources.ActivityWindow_small;
+ this.mnu_encodeLog.Name = "mnu_encodeLog";
+ this.mnu_encodeLog.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.L)));
+ this.mnu_encodeLog.Size = new System.Drawing.Size(201, 22);
+ this.mnu_encodeLog.Text = "Activity Window";
+ this.mnu_encodeLog.Click += new System.EventHandler(this.mnu_encodeLog_Click);
+ //
+ // ToolStripSeparator5
+ //
+ this.ToolStripSeparator5.Name = "ToolStripSeparator5";
+ this.ToolStripSeparator5.Size = new System.Drawing.Size(198, 6);
+ //
+ // mnu_options
+ //
+ this.mnu_options.Image = global::Handbrake.Properties.Resources.Pref_Small;
+ this.mnu_options.Name = "mnu_options";
+ this.mnu_options.Size = new System.Drawing.Size(201, 22);
+ this.mnu_options.Text = "Options";
+ this.mnu_options.Click += new System.EventHandler(this.mnu_options_Click);
+ //
+ // frmMainMenu
+ //
+ this.frmMainMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.FileToolStripMenuItem,
+ this.ToolsToolStripMenuItem});
+ this.frmMainMenu.Location = new System.Drawing.Point(0, 0);
+ this.frmMainMenu.Name = "frmMainMenu";
+ this.frmMainMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional;
+ this.frmMainMenu.Size = new System.Drawing.Size(1002, 24);
+ this.frmMainMenu.TabIndex = 0;
+ this.frmMainMenu.TabStop = true;
+ this.frmMainMenu.Text = "MenuStrip";
+ //
+ // label5
+ //
+ this.label5.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.label5.AutoSize = true;
+ this.label5.ForeColor = System.Drawing.Color.Black;
+ this.label5.Location = new System.Drawing.Point(3, 7);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(58, 13);
+ this.label5.TabIndex = 0;
+ this.label5.Text = "Container:";
+ //
+ // Label47
+ //
+ this.Label47.AutoSize = true;
+ this.Label47.BackColor = System.Drawing.Color.Transparent;
+ this.Label47.ForeColor = System.Drawing.Color.Black;
+ this.Label47.Location = new System.Drawing.Point(13, 39);
+ this.Label47.Name = "Label47";
+ this.Label47.Size = new System.Drawing.Size(70, 13);
+ this.Label47.TabIndex = 7;
+ this.Label47.Text = "Video Codec:";
+ //
+ // Label3
+ //
+ this.Label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+ this.Label3.AutoSize = true;
+ this.Label3.ForeColor = System.Drawing.Color.Black;
+ this.Label3.Location = new System.Drawing.Point(3, 8);
+ this.Label3.Name = "Label3";
+ this.Label3.Size = new System.Drawing.Size(27, 13);
+ this.Label3.TabIndex = 0;
+ this.Label3.Text = "File:";
+ //
+ // tab_audio
+ //
+ this.tab_audio.BackColor = System.Drawing.Color.Transparent;
+ this.tab_audio.Controls.Add(this.AudioSettings);
+ this.tab_audio.Location = new System.Drawing.Point(4, 22);
+ this.tab_audio.Name = "tab_audio";
+ this.tab_audio.Padding = new System.Windows.Forms.Padding(3);
+ this.tab_audio.Size = new System.Drawing.Size(724, 308);
+ this.tab_audio.TabIndex = 3;
+ this.tab_audio.Text = "Audio";
+ this.tab_audio.UseVisualStyleBackColor = true;
+ //
+ // AudioSettings
+ //
+ this.AudioSettings.BackColor = System.Drawing.Color.Transparent;
+ this.AudioSettings.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.AudioSettings.Location = new System.Drawing.Point(0, 0);
+ this.AudioSettings.Name = "AudioSettings";
+ this.AudioSettings.Size = new System.Drawing.Size(715, 310);
+ this.AudioSettings.TabIndex = 0;
+ //
+ // AudioMenuRowHeightHack
+ //
+ this.AudioMenuRowHeightHack.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+ this.AudioMenuRowHeightHack.ImageSize = new System.Drawing.Size(1, 18);
+ this.AudioMenuRowHeightHack.TransparentColor = System.Drawing.Color.Transparent;
+ //
+ // tab_video
+ //
+ this.tab_video.BackColor = System.Drawing.Color.Transparent;
+ this.tab_video.Controls.Add(this.panel1);
+ this.tab_video.Controls.Add(this.drp_videoFramerate);
+ this.tab_video.Controls.Add(this.radio_cq);
+ this.tab_video.Controls.Add(this.radio_avgBitrate);
+ this.tab_video.Controls.Add(this.drp_videoEncoder);
+ this.tab_video.Controls.Add(this.Label47);
+ this.tab_video.Controls.Add(this.label25);
+ this.tab_video.Controls.Add(this.check_turbo);
+ this.tab_video.Controls.Add(this.check_2PassEncode);
+ this.tab_video.Controls.Add(this.Label2);
+ this.tab_video.Controls.Add(this.slider_videoQuality);
+ this.tab_video.Controls.Add(this.text_bitrate);
+ this.tab_video.Controls.Add(this.lbl_SliderValue);
+ this.tab_video.Controls.Add(this.lbl_framerate);
+ this.tab_video.Location = new System.Drawing.Point(4, 22);
+ this.tab_video.Name = "tab_video";
+ this.tab_video.Padding = new System.Windows.Forms.Padding(3);
+ this.tab_video.Size = new System.Drawing.Size(724, 308);
+ this.tab_video.TabIndex = 2;
+ this.tab_video.Text = "Video";
+ this.tab_video.UseVisualStyleBackColor = true;
+ //
+ // panel1
+ //
+ this.panel1.Controls.Add(this.radio_constantFramerate);
+ this.panel1.Controls.Add(this.radio_peakAndVariable);
+ this.panel1.Location = new System.Drawing.Point(125, 92);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(184, 59);
+ this.panel1.TabIndex = 20;
+ //
+ // radio_constantFramerate
+ //
+ this.radio_constantFramerate.AutoSize = true;
+ this.radio_constantFramerate.BackColor = System.Drawing.Color.Transparent;
+ this.radio_constantFramerate.Checked = true;
+ this.radio_constantFramerate.Location = new System.Drawing.Point(0, 0);
+ this.radio_constantFramerate.Name = "radio_constantFramerate";
+ this.radio_constantFramerate.Size = new System.Drawing.Size(117, 17);
+ this.radio_constantFramerate.TabIndex = 17;
+ this.radio_constantFramerate.TabStop = true;
+ this.radio_constantFramerate.Text = "Constant Framerate";
+ this.radio_constantFramerate.UseVisualStyleBackColor = false;
+ //
+ // radio_peakAndVariable
+ //
+ this.radio_peakAndVariable.AutoSize = true;
+ this.radio_peakAndVariable.BackColor = System.Drawing.Color.Transparent;
+ this.radio_peakAndVariable.Location = new System.Drawing.Point(0, 23);
+ this.radio_peakAndVariable.Name = "radio_peakAndVariable";
+ this.radio_peakAndVariable.Size = new System.Drawing.Size(113, 17);
+ this.radio_peakAndVariable.TabIndex = 19;
+ this.radio_peakAndVariable.Text = "Variable Framerate";
+ this.radio_peakAndVariable.UseVisualStyleBackColor = false;
+ //
+ // label25
+ //
+ this.label25.AutoSize = true;
+ this.label25.BackColor = System.Drawing.Color.Transparent;
+ this.label25.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label25.Location = new System.Drawing.Point(13, 13);
+ this.label25.Name = "label25";
+ this.label25.Size = new System.Drawing.Size(38, 13);
+ this.label25.TabIndex = 8;
+ this.label25.Text = "Video";
+ //
+ // Label2
+ //
+ this.Label2.AutoSize = true;
+ this.Label2.BackColor = System.Drawing.Color.Transparent;
+ this.Label2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Label2.Location = new System.Drawing.Point(363, 13);
+ this.Label2.Name = "Label2";
+ this.Label2.Size = new System.Drawing.Size(47, 13);
+ this.Label2.TabIndex = 11;
+ this.Label2.Text = "Quality";
+ //
+ // lbl_SliderValue
+ //
+ this.lbl_SliderValue.AutoSize = true;
+ this.lbl_SliderValue.BackColor = System.Drawing.Color.Transparent;
+ this.lbl_SliderValue.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lbl_SliderValue.Location = new System.Drawing.Point(487, 39);
+ this.lbl_SliderValue.Name = "lbl_SliderValue";
+ this.lbl_SliderValue.Size = new System.Drawing.Size(21, 13);
+ this.lbl_SliderValue.TabIndex = 15;
+ this.lbl_SliderValue.Text = "RF";
+ //
+ // lbl_framerate
+ //
+ this.lbl_framerate.AutoSize = true;
+ this.lbl_framerate.BackColor = System.Drawing.Color.Transparent;
+ this.lbl_framerate.Location = new System.Drawing.Point(13, 65);
+ this.lbl_framerate.Name = "lbl_framerate";
+ this.lbl_framerate.Size = new System.Drawing.Size(90, 13);
+ this.lbl_framerate.TabIndex = 16;
+ this.lbl_framerate.Text = "Framerate (FPS):";
+ //
+ // tab_picture
+ //
+ this.tab_picture.BackColor = System.Drawing.Color.Transparent;
+ this.tab_picture.Controls.Add(this.PictureSettings);
+ this.tab_picture.Location = new System.Drawing.Point(4, 22);
+ this.tab_picture.Name = "tab_picture";
+ this.tab_picture.Padding = new System.Windows.Forms.Padding(3);
+ this.tab_picture.Size = new System.Drawing.Size(724, 308);
+ this.tab_picture.TabIndex = 0;
+ this.tab_picture.Text = "Picture";
+ this.tab_picture.UseVisualStyleBackColor = true;
+ //
+ // PictureSettings
+ //
+ this.PictureSettings.BackColor = System.Drawing.Color.Transparent;
+ this.PictureSettings.CurrentlySelectedPreset = null;
+ this.PictureSettings.Enabled = false;
+ this.PictureSettings.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.PictureSettings.Location = new System.Drawing.Point(0, 0);
+ this.PictureSettings.Name = "PictureSettings";
+ this.PictureSettings.PresetMaximumResolution = new System.Drawing.Size(0, 0);
+ this.PictureSettings.Size = new System.Drawing.Size(666, 279);
+ this.PictureSettings.TabIndex = 0;
+ //
+ // Check_ChapterMarkers
+ //
+ this.Check_ChapterMarkers.AutoSize = true;
+ this.Check_ChapterMarkers.BackColor = System.Drawing.Color.Transparent;
+ this.Check_ChapterMarkers.Location = new System.Drawing.Point(16, 32);
+ this.Check_ChapterMarkers.Name = "Check_ChapterMarkers";
+ this.Check_ChapterMarkers.Size = new System.Drawing.Size(136, 17);
+ this.Check_ChapterMarkers.TabIndex = 4;
+ this.Check_ChapterMarkers.Text = "Create chapter markers";
+ this.Check_ChapterMarkers.UseVisualStyleBackColor = false;
+ this.Check_ChapterMarkers.CheckedChanged += new System.EventHandler(this.Check_ChapterMarkers_CheckedChanged);
+ //
+ // tabs_panel
+ //
+ this.tabs_panel.Controls.Add(this.tab_picture);
+ this.tabs_panel.Controls.Add(this.tab_filters);
+ this.tabs_panel.Controls.Add(this.tab_video);
+ this.tabs_panel.Controls.Add(this.tab_audio);
+ this.tabs_panel.Controls.Add(this.tab_subtitles);
+ this.tabs_panel.Controls.Add(this.tab_chapters);
+ this.tabs_panel.Controls.Add(this.tab_advanced);
+ this.tabs_panel.Controls.Add(this.tab_query);
+ this.tabs_panel.Location = new System.Drawing.Point(12, 218);
+ this.tabs_panel.Name = "tabs_panel";
+ this.tabs_panel.SelectedIndex = 0;
+ this.tabs_panel.Size = new System.Drawing.Size(732, 334);
+ this.tabs_panel.TabIndex = 6;
+ //
+ // tab_filters
+ //
+ this.tab_filters.Controls.Add(this.Filters);
+ this.tab_filters.Location = new System.Drawing.Point(4, 22);
+ this.tab_filters.Name = "tab_filters";
+ this.tab_filters.Size = new System.Drawing.Size(724, 308);
+ this.tab_filters.TabIndex = 1;
+ this.tab_filters.Text = "Video Filters";
+ this.tab_filters.UseVisualStyleBackColor = true;
+ //
+ // Filters
+ //
+ this.Filters.BackColor = System.Drawing.Color.Transparent;
+ this.Filters.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Filters.Location = new System.Drawing.Point(0, 0);
+ this.Filters.Name = "Filters";
+ this.Filters.Size = new System.Drawing.Size(713, 310);
+ this.Filters.TabIndex = 0;
+ //
+ // tab_subtitles
+ //
+ this.tab_subtitles.Controls.Add(this.Subtitles);
+ this.tab_subtitles.Location = new System.Drawing.Point(4, 22);
+ this.tab_subtitles.Name = "tab_subtitles";
+ this.tab_subtitles.Padding = new System.Windows.Forms.Padding(3);
+ this.tab_subtitles.Size = new System.Drawing.Size(724, 308);
+ this.tab_subtitles.TabIndex = 4;
+ this.tab_subtitles.Text = "Subtitles";
+ this.tab_subtitles.UseVisualStyleBackColor = true;
+ //
+ // Subtitles
+ //
+ this.Subtitles.BackColor = System.Drawing.Color.Transparent;
+ this.Subtitles.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Subtitles.Location = new System.Drawing.Point(0, 0);
+ this.Subtitles.Name = "Subtitles";
+ this.Subtitles.Size = new System.Drawing.Size(722, 310);
+ this.Subtitles.TabIndex = 0;
+ //
+ // tab_chapters
+ //
+ this.tab_chapters.BackColor = System.Drawing.Color.Transparent;
+ this.tab_chapters.Controls.Add(this.btn_export);
+ this.tab_chapters.Controls.Add(this.btn_importChapters);
+ this.tab_chapters.Controls.Add(this.label31);
+ this.tab_chapters.Controls.Add(this.data_chpt);
+ this.tab_chapters.Controls.Add(this.Check_ChapterMarkers);
+ this.tab_chapters.Location = new System.Drawing.Point(4, 22);
+ this.tab_chapters.Name = "tab_chapters";
+ this.tab_chapters.Size = new System.Drawing.Size(724, 308);
+ this.tab_chapters.TabIndex = 5;
+ this.tab_chapters.Text = "Chapters";
+ this.tab_chapters.UseVisualStyleBackColor = true;
+ //
+ // label31
+ //
+ this.label31.AutoSize = true;
+ this.label31.BackColor = System.Drawing.Color.Transparent;
+ this.label31.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label31.Location = new System.Drawing.Point(13, 13);
+ this.label31.Name = "label31";
+ this.label31.Size = new System.Drawing.Size(102, 13);
+ this.label31.TabIndex = 2;
+ this.label31.Text = "Chapter Markers";
+ //
+ // tab_advanced
+ //
+ this.tab_advanced.BackColor = System.Drawing.Color.Transparent;
+ this.tab_advanced.Controls.Add(this.advancedEncoderOpts);
+ this.tab_advanced.Controls.Add(this.x264Panel);
+ this.tab_advanced.Location = new System.Drawing.Point(4, 22);
+ this.tab_advanced.Name = "tab_advanced";
+ this.tab_advanced.Padding = new System.Windows.Forms.Padding(3);
+ this.tab_advanced.Size = new System.Drawing.Size(724, 308);
+ this.tab_advanced.TabIndex = 6;
+ this.tab_advanced.Text = "Advanced";
+ this.tab_advanced.UseVisualStyleBackColor = true;
+ //
+ // advancedEncoderOpts
+ //
+ this.advancedEncoderOpts.AdavancedQuery = "";
+ this.advancedEncoderOpts.BackColor = System.Drawing.Color.Transparent;
+ this.advancedEncoderOpts.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.advancedEncoderOpts.Location = new System.Drawing.Point(0, 0);
+ this.advancedEncoderOpts.Name = "advancedEncoderOpts";
+ this.advancedEncoderOpts.Size = new System.Drawing.Size(720, 209);
+ this.advancedEncoderOpts.TabIndex = 1;
+ //
+ // x264Panel
+ //
+ this.x264Panel.BackColor = System.Drawing.Color.Transparent;
+ this.x264Panel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.x264Panel.Location = new System.Drawing.Point(0, 0);
+ this.x264Panel.Name = "x264Panel";
+ this.x264Panel.Size = new System.Drawing.Size(720, 306);
+ this.x264Panel.TabIndex = 0;
+ this.x264Panel.X264Query = "";
+ //
+ // tab_query
+ //
+ this.tab_query.Controls.Add(this.btn_clear);
+ this.tab_query.Controls.Add(this.label34);
+ this.tab_query.Controls.Add(this.btn_generate_Query);
+ this.tab_query.Controls.Add(this.label33);
+ this.tab_query.Controls.Add(this.rtf_query);
+ this.tab_query.Location = new System.Drawing.Point(4, 22);
+ this.tab_query.Name = "tab_query";
+ this.tab_query.Size = new System.Drawing.Size(724, 308);
+ this.tab_query.TabIndex = 7;
+ this.tab_query.Text = "Query Editor";
+ this.tab_query.UseVisualStyleBackColor = true;
+ //
+ // btn_clear
+ //
+ this.btn_clear.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btn_clear.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btn_clear.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_clear.Location = new System.Drawing.Point(634, 104);
+ this.btn_clear.Name = "btn_clear";
+ this.btn_clear.Size = new System.Drawing.Size(75, 22);
+ this.btn_clear.TabIndex = 0;
+ this.btn_clear.Text = "Clear";
+ this.btn_clear.UseVisualStyleBackColor = true;
+ this.btn_clear.Click += new System.EventHandler(this.btn_clear_Click);
+ //
+ // label34
+ //
+ this.label34.AutoSize = true;
+ this.label34.Location = new System.Drawing.Point(13, 35);
+ this.label34.Name = "label34";
+ this.label34.Size = new System.Drawing.Size(631, 52);
+ this.label34.TabIndex = 1;
+ this.label34.Text = resources.GetString("label34.Text");
+ //
+ // label33
+ //
+ this.label33.AutoSize = true;
+ this.label33.BackColor = System.Drawing.Color.Transparent;
+ this.label33.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label33.Location = new System.Drawing.Point(13, 13);
+ this.label33.Name = "label33";
+ this.label33.Size = new System.Drawing.Size(77, 13);
+ this.label33.TabIndex = 3;
+ this.label33.Text = "Query Editor";
+ //
+ // rtf_query
+ //
+ this.rtf_query.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.rtf_query.Location = new System.Drawing.Point(16, 132);
+ this.rtf_query.Name = "rtf_query";
+ this.rtf_query.Size = new System.Drawing.Size(693, 161);
+ this.rtf_query.TabIndex = 4;
+ this.rtf_query.Text = "";
+ //
+ // groupBox2
+ //
+ this.groupBox2.Controls.Add(this.splitContainer1);
+ this.groupBox2.ForeColor = System.Drawing.Color.Black;
+ this.groupBox2.Location = new System.Drawing.Point(750, 70);
+ this.groupBox2.Name = "groupBox2";
+ this.groupBox2.Size = new System.Drawing.Size(246, 482);
+ this.groupBox2.TabIndex = 4;
+ this.groupBox2.TabStop = false;
+ this.groupBox2.Text = "Presets";
+ //
+ // splitContainer1
+ //
+ this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.splitContainer1.Location = new System.Drawing.Point(3, 17);
+ this.splitContainer1.Name = "splitContainer1";
+ this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
+ //
+ // splitContainer1.Panel1
+ //
+ this.splitContainer1.Panel1.Controls.Add(this.treeView_presets);
+ //
+ // splitContainer1.Panel2
+ //
+ this.splitContainer1.Panel2.Controls.Add(this.presetsToolStrip);
+ this.splitContainer1.Size = new System.Drawing.Size(240, 462);
+ this.splitContainer1.SplitterDistance = 424;
+ this.splitContainer1.TabIndex = 0;
+ //
+ // presetsToolStrip
+ //
+ this.presetsToolStrip.CanOverflow = false;
+ this.presetsToolStrip.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.presetsToolStrip.GripMargin = new System.Windows.Forms.Padding(0);
+ this.presetsToolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
+ this.presetsToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.BtnAddPreset,
+ this.BtnRemovePreset,
+ this.toolStripDropDownButton2});
+ this.presetsToolStrip.Location = new System.Drawing.Point(0, 0);
+ this.presetsToolStrip.Name = "presetsToolStrip";
+ this.presetsToolStrip.Padding = new System.Windows.Forms.Padding(0);
+ this.presetsToolStrip.Size = new System.Drawing.Size(240, 34);
+ this.presetsToolStrip.TabIndex = 2;
+ this.presetsToolStrip.Text = "toolStrip2";
+ //
+ // BtnAddPreset
+ //
+ this.BtnAddPreset.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.BtnAddPreset.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.BtnAddPreset.Image = global::Handbrake.Properties.Resources.Add16;
+ this.BtnAddPreset.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.BtnAddPreset.Name = "BtnAddPreset";
+ this.BtnAddPreset.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;
+ this.BtnAddPreset.Padding = new System.Windows.Forms.Padding(8, 0, 8, 0);
+ this.BtnAddPreset.Size = new System.Drawing.Size(65, 31);
+ this.BtnAddPreset.Text = "Add";
+ this.BtnAddPreset.Click += new System.EventHandler(this.BtnAddPreset_Click);
+ //
+ // BtnRemovePreset
+ //
+ this.BtnRemovePreset.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.BtnRemovePreset.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.BtnRemovePreset.Image = global::Handbrake.Properties.Resources.Close;
+ this.BtnRemovePreset.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.BtnRemovePreset.Name = "BtnRemovePreset";
+ this.BtnRemovePreset.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;
+ this.BtnRemovePreset.Padding = new System.Windows.Forms.Padding(0, 0, 8, 0);
+ this.BtnRemovePreset.Size = new System.Drawing.Size(82, 31);
+ this.BtnRemovePreset.Text = "Remove";
+ this.BtnRemovePreset.Click += new System.EventHandler(this.BtnRemovePreset_Click);
+ //
+ // toolStripDropDownButton2
+ //
+ this.toolStripDropDownButton2.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.MnuSetDefaultPreset,
+ this.toolStripSeparator3,
+ this.MnuImportPreset,
+ this.MnuExportPreset,
+ this.toolStripSeparator6,
+ this.MnuResetBuiltInPresets});
+ this.toolStripDropDownButton2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.toolStripDropDownButton2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.toolStripDropDownButton2.Image = global::Handbrake.Properties.Resources.Options24;
+ this.toolStripDropDownButton2.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.toolStripDropDownButton2.Name = "toolStripDropDownButton2";
+ this.toolStripDropDownButton2.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;
+ this.toolStripDropDownButton2.Size = new System.Drawing.Size(79, 31);
+ this.toolStripDropDownButton2.Text = "Options";
+ //
+ // MnuSetDefaultPreset
+ //
+ this.MnuSetDefaultPreset.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.MnuSetDefaultPreset.Name = "MnuSetDefaultPreset";
+ this.MnuSetDefaultPreset.Size = new System.Drawing.Size(178, 22);
+ this.MnuSetDefaultPreset.Text = "Set Default";
+ this.MnuSetDefaultPreset.Click += new System.EventHandler(this.MnuSetDefaultPreset_Click);
+ //
+ // toolStripSeparator3
+ //
+ this.toolStripSeparator3.Name = "toolStripSeparator3";
+ this.toolStripSeparator3.Size = new System.Drawing.Size(175, 6);
+ //
+ // MnuImportPreset
+ //
+ this.MnuImportPreset.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.MnuImportPreset.Name = "MnuImportPreset";
+ this.MnuImportPreset.Size = new System.Drawing.Size(178, 22);
+ this.MnuImportPreset.Text = "Import";
+ this.MnuImportPreset.Click += new System.EventHandler(this.MnuImportPreset_Click);
+ //
+ // MnuExportPreset
+ //
+ this.MnuExportPreset.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.MnuExportPreset.Name = "MnuExportPreset";
+ this.MnuExportPreset.Size = new System.Drawing.Size(178, 22);
+ this.MnuExportPreset.Text = "Export";
+ this.MnuExportPreset.Click += new System.EventHandler(this.MnuExportPreset_Click);
+ //
+ // toolStripSeparator6
+ //
+ this.toolStripSeparator6.Name = "toolStripSeparator6";
+ this.toolStripSeparator6.Size = new System.Drawing.Size(175, 6);
+ //
+ // MnuResetBuiltInPresets
+ //
+ this.MnuResetBuiltInPresets.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.MnuResetBuiltInPresets.Name = "MnuResetBuiltInPresets";
+ this.MnuResetBuiltInPresets.Size = new System.Drawing.Size(178, 22);
+ this.MnuResetBuiltInPresets.Text = "Reset Built-In Presets";
+ this.MnuResetBuiltInPresets.Click += new System.EventHandler(this.MnuResetBuiltInPresets_Click);
+ //
+ // toolStrip1
+ //
+ this.toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
+ this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.btn_source,
+ this.toolStripSeparator10,
+ this.btn_start,
+ this.btn_add2Queue,
+ this.btn_showQueue,
+ this.toolStripSeparator4,
+ this.tb_preview,
+ this.btn_ActivityWindow,
+ this.toolStripSeparator8,
+ this.toolStripDropDownButton1});
+ this.toolStrip1.Location = new System.Drawing.Point(0, 24);
+ this.toolStrip1.Name = "toolStrip1";
+ this.toolStrip1.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional;
+ this.toolStrip1.Size = new System.Drawing.Size(1002, 39);
+ this.toolStrip1.TabIndex = 1;
+ this.toolStrip1.TabStop = true;
+ this.toolStrip1.Text = "toolStrip1";
+ //
+ // btn_source
+ //
+ this.btn_source.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.btn_file_source,
+ this.btn_dvd_source,
+ this.btnTitleSpecific,
+ this.toolStripSeparator1});
+ this.btn_source.Image = global::Handbrake.Properties.Resources.Movies;
+ this.btn_source.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.btn_source.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btn_source.Name = "btn_source";
+ this.btn_source.Size = new System.Drawing.Size(88, 36);
+ this.btn_source.Text = "Source";
+ this.btn_source.ToolTipText = "Open a new source file or folder.";
+ this.btn_source.Click += new System.EventHandler(this.btn_source_Click);
+ //
+ // btn_dvd_source
+ //
+ this.btn_dvd_source.Image = global::Handbrake.Properties.Resources.folder;
+ this.btn_dvd_source.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btn_dvd_source.Name = "btn_dvd_source";
+ this.btn_dvd_source.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.O)));
+ this.btn_dvd_source.Size = new System.Drawing.Size(182, 22);
+ this.btn_dvd_source.Text = "Folder";
+ this.btn_dvd_source.Click += new System.EventHandler(this.BtnFolderScanClicked);
+ //
+ // btnTitleSpecific
+ //
+ this.btnTitleSpecific.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.FileTitleSpecificScan,
+ this.FolderTitleSpecificScan});
+ this.btnTitleSpecific.Name = "btnTitleSpecific";
+ this.btnTitleSpecific.Size = new System.Drawing.Size(182, 22);
+ this.btnTitleSpecific.Text = "Title Specific Scan";
+ //
+ // FileTitleSpecificScan
+ //
+ this.FileTitleSpecificScan.Image = global::Handbrake.Properties.Resources.Movies_Small;
+ this.FileTitleSpecificScan.Name = "FileTitleSpecificScan";
+ this.FileTitleSpecificScan.Size = new System.Drawing.Size(125, 22);
+ this.FileTitleSpecificScan.Text = "Video File";
+ this.FileTitleSpecificScan.Click += new System.EventHandler(this.VideoTitleSpecificScanClick);
+ //
+ // FolderTitleSpecificScan
+ //
+ this.FolderTitleSpecificScan.Image = global::Handbrake.Properties.Resources.folder;
+ this.FolderTitleSpecificScan.Name = "FolderTitleSpecificScan";
+ this.FolderTitleSpecificScan.Size = new System.Drawing.Size(125, 22);
+ this.FolderTitleSpecificScan.Text = "Folder";
+ this.FolderTitleSpecificScan.Click += new System.EventHandler(this.FolderTitleSpecificScanClick);
+ //
+ // toolStripSeparator1
+ //
+ this.toolStripSeparator1.Name = "toolStripSeparator1";
+ this.toolStripSeparator1.Size = new System.Drawing.Size(179, 6);
+ //
+ // toolStripSeparator10
+ //
+ this.toolStripSeparator10.Name = "toolStripSeparator10";
+ this.toolStripSeparator10.Size = new System.Drawing.Size(6, 39);
+ //
+ // btn_start
+ //
+ this.btn_start.Image = global::Handbrake.Properties.Resources.Play;
+ this.btn_start.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.btn_start.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btn_start.Name = "btn_start";
+ this.btn_start.Size = new System.Drawing.Size(67, 36);
+ this.btn_start.Text = "Start";
+ this.btn_start.ToolTipText = "Start the encoding process";
+ this.btn_start.Click += new System.EventHandler(this.btn_start_Click);
+ //
+ // btn_add2Queue
+ //
+ this.btn_add2Queue.Image = global::Handbrake.Properties.Resources.AddToQueue;
+ this.btn_add2Queue.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.btn_add2Queue.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btn_add2Queue.Name = "btn_add2Queue";
+ this.btn_add2Queue.Size = new System.Drawing.Size(117, 36);
+ this.btn_add2Queue.Text = "Add to Queue";
+ this.btn_add2Queue.ToolTipText = "Add a new item to the Queue";
+ this.btn_add2Queue.Click += new System.EventHandler(this.btn_add2Queue_Click);
+ //
+ // btn_showQueue
+ //
+ this.btn_showQueue.Image = global::Handbrake.Properties.Resources.Queue;
+ this.btn_showQueue.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.btn_showQueue.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btn_showQueue.Name = "btn_showQueue";
+ this.btn_showQueue.Size = new System.Drawing.Size(110, 36);
+ this.btn_showQueue.Tag = "";
+ this.btn_showQueue.Text = "Show Queue";
+ this.btn_showQueue.Click += new System.EventHandler(this.btn_showQueue_Click);
+ //
+ // toolStripSeparator4
+ //
+ this.toolStripSeparator4.Name = "toolStripSeparator4";
+ this.toolStripSeparator4.Size = new System.Drawing.Size(6, 39);
+ //
+ // tb_preview
+ //
+ this.tb_preview.Image = global::Handbrake.Properties.Resources.window;
+ this.tb_preview.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.tb_preview.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.tb_preview.Name = "tb_preview";
+ this.tb_preview.Size = new System.Drawing.Size(84, 36);
+ this.tb_preview.Text = "Preview";
+ this.tb_preview.Click += new System.EventHandler(this.tb_preview_Click);
+ //
+ // btn_ActivityWindow
+ //
+ this.btn_ActivityWindow.Image = global::Handbrake.Properties.Resources.ActivityWindow;
+ this.btn_ActivityWindow.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.btn_ActivityWindow.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btn_ActivityWindow.Name = "btn_ActivityWindow";
+ this.btn_ActivityWindow.Size = new System.Drawing.Size(130, 36);
+ this.btn_ActivityWindow.Text = "Activity Window";
+ this.btn_ActivityWindow.ToolTipText = "Displays the activity window which displays the log of the last completed or curr" +
+ "ently running encode.";
+ this.btn_ActivityWindow.Click += new System.EventHandler(this.btn_ActivityWindow_Click);
+ //
+ // toolStripSeparator8
+ //
+ this.toolStripSeparator8.Name = "toolStripSeparator8";
+ this.toolStripSeparator8.Size = new System.Drawing.Size(6, 39);
+ //
+ // toolStripDropDownButton1
+ //
+ this.toolStripDropDownButton1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.toolStripDropDownButton1.AutoSize = false;
+ this.toolStripDropDownButton1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.MnuUserGuide,
+ this.toolStripSeparator9,
+ this.MnuCheckForUpdates,
+ this.toolStripSeparator11,
+ this.MnuAboutHandBrake});
+ this.toolStripDropDownButton1.Image = global::Handbrake.Properties.Resources.Help24;
+ this.toolStripDropDownButton1.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.toolStripDropDownButton1.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.toolStripDropDownButton1.Name = "toolStripDropDownButton1";
+ this.toolStripDropDownButton1.Size = new System.Drawing.Size(69, 36);
+ this.toolStripDropDownButton1.Text = "Help";
+ //
+ // MnuUserGuide
+ //
+ this.MnuUserGuide.Image = global::Handbrake.Properties.Resources.info16;
+ this.MnuUserGuide.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.MnuUserGuide.Name = "MnuUserGuide";
+ this.MnuUserGuide.Size = new System.Drawing.Size(192, 24);
+ this.MnuUserGuide.Text = "HandBrake User Guide";
+ this.MnuUserGuide.Click += new System.EventHandler(this.MnuUserGuide_Click);
+ //
+ // toolStripSeparator9
+ //
+ this.toolStripSeparator9.Name = "toolStripSeparator9";
+ this.toolStripSeparator9.Size = new System.Drawing.Size(189, 6);
+ //
+ // MnuCheckForUpdates
+ //
+ this.MnuCheckForUpdates.Name = "MnuCheckForUpdates";
+ this.MnuCheckForUpdates.Size = new System.Drawing.Size(192, 24);
+ this.MnuCheckForUpdates.Text = "Check for Updates";
+ this.MnuCheckForUpdates.Click += new System.EventHandler(this.MnuCheckForUpdates_Click);
+ //
+ // toolStripSeparator11
+ //
+ this.toolStripSeparator11.Name = "toolStripSeparator11";
+ this.toolStripSeparator11.Size = new System.Drawing.Size(189, 6);
+ //
+ // MnuAboutHandBrake
+ //
+ this.MnuAboutHandBrake.Image = global::Handbrake.Properties.Resources.hb16;
+ this.MnuAboutHandBrake.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.MnuAboutHandBrake.Name = "MnuAboutHandBrake";
+ this.MnuAboutHandBrake.Size = new System.Drawing.Size(192, 24);
+ this.MnuAboutHandBrake.Text = "About HandBrake";
+ this.MnuAboutHandBrake.Click += new System.EventHandler(this.MnuAboutHandBrake_Click);
+ //
+ // notifyIcon
+ //
+ this.notifyIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info;
+ this.notifyIcon.BalloonTipText = "HandBrake Status Here";
+ this.notifyIcon.BalloonTipTitle = "HandBrake";
+ this.notifyIcon.ContextMenuStrip = notifyIconMenu;
+ this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon")));
+ this.notifyIcon.Text = "HandBrake";
+ this.notifyIcon.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon_MouseDoubleClick);
+ //
+ // StatusStrip
+ //
+ this.StatusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.ProgressBarStatus,
+ this.lbl_encode,
+ this.lbl_updateCheck});
+ this.StatusStrip.Location = new System.Drawing.Point(0, 561);
+ this.StatusStrip.Name = "StatusStrip";
+ this.StatusStrip.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional;
+ this.StatusStrip.Size = new System.Drawing.Size(1002, 22);
+ this.StatusStrip.SizingGrip = false;
+ this.StatusStrip.TabIndex = 7;
+ this.StatusStrip.Text = "statusStrip1";
+ //
+ // ProgressBarStatus
+ //
+ this.ProgressBarStatus.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.ProgressBarStatus.Name = "ProgressBarStatus";
+ this.ProgressBarStatus.Size = new System.Drawing.Size(100, 16);
+ this.ProgressBarStatus.Visible = false;
+ //
+ // lbl_encode
+ //
+ this.lbl_encode.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lbl_encode.Name = "lbl_encode";
+ this.lbl_encode.Size = new System.Drawing.Size(28, 17);
+ this.lbl_encode.Text = "{0}";
+ //
+ // lbl_updateCheck
+ //
+ this.lbl_updateCheck.BackColor = System.Drawing.Color.Transparent;
+ this.lbl_updateCheck.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+ this.lbl_updateCheck.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lbl_updateCheck.Name = "lbl_updateCheck";
+ this.lbl_updateCheck.Size = new System.Drawing.Size(139, 17);
+ this.lbl_updateCheck.Text = "Checking for Updates ...";
+ this.lbl_updateCheck.Visible = false;
+ //
+ // hbproc
+ //
+ this.hbproc.StartInfo.Domain = "";
+ this.hbproc.StartInfo.LoadUserProfile = false;
+ this.hbproc.StartInfo.Password = null;
+ this.hbproc.StartInfo.StandardErrorEncoding = null;
+ this.hbproc.StartInfo.StandardOutputEncoding = null;
+ this.hbproc.StartInfo.UserName = "";
+ this.hbproc.SynchronizingObject = this;
+ //
+ // File_Save
+ //
+ this.File_Save.DefaultExt = "hb";
+ this.File_Save.Filter = "hb|*.hb";
+ //
+ // tableLayoutPanel2
+ //
+ this.tableLayoutPanel2.AutoSize = true;
+ this.tableLayoutPanel2.ColumnCount = 3;
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel2.Controls.Add(this.Label3, 0, 0);
+ this.tableLayoutPanel2.Controls.Add(this.text_destination, 1, 0);
+ this.tableLayoutPanel2.Controls.Add(this.btn_destBrowse, 2, 0);
+ this.tableLayoutPanel2.Location = new System.Drawing.Point(21, 132);
+ this.tableLayoutPanel2.Name = "tableLayoutPanel2";
+ this.tableLayoutPanel2.RowCount = 1;
+ this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
+ this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 29F));
+ this.tableLayoutPanel2.Size = new System.Drawing.Size(723, 29);
+ this.tableLayoutPanel2.TabIndex = 3;
+ //
+ // btn_destBrowse
+ //
+ this.btn_destBrowse.AutoSize = true;
+ this.btn_destBrowse.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btn_destBrowse.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_destBrowse.Location = new System.Drawing.Point(645, 3);
+ this.btn_destBrowse.Name = "btn_destBrowse";
+ this.btn_destBrowse.Size = new System.Drawing.Size(75, 23);
+ this.btn_destBrowse.TabIndex = 2;
+ this.btn_destBrowse.Text = "Browse";
+ this.btn_destBrowse.UseVisualStyleBackColor = true;
+ this.btn_destBrowse.Click += new System.EventHandler(this.btn_destBrowse_Click);
+ //
+ // tableLayoutPanel3
+ //
+ this.tableLayoutPanel3.AutoSize = true;
+ this.tableLayoutPanel3.ColumnCount = 5;
+ this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel3.Controls.Add(this.label5, 0, 0);
+ this.tableLayoutPanel3.Controls.Add(this.drop_format, 1, 0);
+ this.tableLayoutPanel3.Controls.Add(this.check_largeFile, 2, 0);
+ this.tableLayoutPanel3.Controls.Add(this.check_optimiseMP4, 3, 0);
+ this.tableLayoutPanel3.Controls.Add(this.check_iPodAtom, 4, 0);
+ this.tableLayoutPanel3.Location = new System.Drawing.Point(21, 180);
+ this.tableLayoutPanel3.Name = "tableLayoutPanel3";
+ this.tableLayoutPanel3.RowCount = 1;
+ this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
+ this.tableLayoutPanel3.Size = new System.Drawing.Size(723, 27);
+ this.tableLayoutPanel3.TabIndex = 5;
+ //
+ // tableLayoutPanel1
+ //
+ this.tableLayoutPanel1.AutoSize = true;
+ this.tableLayoutPanel1.ColumnCount = 12;
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 35F));
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 5F));
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel1.Controls.Add(this.Label10, 0, 0);
+ this.tableLayoutPanel1.Controls.Add(this.drp_dvdtitle, 1, 0);
+ this.tableLayoutPanel1.Controls.Add(this.lbl_angle, 2, 0);
+ this.tableLayoutPanel1.Controls.Add(this.drop_angle, 3, 0);
+ this.tableLayoutPanel1.Controls.Add(this.drop_chapterStart, 7, 0);
+ this.tableLayoutPanel1.Controls.Add(this.Label13, 8, 0);
+ this.tableLayoutPanel1.Controls.Add(this.drop_chapterFinish, 9, 0);
+ this.tableLayoutPanel1.Controls.Add(this.label_duration, 10, 0);
+ this.tableLayoutPanel1.Controls.Add(this.lbl_duration, 11, 0);
+ this.tableLayoutPanel1.Controls.Add(this.drop_mode, 5, 0);
+ this.tableLayoutPanel1.Location = new System.Drawing.Point(21, 86);
+ this.tableLayoutPanel1.Name = "tableLayoutPanel1";
+ this.tableLayoutPanel1.RowCount = 1;
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
+ this.tableLayoutPanel1.Size = new System.Drawing.Size(723, 27);
+ this.tableLayoutPanel1.TabIndex = 2;
+ //
+ // Label10
+ //
+ this.Label10.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+ this.Label10.AutoSize = true;
+ this.Label10.ForeColor = System.Drawing.Color.Black;
+ this.Label10.Location = new System.Drawing.Point(3, 7);
+ this.Label10.Name = "Label10";
+ this.Label10.Size = new System.Drawing.Size(31, 13);
+ this.Label10.TabIndex = 0;
+ this.Label10.Text = "Title:";
+ //
+ // lbl_angle
+ //
+ this.lbl_angle.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+ this.lbl_angle.AutoSize = true;
+ this.lbl_angle.ForeColor = System.Drawing.Color.Black;
+ this.lbl_angle.Location = new System.Drawing.Point(165, 7);
+ this.lbl_angle.Name = "lbl_angle";
+ this.lbl_angle.Size = new System.Drawing.Size(38, 13);
+ this.lbl_angle.TabIndex = 2;
+ this.lbl_angle.Text = "Angle:";
+ //
+ // Label13
+ //
+ this.Label13.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+ this.Label13.AutoSize = true;
+ this.Label13.Location = new System.Drawing.Point(458, 7);
+ this.Label13.Name = "Label13";
+ this.Label13.Size = new System.Drawing.Size(45, 13);
+ this.Label13.TabIndex = 6;
+ this.Label13.Text = "through";
+ //
+ // label_duration
+ //
+ this.label_duration.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+ this.label_duration.AutoSize = true;
+ this.label_duration.BackColor = System.Drawing.Color.Transparent;
+ this.label_duration.Location = new System.Drawing.Point(584, 7);
+ this.label_duration.Name = "label_duration";
+ this.label_duration.Size = new System.Drawing.Size(52, 13);
+ this.label_duration.TabIndex = 8;
+ this.label_duration.Text = "Duration:";
+ //
+ // lbl_duration
+ //
+ this.lbl_duration.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.lbl_duration.AutoSize = true;
+ this.lbl_duration.BackColor = System.Drawing.Color.Transparent;
+ this.lbl_duration.Location = new System.Drawing.Point(642, 7);
+ this.lbl_duration.Name = "lbl_duration";
+ this.lbl_duration.Size = new System.Drawing.Size(39, 13);
+ this.lbl_duration.TabIndex = 9;
+ this.lbl_duration.Text = "--:--:--";
+ //
+ // labelStaticDestination
+ //
+ this.labelStaticDestination.AutoSize = true;
+ this.labelStaticDestination.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.labelStaticDestination.Location = new System.Drawing.Point(9, 116);
+ this.labelStaticDestination.Name = "labelStaticDestination";
+ this.labelStaticDestination.Size = new System.Drawing.Size(75, 13);
+ this.labelStaticDestination.TabIndex = 3;
+ this.labelStaticDestination.Text = "Destination:";
+ //
+ // labelPreset
+ //
+ this.labelPreset.AutoSize = true;
+ this.labelPreset.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.labelPreset.Location = new System.Drawing.Point(9, 164);
+ this.labelPreset.Name = "labelPreset";
+ this.labelPreset.Size = new System.Drawing.Size(180, 13);
+ this.labelPreset.TabIndex = 5;
+ this.labelPreset.Text = "Output Settings (Preset: None)";
+ //
+ // labelSource
+ //
+ this.labelSource.AutoSize = true;
+ this.labelSource.Location = new System.Drawing.Point(55, 0);
+ this.labelSource.Name = "labelSource";
+ this.labelSource.Size = new System.Drawing.Size(137, 13);
+ this.labelSource.TabIndex = 1;
+ this.labelSource.Text = "Select \"Source\" to continue";
+ //
+ // labelStaticSource
+ //
+ this.labelStaticSource.AutoSize = true;
+ this.labelStaticSource.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.labelStaticSource.Location = new System.Drawing.Point(0, 0);
+ this.labelStaticSource.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
+ this.labelStaticSource.Name = "labelStaticSource";
+ this.labelStaticSource.Size = new System.Drawing.Size(49, 13);
+ this.labelStaticSource.TabIndex = 0;
+ this.labelStaticSource.Text = "Source:";
+ //
+ // SourceLayoutPanel
+ //
+ this.SourceLayoutPanel.AutoSize = true;
+ this.SourceLayoutPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+ this.SourceLayoutPanel.Controls.Add(this.labelStaticSource);
+ this.SourceLayoutPanel.Controls.Add(this.labelSource);
+ this.SourceLayoutPanel.Location = new System.Drawing.Point(9, 70);
+ this.SourceLayoutPanel.Margin = new System.Windows.Forms.Padding(0);
+ this.SourceLayoutPanel.Name = "SourceLayoutPanel";
+ this.SourceLayoutPanel.Size = new System.Drawing.Size(195, 13);
+ this.SourceLayoutPanel.TabIndex = 2;
+ //
+ // openPreset
+ //
+ this.openPreset.DefaultExt = "plist";
+ this.openPreset.Filter = "Plist Files|*.plist";
+ //
+ // File_ChapterImport
+ //
+ this.File_ChapterImport.Filter = "CSV Files|*.csv";
+ //
+ // frmMain
+ //
+ this.AllowDrop = true;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
+ this.AutoSize = true;
+ this.ClientSize = new System.Drawing.Size(1002, 583);
+ this.Controls.Add(this.tableLayoutPanel3);
+ this.Controls.Add(this.toolStrip1);
+ this.Controls.Add(this.SourceLayoutPanel);
+ this.Controls.Add(this.frmMainMenu);
+ this.Controls.Add(this.tableLayoutPanel2);
+ this.Controls.Add(this.labelPreset);
+ this.Controls.Add(this.groupBox2);
+ this.Controls.Add(this.StatusStrip);
+ this.Controls.Add(this.tableLayoutPanel1);
+ this.Controls.Add(this.tabs_panel);
+ this.Controls.Add(this.labelStaticDestination);
+ this.DoubleBuffered = true;
+ this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.KeyPreview = true;
+ this.MinimumSize = new System.Drawing.Size(900, 500);
+ this.Name = "frmMain";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "HandBrake";
+ notifyIconMenu.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.slider_videoQuality)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.data_chpt)).EndInit();
+ this.ChaptersMenu.ResumeLayout(false);
+ this.presets_menu.ResumeLayout(false);
+ this.frmMainMenu.ResumeLayout(false);
+ this.frmMainMenu.PerformLayout();
+ this.tab_audio.ResumeLayout(false);
+ this.tab_video.ResumeLayout(false);
+ this.tab_video.PerformLayout();
+ this.panel1.ResumeLayout(false);
+ this.panel1.PerformLayout();
+ this.tab_picture.ResumeLayout(false);
+ this.tabs_panel.ResumeLayout(false);
+ this.tab_filters.ResumeLayout(false);
+ this.tab_subtitles.ResumeLayout(false);
+ this.tab_chapters.ResumeLayout(false);
+ this.tab_chapters.PerformLayout();
+ this.tab_advanced.ResumeLayout(false);
+ this.tab_query.ResumeLayout(false);
+ this.tab_query.PerformLayout();
+ this.groupBox2.ResumeLayout(false);
+ this.splitContainer1.Panel1.ResumeLayout(false);
+ this.splitContainer1.Panel2.ResumeLayout(false);
+ this.splitContainer1.Panel2.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
+ this.splitContainer1.ResumeLayout(false);
+ this.presetsToolStrip.ResumeLayout(false);
+ this.presetsToolStrip.PerformLayout();
+ this.toolStrip1.ResumeLayout(false);
+ this.toolStrip1.PerformLayout();
+ this.StatusStrip.ResumeLayout(false);
+ this.StatusStrip.PerformLayout();
+ this.tableLayoutPanel2.ResumeLayout(false);
+ this.tableLayoutPanel2.PerformLayout();
+ this.tableLayoutPanel3.ResumeLayout(false);
+ this.tableLayoutPanel3.PerformLayout();
+ this.tableLayoutPanel1.ResumeLayout(false);
+ this.tableLayoutPanel1.PerformLayout();
+ this.SourceLayoutPanel.ResumeLayout(false);
+ this.SourceLayoutPanel.PerformLayout();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ internal System.Windows.Forms.ToolTip ToolTip;
+ internal System.Windows.Forms.ToolStripMenuItem FileToolStripMenuItem;
+ internal System.Windows.Forms.ToolStripMenuItem mnu_open3;
+ internal System.Windows.Forms.ToolStripMenuItem mnu_exit;
+ internal System.Windows.Forms.ToolStripMenuItem ToolsToolStripMenuItem;
+ internal System.Windows.Forms.ToolStripMenuItem mnu_encode;
+ internal System.Windows.Forms.ToolStripSeparator ToolStripSeparator5;
+ internal System.Windows.Forms.ToolStripMenuItem mnu_options;
+ internal System.Windows.Forms.MenuStrip frmMainMenu;
+ internal System.Windows.Forms.Label Label3;
+ internal System.Windows.Forms.ComboBox drp_videoEncoder;
+ internal System.Windows.Forms.Label Label47;
+ internal System.Windows.Forms.TextBox text_destination;
+ internal System.Windows.Forms.TabPage tab_audio;
+ internal System.Windows.Forms.TabPage tab_video;
+ internal System.Windows.Forms.CheckBox check_largeFile;
+ internal System.Windows.Forms.CheckBox check_turbo;
+ internal System.Windows.Forms.Label Label2;
+ internal System.Windows.Forms.Label lbl_SliderValue;
+ internal System.Windows.Forms.ComboBox drp_videoFramerate;
+ internal System.Windows.Forms.CheckBox check_2PassEncode;
+ internal System.Windows.Forms.TrackBar slider_videoQuality;
+ internal System.Windows.Forms.TextBox text_bitrate;
+ internal System.Windows.Forms.TabPage tab_picture;
+ internal System.Windows.Forms.CheckBox Check_ChapterMarkers;
+ internal System.Windows.Forms.TabControl tabs_panel;
+ internal System.Windows.Forms.Label lbl_framerate;
+ private System.Windows.Forms.GroupBox groupBox2;
+ private System.Windows.Forms.SaveFileDialog DVD_Save;
+ private System.Windows.Forms.OpenFileDialog File_Open;
+ internal System.Windows.Forms.CheckBox check_iPodAtom;
+ private System.Windows.Forms.TabPage tab_chapters;
+ internal System.Windows.Forms.Label label31;
+ internal System.Windows.Forms.CheckBox check_optimiseMP4;
+ internal System.Windows.Forms.DataGridView data_chpt;
+ private System.Windows.Forms.TabPage tab_query;
+ private System.Windows.Forms.Label label34;
+ internal System.Windows.Forms.Button btn_generate_Query;
+ internal System.Windows.Forms.Label label33;
+ internal System.Windows.Forms.Button btn_clear;
+ private System.Windows.Forms.ToolStrip toolStrip1;
+ private System.Windows.Forms.ToolStripButton btn_start;
+ private System.Windows.Forms.ToolStripButton btn_add2Queue;
+ private System.Windows.Forms.ToolStripButton btn_showQueue;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;
+ private System.Windows.Forms.ToolStripButton btn_ActivityWindow;
+ internal System.Windows.Forms.Label label25;
+ internal System.Windows.Forms.TabPage tab_advanced;
+ internal System.Windows.Forms.TreeView treeView_presets;
+ internal System.Windows.Forms.RichTextBox rtf_query;
+ private System.Windows.Forms.NotifyIcon notifyIcon;
+ private System.Windows.Forms.ToolStripMenuItem btn_restore;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator10;
+ private System.Windows.Forms.ToolStripMenuItem btn_file_source;
+ private System.Windows.Forms.ToolStripDropDownButton btn_source;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+ private System.Windows.Forms.ToolStripMenuItem btn_dvd_source;
+ internal System.Windows.Forms.ComboBox drop_format;
+ internal System.Windows.Forms.Label label5;
+ internal System.Windows.Forms.ToolStripMenuItem mnu_encodeLog;
+ private System.Windows.Forms.StatusStrip StatusStrip;
+ private System.Windows.Forms.ToolStripStatusLabel lbl_encode;
+ internal System.Windows.Forms.OpenFileDialog ISO_Open;
+ internal System.Windows.Forms.FolderBrowserDialog DVD_Open;
+ private System.Windows.Forms.ContextMenuStrip presets_menu;
+ private System.Windows.Forms.ToolStripMenuItem pmnu_expandAll;
+ private System.Windows.Forms.ToolStripMenuItem pmnu_collapse;
+ private System.Windows.Forms.ToolStripSeparator sep1;
+ private System.Windows.Forms.ToolStripMenuItem pmnu_delete;
+ private System.Windows.Forms.SplitContainer splitContainer1;
+ private System.Windows.Forms.ImageList AudioMenuRowHeightHack;
+ private System.Windows.Forms.ToolStripMenuItem pmnu_saveChanges;
+ private System.Windows.Forms.ToolStripMenuItem mnu_killCLI;
+ private System.Windows.Forms.TabPage tab_filters;
+ internal System.Windows.Forms.RadioButton radio_cq;
+ internal System.Windows.Forms.RadioButton radio_avgBitrate;
+ internal Handbrake.Controls.x264Panel x264Panel;
+ private System.Windows.Forms.ToolStripButton tb_preview;
+ private System.Diagnostics.Process hbproc;
+ private TabPage tab_subtitles;
+ internal Handbrake.Controls.AudioPanel AudioSettings;
+ internal Handbrake.Controls.Subtitles Subtitles;
+ internal Handbrake.Controls.Filters Filters;
+ private ToolStripStatusLabel lbl_updateCheck;
+ internal SaveFileDialog File_Save;
+ private TableLayoutPanel tableLayoutPanel2;
+ private Button btn_destBrowse;
+ private TableLayoutPanel tableLayoutPanel3;
+ private TableLayoutPanel tableLayoutPanel1;
+ internal Label lbl_angle;
+ internal ComboBox drop_angle;
+ internal ComboBox drop_chapterStart;
+ internal Label Label13;
+ internal ComboBox drop_chapterFinish;
+ internal Label label_duration;
+ internal Label lbl_duration;
+ private Label labelStaticDestination;
+ internal Label labelPreset;
+ internal Handbrake.Controls.PictureSettings PictureSettings;
+ private Label labelSource;
+ internal ComboBox drp_dvdtitle;
+ internal Label Label10;
+ private Label labelStaticSource;
+ private FlowLayoutPanel SourceLayoutPanel;
+ private OpenFileDialog openPreset;
+ private Button btn_importChapters;
+ private OpenFileDialog File_ChapterImport;
+ private ContextMenuStrip ChaptersMenu;
+ private ToolStripMenuItem mnu_resetChapters;
+ private ToolStripMenuItem pmnu_import;
+ private ToolStripSeparator toolStripSeparator2;
+ internal ComboBox drop_mode;
+ private Button btn_export;
+ private DataGridViewTextBoxColumn number;
+ private DataGridViewTextBoxColumn name;
+ private ToolStripProgressBar ProgressBarStatus;
+ private ToolStripMenuItem btnTitleSpecific;
+ private ToolStripMenuItem FileTitleSpecificScan;
+ private ToolStripMenuItem FolderTitleSpecificScan;
+ private ToolStripSeparator toolStripSeparator8;
+ private ToolStripDropDownButton toolStripDropDownButton1;
+ private ToolStripMenuItem MnuUserGuide;
+ private ToolStripSeparator toolStripSeparator9;
+ private ToolStripMenuItem MnuCheckForUpdates;
+ private ToolStripSeparator toolStripSeparator11;
+ private ToolStripMenuItem MnuAboutHandBrake;
+ private ToolStrip presetsToolStrip;
+ private ToolStripButton BtnAddPreset;
+ private ToolStripButton BtnRemovePreset;
+ private ToolStripDropDownButton toolStripDropDownButton2;
+ private ToolStripMenuItem MnuSetDefaultPreset;
+ private ToolStripSeparator toolStripSeparator3;
+ private ToolStripMenuItem MnuImportPreset;
+ private ToolStripMenuItem MnuExportPreset;
+ private ToolStripSeparator toolStripSeparator6;
+ private ToolStripMenuItem MnuResetBuiltInPresets;
+ internal RadioButton radio_peakAndVariable;
+ internal RadioButton radio_constantFramerate;
+ private Panel panel1;
+ internal Controls.AdvancedEncoderOpts advancedEncoderOpts;
+ }
+} \ No newline at end of file
diff --git a/win/CS/frmMain.cs b/win/CS/frmMain.cs
new file mode 100644
index 000000000..884c4a4f4
--- /dev/null
+++ b/win/CS/frmMain.cs
@@ -0,0 +1,2552 @@
+/* frmMain.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake
+{
+ using System;
+ using System.Collections.Generic;
+ using System.ComponentModel;
+ using System.Diagnostics;
+ using System.Drawing;
+ using System.Globalization;
+ using System.IO;
+ using System.Linq;
+ using System.Threading;
+ using System.Windows.Forms;
+
+ using Functions;
+
+ using HandBrake.ApplicationServices.EventArgs;
+ using HandBrake.ApplicationServices.Model.General;
+ using HandBrake.ApplicationServices.Utilities;
+ using HandBrake.ApplicationServices.Functions;
+ using HandBrake.ApplicationServices.Model;
+ using HandBrake.ApplicationServices.Parsing;
+ using HandBrake.ApplicationServices.Services;
+ using HandBrake.ApplicationServices.Services.Interfaces;
+
+ using Handbrake.ToolWindows;
+
+ using Model;
+ using Properties;
+
+ using Main = Handbrake.Functions.Main;
+
+ /// <summary>
+ /// The Main Window
+ /// </summary>
+ public partial class frmMain : Form
+ {
+ #region Private Varibles
+ // Objects which may be used by one or more other objects *************
+ private IQueueProcessor queueProcessor = new QueueProcessor(Program.InstanceId);
+ private PresetService presetHandler = new PresetService();
+
+ // Windows ************************************************************
+ private frmQueue queueWindow;
+ private frmPreview qtpreview;
+ private frmActivityWindow activityWindow;
+
+ // Globals: Mainly used for tracking. *********************************
+ public Title selectedTitle;
+ public string sourcePath;
+ private SourceType selectedSourceType;
+ private string dvdDrivePath;
+ private string dvdDriveLabel;
+ private Preset currentlySelectedPreset;
+ private Source currentSource;
+
+ private IScan SourceScan;
+ private List<DriveInformation> drives;
+ private QueueTask queueEdit;
+
+ // Delegates **********************************************************
+ private delegate void UpdateWindowHandler();
+
+ #endregion
+
+ // Applicaiton Startup ************************************************
+
+ #region Properties
+
+ /// <summary>
+ /// Gets SourceName.
+ /// </summary>
+ public string SourceName
+ {
+ get
+ {
+ if (this.selectedSourceType == SourceType.DvdDrive)
+ {
+ return this.dvdDriveLabel;
+ }
+
+ if (selectedTitle != null && !string.IsNullOrEmpty(selectedTitle.SourceName))
+ {
+ return Path.GetFileName(selectedTitle.SourceName);
+ }
+
+ // We have a drive, selected as a folder.
+ if (this.sourcePath.EndsWith("\\"))
+ {
+ drives = UtilityService.GetDrives();
+ foreach (DriveInformation item in drives)
+ {
+ if (item.RootDirectory.Contains(this.sourcePath))
+ {
+ return item.VolumeLabel;
+ }
+ }
+ }
+
+ if (Path.GetFileNameWithoutExtension(this.sourcePath) != "VIDEO_TS")
+ return Path.GetFileNameWithoutExtension(this.sourcePath);
+
+ return Path.GetFileNameWithoutExtension(Path.GetDirectoryName(this.sourcePath));
+ }
+ }
+
+ #endregion
+
+ #region Application Startup
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="frmMain"/> class.
+ /// </summary>
+ /// <param name="args">
+ /// The arguments passed in on application startup.
+ /// </param>
+ public frmMain(string[] args)
+ {
+ InitializeComponent();
+ this.presetsToolStrip.Renderer = new ToolStripRenderOverride();
+
+ // We can use LibHB, if the library hb.dll exists.
+ this.SourceScan = File.Exists("hb.dll") ? (IScan)new LibScan() : new ScanService();
+
+ // Update the users config file with the CLI version data.
+ Main.SetCliVersionData();
+
+ if (Settings.Default.hb_version.Contains("svn"))
+ {
+ this.Text += " " + Settings.Default.hb_version;
+ }
+
+ // Check for new versions, if update checking is enabled
+ if (Settings.Default.updateStatus)
+ {
+ if (DateTime.Now.Subtract(Settings.Default.lastUpdateCheckDate).TotalDays > Properties.Settings.Default.daysBetweenUpdateCheck)
+ {
+ // Set when the last update was
+ Settings.Default.lastUpdateCheckDate = DateTime.Now;
+ Settings.Default.Save();
+ string url = Settings.Default.hb_build.ToString().EndsWith("1")
+ ? Settings.Default.appcast_unstable
+ : Settings.Default.appcast;
+ UpdateService.BeginCheckForUpdates(new AsyncCallback(UpdateCheckDone), false, url, Settings.Default.hb_build, Settings.Default.skipversion, Settings.Default.hb_version);
+ }
+ }
+
+ // Clear the log files in the background
+ if (Settings.Default.clearOldLogs)
+ {
+ Thread clearLog = new Thread(() => UtilityService.ClearLogFiles(30));
+ clearLog.Start();
+ }
+
+ // Setup the GUI components
+ LoadPresetPanel(); // Load the Preset Panel
+ treeView_presets.ExpandAll();
+ lbl_encode.Text = string.Empty;
+ drop_mode.SelectedIndex = 0;
+ queueWindow = new frmQueue(this.queueProcessor, this); // Prepare the Queue
+ if (!Settings.Default.QueryEditorTab)
+ tabs_panel.TabPages.RemoveAt(7); // Remove the query editor tab if the user does not want it enabled.
+ if (Settings.Default.tooltipEnable)
+ ToolTip.Active = true;
+
+ // Load the user's default settings or Normal Preset
+ if (Settings.Default.defaultPreset != string.Empty && presetHandler.GetPreset(Properties.Settings.Default.defaultPreset) != null)
+ {
+ string query = presetHandler.GetPreset(Settings.Default.defaultPreset).Query;
+ if (query != null)
+ {
+ x264Panel.Reset2Defaults();
+
+ EncodeTask presetQuery = QueryParserUtility.Parse(query);
+ PresetLoader.LoadPreset(this, presetQuery, Settings.Default.defaultPreset);
+
+ x264Panel.StandardizeOptString();
+ x264Panel.SetCurrentSettingsInPanel();
+ }
+ }
+ else
+ loadNormalPreset();
+
+ // Register with Growl (if not using Growl for the encoding completion action, this wont hurt anything)
+ GrowlCommunicator.Register();
+
+ // Event Handlers and Queue Recovery
+ events();
+ Main.RecoverQueue(this.queueProcessor);
+
+ // If have a file passed in via command arguemtents, check it's a file and try scanning it.
+ if (args.Length >= 1 && (File.Exists(args[0]) || Directory.Exists(args[0])))
+ {
+ this.StartScan(args[0], 0);
+ }
+ }
+
+ /// <summary>
+ /// When the update check is done, process the results.
+ /// </summary>
+ /// <param name="result">IAsyncResult result</param>
+ private void UpdateCheckDone(IAsyncResult result)
+ {
+ if (InvokeRequired)
+ {
+ Invoke(new MethodInvoker(() => UpdateCheckDone(result)));
+ return;
+ }
+
+ try
+ {
+ UpdateCheckInformation info = UpdateService.EndCheckForUpdates(result);
+
+ if (info.NewVersionAvailable)
+ {
+ UpdateInfo updateWindow = new UpdateInfo(info, Settings.Default.hb_version, Settings.Default.hb_build.ToString());
+ updateWindow.ShowDialog();
+ }
+ }
+ catch (Exception ex)
+ {
+ if ((bool)result.AsyncState)
+ Main.ShowExceptiowWindow("Unable to check for updates, Please try again later.", ex.ToString());
+ }
+ }
+
+ #endregion
+
+ #region Events
+
+ // Encoding Events for setting up the GUI
+ private void events()
+ {
+ // Handle Widget changes when preset is selected.
+ RegisterPresetEventHandler();
+
+ // Handle Window Resize
+ if (Settings.Default.MainWindowMinimize)
+ this.Resize += this.frmMain_Resize;
+
+ // Handle Encode Start / Finish / Pause
+ this.queueProcessor.EncodeService.EncodeStarted += this.encodeStarted;
+ this.queueProcessor.EncodeService.EncodeCompleted += encodeEnded;
+
+ // Scan Started and Completed Events
+ SourceScan.ScanStatusChanged += this.SourceScanScanStatusChanged;
+ SourceScan.ScanCompleted += this.SourceScanScanCompleted;
+
+ // Handle a file being draged onto the GUI.
+ this.DragEnter += frmMain_DragEnter;
+ this.DragDrop += this.frmMain_DragDrop;
+ }
+
+ // Change the preset label to custom when a user changes a setting. Don't want to give the impression that users can change settings and still be using a preset
+ private void RegisterPresetEventHandler()
+ {
+ // Output Settings
+ drop_format.SelectedIndexChanged += this.changePresetLabel;
+ check_largeFile.CheckedChanged += this.changePresetLabel;
+ check_iPodAtom.CheckedChanged += this.changePresetLabel;
+ check_optimiseMP4.CheckedChanged += this.changePresetLabel;
+
+ // Picture Settings
+ PictureSettings.PictureSettingsChanged += this.changePresetLabel;
+
+ // Filter Settings
+ Filters.FilterSettingsChanged += this.changePresetLabel;
+
+ // Video Tab
+ drp_videoEncoder.SelectedIndexChanged += this.changePresetLabel;
+ check_2PassEncode.CheckedChanged += this.changePresetLabel;
+ check_turbo.CheckedChanged += this.changePresetLabel;
+ text_bitrate.TextChanged += this.changePresetLabel;
+ slider_videoQuality.ValueChanged += this.changePresetLabel;
+
+ // Audio Panel
+ AudioSettings.AudioListChanged += this.changePresetLabel;
+
+ // Advanced Tab
+ x264Panel.rtf_x264Query.TextChanged += this.changePresetLabel;
+ }
+
+ private void UnRegisterPresetEventHandler()
+ {
+ // Output Settings
+ drop_format.SelectedIndexChanged -= this.changePresetLabel;
+ check_largeFile.CheckedChanged -= this.changePresetLabel;
+ check_iPodAtom.CheckedChanged -= this.changePresetLabel;
+ check_optimiseMP4.CheckedChanged -= this.changePresetLabel;
+
+ // Picture Settings
+ PictureSettings.PictureSettingsChanged -= this.changePresetLabel;
+
+ // Filter Settings
+ Filters.FilterSettingsChanged -= this.changePresetLabel;
+
+ // Video Tab
+ drp_videoEncoder.SelectedIndexChanged -= this.changePresetLabel;
+ check_2PassEncode.CheckedChanged -= this.changePresetLabel;
+ check_turbo.CheckedChanged -= this.changePresetLabel;
+ text_bitrate.TextChanged -= this.changePresetLabel;
+ slider_videoQuality.ValueChanged -= this.changePresetLabel;
+
+ // Audio Panel
+ AudioSettings.AudioListChanged -= this.changePresetLabel;
+
+ // Advanced Tab
+ x264Panel.rtf_x264Query.TextChanged -= this.changePresetLabel;
+ }
+
+ private void changePresetLabel(object sender, EventArgs e)
+ {
+ labelPreset.Text = "Output Settings (Preset: Custom)";
+ this.currentlySelectedPreset = null;
+ }
+
+ private static void frmMain_DragEnter(object sender, DragEventArgs e)
+ {
+ if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
+ e.Effect = DragDropEffects.All;
+ }
+
+ private void frmMain_DragDrop(object sender, DragEventArgs e)
+ {
+ string[] fileList = e.Data.GetData(DataFormats.FileDrop) as string[];
+ sourcePath = string.Empty;
+
+ if (fileList != null)
+ {
+ if (!string.IsNullOrEmpty(fileList[0]))
+ {
+ this.selectedSourceType = SourceType.VideoFile;
+ StartScan(fileList[0], 0);
+ }
+ else
+ UpdateSourceLabel();
+ }
+ else
+ UpdateSourceLabel();
+ }
+
+ private void encodeStarted(object sender, EventArgs e)
+ {
+ SetEncodeStarted();
+ this.queueProcessor.EncodeService.EncodeStatusChanged += EncodeQueue_EncodeStatusChanged;
+ }
+
+ private void encodeEnded(object sender, EventArgs e)
+ {
+ this.queueProcessor.EncodeService.EncodeStatusChanged -= EncodeQueue_EncodeStatusChanged;
+ SetEncodeFinished();
+ }
+ #endregion
+
+ // User Interface Menus / Tool Strips *********************************
+
+ #region File Menu
+
+ /// <summary>
+ /// Kill The scan menu Item
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void mnu_killCLI_Click(object sender, EventArgs e)
+ {
+ KillScan();
+ }
+
+ /// <summary>
+ /// Exit the Application Menu Item
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void mnu_exit_Click(object sender, EventArgs e)
+ {
+ Application.Exit();
+ }
+
+ #endregion
+
+ #region Tools Menu
+
+ /// <summary>
+ /// Menu - Start Button
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void mnu_encode_Click(object sender, EventArgs e)
+ {
+ queueWindow.Show();
+ }
+
+ /// <summary>
+ /// Menu - Display the Log Window
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void mnu_encodeLog_Click(object sender, EventArgs e)
+ {
+ this.btn_ActivityWindow_Click(this, null);
+ }
+
+ /// <summary>
+ /// Menu - Display the Options Window
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void mnu_options_Click(object sender, EventArgs e)
+ {
+ Form options = new frmOptions(this);
+ options.ShowDialog();
+ }
+
+ #endregion
+
+ #region Help Menu (Toolbar)
+
+ /// <summary>
+ /// Menu - Display the User Guide Web Page
+ /// </summary>
+ /// <param name="sender">The Sender</param>
+ /// <param name="e">The EventArgs</param>
+ private void MnuUserGuide_Click(object sender, EventArgs e)
+ {
+ Process.Start("http://trac.handbrake.fr/wiki/HandBrakeGuide");
+ }
+
+ /// <summary>
+ /// Check for Updates
+ /// </summary>
+ /// <param name="sender">The Sender</param>
+ /// <param name="e">The EventArgs</param>
+ private void MnuCheckForUpdates_Click(object sender, EventArgs e)
+ {
+ lbl_updateCheck.Visible = true;
+ Settings.Default.lastUpdateCheckDate = DateTime.Now;
+ Settings.Default.Save();
+ string url = Settings.Default.hb_build.ToString().EndsWith("1")
+ ? Settings.Default.appcast_unstable
+ : Settings.Default.appcast;
+ UpdateService.BeginCheckForUpdates(new AsyncCallback(UpdateCheckDoneMenu), false, url, Settings.Default.hb_build, Settings.Default.skipversion, Settings.Default.hb_version);
+ }
+
+ /// <summary>
+ /// Menu - Display the About Window
+ /// </summary>
+ /// <param name="sender">The Sender</param>
+ /// <param name="e">The EventArgs</param>
+ private void MnuAboutHandBrake_Click(object sender, EventArgs e)
+ {
+ using (frmAbout About = new frmAbout())
+ {
+ About.ShowDialog();
+ }
+ }
+
+ #endregion
+
+ #region Preset Bar
+
+ /// <summary>
+ /// RMenu - Expand All
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void pmnu_expandAll_Click(object sender, EventArgs e)
+ {
+ treeView_presets.ExpandAll();
+ }
+
+ /// <summary>
+ /// RMenu - Collaspe All
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void pmnu_collapse_Click(object sender, EventArgs e)
+ {
+ treeView_presets.CollapseAll();
+ }
+
+ /// <summary>
+ /// Menu - Import Preset
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void pmnu_import_Click(object sender, EventArgs e)
+ {
+ ImportPreset();
+ }
+
+ /// <summary>
+ /// RMenu - Save Changes to Preset
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void pmnu_saveChanges_Click(object sender, EventArgs e)
+ {
+ DialogResult result =
+ MessageBox.Show(
+ "Do you wish to include picture settings when updating the preset: " +
+ treeView_presets.SelectedNode.Text, "Update Preset", MessageBoxButtons.YesNoCancel,
+ MessageBoxIcon.Question);
+
+ Preset preset = new Preset
+ {
+ Name = this.treeView_presets.SelectedNode.Text,
+ Query =
+ QueryGenerator.GenerateQueryForPreset(this, QueryPictureSettingsMode.SourceMaximum, true, 0, 0),
+ CropSettings = (result == DialogResult.Yes)
+ };
+
+ presetHandler.Update(preset);
+ }
+
+ /// <summary>
+ /// RMenu - Delete Preset
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void pmnu_delete_click(object sender, EventArgs e)
+ {
+ if (treeView_presets.SelectedNode != null)
+ {
+ presetHandler.Remove((Preset)treeView_presets.SelectedNode.Tag);
+ treeView_presets.Nodes.Remove(treeView_presets.SelectedNode);
+ }
+ treeView_presets.Select();
+ }
+
+ /// <summary>
+ /// Preset Menu Is Opening. Setup the Menu
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void presets_menu_Opening(object sender, CancelEventArgs e)
+ {
+ // Make sure that the save menu is always disabled by default
+ pmnu_saveChanges.Enabled = false;
+
+ // Now enable the save menu if the selected preset is a user preset
+ if (treeView_presets.SelectedNode != null)
+ if (presetHandler.CheckIfPresetExists(treeView_presets.SelectedNode.Text))
+ pmnu_saveChanges.Enabled = true;
+
+ treeView_presets.Select();
+ }
+
+ // Presets Management
+
+ private void BtnAddPreset_Click(object sender, EventArgs e)
+ {
+ Form preset = new frmAddPreset(this, presetHandler);
+ if (preset.ShowDialog() == DialogResult.OK)
+ {
+ TreeNode presetTreeview = new TreeNode(presetHandler.LastPresetAdded.Name) { ForeColor = Color.Black };
+ treeView_presets.Nodes.Add(presetTreeview);
+ presetHandler.LastPresetAdded = null;
+ }
+ }
+
+ private void BtnRemovePreset_Click(object sender, EventArgs e)
+ {
+ throw new Exception();
+ if (treeView_presets.SelectedNode == null)
+ {
+ return;
+ }
+
+ DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset",
+ MessageBoxButtons.YesNo, MessageBoxIcon.Question);
+ if (result == DialogResult.Yes)
+ {
+ if (treeView_presets.SelectedNode.Nodes.Count > 0)
+ {
+ // Delete the selected group category
+ this.presetHandler.RemoveGroup(treeView_presets.SelectedNode.Text.Trim());
+ }
+ else
+ {
+ // Delete the selected item.
+ presetHandler.Remove((Preset)treeView_presets.SelectedNode.Tag);
+ }
+ treeView_presets.Nodes.Remove(treeView_presets.SelectedNode);
+ }
+
+ treeView_presets.Select();
+ }
+
+
+ private void MnuSetDefaultPreset_Click(object sender, EventArgs e)
+ {
+ if (treeView_presets.SelectedNode != null)
+ {
+ Settings.Default.defaultPreset = treeView_presets.SelectedNode.Text;
+ Settings.Default.Save();
+ MessageBox.Show("New default preset set.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ else
+ MessageBox.Show("Please select a preset first.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ }
+
+ private void MnuImportPreset_Click(object sender, EventArgs e)
+ {
+ this.ImportPreset();
+ }
+
+ private void MnuExportPreset_Click(object sender, EventArgs e)
+ {
+ this.ExportPreset();
+ }
+
+ private void MnuResetBuiltInPresets_Click(object sender, EventArgs e)
+ {
+ presetHandler.UpdateBuiltInPresets(string.Empty);
+ LoadPresetPanel();
+ treeView_presets.ExpandAll();
+ }
+
+ /// <summary>
+ /// PresetBar Mouse Down event
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void treeview_presets_mouseUp(object sender, MouseEventArgs e)
+ {
+ if (e.Button == MouseButtons.Right)
+ treeView_presets.SelectedNode = treeView_presets.GetNodeAt(e.Location);
+ else if (e.Button == MouseButtons.Left)
+ {
+ if (treeView_presets.GetNodeAt(e.Location) != null)
+ {
+ if (labelPreset.Text.Contains(treeView_presets.GetNodeAt(e.Location).Text))
+ selectPreset();
+ }
+ }
+
+ treeView_presets.Select();
+ }
+
+ /// <summary>
+ /// Preset Bar after selecting the preset
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)
+ {
+ selectPreset();
+ }
+
+ /// <summary>
+ /// When the mouse moves, display a preset
+ /// </summary>
+ /// <param name="sender">The Sender</param>
+ /// <param name="e">the MouseEventArgs</param>
+ private void TreeViewPresetsMouseMove(object sender, MouseEventArgs e)
+ {
+ TreeNode theNode = this.treeView_presets.GetNodeAt(e.X, e.Y);
+
+ if ((theNode != null))
+ {
+ // Change the ToolTip only if the pointer moved to a new node.
+ if (theNode.ToolTipText != this.ToolTip.GetToolTip(this.treeView_presets))
+ {
+ this.ToolTip.SetToolTip(this.treeView_presets, theNode.ToolTipText);
+ }
+ }
+ else // Pointer is not over a node so clear the ToolTip.
+ {
+ this.ToolTip.SetToolTip(this.treeView_presets, string.Empty);
+ }
+ }
+
+ /// <summary>
+ /// Preset Bar - Handle the Delete Key
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void treeView_presets_deleteKey(object sender, KeyEventArgs e)
+ {
+ if (e.KeyCode == Keys.Delete)
+ {
+ this.BtnRemovePreset_Click(sender, e);
+ }
+ }
+
+ /// <summary>
+ /// Select the selected preset and setup the GUI
+ /// </summary>
+ private void selectPreset()
+ {
+ if (treeView_presets.SelectedNode != null)
+ {
+ // Ok, so, we've selected a preset. Now we want to load it.
+ string presetName = treeView_presets.SelectedNode.Text;
+ Preset preset = presetHandler.GetPreset(presetName);
+ if (preset != null)
+ {
+ string query = presetHandler.GetPreset(presetName).Query;
+
+ if (query != null)
+ {
+ // Ok, Reset all the H264 widgets before changing the preset
+ x264Panel.Reset2Defaults();
+
+ // Send the query from the file to the Query Parser class
+ EncodeTask presetQuery = QueryParserUtility.Parse(query);
+
+ // Now load the preset
+ PresetLoader.LoadPreset(this, presetQuery, presetName);
+
+ // The x264 widgets will need updated, so do this now:
+ x264Panel.StandardizeOptString();
+ x264Panel.SetCurrentSettingsInPanel();
+
+ // Finally, let this window have a copy of the preset settings.
+ this.currentlySelectedPreset = preset;
+ PictureSettings.SetPresetCropWarningLabel(preset);
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// Load the Normal Preset
+ /// </summary>
+ private void loadNormalPreset()
+ {
+ foreach (TreeNode treenode in treeView_presets.Nodes)
+ {
+ foreach (TreeNode node in treenode.Nodes)
+ {
+ if (node.Text.Equals("Normal"))
+ treeView_presets.SelectedNode = treeView_presets.Nodes[treenode.Index].Nodes[0];
+ }
+ }
+ }
+
+ /// <summary>
+ /// Import a plist preset
+ /// </summary>
+ private void ImportPreset()
+ {
+ if (openPreset.ShowDialog() == DialogResult.OK)
+ {
+ EncodeTask parsed = PlistPresetHandler.Import(openPreset.FileName);
+ if (presetHandler.CheckIfPresetExists(parsed.PresetName + " (Imported)"))
+ {
+ DialogResult result =
+ MessageBox.Show("This preset appears to already exist. Would you like to overwrite it?",
+ "Overwrite preset?",
+ MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
+ if (result == DialogResult.Yes)
+ {
+ PresetLoader.LoadPreset(this, parsed, parsed.PresetName);
+
+ Preset preset = new Preset
+ {
+ Name = parsed.PresetName + " (Imported)",
+ Query = QueryGenerator.GenerateFullQuery(this),
+ CropSettings = parsed.UsesPictureSettings
+ };
+
+ presetHandler.Update(preset);
+ }
+ }
+ else
+ {
+ PresetLoader.LoadPreset(this, parsed, parsed.PresetName);
+
+ Preset preset = new Preset
+ {
+ Name = parsed.PresetName + " (Imported)",
+ Query = QueryGenerator.GenerateFullQuery(this),
+ CropSettings = parsed.UsesPictureSettings
+ };
+
+ if (presetHandler.Add(preset))
+ {
+ TreeNode preset_treeview = new TreeNode(parsed.PresetName + " (Imported)")
+ {
+ ForeColor = Color.Black
+ };
+ treeView_presets.Nodes.Add(preset_treeview);
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// Export a plist Preset
+ /// </summary>
+ private void ExportPreset()
+ {
+ SaveFileDialog savefiledialog = new SaveFileDialog { Filter = "plist|*.plist" };
+
+ if (treeView_presets.SelectedNode != null)
+ {
+ if (savefiledialog.ShowDialog() == DialogResult.OK)
+ {
+ Preset preset = presetHandler.GetPreset(treeView_presets.SelectedNode.Text);
+ PlistPresetHandler.Export(savefiledialog.FileName, preset);
+ }
+ }
+ }
+
+ #endregion
+
+ #region ToolStrip
+
+ /// <summary>
+ /// Toolbar - When the Source button is clicked, Clear any DVD drives and add any available DVD drives that can be used as a source.
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void btn_source_Click(object sender, EventArgs e)
+ {
+ // Remove old Drive Menu Items.
+ List<ToolStripMenuItem> itemsToRemove = new List<ToolStripMenuItem>();
+ foreach (var item in btn_source.DropDownItems)
+ {
+ if (item.GetType() == typeof(ToolStripMenuItem))
+ {
+ ToolStripMenuItem menuItem = (ToolStripMenuItem)item;
+ if (menuItem.Name.StartsWith("Drive"))
+ {
+ itemsToRemove.Add(menuItem);
+ }
+ }
+ }
+
+ foreach (ToolStripMenuItem item in itemsToRemove)
+ btn_source.DropDownItems.Remove(item);
+
+ Thread driveInfoThread = new Thread(SetDriveSelectionMenuItem);
+ driveInfoThread.Start();
+ }
+
+ /// <summary>
+ /// Toolbar - Start The Encode
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void btn_start_Click(object sender, EventArgs e)
+ {
+ if (btn_start.Text == "Stop")
+ {
+ DialogResult result = !Properties.Settings.Default.showCliForInGuiEncodeStatus
+ ? MessageBox.Show(
+ "Are you sure you wish to cancel the encode?\n\nPlease note: Stopping this encode will render the file unplayable. ",
+ "Cancel Encode?",
+ MessageBoxButtons.YesNo,
+ MessageBoxIcon.Question)
+ : MessageBox.Show(
+ "Are you sure you wish to cancel the encode?",
+ "Cancel Encode?",
+ MessageBoxButtons.YesNo,
+ MessageBoxIcon.Question);
+
+ if (result == DialogResult.Yes)
+ {
+ // Pause The Queue
+ this.queueProcessor.Pause();
+
+ if (Settings.Default.showCliForInGuiEncodeStatus)
+ this.queueProcessor.EncodeService.SafelyStop();
+ else
+ this.queueProcessor.EncodeService.Stop();
+ }
+ }
+ else
+ {
+ // If we have a custom query, then we'll want to figure out what the new source and destination is, otherwise we'll just use the gui components.
+ string jobSourcePath = !string.IsNullOrEmpty(rtf_query.Text) ? Main.GetSourceFromQuery(rtf_query.Text) : sourcePath;
+ string jobDestination = !string.IsNullOrEmpty(rtf_query.Text) ? Main.GetDestinationFromQuery(rtf_query.Text) : text_destination.Text;
+
+ if (this.queueProcessor.QueueManager.Count != 0 || (!string.IsNullOrEmpty(jobSourcePath) && !string.IsNullOrEmpty(jobDestination)))
+ {
+ string generatedQuery = QueryGenerator.GenerateFullQuery(this);
+ string specifiedQuery = rtf_query.Text != string.Empty
+ ? rtf_query.Text
+ : QueryGenerator.GenerateFullQuery(this);
+ string query = string.Empty;
+
+ // Check to make sure the generated query matches the GUI settings
+ if (Properties.Settings.Default.PromptOnUnmatchingQueries && !string.IsNullOrEmpty(specifiedQuery) &&
+ generatedQuery != specifiedQuery)
+ {
+ DialogResult result = MessageBox.Show("The query under the \"Query Editor\" tab " +
+ "does not match the current GUI settings.\n\nBecause the manual query takes " +
+ "priority over the GUI, your recently updated settings will not be taken " +
+ "into account when encoding this job." +
+ Environment.NewLine + Environment.NewLine +
+ "Do you want to replace the manual query with the updated GUI-generated query?",
+ "Manual Query does not Match GUI",
+ MessageBoxButtons.YesNoCancel, MessageBoxIcon.Asterisk,
+ MessageBoxDefaultButton.Button3);
+
+ switch (result)
+ {
+ case DialogResult.Yes:
+ // Replace the manual query with the generated one
+ query = generatedQuery;
+ rtf_query.Text = generatedQuery;
+ break;
+ case DialogResult.No:
+ // Use the manual query
+ query = specifiedQuery;
+ break;
+ case DialogResult.Cancel:
+ // Don't start the encode
+ return;
+ }
+ }
+ else
+ {
+ query = specifiedQuery;
+ }
+
+ DialogResult overwrite = DialogResult.Yes;
+ if (!string.IsNullOrEmpty(jobDestination) && File.Exists(jobDestination))
+ {
+ overwrite = MessageBox.Show(
+ "The destination file already exists. Are you sure you want to overwrite it?",
+ "Overwrite File?",
+ MessageBoxButtons.YesNo,
+ MessageBoxIcon.Question);
+ }
+
+ if (overwrite == DialogResult.Yes)
+ {
+ QueueTask task = new QueueTask(query)
+ {
+ Title = this.GetTitle(),
+ Source = jobSourcePath,
+ Destination = jobDestination,
+ CustomQuery = (this.rtf_query.Text != string.Empty)
+ };
+
+ if (this.queueProcessor.QueueManager.Count == 0)
+ this.queueProcessor.QueueManager.Add(task);
+
+ queueWindow.SetQueue();
+ if (this.queueProcessor.QueueManager.Count > 1)
+ queueWindow.Show(false);
+
+ SetEncodeStarted(); // Encode is running, so setup the GUI appropriately
+ this.queueProcessor.Start(); // Start The Queue Encoding Process
+ }
+
+ this.Focus();
+ }
+ else if (string.IsNullOrEmpty(sourcePath) || string.IsNullOrEmpty(text_destination.Text))
+ MessageBox.Show("No source or destination selected.", "Warning", MessageBoxButtons.OK,
+ MessageBoxIcon.Warning);
+ }
+ }
+
+ /// <summary>
+ /// Toolbar - Add the current job to the Queue
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void btn_add2Queue_Click(object sender, EventArgs e)
+ {
+ // Add the item to the queue.
+ AddItemToQueue(true);
+ queueWindow.Show();
+ }
+
+ /// <summary>
+ /// Add Multiple Items to the Queue at once.
+ /// </summary>
+ /// <param name="sender">The Sender</param>
+ /// <param name="e">The EventArgs</param>
+ private void MnuAddMultiToQueueClick(object sender, EventArgs e)
+ {
+ if (!Settings.Default.autoNaming)
+ {
+ MessageBox.Show("Destination Auto Naming must be enabled in preferences for this feature to work.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+
+ if (this.SourceScan.SouceData == null)
+ {
+ MessageBox.Show("You must first scan a source or collection of source to use this feature.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+
+ BatchAdd batchAdd = new BatchAdd();
+ if (batchAdd.ShowDialog() == DialogResult.OK)
+ {
+ int min = batchAdd.Min;
+ int max = batchAdd.Max;
+ bool errors = false;
+
+ foreach (Title title in this.SourceScan.SouceData.Titles)
+ {
+ if (title.Duration.TotalMinutes > min && title.Duration.TotalMinutes < max)
+ {
+ // Add to Queue
+ this.drp_dvdtitle.SelectedItem = title;
+
+ if (!this.AddItemToQueue(false))
+ {
+ errors = true;
+ }
+ }
+ }
+
+ if (errors)
+ {
+ MessageBox.Show(
+ "One or more items could not be added to the queue. You should check your queue and manually add any missing jobs.",
+ "Warning",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Warning);
+ }
+ }
+ }
+
+ private bool AddItemToQueue(bool showError)
+ {
+ string query = QueryGenerator.GenerateFullQuery(this);
+ if (!string.IsNullOrEmpty(rtf_query.Text))
+ query = rtf_query.Text;
+
+ // If we have a custom query, then we'll want to figure out what the new source and destination is, otherwise we'll just use the gui components.
+ string jobSourcePath = !string.IsNullOrEmpty(rtf_query.Text) ? Main.GetSourceFromQuery(rtf_query.Text) : sourcePath;
+ string jobDestination = !string.IsNullOrEmpty(rtf_query.Text) ? Main.GetDestinationFromQuery(rtf_query.Text) : text_destination.Text;
+
+ // Make sure we have a Source and Destination.
+ if (string.IsNullOrEmpty(jobSourcePath) || string.IsNullOrEmpty(jobDestination))
+ {
+ if (showError)
+ MessageBox.Show("No source or destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ return false;
+ }
+
+ // Make sure the destination path exists.
+ if (!Directory.Exists(Path.GetDirectoryName(jobDestination)))
+ {
+ if (showError)
+ MessageBox.Show(string.Format("Destination Path does not exist.\nPath: {0}\n\nThis item was not added to the Queue.", Path.GetDirectoryName(jobDestination)), "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ return false;
+ }
+
+ // Make sure we don't have a duplciate on the queue.
+ if (this.queueProcessor.QueueManager.CheckForDestinationPathDuplicates(jobDestination))
+ {
+ if (showError)
+ {
+ DialogResult result;
+ result =
+ MessageBox.Show(
+ string.Format(
+ "There is already a queue item for this destination path.\nDestination Path: {0} \n\nIf you continue, the encode will be overwritten. Do you wish to continue?",
+ jobDestination),
+ "Warning",
+ MessageBoxButtons.YesNo,
+ MessageBoxIcon.Warning);
+
+ if (result != DialogResult.Yes) return false;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ // Add the job.
+ QueueTask task = new QueueTask(query)
+ {
+ Title = this.GetTitle(),
+ Source = jobSourcePath,
+ Destination = jobDestination,
+ CustomQuery = (this.rtf_query.Text != string.Empty)
+ };
+ this.queueProcessor.QueueManager.Add(task);
+
+ lbl_encode.Text = this.queueProcessor.QueueManager.Count + " encode(s) pending in the queue";
+
+ return true;
+ }
+
+ /// <summary>
+ /// Toolbar - Show the Queue
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void btn_showQueue_Click(object sender, EventArgs e)
+ {
+ queueWindow.Show();
+ queueWindow.Activate();
+ }
+
+ /// <summary>
+ /// Toolbar - Show the Preview Window
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void tb_preview_Click(object sender, EventArgs e)
+ {
+ if (string.IsNullOrEmpty(sourcePath) || string.IsNullOrEmpty(text_destination.Text))
+ MessageBox.Show("No source or destination selected.", "Warning", MessageBoxButtons.OK,
+ MessageBoxIcon.Warning);
+ else
+ {
+ if (qtpreview == null)
+ {
+ qtpreview = new frmPreview(this);
+ qtpreview.Show();
+ }
+ else if (qtpreview.IsDisposed)
+ {
+ qtpreview = new frmPreview(this);
+ qtpreview.Show();
+ }
+ else
+ MessageBox.Show(qtpreview, "The preview window is already open!", "Warning", MessageBoxButtons.OK,
+ MessageBoxIcon.Warning);
+ }
+ }
+
+ /// <summary>
+ /// Toolbar - Show the Activity log Window
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void btn_ActivityWindow_Click(object sender, EventArgs e)
+ {
+ if (this.activityWindow == null || !this.activityWindow.IsHandleCreated)
+ this.activityWindow = new frmActivityWindow(this.queueProcessor.EncodeService, SourceScan);
+
+ this.activityWindow.Show();
+ this.activityWindow.Activate();
+ }
+
+ #endregion
+
+ #region System Tray Icon
+
+ /// <summary>
+ /// Handle Resizing of the main window when deaing with the Notify Icon
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void frmMain_Resize(object sender, EventArgs e)
+ {
+ if (FormWindowState.Minimized == this.WindowState)
+ {
+ notifyIcon.Visible = true;
+ this.Hide();
+ }
+ else if (FormWindowState.Normal == this.WindowState)
+ notifyIcon.Visible = false;
+ }
+
+ /// <summary>
+ /// Double Click the Tray Icon
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
+ {
+ this.Visible = true;
+ this.Activate();
+ this.WindowState = FormWindowState.Normal;
+ notifyIcon.Visible = false;
+ }
+
+ /// <summary>
+ /// Tray Icon - Restore Menu Item - Resture the Window
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void btn_restore_Click(object sender, EventArgs e)
+ {
+ this.Visible = true;
+ this.Activate();
+ this.WindowState = FormWindowState.Normal;
+ notifyIcon.Visible = false;
+ }
+
+ #endregion
+
+ #region Main Window and Tab Control
+
+ // Source
+ private void BtnFolderScanClicked(object sender, EventArgs e)
+ {
+ this.btn_source.HideDropDown();
+ if (DVD_Open.ShowDialog() == DialogResult.OK)
+ {
+ this.selectedSourceType = SourceType.Folder;
+ SelectSource(DVD_Open.SelectedPath, 0);
+ }
+ else
+ UpdateSourceLabel();
+ }
+
+ private void BtnFileScanClicked(object sender, EventArgs e)
+ {
+ this.btn_source.HideDropDown();
+ if (ISO_Open.ShowDialog() == DialogResult.OK)
+ {
+ this.selectedSourceType = SourceType.VideoFile;
+ SelectSource(ISO_Open.FileName, 0);
+ }
+ else
+ UpdateSourceLabel();
+ }
+
+ private void MnuDvdDriveClick(object sender, EventArgs e)
+ {
+ ToolStripMenuItem item = sender as ToolStripMenuItem;
+ if (item != null)
+ {
+ string driveId = item.Name.Replace("Drive", string.Empty);
+ int id;
+ if (int.TryParse(driveId, out id))
+ {
+ this.dvdDrivePath = drives[id].RootDirectory;
+ this.dvdDriveLabel = drives[id].VolumeLabel;
+
+ if (this.dvdDrivePath == null) return;
+ this.selectedSourceType = SourceType.DvdDrive;
+ SelectSource(this.dvdDrivePath, 0);
+ }
+ }
+ }
+
+ private void VideoTitleSpecificScanClick(object sender, EventArgs e)
+ {
+ this.btn_source.HideDropDown();
+ if (ISO_Open.ShowDialog() == DialogResult.OK)
+ {
+ this.selectedSourceType = SourceType.VideoFile;
+
+ int sourceTitle = 0;
+ TitleSpecificScan title = new TitleSpecificScan();
+ if (title.ShowDialog() == DialogResult.OK)
+ {
+ sourceTitle = title.Title;
+ SelectSource(ISO_Open.FileName, sourceTitle);
+ }
+ }
+ else
+ UpdateSourceLabel();
+ }
+
+ private void FolderTitleSpecificScanClick(object sender, EventArgs e)
+ {
+ this.btn_source.HideDropDown();
+ if (DVD_Open.ShowDialog() == DialogResult.OK)
+ {
+ this.selectedSourceType = SourceType.Folder;
+
+ int sourceTitle = 0;
+ TitleSpecificScan title = new TitleSpecificScan();
+ if (title.ShowDialog() == DialogResult.OK)
+ {
+ sourceTitle = title.Title;
+ SelectSource(DVD_Open.SelectedPath, sourceTitle);
+ }
+ }
+ else
+ UpdateSourceLabel();
+ }
+
+ private void SelectSource(string file, int titleSpecific)
+ {
+ Check_ChapterMarkers.Enabled = true;
+ sourcePath = string.Empty;
+
+ if (file == string.Empty) // Must have a file or path
+ {
+ UpdateSourceLabel();
+ return;
+ }
+
+ sourcePath = Path.GetFileName(file);
+ StartScan(file, titleSpecific);
+ }
+
+ private void drp_dvdtitle_Click(object sender, EventArgs e)
+ {
+ if ((drp_dvdtitle.Items.Count == 1) && (drp_dvdtitle.Items[0].ToString() == "Automatic"))
+ MessageBox.Show(
+ "There are no titles to select. Please load a source file by clicking the 'Source' button above before trying to select a title.",
+ "Alert", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
+ }
+
+ private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ UnRegisterPresetEventHandler();
+ drop_mode.SelectedIndex = 0;
+
+ drop_chapterStart.Items.Clear();
+ drop_chapterFinish.Items.Clear();
+
+ // If the dropdown is set to automatic nothing else needs to be done.
+ // Otheriwse if its not, title data has to be loaded from parsing.
+ if (drp_dvdtitle.Text != "Automatic")
+ {
+ selectedTitle = drp_dvdtitle.SelectedItem as Title;
+ lbl_duration.Text = selectedTitle.Duration.ToString();
+ PictureSettings.CurrentlySelectedPreset = this.currentlySelectedPreset;
+ PictureSettings.Source = selectedTitle; // Setup Picture Settings Tab Control
+
+ // Populate the Angles dropdown
+ drop_angle.Items.Clear();
+ if (!Properties.Settings.Default.noDvdNav)
+ {
+ drop_angle.Visible = true;
+ lbl_angle.Visible = true;
+
+ for (int i = 1; i <= selectedTitle.AngleCount; i++)
+ drop_angle.Items.Add(i.ToString());
+
+ if (drop_angle.Items.Count == 0)
+ {
+ drop_angle.Visible = false;
+ lbl_angle.Visible = false;
+ }
+
+ if (drop_angle.Items.Count != 0)
+ drop_angle.SelectedIndex = 0;
+ }
+ else
+ {
+ drop_angle.Visible = false;
+ lbl_angle.Visible = false;
+ }
+
+ // Populate the Start chapter Dropdown
+ drop_chapterStart.Items.Clear();
+ drop_chapterStart.Items.AddRange(selectedTitle.Chapters.ToArray());
+ if (drop_chapterStart.Items.Count > 0)
+ drop_chapterStart.Text = drop_chapterStart.Items[0].ToString();
+
+ // Populate the Final Chapter Dropdown
+ drop_chapterFinish.Items.Clear();
+ drop_chapterFinish.Items.AddRange(selectedTitle.Chapters.ToArray());
+ if (drop_chapterFinish.Items.Count > 0)
+ drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();
+
+ // Populate the Audio Channels Dropdown
+ AudioSettings.SetTrackListFromPreset(selectedTitle, this.currentlySelectedPreset);
+
+ // Populate the Subtitles dropdown
+ Subtitles.SetSubtitleTrackAuto(selectedTitle.Subtitles.ToArray());
+ }
+ // Update the source label if we have multiple streams
+ if (selectedTitle != null)
+ if (!string.IsNullOrEmpty(selectedTitle.SourceName))
+ labelSource.Text = Path.GetFileName(selectedTitle.SourceName);
+
+ // Run the AutoName & ChapterNaming functions
+ if (Properties.Settings.Default.autoNaming)
+ {
+ string autoPath = Main.AutoName(this);
+ if (autoPath != null)
+ text_destination.Text = autoPath;
+ else
+ MessageBox.Show(
+ "You currently have \"Automatically name output files\" enabled for the destination file box, but you do not have a valid default directory set.\n\nYou should set a \"Default Path\" in HandBrakes preferences. (See 'Tools' menu -> 'Options' -> 'General' Tab -> 'Default Path')",
+ "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ }
+
+ data_chpt.Rows.Clear();
+ if (selectedTitle.Chapters.Count != 1)
+ {
+ DataGridView chapterGridView = Main.ChapterNaming(selectedTitle, data_chpt, drop_chapterFinish.Text);
+ if (chapterGridView != null)
+ data_chpt = chapterGridView;
+ }
+ else
+ {
+ Check_ChapterMarkers.Checked = false;
+ Check_ChapterMarkers.Enabled = false;
+ }
+
+ // Hack to force the redraw of the scrollbars which don't resize properly when the control is disabled.
+ data_chpt.Columns[0].Width = 166;
+ data_chpt.Columns[0].Width = 165;
+
+ RegisterPresetEventHandler();
+ }
+
+ private void chapersChanged(object sender, EventArgs e)
+ {
+ if (drop_mode.SelectedIndex != 0) // Function is not used if we are not in chapters mode.
+ return;
+
+ Control ctl = (Control)sender;
+ int chapterStart, chapterEnd;
+ int.TryParse(drop_chapterStart.Text, out chapterStart);
+ int.TryParse(drop_chapterFinish.Text, out chapterEnd);
+
+ switch (ctl.Name)
+ {
+ case "drop_chapterStart":
+ if (drop_chapterFinish.SelectedIndex == -1 && drop_chapterFinish.Items.Count != 0)
+ drop_chapterFinish.SelectedIndex = drop_chapterFinish.Items.Count - 1;
+
+ if (chapterEnd != 0)
+ if (chapterStart > chapterEnd)
+ drop_chapterFinish.Text = chapterStart.ToString();
+ break;
+ case "drop_chapterFinish":
+ if (drop_chapterStart.Items.Count >= 1 && drop_chapterStart.SelectedIndex == -1)
+ drop_chapterStart.SelectedIndex = 0;
+
+ if (chapterStart != 0)
+ if (chapterEnd < chapterStart)
+ drop_chapterFinish.Text = chapterStart.ToString();
+
+ // Add more rows to the Chapter menu if needed.
+ if (Check_ChapterMarkers.Checked)
+ {
+ int i = data_chpt.Rows.Count, finish = 0;
+ int.TryParse(drop_chapterFinish.Text, out finish);
+
+ while (i < finish)
+ {
+ int n = data_chpt.Rows.Add();
+ data_chpt.Rows[n].Cells[0].Value = (i + 1);
+ data_chpt.Rows[n].Cells[1].Value = "Chapter " + (i + 1);
+ data_chpt.Rows[n].Cells[0].ValueType = typeof(int);
+ data_chpt.Rows[n].Cells[1].ValueType = typeof(string);
+ i++;
+ }
+ }
+ break;
+ }
+
+ // Update the Duration
+ lbl_duration.Text =
+ Main.CalculateDuration(drop_chapterStart.SelectedIndex, drop_chapterFinish.SelectedIndex, selectedTitle)
+ .ToString();
+
+ // Run the Autonaming function
+ if (Properties.Settings.Default.autoNaming)
+ text_destination.Text = Main.AutoName(this);
+
+ // Disable chapter markers if only 1 chapter is selected.
+ if (chapterStart == chapterEnd)
+ {
+ Check_ChapterMarkers.Enabled = false;
+ btn_importChapters.Enabled = false;
+ data_chpt.Enabled = false;
+ }
+ else
+ {
+ Check_ChapterMarkers.Enabled = true;
+ if (Check_ChapterMarkers.Checked)
+ {
+ btn_importChapters.Enabled = true;
+ data_chpt.Enabled = true;
+ }
+ }
+ }
+
+ private void SecondsOrFramesChanged(object sender, EventArgs e)
+ {
+ int start, end;
+ int.TryParse(drop_chapterStart.Text, out start);
+ int.TryParse(drop_chapterFinish.Text, out end);
+ double duration = end - start;
+
+ switch (drop_mode.SelectedIndex)
+ {
+ case 1:
+ lbl_duration.Text = TimeSpan.FromSeconds(duration).ToString();
+ return;
+ case 2:
+ if (selectedTitle != null)
+ {
+ duration = duration / selectedTitle.Fps;
+ lbl_duration.Text = TimeSpan.FromSeconds(duration).ToString();
+ }
+ else
+ lbl_duration.Text = "--:--:--";
+
+ return;
+ }
+ }
+
+ private void drop_mode_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ // Reset
+ this.drop_chapterFinish.TextChanged -= new EventHandler(this.SecondsOrFramesChanged);
+ this.drop_chapterStart.TextChanged -= new EventHandler(this.SecondsOrFramesChanged);
+
+ // Do Work
+ switch (drop_mode.SelectedIndex)
+ {
+ case 0:
+ drop_chapterStart.DropDownStyle = ComboBoxStyle.DropDownList;
+ drop_chapterFinish.DropDownStyle = ComboBoxStyle.DropDownList;
+ if (drop_chapterStart.Items.Count != 0)
+ {
+ drop_chapterStart.SelectedIndex = 0;
+ drop_chapterFinish.SelectedIndex = drop_chapterFinish.Items.Count - 1;
+ }
+ else
+ lbl_duration.Text = "--:--:--";
+ return;
+ case 1:
+ this.drop_chapterStart.TextChanged += new EventHandler(this.SecondsOrFramesChanged);
+ this.drop_chapterFinish.TextChanged += new EventHandler(this.SecondsOrFramesChanged);
+ drop_chapterStart.DropDownStyle = ComboBoxStyle.Simple;
+ drop_chapterFinish.DropDownStyle = ComboBoxStyle.Simple;
+ if (selectedTitle != null)
+ {
+ drop_chapterStart.Text = "0";
+ drop_chapterFinish.Text = selectedTitle.Duration.TotalSeconds.ToString();
+ }
+ return;
+ case 2:
+ this.drop_chapterStart.TextChanged += new EventHandler(this.SecondsOrFramesChanged);
+ this.drop_chapterFinish.TextChanged += new EventHandler(this.SecondsOrFramesChanged);
+ drop_chapterStart.DropDownStyle = ComboBoxStyle.Simple;
+ drop_chapterFinish.DropDownStyle = ComboBoxStyle.Simple;
+ if (selectedTitle != null)
+ {
+ drop_chapterStart.Text = "0";
+ drop_chapterFinish.Text = (selectedTitle.Fps * selectedTitle.Duration.TotalSeconds).ToString();
+ }
+ return;
+ }
+ }
+
+ // Destination
+ private void btn_destBrowse_Click(object sender, EventArgs e)
+ {
+ // This removes the file extension from the filename box on the save file dialog.
+ // It's daft but some users don't realise that typing an extension overrides the dropdown extension selected.
+ DVD_Save.FileName = Path.GetFileNameWithoutExtension(text_destination.Text);
+
+ if (Path.IsPathRooted(text_destination.Text))
+ DVD_Save.InitialDirectory = Path.GetDirectoryName(text_destination.Text);
+
+ // Show the dialog and set the main form file path
+ if (drop_format.SelectedIndex.Equals(0))
+ DVD_Save.FilterIndex = 1;
+ else if (drop_format.SelectedIndex.Equals(1))
+ DVD_Save.FilterIndex = 2;
+
+ if (DVD_Save.ShowDialog() == DialogResult.OK)
+ {
+ // Add a file extension manually, as FileDialog.AddExtension has issues with dots in filenames
+ switch (DVD_Save.FilterIndex)
+ {
+ case 1:
+ if (!Path.GetExtension(DVD_Save.FileName).Equals(".mp4", StringComparison.InvariantCultureIgnoreCase))
+ if (Properties.Settings.Default.useM4v == 2 || Properties.Settings.Default.useM4v == 0)
+ DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", ".m4v").Replace(".mkv", ".m4v");
+ else
+ DVD_Save.FileName = DVD_Save.FileName.Replace(".m4v", ".mp4").Replace(".mkv", ".mp4");
+ break;
+ case 2:
+ if (!Path.GetExtension(DVD_Save.FileName).Equals(".mkv", StringComparison.InvariantCultureIgnoreCase))
+ DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", ".mkv").Replace(".m4v", ".mkv");
+ break;
+ default:
+ // do nothing
+ break;
+ }
+ text_destination.Text = DVD_Save.FileName;
+
+ // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)
+ if (Check_ChapterMarkers.Checked && DVD_Save.FilterIndex != 2)
+ SetExtension(".m4v");
+ }
+ }
+
+ private void text_destination_TextChanged(object sender, EventArgs e)
+ {
+ string path = text_destination.Text;
+ if (path.EndsWith(".mp4") || path.EndsWith(".m4v"))
+ drop_format.SelectedIndex = 0;
+ else if (path.EndsWith(".mkv"))
+ drop_format.SelectedIndex = 1;
+ }
+
+ // Output Settings
+ private void drop_format_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ switch (drop_format.SelectedIndex)
+ {
+ case 0:
+ SetExtension(".mp4");
+ break;
+ case 1:
+ SetExtension(".mkv");
+ break;
+ }
+
+ AudioSettings.SetContainer(drop_format.Text);
+
+ if (drop_format.Text.Contains("MP4"))
+ {
+ if (drp_videoEncoder.Items.Contains("VP3 (Theora)"))
+ {
+ drp_videoEncoder.Items.Remove("VP3 (Theora)");
+ drp_videoEncoder.SelectedIndex = 1;
+ }
+ }
+ else if (drop_format.Text.Contains("MKV"))
+ drp_videoEncoder.Items.Add("VP3 (Theora)");
+ }
+
+ public void SetExtension(string newExtension)
+ {
+ if (newExtension == ".mp4" || newExtension == ".m4v")
+ if (Check_ChapterMarkers.Checked || AudioSettings.RequiresM4V() || Subtitles.RequiresM4V() || Properties.Settings.Default.useM4v == 2)
+ newExtension = Properties.Settings.Default.useM4v == 1 ? ".mp4" : ".m4v";
+ else
+ newExtension = ".mp4";
+
+ if (Path.HasExtension(newExtension))
+ text_destination.Text = Path.ChangeExtension(text_destination.Text, newExtension);
+ }
+
+ // Video Tab
+ private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ setContainerOpts();
+
+ // Turn off some options which are H.264 only when the user selects a non h.264 encoder
+ if (drp_videoEncoder.Text.Contains("H.264"))
+ {
+ if (check_2PassEncode.CheckState == CheckState.Checked)
+ check_turbo.Enabled = true;
+
+ if ((drop_format.Text.Contains("MP4")) || (drop_format.Text.Contains("M4V")))
+ check_iPodAtom.Enabled = true;
+ else
+ check_iPodAtom.Enabled = false;
+ }
+ else
+ {
+ check_turbo.CheckState = CheckState.Unchecked;
+ check_turbo.Enabled = false;
+ x264Panel.X264Query = string.Empty;
+ check_iPodAtom.Enabled = false;
+ check_iPodAtom.Checked = false;
+ }
+
+ // Setup the CQ Slider and Advanced Panel
+ switch (drp_videoEncoder.Text)
+ {
+ case "MPEG-4 (FFmpeg)":
+ if (slider_videoQuality.Value > 31)
+ slider_videoQuality.Value = 20; // Just reset to 70% QP 10 on encode change.
+ slider_videoQuality.Minimum = 1;
+ slider_videoQuality.Maximum = 31;
+ this.x264Panel.Visible = false;
+ this.advancedEncoderOpts.Visible = true;
+ this.advancedEncoderOpts.IsDisabled = false;
+ break;
+ case "H.264 (x264)":
+ slider_videoQuality.Minimum = 0;
+ slider_videoQuality.TickFrequency = 1;
+ double cqStep = Properties.Settings.Default.x264cqstep;
+ double multiplier = 1.0 / cqStep;
+ double value = slider_videoQuality.Value * multiplier;
+
+ slider_videoQuality.Maximum = (int)(51 / Properties.Settings.Default.x264cqstep);
+
+ if (value < slider_videoQuality.Maximum)
+ slider_videoQuality.Value = slider_videoQuality.Maximum - (int)value;
+
+ this.x264Panel.Visible = true;
+ this.x264Panel.BringToFront();
+ this.advancedEncoderOpts.Visible = false;
+ break;
+ case "VP3 (Theora)":
+ if (slider_videoQuality.Value > 63)
+ slider_videoQuality.Value = 45; // Just reset to 70% QP 45 on encode change.
+ slider_videoQuality.Minimum = 0;
+ slider_videoQuality.Maximum = 63;
+
+ this.x264Panel.Visible = false;
+ this.advancedEncoderOpts.Visible = true;
+ this.advancedEncoderOpts.IsDisabled = true;
+ break;
+ }
+ }
+
+ /// <summary>
+ /// When the FrameRate is not Same As Source, show the Max/Constant Mode dropdown
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void drp_videoFramerate_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ this.radio_peakAndVariable.Text = this.drp_videoFramerate.SelectedIndex == 0 ? "Variable Framerate" : "Peak Framerate (VFR)";
+ }
+
+ /// <summary>
+ /// Set the container format options
+ /// </summary>
+ public void setContainerOpts()
+ {
+ if ((drop_format.Text.Contains("MP4")) || (drop_format.Text.Contains("M4V")))
+ {
+ check_largeFile.Enabled = true;
+ check_optimiseMP4.Enabled = true;
+ check_iPodAtom.Enabled = true;
+ }
+ else
+ {
+ check_largeFile.Enabled = false;
+ check_optimiseMP4.Enabled = false;
+ check_iPodAtom.Enabled = false;
+ check_largeFile.Checked = false;
+ check_optimiseMP4.Checked = false;
+ check_iPodAtom.Checked = false;
+ }
+ }
+
+ private double cachedCqStep = Properties.Settings.Default.x264cqstep;
+
+ /// <summary>
+ /// Update the CQ slider for x264 for a new CQ step. This is set from option
+ /// </summary>
+ public void setQualityFromSlider()
+ {
+ // Work out the current RF value.
+ double cqStep = this.cachedCqStep;
+ double rfValue = 51.0 - slider_videoQuality.Value * cqStep;
+
+ // Change the maximum value for the slider
+ slider_videoQuality.Maximum = (int)(51 / Properties.Settings.Default.x264cqstep);
+
+ // Reset the CQ slider to RF0
+ slider_videoQuality.Value = slider_videoQuality.Maximum;
+
+ // Reset the CQ slider back to the previous value as close as possible
+ double cqStepNew = Properties.Settings.Default.x264cqstep;
+ double rfValueCurrent = 51.0 - slider_videoQuality.Value * cqStepNew;
+ while (rfValueCurrent < rfValue)
+ {
+ slider_videoQuality.Value--;
+ rfValueCurrent = 51.0 - slider_videoQuality.Value * cqStepNew;
+ }
+
+ // Cache the CQ step for the next calculation
+ this.cachedCqStep = Properties.Settings.Default.x264cqstep;
+ }
+
+ private void slider_videoQuality_Scroll(object sender, EventArgs e)
+ {
+ double cqStep = Properties.Settings.Default.x264cqstep;
+ switch (drp_videoEncoder.Text)
+ {
+ case "MPEG-4 (FFmpeg)":
+ lbl_SliderValue.Text = "QP:" + (32 - slider_videoQuality.Value);
+ break;
+ case "H.264 (x264)":
+ double rfValue = 51.0 - slider_videoQuality.Value * cqStep;
+ rfValue = Math.Round(rfValue, 2);
+ lbl_SliderValue.Text = "RF:" + rfValue.ToString(new CultureInfo("en-US"));
+
+ if (rfValue == 0)
+ {
+ lbl_SliderValue.Text += " (Warning: lossless)";
+ }
+
+ break;
+ case "VP3 (Theora)":
+ lbl_SliderValue.Text = "QP:" + slider_videoQuality.Value;
+ break;
+ }
+ }
+
+ private void radio_avgBitrate_CheckedChanged(object sender, EventArgs e)
+ {
+ if (radio_avgBitrate.Checked)
+ {
+ text_bitrate.Enabled = true;
+ if (string.IsNullOrEmpty(text_bitrate.Text))
+ {
+ text_bitrate.Text = "1500";
+ }
+ slider_videoQuality.Enabled = false;
+
+ check_2PassEncode.Enabled = true;
+ }
+ }
+
+ private void radio_cq_CheckedChanged(object sender, EventArgs e)
+ {
+ text_bitrate.Enabled = false;
+ slider_videoQuality.Enabled = true;
+
+ check_2PassEncode.Enabled = false;
+ check_2PassEncode.CheckState = CheckState.Unchecked;
+ }
+
+ private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)
+ {
+ if (check_2PassEncode.CheckState.ToString() == "Checked")
+ {
+ if (drp_videoEncoder.Text.Contains("H.264"))
+ check_turbo.Enabled = true;
+ }
+ else
+ {
+ check_turbo.Enabled = false;
+ check_turbo.CheckState = CheckState.Unchecked;
+ }
+ }
+
+ // Chapter Marker Tab
+ private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)
+ {
+ if (Check_ChapterMarkers.Checked)
+ {
+ if (drop_format.SelectedIndex != 1)
+ SetExtension(".m4v");
+ data_chpt.Enabled = true;
+ btn_importChapters.Enabled = true;
+ }
+ else
+ {
+ if (drop_format.SelectedIndex != 1)
+ SetExtension(".mp4");
+ data_chpt.Enabled = false;
+ btn_importChapters.Enabled = false;
+ }
+ }
+
+ private void btn_importChapters_Click(object sender, EventArgs e)
+ {
+ if (File_ChapterImport.ShowDialog() == DialogResult.OK)
+ {
+ string filename = File_ChapterImport.FileName;
+ DataGridView imported = Main.ImportChapterNames(data_chpt, filename);
+ if (imported != null)
+ data_chpt = imported;
+ }
+ }
+
+ private void btn_export_Click(object sender, EventArgs e)
+ {
+ SaveFileDialog saveFileDialog = new SaveFileDialog();
+ saveFileDialog.Filter = "Csv File|*.csv";
+ saveFileDialog.DefaultExt = "csv";
+ if (saveFileDialog.ShowDialog() == DialogResult.OK)
+ {
+ string filename = saveFileDialog.FileName;
+
+ Main.SaveChapterMarkersToCsv(this, filename);
+ }
+ }
+
+ private void mnu_resetChapters_Click(object sender, EventArgs e)
+ {
+ data_chpt.Rows.Clear();
+ DataGridView chapterGridView = Main.ChapterNaming(selectedTitle, data_chpt, drop_chapterFinish.Text);
+ if (chapterGridView != null)
+ {
+ data_chpt = chapterGridView;
+ }
+ }
+
+ // Query Editor Tab
+ private void btn_generate_Query_Click(object sender, EventArgs e)
+ {
+ rtf_query.Text = QueryGenerator.GenerateFullQuery(this);
+ }
+
+ private void btn_clear_Click(object sender, EventArgs e)
+ {
+ rtf_query.Clear();
+ }
+
+ #endregion
+
+ // MainWindow Components, Actions and Functions ***********************
+
+ #region Source Scan
+
+ /// <summary>
+ /// Start the Scan Process
+ /// </summary>
+ /// <param name="filename">
+ /// The filename.
+ /// </param>
+ /// <param name="title">
+ /// The title.
+ /// </param>
+ private void StartScan(string filename, int title)
+ {
+ // Setup the GUI components for the scan.
+ sourcePath = filename;
+
+ this.DisableGUI();
+
+ // Start the Scan
+ try
+ {
+ SourceScan.Scan(sourcePath, title);
+ }
+ catch (Exception exc)
+ {
+ MessageBox.Show("frmMain.cs - StartScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ /// <summary>
+ /// Update the Status label for the scan
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void SourceScanScanStatusChanged(object sender, ScanProgressEventArgs e)
+ {
+ if (this.InvokeRequired)
+ {
+ this.BeginInvoke(new ScanProgessStatus(this.SourceScanScanStatusChanged), new[] { sender, e });
+ return;
+ }
+
+ labelSource.Text = string.Format("Processing Title: {0} of {1}", e.CurrentTitle, e.Titles);
+ }
+
+ /// <summary>
+ /// Update the UI after the scan has completed
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void SourceScanScanCompleted(object sender, EventArgs e)
+ {
+ if (this.InvokeRequired)
+ {
+ this.BeginInvoke(new ScanCompletedStatus(this.SourceScanScanCompleted), new[] { sender, e });
+ return;
+ }
+
+ try
+ {
+ currentSource = SourceScan.SouceData;
+
+ // Setup some GUI components
+ drp_dvdtitle.Items.Clear();
+ if (currentSource.Titles.Count != 0)
+ drp_dvdtitle.Items.AddRange(currentSource.Titles.ToArray());
+
+ foreach (Title title in currentSource.Titles)
+ {
+ if (title.MainTitle)
+ {
+ drp_dvdtitle.SelectedItem = title;
+ }
+ }
+
+ if (drp_dvdtitle.SelectedItem == null && drp_dvdtitle.Items.Count > 0)
+ {
+ drp_dvdtitle.SelectedIndex = 0;
+ }
+
+ // Enable the creation of chapter markers if the file is an image of a dvd
+ if (drop_chapterStart.Items.Count > 0)
+ {
+ int start, end;
+ int.TryParse(drop_chapterStart.Items[0].ToString(), out start);
+ int.TryParse(drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString(), out end);
+ if (end > start) Check_ChapterMarkers.Enabled = true;
+ else
+ {
+ Check_ChapterMarkers.Enabled = false;
+ Check_ChapterMarkers.Checked = false;
+ data_chpt.Rows.Clear();
+ }
+ }
+
+ // If no titles were found, Display an error message
+ if (drp_dvdtitle.Items.Count == 0)
+ {
+ MessageBox.Show(
+ "No Title(s) found. \n\nYour Source may be copy protected, badly mastered or in a format which HandBrake does not support. \nPlease refer to the Documentation and FAQ (see Help Menu).",
+ "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
+ sourcePath = string.Empty;
+ }
+ UpdateSourceLabel();
+
+ // This is a bit of a hack to fix the queue editing.
+ // If afte the scan, we find a job sitting in queueEdit, then the user has rescaned the source from the queue by clicking edit.
+ // When this occures, we want to repopulate their old settings.
+ if (queueEdit != null)
+ {
+ // Setup UI
+ if (queueEdit.Query != null)
+ {
+ // Send the query from the file to the Query Parser class
+ EncodeTask presetQuery = QueryParserUtility.Parse(queueEdit.Query);
+
+ // Now load the preset
+ PresetLoader.LoadPreset(this, presetQuery, "Load Back From Queue");
+
+ // Set the destination path
+ this.text_destination.Text = queueEdit.Destination;
+
+ // The x264 widgets will need updated, so do this now:
+ x264Panel.StandardizeOptString();
+ x264Panel.SetCurrentSettingsInPanel();
+
+ // Set the crop label
+ PictureSettings.SetPresetCropWarningLabel(null);
+ }
+
+ queueEdit = null;
+ }
+
+ // Enable the GUI components and enable any disabled components
+ EnableGUI();
+ }
+ catch (Exception exc)
+ {
+ MessageBox.Show("frmMain.cs - updateUIafterScan " + exc, "Error", MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
+ EnableGUI();
+ }
+ }
+
+ /// <summary>
+ /// Enable the GUI
+ /// </summary>
+ private void EnableGUI()
+ {
+ try
+ {
+ if (InvokeRequired)
+ BeginInvoke(new UpdateWindowHandler(EnableGUI));
+ foreach (Control ctrl in Controls)
+ ctrl.Enabled = true;
+ btn_start.Enabled = true;
+ btn_showQueue.Enabled = true;
+ btn_add2Queue.Enabled = true;
+ tb_preview.Enabled = true;
+ btn_source.Enabled = true;
+ mnu_killCLI.Visible = false;
+ }
+ catch (Exception exc)
+ {
+ MessageBox.Show("frmMain.cs - EnableGUI() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ /// <summary>
+ /// Disable the GUI
+ /// </summary>
+ private void DisableGUI()
+ {
+ foreach (Control ctrl in Controls)
+ if (!(ctrl is StatusStrip || ctrl is MenuStrip || ctrl is ToolStrip))
+ ctrl.Enabled = false;
+
+ labelSource.Enabled = true;
+ labelStaticSource.Enabled = true;
+ SourceLayoutPanel.Enabled = true;
+ btn_source.Enabled = false;
+ btn_start.Enabled = false;
+ btn_showQueue.Enabled = false;
+ btn_add2Queue.Enabled = false;
+ tb_preview.Enabled = false;
+ mnu_killCLI.Visible = true;
+ }
+
+ /// <summary>
+ /// Kill the Scan
+ /// </summary>
+ private void KillScan()
+ {
+ SourceScan.ScanCompleted -= this.SourceScanScanCompleted;
+ EnableGUI();
+ ResetGUI();
+
+ SourceScan.Stop();
+
+ labelSource.Text = "Scan Cancelled";
+ }
+
+ /// <summary>
+ /// Reset the GUI
+ /// </summary>
+ private void ResetGUI()
+ {
+ drp_dvdtitle.Items.Clear();
+ drop_chapterStart.Items.Clear();
+ drop_chapterFinish.Items.Clear();
+ lbl_duration.Text = "Select a Title";
+ PictureSettings.lbl_src_res.Text = "Select a Title";
+ sourcePath = String.Empty;
+ text_destination.Text = String.Empty;
+ selectedTitle = null;
+ }
+
+ /// <summary>
+ /// Update the Source Label
+ /// </summary>
+ private void UpdateSourceLabel()
+ {
+ labelSource.Text = string.IsNullOrEmpty(sourcePath) ? "Select \"Source\" to continue." : this.SourceName;
+ }
+
+ /// <summary>
+ /// Take a job from the Queue, rescan it, and reload the GUI for that job.
+ /// </summary>
+ /// <param name="job">
+ /// The job.
+ /// </param>
+ public void RecievingJob(QueueTask job)
+ {
+ // Reset
+ this.currentlySelectedPreset = null;
+ x264Panel.Reset2Defaults();
+
+ // Scan
+ queueEdit = job; // Nasty but will do for now. TODO
+ StartScan(job.Source, job.Title);
+ }
+
+ #endregion
+
+ #region GUI Functions and Actions
+
+ /// <summary>
+ /// Set the GUI to it's finished encoding state.
+ /// </summary>
+ private void SetEncodeFinished()
+ {
+ try
+ {
+ if (InvokeRequired)
+ {
+ BeginInvoke(new UpdateWindowHandler(SetEncodeFinished));
+ return;
+ }
+
+ lbl_encode.Text = "Encoding Finished";
+ ProgressBarStatus.Visible = false;
+ btn_start.Text = "Start";
+ btn_start.ToolTipText = "Start the encoding process";
+ btn_start.Image = Properties.Resources.Play;
+
+ // If the window is minimized, display the notification in a popup.
+ if (Properties.Settings.Default.trayIconAlerts)
+ if (FormWindowState.Minimized == this.WindowState)
+ {
+ notifyIcon.BalloonTipText = lbl_encode.Text;
+ notifyIcon.ShowBalloonTip(500);
+ }
+ }
+ catch (Exception exc)
+ {
+ MessageBox.Show(exc.ToString());
+ }
+ }
+
+ /// <summary>
+ /// Set the GUI to it's started encoding state.
+ /// </summary>
+ private void SetEncodeStarted()
+ {
+ try
+ {
+ if (InvokeRequired)
+ {
+ BeginInvoke(new UpdateWindowHandler(SetEncodeStarted));
+ return;
+ }
+ lbl_encode.Visible = true;
+ ProgressBarStatus.Value = 0;
+ ProgressBarStatus.Visible = true;
+ lbl_encode.Text = "Encoding with " + this.queueProcessor.QueueManager.Count + " encode(s) pending";
+ btn_start.Text = "Stop";
+ btn_start.ToolTipText = "Stop the encoding process.";
+ btn_start.Image = Properties.Resources.stop;
+ }
+ catch (Exception exc)
+ {
+ MessageBox.Show(exc.ToString());
+ }
+ }
+
+ /// <summary>
+ /// Display the Encode Status
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void EncodeQueue_EncodeStatusChanged(object sender, EncodeProgressEventArgs e)
+ {
+ if (this.InvokeRequired)
+ {
+ this.BeginInvoke(new EncodeProgessStatus(EncodeQueue_EncodeStatusChanged), new[] { sender, e });
+ return;
+ }
+
+ lbl_encode.Text =
+ string.Format(
+ "{0:00.00}%, FPS: {1:000.0}, Avg FPS: {2:000.0}, Time Remaining: {3}, Encode(s) Pending {4}",
+ e.PercentComplete,
+ e.CurrentFrameRate,
+ e.AverageFrameRate,
+ e.EstimatedTimeLeft,
+ this.queueProcessor.QueueManager.Count);
+
+ ProgressBarStatus.Value = (int)Math.Round(e.PercentComplete);
+ }
+
+ /// <summary>
+ /// Set the DVD Drive selection in the "Source" Menu
+ /// </summary>
+ private void SetDriveSelectionMenuItem()
+ {
+ try
+ {
+ if (InvokeRequired)
+ {
+ BeginInvoke(new UpdateWindowHandler(SetDriveSelectionMenuItem));
+ return;
+ }
+
+ drives = UtilityService.GetDrives();
+
+ List<ToolStripMenuItem> menuItems = new List<ToolStripMenuItem>();
+ foreach (DriveInformation drive in drives)
+ {
+ ToolStripMenuItem menuItem = new ToolStripMenuItem
+ {
+ Name = drive.ToString(),
+ Text = drive.RootDirectory + " (" + drive.VolumeLabel + ")",
+ Image = Resources.disc_small
+ };
+ menuItem.Click += new EventHandler(MnuDvdDriveClick);
+ menuItems.Add(menuItem);
+ }
+
+ foreach (ToolStripMenuItem item in menuItems)
+ btn_source.DropDownItems.Add(item);
+ }
+ catch (Exception exc)
+ {
+ MessageBox.Show("Error in SetDriveSelectionMenuItem" + exc);
+ }
+ }
+
+ /// <summary>
+ /// Access the preset Handler and setup the preset panel.
+ /// </summary>
+ private void LoadPresetPanel()
+ {
+ if (presetHandler.CheckIfPresetsAreOutOfDate())
+ if (!Settings.Default.presetNotification)
+ MessageBox.Show(this,
+ "HandBrake has determined your built-in presets are out of date... These presets will now be updated.",
+ "Preset Update", MessageBoxButtons.OK, MessageBoxIcon.Information);
+
+ // Clear the old presets
+ treeView_presets.Nodes.Clear();
+
+
+ string category = string.Empty; // The category we are currnetly processing
+ TreeNode rootNode = null;
+ foreach (Preset preset in this.presetHandler.Presets.Where(p => p.IsBuildIn))
+ {
+ // If the category of this preset doesn't match the current category we are processing
+ // Then we need to create a new root node.
+ if (preset.Category != category)
+ {
+ rootNode = new TreeNode(preset.Category) { ForeColor = Color.DarkBlue };
+ treeView_presets.Nodes.Add(rootNode);
+ category = preset.Category;
+ }
+
+ if (preset.Category == category && rootNode != null)
+ rootNode.Nodes.Add(new TreeNode(preset.Name) { ToolTipText = preset.Description, ForeColor = Color.DarkBlue, Tag = preset });
+ }
+
+ rootNode = null;
+ category = null;
+ foreach (Preset preset in this.presetHandler.Presets.Where(p => !p.IsBuildIn)) // User Presets
+ {
+ // If the category of this preset doesn't match the current category we are processing
+ // Then we need to create a new root node.
+ if (preset.Category != category && preset.Category != string.Empty)
+ {
+ rootNode = new TreeNode(preset.Category) { ForeColor = Color.Black };
+ treeView_presets.Nodes.Add(rootNode);
+ category = preset.Category;
+ }
+
+ if (preset.Category == category && rootNode != null)
+ rootNode.Nodes.Add(new TreeNode(preset.Name) { ForeColor = Color.Black, ToolTipText = preset.Description, Tag = preset });
+ else
+ treeView_presets.Nodes.Add(new TreeNode(preset.Name) { ForeColor = Color.Black, ToolTipText = preset.Description, Tag = preset });
+ }
+
+ treeView_presets.Update();
+ }
+
+ /// <summary>
+ /// Get the title from the selected item in the title dropdown.
+ /// </summary>
+ /// <returns>
+ /// The title.
+ /// </returns>
+ private int GetTitle()
+ {
+ int title = 0;
+ if (drp_dvdtitle.SelectedItem != null)
+ {
+ string[] titleInfo = drp_dvdtitle.SelectedItem.ToString().Split(' ');
+ int.TryParse(titleInfo[0], out title);
+ }
+
+ return title;
+ }
+
+ /// <summary>
+ /// Handle the Update Check Finishing.
+ /// </summary>
+ /// <param name="result">
+ /// The result.
+ /// </param>
+ private void UpdateCheckDoneMenu(IAsyncResult result)
+ {
+ // Make sure it's running on the calling thread
+ if (InvokeRequired)
+ {
+ Invoke(new MethodInvoker(() => this.UpdateCheckDoneMenu(result)));
+ return;
+ }
+ UpdateCheckInformation info;
+ try
+ {
+ // Get the information about the new build, if any, and close the window
+ info = UpdateService.EndCheckForUpdates(result);
+
+ if (info.NewVersionAvailable)
+ {
+ UpdateInfo updateWindow = new UpdateInfo(info, Settings.Default.hb_version, Settings.Default.hb_build.ToString());
+ updateWindow.ShowDialog();
+ }
+ else
+ MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ lbl_updateCheck.Visible = false;
+ return;
+ }
+ catch (Exception ex)
+ {
+ if ((bool)result.AsyncState)
+ MessageBox.Show(
+ "Unable to check for updates, Please try again later.\n\nDetailed Error Information:\n" + ex,
+ "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ #endregion
+
+ #region Overrides
+
+ /// <summary>
+ /// Handle GUI shortcuts
+ /// </summary>
+ /// <param name="msg">Message</param>
+ /// <param name="keyData">Keys</param>
+ /// <returns>Bool</returns>
+ protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
+ {
+ if (keyData == (Keys.Control | Keys.S))
+ {
+ btn_start_Click(this, new EventArgs());
+ return true;
+ }
+
+ if (keyData == (Keys.Control | Keys.Shift | Keys.A))
+ {
+ btn_add2Queue_Click(this, new EventArgs());
+ return true;
+ }
+ return base.ProcessCmdKey(ref msg, keyData);
+ }
+
+ /// <summary>
+ /// If the queue is being processed, prompt the user to confirm application close.
+ /// </summary>
+ /// <param name="e">FormClosingEventArgs</param>
+ protected override void OnFormClosing(FormClosingEventArgs e)
+ {
+ try
+ {
+ // If currently encoding, the queue isn't paused, and there are queue items to process, prompt to confirm close.
+ if (this.queueProcessor.EncodeService.IsEncoding)
+ {
+ DialogResult result =
+ MessageBox.Show(
+ "HandBrake is currently encoding. Closing HandBrake will stop the current encode and will result in an unplayable file.\n\nDo you want to close HandBrake?",
+ "Close HandBrake?",
+ MessageBoxButtons.YesNo,
+ MessageBoxIcon.Question);
+
+ if (result == DialogResult.No)
+ {
+ e.Cancel = true;
+ return;
+ }
+
+ this.queueProcessor.Pause();
+ this.queueProcessor.EncodeService.Stop();
+ }
+
+ if (SourceScan.IsScanning)
+ {
+ SourceScan.Stop();
+ }
+
+ SourceScan.ScanCompleted -= this.SourceScanScanCompleted;
+ SourceScan.ScanStatusChanged -= this.SourceScanScanStatusChanged;
+ }
+ catch (Exception exc)
+ {
+ Main.ShowExceptiowWindow("HandBrake was not able to shutdown properly. You may need to forcefully quit HandBrake CLI from TaskManager if it's still running.", exc.ToString());
+ }
+ finally
+ {
+ base.OnFormClosing(e);
+ }
+ }
+
+ #endregion
+
+ // This is the END of the road ****************************************
+ }
+} \ No newline at end of file
diff --git a/win/CS/frmMain.resx b/win/CS/frmMain.resx
new file mode 100644
index 000000000..a737bb095
--- /dev/null
+++ b/win/CS/frmMain.resx
@@ -0,0 +1,1031 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="notifyIconMenu.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <value>False</value>
+ </metadata>
+ <metadata name="notifyIconMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>1106, 15</value>
+ </metadata>
+ <metadata name="DVD_Save.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>556, 15</value>
+ </metadata>
+ <metadata name="ToolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>18, 15</value>
+ </metadata>
+ <data name="slider_videoQuality.ToolTip" xml:space="preserve">
+ <value>Set the desired quality factor. The encoder targets a certain quality.
+The scale used by each video encoder is different.
+
+x264's scale is logarithmic and lower values correspond to higher quality.
+So small decreases in value will result in progressively larger increases in the resulting
+file size. A value of 0 means lossless and will result in a file size that is larger than
+the original source, unless the source was also lossless
+
+FFmpeg's and Theora's scale is more linear. These encoders do not have a lossless mode.</value>
+ </data>
+ <data name="text_bitrate.ToolTip" xml:space="preserve">
+ <value>Set the average bitrate. The instantaneous bitrate can be
+much higher or lower at any point in time. But the average over a long
+duration will be the value set here.
+
+If you need to limit instantaneous bitrate look into x264's vbv-bufsize and
+vbv-maxrate settings.</value>
+ </data>
+ <metadata name="number.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <value>True</value>
+ </metadata>
+ <metadata name="name.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <value>True</value>
+ </metadata>
+ <metadata name="ChaptersMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>578, 54</value>
+ </metadata>
+ <data name="data_chpt.ToolTip" xml:space="preserve">
+ <value>Here you can name each chapter that the encoded video will contain.
+Make sure you have selected a "Title" from the "Source" box above otherwise
+the list will not be populated with the correct amount of chapters.
+Note: Do not change any of the chapter numbers!</value>
+ </data>
+ <data name="btn_importChapters.ToolTip" xml:space="preserve">
+ <value>Import a comma separated file containing the chapter information.
+The CSV should be formatted as follows:
+
+1,Chapter 1 Name
+2,Chapter 2 Name
+3,Chapter 3 Name
+
+Note: Currently, if you wish to use a , in your chapter name, you must escape it with a \
+Note2: HandBrake can NOT create chapters, only add a name to any chapters your source currently has.</value>
+ </data>
+ <data name="btn_export.ToolTip" xml:space="preserve">
+ <value>Export to a comma separated file containing the chapter information.
+The CSV is formatted as follows:
+
+1,Chapter 1 Name
+2,Chapter 2 Name
+3,Chapter 3 Name
+
+Note: Commas in names are escaped by a \</value>
+ </data>
+ <data name="drop_mode.ToolTip" xml:space="preserve">
+ <value>There are several ranges which can be encoded:
+- Encode a range of Chapters.
+
+The Following options are not 100% accurate:
+- Encode video between a start and end time, measured in seconds
+- Encode video between a start and end frame.</value>
+ </data>
+ <data name="radio_cq.ToolTip" xml:space="preserve">
+ <value>Set the desired quality factor. The encoder targets a certain quality.
+The scale used by each video encoder is different.
+
+x264's scale is logarithmic and lower values correspond to higher quality.
+So small decreases in value will result in progressively larger increases in the resulting
+file size. A value of 0 means lossless and will result in a file size that is larger than
+the original source, unless the source was also lossless
+
+FFmpeg's and Theora's scale is more linear. These encoders do not have a lossless mode.</value>
+ </data>
+ <data name="radio_avgBitrate.ToolTip" xml:space="preserve">
+ <value>Set the average bitrate. The instantaneous bitrate can be
+much higher or lower at any point in time. But the average over a long
+duration will be the value set here.
+
+If you need to limit instantaneous bitrate look into x264's vbv-bufsize and
+vbv-maxrate settings.
+</value>
+ </data>
+ <data name="check_2PassEncode.ToolTip" xml:space="preserve">
+ <value>Perform 2 Pass Encoding. The 'bitrate' option is a
+prerequisite. During the 1st pass, statistics about the video
+are collected. Then in a second pass, those statistics are used
+to make bitrate allocation decisions.</value>
+ </data>
+ <metadata name="presets_menu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>984, 17</value>
+ </metadata>
+ <metadata name="DVD_Open.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>232, 15</value>
+ </metadata>
+ <metadata name="File_Open.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>450, 15</value>
+ </metadata>
+ <metadata name="ISO_Open.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>343, 15</value>
+ </metadata>
+ <metadata name="frmMainMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>106, 15</value>
+ </metadata>
+ <metadata name="AudioMenuRowHeightHack.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 54</value>
+ </metadata>
+ <data name="label34.Text" xml:space="preserve">
+ <value>Here you can alter the query generated by this program. This feature is for one job overriding of the automatic query generation.
+Don't forget to re-generate this query if you change any GUI options.
+Note that this will also override the "Add to Queue" query as well.
+Clear the text box below to return to the internal query generation.</value>
+ </data>
+ <metadata name="presetsToolStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>565, 54</value>
+ </metadata>
+ <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>767, 15</value>
+ </metadata>
+ <metadata name="notifyIcon.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>871, 15</value>
+ </metadata>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="notifyIcon.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA
+ IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA
+ AACACgAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8A/wAAAAD/AAAAAIAAgICAAICAAAAAgAAAAICAAIAA
+ AACAAIAAgP//ACAgIADg4OAAIAAAAAAgAABg4CAAQOBAAGBgYAAgYAAAQKDgAAAAIABAwCAAIEAAAECg
+ AABg4AAAIGCAAECAoABgoMAAYECgAGDAAABgICAAoKCgAOAAAAAgIAAAAGAAAEDgAABgAAAAIAAgAEAg
+ IAAgQGAAIIDAAADg4ABgAGAAgOD/ACCA/wCgAAAAQGAAACCAAAAAoAAAYCAAAAAgIAAgIEAAYGBAAEBg
+ YAAAIIAAAGCAAGCAgABAAKAAAICgAACgoACAoKAAIKDAAECgwAAAAOAAQADgAADA4ABgwOAAIODgAADg
+ AADA4AAAAEAgAKDgIAAA4EAAYABAAABAYACAAGAAgCBgAGAggABA4KAAAECgAGBAwADgIOAAIEDgAACA
+ 4ADgoOAAYAD/ACBg/wAAoP8A4KD/AGD//wAICAgACAAAAAgIAAAAAJgACAAIAAAACAAACAAACBAQACA4
+ SAAgYIgAOHCIADhw+AAIGAAAEBAIACg4QAAwYHgAAACIACA4QAAoQFAAKFh4AHh4eAAwaIAAIGiQADh4
+ mAAACAgAEAgIABAYGAAgGBgASEhIABhIYAAoUGAAIFBoAChQaAAoWGgAMFhoAChoiAAweJgAKHioACiA
+ sAAIEAAACAgQAAgQGAAQGCAAGCAoABhAUAAoSFgAaGhoABhQcAAgWHAAKFhwADhgcAAYWIAAOGiAAIiI
+ iAAoaJAAKHCYACh4oAA4gKAAMICoAKioqAAwmNAAEDgAAChYAAAweAAAMIgQAAgYGAAYGBgACBggABAg
+ KAAgKCgAKCgoACAwOAA4ODgAKDhIADBQWABYWFgAGEhoADBYcAAYUHgAGFh4ACBYeAAoYHgAKGCAABhY
+ iAAgaJgAKICoACiIuAC4uLgAMJDIADiw6AAQCAAAABgAAAggAAAAOAAAMGgAABgQCAAwgAgAEAgQABgQ
+ EAAwmBgAGBggAAgYKAAAICgACCAoABgoMAAgKDAAGDBAABg4QAAYOFAAEEBYACBIWAAwSFgAOEhYACBI
+ YAAQSGgAOFhoABhIcAAoUHAAQFhwACBgeABAaIAAIGiIADBwiABAcIgAGGCQADhwkABYeJAACBCgAChw
+ oAAweKAAKIC4ACiQwAAwmMgAOKjgADBg6ABAsOgAELD4AAgoAAAIMAAAGDAAABhIAAAYUAAAKHgAAACY
+ AAAwmAAAAMgAABAACAAIEAgAEBgIABA4CAAYOAgAMHgIABAYEAAYGBAAIBgQACh4EAAwmBAAEBAYABgg
+ GAAoIBgAGCAgAAgIKAAgICgAGAgwAAggMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAn2KfdXV1XAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoo2+QIJCJb28Sd3em
+ nQAAAFuKqW0aqsd6Y5/DXAAAAAAAAAAAAAAAAAAAAAAAAAB3kAWQkG8SpqaJb28gsncAbIeSroyii21x
+ kczIwwAAAAAAAAAAAAAAAAAAAAAAAABoo4mJkLKylm9vb5BvdwwAcZO/fox7z2NjqsOss2MAWwAAAAAA
+ AAAAAAAAAAAAAAAAvaGmo5ANlgUFEiBvo1xjq3p6qMTJroBkxXt9cGzFnAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAL2ylgV3vQAAAGOvxMXXq41uh6yVjxqp1YhknwAAAAAAAAAAAAAAAAAAAAAAAAAAAABvsolbAAAA
+ +5KneouS2Kx4pZF9ndywsXuvkocAAAAAAAAAAAAAAAAAAAAAAAAAAAB3sncAAAAAdayHca95bH9+cKmv
+ fMVucG2B4MYAAAAAAAAAAAAAAAAAAAAAAAAAAAChsqMAAAAAe3VkyHF5kW59cN3eZc/XyXutyot7AAAA
+ AAAAAAAAAAAAAAAAAAAAAACjIKEAAACgfv94gX+PituLDI0/aoBxqxqOY8PgbQAAAAAAAAAAAAAAAAAA
+ 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
+ OAAABwAA//wYAAADAAD/+BgAAAMAAP/AAAAAAwAA/wAAAAADAAD8AAAAAAMAAPwAAAAAAwAA+AAAAAAD
+ AADwAAAAAAMAAPAAAAAAAwAA8AAAAAADAADwAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAQAA8AAPAA
+ ABgADwAA+AAAHgAHAAD8AAAfgAMAAP4QAA+ADwAA/gAADgADAAD8AAAfAAMAAPAfxD/ABwAA4B/n/+AB
+ AADgB+B/wB8AAOADgB+ADwAA8AOAHhAPAAD4BwB/8kcAAPz/gf/nLwAA+P/5/+8/AADwf/n//z8AAPh/
+ /P//vwAA+P////+fAAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//
+ /wAAAP8AAP//AAAAgACAgIAAgAAAAACAAAAAgIAAgIAAAECg4ABAgKAAYOAgAEDgQAAAIAAAACAgACAg
+ IABgIIAAIAAAACBAAAAAYAAAIIAAAGAgIABAYGAAAACgAGCAoACgoKAA4ODgAGDAAAAAACAAYABgAIAg
+ YAAAYMAAICAAACBgAABgYAAAQKAAAKDAAAAA4AAAYOAAAABAIAAgQCAAYAAgACBAQABgYEAAIABgACAg
+ YAAgQGAAYGBgACBggABgYIAAgACgAKCAoABgIMAAQKDAAGCgwAAgwMAAAADgAIDA4ACgwOAAAODgAIDg
+ 4ACA4AAAgIAgAEDgIACgACAAQABgAIAggAAgYP8AAKD/AAgIAAAICAgACAAAABhAWAAoUGAAaGhoADBg
+ eAAoaIgAMICoAChggAAACAgAEAgIABgYGAAoUGgAKFhwAChwkAAIGAgACBAQABAgKAAQKDgAIEhgACBQ
+ aAAAAHgAIFh4AChgeAAAeHgAeHh4AChogAAwaIAAIGCIADBoiAA4cIgAIGiQADhwkAAoeKgAKICwAAgQ
+ AAAIIAAACAAIABhICAAICBAAMIgQABAYGAAYICgAGCgwAEhISAAwSFgAGFBoAChYaAAICHgAOGiAACh4
+ oAAweKAAGAAAAAAIAAAAGAAACBgAABAoAAAYUAAAKGAAAChoAAAAeAAAAAAIAAgQCAAQEAgAGP8IACAY
+ EAAIEBgAMJAYABggIAAAACgACBAoACgwMAAAKDgAEDA4ADg4OAAoOEAAGDhIACA4SAAAQEgAMEBIAEhQ
+ UAAISFgAIEhYAChIWAAwUFgAIEhoAEhYaAAYUHAAMFhwABhYeAAoWHgAIFiAAEhwgACIiIgAGGCQAAAA
+ mAAgcJgAKHCYADB4mACYmJgAACjIAEBw+ACo//8ASAAAAFgAAABoAAAAeAAAABAIAABICAAAGCgAAAA4
+ AAAYOAAACEAAAAhIAAAoUAAAAFgAACBYAAAAaAAAIGgAADB4AAAAiAAAMIgAAGiIAACAmAAAGAAIADAI
+ CABgCAgAEBgIAAggCAAQIAgAECgIAAgwCAAQMAgAODAIABA4CAAYOAgAEEAIABhACAAgQAgAIFAIAChg
+ CAAwgAgAMJAIADCoCAAACBAAGBAQABggEAAoIBAAKGAQAChoEAAgeBAAKHgQAEh4EAAY+BAACAAYAAAI
+ GAAICBgAEAgYAAAQGAAQEBgAABgYAAgYGAAYMBgAKHgYADCYGAAwoBgAMKgYAGj/GABgCCAACBAgAAgY
+ IAAQGCAAGBggACggIABIcCAACAAoABAAKAAAECgAEBAoAAggKAAACDAASAgwAAgQMAAIKDAAECgwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAARxBSUlJHAAAAAABYWFlY8kYAAAAAAAAAAAAAAAAAAJFgqqRLSzAwBXMAkKJbW1pdSVmE
+ AAAAAAAAAAAAAAAAEJdLqhpgYKQFkf9NmVRanHVJVZRQAAAAAAAAAAAAAAAAUY6RO6qXMHNYW5MxdFpm
+ TVtPSpAAAAAAAAAAAAAAAAAAAAAFpIYAAFSeW09PU15KU05MaEkAAAAAAAAAAAAAAAAAAEtgAAAAk55j
+ ml5Mp2haXUqpW3IAAAAAAAAAAAAAAAAAS0sAAEpJoE5PpZpMZVWnMZyZVQAAAAAAAAAAAAAAAABLMAAA
+ cqCeSnppZGZKWzFNaV2ecAAAAAAAAAAAAAAAAEtLAACLVF6iZHROp2eiW1paeWnxAAAAAAAAAAAAAABI
+ GmAAAElJSmh6SWNVSk5hZqJ1VXUAAAAAAAAAAAAAlpmjeJAAk12eZXZ5p3WndnZpaUlbZgAAAAAAAAAA
+ m2lFRTw8PDZeWV1OlE0xeWlNeVVdZmmZUAAAAAAAjzYKRaysRUVFRa02SXSnYaFNTUxpTFSoTmKTAAAA
+ AI8KOkSrrKysrKxErDullF6fVWhiVakLaVWbVZoAAAAAqK2sRKZEqyCsRKummKBZT0xPTHppZVMLqVN4
+ cQAAAAA6O6sYGKYYGKsYphgELjejY09KTTZNaWdMNpkAAAAA+zc6XFxcd3d3XASmXEw6PZZiZ6g2ZUw2
+ T2QLnwAAAAAdoTtcLcV3pndfLi2jraMtcmNkT05np0xnaXhUAAAAAAD5NKL87xgYd1+eLZ06+1wAVE6o
+ p2cKZ2WjjgAAAAAAAAAQo67EcuZuj5jkACue9gAAkTEKeJfbioptRgAAAAAAAACIr0dLVwBXmEeL5Qg4
+ AAAAAOnqwNbVb9O5AAAAAAAAAP38RmDae3tfkDqIX0UAAABq3W9v6+2BtssAAAAAAAD9q6v7AFl1dV9f
+ mpgIXwAAAABrtG9v7O2BagAAAACSF52fL/AAAAAAAHUAAAAAAAAAAACC1NS+3s/ZzAAAAJ03MjqjdJ0A
+ AAC3FIMUtwAAAAAAzr27goK5awAAAAAAWaNgGho3dAAAyr+/v4ODtQAAAMmAAM+2zxMTawAAAAAAAK6z
+ kZ1xAAC1un3HVwAAAAAAAAAAawB/ftAAAAAAAABCNUIAAAAAAAAAAF8AAAAAAAAAAEcAAGpGAAAAAAAA
+ AEKsEQAAAAAAAAAAlZUAAAAAAAAAAAAAAEgAAAAAAAAAAC3hAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAA
+ AAD///////////4BwH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAA
+ AAHgAAAB4AAAAeAAAAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9
+ /s/j/P/v8///7ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AFEl
+ swBJDW0ABEMwAAJHSQAFDwIAXl9ZAHJtagBwfYQAQVNqAAFtAAAAZgAAAz0CABQ/AQAXQwAAGkAAAA8g
+ AQAhSJQAM1SRABw6fgAFVk0ADE48AAplaQAgWgIAMYcMACl7CwAOJwMAAAMtABwPNwAhIQAABxACAA9S
+ UAAnQUgAAISfACRoDAAxmwQAK4MHABMpAAA8P1kATBMbACQSVwAKL1EADS5CADFMVQABIF4AJ3CGADB2
+ kAAzdlEAMnY1ABMnEwBARooAVVq5ABgATwAWBn0ABh56AAULaQBOeKYAT3WSACpNZwAucpgAMHifADFx
+ nwA1b5YAMF93AEBalgBvjecADCLAAAkPpQAbJr4AFiLGAAAJjgAzbIEANGh8AClhgAAzfKEAMHWWADJz
+ kwAsW3MAQ4mvADyY9AAtgf8AIpr/ACuk/wBdk9UAG0tkACladQAqbI4AK3GUAC5vjwArbpEALWJ7ACdl
+ aAAOaoQAJJ20ABx0gQAeTF8AJ116ACViggAgZosAJmeJAChvlAAhZIgAH1ZyAHVmYwAaPVMAJ19+ACto
+ hgAmaIwAKGB9ACFdfAAgY4YAGU5qAFtgYQAYQVgAIVx7ACtrjgAtZYIAJmKAACNhgQAmX3wAIUpdAHp6
+ ewARN0wAH1R0ACdXcgApXnoAJ2B+ACligQAdSmAAKiopAGZlZQCRkZEAbm9vAFFSUwAWO08AJFRuACFP
+ agAhUm0AHD9RAAMKDgA3NjUAWlpaADk5OQA3NzcAPDk3AAYSGQAVNUgAFjFAAA8jLwABAgQAVQAAAP//
+ /wBWAAAA/f//AFcAAAD8//8AWAAAAPz//wBZAAAA/P//AFoAAAD9//8AWwAAAP7//wBcAAAA////AF4A
+ AAABAAAAXwAAAAEAAABgAAAAAQAAAGEAAAABAAAAYgAAAAEAAAB3IFIAbWFuAAAAAAAAAAAAAAAAAAAA
+ AAC0VWMAtFVjALwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAEAAAAAADgDAACfAQAAPwAAAAEA
+ AABAAAAAAQAAAEEAAAABAAAAQgAAAAEAAABFAAAA////AEYAAAD+//8ARwAAAP3//wBIAAAA/P//AEkA
+ AAD8//8ASgAAAPz//wBLAAAA/f//AEwAAAD///8ATQAAAAMAAABOAAAABwAAAE8AAAALAAAAUAAAABAA
+ AABRAAAAFQAAAFIAAAAZAAAAUwAAABwAAABUAAAAHgAAAFUAAAAeAAAAVgAAAB0AAABXAAAAGgAAAFgA
+ AAAWAAAAWQAAABIAAABaAAAADQAAAFsAAAAIAAAAXAAAAAQAAABeAAAA/v//AF8AAAD8//8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAI2Oj5CRkpOUlZYAAAAAAACCg4SFhoeIiYqLjAAAAAAAAAB6AHt8fX5/gIEAAAAA
+ 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
+</value>
+ </data>
+ <metadata name="StatusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>1244, 15</value>
+ </metadata>
+ <metadata name="hbproc.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>220, 54</value>
+ </metadata>
+ <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <value>98</value>
+ </metadata>
+ <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA
+ IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA
+ AACACgAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8A/wAAAAD/AAAAAIAAgICAAICAAAAAgAAAAICAAIAA
+ AACAAIAAgP//ACAgIADg4OAAIAAAAAAgAABg4CAAQOBAAGBgYAAgYAAAQKDgAAAAIABAwCAAIEAAAECg
+ AABg4AAAIGCAAECAoABgoMAAYECgAGDAAABgICAAoKCgAOAAAAAgIAAAAGAAAEDgAABgAAAAIAAgAEAg
+ IAAgQGAAIIDAAADg4ABgAGAAgOD/ACCA/wCgAAAAQGAAACCAAAAAoAAAYCAAAAAgIAAgIEAAYGBAAEBg
+ YAAAIIAAAGCAAGCAgABAAKAAAICgAACgoACAoKAAIKDAAECgwAAAAOAAQADgAADA4ABgwOAAIODgAADg
+ AADA4AAAAEAgAKDgIAAA4EAAYABAAABAYACAAGAAgCBgAGAggABA4KAAAECgAGBAwADgIOAAIEDgAACA
+ 4ADgoOAAYAD/ACBg/wAAoP8A4KD/AGD//wAICAgACAAAAAgIAAAAAJgACAAIAAAACAAACAAACBAQACA4
+ SAAgYIgAOHCIADhw+AAIGAAAEBAIACg4QAAwYHgAAACIACA4QAAoQFAAKFh4AHh4eAAwaIAAIGiQADh4
+ mAAACAgAEAgIABAYGAAgGBgASEhIABhIYAAoUGAAIFBoAChQaAAoWGgAMFhoAChoiAAweJgAKHioACiA
+ sAAIEAAACAgQAAgQGAAQGCAAGCAoABhAUAAoSFgAaGhoABhQcAAgWHAAKFhwADhgcAAYWIAAOGiAAIiI
+ iAAoaJAAKHCYACh4oAA4gKAAMICoAKioqAAwmNAAEDgAAChYAAAweAAAMIgQAAgYGAAYGBgACBggABAg
+ KAAgKCgAKCgoACAwOAA4ODgAKDhIADBQWABYWFgAGEhoADBYcAAYUHgAGFh4ACBYeAAoYHgAKGCAABhY
+ iAAgaJgAKICoACiIuAC4uLgAMJDIADiw6AAQCAAAABgAAAggAAAAOAAAMGgAABgQCAAwgAgAEAgQABgQ
+ EAAwmBgAGBggAAgYKAAAICgACCAoABgoMAAgKDAAGDBAABg4QAAYOFAAEEBYACBIWAAwSFgAOEhYACBI
+ YAAQSGgAOFhoABhIcAAoUHAAQFhwACBgeABAaIAAIGiIADBwiABAcIgAGGCQADhwkABYeJAACBCgAChw
+ oAAweKAAKIC4ACiQwAAwmMgAOKjgADBg6ABAsOgAELD4AAgoAAAIMAAAGDAAABhIAAAYUAAAKHgAAACY
+ AAAwmAAAAMgAABAACAAIEAgAEBgIABA4CAAYOAgAMHgIABAYEAAYGBAAIBgQACh4EAAwmBAAEBAYABgg
+ GAAoIBgAGCAgAAgIKAAgICgAGAgwAAggMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAn2KfdXV1XAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoo2+QIJCJb28Sd3em
+ nQAAAFuKqW0aqsd6Y5/DXAAAAAAAAAAAAAAAAAAAAAAAAAB3kAWQkG8SpqaJb28gsncAbIeSroyii21x
+ kczIwwAAAAAAAAAAAAAAAAAAAAAAAABoo4mJkLKylm9vb5BvdwwAcZO/fox7z2NjqsOss2MAWwAAAAAA
+ AAAAAAAAAAAAAAAAvaGmo5ANlgUFEiBvo1xjq3p6qMTJroBkxXt9cGzFnAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAL2ylgV3vQAAAGOvxMXXq41uh6yVjxqp1YhknwAAAAAAAAAAAAAAAAAAAAAAAAAAAABvsolbAAAA
+ +5KneouS2Kx4pZF9ndywsXuvkocAAAAAAAAAAAAAAAAAAAAAAAAAAAB3sncAAAAAdayHca95bH9+cKmv
+ fMVucG2B4MYAAAAAAAAAAAAAAAAAAAAAAAAAAAChsqMAAAAAe3VkyHF5kW59cN3eZc/XyXutyot7AAAA
+ AAAAAAAAAAAAAAAAAAAAAACjIKEAAACgfv94gX+PituLDI0/aoBxqxqOY8PgbQAAAAAAAAAAAAAAAAAA
+ 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
+ OAAABwAA//wYAAADAAD/+BgAAAMAAP/AAAAAAwAA/wAAAAADAAD8AAAAAAMAAPwAAAAAAwAA+AAAAAAD
+ AADwAAAAAAMAAPAAAAAAAwAA8AAAAAADAADwAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAQAA8AAPAA
+ ABgADwAA+AAAHgAHAAD8AAAfgAMAAP4QAA+ADwAA/gAADgADAAD8AAAfAAMAAPAfxD/ABwAA4B/n/+AB
+ AADgB+B/wB8AAOADgB+ADwAA8AOAHhAPAAD4BwB/8kcAAPz/gf/nLwAA+P/5/+8/AADwf/n//z8AAPh/
+ /P//vwAA+P////+fAAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//
+ /wAAAP8AAP//AAAAgACAgIAAgAAAAACAAAAAgIAAgIAAAECg4ABAgKAAYOAgAEDgQAAAIAAAACAgACAg
+ IABgIIAAIAAAACBAAAAAYAAAIIAAAGAgIABAYGAAAACgAGCAoACgoKAA4ODgAGDAAAAAACAAYABgAIAg
+ YAAAYMAAICAAACBgAABgYAAAQKAAAKDAAAAA4AAAYOAAAABAIAAgQCAAYAAgACBAQABgYEAAIABgACAg
+ YAAgQGAAYGBgACBggABgYIAAgACgAKCAoABgIMAAQKDAAGCgwAAgwMAAAADgAIDA4ACgwOAAAODgAIDg
+ 4ACA4AAAgIAgAEDgIACgACAAQABgAIAggAAgYP8AAKD/AAgIAAAICAgACAAAABhAWAAoUGAAaGhoADBg
+ eAAoaIgAMICoAChggAAACAgAEAgIABgYGAAoUGgAKFhwAChwkAAIGAgACBAQABAgKAAQKDgAIEhgACBQ
+ aAAAAHgAIFh4AChgeAAAeHgAeHh4AChogAAwaIAAIGCIADBoiAA4cIgAIGiQADhwkAAoeKgAKICwAAgQ
+ AAAIIAAACAAIABhICAAICBAAMIgQABAYGAAYICgAGCgwAEhISAAwSFgAGFBoAChYaAAICHgAOGiAACh4
+ oAAweKAAGAAAAAAIAAAAGAAACBgAABAoAAAYUAAAKGAAAChoAAAAeAAAAAAIAAgQCAAQEAgAGP8IACAY
+ EAAIEBgAMJAYABggIAAAACgACBAoACgwMAAAKDgAEDA4ADg4OAAoOEAAGDhIACA4SAAAQEgAMEBIAEhQ
+ UAAISFgAIEhYAChIWAAwUFgAIEhoAEhYaAAYUHAAMFhwABhYeAAoWHgAIFiAAEhwgACIiIgAGGCQAAAA
+ mAAgcJgAKHCYADB4mACYmJgAACjIAEBw+ACo//8ASAAAAFgAAABoAAAAeAAAABAIAABICAAAGCgAAAA4
+ AAAYOAAACEAAAAhIAAAoUAAAAFgAACBYAAAAaAAAIGgAADB4AAAAiAAAMIgAAGiIAACAmAAAGAAIADAI
+ CABgCAgAEBgIAAggCAAQIAgAECgIAAgwCAAQMAgAODAIABA4CAAYOAgAEEAIABhACAAgQAgAIFAIAChg
+ CAAwgAgAMJAIADCoCAAACBAAGBAQABggEAAoIBAAKGAQAChoEAAgeBAAKHgQAEh4EAAY+BAACAAYAAAI
+ GAAICBgAEAgYAAAQGAAQEBgAABgYAAgYGAAYMBgAKHgYADCYGAAwoBgAMKgYAGj/GABgCCAACBAgAAgY
+ IAAQGCAAGBggACggIABIcCAACAAoABAAKAAAECgAEBAoAAggKAAACDAASAgwAAgQMAAIKDAAECgwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAARxBSUlJHAAAAAABYWFlY8kYAAAAAAAAAAAAAAAAAAJFgqqRLSzAwBXMAkKJbW1pdSVmE
+ AAAAAAAAAAAAAAAAEJdLqhpgYKQFkf9NmVRanHVJVZRQAAAAAAAAAAAAAAAAUY6RO6qXMHNYW5MxdFpm
+ TVtPSpAAAAAAAAAAAAAAAAAAAAAFpIYAAFSeW09PU15KU05MaEkAAAAAAAAAAAAAAAAAAEtgAAAAk55j
+ ml5Mp2haXUqpW3IAAAAAAAAAAAAAAAAAS0sAAEpJoE5PpZpMZVWnMZyZVQAAAAAAAAAAAAAAAABLMAAA
+ cqCeSnppZGZKWzFNaV2ecAAAAAAAAAAAAAAAAEtLAACLVF6iZHROp2eiW1paeWnxAAAAAAAAAAAAAABI
+ GmAAAElJSmh6SWNVSk5hZqJ1VXUAAAAAAAAAAAAAlpmjeJAAk12eZXZ5p3WndnZpaUlbZgAAAAAAAAAA
+ m2lFRTw8PDZeWV1OlE0xeWlNeVVdZmmZUAAAAAAAjzYKRaysRUVFRa02SXSnYaFNTUxpTFSoTmKTAAAA
+ AI8KOkSrrKysrKxErDullF6fVWhiVakLaVWbVZoAAAAAqK2sRKZEqyCsRKummKBZT0xPTHppZVMLqVN4
+ cQAAAAA6O6sYGKYYGKsYphgELjejY09KTTZNaWdMNpkAAAAA+zc6XFxcd3d3XASmXEw6PZZiZ6g2ZUw2
+ T2QLnwAAAAAdoTtcLcV3pndfLi2jraMtcmNkT05np0xnaXhUAAAAAAD5NKL87xgYd1+eLZ06+1wAVE6o
+ p2cKZ2WjjgAAAAAAAAAQo67EcuZuj5jkACue9gAAkTEKeJfbioptRgAAAAAAAACIr0dLVwBXmEeL5Qg4
+ AAAAAOnqwNbVb9O5AAAAAAAAAP38RmDae3tfkDqIX0UAAABq3W9v6+2BtssAAAAAAAD9q6v7AFl1dV9f
+ mpgIXwAAAABrtG9v7O2BagAAAACSF52fL/AAAAAAAHUAAAAAAAAAAACC1NS+3s/ZzAAAAJ03MjqjdJ0A
+ AAC3FIMUtwAAAAAAzr27goK5awAAAAAAWaNgGho3dAAAyr+/v4ODtQAAAMmAAM+2zxMTawAAAAAAAK6z
+ kZ1xAAC1un3HVwAAAAAAAAAAawB/ftAAAAAAAABCNUIAAAAAAAAAAF8AAAAAAAAAAEcAAGpGAAAAAAAA
+ AEKsEQAAAAAAAAAAlZUAAAAAAAAAAAAAAEgAAAAAAAAAAC3hAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAA
+ AAD///////////4BwH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAA
+ AAHgAAAB4AAAAeAAAAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9
+ /s/j/P/v8///7ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AFEl
+ swBJDW0ABEMwAAJHSQAFDwIAXl9ZAHJtagBwfYQAQVNqAAFtAAAAZgAAAz0CABQ/AQAXQwAAGkAAAA8g
+ AQAhSJQAM1SRABw6fgAFVk0ADE48AAplaQAgWgIAMYcMACl7CwAOJwMAAAMtABwPNwAhIQAABxACAA9S
+ UAAnQUgAAISfACRoDAAxmwQAK4MHABMpAAA8P1kATBMbACQSVwAKL1EADS5CADFMVQABIF4AJ3CGADB2
+ kAAzdlEAMnY1ABMnEwBARooAVVq5ABgATwAWBn0ABh56AAULaQBOeKYAT3WSACpNZwAucpgAMHifADFx
+ nwA1b5YAMF93AEBalgBvjecADCLAAAkPpQAbJr4AFiLGAAAJjgAzbIEANGh8AClhgAAzfKEAMHWWADJz
+ kwAsW3MAQ4mvADyY9AAtgf8AIpr/ACuk/wBdk9UAG0tkACladQAqbI4AK3GUAC5vjwArbpEALWJ7ACdl
+ aAAOaoQAJJ20ABx0gQAeTF8AJ116ACViggAgZosAJmeJAChvlAAhZIgAH1ZyAHVmYwAaPVMAJ19+ACto
+ hgAmaIwAKGB9ACFdfAAgY4YAGU5qAFtgYQAYQVgAIVx7ACtrjgAtZYIAJmKAACNhgQAmX3wAIUpdAHp6
+ ewARN0wAH1R0ACdXcgApXnoAJ2B+ACligQAdSmAAKiopAGZlZQCRkZEAbm9vAFFSUwAWO08AJFRuACFP
+ agAhUm0AHD9RAAMKDgA3NjUAWlpaADk5OQA3NzcAPDk3AAYSGQAVNUgAFjFAAA8jLwABAgQAVQAAAP//
+ /wBWAAAA/f//AFcAAAD8//8AWAAAAPz//wBZAAAA/P//AFoAAAD9//8AWwAAAP7//wBcAAAA////AF4A
+ AAABAAAAXwAAAAEAAABgAAAAAQAAAGEAAAABAAAAYgAAAAEAAAB3IFIAbWFuAAAAAAAAAAAAAAAAAAAA
+ AAC0VWMAtFVjALwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAEAAAAAADgDAACfAQAAPwAAAAEA
+ AABAAAAAAQAAAEEAAAABAAAAQgAAAAEAAABFAAAA////AEYAAAD+//8ARwAAAP3//wBIAAAA/P//AEkA
+ AAD8//8ASgAAAPz//wBLAAAA/f//AEwAAAD///8ATQAAAAMAAABOAAAABwAAAE8AAAALAAAAUAAAABAA
+ AABRAAAAFQAAAFIAAAAZAAAAUwAAABwAAABUAAAAHgAAAFUAAAAeAAAAVgAAAB0AAABXAAAAGgAAAFgA
+ AAAWAAAAWQAAABIAAABaAAAADQAAAFsAAAAIAAAAXAAAAAQAAABeAAAA/v//AF8AAAD8//8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAI2Oj5CRkpOUlZYAAAAAAACCg4SFhoeIiYqLjAAAAAAAAAB6AHt8fX5/gIEAAAAA
+ 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
+</value>
+ </data>
+ <metadata name="File_Save.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>664, 15</value>
+ </metadata>
+ <metadata name="openPreset.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>310, 54</value>
+ </metadata>
+ <metadata name="File_ChapterImport.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>423, 54</value>
+ </metadata>
+</root> \ No newline at end of file
diff --git a/win/CS/frmOptions.Designer.cs b/win/CS/frmOptions.Designer.cs
new file mode 100644
index 000000000..c304e4d35
--- /dev/null
+++ b/win/CS/frmOptions.Designer.cs
@@ -0,0 +1,1615 @@
+/* frmOptions.Designer.cs
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake
+{
+ partial class frmOptions
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmOptions));
+ this.btn_close = new System.Windows.Forms.Button();
+ this.drp_completeOption = new System.Windows.Forms.ComboBox();
+ this.tab_options = new System.Windows.Forms.TabControl();
+ this.tab_general = new System.Windows.Forms.TabPage();
+ this.label35 = new System.Windows.Forms.Label();
+ this.cb_mp4FileMode = new System.Windows.Forms.ComboBox();
+ this.label34 = new System.Windows.Forms.Label();
+ this.check_TitleCase = new System.Windows.Forms.CheckBox();
+ this.check_removeUnderscores = new System.Windows.Forms.CheckBox();
+ this.check_growlEncode = new System.Windows.Forms.CheckBox();
+ this.check_GrowlQueue = new System.Windows.Forms.CheckBox();
+ this.label1 = new System.Windows.Forms.Label();
+ this.label7 = new System.Windows.Forms.Label();
+ this.drop_updateCheckDays = new System.Windows.Forms.ComboBox();
+ this.check_autoNaming = new System.Windows.Forms.CheckBox();
+ this.txt_autoNameFormat = new System.Windows.Forms.TextBox();
+ this.check_tooltip = new System.Windows.Forms.CheckBox();
+ this.label5 = new System.Windows.Forms.Label();
+ this.check_updateCheck = new System.Windows.Forms.CheckBox();
+ this.label10 = new System.Windows.Forms.Label();
+ this.btn_browse = new System.Windows.Forms.Button();
+ this.label2 = new System.Windows.Forms.Label();
+ this.label13 = new System.Windows.Forms.Label();
+ this.text_an_path = new System.Windows.Forms.TextBox();
+ this.tab_picture = new System.Windows.Forms.TabPage();
+ this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
+ this.label29 = new System.Windows.Forms.Label();
+ this.btn_vlcPath = new System.Windows.Forms.Button();
+ this.txt_vlcPath = new System.Windows.Forms.TextBox();
+ this.tab_audio_sub = new System.Windows.Forms.TabPage();
+ this.radio_preferredAudioAndSubs = new System.Windows.Forms.RadioButton();
+ this.check_AddCCTracks = new System.Windows.Forms.CheckBox();
+ this.label31 = new System.Windows.Forms.Label();
+ this.label15 = new System.Windows.Forms.Label();
+ this.radio_foreignAndSubs = new System.Windows.Forms.RadioButton();
+ this.drop_preferredLang = new System.Windows.Forms.ComboBox();
+ this.radio_dub = new System.Windows.Forms.RadioButton();
+ this.tab_cli = new System.Windows.Forms.TabPage();
+ this.label11 = new System.Windows.Forms.Label();
+ this.check_preventSleep = new System.Windows.Forms.CheckBox();
+ this.check_clearOldLogs = new System.Windows.Forms.CheckBox();
+ this.label12 = new System.Windows.Forms.Label();
+ this.btn_viewLogs = new System.Windows.Forms.Button();
+ this.label9 = new System.Windows.Forms.Label();
+ this.Label4 = new System.Windows.Forms.Label();
+ this.btn_clearLogs = new System.Windows.Forms.Button();
+ this.drp_Priority = new System.Windows.Forms.ComboBox();
+ this.check_logsInSpecifiedLocation = new System.Windows.Forms.CheckBox();
+ this.check_saveLogWithVideo = new System.Windows.Forms.CheckBox();
+ this.label3 = new System.Windows.Forms.Label();
+ this.btn_saveLog = new System.Windows.Forms.Button();
+ this.cb_logVerboseLvl = new System.Windows.Forms.ComboBox();
+ this.text_logPath = new System.Windows.Forms.TextBox();
+ this.label14 = new System.Windows.Forms.Label();
+ this.tab_advanced = new System.Windows.Forms.TabPage();
+ this.check_showCliForInGUIEncode = new System.Windows.Forms.CheckBox();
+ this.drop_previewScanCount = new System.Windows.Forms.ComboBox();
+ this.label33 = new System.Windows.Forms.Label();
+ this.label6 = new System.Windows.Forms.Label();
+ this.check_trayStatusAlerts = new System.Windows.Forms.CheckBox();
+ this.check_mainMinimize = new System.Windows.Forms.CheckBox();
+ this.check_promptOnUnmatchingQueries = new System.Windows.Forms.CheckBox();
+ this.check_dvdnav = new System.Windows.Forms.CheckBox();
+ this.check_queryEditorTab = new System.Windows.Forms.CheckBox();
+ this.label32 = new System.Windows.Forms.Label();
+ this.drop_x264step = new System.Windows.Forms.ComboBox();
+ this.label30 = new System.Windows.Forms.Label();
+ this.check_disablePresetNotification = new System.Windows.Forms.CheckBox();
+ this.label28 = new System.Windows.Forms.Label();
+ this.label8 = new System.Windows.Forms.Label();
+ this.pictureBox2 = new System.Windows.Forms.PictureBox();
+ this.pathFinder = new System.Windows.Forms.FolderBrowserDialog();
+ this.ToolTip = new System.Windows.Forms.ToolTip(this.components);
+ this.textBox1 = new System.Windows.Forms.TextBox();
+ this.textBox2 = new System.Windows.Forms.TextBox();
+ this.checkBox1 = new System.Windows.Forms.CheckBox();
+ this.checkBox2 = new System.Windows.Forms.CheckBox();
+ this.checkBox3 = new System.Windows.Forms.CheckBox();
+ this.checkBox4 = new System.Windows.Forms.CheckBox();
+ this.comboBox1 = new System.Windows.Forms.ComboBox();
+ this.textBox3 = new System.Windows.Forms.TextBox();
+ this.textBox4 = new System.Windows.Forms.TextBox();
+ this.checkBox5 = new System.Windows.Forms.CheckBox();
+ this.checkBox6 = new System.Windows.Forms.CheckBox();
+ this.checkBox7 = new System.Windows.Forms.CheckBox();
+ this.checkBox8 = new System.Windows.Forms.CheckBox();
+ this.comboBox2 = new System.Windows.Forms.ComboBox();
+ this.label16 = new System.Windows.Forms.Label();
+ this.label17 = new System.Windows.Forms.Label();
+ this.button1 = new System.Windows.Forms.Button();
+ this.label18 = new System.Windows.Forms.Label();
+ this.label19 = new System.Windows.Forms.Label();
+ this.label20 = new System.Windows.Forms.Label();
+ this.label21 = new System.Windows.Forms.Label();
+ this.label22 = new System.Windows.Forms.Label();
+ this.label23 = new System.Windows.Forms.Label();
+ this.button2 = new System.Windows.Forms.Button();
+ this.label24 = new System.Windows.Forms.Label();
+ this.label25 = new System.Windows.Forms.Label();
+ this.label26 = new System.Windows.Forms.Label();
+ this.label27 = new System.Windows.Forms.Label();
+ this.openFile_vlc = new System.Windows.Forms.OpenFileDialog();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.panel2 = new System.Windows.Forms.Panel();
+ this.tab_options.SuspendLayout();
+ this.tab_general.SuspendLayout();
+ this.tab_picture.SuspendLayout();
+ this.tableLayoutPanel2.SuspendLayout();
+ this.tab_audio_sub.SuspendLayout();
+ this.tab_cli.SuspendLayout();
+ this.tab_advanced.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
+ this.panel1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // btn_close
+ //
+ this.btn_close.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.btn_close.BackColor = System.Drawing.SystemColors.ControlLight;
+ this.btn_close.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btn_close.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btn_close.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_close.Location = new System.Drawing.Point(528, 463);
+ this.btn_close.Name = "btn_close";
+ this.btn_close.Size = new System.Drawing.Size(72, 22);
+ this.btn_close.TabIndex = 53;
+ this.btn_close.Text = "Close";
+ this.btn_close.UseVisualStyleBackColor = true;
+ this.btn_close.Click += new System.EventHandler(this.btn_close_Click);
+ //
+ // drp_completeOption
+ //
+ this.drp_completeOption.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drp_completeOption.FormattingEnabled = true;
+ this.drp_completeOption.Items.AddRange(new object[] {
+ "Do nothing",
+ "Shutdown",
+ "Suspend",
+ "Hibernate",
+ "Lock system",
+ "Log off",
+ "Quit HandBrake"});
+ this.drp_completeOption.Location = new System.Drawing.Point(108, 95);
+ this.drp_completeOption.Name = "drp_completeOption";
+ this.drp_completeOption.Size = new System.Drawing.Size(166, 21);
+ this.drp_completeOption.TabIndex = 43;
+ this.ToolTip.SetToolTip(this.drp_completeOption, "Performs an action when an encode or queue has completed.");
+ this.drp_completeOption.SelectedIndexChanged += new System.EventHandler(this.drp_completeOption_SelectedIndexChanged);
+ //
+ // tab_options
+ //
+ this.tab_options.Controls.Add(this.tab_general);
+ this.tab_options.Controls.Add(this.tab_picture);
+ this.tab_options.Controls.Add(this.tab_audio_sub);
+ this.tab_options.Controls.Add(this.tab_cli);
+ this.tab_options.Controls.Add(this.tab_advanced);
+ this.tab_options.Location = new System.Drawing.Point(12, 74);
+ this.tab_options.Name = "tab_options";
+ this.tab_options.SelectedIndex = 0;
+ this.tab_options.Size = new System.Drawing.Size(588, 383);
+ this.tab_options.TabIndex = 58;
+ //
+ // tab_general
+ //
+ this.tab_general.Controls.Add(this.label35);
+ this.tab_general.Controls.Add(this.cb_mp4FileMode);
+ this.tab_general.Controls.Add(this.label34);
+ this.tab_general.Controls.Add(this.check_TitleCase);
+ this.tab_general.Controls.Add(this.check_removeUnderscores);
+ this.tab_general.Controls.Add(this.check_growlEncode);
+ this.tab_general.Controls.Add(this.check_GrowlQueue);
+ this.tab_general.Controls.Add(this.label1);
+ this.tab_general.Controls.Add(this.label7);
+ this.tab_general.Controls.Add(this.drp_completeOption);
+ this.tab_general.Controls.Add(this.drop_updateCheckDays);
+ this.tab_general.Controls.Add(this.check_autoNaming);
+ this.tab_general.Controls.Add(this.txt_autoNameFormat);
+ this.tab_general.Controls.Add(this.check_tooltip);
+ this.tab_general.Controls.Add(this.label5);
+ this.tab_general.Controls.Add(this.check_updateCheck);
+ this.tab_general.Controls.Add(this.label10);
+ this.tab_general.Controls.Add(this.btn_browse);
+ this.tab_general.Controls.Add(this.label2);
+ this.tab_general.Controls.Add(this.label13);
+ this.tab_general.Controls.Add(this.text_an_path);
+ this.tab_general.Location = new System.Drawing.Point(4, 22);
+ this.tab_general.Name = "tab_general";
+ this.tab_general.Padding = new System.Windows.Forms.Padding(10);
+ this.tab_general.Size = new System.Drawing.Size(580, 357);
+ this.tab_general.TabIndex = 3;
+ this.tab_general.Text = "General";
+ this.tab_general.UseVisualStyleBackColor = true;
+ //
+ // label35
+ //
+ this.label35.AutoSize = true;
+ this.label35.Location = new System.Drawing.Point(105, 323);
+ this.label35.Name = "label35";
+ this.label35.Size = new System.Drawing.Size(100, 13);
+ this.label35.TabIndex = 104;
+ this.label35.Text = "MP4 File Extension:";
+ //
+ // cb_mp4FileMode
+ //
+ this.cb_mp4FileMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.cb_mp4FileMode.FormattingEnabled = true;
+ this.cb_mp4FileMode.Items.AddRange(new object[] {
+ "Automatic",
+ "Always use MP4",
+ "Always use M4V"});
+ this.cb_mp4FileMode.Location = new System.Drawing.Point(211, 320);
+ this.cb_mp4FileMode.Name = "cb_mp4FileMode";
+ this.cb_mp4FileMode.Size = new System.Drawing.Size(150, 21);
+ this.cb_mp4FileMode.TabIndex = 103;
+ this.ToolTip.SetToolTip(this.cb_mp4FileMode, resources.GetString("cb_mp4FileMode.ToolTip"));
+ this.cb_mp4FileMode.SelectedIndexChanged += new System.EventHandler(this.cb_mp4FileMode_SelectedIndexChanged);
+ //
+ // label34
+ //
+ this.label34.AutoSize = true;
+ this.label34.Location = new System.Drawing.Point(179, 233);
+ this.label34.Margin = new System.Windows.Forms.Padding(3);
+ this.label34.Name = "label34";
+ this.label34.Size = new System.Drawing.Size(167, 13);
+ this.label34.TabIndex = 102;
+ this.label34.Text = "Available Options: {source_path}";
+ this.ToolTip.SetToolTip(this.label34, "{source_path} = Use the same directory as the source is in.\r\nNote: you can not us" +
+ "e {source_path} within a path. It has to be the only text in the path above to " +
+ "work.");
+ //
+ // check_TitleCase
+ //
+ this.check_TitleCase.AutoSize = true;
+ this.check_TitleCase.Location = new System.Drawing.Point(297, 297);
+ this.check_TitleCase.Name = "check_TitleCase";
+ this.check_TitleCase.Size = new System.Drawing.Size(151, 17);
+ this.check_TitleCase.TabIndex = 101;
+ this.check_TitleCase.Text = "Change case to Title Case";
+ this.ToolTip.SetToolTip(this.check_TitleCase, "For the {source} option:.\r\nChange the source name to Title Case\r\ne.g \"MOVIE NAME\"" +
+ " to \"Movie Name\"\r\n");
+ this.check_TitleCase.UseVisualStyleBackColor = true;
+ this.check_TitleCase.CheckedChanged += new System.EventHandler(this.check_TitleCase_CheckedChanged);
+ //
+ // check_removeUnderscores
+ //
+ this.check_removeUnderscores.AutoSize = true;
+ this.check_removeUnderscores.Location = new System.Drawing.Point(108, 297);
+ this.check_removeUnderscores.Name = "check_removeUnderscores";
+ this.check_removeUnderscores.Size = new System.Drawing.Size(183, 17);
+ this.check_removeUnderscores.TabIndex = 100;
+ this.check_removeUnderscores.Text = "Remove Underscores from Name";
+ this.ToolTip.SetToolTip(this.check_removeUnderscores, "For the {source} option:\r\nRemove any underscores from the source name.\r\n\r\n");
+ this.check_removeUnderscores.UseVisualStyleBackColor = true;
+ this.check_removeUnderscores.CheckedChanged += new System.EventHandler(this.check_removeUnderscores_CheckedChanged);
+ //
+ // check_growlEncode
+ //
+ this.check_growlEncode.AutoSize = true;
+ this.check_growlEncode.BackColor = System.Drawing.Color.Transparent;
+ this.check_growlEncode.Location = new System.Drawing.Point(282, 122);
+ this.check_growlEncode.Name = "check_growlEncode";
+ this.check_growlEncode.Size = new System.Drawing.Size(171, 17);
+ this.check_growlEncode.TabIndex = 99;
+ this.check_growlEncode.Text = "Growl after Encode Completes";
+ this.ToolTip.SetToolTip(this.check_growlEncode, "If you have \"Growl for Windows\" installed, you can use this feature to see growl " +
+ "alerts on your desktop.");
+ this.check_growlEncode.UseVisualStyleBackColor = false;
+ this.check_growlEncode.CheckedChanged += new System.EventHandler(this.check_growlEncode_CheckedChanged);
+ //
+ // check_GrowlQueue
+ //
+ this.check_GrowlQueue.AutoSize = true;
+ this.check_GrowlQueue.BackColor = System.Drawing.Color.Transparent;
+ this.check_GrowlQueue.Location = new System.Drawing.Point(108, 122);
+ this.check_GrowlQueue.Name = "check_GrowlQueue";
+ this.check_GrowlQueue.Size = new System.Drawing.Size(168, 17);
+ this.check_GrowlQueue.TabIndex = 98;
+ this.check_GrowlQueue.Text = "Growl after Queue Completes";
+ this.ToolTip.SetToolTip(this.check_GrowlQueue, "If you have \"Growl for Windows\" installed, you can use this feature to see growl " +
+ "alerts on your desktop.");
+ this.check_GrowlQueue.UseVisualStyleBackColor = false;
+ this.check_GrowlQueue.CheckedChanged += new System.EventHandler(this.check_GrowlQueue_CheckedChanged);
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.BackColor = System.Drawing.Color.Transparent;
+ this.label1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label1.Location = new System.Drawing.Point(15, 15);
+ this.label1.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(66, 13);
+ this.label1.TabIndex = 67;
+ this.label1.Text = "At Launch:";
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.Location = new System.Drawing.Point(179, 278);
+ this.label7.Margin = new System.Windows.Forms.Padding(3);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(225, 13);
+ this.label7.TabIndex = 81;
+ this.label7.Text = "Available Options: {source} {title} {chapters}";
+ //
+ // drop_updateCheckDays
+ //
+ this.drop_updateCheckDays.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_updateCheckDays.FormattingEnabled = true;
+ this.drop_updateCheckDays.Items.AddRange(new object[] {
+ "Daily",
+ "Weekly",
+ "Monthly"});
+ this.drop_updateCheckDays.Location = new System.Drawing.Point(127, 35);
+ this.drop_updateCheckDays.Name = "drop_updateCheckDays";
+ this.drop_updateCheckDays.Size = new System.Drawing.Size(97, 21);
+ this.drop_updateCheckDays.TabIndex = 97;
+ this.ToolTip.SetToolTip(this.drop_updateCheckDays, "Check for updates: Daily, Weekly or Monthly\r\nDefault: Weekly");
+ this.drop_updateCheckDays.SelectedIndexChanged += new System.EventHandler(this.drop_updateCheckDays_SelectedIndexChanged);
+ //
+ // check_autoNaming
+ //
+ this.check_autoNaming.AutoSize = true;
+ this.check_autoNaming.Location = new System.Drawing.Point(108, 174);
+ this.check_autoNaming.Name = "check_autoNaming";
+ this.check_autoNaming.Size = new System.Drawing.Size(176, 17);
+ this.check_autoNaming.TabIndex = 72;
+ this.check_autoNaming.Text = "Automatically name output files";
+ this.ToolTip.SetToolTip(this.check_autoNaming, "Automatically name output files");
+ this.check_autoNaming.UseVisualStyleBackColor = true;
+ this.check_autoNaming.CheckedChanged += new System.EventHandler(this.check_autoNaming_CheckedChanged);
+ //
+ // txt_autoNameFormat
+ //
+ this.txt_autoNameFormat.Location = new System.Drawing.Point(182, 251);
+ this.txt_autoNameFormat.Name = "txt_autoNameFormat";
+ this.txt_autoNameFormat.Size = new System.Drawing.Size(349, 21);
+ this.txt_autoNameFormat.TabIndex = 79;
+ this.ToolTip.SetToolTip(this.txt_autoNameFormat, "Define the format of the automatically named file.\r\ne.g {source}_{title}_some-te" +
+ "xt\r\n{source} {title} {chapters} will be automatically substituted for the input " +
+ "sources values.");
+ this.txt_autoNameFormat.TextChanged += new System.EventHandler(this.txt_autoNameFormat_TextChanged);
+ //
+ // check_tooltip
+ //
+ this.check_tooltip.AutoSize = true;
+ this.check_tooltip.BackColor = System.Drawing.Color.Transparent;
+ this.check_tooltip.Location = new System.Drawing.Point(108, 62);
+ this.check_tooltip.Name = "check_tooltip";
+ this.check_tooltip.Size = new System.Drawing.Size(117, 17);
+ this.check_tooltip.TabIndex = 70;
+ this.check_tooltip.Text = "Enable GUI tooltips";
+ this.ToolTip.SetToolTip(this.check_tooltip, "Enable the built in tooltips for gui controls. (Requires Restart)");
+ this.check_tooltip.UseVisualStyleBackColor = false;
+ this.check_tooltip.CheckedChanged += new System.EventHandler(this.check_tooltip_CheckedChanged);
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.Location = new System.Drawing.Point(105, 254);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(45, 13);
+ this.label5.TabIndex = 80;
+ this.label5.Text = "Format:";
+ //
+ // check_updateCheck
+ //
+ this.check_updateCheck.AutoSize = true;
+ this.check_updateCheck.BackColor = System.Drawing.Color.Transparent;
+ this.check_updateCheck.Location = new System.Drawing.Point(108, 14);
+ this.check_updateCheck.Name = "check_updateCheck";
+ this.check_updateCheck.Size = new System.Drawing.Size(114, 17);
+ this.check_updateCheck.TabIndex = 68;
+ this.check_updateCheck.Text = "Check for updates";
+ this.ToolTip.SetToolTip(this.check_updateCheck, "Enables the built in update checker. This check is performed when the application" +
+ " starts.");
+ this.check_updateCheck.UseVisualStyleBackColor = false;
+ this.check_updateCheck.CheckedChanged += new System.EventHandler(this.check_updateCheck_CheckedChanged);
+ //
+ // label10
+ //
+ this.label10.AutoSize = true;
+ this.label10.Location = new System.Drawing.Point(105, 209);
+ this.label10.Name = "label10";
+ this.label10.Size = new System.Drawing.Size(71, 13);
+ this.label10.TabIndex = 77;
+ this.label10.Text = "Default Path:";
+ //
+ // btn_browse
+ //
+ this.btn_browse.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btn_browse.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btn_browse.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_browse.Location = new System.Drawing.Point(456, 204);
+ this.btn_browse.Name = "btn_browse";
+ this.btn_browse.Size = new System.Drawing.Size(75, 23);
+ this.btn_browse.TabIndex = 78;
+ this.btn_browse.Text = "Browse";
+ this.btn_browse.UseVisualStyleBackColor = true;
+ this.btn_browse.Click += new System.EventHandler(this.btn_browse_Click);
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label2.Location = new System.Drawing.Point(7, 98);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(74, 13);
+ this.label2.TabIndex = 54;
+ this.label2.Text = "When Done:";
+ //
+ // label13
+ //
+ this.label13.AutoSize = true;
+ this.label13.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label13.Location = new System.Drawing.Point(4, 174);
+ this.label13.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0);
+ this.label13.Name = "label13";
+ this.label13.Size = new System.Drawing.Size(77, 13);
+ this.label13.TabIndex = 71;
+ this.label13.Text = "Output Files:";
+ //
+ // text_an_path
+ //
+ this.text_an_path.Location = new System.Drawing.Point(182, 206);
+ this.text_an_path.Name = "text_an_path";
+ this.text_an_path.Size = new System.Drawing.Size(253, 21);
+ this.text_an_path.TabIndex = 76;
+ this.ToolTip.SetToolTip(this.text_an_path, resources.GetString("text_an_path.ToolTip"));
+ this.text_an_path.TextChanged += new System.EventHandler(this.text_an_path_TextChanged);
+ //
+ // tab_picture
+ //
+ this.tab_picture.Controls.Add(this.tableLayoutPanel2);
+ this.tab_picture.Location = new System.Drawing.Point(4, 22);
+ this.tab_picture.Name = "tab_picture";
+ this.tab_picture.Padding = new System.Windows.Forms.Padding(10);
+ this.tab_picture.Size = new System.Drawing.Size(580, 357);
+ this.tab_picture.TabIndex = 5;
+ this.tab_picture.Text = "Picture";
+ this.tab_picture.UseVisualStyleBackColor = true;
+ //
+ // tableLayoutPanel2
+ //
+ this.tableLayoutPanel2.AutoSize = true;
+ this.tableLayoutPanel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+ this.tableLayoutPanel2.ColumnCount = 4;
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+ this.tableLayoutPanel2.Controls.Add(this.label29, 0, 0);
+ this.tableLayoutPanel2.Controls.Add(this.btn_vlcPath, 3, 0);
+ this.tableLayoutPanel2.Controls.Add(this.txt_vlcPath, 2, 0);
+ this.tableLayoutPanel2.Location = new System.Drawing.Point(10, 10);
+ this.tableLayoutPanel2.Name = "tableLayoutPanel2";
+ this.tableLayoutPanel2.RowCount = 2;
+ this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
+ this.tableLayoutPanel2.Size = new System.Drawing.Size(560, 28);
+ this.tableLayoutPanel2.TabIndex = 84;
+ //
+ // label29
+ //
+ this.label29.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.label29.AutoSize = true;
+ this.label29.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label29.Location = new System.Drawing.Point(3, 5);
+ this.label29.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0);
+ this.label29.Name = "label29";
+ this.tableLayoutPanel2.SetRowSpan(this.label29, 2);
+ this.label29.Size = new System.Drawing.Size(59, 13);
+ this.label29.TabIndex = 79;
+ this.label29.Text = "VLC Path:";
+ //
+ // btn_vlcPath
+ //
+ this.btn_vlcPath.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.btn_vlcPath.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btn_vlcPath.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btn_vlcPath.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_vlcPath.Location = new System.Drawing.Point(489, 3);
+ this.btn_vlcPath.Name = "btn_vlcPath";
+ this.btn_vlcPath.Size = new System.Drawing.Size(68, 22);
+ this.btn_vlcPath.TabIndex = 83;
+ this.btn_vlcPath.Text = "Browse";
+ this.btn_vlcPath.UseVisualStyleBackColor = true;
+ this.btn_vlcPath.Click += new System.EventHandler(this.btn_vlcPath_Click);
+ //
+ // txt_vlcPath
+ //
+ this.txt_vlcPath.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+ this.txt_vlcPath.Location = new System.Drawing.Point(88, 3);
+ this.txt_vlcPath.Name = "txt_vlcPath";
+ this.txt_vlcPath.Size = new System.Drawing.Size(395, 21);
+ this.txt_vlcPath.TabIndex = 81;
+ this.ToolTip.SetToolTip(this.txt_vlcPath, "The path where VLC is installed on this system.\r\nThis is used for the video previ" +
+ "ew feature.");
+ this.txt_vlcPath.TextChanged += new System.EventHandler(this.txt_vlcPath_TextChanged);
+ //
+ // tab_audio_sub
+ //
+ this.tab_audio_sub.Controls.Add(this.radio_preferredAudioAndSubs);
+ this.tab_audio_sub.Controls.Add(this.check_AddCCTracks);
+ this.tab_audio_sub.Controls.Add(this.label31);
+ this.tab_audio_sub.Controls.Add(this.label15);
+ this.tab_audio_sub.Controls.Add(this.radio_foreignAndSubs);
+ this.tab_audio_sub.Controls.Add(this.drop_preferredLang);
+ this.tab_audio_sub.Controls.Add(this.radio_dub);
+ this.tab_audio_sub.Location = new System.Drawing.Point(4, 22);
+ this.tab_audio_sub.Name = "tab_audio_sub";
+ this.tab_audio_sub.Padding = new System.Windows.Forms.Padding(3);
+ this.tab_audio_sub.Size = new System.Drawing.Size(580, 357);
+ this.tab_audio_sub.TabIndex = 6;
+ this.tab_audio_sub.Text = "Audio / Subtitles";
+ this.tab_audio_sub.UseVisualStyleBackColor = true;
+ //
+ // radio_preferredAudioAndSubs
+ //
+ this.radio_preferredAudioAndSubs.AutoSize = true;
+ this.radio_preferredAudioAndSubs.Location = new System.Drawing.Point(200, 99);
+ this.radio_preferredAudioAndSubs.Name = "radio_preferredAudioAndSubs";
+ this.radio_preferredAudioAndSubs.Size = new System.Drawing.Size(250, 17);
+ this.radio_preferredAudioAndSubs.TabIndex = 93;
+ this.radio_preferredAudioAndSubs.TabStop = true;
+ this.radio_preferredAudioAndSubs.Text = "Use Preferred Language for Audio and Subtitles";
+ this.ToolTip.SetToolTip(this.radio_preferredAudioAndSubs, "Use Preferred Language for Audio and Subtitle.");
+ this.radio_preferredAudioAndSubs.UseVisualStyleBackColor = true;
+ this.radio_preferredAudioAndSubs.CheckedChanged += new System.EventHandler(this.radio_preferredAudioAndSubs_CheckedChanged);
+ //
+ // check_AddCCTracks
+ //
+ this.check_AddCCTracks.AutoSize = true;
+ this.check_AddCCTracks.Location = new System.Drawing.Point(200, 131);
+ this.check_AddCCTracks.Name = "check_AddCCTracks";
+ this.check_AddCCTracks.Size = new System.Drawing.Size(198, 17);
+ this.check_AddCCTracks.TabIndex = 92;
+ this.check_AddCCTracks.Text = "Add Closed Captions when available";
+ this.ToolTip.SetToolTip(this.check_AddCCTracks, "Add any CC tracks if they exist");
+ this.check_AddCCTracks.UseVisualStyleBackColor = true;
+ this.check_AddCCTracks.CheckedChanged += new System.EventHandler(this.check_AddCCTracks_CheckedChanged);
+ //
+ // label31
+ //
+ this.label31.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.label31.AutoSize = true;
+ this.label31.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label31.Location = new System.Drawing.Point(16, 19);
+ this.label31.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0);
+ this.label31.Name = "label31";
+ this.label31.Size = new System.Drawing.Size(52, 13);
+ this.label31.TabIndex = 91;
+ this.label31.Text = "Actions:";
+ //
+ // label15
+ //
+ this.label15.AutoSize = true;
+ this.label15.Location = new System.Drawing.Point(87, 19);
+ this.label15.Name = "label15";
+ this.label15.Size = new System.Drawing.Size(107, 13);
+ this.label15.TabIndex = 88;
+ this.label15.Text = "Preferred Language:";
+ //
+ // radio_foreignAndSubs
+ //
+ this.radio_foreignAndSubs.AutoSize = true;
+ this.radio_foreignAndSubs.Location = new System.Drawing.Point(200, 76);
+ this.radio_foreignAndSubs.Name = "radio_foreignAndSubs";
+ this.radio_foreignAndSubs.Size = new System.Drawing.Size(347, 17);
+ this.radio_foreignAndSubs.TabIndex = 90;
+ this.radio_foreignAndSubs.TabStop = true;
+ this.radio_foreignAndSubs.Text = "Use foreign language audio and add first preferred language subtitle.";
+ this.ToolTip.SetToolTip(this.radio_foreignAndSubs, "Use foreign language audio and add first subtitle track of prefered language.\r\n");
+ this.radio_foreignAndSubs.UseVisualStyleBackColor = true;
+ this.radio_foreignAndSubs.CheckedChanged += new System.EventHandler(this.radio_foreignAndSubs_CheckedChanged);
+ //
+ // drop_preferredLang
+ //
+ this.drop_preferredLang.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_preferredLang.FormattingEnabled = true;
+ this.drop_preferredLang.Location = new System.Drawing.Point(200, 16);
+ this.drop_preferredLang.Name = "drop_preferredLang";
+ this.drop_preferredLang.Size = new System.Drawing.Size(118, 21);
+ this.drop_preferredLang.TabIndex = 87;
+ this.ToolTip.SetToolTip(this.drop_preferredLang, "The number of processor\'s / processor cores. Unless your having problems, leave o" +
+ "n Automatic.");
+ this.drop_preferredLang.SelectedIndexChanged += new System.EventHandler(this.drop_preferredLang_SelectedIndexChanged);
+ //
+ // radio_dub
+ //
+ this.radio_dub.AutoSize = true;
+ this.radio_dub.Location = new System.Drawing.Point(200, 53);
+ this.radio_dub.Name = "radio_dub";
+ this.radio_dub.Size = new System.Drawing.Size(167, 17);
+ this.radio_dub.TabIndex = 89;
+ this.radio_dub.TabStop = true;
+ this.radio_dub.Text = "DUB Foreign Language Audio";
+ this.ToolTip.SetToolTip(this.radio_dub, "This option will select your prefered language of audio for the source if one exi" +
+ "sts.");
+ this.radio_dub.UseVisualStyleBackColor = true;
+ this.radio_dub.CheckedChanged += new System.EventHandler(this.radio_dub_CheckedChanged);
+ //
+ // tab_cli
+ //
+ this.tab_cli.Controls.Add(this.label11);
+ this.tab_cli.Controls.Add(this.check_preventSleep);
+ this.tab_cli.Controls.Add(this.check_clearOldLogs);
+ this.tab_cli.Controls.Add(this.label12);
+ this.tab_cli.Controls.Add(this.btn_viewLogs);
+ this.tab_cli.Controls.Add(this.label9);
+ this.tab_cli.Controls.Add(this.Label4);
+ this.tab_cli.Controls.Add(this.btn_clearLogs);
+ this.tab_cli.Controls.Add(this.drp_Priority);
+ this.tab_cli.Controls.Add(this.check_logsInSpecifiedLocation);
+ this.tab_cli.Controls.Add(this.check_saveLogWithVideo);
+ this.tab_cli.Controls.Add(this.label3);
+ this.tab_cli.Controls.Add(this.btn_saveLog);
+ this.tab_cli.Controls.Add(this.cb_logVerboseLvl);
+ this.tab_cli.Controls.Add(this.text_logPath);
+ this.tab_cli.Controls.Add(this.label14);
+ this.tab_cli.Location = new System.Drawing.Point(4, 22);
+ this.tab_cli.Name = "tab_cli";
+ this.tab_cli.Padding = new System.Windows.Forms.Padding(10);
+ this.tab_cli.Size = new System.Drawing.Size(580, 357);
+ this.tab_cli.TabIndex = 2;
+ this.tab_cli.Text = "CLI / System / Logging";
+ this.tab_cli.UseVisualStyleBackColor = true;
+ //
+ // label11
+ //
+ this.label11.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.label11.AutoSize = true;
+ this.label11.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label11.Location = new System.Drawing.Point(7, 46);
+ this.label11.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0);
+ this.label11.Name = "label11";
+ this.label11.Size = new System.Drawing.Size(53, 13);
+ this.label11.TabIndex = 92;
+ this.label11.Text = "System:";
+ //
+ // check_preventSleep
+ //
+ this.check_preventSleep.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.check_preventSleep.AutoSize = true;
+ this.check_preventSleep.Location = new System.Drawing.Point(73, 45);
+ this.check_preventSleep.Name = "check_preventSleep";
+ this.check_preventSleep.Size = new System.Drawing.Size(260, 17);
+ this.check_preventSleep.TabIndex = 91;
+ this.check_preventSleep.Text = "Prevent the system from sleeping when encoding.";
+ this.ToolTip.SetToolTip(this.check_preventSleep, "Prevent system from sleeping during encoding.");
+ this.check_preventSleep.UseVisualStyleBackColor = true;
+ this.check_preventSleep.CheckedChanged += new System.EventHandler(this.check_preventSleep_CheckedChanged);
+ //
+ // check_clearOldLogs
+ //
+ this.check_clearOldLogs.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.check_clearOldLogs.AutoSize = true;
+ this.check_clearOldLogs.Location = new System.Drawing.Point(73, 234);
+ this.check_clearOldLogs.Name = "check_clearOldLogs";
+ this.check_clearOldLogs.Size = new System.Drawing.Size(162, 17);
+ this.check_clearOldLogs.TabIndex = 90;
+ this.check_clearOldLogs.Text = "Clear logs older than 30 days";
+ this.ToolTip.SetToolTip(this.check_clearOldLogs, "Clear logs which are older than 30 days.\r\nThis only applies to HandBrakes Applica" +
+ "tion Data Log folder.");
+ this.check_clearOldLogs.UseVisualStyleBackColor = true;
+ this.check_clearOldLogs.CheckedChanged += new System.EventHandler(this.check_clearOldLogs_CheckedChanged);
+ //
+ // label12
+ //
+ this.label12.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.label12.AutoSize = true;
+ this.label12.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label12.Location = new System.Drawing.Point(7, 15);
+ this.label12.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0);
+ this.label12.Name = "label12";
+ this.label12.Size = new System.Drawing.Size(28, 13);
+ this.label12.TabIndex = 75;
+ this.label12.Text = "CLI:";
+ //
+ // btn_viewLogs
+ //
+ this.btn_viewLogs.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.btn_viewLogs.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btn_viewLogs.ForeColor = System.Drawing.Color.DarkOrange;
+ this.btn_viewLogs.Location = new System.Drawing.Point(129, 196);
+ this.btn_viewLogs.Name = "btn_viewLogs";
+ this.btn_viewLogs.Size = new System.Drawing.Size(139, 23);
+ this.btn_viewLogs.TabIndex = 89;
+ this.btn_viewLogs.Text = "View Log Directory";
+ this.btn_viewLogs.UseVisualStyleBackColor = true;
+ this.btn_viewLogs.Click += new System.EventHandler(this.btn_viewLogs_Click);
+ //
+ // label9
+ //
+ this.label9.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.label9.AutoSize = true;
+ this.label9.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label9.Location = new System.Drawing.Point(7, 92);
+ this.label9.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0);
+ this.label9.Name = "label9";
+ this.label9.Size = new System.Drawing.Size(36, 13);
+ this.label9.TabIndex = 77;
+ this.label9.Text = "Logs:";
+ //
+ // Label4
+ //
+ this.Label4.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.Label4.AutoSize = true;
+ this.Label4.BackColor = System.Drawing.Color.Transparent;
+ this.Label4.Location = new System.Drawing.Point(70, 15);
+ this.Label4.Name = "Label4";
+ this.Label4.Size = new System.Drawing.Size(70, 13);
+ this.Label4.TabIndex = 42;
+ this.Label4.Text = "Priority level:";
+ //
+ // btn_clearLogs
+ //
+ this.btn_clearLogs.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.btn_clearLogs.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btn_clearLogs.ForeColor = System.Drawing.Color.DarkOrange;
+ this.btn_clearLogs.Location = new System.Drawing.Point(274, 196);
+ this.btn_clearLogs.Name = "btn_clearLogs";
+ this.btn_clearLogs.Size = new System.Drawing.Size(135, 23);
+ this.btn_clearLogs.TabIndex = 88;
+ this.btn_clearLogs.Text = "Clear Log History";
+ this.btn_clearLogs.UseVisualStyleBackColor = true;
+ this.btn_clearLogs.Click += new System.EventHandler(this.btn_clearLogs_Click);
+ //
+ // drp_Priority
+ //
+ this.drp_Priority.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.drp_Priority.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drp_Priority.FormattingEnabled = true;
+ this.drp_Priority.Items.AddRange(new object[] {
+ "Realtime",
+ "High",
+ "Above Normal",
+ "Normal",
+ "Below Normal",
+ "Low"});
+ this.drp_Priority.Location = new System.Drawing.Point(177, 12);
+ this.drp_Priority.Name = "drp_Priority";
+ this.drp_Priority.Size = new System.Drawing.Size(111, 21);
+ this.drp_Priority.TabIndex = 43;
+ this.ToolTip.SetToolTip(this.drp_Priority, "Set the application priority level for the CLI. \r\nIt\'s best to leave this on Belo" +
+ "w Normal if you wish to use your system whilst encoding with HandBrake.\r\n");
+ this.drp_Priority.SelectedIndexChanged += new System.EventHandler(this.drp_Priority_SelectedIndexChanged);
+ //
+ // check_logsInSpecifiedLocation
+ //
+ this.check_logsInSpecifiedLocation.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.check_logsInSpecifiedLocation.AutoSize = true;
+ this.check_logsInSpecifiedLocation.Location = new System.Drawing.Point(73, 139);
+ this.check_logsInSpecifiedLocation.Name = "check_logsInSpecifiedLocation";
+ this.check_logsInSpecifiedLocation.Size = new System.Drawing.Size(305, 17);
+ this.check_logsInSpecifiedLocation.TabIndex = 87;
+ this.check_logsInSpecifiedLocation.Text = "Put a copy of individual encode logs in a specified location:";
+ this.ToolTip.SetToolTip(this.check_logsInSpecifiedLocation, "Place a copy of the encode log in the same folder as the encoded movie.");
+ this.check_logsInSpecifiedLocation.UseVisualStyleBackColor = true;
+ this.check_logsInSpecifiedLocation.CheckedChanged += new System.EventHandler(this.check_logsInSpecifiedLocation_CheckedChanged);
+ //
+ // check_saveLogWithVideo
+ //
+ this.check_saveLogWithVideo.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.check_saveLogWithVideo.AutoSize = true;
+ this.check_saveLogWithVideo.Location = new System.Drawing.Point(73, 116);
+ this.check_saveLogWithVideo.Name = "check_saveLogWithVideo";
+ this.check_saveLogWithVideo.Size = new System.Drawing.Size(382, 17);
+ this.check_saveLogWithVideo.TabIndex = 83;
+ this.check_saveLogWithVideo.Text = "Put a copy of individual encode logs in the same location as encoded video";
+ this.ToolTip.SetToolTip(this.check_saveLogWithVideo, "Place a copy of the encode log in the same folder as the encoded movie.");
+ this.check_saveLogWithVideo.UseVisualStyleBackColor = true;
+ this.check_saveLogWithVideo.CheckedChanged += new System.EventHandler(this.check_saveLogWithVideo_CheckedChanged);
+ //
+ // label3
+ //
+ this.label3.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.label3.AutoSize = true;
+ this.label3.BackColor = System.Drawing.Color.Transparent;
+ this.label3.Location = new System.Drawing.Point(70, 92);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(101, 13);
+ this.label3.TabIndex = 85;
+ this.label3.Text = "Log verbosity level:";
+ //
+ // btn_saveLog
+ //
+ this.btn_saveLog.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.btn_saveLog.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btn_saveLog.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btn_saveLog.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.btn_saveLog.Location = new System.Drawing.Point(437, 169);
+ this.btn_saveLog.Name = "btn_saveLog";
+ this.btn_saveLog.Size = new System.Drawing.Size(77, 22);
+ this.btn_saveLog.TabIndex = 82;
+ this.btn_saveLog.Text = "Browse";
+ this.btn_saveLog.UseVisualStyleBackColor = true;
+ this.btn_saveLog.Click += new System.EventHandler(this.btn_saveLog_Click);
+ //
+ // cb_logVerboseLvl
+ //
+ this.cb_logVerboseLvl.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.cb_logVerboseLvl.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.cb_logVerboseLvl.FormattingEnabled = true;
+ this.cb_logVerboseLvl.Items.AddRange(new object[] {
+ "0",
+ "1",
+ "2"});
+ this.cb_logVerboseLvl.Location = new System.Drawing.Point(177, 89);
+ this.cb_logVerboseLvl.Name = "cb_logVerboseLvl";
+ this.cb_logVerboseLvl.Size = new System.Drawing.Size(111, 21);
+ this.cb_logVerboseLvl.TabIndex = 86;
+ this.ToolTip.SetToolTip(this.cb_logVerboseLvl, "Activity Log Verbosity Level");
+ this.cb_logVerboseLvl.SelectedIndexChanged += new System.EventHandler(this.cb_logVerboseLvl_SelectedIndexChanged);
+ //
+ // text_logPath
+ //
+ this.text_logPath.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+ this.text_logPath.Location = new System.Drawing.Point(129, 169);
+ this.text_logPath.Name = "text_logPath";
+ this.text_logPath.Size = new System.Drawing.Size(302, 21);
+ this.text_logPath.TabIndex = 80;
+ this.ToolTip.SetToolTip(this.text_logPath, "The default location where auto named files are stored.");
+ this.text_logPath.TextChanged += new System.EventHandler(this.text_logPath_TextChanged);
+ //
+ // label14
+ //
+ this.label14.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.label14.AutoSize = true;
+ this.label14.Location = new System.Drawing.Point(70, 172);
+ this.label14.Name = "label14";
+ this.label14.Size = new System.Drawing.Size(53, 13);
+ this.label14.TabIndex = 81;
+ this.label14.Text = "Log Path:";
+ //
+ // tab_advanced
+ //
+ this.tab_advanced.Controls.Add(this.check_showCliForInGUIEncode);
+ this.tab_advanced.Controls.Add(this.drop_previewScanCount);
+ this.tab_advanced.Controls.Add(this.label33);
+ this.tab_advanced.Controls.Add(this.label6);
+ this.tab_advanced.Controls.Add(this.check_trayStatusAlerts);
+ this.tab_advanced.Controls.Add(this.check_mainMinimize);
+ this.tab_advanced.Controls.Add(this.check_promptOnUnmatchingQueries);
+ this.tab_advanced.Controls.Add(this.check_dvdnav);
+ this.tab_advanced.Controls.Add(this.check_queryEditorTab);
+ this.tab_advanced.Controls.Add(this.label32);
+ this.tab_advanced.Controls.Add(this.drop_x264step);
+ this.tab_advanced.Controls.Add(this.label30);
+ this.tab_advanced.Controls.Add(this.check_disablePresetNotification);
+ this.tab_advanced.Controls.Add(this.label28);
+ this.tab_advanced.Location = new System.Drawing.Point(4, 22);
+ this.tab_advanced.Name = "tab_advanced";
+ this.tab_advanced.Padding = new System.Windows.Forms.Padding(10);
+ this.tab_advanced.Size = new System.Drawing.Size(580, 357);
+ this.tab_advanced.TabIndex = 4;
+ this.tab_advanced.Text = "Advanced / Other";
+ this.tab_advanced.UseVisualStyleBackColor = true;
+ //
+ // check_showCliForInGUIEncode
+ //
+ this.check_showCliForInGUIEncode.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.check_showCliForInGUIEncode.AutoSize = true;
+ this.check_showCliForInGUIEncode.BackColor = System.Drawing.Color.Transparent;
+ this.check_showCliForInGUIEncode.Location = new System.Drawing.Point(81, 129);
+ this.check_showCliForInGUIEncode.Name = "check_showCliForInGUIEncode";
+ this.check_showCliForInGUIEncode.Size = new System.Drawing.Size(324, 17);
+ this.check_showCliForInGUIEncode.TabIndex = 96;
+ this.check_showCliForInGUIEncode.Text = "Show CLI window (Allows you to cleanly exit encode with ctrl-c)";
+ this.ToolTip.SetToolTip(this.check_showCliForInGUIEncode, resources.GetString("check_showCliForInGUIEncode.ToolTip"));
+ this.check_showCliForInGUIEncode.UseVisualStyleBackColor = false;
+ this.check_showCliForInGUIEncode.CheckedChanged += new System.EventHandler(this.check_showCliForInGUIEncode_CheckedChanged);
+ //
+ // drop_previewScanCount
+ //
+ this.drop_previewScanCount.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_previewScanCount.FormattingEnabled = true;
+ this.drop_previewScanCount.Items.AddRange(new object[] {
+ "10",
+ "15",
+ "20",
+ "25",
+ "30"});
+ this.drop_previewScanCount.Location = new System.Drawing.Point(273, 173);
+ this.drop_previewScanCount.Name = "drop_previewScanCount";
+ this.drop_previewScanCount.Size = new System.Drawing.Size(85, 21);
+ this.drop_previewScanCount.TabIndex = 95;
+ this.ToolTip.SetToolTip(this.drop_previewScanCount, "Allows a greater number of preview frames to be selectable on the \"Preview\" windo" +
+ "w.\r\n\r\nThis can in some cases improve the accuracy of the auto crop feature.");
+ this.drop_previewScanCount.SelectedIndexChanged += new System.EventHandler(this.drop_previewScanCount_SelectedIndexChanged);
+ //
+ // label33
+ //
+ this.label33.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.label33.AutoSize = true;
+ this.label33.Location = new System.Drawing.Point(79, 176);
+ this.label33.Name = "label33";
+ this.label33.Size = new System.Drawing.Size(181, 13);
+ this.label33.TabIndex = 94;
+ this.label33.Text = "Number of picture previews to scan:";
+ //
+ // label6
+ //
+ this.label6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.label6.AutoSize = true;
+ this.label6.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label6.Location = new System.Drawing.Point(15, 15);
+ this.label6.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(31, 13);
+ this.label6.TabIndex = 71;
+ this.label6.Text = "GUI:";
+ //
+ // check_trayStatusAlerts
+ //
+ this.check_trayStatusAlerts.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.check_trayStatusAlerts.AutoSize = true;
+ this.check_trayStatusAlerts.BackColor = System.Drawing.Color.Transparent;
+ this.check_trayStatusAlerts.Location = new System.Drawing.Point(81, 37);
+ this.check_trayStatusAlerts.Name = "check_trayStatusAlerts";
+ this.check_trayStatusAlerts.Size = new System.Drawing.Size(288, 17);
+ this.check_trayStatusAlerts.TabIndex = 93;
+ this.check_trayStatusAlerts.Text = "Display status messages from tray icon (balloon popups)";
+ this.ToolTip.SetToolTip(this.check_trayStatusAlerts, "Minimize the window to the system tray rather than the task bar.\r\nThe system tray" +
+ " icon has encode status notifications.\r\nNote: requires restart to take effect!\r\n" +
+ "");
+ this.check_trayStatusAlerts.UseVisualStyleBackColor = false;
+ this.check_trayStatusAlerts.CheckedChanged += new System.EventHandler(this.check_trayStatusAlerts_CheckedChanged);
+ //
+ // check_mainMinimize
+ //
+ this.check_mainMinimize.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.check_mainMinimize.AutoSize = true;
+ this.check_mainMinimize.BackColor = System.Drawing.Color.Transparent;
+ this.check_mainMinimize.Location = new System.Drawing.Point(81, 14);
+ this.check_mainMinimize.Name = "check_mainMinimize";
+ this.check_mainMinimize.Size = new System.Drawing.Size(221, 17);
+ this.check_mainMinimize.TabIndex = 82;
+ this.check_mainMinimize.Text = "Minimize to system tray (Requires Restart)";
+ this.ToolTip.SetToolTip(this.check_mainMinimize, "Minimize the window to the system tray rather than the task bar.\r\nThe system tray" +
+ " icon has encode status notifications.\r\nNote: requires restart to take effect!\r\n" +
+ "");
+ this.check_mainMinimize.UseVisualStyleBackColor = false;
+ this.check_mainMinimize.CheckedChanged += new System.EventHandler(this.check_mainMinimize_CheckedChanged);
+ //
+ // check_promptOnUnmatchingQueries
+ //
+ this.check_promptOnUnmatchingQueries.AutoSize = true;
+ this.check_promptOnUnmatchingQueries.Location = new System.Drawing.Point(100, 83);
+ this.check_promptOnUnmatchingQueries.Name = "check_promptOnUnmatchingQueries";
+ this.check_promptOnUnmatchingQueries.Size = new System.Drawing.Size(300, 17);
+ this.check_promptOnUnmatchingQueries.TabIndex = 63;
+ this.check_promptOnUnmatchingQueries.Text = "Prompt when a manual query does not match GUI settings";
+ this.check_promptOnUnmatchingQueries.UseVisualStyleBackColor = true;
+ this.check_promptOnUnmatchingQueries.CheckedChanged += new System.EventHandler(this.check_promptOnUnmatchingQueries_CheckedChanged);
+ //
+ // check_dvdnav
+ //
+ this.check_dvdnav.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.check_dvdnav.AutoSize = true;
+ this.check_dvdnav.BackColor = System.Drawing.Color.Transparent;
+ this.check_dvdnav.Location = new System.Drawing.Point(82, 247);
+ this.check_dvdnav.Name = "check_dvdnav";
+ this.check_dvdnav.Size = new System.Drawing.Size(277, 17);
+ this.check_dvdnav.TabIndex = 90;
+ this.check_dvdnav.Text = "Disable LibDVDNav. (libdvdread will be used instead)";
+ this.check_dvdnav.UseVisualStyleBackColor = false;
+ this.check_dvdnav.CheckedChanged += new System.EventHandler(this.check_dvdnav_CheckedChanged);
+ //
+ // check_queryEditorTab
+ //
+ this.check_queryEditorTab.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.check_queryEditorTab.AutoSize = true;
+ this.check_queryEditorTab.BackColor = System.Drawing.Color.Transparent;
+ this.check_queryEditorTab.Location = new System.Drawing.Point(81, 60);
+ this.check_queryEditorTab.Name = "check_queryEditorTab";
+ this.check_queryEditorTab.Size = new System.Drawing.Size(236, 17);
+ this.check_queryEditorTab.TabIndex = 84;
+ this.check_queryEditorTab.Text = "Enable \"Query Editor\" tab (Requires Restart)";
+ this.ToolTip.SetToolTip(this.check_queryEditorTab, "Enables the Query Editor tab on the main window. Requires program restart to take" +
+ " effect.");
+ this.check_queryEditorTab.UseVisualStyleBackColor = false;
+ this.check_queryEditorTab.CheckedChanged += new System.EventHandler(this.check_queryEditorTab_CheckedChanged);
+ //
+ // label32
+ //
+ this.label32.Anchor = System.Windows.Forms.AnchorStyles.Right;
+ this.label32.AutoSize = true;
+ this.label32.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label32.Location = new System.Drawing.Point(13, 248);
+ this.label32.Name = "label32";
+ this.label32.Size = new System.Drawing.Size(33, 13);
+ this.label32.TabIndex = 89;
+ this.label32.Text = "DVD:";
+ //
+ // drop_x264step
+ //
+ this.drop_x264step.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drop_x264step.FormattingEnabled = true;
+ this.drop_x264step.Items.AddRange(new object[] {
+ "1.0",
+ "0.50",
+ "0.25",
+ "0.20"});
+ this.drop_x264step.Location = new System.Drawing.Point(273, 210);
+ this.drop_x264step.Name = "drop_x264step";
+ this.drop_x264step.Size = new System.Drawing.Size(85, 21);
+ this.drop_x264step.TabIndex = 86;
+ this.ToolTip.SetToolTip(this.drop_x264step, "Quality Slider Control Granularity for x264 encoding only.");
+ this.drop_x264step.SelectedIndexChanged += new System.EventHandler(this.x264step_SelectedIndexChanged);
+ //
+ // label30
+ //
+ this.label30.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.label30.AutoSize = true;
+ this.label30.Location = new System.Drawing.Point(78, 213);
+ this.label30.Name = "label30";
+ this.label30.Size = new System.Drawing.Size(189, 13);
+ this.label30.TabIndex = 87;
+ this.label30.Text = "Constant quality fractional granularity";
+ //
+ // check_disablePresetNotification
+ //
+ this.check_disablePresetNotification.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.check_disablePresetNotification.AutoSize = true;
+ this.check_disablePresetNotification.BackColor = System.Drawing.Color.Transparent;
+ this.check_disablePresetNotification.Location = new System.Drawing.Point(81, 106);
+ this.check_disablePresetNotification.Name = "check_disablePresetNotification";
+ this.check_disablePresetNotification.Size = new System.Drawing.Size(216, 17);
+ this.check_disablePresetNotification.TabIndex = 91;
+ this.check_disablePresetNotification.Text = "Disable built-in preset update notification";
+ this.ToolTip.SetToolTip(this.check_disablePresetNotification, "Disables the notification you recieve when presets are updated when a new version" +
+ " of HandBrake is installed.");
+ this.check_disablePresetNotification.UseVisualStyleBackColor = false;
+ this.check_disablePresetNotification.CheckedChanged += new System.EventHandler(this.check_disablePresetNotification_CheckedChanged);
+ //
+ // label28
+ //
+ this.label28.Anchor = System.Windows.Forms.AnchorStyles.Right;
+ this.label28.AutoSize = true;
+ this.label28.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label28.Location = new System.Drawing.Point(8, 213);
+ this.label28.Name = "label28";
+ this.label28.Size = new System.Drawing.Size(38, 13);
+ this.label28.TabIndex = 85;
+ this.label28.Text = "x264:";
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label8.Location = new System.Drawing.Point(51, 19);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(115, 13);
+ this.label8.TabIndex = 61;
+ this.label8.Text = "HandBrake Options";
+ //
+ // pictureBox2
+ //
+ this.pictureBox2.Image = global::Handbrake.Properties.Resources.General_Preferences;
+ this.pictureBox2.Location = new System.Drawing.Point(12, 9);
+ this.pictureBox2.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3);
+ this.pictureBox2.Name = "pictureBox2";
+ this.pictureBox2.Size = new System.Drawing.Size(32, 32);
+ this.pictureBox2.TabIndex = 60;
+ this.pictureBox2.TabStop = false;
+ //
+ // ToolTip
+ //
+ this.ToolTip.Active = false;
+ this.ToolTip.AutomaticDelay = 1000;
+ this.ToolTip.AutoPopDelay = 15000;
+ this.ToolTip.InitialDelay = 1000;
+ this.ToolTip.ReshowDelay = 200;
+ this.ToolTip.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info;
+ this.ToolTip.ToolTipTitle = "Tooltip";
+ //
+ // textBox1
+ //
+ this.textBox1.Location = new System.Drawing.Point(199, 198);
+ this.textBox1.Name = "textBox1";
+ this.textBox1.Size = new System.Drawing.Size(255, 20);
+ this.textBox1.TabIndex = 79;
+ this.ToolTip.SetToolTip(this.textBox1, "Define the format of the automatically named file.\r\ne.g {source}_{title}_some-te" +
+ "xt\r\n{source} {title} {chapters} will be automatically substituted for the input " +
+ "sources values.");
+ //
+ // textBox2
+ //
+ this.textBox2.Location = new System.Drawing.Point(199, 171);
+ this.textBox2.Name = "textBox2";
+ this.textBox2.Size = new System.Drawing.Size(181, 20);
+ this.textBox2.TabIndex = 76;
+ this.ToolTip.SetToolTip(this.textBox2, "The default location where auto named files are stored.");
+ //
+ // checkBox1
+ //
+ this.checkBox1.AutoSize = true;
+ this.checkBox1.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.checkBox1.Location = new System.Drawing.Point(114, 148);
+ this.checkBox1.Name = "checkBox1";
+ this.checkBox1.Size = new System.Drawing.Size(206, 17);
+ this.checkBox1.TabIndex = 72;
+ this.checkBox1.Text = "Automatically name output files";
+ this.ToolTip.SetToolTip(this.checkBox1, "Automatically name output files");
+ this.checkBox1.UseVisualStyleBackColor = true;
+ //
+ // checkBox2
+ //
+ this.checkBox2.AutoSize = true;
+ this.checkBox2.BackColor = System.Drawing.Color.Transparent;
+ this.checkBox2.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.checkBox2.Location = new System.Drawing.Point(114, 41);
+ this.checkBox2.Name = "checkBox2";
+ this.checkBox2.Size = new System.Drawing.Size(135, 17);
+ this.checkBox2.TabIndex = 70;
+ this.checkBox2.Text = "Enable GUI tooltips";
+ this.ToolTip.SetToolTip(this.checkBox2, "Enable the built in tooltips for gui controls.");
+ this.checkBox2.UseVisualStyleBackColor = false;
+ //
+ // checkBox3
+ //
+ this.checkBox3.AutoSize = true;
+ this.checkBox3.BackColor = System.Drawing.Color.Transparent;
+ this.checkBox3.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.checkBox3.Location = new System.Drawing.Point(114, 18);
+ this.checkBox3.Name = "checkBox3";
+ this.checkBox3.Size = new System.Drawing.Size(131, 17);
+ this.checkBox3.TabIndex = 68;
+ this.checkBox3.Text = "Check for updates";
+ this.ToolTip.SetToolTip(this.checkBox3, "Enables the built in update checker. This check is performed when the application" +
+ " starts.");
+ this.checkBox3.UseVisualStyleBackColor = false;
+ //
+ // checkBox4
+ //
+ this.checkBox4.AutoSize = true;
+ this.checkBox4.BackColor = System.Drawing.Color.Transparent;
+ this.checkBox4.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.checkBox4.Location = new System.Drawing.Point(114, 64);
+ this.checkBox4.Name = "checkBox4";
+ this.checkBox4.Size = new System.Drawing.Size(166, 17);
+ this.checkBox4.TabIndex = 69;
+ this.checkBox4.Text = "Load my default settings";
+ this.ToolTip.SetToolTip(this.checkBox4, "Loads the users default settings rather than the Normal preset.");
+ this.checkBox4.UseVisualStyleBackColor = false;
+ //
+ // comboBox1
+ //
+ this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.comboBox1.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.comboBox1.FormattingEnabled = true;
+ this.comboBox1.Items.AddRange(new object[] {
+ "Do Nothing",
+ "Shutdown",
+ "Suspend",
+ "Hibernate",
+ "Lock System",
+ "Log Off",
+ "Quit HandBrake"});
+ this.comboBox1.Location = new System.Drawing.Point(114, 100);
+ this.comboBox1.Name = "comboBox1";
+ this.comboBox1.Size = new System.Drawing.Size(166, 21);
+ this.comboBox1.TabIndex = 43;
+ this.ToolTip.SetToolTip(this.comboBox1, "Performs an action when an encode or queue has completed.");
+ //
+ // textBox3
+ //
+ this.textBox3.Location = new System.Drawing.Point(199, 198);
+ this.textBox3.Name = "textBox3";
+ this.textBox3.Size = new System.Drawing.Size(255, 20);
+ this.textBox3.TabIndex = 79;
+ this.ToolTip.SetToolTip(this.textBox3, "Define the format of the automatically named file.\r\ne.g {source}_{title}_some-te" +
+ "xt\r\n{source} {title} {chapters} will be automatically substituted for the input " +
+ "sources values.");
+ //
+ // textBox4
+ //
+ this.textBox4.Location = new System.Drawing.Point(199, 171);
+ this.textBox4.Name = "textBox4";
+ this.textBox4.Size = new System.Drawing.Size(181, 20);
+ this.textBox4.TabIndex = 76;
+ this.ToolTip.SetToolTip(this.textBox4, "The default location where auto named files are stored.");
+ //
+ // checkBox5
+ //
+ this.checkBox5.AutoSize = true;
+ this.checkBox5.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.checkBox5.Location = new System.Drawing.Point(114, 148);
+ this.checkBox5.Name = "checkBox5";
+ this.checkBox5.Size = new System.Drawing.Size(206, 17);
+ this.checkBox5.TabIndex = 72;
+ this.checkBox5.Text = "Automatically name output files";
+ this.ToolTip.SetToolTip(this.checkBox5, "Automatically name output files");
+ this.checkBox5.UseVisualStyleBackColor = true;
+ //
+ // checkBox6
+ //
+ this.checkBox6.AutoSize = true;
+ this.checkBox6.BackColor = System.Drawing.Color.Transparent;
+ this.checkBox6.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.checkBox6.Location = new System.Drawing.Point(114, 41);
+ this.checkBox6.Name = "checkBox6";
+ this.checkBox6.Size = new System.Drawing.Size(135, 17);
+ this.checkBox6.TabIndex = 70;
+ this.checkBox6.Text = "Enable GUI tooltips";
+ this.ToolTip.SetToolTip(this.checkBox6, "Enable the built in tooltips for gui controls.");
+ this.checkBox6.UseVisualStyleBackColor = false;
+ //
+ // checkBox7
+ //
+ this.checkBox7.AutoSize = true;
+ this.checkBox7.BackColor = System.Drawing.Color.Transparent;
+ this.checkBox7.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.checkBox7.Location = new System.Drawing.Point(114, 18);
+ this.checkBox7.Name = "checkBox7";
+ this.checkBox7.Size = new System.Drawing.Size(131, 17);
+ this.checkBox7.TabIndex = 68;
+ this.checkBox7.Text = "Check for updates";
+ this.ToolTip.SetToolTip(this.checkBox7, "Enables the built in update checker. This check is performed when the application" +
+ " starts.");
+ this.checkBox7.UseVisualStyleBackColor = false;
+ //
+ // checkBox8
+ //
+ this.checkBox8.AutoSize = true;
+ this.checkBox8.BackColor = System.Drawing.Color.Transparent;
+ this.checkBox8.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.checkBox8.Location = new System.Drawing.Point(114, 64);
+ this.checkBox8.Name = "checkBox8";
+ this.checkBox8.Size = new System.Drawing.Size(166, 17);
+ this.checkBox8.TabIndex = 69;
+ this.checkBox8.Text = "Load my default settings";
+ this.ToolTip.SetToolTip(this.checkBox8, "Loads the users default settings rather than the Normal preset.");
+ this.checkBox8.UseVisualStyleBackColor = false;
+ //
+ // comboBox2
+ //
+ this.comboBox2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.comboBox2.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.comboBox2.FormattingEnabled = true;
+ this.comboBox2.Items.AddRange(new object[] {
+ "Do Nothing",
+ "Shutdown",
+ "Suspend",
+ "Hibernate",
+ "Lock System",
+ "Log Off",
+ "Quit HandBrake"});
+ this.comboBox2.Location = new System.Drawing.Point(114, 100);
+ this.comboBox2.Name = "comboBox2";
+ this.comboBox2.Size = new System.Drawing.Size(166, 21);
+ this.comboBox2.TabIndex = 43;
+ this.ToolTip.SetToolTip(this.comboBox2, "Performs an action when an encode or queue has completed.");
+ //
+ // label16
+ //
+ this.label16.AutoSize = true;
+ this.label16.Font = new System.Drawing.Font("Verdana", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label16.Location = new System.Drawing.Point(197, 222);
+ this.label16.Name = "label16";
+ this.label16.Size = new System.Drawing.Size(242, 12);
+ this.label16.TabIndex = 81;
+ this.label16.Text = "Available Options: {source} {title} {chapters}";
+ //
+ // label17
+ //
+ this.label17.AutoSize = true;
+ this.label17.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label17.Location = new System.Drawing.Point(111, 201);
+ this.label17.Name = "label17";
+ this.label17.Size = new System.Drawing.Size(52, 13);
+ this.label17.TabIndex = 80;
+ this.label17.Text = "Format:";
+ //
+ // button1
+ //
+ this.button1.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.button1.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.button1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.button1.Location = new System.Drawing.Point(386, 171);
+ this.button1.Name = "button1";
+ this.button1.Size = new System.Drawing.Size(68, 22);
+ this.button1.TabIndex = 78;
+ this.button1.Text = "Browse";
+ this.button1.UseVisualStyleBackColor = true;
+ //
+ // label18
+ //
+ this.label18.AutoSize = true;
+ this.label18.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label18.Location = new System.Drawing.Point(111, 174);
+ this.label18.Name = "label18";
+ this.label18.Size = new System.Drawing.Size(82, 13);
+ this.label18.TabIndex = 77;
+ this.label18.Text = "Default Path:";
+ //
+ // label19
+ //
+ this.label19.AutoSize = true;
+ this.label19.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label19.Location = new System.Drawing.Point(10, 149);
+ this.label19.Name = "label19";
+ this.label19.Size = new System.Drawing.Size(86, 13);
+ this.label19.TabIndex = 71;
+ this.label19.Text = "Output files:";
+ //
+ // label20
+ //
+ this.label20.AutoSize = true;
+ this.label20.BackColor = System.Drawing.Color.Transparent;
+ this.label20.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label20.Location = new System.Drawing.Point(21, 19);
+ this.label20.Name = "label20";
+ this.label20.Size = new System.Drawing.Size(75, 13);
+ this.label20.TabIndex = 67;
+ this.label20.Text = "At Launch:";
+ //
+ // label21
+ //
+ this.label21.AutoSize = true;
+ this.label21.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label21.Location = new System.Drawing.Point(12, 103);
+ this.label21.Name = "label21";
+ this.label21.Size = new System.Drawing.Size(84, 13);
+ this.label21.TabIndex = 54;
+ this.label21.Text = "When Done:";
+ //
+ // label22
+ //
+ this.label22.AutoSize = true;
+ this.label22.Font = new System.Drawing.Font("Verdana", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label22.Location = new System.Drawing.Point(197, 222);
+ this.label22.Name = "label22";
+ this.label22.Size = new System.Drawing.Size(242, 12);
+ this.label22.TabIndex = 81;
+ this.label22.Text = "Available Options: {source} {title} {chapters}";
+ //
+ // label23
+ //
+ this.label23.AutoSize = true;
+ this.label23.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label23.Location = new System.Drawing.Point(111, 201);
+ this.label23.Name = "label23";
+ this.label23.Size = new System.Drawing.Size(52, 13);
+ this.label23.TabIndex = 80;
+ this.label23.Text = "Format:";
+ //
+ // button2
+ //
+ this.button2.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.button2.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.button2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+ this.button2.Location = new System.Drawing.Point(386, 171);
+ this.button2.Name = "button2";
+ this.button2.Size = new System.Drawing.Size(68, 22);
+ this.button2.TabIndex = 78;
+ this.button2.Text = "Browse";
+ this.button2.UseVisualStyleBackColor = true;
+ //
+ // label24
+ //
+ this.label24.AutoSize = true;
+ this.label24.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label24.Location = new System.Drawing.Point(111, 174);
+ this.label24.Name = "label24";
+ this.label24.Size = new System.Drawing.Size(82, 13);
+ this.label24.TabIndex = 77;
+ this.label24.Text = "Default Path:";
+ //
+ // label25
+ //
+ this.label25.AutoSize = true;
+ this.label25.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label25.Location = new System.Drawing.Point(10, 149);
+ this.label25.Name = "label25";
+ this.label25.Size = new System.Drawing.Size(86, 13);
+ this.label25.TabIndex = 71;
+ this.label25.Text = "Output files:";
+ //
+ // label26
+ //
+ this.label26.AutoSize = true;
+ this.label26.BackColor = System.Drawing.Color.Transparent;
+ this.label26.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label26.Location = new System.Drawing.Point(21, 19);
+ this.label26.Name = "label26";
+ this.label26.Size = new System.Drawing.Size(75, 13);
+ this.label26.TabIndex = 67;
+ this.label26.Text = "At Launch:";
+ //
+ // label27
+ //
+ this.label27.AutoSize = true;
+ this.label27.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label27.Location = new System.Drawing.Point(12, 103);
+ this.label27.Name = "label27";
+ this.label27.Size = new System.Drawing.Size(84, 13);
+ this.label27.TabIndex = 54;
+ this.label27.Text = "When Done:";
+ //
+ // openFile_vlc
+ //
+ this.openFile_vlc.DefaultExt = "exe";
+ this.openFile_vlc.Filter = "exe|*.exe";
+ //
+ // panel1
+ //
+ this.panel1.BackColor = System.Drawing.Color.White;
+ this.panel1.Controls.Add(this.panel2);
+ this.panel1.Controls.Add(this.label8);
+ this.panel1.Controls.Add(this.pictureBox2);
+ this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panel1.Location = new System.Drawing.Point(0, 0);
+ this.panel1.Margin = new System.Windows.Forms.Padding(0);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(615, 65);
+ this.panel1.TabIndex = 62;
+ //
+ // panel2
+ //
+ this.panel2.BackColor = System.Drawing.SystemColors.Control;
+ this.panel2.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.panel2.Location = new System.Drawing.Point(0, 55);
+ this.panel2.MaximumSize = new System.Drawing.Size(0, 10);
+ this.panel2.MinimumSize = new System.Drawing.Size(0, 10);
+ this.panel2.Name = "panel2";
+ this.panel2.Size = new System.Drawing.Size(615, 10);
+ this.panel2.TabIndex = 59;
+ //
+ // frmOptions
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
+ this.AutoSize = true;
+ this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+ this.ClientSize = new System.Drawing.Size(615, 495);
+ this.Controls.Add(this.panel1);
+ this.Controls.Add(this.btn_close);
+ this.Controls.Add(this.tab_options);
+ this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "frmOptions";
+ this.ShowIcon = false;
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "HandBrake Options";
+ this.tab_options.ResumeLayout(false);
+ this.tab_general.ResumeLayout(false);
+ this.tab_general.PerformLayout();
+ this.tab_picture.ResumeLayout(false);
+ this.tab_picture.PerformLayout();
+ this.tableLayoutPanel2.ResumeLayout(false);
+ this.tableLayoutPanel2.PerformLayout();
+ this.tab_audio_sub.ResumeLayout(false);
+ this.tab_audio_sub.PerformLayout();
+ this.tab_cli.ResumeLayout(false);
+ this.tab_cli.PerformLayout();
+ this.tab_advanced.ResumeLayout(false);
+ this.tab_advanced.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();
+ this.panel1.ResumeLayout(false);
+ this.panel1.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ internal System.Windows.Forms.Button btn_close;
+ internal System.Windows.Forms.ComboBox drp_completeOption;
+ private System.Windows.Forms.TabControl tab_options;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.TabPage tab_cli;
+ private System.Windows.Forms.Label label8;
+ private System.Windows.Forms.PictureBox pictureBox2;
+ private System.Windows.Forms.TabPage tab_general;
+ private System.Windows.Forms.FolderBrowserDialog pathFinder;
+ internal System.Windows.Forms.Label Label4;
+ internal System.Windows.Forms.CheckBox check_tooltip;
+ internal System.Windows.Forms.CheckBox check_updateCheck;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.TabPage tab_advanced;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.Label label13;
+ internal System.Windows.Forms.Label label10;
+ private System.Windows.Forms.TextBox text_an_path;
+ internal System.Windows.Forms.CheckBox check_autoNaming;
+ private System.Windows.Forms.Label label12;
+ internal System.Windows.Forms.ToolTip ToolTip;
+ private System.Windows.Forms.TabPage tab_picture;
+ internal System.Windows.Forms.Label label5;
+ private System.Windows.Forms.TextBox txt_autoNameFormat;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.Label label9;
+ internal System.Windows.Forms.Button btn_saveLog;
+ internal System.Windows.Forms.Label label14;
+ private System.Windows.Forms.TextBox text_logPath;
+ internal System.Windows.Forms.CheckBox check_saveLogWithVideo;
+ internal System.Windows.Forms.Button btn_vlcPath;
+ private System.Windows.Forms.TextBox txt_vlcPath;
+ private System.Windows.Forms.Label label29;
+ private System.Windows.Forms.Label label16;
+ internal System.Windows.Forms.Label label17;
+ private System.Windows.Forms.TextBox textBox1;
+ internal System.Windows.Forms.Button button1;
+ internal System.Windows.Forms.Label label18;
+ private System.Windows.Forms.TextBox textBox2;
+ internal System.Windows.Forms.CheckBox checkBox1;
+ private System.Windows.Forms.Label label19;
+ internal System.Windows.Forms.CheckBox checkBox2;
+ internal System.Windows.Forms.CheckBox checkBox3;
+ internal System.Windows.Forms.CheckBox checkBox4;
+ private System.Windows.Forms.Label label20;
+ private System.Windows.Forms.Label label21;
+ internal System.Windows.Forms.ComboBox comboBox1;
+ private System.Windows.Forms.Label label22;
+ internal System.Windows.Forms.Label label23;
+ private System.Windows.Forms.TextBox textBox3;
+ internal System.Windows.Forms.Button button2;
+ internal System.Windows.Forms.Label label24;
+ private System.Windows.Forms.TextBox textBox4;
+ internal System.Windows.Forms.CheckBox checkBox5;
+ private System.Windows.Forms.Label label25;
+ internal System.Windows.Forms.CheckBox checkBox6;
+ internal System.Windows.Forms.CheckBox checkBox7;
+ internal System.Windows.Forms.CheckBox checkBox8;
+ private System.Windows.Forms.Label label26;
+ private System.Windows.Forms.Label label27;
+ internal System.Windows.Forms.ComboBox comboBox2;
+ private System.Windows.Forms.OpenFileDialog openFile_vlc;
+ internal System.Windows.Forms.CheckBox check_mainMinimize;
+ internal System.Windows.Forms.CheckBox check_queryEditorTab;
+ private System.Windows.Forms.Label label30;
+ internal System.Windows.Forms.ComboBox drop_x264step;
+ private System.Windows.Forms.Label label28;
+ internal System.Windows.Forms.ComboBox cb_logVerboseLvl;
+ internal System.Windows.Forms.Label label3;
+ internal System.Windows.Forms.CheckBox check_dvdnav;
+ private System.Windows.Forms.Label label32;
+ internal System.Windows.Forms.CheckBox check_logsInSpecifiedLocation;
+ internal System.Windows.Forms.CheckBox check_disablePresetNotification;
+ internal System.Windows.Forms.CheckBox check_trayStatusAlerts;
+ private System.Windows.Forms.Button btn_viewLogs;
+ private System.Windows.Forms.Button btn_clearLogs;
+ internal System.Windows.Forms.ComboBox drop_updateCheckDays;
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
+ internal System.Windows.Forms.ComboBox drp_Priority;
+ private System.Windows.Forms.CheckBox check_promptOnUnmatchingQueries;
+ private System.Windows.Forms.TabPage tab_audio_sub;
+ internal System.Windows.Forms.ComboBox drop_preferredLang;
+ private System.Windows.Forms.Label label31;
+ private System.Windows.Forms.RadioButton radio_foreignAndSubs;
+ private System.Windows.Forms.RadioButton radio_dub;
+ private System.Windows.Forms.Label label15;
+ internal System.Windows.Forms.Button btn_browse;
+ internal System.Windows.Forms.CheckBox check_growlEncode;
+ internal System.Windows.Forms.CheckBox check_GrowlQueue;
+ internal System.Windows.Forms.ComboBox drop_previewScanCount;
+ private System.Windows.Forms.Label label33;
+ internal System.Windows.Forms.CheckBox check_clearOldLogs;
+ internal System.Windows.Forms.CheckBox check_showCliForInGUIEncode;
+ internal System.Windows.Forms.CheckBox check_TitleCase;
+ internal System.Windows.Forms.CheckBox check_removeUnderscores;
+ internal System.Windows.Forms.CheckBox check_preventSleep;
+ private System.Windows.Forms.Label label11;
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.Panel panel2;
+ private System.Windows.Forms.RadioButton radio_preferredAudioAndSubs;
+ private System.Windows.Forms.CheckBox check_AddCCTracks;
+ private System.Windows.Forms.Label label34;
+ internal System.Windows.Forms.Label label35;
+ internal System.Windows.Forms.ComboBox cb_mp4FileMode;
+ }
+} \ No newline at end of file
diff --git a/win/CS/frmOptions.cs b/win/CS/frmOptions.cs
new file mode 100644
index 000000000..1a3fd1919
--- /dev/null
+++ b/win/CS/frmOptions.cs
@@ -0,0 +1,522 @@
+/* frmOptions.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake
+{
+ using System;
+ using System.Collections.Generic;
+ using System.Diagnostics;
+ using System.Globalization;
+ using System.Windows.Forms;
+
+ using HandBrake.ApplicationServices;
+ using HandBrake.ApplicationServices.Services;
+ using HandBrake.ApplicationServices.Utilities;
+
+ using Handbrake.Functions;
+ using Handbrake.Model;
+ using Handbrake.Properties;
+
+ /// <summary>
+ /// The Options Window
+ /// </summary>
+ public partial class frmOptions : Form
+ {
+ private frmMain mainWindow;
+ private bool optionsWindowLoading = true;
+
+ public frmOptions(frmMain mw)
+ {
+ InitializeComponent();
+ mainWindow = mw;
+
+ IDictionary<string, string> langList = Main.MapLanguages();
+ foreach (string item in langList.Keys)
+ drop_preferredLang.Items.Add(item);
+
+ // #############################
+ // General
+ // #############################
+
+ // Enable Tooltips.
+ if (Properties.Settings.Default.tooltipEnable)
+ {
+ check_tooltip.CheckState = CheckState.Checked;
+ ToolTip.Active = true;
+ }
+
+ // Update Check
+ if (Properties.Settings.Default.updateStatus)
+ check_updateCheck.CheckState = CheckState.Checked;
+
+ // Days between update checks
+ switch (Properties.Settings.Default.daysBetweenUpdateCheck)
+ {
+ case 1:
+ drop_updateCheckDays.SelectedIndex = 0;
+ break;
+ case 7:
+ drop_updateCheckDays.SelectedIndex = 1;
+ break;
+ case 30:
+ drop_updateCheckDays.SelectedIndex = 2;
+ break;
+ }
+
+ // On Encode Completeion Action
+ drp_completeOption.Text = Properties.Settings.Default.CompletionOption;
+
+ // Growl.
+ if (Properties.Settings.Default.growlEncode)
+ check_growlEncode.CheckState = CheckState.Checked;
+
+ if (Properties.Settings.Default.growlQueue)
+ check_GrowlQueue.CheckState = CheckState.Checked;
+
+ // Enable auto naming feature.
+ if (Properties.Settings.Default.autoNaming)
+ check_autoNaming.CheckState = CheckState.Checked;
+
+ // Store the auto name path
+ text_an_path.Text = Properties.Settings.Default.autoNamePath;
+ if (text_an_path.Text == string.Empty)
+ text_an_path.Text = "Click 'Browse' to set the default location";
+
+ // Store auto name format
+ txt_autoNameFormat.Text = Properties.Settings.Default.autoNameFormat;
+
+ // Use iPod/iTunes friendly .m4v extension for MP4 files.
+ cb_mp4FileMode.SelectedIndex = Properties.Settings.Default.useM4v;
+
+ // Remove Underscores
+ check_removeUnderscores.Checked = Properties.Settings.Default.AutoNameRemoveUnderscore;
+
+ // Title case
+ check_TitleCase.Checked = Properties.Settings.Default.AutoNameTitleCase;
+
+ // #############################
+ // Picture Tab
+ // #############################
+
+ // VLC Path
+ txt_vlcPath.Text = Properties.Settings.Default.VLC_Path;
+
+ // #############################
+ // Audio and Subtitles Tab
+ // #############################
+
+ drop_preferredLang.SelectedItem = Properties.Settings.Default.NativeLanguage;
+
+ switch (Settings.Default.DubMode)
+ {
+ case 1:
+ radio_dub.Checked = true;
+ break;
+ case 2:
+ radio_foreignAndSubs.Checked = true;
+ break;
+ case 3:
+ radio_preferredAudioAndSubs.Checked = true;
+ break;
+ }
+
+ check_AddCCTracks.Checked = Properties.Settings.Default.useClosedCaption;
+
+ // #############################
+ // CLI
+ // #############################
+
+ // Priority level for encodes
+ drp_Priority.Text = Properties.Settings.Default.processPriority;
+
+ check_preventSleep.Checked = Properties.Settings.Default.preventSleep;
+
+ // Log Verbosity Level
+ cb_logVerboseLvl.SelectedIndex = Properties.Settings.Default.verboseLevel;
+
+ // Save logs in the same directory as encoded files
+ if (Properties.Settings.Default.saveLogWithVideo)
+ check_saveLogWithVideo.CheckState = CheckState.Checked;
+
+ // Save Logs in a specified path
+ if (Properties.Settings.Default.saveLogToSpecifiedPath)
+ check_logsInSpecifiedLocation.CheckState = CheckState.Checked;
+
+ // The saved log path
+ text_logPath.Text = Properties.Settings.Default.saveLogPath;
+
+ check_clearOldLogs.Checked = Properties.Settings.Default.clearOldLogs;
+
+ // #############################
+ // Advanced
+ // #############################
+
+ // Minimise to Tray
+ if (Properties.Settings.Default.trayIconAlerts)
+ check_trayStatusAlerts.CheckState = CheckState.Checked;
+
+ // Tray Balloon popups
+ if (Properties.Settings.Default.MainWindowMinimize)
+ check_mainMinimize.CheckState = CheckState.Checked;
+
+ // Enable / Disable Query editor tab
+ if (Properties.Settings.Default.QueryEditorTab)
+ check_queryEditorTab.CheckState = CheckState.Checked;
+ check_promptOnUnmatchingQueries.Enabled = check_queryEditorTab.Checked;
+
+ // Prompt on inconsistant queries
+ check_promptOnUnmatchingQueries.Checked = Properties.Settings.Default.PromptOnUnmatchingQueries;
+
+ // Preset update notification
+ if (Properties.Settings.Default.presetNotification)
+ check_disablePresetNotification.CheckState = CheckState.Checked;
+
+ // Show CLI Window
+ check_showCliForInGUIEncode.Checked = Properties.Settings.Default.showCliForInGuiEncodeStatus;
+
+ // Set the preview count
+ drop_previewScanCount.SelectedItem = Properties.Settings.Default.previewScanCount.ToString();
+
+ // x264 step
+ string step = Properties.Settings.Default.x264cqstep.ToString(new CultureInfo("en-US"));
+ switch (step)
+ {
+ case "1":
+ drop_x264step.SelectedIndex = 0;
+ break;
+ case "0.5":
+ drop_x264step.SelectedIndex = 1;
+ break;
+ case "0.25":
+ drop_x264step.SelectedIndex = 2;
+ break;
+ case "0.2":
+ drop_x264step.SelectedIndex = 3;
+ break;
+ }
+
+ // Use Experimental dvdnav
+ if (Properties.Settings.Default.noDvdNav)
+ check_dvdnav.CheckState = CheckState.Checked;
+
+ optionsWindowLoading = false;
+ }
+
+ #region General
+
+ private void check_updateCheck_CheckedChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.updateStatus = check_updateCheck.Checked;
+ }
+
+ private void drop_updateCheckDays_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ switch (drop_updateCheckDays.SelectedIndex)
+ {
+ case 0:
+ Properties.Settings.Default.daysBetweenUpdateCheck = 1;
+ break;
+ case 1:
+ Properties.Settings.Default.daysBetweenUpdateCheck = 7;
+ break;
+ case 2:
+ Properties.Settings.Default.daysBetweenUpdateCheck = 30;
+ break;
+ }
+ }
+
+ private void check_tooltip_CheckedChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.tooltipEnable = check_tooltip.Checked;
+ }
+
+ private void drp_completeOption_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.CompletionOption = drp_completeOption.Text;
+ }
+
+ private void check_GrowlQueue_CheckedChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.growlQueue = check_GrowlQueue.Checked;
+ }
+
+ private void check_growlEncode_CheckedChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.growlEncode = check_growlEncode.Checked;
+ }
+
+ private void check_autoNaming_CheckedChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.autoNaming = check_autoNaming.Checked;
+ }
+
+ private void txt_autoNameFormat_TextChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.autoNameFormat = txt_autoNameFormat.Text;
+ }
+
+ private void btn_browse_Click(object sender, EventArgs e)
+ {
+ pathFinder.ShowDialog();
+ text_an_path.Text = pathFinder.SelectedPath;
+ }
+
+ private void text_an_path_TextChanged(object sender, EventArgs e)
+ {
+ if (text_an_path.Text == string.Empty)
+ {
+ Properties.Settings.Default.autoNamePath = string.Empty;
+ text_an_path.Text = "Click 'Browse' to set the default location";
+ }
+ else
+ Properties.Settings.Default.autoNamePath = text_an_path.Text;
+
+ if (text_an_path.Text.ToLower() == "{source_path}" && !optionsWindowLoading)
+ {
+ MessageBox.Show(
+ "Be careful with this feature. Make sure you can write to the same folder as the source! \n\n If you are encoding from a DVD, do not use this feature as HandBrake will not be able to write to the DVD!",
+ "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ }
+
+ if (text_an_path.Text.ToLower().Contains("{source_path}") && text_an_path.Text.ToLower() != "{source_path}")
+ {
+ MessageBox.Show("Note you can not use the {source_path} within a path. {source_path} is the full source file path.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ }
+ }
+
+ private void cb_mp4FileMode_SelectedIndexChanged(object sender, EventArgs e)
+ {
+
+ Properties.Settings.Default.useM4v = cb_mp4FileMode.SelectedIndex;
+ }
+
+ private void check_removeUnderscores_CheckedChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.AutoNameRemoveUnderscore = check_removeUnderscores.Checked;
+ }
+
+ private void check_TitleCase_CheckedChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.AutoNameTitleCase = check_TitleCase.Checked;
+ }
+
+ #endregion
+
+ #region Picture
+
+ private void btn_vlcPath_Click(object sender, EventArgs e)
+ {
+ openFile_vlc.ShowDialog();
+ if (openFile_vlc.FileName != string.Empty)
+ txt_vlcPath.Text = openFile_vlc.FileName;
+ }
+
+ private void txt_vlcPath_TextChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.VLC_Path = txt_vlcPath.Text;
+ }
+
+ #endregion
+
+ #region Audio and Subtitles
+
+ private void drop_preferredLang_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.NativeLanguage = drop_preferredLang.SelectedItem.ToString();
+ }
+
+ private void radio_dub_CheckedChanged(object sender, EventArgs e)
+ {
+ if (radio_dub.Checked)
+ Properties.Settings.Default.DubMode = 1;
+ }
+
+ private void radio_foreignAndSubs_CheckedChanged(object sender, EventArgs e)
+ {
+ if (radio_foreignAndSubs.Checked)
+ Properties.Settings.Default.DubMode = 2;
+ }
+
+ private void radio_preferredAudioAndSubs_CheckedChanged(object sender, EventArgs e)
+ {
+ if (radio_preferredAudioAndSubs.Checked)
+ Properties.Settings.Default.DubMode = 3;
+ }
+
+ private void check_AddCCTracks_CheckedChanged(object sender, EventArgs e)
+ {
+ Settings.Default.useClosedCaption = check_AddCCTracks.Checked;
+ }
+
+ #endregion
+
+ #region CLI
+
+ private void drp_Priority_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.processPriority = drp_Priority.Text;
+ }
+
+ private void check_preventSleep_CheckedChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.preventSleep = check_preventSleep.Checked;
+ }
+
+ private void cb_logVerboseLvl_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.verboseLevel = cb_logVerboseLvl.SelectedIndex;
+ }
+
+ private void check_saveLogWithVideo_CheckedChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.saveLogWithVideo = check_saveLogWithVideo.Checked;
+ }
+
+ private void check_logsInSpecifiedLocation_CheckedChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.saveLogToSpecifiedPath = check_logsInSpecifiedLocation.Checked;
+ }
+
+ private void btn_saveLog_Click(object sender, EventArgs e)
+ {
+ pathFinder.SelectedPath = String.Empty;
+ pathFinder.ShowDialog();
+ if (pathFinder.SelectedPath != string.Empty)
+ text_logPath.Text = pathFinder.SelectedPath;
+ }
+
+ private void text_logPath_TextChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.saveLogPath = text_logPath.Text;
+ }
+
+ private void btn_viewLogs_Click(object sender, EventArgs e)
+ {
+ string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";
+ string windir = Environment.GetEnvironmentVariable("WINDIR");
+ Process prc = new Process();
+ prc.StartInfo.FileName = windir + @"\explorer.exe";
+ prc.StartInfo.Arguments = logDir;
+ prc.Start();
+ }
+
+ private void btn_clearLogs_Click(object sender, EventArgs e)
+ {
+ DialogResult result = MessageBox.Show("Are you sure you wish to clear the log file directory?", "Clear Logs",
+ MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
+ if (result == DialogResult.Yes)
+ {
+ UtilityService.ClearLogFiles(30);
+ MessageBox.Show(this, "HandBrake's Log file directory has been cleared!", "Notice", MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ }
+ }
+
+ private void check_clearOldLogs_CheckedChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.clearOldLogs = check_clearOldLogs.Checked;
+ }
+
+ #endregion
+
+ #region Advanced
+
+ private void check_mainMinimize_CheckedChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.MainWindowMinimize = check_mainMinimize.Checked;
+ check_trayStatusAlerts.Enabled = check_mainMinimize.Checked;
+ }
+
+ private void check_trayStatusAlerts_CheckedChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.trayIconAlerts = check_trayStatusAlerts.Checked;
+ }
+
+ private void check_queryEditorTab_CheckedChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.QueryEditorTab = check_queryEditorTab.Checked;
+ check_promptOnUnmatchingQueries.Enabled = check_queryEditorTab.Checked;
+ }
+
+ private void check_promptOnUnmatchingQueries_CheckedChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.PromptOnUnmatchingQueries = check_promptOnUnmatchingQueries.Checked;
+ }
+
+ private void check_disablePresetNotification_CheckedChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.presetNotification = check_disablePresetNotification.Checked;
+ }
+
+ private void check_showCliForInGUIEncode_CheckedChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.showCliForInGuiEncodeStatus = check_showCliForInGUIEncode.Checked;
+ }
+
+ private void drop_previewScanCount_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.previewScanCount = int.Parse(drop_previewScanCount.SelectedItem.ToString());
+ }
+
+ private void x264step_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ switch (drop_x264step.SelectedIndex)
+ {
+ case 0:
+ Properties.Settings.Default.x264cqstep = 1.0;
+ break;
+ case 1:
+ Properties.Settings.Default.x264cqstep = 0.50;
+ break;
+ case 2:
+ Properties.Settings.Default.x264cqstep = 0.25;
+ break;
+ case 3:
+ Properties.Settings.Default.x264cqstep = 0.20;
+ break;
+ }
+ mainWindow.setQualityFromSlider();
+ }
+
+ private void check_dvdnav_CheckedChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.noDvdNav = check_dvdnav.Checked;
+ }
+
+ #endregion
+
+ private void btn_close_Click(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.Save(); // Small hack for Vista. Seems to work fine on XP without this
+ UpdateApplicationServicesSettings();
+
+ this.Close();
+ }
+
+ /// <summary>
+ /// Initialize App Services
+ /// </summary>
+ private static void UpdateApplicationServicesSettings()
+ {
+ string versionId = String.Format(
+ "Windows GUI {1} {0}", Settings.Default.hb_build, Settings.Default.hb_version);
+ Init.SetupSettings(
+ versionId,
+ Settings.Default.hb_version,
+ Settings.Default.hb_build,
+ Program.InstanceId,
+ Settings.Default.CompletionOption,
+ Settings.Default.noDvdNav,
+ Settings.Default.growlEncode,
+ Settings.Default.growlQueue,
+ Settings.Default.processPriority,
+ Settings.Default.saveLogPath,
+ Settings.Default.saveLogToSpecifiedPath,
+ Settings.Default.saveLogWithVideo,
+ Settings.Default.showCliForInGuiEncodeStatus,
+ Settings.Default.preventSleep);
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/frmOptions.resx b/win/CS/frmOptions.resx
new file mode 100644
index 000000000..7407b5005
--- /dev/null
+++ b/win/CS/frmOptions.resx
@@ -0,0 +1,528 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="ToolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>132, 18</value>
+ </metadata>
+ <data name="cb_mp4FileMode.ToolTip" xml:space="preserve">
+ <value>The default file extension for MP4 Files.
+Automatic - This will use M4v when AC3 Audio, SRT Subtitles or Chapters are present, otherwise MP4.
+Always MP4 - The MP4 extension will always be used.
+Always M4V - The M4V extension will always be used.
+
+Note, the file itself is identical. This simply changes the default extension for MP4 files.</value>
+ </data>
+ <data name="text_an_path.ToolTip" xml:space="preserve">
+ <value>This is the default location where your encoded files will be stored if "Automatically name output files" is enabled.
+You can enter {source_path} instead of a path to use the same path as the source file.</value>
+ </data>
+ <data name="check_showCliForInGUIEncode.ToolTip" xml:space="preserve">
+ <value>Shows the CLI window when encoding.
+You may wish to enable this as you'll be able to cleanly exit the CLI using ctrl-c
+meaing you'll have playable files if you choose to end the encode early.
+
+When disabled, Presseting "Stop" on the main winow will render the encode unplayable.</value>
+ </data>
+ <metadata name="pathFinder.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+ <metadata name="openFile_vlc.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>224, 18</value>
+ </metadata>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA
+ IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA
+ AACACgAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8A/wAAAAD/AAAAAIAAgICAAICAAAAAgAAAAICAAIAA
+ AACAAIAAgP//ACAgIADg4OAAIAAAAAAgAABg4CAAQOBAAGBgYAAgYAAAQKDgAAAAIABAwCAAIEAAAECg
+ AABg4AAAIGCAAECAoABgoMAAYECgAGDAAABgICAAoKCgAOAAAAAgIAAAAGAAAEDgAABgAAAAIAAgAEAg
+ IAAgQGAAIIDAAADg4ABgAGAAgOD/ACCA/wCgAAAAQGAAACCAAAAAoAAAYCAAAAAgIAAgIEAAYGBAAEBg
+ YAAAIIAAAGCAAGCAgABAAKAAAICgAACgoACAoKAAIKDAAECgwAAAAOAAQADgAADA4ABgwOAAIODgAADg
+ AADA4AAAAEAgAKDgIAAA4EAAYABAAABAYACAAGAAgCBgAGAggABA4KAAAECgAGBAwADgIOAAIEDgAACA
+ 4ADgoOAAYAD/ACBg/wAAoP8A4KD/AGD//wAICAgACAAAAAgIAAAAAJgACAAIAAAACAAACAAACBAQACA4
+ SAAgYIgAOHCIADhw+AAIGAAAEBAIACg4QAAwYHgAAACIACA4QAAoQFAAKFh4AHh4eAAwaIAAIGiQADh4
+ mAAACAgAEAgIABAYGAAgGBgASEhIABhIYAAoUGAAIFBoAChQaAAoWGgAMFhoAChoiAAweJgAKHioACiA
+ sAAIEAAACAgQAAgQGAAQGCAAGCAoABhAUAAoSFgAaGhoABhQcAAgWHAAKFhwADhgcAAYWIAAOGiAAIiI
+ iAAoaJAAKHCYACh4oAA4gKAAMICoAKioqAAwmNAAEDgAAChYAAAweAAAMIgQAAgYGAAYGBgACBggABAg
+ KAAgKCgAKCgoACAwOAA4ODgAKDhIADBQWABYWFgAGEhoADBYcAAYUHgAGFh4ACBYeAAoYHgAKGCAABhY
+ iAAgaJgAKICoACiIuAC4uLgAMJDIADiw6AAQCAAAABgAAAggAAAAOAAAMGgAABgQCAAwgAgAEAgQABgQ
+ EAAwmBgAGBggAAgYKAAAICgACCAoABgoMAAgKDAAGDBAABg4QAAYOFAAEEBYACBIWAAwSFgAOEhYACBI
+ YAAQSGgAOFhoABhIcAAoUHAAQFhwACBgeABAaIAAIGiIADBwiABAcIgAGGCQADhwkABYeJAACBCgAChw
+ oAAweKAAKIC4ACiQwAAwmMgAOKjgADBg6ABAsOgAELD4AAgoAAAIMAAAGDAAABhIAAAYUAAAKHgAAACY
+ AAAwmAAAAMgAABAACAAIEAgAEBgIABA4CAAYOAgAMHgIABAYEAAYGBAAIBgQACh4EAAwmBAAEBAYABgg
+ GAAoIBgAGCAgAAgIKAAgICgAGAgwAAggMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAn2KfdXV1XAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoo2+QIJCJb28Sd3em
+ nQAAAFuKqW0aqsd6Y5/DXAAAAAAAAAAAAAAAAAAAAAAAAAB3kAWQkG8SpqaJb28gsncAbIeSroyii21x
+ kczIwwAAAAAAAAAAAAAAAAAAAAAAAABoo4mJkLKylm9vb5BvdwwAcZO/fox7z2NjqsOss2MAWwAAAAAA
+ AAAAAAAAAAAAAAAAvaGmo5ANlgUFEiBvo1xjq3p6qMTJroBkxXt9cGzFnAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAL2ylgV3vQAAAGOvxMXXq41uh6yVjxqp1YhknwAAAAAAAAAAAAAAAAAAAAAAAAAAAABvsolbAAAA
+ +5KneouS2Kx4pZF9ndywsXuvkocAAAAAAAAAAAAAAAAAAAAAAAAAAAB3sncAAAAAdayHca95bH9+cKmv
+ fMVucG2B4MYAAAAAAAAAAAAAAAAAAAAAAAAAAAChsqMAAAAAe3VkyHF5kW59cN3eZc/XyXutyot7AAAA
+ AAAAAAAAAAAAAAAAAAAAAACjIKEAAACgfv94gX+PituLDI0/aoBxqxqOY8PgbQAAAAAAAAAAAAAAAAAA
+ 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
+ OAAABwAA//wYAAADAAD/+BgAAAMAAP/AAAAAAwAA/wAAAAADAAD8AAAAAAMAAPwAAAAAAwAA+AAAAAAD
+ AADwAAAAAAMAAPAAAAAAAwAA8AAAAAADAADwAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAQAA8AAPAA
+ ABgADwAA+AAAHgAHAAD8AAAfgAMAAP4QAA+ADwAA/gAADgADAAD8AAAfAAMAAPAfxD/ABwAA4B/n/+AB
+ AADgB+B/wB8AAOADgB+ADwAA8AOAHhAPAAD4BwB/8kcAAPz/gf/nLwAA+P/5/+8/AADwf/n//z8AAPh/
+ /P//vwAA+P////+fAAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//
+ /wAAAP8AAP//AAAAgACAgIAAgAAAAACAAAAAgIAAgIAAAECg4ABAgKAAYOAgAEDgQAAAIAAAACAgACAg
+ IABgIIAAIAAAACBAAAAAYAAAIIAAAGAgIABAYGAAAACgAGCAoACgoKAA4ODgAGDAAAAAACAAYABgAIAg
+ YAAAYMAAICAAACBgAABgYAAAQKAAAKDAAAAA4AAAYOAAAABAIAAgQCAAYAAgACBAQABgYEAAIABgACAg
+ YAAgQGAAYGBgACBggABgYIAAgACgAKCAoABgIMAAQKDAAGCgwAAgwMAAAADgAIDA4ACgwOAAAODgAIDg
+ 4ACA4AAAgIAgAEDgIACgACAAQABgAIAggAAgYP8AAKD/AAgIAAAICAgACAAAABhAWAAoUGAAaGhoADBg
+ eAAoaIgAMICoAChggAAACAgAEAgIABgYGAAoUGgAKFhwAChwkAAIGAgACBAQABAgKAAQKDgAIEhgACBQ
+ aAAAAHgAIFh4AChgeAAAeHgAeHh4AChogAAwaIAAIGCIADBoiAA4cIgAIGiQADhwkAAoeKgAKICwAAgQ
+ AAAIIAAACAAIABhICAAICBAAMIgQABAYGAAYICgAGCgwAEhISAAwSFgAGFBoAChYaAAICHgAOGiAACh4
+ oAAweKAAGAAAAAAIAAAAGAAACBgAABAoAAAYUAAAKGAAAChoAAAAeAAAAAAIAAgQCAAQEAgAGP8IACAY
+ EAAIEBgAMJAYABggIAAAACgACBAoACgwMAAAKDgAEDA4ADg4OAAoOEAAGDhIACA4SAAAQEgAMEBIAEhQ
+ UAAISFgAIEhYAChIWAAwUFgAIEhoAEhYaAAYUHAAMFhwABhYeAAoWHgAIFiAAEhwgACIiIgAGGCQAAAA
+ mAAgcJgAKHCYADB4mACYmJgAACjIAEBw+ACo//8ASAAAAFgAAABoAAAAeAAAABAIAABICAAAGCgAAAA4
+ AAAYOAAACEAAAAhIAAAoUAAAAFgAACBYAAAAaAAAIGgAADB4AAAAiAAAMIgAAGiIAACAmAAAGAAIADAI
+ CABgCAgAEBgIAAggCAAQIAgAECgIAAgwCAAQMAgAODAIABA4CAAYOAgAEEAIABhACAAgQAgAIFAIAChg
+ CAAwgAgAMJAIADCoCAAACBAAGBAQABggEAAoIBAAKGAQAChoEAAgeBAAKHgQAEh4EAAY+BAACAAYAAAI
+ GAAICBgAEAgYAAAQGAAQEBgAABgYAAgYGAAYMBgAKHgYADCYGAAwoBgAMKgYAGj/GABgCCAACBAgAAgY
+ IAAQGCAAGBggACggIABIcCAACAAoABAAKAAAECgAEBAoAAggKAAACDAASAgwAAgQMAAIKDAAECgwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAARxBSUlJHAAAAAABYWFlY8kYAAAAAAAAAAAAAAAAAAJFgqqRLSzAwBXMAkKJbW1pdSVmE
+ AAAAAAAAAAAAAAAAEJdLqhpgYKQFkf9NmVRanHVJVZRQAAAAAAAAAAAAAAAAUY6RO6qXMHNYW5MxdFpm
+ TVtPSpAAAAAAAAAAAAAAAAAAAAAFpIYAAFSeW09PU15KU05MaEkAAAAAAAAAAAAAAAAAAEtgAAAAk55j
+ ml5Mp2haXUqpW3IAAAAAAAAAAAAAAAAAS0sAAEpJoE5PpZpMZVWnMZyZVQAAAAAAAAAAAAAAAABLMAAA
+ cqCeSnppZGZKWzFNaV2ecAAAAAAAAAAAAAAAAEtLAACLVF6iZHROp2eiW1paeWnxAAAAAAAAAAAAAABI
+ GmAAAElJSmh6SWNVSk5hZqJ1VXUAAAAAAAAAAAAAlpmjeJAAk12eZXZ5p3WndnZpaUlbZgAAAAAAAAAA
+ m2lFRTw8PDZeWV1OlE0xeWlNeVVdZmmZUAAAAAAAjzYKRaysRUVFRa02SXSnYaFNTUxpTFSoTmKTAAAA
+ AI8KOkSrrKysrKxErDullF6fVWhiVakLaVWbVZoAAAAAqK2sRKZEqyCsRKummKBZT0xPTHppZVMLqVN4
+ cQAAAAA6O6sYGKYYGKsYphgELjejY09KTTZNaWdMNpkAAAAA+zc6XFxcd3d3XASmXEw6PZZiZ6g2ZUw2
+ T2QLnwAAAAAdoTtcLcV3pndfLi2jraMtcmNkT05np0xnaXhUAAAAAAD5NKL87xgYd1+eLZ06+1wAVE6o
+ p2cKZ2WjjgAAAAAAAAAQo67EcuZuj5jkACue9gAAkTEKeJfbioptRgAAAAAAAACIr0dLVwBXmEeL5Qg4
+ AAAAAOnqwNbVb9O5AAAAAAAAAP38RmDae3tfkDqIX0UAAABq3W9v6+2BtssAAAAAAAD9q6v7AFl1dV9f
+ mpgIXwAAAABrtG9v7O2BagAAAACSF52fL/AAAAAAAHUAAAAAAAAAAACC1NS+3s/ZzAAAAJ03MjqjdJ0A
+ AAC3FIMUtwAAAAAAzr27goK5awAAAAAAWaNgGho3dAAAyr+/v4ODtQAAAMmAAM+2zxMTawAAAAAAAK6z
+ kZ1xAAC1un3HVwAAAAAAAAAAawB/ftAAAAAAAABCNUIAAAAAAAAAAF8AAAAAAAAAAEcAAGpGAAAAAAAA
+ AEKsEQAAAAAAAAAAlZUAAAAAAAAAAAAAAEgAAAAAAAAAAC3hAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAA
+ AAD///////////4BwH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAA
+ AAHgAAAB4AAAAeAAAAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9
+ /s/j/P/v8///7ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AFEl
+ swBJDW0ABEMwAAJHSQAFDwIAXl9ZAHJtagBwfYQAQVNqAAFtAAAAZgAAAz0CABQ/AQAXQwAAGkAAAA8g
+ AQAhSJQAM1SRABw6fgAFVk0ADE48AAplaQAgWgIAMYcMACl7CwAOJwMAAAMtABwPNwAhIQAABxACAA9S
+ UAAnQUgAAISfACRoDAAxmwQAK4MHABMpAAA8P1kATBMbACQSVwAKL1EADS5CADFMVQABIF4AJ3CGADB2
+ kAAzdlEAMnY1ABMnEwBARooAVVq5ABgATwAWBn0ABh56AAULaQBOeKYAT3WSACpNZwAucpgAMHifADFx
+ nwA1b5YAMF93AEBalgBvjecADCLAAAkPpQAbJr4AFiLGAAAJjgAzbIEANGh8AClhgAAzfKEAMHWWADJz
+ kwAsW3MAQ4mvADyY9AAtgf8AIpr/ACuk/wBdk9UAG0tkACladQAqbI4AK3GUAC5vjwArbpEALWJ7ACdl
+ aAAOaoQAJJ20ABx0gQAeTF8AJ116ACViggAgZosAJmeJAChvlAAhZIgAH1ZyAHVmYwAaPVMAJ19+ACto
+ hgAmaIwAKGB9ACFdfAAgY4YAGU5qAFtgYQAYQVgAIVx7ACtrjgAtZYIAJmKAACNhgQAmX3wAIUpdAHp6
+ ewARN0wAH1R0ACdXcgApXnoAJ2B+ACligQAdSmAAKiopAGZlZQCRkZEAbm9vAFFSUwAWO08AJFRuACFP
+ agAhUm0AHD9RAAMKDgA3NjUAWlpaADk5OQA3NzcAPDk3AAYSGQAVNUgAFjFAAA8jLwABAgQAVQAAAP//
+ /wBWAAAA/f//AFcAAAD8//8AWAAAAPz//wBZAAAA/P//AFoAAAD9//8AWwAAAP7//wBcAAAA////AF4A
+ AAABAAAAXwAAAAEAAABgAAAAAQAAAGEAAAABAAAAYgAAAAEAAAB3IFIAbWFuAAAAAAAAAAAAAAAAAAAA
+ AAC0VWMAtFVjALwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAEAAAAAADgDAACfAQAAPwAAAAEA
+ AABAAAAAAQAAAEEAAAABAAAAQgAAAAEAAABFAAAA////AEYAAAD+//8ARwAAAP3//wBIAAAA/P//AEkA
+ AAD8//8ASgAAAPz//wBLAAAA/f//AEwAAAD///8ATQAAAAMAAABOAAAABwAAAE8AAAALAAAAUAAAABAA
+ AABRAAAAFQAAAFIAAAAZAAAAUwAAABwAAABUAAAAHgAAAFUAAAAeAAAAVgAAAB0AAABXAAAAGgAAAFgA
+ AAAWAAAAWQAAABIAAABaAAAADQAAAFsAAAAIAAAAXAAAAAQAAABeAAAA/v//AF8AAAD8//8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAI2Oj5CRkpOUlZYAAAAAAACCg4SFhoeIiYqLjAAAAAAAAAB6AHt8fX5/gIEAAAAA
+ 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
+</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/win/CS/frmPreview.Designer.cs b/win/CS/frmPreview.Designer.cs
new file mode 100644
index 000000000..729e65b2b
--- /dev/null
+++ b/win/CS/frmPreview.Designer.cs
@@ -0,0 +1,229 @@
+namespace Handbrake
+{
+ partial class frmPreview
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ if (components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmPreview));
+ this.toolBar = new System.Windows.Forms.ToolStrip();
+ this.lbl_preview = new System.Windows.Forms.ToolStripLabel();
+ this.cb_preview = new System.Windows.Forms.ToolStripComboBox();
+ this.toolStripLabel2 = new System.Windows.Forms.ToolStripLabel();
+ this.cb_duration = new System.Windows.Forms.ToolStripComboBox();
+ this.btn_playQT = new System.Windows.Forms.ToolStripButton();
+ this.btn_playVLC = new System.Windows.Forms.ToolStripButton();
+ this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+ this.ProgressBarStatus = new System.Windows.Forms.ToolStripProgressBar();
+ this.lbl_encodeStatus = new System.Windows.Forms.ToolStripLabel();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.QTControl = new AxQTOControlLib.AxQTControl();
+ this.toolBar.SuspendLayout();
+ this.panel1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.QTControl)).BeginInit();
+ this.SuspendLayout();
+ //
+ // toolBar
+ //
+ this.toolBar.AutoSize = false;
+ this.toolBar.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
+ this.toolBar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.lbl_preview,
+ this.cb_preview,
+ this.toolStripLabel2,
+ this.cb_duration,
+ this.btn_playQT,
+ this.btn_playVLC,
+ this.toolStripSeparator1,
+ this.ProgressBarStatus,
+ this.lbl_encodeStatus});
+ this.toolBar.Location = new System.Drawing.Point(0, 0);
+ this.toolBar.Name = "toolBar";
+ this.toolBar.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional;
+ this.toolBar.Size = new System.Drawing.Size(722, 25);
+ this.toolBar.TabIndex = 37;
+ this.toolBar.Text = "toolStrip1";
+ //
+ // lbl_preview
+ //
+ this.lbl_preview.BackColor = System.Drawing.Color.Transparent;
+ this.lbl_preview.Name = "lbl_preview";
+ this.lbl_preview.Size = new System.Drawing.Size(91, 22);
+ this.lbl_preview.Text = "Start at Preview:";
+ //
+ // cb_preview
+ //
+ this.cb_preview.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.cb_preview.DropDownWidth = 75;
+ this.cb_preview.FlatStyle = System.Windows.Forms.FlatStyle.Standard;
+ this.cb_preview.Font = new System.Drawing.Font("Tahoma", 9F);
+ this.cb_preview.Items.AddRange(new object[] {
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10"});
+ this.cb_preview.Name = "cb_preview";
+ this.cb_preview.Size = new System.Drawing.Size(75, 25);
+ //
+ // toolStripLabel2
+ //
+ this.toolStripLabel2.BackColor = System.Drawing.Color.Transparent;
+ this.toolStripLabel2.Name = "toolStripLabel2";
+ this.toolStripLabel2.Size = new System.Drawing.Size(107, 22);
+ this.toolStripLabel2.Text = "Duration (seconds)";
+ //
+ // cb_duration
+ //
+ this.cb_duration.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.cb_duration.DropDownWidth = 75;
+ this.cb_duration.FlatStyle = System.Windows.Forms.FlatStyle.Standard;
+ this.cb_duration.Font = new System.Drawing.Font("Tahoma", 9F);
+ this.cb_duration.Items.AddRange(new object[] {
+ "5",
+ "10",
+ "15",
+ "20",
+ "25",
+ "30",
+ "35",
+ "40",
+ "45",
+ "50",
+ "55",
+ "60"});
+ this.cb_duration.Margin = new System.Windows.Forms.Padding(0);
+ this.cb_duration.Name = "cb_duration";
+ this.cb_duration.Size = new System.Drawing.Size(75, 25);
+ //
+ // btn_playQT
+ //
+ this.btn_playQT.Image = global::Handbrake.Properties.Resources.Play_small;
+ this.btn_playQT.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.btn_playQT.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btn_playQT.Name = "btn_playQT";
+ this.btn_playQT.Size = new System.Drawing.Size(96, 22);
+ this.btn_playQT.Text = "Play with QT";
+ this.btn_playQT.Click += new System.EventHandler(this.PlayQtClick);
+ //
+ // btn_playVLC
+ //
+ this.btn_playVLC.Image = global::Handbrake.Properties.Resources.Play_small;
+ this.btn_playVLC.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.btn_playVLC.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btn_playVLC.Name = "btn_playVLC";
+ this.btn_playVLC.Size = new System.Drawing.Size(101, 22);
+ this.btn_playVLC.Text = "Play with VLC";
+ this.btn_playVLC.Click += new System.EventHandler(this.PlayVlcClick);
+ //
+ // toolStripSeparator1
+ //
+ this.toolStripSeparator1.Name = "toolStripSeparator1";
+ this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);
+ //
+ // ProgressBarStatus
+ //
+ this.ProgressBarStatus.Name = "ProgressBarStatus";
+ this.ProgressBarStatus.Size = new System.Drawing.Size(100, 22);
+ this.ProgressBarStatus.Visible = false;
+ //
+ // lbl_encodeStatus
+ //
+ this.lbl_encodeStatus.Name = "lbl_encodeStatus";
+ this.lbl_encodeStatus.Size = new System.Drawing.Size(38, 22);
+ this.lbl_encodeStatus.Text = "0.00%";
+ this.lbl_encodeStatus.Visible = false;
+ //
+ // panel1
+ //
+ this.panel1.AutoSize = true;
+ this.panel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+ this.panel1.Controls.Add(this.QTControl);
+ this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.panel1.Location = new System.Drawing.Point(0, 25);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(722, 481);
+ this.panel1.TabIndex = 40;
+ //
+ // QTControl
+ //
+ this.QTControl.Enabled = true;
+ this.QTControl.Location = new System.Drawing.Point(0, 0);
+ this.QTControl.Name = "QTControl";
+ this.QTControl.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("QTControl.OcxState")));
+ this.QTControl.Size = new System.Drawing.Size(64, 72);
+ this.QTControl.TabIndex = 39;
+ this.QTControl.Visible = false;
+ //
+ // frmPreview
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.AutoSize = true;
+ this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+ this.BackColor = System.Drawing.Color.Black;
+ this.ClientSize = new System.Drawing.Size(722, 506);
+ this.Controls.Add(this.panel1);
+ this.Controls.Add(this.toolBar);
+ this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MinimumSize = new System.Drawing.Size(730, 32);
+ this.Name = "frmPreview";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "Video Preview";
+ this.toolBar.ResumeLayout(false);
+ this.toolBar.PerformLayout();
+ this.panel1.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.QTControl)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.ToolStrip toolBar;
+ private System.Windows.Forms.ToolStripButton btn_playQT;
+ private AxQTOControlLib.AxQTControl QTControl;
+ private System.Windows.Forms.ToolStripComboBox cb_preview;
+ private System.Windows.Forms.ToolStripLabel lbl_preview;
+ private System.Windows.Forms.ToolStripLabel toolStripLabel2;
+ private System.Windows.Forms.ToolStripComboBox cb_duration;
+ private System.Windows.Forms.ToolStripButton btn_playVLC;
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+ private System.Windows.Forms.ToolStripProgressBar ProgressBarStatus;
+ private System.Windows.Forms.ToolStripLabel lbl_encodeStatus;
+ }
+} \ No newline at end of file
diff --git a/win/CS/frmPreview.cs b/win/CS/frmPreview.cs
new file mode 100644
index 000000000..10bd1cf4c
--- /dev/null
+++ b/win/CS/frmPreview.cs
@@ -0,0 +1,443 @@
+/* frmPreview.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake
+{
+ using System;
+ using System.Diagnostics;
+ using System.IO;
+ using System.Runtime.InteropServices;
+ using System.Threading;
+ using System.Windows;
+ using System.Windows.Forms;
+ using Functions;
+
+ using HandBrake.ApplicationServices.Model;
+ using HandBrake.ApplicationServices.Services;
+ using HandBrake.ApplicationServices.Services.Interfaces;
+
+ using QTOControlLib;
+ using QTOLibrary;
+
+ using MessageBox = System.Windows.Forms.MessageBox;
+
+ /// <summary>
+ /// The Preview Window
+ /// </summary>
+ public partial class frmPreview : Form
+ {
+ #region Private Variables
+
+ /// <summary>
+ /// The Main Window
+ /// </summary>
+ private readonly frmMain mainWindow;
+
+ /// <summary>
+ /// True if QT is not installed
+ /// </summary>
+ private readonly bool noQt;
+
+ /// <summary>
+ /// The encode queue
+ /// </summary>
+ private readonly IEncode encodeQueue = new Encode();
+
+ /// <summary>
+ /// What is currently playing
+ /// </summary>
+ private string currentlyPlaying = string.Empty;
+
+ /// <summary>
+ /// Play With VLC tracker
+ /// </summary>
+ private bool playWithVlc;
+
+ /// <summary>
+ /// A Thread for the video player
+ /// </summary>
+ private Thread player;
+
+ #endregion
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="frmPreview"/> class.
+ /// </summary>
+ /// <param name="mw">
+ /// The mw.
+ /// </param>
+ public frmPreview(frmMain mw)
+ {
+ try
+ {
+ InitializeComponent();
+ }
+ catch (Exception)
+ {
+ this.noQt = true;
+
+ int borderWidth = (this.Width - this.ClientSize.Width) / 2;
+ int titlebarAndBorder = this.Height - this.ClientSize.Height;
+
+ this.Height = toolBar.Height + titlebarAndBorder + 1;
+ btn_playQT.Enabled = false;
+ btn_playQT.Visible = false;
+ }
+
+ this.mainWindow = mw;
+
+ cb_preview.SelectedIndex = 0;
+ cb_duration.SelectedIndex = 1;
+
+ cb_preview.Items.Clear();
+ for (int i = 1; i <= Properties.Settings.Default.previewScanCount; i++)
+ {
+ cb_preview.Items.Add(i.ToString());
+ }
+
+ cb_preview.SelectedIndex = 0;
+
+ encodeQueue.EncodeStarted += this.EncodeQueueEncodeStarted;
+ encodeQueue.EncodeCompleted += this.EncodeQueueEncodeEnded;
+ }
+
+ #region Delegates
+ /// <summary>
+ /// Update UI Delegate
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private delegate void UpdateUiHandler(object sender, EventArgs e);
+
+ /// <summary>
+ /// The Open Movie Handler
+ /// </summary>
+ private delegate void OpenMovieHandler();
+ #endregion
+
+ #region Event Handlers
+ /// <summary>
+ /// The encode has started
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void EncodeQueueEncodeStarted(object sender, EventArgs e)
+ {
+ encodeQueue.EncodeStatusChanged += this.EncodeQueueEncodeStatusChanged;
+ }
+
+ /// <summary>
+ /// The Enocde has ended
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void EncodeQueueEncodeEnded(object sender, EventArgs e)
+ {
+ encodeQueue.EncodeStatusChanged -= this.EncodeQueueEncodeStatusChanged;
+
+ try
+ {
+ if (this.InvokeRequired)
+ {
+ this.BeginInvoke(new UpdateUiHandler(EncodeQueueEncodeEnded), new[] { sender, e });
+ return;
+ }
+
+ ProgressBarStatus.Visible = false;
+ lbl_encodeStatus.Visible = false;
+
+ if (!this.noQt)
+ btn_playQT.Enabled = true;
+ btn_playVLC.Enabled = true;
+
+ this.Text = this.Text.Replace(" (Encoding)", string.Empty);
+
+ // Get the sample filename
+ if (this.mainWindow.text_destination.Text != string.Empty)
+ this.currentlyPlaying =
+ this.mainWindow.text_destination.Text.Replace(".mp4", "_sample.mp4").Replace(".m4v", "_sample.m4v").
+ Replace(".mkv", "_sample.mkv");
+
+ // Play back in QT or VLC
+ if (!playWithVlc)
+ Play();
+ else
+ PlayVlc();
+ }
+ catch (Exception exc)
+ {
+ Main.ShowExceptiowWindow("An Unexpected error has occured", exc.ToString());
+ }
+ }
+
+ /// <summary>
+ /// Encode status has changed
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void EncodeQueueEncodeStatusChanged(object sender, HandBrake.ApplicationServices.EventArgs.EncodeProgressEventArgs e)
+ {
+ if (this.InvokeRequired)
+ {
+ this.BeginInvoke(new EncodeProgessStatus(this.EncodeQueueEncodeStatusChanged), new[] { sender, e });
+ return;
+ }
+
+ lbl_encodeStatus.Text = e.PercentComplete + "%";
+ ProgressBarStatus.Value = (int)Math.Round(e.PercentComplete);
+ }
+ #endregion
+
+ #region Encode Sample
+
+ /// <summary>
+ /// Play with VLC
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void PlayVlcClick(object sender, EventArgs e)
+ {
+ ProgressBarStatus.Visible = true;
+ ProgressBarStatus.Value = 0;
+ lbl_encodeStatus.Visible = true;
+ playWithVlc = true;
+ this.panel1.Visible = false;
+
+ try
+ {
+ if (!this.noQt)
+ QTControl.URL = string.Empty;
+
+ if (File.Exists(this.currentlyPlaying))
+ File.Delete(this.currentlyPlaying);
+ }
+ catch (Exception)
+ {
+ MessageBox.Show(this, "Unable to delete previous preview file. You may need to restart the application.",
+ "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+
+ btn_playQT.Enabled = false;
+ btn_playVLC.Enabled = false;
+ this.Text += " (Encoding)";
+ int duration;
+ int.TryParse(cb_duration.Text, out duration);
+ string query = QueryGenerator.GeneratePreviewQuery(this.mainWindow, duration, cb_preview.Text);
+ ThreadPool.QueueUserWorkItem(this.CreatePreview, query);
+ }
+
+ /// <summary>
+ /// Encode and Play with QT
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void PlayQtClick(object sender, EventArgs e)
+ {
+ playWithVlc = false;
+ this.panel1.Visible = true;
+ if (this.noQt)
+ {
+ MessageBox.Show(this,
+ "It would appear QuickTime 7 is not installed or not accessible. Please (re)install QuickTime.",
+ "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ return;
+ }
+ if (this.mainWindow.text_destination.Text.Contains(".mkv"))
+ {
+ MessageBox.Show(this,
+ "The QuickTime Control does not support MKV files, It is recommended you use the VLC option instead.",
+ "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ }
+ else
+ {
+ ProgressBarStatus.Visible = true;
+ ProgressBarStatus.Value = 0;
+ lbl_encodeStatus.Visible = true;
+ try
+ {
+ QTControl.URL = string.Empty;
+ if (File.Exists(this.currentlyPlaying))
+ File.Delete(this.currentlyPlaying);
+ }
+ catch (Exception)
+ {
+ MessageBox.Show(this,
+ "Unable to delete previous preview file. You may need to restart the application.",
+ "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+
+ btn_playQT.Enabled = false;
+ btn_playVLC.Enabled = false;
+ this.Text += " (Encoding)";
+ int duration;
+ int.TryParse(cb_duration.Text, out duration);
+ string query = QueryGenerator.GeneratePreviewQuery(this.mainWindow, duration, cb_preview.Text);
+
+ ThreadPool.QueueUserWorkItem(this.CreatePreview, query);
+ }
+ }
+
+ /// <summary>
+ /// Create the Preview.
+ /// </summary>
+ /// <param name="state">
+ /// The state.
+ /// </param>
+ private void CreatePreview(object state)
+ {
+ // Make sure we are not already encoding and if we are then display an error.
+ if (encodeQueue.IsEncoding)
+ {
+ MessageBox.Show(
+ this,
+ "Handbrake is already encoding a video!",
+ "Warning",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Warning);
+
+ return;
+ }
+
+ QueueTask task = new QueueTask((string)state);
+ encodeQueue.Start(task, false);
+ }
+
+ #endregion
+
+ #region Playback
+
+ /// <summary>
+ /// Play the video back in the QuickTime control
+ /// </summary>
+ private void Play()
+ {
+ this.player = new Thread(OpenMovie) { IsBackground = true };
+ this.player.Start();
+ }
+
+ /// <summary>
+ /// Play the video back in an external VLC Player
+ /// </summary>
+ private void PlayVlc()
+ {
+ // Launch VLC and Play video.
+ if (this.currentlyPlaying != string.Empty)
+ {
+ if (File.Exists(this.currentlyPlaying))
+ {
+ // Attempt to find VLC if it doesn't exist in the default set location.
+ string vlcPath;
+
+ if (8 == IntPtr.Size ||
+ (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))))
+ vlcPath = Environment.GetEnvironmentVariable("ProgramFiles(x86)");
+ else
+ vlcPath = Environment.GetEnvironmentVariable("ProgramFiles");
+
+ vlcPath = vlcPath != null
+ ? vlcPath + @"\VideoLAN\VLC\vlc.exe"
+ : @"C:\Program Files (x86)\VideoLAN\VLC\vlc.exe";
+
+ if (!File.Exists(Properties.Settings.Default.VLC_Path))
+ {
+ if (File.Exists(vlcPath))
+ {
+ Properties.Settings.Default.VLC_Path = "C:\\Program Files (x86)\\VideoLAN\\VLC\\vlc.exe";
+ Properties.Settings.Default.Save(); // Save this new path if it does
+ }
+ else
+ {
+ MessageBox.Show(this,
+ "Unable to detect VLC Player. \nPlease make sure VLC is installed and the directory specified in HandBrake's options is correct. (See: \"Tools Menu > Options > Picture Tab\") ",
+ "VLC", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ }
+ }
+
+ if (File.Exists(Properties.Settings.Default.VLC_Path))
+ {
+ string args = "\"" + this.currentlyPlaying + "\"";
+ ProcessStartInfo vlc = new ProcessStartInfo(Properties.Settings.Default.VLC_Path, args);
+ Process.Start(vlc);
+ }
+ }
+ else
+ MessageBox.Show(this,
+ "Unable to find the preview file. Either the file was deleted or the encode failed. Check the activity log for details.",
+ "VLC", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ }
+ }
+
+ /// <summary>
+ /// QT control - Open the file
+ /// </summary>
+ [STAThread]
+ private void OpenMovie()
+ {
+ try
+ {
+ if (InvokeRequired)
+ {
+ BeginInvoke(new OpenMovieHandler(OpenMovie));
+ return;
+ }
+ QTControl.URL = this.currentlyPlaying;
+ QTControl.SetSizing(QTSizingModeEnum.qtControlFitsMovie, true);
+ QTControl.URL = this.currentlyPlaying;
+ QTControl.Show();
+
+ this.ClientSize = QTControl.Size;
+ this.Height += toolBar.Height;
+ }
+ catch (COMException ex)
+ {
+ QTUtils qtu = new QTUtils();
+ Main.ShowExceptiowWindow("Unable to open movie.", ex + Environment.NewLine + qtu.QTErrorFromErrorCode(ex.ErrorCode));
+ }
+ catch (Exception ex)
+ {
+ Main.ShowExceptiowWindow("Unable to open movie.", ex.ToString());
+ }
+ }
+
+ #endregion
+
+ /// <summary>
+ /// Remove any subscribed events then close.
+ /// </summary>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
+ {
+ encodeQueue.EncodeStarted -= this.EncodeQueueEncodeStarted;
+ encodeQueue.EncodeCompleted -= this.EncodeQueueEncodeEnded;
+ base.OnClosing(e);
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/frmPreview.resx b/win/CS/frmPreview.resx
new file mode 100644
index 000000000..85ca67137
--- /dev/null
+++ b/win/CS/frmPreview.resx
@@ -0,0 +1,512 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="toolBar.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+ <data name="QTControl.OcxState" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>
+ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
+ LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACFTeXN0
+ ZW0uV2luZG93cy5Gb3Jtcy5BeEhvc3QrU3RhdGUBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAVQAAAAIB
+ AAAAAQAAAAAAAAAAAAAAAEAAAAAACAAAnQYAAHEHAAATAA8AAIATAAAAAAADAAAAAAALAP//AwAAAAAA
+ CAACAAAAAAAIAAIAAAAAAAgAAgAAAAAACw==
+</value>
+ </data>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA
+ IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA
+ AACACgAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8A/wAAAAD/AAAAAIAAgICAAICAAAAAgAAAAICAAIAA
+ AACAAIAAgP//ACAgIADg4OAAIAAAAAAgAABg4CAAQOBAAGBgYAAgYAAAQKDgAAAAIABAwCAAIEAAAECg
+ AABg4AAAIGCAAECAoABgoMAAYECgAGDAAABgICAAoKCgAOAAAAAgIAAAAGAAAEDgAABgAAAAIAAgAEAg
+ IAAgQGAAIIDAAADg4ABgAGAAgOD/ACCA/wCgAAAAQGAAACCAAAAAoAAAYCAAAAAgIAAgIEAAYGBAAEBg
+ YAAAIIAAAGCAAGCAgABAAKAAAICgAACgoACAoKAAIKDAAECgwAAAAOAAQADgAADA4ABgwOAAIODgAADg
+ AADA4AAAAEAgAKDgIAAA4EAAYABAAABAYACAAGAAgCBgAGAggABA4KAAAECgAGBAwADgIOAAIEDgAACA
+ 4ADgoOAAYAD/ACBg/wAAoP8A4KD/AGD//wAICAgACAAAAAgIAAAAAJgACAAIAAAACAAACAAACBAQACA4
+ SAAgYIgAOHCIADhw+AAIGAAAEBAIACg4QAAwYHgAAACIACA4QAAoQFAAKFh4AHh4eAAwaIAAIGiQADh4
+ mAAACAgAEAgIABAYGAAgGBgASEhIABhIYAAoUGAAIFBoAChQaAAoWGgAMFhoAChoiAAweJgAKHioACiA
+ sAAIEAAACAgQAAgQGAAQGCAAGCAoABhAUAAoSFgAaGhoABhQcAAgWHAAKFhwADhgcAAYWIAAOGiAAIiI
+ iAAoaJAAKHCYACh4oAA4gKAAMICoAKioqAAwmNAAEDgAAChYAAAweAAAMIgQAAgYGAAYGBgACBggABAg
+ KAAgKCgAKCgoACAwOAA4ODgAKDhIADBQWABYWFgAGEhoADBYcAAYUHgAGFh4ACBYeAAoYHgAKGCAABhY
+ iAAgaJgAKICoACiIuAC4uLgAMJDIADiw6AAQCAAAABgAAAggAAAAOAAAMGgAABgQCAAwgAgAEAgQABgQ
+ EAAwmBgAGBggAAgYKAAAICgACCAoABgoMAAgKDAAGDBAABg4QAAYOFAAEEBYACBIWAAwSFgAOEhYACBI
+ YAAQSGgAOFhoABhIcAAoUHAAQFhwACBgeABAaIAAIGiIADBwiABAcIgAGGCQADhwkABYeJAACBCgAChw
+ oAAweKAAKIC4ACiQwAAwmMgAOKjgADBg6ABAsOgAELD4AAgoAAAIMAAAGDAAABhIAAAYUAAAKHgAAACY
+ AAAwmAAAAMgAABAACAAIEAgAEBgIABA4CAAYOAgAMHgIABAYEAAYGBAAIBgQACh4EAAwmBAAEBAYABgg
+ GAAoIBgAGCAgAAgIKAAgICgAGAgwAAggMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAn2KfdXV1XAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoo2+QIJCJb28Sd3em
+ nQAAAFuKqW0aqsd6Y5/DXAAAAAAAAAAAAAAAAAAAAAAAAAB3kAWQkG8SpqaJb28gsncAbIeSroyii21x
+ kczIwwAAAAAAAAAAAAAAAAAAAAAAAABoo4mJkLKylm9vb5BvdwwAcZO/fox7z2NjqsOss2MAWwAAAAAA
+ AAAAAAAAAAAAAAAAvaGmo5ANlgUFEiBvo1xjq3p6qMTJroBkxXt9cGzFnAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAL2ylgV3vQAAAGOvxMXXq41uh6yVjxqp1YhknwAAAAAAAAAAAAAAAAAAAAAAAAAAAABvsolbAAAA
+ +5KneouS2Kx4pZF9ndywsXuvkocAAAAAAAAAAAAAAAAAAAAAAAAAAAB3sncAAAAAdayHca95bH9+cKmv
+ fMVucG2B4MYAAAAAAAAAAAAAAAAAAAAAAAAAAAChsqMAAAAAe3VkyHF5kW59cN3eZc/XyXutyot7AAAA
+ AAAAAAAAAAAAAAAAAAAAAACjIKEAAACgfv94gX+PituLDI0/aoBxqxqOY8PgbQAAAAAAAAAAAAAAAAAA
+ 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
+ OAAABwAA//wYAAADAAD/+BgAAAMAAP/AAAAAAwAA/wAAAAADAAD8AAAAAAMAAPwAAAAAAwAA+AAAAAAD
+ AADwAAAAAAMAAPAAAAAAAwAA8AAAAAADAADwAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAQAA8AAPAA
+ ABgADwAA+AAAHgAHAAD8AAAfgAMAAP4QAA+ADwAA/gAADgADAAD8AAAfAAMAAPAfxD/ABwAA4B/n/+AB
+ AADgB+B/wB8AAOADgB+ADwAA8AOAHhAPAAD4BwB/8kcAAPz/gf/nLwAA+P/5/+8/AADwf/n//z8AAPh/
+ /P//vwAA+P////+fAAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//
+ /wAAAP8AAP//AAAAgACAgIAAgAAAAACAAAAAgIAAgIAAAECg4ABAgKAAYOAgAEDgQAAAIAAAACAgACAg
+ IABgIIAAIAAAACBAAAAAYAAAIIAAAGAgIABAYGAAAACgAGCAoACgoKAA4ODgAGDAAAAAACAAYABgAIAg
+ YAAAYMAAICAAACBgAABgYAAAQKAAAKDAAAAA4AAAYOAAAABAIAAgQCAAYAAgACBAQABgYEAAIABgACAg
+ YAAgQGAAYGBgACBggABgYIAAgACgAKCAoABgIMAAQKDAAGCgwAAgwMAAAADgAIDA4ACgwOAAAODgAIDg
+ 4ACA4AAAgIAgAEDgIACgACAAQABgAIAggAAgYP8AAKD/AAgIAAAICAgACAAAABhAWAAoUGAAaGhoADBg
+ eAAoaIgAMICoAChggAAACAgAEAgIABgYGAAoUGgAKFhwAChwkAAIGAgACBAQABAgKAAQKDgAIEhgACBQ
+ aAAAAHgAIFh4AChgeAAAeHgAeHh4AChogAAwaIAAIGCIADBoiAA4cIgAIGiQADhwkAAoeKgAKICwAAgQ
+ AAAIIAAACAAIABhICAAICBAAMIgQABAYGAAYICgAGCgwAEhISAAwSFgAGFBoAChYaAAICHgAOGiAACh4
+ oAAweKAAGAAAAAAIAAAAGAAACBgAABAoAAAYUAAAKGAAAChoAAAAeAAAAAAIAAgQCAAQEAgAGP8IACAY
+ EAAIEBgAMJAYABggIAAAACgACBAoACgwMAAAKDgAEDA4ADg4OAAoOEAAGDhIACA4SAAAQEgAMEBIAEhQ
+ UAAISFgAIEhYAChIWAAwUFgAIEhoAEhYaAAYUHAAMFhwABhYeAAoWHgAIFiAAEhwgACIiIgAGGCQAAAA
+ mAAgcJgAKHCYADB4mACYmJgAACjIAEBw+ACo//8ASAAAAFgAAABoAAAAeAAAABAIAABICAAAGCgAAAA4
+ AAAYOAAACEAAAAhIAAAoUAAAAFgAACBYAAAAaAAAIGgAADB4AAAAiAAAMIgAAGiIAACAmAAAGAAIADAI
+ CABgCAgAEBgIAAggCAAQIAgAECgIAAgwCAAQMAgAODAIABA4CAAYOAgAEEAIABhACAAgQAgAIFAIAChg
+ CAAwgAgAMJAIADCoCAAACBAAGBAQABggEAAoIBAAKGAQAChoEAAgeBAAKHgQAEh4EAAY+BAACAAYAAAI
+ GAAICBgAEAgYAAAQGAAQEBgAABgYAAgYGAAYMBgAKHgYADCYGAAwoBgAMKgYAGj/GABgCCAACBAgAAgY
+ IAAQGCAAGBggACggIABIcCAACAAoABAAKAAAECgAEBAoAAggKAAACDAASAgwAAgQMAAIKDAAECgwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAARxBSUlJHAAAAAABYWFlY8kYAAAAAAAAAAAAAAAAAAJFgqqRLSzAwBXMAkKJbW1pdSVmE
+ AAAAAAAAAAAAAAAAEJdLqhpgYKQFkf9NmVRanHVJVZRQAAAAAAAAAAAAAAAAUY6RO6qXMHNYW5MxdFpm
+ TVtPSpAAAAAAAAAAAAAAAAAAAAAFpIYAAFSeW09PU15KU05MaEkAAAAAAAAAAAAAAAAAAEtgAAAAk55j
+ ml5Mp2haXUqpW3IAAAAAAAAAAAAAAAAAS0sAAEpJoE5PpZpMZVWnMZyZVQAAAAAAAAAAAAAAAABLMAAA
+ cqCeSnppZGZKWzFNaV2ecAAAAAAAAAAAAAAAAEtLAACLVF6iZHROp2eiW1paeWnxAAAAAAAAAAAAAABI
+ GmAAAElJSmh6SWNVSk5hZqJ1VXUAAAAAAAAAAAAAlpmjeJAAk12eZXZ5p3WndnZpaUlbZgAAAAAAAAAA
+ m2lFRTw8PDZeWV1OlE0xeWlNeVVdZmmZUAAAAAAAjzYKRaysRUVFRa02SXSnYaFNTUxpTFSoTmKTAAAA
+ AI8KOkSrrKysrKxErDullF6fVWhiVakLaVWbVZoAAAAAqK2sRKZEqyCsRKummKBZT0xPTHppZVMLqVN4
+ cQAAAAA6O6sYGKYYGKsYphgELjejY09KTTZNaWdMNpkAAAAA+zc6XFxcd3d3XASmXEw6PZZiZ6g2ZUw2
+ T2QLnwAAAAAdoTtcLcV3pndfLi2jraMtcmNkT05np0xnaXhUAAAAAAD5NKL87xgYd1+eLZ06+1wAVE6o
+ p2cKZ2WjjgAAAAAAAAAQo67EcuZuj5jkACue9gAAkTEKeJfbioptRgAAAAAAAACIr0dLVwBXmEeL5Qg4
+ AAAAAOnqwNbVb9O5AAAAAAAAAP38RmDae3tfkDqIX0UAAABq3W9v6+2BtssAAAAAAAD9q6v7AFl1dV9f
+ mpgIXwAAAABrtG9v7O2BagAAAACSF52fL/AAAAAAAHUAAAAAAAAAAACC1NS+3s/ZzAAAAJ03MjqjdJ0A
+ AAC3FIMUtwAAAAAAzr27goK5awAAAAAAWaNgGho3dAAAyr+/v4ODtQAAAMmAAM+2zxMTawAAAAAAAK6z
+ kZ1xAAC1un3HVwAAAAAAAAAAawB/ftAAAAAAAABCNUIAAAAAAAAAAF8AAAAAAAAAAEcAAGpGAAAAAAAA
+ AEKsEQAAAAAAAAAAlZUAAAAAAAAAAAAAAEgAAAAAAAAAAC3hAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAA
+ AAD///////////4BwH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAA
+ AAHgAAAB4AAAAeAAAAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9
+ /s/j/P/v8///7ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AFEl
+ swBJDW0ABEMwAAJHSQAFDwIAXl9ZAHJtagBwfYQAQVNqAAFtAAAAZgAAAz0CABQ/AQAXQwAAGkAAAA8g
+ AQAhSJQAM1SRABw6fgAFVk0ADE48AAplaQAgWgIAMYcMACl7CwAOJwMAAAMtABwPNwAhIQAABxACAA9S
+ UAAnQUgAAISfACRoDAAxmwQAK4MHABMpAAA8P1kATBMbACQSVwAKL1EADS5CADFMVQABIF4AJ3CGADB2
+ kAAzdlEAMnY1ABMnEwBARooAVVq5ABgATwAWBn0ABh56AAULaQBOeKYAT3WSACpNZwAucpgAMHifADFx
+ nwA1b5YAMF93AEBalgBvjecADCLAAAkPpQAbJr4AFiLGAAAJjgAzbIEANGh8AClhgAAzfKEAMHWWADJz
+ kwAsW3MAQ4mvADyY9AAtgf8AIpr/ACuk/wBdk9UAG0tkACladQAqbI4AK3GUAC5vjwArbpEALWJ7ACdl
+ aAAOaoQAJJ20ABx0gQAeTF8AJ116ACViggAgZosAJmeJAChvlAAhZIgAH1ZyAHVmYwAaPVMAJ19+ACto
+ hgAmaIwAKGB9ACFdfAAgY4YAGU5qAFtgYQAYQVgAIVx7ACtrjgAtZYIAJmKAACNhgQAmX3wAIUpdAHp6
+ ewARN0wAH1R0ACdXcgApXnoAJ2B+ACligQAdSmAAKiopAGZlZQCRkZEAbm9vAFFSUwAWO08AJFRuACFP
+ agAhUm0AHD9RAAMKDgA3NjUAWlpaADk5OQA3NzcAPDk3AAYSGQAVNUgAFjFAAA8jLwABAgQAVQAAAP//
+ /wBWAAAA/f//AFcAAAD8//8AWAAAAPz//wBZAAAA/P//AFoAAAD9//8AWwAAAP7//wBcAAAA////AF4A
+ AAABAAAAXwAAAAEAAABgAAAAAQAAAGEAAAABAAAAYgAAAAEAAAB3IFIAbWFuAAAAAAAAAAAAAAAAAAAA
+ AAC0VWMAtFVjALwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAEAAAAAADgDAACfAQAAPwAAAAEA
+ AABAAAAAAQAAAEEAAAABAAAAQgAAAAEAAABFAAAA////AEYAAAD+//8ARwAAAP3//wBIAAAA/P//AEkA
+ AAD8//8ASgAAAPz//wBLAAAA/f//AEwAAAD///8ATQAAAAMAAABOAAAABwAAAE8AAAALAAAAUAAAABAA
+ AABRAAAAFQAAAFIAAAAZAAAAUwAAABwAAABUAAAAHgAAAFUAAAAeAAAAVgAAAB0AAABXAAAAGgAAAFgA
+ AAAWAAAAWQAAABIAAABaAAAADQAAAFsAAAAIAAAAXAAAAAQAAABeAAAA/v//AF8AAAD8//8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAI2Oj5CRkpOUlZYAAAAAAACCg4SFhoeIiYqLjAAAAAAAAAB6AHt8fX5/gIEAAAAA
+ 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
+</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/win/CS/frmQueue.Designer.cs b/win/CS/frmQueue.Designer.cs
new file mode 100644
index 000000000..13ba68e28
--- /dev/null
+++ b/win/CS/frmQueue.Designer.cs
@@ -0,0 +1,530 @@
+/* frmQueue.Designer.cs
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake
+{
+ partial class frmQueue
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmQueue));
+ this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
+ this.lbl_dest = new System.Windows.Forms.Label();
+ this.lbl_source = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+ this.btn_encode = new System.Windows.Forms.ToolStripButton();
+ this.btn_pause = new System.Windows.Forms.ToolStripButton();
+ this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+ this.drop_button_queue = new System.Windows.Forms.ToolStripDropDownButton();
+ this.mnu_batch = new System.Windows.Forms.ToolStripMenuItem();
+ this.mnu_import = new System.Windows.Forms.ToolStripMenuItem();
+ this.mnu_export = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+ this.mnu_readd = new System.Windows.Forms.ToolStripMenuItem();
+ this.drp_completeOption = new System.Windows.Forms.ToolStripComboBox();
+ this.toolStripButton1 = new System.Windows.Forms.ToolStripButton();
+ this.SaveFile = new System.Windows.Forms.SaveFileDialog();
+ this.list_queue = new System.Windows.Forms.ListView();
+ this.Title = new System.Windows.Forms.ColumnHeader();
+ this.Chapters = new System.Windows.Forms.ColumnHeader();
+ this.Source = new System.Windows.Forms.ColumnHeader();
+ this.Destination = new System.Windows.Forms.ColumnHeader();
+ this.EncoderVideo = new System.Windows.Forms.ColumnHeader();
+ this.Audio = new System.Windows.Forms.ColumnHeader();
+ this.mnu_queue = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.mnu_up = new System.Windows.Forms.ToolStripMenuItem();
+ this.mnu_Down = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
+ this.mnu_edit = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
+ this.mnu_delete = new System.Windows.Forms.ToolStripMenuItem();
+ this.statusStrip1 = new System.Windows.Forms.StatusStrip();
+ this.lbl_encodesPending = new System.Windows.Forms.ToolStripStatusLabel();
+ this.OpenFile = new System.Windows.Forms.OpenFileDialog();
+ this.lbl_encodeStatus = new System.Windows.Forms.Label();
+ this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+ this.lbl_encodeOptions = new System.Windows.Forms.Label();
+ this.panel3 = new System.Windows.Forms.Panel();
+ this.panel2 = new System.Windows.Forms.Panel();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.toolStrip1.SuspendLayout();
+ this.mnu_queue.SuspendLayout();
+ this.statusStrip1.SuspendLayout();
+ this.splitContainer1.Panel1.SuspendLayout();
+ this.splitContainer1.Panel2.SuspendLayout();
+ this.splitContainer1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // lbl_dest
+ //
+ this.lbl_dest.AutoEllipsis = true;
+ this.lbl_dest.Location = new System.Drawing.Point(117, 60);
+ this.lbl_dest.Name = "lbl_dest";
+ this.lbl_dest.Size = new System.Drawing.Size(671, 13);
+ this.lbl_dest.TabIndex = 65;
+ this.lbl_dest.Text = "-";
+ this.lbl_dest.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // lbl_source
+ //
+ this.lbl_source.AutoEllipsis = true;
+ this.lbl_source.Location = new System.Drawing.Point(117, 47);
+ this.lbl_source.Name = "lbl_source";
+ this.lbl_source.Size = new System.Drawing.Size(671, 13);
+ this.lbl_source.TabIndex = 64;
+ this.lbl_source.Text = "-";
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label1.Location = new System.Drawing.Point(12, 47);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(85, 39);
+ this.label1.TabIndex = 63;
+ this.label1.Text = "Source:\r\nDestination:\r\nOptions:";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label3.Location = new System.Drawing.Point(12, 9);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(82, 13);
+ this.label3.TabIndex = 62;
+ this.label3.Text = "Current Job";
+ //
+ // toolStrip1
+ //
+ this.toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
+ this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.btn_encode,
+ this.btn_pause,
+ this.toolStripSeparator1,
+ this.drop_button_queue,
+ this.drp_completeOption,
+ this.toolStripButton1});
+ this.toolStrip1.Location = new System.Drawing.Point(0, 0);
+ this.toolStrip1.Name = "toolStrip1";
+ this.toolStrip1.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional;
+ this.toolStrip1.Size = new System.Drawing.Size(789, 39);
+ this.toolStrip1.TabIndex = 71;
+ this.toolStrip1.Text = "toolStrip1";
+ //
+ // btn_encode
+ //
+ this.btn_encode.Image = global::Handbrake.Properties.Resources.Play;
+ this.btn_encode.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.btn_encode.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btn_encode.Name = "btn_encode";
+ this.btn_encode.Size = new System.Drawing.Size(82, 36);
+ this.btn_encode.Text = "Encode";
+ this.btn_encode.Click += new System.EventHandler(this.BtnEncodeClick);
+ //
+ // btn_pause
+ //
+ this.btn_pause.Image = global::Handbrake.Properties.Resources.Pause;
+ this.btn_pause.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.btn_pause.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btn_pause.Name = "btn_pause";
+ this.btn_pause.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;
+ this.btn_pause.Size = new System.Drawing.Size(74, 36);
+ this.btn_pause.Text = "Pause";
+ this.btn_pause.Visible = false;
+ this.btn_pause.Click += new System.EventHandler(this.BtnPauseClick);
+ //
+ // toolStripSeparator1
+ //
+ this.toolStripSeparator1.Name = "toolStripSeparator1";
+ this.toolStripSeparator1.Size = new System.Drawing.Size(6, 39);
+ //
+ // drop_button_queue
+ //
+ this.drop_button_queue.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.mnu_batch,
+ this.mnu_import,
+ this.mnu_export,
+ this.toolStripSeparator2,
+ this.mnu_readd});
+ this.drop_button_queue.Image = global::Handbrake.Properties.Resources.ActivityWindow;
+ this.drop_button_queue.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.drop_button_queue.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.drop_button_queue.Name = "drop_button_queue";
+ this.drop_button_queue.Size = new System.Drawing.Size(87, 36);
+ this.drop_button_queue.Text = "Queue";
+ //
+ // mnu_batch
+ //
+ this.mnu_batch.Image = global::Handbrake.Properties.Resources.Output_Small;
+ this.mnu_batch.Name = "mnu_batch";
+ this.mnu_batch.Size = new System.Drawing.Size(235, 22);
+ this.mnu_batch.Text = "Generate Batch Script";
+ this.mnu_batch.Click += new System.EventHandler(this.MnuBatchClick);
+ //
+ // mnu_import
+ //
+ this.mnu_import.Image = global::Handbrake.Properties.Resources.folder;
+ this.mnu_import.Name = "mnu_import";
+ this.mnu_import.Size = new System.Drawing.Size(235, 22);
+ this.mnu_import.Text = "Import Queue";
+ this.mnu_import.Click += new System.EventHandler(this.MnuImportClick);
+ //
+ // mnu_export
+ //
+ this.mnu_export.Image = global::Handbrake.Properties.Resources.save;
+ this.mnu_export.Name = "mnu_export";
+ this.mnu_export.Size = new System.Drawing.Size(235, 22);
+ this.mnu_export.Text = "Export Queue";
+ this.mnu_export.Click += new System.EventHandler(this.MnuExportClick);
+ //
+ // toolStripSeparator2
+ //
+ this.toolStripSeparator2.Name = "toolStripSeparator2";
+ this.toolStripSeparator2.Size = new System.Drawing.Size(232, 6);
+ //
+ // mnu_readd
+ //
+ this.mnu_readd.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+ this.mnu_readd.Image = global::Handbrake.Properties.Resources.AddToQueue_small;
+ this.mnu_readd.Name = "mnu_readd";
+ this.mnu_readd.Size = new System.Drawing.Size(235, 22);
+ this.mnu_readd.Text = "Re-Add Currently Running Job";
+ this.mnu_readd.ToolTipText = "Readds the currently encoding job back onto the queue.";
+ this.mnu_readd.Click += new System.EventHandler(this.MnuReaddClick);
+ //
+ // drp_completeOption
+ //
+ this.drp_completeOption.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.drp_completeOption.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.drp_completeOption.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.drp_completeOption.Items.AddRange(new object[] {
+ "Do nothing",
+ "Shutdown",
+ "Suspend",
+ "Hibernate",
+ "Lock system",
+ "Log off",
+ "Quit HandBrake"});
+ this.drp_completeOption.Margin = new System.Windows.Forms.Padding(1, 0, 15, 0);
+ this.drp_completeOption.Name = "drp_completeOption";
+ this.drp_completeOption.Size = new System.Drawing.Size(155, 39);
+ this.drp_completeOption.SelectedIndexChanged += new System.EventHandler(this.CompleteOptionChanged);
+ //
+ // toolStripButton1
+ //
+ this.toolStripButton1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+ this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image")));
+ this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.toolStripButton1.Name = "toolStripButton1";
+ this.toolStripButton1.Size = new System.Drawing.Size(76, 36);
+ this.toolStripButton1.Text = "When Done:";
+ //
+ // SaveFile
+ //
+ this.SaveFile.Filter = "Batch|.bat";
+ //
+ // list_queue
+ //
+ this.list_queue.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+ this.Title,
+ this.Chapters,
+ this.Source,
+ this.Destination,
+ this.EncoderVideo,
+ this.Audio});
+ this.list_queue.ContextMenuStrip = this.mnu_queue;
+ this.list_queue.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.list_queue.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.list_queue.FullRowSelect = true;
+ this.list_queue.GridLines = true;
+ this.list_queue.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+ this.list_queue.Location = new System.Drawing.Point(15, 0);
+ this.list_queue.Name = "list_queue";
+ this.list_queue.Size = new System.Drawing.Size(759, 199);
+ this.list_queue.TabIndex = 72;
+ this.list_queue.UseCompatibleStateImageBehavior = false;
+ this.list_queue.View = System.Windows.Forms.View.Details;
+ this.list_queue.KeyUp += new System.Windows.Forms.KeyEventHandler(this.ListQueueDeleteKey);
+ //
+ // Title
+ //
+ this.Title.Text = "Title";
+ this.Title.Width = 39;
+ //
+ // Chapters
+ //
+ this.Chapters.Text = "Chapters";
+ this.Chapters.Width = 71;
+ //
+ // Source
+ //
+ this.Source.Text = "Source";
+ this.Source.Width = 219;
+ //
+ // Destination
+ //
+ this.Destination.Text = "Destination";
+ this.Destination.Width = 210;
+ //
+ // EncoderVideo
+ //
+ this.EncoderVideo.Text = "Video Encoder";
+ this.EncoderVideo.Width = 110;
+ //
+ // Audio
+ //
+ this.Audio.Text = "Audio Encoder";
+ this.Audio.Width = 94;
+ //
+ // mnu_queue
+ //
+ this.mnu_queue.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.mnu_up,
+ this.mnu_Down,
+ this.toolStripSeparator3,
+ this.mnu_edit,
+ this.toolStripSeparator4,
+ this.mnu_delete});
+ this.mnu_queue.Name = "mnu_queue";
+ this.mnu_queue.Size = new System.Drawing.Size(139, 104);
+ //
+ // mnu_up
+ //
+ this.mnu_up.Name = "mnu_up";
+ this.mnu_up.Size = new System.Drawing.Size(138, 22);
+ this.mnu_up.Text = "Move Up";
+ this.mnu_up.Click += new System.EventHandler(this.MnuUpClick);
+ //
+ // mnu_Down
+ //
+ this.mnu_Down.Name = "mnu_Down";
+ this.mnu_Down.Size = new System.Drawing.Size(138, 22);
+ this.mnu_Down.Text = "Move Down";
+ this.mnu_Down.Click += new System.EventHandler(this.MnuDownClick);
+ //
+ // toolStripSeparator3
+ //
+ this.toolStripSeparator3.Name = "toolStripSeparator3";
+ this.toolStripSeparator3.Size = new System.Drawing.Size(135, 6);
+ //
+ // mnu_edit
+ //
+ this.mnu_edit.Name = "mnu_edit";
+ this.mnu_edit.Size = new System.Drawing.Size(138, 22);
+ this.mnu_edit.Text = "Edit";
+ this.mnu_edit.Click += new System.EventHandler(this.MnuEditClick);
+ //
+ // toolStripSeparator4
+ //
+ this.toolStripSeparator4.Name = "toolStripSeparator4";
+ this.toolStripSeparator4.Size = new System.Drawing.Size(135, 6);
+ //
+ // mnu_delete
+ //
+ this.mnu_delete.Name = "mnu_delete";
+ this.mnu_delete.Size = new System.Drawing.Size(138, 22);
+ this.mnu_delete.Text = "Delete";
+ this.mnu_delete.Click += new System.EventHandler(this.MnuDeleteClick);
+ //
+ // statusStrip1
+ //
+ this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.lbl_encodesPending});
+ this.statusStrip1.Location = new System.Drawing.Point(0, 363);
+ this.statusStrip1.Name = "statusStrip1";
+ this.statusStrip1.Padding = new System.Windows.Forms.Padding(1, 0, 12, 0);
+ this.statusStrip1.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional;
+ this.statusStrip1.Size = new System.Drawing.Size(789, 22);
+ this.statusStrip1.TabIndex = 73;
+ this.statusStrip1.Text = "statusStrip1";
+ //
+ // lbl_encodesPending
+ //
+ this.lbl_encodesPending.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+ this.lbl_encodesPending.Margin = new System.Windows.Forms.Padding(0, 3, 10, 2);
+ this.lbl_encodesPending.Name = "lbl_encodesPending";
+ this.lbl_encodesPending.Size = new System.Drawing.Size(115, 17);
+ this.lbl_encodesPending.Text = "0 encode(s) pending";
+ //
+ // OpenFile
+ //
+ this.OpenFile.Filter = "HandBrake Queue|*.queue";
+ //
+ // lbl_encodeStatus
+ //
+ this.lbl_encodeStatus.AutoSize = true;
+ this.lbl_encodeStatus.Location = new System.Drawing.Point(12, 30);
+ this.lbl_encodeStatus.Name = "lbl_encodeStatus";
+ this.lbl_encodeStatus.Size = new System.Drawing.Size(38, 13);
+ this.lbl_encodeStatus.TabIndex = 73;
+ this.lbl_encodeStatus.Text = "Ready";
+ //
+ // splitContainer1
+ //
+ this.splitContainer1.BackColor = System.Drawing.Color.Transparent;
+ this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+ this.splitContainer1.Location = new System.Drawing.Point(0, 39);
+ this.splitContainer1.Name = "splitContainer1";
+ this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
+ //
+ // splitContainer1.Panel1
+ //
+ this.splitContainer1.Panel1.BackColor = System.Drawing.Color.Transparent;
+ this.splitContainer1.Panel1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
+ this.splitContainer1.Panel1.Controls.Add(this.lbl_encodeOptions);
+ this.splitContainer1.Panel1.Controls.Add(this.label3);
+ this.splitContainer1.Panel1.Controls.Add(this.lbl_dest);
+ this.splitContainer1.Panel1.Controls.Add(this.label1);
+ this.splitContainer1.Panel1.Controls.Add(this.lbl_encodeStatus);
+ this.splitContainer1.Panel1.Controls.Add(this.lbl_source);
+ //
+ // splitContainer1.Panel2
+ //
+ this.splitContainer1.Panel2.Controls.Add(this.list_queue);
+ this.splitContainer1.Panel2.Controls.Add(this.panel3);
+ this.splitContainer1.Panel2.Controls.Add(this.panel2);
+ this.splitContainer1.Panel2.Controls.Add(this.panel1);
+ this.splitContainer1.Size = new System.Drawing.Size(789, 324);
+ this.splitContainer1.SplitterDistance = 106;
+ this.splitContainer1.TabIndex = 74;
+ //
+ // lbl_encodeOptions
+ //
+ this.lbl_encodeOptions.AutoEllipsis = true;
+ this.lbl_encodeOptions.Location = new System.Drawing.Point(117, 73);
+ this.lbl_encodeOptions.Name = "lbl_encodeOptions";
+ this.lbl_encodeOptions.Size = new System.Drawing.Size(671, 33);
+ this.lbl_encodeOptions.TabIndex = 74;
+ this.lbl_encodeOptions.Text = "-";
+ //
+ // panel3
+ //
+ this.panel3.BackColor = System.Drawing.Color.Transparent;
+ this.panel3.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.panel3.Location = new System.Drawing.Point(15, 199);
+ this.panel3.Name = "panel3";
+ this.panel3.Size = new System.Drawing.Size(759, 15);
+ this.panel3.TabIndex = 73;
+ //
+ // panel2
+ //
+ this.panel2.BackColor = System.Drawing.Color.Transparent;
+ this.panel2.Dock = System.Windows.Forms.DockStyle.Right;
+ this.panel2.Location = new System.Drawing.Point(774, 0);
+ this.panel2.Name = "panel2";
+ this.panel2.Size = new System.Drawing.Size(15, 214);
+ this.panel2.TabIndex = 1;
+ //
+ // panel1
+ //
+ this.panel1.BackColor = System.Drawing.Color.Transparent;
+ this.panel1.Dock = System.Windows.Forms.DockStyle.Left;
+ this.panel1.Location = new System.Drawing.Point(0, 0);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(15, 214);
+ this.panel1.TabIndex = 0;
+ //
+ // frmQueue
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(789, 385);
+ this.Controls.Add(this.splitContainer1);
+ this.Controls.Add(this.statusStrip1);
+ this.Controls.Add(this.toolStrip1);
+ this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MinimumSize = new System.Drawing.Size(677, 417);
+ this.Name = "frmQueue";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "Encode Queue";
+ this.toolStrip1.ResumeLayout(false);
+ this.toolStrip1.PerformLayout();
+ this.mnu_queue.ResumeLayout(false);
+ this.statusStrip1.ResumeLayout(false);
+ this.statusStrip1.PerformLayout();
+ this.splitContainer1.Panel1.ResumeLayout(false);
+ this.splitContainer1.Panel1.PerformLayout();
+ this.splitContainer1.Panel2.ResumeLayout(false);
+ this.splitContainer1.ResumeLayout(false);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.ToolTip toolTip1;
+ private System.Windows.Forms.Label lbl_dest;
+ private System.Windows.Forms.Label lbl_source;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.ToolStrip toolStrip1;
+ private System.Windows.Forms.ToolStripButton btn_encode;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+ private System.Windows.Forms.ToolStripButton btn_pause;
+ private System.Windows.Forms.SaveFileDialog SaveFile;
+ private System.Windows.Forms.ListView list_queue;
+ private System.Windows.Forms.ColumnHeader Title;
+ private System.Windows.Forms.ColumnHeader Chapters;
+ private System.Windows.Forms.ColumnHeader Source;
+ private System.Windows.Forms.ColumnHeader Destination;
+ private System.Windows.Forms.ColumnHeader EncoderVideo;
+ private System.Windows.Forms.ColumnHeader Audio;
+ private System.Windows.Forms.StatusStrip statusStrip1;
+ private System.Windows.Forms.ToolStripDropDownButton drop_button_queue;
+ private System.Windows.Forms.ToolStripMenuItem mnu_batch;
+ private System.Windows.Forms.ToolStripMenuItem mnu_import;
+ private System.Windows.Forms.ToolStripMenuItem mnu_export;
+ private System.Windows.Forms.OpenFileDialog OpenFile;
+ private System.Windows.Forms.ToolStripStatusLabel lbl_encodesPending;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+ private System.Windows.Forms.ToolStripMenuItem mnu_readd;
+ private System.Windows.Forms.ContextMenuStrip mnu_queue;
+ private System.Windows.Forms.ToolStripMenuItem mnu_up;
+ private System.Windows.Forms.ToolStripMenuItem mnu_Down;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
+ private System.Windows.Forms.ToolStripMenuItem mnu_delete;
+ private System.Windows.Forms.ToolStripMenuItem mnu_edit;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;
+ private System.Windows.Forms.Label lbl_encodeStatus;
+ private System.Windows.Forms.SplitContainer splitContainer1;
+ private System.Windows.Forms.Panel panel2;
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.Label lbl_encodeOptions;
+ private System.Windows.Forms.ToolStripComboBox drp_completeOption;
+ private System.Windows.Forms.ToolStripButton toolStripButton1;
+ private System.Windows.Forms.Panel panel3;
+ }
+}
diff --git a/win/CS/frmQueue.cs b/win/CS/frmQueue.cs
new file mode 100644
index 000000000..cf4ac409c
--- /dev/null
+++ b/win/CS/frmQueue.cs
@@ -0,0 +1,712 @@
+/* frmQueue.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace Handbrake
+{
+ using System;
+ using System.Collections.Generic;
+ using System.Collections.ObjectModel;
+ using System.ComponentModel;
+ using System.IO;
+ using System.Linq;
+ using System.Windows.Forms;
+ using Functions;
+
+ using HandBrake.ApplicationServices.Model;
+ using HandBrake.ApplicationServices.Model.Encoding;
+ using HandBrake.ApplicationServices.Services;
+ using HandBrake.ApplicationServices.Services.Interfaces;
+ using HandBrake.ApplicationServices.Utilities;
+
+ using Model;
+
+ /// <summary>
+ /// The Queue Window
+ /// </summary>
+ public partial class frmQueue : Form
+ {
+ /// <summary>
+ /// Update Handler Delegate
+ /// </summary>
+ private delegate void UpdateHandler();
+
+ /// <summary>
+ /// An instance of the Queue service
+ /// </summary>
+ private readonly IQueueProcessor queue;
+
+ /// <summary>
+ /// A reference to the main application window
+ /// </summary>
+ private readonly frmMain mainWindow;
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="frmQueue"/> class.
+ /// </summary>
+ /// <param name="q">
+ /// An instance of the queue service.
+ /// </param>
+ /// <param name="mw">
+ /// The main window.
+ /// </param>
+ public frmQueue(IQueueProcessor q, frmMain mw)
+ {
+ InitializeComponent();
+
+ this.mainWindow = mw;
+
+ this.queue = q;
+ queue.EncodeService.EncodeStarted += this.QueueOnEncodeStart;
+ queue.QueueCompleted += this.QueueOnQueueFinished;
+ queue.QueuePaused += this.QueueOnPaused;
+ queue.QueueManager.QueueChanged += new EventHandler(queue_QueueListChanged);
+
+ queue.EncodeService.EncodeStarted += this.queue_EncodeStarted;
+ queue.EncodeService.EncodeCompleted += this.queue_EncodeEnded;
+
+ drp_completeOption.Text = Properties.Settings.Default.CompletionOption;
+ }
+
+ /// <summary>
+ /// Queue Changed
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void queue_QueueListChanged(object sender, EventArgs e)
+ {
+ UpdateUiElementsOnQueueChange();
+ }
+
+ /// <summary>
+ /// Encode Ended
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void queue_EncodeEnded(object sender, EventArgs e)
+ {
+ queue.EncodeService.EncodeStatusChanged -= EncodeQueue_EncodeStatusChanged;
+ ResetEncodeText();
+ }
+
+ /// <summary>
+ /// Queue Started
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void queue_EncodeStarted(object sender, EventArgs e)
+ {
+ this.SetCurrentEncodeInformation();
+ queue.EncodeService.EncodeStatusChanged += EncodeQueue_EncodeStatusChanged;
+ }
+
+ /// <summary>
+ /// Display the Encode Status
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void EncodeQueue_EncodeStatusChanged(object sender, HandBrake.ApplicationServices.EventArgs.EncodeProgressEventArgs e)
+ {
+ if (this.InvokeRequired)
+ {
+ this.BeginInvoke(new EncodeProgessStatus(EncodeQueue_EncodeStatusChanged), new[] { sender, e });
+ return;
+ }
+
+ lbl_encodeStatus.Text =
+ string.Format(
+ "Encoding: Pass {0} of {1}, {2:00.00}% Time Remaining: {3}",
+ e.Task,
+ e.TaskCount,
+ e.PercentComplete,
+ e.EstimatedTimeLeft);
+ }
+
+ /// <summary>
+ /// Handle the Queue Paused event
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The EventArgs.
+ /// </param>
+ private void QueueOnPaused(object sender, EventArgs e)
+ {
+ SetUiEncodeFinished();
+ UpdateUiElementsOnQueueChange();
+ }
+
+ /// <summary>
+ /// Handle the Queue Finished event.
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The EventArgs.
+ /// </param>
+ private void QueueOnQueueFinished(object sender, EventArgs e)
+ {
+ SetUiEncodeFinished();
+ ResetQueue(); // Reset the Queue Window
+ }
+
+ /// <summary>
+ /// Handle the Encode Started event
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void QueueOnEncodeStart(object sender, EventArgs e)
+ {
+ SetUiEncodeStarted(); // make sure the UI is set correctly
+ UpdateUiElementsOnQueueChange(); // Redraw the Queue, a new encode has started.
+ }
+
+ /// <summary>
+ /// Initializes the Queue list with the Arraylist from the Queue class
+ /// </summary>
+ public void SetQueue()
+ {
+ UpdateUiElementsOnQueueChange();
+ }
+
+ /// <summary>
+ /// Initializes the Queue list, then shows and activates the window
+ /// </summary>
+ public new void Show()
+ {
+ Show(true);
+ }
+
+ /// <summary>
+ /// Initializes the Queue list only if doSetQueue is true, then shows and activates the window
+ /// </summary>
+ /// <param name="doSetQueue">Indicates whether to call setQueue() before showing the window</param>
+ public void Show(bool doSetQueue)
+ {
+ if (doSetQueue) SetQueue();
+ base.Show();
+ }
+
+ /// <summary>
+ /// Handle the Encode button Click event
+ /// </summary>
+ /// <param name="sender">The sender</param>
+ /// <param name="e">the EventArgs</param>
+ private void BtnEncodeClick(object sender, EventArgs e)
+ {
+ if (!queue.IsProcessing)
+ {
+ SetUiEncodeStarted();
+ }
+
+ lbl_encodeStatus.Text = "Encoding ...";
+ queue.Start();
+ }
+
+ /// <summary>
+ /// Handle the Pause button click event.
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The EventArgs.
+ /// </param>
+ private void BtnPauseClick(object sender, EventArgs e)
+ {
+ queue.Pause();
+ MessageBox.Show(
+ "No further items on the queue will start. The current encode process will continue until it is finished. \nClick 'Encode' when you wish to continue encoding the queue.",
+ "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ }
+
+ // UI Work
+
+ /// <summary>
+ /// Setup the UI to show that an encode has started
+ /// </summary>
+ private void SetUiEncodeStarted()
+ {
+ if (InvokeRequired)
+ {
+ BeginInvoke(new UpdateHandler(SetUiEncodeStarted));
+ return;
+ }
+ btn_encode.Enabled = false;
+ btn_pause.Visible = true;
+ }
+
+ /// <summary>
+ /// Setup the UI to indicate that an encode has finished.
+ /// </summary>
+ private void SetUiEncodeFinished()
+ {
+ if (InvokeRequired)
+ {
+ BeginInvoke(new UpdateHandler(SetUiEncodeFinished));
+ return;
+ }
+ btn_pause.Visible = false;
+ btn_encode.Enabled = true;
+ }
+
+ /// <summary>
+ /// Reset the Queue Window display
+ /// </summary>
+ private void ResetQueue()
+ {
+ if (InvokeRequired)
+ {
+ BeginInvoke(new UpdateHandler(ResetQueue));
+ return;
+ }
+ btn_pause.Visible = false;
+ btn_encode.Enabled = true;
+
+ ResetEncodeText();
+ }
+
+ /// <summary>
+ /// Reset the current job text
+ /// </summary>
+ private void ResetEncodeText()
+ {
+ if (InvokeRequired)
+ {
+ BeginInvoke(new UpdateHandler(ResetEncodeText));
+ return;
+ }
+ lbl_encodeStatus.Text = "Ready";
+
+ lbl_source.Text = "-";
+ lbl_dest.Text = "-";
+ lbl_encodeOptions.Text = "-";
+
+ lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";
+ }
+
+ /// <summary>
+ /// Redraw the Queue window with the latest information about HandBrakes status
+ /// </summary>
+ private void RedrawQueue()
+ {
+ if (InvokeRequired)
+ {
+ BeginInvoke(new UpdateHandler(RedrawQueue));
+ return;
+ }
+
+ list_queue.Items.Clear();
+ ReadOnlyCollection<QueueTask> theQueue = queue.QueueManager.Queue;
+ foreach (QueueTask queueItem in theQueue)
+ {
+ string qItem = queueItem.Query;
+ EncodeTask parsed = QueryParserUtility.Parse(qItem);
+
+ // Get the DVD Title
+ string title = parsed.Title == 0 ? "Auto" : parsed.Title.ToString();
+
+ // Get the DVD Chapters
+ string chapters;
+ if (parsed.StartPoint == 0)
+ chapters = "Auto";
+ else
+ {
+ chapters = parsed.StartPoint.ToString();
+ if (parsed.EndPoint != 0)
+ chapters = chapters + " - " + parsed.EndPoint;
+ }
+
+ ListViewItem item = new ListViewItem { Tag = queueItem, Text = title };
+ item.SubItems.Add(chapters); // Chapters
+ item.SubItems.Add(queueItem.Source); // Source
+ item.SubItems.Add(queueItem.Destination); // Destination
+
+ switch (parsed.VideoEncoder)
+ {
+ case VideoEncoder.FFMpeg:
+ item.SubItems.Add("MPEG-4 (FFmpeg)");
+ break;
+ default:
+ case VideoEncoder.X264:
+ item.SubItems.Add("H.264 (x264)");
+ break;
+ case VideoEncoder.Theora:
+ item.SubItems.Add("VP3 (Theroa)");
+ break;
+ }
+
+ // Video
+
+ // Display The Audio Track Information
+ string audio = string.Empty;
+ foreach (AudioTrack track in parsed.AudioTracks)
+ {
+ if (audio != string.Empty)
+ audio += ", " + track.Encoder;
+ else
+ audio = track.Encoder;
+ }
+ item.SubItems.Add(audio); // Audio
+
+ list_queue.Items.Add(item);
+ }
+ }
+
+ /// <summary>
+ /// Update the UI elements
+ /// </summary>
+ private void UpdateUiElementsOnQueueChange()
+ {
+ if (InvokeRequired)
+ {
+ BeginInvoke(new UpdateHandler(UpdateUiElementsOnQueueChange));
+ return;
+ }
+
+ RedrawQueue();
+ lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";
+ }
+
+ /// <summary>
+ /// Set the window up with the current encode information
+ /// </summary>
+ private void SetCurrentEncodeInformation()
+ {
+ try
+ {
+ if (InvokeRequired)
+ {
+ BeginInvoke(new UpdateHandler(SetCurrentEncodeInformation));
+ }
+
+ EncodeTask parsed = QueryParserUtility.Parse(queue.QueueManager.LastProcessedJob.Query);
+
+ // Get title and chapters
+ string title = parsed.Title == 0 ? "Auto" : parsed.Title.ToString();
+ string chapterlbl;
+ if (Equals(parsed.StartPoint, 0))
+ chapterlbl = "Auto";
+ else
+ {
+ string chapters = parsed.StartPoint.ToString();
+ if (parsed.EndPoint != 0)
+ chapters = chapters + " - " + parsed.EndPoint;
+ chapterlbl = chapters;
+ }
+
+ // Get audio information
+ string audio = string.Empty;
+ foreach (AudioTrack track in parsed.AudioTracks)
+ {
+ if (audio != string.Empty)
+ audio += ", " + track.Encoder;
+ else
+ audio = track.Encoder;
+ }
+
+ // found query is a global varible
+ lbl_encodeStatus.Text = "Encoding ...";
+ lbl_source.Text = queue.QueueManager.LastProcessedJob.Source + "(Title: " + title + " Chapters: " + chapterlbl + ")";
+ lbl_dest.Text = queue.QueueManager.LastProcessedJob.Destination;
+ lbl_encodeOptions.Text = "Video: " + parsed.VideoEncoder + " Audio: " + audio + Environment.NewLine +
+ "x264 Options: " + parsed.AdvancedEncoderOptions;
+ }
+ catch (Exception)
+ {
+ // Do Nothing
+ }
+ }
+
+ /* Right Click Menu */
+
+ /// <summary>
+ /// Handle the Move Up Menu Item
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void MnuUpClick(object sender, EventArgs e)
+ {
+ MoveUp();
+ }
+
+ /// <summary>
+ /// Handle the Move down Menu Item
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void MnuDownClick(object sender, EventArgs e)
+ {
+ MoveDown();
+ }
+
+ /// <summary>
+ /// Edit a job
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void MnuEditClick(object sender, EventArgs e)
+ {
+ if (list_queue.SelectedIndices != null && list_queue.SelectedIndices.Count != 0)
+ {
+ lock (queue)
+ {
+ lock (list_queue)
+ {
+ QueueTask index = list_queue.SelectedItems[0].Tag as QueueTask;
+ mainWindow.RecievingJob(index);
+ queue.QueueManager.Remove(index);
+ RedrawQueue();
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// Handle the delete Menu Item
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void MnuDeleteClick(object sender, EventArgs e)
+ {
+ DeleteSelectedItems();
+ }
+
+ /* Keyboard Shortcuts */
+
+ /// <summary>
+ /// Handle the delete keyboard press
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void ListQueueDeleteKey(object sender, KeyEventArgs e)
+ {
+ if (e.KeyCode == Keys.Delete && e.Modifiers == Keys.None)
+ DeleteSelectedItems();
+ }
+
+ /* Queue Management */
+
+ /// <summary>
+ /// Move items up in the queue
+ /// </summary>
+ private void MoveUp()
+ {
+ // If there are selected items and the first item is not selected
+ if (list_queue.SelectedIndices.Count > 0 && !list_queue.SelectedIndices.Contains(0))
+ {
+ // Copy the selected indices to preserve them during the movement
+ List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);
+ foreach (int selectedIndex in list_queue.SelectedIndices)
+ selectedIndices.Add(selectedIndex);
+
+ // Move up each selected item
+ foreach (int selectedIndex in selectedIndices)
+ queue.QueueManager.MoveUp(selectedIndex);
+
+ // Keep the selected item(s) selected, now moved up one index
+ foreach (int selectedIndex in selectedIndices)
+ if (selectedIndex - 1 > -1) // Defensive programming: ensure index is good
+ list_queue.Items[selectedIndex - 1].Selected = true;
+ }
+
+ list_queue.Select(); // Activate the control to show the selected items
+ }
+
+ /// <summary>
+ /// Move items down in the queue
+ /// </summary>
+ private void MoveDown()
+ {
+ // If there are selected items and the last item is not selected
+ if (list_queue.SelectedIndices.Count > 0 &&
+ !list_queue.SelectedIndices.Contains(list_queue.Items[list_queue.Items.Count - 1].Index))
+ {
+ // Copy the selected indices to preserve them during the movement
+ List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);
+ foreach (int selectedIndex in list_queue.SelectedIndices)
+ selectedIndices.Add(selectedIndex);
+
+ // Reverse the indices to move the items down from last to first (preserves indices)
+ selectedIndices.Reverse();
+
+ // Move down each selected item
+ foreach (int selectedIndex in selectedIndices)
+ queue.QueueManager.MoveDown(selectedIndex);
+
+ // Keep the selected item(s) selected, now moved down one index
+ foreach (int selectedIndex in selectedIndices)
+ if (selectedIndex + 1 < list_queue.Items.Count) // Defensive programming: ensure index is good
+ list_queue.Items[selectedIndex + 1].Selected = true;
+ }
+
+ list_queue.Select(); // Activate the control to show the selected items
+ }
+
+ /// <summary>
+ /// Delete the currently selected items on the queue
+ /// </summary>
+ private void DeleteSelectedItems()
+ {
+ // If there are selected items
+ if (list_queue.SelectedIndices.Count > 0)
+ {
+ // Remove each selected item
+ foreach (ListViewItem selectedIndex in this.list_queue.SelectedItems)
+ queue.QueueManager.Remove((QueueTask)selectedIndex.Tag);
+
+ // Select the first item after deletion.
+ if (list_queue.Items.Count > 0)
+ list_queue.Items[0].Selected = true;
+ }
+
+ list_queue.Select(); // Activate the control to show the selected items
+ }
+
+ /* Queue Import / Export features */
+
+ /// <summary>
+ /// Create a batch script
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void MnuBatchClick(object sender, EventArgs e)
+ {
+ SaveFile.FileName = string.Empty;
+ SaveFile.Filter = "Batch|.bat";
+ SaveFile.ShowDialog();
+ if (SaveFile.FileName != String.Empty)
+ queue.QueueManager.WriteBatchScriptToFile(SaveFile.FileName);
+ }
+
+ /// <summary>
+ /// Export Queue
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void MnuExportClick(object sender, EventArgs e)
+ {
+ SaveFile.FileName = string.Empty;
+ SaveFile.Filter = "HandBrake Queue|*.queue";
+ SaveFile.ShowDialog();
+ if (SaveFile.FileName != String.Empty)
+ queue.QueueManager.BackupQueue(SaveFile.FileName);
+ }
+
+ /// <summary>
+ /// Import Queue
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void MnuImportClick(object sender, EventArgs e)
+ {
+ OpenFile.FileName = string.Empty;
+ OpenFile.ShowDialog();
+ if (OpenFile.FileName != String.Empty)
+ queue.QueueManager.RestoreQueue(OpenFile.FileName);
+ }
+
+ /// <summary>
+ /// Readd current job to queue
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void MnuReaddClick(object sender, EventArgs e)
+ {
+ if (queue.QueueManager.LastProcessedJob != null && !queue.QueueManager.LastProcessedJob.IsEmpty)
+ {
+ queue.QueueManager.Add(queue.QueueManager.LastProcessedJob);
+ }
+ }
+
+ /* Overrides */
+
+ /// <summary>
+ /// Hide's the window when the user tries to "x" out of the window instead of closing it.
+ /// </summary>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ protected override void OnClosing(CancelEventArgs e)
+ {
+ e.Cancel = true;
+ this.Hide();
+ base.OnClosing(e);
+ }
+
+ /// <summary>
+ /// Change the OnComplete option setting.
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The EventArgs.
+ /// </param>
+ private void CompleteOptionChanged(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.CompletionOption = drp_completeOption.Text;
+ HandBrake.ApplicationServices.Init.CompletionOption = drp_completeOption.Text;
+ Properties.Settings.Default.Save();
+ }
+ }
+} \ No newline at end of file
diff --git a/win/CS/frmQueue.resx b/win/CS/frmQueue.resx
new file mode 100644
index 000000000..90014fcee
--- /dev/null
+++ b/win/CS/frmQueue.resx
@@ -0,0 +1,536 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+ <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>114, 17</value>
+ </metadata>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="toolStripButton1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI
+ ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9
+ HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN
+ rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K
+ TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx
+ oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8
+ 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI
+ xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX
+ LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd
+ KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC
+</value>
+ </data>
+ <metadata name="SaveFile.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>219, 17</value>
+ </metadata>
+ <metadata name="mnu_queue.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>530, 17</value>
+ </metadata>
+ <metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>414, 17</value>
+ </metadata>
+ <metadata name="OpenFile.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>314, 17</value>
+ </metadata>
+ <metadata name="splitContainer1.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <value>True</value>
+ </metadata>
+ <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA
+ IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA
+ AACACgAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8A/wAAAAD/AAAAAIAAgICAAICAAAAAgAAAAICAAIAA
+ AACAAIAAgP//ACAgIADg4OAAIAAAAAAgAABg4CAAQOBAAGBgYAAgYAAAQKDgAAAAIABAwCAAIEAAAECg
+ AABg4AAAIGCAAECAoABgoMAAYECgAGDAAABgICAAoKCgAOAAAAAgIAAAAGAAAEDgAABgAAAAIAAgAEAg
+ IAAgQGAAIIDAAADg4ABgAGAAgOD/ACCA/wCgAAAAQGAAACCAAAAAoAAAYCAAAAAgIAAgIEAAYGBAAEBg
+ YAAAIIAAAGCAAGCAgABAAKAAAICgAACgoACAoKAAIKDAAECgwAAAAOAAQADgAADA4ABgwOAAIODgAADg
+ AADA4AAAAEAgAKDgIAAA4EAAYABAAABAYACAAGAAgCBgAGAggABA4KAAAECgAGBAwADgIOAAIEDgAACA
+ 4ADgoOAAYAD/ACBg/wAAoP8A4KD/AGD//wAICAgACAAAAAgIAAAAAJgACAAIAAAACAAACAAACBAQACA4
+ SAAgYIgAOHCIADhw+AAIGAAAEBAIACg4QAAwYHgAAACIACA4QAAoQFAAKFh4AHh4eAAwaIAAIGiQADh4
+ mAAACAgAEAgIABAYGAAgGBgASEhIABhIYAAoUGAAIFBoAChQaAAoWGgAMFhoAChoiAAweJgAKHioACiA
+ sAAIEAAACAgQAAgQGAAQGCAAGCAoABhAUAAoSFgAaGhoABhQcAAgWHAAKFhwADhgcAAYWIAAOGiAAIiI
+ iAAoaJAAKHCYACh4oAA4gKAAMICoAKioqAAwmNAAEDgAAChYAAAweAAAMIgQAAgYGAAYGBgACBggABAg
+ KAAgKCgAKCgoACAwOAA4ODgAKDhIADBQWABYWFgAGEhoADBYcAAYUHgAGFh4ACBYeAAoYHgAKGCAABhY
+ iAAgaJgAKICoACiIuAC4uLgAMJDIADiw6AAQCAAAABgAAAggAAAAOAAAMGgAABgQCAAwgAgAEAgQABgQ
+ EAAwmBgAGBggAAgYKAAAICgACCAoABgoMAAgKDAAGDBAABg4QAAYOFAAEEBYACBIWAAwSFgAOEhYACBI
+ YAAQSGgAOFhoABhIcAAoUHAAQFhwACBgeABAaIAAIGiIADBwiABAcIgAGGCQADhwkABYeJAACBCgAChw
+ oAAweKAAKIC4ACiQwAAwmMgAOKjgADBg6ABAsOgAELD4AAgoAAAIMAAAGDAAABhIAAAYUAAAKHgAAACY
+ AAAwmAAAAMgAABAACAAIEAgAEBgIABA4CAAYOAgAMHgIABAYEAAYGBAAIBgQACh4EAAwmBAAEBAYABgg
+ GAAoIBgAGCAgAAgIKAAgICgAGAgwAAggMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAn2KfdXV1XAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoo2+QIJCJb28Sd3em
+ nQAAAFuKqW0aqsd6Y5/DXAAAAAAAAAAAAAAAAAAAAAAAAAB3kAWQkG8SpqaJb28gsncAbIeSroyii21x
+ kczIwwAAAAAAAAAAAAAAAAAAAAAAAABoo4mJkLKylm9vb5BvdwwAcZO/fox7z2NjqsOss2MAWwAAAAAA
+ AAAAAAAAAAAAAAAAvaGmo5ANlgUFEiBvo1xjq3p6qMTJroBkxXt9cGzFnAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAL2ylgV3vQAAAGOvxMXXq41uh6yVjxqp1YhknwAAAAAAAAAAAAAAAAAAAAAAAAAAAABvsolbAAAA
+ +5KneouS2Kx4pZF9ndywsXuvkocAAAAAAAAAAAAAAAAAAAAAAAAAAAB3sncAAAAAdayHca95bH9+cKmv
+ fMVucG2B4MYAAAAAAAAAAAAAAAAAAAAAAAAAAAChsqMAAAAAe3VkyHF5kW59cN3eZc/XyXutyot7AAAA
+ AAAAAAAAAAAAAAAAAAAAAACjIKEAAACgfv94gX+PituLDI0/aoBxqxqOY8PgbQAAAAAAAAAAAAAAAAAA
+ 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
+ OAAABwAA//wYAAADAAD/+BgAAAMAAP/AAAAAAwAA/wAAAAADAAD8AAAAAAMAAPwAAAAAAwAA+AAAAAAD
+ AADwAAAAAAMAAPAAAAAAAwAA8AAAAAADAADwAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAQAA8AAPAA
+ ABgADwAA+AAAHgAHAAD8AAAfgAMAAP4QAA+ADwAA/gAADgADAAD8AAAfAAMAAPAfxD/ABwAA4B/n/+AB
+ AADgB+B/wB8AAOADgB+ADwAA8AOAHhAPAAD4BwB/8kcAAPz/gf/nLwAA+P/5/+8/AADwf/n//z8AAPh/
+ /P//vwAA+P////+fAAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//
+ /wAAAP8AAP//AAAAgACAgIAAgAAAAACAAAAAgIAAgIAAAECg4ABAgKAAYOAgAEDgQAAAIAAAACAgACAg
+ IABgIIAAIAAAACBAAAAAYAAAIIAAAGAgIABAYGAAAACgAGCAoACgoKAA4ODgAGDAAAAAACAAYABgAIAg
+ YAAAYMAAICAAACBgAABgYAAAQKAAAKDAAAAA4AAAYOAAAABAIAAgQCAAYAAgACBAQABgYEAAIABgACAg
+ YAAgQGAAYGBgACBggABgYIAAgACgAKCAoABgIMAAQKDAAGCgwAAgwMAAAADgAIDA4ACgwOAAAODgAIDg
+ 4ACA4AAAgIAgAEDgIACgACAAQABgAIAggAAgYP8AAKD/AAgIAAAICAgACAAAABhAWAAoUGAAaGhoADBg
+ eAAoaIgAMICoAChggAAACAgAEAgIABgYGAAoUGgAKFhwAChwkAAIGAgACBAQABAgKAAQKDgAIEhgACBQ
+ aAAAAHgAIFh4AChgeAAAeHgAeHh4AChogAAwaIAAIGCIADBoiAA4cIgAIGiQADhwkAAoeKgAKICwAAgQ
+ AAAIIAAACAAIABhICAAICBAAMIgQABAYGAAYICgAGCgwAEhISAAwSFgAGFBoAChYaAAICHgAOGiAACh4
+ oAAweKAAGAAAAAAIAAAAGAAACBgAABAoAAAYUAAAKGAAAChoAAAAeAAAAAAIAAgQCAAQEAgAGP8IACAY
+ EAAIEBgAMJAYABggIAAAACgACBAoACgwMAAAKDgAEDA4ADg4OAAoOEAAGDhIACA4SAAAQEgAMEBIAEhQ
+ UAAISFgAIEhYAChIWAAwUFgAIEhoAEhYaAAYUHAAMFhwABhYeAAoWHgAIFiAAEhwgACIiIgAGGCQAAAA
+ mAAgcJgAKHCYADB4mACYmJgAACjIAEBw+ACo//8ASAAAAFgAAABoAAAAeAAAABAIAABICAAAGCgAAAA4
+ AAAYOAAACEAAAAhIAAAoUAAAAFgAACBYAAAAaAAAIGgAADB4AAAAiAAAMIgAAGiIAACAmAAAGAAIADAI
+ CABgCAgAEBgIAAggCAAQIAgAECgIAAgwCAAQMAgAODAIABA4CAAYOAgAEEAIABhACAAgQAgAIFAIAChg
+ CAAwgAgAMJAIADCoCAAACBAAGBAQABggEAAoIBAAKGAQAChoEAAgeBAAKHgQAEh4EAAY+BAACAAYAAAI
+ GAAICBgAEAgYAAAQGAAQEBgAABgYAAgYGAAYMBgAKHgYADCYGAAwoBgAMKgYAGj/GABgCCAACBAgAAgY
+ IAAQGCAAGBggACggIABIcCAACAAoABAAKAAAECgAEBAoAAggKAAACDAASAgwAAgQMAAIKDAAECgwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAARxBSUlJHAAAAAABYWFlY8kYAAAAAAAAAAAAAAAAAAJFgqqRLSzAwBXMAkKJbW1pdSVmE
+ AAAAAAAAAAAAAAAAEJdLqhpgYKQFkf9NmVRanHVJVZRQAAAAAAAAAAAAAAAAUY6RO6qXMHNYW5MxdFpm
+ TVtPSpAAAAAAAAAAAAAAAAAAAAAFpIYAAFSeW09PU15KU05MaEkAAAAAAAAAAAAAAAAAAEtgAAAAk55j
+ ml5Mp2haXUqpW3IAAAAAAAAAAAAAAAAAS0sAAEpJoE5PpZpMZVWnMZyZVQAAAAAAAAAAAAAAAABLMAAA
+ cqCeSnppZGZKWzFNaV2ecAAAAAAAAAAAAAAAAEtLAACLVF6iZHROp2eiW1paeWnxAAAAAAAAAAAAAABI
+ GmAAAElJSmh6SWNVSk5hZqJ1VXUAAAAAAAAAAAAAlpmjeJAAk12eZXZ5p3WndnZpaUlbZgAAAAAAAAAA
+ m2lFRTw8PDZeWV1OlE0xeWlNeVVdZmmZUAAAAAAAjzYKRaysRUVFRa02SXSnYaFNTUxpTFSoTmKTAAAA
+ AI8KOkSrrKysrKxErDullF6fVWhiVakLaVWbVZoAAAAAqK2sRKZEqyCsRKummKBZT0xPTHppZVMLqVN4
+ cQAAAAA6O6sYGKYYGKsYphgELjejY09KTTZNaWdMNpkAAAAA+zc6XFxcd3d3XASmXEw6PZZiZ6g2ZUw2
+ T2QLnwAAAAAdoTtcLcV3pndfLi2jraMtcmNkT05np0xnaXhUAAAAAAD5NKL87xgYd1+eLZ06+1wAVE6o
+ p2cKZ2WjjgAAAAAAAAAQo67EcuZuj5jkACue9gAAkTEKeJfbioptRgAAAAAAAACIr0dLVwBXmEeL5Qg4
+ AAAAAOnqwNbVb9O5AAAAAAAAAP38RmDae3tfkDqIX0UAAABq3W9v6+2BtssAAAAAAAD9q6v7AFl1dV9f
+ mpgIXwAAAABrtG9v7O2BagAAAACSF52fL/AAAAAAAHUAAAAAAAAAAACC1NS+3s/ZzAAAAJ03MjqjdJ0A
+ AAC3FIMUtwAAAAAAzr27goK5awAAAAAAWaNgGho3dAAAyr+/v4ODtQAAAMmAAM+2zxMTawAAAAAAAK6z
+ kZ1xAAC1un3HVwAAAAAAAAAAawB/ftAAAAAAAABCNUIAAAAAAAAAAF8AAAAAAAAAAEcAAGpGAAAAAAAA
+ AEKsEQAAAAAAAAAAlZUAAAAAAAAAAAAAAEgAAAAAAAAAAC3hAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAA
+ AAD///////////4BwH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAA
+ AAHgAAAB4AAAAeAAAAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9
+ /s/j/P/v8///7ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AFEl
+ swBJDW0ABEMwAAJHSQAFDwIAXl9ZAHJtagBwfYQAQVNqAAFtAAAAZgAAAz0CABQ/AQAXQwAAGkAAAA8g
+ AQAhSJQAM1SRABw6fgAFVk0ADE48AAplaQAgWgIAMYcMACl7CwAOJwMAAAMtABwPNwAhIQAABxACAA9S
+ UAAnQUgAAISfACRoDAAxmwQAK4MHABMpAAA8P1kATBMbACQSVwAKL1EADS5CADFMVQABIF4AJ3CGADB2
+ kAAzdlEAMnY1ABMnEwBARooAVVq5ABgATwAWBn0ABh56AAULaQBOeKYAT3WSACpNZwAucpgAMHifADFx
+ nwA1b5YAMF93AEBalgBvjecADCLAAAkPpQAbJr4AFiLGAAAJjgAzbIEANGh8AClhgAAzfKEAMHWWADJz
+ kwAsW3MAQ4mvADyY9AAtgf8AIpr/ACuk/wBdk9UAG0tkACladQAqbI4AK3GUAC5vjwArbpEALWJ7ACdl
+ aAAOaoQAJJ20ABx0gQAeTF8AJ116ACViggAgZosAJmeJAChvlAAhZIgAH1ZyAHVmYwAaPVMAJ19+ACto
+ hgAmaIwAKGB9ACFdfAAgY4YAGU5qAFtgYQAYQVgAIVx7ACtrjgAtZYIAJmKAACNhgQAmX3wAIUpdAHp6
+ ewARN0wAH1R0ACdXcgApXnoAJ2B+ACligQAdSmAAKiopAGZlZQCRkZEAbm9vAFFSUwAWO08AJFRuACFP
+ agAhUm0AHD9RAAMKDgA3NjUAWlpaADk5OQA3NzcAPDk3AAYSGQAVNUgAFjFAAA8jLwABAgQAVQAAAP//
+ /wBWAAAA/f//AFcAAAD8//8AWAAAAPz//wBZAAAA/P//AFoAAAD9//8AWwAAAP7//wBcAAAA////AF4A
+ AAABAAAAXwAAAAEAAABgAAAAAQAAAGEAAAABAAAAYgAAAAEAAAB3IFIAbWFuAAAAAAAAAAAAAAAAAAAA
+ AAC0VWMAtFVjALwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAEAAAAAADgDAACfAQAAPwAAAAEA
+ AABAAAAAAQAAAEEAAAABAAAAQgAAAAEAAABFAAAA////AEYAAAD+//8ARwAAAP3//wBIAAAA/P//AEkA
+ AAD8//8ASgAAAPz//wBLAAAA/f//AEwAAAD///8ATQAAAAMAAABOAAAABwAAAE8AAAALAAAAUAAAABAA
+ AABRAAAAFQAAAFIAAAAZAAAAUwAAABwAAABUAAAAHgAAAFUAAAAeAAAAVgAAAB0AAABXAAAAGgAAAFgA
+ AAAWAAAAWQAAABIAAABaAAAADQAAAFsAAAAIAAAAXAAAAAQAAABeAAAA/v//AF8AAAD8//8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAI2Oj5CRkpOUlZYAAAAAAACCg4SFhoeIiYqLjAAAAAAAAAB6AHt8fX5/gIEAAAAA
+ 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
+</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/win/CS/handbrakepineapple.ico b/win/CS/handbrakepineapple.ico
new file mode 100644
index 000000000..57a056269
--- /dev/null
+++ b/win/CS/handbrakepineapple.ico
Binary files differ
diff --git a/win/CS/libraries/AxInterop.QTOControlLib.dll b/win/CS/libraries/AxInterop.QTOControlLib.dll
new file mode 100644
index 000000000..74b6e09e6
--- /dev/null
+++ b/win/CS/libraries/AxInterop.QTOControlLib.dll
Binary files differ
diff --git a/win/CS/libraries/Growl license.txt b/win/CS/libraries/Growl license.txt
new file mode 100644
index 000000000..397816435
--- /dev/null
+++ b/win/CS/libraries/Growl license.txt
@@ -0,0 +1,25 @@
+Growl.NET GNTP Connector Library
+-----------------------------------------------
+Copyright (c) 2008 - Growl for Windows
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
diff --git a/win/CS/libraries/Growl.Connector.dll b/win/CS/libraries/Growl.Connector.dll
new file mode 100644
index 000000000..01c0c59f6
--- /dev/null
+++ b/win/CS/libraries/Growl.Connector.dll
Binary files differ
diff --git a/win/CS/libraries/Growl.CoreLibrary.dll b/win/CS/libraries/Growl.CoreLibrary.dll
new file mode 100644
index 000000000..ca1545cff
--- /dev/null
+++ b/win/CS/libraries/Growl.CoreLibrary.dll
Binary files differ
diff --git a/win/CS/libraries/HandBrakeInterop.dll b/win/CS/libraries/HandBrakeInterop.dll
new file mode 100644
index 000000000..a2bb55eb0
--- /dev/null
+++ b/win/CS/libraries/HandBrakeInterop.dll
Binary files differ
diff --git a/win/CS/libraries/Microsoft.WindowsAPICodePack.Shell.dll b/win/CS/libraries/Microsoft.WindowsAPICodePack.Shell.dll
new file mode 100644
index 000000000..340ddd595
--- /dev/null
+++ b/win/CS/libraries/Microsoft.WindowsAPICodePack.Shell.dll
Binary files differ
diff --git a/win/CS/libraries/Microsoft.WindowsAPICodePack.dll b/win/CS/libraries/Microsoft.WindowsAPICodePack.dll
new file mode 100644
index 000000000..85605b750
--- /dev/null
+++ b/win/CS/libraries/Microsoft.WindowsAPICodePack.dll
Binary files differ
diff --git a/win/CS/libraries/Source/HandBrakeInteropSource.zip b/win/CS/libraries/Source/HandBrakeInteropSource.zip
new file mode 100644
index 000000000..b6340098b
--- /dev/null
+++ b/win/CS/libraries/Source/HandBrakeInteropSource.zip
Binary files differ
diff --git a/win/CS/libraries/WPFToolkit.Extended.dll b/win/CS/libraries/WPFToolkit.Extended.dll
new file mode 100644
index 000000000..6eccad0d4
--- /dev/null
+++ b/win/CS/libraries/WPFToolkit.Extended.dll
Binary files differ
diff --git a/win/CS/libraries/caliburn/Caliburn.Core.dll b/win/CS/libraries/caliburn/Caliburn.Core.dll
new file mode 100644
index 000000000..7a59cd831
--- /dev/null
+++ b/win/CS/libraries/caliburn/Caliburn.Core.dll
Binary files differ
diff --git a/win/CS/libraries/caliburn/Caliburn.DynamicProxy.dll b/win/CS/libraries/caliburn/Caliburn.DynamicProxy.dll
new file mode 100644
index 000000000..d390f3b55
--- /dev/null
+++ b/win/CS/libraries/caliburn/Caliburn.DynamicProxy.dll
Binary files differ
diff --git a/win/CS/libraries/caliburn/Caliburn.FluentValidation.dll b/win/CS/libraries/caliburn/Caliburn.FluentValidation.dll
new file mode 100644
index 000000000..37d3e6d4b
--- /dev/null
+++ b/win/CS/libraries/caliburn/Caliburn.FluentValidation.dll
Binary files differ
diff --git a/win/CS/libraries/caliburn/Caliburn.MEF.dll b/win/CS/libraries/caliburn/Caliburn.MEF.dll
new file mode 100644
index 000000000..83f95f168
--- /dev/null
+++ b/win/CS/libraries/caliburn/Caliburn.MEF.dll
Binary files differ
diff --git a/win/CS/libraries/caliburn/Caliburn.PresentationFramework.dll b/win/CS/libraries/caliburn/Caliburn.PresentationFramework.dll
new file mode 100644
index 000000000..afd521992
--- /dev/null
+++ b/win/CS/libraries/caliburn/Caliburn.PresentationFramework.dll
Binary files differ
diff --git a/win/CS/libraries/caliburn/Caliburn.ShellFramework.dll b/win/CS/libraries/caliburn/Caliburn.ShellFramework.dll
new file mode 100644
index 000000000..ccc8a8336
--- /dev/null
+++ b/win/CS/libraries/caliburn/Caliburn.ShellFramework.dll
Binary files differ
diff --git a/win/CS/libraries/caliburn/Caliburn.Windsor.dll b/win/CS/libraries/caliburn/Caliburn.Windsor.dll
new file mode 100644
index 000000000..bdad565e2
--- /dev/null
+++ b/win/CS/libraries/caliburn/Caliburn.Windsor.dll
Binary files differ
diff --git a/win/CS/libraries/caliburn/Castle.Core.dll b/win/CS/libraries/caliburn/Castle.Core.dll
new file mode 100644
index 000000000..3b22e09c6
--- /dev/null
+++ b/win/CS/libraries/caliburn/Castle.Core.dll
Binary files differ
diff --git a/win/CS/libraries/caliburn/Castle.Windsor.dll b/win/CS/libraries/caliburn/Castle.Windsor.dll
new file mode 100644
index 000000000..e35e112d3
--- /dev/null
+++ b/win/CS/libraries/caliburn/Castle.Windsor.dll
Binary files differ
diff --git a/win/CS/libraries/caliburn/Changes.txt b/win/CS/libraries/caliburn/Changes.txt
new file mode 100644
index 000000000..cf97d9352
--- /dev/null
+++ b/win/CS/libraries/caliburn/Changes.txt
@@ -0,0 +1,166 @@
+V1.1 Release
+-Fixed an issue in the WPF version of InteractionNode.
+-Fixed an event invocation order issue and a parameter update issue related to routed messages.
+-Updated Spring.NET to version 1.3.0.
+-Made DefaultWindowManager more friendly to WPF's NavigationWindow.
+-Fixed a bug with non-modal window shutdown in DefaultWindowManager.
+-Fixed a core bug in custom attribute discovery.
+-Enabled routed messages to declare default handlers. Now ActionMessage declares a default handler for its DataContext. This solves several Menu routing issues.
+-Fixed the apparently completely broken MEF adapter.
+-Greatly improved the flexibility of the DefaultViewStrategy.
+-Fixed a bug in the WPF DispatcherImpelmentation.
+-Fixed a bug in PresenterManager and MultiPresenterManager which caused screen changes to the same screen.
+-Enabled view chaching for Silverlight.
+-Fixed some bugs in the LOB samples.
+-Added Hyperlink/HyerlinkButton element defaults.
+-Update StructureMap to version 2.6.1.
+-Updated Windsor to version 2.1.1.
+-Added official support for .NET 4.0.
+-Fixed a bug in MultiPresenterManager for .NET 4.0.
+-Updated to MEF Preview 9.
+-Applied a patch from Adam Connelly to add AddRange to BindableCollection and IObservableCollection.
+-Update Ninject to official 2.0 release.
+-Fixed a bug in the Disable IAvailabilityEffect which was preventing it from handling ContentElements in WPF correctly.
+-Fixed a bug in the AvailabilityEffectConverter related to resolving custom effects from the container.
+-Enabled actions to search for handlers by routing through TemplatedParents in WPF.
+-Fixed a bug with expression tree method calls in .NET 4.0.
+-Enabled the dispatcher's default DispatcherPriority to be configured.
+-Applied a patch by varely to fix binding validation against properties with underscores in their name.
+-Updated Prism to the October 2009 release.
+-Updated the AutofacAdapter to support AutoFac 2.0.
+-Changed IsolatedStorageStateManager to use GetUserStoreForDomain for WPF and GetUserStoreForApplication for Silverlight. The method which gets the storage file is now overridable as well.
+-Changed Presenters to raise lifecycle events after initialization/activation/etc are complete.
+-Ensured that PresenterManagers do not call initialize/activate when CurrentPresenter is set unless they themselves are initialized/activated.
+-Fixed a bug with WPF Parameter instances raising value changes after being removed from the tree.
+-Fixed bugs in PropertyPathMonitor
+-Fixed a bug in the Autofac adapter related to singleton registration.
+-Enabled strong-named bulds of but only for .NET 4.0 and SL4.
+-Fixed a memory leak related to the DependenciesAttribute.
+-Fixed a bug in DefaultViewLocator.MakeInterface related to generic types.
+-Updated Unity to the latest version.
+-Updated Prism to the latest version.
+-Fixed a bug in the MessageBinder.
+-Fixed a bug in the contact manager sample.
+
+V1.1 Release Candidate
+-Added pre-initialization hooks to CaliburnApplication via Marco Amendola's patch.
+-Redesign of IThreadPool. AsynchronousAction will now pass itself as state when enqueing the background task.
+-Closed ticket #4672 by making PropertyChangedBase.PropertyChanged virtual.
+-Applied jagregory's patch to add single key gestures to WPF and Caliburn.
+-Applied marcoamendola's patch for enabling property path syntax with Preview and Dependency attributes. So you can now do things like [Dependencies("Model.IsValid")].
+-Applied marcoamendola's patch enabling type hinting for polymorphic databinding in Caliburn.Testability.
+-Applied etobi's patch to greatly improve Caliburn's parameter parsing in ActionMessages and CommandMessages. See http://caliburn.codeplex.com/WorkItem/View.aspx?WorkItemId=4644 for an explanation.
+-Closed ticket #4826. DefaultWindowManager now sets WindowStartupLocation to CenterOwner for UserControls hosted in windows. Title was enhanced to databind to IPresenter.DisplayName if model implements this interface.
+-Closed ticket #4833. Fixed an issue with ViewMetadata and invalid Windows in DefaultViewStrategy.
+-Fixed a bug with DefaultWindowManager which caused errors when creating main windows from a user control.
+-Improved the flexibility of the DefaultViewStrategy. It no longer requires separate namespaces for ViewModels/Views.
+-Closed ticket #4865. Fixed a bug in MultiPresenterManager which affects multiple presenter shutdown.
+-Applied sedovav's fix to the Spring adapter.
+-Enhanced DefaultViewStrategy's exception to report searched for types when view location fails.
+-Applied cheesus' recommendations to add unwire capability to IEventHandler.
+-Improved PresenterManager and MultiPresenterManager such that all changes to CurrentPresenter go through ChangeCurrentPresenterCore.
+-Bug fixes and improvements to DependenciesAttribute, PreviewAttribute, DependencyObserver and PropertyPathMonitory.
+-Added strongly-typed property change notification to PropertyChangedBase.
+-Fixed a bug in the SimpleContainer related to generic component registration.
+-Added ILifecycleNotifier.AttemptingShutdown which gets fired before the CanShutdownCore method on PresenterBase is called.
+-Fixed a bug in AsnychronousAction related to IPreExecute, BlocksInteraction and AffectsTriggers.
+-Added IWindowManager and DefaultWindowManager for SL3 and SL4.
+-Fixed a few bugs in property change testing.
+-Fixed a bug in the MEFAdapter.
+-Fixed a bug in the design-time support for Availability Effects in the AvailabilityEffectConverter.
+-Updated to Castle Windsor 2.1, Dynamic Proxy 2.2. Added official Windsor support for Silverlight 3.0 and 4.0
+-Fixed a minor bug in View Contexts.
+-Enabled WPF Action parameters to bind to default event/property by specifying only an element name as the arg.
+-Added the Silverlight Navigation Sample to How Tos.
+-Created three different build-*.cmd for the major build scenarios.
+
+V1 RTW
+-The DefaultBinder will now throw on type activation failure.
+-Made a change to the implementation of PresentationFrameworkModule.IsInDesignMode.
+-Removed Silverlight Windsor support because it apparently never worked.
+-Fixed some inconsistencies between the implementations of IStateManager by transforming various implementation methods into extension methods and adding a missing concept.
+-Fixed an inconsistency in the Open extension method. Added an extension point to the DefaultViewStrategy that will make it easier to work with proxied models.
+-A minor change to allow custom "rewriting" of the type that the DefaultBinder inspects. This will help with proxy scenarios. Just override GetModelType and return the underlying type. The same is true for DefaultViewStrategy. For the ActionFactory, override SelectMethods.
+-Fixed bugs in the View.Context and View.Strategy attached properties.
+-Fixed a bug in the AttachedEventTriggerParser.cs. We no longer query against dynamic assemblies.
+-Fixed a bug in the DefaultWindowManager. Fixed some compile errors in the LOB samples that resulted from some recent API fixes.
+-Added an IContainer interface which is a combination of IServiceLocator and IConfigurator. Implemented this on all the Adapters and registered this interface will all underlying containers. Fixed some bugs in the container adapter implementations.
+-Added an interface, IExtendedPresenter, which represents all presenter related capabilities. It is implemented by PresenterBase.
+-Fixed a major inconsistency with the IDispatcher and Execute APIs.
+-Added an extension point to MultiPresenter and MultiPresenterManager to allow a subclass to alter the default partial shutdown behavior.
+-Added the ability for a module to execute custom code just after framework startup by using the AfterStart method. Fixed some API inconsistencies in modules
+-Added a CancelResult exception which can be thrown or passed from an IResult in order to stop the enumeration of multiple results. This exception will not be bubbled up.
+-Added Prism integration!!!
+-Added WPF and Silverlight samples demonstrating how to configure Prism with Caliburn!!
+-Fixed a problem with the build file.
+-Fixed a bug in the way the MessageParserBase was parsing parameters.
+-Fixed a bug in the DefaultBinder which caused convention binding of IPresenter properties to fail if the property was readonly.
+-Made some improvements to AttachedEventTriggerParser.
+-Fixed the NinjectAdapter and the StructureMapAdapter.
+-Fixed databinding conventions in data templates for items controls.
+-Fixed a compilation error in the BackgroundProcessing how to.
+-Renamed DependencyHelper to DependencyObserver and made it a publicly available component.
+-Fixed some bugs with Dependent Actions, where triggers were being re-evaluated even when their own dependencies had not changed.
+-Enabled PreviewAttribute to work with Methods AND Properties. So you can now have a Save action and a CanSave *Property* which is hooked up. If you follow this naming convention, the filter will be added automatically. Finally, used the new DependencyObserver to allow Preview properties to be re-evaluated when a PropertyChange notification is raised for the preview property. As always, this works for Actions and Commands.
+-Made an improvement to AttachedEventTriggerParser so that it only investigates types which inherit from DependencyObject for events.
+-Enabled View.Context to flow through to the ItemTemplate of an ItemsControl when using convention bindings.
+-Made Caliburn/Prism integration even smoother.
+-Made more methods of DefaultBinder protected virtual.
+-Fixed a bug in the LOB sample.
+-Made some minor improvements to IExtendedPresenter.
+-Fixed a bug in AttachedEventTriggerParser. It now searches DependencyObject descendants *and* static classes for events.
+-Fixed more problems with the SpringAdapter. Discovered some issues with the MEFAdapter. Added container unit tests to cover additional scenarios.
+-Update MEF to Preview 8
+-Update to the latest build of Ninject 2.
+
+V1 RC3
+-Updated the StructureMap.dll to version 2.5.3.
+-Made a slight alteration to CoreConfiguration that makes it more friendly when run in a unit test.
+-Added an AutofacAdapter for .NET 3.5, Silverlight 2.0 and Silverlight 3.0.
+-Fixed bugs in the DefaultWindowManager.
+-Added IPresenterNode which allows presenters to be hooked up with a reference to their parent. All implementors of IPresenterHost now wire themselves when opening children and unwire themselves during a shutdown.
+-Created the IBinder interface. This replaces the functionality that was in the extension method AttachTo. This interface is meant to provide a pluggable way to change the behavior of Model/View wire-up.
+-Updated DefaultBinder to allow for convention-based action wire-up.
+-Fixed a bug in auto-registration with CommandAttribute.
+-Fixed several bugs with CaliburnApplication
+-Fixed a bug where certain module scenarios would cause the PresentationFrameworkModule to be configured twice.
+-Fixed some inconsistencies in the DefaultWindowManager and CaliburnApplication.silverlight.cs.
+-Removed a pesky attribute in the WPF ContactManager's .config file that was causing bugs for some people.
+-Removed Message.Attach2nd, Message.Attach3rd and Message.Attach4th. You can now attach an arbitrary number of messages with Message.Attach by separating each message with a semicolon. This caused a breaking change to the IParser implementation, but it is unlikely that will affect many people.
+-Fixed some bugs in Parameter.silverlight.cs related to event defaults for elements that are bound.
+-Improved the BackgroundProcessing sample.
+-Fixed some bugs in parsing of parameters for messages. There were certain scenarios where the parser could not differentiate between string literals and references to control. To pass literals as a message parameter (short syntax only), you must surround it with single quotes.
+-Added AttachedEventTriggerParser. We can all now use attached event triggers in the short syntax. Usage is as follows: cal:Message.Attach="[AttachedEvent ButtonBase.Click] = [Action MyAction]" The caveat is that we cannot map namespaces from xaml into the parser. To work around this problem, we search through all AppDomain assemblies by default. If you would like to optimize this, simply inherit from AttachedEventTriggerParser and override GetSearchableAssemblies. Then register your ITriggerParser with IParser under the name "AttachedEvent"
+-Enabled the DefaultViewStrategy to handle custom contexts without the need of a ViewStrategyAttribute. If a context is the DefaultViewStrategy will treat the view name as a folder name by adding an "s" and search that folder for views with the context as their name.
+-Fixed various bugs in DefaultViewStrategy.
+-Fixed various bugs in AsynchronousAction and in the BackgroundProcessing sample.
+-Updated MEF to Preview 7.
+-Changed IMessageBinder.BindOutcome to IMessageBinder.CreateResult.
+-Enabled the DefaultBinder to look for properties named with the pattern Can + Action and wire up the IsEnabled property automatically.
+-Fixed the signatures of extension methods for IWindowManager.
+-Fixed a bug in binding validation that occurs when properties are overridden on a bound type.
+-Provided a way for a presenter to pass a dialog result to the view on close.
+-Made some improvements to exception messages in the case of parameter count mismatch during invocation.
+-Updated Caliburn's build to work with Silverlight 3.0.40818.0 service release.
+-Extended the IDispatcher to allow async UI invocation.
+
+V1 RC2
+-Added the official xmlns for caliburn: http://www.caliburnproject.org
+-Added a Completed event to IResult (renamed from IExecutableResult)
+-Renamed CompositeResult to SequentialResult
+-Added a Starting event to IBackgroundTask.
+-The filter interfaces have been renamed IPreExecuteFilter -> IPreProcessor, IPostExecuteFilter -> IPostProcessor, IRescueFilter -> IRescue, IInstanceAwareFilter -> IHandlerAware. Also, IMethodBinder was renamed to IMessageBinder and IMessageSupportingMethodBinding was renamed to IRoutedMessageWithOutcome (which caused a change in the IResult interface). The property ReturnPath on ActionMessage was renamed to OutcomePath.
+-Enabled Unity, Castle, Ninject and MEF Adapters for Silverlight.
+-Improvements to DefaultViewStrategy
+-Added parameter and results of message to be bound to Resources.
+-Enabled parameter special files to be "dotted" on. ie: $eventArgs.My.Property
+-Additional attached properties are necessary: Attach, Attach2nd, Attach3rd and Attach4th
+-IPresenterHost's Presenters is now an instance of IObservableCollection<IPresenter>
+-Introduced IAssemblySource as a way for any component to be made aware of inspectable assemblies.
+-Reworked ComponentInfo
+-Added the IWindowManager service for WPF. This enables a model-centric mechanism for showing dialogs and non-modal windows.
+-Added the IViewAware interface which can be implemented by a model/presenter if it wishes to be aware of its view.
+-Updated the build to compile for .NET 3.5, Silverlight 2.0 and Silverlight 3.0
+-Updated all samples so that they has both SL2 and SL3 projects.
+-Many more small features and API improvements...
+-Fixed tons of bugs... \ No newline at end of file
diff --git a/win/CS/libraries/caliburn/Common.Logging.dll b/win/CS/libraries/caliburn/Common.Logging.dll
new file mode 100644
index 000000000..d7a8f1582
--- /dev/null
+++ b/win/CS/libraries/caliburn/Common.Logging.dll
Binary files differ
diff --git a/win/CS/libraries/caliburn/FluentValidation.dll b/win/CS/libraries/caliburn/FluentValidation.dll
new file mode 100644
index 000000000..6112609c5
--- /dev/null
+++ b/win/CS/libraries/caliburn/FluentValidation.dll
Binary files differ
diff --git a/win/CS/libraries/caliburn/License.txt b/win/CS/libraries/caliburn/License.txt
new file mode 100644
index 000000000..687850b19
--- /dev/null
+++ b/win/CS/libraries/caliburn/License.txt
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2008 Blue Spire Consulting, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE. \ No newline at end of file
diff --git a/win/CS/libraries/caliburn/Microsoft.Practices.Composite.Presentation.dll b/win/CS/libraries/caliburn/Microsoft.Practices.Composite.Presentation.dll
new file mode 100644
index 000000000..ab33ee5eb
--- /dev/null
+++ b/win/CS/libraries/caliburn/Microsoft.Practices.Composite.Presentation.dll
Binary files differ
diff --git a/win/CS/libraries/caliburn/Microsoft.Practices.Composite.dll b/win/CS/libraries/caliburn/Microsoft.Practices.Composite.dll
new file mode 100644
index 000000000..5b19c9f18
--- /dev/null
+++ b/win/CS/libraries/caliburn/Microsoft.Practices.Composite.dll
Binary files differ
diff --git a/win/CS/libraries/caliburn/Readme.txt b/win/CS/libraries/caliburn/Readme.txt
new file mode 100644
index 000000000..396ebbb09
--- /dev/null
+++ b/win/CS/libraries/caliburn/Readme.txt
@@ -0,0 +1,25 @@
+Caliburn
+
+Running one of the build commands (build-*.cmd) will execute the NAnt build script in a the chosen configuration.
+
+Throughout the solution you will see files with the extensions .silverlight.cs or .wpf.cs which indicate major platform differences.
+Elsewhere I have used various ammounts of conditional compilation as necessary.
+
+Adapters for popular DI frameworks I have included are:
+Caliburn.Castle
+Caliburn.Spring
+Caliburn.StructureMap
+Caliburn.Unity
+Caliburn.Ninject
+Caliburn.Autofac
+Caliburn.MEF (technically not a DI framework)
+
+Using a DI container is not necessary, as Caliburn has a simple built-in container it uses by default.
+
+If you are using Prism, have a look at Caliburn.Prism.
+Unit tests for Caliburn's features can be found in Tests.Caliburn.
+
+Please see the samples folder for examples of how to use the most prominent features of Caliburn.
+There are identical samples for both WPF and Silverlight. You can also find some how to's and larger examples there.
+
+I hope this helps you in your development of applications for WPF and Silverlight. Enjoy! \ No newline at end of file
diff --git a/win/CS/libraries/caliburn/System.CoreEx.dll b/win/CS/libraries/caliburn/System.CoreEx.dll
new file mode 100644
index 000000000..e648852a5
--- /dev/null
+++ b/win/CS/libraries/caliburn/System.CoreEx.dll
Binary files differ
diff --git a/win/CS/libraries/caliburn/System.Interactive.dll b/win/CS/libraries/caliburn/System.Interactive.dll
new file mode 100644
index 000000000..cbbc484a9
--- /dev/null
+++ b/win/CS/libraries/caliburn/System.Interactive.dll
Binary files differ
diff --git a/win/CS/libraries/caliburn/System.Reactive.dll b/win/CS/libraries/caliburn/System.Reactive.dll
new file mode 100644
index 000000000..c6645a05e
--- /dev/null
+++ b/win/CS/libraries/caliburn/System.Reactive.dll
Binary files differ
diff --git a/win/CS/libraries/caliburn/Thanks.txt b/win/CS/libraries/caliburn/Thanks.txt
new file mode 100644
index 000000000..7f71907ad
--- /dev/null
+++ b/win/CS/libraries/caliburn/Thanks.txt
@@ -0,0 +1,20 @@
+Many thanks to all those whose code, blogs etc. inspired me or helped to solve some of the difficult problems.
+Special thanks to (in no particular order):
+
+Contributors
+Marco Amendola - http://marcoamendola.wordpress.com/
+Ryan Rauh - http://rauhski.blogspot.com
+Michael Davis - n/a
+Chistopher Bennage - http://devlicio.us/blogs/christopher_bennage/default.aspx
+Ayende Rahien - http://www.ayende.com
+
+Inspiration
+Kevin Moore - http://j832.com/BagOTricks/
+Nick Guerrera - http://blogs.msdn.com/nicholg/archive/2006/06/04/617466.aspx
+Jeremy Miller - http://codebetter.com/blogs/jeremy.miller/archive/2007/07/25/the-build-your-own-cab-series-table-of-contents.aspx
+John Gossman - http://blogs.msdn.com/johngossman/archive/2005/10/08/478683.aspx
+Dan Crevier - http://blogs.msdn.com/dancre/archive/tags/DM-V-VM/default.aspx
+Brownie Points - http://mbrownchicago.spaces.live.com/Blog/cns!2221DC39E0C749A4!596.entry
+Kevin Hoffman - http://dotnetaddict.dotnetdevelopersjournal.com/read/poster/87984.htm
+
+I hope you find this framework useful or inspiring for solving the problems in your own work. \ No newline at end of file