Added multi-associations in win (un)installer with the controls on the option page.

This commit is contained in:
Vladimir.Orlov
2014-07-07 17:28:32 +04:00
parent 1c354c5e24
commit e6f257ffd9
2 changed files with 176 additions and 43 deletions
+60 -12
View File
@@ -4,23 +4,71 @@ NumFields=3
[Field 1]
Type=checkbox
Left=5
Right=-1
Right=100
Top=10
Bottom=20
State=0
[Field 2]
Type=checkbox
Left=5
Left=120
Right=-1
Top=25
Bottom=35
State=1
Top=10
Bottom=20
State=0
;[Field 3]
;Type=checkbox
;Left=5
;Right=-1
;Top=40
;Bottom=50
;State=1
[Field 3]
Type=GroupBox
Left=1
Right=-1
Top=35
Bottom=65
Text=Create Associations
[Field 4]
Type=checkbox
Left=5
Right=45
Top=50
Bottom=60
State=0
[Field 5]
Type=checkbox
Left=50
Right=90
Top=50
Bottom=60
State=0
[Field 6]
Type=checkbox
Left=95
Right=135
Top=50
Bottom=60
State=0
[Field 7]
Type=checkbox
Left=140
Right=180
Top=50
Bottom=60
State=0
[Field 8]
Type=checkbox
Left=185
Right=225
Top=50
Bottom=60
State=0
[Field 9]
Type=checkbox
Left=230
Right=270
Top=50
Bottom=60
State=0
+116 -31
View File
@@ -12,6 +12,7 @@
; thus ${PRODUCT_WITH_VER} is used for uninstall registry information
!define PRODUCT_REG_VER "${MUI_PRODUCT}\${VER_BUILD}"
!define INSTALL_OPTION_ELEMENTS 4
Name "${MUI_PRODUCT}"
SetCompressor lzma
; http://nsis.sourceforge.net/Shortcuts_removal_fails_on_Windows_Vista
@@ -25,6 +26,8 @@ RequestExecutionLevel user
!include UAC.nsh
!include "InstallOptions.nsh"
!include StrFunc.nsh
!include LogicLib.nsh
${UnStrStr}
${UnStrLoc}
${UnStrRep}
@@ -97,6 +100,57 @@ Var IS_UPGRADE_60
StrCpy $9 "Modified"
complete:
FunctionEnd
Function ${un}SplitStr
Exch $0 ; str
Push $1 ; inQ
Push $3 ; idx
Push $4 ; tmp
StrCpy $1 0
StrCpy $3 0
loop:
StrCpy $4 $0 1 $3
${If} $4 == '"'
${If} $1 <> 0
StrCpy $0 $0 "" 1
IntOp $3 $3 - 1
${EndIf}
IntOp $1 $1 !
${EndIf}
${If} $4 == '' ; The end?
StrCpy $1 0
StrCpy $4 ','
${EndIf}
${If} $4 == ','
${AndIf} $1 = 0
StrCpy $4 $0 $3
StrCpy $1 $4 "" -1
${IfThen} $1 == '"' ${|} StrCpy $4 $4 -1 ${|}
killspace:
IntOp $3 $3 + 1
StrCpy $0 $0 "" $3
StrCpy $1 $0 1
StrCpy $3 0
StrCmp $1 ',' killspace
Push $0 ; Remaining
Exch 4
Pop $0
StrCmp $4 "" 0 moreleft
Pop $4
Pop $3
Pop $1
Return
moreleft:
Exch $4
Exch 2
Pop $1
Pop $3
Return
${EndIf}
IntOp $3 $3 + 1
Goto loop
FunctionEnd
!macroend
!insertmacro INST_UNINST_SWITCH ""
!insertmacro INST_UNINST_SWITCH "un."
@@ -686,6 +740,23 @@ skip_default_instdir:
FunctionEnd
Function DoAssociation
; back up old value of an association
ReadRegStr $1 HKCR $R4 ""
StrCmp $1 "" skip_backup
StrCmp $1 ${PRODUCT_PATHS_SELECTOR} skip_backup
WriteRegStr HKCR $R4 "backup_val" $1
skip_backup:
WriteRegStr HKCR $R4 "" "${PRODUCT_PATHS_SELECTOR}"
ReadRegStr $0 HKCR ${PRODUCT_PATHS_SELECTOR} ""
StrCmp $0 "" 0 command_exists
WriteRegStr HKCR ${PRODUCT_PATHS_SELECTOR} "" "${PRODUCT_FULL_NAME}"
WriteRegStr HKCR "${PRODUCT_PATHS_SELECTOR}\shell" "" "open"
WriteRegStr HKCR "${PRODUCT_PATHS_SELECTOR}\DefaultIcon" "" "$INSTDIR\bin\${PRODUCT_EXE_FILE},0"
command_exists:
WriteRegStr HKCR "${PRODUCT_PATHS_SELECTOR}\shell\open\command" "" \
'$INSTDIR\bin\${PRODUCT_EXE_FILE} "%1"'
FunctionEnd
;------------------------------------------------------------------------------
; Installer sections
@@ -716,6 +787,20 @@ skip_desktop_shortcut:
${EndIf}
skip_quicklaunch_shortcut:
!insertmacro INSTALLOPTIONS_READ $R1 "Desktop.ini" "Settings" "NumFields"
IntCmp $R1 ${INSTALL_OPTION_ELEMENTS} do_association done do_association
do_association:
StrCpy $R2 ${INSTALL_OPTION_ELEMENTS}
get_user_choice:
!insertmacro INSTALLOPTIONS_READ $R3 "Desktop.ini" "Field $R2" "State"
StrCmp $R3 1 "" next_association
!insertmacro INSTALLOPTIONS_READ $R4 "Desktop.ini" "Field $R2" "Text"
call DoAssociation
next_association:
IntOp $R2 $R2 + 1
IntCmp $R1 $R2 get_user_choice done get_user_choice
done:
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
; $STARTMENU_FOLDER stores name of IDEA folder in Start Menu,
; save it name in the "MenuFolder" RegValue
@@ -754,27 +839,6 @@ skip_quicklaunch_shortcut:
skip_ipr:
StrCmp "${ASSOCIATION}" "NoAssociation" skip_association
; back up old value of an association
ReadRegStr $1 HKCR ${ASSOCIATION} ""
StrCmp $1 "" skip_backup
StrCmp $1 ${PRODUCT_PATHS_SELECTOR} skip_backup
WriteRegStr HKCR ${ASSOCIATION} "backup_val" $1
skip_backup:
WriteRegStr HKCR ${ASSOCIATION} "" "${PRODUCT_PATHS_SELECTOR}"
ReadRegStr $0 HKCR ${PRODUCT_PATHS_SELECTOR} ""
StrCmp $0 "" 0 command_exists
WriteRegStr HKCR ${PRODUCT_PATHS_SELECTOR} "" "${PRODUCT_FULL_NAME}"
WriteRegStr HKCR "${PRODUCT_PATHS_SELECTOR}\shell" "" "open"
WriteRegStr HKCR "${PRODUCT_PATHS_SELECTOR}\DefaultIcon" "" "$INSTDIR\bin\${PRODUCT_EXE_FILE},0"
command_exists:
WriteRegStr HKCR "${PRODUCT_PATHS_SELECTOR}\shell\open\command" "" \
'$INSTDIR\bin\${PRODUCT_EXE_FILE} "%1"'
skip_association:
; Rest of script
; readonly section
SectionIn RO
!include "idea_win.nsh"
@@ -842,13 +906,28 @@ Function ConfirmDesktopShortcut
!insertmacro MUI_HEADER_TEXT "$(installation_options)" "$(installation_options_prompt)"
!insertmacro INSTALLOPTIONS_WRITE "Desktop.ini" "Field 1" "Text" "$(create_desktop_shortcut)"
call winVersion
${If} $0 == "1"
;do not ask user about creating quick launch under Windows 7
!insertmacro INSTALLOPTIONS_WRITE "Desktop.ini" "Settings" "NumFields" "1"
${Else}
!insertmacro INSTALLOPTIONS_WRITE "Desktop.ini" "Field 2" "Text" "$(create_quick_launch_shortcut)"
${EndIf}
; !insertmacro INSTALLOPTIONS_WRITE "Desktop.ini" "Field 3" "Text" "$(install_for_current_user_only)"
!insertmacro INSTALLOPTIONS_WRITE "Desktop.ini" "Field 2" "Text" "$(create_quick_launch_shortcut)"
${If} $0 == "1"
!insertmacro INSTALLOPTIONS_WRITE "Desktop.ini" "Field 2" "Flags" "DISABLED"
${EndIf}
StrCmp "${ASSOCIATION}" "NoAssociation" skip_association
StrCpy $R0 3
push "${ASSOCIATION}"
loop:
call SplitStr
Pop $0
StrCmp $0 "" done
IntOp $R0 $R0 + 1
!insertmacro INSTALLOPTIONS_WRITE "Desktop.ini" "Field $R0" "Text" "$0"
goto loop
skip_association:
StrCpy $R0 2
call winVersion
${If} $0 == "1"
IntOp $R0 $R0 - 1
${EndIf}
done:
!insertmacro INSTALLOPTIONS_WRITE "Desktop.ini" "Settings" "NumFields" "$R0"
!insertmacro INSTALLOPTIONS_DISPLAY "Desktop.ini"
FunctionEnd
@@ -931,11 +1010,13 @@ Function un.ReturnBackupRegValue
;replace Default str with the backup value (if there is the one) and then delete backup
; $1 - key (for example ".java")
; $2 - name (for example "backup_val")
Push $0
ReadRegStr $0 HKCR $1 $2
StrCmp $0 "" "noBackup"
WriteRegStr HKCR $1 "" $0
DeleteRegValue HKCR $1 $2
noBackup:
Pop $0
FunctionEnd
Function un.OMDeleteRegKeyIfEmpty
@@ -1140,12 +1221,16 @@ clear_Registry:
Call un.OMDeleteRegValue
StrCmp "${ASSOCIATION}" "NoAssociation" finish_uninstall
StrCpy $1 "${ASSOCIATION}"
push "${ASSOCIATION}"
loop:
call un.SplitStr
Pop $0
StrCmp $0 "" finish_uninstall
StrCpy $1 $0
StrCpy $2 "backup_val"
Call un.ReturnBackupRegValue
goto loop
finish_uninstall:
StrCpy $1 "$5\${PRODUCT_REG_VER}"
StrCpy $2 "Build"
Call un.OMDeleteRegValue