Blob Blame Raw
;--------------------------------
; Requires files:
;   config.nsh
;   files-install.nsh
;   files-ffmpeg-install.nsh
;   files-examples-install.nsh
;   files-uninstall.nsh

; Defines which will set by 'config.nsh':
;   PK_NAME          - XxxxxXxxxx               - name without spaces 
;   PK_DIR_NAME      - Xxxxx Xxxxx              - dir name, may be with spaces 
;   PK_NAME_FULL     - Xxxxx Xxxxxxxxxx         - full name, may be with spaces
;   PK_ARCH          - XX                       - architecture, 32 or 64
;   PK_VERSION       - X.X                      - first two numbers of version
;   PK_VERSION_FULL  - X.X.X-xxxxx-xxxxx        - full version, without spaces 
;   PK_EXECUTABLE    - xxx\XxxxXxxx-xxx_xxx.exe - subpath to executable file 
;   PK_ICON          - xxx\XxxxXxxx-xxx_xxx.ico - subpath to icon file (may be *.exe)
;   PK_DOCUMENT_ICON - xxx\XxxxXxxx-xxx_xxx.ico - subpath to icon file for associated documents
;   PK_LICENSE       - xxxxxxxx\xxxxxxx-xxx.txt - subpath to license file

!include "config.nsh"

;--------------------------------

!include "MUI2.nsh"

;--------------------------------

; The name of the installer
Name "${PK_NAME_FULL} ${PK_VERSION_FULL}"

; The file to write
OutFile "${PK_NAME}-${PK_VERSION_FULL}.exe"

; The default installation directory and registry
InstallDir "$PROGRAMFILES${PK_ARCH}\${PK_DIR_NAME}"

; Request application privileges for Windows Vista
RequestExecutionLevel admin

!insertmacro MUI_LANGUAGE "English"

!define MUI_ABORTWARNING

!define SHCNE_ASSOCCHANGED 0x8000000
!define SHCNF_IDLIST 0

!define PRODUCT_REG_KEY "Software\${PK_NAME}"
!define PRODUCT_UNINSTALL_KEY  "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PK_NAME}"
!define PRODUCT_UNINSTALL_EXE  "uninstall-${PK_NAME}.exe"

;--------------------------------

; Pages

!insertmacro MUI_PAGE_LICENSE ".\${PK_LICENSE}"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES

;--------------------------------
; Installer
;--------------------------------

Section "${PK_NAME_FULL} (required)"
  SetRegView ${PK_ARCH}

  SectionIn RO

  SetOutPath "$INSTDIR"
  !include "files-install.nsh"
  
  WriteRegStr HKLM "${PRODUCT_REG_KEY}" "Path" "$INSTDIR"
  WriteRegStr HKLM "${PRODUCT_REG_KEY}" "Version" "${PK_VERSION_FULL}"

  ; Write the uninstall keys for Windows
  WriteRegStr HKLM "${PRODUCT_UNINSTALL_KEY}" "DisplayName" "${PK_NAME_FULL}"
  WriteRegStr HKLM "${PRODUCT_UNINSTALL_KEY}" "DisplayVersion" "${PK_VERSION_FULL}"
  WriteRegStr HKLM "${PRODUCT_UNINSTALL_KEY}" "UninstallString" '"$INSTDIR\${PRODUCT_UNINSTALL_EXE}"'
  WriteRegDWORD HKLM "${PRODUCT_UNINSTALL_KEY}" "NoModify" 1
  WriteRegDWORD HKLM "${PRODUCT_UNINSTALL_KEY}" "NoRepair" 1

  WriteRegStr HKCR ".sif" "" "Synfig.Composition"
  WriteRegStr HKCR ".sif" "Content Type" "image/x-sif"
  WriteRegStr HKCR ".sif" "PerceivedType" "image"

  WriteRegStr HKCR ".sifz" "" "Synfig.Composition"
  WriteRegStr HKCR ".sifz" "Content Type" "image/x-sifz"
  WriteRegStr HKCR ".sifz" "PerceivedType" "image"

  WriteRegStr HKCR ".sfg" "" "Synfig.Composition"
  WriteRegStr HKCR ".sfg" "Content Type" "image/x-sfg"
  WriteRegStr HKCR ".sfg" "PerceivedType" "image"
	
  WriteRegStr HKCR "Synfig.Composition" "" "Synfig Composition File"
  WriteRegStr HKCR "Synfig.Composition\DefaultIcon" "" "$INSTDIR\${PK_DOCUMENT_ICON}"
  WriteRegStr HKCR "Synfig.Composition\shell" "" "open"
  WriteRegStr HKCR "Synfig.Composition\shell\open\command" "" '$INSTDIR\${PK_EXECUTABLE} "%1"'

  System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)'

  SetOutPath "$INSTDIR"
  WriteUninstaller "${PRODUCT_UNINSTALL_EXE}"
