home *** CD-ROM | disk | FTP | other *** search
/ CD-ROM Today - The Disc! 2 / CD-ROM_Today_-_The_Disc_2_June-July_1994.iso / myst / mystdemo.inf < prev    next >
INI File  |  1994-04-12  |  30KB  |  1,188 lines

  1. ;;====================================================================
  2. ;;  Files processing module.  All file and directory tasks required for
  3. ;;  the installation should be centralized in this module.
  4. ;;====================================================================
  5.  
  6. ;;====================================================================
  7. ;;
  8. ;;                       V A R I A B L E S
  9. ;;
  10. ;;====================================================================
  11.  
  12. DefineVariables
  13. Text [BaseName] := mystdemo
  14. ;;************************************************************************
  15. ;;
  16. ;;  Variables specific to this module.
  17. ;;  (SDF variables are initialized from an external data file.)
  18. ;;
  19. ;;************************************************************************
  20.  
  21.   Number [UtilMenuSelection]
  22. Text [ProgramGroupDesc] := Broderbund Software
  23. Text [ProgramGroupFile] := MYSTDEMO.GRP
  24. Number [ProgramGroupItemCount] := 1
  25.   Text [HeaderBitMapFile] := BRODLOGO.BMP
  26.   Text [InfoBitMapFile] := ESC.BMP
  27.   Text [ProductIconFile]
  28. Text [ReadMeFile] := README.TXT
  29. Number [MainSwitchFull] := 0
  30.  
  31.   Number [Yes] := 1
  32.   Number [No] := 0
  33.  
  34.   Number [AcceptValue] := 1
  35.   Number [CancelValue] := 102
  36.  
  37. Logical [ArchiveAvailable] := Y
  38. Logical [ProgramGroupAvailable] := Y
  39.  
  40.   Number [ProgramGroupInstalled]
  41.   Number [ProgramItemsInstalled]
  42.  
  43. ;;*************
  44. ;; these variables are common to the DOS files module
  45. ;;*************
  46.   Number [FilesMenuSelection]
  47.   Text [ExtractionOptions] := ShowJustOne
  48.   Directory [InstallRootDirectory]
  49.   Text [DeleteProductDirFileName] := DELDIRW.EXE
  50.   Text [DeleteKey] := HOBIEJOE
  51.  
  52.   Text [Array1]
  53.   Text [Array2]
  54.   Text [Array3]
  55.   Text [Array4]
  56.   Text [Array5]
  57.   Text [Array6]
  58.  
  59.   Directory [OrigDirectory]
  60.   Directory [Tree]
  61.   Number [TreeLength]
  62.   Logical [TreeDeleted]
  63.  
  64.   Number [Error] := 0
  65.   Number [NoError] := 0
  66.   Number [NoDirectory] := 1
  67.   Number [FilesSkipped] := 2
  68.   Number [NoInstall] := 3
  69.   Number [NoPGInstall] := 4
  70.  
  71. Text [DefaultInstallationDirectory] := MYSTDEMO
  72.   Directory [SavedSelectedInstallDir]
  73.  
  74.   Directory [SelectedInstallDirectory]
  75.   Number [FilesInstalled]             
  76.  
  77. ;;************************************************************************
  78. ;;
  79. ;;  Variables common to all script modules.
  80. ;;  (SDF variables are initialized from and external data file.)
  81. ;;
  82. ;;************************************************************************
  83.   
  84.   Text [ModuleName]
  85.   Text [SDFFileName]
  86.  
  87. Text [ProductName] := Myst Demo
  88.   Text [TechSupportPhoneNumber] := (415) 382-4419
  89.  
  90.   Number [WorkFilesGroup] := 1
  91.  
  92.    Number [Abort]
  93.  
  94.    Logical [UseShadows]
  95.    Text [MainBorder]
  96.    Text [PopupBorder]
  97.    Text [TopLineColors]
  98.    Text [BottomLineColors]
  99.    Text [ShadowColors]
  100.    Text [ScreenColors]
  101.    Text [PopupColors]
  102.  
  103.    Text [AttentionColors]
  104.    Text [NotifyColors]
  105.    Text [StaticInfoColors]
  106.    Text [DynamicInfoColors]
  107.    Text [BackgroundCharacter]
  108.  
  109. EndDefineVariables
  110.  
  111. ;;=================================================================== 
  112. ;;
  113. ;;                        P R O C E D U R E S
  114. ;;
  115. ;;=================================================================== 
  116.  
  117. [ProductIconFile] := [BaseName].BMP
  118. [ModuleName] := [BaseName].INF
  119. [SDFFileName] := [BaseName].SDF
  120. [ProgramGroupInstalled] := [No]
  121. [ProgramItemsInstalled] := [No]
  122. [FilesInstalled] := [No]
  123.  
  124.  
  125. Do GetWorkFiles
  126. Do SetDisplay
  127. Do ReadSDF
  128. If [Abort] = [Yes]
  129.   Do Abort
  130. EndIf
  131. Do ModuleProcess
  132.  
  133. :EndModule
  134. [Abort] := [No]
  135. Do ExitModule
  136.  
  137.  
  138. ;;==================
  139. ;; Main Module Process
  140. ;;  All module-specific, custom procedures
  141. ;;  should be called from here.
  142. ;;==================
  143.  
  144. Procedure ModuleProcess
  145.  
  146.   Do MainSwitch
  147.  
  148. EndProcedure ;; ModuleProcess
  149.  
  150.  
  151. Procedure MainSwitch
  152.  
  153. :MainSwitchGT
  154.   If [MainSwitchFull] = 1
  155.     [String1] := Utilities
  156.   Else
  157.     [String1] := Help
  158.   EndIf
  159.  
  160.   [Number2] := LengthOf [ProductName]
  161.   [Number3] := 275/2
  162.   [Number4] := [Number3] - [Number2] - [Number2]
  163.   [Number2] := 4 * [Number2]
  164.   DialogBox @xy(CENTERWINDOW,CENTERWINDOW) 275 78 Returns [Number1] NoCaption ModalFrame BorDlg
  165.     BorGroup @xy(10,10) 255 38 "Installation for:"
  166.     CText @xy([Number4],20) [Number2] 8 [ProductName]
  167.     DefPushButton @xy(33,56) 57 14 "INSTALL" 100
  168.     PushButton @xy(184,56) 57 14 "Cancel" 101
  169.     PushButton @xy(116,58) 45 11 [String1] 102
  170.   EndDialogBox
  171.  
  172.   If [Number1] = 100
  173.     Do FullInstall
  174.   EndIf
  175.  
  176.   If [Number1] = 102
  177.     If [MainSwitchFull] = 1
  178.       Do UtilMenu
  179.     Else
  180.       Do ShowHelpInfo
  181.       GoTo MainSwitchGT
  182.     EndIf
  183.   EndIf
  184.  
  185. EndProcedure ;; MainSwitch
  186.  
  187.  
  188. Procedure UtilMenu
  189.  
  190.   [UtilMenuSelection] := 1
  191. :UtilMenuGT
  192.   ClearScreen
  193.  
  194.   [Error] := NoError
  195.   [String1] := BlankString
  196.   GetMenuChoice [DynamicInfoColors] @xy(Center,Center) Highlight [UtilMenuSelection] UseHeader "UTILITIES MENU"
  197.     Deinstall [ProductName]
  198.     ;Deinstall entire product (files, program groups, etc.)
  199.     [String1]
  200.     Install Program Group
  201.     ;Install the program group and program items for
  202.     ;"[ProductName]"
  203.     [String1]
  204.     Install All Files
  205.     ;Install all files required for a full installation
  206.     Install A Single File
  207.     ;Select a single file from the installation disk(s)
  208.     Deinstall All Files
  209.     ;Delete all directories, subdirectories,
  210.     ;and files related to the installation of
  211.     ;"[ProductName]"
  212.     [String1]
  213.     Exit
  214.     ;Exit the installer.
  215.   EndGetMenuChoice
  216.   
  217.   InCase choice is
  218.     =1:  [UtilMenuSelection] := 1
  219.          Do GetSelectedDirectory
  220.          If [Error] <> [NoDirectory]
  221.            Do DeinstallProductFiles
  222.            [ProgramItemsInstalled] := [Yes] ;; this is as far as I'm willing to commit myself
  223.            Do DeinstallProgramGroup
  224.          EndIf 
  225.     =2:  [UtilMenuSelection] := 2
  226.     =3:  [UtilMenuSelection] := 3
  227.          Do GetSelectedDirectory
  228.          If [Error] <> [NoDirectory]
  229.            If [ProgramGroupAvailable] = YesCharacter
  230.              Do ProgramGroupBuild
  231.            Else
  232.              Dialog
  233.                Sorry, but there is no program group for
  234.                "[ProductName]"
  235.              EndDialog
  236.            EndIf
  237.          EndIf
  238.     =4:  [UtilMenuSelection] := 4
  239.     =5:  [UtilMenuSelection] := 5
  240.          If [ArchiveAvailable] = NoCharacter
  241.            Dialog
  242.              Sorry, but the installation for
  243.              "[ProductName]"
  244.              has no files.
  245.            EndDialog
  246.          Else
  247.             Do ExtractAllFiles
  248.          EndIf
  249.     =6:  [UtilMenuSelection] := 6
  250.          If [ArchiveAvailable] = NoCharacter
  251.            Dialog
  252.              Sorry, but the installation for
  253.              "[ProductName]"
  254.              has no files.
  255.            EndDialog
  256.          Else
  257.            Do ExtractSingleFile
  258.          EndIf
  259.     =7:  [UtilMenuSelection] := 7
  260.          If [ArchiveAvailable] = NoCharacter
  261.            Dialog
  262.              Sorry, but the installation for
  263.              "[ProductName]"
  264.              has no files.
  265.            EndDialog
  266.          Else
  267.            Do GetSelectedDirectory
  268.            If [Error] <> [NoDirectory]
  269.              Do DeinstallProductFiles
  270.            EndIf
  271.          EndIf
  272.     =8:  [UtilMenuSelection] := 8
  273.     =9:  [UtilMenuSelection] := 9
  274.          GoTo UtilMenuExit
  275.   EndInCase
  276.  
  277.   GoTo UtilMenuGT
  278. :UtilMenuExit
  279.  
  280. EndProcedure ;; UtilMenu
  281.  
  282.  
  283. Procedure FullInstall
  284.  
  285.   If [ArchiveAvailable] = YesCharacter
  286.     Do ExtractAllFiles
  287.     If [Error] = [NoDirectory] .OR. [Error] = [NoInstall]
  288.       GoTo FullInstallExit
  289.     EndIf
  290.   EndIf
  291.   If [ProgramGroupAvailable] = YesCharacter
  292.     Do ProgramGroupBuild
  293.   EndIf
  294.  
  295.   Do SetProductINIFile
  296.  
  297.   If FileExists [SelectedInstallDirectory]\[ReadMeFile]
  298.     Dialog [YesOrNo1] [StaticInfoColors]
  299.       Would you like to read the file "[ReadMeFile]" now?
  300.     EndDialog
  301.     If [YesOrNo1] = YesCharacter
  302.       BrowseFile [SelectedInstallDirectory]\[ReadMeFile]
  303.     EndIf
  304.   EndIf
  305.  
  306.   If [Error] = [NoPGInstall]
  307.     Dialog PressAKey
  308.       The icons for "[ProductName]"
  309.       may not exist or may be out of date.
  310.  
  311.       You may have to run the program from
  312.       the Program Manager's "File\Run" menu.
  313.     EndDialog
  314.   EndIf
  315.  
  316.   If [Error] = [NoError]
  317.     Dialog PressAKey [StaticInfoColors]
  318.       You've sucessfully installed
  319.       "[ProductName]"
  320.  
  321.       Have Fun!
  322.     EndDialog
  323.   EndIf
  324.  
  325. :FullInstallExit
  326.  
  327. EndProcedure ;; FullInstall
  328.  
  329.  
  330.  
  331.  
  332. Procedure ProgramGroupBuild
  333.  
  334.   If [ProgramGroupDesc] = BlankString
  335.     [Error] := [NoPGInstall]
  336.     GoTo ProgramGroupBuildExit
  337.   EndIf
  338.  
  339.   [Error] := [NoError]
  340.  
  341.   [Abort] := [Yes]
  342.   [ProgramGroupInstalled] := [Yes]
  343.   Do SetSDF
  344.  
  345.   [Array4] := GetProgramManagerGroupInfo [ProgramGroupDesc]
  346.   If [Array4][1] <> BlankString
  347.     ProgramManagerDDE
  348.       CreateGroup([ProgramGroupDesc])
  349.     EndProgramManagerDDE
  350.     If [ProgramGroupItemCount] = 0
  351.       Dialog PressAKey [StaticInfoColors]
  352.         The program group "[ProgramGroupDesc]"
  353.         has been installed.
  354.       EndDialog
  355.       GoTo ProgramGroupBuildExit
  356.     EndIf
  357.   EndIf
  358.  
  359.   ClearScreen
  360.   TextBox [StaticInfoColors]
  361.     Installing program icons. One moment please...
  362.   EndTextBox
  363.   Do BuildPGIAddArray ;; fill [Array2] with program group item names
  364.  
  365.   [Number1] := 0
  366.   [Number3] := 1
  367.   While [Number1] < [ProgramGroupItemCount]
  368.     IncrementNumber [Number1]
  369.     [YesOrNo1] := NoCharacter
  370.  
  371.     [String10] := [Array2][[Number1]]
  372.     [Number2] := [Number1] + 1
  373.     [Number4] := 0
  374.     While [Number4] < [ProgramGroupItemCount] .AND. [YesOrNo1] = NoCharacter
  375.       IncrementNumber [Number4]
  376.       [Number5] := [Number4] + 1
  377.       [String11] := [Array4][[Number5]]
  378.  
  379.       If [String11] Contains [String10]
  380.         [YesOrNo1] := YesCharacter
  381.       Else
  382.         [YesOrNo1] := NoCharacter
  383.       EndIf
  384.     EndWhile
  385.  
  386.     If [YesOrNo1] = YesCharacter
  387.       [Array5][[Number3]] := [Array2][[Number1]]
  388.       IncrementNumber [Number3]
  389.     Else
  390.       ProgramManagerDDE
  391.         CreateGroup([ProgramGroupDesc])
  392.         ReplaceItem([String10])
  393.         AddItem ([Array3][[Number1]])
  394.       EndProgramManagerDDE
  395.     EndIf
  396.   EndWhile
  397.  
  398.   ClearScreen
  399.   If [Array5][1] <> BlankString
  400.     [String2] := [ProgramGroupDesc]
  401.     DialogBox @xy(CENTER,CENTER) 268 120 Returns [Number2] UseHeader "Icon List"
  402.       LText @xy(35,10) 198 8 "The following icons should to be replaced in the program group"
  403.       CText @xy(35,20) 198 8 [ProgramGroupDesc]
  404.       ListBox @xy(10,32) 248 32 Uses [Array6] LoadWith [Array5] multiplesel Border
  405.       LText @xy(33,69) 98 8 "'Replace' replaces the icons,"
  406.       LText @xy(33,79) 202 8 "'Skip' leaves the old icons and does not install the new ones."
  407.       DefPushButton @xy(91,96) 38 14 "Replace" [AcceptValue]
  408.       PushButton @xy(139,96) 38 14 "Skip" [CancelValue]
  409.     EndDialogBox
  410.  
  411.     If [Number2] = [AcceptValue]
  412.       [Number1] := 1
  413.       While [Array2][[Number1]] <> BlankString
  414.         ProgramManagerDDE
  415.           CreateGroup([ProgramGroupDesc])
  416.           ReplaceItem([Array2][[Number1]])
  417.           AddItem ([Array3][[Number1]])
  418.         EndProgramManagerDDE
  419.         IncrementNumber [Number1]
  420.       EndWhile
  421.     Else
  422.       [Error] := [NoPGInstall]
  423.       GoTo ProgramGroupBuildExit
  424.     EndIf
  425.   EndIf
  426.  
  427.   If [ProgramGroupItemCount] > 0
  428.     Dialog PressAKey [StaticInfoColors]
  429.       The icons for "[ProductName]"
  430.       have been installed in the program group
  431.       "[ProgramGroupDesc]"
  432.     EndDialog
  433.   EndIf
  434.  
  435. :ProgramGroupBuildExit
  436.   ClearScreen
  437.  
  438. EndProcedure ;; ProgramGroupBuild
  439.  
  440.  
  441.  
  442.  
  443. Procedure DeinstallProgramGroup
  444.  
  445.   If [ProgramGroupDesc] = BlankString
  446.     GoTo DeinstallProgramGroupExit
  447.   EndIf
  448.   If FileExists [WindowsDirectory]\[ProgramGroupFile]
  449.   Else
  450.     GoTo DeinstallProgramGroupExit
  451.   EndIf
  452.  
  453.   If [ProgramGroupInstalled] = [Yes]
  454.     Dialog [YesOrNo1] [StaticInfoColors]
  455.       Remove the program group "[ProgramGroupDesc]"?
  456.     EndDialog
  457.     If [YesOrNo1] = NoCharacter
  458.       GoTo DeinstallProgramGroupExit
  459.     EndIf
  460.     ProgramManagerDDE
  461.       DeleteGroup([ProgramGroupDesc])
  462.     EndProgramManagerDDE
  463.     [ProgramGroupInstalled] := [No]
  464.     GoTo DeinstallProgramGroupExit
  465.   EndIf
  466.  
  467.   If [ProgramItemsInstalled] = [Yes]
  468.     Dialog [YesOrNo1] [StaticInfoColors]
  469.       Remove the installed program items from the program group
  470.       "[ProgramGroupDesc]"?
  471.     EndDialog
  472.     If [YesOrNo1] = NoCharacter
  473.       GoTo DeinstallProgramGroupExit
  474.     EndIf
  475.     Do DeletePGI
  476.     [ProgramItemsInstalled] := [No]
  477.   EndIf
  478.  
  479. :DeinstallProgramGroupExit
  480.  
  481. EndProcedure ;; DeinstallPG
  482.  
  483.  
  484.  
  485. Procedure DDENonfatalErrorTrap
  486. EndProcedure ;; DDENonfatalErrorTrap
  487.  
  488.  
  489.  
  490. Procedure RetrieveFirstMedia
  491.  
  492. ;; Important Note: make sure that file MEDIA1.TAG 
  493. ;; is the first file indicated in the ".pvd" file.
  494. ;; This will ensure that the first diskette is
  495. ;; reinserted by the user.
  496.  
  497.   SetReplacementInquiry Off
  498.   QueFiles to ShadowDirectory
  499.     MEDIA1.TAG
  500.   EndQueFiles
  501.   GetQuedFiles Quietly
  502.   DeleteFiles from ShadowDirectory Quietly
  503.     MEDIA1.TAG
  504.   EndDeleteFiles
  505.  
  506. EndProcedure ;; RetrieveFirstMedia
  507.  
  508. ;;=========================
  509. ;; ExtractAllFiles
  510. ;;  Extracts all files from the archive.
  511. ;;  If user skips certain files during installation
  512. ;;  (e.g., because they're duplicates) we inform
  513. ;;  them of possible version incompatibility of
  514. ;;  product.
  515. ;;=========================
  516.  
  517. Procedure ExtractAllFiles
  518.  
  519.   QueAllFiles
  520.   UnQueFileGroup [WorkFilesGroup]
  521.   Do GetInstallDirectory
  522.  
  523.   If [Error] = [NoDirectory]
  524.     GoTo ExtractAllFilesExit
  525.   EndIf
  526.   If QueSize = 0
  527.     CreateDirectoryIfNecessary [SelectedInstallDirectory]
  528.     GoTo ExtractAllFilesExit
  529.   EndIf
  530.  
  531.   Do AssignAddTreeArray
  532.   If [Array1][2] <> BlankString
  533.     [String2] := [InstallRootDirectory]
  534.     DialogBox @xy(CENTER,CENTER) 268 100 Returns [Number1] UseHeader "Install Directory List"
  535.       LText @xy(46,10) 162 8 "The following directories will be installed on drive"
  536.       LText @xy(210,10) 12 8 [String2]
  537.       ListBox @xy(10,22) 248 32 Uses [String1] LoadWith [Array1] Border
  538.       LText @xy(38,58) 191 8 "Press OK to continue or Cancel to return to the main menu."
  539.       DefPushButton @xy(91,76) 38 14 "OK" [AcceptValue]
  540.       PushButton @xy(139,76) 38 14 "Cancel" [CancelValue]
  541.     EndDialogBox
  542.   EndIf
  543.  
  544.   If [Number1] = [CancelValue]
  545.     [Error] := [NoInstall]
  546.     GoTo ExtractAllFilesExit
  547.   EndIf
  548.  
  549.   [Abort] := [Yes]
  550.   [FilesInstalled] := [Yes]
  551.   Do SetSDF
  552.  
  553.   GetQuedFiles [ExtractionOptions]
  554.  
  555.   If QueSize <> 0  ;; Some files were not installed
  556.     [Error] := [FilesSkipped]
  557.     Dialog PressAKey [StaticInfoColors]
  558.       Some files were selected but not installed.
  559.  
  560.       This might cause problems when running
  561.       "[ProductName]",
  562.       if the skipped files are incompatible with
  563.       the version just installed.
  564.     EndDialog
  565.   Else
  566.     Dialog 2000 [StaticInfoColors]
  567.       All files for "[ProductName]"
  568.       have installed successfully.
  569.     EndDialog
  570.   EndIf
  571.  
  572.   Do RetrieveFirstMedia
  573.  
  574. :ExtractAllFilesExit
  575.   UnqueAllFiles
  576.  
  577. EndProcedure ;; ExtractAllFiles
  578.  
  579.  
  580. ;;=========================
  581. ;; GetInstallDirectory
  582. ;;  The target directory structure can be:
  583. ;;  single directory - all data installed on
  584. ;;    user's disk in a single directory (not the root)
  585. ;;  multiple directory - more than one directory
  586. ;;    is installed off of the root
  587. ;;=========================
  588.  
  589. Procedure GetInstallDirectory
  590.  
  591. :GetInstallDirectoryEnter
  592.   [Error] := [NoDirectory]
  593.   DetermineInstallationDrive QueSize RequireFixed
  594.   [String10] := InstallationDrive
  595.   [Number10] := FreeSpaceOnDrive [String10]
  596.   If [Number10] < QueSize
  597.     Dialog [YesOrNo1] UseHeader "Insufficient Disk Space"
  598.       "[ProductName]" requires QueSize bytes.
  599.       Drive "[String10]" only has [Number10] bytes.
  600.  
  601.       Select a different drive?
  602.     EndDialog
  603.     If [YesOrNo1] = YesCharacter
  604.       GoTo GetInstallDirectoryEnter
  605.     Else
  606.       GoTo GetInstallDirectoryExit2
  607.     EndIf
  608.   EndIf
  609.  
  610.   If [DefaultInstallationDirectory] = BlankString
  611.     GoTo GetInstallDirectoryExit
  612.   EndIf
  613.  
  614.   [InstallationDirectory] := InstallationDrive:\[DefaultInstallationDirectory]
  615.   DetermineInstallationDirectory [InstallationDirectory] QueSize NoCreate
  616.  
  617.   [Number1] := LengthOf [InstallationDirectory] 
  618.   If [Number1] < 4
  619.   ;; specified target directory is root
  620.     Dialog [PressAKey] [AttentionColors] ;; Can't install to root directory
  621.       Sorry, but you cannot install directly to the root directory "[InstallationDirectory]"
  622.     EndDialog
  623.     GoTo GetInstallDirectoryExit2
  624.   EndIf
  625.  
  626.   If DirectoryExists [InstallationDirectory]
  627.   Else
  628.     GoTo GetInstallDirectoryExit
  629.   EndIf
  630.  
  631.   Dialog [YesOrNo1] [StaticInfoColors] ;; Installation directory already exists notice
  632.     Files will be installed to the directory
  633.     "[InstallationDirectory]"
  634.         
  635.     Since this directory already exists, files
  636.     with the same names will be overwritten.
  637.  
  638.     Do you want to install to the directory
  639.     "[InstallationDirectory]"?
  640.   EndDialog
  641.   If [YesOrNo1] = NoCharacter
  642.     GoTo GetInstallDirectoryExit2
  643.   EndIf
  644.  
  645.   Dialog [YesOrNo1] [StaticInfoColors]
  646.     Do you wish to be prompted before any duplicate files are replaced? 
  647.   EndDialog
  648.   If [YesOrNo1] = YesCharacter
  649.     SetReplacementInquiry On
  650.   Else
  651.     SetReplacementInquiry Off
  652.   EndIf
  653.  
  654. :GetInstallDirectoryExit
  655.   [SelectedInstallDirectory] := [InstallationDirectory]
  656.   [SavedSelectedInstallDir] := [InstallationDirectory]
  657.   [String1] := [InstallationDirectory]
  658.   [String2] := SubStringOf [String1] from 1 to 3
  659.   [InstallRootDirectory] := [String2]
  660.   [InstallationDirectory] := [String2] ;; set install dir to root
  661.   [String1] := SubStringOf [String1] from 4 to End
  662.   [Dir1] := [String1] ;; InstallationDirectory without the drive
  663.  
  664.   [Error] := [NoError]
  665.  
  666. :GetInstallDirectoryExit2
  667.  
  668. EndProcedure ;; GetInstallDirectory
  669.  
  670.  
  671. Procedure GetSelectedDirectory
  672.  
  673.   [Error] := [NoDirectory]
  674.   If [SelectedInstallDirectory] = BlankString
  675.     DetermineInstallationDrive QueSize RequireFixed
  676.     [Dir10] := InstallationDrive:\[DefaultInstallationDirectory]
  677.   Else
  678.     [Dir10] := [SelectedInstallDirectory]
  679.   EndIf
  680.  
  681.   Dialog [Dir10] [DynamicInfoColors] UpperCase
  682.     Verify the default installation directory below and press <ENTER>.
  683.   EndDialog
  684.  
  685.   [Number1] := LengthOf [Dir10] 
  686.   If [Number1] < 4
  687.   ;; specified target directory is root
  688.     Dialog [PressAKey] [AttentionColors] ;; Can't deal directly with root directory
  689.       Sorry, but you must indicate a directory below the root directory "[Dir10]"
  690.     EndDialog
  691.     [Dir1] := BlankString
  692.     GoTo GetSelectedDirectoryExit
  693.   EndIf
  694.  
  695.   If DirectoryExists [Dir10]
  696.     GoTo GetSelectedDirectoryExit
  697.   EndIf
  698.  
  699.   Dialog PressAKey [StaticInfoColors] ;; Directory does not exist
  700.     The directory "[Dir10]"
  701.     doesn't exist.    
  702.   EndDialog
  703.   [Dir1] := BlankString
  704.   GoTo GetSelectedDirectoryExit
  705.  
  706. :GetSelectedDirectoryExit
  707.   [SelectedInstallDirectory] := [Dir10]
  708.   [String1] := [Dir10]
  709.   [String2] := SubStringOf [String1] from 1 to 3
  710.   [InstallRootDirectory] := [String2]
  711.   [Dir10] := [String2]
  712.   [String1] := SubStringOf [String1] from 4 to End
  713.   [Dir1] := [String1] ;; InstallationDirectory without the drive
  714.  
  715.   [Error] := [NoError]
  716.  
  717. :GetSelectedDirectoryExit2
  718.  
  719. EndProcedure ;; GetSelectedDirectory
  720.  
  721.  
  722. ;;===========================
  723. ;; ExtractSingleFile
  724. ;;===========================
  725.  
  726. Procedure ExtractSingleFile
  727.  
  728.   [String1] := BlankString
  729. :ExtractSingleFileGT
  730.   DialogBox @xy(CENTER,CENTER) 135 76 Returns [Number1] UseHeader "Select A File"
  731.     LText @xy(5,10) 120 10 "Enter the file name (without the path)."
  732.     EditText @xy(26,25) 83 12 Uses [String1] Border UpperCase
  733.     DefPushButton @xy(19,52) 38 14 "Accept" [AcceptValue]
  734.     PushButton @xy(77,52) 38 14 "Cancel" [CancelValue]
  735.   EndDialogBox
  736.  
  737.   If [Number1] = [CancelValue]
  738.     GoTo ExtractSingleFileExit
  739.   EndIf
  740.   If [String1] = BlankString
  741.     GoTo ExtractSingleFileGT
  742.   EndIf
  743.  
  744.   If [String1] contains \
  745.     Popup Please enter just the file name with no path.
  746.     GoTo ExtractSingleFileGT
  747.   EndIf
  748.   If FileIsInLibrary [String1]
  749.   Else
  750.     Popup Cannot find a file named [String1]
  751.     GoTo ExtractSingleFileGT
  752.   EndIf
  753.   QueFiles
  754.     [String1]
  755.   EndQueFiles
  756.     
  757.   Do GetSelectedDirectory
  758.   If [Error] = [NoDirectory]
  759.     UnQueFiles
  760.       [String1]
  761.     EndUnQueFiles
  762.     GoTo ExtractSingleFileExit
  763.   EndIf
  764.   SetReplacementInquiry On
  765.   GetQuedFiles [ExtractionOptions]
  766.  
  767.   Do RetrieveFirstMedia
  768.  
  769. :ExtractSingleFileExit
  770.  
  771. EndProcedure ;; ExtractSingleFile
  772.  
  773.  
  774.  
  775.             
  776. ;;=============================
  777. ;; DeinstallProductFiles
  778. ;;=============================
  779.  
  780. Procedure DeinstallProductFiles
  781.  
  782.   Do AssignAddTreeArray
  783.  
  784.   [OrigDirectory] := CurrentDirectory
  785.   Dialog [YesOrNo1] [AttentionColors] UseHeader "DIRECTORY DELETION NOTICE"
  786.     Delete the files and directories for
  787.     "[ProductName]"?
  788.   EndDialog
  789.  
  790.   If [YesOrNo1] = NoCharacter
  791.     GoTo DeinstallProductFilesExit
  792.   EndIf
  793.  
  794.   [Number1] := 1
  795.   While [Array1][[Number1]] <> BlankString
  796.     [Tree] := [InstallRootDirectory][Array1][[Number1]]
  797.     Do DeleteTree
  798.  
  799.     If [TreeDeleted] = YesCharacter
  800.       [FilesInstalled] := [No]
  801.     Else
  802.       [FilesInstalled] := [Yes]
  803.     EndIf
  804.  
  805.     If Windows
  806.       ;;"DirectoryIsEmpty" does not work in Instalit for Windows
  807.     Else
  808.       Do DeleteNextLevel
  809.     EndIf
  810.     IncrementNumber [Number1]
  811.   EndWhile
  812.  
  813. :DeinstallProductFilesExit
  814.   ChangeDirectoryTo [OrigDirectory]
  815.  
  816. EndProcedure ;; DeinstallProductFiles
  817.  
  818.  
  819. Procedure DeleteTree
  820.  
  821.   [TreeDeleted] := NoCharacter
  822.   If DirectoryExists [Tree]
  823.   Else
  824.     [TreeDeleted] := YesCharacter
  825.     GoTo DeleteTreeExit
  826.   EndIf
  827.  
  828.   ClearScreen
  829.  
  830.   [TreeLength] := LengthOf [Tree]
  831.   If [TreeLength] < 4
  832.     GoTo DeleteTreeExit
  833.   EndIf
  834.   If [Tree] = [WindowsDirectory]
  835.     GoTo DeleteTreeExit
  836.   EndIf
  837.   If [Tree] = [WindowsSystemDirectory]
  838.     GoTo DeleteTreeExit
  839.   EndIf
  840.  
  841.   Dialog [YesOrNo1] [AttentionColors] UseHeader "DIRECTORY DELETION NOTICE"
  842.     Delete the directory
  843.     "[Tree]"
  844.     including all its files and subdirectories?
  845.   EndDialog
  846.   If [YesOrNo1] = NoCharacter
  847.     GoTo DeleteTreeExit
  848.   EndIf
  849.  
  850.   ClearScreen
  851.   TextBox [StaticInfoColors]  ;; Deinstall product files and inst. dir.
  852.     Deleting directory
  853.     "[Tree]"...
  854.   EndTextBox
  855.  
  856.   ChangeDirectoryTo [Tree]
  857.   Run ShadowDirectory\[DeleteProductDirFileName] [DeleteKey] Quietly SwapOut
  858.   ClearScreen
  859.  
  860.   If OSErrorCode <> 0
  861.     Dialog PressAKey
  862.       Cannot delete files and directories for
  863.       "[ProductName]".
  864.     EndDialog
  865.     GoTo DeleteTreeExit
  866.   EndIf
  867.  
  868.   [TreeDeleted] := YesCharacter
  869.  
  870. :DeleteTreeExit
  871.  
  872. EndProcedure ;; DeleteTree
  873.  
  874.  
  875. Procedure DeleteNextLevel
  876.  
  877. :DeleteNextLevelGT
  878.   [TreeLength] := LengthOf [Tree]
  879.   [String1] := BlankString
  880.   While [String1] <> "\" .AND. [TreeLength] > 3
  881.     [TreeLength] := LengthOf [Tree]
  882.     [String1] := SubstringOf [Tree] from [TreeLength] to End
  883.     DecrementNumber [TreeLength]
  884.     [Tree] := SubstringOf [Tree] from Beginning to [TreeLength]
  885.   EndWhile
  886.  
  887.   If [TreeLength] < 4
  888.     GoTo DeleteNextLevelExit
  889.   EndIf
  890.  
  891.   If DirectoryIsEmpty [Tree]
  892.     Dialog [YesOrNo1] [StaticInfoColors]
  893.       The directory "[Tree]" is empty.
  894.       Shall we delete it?
  895.     EndDialog
  896.     If [YesOrNo1] = YesCharacter
  897.       DeleteDirectory [Tree]
  898.     Else
  899.       GoTo DeleteNextLevelExit
  900.     EndIf
  901.   Else
  902.     GoTo DeleteNextLevelExit
  903.   EndIf
  904.   GoTo DeleteNextLevelGT
  905.  
  906. :DeleteNextLevelExit
  907.  
  908. EndProcedure ;; DeleteNextLevel
  909.  
  910. ;;************************************
  911. ;;  The following procedures are common to
  912. ;;  all script modules for the Broderbund
  913. ;;  Installer Package for DOS/MOHAWK.
  914. ;; 
  915. ;;  These procedures will probably require
  916. ;;  customization.
  917. ;;************************************
  918.  
  919.  
  920. ;;==================
  921. ;; ReadSDF
  922. ;;  Read information from the sdf.
  923. ;;  Customization should occure in the 
  924. ;;  "Module-Specific Variables" section.
  925. ;;  No other modifications should be made
  926. ;;  to this procedure.
  927. ;;==================
  928.  
  929. Procedure ReadSDF
  930.  
  931.   If FileExists [InstallFromDirectory]\[SDFFileName]
  932.   Else
  933.     GoTo ReadSDFExit
  934.   EndIf
  935.  
  936.   TextBox @xy(Center,Center) ;; Getting custom information...
  937.     Getting custom information...one moment, please.
  938.   EndTextBox
  939.  
  940.   CopyFiles from [InstallFromDirectory] to ShadowDirectory Quietly
  941.     [SDFFileName]
  942.   EndCopyFiles
  943.  
  944.   ExamineTextFile ShadowDirectory\[SDFFileName]
  945.  
  946.   [Abort] := SettingFor Abort
  947.  
  948.   [FilesInstalled] := SettingFor FilesInstalled
  949.   [ProgramGroupInstalled] := SettingFor ProgramGroupInstalled
  950.   [ProgramItemsInstalled] := SettingFor ProgramItemsInstalled
  951.   [String1] := SettingFor SelectedInstallDirectory
  952. ;;  If [String1] <> BlankString
  953.     [SelectedInstallDirectory] := [String1]
  954. ;;  EndIf
  955.  
  956.   ForgetTextFile
  957. :ReadSDFExit
  958.  
  959. EndProcedure ;; ReadSDF
  960.  
  961.  
  962. Procedure SetSDF
  963.  
  964.   ModifyTextFile ShadowDirectory\[SDFFileName] Quietly NoBackup
  965.     AddOrChangeLineWith (Abort,=,) as "Abort=[Abort]" at End
  966.     AddOrChangeLineWith (FilesInstalled,=,) as "FilesInstalled=[FilesInstalled]" At End
  967.     AddOrChangeLineWith (SelectedInstallDirectory,=,) as "SelectedInstallDirectory=[SavedSelectedInstallDir]" At End
  968.     AddOrChangeLineWith (ProgramGroupInstalled,=,) as "ProgramGroupInstalled=[ProgramGroupInstalled]" At End
  969.     AddOrChangeLineWith (ProgramItemsInstalled,=,) as "ProgramItemsInstalled=[ProgramItemsInstalled]" At End
  970.   EndModifyTextFile
  971.  
  972. EndProcedure ;; SetSDF
  973.  
  974.  
  975. ;;==================
  976. ;; ExitModule
  977. ;;  Perform the last tasks required
  978. ;;  before quiting this module.
  979. ;;  This procedure is called in all
  980. ;;  circumstances, whether the module
  981. ;;  is terminating normally, or being
  982. ;;  aborted.
  983. ;;==================
  984.  
  985. Procedure ExitModule
  986.  
  987. ;;^^^^^^^^^^^^^^^^^^^^^^^^^
  988. ;;  Do not modify this block
  989. ;;----------------------------
  990.  
  991.   Do SetSDF
  992.  
  993. ;;^^^^^^^^^^^^^^^^^^^^^^^^^
  994.  
  995.   DeleteFiles from ShadowDirectory Quietly
  996.     [HeaderBitMapFile]
  997.     [InfoBitMapFile]
  998.     [ProductIconFile]
  999.     [SDFFileName]
  1000.     [DeleteProductDirFileName]
  1001.   EndDeleteFiles
  1002.  
  1003.   If [InstallationDirectory] <> BlankString
  1004.   DeleteFiles from [InstallationDirectory] Quietly
  1005.     [HeaderBitMapFile]
  1006.     [InfoBitMapFile]
  1007.     [ProductIconFile]
  1008.     [SDFFileName]
  1009.     [DeleteProductDirFileName]
  1010.     MEDIA1.TAG
  1011.   EndDeleteFiles
  1012.   EndIf
  1013.  
  1014.   SoLong
  1015.  
  1016. EndProcedure ;; ExitModule
  1017.  
  1018.  
  1019. ;;==================
  1020. ;; Abort
  1021. ;;  In this procedure, place your
  1022. ;;  custom code right before the call
  1023. ;;  to "Exit Module".
  1024. ;;  Perform tasks relating to abortion of
  1025. ;;  this modules processes *only*.
  1026. ;;==================
  1027.  
  1028. Procedure Abort
  1029.  
  1030.   ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
  1031.   ;;  This block should remain unaltered.
  1032.   ;;..............................
  1033.  
  1034.   [Abort] := [Yes]
  1035.   
  1036.   ClearScreen
  1037.   TextBox [AttentionColors]
  1038.     Aborting Installation Process...
  1039.   EndTextBox
  1040.  
  1041.   ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  1042.   ;;  Custom script should be placed here,
  1043.   ;;  before the call to "ExitModule.
  1044.   ;;..............................
  1045.  
  1046.   UnqueAllFiles ;; Remove uninstalled files from que
  1047.     
  1048.   If [FilesInstalled] = [Yes]
  1049.     Do DeinstallProductFiles
  1050.   EndIf
  1051.   Do DeinstallProgramGroup
  1052.  
  1053.   Do ExitModule
  1054.  
  1055. EndProcedure ;; Abort
  1056.  
  1057.  
  1058.  
  1059.  
  1060. ;;************************************
  1061. ;;  The following procedures are common to
  1062. ;;  all script modules for the Broderbund
  1063. ;;  Installer Package for DOS/MOHAWK.
  1064. ;; 
  1065. ;;  These procedures should not be altered.
  1066. ;;************************************
  1067.  
  1068.  
  1069.  
  1070. ;;================================
  1071. ;; ShowHelpInfo
  1072. ;;================================
  1073.  
  1074. Procedure ShowHelpInfo
  1075.  
  1076.   Dialog PressAKey [StaticInfoColors]
  1077.     You are installing
  1078.     "[ProductName]".
  1079.  
  1080.     Description of buttons on main dialog:
  1081.  
  1082.     INSTALL - press this button to install all necessary product files,
  1083.     directories, and icons.
  1084.  
  1085.     Cancel - press this button to exit the installer.
  1086.   EndDialog
  1087.  
  1088. EndProcedure ;; ShowHelpInfo
  1089.  
  1090.  
  1091. Procedure GetWorkFiles
  1092.  
  1093.   QueFileGroup [WorkFilesGroup] to ShadowDirectory
  1094.   GetQuedFiles Quietly
  1095.  
  1096. EndProcedure ;; GetWorkFiles
  1097.  
  1098.  
  1099. Procedure SetDisplay
  1100.  
  1101. [UseShadows] := YesCharacter
  1102. [MainBorder] := None
  1103. [PopupBorder] := Single
  1104. [TopLineColors] := WhiteOnBlue
  1105. [BottomLineColors] := WhiteOnLightGray
  1106. [ShadowColors] := DarkGrayOnBlack
  1107. [ScreenColors] := WhiteOnBlue
  1108. [PopupColors] := BlueOnWhite
  1109.  
  1110. [AttentionColors] := WhiteOnRed
  1111. [NotifyColors] := WhiteOnBrown
  1112. [StaticInfoColors] := BlueOnWhite
  1113. [DynamicInfoColors] := BlueOnYellow
  1114. [BackgroundCharacter] := B0
  1115.  
  1116.   If [UseShadows] = YesCharacter
  1117.     SetShadows On
  1118.   else
  1119.     SetShadows Off
  1120.   EndIf
  1121.  
  1122.   If Windows
  1123.   ;;  SetBackdrop off
  1124.   ;;  SetBackgroundColor 255 255 255 255 255 255
  1125.     SetDefaultBitmap off
  1126.     ShowWindow Maximize
  1127.   Else
  1128.     SetAllowExit        Off
  1129.     SetBackgroundCharTo [BackgroundCharacter]
  1130.     SetBottomLineAttrTo [BottomLineColors]
  1131.     SetTopLineAttrTo    [TopLineColors]
  1132.   EndIf
  1133.  
  1134.   SetAttentionAttrTo  [AttentionColors]
  1135.   SetMainBorderTo     [MainBorder]
  1136.   SetPopupAttrTo      [PopupColors]
  1137.   SetPopupBorderTo    [PopupBorder]
  1138.   SetScreenAttrTo     [ScreenColors]
  1139.   SetShadowAttrTo     [ShadowColors]
  1140.   SetTopLineTo        Installation For: [ProductName]
  1141.  
  1142.   [Number1] := MaxX
  1143.   [Number1] := [Number1]/2
  1144.   [Number1] := [Number1] - 86
  1145.   LoadBitMap 1 ShadowDirectory\[HeaderBitMapFile]
  1146.   ShowBitMap 1 @xy([Number1],10)
  1147.  
  1148.   [Number1] := MaxX
  1149.   [Number1] := [Number1]/2
  1150.   [Number1] := [Number1] - 226
  1151.   [Number2] := MaxY
  1152.   [Number2] := [Number2] - 80
  1153.   LoadBitMap 2 ShadowDirectory\[InfoBitMapFile]
  1154.   ShowBitMap 2 @xy([Number1],[Number2])
  1155.  
  1156.   If FileExists ShadowDirectory\[ProductIconFile]
  1157.     LoadBitMap 3 ShadowDirectory\[ProductIconFile]
  1158.     ShowBitMap 3 @xy(10,10)
  1159.   EndIf
  1160.  
  1161. EndProcedure ;; SetDisplay
  1162.  
  1163. Procedure SetProductINIFile
  1164. DeleteFiles from [SelectedInstallDirectory]
  1165. MYST.INI
  1166. EndDeleteFiles
  1167. ModifyTextFile [SelectedInstallDirectory]\MYST.INI
  1168. InsertAtLine End [MystMPCDrive]
  1169. InsertAtLine End Drive=[InstallFromDrive]
  1170. InsertAtLine End 
  1171. InsertAtLine End [Volume]
  1172. InsertAtLine End 
  1173. InsertAtLine End 
  1174. EndModifyTextFile
  1175. EndProcedure;;SetProductINIFile
  1176. Procedure AssignAddTreeArray
  1177. [Array1][1] := [Dir1]
  1178. EndProcedure;;AssignAddTreeArray
  1179. Procedure BuildPGIAddArray
  1180. [Array2][1] := Myst Demo
  1181. [Array3][1] := [SelectedInstallDirectory]\MYSTDEMO.EXE,Myst Demo
  1182. EndProcedure;;BuildPGIAddArray
  1183. Procedure DeletePGI
  1184. ProgramManagerDDE
  1185. CreateGroup(Broderbund Software,MYSTDEMO.GRP)
  1186. EndProgramManagerDDE
  1187. EndProcedure;;DeletePGI
  1188.