|
Developers' side bar Selected categories Edit Links |
Devel /
WindowsInstaller-pdfviewCategories: Development, Windows installer << | Page list | >>A modified version of pdfview.nsi
#
# Windows PDF view helper
# Author: Joost Verburg
#
# This will be installed as pdfview.exe.
#
# This application is not an installer. It is a helper application for
# LyX that will launch the default PDF viewer to display a PDF file,
# but works around the file locking problems of Adobe Reader.
#
# Source code of pdfopen/pdfclose is available at:
# http://magic.aladdin.cs.cmu.edu/2005/07/15/pdfopen-and-pdfclose/
#
# Include standard NSIS libraries
!include "LogicLib.nsh" # http://nsis.sourceforge.net/LogicLib
!include "FileFunc.nsh" # http://nsis.sourceforge.net/Docs/AppendixE.html#E.1
!insertmacro GetParameters # Insert definition of function GetParameters
!insertmacro GetFileName # Insert definition of function GetFileName ??
# --------------------------------
# Settings
Caption "PDF Viewer" # Where will this caption be shown????
OutFile pdfview.exe # Set name of resulting binary
Icon "..\packaging\icons\lyx_32x32.ico" # Icon for start menu. Eh, same icon?
SilentInstall silent # The "installer" should be silent ??
# --------------------------------
# Constants
# ?? Why not use from LogicLib? - are these really used?
#!define FALSE 0 # Can they be removed?
#!define TRUE 1 # Can they be removed?
# --------------------------------
# Variables
Var Dummy # For temporary use. ?? Why not use $R1 etc? ??
Var OriginalFile # Path to PDF file from LyX to be viewed
Var OriginalFileName # ???
Var PDFFile # Path to temporary copy of PDF used with Adobe viewer
Var Viewer # Name of viewer for PDF files
Var OriginalTimeHigh # Part of latest modificaion time of shown file
Var OriginalTimeLow # Part of latest modificaion time of shown file
#--------------------------------
#PDF vieweing
Section "View PDF file"
InitPluginsDir #Temporary directory for PDF file
#Command line parameters
Call GetParameters
Pop $OriginalFile
#Trim quotes
StrCpy $Dummy $OriginalFile 1
${if} $Dummy == '"'
StrCpy $OriginalFile $OriginalFile "" 1
${endif}
StrCpy $Dummy $OriginalFile 1 -1
${if} $Dummy == '"'
StrCpy $OriginalFile $OriginalFile -1
${endif}
GetFullPathName $OriginalFile $OriginalFile
Push $OriginalFile
Call GetFileName
Pop $OriginalFileName
SetOutPath $TEMP #The LyX tmpbuf should not be locked
StrCpy $PDFFile $PLUGINSDIR\$OriginalFileName
# Check whether the file will be opened with Adobe Reader or Adobe Acrobat
Push $OriginalFile
Push "shell32::FindExecutable(t s, t '', t .s)"
CallInstDLL "$EXEDIR\System.dll" Call
Call GetFileName
Pop $Viewer
${if} $Viewer == ""
MessageBox MB_OK|MB_ICONEXCLAMATION "No PDF viewer is installed. \
Please install a PDF viewer such as Adobe Reader."
Quit
${endif}
${if} $Viewer != "AcroRd32.exe"
${andif} $Viewer != "Acrobat.exe" # Non-Adobe PDF viewer used?
# No need for special actions, just forward to ShellExecute
# ??? ShellExecute or ExecShell ???
ExecShell open $OriginalFile
${else} # Using Adobe PDF viewer?
# Store modification time of the original file
GetFileTime $OriginalFile $OriginalTimeHigh $OriginalTimeLow
Call Open_copy_with_Adobe # Open a copy with Adobe
${do} # Loop until Adobe closes
Sleep 500 # Wait 0.5 s ???
# What does 'a' mean??
FileOpen $Dummy $PDFFile a # Try opening temporary copy
${if} $Dummy != "" # File no longer locked, reader closed?
FileClose $Dummy
Delete $PDFFile # Remove temporary copy
Quit # and quit
${endif}
# Why would the original file disappear? Maybe close Adobe then?
# !! I wouldn't mind changing $Current... to e.g. $R0, $R1
# !! Setting $OriginalTime.. could for clarity be done outside function.
${if} ${fileexists} $OriginalFile
# Check if the original file has been modified
GetFileTime $OriginalFile $R0 $R1
${if} $OriginalTimeHigh != $R0
${orif} $OriginalTimeLow != $R1
# Store modification time of the original file
GetFileTime $OriginalFile $OriginalTimeHigh $OriginalTimeLow
Call Open_copy_with_Adobe # Open a copy with Adobe
${endif}
${endif}
${loop} # End of loop until Adobe closes
${endif}
SectionEnd
#--------------------------------
#Macros
#
# Macro: Hide the console (which console?)
# In: COMMAND_LINE = Command that is to be executed (as a command line)
# Out: -
#
# !! If this doesn't have to be a macro, I think it could be
# !! expanded in the new function Open_copy_with_Adobe()
#
!macro HideConsole COMMAND_LINE
Push `${COMMAND_LINE}`
CallInstDLL "$EXEDIR\Console.dll" Exec
Pop $Dummy
${if} $Dummy == "error"
MessageBox MB_OK|MB_ICONSTOP "Error opening PDF file $R0."
${endif}
!macroend
#
# Copy a file from LyX, $OriginalFile, to a temporary file, $PDFFile,
# and then open the temporary file using pdfopen.exe. This leaves the
# original file from LyX unlocked, so that LyX can later overwrite it.
# In addition, set the variables keeping track of the modification time
# of the original file.
#
# In: $OriginalFile = Name of file to be copied to $PDFFile
# $PDFFile = Name of temporary file that is viewed
# $Viewer = ?
# Out: $OriginalTimeHigh = Modification time of $OriginalFile, high part
# $OriginalTimeLow = Modification time of $OriginalFile, low part
# Note: What if LyX modifies $OriginalFile while it is copied?
#
Function Open_copy_with_Adobe
${if} ${fileexists} $PDFFile # Close any existing view
!insertmacro HideConsole '"$EXEDIR\pdfclose.exe" --file "$PDFFile"'
${endif}
# Copy $OriginalFile to $PDFFile
CopyFiles /SILENT $OriginalFile $PDFFile
# Open a new view
!insertmacro HideConsole '"$EXEDIR\pdfopen.exe" --back --file "$PDFFile"'
FunctionEnd
#
# Remarks (m.w.)
# In Nsis Version 2.45 functions from "FileFunc.nsh" are called differently
# change syntax from lines using
# push, call, pop
# by
# ${GetFileName} $OriginalFile $Viewer
#
Category: Development, Windows installer |