OSDN Git Service

Installer: Add installer script for per-user installation
authorTakashi Sawanaka <sdottaka@users.sourceforge.net>
Mon, 20 May 2019 22:35:25 +0000 (07:35 +0900)
committerTakashi Sawanaka <sdottaka@users.sourceforge.net>
Mon, 20 May 2019 22:35:25 +0000 (07:35 +0900)
Installer/InnoSetup/WinMergeX64.is6.iss [new file with mode: 0644]
Installer/InnoSetup/modpath.is6.iss [new file with mode: 0644]

diff --git a/Installer/InnoSetup/WinMergeX64.is6.iss b/Installer/InnoSetup/WinMergeX64.is6.iss
new file mode 100644 (file)
index 0000000..9d3d6d4
--- /dev/null
@@ -0,0 +1,956 @@
+;           Programmed by:  Christian Blackburn, Christian List, Kimmo Varis,\r
+;                 Purpose:  The is the Inno Setup installation script for distributing our WinMerge application.\r
+; Tools Needed To Compile:  Inno Setup 5.1.7+ (http://www.jrsoftware.org/isdl.php), Inno Setup QuickStart Pack 5.1.7+(http://www.jrsoftware.org/isdl.php)\r
+;                           note: the versions of Inno Setup and the QuickStart Pack should be identical to ensure proper function\r
+;Directly Dependant Files:  Because this is an installer. It would be difficult to list and maintain each of the files referenced\r
+;                           throughout the script in the header.  If you search this plain text script for a particular file in our Subversio repository and it\r
+;                           doesn't appear then this script is not directly dependant on that file.\r
+;Compilation Instructions:  1.  Open this file in Inno Setup or ISTool\r
+;                           2.  Make sure Compression=LZMA/Ultra, InternalCompressLevel=Ultra, and SolidCompression=True these values are lowered during\r
+;                               development to speed up compilation, however at release we want the intaller to be as strong as possible.\r
+;                           3. Check all files are present:\r
+;                                   -From ISTool Click\r
+;                           4.  Compile the script: "Project" --> "Verify Files..."\r
+;                                   -From Inno Setup "Click "Build" --> "Compile"\r
+;                                   -From ISTool Click "Project" --> "Compile Setup"\r
+;                           5.  The compiled installer will appear in the \InnoSetup\Output\ directory at currently should be around 1.5MBs in size.\r
+;\r
+; Installer To Do List:\r
+; #  Make the Install7ZipDll() Function automatically work with future versions of Merge7zDLL (Use GetCurentFileName)\r
+; #  Provide the option to or not to assign the Ctrl+Alt+M accelerator to WinMerge., make sure it's turned on for at least one icon\r
+; #  Add WinMerge to the user's path so they can execute comparison's from a Dos Prompt (Cmd.exe/Command.exe)\r
+; #  We need to unregister, and delete the ShellExtension Dll if the user doesn't want it, during installation\r
+\r
+; #  Display integration options in gray rather than hiding them if the user doesn't have the application in question installed\r
+; #  We need to ask those that have the RCLLocalization.dll in their plugins folder if they actually want it, their answer will need to be stored in the registry\r
+; #  Write code to detect "\Programs\WinMerge\WinMerge" type start menu installs\r
+;\r
+; Custom Installer Pages:\r
+; #  Bundle 7-Zip with WinMerge or provide on the fly download capability.\r
+; #  Allow users to set their working directory via a custom installer page\r
+;\r
+; Things that make the user's life easier:\r
+; #  Create instructions and a sample language file using the Inno Setup Translator Tool (http://www2.arnes.si/~sopjsimo/translator.html)\r
+; #  Add "WinMerge is running would you like to close it now?" support with programmatic termination\r
+;     -Note: We'll need to add a declares statement to our ISX code so that we can use FindWindowEx directly or a mutex search or two\r
+; #  Rather than requiring users to restart we could just kill all intances of Explorer.exe, but we'll need to prompt the user first and restart it\r
+;    once the ShellExtension.dll file has been added or removed.\r
+;\r
+; Non-Essential Features:\r
+; #  See about getting a higher resolution copy of the Users's Guide.ico source art from somebody (A 32x32, and or 48x48 would be nice)\r
+; #  Using the registry set the order our icons appear within their group in the start menu.:\r
+;      1.  WinMerge\r
+;      2.  Read Me\r
+;      3.  Users's Guide\r
+;      4.  WinMerge on the Web\r
+; #  Create the ability to install to two start menu groups simultaneously\r
+;\r
+; Not yet possible (Limited by Inno Setup):\r
+; #  While uninstalling prompt the user as to whether or not they'd like to remove their WinMerge preferences too?\r
+\r
+#define AppVersion GetFileVersion(SourcePath + "\..\..\Build\X64\MergeUnicodeRelease\WinMergeU.exe")\r
+\r
+[Setup]\r
+AppName=WinMerge\r
+AppVersion={#AppVersion}\r
+AppVerName=WinMerge {#AppVersion} x64\r
+AppPublisher=Thingamahoochie Software\r
+AppPublisherURL=http://WinMerge.org/\r
+AppSupportURL=http://WinMerge.org/\r
+AppUpdatesURL=http://WinMerge.org/\r
+WizardStyle=modern\r
+UsePreviousPrivileges=no\r
+PrivilegesRequiredOverridesAllowed=dialog\r
+\r
+; Installer executable's version resource info\r
+VersionInfoCompany=http://winmerge.org\r
+VersionInfoDescription=WinMerge Installer\r
+VersionInfoVersion={#AppVersion}\r
+\r
+;This is in case an older version of the installer happened to be\r
+DirExistsWarning=no\r
+\r
+;Tells the installer to only display a select language dialog if the an exact match wasn't found\r
+ShowLanguageDialog=auto\r
+\r
+DefaultDirName={autopf}\WinMerge\r
+DefaultGroupName=WinMerge\r
+DisableStartupPrompt=true\r
+AllowNoIcons=true\r
+InfoBeforeFile=..\..\Docs\users\GPL.rtf\r
+InfoAfterFile=..\..\Docs\users\ReadMe.txt\r
+\r
+OutputBaseFilename=WinMerge-{#AppVersion}-x64-Setup\r
+\r
+;This must be admin to install C++ Runtimes and shell extension\r
+PrivilegesRequired=admin\r
+\r
+;Windows Vista or later required\r
+MinVersion=0,6.0\r
+\r
+UninstallDisplayIcon={app}\{code:ExeName}\r
+\r
+;Artwork References\r
+WizardImageFile=Art\Large Logo.bmp\r
+WizardSmallImageFile=Art\Small Logo.bmp\r
+WizardImageStretch=true\r
+\r
+;It is confusing, if Setup/Uninstall use the same icon like WinMerge!\r
+;SetupIconFile=..\..\src\res\Merge.ico\r
+\r
+;Compression Parameters\r
+;Please note while Compression=lzma/ultra and InternalCompressLevel=Ultra are better than max\r
+;they also require 320 MB of memory for compression. If you're system has at least 256MB RAM then by all\r
+;means set it to ultra before compilation\r
+Compression=lzma/ultra\r
+InternalCompressLevel=ultra\r
+SolidCompression=true\r
+\r
+; Update file associations for shell (project files)\r
+ChangesAssociations=true\r
+; Updates PATH\r
+ChangesEnvironment=true\r
+OutputDir=..\..\Build\r
+AlwaysShowComponentsList=true\r
+\r
+ArchitecturesInstallIn64BitMode=x64\r
+\r
+;SignTool=signbat $f\r
+;SignedUninstaller=yes\r
+\r
+[Languages]\r
+;Inno Setup's Native Language\r
+Name: English; MessagesFile: ..\..\Translations\InnoSetup\English.isl\r
+\r
+;Localizations:\r
+Name: Basque; MessagesFile: ..\..\Translations\InnoSetup\Basque.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-Basque.txt\r
+Name: Bulgarian; MessagesFile: ..\..\Translations\InnoSetup\Bulgarian.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-Bulgarian.txt\r
+Name: Catalan; MessagesFile: ..\..\Translations\InnoSetup\Catalan.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-Catalan.txt\r
+Name: Chinese_Simplified; MessagesFile: ..\..\Translations\InnoSetup\Chinese_Simplified.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-ChineseSimplified.txt\r
+Name: Chinese_Traditional; MessagesFile: ..\..\Translations\InnoSetup\Chinese_Traditional.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-ChineseTraditional.txt\r
+Name: Croatian; MessagesFile: ..\..\Translations\InnoSetup\Croatian.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-Croatian.txt\r
+Name: Czech; MessagesFile: ..\..\Translations\InnoSetup\Czech.isl\r
+Name: Danish; MessagesFile: ..\..\Translations\InnoSetup\Danish.isl\r
+Name: Dutch; MessagesFile: ..\..\Translations\InnoSetup\Dutch.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-Dutch.txt\r
+Name: Finnish; MessagesFile: ..\..\Translations\InnoSetup\Finnish.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-Finnish.txt\r
+Name: French; MessagesFile: ..\..\Translations\InnoSetup\French.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-French.txt\r
+Name: Galician; MessagesFile: ..\..\Translations\InnoSetup\Galician.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-Galician.txt\r
+Name: German; MessagesFile: ..\..\Translations\InnoSetup\German.isl\r
+Name: Greek; MessagesFile: ..\..\Translations\InnoSetup\Greek.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-Greek.txt\r
+Name: Hungarian; MessagesFile: ..\..\Translations\InnoSetup\Hungarian.isl\r
+Name: Italian; MessagesFile: ..\..\Translations\InnoSetup\Italian.isl\r
+Name: Japanese; MessagesFile: ..\..\Translations\InnoSetup\Japanese.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-Japanese.txt\r
+Name: Korean; MessagesFile: ..\..\Translations\InnoSetup\Korean.isl\r
+Name: Lithuanian; MessagesFile: ..\..\Translations\InnoSetup\Lithuanian.isl\r
+Name: Norwegian; MessagesFile: ..\..\Translations\InnoSetup\Norwegian.isl\r
+Name: Persian; MessagesFile: ..\..\Translations\InnoSetup\Persian.isl\r
+Name: Polish; MessagesFile: ..\..\Translations\InnoSetup\Polish.isl\r
+Name: Portuguese; MessagesFile: ..\..\Translations\InnoSetup\Portuguese.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-Portuguese.txt\r
+Name: PortugueseBrazilian; MessagesFile: ..\..\Translations\InnoSetup\Brazilian.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-Brazilian.txt\r
+Name: Romanian; MessagesFile: ..\..\Translations\InnoSetup\Romanian.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-Romanian.txt\r
+Name: Russian; MessagesFile: ..\..\Translations\InnoSetup\Russian.isl\r
+Name: Serbian; MessagesFile: ..\..\Translations\InnoSetup\Serbian.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-Serbian.txt\r
+Name: Sinhala; MessagesFile: ..\..\Translations\InnoSetup\Sinhala.isl\r
+Name: Slovak; MessagesFile: ..\..\Translations\InnoSetup\Slovak.isl\r
+Name: Slovenian; MessagesFile: ..\..\Translations\InnoSetup\Slovenian.isl\r
+Name: Spanish; MessagesFile: ..\..\Translations\InnoSetup\Spanish.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-Spanish.txt\r
+Name: Swedish; MessagesFile: ..\..\Translations\InnoSetup\Swedish.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-Swedish.txt\r
+Name: Turkish; MessagesFile: ..\..\Translations\InnoSetup\Turkish.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-Turkish.txt\r
+Name: Ukrainian; MessagesFile: ..\..\Translations\InnoSetup\Ukrainian.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-Ukrainian.txt\r
+\r
+\r
+[Messages]\r
+English.FinishedLabel=Setup has finished installing WinMerge on your computer.\r
+English.SetupAppTitle=Setup - WinMerge {#AppVersion}\r
+English.WizardInfoBefore=License Agreement\r
+English.InfoBeforeLabel=GNU General Public License\r
+\r
+\r
+[Types]\r
+Name: typical; Description: {cm:TypicalInstallation}\r
+Name: full; Description: {cm:FullInstallation}\r
+Name: compact; Description: {cm:CompactInstallation}\r
+Name: custom; Description: {cm:CustomInstallation}; Flags: iscustom\r
+\r
+\r
+[Components]\r
+; Executable, libraries, documentation\r
+Name: Core; Description: {cm:AppCoreFiles}; Types: full custom typical compact; Flags: fixed\r
+Name: ShellExtension32bit; Description: {cm:ShellExtension32bit}; Types: full typical\r
+\r
+Name: filters; Description: {cm:Filters}; Flags: disablenouninstallwarning; Types: full typical\r
+Name: Plugins; Description: {cm:Plugins}; Flags: disablenouninstallwarning; Types: full typical\r
+Name: Frhed; Description: {cm:Frhed}; Flags: disablenouninstallwarning; Types: full typical\r
+Name: WinIMerge; Description: {cm:WinIMerge}; Flags: disablenouninstallwarning; Types: full typical\r
+Name: ArchiveSupport; Description: {cm:ArchiveSupport}; Flags: disablenouninstallwarning; Types: full typical\r
+Name: Patch; Description: {cm:Patch}; Flags: disablenouninstallwarning; Types: full typical\r
+\r
+;Language components\r
+Name: Languages; Description: {cm:Languages}; Flags: disablenouninstallwarning\r
+Name: Languages\Basque; Description: {cm:BasqueLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Basque\r
+Name: Languages\Basque; Description: {cm:BasqueLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Basque\r
+\r
+Name: Languages\Bulgarian; Description: {cm:BulgarianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Bulgarian\r
+Name: Languages\Bulgarian; Description: {cm:BulgarianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Bulgarian\r
+\r
+Name: Languages\Catalan; Description: {cm:CatalanLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Catalan\r
+Name: Languages\Catalan; Description: {cm:CatalanLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Catalan\r
+\r
+Name: Languages\Chinese_Simplified; Description: {cm:ChineseSimplifiedLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Chinese_Simplified\r
+Name: Languages\Chinese_Simplified; Description: {cm:ChineseSimplifiedLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Chinese_Simplified\r
+\r
+Name: Languages\Chinese_Traditional; Description: {cm:ChineseTraditionalLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Chinese_Traditional\r
+Name: Languages\Chinese_Traditional; Description: {cm:ChineseTraditionalLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Chinese_Traditional\r
+\r
+Name: Languages\Croatian; Description: {cm:CroatianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Croatian\r
+Name: Languages\Croatian; Description: {cm:CroatianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Croatian\r
+\r
+Name: Languages\Czech; Description: {cm:CzechLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Czech\r
+Name: Languages\Czech; Description: {cm:CzechLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Czech\r
+\r
+Name: Languages\Danish; Description: {cm:DanishLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Danish\r
+Name: Languages\Danish; Description: {cm:DanishLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Danish\r
+\r
+Name: Languages\Dutch; Description: {cm:DutchLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Dutch\r
+Name: Languages\Dutch; Description: {cm:DutchLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Dutch\r
+\r
+Name: Languages\Finnish; Description: {cm:FinnishLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Finnish\r
+Name: Languages\Finnish; Description: {cm:FinnishLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Finnish\r
+\r
+Name: Languages\French; Description: {cm:FrenchLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not French\r
+Name: Languages\French; Description: {cm:FrenchLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: French\r
+\r
+Name: Languages\Galician; Description: {cm:GalicianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Galician\r
+Name: Languages\Galician; Description: {cm:GalicianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Galician\r
+\r
+Name: Languages\German; Description: {cm:GermanLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not German\r
+Name: Languages\German; Description: {cm:GermanLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: German\r
+\r
+Name: Languages\Greek; Description: {cm:GreekLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Greek\r
+Name: Languages\Greek; Description: {cm:GreekLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Greek\r
+\r
+Name: Languages\Hungarian; Description: {cm:HungarianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Hungarian\r
+Name: Languages\Hungarian; Description: {cm:HungarianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Hungarian\r
+\r
+Name: Languages\Italian; Description: {cm:ItalianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Italian\r
+Name: Languages\Italian; Description: {cm:ItalianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Italian\r
+\r
+Name: Languages\Japanese; Description: {cm:JapaneseLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Japanese\r
+Name: Languages\Japanese; Description: {cm:JapaneseLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Japanese\r
+\r
+Name: Languages\Korean; Description: {cm:KoreanLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Korean\r
+Name: Languages\Korean; Description: {cm:KoreanLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Korean\r
+\r
+Name: Languages\Lithuanian; Description: {cm:LithuanianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Lithuanian\r
+Name: Languages\Lithuanian; Description: {cm:LithuanianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Lithuanian\r
+\r
+Name: Languages\Norwegian; Description: {cm:NorwegianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Norwegian\r
+Name: Languages\Norwegian; Description: {cm:NorwegianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Norwegian\r
+\r
+Name: Languages\Persian; Description: {cm:PersianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Persian\r
+Name: Languages\Persian; Description: {cm:PersianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Persian\r
+\r
+Name: Languages\Polish; Description: {cm:PolishLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Polish\r
+Name: Languages\Polish; Description: {cm:PolishLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Polish\r
+\r
+Name: Languages\Portuguese; Description: {cm:PortugueseLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Portuguese\r
+Name: Languages\Portuguese; Description: {cm:PortugueseLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Portuguese\r
+\r
+Name: Languages\PortugueseBrazilian; Description: {cm:PortugueseBrazilLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not PortugueseBrazilian\r
+Name: Languages\PortugueseBrazilian; Description: {cm:PortugueseBrazilLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: PortugueseBrazilian\r
+\r
+Name: Languages\Romanian; Description: {cm:RomanianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Romanian\r
+Name: Languages\Romanian; Description: {cm:RomanianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Romanian\r
+\r
+Name: Languages\Russian; Description: {cm:RussianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Russian\r
+Name: Languages\Russian; Description: {cm:RussianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Russian\r
+\r
+Name: Languages\Serbian; Description: {cm:SerbianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Serbian\r
+Name: Languages\Serbian; Description: {cm:SerbianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Serbian\r
+\r
+Name: Languages\Sinhala; Description: {cm:SinhalaLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Sinhala\r
+Name: Languages\Sinhala; Description: {cm:SinhalaLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Sinhala\r
+\r
+Name: Languages\Slovak; Description: {cm:SlovakLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Slovak\r
+Name: Languages\Slovak; Description: {cm:SlovakLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Slovak\r
+\r
+Name: Languages\Slovenian; Description: {cm:SlovenianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Slovenian\r
+Name: Languages\Slovenian; Description: {cm:SlovenianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Slovenian\r
+\r
+Name: Languages\Spanish; Description: {cm:SpanishLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Spanish\r
+Name: Languages\Spanish; Description: {cm:SpanishLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Spanish\r
+\r
+Name: Languages\Swedish; Description: {cm:SwedishLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Swedish\r
+Name: Languages\Swedish; Description: {cm:SwedishLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Swedish\r
+\r
+Name: Languages\Turkish; Description: {cm:TurkishLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Turkish\r
+Name: Languages\Turkish; Description: {cm:TurkishLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Turkish\r
+\r
+Name: Languages\Ukrainian; Description: {cm:UkrainianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Ukrainian\r
+Name: Languages\Ukrainian; Description: {cm:UkrainianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Ukrainian\r
+\r
+\r
+[Tasks]\r
+Name: ShellExtension; Description: {cm:ExplorerContextMenu}; GroupDescription: {cm:OptionalFeatures}\r
+Name: modifypath; Description: {cm:AddToPath}; GroupDescription: {cm:OptionalFeatures}; Flags: unchecked\r
+Name: TortoiseCVS; Description: {cm:IntegrateTortoiseCVS}; GroupDescription: {cm:OptionalFeatures}; Check: TortoiseCVSInstalled\r
+Name: TortoiseGit; Description: {cm:IntegrateTortoiseGit}; GroupDescription: {cm:OptionalFeatures}; Check: TortoiseGitInstalled; MinVersion: 0,5.0.2195sp3\r
+Name: TortoiseSVN; Description: {cm:IntegrateTortoiseSVN}; GroupDescription: {cm:OptionalFeatures}; Check: TortoiseSVNInstalled; MinVersion: 0,5.0.2195sp3\r
+Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked\r
+Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; OnlyBelowVersion: 0,6.1\r
+\r
+[InstallDelete]\r
+; Diff.txt is a file left over from previous versions of WinMerge (before version 2.0), we just delete it to be nice.\r
+Type: files; Name: {app}\Diff.txt\r
+\r
+;All of these files are removed so if the user upgrades their operating system or changes their language selections only the\r
+;necessary files will be left in the installation folder\r
+;Another reason these files might be strays is if a user extracted one of the experimental builds such as:\r
+;WinMerge.{#AppVersion}-exe.7z.\r
+Name: {app}\WinMerge.exe; Type: files\r
+Name: {app}\WinMergeU.exe; Type: files; MinVersion: 0, 4\r
+\r
+;Remove manifest files as we don't need them in 2.6.2 / 2.7.1.1 or later\r
+Name: {app}\WinMerge.exe.manifest; Type: files\r
+Name: {app}\WinMergeU.exe.manifest; Type: files\r
+\r
+Name: {app}\Merge7z457.dll; Type: files\r
+Name: {app}\Merge7z457U.dll; Type: files; MinVersion: 0, 4\r
+\r
+Name: {app}\Merge7z465.dll; Type: files\r
+Name: {app}\Merge7z465U.dll; Type: files; MinVersion: 0, 4\r
+\r
+Name: {app}\Merge7z920.dll; Type: files\r
+Name: {app}\Merge7z920U.dll; Type: files; MinVersion: 0, 4\r
+\r
+;This won't work, because the file has to be unregistered, and explorer closed, first.\r
+;Name: {app}\ShellExtension.dll; Type: files; Check: TaskDisabled('ShellExtension')\r
+\r
+; Remove existing .lang files - we don't need them anymore as we are\r
+; using PO files now.\r
+Name: {app}\Languages\MergeBrazilian.lang; Type: files\r
+Name: {app}\Languages\MergeBulgarian.lang; Type: files\r
+Name: {app}\Languages\MergeCatalan.lang; Type: files\r
+Name: {app}\Languages\MergeChineseSimplified.lang; Type: files\r
+Name: {app}\Languages\MergeChineseTraditional.lang; Type: files\r
+Name: {app}\Languages\MergeCzech.lang; Type: files\r
+Name: {app}\Languages\MergeDanish.lang; Type: files\r
+Name: {app}\Languages\MergeDutch.lang; Type: files\r
+Name: {app}\Languages\MergeFrench.lang; Type: files\r
+Name: {app}\Languages\MergeGerman.lang; Type: files\r
+Name: {app}\Languages\MergeHungarian.lang; Type: files\r
+Name: {app}\Languages\MergeItalian.lang; Type: files\r
+Name: {app}\Languages\MergeJapanese.lang; Type: files\r
+Name: {app}\Languages\MergeKorean.lang; Type: files\r
+Name: {app}\Languages\MergeNorwegian.lang; Type: files\r
+Name: {app}\Languages\MergePersian.lang; Type: files\r
+Name: {app}\Languages\MergePolish.lang; Type: files\r
+Name: {app}\Languages\MergePortuguese.lang; Type: files\r
+Name: {app}\Languages\MergeSlovak.lang; Type: files\r
+Name: {app}\Languages\MergeSpanish.lang; Type: files\r
+Name: {app}\Languages\MergeRussian.lang; Type: files\r
+Name: {app}\Languages\MergeSerbian.lang; Type: files\r
+Name: {app}\Languages\MergeSwedish.lang; Type: files\r
+Name: {app}\Languages\MergeTurkish.lang; Type: files\r
+Name: {app}\MergePlugins\list.txt; Type: files; Check: not IsComponentSelected('Plugins')\r
+\r
+;Removes the user's guide icon if the user deselects the user's guide component.\r
+Name: {group}\{cm:UsersGuide}.lnk; Type: files; Check: not IsComponentSelected('Docs')\r
+\r
+;This removes the quick launch icon in case the user chooses not to install it after previously having it installed\r
+Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\WinMerge.lnk; Type: files; Check: not IsTaskSelected('QuickLauchIcon')\r
+Name: {commonappdata}\Microsoft\Internet Explorer\Quick Launch\WinMerge.lnk; Type: files; Check: not IsTaskSelected('QuickLauchIcon')\r
+\r
+;This removes the desktop icon in case the user chooses not to install it after previously having it installed\r
+Name: {userdesktop}\WinMerge.lnk; Type: files; Check: not IsTaskSelected('DesktopIcon')\r
+Name: {commondesktop}\WinMerge.lnk; Type: files; Check: not IsTaskSelected('DesktopIcon')\r
+\r
+;Removes the Uninstall icon from the start menu...\r
+Name: {group}\{cm:UninstallProgram,WinMerge}.lnk; Type: files;\r
+Name: {group}\{cm:UninstallProgram,WinMerge}; Type: files;\r
+\r
+;Remove ANSI executable link from start menu for NT-based Windows versions\r
+;This was installed earlier, but not anymore.\r
+Name: {group}\WinMerge (ANSI).lnk; Type: files; MinVersion: 0,4\r
+\r
+Name: {app}\Docs; Type: filesandordirs\r
+\r
+Name: {app}\MergePlugins\editor addin.sct; Type: Files; Check: not IsComponentSelected('Plugins')\r
+Name: {app}\MergePlugins\insert datetime.sct; Type: Files; Check: not IsComponentSelected('Plugins')\r
+Name: {app}\MergePlugins; Type: DirIfEmpty; Check: not IsComponentSelected('Plugins')\r
+\r
+Name: {app}\Filters\ADAMulti.flt; Type: Files; Check: not IsComponentSelected('Filters')\r
+Name: {app}\Filters\ASPNET.flt; Type: Files; Check: not IsComponentSelected('Filters')\r
+Name: {app}\Filters\CSharp_loose.flt; Type: Files; Check: not IsComponentSelected('Filters')\r
+Name: {app}\Filters\Delphi.flt; Type: Files; Check: not IsComponentSelected('Filters')\r
+Name: {app}\Filters\MASM.flt; Type: Files; Check: not IsComponentSelected('Filters')\r
+Name: {app}\Filters\Merge_GnuC_loose.flt; Type: Files; Check: not IsComponentSelected('Filters')\r
+Name: {app}\Filters\Merge_VC_loose.flt; Type: Files; Check: not IsComponentSelected('Filters')\r
+Name: {app}\Filters\Merge_VB_loose.flt; Type: Files; Check: not IsComponentSelected('Filters')\r
+Name: {app}\Filters\SourceControl.flt; Type: Files; Check: not IsComponentSelected('Filters')\r
+Name: {app}\Filters\Symbian.flt; Type: Files; Check: not IsComponentSelected('Filters')\r
+Name: {app}\Filters\XML_html.flt; Type: Files; Check: not IsComponentSelected('Filters')\r
+Name: {app}\Filters\FileFilter.tmpl; Type: Files; Check: not IsComponentSelected('Filters')\r
+Name: {app}\Filters; Type: DirIfEmpty; Check: not IsComponentSelected('Filters')\r
+\r
+;Remove old "List of installed files"...\r
+Name: {app}\Files.txt; Type: files\r
+\r
+\r
+[Dirs]\r
+;The always uninstall flag tells the uninstaller to remove the folder if it's empty regardless of whether or not it existed prior to the installation\r
+Name: {app}; Flags: uninsalwaysuninstall\r
+\r
+\r
+[Files]\r
+; WinMerge itself\r
+Source: ..\..\Build\X64\MergeUnicodeRelease\WinMergeU.exe; DestDir: {app}; Flags: promptifolder; Components: Core\r
+; 32Bit Plugin Proxy\r
+Source: ..\..\Plugins\WinMerge32BitPluginProxy\Release\WinMerge32BitPluginProxy.exe; DestDir: {app}; Flags: promptifolder; Components: Core\r
+\r
+; Shell extension\r
+Source: ..\..\Build\ShellExtension\ShellExtensionU.dll; DestDir: {app}; Flags: uninsrestartdelete restartreplace promptifolder; MinVersion: 0, 4; Components: ShellExtension32bit\r
+; 64-bit version of ShellExtension\r
+Source: ..\..\Build\ShellExtension\ShellExtensionX64.dll; DestDir: {app}; Flags: uninsrestartdelete restartreplace promptifolder 64bit; MinVersion: 0,5.01.2600; Check: IsWin64\r
+\r
+; ArchiveSupport\r
+;Please do not reorder the 7z Dlls by version they compress better ordered by platform and then by version\r
+Source: ..\..\Build\X64\Merge7z\Merge7z.dll; DestDir: {app}\Merge7z; Flags: promptifolder; MinVersion: 0, 4; Components: ArchiveSupport\r
+Source: ..\..\Build\X64\Merge7z\7z.dll; DestDir: {app}\Merge7z; Flags: promptifolder; MinVersion: 0, 4; Components: ArchiveSupport\r
+Source: ..\..\Build\X64\Merge7z\*.txt; DestDir: {app}\Merge7z; Flags: promptifolder; MinVersion: 0, 4; Components: ArchiveSupport\r
+Source: ..\..\Build\X64\Merge7z\Lang\*.txt; DestDir: {app}\Merge7z\Lang; Flags: promptifolder; MinVersion: 0, 4; Components: ArchiveSupport\r
+\r
+; Language files\r
+Source: ..\..\Translations\WinMerge\Basque.po; DestDir: {app}\Languages; Components: Languages\Basque; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-Basque.txt; DestDir: {app}\Docs; Components: Languages\Basque\r
+Source: ..\..\Translations\WinMerge\Brazilian.po; DestDir: {app}\Languages; Components: Languages\PortugueseBrazilian; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-Brazilian.txt; DestDir: {app}\Docs; Components: Languages\PortugueseBrazilian\r
+Source: ..\..\Translations\WinMerge\Bulgarian.po; DestDir: {app}\Languages; Components: Languages\Bulgarian; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-Bulgarian.txt; DestDir: {app}\Docs; Components: Languages\Bulgarian\r
+Source: ..\..\Translations\WinMerge\Catalan.po; DestDir: {app}\Languages; Components: Languages\Catalan; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-Catalan.txt; DestDir: {app}\Docs; Components: Languages\Catalan\r
+Source: ..\..\Translations\WinMerge\ChineseSimplified.po; DestDir: {app}\Languages; Components: Languages\Chinese_Simplified; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-ChineseSimplified.txt; DestDir: {app}\Docs; Components: Languages\Chinese_Simplified\r
+Source: ..\..\Translations\WinMerge\ChineseTraditional.po; DestDir: {app}\Languages; Components: Languages\Chinese_Traditional; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-ChineseTraditional.txt; DestDir: {app}\Docs; Components: Languages\Chinese_Traditional\r
+Source: ..\..\Translations\WinMerge\Croatian.po; DestDir: {app}\Languages; Components: Languages\Croatian; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-Croatian.txt; DestDir: {app}\Docs; Components: Languages\Croatian\r
+Source: ..\..\Translations\WinMerge\Czech.po; DestDir: {app}\Languages; Components: Languages\Czech; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\WinMerge\Danish.po; DestDir: {app}\Languages; Components: Languages\Danish; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\WinMerge\Dutch.po; DestDir: {app}\Languages; Components: Languages\Dutch; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-Dutch.txt; DestDir: {app}\Docs; Components: Languages\Dutch\r
+Source: ..\..\Translations\WinMerge\Finnish.po; DestDir: {app}\Languages; Components: Languages\Finnish; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-Finnish.txt; DestDir: {app}\Docs; Components: Languages\Finnish\r
+Source: ..\..\Translations\WinMerge\French.po; DestDir: {app}\Languages; Components: Languages\French; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-French.txt; DestDir: {app}\Docs; Components: Languages\French\r
+Source: ..\..\Translations\WinMerge\Galician.po; DestDir: {app}\Languages; Components: Languages\Galician; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-Galician.txt; DestDir: {app}\Docs; Components: Languages\Galician\r
+Source: ..\..\Translations\WinMerge\German.po; DestDir: {app}\Languages; Components: Languages\German; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\WinMerge\Greek.po; DestDir: {app}\Languages; Components: Languages\Greek; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-Greek.txt; DestDir: {app}\Docs; Components: Languages\Greek\r
+Source: ..\..\Translations\WinMerge\Hungarian.po; DestDir: {app}\Languages; Components: Languages\Hungarian; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\WinMerge\Italian.po; DestDir: {app}\Languages; Components: Languages\Italian; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\WinMerge\Japanese.po; DestDir: {app}\Languages; Components: Languages\Japanese; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-Japanese.txt; DestDir: {app}\Docs; Components: Languages\Japanese\r
+Source: ..\..\Translations\WinMerge\Korean.po; DestDir: {app}\Languages; Components: Languages\Korean; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-Lithuanian.txt; DestDir: {app}\Docs; Components: Languages\Lithuanian\r
+Source: ..\..\Translations\WinMerge\Norwegian.po; DestDir: {app}\Languages; Components: Languages\Norwegian; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\WinMerge\Persian.po; DestDir: {app}\Languages; Components: Languages\Persian; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\WinMerge\Polish.po; DestDir: {app}\Languages; Components: Languages\Polish; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\WinMerge\Portuguese.po; DestDir: {app}\Languages; Components: Languages\Portuguese; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-Portuguese.txt; DestDir: {app}\Docs; Components: Languages\Portuguese\r
+Source: ..\..\Translations\WinMerge\Romanian.po; DestDir: {app}\Languages; Components: Languages\Romanian; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-Romanian.txt; DestDir: {app}\Docs; Components: Languages\Romanian\r
+Source: ..\..\Translations\WinMerge\Russian.po; DestDir: {app}\Languages; Components: Languages\Russian; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\WinMerge\Serbian.po; DestDir: {app}\Languages; Components: Languages\Serbian; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-Serbian.txt; DestDir: {app}\Docs; Components: Languages\Serbian\r
+Source: ..\..\Translations\WinMerge\Sinhala.po; DestDir: {app}\Languages; Components: Languages\Sinhala; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\WinMerge\Slovak.po; DestDir: {app}\Languages; Components: Languages\Slovak; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\WinMerge\Slovenian.po; DestDir: {app}\Languages; Components: Languages\Slovenian; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\WinMerge\Spanish.po; DestDir: {app}\Languages; Components: Languages\Spanish; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-Spanish.txt; DestDir: {app}\Docs; Components: Languages\Spanish\r
+Source: ..\..\Translations\WinMerge\Swedish.po; DestDir: {app}\Languages; Components: Languages\Swedish; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-Swedish.txt; DestDir: {app}\Docs; Components: Languages\Swedish\r
+Source: ..\..\Translations\WinMerge\Turkish.po; DestDir: {app}\Languages; Components: Languages\Turkish; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-Turkish.txt; DestDir: {app}\Docs; Components: Languages\Turkish\r
+Source: ..\..\Translations\WinMerge\Ukrainian.po; DestDir: {app}\Languages; Components: Languages\Ukrainian; Flags: ignoreversion comparetimestamp\r
+Source: ..\..\Translations\Docs\Readme\ReadMe-Ukrainian.txt; DestDir: {app}\Docs; Components: Languages\Ukrainian\r
+\r
+;Filters\r
+Source: ..\..\Filters\*.flt; DestDir: {app}\Filters; Flags: sortfilesbyextension comparetimestamp ignoreversion; Components: filters\r
+Source: ..\..\Filters\FileFilter.tmpl; DestDir: {app}\Filters; Flags: sortfilesbyextension comparetimestamp ignoreversion; Components: filters\r
+\r
+;Documentation\r
+Source: ..\..\Docs\Users\ReadMe.txt; DestDir: {app}\Docs; Flags: comparetimestamp ignoreversion promptifolder; Components: Core\r
+Source: ..\..\Docs\Users\Contributors.txt; DestDir: {app}; Flags: comparetimestamp ignoreversion promptifolder; Components: Core\r
+Source: ..\..\Docs\Users\ReleaseNotes.html; DestDir: {app}\Docs; Flags: comparetimestamp ignoreversion promptifolder; Components: Core\r
+Source: ..\..\Docs\Users\ChangeLog.txt; DestDir: {app}\Docs; Flags: comparetimestamp ignoreversion promptifolder; Components: Core\r
+Source: ..\..\Build\Manual\htmlhelp\WinMerge.chm; DestDir: {app}\Docs\; Flags: overwritereadonly uninsremovereadonly; Components: Core\r
+Source: ..\..\Docs\users\GPL.rtf; DestDir: {app}\Docs\; Flags: comparetimestamp ignoreversion promptifolder; Components: Core\r
+\r
+;Plugins\r
+;Please note IgnoreVersion and CompareTimeStamp are to instruct the installer to not not check for version info and go straight to comparing modification dates\r
+Source: ..\..\Plugins\dlls\editor addin.sct; DestDir: {app}\MergePlugins; Flags: IgnoreVersion CompareTimeStamp; Components: Plugins\r
+Source: ..\..\Plugins\dlls\insert datetime.sct; DestDir: {app}\MergePlugins; Flags: IgnoreVersion CompareTimeStamp; Components: Plugins\r
+Source: ..\..\Plugins\dlls\CompareMSExcelFiles.sct; DestDir: {app}\MergePlugins; Flags: IgnoreVersion CompareTimeStamp; Components: Plugins\r
+Source: ..\..\Plugins\dlls\CompareMSWordFiles.sct; DestDir: {app}\MergePlugins; Flags: IgnoreVersion CompareTimeStamp; Components: Plugins\r
+Source: ..\..\Plugins\dlls\CompareMSPowerPointFiles.sct; DestDir: {app}\MergePlugins; Flags: IgnoreVersion CompareTimeStamp; Components: Plugins\r
+Source: ..\..\Plugins\dlls\ApplyPatch.sct; DestDir: {app}\MergePlugins; Flags: IgnoreVersion CompareTimeStamp; Components: Plugins\r
+Source: ..\..\Plugins\dlls\PrediffLineFilter.sct; DestDir: {app}\MergePlugins; Flags: IgnoreVersion CompareTimeStamp; Components: Plugins\r
+Source: ..\..\Plugins\dlls\X64\IgnoreColumns.dll; DestDir: {app}\MergePlugins; Flags: ignoreversion replacesameversion; Components: Plugins\r
+Source: ..\..\Plugins\dlls\X64\IgnoreCommentsC.dll; DestDir: {app}\MergePlugins; Flags: ignoreversion replacesameversion; Components: Plugins\r
+Source: ..\..\Plugins\dlls\X64\IgnoreFieldsComma.dll; DestDir: {app}\MergePlugins; Flags: ignoreversion replacesameversion; Components: Plugins\r
+Source: ..\..\Plugins\dlls\X64\IgnoreFieldsTab.dll; DestDir: {app}\MergePlugins; Flags: ignoreversion replacesameversion; Components: Plugins\r
+\r
+;Frhed\r
+Source: ..\..\Build\x64\Frhed\GPL.txt; DestDir: {app}\Frhed; Components: Frhed\r
+;Source: ..\..\Build\x64\Frhed\frhed.exe; DestDir: {app}\Frhed; Components: Frhed\r
+Source: ..\..\Build\x64\Frhed\hekseditU.dll; DestDir: {app}\Frhed; Flags: ignoreversion replacesameversion; Components: Frhed\r
+Source: ..\..\Build\x64\Frhed\Docs\ChangeLog.txt; DestDir: {app}\Frhed\Docs; Components: Frhed\r
+Source: ..\..\Build\x64\Frhed\Docs\Contributors.txt; DestDir: {app}\Frhed\Docs; Components: Frhed\r
+Source: ..\..\Build\x64\Frhed\Docs\History.txt; DestDir: {app}\Frhed\Docs; Components: Frhed\r
+Source: ..\..\Build\x64\Frhed\Docs\Links.txt; DestDir: {app}\Frhed\Docs; Components: Frhed\r
+Source: ..\..\Build\x64\Frhed\Docs\Sample.tpl  ; DestDir: {app}\Frhed\Docs; Components: Frhed\r
+Source: ..\..\Build\x64\Frhed\Languages\de.po; DestDir: {app}\Frhed\Languages; Components: Frhed\r
+Source: ..\..\Build\x64\Frhed\Languages\fr.po; DestDir: {app}\Frhed\Languages; Components: Frhed\r
+Source: ..\..\Build\x64\Frhed\Languages\ja.po; DestDir: {app}\Frhed\Languages; Components: Frhed\r
+Source: ..\..\Build\x64\Frhed\Languages\nl.po; DestDir: {app}\Frhed\Languages; Components: Frhed\r
+Source: ..\..\Build\x64\Frhed\Languages\heksedit.lng; DestDir: {app}\Frhed\Languages; Components: Frhed\r
+\r
+;WinIMerge\r
+Source: ..\..\Build\WinIMerge\GPL.txt; DestDir: {app}\WinIMerge; Components: WinIMerge\r
+Source: ..\..\Build\WinIMerge\freeimage-license-gplv2.txt; DestDir: {app}\WinIMerge; Components: WinIMerge\r
+;Source: ..\..\Build\WinIMerge\bin64\WinIMerge.exe; DestDir: {app}\WinIMerge; Components: WinIMerge\r
+Source: ..\..\Build\WinIMerge\bin64\WinIMergeLib.dll; DestDir: {app}\WinIMerge; Flags: ignoreversion replacesameversion; Components: WinIMerge\r
+Source: ..\..\Build\WinIMerge\bin64\vcomp140.dll; DestDir: {app}; Components: WinIMerge\r
+\r
+;GnuWin32 Patch for Windows\r
+Source: ..\..\Build\GnuWin32\*.*; DestDir: {app}\GnuWin32; Flags: recursesubdirs; Components: Patch\r
+\r
+[Dirs]\r
+Name: "{app}\MergePlugins"\r
+\r
+[Icons]\r
+;Start Menu Icons\r
+Name: {group}\WinMerge; Filename: {app}\{code:ExeName}; AppUserModelID: "Thingamahoochie.WinMerge"\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe.txt; IconFileName: {win}\NOTEPAD.EXE\r
+Name: {group}\{cm:UsersGuide}; Filename: {app}\Docs\WinMerge.chm\r
+Name: {group}\{cm:ProgramOnTheWeb,WinMerge}; Filename: http://winmerge.org\r
+\r
+;Link to translated ReadMe in Start Menu\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Basque.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Basque\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Brazilian.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: PortugueseBrazilian\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Bulgarian.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Bulgarian\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Catalan.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Catalan\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-ChineseSimplified.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Chinese_Simplified\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-ChineseTraditional.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Chinese_Traditional\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Croatian.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Croatian\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Dutch.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Dutch\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Finnish.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Finnish\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-French.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: French\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Galician.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Galician\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Greek.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Greek\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Japanese.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Japanese\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Portuguese.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Portuguese\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Romanian.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Romanian\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Serbian.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Serbian\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Spanish.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Spanish\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Swedish.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Swedish\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Turkish.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Turkish\r
+Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Ukrainian.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Ukrainian\r
+\r
+;Desktop Icon\r
+Name: {commondesktop}\WinMerge; Filename: {app}\{code:ExeName}; Tasks: desktopicon\r
+\r
+;Quick Launch Icon\r
+Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\WinMerge; Filename: {app}\{code:ExeName}; Tasks: quicklaunchicon\r
+\r
+[Registry]\r
+Root: HKCU; Subkey: Software\Thingamahoochie; Flags: uninsdeletekeyifempty\r
+Root: HKCU; Subkey: Software\Thingamahoochie\WinMerge; Flags: uninsdeletekey\r
+Root: HKA;  Subkey: Software\Thingamahoochie; Flags: uninsdeletekeyifempty\r
+Root: HKA;  Subkey: Software\Thingamahoochie\WinMerge; Flags: uninsdeletekey\r
+\r
+;Add Project file extension (.WinMerge) to known extensions and\r
+;set WinMerge to open those files\r
+;set Notepad to edit project files\r
+Root: HKA;  Subkey: Software\Classes\.WinMerge; ValueType: String; ValueData: WinMerge.Project.File; Flags: uninsdeletekey\r
+Root: HKA;  Subkey: Software\Classes\WinMerge.Project.File; ValueType: String; ValueData: {cm:ProjectFileDesc}; Flags: uninsdeletekey\r
+Root: HKA;  Subkey: Software\Classes\WinMerge.Project.File\shell\open\command; ValueType: String; ValueData: """{app}\{code:ExeName}"" ""%1"""; Flags: uninsdeletekey\r
+Root: HKA;  Subkey: Software\Classes\WinMerge.Project.File\shell\edit\command; ValueType: String; ValueData: """NOTEPAD.EXE"" ""%1"""; Flags: uninsdeletekey\r
+Root: HKA;  Subkey: Software\Classes\WinMerge.Project.File\DefaultIcon; ValueType: String; ValueData: """{app}\{code:ExeName}"",1"; Flags: uninsdeletekey\r
+\r
+; delete obsolete values\r
+;In Inno Setup Version 4.18 ValueData couldn't be null and compile,\r
+;if this is fixed in a later version feel free to remove the parameter\r
+Root: HKCU; Subkey: Software\Thingamahoochie\WinMerge\Settings; ValueType: none; ValueName: LeftMax; Flags: deletevalue\r
+Root: HKCU; Subkey: Software\Thingamahoochie\WinMerge\Settings; ValueType: none; ValueName: DirViewMax; Flags: deletevalue\r
+\r
+;This removes the key that remembers which messageboxes to hide from the user, this is because the text of that message\r
+;can change and make it more clear as to the user why they might want to pay attention to a particular dialog and also\r
+;because a particular message might be added or removed and a new message might occupy a previous message's ID number\r
+Root: HKCU; Subkey: Software\Thingamahoochie\WinMerge\MessageBoxes; ValueType: none; Flags: deletekey\r
+\r
+Root: HKA;  SubKey: Software\Classes\Directory\Shell\WinMerge\command; ValueType: none; Flags: deletekey noerror\r
+Root: HKA;  SubKey: Software\Classes\Directory\Shell\WinMerge; ValueType: none; Flags: deletekey noerror\r
+\r
+;Adds "Start Menu" --> "Run" Support for WinMerge\r
+Root: HKA;  Subkey: Software\Microsoft\Windows\CurrentVersion\App Paths\WinMerge.exe; ValueType: none; Flags: uninsdeletekey\r
+Root: HKA;  Subkey: Software\Microsoft\Windows\CurrentVersion\App Paths\WinMergeU.exe; ValueType: none; Flags: uninsdeletekey\r
+Root: HKA;  SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinMerge.exe; ValueType: string; ValueName: ; ValueData: {app}\{code:ExeName}\r
+Root: HKA;  SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinMergeU.exe; ValueType: string; ValueName: ; ValueData: {app}\{code:ExeName}\r
+\r
+;Registry Keys for use by ShellExtension.dll\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge; ValueType: string; ValueName: Executable; ValueData: {app}\{code:ExeName}\r
+\r
+;Enables or disables the Context Menu preference based on what the user selects during install\r
+;Initially the Context menu is explicitly disabled:\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge; ValueType: dword; ValueName: ContextMenuEnabled; ValueData: 0;\r
+\r
+;If the user chose to use the context menu then we re-enable it.  This is necessary so it'll turn on and off not just on.\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge; ValueType: dword; ValueName: ContextMenuEnabled; ValueData: 1; Tasks: ShellExtension\r
+Root: HKCU; SubKey: Software\Thingamahoochie\WinMerge; ValueType: dword; ValueName: ContextMenuEnabled; ValueData: {code:ShellMenuEnabled}\r
+\r
+;If WinMerge.exe is installed then we'll automatically configure WinMerge as the differencing application\r
+Root: HKCU; SubKey: Software\TortoiseCVS; ValueType: string; ValueName: External Diff Application; ValueData: {app}\{code:ExeName}; Flags: uninsdeletevalue; Tasks: TortoiseCVS\r
+Root: HKCU; SubKey: Software\TortoiseCVS; ValueType: dword; ValueName: DiffAsUnicode; ValueData: $00000001; Flags: uninsdeletevalue; Tasks: TortoiseCVS\r
+Root: HKCU; SubKey: Software\TortoiseCVS\Prefs\External Diff Application; ValueType: string; ValueName: _; ValueData: {app}\{code:ExeName}; Flags: uninsdeletevalue dontcreatekey; Tasks: TortoiseCVS\r
+Root: HKCU; SubKey: Software\TortoiseCVS\Prefs\External Diff2 Params; ValueType: string; ValueName: _; ValueData: """%1"" ""%2"""; Flags: uninsdeletevalue dontcreatekey; Tasks: TortoiseCVS\r
+\r
+;Tells TortoiseCVS to use WinMerge as its differencing application (this happens whether or not Tortoise is current installed, that way\r
+;if it is installed at a later date this will automatically support it)\r
+Root: HKCU; SubKey: Software\TortoiseCVS; ValueType: string; ValueName: External Merge Application; ValueData: {app}\{code:ExeName}; Flags: uninsdeletevalue; Tasks: TortoiseCVS\r
+Root: HKCU; SubKey: Software\TortoiseCVS; ValueType: dword; ValueName: MergeAsUnicode; ValueData: $00000001; Flags: uninsdeletevalue; Tasks: TortoiseCVS\r
+Root: HKCU; SubKey: Software\TortoiseCVS\Prefs\External Merge Application; ValueType: string; ValueName: _; ValueData: {app}\{code:ExeName}; Flags: uninsdeletevalue dontcreatekey; Tasks: TortoiseCVS\r
+Root: HKCU; SubKey: Software\TortoiseCVS\Prefs\External Merge2 Params; ValueType: string; ValueName: _; ValueData: """%mine"" ""%yours"""; Flags: uninsdeletevalue dontcreatekey; Tasks: TortoiseCVS\r
+\r
+;Set WinMerge as TortoiseGit diff tool\r
+Root: HKCU; SubKey: Software\TortoiseGit; ValueType: string; ValueName: Diff; ValueData: {app}\{code:ExeName} -e -ub -dl %bname -dr %yname %base %mine; Flags: uninsdeletevalue; Tasks: TortoiseGit\r
+Root: HKCU; SubKey: Software\TortoiseGit; ValueType: string; ValueName: Merge; ValueData: {code:TortoiseSVNGITMergeToolCommandLine}; Flags: uninsdeletevalue; Check: UseAs3WayMergeTool\r
+\r
+;Set WinMerge as TortoiseSVN diff tool\r
+Root: HKCU; SubKey: Software\TortoiseSVN; ValueType: string; ValueName: Diff; ValueData: {app}\{code:ExeName} -e -ub -dl %bname -dr %yname %base %mine; Flags: uninsdeletevalue; Tasks: TortoiseSVN\r
+Root: HKCU; SubKey: Software\TortoiseSVN; ValueType: string; ValueName: Merge; ValueData: {code:TortoiseSVNGITMergeToolCommandLine}; Flags: uninsdeletevalue; Check: UseAs3WayMergeTool\r
+\r
+;Whatever the user chooses at the [Select Setup Language] dialog should also determine what language WinMerge will start up in\r
+;(unless the user already has a startup language specified)\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $0000042d; Flags: deletevalue; Languages: Basque\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000402; Flags: deletevalue; Languages: Bulgarian\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000403; Flags: deletevalue; Languages: Catalan\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000804; Flags: deletevalue; Languages: Chinese_Simplified\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000404; Flags: deletevalue; Languages: Chinese_Traditional\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $0000041a; Flags: deletevalue; Languages: Croatian\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000405; Flags: deletevalue; Languages: Czech\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000406; Flags: deletevalue; Languages: Danish\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000413; Flags: deletevalue; Languages: Dutch\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000409; Flags: deletevalue; Languages: English\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $0000040b; Flags: deletevalue; Languages: Finnish\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $0000040c; Flags: deletevalue; Languages: French\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000456; Flags: deletevalue; Languages: Galician\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000407; Flags: deletevalue; Languages: German\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000408; Flags: deletevalue; Languages: Greek\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $0000040e; Flags: deletevalue; Languages: Hungarian\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000410; Flags: deletevalue; Languages: Italian\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000411; Flags: deletevalue; Languages: Japanese\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000412; Flags: deletevalue; Languages: Korean\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000427; Flags: deletevalue; Languages: Lithuanian \r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000414; Flags: deletevalue; Languages: Norwegian\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000429; Flags: deletevalue; Languages: Persian\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000415; Flags: deletevalue; Languages: Polish\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000816; Flags: deletevalue; Languages: Portuguese\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000416; Flags: deletevalue; Languages: PortugueseBrazilian\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000418; Flags: deletevalue; Languages: Romanian\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000419; Flags: deletevalue; Languages: Russian\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000c1a; Flags: deletevalue; Languages: Serbian\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $0000045b; Flags: deletevalue; Languages: Sinhala\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $0000041b; Flags: deletevalue; Languages: Slovak\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000424; Flags: deletevalue; Languages: Slovenian\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000c0a; Flags: deletevalue; Languages: Spanish\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $0000041D; Flags: deletevalue; Languages: Swedish\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $0000041f; Flags: deletevalue; Languages: Turkish\r
+Root: HKA;  SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000422; Flags: deletevalue; Languages: Ukrainian\r
+\r
+\r
+[Run]\r
+;This will no longer appear unless the user chose to make a start menu group in the first place\r
+Filename: {win}\Explorer.exe; Description: {cm:ViewStartMenuFolder}; Parameters: """{group}"""; Flags: waituntilidle postinstall skipifsilent unchecked; Check: GroupCreated\r
+\r
+Filename: {app}\{code:ExeName}; Description: {cm:LaunchProgram,WinMerge}; Flags: nowait postinstall skipifsilent runmaximized\r
+\r
+Filename: {syswow64}\regsvr32.exe; Parameters: "/s ""{app}\ShellExtensionU.dll"""; Flags: waituntilidle; Check: IsAdminInstallMode; Components: ShellExtension32bit\r
+Filename: {syswow64}\regsvr32.exe; Parameters: "/s /n /i:user ""{app}\ShellExtensionU.dll"""; Flags: waituntilidle; Check: not IsAdminInstallMode; Components: ShellExtension32bit\r
+Filename: {sys}\regsvr32.exe; Parameters: "/s ""{app}\ShellExtensionX64.dll"""; Flags: waituntilidle; Check: IsAdminInstallMode\r
+Filename: {sys}\regsvr32.exe; Parameters: "/s /n /i:user ""{app}\ShellExtensionX64.dll"""; Flags: waituntilidle; Check: not IsAdminInstallMode\r
+Filename: {app}\WinMerge32BitPluginProxy.exe; Parameters: "/RegServer"; Flags: waituntilidle; Check: IsAdminInstallMode\r
+Filename: {app}\WinMerge32BitPluginProxy.exe; Parameters: "/RegServerPerUser"; Flags: waituntilidle; Check: not IsAdminInstallMode\r
+\r
+[UninstallRun]\r
+Filename: {syswow64}\regsvr32.exe; Parameters: "/s /u ""{app}\ShellExtensionU.dll"""; Flags: waituntilidle; Check: IsAdminInstallMode; Components: ShellExtension32bit\r
+Filename: {syswow64}\regsvr32.exe; Parameters: "/s /u /n /i:user ""{app}\ShellExtensionU.dll"""; Flags: waituntilidle; Check: not IsAdminInstallMode; Components: ShellExtension32bit\r
+Filename: {sys}\regsvr32.exe; Parameters: "/s /u ""{app}\ShellExtensionX64.dll"""; Flags: waituntilidle; Check: IsAdminInstallMode\r
+Filename: {sys}\regsvr32.exe; Parameters: "/s /u /n /i:user ""{app}\ShellExtensionX64.dll"""; Flags: waituntilidle; Check: not IsAdminInstallMode\r
+Filename: {app}\WinMerge32BitPluginProxy.exe; Parameters: "/UnregServer"; Flags: waituntilidle; Check: IsAdminInstallMode\r
+Filename: {app}\WinMerge32BitPluginProxy.exe; Parameters: "/UnregServerPerUser"; Flags: waituntilidle; Check: not IsAdminInstallMode\r
+\r
+\r
+[UninstallDelete]\r
+;Remove 7-zip integration dlls possibly installed (by hand or using separate installer)\r
+Name: {app}\Merge7z*.dll; Type: files\r
+Name: {app}\7zip_pad.xml; Type: files\r
+Name: {app}\Codecs; Type: filesandordirs\r
+Name: {app}\Formats; Type: filesandordirs\r
+Name: {app}\Lang; Type: filesandordirs\r
+\r
+Name: {group}; Type: dirifempty\r
+Name: {app}; Type: dirifempty\r
+\r
+\r
+[Code]\r
+Var\r
+    g_CheckListBox: TNewCheckListBox;\r
+\r
+{Determines whether or not the user chose to create a start menu}\r
+Function GroupCreated(): boolean;\r
+Var\r
+    {Stores the path of the start menu group Inno Setup may have created}\r
+    strGroup_Path: string;\r
+Begin\r
+    {Saves the path that Inno Setup intended to create the start menu group at}\r
+    strGroup_Path := ExpandConstant('{group}');\r
+\r
+    {If the start menu path isn't blank then..}\r
+    if strGroup_Path <> '' Then\r
+        Begin\r
+            {If the user choose to create the start menu then this folder will exist.\r
+            If the folder exists then GroupCreated = True otherwise it does not.}\r
+            Result := DirExists(strGroup_Path)\r
+        end\r
+    else\r
+        {Since the start menu path is null, we know that the user chose not to create a\r
+        start menu group (note in Inno Setup 4.18 this didn't yet work, but I'm sure it will in the future}\r
+        Result := False;\r
+\r
+     {Debug\r
+\r
+    If DirExists(strGroup_Path) = True Then\r
+        Msgbox('The group "' + ExpandConstant('group') + '" was found', mbInformation, mb_ok)\r
+    Else\r
+        Msgbox('The group "' + ExpandConstant('group') + '" doesn''t exist.', mbInformation, mb_ok); }\r
+End;\r
+\r
+\r
+{Returns the appropriate name of the .EXE being installed}\r
+Function ExeName(Unused: string): string;\r
+Begin\r
+  Result := 'WinMergeU.exe';\r
+End;\r
+\r
+{Determines whether or not TortoiseCVS is installed}\r
+Function TortoiseCVSInstalled(): boolean;\r
+Begin\r
+       {This absolutely must remain as \CustomIcons, because our application used to create some TortoiseCVS keys even if the application wasn't installed!}\r
+    Result := RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\TortoiseCVS\CustomIcons') or RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\TortoiseCVS\Icons');\r
+End;\r
+\r
+{Determines whether or not TortoiseGit is installed}\r
+Function TortoiseGitInstalled(): boolean;\r
+Begin\r
+    Result := RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\TortoiseGit') or RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Classes\Directory\Background\shellex\ContextMenuHandlers\TortoiseGit');\r
+End;\r
+\r
+{Determines whether or not TortoiseSVN is installed}\r
+Function TortoiseSVNInstalled(): boolean;\r
+Begin\r
+    Result := RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\TortoiseSVN') or RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Classes\Directory\Background\shellex\ContextMenuHandlers\TortoiseSVN');\r
+End;\r
+\r
+Function OldGroup(): string;\r
+Begin\r
+    {Stores where in \All Users\Programs\ our start menu used to be located}\r
+     RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\WinMerge_is1', 'Inno Setup: Icon Group', Result)\r
+End;\r
+\r
+Procedure DeletePreviousStartMenu();\r
+Var\r
+        strOld: string;\r
+        strNew: string;\r
+        strMessage: string;\r
+Begin\r
+    {Detects the previous start menu group's path, if any}\r
+    strOld := OldGroup();\r
+\r
+    {Detects the current start menu group's path, if any (not creating a group is a valid option)}\r
+    strNew := ExpandConstant('{group}');\r
+\r
+    {removes the start menu portion of the path from the group path making it match the format of strOld}\r
+    StringChange(strNew, ExpandConstant('{commonprograms}\'), '')\r
+\r
+    {if the user does have a previous start menu location then..}\r
+    If strOld <> '' Then\r
+        Begin\r
+            {If the current and previous start menu locations are different then...}\r
+            If Uppercase(strOld) <> UpperCase(strNew) Then\r
+                Begin\r
+                    strMessage := ExpandConstant('{cm:DeletePreviousStartMenu}');\r
+                    strMessage := Format(strMessage, [strOld, strNew]);\r
+\r
+                    {Display a dialog asking the user if they'd like to delete the previous start menu group}\r
+                    {If they'd like to delete the previous start menu group then...}\r
+                    If Msgbox(strMessage, mbConfirmation, mb_YesNo) = mrYes Then\r
+                        Begin\r
+                            strOld := ExpandConstant('{commonprograms}\') + strOld;\r
+                            {Remove old start menu}\r
+                            DelTree(strOld, True, True, True);\r
+                        End;\r
+                End;\r
+        End;\r
+End;\r
+\r
+{This event procedure is queed each time the user changes pages within the installer}\r
+Procedure CurPageChanged(CurPage: integer);\r
+Begin\r
+    {if the installer reaches the file copy page then...}\r
+    If CurPage = wpInstalling Then\r
+            {Delete the previous start menu group if the location has changed since the last install}\r
+            DeletePreviousStartMenu;\r
+End;\r
+\r
+// Checks if context menu is already enabled for shell extension\r
+// If so, we won't overwrite its existing value in [Registry] section\r
+Function ShellMenuEnabled(Unused: string): string;\r
+Var\r
+  ContextMenuEnabled: DWORD;\r
+Begin\r
+  ContextMenuEnabled := 0;\r
+  RegQueryDWORDValue(HKCU, 'Software\Thingamahoochie\WinMerge', 'ContextMenuEnabled', ContextMenuEnabled);\r
+  if IsTaskSelected('ShellExtension') then\r
+    Result := inttostr(ContextMenuEnabled or 1)\r
+  else\r
+    Result := '0';\r
+End;\r
+\r
+{Returns WinMerge installed exeutable file name}\r
+Function WinMergeExeName(): string;\r
+Var\r
+       Unused: String;\r
+\r
+Begin\r
+    Result := ExpandConstant('{app}\') + ExeName(Unused);\r
+End;\r
+\r
+// Add WinMerge to system path.\r
+// This requires certain order of things to work:\r
+// #1 ModPathDir function must be first (it gets called by others)\r
+// #2 include of modpath.iss so modpath code gets included\r
+// #3 CurStepChanged and CurUninstallStepChanged procedures as they call\r
+//    ModPath (in modpath.iss)\r
+function ModPathDir(): TArrayOfString;\r
+var\r
+    Dir:       TArrayOfString;\r
+begin\r
+    setArrayLength(Dir, 1)\r
+       Dir[0] := ExpandConstant('{app}');\r
+       Result := Dir;\r
+end;\r
+\r
+function UseAs3WayMergeTool(): Boolean;\r
+begin\r
+    Result := g_CheckListBox.Checked[0];\r
+end;\r
+\r
+function TortoiseSVNGITMergeToolCommandLine(Unused: string): string;\r
+var\r
+    lmr: string;\r
+    Args: string;\r
+begin\r
+    if g_CheckListBox.Checked[1] then begin\r
+        lmr := 'r';\r
+        Args := '/e /ub /fr /wl /wm /dl %bname /dm %tname /dr %yname  %base %theirs %mine /o %merged';\r
+    end else if g_CheckListBox.Checked[2] then begin\r
+        lmr := 'm';\r
+        Args := '/e /ub /fm /wl /wr /dl %tname /dm %bname /dr %yname  %theirs %base %mine /o %merged';\r
+    end else begin\r
+        lmr := 'l';\r
+        Args := '/e /ub /fl /wm /wr /dl %yname /dm %tname /dr %bname  %mine %theirs %base /o %merged';\r
+    end;\r
+    if g_CheckListBox.Checked[4] then begin\r
+        Args := Args + ' /a' + lmr;\r
+    end;\r
+    Result := WinMergeExeName() + ' ' + Args;\r
+end;\r
+\r
+function ThreeWayMergePage_ShouldSkipPage(Page: TWizardPage): Boolean;\r
+begin\r
+    Result := not (IsTaskSelected('TortoiseSVN') or IsTaskSelected('TortoiseGIT'));\r
+end;\r
+\r
+#include "modpath.is6.iss"\r
+\r
+procedure CurStepChanged(CurStep: TSetupStep);\r
+Begin\r
+    if CurStep = ssPostInstall then\r
+    begin\r
+               if IsTaskSelected('modifypath') then\r
+                       ModPath();\r
+    end;\r
+End;\r
+\r
+Procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);\r
+var\r
+       appdir:                 String;\r
+       selectedTasks:  AnsiString;\r
+Begin\r
+       appdir := ExpandConstant('{app}')\r
+       if CurUninstallStep = usUninstall then begin\r
+               if LoadStringFromFile(appdir + '\uninsTasks.txt', selectedTasks) then\r
+                       if Pos('modifypath', selectedTasks) > 0 then\r
+                               ModPath();\r
+               DeleteFile(appdir + '\uninsTasks.txt')\r
+       end;\r
+End;\r
+\r
+function BooleanToString(Value : Boolean) : String; \r
+begin\r
+  if Value then\r
+    Result := 'true'\r
+  else\r
+    Result := 'false';\r
+end;\r
+\r
+function StringToBoolean(Value : String) : Boolean; \r
+begin\r
+  if Value = 'true' then\r
+    Result := true\r
+  else\r
+    Result := false;\r
+end;\r
+\r
+procedure RegisterPreviousData(PreviousDataKey: Integer);\r
+begin\r
+  SetPreviousData(PreviousDataKey, 'UseAs3WayMergeTool', BooleanToString(g_CheckListBox.Checked[0]));\r
+  SetPreviousData(PreviousDataKey, 'MergeAtRightPane', BooleanToString(g_CheckListBox.Checked[1]));\r
+  SetPreviousData(PreviousDataKey, 'MergeAtCenterPane', BooleanToString(g_CheckListBox.Checked[2]));\r
+  SetPreviousData(PreviousDataKey, 'MergeAtLeftPane', BooleanToString(g_CheckListBox.Checked[3]));\r
+  SetPreviousData(PreviousDataKey, 'AutoMergeAtStartup', BooleanToString(g_CheckListBox.Checked[4]));\r
+end;\r
+\r
+procedure InitializeWizard();\r
+var\r
+  Page: TWizardPage;\r
+begin\r
+  Page := CreateCustomPage(wpSelectTasks, ExpandConstant('{cm:ThreeWayMergeWizardPageCaption}'), ExpandConstant('{cm:ThreeWayMergeWizardPageDescription}'));\r
+  Page.OnShouldSkipPage := @ThreeWayMergePage_ShouldSkipPage;\r
+\r
+  g_CheckListBox := TNewCheckListBox.Create(Page);\r
+  g_CheckListBox.Width := Page.SurfaceWidth;\r
+  g_CheckListBox.Height := ScaleY(128);\r
+  g_CheckListBox.Flat := True;\r
+  g_CheckListBox.BorderStyle := bsNone;\r
+  g_CheckListBox.Color := Page.SurfaceColor;\r
+  g_CheckListBox.Parent := Page.Surface;\r
+  g_CheckListBox.AddCheckBox(ExpandConstant('{cm:RegisterWinMergeAs3WayMergeTool}'), '', 0, StringToBoolean(GetPreviousData('UseAs3WayMergeTool', 'true')), True, False, True, nil);\r
+  g_CheckListBox.AddRadioButton(ExpandConstant('{cm:MergeAtRightPane}'), '', 1, StringToBoolean(GetPreviousData('MergeAtRightPane', 'true')), True, nil);\r
+  g_CheckListBox.AddRadioButton(ExpandConstant('{cm:MergeAtCenterPane}'), '', 1, StringToBoolean(GetPreviousData('MergeAtCenterPane', 'false')), True, nil);\r
+  g_CheckListBox.AddRadioButton(ExpandConstant('{cm:MergeAtLeftPane}'), '', 1, StringToBoolean(GetPreviousData('MergeAtLeftPane', 'false')), True, nil);\r
+  g_CheckListBox.AddCheckBox(ExpandConstant('{cm:AutoMergeAtStartup}'), '', 1, StringToBoolean(GetPreviousData('AutoMergeAtStartup', 'true')), True, False, True, nil);\r
+end;\r
diff --git a/Installer/InnoSetup/modpath.is6.iss b/Installer/InnoSetup/modpath.is6.iss
new file mode 100644 (file)
index 0000000..5d7343e
--- /dev/null
@@ -0,0 +1,167 @@
+// ----------------------------------------------------------------------------
+//
+// Inno Setup Ver:  5.2.1
+// Script Version:  1.3.1
+// Author:          Jared Breland <jbreland@legroom.net>
+// Homepage:           http://www.legroom.net/software
+//
+// Script Function:
+//     Enable modification of system path directly from Inno Setup installers
+//
+// Instructions:
+//     Copy modpath.iss to the same directory as your setup script
+//
+//     Add this statement to your [Setup] section
+//             ChangesEnvironment=yes
+//
+//     Add this statement to your [Tasks] section
+//     You can change the Description or Flags, but the Name must be modifypath
+//             Name: modifypath; Description: &Add application directory to your system path; Flags: unchecked
+//
+//     Add the following to the end of your [Code] section
+//     setArrayLength must specify the total number of dirs to be added
+//     Dir[0] contains first directory, Dir[1] contains second, etc.
+//             function ModPathDir(): TArrayOfString;
+//             var
+//                     Dir:    TArrayOfString;
+//             begin
+//                     setArrayLength(Dir, 1)
+//                     Dir[0] := ExpandConstant('{app}');
+//                     Result := Dir;
+//             end;
+//             #include "modpath.iss"
+// ----------------------------------------------------------------------------
+
+procedure ModPath();
+var
+       oldpath:        String;
+       newpath:        String;
+       pathArr:        TArrayOfString;
+       aExecFile:      String;
+       aExecArr:       TArrayOfString;
+       i, d:           Integer;
+       pathdir:        TArrayOfString;
+begin
+
+       // Get array of new directories and act on each individually
+       pathdir := ModPathDir();
+       for d := 0 to GetArrayLength(pathdir)-1 do begin
+
+               // Modify WinNT path
+               if UsingWinNT() = true then begin
+
+                       // Get current path, split into an array
+                       if IsAdminInstallMode() = true then begin
+                               RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'Path', oldpath);
+                       end else begin
+                               RegQueryStringValue(HKEY_CURRENT_USER, 'Environment', 'Path', oldpath);
+                       end;
+                       oldpath := oldpath + ';';
+                       i := 0;
+                       while (Pos(';', oldpath) > 0) do begin
+                               SetArrayLength(pathArr, i+1);
+                               pathArr[i] := Copy(oldpath, 0, Pos(';', oldpath)-1);
+                               oldpath := Copy(oldpath, Pos(';', oldpath)+1, Length(oldpath));
+                               i := i + 1;
+
+                               // Check if current directory matches app dir
+                               if pathdir[d] = pathArr[i-1] then begin
+                                       // if uninstalling, remove dir from path
+                                       if IsUninstaller() = true then begin
+                                               continue;
+                                       // if installing, abort because dir was already in path
+                                       end else begin
+                                               abort;
+                                       end;
+                               end;
+
+                               // Add current directory to new path
+                               if i = 1 then begin
+                                       newpath := pathArr[i-1];
+                               end else begin
+                                       newpath := newpath + ';' + pathArr[i-1];
+                               end;
+                       end;
+
+                       // Append app dir to path if not already included
+                       if IsUninstaller() = false then
+                               newpath := newpath + ';' + pathdir[d];
+
+                       // Write new path
+                       if IsAdminInstallMode() = true then begin
+                               RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'Path', newpath);
+                       end else begin
+                               RegWriteStringValue(HKEY_CURRENT_USER, 'Environment', 'Path', newpath);
+                       end;
+
+               // Modify Win9x path
+               end else begin
+
+                       // Convert to shortened dirname
+                       pathdir[d] := GetShortName(pathdir[d]);
+
+                       // If autoexec.bat exists, check if app dir already exists in path
+                       aExecFile := 'C:\AUTOEXEC.BAT';
+                       if FileExists(aExecFile) then begin
+                               LoadStringsFromFile(aExecFile, aExecArr);
+                               for i := 0 to GetArrayLength(aExecArr)-1 do begin
+                                       if IsUninstaller() = false then begin
+                                               // If app dir already exists while installing, abort add
+                                               if (Pos(pathdir[d], aExecArr[i]) > 0) then
+                                                       abort;
+                                       end else begin
+                                               // If app dir exists and = what we originally set, then delete at uninstall
+                                               if aExecArr[i] = 'SET PATH=%PATH%;' + pathdir[d] then
+                                                       aExecArr[i] := '';
+                                       end;
+                               end;
+                       end;
+
+                       // If app dir not found, or autoexec.bat didn't exist, then (create and) append to current path
+                       if IsUninstaller() = false then begin
+                               SaveStringToFile(aExecFile, #13#10 + 'SET PATH=%PATH%;' + pathdir[d], True);
+
+                       // If uninstalling, write the full autoexec out
+                       end else begin
+                               SaveStringsToFile(aExecFile, aExecArr, False);
+                       end;
+               end;
+
+               // Write file to flag modifypath was selected
+               //   Workaround since IsTaskSelected() cannot be called at uninstall and AppName and AppId cannot be "read" in Code section
+               if IsUninstaller() = false then
+                       SaveStringToFile(ExpandConstant('{app}') + '\uninsTasks.txt', WizardSelectedTasks(False), False);
+       end;
+end;
+
+// Moved to WinMerge.iss as there is an implementation already
+// procedure CurStepChanged(CurStep: TSetupStep);
+// begin
+//     if CurStep = ssPostInstall then
+//             if IsTaskSelected('modifypath') then
+//                     ModPath();
+// end;
+
+// Moved to WinMerge.iss as there is an implementation already
+// procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
+// var
+//     appdir:                 String;
+//     selectedTasks:  String;
+// begin
+//     appdir := ExpandConstant('{app}')
+//     if CurUninstallStep = usUninstall then begin
+//             if LoadStringFromFile(appdir + '\uninsTasks.txt', selectedTasks) then
+//                     if Pos('modifypath', selectedTasks) > 0 then
+//                             ModPath();
+//             DeleteFile(appdir + '\uninsTasks.txt')
+//     end;
+// end;
+
+function NeedRestart(): Boolean;
+begin
+       if IsTaskSelected('modifypath') and not UsingWinNT() then begin
+               Result := True;
+       end else begin
+               Result := False;
+       end;
+end;