home *** CD-ROM | disk | FTP | other *** search
/ Computer Buyer 1998 May / dpcb0598.iso / Business / Draw8 / Draw / Scripts / Scripts / guidewiz.csc < prev    next >
Text File  |  1997-08-19  |  82KB  |  2,278 lines

  1. REM Automatic Guidelines Wizard
  2. REM 
  3.  
  4. '********************************************************************
  5. '   Script:    GuideWiz.csc
  6. '   Copyright 1996 Corel Corporation.  All rights reserved.
  7. '   Description: CorelDRAW script to automatically set up the
  8. '                guidelines on the current page based on a set
  9. '                of options chosen by the user.
  10. '********************************************************************
  11.  
  12. #addfol  "..\..\..\Scripts"
  13. #include "ScpConst.csi"
  14. #include "DrwConst.csi"
  15. #define NL  CHR(10) + CHR(13)
  16. #define NL2 NL + NL
  17.  
  18. WITHOBJECT OBJECT_DRAW
  19.  
  20. '/////FUNCTION & SUBROUTINE DECLARATIONS/////////////////////////////
  21. DECLARE SUB UpdatePreviewImage ( ChoiceNum AS INTEGER, UsePreset AS BOOLEAN )
  22. DECLARE FUNCTION CalculateDistanceApart( NumGridlines AS LONG, InAvailable AS LONG ) AS STRING
  23. DECLARE SUB UpdateGridFreqControls()
  24. DECLARE SUB UpdateMarginControls()
  25. DECLARE SUB UpdateCrossImage ( InChoiceNum AS INTEGER )
  26. DECLARE SUB UpdateColumnDialog()
  27. DECLARE FUNCTION ConvertToDrawUnits( InLength AS LONG, InUnit AS INTEGER ) AS LONG
  28. DECLARE SUB DoGuidelineEffect()
  29. DECLARE SUB DoMarginsEffect()
  30. DECLARE SUB DoGridEffect()
  31. DECLARE SUB DoCrossHairsEffect()
  32. DECLARE FUNCTION CalculateHeightAfterMargins() AS LONG
  33. DECLARE FUNCTION CalculateWidthAfterMargins() AS LONG
  34. DECLARE SUB ApplyRotation( BYVAL DegreeAngle AS INTEGER, \\
  35.                          BYREF Point1X AS LONG,    \\
  36.                           BYREF Point1Y AS LONG, \\
  37.                           BYREF Point2X AS LONG, \\
  38.                           BYREF Point2Y AS LONG )
  39. DECLARE SUB CreateCrossHairAt( PointX AS LONG, PointY AS LONG )
  40. DECLARE SUB DoPresetEffect()
  41.  
  42. DECLARE FUNCTION CreateDC LIB "gdi32" (BYVAL lpDriverName AS STRING, \\
  43.                                        BYVAL lpDeviceName AS LONG, \\
  44.                                        BYVAL lpOutput AS LONG, \\
  45.                                        BYVAL lpInitData AS LONG) AS LONG ALIAS "CreateDCA"
  46. DECLARE FUNCTION GetDeviceCaps LIB "gdi32" (BYVAL hDC AS LONG, \\
  47.                                             BYVAL nIndex AS LONG) AS LONG ALIAS "GetDeviceCaps"
  48. DECLARE FUNCTION DeleteDC LIB "gdi32" (BYVAL hDC AS LONG) AS LONG ALIAS "DeleteDC"
  49. DECLARE FUNCTION GetNumberOfDisplayColors( ) AS LONG
  50.  
  51. '/////CONSTANT DECLARATIONS//////////////////////////////////////////
  52.  
  53. ' The graphics used for the large wizard picture on each dialog.
  54. GLOBAL BITMAP_INTRODIALOG AS STRING
  55. GLOBAL BITMAP_REMOVEDIALOG AS STRING
  56. GLOBAL BITMAP_STYLEDIALOG AS STRING
  57. GLOBAL BITMAP_CHOICEDIALOG AS STRING
  58. GLOBAL BITMAP_ANGLEDIALOG AS STRING
  59. GLOBAL BITMAP_GRIDFREQDIALOG AS STRING
  60. GLOBAL BITMAP_LOCKDIALOG AS STRING
  61. GLOBAL BITMAP_MARGINSDIALOG AS STRING
  62. GLOBAL BITMAP_FINISHDIALOG AS STRING
  63. GLOBAL BITMAP_CROSSDIALOG AS STRING
  64. GLOBAL BITMAP_CENTERCROSSDIALOG AS STRING
  65. GLOBAL BITMAP_COLUMNSDIALOG AS STRING
  66. DIM NumColors AS LONG
  67. NumColors& = GetNumberOfDisplayColors()
  68. IF NumColors& <= 256 THEN
  69.     BITMAP_INTRODIALOG$        = "\GuideB16.bmp"
  70.     BITMAP_REMOVEDIALOG$    = "\GuideB16.bmp"
  71.     BITMAP_STYLEDIALOG$        = "\GuideB16.bmp"
  72.     BITMAP_CHOICEDIALOG$    = "\GuideB16.bmp"
  73.     BITMAP_ANGLEDIALOG$        = "\GuideB16.bmp"
  74.     BITMAP_GRIDFREQDIALOG$    = "\GuideB16.bmp"
  75.     BITMAP_LOCKDIALOG$        = "\GuideB16.bmp"
  76.     BITMAP_MARGINSDIALOG$    = "\GuideB16.bmp"
  77.     BITMAP_FINISHDIALOG$    = "\GuideB16.bmp"
  78.     BITMAP_CROSSDIALOG$        = "\GuideB16.bmp"
  79.     BITMAP_CENTERCROSSDIALOG$= "\GuideB16.bmp"
  80.     BITMAP_COLUMNSDIALOG$    = "\GuideB16.bmp"
  81. ELSE
  82.     BITMAP_INTRODIALOG$        = "\GuideB.bmp"
  83.     BITMAP_REMOVEDIALOG$    = "\GuideB.bmp"
  84.     BITMAP_STYLEDIALOG$        = "\GuideB.bmp"
  85.     BITMAP_CHOICEDIALOG$    = "\GuideB.bmp"
  86.     BITMAP_ANGLEDIALOG$        = "\GuideB.bmp"
  87.     BITMAP_GRIDFREQDIALOG$    = "\GuideB.bmp"
  88.     BITMAP_LOCKDIALOG$        = "\GuideB.bmp"
  89.     BITMAP_MARGINSDIALOG$    = "\GuideB.bmp"
  90.     BITMAP_FINISHDIALOG$    = "\GuideB.bmp"
  91.     BITMAP_CROSSDIALOG$        = "\GuideB.bmp"
  92.     BITMAP_CENTERCROSSDIALOG$= "\GuideB.bmp"
  93.     BITMAP_COLUMNSDIALOG$    = "\GuideB.bmp"
  94. ENDIF
  95.  
  96. ' Title bar text for the message boxes.
  97. GLOBAL CONST TITLE_ERRORBOX$      = "Automatic Guidelines Wizard Error"
  98. GLOBAL CONST TITLE_INFOBOX$       = "Automatic Guidelines Wizard Information"
  99.                                 
  100. ' Constants for dialog return values.
  101. GLOBAL CONST DIALOG_RETURN_OK%     = 1
  102. GLOBAL CONST DIALOG_RETURN_CANCEL% = 2
  103. GLOBAL CONST DIALOG_RETURN_NEXT%     = 3
  104. GLOBAL CONST DIALOG_RETURN_BACK%     = 4
  105.                         
  106. '/////GENERAL VARIABLE DECLARATIONS///////////////////////////////////
  107.  
  108. ' The current directory when the script starts.
  109. GLOBAL CurDir AS STRING
  110.  
  111. ' The dimensions of the area we have available for drawing
  112. ' the guides (within the margins).
  113. GLOBAL AvailableX AS LONG
  114. GLOBAL AvailableY AS LONG
  115.  
  116. ' The previous wizard page's position.
  117. GLOBAL LastPageX AS LONG
  118. GLOBAL LastPageY AS LONG
  119. LastPageX& = -1
  120. LastPageY& = -1
  121.             
  122. '/////INTRODUCTORY DIALOG//////////////////////////////////////////////
  123. BEGIN DIALOG OBJECT IntroDialog 290, 180, "Automatic Guidelines Wizard", SUB IntroDialogEventHandler
  124.     PUSHBUTTON  181, 160, 46, 14, .NextButton, "&Next >"
  125.     PUSHBUTTON  135, 160, 46, 14, .BackButton, "< &Back"
  126.     CANCELBUTTON  234, 160, 46, 14, .CancelButton
  127.     TEXT  93, 10, 181, 20, .Text1, "Welcome to the Corel Automatic Guidelines Wizard."
  128.     TEXT  94, 70, 187, 18, .Text3, "To begin creating guidelines, click Next."
  129.     IMAGE  10, 10, 75, 130, .IntroImage
  130.     GROUPBOX  10, 150, 270, 5, .LineGroupBox
  131.     TEXT  93, 28, 185, 33, .Text4, "This wizard will guide you through the steps necessary to automatically set up guidelines on your page.  You can easily create precise margins, columns, grids, or cross-hairs."
  132. END DIALOG
  133.  
  134. SUB IntroDialogEventHandler(BYVAL ControlID%, BYVAL Event%)
  135.     IF Event% = EVENT_INITIALIZATION THEN         
  136.         IntroDialog.BackButton.Enable FALSE 
  137.     ENDIF
  138.     IF Event% = EVENT_MOUSE_CLICK THEN     ' Mouse click event.
  139.         SELECT CASE ControlID%
  140.             CASE IntroDialog.NextButton.GetID()
  141.                 LastPageX& = IntroDialog.GetLeftPosition()
  142.                 LastPageY& = IntroDialog.GetTopPosition()
  143.                 IntroDialog.CloseDialog DIALOG_RETURN_NEXT%
  144.             CASE IntroDialog.CancelButton.GetID()
  145.                 IntroDialog.CloseDialog DIALOG_RETURN_CANCEL%
  146.         END SELECT
  147.     ENDIF
  148.  
  149. END FUNCTION
  150.  
  151. '/////FINISH DIALOG//////////////////////////////////////////////
  152. BEGIN DIALOG OBJECT FinishDialog 0, 0, 290, 180, "Automatic Guidelines Wizard", SUB FinishDialogEventHandler
  153.     PUSHBUTTON  181, 160, 46, 14, .FinishButton, "&Finish"
  154.     PUSHBUTTON  135, 160, 46, 14, .BackButton, "< &Back"
  155.     CANCELBUTTON  234, 160, 46, 14, .CancelButton
  156.     TEXT  93, 10, 181, 20, .Text1, "Congratulations!"
  157.     IMAGE  10, 10, 75, 130, .FinishImage
  158.     GROUPBOX  10, 150, 270, 5, .LineGroupBox
  159.     TEXT  93, 28, 185, 33, .Text4, "The Automatic Guidelines Wizard has enough information to create your guideline effect.  To apply it, press Finish."
  160. END DIALOG
  161.  
  162. SUB FinishDialogEventHandler(BYVAL ControlID%, BYVAL Event%)
  163.     IF Event% = EVENT_MOUSE_CLICK THEN     ' Mouse click event.
  164.         SELECT CASE ControlID%
  165.             CASE FinishDialog.BackButton.GetID()
  166.                 LastPageX& = FinishDialog.GetLeftPosition()
  167.                 LastPageY& = FinishDialog.GetTopPosition()
  168.                 FinishDialog.CloseDialog DIALOG_RETURN_BACK%
  169.             CASE FinishDialog.FinishButton.GetID()
  170.                 LastPageX& = FinishDialog.GetLeftPosition()
  171.                 LastPageY& = FinishDialog.GetTopPosition()
  172.                 FinishDialog.CloseDialog DIALOG_RETURN_NEXT%
  173.             CASE FinishDialog.CancelButton.GetID()
  174.                 FinishDialog.CloseDialog DIALOG_RETURN_CANCEL%
  175.         END SELECT
  176.     ENDIF
  177. END FUNCTION
  178.  
  179. '/////REMOVE DIALOG//////////////////////////////////////////////
  180.  
  181. ' Variables needed for this dialog.
  182. GLOBAL RemoveExisting AS BOOLEAN    ' Whether to remove any existing
  183.                             ' guidelines before creating new ones.
  184.  
  185. ' Set up defaults.
  186. RemoveExisting = TRUE
  187.  
  188. BEGIN DIALOG OBJECT RemoveDialog 0, 0, 290, 180, "Automatic Guidelines Wizard", SUB RemoveDialogEventHandler
  189.     PUSHBUTTON  181, 160, 46, 14, .NextButton, "&Next >"
  190.     PUSHBUTTON  135, 160, 46, 14, .BackButton, "< &Back"
  191.     CANCELBUTTON  234, 160, 46, 14, .CancelButton
  192.     TEXT  93, 10, 181, 20, .Text1, "There are already some guidelines on the current page."
  193.     IMAGE  10, 10, 75, 130, .RemoveImage
  194.     GROUPBOX  10, 150, 270, 5, .LineGroupBox
  195.     TEXT  93, 28, 185, 33, .Text4, "This wizard can remove all of your existing guidelines before it creates any new ones.  If you prefer, it can also leave your guidelines intact and just add new ones."
  196.     GROUPBOX  94, 62, 177, 54, .GroupBox2, "What do you want the wizard to do?"
  197.     OPTIONGROUP .OptionGroup1Val%
  198.         OPTIONBUTTON  109, 79, 124, 11, .RemoveOption, "Remove existing guidelines"
  199.         OPTIONBUTTON  109, 93, 124, 11, .LeaveOption, "Leave existing guidelines alone"
  200. END DIALOG
  201.  
  202. SUB RemoveDialogEventHandler(BYVAL ControlID%, BYVAL Event%)
  203.  
  204.     IF Event% = EVENT_INITIALIZATION THEN         
  205.         ' Set up the delete option button.
  206.         IF RemoveExisting THEN
  207.             RemoveDialog.RemoveOption.SetValue TRUE
  208.         ELSE
  209.             RemoveDialog.RemoveOption.SetValue TRUE
  210.         ENDIF
  211.     ENDIF
  212.     IF Event% = EVENT_MOUSE_CLICK THEN     ' Mouse click event.
  213.         SELECT CASE ControlID%
  214.             CASE RemoveDialog.RemoveOption.GetID()
  215.                 RemoveExisting = TRUE
  216.             CASE RemoveDialog.LeaveOption.GetID()
  217.                 RemoveExisting = FALSE
  218.             CASE RemoveDialog.NextButton.GetID()
  219.                 LastPageX& = RemoveDialog.GetLeftPosition()
  220.                 LastPageY& = RemoveDialog.GetTopPosition()
  221.                 RemoveDialog.CloseDialog DIALOG_RETURN_NEXT%
  222.             CASE RemoveDialog.BackButton.GetID()
  223.                 LastPageX& = RemoveDialog.GetLeftPosition()
  224.                 LastPageY& = RemoveDialog.GetTopPosition()
  225.                 RemoveDialog.CloseDialog DIALOG_RETURN_BACK%
  226.             CASE RemoveDialog.CancelButton.GetID()
  227.                 RemoveDialog.CloseDialog DIALOG_RETURN_CANCEL%
  228.         END SELECT
  229.     ENDIF
  230.  
  231. END FUNCTION
  232.  
  233. '/////STYLE DIALOG//////////////////////////////////////////////
  234.  
  235. ' The array of possible choices for non-preset guideline types.
  236. GLOBAL CONST GW_TYPE_MARGINS% = 1
  237. GLOBAL CONST GW_TYPE_GRID%    = 2
  238. GLOBAL CONST GW_TYPE_CROSS%   = 3
  239. GLOBAL ChoiceArray(3) AS STRING
  240. ChoiceArray$(GW_TYPE_MARGINS%) = "Margins and Columns"
  241. ChoiceArray$(GW_TYPE_GRID%) = "Grid"
  242. ChoiceArray$(GW_TYPE_CROSS%) = "Cross-Hairs"
  243.  
  244. ' The array of preview images.
  245. GLOBAL ChoicePreviewArray(3) AS STRING
  246. ChoicePreviewArray$(1) = "\GuideT1.bmp"
  247. ChoicePreviewArray$(2) = "\GuideT2.bmp"
  248. ChoicePreviewArray$(3) = "\GuideT3.bmp"
  249.  
  250. ' The array of possible choices for preset guideline types.
  251. GLOBAL CONST GW_PRESET_ONE_INCH_MARGINS% = 1
  252. GLOBAL CONST GW_PRESET_THREE_COLUMN_NEWSLETTER% = 2
  253. GLOBAL CONST GW_PRESET_BASIC_GRID% = 3
  254. GLOBAL CONST GW_PRESET_UPPER_LEFT_GRID% = 4
  255. GLOBAL CONST GW_PRESET_SINGLE_CROSS_HAIR% = 5
  256. GLOBAL CONST GW_PRESET_DOUBLE_STARBURST% = 6
  257. GLOBAL CONST GW_PRESET_RIGHT_CORNER_STARBURST% = 7
  258.  
  259. ' The array of possible choices for preset types.
  260. GLOBAL PresetArray(7) AS STRING
  261. PresetArray$(1) = "One Inch Margins"
  262. PresetArray$(2) = "Three Column Newsletter"
  263. PresetArray$(3) = "Basic Grid"
  264. PresetArray$(4) = "Upper Left Grid"
  265. PresetArray$(5) = "Single Cross Hair"
  266. PresetArray$(6) = "Double Starburst"
  267. PresetArray$(7) = "Right Corner Starburst"
  268.  
  269. ' The array of preview images.
  270. GLOBAL ChoicePresetArray(7) AS STRING
  271. ChoicePresetArray$(1) = "\GuideP1.bmp"
  272. ChoicePresetArray$(2) = "\GuideP2.bmp"
  273. ChoicePresetArray$(3) = "\GuideP3.bmp"
  274. ChoicePresetArray$(4) = "\GuideP4.bmp"
  275. ChoicePresetArray$(5) = "\GuideP5.bmp"
  276. ChoicePresetArray$(6) = "\GuideP6.bmp"
  277. ChoicePresetArray$(7) = "\GuideP7.bmp"
  278.  
  279. ' Variables needed for this dialog.
  280. GLOBAL ChoiceNum AS INTEGER        ' The number of the user's selection.
  281.  
  282. ' Set up defaults.
  283. ChoiceNum% = GW_TYPE_MARGINS%
  284.  
  285. ' Variables needed for this dialog.
  286. GLOBAL UsePreset AS BOOLEAN    ' Whether the user wants a preset (as opposed
  287.                         ' to creating his/her custom guideline style).
  288.  
  289. ' Set up defaults.
  290. UsePreset = FALSE
  291.  
  292. BEGIN DIALOG OBJECT StyleDialog 0, 0, 290, 180, "Automatic Guidelines Wizard", SUB StyleDialogEventHandler
  293.     PUSHBUTTON  181, 160, 46, 14, .NextButton, "&Next >"
  294.     PUSHBUTTON  135, 160, 46, 14, .BackButton, "< &Back"
  295.     CANCELBUTTON  234, 160, 46, 14, .CancelButton
  296.     TEXT  92, 43, 181, 27, .Text1, "If you prefer, you can also select from a list of pre-configured guideline styles that you do not need to customize."
  297.     IMAGE  10, 10, 75, 130, .StyleImage
  298.     GROUPBOX  10, 150, 270, 5, .LineGroupBox
  299.     GROUPBOX  94, 76, 177, 53, .GroupBox2, "What do you want to do?"
  300.     TEXT  92, 10, 181, 27, .Text2, "You can select a guideline type and then customize it.  For example, if you choose to create margin guidelines, you will be asked what size of margins to create."
  301.     OPTIONGROUP .OptionGroup1Val%
  302.         OPTIONBUTTON  109, 105, 139, 12, .PresetOption, "Choose a preset"
  303.         OPTIONBUTTON  109, 92, 139, 12, .CustomOption, "Select a customizable guideline type"
  304. END DIALOG
  305.  
  306. SUB StyleDialogEventHandler(BYVAL ControlID%, BYVAL Event%)
  307.  
  308.     IF Event% = EVENT_INITIALIZATION THEN     
  309.         ' Update the use presets option group.
  310.         IF UsePreset THEN
  311.             StyleDialog.PresetOption.SetValue 1
  312.         ELSE
  313.             StyleDialog.CustomOption.SetValue 1
  314.         ENDIF
  315.     ENDIF
  316.     IF Event% = EVENT_MOUSE_CLICK THEN     ' Mouse click event.
  317.         SELECT CASE ControlID%
  318.             CASE StyleDialog.PresetOption.GetID()
  319.                 UsePreset = TRUE
  320.             CASE StyleDialog.CustomOption.GetID()
  321.                 UsePreset = FALSE
  322.             CASE StyleDialog.NextButton.GetID()
  323.                 LastPageX& = StyleDialog.GetLeftPosition()
  324.                 LastPageY& = StyleDialog.GetTopPosition()
  325.             
  326.                 ' If the user is going from presets to non-presets, \
  327.                 ' the range for possible ChoiceNum values is much less.
  328.                 IF ChoiceNum% > 3 THEN
  329.                     ChoiceNum% = GW_TYPE_MARGINS%
  330.                 ENDIF
  331.                 StyleDialog.CloseDialog DIALOG_RETURN_NEXT%
  332.             CASE StyleDialog.BackButton.GetID()
  333.                 LastPageX& = StyleDialog.GetLeftPosition()
  334.                 LastPageY& = StyleDialog.GetTopPosition()
  335.                 StyleDialog.CloseDialog DIALOG_RETURN_BACK%
  336.             CASE StyleDialog.CancelButton.GetID()
  337.                 StyleDialog.CloseDialog DIALOG_RETURN_CANCEL%
  338.         END SELECT
  339.     ENDIF
  340.  
  341. END FUNCTION
  342.  
  343. '/////CHOICE DIALOG//////////////////////////////////////////////
  344.  
  345. BEGIN DIALOG OBJECT ChoiceDialog 0, 0, 290, 180, "Automatic Guidelines Wizard", SUB ChoiceDialogEventHandler
  346.     PUSHBUTTON  181, 160, 46, 14, .NextButton, "&Next >"
  347.     PUSHBUTTON  135, 160, 46, 14, .BackButton, "< &Back"
  348.     CANCELBUTTON  234, 160, 46, 14, .CancelButton
  349.     IMAGE  10, 10, 75, 130, .ChoiceImage
  350.     GROUPBOX  10, 150, 270, 5, .LineGroupBox
  351.     TEXT  93, 10, 181, 14, .SelectionText, "Please select XXXXXXXXXX"
  352.     DDLISTBOX  127, 27, 113, 151, .SelectionListBox
  353.     IMAGE  136, 52, 95, 87, .PreviewImage
  354. END DIALOG
  355.  
  356. SUB ChoiceDialogEventHandler(BYVAL ControlID%, BYVAL Event%)
  357.  
  358.     IF Event% = EVENT_INITIALIZATION THEN     
  359.         ChoiceDialog.PreviewImage.SetStyle STYLE_SUNKEN
  360.         ChoiceDialog.PreviewImage.SetStyle STYLE_IMAGE_CENTERED
  361.         ChoiceDialog.PreviewImage.SetStyle STYLE_SUNKEN
  362.         ChoiceDialog.PreviewImage.SetStyle STYLE_IMAGE_CENTERED
  363.  
  364.         ' Load the list box with the available choices.
  365.         IF UsePreset THEN
  366.             ChoiceDialog.SelectionText.SetText "Please select a preset guideline style."
  367.             ChoiceDialog.SelectionListBox.SetArray PresetArray$
  368.             ChoiceDialog.SelectionListBox.SetSelect 1
  369.             ChoiceNum% = 1
  370.         ELSE
  371.             ChoiceDialog.SelectionText.SetText "Please select a guideline type."
  372.             ChoiceDialog.SelectionListBox.SetArray ChoiceArray$
  373.             ChoiceDialog.SelectionListBox.SetSelect ChoiceNum%
  374.         ENDIF
  375.         UpdatePreviewImage ChoiceNum%, UsePreset
  376.     ENDIF
  377.     IF Event% = EVENT_MOUSE_CLICK THEN     ' Mouse click event.
  378.         SELECT CASE ControlID%
  379.             CASE ChoiceDialog.SelectionListBox.GetID()
  380.                 ChoiceNum% = ChoiceDialog.SelectionListBox.GetSelect()
  381.                 UpdatePreviewImage ChoiceNum%, UsePreset
  382.             CASE ChoiceDialog.NextButton.GetID()
  383.                 LastPageX& = ChoiceDialog.GetLeftPosition()
  384.                 LastPageY& = ChoiceDialog.GetTopPosition()
  385.                 ChoiceDialog.CloseDialog DIALOG_RETURN_NEXT%
  386.             CASE ChoiceDialog.BackButton.GetID()
  387.                 LastPageX& = ChoiceDialog.GetLeftPosition()
  388.                 LastPageY& = ChoiceDialog.GetTopPosition()
  389.                 ChoiceDialog.CloseDialog DIALOG_RETURN_BACK%
  390.             CASE ChoiceDialog.CancelButton.GetID()
  391.                 ChoiceDialog.CloseDialog DIALOG_RETURN_CANCEL%
  392.         END SELECT
  393.     ENDIF
  394.  
  395. END FUNCTION
  396.  
  397. '********************************************************************
  398. '
  399. '    Name:    UpdatePreviewImage (dialog subroutine)
  400. '
  401. '    Action:    Changes the image on the choice dialog to reflect
  402. '            the user's current choice of guideline types or
  403. '              presets.
  404. '
  405. '    Params:    InChoiceNum - The index number of the user's choice.
  406. '            InUsePreset - Whether the user selected from the preset list.
  407. '
  408. '    Returns:    None.
  409. '
  410. '    Comments:    None.
  411. '
  412. '********************************************************************
  413. SUB UpdatePreviewImage ( InChoiceNum AS INTEGER, InUsePreset AS BOOLEAN )
  414.  
  415.     IF InUsePreset THEN
  416.         
  417.         ChoiceDialog.PreviewImage.SetImage \\
  418.             CurDir$ + ChoicePresetArray$(InChoiceNum%)
  419.         
  420.     ELSE
  421.     
  422.         ChoiceDialog.PreviewImage.SetImage \\
  423.               CurDir$ + ChoicePreviewArray$(InChoiceNum%)
  424.         
  425.     ENDIF
  426.  
  427.     ' Add a sunken, centred look to the preview image.
  428.     ChoiceDialog.PreviewImage.SetStyle STYLE_SUNKEN
  429.     ChoiceDialog.PreviewImage.SetStyle STYLE_IMAGE_CENTERED
  430.     ChoiceDialog.PreviewImage.SetStyle STYLE_SUNKEN
  431.     ChoiceDialog.PreviewImage.SetStyle STYLE_IMAGE_CENTERED
  432.     
  433. END SUB
  434.  
  435. '/////ANGLE DIALOG//////////////////////////////////////////////
  436.  
  437. ' Variables needed for this dialog.
  438. GLOBAL ChosenAngle AS INTEGER        ' The angle in degress of the
  439.                             ' guidelines.
  440. GLOBAL NumSpokes AS INTEGER        ' The number of spokes for a cross-hair
  441.                             ' guideline style.
  442.  
  443. ' Set up defaults.
  444. ChosenAngle% = 0
  445. NumSpokes% = 2
  446.  
  447. BEGIN DIALOG OBJECT AngleDialog 0, 0, 290, 180, "Automatic Guidelines Wizard", SUB AngleDialogEventHandler
  448.     PUSHBUTTON  181, 160, 46, 14, .NextButton, "&Next >"
  449.     PUSHBUTTON  135, 160, 46, 14, .BackButton, "< &Back"
  450.     CANCELBUTTON  234, 160, 46, 14, .CancelButton
  451.     IMAGE  10, 10, 75, 130, .AngleImage
  452.     GROUPBOX  10, 150, 270, 5, .LineGroupBox
  453.     TEXT  166, 27, 38, 10, .Text3, "Degrees"
  454.     SPINCONTROL  130, 25, 31, 13, .AngleSpin
  455.     TEXT  93, 10, 181, 10, .AngleText, "If you wish, you can generate a rotated "
  456.     TEXT  93, 27, 35, 11, .Text1, "Rotate by:"
  457.     TEXT  96, 51, 180, 27, .SpokesText1, "You can also choose the number of lines through each of your cross-hairs.  The default will give you a simple cross, while larger numbers will give you a starburst effect."
  458.     TEXT  96, 84, 79, 12, .SpokesText2, "Number of lines:"
  459.     SPINCONTROL  152, 83, 27, 13, .SpokesSpin
  460. END DIALOG
  461.  
  462. SUB AngleDialogEventHandler(BYVAL ControlID%, BYVAL Event%)
  463.  
  464.     DIM MsgReturn AS LONG    ' The return value of MESSAGEBOX calls.
  465.  
  466.     IF Event% = EVENT_INITIALIZATION THEN     
  467.         ' Depending on the type of guidelines being generated, update
  468.         ' the AngleText.
  469.         SELECT CASE ChoiceNum%
  470.             CASE GW_TYPE_GRID%
  471.                 AngleDialog.AngleText.SetText \\
  472.                     "If you wish, you can generate a rotated grid."
  473.                 AngleDialog.SpokesText1.SetStyle STYLE_INVISIBLE
  474.                 AngleDialog.SpokesText2.SetStyle STYLE_INVISIBLE
  475.                 AngleDialog.SpokesSpin.SetStyle STYLE_INVISIBLE
  476.             CASE GW_TYPE_CROSS%
  477.                 AngleDialog.AngleText.SetText \\
  478.                     "If you wish, you can generate a rotated set of cross-hairs."
  479.                 AngleDialog.SpokesText1.SetStyle STYLE_VISIBLE
  480.                 AngleDialog.SpokesText2.SetStyle STYLE_VISIBLE
  481.                 AngleDialog.SpokesSpin.SetStyle STYLE_VISIBLE
  482.         END SELECT
  483.  
  484.         ' Update the angle spin control.
  485.         AngleDialog.AngleSpin.SetValue ChosenAngle%
  486.         
  487.         ' Update the spokes control.
  488.         AngleDialog.SpokesSpin.SetValue NumSpokes%
  489.     ENDIF
  490.     IF Event% = EVENT_MOUSE_CLICK THEN     ' Mouse click event.
  491.         SELECT CASE ControlID%
  492.             CASE AngleDialog.AngleSpin.GetID()
  493.                 ChosenAngle% = AngleDialog.AngleSpin.GetValue()
  494.             CASE AngleDialog.NextButton.GetID()
  495.                 LastPageX& = AngleDialog.GetLeftPosition()
  496.                 LastPageY& = AngleDialog.GetTopPosition()
  497.                 AngleDialog.CloseDialog DIALOG_RETURN_NEXT%
  498.             CASE AngleDialog.BackButton.GetID()
  499.                 LastPageX& = AngleDialog.GetLeftPosition()
  500.                 LastPageY& = AngleDialog.GetTopPosition()
  501.                 AngleDialog.CloseDialog DIALOG_RETURN_BACK%
  502.             CASE AngleDialog.CancelButton.GetID()
  503.                 AngleDialog.CloseDialog DIALOG_RETURN_CANCEL%
  504.         END SELECT
  505.     ENDIF
  506.     IF Event% = EVENT_CHANGE_IN_CONTENT& THEN
  507.         SELECT CASE ControlID%
  508.             CASE AngleDialog.AngleSpin.GetID()
  509.                 IF AngleDialog.AngleSpin.GetValue() < -180 THEN
  510.                     MsgReturn& = MESSAGEBOX("Please select an angle between -180 and 180 degrees.", \\
  511.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  512.                     ChosenAngle% = -180
  513.                     AngleDialog.AngleSpin.SetValue ChosenAngle%
  514.                 ELSEIF AngleDialog.AngleSpin.GetValue() > 180 THEN
  515.                     MsgReturn& = MESSAGEBOX("Please select an angle between -180 and 180 degrees.", \\
  516.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  517.                     ChosenAngle% = 180
  518.                     AngleDialog.AngleSpin.SetValue ChosenAngle%
  519.                 ELSE
  520.                     ChosenAngle% = AngleDialog.AngleSpin.GetValue()
  521.                 ENDIF
  522.             CASE AngleDialog.SpokesSpin.GetID()
  523.                 IF AngleDialog.SpokesSpin.GetValue() < 2 THEN
  524.                     MsgReturn& = MESSAGEBOX("Please select a number of spokes between 2 and 30.", \\
  525.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  526.                     NumSpokes% = 2
  527.                     AngleDialog.SpokesSpin.SetValue NumSpokes%
  528.                 ELSEIF AngleDialog.SpokesSpin.GetValue() > 30 THEN
  529.                     MsgReturn& = MESSAGEBOX("Please select a number of spokes between 2 and 30.", \\
  530.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  531.                     NumSpokes% = 30
  532.                     AngleDialog.SpokesSpin.SetValue NumSpokes%
  533.                 ELSE
  534.                     NumSpokes% = AngleDialog.SpokesSpin.GetValue()
  535.                 ENDIF                
  536.         END SELECT
  537.     ENDIF
  538.  
  539. END FUNCTION
  540.  
  541. '/////GRIDFREQ DIALOG//////////////////////////////////////////////
  542.  
  543. ' Variables needed for this dialog.
  544. GLOBAL NumVGuidelines AS LONG      ' The number of vertical guidelines.
  545. GLOBAL NumHGuidelines AS LONG   ' The number of horizontal guidelines.
  546. GLOBAL VGuidelinesOn AS BOOLEAN ' Whether vertical guidelines are turned on.
  547. GLOBAL HGuidelinesOn AS BOOLEAN ' Whether horizontal guidelines are turned on.
  548.  
  549. ' Set up defaults.
  550. NumVGuidelines& = 10
  551. NumHGuidelines& = 10
  552. VGuidelinesOn = TRUE
  553. HGuidelinesOn = TRUE
  554.  
  555. BEGIN DIALOG OBJECT GridFreqDialog 0, 0, 290, 180, "Automatic Guidelines Wizard", SUB GridFreqDialogEventHandler
  556.     PUSHBUTTON  181, 160, 46, 14, .NextButton, "&Next >"
  557.     PUSHBUTTON  135, 160, 46, 14, .BackButton, "< &Back"
  558.     CANCELBUTTON  234, 160, 46, 14, .CancelButton
  559.     IMAGE  10, 10, 75, 130, .GridFreqImage
  560.     GROUPBOX  10, 150, 270, 5, .LineGroupBox
  561.     TEXT  93, 10, 181, 18, .AngleText, "Please choose the number of horizontal and vertical lines you want in your grid."
  562.     SPINCONTROL  136, 47, 27, 13, .HorizSpin
  563.     GROUPBOX  95, 34, 184, 50, .GroupBox3, "Horizontal"
  564.     OPTIONGROUP .OptionGroup1Val%
  565.         OPTIONBUTTON  106, 64, 137, 13, .HorizOff, "Do not include any horizontal grid lines"
  566.         OPTIONBUTTON  106, 47, 27, 13, .HorizOn, "Use "
  567.     OPTIONGROUP .OptionGroup2Val%
  568.         OPTIONBUTTON  106, 120, 137, 13, .VertOff, "Do not include any vertical grid lines"
  569.         OPTIONBUTTON  106, 103, 27, 13, .VertOn, "Use "
  570.     TEXT  168, 49, 86, 13, .HorizFreqText, "lines XXX inches apart"
  571.     SPINCONTROL  136, 103, 27, 13, .VertSpin
  572.     GROUPBOX  95, 90, 184, 50, .GroupBox4, "Vertical"
  573.     TEXT  168, 105, 86, 12, .VertFreqText, "lines XXX inches apart"
  574. END DIALOG
  575.  
  576. SUB GridFreqDialogEventHandler(BYVAL ControlID%, BYVAL Event%)
  577.  
  578.     DIM CurVValue AS LONG
  579.     DIM CurHValue AS LONG
  580.     DIM MsgReturn AS LONG
  581.     
  582.     IF Event% = EVENT_INITIALIZATION THEN     
  583.         UpdateGridFreqControls
  584.     ENDIF
  585.     IF Event% = EVENT_MOUSE_CLICK THEN     ' Mouse click event.
  586.         SELECT CASE ControlID%
  587.             CASE GridFreqDialog.HorizOn.GetID()
  588.                 HGuidelinesOn = TRUE
  589.                 UpdateGridFreqControls
  590.             CASE GridFreqDialog.HorizOff.GetID()
  591.                 HGuidelinesOn = FALSE
  592.                 UpdateGridFreqControls
  593.             CASE GridFreqDialog.VertOn.GetID()
  594.                 VGuidelinesOn = TRUE
  595.                 UpdateGridFreqControls
  596.             CASE GridFreqDialog.VertOff.GetID()
  597.                 VGuidelinesOn = FALSE
  598.                 UpdateGridFreqControls
  599.             CASE GridFreqDialog.NextButton.GetID()
  600.                 LastPageX& = GridFreqDialog.GetLeftPosition()
  601.                 LastPageY& = GridFreqDialog.GetTopPosition()
  602.                 GridFreqDialog.CloseDialog DIALOG_RETURN_NEXT%
  603.             CASE GridFreqDialog.BackButton.GetID()
  604.                 LastPageX& = GridFreqDialog.GetLeftPosition()
  605.                 LastPageY& = GridFreqDialog.GetTopPosition()
  606.                 GridFreqDialog.CloseDialog DIALOG_RETURN_BACK%
  607.             CASE GridFreqDialog.CancelButton.GetID()
  608.                 GridFreqDialog.CloseDialog DIALOG_RETURN_CANCEL%
  609.         END SELECT
  610.     ELSEIF Event% = EVENT_CHANGE_IN_CONTENT& THEN
  611.         SELECT CASE ControlID%
  612.             CASE GridFreqDialog.VertSpin.GetID()
  613.                 CurVValue& = GridFreqDialog.VertSpin.GetValue()
  614.                 IF (CurVValue& < 2) THEN
  615.                     MsgReturn& = MESSAGEBOX("Please enter a number of vertical lines between 2 and 50.", \\
  616.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  617.                     NumVGuidelines& = 2
  618.                     GridFreqDialog.VertSpin.SetValue NumVGuidelines&
  619.                 ELSEIF (CurVValue& > 50) THEN
  620.                     MsgReturn& = MESSAGEBOX("Please enter a number of vertical lines between 2 and 50.", \\
  621.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  622.                     NumVGuidelines& = 50
  623.                     GridFreqDialog.VertSpin.SetValue NumVGuidelines&
  624.                 ELSE
  625.                     NumVGuidelines& = CurVValue&    
  626.                 ENDIF                
  627.             CASE GridFreqDialog.HorizSpin.GetID()
  628.                 CurHValue& = GridFreqDialog.HorizSpin.GetValue()
  629.                 IF (CurHValue& < 2) THEN
  630.                     MsgReturn& = MESSAGEBOX("Please enter a number of horizontal lines between 2 and 50.", \\
  631.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  632.                     NumHGuidelines& = 2
  633.                     GridFreqDialog.HorizSpin.SetValue NumHGuidelines&
  634.                 ELSEIF (CurHValue& > 50) THEN
  635.                     MsgReturn& = MESSAGEBOX("Please enter a number of horizontal lines between 2 and 50.", \\
  636.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  637.                     NumHGuidelines& = 50
  638.                     GridFreqDialog.HorizSpin.SetValue NumHGuidelines&
  639.                 ELSE
  640.                     NumHGuidelines& = CurHValue&
  641.                 ENDIF    
  642.         END SELECT
  643.     ENDIF
  644.  
  645. END FUNCTION
  646.  
  647. '********************************************************************
  648. '
  649. '    Name:    UpdateGridFreqControls (dialog subroutine)
  650. '
  651. '    Action:    Updates and enables/disables all the appropriate
  652. '            controls on GridFreqDialog based on the values of
  653. '              NumVGuidelines, NumHGuidelines, VGuidelinesOn,
  654. '            HGuidelinesOn.
  655. '
  656. '    Params:    None.
  657. '
  658. '    Returns:    None.
  659. '
  660. '    Comments:    None.
  661. '
  662. '********************************************************************
  663. SUB UpdateGridFreqControls()
  664.  
  665.     ' Update the frequencies.
  666.     GridFreqDialog.HorizSpin.SetValue NumHGuidelines&
  667.     GridFreqDialog.HorizFreqText.SetText "lines " + \\
  668.          CalculateDistanceApart(NumHGuidelines&, CalculateWidthAfterMargins()) + " inches apart"
  669.     GridFreqDialog.VertSpin.SetValue NumVGuidelines&
  670.     GridFreqDialog.VertFreqText.SetText "lines " + \\
  671.          CalculateDistanceApart(NumVGuidelines&, CalculateHeightAfterMargins()) + " inches apart"
  672.  
  673.     ' Update which controls are active.
  674.     IF HGuidelinesOn THEN
  675.         GridFreqDialog.HorizSpin.Enable TRUE
  676.         GridFreqDialog.HorizOn.SetValue 1
  677.     ELSE
  678.         GridFreqDialog.HorizSpin.Enable FALSE
  679.         GridFreqDialog.HorizOff.SetValue 1
  680.     ENDIF
  681.     IF VGuidelinesOn THEN
  682.         GridFreqDialog.VertSpin.Enable TRUE
  683.         GridFreqDialog.VertOn.SetValue 1
  684.     ELSE
  685.         GridFreqDialog.VertSpin.Enable FALSE
  686.         GridFreqDialog.VertOff.SetValue 1
  687.     ENDIF
  688.  
  689.     ' Update the angle spin control.
  690.     AngleDialog.AngleSpin.SetValue ChosenAngle%
  691.  
  692. END SUB
  693.  
  694. '/////LOCK DIALOG//////////////////////////////////////////////
  695.  
  696. ' Variables needed for this dialog.
  697. GLOBAL LockGuidelines AS BOOLEAN    ' Whether the created guidelines should be locked.
  698.  
  699. ' Set up defaults.
  700. LockGuidelines = FALSE
  701.  
  702. BEGIN DIALOG OBJECT LockDialog 0, 0, 290, 180, "Automatic Guidelines Wizard", SUB LockDialogEventHandler
  703.     PUSHBUTTON  181, 160, 46, 14, .NextButton, "&Next >"
  704.     PUSHBUTTON  135, 160, 46, 14, .BackButton, "< &Back"
  705.     CANCELBUTTON  234, 160, 46, 14, .CancelButton
  706.     IMAGE  10, 10, 75, 130, .LockImage
  707.     GROUPBOX  10, 150, 270, 5, .LineGroupBox
  708.     TEXT  93, 11, 185, 33, .Text4, "When this wizard creates new guidelines, it can automatically lock them so that they cannot be accidentally moved."
  709.     GROUPBOX  94, 43, 177, 54, .GroupBox2, "What do you want the wizard to do?"
  710.     OPTIONGROUP .OptionGroup1Val%
  711.         OPTIONBUTTON  109, 60, 124, 11, .LockOption, "Lock new guidelines"
  712.         OPTIONBUTTON  109, 75, 124, 11, .UnlockOption, "Leave new guidelines unlocked"
  713. END DIALOG
  714.  
  715. SUB LockDialogEventHandler(BYVAL ControlID%, BYVAL Event%)
  716.  
  717.     IF Event% = EVENT_INITIALIZATION THEN         
  718.         ' Set up the lock guidelines button.
  719.         IF LockGuidelines THEN
  720.             LockDialog.LockOption.SetValue 1
  721.         ELSE
  722.             LockDialog.UnlockOption.SetValue 1
  723.         ENDIF
  724.     ENDIF
  725.     IF Event% = EVENT_MOUSE_CLICK THEN     ' Mouse click event.
  726.         SELECT CASE ControlID%
  727.             CASE LockDialog.LockOption.GetID()
  728.                 LockGuidelines = TRUE
  729.             CASE LockDialog.UnlockOption.GetID()
  730.                 LockGuidelines = FALSE
  731.             CASE LockDialog.NextButton.GetID()
  732.                 LastPageX& = LockDialog.GetLeftPosition()
  733.                 LastPageY& = LockDialog.GetTopPosition()
  734.                 LockDialog.CloseDialog DIALOG_RETURN_NEXT%
  735.             CASE LockDialog.BackButton.GetID()
  736.                 LastPageX& = LockDialog.GetLeftPosition()
  737.                 LastPageY& = LockDialog.GetTopPosition()
  738.                 LockDialog.CloseDialog DIALOG_RETURN_BACK%
  739.             CASE LockDialog.CancelButton.GetID()
  740.                 LockDialog.CloseDialog DIALOG_RETURN_CANCEL%
  741.         END SELECT
  742.     ENDIF
  743.  
  744. END FUNCTION
  745.  
  746. '/////MARGINS DIALOG//////////////////////////////////////////////
  747.  
  748. ' The array of possible units the user may select from.
  749. GLOBAL UnitsArray(7) AS STRING
  750. GLOBAL CONST GW_UNIT_1_INCH% = 1
  751. GLOBAL CONST GW_UNIT_01_INCH% = 2
  752. GLOBAL CONST GW_UNIT_136_INCH% = 3
  753. GLOBAL CONST GW_UNIT_0001_INCH% = 4
  754. GLOBAL CONST GW_UNIT_1_CM% = 5
  755. GLOBAL CONST GW_UNIT_0001_CM% = 6
  756. GLOBAL CONST GW_UNIT_1_PT% = 7
  757. UnitsArray(GW_UNIT_1_INCH%) = "1 in."
  758. UnitsArray(GW_UNIT_01_INCH%) = "0.1 in."
  759. UnitsArray(GW_UNIT_136_INCH%) = "1/36 in."
  760. UnitsArray(GW_UNIT_0001_INCH%) = "0.001 in."
  761. UnitsArray(GW_UNIT_1_CM%) = "1 cm."
  762. UnitsArray(GW_UNIT_0001_CM%) = "0.001 cm."
  763. UnitsArray(GW_UNIT_1_PT%) = "1 pt."
  764.  
  765. ' Variables needed for this dialog.
  766. GLOBAL TopMargin AS LONG
  767. GLOBAL TopUnit AS INTEGER
  768. GLOBAL BottomMargin AS LONG
  769. GLOBAL BottomUnit AS INTEGER
  770. GLOBAL LeftMargin AS LONG
  771. GLOBAL LeftUnit AS INTEGER
  772. GLOBAL RightMargin AS LONG
  773. GLOBAL RightUnit AS INTEGER
  774. GLOBAL MirrorOn AS LONG    ' Whether top/bottom and left/right values are
  775.                     ' being mirrored.
  776.  
  777. ' Set up defaults.
  778. MirrorOn = TRUE
  779. TopMargin& = 10
  780. TopUnit% = 2
  781. BottomMargin& = 10
  782. BottomUnit% = 2
  783. LeftMargin& = 10
  784. LeftUnit% = 2
  785. RightMargin& = 10
  786. RightUnit% = 2
  787.  
  788. BEGIN DIALOG OBJECT MarginsDialog 0, 0, 290, 180, "Automatic Guidelines Wizard", SUB MarginsDialogEventHandler
  789.     PUSHBUTTON  180, 160, 46, 14, .NextButton, "&Next >"
  790.     PUSHBUTTON  134, 160, 46, 14, .BackButton, "< &Back"
  791.     CANCELBUTTON  233, 160, 46, 14, .CancelButton
  792.     IMAGE  10, 10, 75, 130, .MarginsImage
  793.     GROUPBOX  10, 150, 270, 5, .LineGroupBox
  794.     TEXT  93, 11, 185, 20, .IntroText, ""
  795.     GROUPBOX  101, 35, 160, 105, .MarginGroup, "Margins"
  796.     CHECKBOX  116, 122, 56, 11, .MirrorCheck, "Mirror margins"
  797.     TEXT  116, 51, 15, 12, .TopText, "Top:"
  798.     SPINCONTROL  148, 49, 33, 13, .TopSpin
  799.     TEXT  184, 51, 5, 10, .TopX, "x"
  800.     DDLISTBOX  191, 49, 52, 85, .TopListBox
  801.     SPINCONTROL  148, 67, 33, 13, .BottomSpin
  802.     DDLISTBOX  191, 67, 52, 85, .BottomListBox
  803.     TEXT  184, 69, 5, 10, .BottomX, "x"
  804.     TEXT  116, 69, 26, 12, .BottomText, "Bottom:"
  805.     SPINCONTROL  148, 85, 33, 13, .LeftSpin
  806.     DDLISTBOX  191, 85, 52, 85, .LeftListBox
  807.     TEXT  184, 87, 5, 10, .LeftX, "x"
  808.     TEXT  116, 87, 26, 12, .LeftText, "Left:"
  809.     TEXT  116, 106, 26, 12, .RightText, "Right:"
  810.     SPINCONTROL  148, 104, 33, 13, .RightSpin
  811.     TEXT  184, 106, 5, 10, .RightX, "x"
  812.     DDLISTBOX  191, 104, 52, 85, .RightListBox
  813. END DIALOG
  814.  
  815. SUB MarginsDialogEventHandler(BYVAL ControlID%, BYVAL Event%)
  816.  
  817.     DIM MsgReturn AS LONG    ' The return value of the messagebox.
  818.  
  819.     IF Event% = EVENT_INITIALIZATION THEN         
  820.         ' Set up all the controls.
  821.         MarginsDialog.MirrorCheck.SetThreeState FALSE
  822.         MarginsDialog.TopListBox.SetArray UnitsArray$
  823.         MarginsDialog.BottomListBox.SetArray UnitsArray$
  824.         MarginsDialog.LeftListBox.SetArray UnitsArray$
  825.         MarginsDialog.RightListBox.SetArray UnitsArray$
  826.         UpdateMarginControls
  827.     ENDIF
  828.     IF Event% = EVENT_MOUSE_CLICK THEN     ' Mouse click event.
  829.         SELECT CASE ControlID%
  830.             CASE MarginsDialog.MirrorCheck.GetID()
  831.                 IF (MarginsDialog.MirrorCheck.GetValue() = 1) THEN
  832.                     MirrorOn = TRUE
  833.                     BottomMargin& = MarginsDialog.TopSpin.GetValue()
  834.                     BottomUnit% = MarginsDialog.TopListbox.GetSelect()
  835.                     RightMargin& = MarginsDialog.LeftSpin.GetValue()
  836.                     RightUnit% = MarginsDialog.LeftListbox.GetSelect()
  837.                 ELSE
  838.                     MirrorOn = FALSE
  839.                 ENDIF
  840.                 UpdateMarginControls
  841.             CASE MarginsDialog.TopListbox.GetID()
  842.                 TopUnit% = MarginsDialog.TopListbox.GetSelect()
  843.                 IF MirrorOn THEN
  844.                     BottomUnit% = MarginsDialog.TopListbox.GetSelect()
  845.                     MarginsDialog.BottomListbox.SetSelect BottomUnit%
  846.                 ENDIF
  847.             CASE MarginsDialog.BottomListbox.GetID()
  848.                 BottomUnit% = MarginsDialog.BottomListbox.GetSelect()
  849.             CASE MarginsDialog.LeftListbox.GetID()
  850.                 LeftUnit% = MarginsDialog.LeftListbox.GetSelect()
  851.                 IF MirrorOn THEN
  852.                     RightUnit% = MarginsDialog.LeftListbox.GetSelect()
  853.                     MarginsDialog.RightListbox.SetSelect RightUnit%
  854.                 ENDIF
  855.             CASE MarginsDialog.RightListbox.GetID()
  856.                 RightUnit% = MarginsDialog.RightListbox.GetSelect()
  857.             CASE MarginsDialog.NextButton.GetID()
  858.                 LastPageX& = MarginsDialog.GetLeftPosition()
  859.                 LastPageY& = MarginsDialog.GetTopPosition()
  860.                 IF (CalculateWidthAfterMargins() <= 0) THEN
  861.                     ' These margins are too wide.
  862.                     MsgReturn& = MESSAGEBOX( "The left and right margins you selected are too wide." + NL2 + \\
  863.                                              "Remember, your page is only " + CSTR(TOINCHES(AvailableX&)) + \\
  864.                                              " inches wide.  Please try again.", TITLE_ERRORBOX$, MB_OK_ONLY )
  865.                 ELSEIF (CalculateHeightAfterMargins() <= 0) THEN
  866.                     ' These margins are too large on the top and bottom.
  867.                     MsgReturn& = MESSAGEBOX( "The top and bottom margins you selected are too wide." + NL2 + \\
  868.                                              "Remember, your page is only " + CSTR(TOINCHES(AvailableY&)) + \\
  869.                                              " inches high.  Please try again.", TITLE_ERRORBOX$, MB_OK_ONLY )                    
  870.                 ELSE
  871.                     MarginsDialog.CloseDialog DIALOG_RETURN_NEXT%
  872.                 ENDIF
  873.             CASE MarginsDialog.BackButton.GetID()
  874.                 LastPageX& = MarginsDialog.GetLeftPosition()
  875.                 LastPageY& = MarginsDialog.GetTopPosition()
  876.                 MarginsDialog.CloseDialog DIALOG_RETURN_BACK%
  877.             CASE MarginsDialog.CancelButton.GetID()
  878.                 MarginsDialog.CloseDialog DIALOG_RETURN_CANCEL%
  879.         END SELECT
  880.     
  881.     ELSEIF Event% = EVENT_CHANGE_IN_CONTENT& THEN
  882.         SELECT CASE ControlID%
  883.             CASE MarginsDialog.TopSpin.GetID()
  884.                 IF (MarginsDialog.TopSpin.GetValue() < 0) THEN
  885.                     MsgReturn& = MESSAGEBOX("Please enter a top margin size between 0 and 999.", \\
  886.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  887.                     TopMargin& = 0
  888.                     MarginsDialog.TopSpin.SetValue 0
  889.                 ELSEIF (MarginsDialog.TopSpin.GetValue() > 999) THEN
  890.                     MsgReturn& = MESSAGEBOX("Please enter a top margin size between 0 and 999.", \\
  891.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  892.                     TopMargin& = 999
  893.                     MarginsDialog.TopSpin.SetValue 999
  894.                 ELSE 
  895.                     TopMargin& = MarginsDialog.TopSpin.GetValue()
  896.                 ENDIF
  897.                 IF MirrorOn THEN
  898.                     BottomMargin& = MarginsDialog.TopSpin.GetValue()
  899.                     MarginsDialog.BottomSpin.SetValue BottomMargin&
  900.                 ENDIF
  901.             CASE MarginsDialog.BottomSpin.GetID()
  902.                 IF (MarginsDialog.BottomSpin.GetValue() < 0) THEN
  903.                     MsgReturn& = MESSAGEBOX("Please enter a bottom margin size between 0 and 999.", \\
  904.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  905.                     BottomMargin& = 0
  906.                     MarginsDialog.BottomSpin.SetValue 0
  907.                 ELSEIF (MarginsDialog.BottomSpin.GetValue() > 999) THEN
  908.                     MsgReturn& = MESSAGEBOX("Please enter a bottom margin size between 0 and 999.", \\
  909.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  910.                     BottomMargin& = 999
  911.                     MarginsDialog.BottomSpin.SetValue 999
  912.                 ELSE 
  913.                     BottomMargin& = MarginsDialog.BottomSpin.GetValue()
  914.                 ENDIF
  915.             CASE MarginsDialog.LeftSpin.GetID()
  916.                 IF (MarginsDialog.LeftSpin.GetValue() < 0) THEN
  917.                     MsgReturn& = MESSAGEBOX("Please enter a left margin size between 0 and 999.", \\
  918.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  919.                     LeftMargin& = 0
  920.                     MarginsDialog.LeftSpin.SetValue 0
  921.                 ELSEIF (MarginsDialog.LeftSpin.GetValue() > 999) THEN
  922.                     MsgReturn& = MESSAGEBOX("Please enter a left margin size between 0 and 999.", \\
  923.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)        
  924.                     LeftMargin& = 999
  925.                     MarginsDialog.LeftSpin.SetValue 999
  926.                 ELSE 
  927.                     LeftMargin& = MarginsDialog.LeftSpin.GetValue()
  928.                 ENDIF
  929.                 IF MirrorOn THEN
  930.                     RightMargin& = MarginsDialog.LeftSpin.GetValue()
  931.                     MarginsDialog.RightSpin.SetValue RightMargin&
  932.                 ENDIF
  933.             CASE MarginsDialog.RightSpin.GetID()
  934.                 IF (MarginsDialog.RightSpin.GetValue() < 0) THEN
  935.                     MsgReturn& = MESSAGEBOX("Please enter a right margin size between 0 and 999.", \\
  936.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  937.                     RightMargin& = 0
  938.                     MarginsDialog.RightSpin.SetValue 0
  939.                 ELSEIF (MarginsDialog.RightSpin.GetValue() > 999) THEN
  940.                     MsgReturn& = MESSAGEBOX("Please enter a right margin size between 0 and 999.", \\
  941.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)            
  942.                     RightMargin& = 999
  943.                     MarginsDialog.RightSpin.SetValue 999
  944.                 ELSE 
  945.                     RightMargin& = MarginsDialog.RightSpin.GetValue()
  946.                 ENDIF
  947.             CASE MarginsDialog.MirrorCheck.GetID()
  948.                 IF MarginsDialog.MirrorCheck.GetValue() THEN
  949.                     MirrorOn = TRUE
  950.                 ELSE
  951.                     MirrorOn = FALSE
  952.                 ENDIF
  953.                 UpdateMarginControls
  954.         END SELECT
  955.     ENDIF
  956.  
  957. END FUNCTION
  958.  
  959. '********************************************************************
  960. '
  961. '    Name:    UpdateMarginControls (dialog subroutine)
  962. '
  963. '    Action:    Updates and enables/disables all the appropriate
  964. '            controls on MarginsDialog based on the values of
  965. '              the global dialog variables.
  966. '
  967. '    Params:    None.
  968. '
  969. '    Returns:    None.
  970. '
  971. '    Comments:    None.
  972. '
  973. '********************************************************************
  974. SUB UpdateMarginControls()
  975.  
  976.     ' Depending on the type of guidelines the user is making,
  977.     ' we need to change the intro text.
  978.     SELECT CASE ChoiceNum%
  979.         CASE GW_TYPE_MARGINS%
  980.             MarginsDialog.IntroText.SetText "Please select page margins."
  981.         CASE GW_TYPE_GRID%
  982.             MarginsDialog.IntroText.SetText "If you do not want your grid " + \\
  983.                                       "to occupy your whole page, you can add margins."
  984.         CASE GW_TYPE_CROSS%
  985.             ' Do nothing.
  986.     END SELECT
  987.  
  988.     ' Update all controls with the current values. 
  989.     MarginsDialog.TopSpin.SetValue TopMargin&
  990.     MarginsDialog.BottomSpin.SetValue BottomMargin&
  991.     MarginsDialog.LeftSpin.SetValue LeftMargin&
  992.     MarginsDialog.RightSpin.SetValue RightMargin&
  993.     MarginsDialog.TopListbox.SetSelect TopUnit%
  994.     MarginsDialog.BottomListbox.SetSelect BottomUnit%
  995.     MarginsDialog.LeftListbox.SetSelect LeftUnit%
  996.     MarginsDialog.RightListbox.SetSelect RightUnit%
  997.     IF MirrorOn THEN
  998.         MarginsDialog.MirrorCheck.SetValue 1
  999.     ELSE
  1000.         MarginsDialog.MirrorCheck.SetValue 0
  1001.     ENDIF
  1002.     
  1003.     ' Depending whether mirroring is on, we need to disable various
  1004.     ' controls.
  1005.     MarginsDialog.BottomSpin.Enable (NOT MirrorOn)
  1006.     MarginsDialog.BottomListbox.Enable (NOT MirrorOn)
  1007.     MarginsDialog.BottomX.Enable (NOT MirrorOn)
  1008.     MarginsDialog.BottomText.Enable (NOT MirrorOn)
  1009.     MarginsDialog.RightSpin.Enable (NOT MirrorOn)
  1010.     MarginsDialog.RightListbox.Enable (NOT MirrorOn)
  1011.     MarginsDialog.RightX.Enable (NOT MirrorOn)
  1012.     MarginsDialog.RightText.Enable (NOT MirrorOn)
  1013.  
  1014. END SUB
  1015.  
  1016. '/////CROSS DIALOG//////////////////////////////////////////
  1017.  
  1018. ' The array of possible choices for cross-hair types.
  1019. GLOBAL CONST GW_CROSS_SINGLE%     = 1
  1020. GLOBAL CONST GW_CROSS_HORIZ_PAIR% = 2
  1021. GLOBAL CONST GW_CROSS_VERT_PAIR%  = 3
  1022. GLOBAL CONST GW_CROSS_TRIANGLE%   = 4
  1023. GLOBAL CONST GW_CROSS_SQUARE%     = 5
  1024. GLOBAL CrossArray(5) AS STRING
  1025. CrossArray$(GW_CROSS_SINGLE%)     = "Single"
  1026. CrossArray$(GW_CROSS_HORIZ_PAIR%) = "Horizontal Pair"
  1027. CrossArray$(GW_CROSS_VERT_PAIR%)  = "Vertical Pair"
  1028. CrossArray$(GW_CROSS_TRIANGLE%)   = "Triangle"
  1029. CrossArray$(GW_CROSS_SQUARE%)     = "Square"
  1030.  
  1031. ' The array of preview images.
  1032. GLOBAL CrossPreviewArray(5) AS STRING
  1033. CrossPreviewArray$(1) = "\GuideC1.bmp"
  1034. CrossPreviewArray$(2) = "\GuideC2.bmp"
  1035. CrossPreviewArray$(3) = "\GuideC3.bmp"
  1036. CrossPreviewArray$(4) = "\GuideC4.bmp"
  1037. CrossPreviewArray$(5) = "\GuideC5.bmp"
  1038.  
  1039. ' Variables needed for this dialog.
  1040. GLOBAL CrossNum AS INTEGER        ' The number of the user's selection.
  1041.  
  1042. ' Set up defaults.
  1043. CrossNum% = GW_CROSS_SINGLE%
  1044.  
  1045. BEGIN DIALOG OBJECT CrossDialog 0, 0, 290, 180, "Automatic Guidelines Wizard", SUB CrossDialogEventHandler
  1046.     PUSHBUTTON  181, 160, 46, 14, .NextButton, "&Next >"
  1047.     PUSHBUTTON  135, 160, 46, 14, .BackButton, "< &Back"
  1048.     CANCELBUTTON  234, 160, 46, 14, .CancelButton
  1049.     IMAGE  10, 10, 75, 130, .CrossImage
  1050.     GROUPBOX  10, 150, 270, 5, .LineGroupBox
  1051.     TEXT  93, 10, 181, 14, .SelectionText, "Please select a style of cross-hairs."
  1052.     DDLISTBOX  127, 27, 113, 96, .SelectionListBox
  1053.     IMAGE  136, 52, 95, 87, .PreviewImage
  1054. END DIALOG
  1055.  
  1056. SUB CrossDialogEventHandler(BYVAL ControlID%, BYVAL Event%)
  1057.  
  1058.     IF Event% = EVENT_INITIALIZATION THEN     
  1059.         ' Load the list box with the available choices.
  1060.         CrossDialog.SelectionListBox.SetArray CrossArray$
  1061.         CrossDialog.SelectionListBox.SetSelect CrossNum%
  1062.         UpdateCrossImage CrossNum%
  1063.     ENDIF
  1064.     IF Event% = EVENT_MOUSE_CLICK THEN     ' Mouse click event.
  1065.         SELECT CASE ControlID%
  1066.             CASE CrossDialog.SelectionListBox.GetID()
  1067.                 CrossNum% = CrossDialog.SelectionListBox.GetSelect()
  1068.                 UpdateCrossImage CrossNum%
  1069.             CASE CrossDialog.NextButton.GetID()
  1070.                 LastPageX& = CrossDialog.GetLeftPosition()
  1071.                 LastPageY& = CrossDialog.GetTopPosition()
  1072.                 CrossDialog.CloseDialog DIALOG_RETURN_NEXT%
  1073.             CASE CrossDialog.BackButton.GetID()
  1074.                 LastPageX& = CrossDialog.GetLeftPosition()
  1075.                 LastPageY& = CrossDialog.GetTopPosition()
  1076.                 CrossDialog.CloseDialog DIALOG_RETURN_BACK%
  1077.             CASE CrossDialog.CancelButton.GetID()
  1078.                 CrossDialog.CloseDialog DIALOG_RETURN_CANCEL%
  1079.         END SELECT
  1080.     ENDIF
  1081.  
  1082. END FUNCTION
  1083.  
  1084. '********************************************************************
  1085. '
  1086. '    Name:    UpdateCrossImage (dialog subroutine)
  1087. '
  1088. '    Action:    Changes the image on the cross dialog to reflect
  1089. '            the user's current choice of cross-hair types.
  1090. '
  1091. '    Params:    InChoiceNum - The index number of the user's choice.
  1092. '
  1093. '    Returns:    None.
  1094. '
  1095. '    Comments:    None.
  1096. '
  1097. '********************************************************************
  1098. SUB UpdateCrossImage ( InChoiceNum AS INTEGER )
  1099.  
  1100.     CrossDialog.PreviewImage.SetImage \\
  1101.           CurDir$ + CrossPreviewArray$(InChoiceNum%)
  1102.  
  1103.     ' Add a sunken, centred look to the preview image.
  1104.     CrossDialog.PreviewImage.SetStyle STYLE_SUNKEN
  1105.     CrossDialog.PreviewImage.SetStyle STYLE_IMAGE_CENTERED
  1106.  
  1107. END SUB
  1108.  
  1109. '/////CENTERCROSS DIALOG/////////////////////////////////////////////
  1110.  
  1111. ' Variables needed for this dialog.
  1112. GLOBAL CrossXOffset AS LONG
  1113. GLOBAL CrossXUnit AS INTEGER
  1114. GLOBAL CrossYOffset AS LONG
  1115. GLOBAL CrossYUnit AS INTEGER
  1116.  
  1117. ' Set up defaults.
  1118. CrossXOffset& = 0
  1119. CrossYOffset& = 0
  1120. CrossXUnit% = 1   ' This means inches.  See UnitsArray above.
  1121. CrossYUnit% = 1
  1122.  
  1123. BEGIN DIALOG OBJECT CenterCrossDialog 0, 0, 290, 180, "Automatic Guidelines Wizard", SUB CenterCrossDialogEventHandler
  1124.     PUSHBUTTON  181, 160, 46, 14, .NextButton, "&Next >"
  1125.     PUSHBUTTON  135, 160, 46, 14, .BackButton, "< &Back"
  1126.     CANCELBUTTON  234, 160, 46, 14, .CancelButton
  1127.     IMAGE  10, 10, 75, 130, .CenterCrossImage
  1128.     GROUPBOX  9, 150, 270, 5, .LineGroupBox
  1129.     TEXT  93, 10, 181, 28, .AngleText, "By default, the Automatic Guidelines Wizard will center your cross-hairs on the page.  If you want, you can change the center of the effect."
  1130.     GROUPBOX  102, 43, 165, 59, .GroupBox2, "Move the effect"
  1131.     SPINCONTROL  116, 59, 34, 13, .HorizSpin
  1132.     DDLISTBOX  160, 59, 55, 64, .HorizListbox
  1133.     SPINCONTROL  116, 78, 34, 13, .VertSpin
  1134.     DDLISTBOX  160, 78, 55, 64, .VertListbox
  1135.     TEXT  153, 80, 5, 10, .TextX2, "x"
  1136.     TEXT  153, 60, 5, 10, .TextX1, "x"
  1137.     TEXT  220, 79, 40, 11, .Text6, "vertically"
  1138.     TEXT  220, 61, 40, 11, .Text7, "horizontally"
  1139. END DIALOG
  1140.  
  1141. SUB CenterCrossDialogEventHandler(BYVAL ControlID%, BYVAL Event%)
  1142.  
  1143.     DIM GenReturn AS LONG
  1144.  
  1145.     IF Event% = EVENT_INITIALIZATION THEN 
  1146.         ' Set up all the controls.
  1147.         CenterCrossDialog.HorizListbox.SetArray UnitsArray$
  1148.         CenterCrossDialog.VertListbox.SetArray UnitsArray$
  1149.         CenterCrossDialog.HorizListbox.SetSelect CrossXUnit%
  1150.         CenterCrossDialog.VertListbox.SetSelect CrossYUnit%
  1151.         CenterCrossDialog.HorizSpin.SetValue CrossXOffset&
  1152.         CenterCrossDialog.VertSpin.SetValue CrossYOffset&
  1153.     ENDIF
  1154.     IF Event% = EVENT_MOUSE_CLICK THEN     ' Mouse click event.
  1155.         SELECT CASE ControlID%
  1156.             CASE CenterCrossDialog.HorizListbox.GetID()
  1157.                 CrossXUnit% = CenterCrossDialog.HorizListbox.GetSelect()
  1158.             CASE CenterCrossDialog.VertListbox.GetID()
  1159.                 CrossYUnit% = CenterCrossDialog.VertListbox.GetSelect()
  1160.             CASE CenterCrossDialog.NextButton.GetID()
  1161.                 LastPageX& = CenterCrossDialog.GetLeftPosition()
  1162.                 LastPageY& = CenterCrossDialog.GetTopPosition()
  1163.                         
  1164.                 ' Make sure the center has not been moved off the page.
  1165.                 IF (ABS(ConvertToDrawUnits( CrossXOffset&, CrossXUnit% )) > (AvailableX&)) OR \\
  1166.                        (ABS(ConvertToDrawUnits( CrossYOffset&, CrossYUnit% )) > (AvailableY&)) THEN
  1167.                     GenReturn& = MESSAGEBOX( "The values you have selected will place " + \\
  1168.                                                   "the center of your guideline effect very far " + \\
  1169.                                                   "off the page." + NL2 + \\
  1170.                                                   "Please select smaller values and try again.", \\
  1171.                                                   TITLE_ERRORBOX$, MB_EXCLAMATION_ICON )
  1172.                 ELSE
  1173.                     CenterCrossDialog.CloseDialog DIALOG_RETURN_NEXT%
  1174.                 ENDIF
  1175.             CASE CenterCrossDialog.BackButton.GetID()
  1176.                 LastPageX& = CenterCrossDialog.GetLeftPosition()
  1177.                 LastPageY& = CenterCrossDialog.GetTopPosition()
  1178.                 CenterCrossDialog.CloseDialog DIALOG_RETURN_BACK%
  1179.             CASE CenterCrossDialog.CancelButton.GetID()
  1180.                 CenterCrossDialog.CloseDialog DIALOG_RETURN_CANCEL%
  1181.         END SELECT
  1182.     ELSEIF Event% = EVENT_CHANGE_IN_CONTENT& THEN
  1183.         SELECT CASE ControlID%        
  1184.             CASE CenterCrossDialog.HorizSpin.GetID()
  1185.                 IF (CenterCrossDialog.HorizSpin.GetValue() > 999) THEN
  1186.                     GenReturn& = MESSAGEBOX("Please enter a horizontal offset value between -999 and 999.", \\
  1187.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  1188.                     CrossXOffset& = 999
  1189.                     CenterCrossDialog.HorizSpin.SetValue CrossXOffset&
  1190.                 ELSEIF (CenterCrossDialog.HorizSpin.GetValue() < -999) THEN
  1191.                     GenReturn& = MESSAGEBOX("Please enter a horizontal offset value between -999 and 999.", \\
  1192.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  1193.                     CrossXOffset& = -999
  1194.                     CenterCrossDialog.HorizSpin.SetValue CrossXOffset&
  1195.                 ELSE
  1196.                     CrossXOffset& = CenterCrossDialog.HorizSpin.GetValue()
  1197.                 ENDIF
  1198.             CASE CenterCrossDialog.VertSpin.GetID()
  1199.                 IF (CenterCrossDialog.VertSpin.GetValue() > 999) THEN
  1200.                     GenReturn& = MESSAGEBOX("Please enter a vertical offset value between -999 and 999.", \\
  1201.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  1202.                     CrossYOffset& = 999
  1203.                     CenterCrossDialog.VertSpin.SetValue CrossYOffset&
  1204.                 ELSEIF (CenterCrossDialog.HorizSpin.GetValue() < -999) THEN
  1205.                     GenReturn& = MESSAGEBOX("Please enter a vertical offset value between -999 and 999.", \\
  1206.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  1207.                     CrossYOffset& = -999
  1208.                     CenterCrossDialog.VertSpin.SetValue CrossYOffset&
  1209.                 ELSE
  1210.                     CrossYOffset& = CenterCrossDialog.VertSpin.GetValue()
  1211.                 ENDIF
  1212.         END SELECT
  1213.     ENDIF
  1214.  
  1215. END FUNCTION
  1216.  
  1217. '/////COLUMN DIALOG//////////////////////////////////////////////
  1218.  
  1219. ' Variables needed for this dialog.
  1220. GLOBAL UseColumns AS BOOLEAN    ' Whether the user wants columns.
  1221. GLOBAL NumColumns AS INTEGER    ' The desired number of columns.
  1222. GLOBAL Gutter AS LONG        ' The distance between columns.
  1223. GLOBAL GutterUnit AS INTEGER    ' The unit used in Gutter.
  1224.  
  1225. ' Set up defaults.
  1226. UseColumns = FALSE
  1227. NumColumns% = 2
  1228. Gutter& = 25
  1229. GutterUnit% = 2     ' 0.1 inches
  1230.  
  1231. BEGIN DIALOG OBJECT ColumnDialog 0, 0, 290, 180, "Automatic Guidelines Wizard", SUB ColumnDialogEventHandler
  1232.     PUSHBUTTON  181, 160, 46, 14, .NextButton, "&Next >"
  1233.     PUSHBUTTON  135, 160, 46, 14, .BackButton, "< &Back"
  1234.     CANCELBUTTON  234, 160, 46, 14, .CancelButton
  1235.     IMAGE  10, 10, 75, 130, .ColumnImage
  1236.     GROUPBOX  10, 150, 270, 5, .LineGroupBox
  1237.     TEXT  93, 10, 181, 10, .Text1, "You can divide your page up into several columns."
  1238.     TEXT  127, 89, 51, 12, .GutterText, "Distance apart:"
  1239.     GROUPBOX  95, 26, 179, 84, .ColumnGroup, "Do you want columns?"
  1240.     OPTIONGROUP .OptionGroup1Val%
  1241.         OPTIONBUTTON  112, 55, 83, 13, .YesColumnsOption, "Yes"
  1242.         OPTIONBUTTON  112, 42, 83, 13, .NoColumnsOption, "No"
  1243.     TEXT  127, 71, 66, 12, .ColumnText, "Number of columns:"
  1244.     SPINCONTROL  195, 70, 27, 13, .ColumnSpin
  1245.     TEXT  208, 88, 5, 8, .XText, "x"
  1246.     SPINCONTROL  179, 87, 27, 13, .GutterSpin
  1247.     DDLISTBOX  214, 87, 47, 139, .GutterListbox
  1248. END DIALOG
  1249.  
  1250. SUB ColumnDialogEventHandler(BYVAL ControlID%, BYVAL Event%)
  1251.  
  1252.     DIM MsgReturn AS LONG
  1253.  
  1254.     IF Event% = EVENT_INITIALIZATION THEN     
  1255.         ColumnDialog.GutterListbox.SetArray UnitsArray$
  1256.         UpdateColumnDialog
  1257.     ENDIF
  1258.     IF Event% = EVENT_MOUSE_CLICK THEN     ' Mouse click event.
  1259.         SELECT CASE ControlID%
  1260.             CASE ColumnDialog.NextButton.GetID()
  1261.                 LastPageX& = ColumnDialog.GetLeftPosition()
  1262.                 LastPageY& = ColumnDialog.GetTopPosition()
  1263.                 IF (CalculateWidthAfterMargins() / (NumColumns% - 1)) <= \\
  1264.                    (ConvertToDrawUnits(Gutter&, GutterUnit%)) THEN
  1265.                     MsgReturn& = MESSAGEBOX("You have selected a space between columns " + \\
  1266.                                                  "that is too large for the space inside the " + \\
  1267.                                                  "margins." + NL2 + \\
  1268.                                                  "Please reduce the space between columns or " + \\
  1269.                                                  "reduce the number of columns and try again.", \\
  1270.                                                  TITLE_INFOBOX$, MB_INFORMATION_ICON%)
  1271.                 ELSE
  1272.                     ColumnDialog.CloseDialog DIALOG_RETURN_NEXT%
  1273.                 ENDIF
  1274.             CASE ColumnDialog.BackButton.GetID()
  1275.                 LastPageX& = ColumnDialog.GetLeftPosition()
  1276.                 LastPageY& = ColumnDialog.GetTopPosition()
  1277.                 ColumnDialog.CloseDialog DIALOG_RETURN_BACK%
  1278.             CASE ColumnDialog.CancelButton.GetID()
  1279.                 ColumnDialog.CloseDialog DIALOG_RETURN_CANCEL%
  1280.             CASE ColumnDialog.YesColumnsOption.GetID()
  1281.                 UseColumns = TRUE
  1282.                 UpdateColumnDialog
  1283.             CASE ColumnDialog.NoColumnsOption.GetID()
  1284.                 UseColumns = FALSE
  1285.                 UpdateColumnDialog
  1286.             CASE ColumnDialog.YesColumnsOption.GetID()
  1287.                 UseColumns = TRUE
  1288.                 UpdateColumnDialog
  1289.             CASE ColumnDialog.GutterListbox.GetID()
  1290.                 GutterUnit% = ColumnDialog.GutterListbox.GetSelect()
  1291.                 UpdateColumnDialog            
  1292.         END SELECT
  1293.     ELSEIF Event% = EVENT_CHANGE_IN_CONTENT& THEN
  1294.         SELECT CASE ControlID%        
  1295.             CASE ColumnDialog.ColumnSpin.GetID()
  1296.                 IF (ColumnDialog.ColumnSpin.GetValue() < 2) THEN
  1297.                     MsgReturn& = MESSAGEBOX("Please enter a number of columns between 2 and 10.", \\
  1298.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  1299.                     NumColumns% = 2
  1300.                     ColumnDialog.ColumnSpin.SetValue NumColumns%
  1301.                 ELSEIF (ColumnDialog.ColumnSpin.GetValue() > 10) THEN
  1302.                     MsgReturn& = MESSAGEBOX("Please enter a number of columns between 2 and 10.", \\
  1303.                                         TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  1304.                     NumColumns% = 10
  1305.                     ColumnDialog.ColumnSpin.SetValue NumColumns%
  1306.                 ELSE
  1307.                     NumColumns% = ColumnDialog.ColumnSpin.GetValue()
  1308.                 ENDIF
  1309.             CASE ColumnDialog.GutterSpin.GetID()
  1310.                 IF (ColumnDialog.GutterSpin.GetValue() < 0) THEN
  1311.                     MsgReturn& = MESSAGEBOX("Please enter a distance apart between 0 and 999.", \\
  1312.                                             TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  1313.                     Gutter& = 0
  1314.                     ColumnDialog.GutterSpin.SetValue Gutter&
  1315.                 ELSEIF (ColumnDialog.GutterSpin.GetValue() > 999) THEN
  1316.                     MsgReturn& = MESSAGEBOX("Please enter a distance apart between 0 and 999.", \\
  1317.                                         TITLE_INFOBOX$, MB_INFORMATION_ICON&)
  1318.                     Gutter& = 0
  1319.                     ColumnDialog.GutterSpin.SetValue Gutter&
  1320.                 ELSE
  1321.                     Gutter& = ColumnDialog.GutterSpin.GetValue()
  1322.                 ENDIF
  1323.         END SELECT
  1324.     ENDIF
  1325.  
  1326. END FUNCTION
  1327.  
  1328. '********************************************************************
  1329. '
  1330. '    Name:    UpdateColumnDialog (dialog subroutine)
  1331. '
  1332. '    Action:    Updates all controls on the column dialog to reflect
  1333. '            their current values and enabled/disabled state.
  1334. '
  1335. '    Params:    None.
  1336. '
  1337. '    Returns:    None.
  1338. '
  1339. '    Comments:    None.
  1340. '
  1341. '********************************************************************
  1342. SUB UpdateColumnDialog()
  1343.     
  1344.     ' Refresh the values in all controls.
  1345.     IF UseColumns THEN
  1346.         ColumnDialog.YesColumnsOption.SetValue 1
  1347.     ELSE
  1348.         ColumnDialog.NoColumnsOption.SetValue 1
  1349.     ENDIF
  1350.     ColumnDialog.ColumnSpin.SetValue NumColumns%
  1351.     ColumnDialog.GutterSpin.SetValue Gutter&
  1352.     ColumnDialog.GutterListbox.SetSelect GutterUnit%
  1353.  
  1354.     ' Disable the column-specific controls if the user
  1355.     ' does not want columns.
  1356.     ColumnDialog.ColumnText.Enable UseColumns
  1357.     ColumnDialog.ColumnSpin.Enable UseColumns
  1358.     ColumnDialog.XText.Enable UseColumns
  1359.     ColumnDialog.GutterSpin.Enable UseColumns
  1360.     ColumnDialog.GutterListbox.Enable UseColumns
  1361.     ColumnDialog.GutterText.Enable UseColumns
  1362.  
  1363. END SUB
  1364.  
  1365. '********************************************************************
  1366. '
  1367. ' MAIN
  1368. '
  1369. '********************************************************************
  1370.  
  1371. '/////LOCAL VARIABLES////////////////////////////////////////////////
  1372. DIM MessageText AS STRING    ' Text to use in a MESSAGEBOX.
  1373. DIM GenReturn AS INTEGER        ' The return value of various routines.
  1374. DIM CurStep AS INTEGER        ' The current dialog box being displayed.
  1375. DIM VisitedRemove AS BOOLEAN    ' Whether TW_REMOVEDIALOG has been shown.
  1376.         
  1377. ' Retrieve the current directory.
  1378. CurDir$ = GetCurrFolder()
  1379. IF MID(CurDir$, LEN(CurDir$), 1) = "\" THEN
  1380.     ' Make sure CurDir does not end with a backslash, since we
  1381.     ' will add one.
  1382.     CurDir$ = LEFT(CurDir$, LEN(CurDir$) - 1)
  1383. ENDIF
  1384.  
  1385. ' Retrieve the size of the current page in CorelDRAW.
  1386. ERRNUM = 0
  1387. ON ERROR RESUME NEXT
  1388. .GetPageSize AvailableX&, AvailableY&
  1389. IF ERRNUM <> 0 THEN
  1390.     GenReturn% = MESSAGEBOX("You do not have any documents open in CorelDRAW." + NL2 + \\
  1391.                             "The Automatic Guidelines Wizard will create guidelines on " + \\
  1392.                         "your current page, " + NL + "so you need to have a document before " + \\
  1393.                         "you run the wizard." + NL2 + \\
  1394.                         "Please create or open a document and try again.", \\
  1395.                         TITLE_INFOBOX$, \\
  1396.                         MB_INFORMATION_ICON)
  1397.     ERRNUM = 0
  1398.     STOP
  1399. ENDIF
  1400. ON ERROR GOTO MainErrorHandler
  1401.         
  1402. ' Set up the pages of the wizard.
  1403. CONST TW_FINISH%           = 0
  1404. CONST TW_INTRODIALOG%       = 1
  1405. CONST TW_REMOVEDIALOG%       = 2
  1406. CONST TW_STYLEDIALOG%       = 3
  1407. CONST TW_CHOICEDIALOG%       = 4
  1408. CONST TW_ANGLEDIALOG%       = 5
  1409. CONST TW_GRIDFREQDIALOG%       = 6
  1410. CONST TW_LOCKDIALOG%       = 7
  1411. CONST TW_MARGINSDIALOG%       = 8
  1412. CONST TW_FINISHDIALOG%       = 9
  1413. CONST TW_CROSSDIALOG%       = 10
  1414. CONST TW_CENTERCROSSDIALOG% = 11
  1415. CONST TW_COLUMNSDIALOG%     = 12
  1416.  
  1417. ' Loop, displaying dialogs in the required order.
  1418. CurStep% = TW_INTRODIALOG%
  1419. VisitedRemove = FALSE
  1420. LoopBegin:
  1421. WHILE (CurStep% <> TW_FINISH%)
  1422.  
  1423.     SELECT CASE CurStep%
  1424.         CASE TW_INTRODIALOG%
  1425.             IF (LastPageX& <> -1) THEN
  1426.                 IntroDialog.Move LastPageX&, LastPageY&
  1427.             ENDIF        
  1428.             IntroDialog.IntroImage.SetImage CurDir$ + BITMAP_INTRODIALOG$
  1429.             IntroDialog.IntroImage.SetStyle STYLE_SUNKEN
  1430.             IntroDialog.IntroImage.SetStyle STYLE_IMAGE_CENTERED
  1431.             IntroDialog.SetStyle STYLE_NOMINIMIZEBOX
  1432.             GenReturn% = DIALOG(IntroDialog)
  1433.             SELECT CASE GenReturn%
  1434.                 CASE DIALOG_RETURN_NEXT%
  1435.                     IF .GetNumberOfGuidelines() > 0 THEN
  1436.                         CurStep% = TW_REMOVEDIALOG%
  1437.                     ELSE
  1438.                         CurStep% = TW_STYLEDIALOG%
  1439.                     ENDIF
  1440.                 CASE DIALOG_RETURN_CANCEL%
  1441.                     STOP                                        
  1442.             END SELECT
  1443.             
  1444.         CASE TW_FINISHDIALOG%
  1445.             FinishDialog.Move LastPageX&, LastPageY&
  1446.             FinishDialog.FinishImage.SetImage CurDir$ + BITMAP_FINISHDIALOG$
  1447.             FinishDialog.FinishImage.SetStyle STYLE_SUNKEN
  1448.  
  1449.             FinishDialog.FinishImage.SetStyle STYLE_IMAGE_CENTERED
  1450.             FinishDialog.SetStyle STYLE_NOMINIMIZEBOX
  1451.             GenReturn% = DIALOG(FinishDialog)
  1452.             SELECT CASE GenReturn%
  1453.                 CASE DIALOG_RETURN_BACK%
  1454.                     IF UsePreset THEN
  1455.                         CurStep% = TW_LOCKDIALOG%
  1456.                     ELSE
  1457.                         SELECT CASE ChoiceNum%
  1458.                             CASE GW_TYPE_MARGINS%
  1459.                                 CurStep% = TW_LOCKDIALOG%
  1460.                             CASE GW_TYPE_GRID%
  1461.                                 CurStep% = TW_LOCKDIALOG%
  1462.                             CASE GW_TYPE_CROSS%
  1463.                                 CurStep% = TW_LOCKDIALOG%
  1464.                         END SELECT
  1465.                     ENDIF
  1466.                 CASE DIALOG_RETURN_NEXT%
  1467.                     CurStep% = TW_FINISH%
  1468.                 CASE DIALOG_RETURN_CANCEL%
  1469.                     STOP    
  1470.             END SELECT                                    
  1471.             
  1472.         CASE TW_REMOVEDIALOG%
  1473.             RemoveDialog.Move LastPageX&, LastPageY&        
  1474.             VisitedRemove = TRUE
  1475.             RemoveDialog.RemoveImage.SetImage CurDir$ + BITMAP_REMOVEDIALOG$
  1476.             RemoveDialog.RemoveImage.SetStyle STYLE_SUNKEN
  1477.             RemoveDialog.RemoveImage.SetStyle STYLE_IMAGE_CENTERED
  1478.             RemoveDialog.SetStyle STYLE_NOMINIMIZEBOX
  1479.             GenReturn% = DIALOG(RemoveDialog)
  1480.             SELECT CASE GenReturn%
  1481.                 CASE DIALOG_RETURN_BACK%
  1482.                     CurStep% = TW_INTRODIALOG%
  1483.                 CASE DIALOG_RETURN_NEXT%
  1484.                     CurStep% = TW_STYLEDIALOG%
  1485.                 CASE DIALOG_RETURN_CANCEL%
  1486.                     STOP
  1487.             END SELECT
  1488.             
  1489.         CASE TW_STYLEDIALOG%
  1490.             StyleDialog.Move LastPageX&, LastPageY&        
  1491.             StyleDialog.StyleImage.SetImage CurDir$ + BITMAP_STYLEDIALOG$
  1492.             StyleDialog.StyleImage.SetStyle STYLE_SUNKEN
  1493.             StyleDialog.StyleImage.SetStyle STYLE_IMAGE_CENTERED
  1494.             StyleDialog.SetStyle STYLE_NOMINIMIZEBOX
  1495.             GenReturn% = DIALOG(StyleDialog)
  1496.             SELECT CASE GenReturn%
  1497.                 CASE DIALOG_RETURN_BACK%
  1498.                     IF VisitedRemove THEN
  1499.                         CurStep% = TW_REMOVEDIALOG%
  1500.                     ELSE
  1501.                         CurStep% = TW_INTRODIALOG%
  1502.                     ENDIF
  1503.                 CASE DIALOG_RETURN_NEXT%
  1504.                     CurStep% = TW_CHOICEDIALOG%
  1505.                 CASE DIALOG_RETURN_CANCEL%
  1506.                     STOP
  1507.             END SELECT
  1508.  
  1509.         CASE TW_CHOICEDIALOG%
  1510.             ChoiceDialog.Move LastPageX&, LastPageY&        
  1511.             ChoiceDialog.ChoiceImage.SetImage CurDir$ + BITMAP_CHOICEDIALOG$
  1512.             ChoiceDialog.ChoiceImage.SetStyle STYLE_SUNKEN
  1513.             ChoiceDialog.ChoiceImage.SetStyle STYLE_IMAGE_CENTERED
  1514.             ChoiceDialog.SetStyle STYLE_NOMINIMIZEBOX
  1515.             GenReturn% = DIALOG(ChoiceDialog)
  1516.             SELECT CASE GenReturn%
  1517.                 CASE DIALOG_RETURN_BACK%
  1518.                     CurStep% = TW_STYLEDIALOG%
  1519.                 CASE DIALOG_RETURN_NEXT%
  1520.                     IF UsePreset THEN
  1521.                         CurStep% = TW_LOCKDIALOG%
  1522.                     ELSE
  1523.                         SELECT CASE ChoiceNum%
  1524.                             CASE GW_TYPE_MARGINS%
  1525.                                 CurStep% = TW_MARGINSDIALOG%
  1526.                             CASE GW_TYPE_GRID%
  1527.                                 CurStep% = TW_MARGINSDIALOG%
  1528.                             CASE GW_TYPE_CROSS%
  1529.                                 CurStep% = TW_CROSSDIALOG%
  1530.                         END SELECT
  1531.                     ENDIF
  1532.                 CASE DIALOG_RETURN_CANCEL%
  1533.                     STOP
  1534.             END SELECT
  1535.  
  1536.         CASE TW_CROSSDIALOG%
  1537.             CrossDialog.Move LastPageX&, LastPageY&
  1538.             CrossDialog.CrossImage.SetImage CurDir$ + BITMAP_CROSSDIALOG$
  1539.             CrossDialog.CrossImage.SetStyle STYLE_SUNKEN
  1540.             CrossDialog.CrossImage.SetStyle STYLE_IMAGE_CENTERED
  1541.             CrossDialog.SetStyle STYLE_NOMINIMIZEBOX
  1542.             GenReturn% = DIALOG(CrossDialog)
  1543.             SELECT CASE GenReturn%
  1544.                 CASE DIALOG_RETURN_BACK%
  1545.                     CurStep% = TW_CHOICEDIALOG%
  1546.                 CASE DIALOG_RETURN_NEXT%
  1547.                     CurStep% = TW_ANGLEDIALOG%
  1548.                 CASE DIALOG_RETURN_CANCEL%
  1549.                     STOP
  1550.             END SELECT
  1551.             
  1552.         CASE TW_CENTERCROSSDIALOG%
  1553.             CenterCrossDialog.Move LastPageX&, LastPageY&
  1554.             CenterCrossDialog.CenterCrossImage.SetImage CurDir$ + BITMAP_CENTERCROSSDIALOG$
  1555.             CenterCrossDialog.CenterCrossImage.SetStyle STYLE_SUNKEN
  1556.             CenterCrossDialog.CenterCrossImage.SetStyle STYLE_IMAGE_CENTERED
  1557.             CenterCrossDialog.SetStyle STYLE_NOMINIMIZEBOX
  1558.             GenReturn% = DIALOG(CenterCrossDialog)
  1559.             SELECT CASE GenReturn%
  1560.                 CASE DIALOG_RETURN_BACK%
  1561.                     CurStep% = TW_ANGLEDIALOG%
  1562.                 CASE DIALOG_RETURN_NEXT%
  1563.                     CurStep% = TW_LOCKDIALOG%
  1564.                 CASE DIALOG_RETURN_CANCEL%
  1565.                     STOP
  1566.             END SELECT
  1567.  
  1568.         CASE TW_ANGLEDIALOG%
  1569.             AngleDialog.Move LastPageX&, LastPageY&
  1570.             AngleDialog.AngleImage.SetImage CurDir$ + BITMAP_ANGLEDIALOG$
  1571.             AngleDialog.AngleImage.SetStyle STYLE_SUNKEN
  1572.             AngleDialog.AngleImage.SetStyle STYLE_IMAGE_CENTERED
  1573.             AngleDialog.SetStyle STYLE_NOMINIMIZEBOX
  1574.             GenReturn% = DIALOG(AngleDialog)
  1575.             SELECT CASE GenReturn%
  1576.                 CASE DIALOG_RETURN_BACK%
  1577.                     SELECT CASE ChoiceNum%
  1578.                         CASE GW_TYPE_MARGINS%
  1579.                             
  1580.                         CASE GW_TYPE_GRID%
  1581.                             CurStep% = TW_GRIDFREQDIALOG%
  1582.                         CASE GW_TYPE_CROSS%
  1583.                             CurStep% = TW_CROSSDIALOG%
  1584.                     END SELECT
  1585.                 CASE DIALOG_RETURN_NEXT%
  1586.                     SELECT CASE ChoiceNum%
  1587.                         CASE GW_TYPE_MARGINS%
  1588.                             
  1589.                         CASE GW_TYPE_GRID%
  1590.                             CurStep% = TW_LOCKDIALOG%
  1591.                         CASE GW_TYPE_CROSS%
  1592.                             CurStep% = TW_CENTERCROSSDIALOG%
  1593.                     END SELECT
  1594.                 CASE DIALOG_RETURN_CANCEL%
  1595.                     STOP
  1596.             END SELECT
  1597.             
  1598.         CASE TW_GRIDFREQDIALOG%
  1599.             GridFreqDialog.Move LastPageX&, LastPageY&
  1600.             GridFreqDialog.GridFreqImage.SetImage CurDir$ + BITMAP_GRIDFREQDIALOG$
  1601.             GridFreqDialog.GridFreqImage.SetStyle STYLE_SUNKEN
  1602.             GridFreqDialog.GridFreqImage.SetStyle STYLE_IMAGE_CENTERED
  1603.             GridFreqDialog.SetStyle STYLE_NOMINIMIZEBOX
  1604.             GenReturn% = DIALOG(GridFreqDialog)
  1605.             SELECT CASE GenReturn%
  1606.                 CASE DIALOG_RETURN_BACK%
  1607.                     CurStep% = TW_MARGINSDIALOG%
  1608.                 CASE DIALOG_RETURN_NEXT%
  1609.                     CurStep% = TW_LOCKDIALOG%
  1610.                 CASE DIALOG_RETURN_CANCEL%
  1611.                     STOP
  1612.             END SELECT
  1613.         
  1614.         CASE TW_LOCKDIALOG%
  1615.             LockDialog.Move LastPageX&, LastPageY&
  1616.             LockDialog.LockImage.SetImage CurDir$ + BITMAP_LOCKDIALOG$
  1617.             LockDialog.LockImage.SetStyle STYLE_SUNKEN
  1618.             LockDialog.LockImage.SetStyle STYLE_IMAGE_CENTERED
  1619.             LockDialog.SetStyle STYLE_NOMINIMIZEBOX
  1620.             GenReturn% = DIALOG(LockDialog)
  1621.             IF UsePreset THEN
  1622.                 SELECT CASE GenReturn%
  1623.                     CASE DIALOG_RETURN_BACK%
  1624.                         CurStep% = TW_CHOICEDIALOG%
  1625.                     CASE DIALOG_RETURN_NEXT%
  1626.                         CurStep% = TW_FINISHDIALOG%
  1627.                     CASE DIALOG_RETURN_CANCEL%
  1628.                         STOP
  1629.                 END SELECT
  1630.             ELSE
  1631.                 SELECT CASE GenReturn%
  1632.                     CASE DIALOG_RETURN_BACK%
  1633.                         SELECT CASE ChoiceNum%
  1634.                             CASE GW_TYPE_MARGINS%
  1635.                                 CurStep% = TW_COLUMNSDIALOG%
  1636.                             CASE GW_TYPE_GRID%
  1637.                                 CurStep% = TW_GRIDFREQDIALOG%
  1638.                             CASE GW_TYPE_CROSS%
  1639.                                 CurStep% = TW_CENTERCROSSDIALOG%
  1640.                         END SELECT
  1641.     
  1642.                     CASE DIALOG_RETURN_NEXT%
  1643.                         SELECT CASE ChoiceNum%
  1644.                             CASE GW_TYPE_MARGINS%
  1645.                                 CurStep% = TW_FINISHDIALOG%
  1646.                             CASE GW_TYPE_GRID%
  1647.                                 CurStep% = TW_FINISHDIALOG%
  1648.                             CASE GW_TYPE_CROSS%
  1649.                                 CurStep% = TW_FINISHDIALOG%
  1650.                         END SELECT
  1651.                     CASE DIALOG_RETURN_CANCEL%
  1652.                         STOP
  1653.                 END SELECT
  1654.             ENDIF
  1655.  
  1656.         CASE TW_MARGINSDIALOG%
  1657.             MarginsDialog.Move LastPageX&, LastPageY&
  1658.             MarginsDialog.MarginsImage.SetImage CurDir$ + BITMAP_MARGINSDIALOG$
  1659.             MarginsDialog.MarginsImage.SetStyle STYLE_SUNKEN
  1660.             MarginsDialog.MarginsImage.SetStyle STYLE_IMAGE_CENTERED
  1661.             MarginsDialog.SetStyle STYLE_NOMINIMIZEBOX
  1662.             GenReturn% = DIALOG(MarginsDialog)
  1663.             SELECT CASE GenReturn%
  1664.                 CASE DIALOG_RETURN_BACK%
  1665.                     SELECT CASE ChoiceNum%
  1666.                         CASE GW_TYPE_MARGINS%
  1667.                             CurStep% = TW_CHOICEDIALOG%
  1668.                         CASE GW_TYPE_GRID%
  1669.                             CurStep% = TW_CHOICEDIALOG%
  1670.                         CASE GW_TYPE_CROSS%
  1671.                         
  1672.                     END SELECT
  1673.                 CASE DIALOG_RETURN_NEXT%
  1674.                     SELECT CASE ChoiceNum%
  1675.                         CASE GW_TYPE_MARGINS%
  1676.                             CurStep% = TW_COLUMNSDIALOG%
  1677.                         CASE GW_TYPE_GRID%
  1678.                             CurStep% = TW_GRIDFREQDIALOG%
  1679.                         CASE GW_TYPE_CROSS%
  1680.                         
  1681.                     END SELECT
  1682.                 CASE DIALOG_RETURN_CANCEL%
  1683.                     STOP
  1684.             END SELECT
  1685.             
  1686.         CASE TW_COLUMNSDIALOG%
  1687.             ColumnDialog.Move LastPageX&, LastPageY&
  1688.             ColumnDialog.ColumnImage.SetImage CurDir$ + BITMAP_COLUMNSDIALOG$
  1689.             ColumnDialog.ColumnImage.SetStyle STYLE_SUNKEN
  1690.             ColumnDialog.ColumnImage.SetStyle STYLE_IMAGE_CENTERED
  1691.             ColumnDialog.SetStyle STYLE_NOMINIMIZEBOX
  1692.             GenReturn% = DIALOG(ColumnDialog)
  1693.             SELECT CASE GenReturn%
  1694.                 CASE DIALOG_RETURN_BACK%
  1695.                     CurStep% = TW_MARGINSDIALOG%
  1696.                 CASE DIALOG_RETURN_NEXT%
  1697.                     CurStep% = TW_LOCKDIALOG%
  1698.                 CASE DIALOG_RETURN_CANCEL%
  1699.                     STOP
  1700.             END SELECT
  1701.  
  1702.     END SELECT
  1703.  
  1704. WEND
  1705.  
  1706. ' Apply the guideline effect.
  1707. DoGuidelineEffect
  1708.  
  1709. VeryEnd:
  1710. STOP
  1711.  
  1712. MainErrorHandler:
  1713.     MessageText$ = "A general error occurred during the "
  1714.     MessageText$ = MessageText$ + "wizard's processing." + NL2
  1715.     MessageText$ = MessageText$ + "You may wish to try again."
  1716.     GenReturn% = MESSAGEBOX(MessageText$, TITLE_ERRORBOX$, \\
  1717.                             MB_OK_ONLY& OR MB_EXCLAMATION_ICON&)
  1718.     ERRNUM = 0
  1719.     RESUME AT VeryEnd
  1720.     STOP
  1721.  
  1722. FUNCTION CalculateDistanceApart( NumGridlines AS LONG, InAvailable AS LONG ) AS STRING
  1723.  
  1724.     DIM Distance AS STRING ' An unformatted string representation of the distance.
  1725.     DIM DistFmt AS STRING  ' A formatted string representation of the distance.
  1726.     DIM Decimal AS STRING  ' The character this locale uses as a decimal place
  1727.                        ' separator.
  1728.  
  1729.     ' There can be no fewer than 2 grid lines.
  1730.     IF (NumGridlines& < 2) THEN
  1731.         
  1732.         CalculateDistanceApart$ = "0"
  1733.         
  1734.     ELSE
  1735.     
  1736.         ' Determine this locale's decimal character.
  1737.         Decimal$ = MID(CSTR(0.1), 2, 1)
  1738.     
  1739.         Distance$ = CSTR(TOINCHES(InAvailable& / (NumGridlines& - 1)))
  1740.         IF TOINCHES(InAvailable& / (NumGridlines& - 1)) < 0.1 THEN
  1741.             ' This is a simple check to avoid exponential.
  1742.             DistFmt$ = "< 0" + Decimal$ + "1"        
  1743.         ELSEIF INSTR(Distance$, Decimal$) THEN
  1744.             ' Pull out everything after the second decimal place
  1745.             ' for aesthetic reasons.
  1746.             DistFmt$ = MID(Distance$, 1, INSTR(Distance$, Decimal$) + 4)
  1747.         ELSE
  1748.             DistFmt$ = Distance$
  1749.         ENDIF
  1750.         CalculateDistanceApart$ = DistFmt$
  1751.     
  1752.     ENDIF    
  1753.     EXIT FUNCTION
  1754.  
  1755. END FUNCTION
  1756.  
  1757. FUNCTION ConvertToDrawUnits( InLength AS LONG, InUnit AS INTEGER ) AS LONG
  1758.  
  1759.     DIM ConversionFactor AS SINGLE  ' The conversion factor for units.
  1760.  
  1761.     SELECT CASE InUnit%
  1762.  
  1763.         CASE GW_UNIT_1_INCH%
  1764.             ConversionFactor! = FROMINCHES(1)
  1765.  
  1766.         CASE GW_UNIT_01_INCH%
  1767.             ConversionFactor! = FROMINCHES(0.1)
  1768.  
  1769.         CASE GW_UNIT_136_INCH%
  1770.             ConversionFactor! = FROMINCHES(1/36)
  1771.  
  1772.         CASE GW_UNIT_0001_INCH%
  1773.             ConversionFactor! = FROMINCHES(0.001)
  1774.  
  1775.         CASE GW_UNIT_1_CM%
  1776.             ConversionFactor! = FROMCENTIMETERS(1)
  1777.  
  1778.         CASE GW_UNIT_0001_CM%
  1779.             ConversionFactor! = FROMCENTIMETERS(0.001)
  1780.  
  1781.         CASE GW_UNIT_1_PT%
  1782.             ConversionFactor! = FROMPOINTS(1)
  1783.  
  1784.         CASE ELSE
  1785.             ConversionFactor! = 0
  1786.  
  1787.     END SELECT
  1788.  
  1789.     ' Actually perform the conversion.
  1790.     ConvertToDrawUnits& = InLength& * ConversionFactor!
  1791.  
  1792. END FUNCTION
  1793.  
  1794. SUB DoGuidelineEffect()
  1795.  
  1796.     ' Depending on the type of guideline effect we're generating, call an 
  1797.     ' appropriate subroutine.
  1798.     .StartOfRecording    ' This 'groups' everything until EndOfRecording
  1799.                     ' as one big undoable block.
  1800.     IF UsePreset THEN
  1801.         DoPresetEffect
  1802.     ELSE
  1803.         SELECT CASE ChoiceNum%
  1804.             CASE GW_TYPE_MARGINS%
  1805.                 DoMarginsEffect
  1806.             CASE GW_TYPE_GRID%
  1807.                 DoGridEffect
  1808.             CASE GW_TYPE_CROSS%
  1809.                 DoCrossHairsEffect
  1810.         END SELECT
  1811.     ENDIF
  1812.     .EndOfRecording    ' This ends our big undoable block.
  1813.  
  1814. END SUB
  1815.  
  1816. SUB DoMarginsEffect()
  1817.  
  1818.     ' The point which will be used to generate the current guideline.
  1819.     DIM PointX AS LONG
  1820.     DIM PointY AS LONG
  1821.  
  1822.     ' Coordinates of two corners of the current page.
  1823.     DIM PageTopLeftX AS LONG
  1824.     DIM PageTopLeftY AS LONG
  1825.     DIM PageBottomRightX AS LONG
  1826.     DIM PageBottomRightY AS LONG
  1827.     
  1828.     ' The width of each column, taking gutter into account.
  1829.     DIM RealColWidth AS LONG
  1830.     
  1831.     ' The width remaining for the columns after we add margins to the page.
  1832.     DIM WidthRemaining AS LONG
  1833.     
  1834.     ' The gutter in tenths of a micron.
  1835.     DIM GutterDraw AS LONG
  1836.     
  1837.     DIM Counter AS LONG
  1838.     
  1839.     IF RemoveExisting THEN
  1840.         .RemoveAllGuidelines
  1841.     ENDIF
  1842.     
  1843.     ' Calculate the page's corners based on the page size.
  1844.     PageTopLeftX& = -1 * (AvailableX& / 2)
  1845.     PageTopLeftY& =  1 * (AvailableY& / 2)
  1846.     PageBottomRightX& =  1 * (AvailableX& / 2)
  1847.     PageBottomRightY& = -1 * (AvailableY& / 2)
  1848.  
  1849.     ' Draw the basic margins.
  1850.     ' >> Left
  1851.         PointX& = PageTopLeftX& + ConvertToDrawUnits(LeftMargin&, LeftUnit%)
  1852.         PointY& = 0
  1853.         .CreateGuidelineUsingTwoPoints PointX&, PointY&, PointX&, PointY& + 10, LockGuidelines
  1854.     ' >> Right
  1855.         PointX& = PageBottomRightX& - ConvertToDrawUnits(RightMargin&, RightUnit%)
  1856.         PointY& = 0
  1857.         .CreateGuidelineUsingTwoPoints PointX&, PointY&, PointX&, PointY& + 10, LockGuidelines
  1858.     ' >> Up
  1859.         PointX& = 0
  1860.         PointY& = PageTopLeftY& - ConvertToDrawUnits(TopMargin&, TopUnit%)
  1861.         .CreateGuidelineUsingTwoPoints PointX&, PointY&, PointX& + 10, PointY&, LockGuidelines
  1862.     ' >> Down
  1863.         PointX& = 0
  1864.         PointY& = PageBottomRightY& + ConvertToDrawUnits(BottomMargin&, BottomUnit%)
  1865.         .CreateGuidelineUsingTwoPoints PointX&, PointY&, PointX& + 10, PointY&, LockGuidelines
  1866.  
  1867.     IF UseColumns THEN
  1868.  
  1869.         WidthRemaining& = CalculateWidthAfterMargins()
  1870.         GutterDraw& = ConvertToDrawUnits( Gutter&, GutterUnit% )
  1871.         RealColWidth& = (WidthRemaining& - (NumColumns% - 1)*GutterDraw&) / NumColumns%
  1872.  
  1873.         ' Draw each column's guides.
  1874.         PointY& = 0
  1875.         PointX& = PageTopLeftX& + ConvertToDrawUnits(LeftMargin&, LeftUnit%)
  1876.         FOR Counter& = 1 TO (NumColumns% - 1)
  1877.         
  1878.             ' The line before the gutter.
  1879.             PointX& = PointX& + RealColWidth&
  1880.             .CreateGuidelineUsingTwoPoints PointX&, PointY&, PointX&, PointY& + 10, LockGuidelines
  1881.  
  1882.             ' If there's a gutter, we have one more guideline to add.
  1883.             IF (Gutter& <> 0) THEN
  1884.                 PointX& = PointX& + GutterDraw&
  1885.                 .CreateGuidelineUsingTwoPoints PointX&, PointY&, PointX&, PointY& + 10, LockGuidelines
  1886.             ENDIF
  1887.         
  1888.         NEXT Counter&
  1889.             
  1890.     ENDIF
  1891.  
  1892. END SUB
  1893.  
  1894. SUB DoGridEffect()
  1895.  
  1896.     ' The points which will be used to generate the current guideline.
  1897.     DIM Point1X AS LONG
  1898.     DIM Point1Y AS LONG
  1899.     DIM Point2X AS LONG
  1900.     DIM Point2Y AS LONG
  1901.  
  1902.     ' Coordinates of two corners of the guideline area (non-rotated).
  1903.     DIM TopLeftX AS LONG
  1904.     DIM TopLeftY AS LONG
  1905.     DIM BottomRightX AS LONG
  1906.     DIM BottomRightY AS LONG
  1907.     
  1908.     ' The distance between each grid line.
  1909.     DIM HorizSpacing AS LONG
  1910.     DIM VertSpacing AS LONG
  1911.         
  1912.     ' A counter for the loops.
  1913.     DIM Counter AS LONG
  1914.  
  1915.     IF RemoveExisting THEN
  1916.         .RemoveAllGuidelines
  1917.     ENDIF
  1918.     
  1919.     ' Calculate the guideline area's corners based on the page size and margins.
  1920.     TopLeftX& = -1 * (AvailableX& / 2) + ConvertToDrawUnits(LeftMargin&, LeftUnit%)
  1921.     TopLeftY& =  1 * (AvailableY& / 2) - ConvertToDrawUnits(TopMargin&, TopUnit%)
  1922.     BottomRightX& =  1 * (AvailableX& / 2) - ConvertToDrawUnits(RightMargin&, RightUnit%)
  1923.     BottomRightY& = -1 * (AvailableY& / 2) + ConvertToDrawUnits(BottomMargin&, BottomUnit%)
  1924.  
  1925.     ' Calculate the distances between grid lines.
  1926.     IF VGuidelinesOn THEN
  1927.         VertSpacing& = (BottomRightX& - TopLeftX&) / (NumVGuidelines& - 1) 
  1928.     ENDIF
  1929.     IF HGuidelinesOn THEN
  1930.         HorizSpacing& = (TopLeftY& - BottomRightY&) / (NumHGuidelines& - 1)
  1931.     ENDIF
  1932.  
  1933.     ' Draw the vertical guidelines.
  1934.     Point1X& = TopLeftX&
  1935.     Point1Y& = TopLeftY&
  1936.     Point2X& = TopLeftX&
  1937.     Point2Y& = BottomRightY&
  1938.     IF VGuidelinesOn THEN    
  1939.         FOR Counter& = 1 TO NumVGuidelines
  1940.             ApplyRotation ChosenAngle%, Point1X&, Point1Y&, Point2X&, Point2Y&
  1941.             .CreateGuidelineUsingTwoPoints Point1X&, Point1Y&, Point2X&, Point2Y&, LockGuidelines
  1942.             
  1943.             ' Advance the location.
  1944.             Point1X& = Point1X& + VertSpacing&
  1945.             Point2X& = Point1X&
  1946.         NEXT Counter&
  1947.     ENDIF
  1948.     
  1949.     ' Draw the horizontal guidelines.
  1950.     Point1X& = TopLeftX&
  1951.     Point1Y& = BottomRightY&
  1952.     Point2X& = BottomRightX&
  1953.     Point2Y& = BottomRightY&
  1954.     IF HGuidelinesOn THEN
  1955.         FOR Counter& = 1 TO NumHGuidelines
  1956.             ApplyRotation ChosenAngle%, Point1X&, Point1Y&, Point2X&, Point2Y&
  1957.             .CreateGuidelineUsingTwoPoints Point1X&, Point1Y&, Point2X&, Point2Y&, LockGuidelines
  1958.             
  1959.             ' Advance the location.
  1960.             Point1Y& = Point1Y& + HorizSpacing&
  1961.             Point2Y& = Point1Y&
  1962.         NEXT Counter&
  1963.     ENDIF
  1964.  
  1965. END SUB
  1966.  
  1967. SUB DoCrossHairsEffect()
  1968.  
  1969.     ' The points which will be used to generate the current guideline.
  1970.     DIM Point1X AS LONG
  1971.     DIM Point1Y AS LONG
  1972.     DIM Point2X AS LONG
  1973.     DIM Point2Y AS LONG
  1974.     
  1975.     ' The center of the guideline effect (for instance, a triangular set of
  1976.     ' cross-hairs will have this point right in between all three cross-hairs).
  1977.     DIM MiddleX AS LONG
  1978.     DIM MiddleY AS LONG
  1979.         
  1980.     IF RemoveExisting THEN
  1981.         .RemoveAllGuidelines
  1982.     ENDIF
  1983.     
  1984.     ' Calculate the center of the effect.
  1985.     MiddleX& = 0 + ConvertToDrawUnits( CrossXOffset&, CrossXUnit% )
  1986.     MiddleY& = 0 + ConvertToDrawUnits( CrossYOffset&, CrossYUnit% )
  1987.  
  1988.     SELECT CASE CrossNum%
  1989.  
  1990.         CASE GW_CROSS_SINGLE%
  1991.             CreateCrossHairAt MiddleX&, MiddleY&
  1992.  
  1993.         CASE GW_CROSS_HORIZ_PAIR%
  1994.             CreateCrossHairAt CLNG(MiddleX& - (AvailableX&/4)), MiddleY&
  1995.             CreateCrossHairAt CLNG(MiddleX& + (AvailableX&/4)), MiddleY&
  1996.  
  1997.         CASE GW_CROSS_VERT_PAIR%
  1998.             CreateCrossHairAt MiddleX&, CLNG(MiddleY& + (AvailableY&/4))
  1999.             CreateCrossHairAt MiddleX&, CLNG(MiddleY& - (AvailableY&/4))
  2000.  
  2001.         CASE GW_CROSS_TRIANGLE%
  2002.             CreateCrossHairAt MiddleX&, CLNG(MiddleY& + (AvailableY&/4))
  2003.             CreateCrossHairAt CLNG(MiddleX& - (AvailableX&/4)), CLNG(MiddleY& - (AvailableY&/4))
  2004.             CreateCrossHairAt CLNG(MiddleX& + (AvailableX&/4)), CLNG(MiddleY& - (AvailableY&/4))
  2005.  
  2006.         CASE GW_CROSS_SQUARE%
  2007.             CreateCrossHairAt CLNG(MiddleX& - (AvailableX&/4)), CLNG(MiddleY& + (AvailableY&/4))
  2008.             CreateCrossHairAt CLNG(MiddleX& - (AvailableX&/4)), CLNG(MiddleY& - (AvailableY&/4))
  2009.             CreateCrossHairAt CLNG(MiddleX& + (AvailableX&/4)), CLNG(MiddleY& + (AvailableY&/4))
  2010.             CreateCrossHairAt CLNG(MiddleX& + (AvailableX&/4)), CLNG(MiddleY& - (AvailableY&/4))
  2011.  
  2012.     END SELECT
  2013.  
  2014. END SUB
  2015.  
  2016. SUB DoPresetEffect()
  2017.  
  2018.     SELECT CASE ChoiceNum%
  2019.     
  2020.         CASE GW_PRESET_ONE_INCH_MARGINS%
  2021.             LeftMargin& = 1
  2022.             LeftUnit% = GW_UNIT_1_INCH%
  2023.             RightMargin& = 1
  2024.             RightUnit% = GW_UNIT_1_INCH%
  2025.             BottomMargin& = 1
  2026.             BottomUnit% = GW_UNIT_1_INCH%
  2027.             TopMargin& = 1
  2028.             TopUnit% = GW_UNIT_1_INCH%
  2029.             UseColumns = FALSE
  2030.             DoMarginsEffect
  2031.             
  2032.         CASE GW_PRESET_THREE_COLUMN_NEWSLETTER%
  2033.             LeftMargin& = 5
  2034.             LeftUnit% = GW_UNIT_01_INCH%
  2035.             RightMargin& = 5
  2036.             RightUnit% = GW_UNIT_01_INCH%
  2037.             BottomMargin& = 5
  2038.             BottomUnit% = GW_UNIT_01_INCH%
  2039.             TopMargin& = 5
  2040.             TopUnit% = GW_UNIT_01_INCH%
  2041.             UseColumns = TRUE
  2042.             NumColumns% = 3
  2043.             Gutter& = 2
  2044.             GutterUnit% = GW_UNIT_01_INCH%
  2045.             DoMarginsEffect
  2046.             
  2047.         CASE GW_PRESET_BASIC_GRID%
  2048.             LeftMargin& = 1
  2049.             LeftUnit% = GW_UNIT_1_INCH%
  2050.             RightMargin& = 1
  2051.             RightUnit% = GW_UNIT_1_INCH%
  2052.             BottomMargin& = 1
  2053.             BottomUnit% = GW_UNIT_1_INCH%
  2054.             TopMargin& = 1
  2055.             TopUnit% = GW_UNIT_1_INCH%
  2056.             VGuidelinesOn = TRUE
  2057.             NumVGuidelines& = 11
  2058.             HGuidelinesOn = TRUE            
  2059.             NumHGuidelines& = 11
  2060.             ChosenAngle% = 0
  2061.             DoGridEffect
  2062.             
  2063.         CASE GW_PRESET_UPPER_LEFT_GRID%
  2064.             LeftMargin& = 0
  2065.             LeftUnit% = GW_UNIT_1_INCH%
  2066.             RightMargin& = 1000 * TOINCHES(AvailableX& / 2)
  2067.             RightUnit% = GW_UNIT_0001_INCH%
  2068.             BottomMargin& = 1000 * TOINCHES(AvailableY& / 2)
  2069.             BottomUnit% = GW_UNIT_0001_INCH%
  2070.             TopMargin& = 0
  2071.             TopUnit% = GW_UNIT_1_INCH%
  2072.             VGuidelinesOn = TRUE
  2073.             NumVGuidelines& = 6
  2074.             HGuidelinesOn = TRUE            
  2075.             NumHGuidelines& = 6
  2076.             ChosenAngle% = 0
  2077.             DoGridEffect
  2078.                     
  2079.         CASE GW_PRESET_SINGLE_CROSS_HAIR%
  2080.             CrossNum% = GW_CROSS_SINGLE%
  2081.             ChosenAngle% = 0
  2082.             NumSpokes% = 2
  2083.             CrossXOffset& = 0
  2084.             CrossXUnit% = GW_UNIT_1_INCH%
  2085.             CrossYOffset& = 0
  2086.             CrossYUnit% = GW_UNIT_1_INCH%
  2087.             DoCrossHairsEffect
  2088.         
  2089.         CASE GW_PRESET_DOUBLE_STARBURST%
  2090.             CrossNum% = GW_CROSS_HORIZ_PAIR%
  2091.             ChosenAngle% = 0
  2092.             NumSpokes% = 10
  2093.             CrossXOffset& = 0
  2094.             CrossXUnit% = GW_UNIT_1_INCH%
  2095.             CrossYOffset& = 0
  2096.             CrossYUnit% = GW_UNIT_1_INCH%
  2097.             DoCrossHairsEffect
  2098.                 
  2099.         CASE GW_PRESET_RIGHT_CORNER_STARBURST%
  2100.             CrossNum% = GW_CROSS_SINGLE%
  2101.             ChosenAngle% = 0
  2102.             NumSpokes% = 15
  2103.             CrossXOffset& = 1000 * TOINCHES(AvailableX& / 2)
  2104.             CrossXUnit% = GW_UNIT_0001_INCH%
  2105.             CrossYOffset& = 1000 * TOINCHES(AvailableY& / 2)
  2106.             CrossYUnit% = GW_UNIT_0001_INCH%
  2107.             DoCrossHairsEffect
  2108.     
  2109.     END SELECT
  2110.  
  2111. END SUB
  2112.  
  2113. SUB CreateCrossHairAt( PointX AS LONG, PointY AS LONG )
  2114.  
  2115.     CONST DRAW_DEGREE& = 1000000
  2116.  
  2117.     DIM Counter AS LONG        ' A counter for the loops.
  2118.     DIM CurAngle AS SINGLE    ' The current angle in degrees.
  2119.     DIM Turn AS SINGLE        ' The angle (degrees) between each spoke.
  2120.  
  2121.     ' Calculate the angle between each spoke.
  2122.     Turn! = 360 / (NumSpokes% * 2)    
  2123.     
  2124.     CurAngle! = ChosenAngle%
  2125.     FOR Counter& = 1 TO NumSpokes%
  2126.         ' Draw this guideline.
  2127.         .CreateGuidelineUsingAngle PointX&, PointY&, CLNG(CurAngle!) * DRAW_DEGREE&, LockGuidelines    
  2128.  
  2129.         ' Increment the angle.
  2130.         CurAngle! = CurAngle! + Turn!
  2131.     NEXT Counter&
  2132.  
  2133. END SUB
  2134.  
  2135. SUB ApplyRotation( BYVAL DegreeAngle AS INTEGER, \\
  2136.                  BYREF Point1X AS LONG, \\
  2137.                 BYREF Point1Y AS LONG, \\
  2138.                 BYREF Point2X AS LONG, \\
  2139.                 BYREF Point2Y AS LONG )
  2140.  
  2141.     CONST PI! = 3.141592654
  2142.  
  2143.     DIM NewPoint1X AS SINGLE
  2144.     DIM NewPoint1Y AS SINGLE
  2145.     DIM NewPoint2X AS SINGLE
  2146.     DIM NewPoint2Y AS SINGLE
  2147.  
  2148.     ' Convert DegreeAngle to radians.
  2149.     DIM RadianAngle AS SINGLE
  2150.     RadianAngle! = (PI!/180) * DegreeAngle%
  2151.                         
  2152.     ' Apply the standard mathematical rotation about the origin.
  2153. REM     NewPoint1X! = CSNG(Point1X&) * COS(RadianAngle!) - CSNG(Point1Y&) * SIN(RadianAngle!)
  2154. REM     NewPoint1Y! = CSNG(Point1X&) * SIN(RadianAngle!) + CSNG(Point1Y&) * COS(RadianAngle!)
  2155. REM     NewPoint2X! = CSNG(Point2X&) * COS(RadianAngle!) - CSNG(Point2Y&) * SIN(RadianAngle!)
  2156. REM     NewPoint2Y! = CSNG(Point2X&) * SIN(RadianAngle!) + CSNG(Point2Y&) * COS(RadianAngle!)
  2157.  
  2158.     ' Update the BYREF parameters.
  2159. REM     Point1X& = CLNG(NewPoint1X!)
  2160. REM     Point1Y& = CLNG(NewPoint1Y!)
  2161. REM     Point2X& = CLNG(NewPoint2X!)
  2162. REM     Point2Y& = CLNG(NewPoint2Y!)
  2163.     Point1X& = CLNG(Point1X&)
  2164.     Point1Y& = CLNG(Point1Y&)
  2165.     Point2X& = CLNG(Point2X&)
  2166.     Point2Y& = CLNG(Point2Y&)
  2167.  
  2168. END SUB
  2169.                 
  2170. FUNCTION CalculateWidthAfterMargins() AS LONG
  2171.  
  2172.     ' Coordinates of two corners of the current page.
  2173.     DIM PageTopLeftX AS LONG
  2174.     DIM PageBottomRightX AS LONG
  2175.     
  2176.     ' Calculate the page's corners based on the page size.
  2177.     PageTopLeftX& = -1 * (AvailableX& / 2)
  2178.     PageBottomRightX& =  1 * (AvailableX& / 2)
  2179.  
  2180.     CalculateWidthAfterMargins& = (PageBottomRightX& - ConvertToDrawUnits(RightMargin&, RightUnit%)) - \\
  2181.                                (PageTopLeftX& + ConvertToDrawUnits(LeftMargin&, LeftUnit%))
  2182.  
  2183. END FUNCTION
  2184.  
  2185. FUNCTION CalculateHeightAfterMargins() AS LONG
  2186.  
  2187.     ' Coordinates of two corners of the current page.
  2188.     DIM PageTopLeftY AS LONG
  2189.     DIM PageBottomRightY AS LONG
  2190.     
  2191.     ' Calculate the page's corners based on the page size.
  2192.     PageTopLeftY& =  1 * (AvailableY& / 2)
  2193.     PageBottomRightY& = -1 * (AvailableY& / 2)
  2194.  
  2195.     CalculateHeightAfterMargins& = (PageTopLeftY& - ConvertToDrawUnits(TopMargin&, TopUnit%)) - \\
  2196.                                    (PageBottomRightY& + ConvertToDrawUnits(BottomMargin&, BottomUnit%))
  2197.     
  2198. END FUNCTION
  2199.  
  2200. FUNCTION CalculateColumnWidth( ) AS LONG
  2201.  
  2202.     ' The page width left after margins.
  2203.     DIM WidthRemaining AS LONG
  2204.  
  2205.     ' Coordinates of two corners of the current page.
  2206.     DIM PageTopLeftX AS LONG
  2207.     DIM PageTopLeftY AS LONG
  2208.     DIM PageBottomRightX AS LONG
  2209.     DIM PageBottomRightY AS LONG
  2210.     
  2211.     ' Calculate the page's corners based on the page size.
  2212.     PageTopLeftX& = -1 * (AvailableX& / 2)
  2213.     PageTopLeftY& =  1 * (AvailableY& / 2)
  2214.     PageBottomRightX& =  1 * (AvailableX& / 2)
  2215.     PageBottomRightY& = -1 * (AvailableY& / 2)
  2216.  
  2217.     ' Calculate the amount of width remaining after margins.
  2218.     WidthRemaining& = (PageBottomRightX& - ConvertToDrawUnits(RightMargin&, RightUnit%)) - \\
  2219.                    (PageTopLeftX& + ConvertToDrawUnits(LeftMargin&, LeftUnit%))
  2220.     
  2221.     
  2222.  
  2223. END FUNCTION
  2224.  
  2225. '********************************************************************
  2226. '
  2227. '    Name:    GetNumberOfDisplayColors (function)
  2228. '
  2229. '    Action:    Returns the number of colors the user's screen
  2230. '              currently supports.
  2231. '
  2232. '    Params:    None.  
  2233. '
  2234. '    Returns:    None.
  2235. '
  2236. '    Comments:    To avoid overflows, this routine never returns
  2237. '              a number of colors greater than 16777216.  If there
  2238. '              are more colors, it returns this maximum.
  2239. '
  2240. '********************************************************************
  2241. FUNCTION GetNumberOfDisplayColors( ) AS LONG
  2242.  
  2243.     ' Constants to send to GetDeviceCaps.
  2244.     CONST BITSPIXEL& = 12    ' Gets the number of color bits per pixel.
  2245.     CONST PLANES& = 14        ' Gets the number of color planes.
  2246.     
  2247.     DIM hDC AS LONG        ' A display DC to query.
  2248.     DIM NumColors AS SINGLE    ' The retrieved number of colors.    
  2249.     DIM NumPlanes AS LONG    ' The retrieved number of planes.
  2250.     DIM NumBitsPixel AS LONG ' The retrieved number of bits per pixel.
  2251.     DIM RetVal AS LONG        
  2252.     
  2253.     ' Create a DC, then query it for the number of colors.
  2254.     hDC& = CreateDC("DISPLAY", 0, 0, 0)
  2255.     NumPlanes& = GetDeviceCaps(hDC, Planes&)
  2256.     NumBitsPixel& = GetDeviceCaps(hDC, BitsPixel&)
  2257.     NumColors! = CSNG(2) ^ CSNG(CSNG(NumPlanes&) * CSNG(NumBitsPixel&))
  2258.     RetVal& = DeleteDC(hDC)
  2259.     
  2260.     ' To avoid overflows with really high color displays, the
  2261.     ' maximum will be 24 bit color.
  2262.     IF NumColors! > 16777216 THEN
  2263.         GetNumberOfDisplayColors = 16777216
  2264.     ELSE
  2265.         GetNumberOfDisplayColors = NumColors!
  2266.     ENDIF
  2267.     
  2268. END FUNCTION
  2269.  
  2270. END WITHOBJECT
  2271.  
  2272.  
  2273.  
  2274.