SectionEnd

; Optional section (can be disabled by the user)
Section "FFMpeg"
  SetOutPath "$INSTDIR"
  !include "files-ffmpeg-install.nsh"
SectionEnd

; Optional section (can be disabled by the user)
Section "Examples"
  SetOutPath "$INSTDIR"
  !include "files-examples-install.nsh"
SectionEnd

; Optional section (can be disabled by the user)
Section "Start Menu Shortcuts"
  SetRegView ${PK_ARCH}

  SetOutPath "$INSTDIR\bin"

  SetShellVarContext All
  CreateDirectory "$SMPROGRAMS\${PK_DIR_NAME} ${PK_ARCH}bit"
  CreateShortCut "$SMPROGRAMS\${PK_DIR_NAME} ${PK_ARCH}bit\Uninstall ${PK_NAME_FULL}.lnk" "$INSTDIR\uninstall-${PK_NAME}.exe" "" "$INSTDIR\uninstall-${PK_NAME}.exe" 0
  CreateShortCut "$SMPROGRAMS\${PK_DIR_NAME} ${PK_ARCH}bit\${PK_NAME_FULL}.lnk" "$INSTDIR\${PK_EXECUTABLE}" "" "$INSTDIR\${PK_ICON}" 0
  CreateShortCut "$SMPROGRAMS\${PK_DIR_NAME} ${PK_ARCH}bit\${PK_NAME_FULL} (Debug Console).lnk" "$INSTDIR\${PK_EXECUTABLE}" "--console" "$INSTDIR\${PK_ICON}" 0
SectionEnd

Section "Desktop Icon"
  SetRegView ${PK_ARCH}

  SetOutPath "$INSTDIR\bin"

  SetShellVarContext All
  CreateShortCut "$DESKTOP\${PK_NAME_FULL}.lnk" "$INSTDIR\${PK_EXECUTABLE}" "" "$INSTDIR\${PK_ICON}" 0
SectionEnd

;--------------------------------
; Uninstaller
;--------------------------------

Section "Uninstall"
  SetRegView ${PK_ARCH}

  ReadRegStr $INSTDIR HKLM "${PRODUCT_REG_KEY}" "Path"

  ; Remove registry keys
  DeleteRegKey HKCR "Synfig.Composition\shell\open\command" 
  DeleteRegKey HKCR "Synfig.Composition\DefaultIcon" 
  DeleteRegKey HKCR "Synfig.Composition\shell"
  DeleteRegKey HKCR "Synfig.Composition" 
  DeleteRegKey HKCR ".sif"
  DeleteRegKey HKCR ".sifz"
  DeleteRegKey HKCR ".sfg"

  DeleteRegKey HKLM "${PRODUCT_REG_KEY}"
  DeleteRegKey HKLM "${PRODUCT_UNINSTALL_KEY}"

  ; Remove files and uninstaller
  !include "files-uninstall.nsh"
  Delete "$INSTDIR\${PRODUCT_UNINSTALL_EXE}"

  ; Remove shortcuts, if any
  SetShellVarContext All
  Delete "$DESKTOP\${PK_NAME_FULL}.lnk"
  Delete "$SMPROGRAMS\${PK_DIR_NAME} ${PK_ARCH}bit\${PK_NAME_FULL}.lnk"
  Delete "$SMPROGRAMS\${PK_DIR_NAME} ${PK_ARCH}bit\Uninstall ${PK_NAME_FULL}.lnk"
  Delete "$SMPROGRAMS\${PK_DIR_NAME} ${PK_ARCH}bit\${PK_NAME_FULL} (Debug Console).lnk"

  ; Remove directories used
  RMDir "$SMPROGRAMS\${PK_DIR_NAME} ${PK_ARCH}bit"
  RMDir "$INSTDIR"

  System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)'
SectionEnd

Function .onInit
  ; Check previous installation

  SetRegView ${PK_ARCH}
  ReadRegStr $R0 HKLM "${PRODUCT_UNINSTALL_KEY}" "UninstallString"
  StrCmp $R0 "" 0 oops
  
  SetRegView 32
  ReadRegStr $R0 HKLM "${PRODUCT_UNINSTALL_KEY}" "UninstallString"
  StrCmp $R0 "" 0 oops

  SetRegView 64
  ReadRegStr $R0 HKLM "${PRODUCT_UNINSTALL_KEY}" "UninstallString"
  StrCmp $R0 "" 0 oops

  BringToFront
  Return

oops:
  MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION "Another version of this software appears to be installed. Would you like to uninstall it first?" IDNO ignore IDCANCEL cancel
  ExecWait '$R0'
  BringToFront
  Return

cancel:
  MessageBox MB_OK|MB_ICONEXCLAMATION "Unable to uninstall another version of Synfig"
  Abort

ignore:
  BringToFront
  Return
FunctionEnd