OSDN Git Service

Fix for Visual Studio 2010
[winmerge-jp/winmerge-jp.git] / Installer / InnoSetup / WinMerge.iss
1 ; ID line follows -- this is updated by SVN
2 ; $Id: WinMerge.iss 7150 2010-05-04 17:26:43Z kimmov $
3 ;
4 ;           Programmed by:  Christian Blackburn, Christian List, Kimmo Varis,
5 ;                 Purpose:  The is the Inno Setup installation script for distributing our WinmMerge application.
6 ; 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)
7 ;                           note: the versions of Inno Setup and the QuickStart Pack should be identical to ensure proper function
8 ;Directly Dependant Files:  Because this is an installer. It would be difficult to list and maintain each of the files referenced
9 ;                           throughout the script in the header.  If you search this plain text script for a particular file in our Subversio repository and it
10 ;                           doesn't appear then this script is not directly dependant on that file.
11 ;Compilation Instructions:  1.  Open this file in Inno Setup or ISTool
12 ;                           2.  Make sure Compression=LZMA/Ultra, InternalCompressLevel=Ultra, and SolidCompression=True these values are lowered during
13 ;                               development to speed up compilation, however at release we want the intaller to be as strong as possible.
14 ;                           3. Check all files are present:
15 ;                                   -From ISTool Click
16 ;                           4.  Compile the script: "Project" --> "Verify Files..."
17 ;                                   -From Inno Setup "Click "Build" --> "Compile"
18 ;                                   -From ISTool Click "Project" --> "Compile Setup"
19 ;                           5.  The compiled installer will appear in the \InnoSetup\Output\ directory at currently should be around 1.5MBs in size.
20 ;
21 ; Installer To Do List:
22 ; #  Make the Install7ZipDll() Function automatically work with future versions of Merge7zDLL (Use GetCurentFileName)
23 ; #  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
24 ; #  Add WinMerge to the user's path so they can execute comparison's from a Dos Prompt (Cmd.exe/Command.exe)
25 ; #  We need to unregister, and delete the ShellExtension Dll if the user doesn't want it, during installation
26
27 ; #  Display integration options in gray rather than hiding them if the user doesn't have the application in question installed
28 ; #  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
29 ; #  Write code to detect "\Programs\WinMerge\WinMerge" type start menu installs
30 ;
31 ; Custom Installer Pages:
32 ; #  Bundle 7-Zip with WinMerge or provide on the fly download capability.
33 ; #  Allow users to set their working directory via a custom installer page
34 ;
35 ; Things that make the user's life easier:
36 ; #  Create instructions and a sample language file using the Inno Setup Translator Tool (http://www2.arnes.si/~sopjsimo/translator.html)
37 ; #  Add "WinMerge is running would you like to close it now?" support with programmatic termination
38 ;     -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
39 ; #  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
40 ;    once the ShellExtension.dll file has been added or removed.
41 ;
42 ; Non-Essential Features:
43 ; #  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)
44 ; #  Using the registry set the order our icons appear within their group in the start menu.:
45 ;      1.  WinMerge
46 ;      2.  Read Me
47 ;      3.  Users's Guide
48 ;      4.  WinMerge on the Web
49 ;      5.  Uninstall WinMerge
50 ; #  Create the ability to install to two start menu groups simultaneously
51 ;
52 ; Not yet possible (Limited by Inno Setup):
53 ; #  While uninstalling prompt the user as to whether or not they'd like to remove their WinMerge preferences too?
54
55 #define AppVersion GetFileVersion(SourcePath + "\..\..\Build\MergeUnicodeRelease\WinMergeU.exe")
56 #define FriendlyAppVersion Copy(GetFileVersion(SourcePath + "\..\..\Build\MergeUnicodeRelease\WinMergeU.exe"), 1, 5)
57
58
59 [Setup]
60 AppName=WinMerge
61 AppVersion={#AppVersion}
62 AppVerName=WinMerge {#AppVersion}
63 AppPublisher=Thingamahoochie Software
64 AppPublisherURL=http://WinMerge.org/
65 AppSupportURL=http://WinMerge.org/
66 AppUpdatesURL=http://WinMerge.org/
67
68 ; Installer executable's version resource info
69 VersionInfoCompany=http://winmerge.org
70 VersionInfoDescription=WinMerge Installer
71 VersionInfoVersion={#AppVersion}
72
73 ;This is in case an older version of the installer happened to be
74 DirExistsWarning=no
75
76 ;Tells the installer to only display a select language dialog if the an exact match wasn't found
77 ShowLanguageDialog=auto
78
79 DefaultDirName={pf}\WinMerge
80 DefaultGroupName=WinMerge
81 DisableStartupPrompt=true
82 AllowNoIcons=true
83 InfoBeforeFile=..\..\Docs\users\GPL.rtf
84 InfoAfterFile=..\..\Docs\users\ReadMe.txt
85
86 OutputBaseFilename=WinMerge-{#AppVersion}-Setup
87
88 ;This must be admin to install C++ Runtimes and shell extension
89 PrivilegesRequired=admin
90
91 UninstallDisplayIcon={app}\{code:ExeName}
92
93 ;Artwork References
94 WizardImageFile=Art\Large Logo.bmp
95 WizardSmallImageFile=Art\Small Logo.bmp
96 WizardImageStretch=false
97
98 ;It is confusing, if Setup/Uninstall use the same icon like WinMerge!
99 ;SetupIconFile=..\..\src\res\Merge.ico
100
101 ;Compression Parameters
102 ;Please note while Compression=lzma/ultra and InternalCompressLevel=Ultra are better than max
103 ;they also require 320 MB of memory for compression. If you're system has at least 256MB RAM then by all
104 ;means set it to ultra before compilation
105 Compression=lzma/ultra
106 InternalCompressLevel=ultra
107 SolidCompression=true
108
109 ; Update file associations for shell (project files)
110 ChangesAssociations=true
111 ; Updates PATH
112 ChangesEnvironment=true
113 OutputDir=..\..\Build
114 AlwaysShowComponentsList=true
115
116
117 [Languages]
118 ;Inno Setup's Native Language
119 Name: English; MessagesFile: ..\..\Translations\InnoSetup\English.isl
120
121 ;Localizations:
122 Name: Bulgarian; MessagesFile: ..\..\Translations\InnoSetup\Bulgarian.isl; InfoAfterFile: ..\..\Docs\Users\..\..\Translations\\Docs\Readme\ReadMe-Bulgarian.txt
123 Name: Catalan; MessagesFile: ..\..\Translations\InnoSetup\Catalan.isl; InfoAfterFile: ..\..\Docs\Users\..\..\Translations\\Docs\Readme\ReadMe-Catalan.txt
124 Name: Chinese_Simplified; MessagesFile: ..\..\Translations\InnoSetup\Chinese_Simplified.isl; InfoAfterFile: ..\..\Docs\Users\..\..\Translations\\Docs\Readme\ReadMe-ChineseSimplified.txt
125 Name: Chinese_Traditional; MessagesFile: ..\..\Translations\InnoSetup\Chinese_Traditional.isl; InfoAfterFile: ..\..\Docs\Users\..\..\Translations\\Docs\Readme\ReadMe-ChineseTraditional.txt
126 Name: Croatian; MessagesFile: ..\..\Translations\InnoSetup\Croatian.isl; InfoAfterFile: ..\..\Docs\Users\..\..\Translations\\Docs\Readme\ReadMe-Croatian.txt
127 Name: Czech; MessagesFile: ..\..\Translations\InnoSetup\Czech.isl
128 Name: Danish; MessagesFile: ..\..\Translations\InnoSetup\Danish.isl
129 Name: Dutch; MessagesFile: ..\..\Translations\InnoSetup\Dutch.isl; InfoAfterFile: ..\..\Docs\Users\..\..\Translations\Docs\Readme\ReadMe-Dutch.txt
130 Name: French; MessagesFile: ..\..\Translations\InnoSetup\French.isl; InfoAfterFile: ..\..\Docs\Users\..\..\Translations\Docs\Readme\ReadMe-French.txt
131 Name: Galician; MessagesFile: ..\..\Translations\InnoSetup\Galician.isl; InfoAfterFile: ..\..\Docs\Users\..\..\Translations\Docs\Readme\ReadMe-Galician.txt
132 Name: German; MessagesFile: ..\..\Translations\InnoSetup\German.isl
133 Name: Greek; MessagesFile: ..\..\Translations\InnoSetup\Greek.isl; InfoAfterFile: ..\..\Docs\Users\..\..\Translations\Docs\Readme\ReadMe-Greek.txt
134 Name: Hungarian; MessagesFile: ..\..\Translations\InnoSetup\Hungarian.isl
135 Name: Italian; MessagesFile: ..\..\Translations\InnoSetup\Italian.isl
136 Name: Japanese; MessagesFile: ..\..\Translations\InnoSetup\Japanese.isl; InfoAfterFile: ..\..\Docs\Users\..\..\Build\Docs\ReadMe-Japanese.txt
137 Name: Korean; MessagesFile: ..\..\Translations\InnoSetup\Korean.isl
138 Name: Norwegian; MessagesFile: ..\..\Translations\InnoSetup\Norwegian.isl
139 Name: Persian; MessagesFile: ..\..\Translations\InnoSetup\Persian.isl
140 Name: Polish; MessagesFile: ..\..\Translations\InnoSetup\Polish.isl
141 Name: Portuguese; MessagesFile: ..\..\Translations\InnoSetup\Portuguese.isl
142 Name: PortugueseBrazilian; MessagesFile: ..\..\Translations\InnoSetup\Brazilian_Portuguese.isl; InfoAfterFile: ..\..\Docs\Users\..\..\Translations\Docs\Readme\ReadMe-Brazilian.txt
143 Name: Romanian; MessagesFile: ..\..\Translations\InnoSetup\Romanian.isl
144 Name: Russian; MessagesFile: ..\..\Translations\InnoSetup\Russian.isl
145 Name: Serbian; MessagesFile: ..\..\Translations\InnoSetup\Serbian.isl; InfoAfterFile: ..\..\Translations\Docs\Readme\ReadMe-Serbian.txt
146 Name: Slovak; MessagesFile: ..\..\Translations\InnoSetup\Slovak.isl
147 Name: Slovenian; MessagesFile: ..\..\Translations\InnoSetup\Slovenian.isl
148 Name: Spanish; MessagesFile: ..\..\Translations\InnoSetup\Spanish.isl; InfoAfterFile: ..\..\Docs\Users\..\..\Translations\Docs\Readme\ReadMe-Spanish.txt
149 Name: Swedish; MessagesFile: ..\..\Translations\InnoSetup\Swedish.isl; InfoAfterFile: ..\..\Docs\Users\..\..\Translations\Docs\Readme\ReadMe-Swedish.txt
150 Name: Turkish; MessagesFile: ..\..\Translations\InnoSetup\Turkish.isl
151 Name: Ukrainian; MessagesFile: ..\..\Translations\InnoSetup\Ukrainian.isl; InfoAfterFile: ..\..\Docs\Users\..\..\Translations\Docs\Readme\ReadMe-Ukrainian.txt
152
153
154 [Messages]
155 English.FinishedLabel=Setup has finished installing WinMerge on your computer.
156 English.SetupAppTitle=Setup - WinMerge {#AppVersion}
157 English.WizardInfoBefore=License Agreement
158 English.InfoBeforeLabel=GNU General Public License
159
160
161 [Types]
162 Name: typical; Description: {cm:TypicalInstallation}
163 Name: full; Description: {cm:FullInstallation}
164 Name: compact; Description: {cm:CompactInstallation}
165 Name: custom; Description: {cm:CustomInstallation}; Flags: iscustom
166
167
168 [Components]
169 ; Executable, libraries, documentation
170 Name: Core; Description: {cm:AppCoreFiles}; Types: full custom typical compact; Flags: fixed
171
172 Name: filters; Description: {cm:Filters}; Flags: disablenouninstallwarning; Types: full typical
173 Name: Plugins; Description: {cm:Plugins}; Flags: disablenouninstallwarning; Types: full
174
175 ;Language components
176 Name: Languages; Description: {cm:Languages}; Flags: disablenouninstallwarning
177 Name: Languages\Bulgarian; Description: {cm:BulgarianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Bulgarian
178 Name: Languages\Bulgarian; Description: {cm:BulgarianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Bulgarian
179
180 Name: Languages\Catalan; Description: {cm:CatalanLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Catalan
181 Name: Languages\Catalan; Description: {cm:CatalanLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Catalan
182
183 Name: Languages\Chinese_Simplified; Description: {cm:ChineseSimplifiedLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Chinese_Simplified
184 Name: Languages\Chinese_Simplified; Description: {cm:ChineseSimplifiedLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Chinese_Simplified
185
186 Name: Languages\Chinese_Traditional; Description: {cm:ChineseTraditionalLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Chinese_Traditional
187 Name: Languages\Chinese_Traditional; Description: {cm:ChineseTraditionalLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Chinese_Traditional
188
189 Name: Languages\Croatian; Description: {cm:CroatianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Croatian
190 Name: Languages\Croatian; Description: {cm:CroatianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Croatian
191
192 Name: Languages\Czech; Description: {cm:CzechLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Czech
193 Name: Languages\Czech; Description: {cm:CzechLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Czech
194
195 Name: Languages\Danish; Description: {cm:DanishLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Danish
196 Name: Languages\Danish; Description: {cm:DanishLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Danish
197
198 Name: Languages\Dutch; Description: {cm:DutchLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Dutch
199 Name: Languages\Dutch; Description: {cm:DutchLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Dutch
200
201 Name: Languages\French; Description: {cm:FrenchLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not French
202 Name: Languages\French; Description: {cm:FrenchLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: French
203
204 Name: Languages\Galician; Description: {cm:GalicianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Galician
205 Name: Languages\Galician; Description: {cm:GalicianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Galician
206
207 Name: Languages\German; Description: {cm:GermanLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not German
208 Name: Languages\German; Description: {cm:GermanLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: German
209
210 Name: Languages\Greek; Description: {cm:GreekLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Greek
211 Name: Languages\Greek; Description: {cm:GreekLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Greek
212
213 Name: Languages\Hungarian; Description: {cm:HungarianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Hungarian
214 Name: Languages\Hungarian; Description: {cm:HungarianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Hungarian
215
216 Name: Languages\Italian; Description: {cm:ItalianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Italian
217 Name: Languages\Italian; Description: {cm:ItalianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Italian
218
219 Name: Languages\Japanese; Description: {cm:JapaneseLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Japanese
220 Name: Languages\Japanese; Description: {cm:JapaneseLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Japanese
221
222 Name: Languages\Korean; Description: {cm:KoreanLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Korean
223 Name: Languages\Korean; Description: {cm:KoreanLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Korean
224
225 Name: Languages\Norwegian; Description: {cm:NorwegianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Norwegian
226 Name: Languages\Norwegian; Description: {cm:NorwegianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Norwegian
227
228 Name: Languages\Persian; Description: {cm:PersianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Persian
229 Name: Languages\Persian; Description: {cm:PersianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Persian
230
231 Name: Languages\Polish; Description: {cm:PolishLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Polish
232 Name: Languages\Polish; Description: {cm:PolishLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Polish
233
234 Name: Languages\Portuguese; Description: {cm:PortugueseLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Portuguese
235 Name: Languages\Portuguese; Description: {cm:PortugueseLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Portuguese
236
237 Name: Languages\PortugueseBrazilian; Description: {cm:PortugueseBrazilLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not PortugueseBrazilian
238 Name: Languages\PortugueseBrazilian; Description: {cm:PortugueseBrazilLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: PortugueseBrazilian
239
240 Name: Languages\Romanian; Description: {cm:RomanianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Romanian
241 Name: Languages\Romanian; Description: {cm:RomanianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Romanian
242
243 Name: Languages\Russian; Description: {cm:RussianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Russian
244 Name: Languages\Russian; Description: {cm:RussianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Russian
245
246 Name: Languages\Serbian; Description: {cm:SerbianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Serbian
247 Name: Languages\Serbian; Description: {cm:SerbianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Serbian
248
249 Name: Languages\Slovak; Description: {cm:SlovakLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Slovak
250 Name: Languages\Slovak; Description: {cm:SlovakLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Slovak
251
252 Name: Languages\Slovenian; Description: {cm:SlovenianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Slovenian
253 Name: Languages\Slovenian; Description: {cm:SlovenianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Slovenian
254
255 Name: Languages\Spanish; Description: {cm:SpanishLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Spanish
256 Name: Languages\Spanish; Description: {cm:SpanishLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Spanish
257
258 Name: Languages\Swedish; Description: {cm:SwedishLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Swedish
259 Name: Languages\Swedish; Description: {cm:SwedishLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Swedish
260
261 Name: Languages\Turkish; Description: {cm:TurkishLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Turkish
262 Name: Languages\Turkish; Description: {cm:TurkishLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Turkish
263
264 Name: Languages\Ukrainian; Description: {cm:UkrainianLanguage}; Flags: disablenouninstallwarning; Types: full; Languages: not Ukrainian
265 Name: Languages\Ukrainian; Description: {cm:UkrainianLanguage}; Flags: disablenouninstallwarning; Types: full typical compact; Languages: Ukrainian
266
267
268 [Tasks]
269 Name: ShellExtension; Description: {cm:ExplorerContextMenu}; GroupDescription: {cm:OptionalFeatures}
270 Name: modifypath; Description: {cm:AddToPath}; GroupDescription: {cm:OptionalFeatures}; Flags: unchecked
271 Name: TortoiseCVS; Description: {cm:IntegrateTortoiseCVS}; GroupDescription: {cm:OptionalFeatures}; Check: TortoiseCVSInstalled
272 Name: TortoiseSVN; Description: {cm:IntegrateTortoiseSVN}; GroupDescription: {cm:OptionalFeatures}; Check: TortoiseSVNInstalled; MinVersion: 0,5.0.2195sp3
273 Name: ClearCase; Description: {cm:IntegrateClearCase}; GroupDescription: {cm:OptionalFeatures}; Check: ClearCaseInstalled
274 Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
275 Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}
276
277 [InstallDelete]
278 ; Diff.txt is a file left over from previous versions of WinMerge (before version 2.0), we just delete it to be nice.
279 Type: files; Name: {app}\Diff.txt
280
281 ;All of these files are removed so if the user upgrades their operating system or changes their language selections only the
282 ;necessary files will be left in the installation folder
283 ;Another reason these files might be strays is if a user extracted one of the experimental builds such as:
284 ;WinMerge.{#AppVersion}-exe.7z.
285 Name: {app}\WinMerge.exe; Type: files
286 Name: {app}\WinMergeU.exe; Type: files; MinVersion: 0, 4
287
288 ;Remove manifest files as we don't need them in 2.6.2 / 2.7.1.1 or later
289 Name: {app}\WinMerge.exe.manifest; Type: files
290 Name: {app}\WinMergeU.exe.manifest; Type: files
291
292 Name: {app}\Merge7z311.dll; Type: files
293 Name: {app}\Merge7z311U.dll; Type: files; MinVersion: 0, 4
294
295 Name: {app}\Merge7z312.dll; Type: files
296 Name: {app}\Merge7z312U.dll; Type: files; MinVersion: 0, 4
297
298 Name: {app}\Merge7z313.dll; Type: files
299 Name: {app}\Merge7z313U.dll; Type: files; MinVersion: 0, 4
300
301 Name: {app}\Merge7z420.dll; Type: files
302 Name: {app}\Merge7z420U.dll; Type: files; MinVersion: 0, 4
303
304 Name: {app}\Merge7z423.dll; Type: files
305 Name: {app}\Merge7z423U.dll; Type: files; MinVersion: 0, 4
306
307 Name: {app}\Merge7z431.dll; Type: files
308 Name: {app}\Merge7z431U.dll; Type: files; MinVersion: 0, 4
309
310 Name: {app}\Merge7z432.dll; Type: files
311 Name: {app}\Merge7z432U.dll; Type: files; MinVersion: 0, 4
312
313 Name: {app}\Merge7z442.dll; Type: files
314 Name: {app}\Merge7z442U.dll; Type: files; MinVersion: 0, 4
315
316 Name: {app}\Merge7z457.dll; Type: files
317 Name: {app}\Merge7z457U.dll; Type: files; MinVersion: 0, 4
318
319 Name: {app}\Merge7z465.dll; Type: files
320 Name: {app}\Merge7z465U.dll; Type: files; MinVersion: 0, 4
321
322 ;This won't work, because the file has to be unregistered, and explorer closed, first.
323 ;Name: {app}\ShellExtension.dll; Type: files; Check: TaskDisabled('ShellExtension')
324
325 ; Remove existing .lang files - we don't need them anymore as we are
326 ; using PO files now.
327 Name: {app}\Languages\MergeBrazilian.lang; Type: files
328 Name: {app}\Languages\MergeBulgarian.lang; Type: files
329 Name: {app}\Languages\MergeCatalan.lang; Type: files
330 Name: {app}\Languages\MergeChineseSimplified.lang; Type: files
331 Name: {app}\Languages\MergeChineseTraditional.lang; Type: files
332 Name: {app}\Languages\MergeCzech.lang; Type: files
333 Name: {app}\Languages\MergeDanish.lang; Type: files
334 Name: {app}\Languages\MergeDutch.lang; Type: files
335 Name: {app}\Languages\MergeFrench.lang; Type: files
336 Name: {app}\Languages\MergeGerman.lang; Type: files
337 Name: {app}\Languages\MergeHungarian.lang; Type: files
338 Name: {app}\Languages\MergeItalian.lang; Type: files
339 Name: {app}\Languages\MergeJapanese.lang; Type: files
340 Name: {app}\Languages\MergeKorean.lang; Type: files
341 Name: {app}\Languages\MergeNorwegian.lang; Type: files
342 Name: {app}\Languages\MergePersian.lang; Type: files
343 Name: {app}\Languages\MergePolish.lang; Type: files
344 Name: {app}\Languages\MergePortuguese.lang; Type: files
345 Name: {app}\Languages\MergeSlovak.lang; Type: files
346 Name: {app}\Languages\MergeSpanish.lang; Type: files
347 Name: {app}\Languages\MergeRussian.lang; Type: files
348 Name: {app}\Languages\MergeSerbian.lang; Type: files
349 Name: {app}\Languages\MergeSwedish.lang; Type: files
350 Name: {app}\Languages\MergeTurkish.lang; Type: files
351 Name: {app}\MergePlugins\list.txt; Type: files; Check: not IsComponentSelected('Plugins')
352
353 ;Removes the user's guide icon if the user deselects the user's guide component.
354 Name: {group}\{cm:UsersGuide}.lnk; Type: files; Check: not IsComponentSelected('Docs')
355
356 ;This removes the quick launch icon in case the user chooses not to install it after previously having it installed
357 Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\WinMerge.lnk; Type: files; Check: not IsTaskSelected('QuickLauchIcon')
358 Name: {commonappdata}\Microsoft\Internet Explorer\Quick Launch\WinMerge.lnk; Type: files; Check: not IsTaskSelected('QuickLauchIcon')
359
360 ;This removes the desktop icon in case the user chooses not to install it after previously having it installed
361 Name: {userdesktop}\WinMerge.lnk; Type: files; Check: not IsTaskSelected('DesktopIcon')
362 Name: {commondesktop}\WinMerge.lnk; Type: files; Check: not IsTaskSelected('DesktopIcon')
363
364 ;Remove ANSI executable link from start menu for NT-based Windows versions
365 ;This was installed earlier, but not anymore.
366 Name: {group}\WinMerge (ANSI).lnk; Type: files; MinVersion: 0,4
367 Name: {app}\Docs; Type: filesandordirs
368
369 Name: {app}\MergePlugins\editor addin.sct; Type: Files; Check: not IsComponentSelected('Plugins')
370 Name: {app}\MergePlugins\insert datetime.sct; Type: Files; Check: not IsComponentSelected('Plugins')
371 Name: {app}\MergePlugins; Type: DirIfEmpty; Check: not IsComponentSelected('Plugins')
372
373 Name: {app}\Filters\ADAMulti.flt; Type: Files; Check: not IsComponentSelected('Filters')
374 Name: {app}\Filters\ASPNET.flt; Type: Files; Check: not IsComponentSelected('Filters')
375 Name: {app}\Filters\CSharp_loose.flt; Type: Files; Check: not IsComponentSelected('Filters')
376 Name: {app}\Filters\Delphi.flt; Type: Files; Check: not IsComponentSelected('Filters')
377 Name: {app}\Filters\MASM.flt; Type: Files; Check: not IsComponentSelected('Filters')
378 Name: {app}\Filters\Merge_GnuC_loose.flt; Type: Files; Check: not IsComponentSelected('Filters')
379 Name: {app}\Filters\Merge_VC_loose.flt; Type: Files; Check: not IsComponentSelected('Filters')
380 Name: {app}\Filters\Merge_VB_loose.flt; Type: Files; Check: not IsComponentSelected('Filters')
381 Name: {app}\Filters\SourceControl.flt; Type: Files; Check: not IsComponentSelected('Filters')
382 Name: {app}\Filters\Symbian.flt; Type: Files; Check: not IsComponentSelected('Filters')
383 Name: {app}\Filters\XML_html.flt; Type: Files; Check: not IsComponentSelected('Filters')
384 Name: {app}\Filters\FileFilter.tmpl; Type: Files; Check: not IsComponentSelected('Filters')
385 Name: {app}\Filters; Type: DirIfEmpty; Check: not IsComponentSelected('Filters')
386
387
388
389 [Dirs]
390 ;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
391 Name: {app}; Flags: uninsalwaysuninstall
392
393
394 [Files]
395 ; Select the proper executable for different Windows versions
396 ; For Windows 05/98/ME ANSI executable is installed (WinMerge.exe)
397 ; For Windows NT4/2000/XP/2003/Vista the Unicode executable is installed (WinMergeU.exe)
398 Source: ..\..\Build\MergeUnicodeRelease\WinMergeU.exe; DestDir: {app}; Flags: promptifolder; MinVersion: 0, 4; Components: Core
399
400 ; List of installed files
401 Source: ..\..\Docs\Users\Files.txt; DestDir: {app}; Flags: promptifolder; Components: Core
402
403 ; Microsoft runtime libraries (C-runtime, MFC)
404 Source: "C:\Program Files (x86)\Microsoft Visual Studio 10.0\vc\redist\x86\Microsoft.VC100.CRT\msvcr100.dll"; DestDir: "{app}"; Components: Core\r
405 Source: "C:\Program Files (x86)\Microsoft Visual Studio 10.0\vc\redist\x86\Microsoft.VC100.CRT\msvcp100.dll"; DestDir: "{app}"; Components: Core\r
406 \r
407 Source: "C:\Program Files (x86)\Microsoft Visual Studio 10.0\vc\redist\x86\Microsoft.VC100.MFC\mfc100u.dll"; DestDir: "{app}"; Components: Core\r
408 Source: "C:\Program Files (x86)\Microsoft Visual Studio 10.0\vc\redist\x86\Microsoft.VC100.MFC\mfcm100u.dll"; DestDir: "{app}"; Components: Core\r
409 Source: "C:\Program Files (x86)\Microsoft Visual Studio 10.0\vc\redist\x86\Microsoft.VC100.MFCLOC\mfc100jpn.dll"; DestDir: "{app}"; Components: Core\r
410
411 ; Shell extension
412 Source: ..\..\Build\MergeUnicodeRelease\ShellExtensionU.dll; DestDir: {app}; Flags: regserver uninsrestartdelete restartreplace promptifolder; MinVersion: 0, 4; Check: not IsWin64
413 ; 64-bit version of ShellExtension
414 Source: ..\..\Build\X64\ShellExtensionUnicode Release MinDependency\ShellExtensionX64.dll; DestDir: {app}; Flags: regserver uninsrestartdelete restartreplace promptifolder 64bit; MinVersion: 0,5.01.2600; Check: IsWin64\r
415
416 ;Please do not reorder the 7z Dlls by version they compress better ordered by platform and then by version
417 Source: ..\..\Build\MergeUnicodeRelease\Merge7z465U.dll; DestDir: {app}; Flags: promptifolder; MinVersion: 0, 4; Check: Install7ZipDll('465')
418 Source: ..\..\Build\MergeUnicodeRelease\Merge7z457U.dll; DestDir: {app}; Flags: promptifolder; MinVersion: 0, 4; Check: Install7ZipDll('457')
419 Source: ..\..\Build\MergeUnicodeRelease\Merge7z442U.dll; DestDir: {app}; Flags: promptifolder; MinVersion: 0, 4; Check: Install7ZipDll('442')
420 Source: ..\..\Build\MergeUnicodeRelease\Merge7z432U.dll; DestDir: {app}; Flags: promptifolder; MinVersion: 0, 4; Check: Install7ZipDll('432')
421 Source: ..\..\Build\MergeUnicodeRelease\Merge7z431U.dll; DestDir: {app}; Flags: promptifolder; MinVersion: 0, 4; Check: Install7ZipDll('431')
422 Source: ..\..\Build\MergeUnicodeRelease\Merge7z423U.dll; DestDir: {app}; Flags: promptifolder; MinVersion: 0, 4; Check: Install7ZipDll('423')
423 Source: ..\..\Build\MergeUnicodeRelease\Merge7z420U.dll; DestDir: {app}; Flags: promptifolder; MinVersion: 0, 4; Check: Install7ZipDll('420')
424 Source: ..\..\Build\MergeUnicodeRelease\Merge7z313U.dll; DestDir: {app}; Flags: promptifolder; MinVersion: 0, 4; Check: Install7ZipDll('313')
425 Source: ..\..\Build\MergeUnicodeRelease\Merge7z312U.dll; DestDir: {app}; Flags: promptifolder; MinVersion: 0, 4; Check: Install7ZipDll('312')
426 Source: ..\..\Build\MergeUnicodeRelease\Merge7z311U.dll; DestDir: {app}; Flags: promptifolder; MinVersion: 0, 4; Check: Install7ZipDll('311')
427
428 ; Expat dll
429 Source: ..\..\Build\expat\lib\Release\libexpat.dll; DestDir: {app}; Flags: promptifolder; Components: Core
430
431 ; PCRE dll
432 Source: ..\..\Build\pcre\MinSizeRel\pcre.dll; DestDir: {app}; Flags: promptifolder; Components: Core
433
434 ; MergeLang.dll - translation helper dll
435 Source: ..\..\Build\MergeUnicodeRelease\MergeLang.dll; DestDir: {app}; Flags: promptifolder ignoreversion; Components: Core
436
437 ; Language files
438 Source: ..\..\Translations\WinMerge\Brazilian.po; DestDir: {app}\Languages; Components: Languages\Portuguese; Flags: ignoreversion comparetimestamp
439 Source: ..\..\Translations\Docs\Readme\ReadMe-Brazilian.txt; DestDir: {app}\Docs; Components: Languages\PortugueseBrazilian
440 Source: ..\..\Translations\WinMerge\Bulgarian.po; DestDir: {app}\Languages; Components: Languages\Bulgarian; Flags: ignoreversion comparetimestamp
441 Source: ..\..\Translations\Docs\Readme\ReadMe-Bulgarian.txt; DestDir: {app}\Docs; Components: Languages\Bulgarian
442 Source: ..\..\Translations\WinMerge\Catalan.po; DestDir: {app}\Languages; Components: Languages\Catalan; Flags: ignoreversion comparetimestamp
443 Source: ..\..\Translations\Docs\Readme\ReadMe-Catalan.txt; DestDir: {app}\Docs; Components: Languages\Catalan
444 Source: ..\..\Translations\WinMerge\ChineseSimplified.po; DestDir: {app}\Languages; Components: Languages\Chinese_Simplified; Flags: ignoreversion comparetimestamp
445 Source: ..\..\Translations\Docs\Readme\ReadMe-ChineseSimplified.txt; DestDir: {app}\Docs; Components: Languages\Chinese_Simplified
446 Source: ..\..\Translations\WinMerge\ChineseTraditional.po; DestDir: {app}\Languages; Components: Languages\Chinese_Traditional; Flags: ignoreversion comparetimestamp
447 Source: ..\..\Translations\Docs\Readme\ReadMe-ChineseTraditional.txt; DestDir: {app}\Docs; Components: Languages\Chinese_Traditional
448 Source: ..\..\Translations\WinMerge\Croatian.po; DestDir: {app}\Languages; Components: Languages\Croatian; Flags: ignoreversion comparetimestamp
449 Source: ..\..\Translations\Docs\Readme\ReadMe-Croatian.txt; DestDir: {app}\Docs; Components: Languages\Croatian
450 Source: ..\..\Translations\WinMerge\Czech.po; DestDir: {app}\Languages; Components: Languages\Czech; Flags: ignoreversion comparetimestamp
451 Source: ..\..\Translations\WinMerge\Danish.po; DestDir: {app}\Languages; Components: Languages\Danish; Flags: ignoreversion comparetimestamp
452 Source: ..\..\Translations\WinMerge\Dutch.po; DestDir: {app}\Languages; Components: Languages\Dutch; Flags: ignoreversion comparetimestamp
453 Source: ..\..\Translations\Docs\Readme\ReadMe-Dutch.txt; DestDir: {app}\Docs; Components: Languages\Dutch
454 Source: ..\..\Translations\WinMerge\French.po; DestDir: {app}\Languages; Components: Languages\French; Flags: ignoreversion comparetimestamp
455 Source: ..\..\Translations\Docs\Readme\ReadMe-French.txt; DestDir: {app}\Docs; Components: Languages\French
456 Source: ..\..\Translations\WinMerge\Galician.po; DestDir: {app}\Languages; Components: Languages\Galician; Flags: ignoreversion comparetimestamp
457 Source: ..\..\Translations\Docs\Readme\ReadMe-Galician.txt; DestDir: {app}\Docs; Components: Languages\Galician
458 Source: ..\..\Translations\WinMerge\German.po; DestDir: {app}\Languages; Components: Languages\German; Flags: ignoreversion comparetimestamp
459 Source: ..\..\Translations\WinMerge\Greek.po; DestDir: {app}\Languages; Components: Languages\Greek; Flags: ignoreversion comparetimestamp
460 Source: ..\..\Translations\Docs\Readme\ReadMe-Greek.txt; DestDir: {app}\Docs; Components: Languages\Greek
461 Source: ..\..\Translations\WinMerge\Hungarian.po; DestDir: {app}\Languages; Components: Languages\Hungarian; Flags: ignoreversion comparetimestamp
462 Source: ..\..\Translations\WinMerge\Italian.po; DestDir: {app}\Languages; Components: Languages\Italian; Flags: ignoreversion comparetimestamp
463 Source: ..\..\Translations\WinMerge\Japanese.po; DestDir: {app}\Languages; Components: Languages\Japanese; Flags: ignoreversion
464 Source: ..\..\Build\Docs\ReadMe-Japanese.txt; DestDir: {app}\Docs; Components: Languages\Japanese
465 Source: ..\..\Build\Manual\htmlhelp\WinMerge_ja.chm; DestDir: {app}\Docs; Components: Languages\Japanese
466 Source: ..\..\Translations\WinMerge\Korean.po; DestDir: {app}\Languages; Components: Languages\Korean; Flags: ignoreversion comparetimestamp
467 Source: ..\..\Translations\WinMerge\Norwegian.po; DestDir: {app}\Languages; Components: Languages\Norwegian; Flags: ignoreversion comparetimestamp
468 Source: ..\..\Translations\WinMerge\Persian.po; DestDir: {app}\Languages; Components: Languages\Persian; Flags: ignoreversion comparetimestamp
469 Source: ..\..\Translations\WinMerge\Polish.po; DestDir: {app}\Languages; Components: Languages\Polish; Flags: ignoreversion comparetimestamp
470 Source: ..\..\Translations\WinMerge\Portuguese.po; DestDir: {app}\Languages; Components: Languages\Portuguese; Flags: ignoreversion comparetimestamp
471 Source: ..\..\Translations\WinMerge\Romanian.po; DestDir: {app}\Languages; Components: Languages\Romanian; Flags: ignoreversion comparetimestamp
472 Source: ..\..\Translations\Docs\Readme\ReadMe-Romanian.txt; DestDir: {app}\Docs; Components: Languages\Romanian
473 Source: ..\..\Translations\WinMerge\Russian.po; DestDir: {app}\Languages; Components: Languages\Russian; Flags: ignoreversion comparetimestamp
474 Source: ..\..\Translations\WinMerge\Serbian.po; DestDir: {app}\Languages; Components: Languages\Serbian; Flags: ignoreversion comparetimestamp
475 Source: ..\..\Translations\WinMerge\Slovak.po; DestDir: {app}\Languages; Components: Languages\Slovak; Flags: ignoreversion comparetimestamp
476 Source: ..\..\Translations\WinMerge\Slovenian.po; DestDir: {app}\Languages; Components: Languages\Slovenian; Flags: ignoreversion comparetimestamp
477 Source: ..\..\Translations\WinMerge\Spanish.po; DestDir: {app}\Languages; Components: Languages\Spanish; Flags: ignoreversion comparetimestamp
478 Source: ..\..\Translations\Docs\Readme\ReadMe-Spanish.txt; DestDir: {app}\Docs; Components: Languages\Spanish
479 Source: ..\..\Translations\WinMerge\Swedish.po; DestDir: {app}\Languages; Components: Languages\Swedish; Flags: ignoreversion comparetimestamp
480 Source: ..\..\Translations\Docs\Readme\ReadMe-Swedish.txt; DestDir: {app}\Docs; Components: Languages\Swedish
481 Source: ..\..\Translations\WinMerge\Turkish.po; DestDir: {app}\Languages; Components: Languages\Turkish; Flags: ignoreversion comparetimestamp
482 Source: ..\..\Translations\WinMerge\Ukrainian.po; DestDir: {app}\Languages; Components: Languages\Ukrainian; Flags: ignoreversion comparetimestamp
483 Source: ..\..\Translations\Docs\Readme\ReadMe-Ukrainian.txt; DestDir: {app}\Docs; Components: Languages\Ukrainian
484
485 Source: ..\..\Build\Filters\*.flt; DestDir: {app}\Filters; Flags: sortfilesbyextension comparetimestamp ignoreversion; Components: filters
486 Source: ..\..\Build\Filters\FileFilter.tmpl; DestDir: {app}\Filters; Flags: sortfilesbyextension comparetimestamp ignoreversion; Components: filters
487
488 ;Documentation
489 Source: ..\..\Build\Docs\ReadMe.txt; DestDir: {app}\Docs; Flags: comparetimestamp ignoreversion promptifolder; Components: Core
490 Source: ..\..\Build\Docs\Contributors.txt; DestDir: {app}; Flags: comparetimestamp ignoreversion promptifolder; Components: Core
491 Source: ..\..\Docs\Users\ReleaseNotes.html; DestDir: {app}\Docs; Flags: comparetimestamp ignoreversion promptifolder; Components: Core
492 Source: ..\..\Build\Docs\ChangeLog.txt; DestDir: {app}\Docs; Flags: comparetimestamp ignoreversion promptifolder; Components: Core\r
493 Source: ..\..\Build\Manual\htmlhelp\WinMerge.chm; DestDir: {app}\Docs\; Flags: overwritereadonly uninsremovereadonly; Components: Core
494
495 ;Plugins
496 ;Please note IgnoreVersion and CompareTimeStamp are to instruct the installer to not not check for version info and go straight to comparing modification dates
497 Source: ..\..\Plugins\dlls\editor addin.sct; DestDir: {app}\MergePlugins; Flags: IgnoreVersion CompareTimeStamp; Components: Plugins
498 Source: ..\..\Plugins\dlls\insert datetime.sct; DestDir: {app}\MergePlugins; Flags: IgnoreVersion CompareTimeStamp; Components: Plugins
499 Source: ..\..\Plugins\dlls\CompareMSExcelFiles.dll; DestDir: {app}\MergePlugins; Flags: promptifolder; Components: Plugins
500 Source: ..\..\Plugins\dlls\CompareMSWordFiles.dll; DestDir: {app}\MergePlugins; Flags: promptifolder; Components: Plugins
501 Source: ..\..\Plugins\dlls\IgnoreColumns.dll; DestDir: {app}\MergePlugins; Flags: promptifolder; Components: Plugins
502 Source: ..\..\Plugins\dlls\IgnoreCommentsC.dll; DestDir: {app}\MergePlugins; Flags: promptifolder; Components: Plugins
503 Source: ..\..\Plugins\dlls\IgnoreFieldsComma.dll; DestDir: {app}\MergePlugins; Flags: promptifolder; Components: Plugins
504 Source: ..\..\Plugins\dlls\IgnoreFieldsTab.dll; DestDir: {app}\MergePlugins; Flags: promptifolder; Components: Plugins
505 Source: ..\..\Plugins\dlls\IgnoreLeadingLineNumbers.dll; DestDir: {app}\MergePlugins; Flags: promptifolder; Components: Plugins
506
507 [Icons]
508 ;Start Menu Icons
509 Name: {group}\WinMerge; Filename: {app}\{code:ExeName}
510 Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe.txt; IconFileName: {win}\NOTEPAD.EXE
511 Name: {group}\{cm:UsersGuide}; Filename: {app}\Docs\WinMerge.chm
512 Name: {group}\{cm:UninstallProgram,WinMerge}; Filename: {uninstallexe}
513 Name: {group}\{cm:ProgramOnTheWeb,WinMerge}; Filename: http://winmerge.org/
514
515 ;Link to translated ReadMe in Start Menu
516 Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Brazilian.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: PortugueseBrazilian
517 Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Bulgarian.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Bulgarian
518 Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Catalan.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Catalan
519 Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-ChineseSimplified.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Chinese_Simplified
520 Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-ChineseTraditional.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Chinese_Traditional
521 Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Croatian.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Croatian
522 Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Dutch.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Dutch
523 Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-French.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: French
524 Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Galician.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Galician
525 Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Greek.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Greek
526 Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Japanese.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Japanese
527 Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Romanian.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Romanian
528 Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Spanish.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Spanish
529 Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Swedish.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Swedish
530 Name: {group}\{cm:ReadMe}; Filename: {app}\Docs\ReadMe-Ukrainian.txt; IconFileName: {win}\NOTEPAD.EXE; Languages: Ukrainian
531
532 ;Desktop Icon
533 Name: {commondesktop}\WinMerge; Filename: {app}\{code:ExeName}; Tasks: desktopicon
534
535 ;Quick Launch Icon
536 Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\WinMerge; Filename: {app}\{code:ExeName}; Tasks: quicklaunchicon
537
538 [Registry]
539 Root: HKCU; Subkey: Software\Thingamahoochie; Flags: uninsdeletekeyifempty
540 Root: HKCU; Subkey: Software\Thingamahoochie\WinMerge; Flags: uninsdeletekey
541 Root: HKLM; Subkey: Software\Thingamahoochie; Flags: uninsdeletekeyifempty
542 Root: HKLM; Subkey: Software\Thingamahoochie\WinMerge; Flags: uninsdeletekey
543
544 ;Add Project file extension (.WinMerge) to known extensions and
545 ;set WinMerge to open those files
546 ;set Notepad to edit project files
547 Root: HKCR; Subkey: .WinMerge; ValueType: String; ValueData: WinMerge.Project.File; Flags: uninsdeletekey
548 Root: HKCR; Subkey: WinMerge.Project.File; ValueType: String; ValueData: {cm:ProjectFileDesc}; Flags: uninsdeletekey
549 Root: HKCR; Subkey: WinMerge.Project.File\shell\open\command; ValueType: String; ValueData: """{app}\{code:ExeName}"" ""%1"""; Flags: uninsdeletekey
550 Root: HKCR; Subkey: WinMerge.Project.File\shell\edit\command; ValueType: String; ValueData: """NOTEPAD.EXE"" ""%1"""; Flags: uninsdeletekey
551 Root: HKCR; Subkey: WinMerge.Project.File\DefaultIcon; ValueType: String; ValueData: """{app}\{code:ExeName}"",1"; Flags: uninsdeletekey
552
553 ; delete obsolete values
554 ;In Inno Setup Version 4.18 ValueData couldn't be null and compile,
555 ;if this is fixed in a later version feel free to remove the parameter
556 Root: HKCU; Subkey: Software\Thingamahoochie\WinMerge\Settings; ValueType: none; ValueName: LeftMax; Flags: deletevalue
557 Root: HKCU; Subkey: Software\Thingamahoochie\WinMerge\Settings; ValueType: none; ValueName: DirViewMax; Flags: deletevalue
558
559 ;This removes the key that remembers which messageboxes to hide from the user, this is because the text of that message
560 ;can change and make it more clear as to the user why they might want to pay attention to a particular dialog and also
561 ;because a particular message might be added or removed and a new message might occupy a previous message's ID number
562 Root: HKLM; Subkey: Software\Thingamahoochie\WinMerge\MessageBoxes; ValueType: none; Flags: deletekey
563
564 Root: HKCR; SubKey: Directory\Shell\WinMerge\command; ValueType: none; Flags: deletekey noerror
565 Root: HKCR; SubKey: Directory\Shell\WinMerge; ValueType: none; Flags: deletekey noerror
566
567 ;Adds "Start Menu" --> "Run" Support for WinMerge
568 Root: HKLM; Subkey: Software\Microsoft\Windows\CurrentVersion\App Paths\WinMerge.exe; ValueType: none; Flags: uninsdeletekey
569 Root: HKLM; Subkey: Software\Microsoft\Windows\CurrentVersion\App Paths\WinMergeU.exe; ValueType: none; Flags: uninsdeletekey
570 Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinMerge.exe; ValueType: string; ValueName: ; ValueData: {app}\{code:ExeName}
571 Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinMergeU.exe; ValueType: string; ValueName: ; ValueData: {app}\{code:ExeName}
572
573 ;Registry Keys for use by ShellExtension.dll
574 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge; ValueType: string; ValueName: Executable; ValueData: {app}\{code:ExeName}
575
576 ;Enables or disables the Context Menu preference based on what the user selects during install
577 ;Initially the Context menu is explicitly disabled:
578 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge; ValueType: dword; ValueName: ContextMenuEnabled; ValueData: 0;
579
580 ;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.
581 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge; ValueType: dword; ValueName: ContextMenuEnabled; ValueData: 1; Tasks: ShellExtension
582 Root: HKCU; SubKey: Software\Thingamahoochie\WinMerge; ValueType: dword; ValueName: ContextMenuEnabled; ValueData: {code:ShellMenuEnabled}
583
584 ;If WinMerge.exe is installed then we'll automatically configure WinMerge as the differencing application
585 Root: HKCU; SubKey: Software\TortoiseCVS; ValueType: string; ValueName: External Diff Application; ValueData: {app}\{code:ExeName}; Flags: uninsdeletevalue; Tasks: TortoiseCVS
586 Root: HKCU; SubKey: Software\TortoiseCVS; ValueType: dword; ValueName: DiffAsUnicode; ValueData: $00000001; Flags: uninsdeletevalue; Tasks: TortoiseCVS
587 Root: HKCU; SubKey: Software\TortoiseCVS\Prefs\External Diff Application; ValueType: string; ValueName: _; ValueData: {app}\{code:ExeName}; Flags: uninsdeletevalue dontcreatekey; Tasks: TortoiseCVS
588 Root: HKCU; SubKey: Software\TortoiseCVS\Prefs\External Diff2 Params; ValueType: string; ValueName: _; ValueData: """%1"" ""%2"""; Flags: uninsdeletevalue dontcreatekey; Tasks: TortoiseCVS
589
590 ;Tells TortoiseCVS to use WinMerge as its differencing application (this happens whether or not Tortoise is current installed, that way
591 ;if it is installed at a later date this will automatically support it)
592 Root: HKCU; SubKey: Software\TortoiseCVS; ValueType: string; ValueName: External Merge Application; ValueData: {app}\{code:ExeName}; Flags: uninsdeletevalue; Tasks: TortoiseCVS
593 Root: HKCU; SubKey: Software\TortoiseCVS; ValueType: dword; ValueName: MergeAsUnicode; ValueData: $00000001; Flags: uninsdeletevalue; Tasks: TortoiseCVS
594 Root: HKCU; SubKey: Software\TortoiseCVS\Prefs\External Merge Application; ValueType: string; ValueName: _; ValueData: {app}\{code:ExeName}; Flags: uninsdeletevalue dontcreatekey; Tasks: TortoiseCVS
595 Root: HKCU; SubKey: Software\TortoiseCVS\Prefs\External Merge2 Params; ValueType: string; ValueName: _; ValueData: """%mine"" ""%yours"""; Flags: uninsdeletevalue dontcreatekey; Tasks: TortoiseCVS
596
597 ;Set WinMerge as TortoiseSVN diff tool
598 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
599
600 ;Whatever the user chooses at the [Select Setup Language] dialog should also determine what language WinMerge will start up in
601 ;(unless the user already has a startup language specified)
602 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000402; Flags: deletevalue; Languages: Bulgarian
603 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000403; Flags: deletevalue; Languages: Catalan
604 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000804; Flags: deletevalue; Languages: Chinese_Simplified
605 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000404; Flags: deletevalue; Languages: Chinese_Traditional
606 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $0000041a; Flags: deletevalue; Languages: Croatian
607 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000405; Flags: deletevalue; Languages: Czech
608 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000406; Flags: deletevalue; Languages: Danish
609 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000413; Flags: deletevalue; Languages: Dutch
610 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000409; Flags: deletevalue; Languages: English
611 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $0000040c; Flags: deletevalue; Languages: French
612 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000407; Flags: deletevalue; Languages: German
613 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000408; Flags: deletevalue; Languages: Greek
614 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000410; Flags: deletevalue; Languages: Italian
615 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000411; Flags: deletevalue; Languages: Japanese
616 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000412; Flags: deletevalue; Languages: Korean
617 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000414; Flags: deletevalue; Languages: Norwegian
618 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000429; Flags: deletevalue; Languages: Persian
619 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000415; Flags: deletevalue; Languages: Polish
620 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000816; Flags: deletevalue; Languages: Portuguese
621 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000416; Flags: deletevalue; Languages: PortugueseBrazilian
622 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000418; Flags: deletevalue; Languages: Romanian
623 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000419; Flags: deletevalue; Languages: Russian
624 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000c1a; Flags: deletevalue; Languages: Serbian
625 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $0000041b; Flags: deletevalue; Languages: Slovak
626 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000c0a; Flags: deletevalue; Languages: Spanish
627 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $0000041D; Flags: deletevalue; Languages: Swedish
628 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $0000041f; Flags: deletevalue; Languages: Turkish
629 Root: HKLM; SubKey: Software\Thingamahoochie\WinMerge\Locale; ValueType: dword; ValueName: LanguageId; ValueData: $00000422; Flags: deletevalue; Languages: Ukrainian
630
631
632 [Run]
633 ;This will no longer appear unless the user chose to make a start menu group in the first place
634 Filename: {win}\Explorer.exe; Description: {cm:ViewStartMenuFolder}; Parameters: """{group}"""; Flags: waituntilidle postinstall skipifsilent unchecked; Check: GroupCreated
635
636 Filename: {app}\{code:ExeName}; Description: {cm:LaunchProgram, WinMerge}; Flags: nowait postinstall skipifsilent runmaximized
637
638
639 [UninstallDelete]
640 ;Remove 7-zip integration dlls possibly installed (by hand or using separate installer)
641 Name: {app}\Merge7z*.dll; Type: files
642 Name: {app}\7zip_pad.xml; Type: files
643 Name: {app}\Codecs; Type: filesandordirs
644 Name: {app}\Formats; Type: filesandordirs
645 Name: {app}\Lang; Type: filesandordirs
646
647 Name: {group}; Type: dirifempty
648 Name: {app}; Type: dirifempty
649
650
651 [Code]
652 Var
653     {Stores the version of 7-Zip Installed}
654     int7Zip_Version: Integer;
655
656     {Determines two things whether or not ComCtrl is needed and whether or not we've already checked}
657     intComCtlNeeded: Integer;
658
659 {Determines whether or not the user chose to create a start menu}
660 Function GroupCreated(): boolean;
661 Var
662     {Stores the path of the start menu group Inno Setup may have created}
663     strGroup_Path: string;
664 Begin
665     {Saves the path that Inno Setup intended to create the start menu group at}
666     strGroup_Path := ExpandConstant('{group}');
667
668     {If the start menu path isn't blank then..}
669     if strGroup_Path <> '' Then
670         Begin
671             {If the user choose to create the start menu then this folder will exist.
672             If the folder exists then GroupCreated = True otherwise it does not.}
673             Result := DirExists(strGroup_Path)
674         end
675     else
676         {Since the start menu path is null, we know that the user chose not to create a
677         start menu group (note in Inno Setup 4.18 this didn't yet work, but I'm sure it will in the future}
678         Result := False;
679
680      {Debug
681
682     If DirExists(strGroup_Path) = True Then
683         Msgbox('The group "' + ExpandConstant('group') + '" was found', mbInformation, mb_ok)
684     Else
685         Msgbox('The group "' + ExpandConstant('group') + '" doesn''t exist.', mbInformation, mb_ok); }
686 End;
687
688
689 {Returns the appropriate name of the .EXE being installed}
690 Function ExeName(Unused: string): string;
691 Begin
692
693   If UsingWinNT() = True Then
694          Result := 'WinMergeU.exe'
695   Else
696     Result := 'WinMerge.exe';
697 End;
698
699 Function FixVersion(strInput: string): string;
700 {Returns a version with four segments A.B.C.D}
701 Var
702   {Stores the number of periods found within the version string}
703   intPeriods: integer;
704
705   {Creates a counter}
706   i: integer;
707
708   {Generates the string to be returned to the user}
709   strVersion: string;
710 Begin
711
712   {Creates a copy of the input string before we tear it apart}
713   strVersion := strInput;
714
715   {Until strInput is empty do..}
716   While Length(strInput) > 0 do
717     Begin
718       {if the first character of the input string is a period then}
719       If Copy(strInput, 1, 1) = '.' Then
720
721         {Incriment the number of periods found}
722         intPeriods := intPeriods + 1;
723
724       {Remove the first character from the Input string}
725       strInput := Copy(strINput, 2, length(strINput));
726     End;
727
728   {For every period shy of 3 do..}
729   For i := 1 to 3 - intperiods do
730
731     {Add a '.0' to the version string}
732     strVersion := strVersion + '.0';
733
734   {Returns the Version string with the correct number of segments}
735   Result := strVersion;
736
737 End;
738
739 Function RemoveLeadingZeros(strInput: string): string;
740 {Removes the leading zeros if any from a numeric string}
741 Begin
742
743   {While the first character of the string is a zero}
744   While Copy(strInput, 1, 1) = '0' Do
745     begin
746
747     {Removes one leading zero from the input string}
748       strInput := Copy(strInput, 2, Length(strINput));
749     end;
750
751   {Returns the formatted string}
752   Result := strInput;
753
754 End;
755
756
757 {Returns whether or not the version string detected is meets the version number requirement}
758 Function VersionAtLeast(strVersion_Installed: string; intMajor: integer; intMinor: integer; intRevision: integer; intBuild: integer): boolean;
759 Var
760
761   {Stores the Major of the Version installed (X.0.0.0)}
762   intMajor_Installed: Integer;
763
764   {Stores the Minor of the Version installed (1.X.0.0)}
765   intMinor_Installed: Integer;
766
767   {Stores the Revision of the Version installed (1.0.X.0)}
768   intRevision_Installed: Integer;
769
770   {Stores the Revision of the Version installed (1.0.0.X)}
771   intBuild_Installed: Integer;
772
773   {Stores the last valid character of a particular segment (Major, Minor, Revision) of the Version string}
774   intEnd_Pos: Integer;
775
776 begin
777   {Debug
778   Msgbox('The version installed is ' + strVersion_Installed + ' and the required version is ' + IntToStr(intMajor) + '.' + IntToStr(intMinor) + '.' + IntToStr(intRevision) + '.' + IntToStr(intBuild), mbINformation, mb_OK)
779         }
780
781   {Makes sure the version string contains four numberic segments 5.2 ---> 5.2.0.0}
782   strVersion_Installed := FixVersion(strVersion_Installed);
783
784   {If the version number is empty then quit the function}
785   if strVersion_Installed = '' Then
786     begin
787       Result := False;
788
789       {Stops analyzing the version installed and returns that the version installed was inadequate}
790       exit;
791     end;
792
793   {Starts detecting the Major value of the Version Installed}
794
795   {Sets the end position equal to one character before the first period in the version number}
796   intEnd_Pos := Pos('.', strVersion_Installed) -1
797
798   {Sets the major version equal to all character before the first period }
799   intMajor_installed := StrToIntDef(RemoveLeadingZeros(Copy(strVersion_Installed, 1, intEnd_Pos)), 0);
800
801   {Debug
802   msgbox('The Major version installed is ' + IntToStr(intMajor_installed) + ' and the required Major is ' + IntToStr(intMajor) + '.', mbInformation, MB_OK)
803         }
804
805   {If the Major Version Installed is greater than the required value then...}
806   if intMajor_Installed > intMajor Then
807     begin
808       {Returns that the version number was adequate, since it actually exceeded the requirement}
809       Result := True;
810
811         {Debug
812         msgbox(IntToStr(intMajor_installed) + ' > ' +  IntToStr(intMajor), mbInformation, MB_OK)
813         }
814
815       {Stops analyzing the version number since we already know it met the requirement}
816       exit;
817     end;
818
819   {If the Major version installed is less than the requirement then...}
820   If intMajor_Installed < intMajor Then
821     begin
822       {Debug
823        msgbox(IntToStr(intMajor_installed) + ' < ' +  IntToStr(intMajor), mbInformation, MB_OK)
824        }
825
826       Result := False;
827
828       {Stops analyzing the version number since we already know it's inadequate and returns False (inadequate)}
829       exit;
830     end;
831
832
833   {Starts detecting the Minor version of the Version Installed}
834
835   {Modifies strVersion_Installed removing the first period and everything prior to it (Removes the Major Version)}
836   strVersion_Installed := Copy(strVersion_Installed, intEnd_Pos + 2, Length(strVersion_Installed));
837
838   {Sets the end position equal to one character before the first period in the version number}
839   intEnd_Pos := Pos('.', strVersion_Installed) -1
840
841   {Sets the Minor version equal to all character before the first period }
842         intMinor_installed := StrToIntDef(RemoveLeadingZeros(Copy(strVersion_Installed, 1, intEnd_Pos)), 0)
843
844         {Debug
845   msgbox('The Minor version installed is ' + IntToStr(intMinor_installed) + ' and the required Minor is ' + IntToStr(intMinor) + '.', mbInformation, MB_OK)
846         }
847
848         {If the Minor Version Installed is greater than the required value then...}
849         If intMinor_Installed > intMinor Then
850     begin
851       {Returns that the version number was adequate}
852       Result := True;
853
854       {Stops further analyzation of the version number}
855       exit
856     end;
857
858   {If the minor installed is less than what was required}
859   If intMinor_Installed < intMinor Then
860     Begin
861       Result := False;
862
863       {Returns that the version installed did not meet the required value and stops analyzing the version number}
864       exit;
865     end;
866
867
868   {Starts Detecting the Revision of the Version Installed}
869
870         {Modifies strVersion_Installed removing the first period and everything prior to it (Removes the Minor Version)}
871         strVersion_Installed := Copy(strVersion_Installed, intEnd_Pos + 2, Length(strVersion_Installed));
872
873         {Sets the last character of the Revision to last character before the first period}
874         intEnd_Pos := Pos('.', strVersion_Installed) -1
875
876         {Sets the Revision Installed equal to everything before the first period}
877         intRevision_Installed := strToIntDef(RemoveLeadingZeros(Copy(strVersion_Installed, 1, intEnd_Pos)), 0);
878
879         {Debug
880   msgbox('The Revision version installed is ' + IntToStr(intRevision_installed) + ' and the required Revision is ' + IntToStr(intRevision) + '.', mbInformation, MB_OK)
881         }
882
883         {If the Revision Installed is greater than the required value then...}
884   If intRevision_Installed > intRevision Then
885     begin
886       {Return that the version installed was adequate}
887       Result := True;
888
889       {Stops further analyzation of the version number}
890       exit
891     end;
892
893   {If the revision installed did not meet the requirement then...}
894   If intRevision_Installed < intRevision Then
895     begin
896       Result := False;
897
898     {Return that the version number failed to meet the requirement and stops further analyzation of the version number}
899       exit;
900     end;
901
902   {Start Detection the Build Installed}
903
904         {Modifies strVersion_Installed removing the first period and everything prior to it (Removes the Revision) leaving behind only the build number}
905         strVersion_Installed := Copy(strVersion_Installed, intEnd_Pos + 2, Length(strVersion_Installed));
906
907         {Set the build installed = to what's left of the strVersion_Installed text}
908         intBuild_installed := strToIntDef(RemoveLeadingZeros(strVersion_Installed), 0);
909
910         {Debug
911   msgbox('The Build version installed is ' + IntToStr(intBuild_installed) + ' and the required Build is ' + IntToStr(intBuild) + '.', mbInformation, MB_OK)
912         }
913
914         {If the build installed is greater than or equal to the requirement then...}
915         if intBuild_installed >= intBuild Then
916
917          {Report that the version installed was adequate}
918     Result := True
919   else
920
921     {Reports the inadequacy of the version installed and seases processing }
922     Result := False;
923 end;
924
925 {Returns whether or not the version of particular file is at least equal to requested value}
926 Function FileVersionAtLeast(strFile_Path: string; intMajor: integer; intMinor: integer; intRevision: integer; intBuild: integer): boolean;
927   Var
928   {Stores the version of the file to be compared}
929   strVersion: string;
930 Begin
931   {Gets the version number of the specified file}
932   GetVersionNumbersString(strFile_Path, strVersion)
933
934   {File Version at least is the result of the VersionAtLeast Determination}
935   Result := VersionAtLeast(strVersion, intMajor, intMinor, intRevision, intBuild);
936
937
938   {Debug: If you'd like to debug with a messagebox then un rem this
939         If Result = True then
940
941          Msgbox('The version of ' + strFile_path + ' required is "' + IntToStr(intMajor) + '.' + IntToStr(intMinor) + '.' + IntToStr(intRevision) + '.' + IntToStr(intBuild) + '". The version found was "'  + strVersion + '.  The version detected met the required value.', mbInformation, MB_OK)
942         else
943          Msgbox('The version of ' + strFile_path + ' required is "' + IntToStr(intMajor) + '.' + IntToStr(intMinor) + '.' + IntToStr(intRevision) + '.' + IntToStr(intBuild) + '". The version found was "' + strVersion + '.  The version detected did not meet the required value.', mbInformation, MB_OK);
944     }
945 end;
946
947 function Install7ZipDll(strDLL_Version: string): Boolean;
948 Var
949     {Stores the file path of the 7-Zip File Manager Program}
950     str7Zip_Path: String;
951
952     {Stores the version of 7-Zip Installed}
953     str7Zip_Version: String;
954
955     {Stores the DLL's Version Function Input Parameter in integer format}
956     intDLL_Version: Integer;
957 Begin
958
959     {If the actual version of 7-Zip Installed hasn't been determined yet then...}
960     If int7Zip_Version = 0 Then
961         Begin
962                {Detects the install location of 7-Zip from the registry, if it's installed}
963                RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\7zFM.exe', '', str7Zip_Path)
964
965                 {If there is 7-Zip information in the registry then...}
966                         If length(str7Zip_Path) > 0 Then
967                                 begin
968                                         {If the 7zFM.exe file exists then...}
969                                         If FileExists(str7Zip_Path) = True Then
970                                                 Begin
971                                                         {Detects the version of the 7-Zip Installed}
972                                                         GetVersionNumbersString(str7Zip_Path, str7Zip_Version)
973                                                         {If the version of 7-Zip Installed is at least 3.11 Then...}
974                                                         If VersionAtLeast(str7Zip_Version, 3, 11, 0, 0) = True Then
975                                                                 begin
976                                                                         {If the user has 3.12 or higher installed then...}
977                                                                         If VersionAtLeast(str7Zip_Version, 3, 12, 0, 0) = True Then
978                                                                                 Begin
979                                                                                         {If the user has 3.13 or higher installed then...}
980                                                                                         If VersionAtLeast(str7Zip_Version, 3, 13, 0, 0) = True Then
981                                                                                                 Begin
982                                                                                                         {If the user has 4.20 or higher installed then...}
983                                                                                                         If VersionAtLeast(str7Zip_Version, 4, 20, 0, 0) = True Then
984                                                                                                                 Begin
985                                                                                                                         {If the user has 4.23 or higher installed then...}
986                                                                                                                         If VersionAtLeast(str7Zip_Version, 4, 23, 0, 0) = True Then
987                                                                                                                                 Begin
988                                                                                                                                         {If the user has 4.31 or higher installed then...}
989                                                                                                                                                 If VersionAtLeast(str7Zip_Version, 4, 31, 0, 0) = True Then                             
990                                                                                                                                                 Begin
991                                                                                                                                                         {If the user has 4.32 or higher installed then...}
992                                                                                                                                                         If VersionAtLeast(str7Zip_Version, 4, 32, 0, 0) = True Then
993                                                                                                                                                                 Begin
994                                                                                                                                                                         {If the user has 4.32 or higher installed then...}
995                                                                                                                                                                         If VersionAtLeast(str7Zip_Version, 4, 42, 0, 0) = True Then
996                                                                                                                                                                                 Begin
997                                                                                                                                                                                         {If the user has 4.57 or higher installed then...}
998                                                                                                                                                                                         If VersionAtLeast(str7Zip_Version, 4, 57, 0, 0) = True Then
999                                                                                                                                                                                                 Begin
1000                                                                                                                                                                                                         {If the user has 465 or higher installed then...}
1001                                                                                                                                                                                                         If VersionAtLeast(str7Zip_Version, 4, 65, 0, 0) = True Then
1002                                                                                                                                                                                                 {We record the version of 7-Zip installed as 4.42 regardless of whether or not it's actually 4.21, 4.22, etc..}
1003                                                                                                                                                                                                                 int7Zip_Version := 465
1004                                                                                                                                                                                                         Else
1005                                                                                                                                                                                                 int7Zip_Version := 457
1006                                                                                                                                                                                                 end
1007                                                                                                                                                                                         Else
1008                                                                                                                                                                                                 {Since it was at least 4.42, but not 4.57 then it must be 4.42}
1009                                                                                                                                                                                                 int7Zip_Version := 442
1010                                                                                                                                                                                 end
1011                                                                                                                                                                         Else
1012                                                                                                                                                                                 {Since it was at least 4.32, but not 4.42 then it must be 4.32}
1013                                                                                                                                                                                 int7Zip_Version := 432
1014                                                                                                                                                                 end
1015                                                                                                                                                         Else
1016                                                                                                                                                                 {Since it was at least 4.31, but not 4.32 then it must be 4.31}
1017                                                                                                                                                                 int7Zip_Version := 431
1018                                                                                                                                                 end
1019                                                                                                                                         Else
1020                                                                                                                                                 {Since it was at least 4.23, but not 4.31 then it must be 4.23}
1021                                                                                                                                                 int7Zip_Version := 423
1022                                                                                                                                 end
1023                                                                                                                         Else
1024                                                                                                                                 {Since it was at least 4.20, but not 4.23 then it must be 4.20}
1025                                                                                                                                 int7Zip_Version := 420
1026                                                                                                                 end
1027                                                                                                         Else
1028                                                                                                                 {Since it was at least 3.13, but not 4.20 then it must be 3.13}
1029                                                                                                                 int7Zip_Version := 313
1030                                                                                                 end
1031                                                                                         Else
1032                                                                                                 {Since it was at least 3.12, but not 3.13 then it must be 3.12}
1033                                                                                                 int7Zip_Version := 312;
1034                                                                                 end
1035                                                                         Else
1036                                                                                 {Since it was at least 3.11, but not 3.12 then it must be 3.11}
1037                                                                                 int7Zip_Version := 311;
1038                                                                 end;
1039                                                 End
1040                                         Else
1041                                                 {Records that the 7-Zip program didn't exist for the rest of the installation}
1042                                                 int7Zip_Version := -1;
1043                                 end
1044                         Else
1045                                 {Records that the 7-Zip program wasn't installed for rest of the installation}
1046                                 int7Zip_Version := -1;
1047             end;
1048
1049     {Converts the DLL Version String to an Integer for numeric evaluation}
1050     intDLL_Version := StrToInt(strDLL_Version);
1051
1052         {If 7-Zip either wasn't installed or was of inadequate version then...}
1053         If int7Zip_Version = -1 Then
1054                 Begin
1055                         {If the program is trying to determine if the 313 DLL should be installed then the answer is yes
1056                         we install this, because it's the most recent version and if they were to install 7-zip this
1057                         would be the version they'd want (since people generally install the latest and greatest)}
1058                         if intDLL_Version = 313 Then
1059                                 Result := True
1060
1061                         {If the program is trying to install anything, but 313 on a system without 7-Zip
1062                         then we disallow the installation of that DLL}
1063                         else
1064                                 Result := False;
1065                 End
1066
1067         {If the version of 7-Zip was sufficient then...}
1068         Else
1069                 Begin
1070                         {if the version the program is trying to install matches the version installed on the clients system then...}
1071                         If int7Zip_Version = intDLL_Version Then
1072                                 Result := True
1073
1074                         {If the program is trying to install the 31X DLL on a 31Y system then we won't allow the file to be copied...}
1075             else
1076                                 Result := False;
1077                 End;
1078
1079     {Debug:
1080     If UsingWinNT = True Then
1081         begin
1082             If Result = True Then
1083                 Msgbox('We''re are installing Merge7z' + strDLL_Version + 'U.DLL because the system has 7-Zip ' + IntToStr(int7Zip_Version) + ' installed.', mbInformation, mb_Ok)
1084             Else
1085                 Msgbox('We''re aren''t installing Merge7z' + strDLL_Version + 'U.DLL because the system has 7-Zip ' + IntToStr(int7Zip_Version) + ' installed.', mbInformation, mb_Ok);
1086         end
1087
1088
1089     Else
1090          begin
1091             If Result = True Then
1092                 Msgbox('We''re are installing Merge7z' + strDLL_Version + '.DLL because the system has 7-Zip ' + IntToStr(int7Zip_Version) + ' installed.', mbInformation, mb_Ok)
1093             Else
1094                 Msgbox('We''re aren''t installing Merge7z' + strDLL_Version + '.DLL because the system has 7-Zip ' + IntToStr(int7Zip_Version) + ' installed.', mbInformation, mb_Ok);
1095         end }
1096
1097 End;
1098
1099
1100 {Determines whether or not TortoiseCVS is installed}
1101 Function TortoiseCVSInstalled(): boolean;
1102 Begin
1103         {This absolutely must remain as \CustomIcons, because our application used to create some TortoiseCVS keys even if the application wasn't installed!}
1104     Result := RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\TortoiseCVS\CustomIcons') or RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\TortoiseCVS\Icons');
1105 End;
1106
1107 {Determines whether or not TortoiseSVN is installed}
1108 Function TortoiseSVNInstalled(): boolean;
1109 Begin
1110     Result := RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\TortoiseSVN') or RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Classes\Directory\Background\shellex\ContextMenuHandlers\TortoiseSVN');
1111 End;
1112
1113 Function OldGroup(): string;
1114 Begin
1115     {Stores where in \All Users\Programs\ our start menu used to be located}
1116      RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\WinMerge_is1', 'Inno Setup: Icon Group', Result)
1117 End;
1118
1119 Procedure DeletePreviousStartMenu();
1120 Var
1121         strOld: string;
1122         strNew: string;
1123         strMessage: string;
1124         strShortcut: string;
1125 Begin
1126     {Detects the previous start menu group's path, if any}
1127     strOld := OldGroup();
1128
1129     {Detects the current start menu group's path, if any (not creating a group is a valid option)}
1130     strNew := ExpandConstant('{group}');
1131
1132     {removes the start menu portion of the path from the group path making it match the format of strOld}
1133     StringChange(strNew, ExpandConstant('{commonprograms}\'), '')
1134
1135     {if the user does have a previous start menu location then..}
1136     If strOld <> '' Then
1137         Begin
1138             {If the current and previous start menu locations are different then...}
1139             If Uppercase(strOld) <> UpperCase(strNew) Then
1140                 Begin
1141                     strMessage := ExpandConstant('{cm:DeletePreviousStartMenu}');
1142                     strMessage := Format(strMessage, [strOld, strNew]);
1143
1144                     {Display a dialog asking the user if they'd like to delete the previous start menu group}
1145                     {If they'd like to delete the previous start menu group then...}
1146                     If Msgbox(strMessage, mbConfirmation, mb_YesNo) = mrYes Then
1147                         Begin
1148                             strOld := ExpandConstant('{commonprograms}\') + strOld;
1149                             {Remove old start menu}
1150                             DelTree(strOld, True, True, True);
1151                         End;
1152                 End;
1153         End;
1154 End;
1155
1156 {This event procedure is queed each time the user changes pages within the installer}
1157 Procedure CurPageChanged(CurPage: integer);
1158 Begin
1159     {if the installer reaches the file copy page then...}
1160     If CurPage = wpInstalling Then
1161             {Delete the previous start menu group if the location has changed since the last install}
1162             DeletePreviousStartMenu;
1163 End;
1164
1165 // Checks if context menu is already enabled for shell extension
1166 // If so, we won't overwrite its existing value in [Registry] section
1167 Function ShellMenuEnabled(Unused: string): string;
1168 Var
1169   ContextMenuEnabled: DWORD;
1170 Begin
1171   ContextMenuEnabled := 0;
1172   RegQueryDWORDValue(HKCU, 'Software\Thingamahoochie\WinMerge', 'ContextMenuEnabled', ContextMenuEnabled);
1173   if IsTaskSelected('ShellExtension') then
1174     Result := inttostr(ContextMenuEnabled or 1)
1175   else
1176     Result := '0';
1177 End;
1178
1179 {Replace one occurrence of OldStr in Str with NewStr}
1180 Function ReplaceSubString(Src: string; OldStr: string; NewStr: string) : string;
1181 Var
1182     OldStrStartAt: Integer;
1183
1184 Begin
1185     OldStrStartAt := Pos(OldStr, Src);
1186     if OldStrStartAt > 0 then
1187     begin
1188         {Remove old string}
1189         Delete(Src, OldStrStartAt, Length(OldStr));
1190         {Insert new string}
1191         Insert(NewStr, Src, OldStrStartAt);
1192     end;
1193     Result := Src;
1194 End;
1195
1196 {Returns WinMerge installed exeutable file name}
1197 Function WinMergeExeName(): string;
1198 Var
1199         Unused: String;
1200
1201 Begin
1202     Result := ExpandConstant('{app}\') + ExeName(Unused);
1203 End;
1204
1205 {Returns ClearCase external tools configuration file name}
1206 Function ClearCaseMapFile(): string;
1207 Begin
1208     if not RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Rational Software\', 'RSINSTALLDIR', Result) then
1209     begin
1210         Result := {pf} + '\Rational\';
1211     end;
1212     Result := Result + 'ClearCase\lib\mgrs\map';
1213 End;
1214
1215 {Determines whether or not Rational ClearCase is installed}
1216 Function ClearCaseInstalled(): boolean;
1217 Begin
1218     Result := FileExists(ClearCaseMapFile());
1219 End;
1220
1221 {Intergrate WinMerge as ClearCase external diff tool}
1222 Procedure IntegrateClearCase(OldExe: String; NewExe: String);
1223 Var
1224     MapFile: TStringList;
1225     FileName: String;
1226     I: Integer;
1227     BakFile: String;
1228
1229 Begin
1230     FileName := ClearCaseMapFile();
1231     {Create a backup file of the original file first time it gets modified}
1232     BakFile := FileName + '.original';
1233     if not FileExists(BakFile) then
1234     begin
1235         FileCopy(FileName, BakFile, True);
1236     end;
1237     MapFile := TStringList.Create();
1238     {Read the entire map file to a string list}
1239     MapFile.LoadFromFile(FileName);
1240     if MapFile.Count > 0 then
1241     begin
1242         for I := 0 to MapFile.Count do
1243         begin
1244             {Search for the 'text_file_delta xcompare ...' line}
1245                         if (MapFile.Strings[I][1] <> ';') and (Pos('text_file_delta', MapFile.Strings[I]) > 0) and (Pos('xcompare', MapFile.Strings[I]) > 0) then
1246                         begin
1247                                 {Replace old executable name with a new executable name}
1248                                 MapFile.Strings[I] := ReplaceSubString(MapFile.Strings[I], OldExe, NewExe);
1249                             break;
1250                         end;
1251                 end;
1252                 { Save the modified file. }
1253                 MapFile.SaveToFile(FileName);
1254         end;
1255 End;
1256
1257 // Add WinMerge to system path.
1258 // This requires certain order of things to work:
1259 // #1 ModPathDir function must be first (it gets called by others)
1260 // #2 include of modpath.iss so modpath code gets included
1261 // #3 CurStepChanged and CurUninstallStepChanged procedures as they call
1262 //    ModPath (in modpath.iss)
1263 function ModPathDir(): TArrayOfString;
1264 var
1265     Dir:        TArrayOfString;
1266 begin
1267     setArrayLength(Dir, 1)
1268         Dir[0] := ExpandConstant('{app}');
1269         Result := Dir;
1270 end;
1271
1272 #include "modpath.iss"
1273
1274 procedure CurStepChanged(CurStep: TSetupStep);
1275 Begin
1276     if CurStep = ssPostInstall then
1277     begin
1278                 if IsTaskSelected('modifypath') then
1279                         ModPath();
1280         if IsTaskSelected('ClearCase') then
1281         begin
1282             IntegrateClearCase('..\..\bin\cleardiffmrg.exe', WinMergeExeName());
1283         end;
1284     end;
1285 End;
1286
1287 Procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
1288 var
1289         appdir:                 String;
1290         selectedTasks:  AnsiString;
1291 Begin
1292         appdir := ExpandConstant('{app}')
1293         if CurUninstallStep = usUninstall then begin
1294                 if LoadStringFromFile(appdir + '\uninsTasks.txt', selectedTasks) then
1295                         if Pos('modifypath', selectedTasks) > 0 then
1296                                 ModPath();
1297                 DeleteFile(appdir + '\uninsTasks.txt')
1298         end;
1299
1300     if CurUninstallStep = usPostUninstall then
1301     begin
1302       if ClearCaseInstalled() then
1303         IntegrateClearCase(WinMergeExeName(), '..\..\bin\cleardiffmrg.exe');
1304     end;
1305 End;