239 lines
6.9 KiB
Plaintext
239 lines
6.9 KiB
Plaintext
|
[UninstallDelete]
|
||
|
Type: filesandordirs; Name: "{app}\library";
|
||
|
Type: filesandordirs; Name: "{app}\utils";
|
||
|
Type: filesandordirs; Name: "{app}\log";
|
||
|
|
||
|
[Code]
|
||
|
const
|
||
|
ChromeRegKey = 'Software\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe';
|
||
|
IERegKey = 'Software\Microsoft\Windows\CurrentVersion\App Paths\IEXPLORE.EXE';
|
||
|
FFRegKey = 'Software\Microsoft\Windows\CurrentVersion\App Paths\firefox.exe';
|
||
|
var
|
||
|
RVersions: TStringList;
|
||
|
RRegKey: string;
|
||
|
RegPathsFile: string;
|
||
|
SecondLicensePage: TOutputMsgMemoWizardPage;
|
||
|
License2AcceptedRadio: TRadioButton;
|
||
|
License2NotAcceptedRadio: TRadioButton;
|
||
|
|
||
|
// Is R installed?
|
||
|
function RDetected(): boolean;
|
||
|
var
|
||
|
v: Integer;
|
||
|
success: boolean;
|
||
|
begin
|
||
|
success := false;
|
||
|
for v := 0 to (RVersions.Count - 1) do
|
||
|
begin
|
||
|
if RegKeyExists(HKLM, 'Software\R-Core\R\' + RVersions[v]) or RegKeyExists(HKCU, 'Software\R-Core\R\' + RVersions[v]) then
|
||
|
begin
|
||
|
success := true;
|
||
|
RRegKey := 'Software\R-Core\R\' + RVersions[v];
|
||
|
break;
|
||
|
end;
|
||
|
end;
|
||
|
Result := success;
|
||
|
end;
|
||
|
|
||
|
// If R is not detected, it is needed
|
||
|
function RNeeded(): boolean;
|
||
|
begin
|
||
|
Result := not RDetected;
|
||
|
end;
|
||
|
|
||
|
|
||
|
// Is Chrome installed?
|
||
|
function ChromeDetected(): boolean;
|
||
|
var
|
||
|
success: boolean;
|
||
|
begin
|
||
|
success := RegKeyExists(HKLM, ChromeRegKey) or RegKeyExists(HKCU, ChromeRegKey);
|
||
|
begin
|
||
|
Result := success;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
// If Chrome is not detected, it is needed
|
||
|
function ChromeNeeded(): boolean;
|
||
|
begin
|
||
|
Result := not ChromeDetected;
|
||
|
end;
|
||
|
|
||
|
|
||
|
// Registry path update function (adds an extra backslash for json)
|
||
|
function AddBackSlash(Value: string): string;
|
||
|
begin
|
||
|
Result := Value;
|
||
|
StringChangeEx(Result, '\', '\\', True);
|
||
|
end;
|
||
|
|
||
|
|
||
|
// Pandoc is stored in the System PATH
|
||
|
function PandocDetected(): boolean;
|
||
|
var
|
||
|
PandocDir, Path: String;
|
||
|
begin
|
||
|
Log('Checking for Pandoc in %PATH%');
|
||
|
if RegQueryStringValue(HKEY_CURRENT_USER, 'Environment', 'Path', Path) then
|
||
|
begin // Successfully read the value
|
||
|
Log('HKCU\Environment\PATH = ' + Path);
|
||
|
PandocDir := ExpandConstant('{localappdata}\Pandoc\');
|
||
|
Log('Looking for Pandoc in %PATH%: ' + PandocDir + ' in ' + Path);
|
||
|
if Pos(LowerCase(PandocDir), Lowercase(Path)) = 0 then
|
||
|
begin
|
||
|
Log('Did not find Pandoc in %PATH%');
|
||
|
Result := False;
|
||
|
end
|
||
|
else
|
||
|
begin
|
||
|
Log('Found Pandoc in %PATH%');
|
||
|
Result := True;
|
||
|
end
|
||
|
end
|
||
|
else // The key probably doesn't exist
|
||
|
begin
|
||
|
Log('Could not access HKCU\Environment\PATH.');
|
||
|
Result := False;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
// If Pandoc is not detected, it is needed
|
||
|
function PandocNeeded(): boolean;
|
||
|
begin
|
||
|
Result := not PandocDetected;
|
||
|
end;
|
||
|
|
||
|
// Save installation paths
|
||
|
procedure SaveInstallationPaths();
|
||
|
var
|
||
|
RPath, ChromePath, IEPath, FFPath, PandocPath: string;
|
||
|
begin
|
||
|
RPath := '';
|
||
|
ChromePath := '';
|
||
|
IEPath := '';
|
||
|
FFPath := '';
|
||
|
PandocPath := ExpandConstant('{localappdata}\Pandoc\');
|
||
|
RegPathsFile := ExpandConstant('{app}\utils\regpaths.json');
|
||
|
|
||
|
if Length(RRegKey) = 0 then
|
||
|
RDetected;
|
||
|
|
||
|
// Create registry paths file
|
||
|
SaveStringToFile(RegPathsFile, '{' + #13#10, True);
|
||
|
|
||
|
// R RegPath
|
||
|
if RegQueryStringValue(HKLM, RRegKey, 'InstallPath', RPath) or RegQueryStringValue(HKCU, RRegKey, 'InstallPath', RPath) then
|
||
|
SaveStringToFile(RegPathsFile, '"r": "' + AddBackSlash(RPath) + '",' + #13#10, True)
|
||
|
else
|
||
|
SaveStringToFile(RegPathsFile, '"r": "none",' + #13#10, True);
|
||
|
|
||
|
// Chrome RegPath
|
||
|
if RegQueryStringValue(HKLM, ChromeRegKey, 'Path', ChromePath) or RegQueryStringValue(HKCU, ChromeRegKey, 'Path', ChromePath) then
|
||
|
SaveStringToFile(RegPathsFile, '"chrome": "' + AddBackSlash(ChromePath) + '",' + #13#10, True)
|
||
|
else
|
||
|
SaveStringToFile(RegPathsFile, '"chrome": "none",' + #13#10, True);
|
||
|
|
||
|
// Internet Explorer RegPath
|
||
|
if RegQueryStringValue(HKLM, IERegKey, '', IEPath) then
|
||
|
SaveStringToFile(RegPathsFile, '"ie": "' + AddBackSlash(IEPath) + '",' + #13#10, True)
|
||
|
else
|
||
|
SaveStringToFile(RegPathsFile, '"ie": "none",' + #13#10, True);
|
||
|
|
||
|
// Firefox RegPath
|
||
|
if RegQueryStringValue(HKLM, FFRegKey, 'Path', FFPath) then
|
||
|
SaveStringToFile(RegPathsFile, '"ff": "' + AddBackSlash(FFPath) + '",' + #13#10, True)
|
||
|
else
|
||
|
SaveStringToFile(RegPathsFile, '"ff": "none",' + #13#10, True);
|
||
|
|
||
|
// Pandoc RegPath
|
||
|
// ** Last Line in json file (no trailing comma) **
|
||
|
if PandocDetected() then
|
||
|
SaveStringToFile(RegPathsFile, '"pandoc": "' + AddBackSlash(PandocPath) + '"' + #13#10, True)
|
||
|
else
|
||
|
SaveStringToFile(RegPathsFile, '"pandoc": "none"' + #13#10, True);
|
||
|
|
||
|
SaveStringToFile(RegPathsFile, '}', True);
|
||
|
end;
|
||
|
|
||
|
// Pre- and post-installation actions
|
||
|
procedure CurStepChanged(CurStep: TSetupStep);
|
||
|
begin
|
||
|
// Pre-installation actions
|
||
|
if CurStep = ssInstall then
|
||
|
begin
|
||
|
#if IncludeR
|
||
|
#else
|
||
|
// With `CurStep = ssInstall` we can still `Abort` if R not included but needed
|
||
|
if RNeeded then
|
||
|
begin
|
||
|
SuppressibleMsgBox(Format('Error: R >= %s not found',[RVersions[RVersions.Count - 1]]), mbError, MB_OK, MB_OK);
|
||
|
Abort;
|
||
|
end;
|
||
|
#endif
|
||
|
end;
|
||
|
// Post-installation actions
|
||
|
if CurStep = ssPostInstall then
|
||
|
begin
|
||
|
SaveInstallationPaths;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
// Add RInno's license to the installer
|
||
|
procedure CheckLicense2Accepted(Sender: TObject);
|
||
|
begin
|
||
|
{ Update Next button when user (un)accepts the license }
|
||
|
WizardForm.NextButton.Enabled := License2AcceptedRadio.Checked;
|
||
|
end;
|
||
|
|
||
|
function CloneLicenseRadioButton(Source: TRadioButton): TRadioButton;
|
||
|
begin
|
||
|
Result := TRadioButton.Create(WizardForm);
|
||
|
Result.Parent := SecondLicensePage.Surface;
|
||
|
Result.Caption := Source.Caption;
|
||
|
Result.Left := Source.Left;
|
||
|
Result.Top := Source.Top;
|
||
|
Result.Width := Source.Width;
|
||
|
Result.Height := Source.Height;
|
||
|
Result.OnClick := @CheckLicense2Accepted;
|
||
|
end;
|
||
|
|
||
|
procedure CurPageChanged(CurPageID: Integer);
|
||
|
begin
|
||
|
{ Update Next button when user gets to second license page }
|
||
|
if CurPageID = SecondLicensePage.ID then
|
||
|
begin
|
||
|
CheckLicense2Accepted(nil);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure InitializeWizard();
|
||
|
var
|
||
|
LicenseFileName: string;
|
||
|
LicenseFilePath: string;
|
||
|
begin
|
||
|
{ Create second license page, with the same labels as the original license page }
|
||
|
SecondLicensePage :=
|
||
|
CreateOutputMsgMemoPage(
|
||
|
wpLicense, SetupMessage(msgWizardLicense), SetupMessage(msgLicenseLabel),
|
||
|
SetupMessage(msgLicenseLabel3), '');
|
||
|
|
||
|
{ Shrink license box to make space for radio buttons }
|
||
|
SecondLicensePage.RichEditViewer.Height := WizardForm.LicenseMemo.Height;
|
||
|
|
||
|
{ Load license }
|
||
|
{ Loading ex-post, as Lines.LoadFromFile supports UTF-8, }
|
||
|
{ contrary to LoadStringFromFile. }
|
||
|
LicenseFileName := 'LICENSE';
|
||
|
ExtractTemporaryFile(LicenseFileName);
|
||
|
LicenseFilePath := ExpandConstant('{tmp}\' + LicenseFileName);
|
||
|
SecondLicensePage.RichEditViewer.Lines.LoadFromFile(LicenseFilePath);
|
||
|
DeleteFile(LicenseFilePath);
|
||
|
|
||
|
{ Clone accept/do not accept radio buttons for the second license }
|
||
|
License2AcceptedRadio := CloneLicenseRadioButton(WizardForm.LicenseAcceptedRadio);
|
||
|
License2NotAcceptedRadio := CloneLicenseRadioButton(WizardForm.LicenseNotAcceptedRadio);
|
||
|
|
||
|
{ Initially not accepted }
|
||
|
License2NotAcceptedRadio.Checked := True;
|
||
|
|