home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / opendc12.zip / od124os2.exe / od12osp1.exe / src / pagepart / iodpage.cpp next >
C/C++ Source or Header  |  1997-04-02  |  125KB  |  3,557 lines

  1. //====START_GENERATED_PROLOG======================================
  2. //
  3. //
  4. //   COMPONENT_NAME: odpagepart
  5. //
  6. //   CLASSES: none
  7. //
  8. //   ORIGINS: 82,27
  9. //
  10. //
  11. //   (C) COPYRIGHT International Business Machines Corp. 1995,1996
  12. //   All Rights Reserved
  13. //   Licensed Materials - Property of IBM
  14. //   US Government Users Restricted Rights - Use, duplication or
  15. //   disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  16. //       
  17. //   IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  18. //   ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  19. //   PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  20. //   CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
  21. //   USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
  22. //   OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
  23. //   OR PERFORMANCE OF THIS SOFTWARE.
  24. //
  25. //====END_GENERATED_PROLOG========================================
  26. //
  27.  
  28. //   @(#) 1.19 com/src/samples/pagepart/iodpage.cpp, odpagepart, od96os2, odos29712d 3/7/97 13:03:16 [3/21/97 17:48:53]
  29.  
  30.  
  31. #ifndef SOM_Module_IODPage_Source
  32. #define SOM_Module_IODPage_Source
  33. #endif
  34. #define VARIABLE_MACROS
  35. #define METHOD_MACROS
  36.  
  37. #define PageLayout_Class_Source
  38. #define M_PageLayout_Class_Source
  39.  
  40. #ifdef _PLATFORM_OS2_
  41. #define INCL_PM
  42. #define INCL_GPI
  43. #define INCL_GPICIDS
  44. #define INCL_GPIPRIMITIVES
  45. #define INCL_DOS
  46. #define INCL_DOSERRORS
  47. #define INCL_DEV
  48.  
  49. #include <os2.h>
  50.  
  51. #define HDRAW HPS
  52.  
  53. // #define SMART_DRAWING // enables _fVisiblePagesShape and _fBackgroundShape code
  54. #endif //_PLATFORM_OS2_
  55.  
  56. #ifdef _PLATFORM_WIN32_
  57. #include <windows.h>
  58. #include <winuser.h>
  59. #include <wingdi.h>
  60. #include <commdlg.h>
  61. #include <commctrl.h>
  62.  
  63. #define HDRAW HDC
  64. #endif //_PLATFORM_WIN32_
  65.  
  66. #ifndef _ALTPOINT_
  67. #include <AltPoint.h> //jwa - MUST be included BEFORE ODTypes.h (better ODPoint, ODRect)
  68. #endif
  69.  
  70. #include <barray.h>
  71. #include <focuslib.h>
  72. #include <ODDebug.h>
  73. #include <ODRegApi.h>
  74. #include <ODRes.h>
  75. #include <ODTypes.h>
  76. #include <ODUtils.h>
  77. #include <StorUtil.h>
  78.  
  79. #ifndef SOM_ODShape_xh
  80. #include <shape.xh>
  81. #endif
  82.  
  83. #ifndef SOM_ODTransform_xh
  84. #include <Trnsform.xh>
  85. #endif
  86.  
  87. #ifndef SOM_ODFacet_xh
  88. #include <Facet.xh>
  89. #endif
  90.  
  91. #ifndef SOM_ODCanvas_xh
  92. #include <Canvas.xh>
  93. #endif
  94.  
  95. #ifndef SOM_ODFrame_xh
  96. #include <Frame.xh>
  97. #endif
  98.  
  99. #ifndef SOM_ODFrameFacetIterator_xh
  100. #include <FrFaItr.xh>
  101. #endif
  102.  
  103. #ifndef SOM_ODMenuBar_xh
  104. #include <MenuBar.xh>
  105. #endif
  106.  
  107. #ifndef SOM_ODSession_xh
  108. #include <ODSessn.xh>
  109. #endif
  110.  
  111. #ifndef SOM_Module_xh5cStdProps_OpenDoc_StdProps_defined
  112. #include <StdProps.xh>
  113. #endif
  114.  
  115. #ifndef SOM_Module_xh5cStdTypes_OpenDoc_StdTypes_defined
  116. #include <StdTypes.xh>
  117. #endif
  118.  
  119. #ifndef SOM_ODStorageUnit_xh
  120. #include <StorageU.xh>
  121. #endif
  122.  
  123. #ifndef SOM_ODWindow_xh
  124. #include <Window.xh>
  125. #endif
  126.  
  127. #include <iostream.h>
  128.  
  129. #include <ODRegApi.h>
  130. #include <ODDebug.h>
  131.  
  132. #ifndef SOM_PageLayoutPrintExtension_xh
  133. #include <IODPrint.hpp>
  134. #include <IODPgPrn.xh>
  135. #endif
  136.  
  137. #ifndef SOM_ODScrollExtension_xh
  138. #include <IODScrol.hpp>
  139. #include <IODScrol.xh>
  140. #endif
  141.  
  142. #ifndef _IODPAGE_RESOURCE_HEADER_
  143. #include "IODPgRes.h"
  144. #endif
  145.  
  146. #include <StdExts.xh>                    // for extension id strings
  147.  
  148. #include "IODPage.xih"
  149. #include "IODPage.hpp"
  150.  
  151. HMODULE MyResources = 0;
  152.  
  153. char* MRI(int id);
  154. extern void WarningBox(HWND hwnd, int MSG, char *stg);
  155. extern void CenterWindow(HWND hwnd); /* One of the ODPrintExtension's helpers */
  156.  
  157. #ifdef _PLATFORM_OS2_
  158. MRESULT EXPENTRY ChoosePageDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
  159. MRESULT EXPENTRY GetTextDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
  160. #endif //_PLATFORM_OS2_
  161.  
  162. #ifdef _PLATFORM_WIN32_
  163. LRESULT CALLBACK ChoosePageDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
  164. LRESULT CALLBACK GetTextDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
  165. #endif //_PLATFORM_WIN32_
  166.  
  167.  
  168. /********************************************************************
  169.   PageLayout's helper functions
  170. ********************************************************************/
  171.  
  172. inline void InitPropVal (Environment *ev, ODStorageUnit *su,
  173.                          ODPropertyName propName, ODValueType valName)
  174. {
  175.     if (ODSUExistsThenFocus (ev, su, propName, valName))
  176.          su->Remove (ev);
  177.  
  178.     ODSUAddPropValue (ev, su, propName, valName);
  179.  
  180. }
  181.  
  182.  
  183. //--------------------------------------------------------------------------
  184. //
  185. // This retrieves a character string from the string table in our resources
  186. //
  187. //--------------------------------------------------------------------------
  188.  
  189. char* MRI(int id)
  190. {
  191.    char *ReturnValue = (char *) malloc(sizeof(char)*256);
  192.    int rc = 0;
  193.  
  194. #ifdef _PLATFORM_OS2_
  195.    rc = WinLoadString((HAB)0, MyResources, id, 255, ReturnValue); // read string table
  196. #endif //_PLATFORM_OS2_
  197.  
  198. #ifdef _PLATFORM_WIN32_
  199.    rc = LoadString(MyResources, id, ReturnValue, 255);// read string table
  200. #endif
  201.  
  202.    if (!rc) {
  203.       strcpy(ReturnValue, StringNotFoundMsg);
  204.    } /* endif */
  205.  
  206.    return ReturnValue;
  207. }
  208.  
  209.  
  210. #ifdef _PLATFORM_WIN32_
  211. LRESULT CALLBACK ChoosePageDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  212. {
  213.    static short MaxPages;
  214.    short PageNumber;
  215.    BOOL error;
  216.  
  217.    switch (msg) {
  218.    case WM_INITDIALOG:
  219.       switch (HIWORD(lParam)) {
  220.       case GoToPageDlgValue:
  221.          SetWindowText(hwnd, MRI(GoToPageDlgTitle));
  222.          break;
  223.       case InsertPageDlgValue:
  224.          SetWindowText(hwnd, MRI(InsertPageDlgTitle));
  225.          break;
  226.       case RemovePageDlgValue:
  227.          SetWindowText(hwnd, MRI(RemovePageDlgTitle));
  228.          break;
  229.       } /* endswitch */
  230.  
  231.       SetDlgItemText(hwnd, ChoosePageEntryField, "1");
  232.       MaxPages = LOWORD(lParam);
  233.  
  234. #if 0 //couldn't get the spin button to work if defined in rc file
  235.       SendDlgItemMessage(hwnd, ChoosePageSpinButton, UDM_SETRANGE,
  236.          (WPARAM) 0, (LPARAM) MAKELONG(MaxPages, 1));
  237. #else
  238.       CreateUpDownControl(WS_CHILD | WS_BORDER | WS_VISIBLE |
  239.          UDS_SETBUDDYINT | UDS_ARROWKEYS | UDS_WRAP | UDS_ALIGNRIGHT,
  240.          0, 0, 0, 0, hwnd, ChoosePageSpinButton, MyResources,
  241.          GetDlgItem(hwnd, ChoosePageEntryField), MaxPages, 1, 1);
  242. #endif
  243.       break;
  244.  
  245.    case WM_COMMAND:
  246.       switch (LOWORD(wParam)) {
  247.       case IDOK:
  248.          PageNumber = GetDlgItemInt(hwnd, ChoosePageEntryField, &error, kODFalse);
  249.          if ((PageNumber<1) || (PageNumber>MaxPages)) {
  250.             MessageBox(hwnd, (PSZ) MRI(GoToPageErrorMsg), (PSZ) NULL,
  251.                MB_OK | MB_ICONSTOP | MB_SETFOREGROUND);
  252.             SetDlgItemInt(hwnd, ChoosePageEntryField, 1, kODFalse);
  253.          } else {
  254.             EndDialog(hwnd, PageNumber);
  255.          } /* endif */
  256.          break;
  257.       case IDCANCEL:
  258.          EndDialog(hwnd, kODNULL);
  259.          break;
  260.       } /* endswitch */
  261.       break;
  262.    default:
  263.       return(kODFalse);
  264.    } /* endswitch */
  265.    return(kODTrue);
  266. }
  267.  
  268.  
  269. LRESULT CALLBACK GetTextDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  270. {
  271.    static char *entryFieldText;
  272.  
  273.    switch (msg) {
  274.    case WM_INITDIALOG:
  275.       switch (lParam) {
  276.       case HeaderDlgValue:
  277.          SetWindowText(hwnd, MRI(HeaderDlgTitle));
  278.          break;
  279.       case FooterDlgValue:
  280.          SetWindowText(hwnd, MRI(FooterDlgTitle));
  281.          break;
  282.       } /* endswitch */
  283.  
  284.       entryFieldText = (char *) malloc(256*sizeof(char));
  285.       break;
  286.  
  287.    case WM_COMMAND:
  288.       switch (LOWORD(wParam)) {
  289.       case IDOK:
  290.          GetDlgItemText(hwnd, GetTextEntryField, entryFieldText, 255);
  291.          EndDialog(hwnd, (int) entryFieldText);
  292.          break;
  293.       case IDCANCEL:
  294.          free(entryFieldText);
  295.          EndDialog(hwnd, kODNULL);
  296.          break;
  297.       } /* endswitch */
  298.       break;
  299.    default:
  300.       return(kODFalse);
  301.    } /* endswitch */
  302.    return(kODTrue);
  303. }
  304. #endif //_PLATFORM_WIN32_
  305.  
  306.  
  307. #ifdef _PLATFORM_OS2_
  308. MRESULT EXPENTRY ChoosePageDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  309. {
  310.    MRESULT ReturnValue = FALSE;
  311.    HWND hwndParent, hwndTitle;
  312.    static MPARAM MaxPages;
  313.    static MPARAM FirstPage;
  314.    LONG PageNumber;
  315.  
  316.    switch (msg) {
  317.    case WM_INITDLG:
  318.       hwndParent = WinQueryWindow(hwnd, QW_PARENT);
  319.       hwndTitle = WinWindowFromID(hwndParent, ChoosePageDlgValue);
  320.  
  321.       switch (SHORT1FROMMP(mp2)) {
  322.       case GoToPageDlgValue:
  323.          WinSetWindowText(hwndTitle, MRI(GoToPageDlgTitle));
  324.          break;
  325.       case InsertPageDlgValue:
  326.          WinSetWindowText(hwndTitle, MRI(InsertPageDlgTitle));
  327.          break;
  328.       case RemovePageDlgValue:
  329.          WinSetWindowText(hwndTitle, MRI(RemovePageDlgTitle));
  330.          break;
  331.       } /* endswitch */
  332.  
  333.       FirstPage = MPFROMLONG(1);
  334.       MaxPages = MPFROMSHORT(SHORT2FROMMP(mp2));
  335.       WinSendDlgItemMsg(hwnd, ChoosePageSpinButton, SPBM_SETLIMITS,
  336.          MaxPages, FirstPage);
  337.       WinSendDlgItemMsg(hwnd, ChoosePageSpinButton, SPBM_SETCURRENTVALUE,
  338.          FirstPage, NULL);
  339.  
  340.       CenterWindow(hwnd);
  341.       break;
  342.    case WM_COMMAND:
  343.       switch (SHORT1FROMMP(mp1)) {
  344.       case DID_OK:
  345.          WinSendDlgItemMsg(hwnd, ChoosePageSpinButton, SPBM_QUERYVALUE,
  346.             &PageNumber, NULL);
  347.          if ((PageNumber<1) || (PageNumber>LONGFROMMP(MaxPages))) {
  348.             WinMessageBox(HWND_DESKTOP, hwnd, MRI(GoToPageErrorMsg),
  349.                (PSZ)NULL, 0, MB_ENTER | MB_ERROR);
  350.             WinSendDlgItemMsg(hwnd, ChoosePageSpinButton, SPBM_SETCURRENTVALUE,
  351.                FirstPage, NULL);
  352.          } else {
  353.             WinDismissDlg(hwnd, PageNumber);
  354.          } /* endif */
  355.          break;
  356.       case DID_CANCEL:
  357.          WinDismissDlg(hwnd, kODNULL);
  358.          break;
  359.       } /* endswitch */
  360.       break;
  361.    default:
  362.       return(WinDefDlgProc(hwnd, msg, mp1, mp2));
  363.      break;
  364.    } /* endswitch */
  365.    return(ReturnValue);
  366. }
  367.  
  368.  
  369. MRESULT EXPENTRY GetTextDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  370. {
  371.    MRESULT ReturnValue = FALSE;
  372.    HWND hwndParent, hwndTitle;
  373.    static char *entryFieldText;
  374.  
  375.    switch (msg) {
  376.    case WM_INITDLG:
  377.       hwndParent = WinQueryWindow(hwnd, QW_PARENT);
  378.       hwndTitle = WinWindowFromID(hwndParent, GetTextDlgValue);
  379.  
  380.       switch (LONGFROMMP(mp2)) {
  381.       case HeaderDlgValue:
  382.          WinSetWindowText(hwndTitle, MRI(HeaderDlgTitle));
  383.          break;
  384.       case FooterDlgValue:
  385.          WinSetWindowText(hwndTitle, MRI(FooterDlgTitle));
  386.          break;
  387.       } /* endswitch */
  388.  
  389.       entryFieldText = (char *) malloc(256*sizeof(char));
  390.       WinSendDlgItemMsg(hwnd, GetTextEntryField, EM_SETTEXTLIMIT,
  391.          MPFROMLONG(255), (MPARAM) 0);
  392.  
  393.       CenterWindow(hwnd);
  394.       break;
  395.    case WM_COMMAND:
  396.       switch (SHORT1FROMMP(mp1)) {
  397.       case DID_OK:
  398.          WinQueryDlgItemText(hwnd, GetTextEntryField, 255, entryFieldText);
  399.          WinDismissDlg(hwnd, (ULONG) entryFieldText);
  400.          break;
  401.       case DID_CANCEL:
  402.          free(entryFieldText);
  403.          WinDismissDlg(hwnd, kODNULL);
  404.          break;
  405.       } /* endswitch */
  406.       break;
  407.    default:
  408.       return(WinDefDlgProc(hwnd, msg, mp1, mp2));
  409.      break;
  410.    } /* endswitch */
  411.    return(ReturnValue);
  412. }
  413. #endif //_PLATFORM_OS2_
  414.  
  415.  
  416. /********************************************************************
  417.   PageLayout Methods
  418. ********************************************************************/
  419.  
  420. SOM_Scope void  SOMLINK PageLayoutUpdateContentExtent(PageLayout  *somSelf,
  421.                                                       Environment *ev,
  422.                                                       ODFrame     *myFrame)
  423. {
  424.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  425.     PageLayoutMethodDebug("PageLayout","PageLayoutUpdateContentExtent");
  426.  
  427.     ODPoint extent;
  428.     extent.x = MAKEFIXED(_fTotalPageWidth, 0);
  429.     extent.y = MAKEFIXED(_fTotalPageHeight * _fNumberOfPages, 0);
  430.     myFrame->ChangeContentExtent(ev, &extent);
  431. }
  432.  
  433. SOM_Scope ODExtension*  SOMLINK PageLayoutCreatePrintExtension(PageLayout *somSelf,
  434.                                                                 Environment *ev)
  435. {
  436.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  437.     PageLayoutMethodDebug("PageLayout","PageLayoutCreatePrintExtension");
  438.  
  439.     _fPrintExt = new PageLayoutPrintExtension;
  440.  
  441.     return _fPrintExt;
  442. }
  443.  
  444.  
  445. SOM_Scope ODExtension*  SOMLINK PageLayoutEnablePrinting(PageLayout *somSelf,
  446.                                                           Environment *ev,
  447.                                                          ODBoolean enable,
  448.                                                          char *QueueName)
  449. {
  450.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  451.     PageLayoutMethodDebug("PageLayout","PageLayoutEnablePrinting");
  452.  
  453.     if (_fPrintExt!=kODNULL) {
  454.        if (_fPrintExt->GetBase(ev)==kODNULL) { /* hasn't been initialized */
  455.           _fPrintExt->InitializeForPageLayout(ev, _fPartWrapper, QueueName, _fLeftPageOffset,
  456.  
  457. #ifdef _PLATFORM_OS2_
  458.              _fBottomPageOffset,
  459. #endif //_PLATFORM_OS2_
  460.  
  461. #ifdef _PLATFORM_WIN32_
  462.              _fTopPageOffset,
  463. #endif //_PLATFORM_WIN32_
  464.  
  465.              _fTotalPageWidth, _fTotalPageHeight, _fNumberOfPages);
  466.        } /* endif */
  467.     } /* endif */
  468.  
  469.     PageLayout_parent_BaseContainer_EnablePrinting(somSelf, ev,
  470.        enable, QueueName);
  471.  
  472.     return(_fPrintExt);
  473. }
  474.  
  475.  
  476. SOM_Scope ODBoolean  SOMLINK PageLayoutSetupPrinting(PageLayout *somSelf,
  477.                                                       Environment *ev,
  478.                                                      ODFrame* frame,
  479.                                                      ODEventData* event)
  480. {
  481.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  482.     PageLayoutMethodDebug("PageLayout","PageLayoutSetupPrinting");
  483.  
  484.     ODBoolean paperSizeChanged = PageLayout_parent_BaseContainer_SetupPrinting(
  485.                                     somSelf, ev, frame, event);
  486.  
  487.     if (paperSizeChanged) {
  488.        _ChangePaperSize(ev, frame);
  489.     } /* endif */
  490.  
  491.     return(paperSizeChanged);
  492. }
  493.  
  494.  
  495. SOM_Scope ODBoolean  SOMLINK PageLayoutHandleScrollEvent(PageLayout *somSelf,
  496.                                                           Environment *ev,
  497.                                                          ODFrame* frame,
  498.                                                          ODEventData* event)
  499. {
  500.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  501.     PageLayoutMethodDebug("PageLayout","PageLayoutHandleScrollEvent");
  502.  
  503.     ODBoolean handled = PageLayout_parent_BaseContainer_HandleScrollEvent(
  504.                            somSelf, ev, frame, event);
  505.  
  506.     if (handled) {
  507.        _DetermineVisiblePages(ev, frame);
  508.     } /* endif */
  509.  
  510.     return(handled);
  511. }
  512.  
  513.  
  514. SOM_Scope void  SOMLINK PageLayoutDetermineVisiblePages(PageLayout *somSelf,
  515.                                                          Environment *ev,
  516.                                                         ODFrame *frame)
  517. {
  518.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  519.     PageLayoutMethodDebug("PageLayout","PageLayoutDetermineVisiblePages");
  520.  
  521.     if (_fScrollExt!=kODNULL) {
  522.        short OldFirstVisiblePage = _fFirstVisiblePage;
  523.        short OldLastVisiblePage = _fLastVisiblePage;
  524.  
  525.        long CurrentVertScrollPos = _fScrollExt->GetVerticalScrollPosition(ev);
  526.        long VisibleHeight = _fScrollExt->GetVisibleHeight(ev);
  527.  
  528. #ifdef _PLATFORM_WIN32_
  529.        _fFirstVisiblePage = CurrentVertScrollPos/_fTotalPageHeight;
  530.  
  531.        _fLastVisiblePage =
  532.           (CurrentVertScrollPos+VisibleHeight-1)/_fTotalPageHeight;
  533. #endif
  534.  
  535. #ifdef _PLATFORM_OS2_
  536.        _fFirstVisiblePage = _fNumberOfPages-1-
  537.           (CurrentVertScrollPos+VisibleHeight)/_fTotalPageHeight;
  538.  
  539.        _fLastVisiblePage = _fNumberOfPages-1-
  540.           CurrentVertScrollPos/_fTotalPageHeight;
  541. #endif
  542.  
  543. /* Just in case we came up with numbers that are out of bounds */
  544.        if (_fFirstVisiblePage<0) {
  545.           _fFirstVisiblePage = 0;
  546.        } /* endif */
  547.  
  548.        if (_fLastVisiblePage>_fNumberOfPages-1) {
  549.           _fLastVisiblePage = _fNumberOfPages-1;
  550.        } /* endif */
  551.  
  552. #ifdef SMART_DRAWING
  553.        if ((_fFirstVisiblePage!=OldFirstVisiblePage) ||
  554.            (_fLastVisiblePage!=OldLastVisiblePage)) { /* Recalculate cached shapes */
  555.           _fVisiblePagesShape->Reset(ev);
  556.  
  557.           RECTL pageRect;
  558.           pageRect.xLeft = _fLeftPageOffset;
  559.           pageRect.xRight = _fLeftPageOffset+_fPageWidth;
  560.  
  561. #ifdef _PLATFORM_OS2_
  562.           pageRect.yBottom = _fBottomPageOffset;
  563.           pageRect.yTop = _fBottomPageOffset+_fPageHeight;
  564. #endif
  565.  
  566. #ifdef _PLATFORM_WIN32_
  567.           pageRect.yTop = _fTopPageOffset;
  568.           pageRect.yBottom = _fTopPageOffset+_fPageHeight;
  569. #endif
  570.  
  571.           ODRect pageODRect(pageRect);
  572.  
  573.           ODShape *pageShape = _fVisiblePagesShape->NewShape(ev);
  574.           pageShape->SetRectangle(ev, &pageODRect);
  575.           ODPoint offset(0, MAKEFIXED(_fFirstVisiblePage*_fTotalPageHeight, 0));
  576.           ODTransform *offsetXform = frame->CreateTransform(ev);
  577.  
  578.           for (int page=_fFirstVisiblePage; page<=_fLastVisiblePage; page++) {
  579.              offsetXform->SetOffset(ev, &offset);
  580.              ODShape *offsetPageShape = pageShape->Copy(ev);
  581.              offsetPageShape->Transform(ev, offsetXform);
  582.              _fVisiblePagesShape->Union(ev, offsetPageShape);
  583.              offsetPageShape->Release(ev);
  584.              offset.y += MAKEFIXED(_fTotalPageHeight, 0);
  585.           } /* endfor */
  586.           offsetXform->Release(ev);
  587.           pageShape->Release(ev);
  588.        } /* endif */
  589.  
  590.        ODShape *frameShape = frame->AcquireFrameShape(ev, kNoBias);
  591.        _fBackgroundShape->CopyFrom(ev, frameShape);
  592.        ODReleaseObject(ev, frameShape);
  593.  
  594.        ODTransform *internalXform = frame->AcquireInternalTransform(ev, kNoBias);
  595.        _fBackgroundShape->InverseTransform(ev, internalXform);
  596.        ODReleaseObject(ev, internalXform);
  597.  
  598.        _fBackgroundShape->Subtract(ev, _fVisiblePagesShape);
  599. #endif
  600.  
  601. // jwa: We ought to create facets for parts on pages that just came into view
  602. //     if ((_fFirstVisiblePage<OldFirstVisiblePage) ||
  603. //         (_fLastVisiblePage>OldLastVisiblePage)),
  604. //      and destroy facets for parts on pages that just went out of view
  605. //     if ((_fFirstVisiblePage>OldFirstVisiblePage) ||
  606. //         (_fLastVisiblePage<OldLastVisiblePage)).
  607.  
  608.     } /* endif */
  609. }
  610.  
  611.  
  612. SOM_Scope ODBoolean  SOMLINK PageLayoutMaxPagesReached(PageLayout *somSelf,
  613.                                                         Environment *ev)
  614. {
  615.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  616.     PageLayoutMethodDebug("PageLayout","PageLayoutMaxPagesReached");
  617.  
  618.     ODBoolean ReturnValue = kODFalse;
  619.  
  620.     long height = _fTotalPageHeight*(_fNumberOfPages+1);
  621.  
  622. #ifdef _PLATFORM_OS2_
  623. /* Due to 16-bit heritage of GPI (even though the GPI is now 32-bit, some of */
  624. /* its functions still have 16-bit limitations - the transform code is such  */
  625. /* an example), we can't let the numbers pass 32768 at any point in a series */
  626. /* of transformations, even if later transformations bring them back down    */
  627. /* within range.  The scaling factor on the root facet can end up pushing us */
  628. /* over this limit, so we really can only go up to 32768/_fYScaleFactor on   */
  629. /* the OS/2 platform.  NT doesn't have this problem.  For 8.5x11 paper, this */
  630. /* means that we have a 22 page limit on OS/2, and a 37 page limit on NT.    */
  631. /* Note - I tried scaling my internal transform (and scaling back during     */
  632. /* drawing) to get around this limitation, and although makes my drawing     */
  633. /* work OK beyond 22 pages, I then end up running into problems with the     */
  634. /* external transforms on my embedded parts (since transforms use fixed      */
  635. /* point representation, they live in a world with 16-bit limitations also), */
  636. /* which leads to the kODErrTransformErr exception when parts are on pages   */
  637. /* greater than 22.                                                          */
  638.     if (_fYScaleFactor>1.0) {
  639.        height *= _fYScaleFactor;
  640.     } /* endif */
  641. #endif
  642.  
  643.     if (height>32768) {
  644.        ReturnValue = kODTrue;
  645.     } /* endif */
  646.  
  647.     return ReturnValue;
  648. }
  649.  
  650.  
  651. SOM_Scope void  SOMLINK PageLayoutInsertPage(PageLayout *somSelf,
  652.                                               Environment *ev,
  653.                                              ODFrame* frame,
  654.                                              short pageNumber)
  655. {
  656.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  657.     PageLayoutMethodDebug("PageLayout","PageLayoutInsertPage");
  658.  
  659.     _fNumberOfPages++;
  660.     if (_fPrintExt!=kODNULL) {
  661.        _fPrintExt->SetNumberOfPages(ev, _fNumberOfPages);
  662.     } /* endif */
  663.  
  664. #ifdef _PLATFORM_OS2_
  665.     _MoveEmbedsByOnePage(ev, _fNumberOfPages-pageNumber-1, UP);
  666. #endif //_PLATFORM_OS2_
  667.  
  668. #ifdef _PLATFORM_WIN32_
  669.     if (pageNumber+1!=_fNumberOfPages) {
  670.        _MoveEmbedsByOnePage(ev, pageNumber, UP);
  671.     } /* endif */
  672. #endif //_PLATFORM_WIN32_
  673.  
  674.     _CreateSelectionBorderShapes(ev, kODNULL);
  675.  
  676.     if (_fScrollExt!=kODNULL) {
  677.        _UpdateContentExtent(ev, frame);
  678.        _fScrollExt->SetScrollableDimensions(ev, frame, _fTotalPageWidth,
  679.           _fTotalPageHeight*_fNumberOfPages);
  680.        _DetermineVisiblePages(ev, frame);
  681.     } /* endif */
  682. }
  683.  
  684.  
  685. SOM_Scope void  SOMLINK PageLayoutRemovePage(PageLayout *somSelf,
  686.                                               Environment *ev,
  687.                                              ODFrame* frame,
  688.                                              short pageNumber)
  689. {
  690.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  691.     PageLayoutMethodDebug("PageLayout","PageLayoutRemovePage");
  692.  
  693.     _fNumberOfPages--;
  694.     if (_fPrintExt!=kODNULL) {
  695.        _fPrintExt->SetNumberOfPages(ev, _fNumberOfPages);
  696.     } /* endif */
  697.  
  698. /* Remove any parts that were on the page being removed */
  699.     ALinkedList *itr = _GetEmbeddedObjects(ev);
  700.     if (itr!=kODNULL) {
  701.        ALink *item = itr->First(ev);
  702.        if (item!=kODNULL) {
  703.           ContentObject *cObj = (ContentObject *) item->Content(ev);
  704.           while (cObj!=kODNULL) {
  705.              short embedPageNumber = _DeterminePageNumberOfEmbed(ev, cObj);
  706. #ifdef _PLATFORM_OS2_
  707.              embedPageNumber = _fNumberOfPages-embedPageNumber;
  708. #endif //_PLATFORM_OS2_
  709.              if (embedPageNumber==pageNumber-1) {
  710.                 itr->Remove(ev, cObj);
  711.                 item = itr->First(ev); /* start over - old itr invalid */
  712.  
  713.                 ALinkedList *selItr = _GetSelectedObjects(ev);
  714.                 if (selItr && selItr->Contains(ev, cObj)) {
  715.                    selItr->Remove(ev, cObj);
  716.                 } /* endif */
  717.  
  718.                 cObj->DeleteContents(ev, OBJECT_DELETED);
  719.                 delete cObj;
  720.              } /* endif */
  721.  
  722.              item = item->Next(ev);
  723.              if (item!=kODNULL) {
  724.                 cObj = (ContentObject *) item->Content(ev);
  725.              } else {
  726.                 cObj = kODNULL;
  727.              } /* endif */
  728.           } /* endwhile */
  729.        } /* endif */
  730.     } /* endif */
  731.  
  732. #ifdef _PLATFORM_OS2_
  733.     _MoveEmbedsByOnePage(ev, _fNumberOfPages-pageNumber+1, DOWN);
  734. #endif //_PLATFORM_OS2_
  735.  
  736. #ifdef _PLATFORM_WIN32_
  737.     if (pageNumber-1!=_fNumberOfPages) {
  738.        _MoveEmbedsByOnePage(ev, pageNumber, DOWN);
  739.     } /* endif */
  740. #endif //_PLATFORM_WIN32_
  741.  
  742.     _CreateSelectionBorderShapes(ev, kODNULL);
  743.  
  744.     if (_fScrollExt!=kODNULL) {
  745.        _UpdateContentExtent(ev, frame);
  746.        _fScrollExt->SetScrollableDimensions(ev, frame, _fTotalPageWidth,
  747.           _fTotalPageHeight*_fNumberOfPages);
  748.        _DetermineVisiblePages(ev, frame);
  749.     } /* endif */
  750. }
  751.  
  752.  
  753. SOM_Scope void  SOMLINK PageLayoutChangePaperSize(PageLayout *somSelf,
  754.                                                    Environment *ev,
  755.                                                   ODFrame* frame)
  756. {
  757.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  758.     PageLayoutMethodDebug("PageLayout","PageLayoutChangePaperSize");
  759.  
  760.     if (_fPrintExt!=kODNULL) {
  761.        _fPageWidth = _fPrintExt->GetCurrentPrinterPageWidth(ev);
  762.        _fPageHeight = _fPrintExt->GetCurrentPrinterPageHeight(ev);
  763.  
  764.        _fTotalPageWidth = _fLeftPageOffset+_fPageWidth+_fRightPageOffset;
  765.        _fTotalPageHeight = _fBottomPageOffset+_fPageHeight+_fTopPageOffset;
  766.  
  767.        _ChangeNotification(ev, BCC_EMBEDSHAPECHANGED, frame, kODNULL,
  768.           kODTrue, kODNULL); /* keeps embeds within margins */
  769.  
  770.        if (_fPrintExt!=kODNULL) {
  771.           _fPrintExt->SetPageDimensions(ev, _fTotalPageWidth, _fTotalPageHeight);
  772.        } /* endif */
  773.  
  774.        if (_fScrollExt!=kODNULL) {
  775.           _UpdateContentExtent(ev, frame);
  776.           _fScrollExt->SetScrollableDimensions(ev, frame, _fTotalPageWidth,
  777.              _fTotalPageHeight*_fNumberOfPages);
  778.        } /* endif */
  779.     } /* endif */
  780. }
  781.  
  782.  
  783. SOM_Scope short  SOMLINK PageLayoutDeterminePageNumberOfEmbed(PageLayout *somSelf,
  784.                                                                Environment *ev,
  785.                                                               ContentObject* object)
  786. {
  787.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  788.     PageLayoutMethodDebug("PageLayout","PageLayoutDeterminePageNumberOfEmbed");
  789.  
  790.     short pageNumber = 0;
  791.  
  792.     if (object!=kODNULL) {
  793.        ODTransform *xform = object->_get_extTransform(ev);
  794.        if (xform!=kODNULL) {
  795.           ODPoint offset;
  796.           xform->GetOffset(ev, &offset);
  797.           pageNumber = (offset.y/0x10000)/_fTotalPageHeight;
  798.        } /* endif */
  799.     } /* endif */
  800.  
  801.     return pageNumber;
  802. }
  803.  
  804.  
  805. SOM_Scope ODBoolean  SOMLINK PageLayoutKeepEmbedWithinMargins(PageLayout *somSelf,
  806.                                                                Environment *ev,
  807.                                                               ContentObject* object)
  808. {
  809.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  810.     PageLayoutMethodDebug("PageLayout","PageLayoutKeepEmbedWithinMargins");
  811.  
  812.     ODBoolean adjusted = kODFalse;
  813.  
  814.     if (object!=kODNULL) {
  815.        short pageNumber = _DeterminePageNumberOfEmbed(ev, object);
  816.        if (pageNumber>_fNumberOfPages-1) {
  817.           pageNumber = _fNumberOfPages-1;
  818.        } /* endif */
  819.  
  820.        ODRect rect = object->_get_boundingRect(ev);
  821.        ODTransform *xform = object->_get_extTransform(ev);
  822.  
  823.        if (xform==kODNULL) return kODFalse;
  824.  
  825.        long width = (rect.right-rect.left)/0x10000;
  826.  
  827. #ifdef _PLATFORM_OS2_
  828.        long height = (rect.top-rect.bottom)/0x10000;
  829. #endif
  830.  
  831. #ifdef _PLATFORM_WIN32_
  832.        long height = (rect.bottom-rect.top)/0x10000;
  833. #endif
  834.  
  835.        ODPoint offset;
  836.        xform->GetOffset(ev, &offset);
  837.  
  838.        long Xlocation = offset.x/0x10000;
  839.        long Ylocation = offset.y/0x10000;
  840.  
  841.        ODBoolean NeedsOffseting = kODFalse;
  842.        ODBoolean NeedsResizing = kODFalse;
  843.  
  844.        long MinXPos = _fLeftPageOffset+_fLeftMargin+1;
  845.        if (Xlocation<MinXPos) {
  846.           NeedsOffseting = kODTrue;
  847.           Xlocation += MinXPos-Xlocation;
  848.        } /* endif */
  849.  
  850. #ifdef _PLATFORM_OS2_
  851.        long MinYPos = _fBottomPageOffset+_fBottomMargin
  852. #endif
  853. #ifdef _PLATFORM_WIN32_
  854.        long MinYPos = _fTopPageOffset+_fTopMargin
  855. #endif
  856.           +pageNumber*_fTotalPageHeight+1;
  857.  
  858.        if (Ylocation<MinYPos) {
  859.           NeedsOffseting = kODTrue;
  860.           Ylocation += MinYPos-Ylocation;
  861.        } /* endif */
  862.  
  863.        long MaxWidth = _fPageWidth-_fLeftMargin-_fRightMargin-1;
  864.        long MaxHeight = _fPageHeight-_fTopMargin-_fBottomMargin-1;
  865.  
  866.        long MaxXPos = _fLeftPageOffset+_fPageWidth-_fRightMargin;
  867.        if (Xlocation+width>MaxXPos) {
  868.           NeedsOffseting = kODTrue;
  869.           if (width>MaxWidth) {
  870.              Xlocation = MinXPos;
  871.              NeedsResizing = kODTrue;
  872.              width = MaxWidth;
  873.           } else {
  874.              Xlocation -= Xlocation+width-MaxXPos;
  875.           } /* endif */
  876.        } /* endif */
  877.  
  878. #ifdef _PLATFORM_OS2_
  879.        long MaxYPos = _fBottomPageOffset+_fPageHeight-_fTopMargin
  880. #endif
  881. #ifdef _PLATFORM_WIN32_
  882.        long MaxYPos = _fTopPageOffset+_fPageHeight-_fBottomMargin
  883. #endif
  884.           +pageNumber*_fTotalPageHeight;
  885.  
  886.        if (Ylocation+height>MaxYPos) {
  887.           NeedsOffseting = kODTrue;
  888.           if (height>MaxHeight) {
  889.              Ylocation = MinYPos;
  890.              NeedsResizing = kODTrue;
  891.              height = MaxHeight;
  892.           } else {
  893.              Ylocation -= Ylocation+height-MaxYPos;
  894.           } /* endif */
  895.        } /* endif */
  896.  
  897.        if (NeedsOffseting) {
  898.           ODPoint delta;
  899.           delta.x = Xlocation*0x10000-offset.x;
  900.           delta.y = Ylocation*0x10000-offset.y;
  901.  
  902.           object->MoveBy(ev, &delta);
  903.  
  904.           adjusted = kODTrue;
  905.        } /* endif */
  906.  
  907.        if (NeedsResizing) {
  908. #ifdef _PLATFORM_OS2_
  909.           ODULong resizeFlags = COBJ_RESIZE_RIGHT | COBJ_RESIZE_TOP;
  910. #endif
  911. #ifdef _PLATFORM_WIN32_
  912.           ODULong resizeFlags = COBJ_RESIZE_RIGHT | COBJ_RESIZE_BOTTOM;
  913. #endif
  914.  
  915.           ODPoint newExtent;
  916.           newExtent.x = (Xlocation+width)*0x10000;
  917.           newExtent.y = (Ylocation+height)*0x10000;
  918.  
  919.           object->Resize(ev, &newExtent, resizeFlags);
  920.  
  921.           adjusted = kODTrue;
  922.        } /* endif */
  923.     } /* endif */
  924.  
  925.     return adjusted;
  926. }
  927.  
  928.  
  929. SOM_Scope void  SOMLINK PageLayoutSnapToGrid(PageLayout *somSelf,
  930.                                               Environment *ev,
  931.                                              ODFrame *frame)
  932. {
  933.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  934.     PageLayoutMethodDebug("PageLayout","PageLayoutSnapToGrid");
  935.  
  936.     ALinkedList *itr = _GetSelectedObjects(ev);
  937.     if (itr!=kODNULL) {
  938.        ALink *item = itr->First(ev);
  939.        if (item!=kODNULL) {
  940.           ContentObject *cObj = (ContentObject *) item->Content(ev);
  941.           while (cObj!=kODNULL) {
  942.              short pageNumber = _DeterminePageNumberOfEmbed(ev, cObj);
  943.  
  944.              ODRect rect = cObj->_get_boundingRect(ev);
  945.  
  946.              long width = (rect.right-rect.left)/0x10000;
  947.  
  948. #ifdef _PLATFORM_OS2_
  949.              long height = (rect.top-rect.bottom)/0x10000;
  950. #endif //_PLATFORM_OS2_
  951.  
  952. #ifdef _PLATFORM_WIN32_
  953.              long height = (rect.bottom-rect.top)/0x10000;
  954. #endif //_PLATFORM_WIN32_
  955.  
  956.              ODTransform *xform = cObj->_get_extTransform(ev);
  957.              if (xform==kODNULL) break;
  958.  
  959.              ODPoint offset;
  960.              xform->GetOffset(ev, &offset);
  961.  
  962.              long Xlocation = offset.x/0x10000;
  963.              long Ylocation = offset.y/0x10000-pageNumber*_fTotalPageHeight;
  964.  
  965.              long leftGridLine = (Xlocation-_fLeftPageOffset-_fLeftMargin+
  966.                 _fGridSpacing/2)/_fGridSpacing;
  967.              long rightGridLine = leftGridLine+(width+
  968.                 _fGridSpacing/2)/_fGridSpacing;
  969.  
  970. #ifdef _PLATFORM_OS2_
  971.              long bottomGridLine = (Ylocation-_fBottomPageOffset-_fBottomMargin+
  972.                 _fGridSpacing/2)/_fGridSpacing;
  973.              long topGridLine = bottomGridLine+(height+
  974.                 _fGridSpacing/2)/_fGridSpacing;
  975. #endif //_PLATFORM_OS2_
  976.  
  977. #ifdef _PLATFORM_WIN32_
  978.              long topGridLine = (Ylocation-_fTopPageOffset-_fTopMargin+
  979.                 _fGridSpacing/2)/_fGridSpacing;
  980.              long bottomGridLine = topGridLine+(height+
  981.                 _fGridSpacing/2)/_fGridSpacing;
  982. #endif //_PLATFORM_WIN32_
  983.  
  984. /* Begin repositioning code */
  985.              long newXPos = _fLeftPageOffset+_fLeftMargin+
  986.                 leftGridLine*_fGridSpacing+1;
  987.  
  988. #ifdef _PLATFORM_OS2_
  989.              long newYPos = _fBottomPageOffset+_fBottomMargin+
  990.                 bottomGridLine*_fGridSpacing+pageNumber*_fTotalPageHeight+1;
  991. #endif //_PLATFORM_OS2_
  992.  
  993. #ifdef _PLATFORM_WIN32_
  994.              long newYPos = _fTopPageOffset+_fTopMargin+
  995.                 topGridLine*_fGridSpacing+pageNumber*_fTotalPageHeight+1;
  996. #endif //_PLATFORM_WIN32_
  997.  
  998.              ODPoint delta;
  999.              delta.x = newXPos*0x10000-offset.x;
  1000.              delta.y = newYPos*0x10000-offset.y;
  1001.  
  1002.              cObj->MoveBy(ev, &delta);
  1003.  
  1004. /* Begin resizing code */
  1005.              long newWidth = (rightGridLine-leftGridLine)*_fGridSpacing-1;
  1006.  
  1007. #ifdef _PLATFORM_OS2_
  1008.              long newHeight = (topGridLine-bottomGridLine)*_fGridSpacing-1;
  1009. #endif
  1010. #ifdef _PLATFORM_WIN32_
  1011.              long newHeight = (bottomGridLine-topGridLine)*_fGridSpacing-1;
  1012. #endif
  1013.  
  1014. #ifdef _PLATFORM_OS2_
  1015.              ODULong resizeFlags = COBJ_RESIZE_RIGHT | COBJ_RESIZE_TOP;
  1016. #endif
  1017. #ifdef _PLATFORM_WIN32_
  1018.              ODULong resizeFlags = COBJ_RESIZE_RIGHT | COBJ_RESIZE_BOTTOM;
  1019. #endif
  1020.  
  1021.              ODPoint newExtent;
  1022.              newExtent.x = (newXPos+newWidth)*0x10000;
  1023.              newExtent.y = (newYPos+newHeight)*0x10000;
  1024.  
  1025.              cObj->Resize(ev, &newExtent, resizeFlags);
  1026. /* End resizing code */
  1027.  
  1028.              item = item->Next(ev);
  1029.              if (item!=kODNULL) {
  1030.                 cObj = (ContentObject *) item->Content(ev);
  1031.              } else {
  1032.                 cObj = kODNULL;
  1033.              } /* endif */
  1034.           } /* endwhile */
  1035.        } /* endif */
  1036.     } /* endif */
  1037.  
  1038.     _CreateSelectionBorderShapes(ev, kODNULL);
  1039.     frame->Invalidate(ev, kODNULL, kNoBias);
  1040. }
  1041.  
  1042.  
  1043. SOM_Scope void  SOMLINK PageLayoutFillEntirePage(PageLayout *somSelf,
  1044.                                               Environment *ev,
  1045.                                              ODFrame *frame)
  1046. {
  1047.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  1048.     PageLayoutMethodDebug("PageLayout","PageLayoutFillEntirePage");
  1049.  
  1050.     ALinkedList *itr = _GetSelectedObjects(ev);
  1051.     if (itr!=kODNULL) {
  1052.        ALink *item = itr->First(ev);
  1053.        if (item!=kODNULL) {
  1054.           ContentObject *cObj = (ContentObject *) item->Content(ev);
  1055.           while (cObj!=kODNULL) {
  1056.              short pageNumber = _DeterminePageNumberOfEmbed(ev, cObj);
  1057.  
  1058.              ODTransform *xform = cObj->_get_extTransform(ev);
  1059.              if (xform==kODNULL) break;
  1060.  
  1061.              ODPoint offset;
  1062.              xform->GetOffset(ev, &offset);
  1063.  
  1064. /* Begin repositioning code */
  1065.              long XPos = _fLeftPageOffset+_fLeftMargin+1;
  1066.  
  1067. #ifdef _PLATFORM_OS2_
  1068.              long YPos = _fBottomPageOffset+_fBottomMargin
  1069. #endif
  1070. #ifdef _PLATFORM_WIN32_
  1071.              long YPos = _fTopPageOffset+_fTopMargin
  1072. #endif
  1073.                 +pageNumber*_fTotalPageHeight+1;
  1074.  
  1075.              ODPoint delta;
  1076.              delta.x = XPos*0x10000-offset.x;
  1077.              delta.y = YPos*0x10000-offset.y;
  1078.  
  1079.              cObj->MoveBy(ev, &delta);
  1080.  
  1081. /* Begin resizing code */
  1082.              long width = _fPageWidth-_fLeftMargin-_fRightMargin-1;
  1083.              long height = _fPageHeight-_fTopMargin-_fBottomMargin-1;
  1084.  
  1085. #ifdef _PLATFORM_OS2_
  1086.              ODULong resizeFlags = COBJ_RESIZE_RIGHT | COBJ_RESIZE_TOP;
  1087. #endif
  1088. #ifdef _PLATFORM_WIN32_
  1089.              ODULong resizeFlags = COBJ_RESIZE_RIGHT | COBJ_RESIZE_BOTTOM;
  1090. #endif
  1091.  
  1092.              ODPoint newExtent;
  1093.              newExtent.x = (XPos+width)*0x10000;
  1094.              newExtent.y = (YPos+height)*0x10000;
  1095.  
  1096.              cObj->Resize(ev, &newExtent, resizeFlags);
  1097. /* End resizing code */
  1098.  
  1099.              item = item->Next(ev);
  1100.              if (item!=kODNULL) {
  1101.                 cObj = (ContentObject *) item->Content(ev);
  1102.              } else {
  1103.                 cObj = kODNULL;
  1104.              } /* endif */
  1105.           } /* endwhile */
  1106.        } /* endif */
  1107.     } /* endif */
  1108.  
  1109.     _CreateSelectionBorderShapes(ev, kODNULL);
  1110.     frame->Invalidate(ev, kODNULL, kNoBias);
  1111. }
  1112.  
  1113.  
  1114. SOM_Scope void  SOMLINK PageLayoutMoveEmbedsByOnePage(PageLayout *somSelf,
  1115.                                                        Environment *ev,
  1116.                                                       short afterPage,
  1117.                                                       short direction)
  1118. {
  1119.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  1120.     PageLayoutMethodDebug("PageLayout","PageLayoutMoveEmbedByOnePage");
  1121.  
  1122.     ALinkedList *itr = _GetEmbeddedObjects(ev);
  1123.     if (itr!=kODNULL) {
  1124.        ALink *item = itr->First(ev);
  1125.        if (item!=kODNULL) {
  1126.           ODPoint pageHeight(0, _fTotalPageHeight*direction*0x10000);
  1127.  
  1128.           ContentObject *cObj = (ContentObject *) item->Content(ev);
  1129.           while (cObj!=kODNULL) {
  1130.              short pageNumber = _DeterminePageNumberOfEmbed(ev, cObj);
  1131.              if (pageNumber>=afterPage) {
  1132.                 cObj->MoveBy(ev, &pageHeight);
  1133.              } /* endif */
  1134.  
  1135.              item = item->Next(ev);
  1136.              if (item!=kODNULL) {
  1137.                 cObj = (ContentObject *) item->Content(ev);
  1138.              } else {
  1139.                 cObj = kODNULL;
  1140.              } /* endif */
  1141.           } /* endwhile */
  1142.        } /* endif */
  1143.     } /* endif */
  1144. }
  1145.  
  1146.  
  1147. SOM_Scope void  SOMLINK PageLayoutResizeDocShell(PageLayout *somSelf,
  1148.                                                   Environment *ev,
  1149.                                                  ODFacet* facet)
  1150. {
  1151.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  1152.     PageLayoutMethodDebug("PageLayout","PageLayoutResizeDocShell");
  1153.  
  1154.     ODPoint frameCorner(MAKEFIXED(_fTotalPageWidth, 0),
  1155.                         MAKEFIXED(_fTotalPageHeight, 0));
  1156.  
  1157.     ODTransform *frameXform = facet->AcquireFrameTransform(ev, kNoBias);
  1158.     frameXform->TransformPoint(ev, &frameCorner);
  1159.     frameXform->Release(ev);
  1160.  
  1161. //  LONG width = frameCorner.x/0x10000;
  1162. //  LONG height = frameCorner.y/0x10000;
  1163. // jwa: above two lines could lead to rounding errors
  1164.     LONG width = (frameCorner.x+0x10000/2)/0x10000;
  1165.     LONG height = (frameCorner.y+0x10000/2)/0x10000;
  1166.  
  1167.     ODWindow *window = facet->GetWindow(ev);
  1168.  
  1169.     ODPlatformWindow hwnd = window->GetPlatformWindow(ev);
  1170.  
  1171. #ifdef _PLATFORM_OS2_
  1172.     RECTL rect = {0, 0, width, height};
  1173.  
  1174.     WinCalcFrameRect(hwnd, &rect, kODFalse);
  1175.  
  1176.     width = rect.xRight-rect.xLeft;
  1177.     height = rect.yTop-rect.yBottom;
  1178.  
  1179.     LONG ScreenWidth = WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN);
  1180.     LONG ScreenHeight = WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN);
  1181.  
  1182.     LONG xOffset = (ScreenWidth-width)/2;
  1183.     LONG yOffset = (ScreenHeight-height)/2;
  1184.  
  1185.     WinSetWindowPos(hwnd, NULL, xOffset>0 ? xOffset : 0,
  1186.        yOffset>0 ? yOffset : 0, width<ScreenWidth ? width : ScreenWidth,
  1187.        height<ScreenHeight ? height : ScreenHeight, SWP_SIZE | SWP_MOVE);
  1188. #endif //_PLATFORM_OS2_
  1189.  
  1190. #ifdef _PLATFORM_WIN32_
  1191.     Rect rect = {0, 0, width, height};
  1192.  
  1193.     AdjustWindowRect(&rect, GetWindowLong(hwnd, GWL_STYLE), kODTrue);
  1194.  
  1195.     width = rect.right-rect.left;
  1196.     height = rect.bottom-rect.top;
  1197.  
  1198. //  LONG ScreenWidth = GetScreenWidth();
  1199. //  LONG ScreenHeight = GetScreenHeight();
  1200.  
  1201.     HDC screenDC = GetDC(hwnd);
  1202.     LONG ScreenWidth = GetDeviceCaps(screenDC, HORZRES);
  1203.     LONG ScreenHeight = GetDeviceCaps(screenDC, VERTRES);
  1204.     ReleaseDC(hwnd, screenDC);
  1205.  
  1206.     LONG xOffset = (ScreenWidth-width)/2;
  1207.     LONG yOffset = (ScreenHeight-height)/2;
  1208.  
  1209.     SetWindowPos(hwnd, NULL, xOffset>0 ? xOffset : 0,
  1210.        yOffset>0 ? yOffset : 0, width<ScreenWidth ? width : ScreenWidth,
  1211.        height<ScreenHeight ? height : ScreenHeight,
  1212.        SWP_NOZORDER | SWP_NOACTIVATE);
  1213. #endif //_PLATFORM_WIN32_
  1214. }
  1215.  
  1216.  
  1217. SOM_Scope void  SOMLINK PageLayoutCreateMenuBar(PageLayout *somSelf,
  1218.                                                  Environment *ev)
  1219. {
  1220.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  1221.     PageLayoutMethodDebug("PageLayout","PageLayoutCreateMenuBar");
  1222.  
  1223.     _fMenuBar = _GetMenuBar(ev);
  1224.     if (_fMenuBar!=kODNULL) {
  1225.        _fMenuBar->RemoveMenu(ev, kODOptionsMenuID);
  1226.  
  1227.        ODPlatformMenuItem *item = new ODPlatformMenuItem;
  1228.  
  1229.        // clear the memory
  1230.        memset (item, 0, sizeof(ODPlatformMenuItem));
  1231.  
  1232.        // add a menu separator line to EDIT menu
  1233.        item->id=MenuSeparator3;
  1234.        #if defined(_PLATFORM_WIN32_)
  1235.            item->afAttribute=MF_SEPARATOR;
  1236.        #elif defined(_PLATFORM_OS2_)
  1237.            item->afAttribute=CA_TITLESEPARATOR;
  1238.        #endif
  1239.        _fMenuBar->AddMenuItemLast(ev, IDMS_EDIT, item->id, item);
  1240.  
  1241.        item->afAttribute=0;           // use default attributes
  1242.        item->id=MenuFillPage;
  1243.        _fMenuBar->AddMenuItemLast(ev, IDMS_EDIT, item->id, item);
  1244.        _fMenuBar->SetMenuItemText(ev, IDMS_EDIT, item->id,
  1245.           MRI(FillPageString));
  1246.  
  1247.        item->id=MenuSnapToGrid;
  1248.        _fMenuBar->AddMenuItemLast(ev, IDMS_EDIT, item->id, item);
  1249.        _fMenuBar->SetMenuItemText(ev, IDMS_EDIT, item->id,
  1250.           MRI(SnapToGridString));
  1251.  
  1252.        // add a menu separator line to VIEW menu
  1253.        item->id=MenuSeparator4;
  1254.        #if defined(_PLATFORM_WIN32_)
  1255.            item->afAttribute=MF_SEPARATOR;
  1256.        #elif defined(_PLATFORM_OS2_)
  1257.            item->afAttribute=CA_TITLESEPARATOR;
  1258.        #endif
  1259.        _fMenuBar->AddMenuItemLast(ev, IDMS_VIEW, item->id, item);
  1260.  
  1261.        item->afAttribute=0;           // use default attributes
  1262.        item->id=MenuShowRulers;
  1263.        _fMenuBar->AddMenuItemLast(ev, IDMS_VIEW, item->id, item);
  1264.        _fMenuBar->SetMenuItemText(ev, IDMS_VIEW, item->id,
  1265.           MRI(ShowRulersString));
  1266.  
  1267.        item->id=MenuShowMargins;
  1268.        _fMenuBar->AddMenuItemLast(ev, IDMS_VIEW, item->id, item);
  1269.        _fMenuBar->SetMenuItemText(ev, IDMS_VIEW, item->id,
  1270.           MRI(ShowMarginsString));
  1271.  
  1272.        item->id=MenuShowGrid;
  1273.        _fMenuBar->AddMenuItemLast(ev, IDMS_VIEW, item->id, item);
  1274.        _fMenuBar->SetMenuItemText(ev, IDMS_VIEW, item->id,
  1275.           MRI(ShowGridString));
  1276.  
  1277.        // add another menu separator line to VIEW menu
  1278.        item->id=MenuSeparator5;
  1279.        #if defined(_PLATFORM_WIN32_)
  1280.            item->afAttribute=MF_SEPARATOR;
  1281.        #elif defined(_PLATFORM_OS2_)
  1282.            item->afAttribute=CA_TITLESEPARATOR;
  1283.        #endif
  1284.        _fMenuBar->AddMenuItemLast(ev, IDMS_VIEW, item->id, item);
  1285.  
  1286.        item->afAttribute=0;           // use default attributes
  1287.        item->id=MenuRefresh;
  1288.        _fMenuBar->AddMenuItemLast(ev, IDMS_VIEW, item->id, item);
  1289.        _fMenuBar->SetMenuItemText(ev, IDMS_VIEW, item->id,
  1290.           MRI(RefreshString));
  1291.  
  1292.        ODPlatformMenu PageMenu;
  1293.  
  1294. #ifdef _PLATFORM_OS2_
  1295.        PageMenu = WinLoadMenu(HWND_OBJECT, _fResources, PageMenuID);
  1296. #endif
  1297.  
  1298. #ifdef _PLATFORM_WIN32_
  1299.        PageMenu = LoadMenu(_fResources, MAKEINTRESOURCE(PageMenuID));
  1300. #endif
  1301.  
  1302.        if (PageMenu!=kODNULL) {
  1303.           _fMenuBar->AddMenuLast(ev, PageMenuID, PageMenu, _fPartWrapper);
  1304. //        _fMenuBar->SetMenuItemText(ev, PageMenuID, kODNULL,
  1305.           _fMenuBar->SetMenuItemText(ev, ID_BASEMENUBAR, PageMenuID,
  1306.              MRI(PageMenuString));
  1307.        } else {
  1308. #ifdef _PLATFORM_OS2_
  1309.           DosBeep(250,500);
  1310. #endif
  1311.  
  1312. #ifdef _PLATFORM_WIN32_
  1313.           Beep(250,500);
  1314. #endif
  1315.        } /* endif */
  1316.  
  1317.        ODPlatformMenu ColorMenu;
  1318.  
  1319. #ifdef _PLATFORM_OS2_
  1320.        ColorMenu = WinLoadMenu(HWND_OBJECT, _fResources, ColorMenuID);
  1321. #endif
  1322.  
  1323. #ifdef _PLATFORM_WIN32_
  1324.        ColorMenu = LoadMenu(_fResources, MAKEINTRESOURCE(ColorMenuID));
  1325. #endif
  1326.  
  1327.        if (ColorMenu!=kODNULL) {
  1328.           _fMenuBar->AddMenuLast(ev, ColorMenuID, ColorMenu, _fPartWrapper);
  1329. //        _fMenuBar->SetMenuItemText(ev, ColorMenuID, kODNULL,
  1330.           _fMenuBar->SetMenuItemText(ev, ID_BASEMENUBAR, ColorMenuID,
  1331.              MRI(ColorMenuString));
  1332.        } else {
  1333. #ifdef _PLATFORM_OS2_
  1334.           DosBeep(250,500);
  1335. #endif
  1336.  
  1337. #ifdef _PLATFORM_WIN32_
  1338.           Beep(250,500);
  1339. #endif
  1340.        } /* endif */
  1341.     } /* endif */
  1342. }
  1343.  
  1344.  
  1345. SOM_Scope void  SOMLINK PageLayoutDrawPage(PageLayout *somSelf,
  1346.                                             Environment *ev,
  1347.                                            HDRAW DrawingSurface, // HPS on OS/2, HDC on Win32
  1348.                                            short pageNumber,
  1349.                                            ODBoolean isPrinting,
  1350.                                            ODBoolean DrawAdornments)
  1351. {
  1352.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  1353.     PageLayoutMethodDebug("PageLayout","PageLayoutDrawPage");
  1354.  
  1355. #ifdef _PLATFORM_OS2_
  1356.     POINTL ptl;
  1357.     LONG PageYPos = _fBottomPageOffset+pageNumber*_fTotalPageHeight;
  1358.  
  1359. #ifndef SMART_DRAWING
  1360.     if (!_fIsTransparent &&
  1361.         (DrawAdornments || (isPrinting && _fPrintPageColor))) {
  1362.  
  1363.        ptl.x = _fLeftPageOffset;
  1364.        ptl.y = PageYPos;
  1365.        GpiMove(DrawingSurface, &ptl);
  1366.  
  1367.        ptl.x += _fPageWidth;
  1368.        ptl.y += _fPageHeight;
  1369.  
  1370.        GpiSetColor(DrawingSurface, _fPageColor);
  1371.        GpiBox(DrawingSurface, DRO_FILL, &ptl, 0, 0);
  1372.     } /* endif */
  1373. #endif //SMART_DRAWING
  1374.  
  1375.     if (_fShowGrid && DrawAdornments) {
  1376.        GpiSetLineType(DrawingSurface, _fGridLine);
  1377.        GpiSetColor(DrawingSurface, _fGridColor);
  1378.  
  1379.        LONG MaxGridWidth = _fPageWidth-_fLeftMargin-_fRightMargin;
  1380.        LONG MaxGridHeight = _fPageHeight-_fBottomMargin-_fTopMargin;
  1381.  
  1382.     /* Draw Horizontal grid lines */
  1383.        for (short index2=0; index2*_fGridSpacing<=MaxGridHeight; index2++) {
  1384.           ptl.y = PageYPos+_fBottomMargin+index2*_fGridSpacing;
  1385.           ptl.x = _fLeftPageOffset+_fLeftMargin;
  1386.           GpiMove(DrawingSurface, &ptl);
  1387.  
  1388.           ptl.x += MaxGridWidth;
  1389.           GpiLine(DrawingSurface, &ptl);
  1390.        } /* endfor */
  1391.  
  1392.     /* Draw Vertical grid lines */
  1393.        for (index2=0; index2*_fGridSpacing<=MaxGridWidth; index2++) {
  1394.           ptl.x = _fLeftPageOffset+_fLeftMargin+index2*_fGridSpacing;
  1395.           ptl.y = PageYPos+_fBottomMargin;
  1396.           GpiMove(DrawingSurface, &ptl);
  1397.  
  1398.           ptl.y += MaxGridHeight;
  1399.           GpiLine(DrawingSurface, &ptl);
  1400.        } /* endfor */
  1401.     } /* endif */
  1402.  
  1403.     if (DrawAdornments) {
  1404.        GpiSetLineType(DrawingSurface, _fMarginLine);
  1405.  
  1406.        GpiSetColor(DrawingSurface, _fVertMarginColor);
  1407.        if (_fShowVertMargins) {
  1408.        /* Draw Left Margin */
  1409.           ptl.x = _fLeftPageOffset+_fLeftMargin;
  1410.           ptl.y = PageYPos;
  1411.           GpiMove(DrawingSurface, &ptl);
  1412.  
  1413.           ptl.y += _fPageHeight;
  1414.           GpiLine(DrawingSurface, &ptl);
  1415.  
  1416.        /* Draw Right Margin */
  1417.           ptl.x = _fLeftPageOffset+_fPageWidth-_fRightMargin;
  1418.           ptl.y = PageYPos;
  1419.           GpiMove(DrawingSurface, &ptl);
  1420.  
  1421.           ptl.y += _fPageHeight;
  1422.           GpiLine(DrawingSurface, &ptl);
  1423.        } /* endif */
  1424.  
  1425.        if (_fShowHorzMargins) {
  1426.           GpiSetLineType(DrawingSurface, _fMarginLine);
  1427.           GpiSetColor(DrawingSurface, _fHorzMarginColor);
  1428.        /* Draw Bottom Margin */
  1429.           ptl.y = PageYPos+_fBottomMargin;
  1430.           ptl.x = _fLeftPageOffset;
  1431.           GpiMove(DrawingSurface, &ptl);
  1432.  
  1433.           ptl.x += _fPageWidth;
  1434.           GpiLine(DrawingSurface, &ptl);
  1435.  
  1436.        /* Draw Top Margin */
  1437.           ptl.y = PageYPos+_fPageHeight-_fTopMargin;
  1438.           ptl.x = _fLeftPageOffset;
  1439.           GpiMove(DrawingSurface, &ptl);
  1440.  
  1441.           ptl.x += _fPageWidth;
  1442.           GpiLine(DrawingSurface, &ptl);
  1443.        } /* endif */
  1444.     } /* endif */
  1445.  
  1446.     if (_fShowHorzRuler && DrawAdornments) {
  1447.     /* Begin Horizontal Ruler stuff */
  1448.        float UnitLength;
  1449.        float distance;
  1450.        GpiSetLineType(DrawingSurface, LINETYPE_SOLID);
  1451.  
  1452.     /* Draw "tick" marks for margins */
  1453.        GpiSetColor(DrawingSurface, _fVertMarginColor);
  1454.        LONG HorzRulerPos = _fPageHeight+_fTopPageOffset-HORZ_RULER_OFFSET;
  1455.  
  1456.     /* Left Margin tick mark */
  1457.        ptl.x = _fLeftPageOffset+_fLeftMargin-TICK_MARK_SIZE/2+1;
  1458.        ptl.y = PageYPos+HorzRulerPos+1;
  1459.        GpiMove(DrawingSurface, &ptl);
  1460.  
  1461.        GpiBeginPath(DrawingSurface, 1L); /* Draw triangle */
  1462.           ptl.x += TICK_MARK_SIZE;
  1463.           GpiLine(DrawingSurface, &ptl);
  1464.  
  1465.           ptl.x -= TICK_MARK_SIZE/2;
  1466.           ptl.y -= TICK_MARK_SIZE/2;
  1467.           GpiLine(DrawingSurface, &ptl);
  1468.  
  1469.           ptl.x -= TICK_MARK_SIZE/2;
  1470.           ptl.y += TICK_MARK_SIZE/2;
  1471.           GpiLine(DrawingSurface, &ptl);
  1472.        GpiEndPath(DrawingSurface);
  1473.        GpiFillPath(DrawingSurface, 1L, FPATH_ALTERNATE);
  1474.  
  1475.     /* Right Margin tick mark */
  1476.        ptl.x = _fLeftPageOffset+_fPageWidth-_fRightMargin-TICK_MARK_SIZE/2;
  1477.        ptl.y = PageYPos+HorzRulerPos+1;
  1478.        GpiMove(DrawingSurface, &ptl);
  1479.  
  1480.        GpiBeginPath(DrawingSurface, 1L); /* Draw triangle */
  1481.           ptl.x += TICK_MARK_SIZE;
  1482.           GpiLine(DrawingSurface, &ptl);
  1483.  
  1484.           ptl.x -= TICK_MARK_SIZE/2;
  1485.           ptl.y -= TICK_MARK_SIZE/2;
  1486.           GpiLine(DrawingSurface, &ptl);
  1487.  
  1488.           ptl.x -= TICK_MARK_SIZE/2;
  1489.           ptl.y += TICK_MARK_SIZE/2;
  1490.           GpiLine(DrawingSurface, &ptl);
  1491.        GpiEndPath(DrawingSurface);
  1492.        GpiFillPath(DrawingSurface, 1L, FPATH_ALTERNATE);
  1493.  
  1494.     /* Draw Horizontal ruler */
  1495.        GpiSetColor(DrawingSurface, _fRulerColor);
  1496.  
  1497.        ptl.y = PageYPos+HorzRulerPos+1;
  1498.        ptl.x = _fLeftPageOffset;
  1499.        GpiMove(DrawingSurface, &ptl);
  1500.  
  1501.        ptl.x += _fPageWidth;
  1502.        GpiLine(DrawingSurface, &ptl);
  1503.  
  1504.     /* Draw numbers next to each inch/centimeter mark */
  1505.        UnitLength = _fRulerUnits==INCHES ? INCH_LENGTH : CENTIMETER_LENGTH;
  1506.  
  1507.        ptl.y = PageYPos+HorzRulerPos+RULER_UNIT_OFFSET;
  1508.        char UnitString[5];
  1509.        LONG HalfStringSize;
  1510.        for (short unit=0; unit*UnitLength<=_fPageWidth; unit++) {
  1511.           sprintf(UnitString, "%d", unit);
  1512.           HalfStringSize = HALF_CHAR_SIZE*strlen(UnitString);
  1513.           ptl.x = _fLeftPageOffset+unit*UnitLength-HalfStringSize;
  1514.           GpiCharStringAt(DrawingSurface, &ptl, strlen(UnitString), UnitString);
  1515.        } /* endfor */
  1516.  
  1517.        if (_fRulerUnits==INCHES) {
  1518.     /* Draw Inch marks */
  1519.           ptl.x = _fLeftPageOffset;
  1520.           for (short index2=0; index2*INCH_LENGTH<=_fPageWidth; index2++) {
  1521.              ptl.y = PageYPos+HorzRulerPos+1;
  1522.              GpiMove(DrawingSurface, &ptl);
  1523.  
  1524.              ptl.y -= EIGHTH_INCH_MARK*4+1;
  1525.              GpiLine(DrawingSurface, &ptl);
  1526.  
  1527.              ptl.x += INCH_LENGTH;
  1528.           } /* endfor */
  1529.  
  1530. /* Rather than drawing half of the half-inch marks on top of the inch marks, */
  1531. /* (and 3/4 of the quarter-inch marks on top of the inch or half-inch marks, */
  1532. /* and so on), we instead only draw the marks where needed, avoiding drawing */
  1533. /* a smaller mark back over a larger mark wherever possible [141586]         */
  1534.     /* Draw Half-Inch, Quarter-Inch, and Eighth-Inch marks */
  1535.           for (short index3=1; index3<=3; index3++) {
  1536.              distance = INCH_LENGTH/PowerOf2(index3-1);
  1537.              ptl.x = _fLeftPageOffset+distance/2;
  1538.              for (float index4=0.5; index4*distance<=_fPageWidth; index4++) {
  1539.                 ptl.y = PageYPos+HorzRulerPos+1;
  1540.                 GpiMove(DrawingSurface, &ptl);
  1541.  
  1542.                 ptl.y -= EIGHTH_INCH_MARK*(4-index3)+1;
  1543.                 GpiLine(DrawingSurface, &ptl);
  1544.  
  1545.                 ptl.x += distance;
  1546.              } /* endfor */
  1547.           } /* endfor */
  1548.        } else {
  1549.     /* Draw Centimeter marks */
  1550. /* jwa - Note: I tried putting in code for drawing millimeter marks, but they */
  1551. /* came out looking terrible, because, after the conversion from frame coords */
  1552. /* to pels, some of them ended up 2 pels apart, whereas others were 3 pels    */
  1553. /* apart, and at such small values it is real obvious (some were 50% further  */
  1554. /* from the next than others)                                                 */
  1555.           distance = CENTIMETER_LENGTH;
  1556.           for (short index3=0; index3*distance<=_fPageWidth; index3++) {
  1557.              ptl.x = _fLeftPageOffset+index3*distance;
  1558.              ptl.y = PageYPos+HorzRulerPos+1;
  1559.              GpiMove(DrawingSurface, &ptl);
  1560.  
  1561.              ptl.y -= CENTIMETER_MARK+1;
  1562.              GpiLine(DrawingSurface, &ptl);
  1563.           } /* endfor */
  1564.        } /* endif */
  1565.     } /* endif */
  1566.  
  1567.     if (_fShowVertRuler && DrawAdornments) {
  1568.     /* Begin Vertical Ruler stuff */
  1569.        float UnitLength;
  1570.        float distance;
  1571.        GpiSetLineType(DrawingSurface, LINETYPE_SOLID);
  1572.  
  1573.     /* Draw "tick" marks for margins */
  1574.        GpiSetColor(DrawingSurface, _fHorzMarginColor);
  1575.  
  1576.     /* Bottom Margin tick mark */
  1577.        ptl.x = VERT_RULER_OFFSET;
  1578.        ptl.y = PageYPos+_fBottomMargin-TICK_MARK_SIZE/2;
  1579.        GpiMove(DrawingSurface, &ptl);
  1580.  
  1581.        GpiBeginPath(DrawingSurface, 1L); /* Draw triangle */
  1582.           ptl.y += TICK_MARK_SIZE;
  1583.           GpiLine(DrawingSurface, &ptl);
  1584.  
  1585.           ptl.x += TICK_MARK_SIZE/2;
  1586.           ptl.y -= TICK_MARK_SIZE/2;
  1587.           GpiLine(DrawingSurface, &ptl);
  1588.  
  1589.           ptl.x -= TICK_MARK_SIZE/2;
  1590.           ptl.y -= TICK_MARK_SIZE/2;
  1591.           GpiLine(DrawingSurface, &ptl);
  1592.        GpiEndPath(DrawingSurface);
  1593.        GpiFillPath(DrawingSurface, 1L, FPATH_ALTERNATE);
  1594.  
  1595.     /* Top Margin tick mark */
  1596.        ptl.x = VERT_RULER_OFFSET;
  1597.        ptl.y = PageYPos+_fPageHeight-_fTopMargin-TICK_MARK_SIZE/2;
  1598.        GpiMove(DrawingSurface, &ptl);
  1599.  
  1600.        GpiBeginPath(DrawingSurface, 1L); /* Draw triangle */
  1601.           ptl.y += TICK_MARK_SIZE;
  1602.           GpiLine(DrawingSurface, &ptl);
  1603.  
  1604.           ptl.x += TICK_MARK_SIZE/2;
  1605.           ptl.y -= TICK_MARK_SIZE/2;
  1606.           GpiLine(DrawingSurface, &ptl);
  1607.  
  1608.           ptl.x -= TICK_MARK_SIZE/2;
  1609.           ptl.y -= TICK_MARK_SIZE/2;
  1610.           GpiLine(DrawingSurface, &ptl);
  1611.        GpiEndPath(DrawingSurface);
  1612.        GpiFillPath(DrawingSurface, 1L, FPATH_ALTERNATE);
  1613.  
  1614.     /* Draw Vertical ruler */
  1615.        GpiSetColor(DrawingSurface, _fRulerColor);
  1616.  
  1617.        ptl.x = VERT_RULER_OFFSET-1;
  1618.        ptl.y = PageYPos;
  1619.        GpiMove(DrawingSurface, &ptl);
  1620.  
  1621.        ptl.y += _fPageHeight;
  1622.        GpiLine(DrawingSurface, &ptl);
  1623.  
  1624.     /* Draw numbers next to each inch/centimeter mark */
  1625.        UnitLength = _fRulerUnits==INCHES ? INCH_LENGTH : CENTIMETER_LENGTH;
  1626.  
  1627.        ptl.x = 0;
  1628.        char UnitString[5];
  1629.        for (short unit=0; unit*UnitLength<=_fPageHeight; unit++) {
  1630.           ptl.y = PageYPos+_fPageHeight-unit*UnitLength-HALF_CHAR_SIZE;
  1631.           if (unit<100) {
  1632.              if (unit<10) {
  1633.                 sprintf(UnitString, "  %d", unit);
  1634.              } else {
  1635.                 sprintf(UnitString, " %d", unit);
  1636.              } /* endif */
  1637.           } else {
  1638.              sprintf(UnitString, "%d", unit);
  1639.           } /* endif */
  1640.           GpiCharStringAt(DrawingSurface, &ptl, strlen(UnitString), UnitString);
  1641.        } /* endfor */
  1642.  
  1643.        if (_fRulerUnits==INCHES) {
  1644.     /* Draw Inch marks */
  1645.           ptl.y = PageYPos+_fPageHeight;
  1646.           for (short index2=0; index2*INCH_LENGTH<=_fPageHeight; index2++) {
  1647.              ptl.x = VERT_RULER_OFFSET-1;
  1648.              GpiMove(DrawingSurface, &ptl);
  1649.  
  1650.              ptl.x += EIGHTH_INCH_MARK*4+1;
  1651.              GpiLine(DrawingSurface, &ptl);
  1652.  
  1653.              ptl.y -= INCH_LENGTH;
  1654.           } /* endfor */
  1655.  
  1656. /* Rather than drawing half of the half-inch marks on top of the inch marks, */
  1657. /* (and 3/4 of the quarter-inch marks on top of the inch or half-inch marks, */
  1658. /* and so on), we instead only draw the marks where needed, avoiding drawing */
  1659. /* a smaller mark back over a larger mark wherever possible [141586]         */
  1660.     /* Draw Half-Inch, Quarter-Inch, and Eighth-Inch marks */
  1661.           for (short index3=1; index3<=3; index3++) {
  1662.              distance = INCH_LENGTH/PowerOf2(index3-1);
  1663.              ptl.y = PageYPos+_fPageHeight-distance/2;
  1664.              for (float index4=0.5; index4*distance<=_fPageHeight; index4++) {
  1665.                 ptl.x = VERT_RULER_OFFSET-1;
  1666.                 GpiMove(DrawingSurface, &ptl);
  1667.  
  1668.                 ptl.x += EIGHTH_INCH_MARK*(4-index3)+1;
  1669.                 GpiLine(DrawingSurface, &ptl);
  1670.  
  1671.                 ptl.y -= distance;
  1672.              } /* endfor */
  1673.           } /* endfor */
  1674.        } else {
  1675.        /* Draw Centimeter marks */
  1676. /* jwa - Note: I tried putting in code for drawing millimeter marks, but they */
  1677. /* came out looking terrible, because, after the conversion from frame coords */
  1678. /* to pels, some of them ended up 2 pels apart, whereas others were 3 pels    */
  1679. /* apart, and at such small values it is real obvious (some were 50% further  */
  1680. /* from the next than others)                                                 */
  1681.           distance = CENTIMETER_LENGTH;
  1682.           for (short index3=0; index3*distance<=_fPageHeight; index3++) {
  1683.              ptl.y = PageYPos+_fPageHeight-index3*distance;
  1684.              ptl.x = VERT_RULER_OFFSET-1;
  1685.              GpiMove(DrawingSurface, &ptl);
  1686.  
  1687.              ptl.x += CENTIMETER_MARK+1;
  1688.              GpiLine(DrawingSurface, &ptl);
  1689.           } /* endfor */
  1690.        } /* endif */
  1691.     } /* endif */
  1692.  
  1693.    GpiSetColor(DrawingSurface, _fPageStringColor);
  1694.  
  1695. #if 0 /* begin font setting code from Merlin's text part */
  1696.    FATTRS fat;
  1697.  
  1698.    fat.usRecordLength = sizeof(FATTRS);
  1699.    fat.fsSelection = 0;
  1700.    fat.lMatch = 0L;
  1701.    fat.idRegistry = 0;
  1702.    fat.usCodePage = 0;
  1703.    fat.lMaxBaselineExt = 10L;
  1704.    fat.lAveCharWidth = 10L;
  1705.    fat.fsType = 0;
  1706.    fat.fsFontUse = FATTR_FONTUSE_TRANSFORMABLE;
  1707.  
  1708.    strcpy(fat.szFacename, _fCurrentFont);
  1709.  
  1710.    GpiCreateLogFont(DrawingSurface,(PSTR8)0,1L,&fat);
  1711.  
  1712.    GpiSetCharSet(DrawingSurface, 1L);
  1713. #endif /* end font setting code from text part */
  1714.  
  1715.    int HeaderStringLen = strlen(_fHeaderText);
  1716.    int FooterStringLen = strlen(_fFooterText);
  1717.  
  1718.    POINTL aptl[TXTBOX_COUNT];
  1719.  
  1720.    GpiQueryTextBox(DrawingSurface, HeaderStringLen, _fHeaderText, TXTBOX_COUNT,aptl);
  1721.    int HeaderStringSize = (aptl[2].x - aptl[1].x) /2;
  1722.    int HeaderStringHeight = (aptl[2].y - aptl[4].y)+2;
  1723.  
  1724.    GpiQueryTextBox(DrawingSurface, FooterStringLen, _fFooterText, TXTBOX_COUNT,aptl);
  1725.    int FooterStringSize = (aptl[2].x - aptl[1].x) /2;
  1726.    int FooterStringHeight = (aptl[2].y - aptl[4].y)+2;
  1727.  
  1728.    short pageNumberDisplayed = _fNumberOfPages-pageNumber;
  1729.    if (pageNumberDisplayed >= _fPageNumberStartOn) {
  1730.       char PageString[14];
  1731.       sprintf(PageString, "%d", pageNumberDisplayed-_fPageNumberStartOn+_fPageNumberStartWith);
  1732.       int PageStringLen = strlen(PageString);
  1733.       GpiQueryTextBox(DrawingSurface, PageStringLen, PageString,
  1734.                                TXTBOX_COUNT,aptl);
  1735.       int PageStringSize = (aptl[2].x - aptl[1].x) /2;
  1736.       int PageStringHeight = (aptl[2].y - aptl[4].y)+2;
  1737.  
  1738.       switch (_fPageNumberPosition) {
  1739.       case TOP_LEFT:
  1740.          ptl.x = _fLeftPageOffset+_fLeftMargin;
  1741.          ptl.y = PageYPos+_fPageHeight-_fTopMargin+2;
  1742.          if (HeaderStringLen && (pageNumberDisplayed >= _fHeaderFooterStartOn))
  1743.             ptl.y += HeaderStringHeight;
  1744.          break;
  1745.       case TOP_CENTER:
  1746.          ptl.x = _fLeftPageOffset+_fLeftMargin+((_fPageWidth-_fRightMargin)-_fLeftMargin)/2-PageStringSize;
  1747.          ptl.y = PageYPos+_fPageHeight-_fTopMargin+2;
  1748.          if (HeaderStringLen && (pageNumberDisplayed >= _fHeaderFooterStartOn))
  1749.             ptl.y += HeaderStringHeight;
  1750.          break;
  1751.       case TOP_RIGHT:
  1752.          ptl.x = _fPageWidth+_fLeftPageOffset-_fRightMargin-2*PageStringSize;
  1753.          ptl.y = PageYPos+_fPageHeight-_fTopMargin+2;
  1754.          if (HeaderStringLen && (pageNumberDisplayed >= _fHeaderFooterStartOn))
  1755.             ptl.y += HeaderStringHeight;
  1756.          break;
  1757.       case BOTTOM_LEFT:
  1758.          ptl.x = _fLeftPageOffset+_fLeftMargin;
  1759.          ptl.y = PageYPos+_fBottomMargin-PageStringHeight;
  1760.          if (FooterStringLen && (pageNumberDisplayed >= _fHeaderFooterStartOn))
  1761.             ptl.y -= FooterStringHeight;
  1762.          break;
  1763.       case BOTTOM_CENTER:
  1764.          ptl.x = _fLeftPageOffset+_fLeftMargin+((_fPageWidth-_fRightMargin)-_fLeftMargin)/2-PageStringSize;
  1765.          ptl.y = PageYPos+_fBottomMargin-PageStringHeight;
  1766.          if (FooterStringLen && (pageNumberDisplayed >= _fHeaderFooterStartOn))
  1767.             ptl.y -= FooterStringHeight;
  1768.          break;
  1769.       case BOTTOM_RIGHT:
  1770.          ptl.x = _fPageWidth+_fLeftPageOffset-_fRightMargin-2*PageStringSize;
  1771.          ptl.y = PageYPos+_fBottomMargin-PageStringHeight;
  1772.          if (FooterStringLen && (pageNumberDisplayed >= _fHeaderFooterStartOn))
  1773.             ptl.y -= FooterStringHeight;
  1774.          break;
  1775.       } /* endswitch */
  1776.  
  1777.       if (_fPageNumberPosition != NONE) {
  1778.          GpiCharStringAt(DrawingSurface, &ptl, PageStringLen, PageString);
  1779.       } /* endif */
  1780.    } /* endif */
  1781.  
  1782.    if (HeaderStringLen && (pageNumberDisplayed >= _fHeaderFooterStartOn)) {
  1783.       ptl.x = _fLeftPageOffset+_fLeftMargin+(_fPageWidth-_fRightMargin-_fLeftMargin)/2-HeaderStringSize;
  1784.       ptl.y = PageYPos+_fPageHeight-_fTopMargin+2;
  1785.       GpiCharStringAt(DrawingSurface, &ptl, HeaderStringLen, _fHeaderText);
  1786.    } /* endif */
  1787.  
  1788.    if (FooterStringLen && (pageNumberDisplayed >= _fHeaderFooterStartOn)) {
  1789.       ptl.x = _fLeftPageOffset+_fLeftMargin+(_fPageWidth-_fRightMargin-_fLeftMargin)/2-FooterStringSize;
  1790.       ptl.y = PageYPos+_fBottomMargin-FooterStringHeight+2;
  1791.       GpiCharStringAt(DrawingSurface, &ptl, FooterStringLen, _fFooterText);
  1792.    } /* endif */
  1793. #endif //_PLATFORM_OS2_
  1794.  
  1795.  
  1796. #ifdef _PLATFORM_WIN32_
  1797.     POINTL ptl;
  1798.     LONG PageYPos = _fTopPageOffset+pageNumber*_fTotalPageHeight;
  1799.  
  1800. #ifndef SMART_DRAWING
  1801.     if (!_fIsTransparent &&
  1802.         (DrawAdornments || (isPrinting && _fPrintPageColor))) {
  1803.  
  1804.        // Create a solid brush
  1805.        HBRUSH pageBrush = CreateSolidBrush (_fPageColor);
  1806.  
  1807.        Rect pageRect;
  1808.  
  1809.        SetRect(&pageRect, _fLeftPageOffset,             /* left */
  1810.                           PageYPos,                     /* top */
  1811.                           _fLeftPageOffset+_fPageWidth, /* right */
  1812.                           PageYPos+_fPageHeight);       /* bottom */
  1813.  
  1814.        // Fill the rectangle with the brush
  1815.        FillRect (DrawingSurface, &pageRect, pageBrush);
  1816.  
  1817.        // Get rid of the brush
  1818.        DeleteObject(pageBrush);
  1819.     } /* endif */
  1820. #endif
  1821.  
  1822.     if (_fShowGrid && DrawAdornments) {
  1823.        HPEN gridPen = CreatePen(_fGridLine, 0, _fGridColor);
  1824.        HPEN oldPen = SelectObject(DrawingSurface, gridPen);
  1825.  
  1826.        LONG MaxGridWidth = _fPageWidth-_fLeftMargin-_fRightMargin;
  1827.        LONG MaxGridHeight = _fPageHeight-_fBottomMargin-_fTopMargin;
  1828.  
  1829.     /* Draw Horizontal grid lines */
  1830.        for (short index2=0; index2*_fGridSpacing<=MaxGridHeight; index2++) {
  1831.           ptl.x = _fLeftPageOffset+_fLeftMargin;
  1832.           ptl.y = PageYPos+_fBottomMargin+index2*_fGridSpacing;
  1833.           MoveToEx(DrawingSurface, ptl.x, ptl.y, kODNULL);
  1834.  
  1835.           ptl.x += MaxGridWidth;
  1836.           LineTo(DrawingSurface, ptl.x, ptl.y);
  1837.        } /* endfor */
  1838.  
  1839.     /* Draw Vertical grid lines */
  1840.        for (index2=0; index2*_fGridSpacing<=MaxGridWidth; index2++) {
  1841.           ptl.x = _fLeftPageOffset+_fLeftMargin+index2*_fGridSpacing;
  1842.           ptl.y = PageYPos+_fTopMargin;
  1843.           MoveToEx(DrawingSurface, ptl.x, ptl.y, kODNULL);
  1844.  
  1845.           ptl.y += MaxGridHeight;
  1846.           LineTo(DrawingSurface, ptl.x, ptl.y);
  1847.        } /* endfor */
  1848.  
  1849.        SelectObject(DrawingSurface, oldPen);
  1850.        DeleteObject(gridPen);
  1851.     } /* endif */
  1852.  
  1853.     if (DrawAdornments) {
  1854.        if (_fShowVertMargins) {
  1855.           HPEN vertMarginPen = CreatePen(_fMarginLine, 0, _fVertMarginColor);
  1856.           HPEN oldPen = SelectObject(DrawingSurface, vertMarginPen);
  1857.  
  1858.        /* Draw Left Margin */
  1859.           ptl.x = _fLeftPageOffset+_fLeftMargin;
  1860.           ptl.y = PageYPos;
  1861.           MoveToEx(DrawingSurface, ptl.x, ptl.y, kODNULL);
  1862.  
  1863.           ptl.y += _fPageHeight;
  1864.           LineTo(DrawingSurface, ptl.x, ptl.y);
  1865.  
  1866.        /* Draw Right Margin */
  1867.           ptl.x = _fLeftPageOffset+_fPageWidth-_fRightMargin;
  1868.           ptl.y = PageYPos;
  1869.           MoveToEx(DrawingSurface, ptl.x, ptl.y, kODNULL);
  1870.  
  1871.           ptl.y += _fPageHeight;
  1872.           LineTo(DrawingSurface, ptl.x, ptl.y);
  1873.  
  1874.           SelectObject(DrawingSurface, oldPen);
  1875.           DeleteObject(vertMarginPen);
  1876.        } /* endif */
  1877.  
  1878.        if (_fShowHorzMargins) {
  1879.           HPEN horzMarginPen = CreatePen(_fMarginLine, 0, _fHorzMarginColor);
  1880.           HPEN oldPen = SelectObject(DrawingSurface, horzMarginPen);
  1881.  
  1882.        /* Draw Top Margin */
  1883.           ptl.x = _fLeftPageOffset;
  1884.           ptl.y = PageYPos+_fTopMargin;
  1885.           MoveToEx(DrawingSurface, ptl.x, ptl.y, kODNULL);
  1886.  
  1887.           ptl.x += _fPageWidth;
  1888.           LineTo(DrawingSurface, _fLeftPageOffset+_fPageWidth,
  1889.              PageYPos+_fTopMargin);
  1890.  
  1891.        /* Draw Bottom Margin */
  1892.           ptl.x = _fLeftPageOffset;
  1893.           ptl.y = PageYPos+_fPageHeight-_fBottomMargin;
  1894.           MoveToEx(DrawingSurface, ptl.x, ptl.y, kODNULL);
  1895.  
  1896.           ptl.x += _fPageWidth;
  1897.           LineTo(DrawingSurface, ptl.x, ptl.y);
  1898.  
  1899.           SelectObject(DrawingSurface, oldPen);
  1900.           DeleteObject(horzMarginPen);
  1901.        } /* endif */
  1902.     } /* endif */
  1903.  
  1904.     if (_fShowHorzRuler && DrawAdornments) {
  1905.     /* Begin Horizontal Ruler stuff */
  1906.        float UnitLength;
  1907.        float distance;
  1908.  
  1909.        HPEN horzRulerPen = CreatePen(PS_SOLID, 0, _fRulerColor);
  1910.        HPEN oldPen = SelectObject(DrawingSurface, horzRulerPen);
  1911.  
  1912.        LONG HorzRulerPos = _fTopPageOffset-HORZ_RULER_OFFSET;
  1913.  
  1914.     /* Draw "tick" marks for margins */
  1915.        HBRUSH tickMarkBrush = CreateSolidBrush(_fVertMarginColor);
  1916.        HBRUSH oldBrush = SelectObject(DrawingSurface, tickMarkBrush);
  1917.  
  1918.     /* Left Margin tick mark */
  1919.        ptl.x = _fLeftPageOffset+_fLeftMargin-TICK_MARK_SIZE/2+1;
  1920.        ptl.y = PageYPos-HorzRulerPos-1;
  1921.        MoveToEx(DrawingSurface, ptl.x, ptl.y, kODNULL);
  1922.  
  1923.        BeginPath(DrawingSurface); /* Draw triangle */
  1924.           ptl.x += TICK_MARK_SIZE;
  1925.           LineTo(DrawingSurface, ptl.x, ptl.y);
  1926.  
  1927.           ptl.x -= TICK_MARK_SIZE/2;
  1928.           ptl.y += TICK_MARK_SIZE/2;
  1929.           LineTo(DrawingSurface, ptl.x, ptl.y);
  1930.  
  1931.           ptl.x -= TICK_MARK_SIZE/2;
  1932.           ptl.y -= TICK_MARK_SIZE/2;
  1933.           LineTo(DrawingSurface, ptl.x, ptl.y);
  1934.        EndPath(DrawingSurface);
  1935.        FillPath(DrawingSurface);
  1936.  
  1937.     /* Right Margin tick mark */
  1938.        ptl.x = _fLeftPageOffset+_fPageWidth-_fRightMargin-TICK_MARK_SIZE/2;
  1939.        ptl.y = PageYPos-HorzRulerPos-1;
  1940.        MoveToEx(DrawingSurface, ptl.x, ptl.y, kODNULL);
  1941.  
  1942.        BeginPath(DrawingSurface); /* Draw triangle */
  1943.           ptl.x += TICK_MARK_SIZE;
  1944.           LineTo(DrawingSurface, ptl.x, ptl.y);
  1945.  
  1946.           ptl.x -= TICK_MARK_SIZE/2;
  1947.           ptl.y += TICK_MARK_SIZE/2;
  1948.           LineTo(DrawingSurface, ptl.x, ptl.y);
  1949.  
  1950.           ptl.x -= TICK_MARK_SIZE/2;
  1951.           ptl.y -= TICK_MARK_SIZE/2;
  1952.           LineTo(DrawingSurface, ptl.x, ptl.y);
  1953.        EndPath(DrawingSurface);
  1954.        FillPath(DrawingSurface);
  1955.  
  1956.        SelectObject(DrawingSurface, oldBrush);
  1957.        DeleteObject(tickMarkBrush);
  1958.  
  1959.     /* Draw Horizontal ruler */
  1960.        ptl.x = _fLeftPageOffset;
  1961.        ptl.y = PageYPos-HorzRulerPos-1;
  1962.        MoveToEx(DrawingSurface, ptl.x, ptl.y, kODNULL);
  1963.  
  1964.        ptl.x += _fPageWidth;
  1965.        LineTo(DrawingSurface, ptl.x, ptl.y);
  1966.  
  1967.     /* Draw numbers next to each inch/centimeter mark */
  1968.        UnitLength = _fRulerUnits==INCHES ? INCH_LENGTH : CENTIMETER_LENGTH;
  1969.  
  1970.        char UnitString[5];
  1971.        LONG HalfStringSize;
  1972.        LONG StringHeight = 10;
  1973.  
  1974.        ptl.y = PageYPos-HorzRulerPos-RULER_UNIT_OFFSET-StringHeight;
  1975.        for (short unit=0; unit*UnitLength<=_fPageWidth; unit++) {
  1976.           sprintf(UnitString, "%d", unit);
  1977.           HalfStringSize = HALF_CHAR_SIZE*strlen(UnitString);
  1978.  
  1979. //        ptl.x = _fLeftPageOffset+unit*UnitLength-HalfStringSize;
  1980.           ptl.x = _fLeftPageOffset+unit*UnitLength-HalfStringSize/2;
  1981.           TextOut(DrawingSurface, ptl.x, ptl.y, UnitString, strlen(UnitString));
  1982.        } /* endfor */
  1983.  
  1984.        if (_fRulerUnits==INCHES) {
  1985.     /* Draw Inch marks */
  1986.           ptl.x = _fLeftPageOffset;
  1987.           for (short index2=0; index2*INCH_LENGTH<=_fPageWidth; index2++) {
  1988.              ptl.y = PageYPos-HorzRulerPos-1;
  1989.              MoveToEx(DrawingSurface, ptl.x, ptl.y, kODNULL);
  1990.  
  1991.              ptl.y += EIGHTH_INCH_MARK*4+1;
  1992.              LineTo(DrawingSurface, ptl.x, ptl.y);
  1993.  
  1994.              ptl.x += INCH_LENGTH;
  1995.           } /* endfor */
  1996.  
  1997. /* Rather than drawing half of the half-inch marks on top of the inch marks, */
  1998. /* (and 3/4 of the quarter-inch marks on top of the inch or half-inch marks, */
  1999. /* and so on), we instead only draw the marks where needed, avoiding drawing */
  2000. /* a smaller mark back over a larger mark wherever possible [141586]         */
  2001.     /* Draw Half-Inch, Quarter-Inch, and Eighth-Inch marks */
  2002.           for (short index3=1; index3<=3; index3++) {
  2003.              distance = INCH_LENGTH/PowerOf2(index3-1);
  2004.              ptl.x = _fLeftPageOffset+distance/2;
  2005.              for (float index4=0.5; index4*distance<=_fPageWidth; index4++) {
  2006.                 ptl.y = PageYPos-HorzRulerPos-1;
  2007.                 MoveToEx(DrawingSurface, ptl.x, ptl.y, kODNULL);
  2008.  
  2009.                 ptl.y += EIGHTH_INCH_MARK*(4-index3)+1;
  2010.                 LineTo(DrawingSurface, ptl.x, ptl.y);
  2011.  
  2012.                 ptl.x += distance;
  2013.              } /* endfor */
  2014.           } /* endfor */
  2015.        } else {
  2016.     /* Draw Centimeter marks */
  2017. /* jwa - Note: I tried putting in code for drawing millimeter marks, but they */
  2018. /* came out looking terrible, because, after the conversion from frame coords */
  2019. /* to pels, some of them ended up 2 pels apart, whereas others were 3 pels    */
  2020. /* apart, and at such small values it is real obvious (some were 50% further  */
  2021. /* from the next than others)                                                 */
  2022.           distance = CENTIMETER_LENGTH;
  2023.           for (short index3=0; index3*distance<=_fPageWidth; index3++) {
  2024.              ptl.x = _fLeftPageOffset+index3*distance;
  2025.              ptl.y = PageYPos-HorzRulerPos-1;
  2026.              MoveToEx(DrawingSurface, ptl.x, ptl.y, kODNULL);
  2027.  
  2028.              ptl.y += CENTIMETER_MARK+1;
  2029.              LineTo(DrawingSurface, ptl.x, ptl.y);
  2030.           } /* endfor */
  2031.        } /* endif */
  2032.  
  2033.        SelectObject(DrawingSurface, oldPen);
  2034.        DeleteObject(horzRulerPen);
  2035.     } /* endif */
  2036.  
  2037.     if (_fShowVertRuler && DrawAdornments) {
  2038.     /* Begin Vertical Ruler stuff */
  2039.        float UnitLength;
  2040.        float distance;
  2041.  
  2042.        HPEN vertRulerPen = CreatePen(PS_SOLID, 0, _fRulerColor);
  2043.        HPEN oldPen = SelectObject(DrawingSurface, vertRulerPen);
  2044.  
  2045.     /* Draw "tick" marks for margins */
  2046.        HBRUSH tickMarkBrush = CreateSolidBrush(_fHorzMarginColor);
  2047.        HBRUSH oldBrush = SelectObject(DrawingSurface, tickMarkBrush);
  2048.  
  2049.     /* Top Margin tick mark */
  2050.        ptl.x = VERT_RULER_OFFSET-1;
  2051.        ptl.y = PageYPos+_fTopMargin-TICK_MARK_SIZE/2;
  2052.        MoveToEx(DrawingSurface, ptl.x, ptl.y, kODNULL);
  2053.  
  2054.        BeginPath(DrawingSurface); /* Draw triangle */
  2055.           ptl.y += TICK_MARK_SIZE;
  2056.           LineTo(DrawingSurface, ptl.x, ptl.y);
  2057.  
  2058.           ptl.x += TICK_MARK_SIZE/2;
  2059.           ptl.y -= TICK_MARK_SIZE/2;
  2060.           LineTo(DrawingSurface, ptl.x, ptl.y);
  2061.  
  2062.           ptl.x -= TICK_MARK_SIZE/2;
  2063.           ptl.y -= TICK_MARK_SIZE/2;
  2064.           LineTo(DrawingSurface, ptl.x, ptl.y);
  2065.        EndPath(DrawingSurface);
  2066.        FillPath(DrawingSurface);
  2067.  
  2068.     /* Bottom Margin tick mark */
  2069.        ptl.x = VERT_RULER_OFFSET-1;
  2070.        ptl.y = PageYPos+_fPageHeight-_fBottomMargin-TICK_MARK_SIZE/2;
  2071.        MoveToEx(DrawingSurface, ptl.x, ptl.y, kODNULL);
  2072.  
  2073.        BeginPath(DrawingSurface); /* Draw triangle */
  2074.           ptl.y += TICK_MARK_SIZE;
  2075.           LineTo(DrawingSurface, ptl.x, ptl.y);
  2076.  
  2077.           ptl.x += TICK_MARK_SIZE/2;
  2078.           ptl.y -= TICK_MARK_SIZE/2;
  2079.           LineTo(DrawingSurface, ptl.x, ptl.y);
  2080.  
  2081.           ptl.x -= TICK_MARK_SIZE/2;
  2082.           ptl.y -= TICK_MARK_SIZE/2;
  2083.           LineTo(DrawingSurface, ptl.x, ptl.y);
  2084.        EndPath(DrawingSurface);
  2085.        FillPath(DrawingSurface);
  2086.  
  2087.        SelectObject(DrawingSurface, oldBrush);
  2088.        DeleteObject(tickMarkBrush);
  2089.  
  2090.     /* Draw Vertical ruler */
  2091.        ptl.x = VERT_RULER_OFFSET-1;
  2092.        ptl.y = PageYPos;
  2093.        MoveToEx(DrawingSurface, ptl.x, ptl.y, kODNULL);
  2094.  
  2095.        ptl.y += _fPageHeight;
  2096.        LineTo(DrawingSurface, ptl.x, ptl.y);
  2097.  
  2098.     /* Draw numbers next to each inch/centimeter mark */
  2099.        UnitLength = _fRulerUnits==INCHES ? INCH_LENGTH : CENTIMETER_LENGTH;
  2100.  
  2101.        ptl.x = 0;
  2102.        char UnitString[5];
  2103.        for (short unit=0; unit*UnitLength<=_fPageHeight; unit++) {
  2104.           ptl.y = PageYPos+unit*UnitLength-HALF_CHAR_SIZE-1;
  2105.           if (unit<100) {
  2106.              if (unit<10) {
  2107.                 sprintf(UnitString, "  %d", unit);
  2108.              } else {
  2109.                 sprintf(UnitString, " %d", unit);
  2110.              } /* endif */
  2111.           } else {
  2112.              sprintf(UnitString, "%d", unit);
  2113.           } /* endif */
  2114.           TextOut(DrawingSurface, ptl.x, ptl.y, UnitString, strlen(UnitString));
  2115.        } /* endfor */
  2116.  
  2117.        if (_fRulerUnits==INCHES) {
  2118.     /* Draw Inch marks */
  2119.           ptl.y = PageYPos;
  2120.           for (short index2=0; index2*INCH_LENGTH<=_fPageHeight; index2++) {
  2121.              ptl.x = VERT_RULER_OFFSET-1;
  2122.              MoveToEx(DrawingSurface, ptl.x, ptl.y, kODNULL);
  2123.  
  2124.              ptl.x += EIGHTH_INCH_MARK*4+1;
  2125.              LineTo(DrawingSurface, ptl.x, ptl.y);
  2126.  
  2127.              ptl.y += INCH_LENGTH;
  2128.           } /* endfor */
  2129.  
  2130. /* Rather than drawing half of the half-inch marks on top of the inch marks, */
  2131. /* (and 3/4 of the quarter-inch marks on top of the inch or half-inch marks, */
  2132. /* and so on), we instead only draw the marks where needed, avoiding drawing */
  2133. /* a smaller mark back over a larger mark wherever possible [141586]         */
  2134.     /* Draw Half-Inch, Quarter-Inch, and Eighth-Inch marks */
  2135.           for (short index3=1; index3<=3; index3++) {
  2136.              distance = INCH_LENGTH/PowerOf2(index3-1);
  2137.              ptl.y = PageYPos+distance/2;
  2138.              for (float index4=0.5; index4*distance<=_fPageHeight; index4++) {
  2139.                 ptl.x = VERT_RULER_OFFSET-1;
  2140.                 MoveToEx(DrawingSurface, ptl.x, ptl.y, kODNULL);
  2141.  
  2142.                 ptl.x += EIGHTH_INCH_MARK*(4-index3)+1;
  2143.                 LineTo(DrawingSurface, ptl.x, ptl.y);
  2144.  
  2145.                 ptl.y += distance;
  2146.              } /* endfor */
  2147.           } /* endfor */
  2148.        } else {
  2149.        /* Draw Centimeter marks */
  2150. /* jwa - Note: I tried putting in code for drawing millimeter marks, but they */
  2151. /* came out looking terrible, because, after the conversion from frame coords */
  2152. /* to pels, some of them ended up 2 pels apart, whereas others were 3 pels    */
  2153. /* apart, and at such small values it is real obvious (some were 50% further  */
  2154. /* from the next than others)                                                 */
  2155.           distance = CENTIMETER_LENGTH;
  2156.           for (short index3=0; index3*distance<=_fPageHeight; index3++) {
  2157.              ptl.y = PageYPos+index3*distance;
  2158.              ptl.x = VERT_RULER_OFFSET-1;
  2159.              MoveToEx(DrawingSurface, ptl.x, ptl.y, kODNULL);
  2160.  
  2161.              ptl.x += CENTIMETER_MARK+1;
  2162.              LineTo(DrawingSurface, ptl.x, ptl.y);
  2163.           } /* endfor */
  2164.        } /* endif */
  2165.  
  2166.        SelectObject(DrawingSurface, oldPen);
  2167.        DeleteObject(vertRulerPen);
  2168.     } /* endif */
  2169.  
  2170.    int HeaderStringLen = strlen(_fHeaderText);
  2171.    int FooterStringLen = strlen(_fFooterText);
  2172.  
  2173.    SIZE size;
  2174.    GetTextExtentPoint32(DrawingSurface, _fHeaderText, HeaderStringLen, &size);
  2175.    int HeaderStringSize = size.cx/2;
  2176.    int HeaderStringHeight = size.cy+2;
  2177.  
  2178.    GetTextExtentPoint32(DrawingSurface, _fFooterText, FooterStringLen, &size);
  2179.    int FooterStringSize = size.cx/2;
  2180.    int FooterStringHeight = size.cy+2;
  2181.  
  2182.    short pageNumberDisplayed = pageNumber+1;
  2183.    if (pageNumberDisplayed >= _fPageNumberStartOn) {
  2184.       char PageString[14];
  2185.       sprintf(PageString, "%d", pageNumberDisplayed-_fPageNumberStartOn+_fPageNumberStartWith);
  2186.       int PageStringLen = strlen(PageString);
  2187.       GetTextExtentPoint32(DrawingSurface, PageString, PageStringLen, &size);
  2188.       int PageStringSize = size.cx/2;
  2189.       int PageStringHeight = size.cy+2;
  2190.  
  2191.       switch (_fPageNumberPosition) {
  2192.       case TOP_LEFT:
  2193.          ptl.x = _fLeftPageOffset+_fLeftMargin;
  2194.          ptl.y = PageYPos+_fTopMargin-PageStringHeight;
  2195.          if (HeaderStringLen && (pageNumberDisplayed >= _fHeaderFooterStartOn))
  2196.             ptl.y -= HeaderStringHeight;
  2197.          break;
  2198.       case TOP_CENTER:
  2199.          ptl.x = _fLeftPageOffset+_fLeftMargin+((_fPageWidth-_fRightMargin)-_fLeftMargin)/2-PageStringSize;
  2200.          ptl.y = PageYPos+_fTopMargin-PageStringHeight;
  2201.          if (HeaderStringLen && (pageNumberDisplayed >= _fHeaderFooterStartOn))
  2202.             ptl.y -= HeaderStringHeight;
  2203.          break;
  2204.       case TOP_RIGHT:
  2205.          ptl.x = _fPageWidth+_fLeftPageOffset-_fRightMargin-2*PageStringSize;
  2206.          ptl.y = PageYPos+_fTopMargin-PageStringHeight;
  2207.          if (HeaderStringLen && (pageNumberDisplayed >= _fHeaderFooterStartOn))
  2208.             ptl.y -= HeaderStringHeight;
  2209.          break;
  2210.       case BOTTOM_LEFT:
  2211.          ptl.x = _fLeftPageOffset+_fLeftMargin;
  2212.          ptl.y = PageYPos+_fPageHeight-_fBottomMargin+2;
  2213.          if (FooterStringLen && (pageNumberDisplayed >= _fHeaderFooterStartOn))
  2214.             ptl.y -= FooterStringHeight;
  2215.          break;
  2216.       case BOTTOM_CENTER:
  2217.          ptl.x = _fLeftPageOffset+_fLeftMargin+((_fPageWidth-_fRightMargin)-_fLeftMargin)/2-PageStringSize;
  2218.          ptl.y = PageYPos+_fPageHeight-_fBottomMargin+2;
  2219.          if (FooterStringLen && (pageNumberDisplayed >= _fHeaderFooterStartOn))
  2220.             ptl.y += FooterStringHeight;
  2221.          break;
  2222.       case BOTTOM_RIGHT:
  2223.          ptl.x = _fPageWidth+_fLeftPageOffset-_fRightMargin-2*PageStringSize;
  2224.          ptl.y = PageYPos+_fPageHeight-_fBottomMargin+2;
  2225.          if (FooterStringLen && (pageNumberDisplayed >= _fHeaderFooterStartOn))
  2226.             ptl.y += FooterStringHeight;
  2227.          break;
  2228.       } /* endswitch */
  2229.  
  2230.       if (_fPageNumberPosition != NONE) {
  2231.          TextOut(DrawingSurface, ptl.x, ptl.y, PageString, PageStringLen);
  2232.       } /* endif */
  2233.    } /* endif */
  2234.  
  2235.    if (HeaderStringLen && (pageNumberDisplayed >= _fHeaderFooterStartOn)) {
  2236.       ptl.x = _fLeftPageOffset+_fLeftMargin+(_fPageWidth-_fRightMargin-_fLeftMargin)/2-HeaderStringSize;
  2237.       ptl.y = PageYPos+_fTopMargin-HeaderStringHeight-2;
  2238.       TextOut(DrawingSurface, ptl.x, ptl.y, _fHeaderText, HeaderStringLen);
  2239.    } /* endif */
  2240.  
  2241.    if (FooterStringLen && (pageNumberDisplayed >= _fHeaderFooterStartOn)) {
  2242.       ptl.x = _fLeftPageOffset+_fLeftMargin+(_fPageWidth-_fRightMargin-_fLeftMargin)/2-FooterStringSize;
  2243.       ptl.y = PageYPos+_fPageHeight-_fBottomMargin+2;
  2244.       TextOut(DrawingSurface, ptl.x, ptl.y, _fFooterText, FooterStringLen);
  2245.    } /* endif */
  2246. #endif //_PLATFORM_WIN32_
  2247. }
  2248.  
  2249.  
  2250. SOM_Scope ODBoolean  SOMLINK PageLayoutHandleMenuEvent(PageLayout *somSelf,
  2251.                                                         Environment *ev,
  2252.                                                        ODFrame* frame,
  2253.                                                        ODEventData* event)
  2254. {
  2255.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  2256.     PageLayoutMethodDebug("PageLayout","PageLayoutHandleMenuEvent");
  2257.  
  2258.     ODBoolean handled = kODTrue;
  2259.     char *newText;
  2260.     short NewPage;
  2261.     ODBoolean contentChanged = kODTrue;
  2262.  
  2263. #ifdef _PLATFORM_OS2_
  2264.     long menuItem = LONGFROMMP(event->mp1);
  2265. #endif
  2266.  
  2267. #ifdef _PLATFORM_WIN32_
  2268.     short menuItem = LOWORD(event->wParam);
  2269. #endif
  2270.  
  2271.     switch (menuItem) {
  2272.     case MenuFillPage:
  2273.        _FillEntirePage(ev, frame);
  2274.        break;
  2275.     case MenuSnapToGrid:
  2276.        _SnapToGrid(ev, frame);
  2277.        break;
  2278.     case MenuShowMargins:
  2279.        _fShowHorzMargins = !_fShowHorzMargins;
  2280.        _fShowVertMargins = !_fShowVertMargins;
  2281.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2282.        break;
  2283.     case MenuShowRulers:
  2284.        _fShowHorzRuler = !_fShowHorzRuler;
  2285.        _fShowVertRuler = !_fShowVertRuler;
  2286.        frame->Invalidate(ev, _fBackgroundShape, kNoBias);
  2287.        break;
  2288.     case MenuShowGrid:
  2289.        _fShowGrid = !_fShowGrid;
  2290.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2291.        break;
  2292.     case MenuRefresh:
  2293.        frame->Invalidate(ev, kODNULL, kNoBias);
  2294.        break;
  2295.     case MenuInsertPage:
  2296.        if (_MaxPagesReached(ev)) {
  2297.           WarningBox(event->hwnd, ERRm, MRI(MaxPageString));
  2298.           contentChanged = kODFalse;
  2299.        } else {
  2300. #ifdef _PLATFORM_OS2_
  2301.           NewPage = WinDlgBox(HWND_DESKTOP, event->hwnd, ChoosePageDlgProc,
  2302.             _fResources, ChoosePageDlgValue,
  2303.             (PVOID) MPFROM2SHORT(InsertPageDlgValue, _fNumberOfPages));
  2304. #endif //_PLATFORM_OS2_
  2305.  
  2306. #ifdef _PLATFORM_WIN32_
  2307.           NewPage = DialogBoxParam(_fResources,
  2308.              MAKEINTRESOURCE(ChoosePageDlgValue), event->hwnd,
  2309.              (DLGPROC) ChoosePageDlgProc,
  2310.              (LPARAM) MAKELONG(_fNumberOfPages, InsertPageDlgValue));
  2311. #endif //_PLATFORM_WIN32_
  2312.  
  2313.           if (NewPage>0) { /* Cancel wasn't chosen */
  2314.              _InsertPage(ev, frame, NewPage);
  2315.           } else contentChanged = kODFalse;
  2316.        } /* endif */
  2317.        break;
  2318.     case MenuInsertPageLast:
  2319.        if (_MaxPagesReached(ev)) {
  2320.           WarningBox(event->hwnd, ERRm, MRI(MaxPageString));
  2321.           contentChanged = kODFalse;
  2322.        } else {
  2323.           _InsertPage(ev, frame, _fNumberOfPages);
  2324.        } /* endif */
  2325.        break;
  2326.     case MenuRemovePage:
  2327. #ifdef _PLATFORM_OS2_
  2328.        NewPage = WinDlgBox(HWND_DESKTOP, event->hwnd, ChoosePageDlgProc,
  2329.          _fResources, ChoosePageDlgValue,
  2330.          (PVOID) MPFROM2SHORT(RemovePageDlgValue, _fNumberOfPages));
  2331. #endif //_PLATFORM_OS2_
  2332.  
  2333. #ifdef _PLATFORM_WIN32_
  2334.           NewPage = DialogBoxParam(_fResources,
  2335.              MAKEINTRESOURCE(ChoosePageDlgValue), event->hwnd,
  2336.              (DLGPROC) ChoosePageDlgProc,
  2337.              (LPARAM) MAKELONG(_fNumberOfPages, RemovePageDlgValue));
  2338. #endif //_PLATFORM_WIN32_
  2339.  
  2340.        if (NewPage>0) { /* Cancel wasn't chosen */
  2341.           _RemovePage(ev, frame, NewPage);
  2342.        } else contentChanged = kODFalse;
  2343.        break;
  2344.     case MenuGoToPage:
  2345. #ifdef _PLATFORM_OS2_
  2346.        NewPage = WinDlgBox(HWND_DESKTOP, event->hwnd, ChoosePageDlgProc,
  2347.           _fResources, ChoosePageDlgValue,
  2348.           (PVOID) MPFROM2SHORT(GoToPageDlgValue, _fNumberOfPages));
  2349. #endif //_PLATFORM_OS2_
  2350.  
  2351. #ifdef _PLATFORM_WIN32_
  2352.        NewPage = DialogBoxParam(_fResources,
  2353.           MAKEINTRESOURCE(ChoosePageDlgValue), event->hwnd,
  2354.           (DLGPROC) ChoosePageDlgProc,
  2355.           (LPARAM) MAKELONG(_fNumberOfPages, GoToPageDlgValue));
  2356. #endif //_PLATFORM_WIN32_
  2357.  
  2358.        if ((NewPage>0) && (_fScrollExt!=kODNULL)) { /* Cancel wasn't chosen */
  2359.           _fScrollExt->SetScrollPosition(ev, frame, 0,
  2360.              (NewPage-1)*_fTotalPageHeight);
  2361.           _DetermineVisiblePages(ev, frame);
  2362.        } /* endif */
  2363.        contentChanged = kODFalse;
  2364.        break;
  2365.     case MenuPageNumberTopLeft:
  2366.        _fPageNumberPosition = TOP_LEFT;
  2367.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2368.        break;
  2369.     case MenuPageNumberTopCenter:
  2370.        _fPageNumberPosition = TOP_CENTER;
  2371.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2372.        break;
  2373.     case MenuPageNumberTopRight:
  2374.        _fPageNumberPosition = TOP_RIGHT;
  2375.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2376.        break;
  2377.     case MenuPageNumberBottomLeft:
  2378.        _fPageNumberPosition = BOTTOM_LEFT;
  2379.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2380.        break;
  2381.     case MenuPageNumberBottomCenter:
  2382.        _fPageNumberPosition = BOTTOM_CENTER;
  2383.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2384.        break;
  2385.     case MenuPageNumberBottomRight:
  2386.        _fPageNumberPosition = BOTTOM_RIGHT;
  2387.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2388.        break;
  2389.     case MenuPageNumberNone:
  2390.        _fPageNumberPosition = NONE;
  2391.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2392.        break;
  2393.     case MenuRulerInches:
  2394.        _fRulerUnits = INCHES;
  2395.        frame->Invalidate(ev, _fBackgroundShape, kNoBias);
  2396.        break;
  2397.     case MenuRulerCentimeters:
  2398.        _fRulerUnits = METRIC;
  2399.        frame->Invalidate(ev, _fBackgroundShape, kNoBias);
  2400.        break;
  2401.     case MenuMarginDots:
  2402. #ifdef _PLATFORM_OS2_
  2403.        _fMarginLine = LINETYPE_DOT;
  2404. #endif
  2405. #ifdef _PLATFORM_WIN32_
  2406.        _fMarginLine = PS_DOT;
  2407. #endif
  2408.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2409.        break;
  2410.     case MenuMarginDash:
  2411. #ifdef _PLATFORM_OS2_
  2412.        _fMarginLine = LINETYPE_LONGDASH;
  2413. #endif
  2414. #ifdef _PLATFORM_WIN32_
  2415.        _fMarginLine = PS_DASH;
  2416. #endif
  2417.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2418.        break;
  2419.     case MenuMarginDashDot:
  2420. #ifdef _PLATFORM_OS2_
  2421.        _fMarginLine = LINETYPE_DASHDOT;
  2422. #endif
  2423. #ifdef _PLATFORM_WIN32_
  2424.        _fMarginLine = PS_DASHDOT;
  2425. #endif
  2426.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2427.        break;
  2428.     case MenuMarginDashDoubleDot:
  2429. #ifdef _PLATFORM_OS2_
  2430.        _fMarginLine = LINETYPE_DASHDOUBLEDOT;
  2431. #endif
  2432. #ifdef _PLATFORM_WIN32_
  2433.        _fMarginLine = PS_DASHDOTDOT;
  2434. #endif
  2435.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2436.        break;
  2437.     case MenuMarginSolid:
  2438. #ifdef _PLATFORM_OS2_
  2439.        _fMarginLine = LINETYPE_SOLID;
  2440. #endif
  2441. #ifdef _PLATFORM_WIN32_
  2442.        _fMarginLine = PS_SOLID;
  2443. #endif
  2444.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2445.        break;
  2446.     case MenuGridDots:
  2447. #ifdef _PLATFORM_OS2_
  2448.        _fGridLine = LINETYPE_DOT;
  2449. #endif
  2450. #ifdef _PLATFORM_WIN32_
  2451.        _fGridLine = PS_DOT;
  2452. #endif
  2453.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2454.        break;
  2455.     case MenuGridDash:
  2456. #ifdef _PLATFORM_OS2_
  2457.        _fGridLine = LINETYPE_LONGDASH;
  2458. #endif
  2459. #ifdef _PLATFORM_WIN32_
  2460.        _fGridLine = PS_DASH;
  2461. #endif
  2462.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2463.        break;
  2464.     case MenuGridDashDot:
  2465. #ifdef _PLATFORM_OS2_
  2466.        _fGridLine = LINETYPE_DASHDOT;
  2467. #endif
  2468. #ifdef _PLATFORM_WIN32_
  2469.        _fGridLine = PS_DASHDOT;
  2470. #endif
  2471.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2472.        break;
  2473.     case MenuGridDashDoubleDot:
  2474. #ifdef _PLATFORM_OS2_
  2475.        _fGridLine = LINETYPE_DASHDOUBLEDOT;
  2476. #endif
  2477. #ifdef _PLATFORM_WIN32_
  2478.        _fGridLine = PS_DASHDOTDOT;
  2479. #endif
  2480.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2481.        break;
  2482.     case MenuGridSolid:
  2483. #ifdef _PLATFORM_OS2_
  2484.        _fGridLine = LINETYPE_SOLID;
  2485. #endif
  2486. #ifdef _PLATFORM_WIN32_
  2487.        _fGridLine = PS_SOLID;
  2488. #endif
  2489.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2490.        break;
  2491.     case MenuHeader:
  2492. #ifdef _PLATFORM_OS2_
  2493.        newText = (char *) WinDlgBox(HWND_DESKTOP, event->hwnd, GetTextDlgProc,
  2494.           _fResources, GetTextDlgValue, (PVOID) HeaderDlgValue);
  2495. #endif //_PLATFORM_OS2_
  2496.  
  2497. #ifdef _PLATFORM_WIN32_
  2498.        newText = (char *) DialogBoxParam(_fResources,
  2499.           MAKEINTRESOURCE(GetTextDlgValue), event->hwnd,
  2500.           (DLGPROC) GetTextDlgProc, (LPARAM) HeaderDlgValue);
  2501. #endif //_PLATFORM_WIN32_
  2502.  
  2503.        if (newText!=kODNULL) {
  2504.           strcpy(_fHeaderText, newText);
  2505.           free(newText);
  2506.           frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2507.        } else contentChanged = kODFalse;
  2508.        break;
  2509.     case MenuFooter:
  2510. #ifdef _PLATFORM_OS2_
  2511.        newText = (char *) WinDlgBox(HWND_DESKTOP, event->hwnd, GetTextDlgProc,
  2512.           _fResources, GetTextDlgValue, (PVOID) FooterDlgValue);
  2513. #endif //_PLATFORM_OS2_
  2514.  
  2515. #ifdef _PLATFORM_WIN32_
  2516.        newText = (char *) DialogBoxParam(_fResources,
  2517.           MAKEINTRESOURCE(GetTextDlgValue), event->hwnd,
  2518.           (DLGPROC) GetTextDlgProc, (LPARAM) FooterDlgValue);
  2519. #endif //_PLATFORM_WIN32_
  2520.  
  2521.        if (newText!=kODNULL) {
  2522.           strcpy(_fFooterText, newText);
  2523.           free(newText);
  2524.           frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2525.        } else contentChanged = kODFalse;
  2526.        break;
  2527.     case MenuBackgroundColor:
  2528.        _fBackgroundColor = _ColorSelection(ev, _fBackgroundColor, 1);
  2529.        frame->Invalidate(ev, _fBackgroundShape, kNoBias);
  2530.        break;
  2531.     case MenuPageColor:
  2532.        _fPageColor = _ColorSelection(ev, _fPageColor, 1);
  2533.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2534.        break;
  2535.     case MenuTextColor:
  2536.        _fPageStringColor = _ColorSelection(ev, _fPageStringColor, 1);
  2537.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2538.        break;
  2539.     case MenuRulersColor:
  2540.        _fRulerColor = _ColorSelection(ev, _fRulerColor, 1);
  2541.        frame->Invalidate(ev, _fBackgroundShape, kNoBias);
  2542.        break;
  2543.     case MenuMarginsColor:
  2544.        _fHorzMarginColor = _fVertMarginColor =
  2545.           _ColorSelection(ev, _fVertMarginColor, 1);
  2546.        frame->Invalidate(ev, kODNULL, kNoBias);
  2547.        break;
  2548.     case MenuGridColor:
  2549.        _fGridColor = _ColorSelection(ev, _fGridColor, 1);
  2550.        frame->Invalidate(ev, _fVisiblePagesShape, kNoBias);
  2551.        break;
  2552.     default:
  2553.        handled = kODFalse;
  2554.        contentChanged=kODFalse;
  2555.        break;
  2556.     } /* endswitch */
  2557.  
  2558.     if (contentChanged)
  2559.     {
  2560.       somSelf->GetStorageUnit(ev)->GetDraft(ev)->SetChangedFromPrev(ev);
  2561.       PageLayout_parent_BaseContainer_ChangeNotification(somSelf, ev,
  2562.            BCC_INTRINSIC, kODNULL, kODNULL, kODTrue, kODNULL);
  2563.     }
  2564.  
  2565.     if (!handled) {
  2566.        handled = PageLayout_parent_BaseContainer_HandleMenuEvent(somSelf, ev,
  2567.           frame, event);
  2568.     } /* endif */
  2569.  
  2570.     return(handled);
  2571. }
  2572.  
  2573.  
  2574. SOM_Scope void  SOMLINK PageLayoutAdjustMenus(PageLayout *somSelf,
  2575.                                                Environment *ev,
  2576.                                               ODFrame* frame)
  2577. {
  2578.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  2579.     PageLayoutMethodDebug("PageLayout","PageLayoutAdjustMenus");
  2580.  
  2581.     PageLayout_parent_BaseContainer_AdjustMenus(somSelf, ev, frame);
  2582.  
  2583.     if (frame->GetLinkStatus(ev) == kODInLinkDestination)
  2584.     {
  2585.       _fMenuBar->EnableMenuItem(ev, IDMS_EDIT, MenuFillPage, kODFalse);
  2586.       _fMenuBar->EnableMenuItem(ev, IDMS_EDIT, MenuSnapToGrid, kODFalse);
  2587.       _fMenuBar->EnableMenuItem(ev, IDMS_VIEW, MenuShowRulers, kODFalse);
  2588.       _fMenuBar->EnableMenuItem(ev, IDMS_VIEW, MenuShowMargins, kODFalse);
  2589.       _fMenuBar->EnableMenuItem(ev, IDMS_VIEW, MenuShowGrid, kODFalse);
  2590.       _fMenuBar->EnableMenu(ev, PageMenuID, kODFalse);
  2591.       _fMenuBar->EnableMenu(ev, ColorMenuID, kODFalse);
  2592.     }
  2593.     else
  2594.     {
  2595.       ODBoolean HasSelection = kODFalse;
  2596.       ALinkedList *itr = _GetSelectedObjects(ev);
  2597.       if (itr) {
  2598.          ALink *item = itr->First(ev);
  2599.          if (item) {
  2600.             HasSelection = (item->Content(ev)!=kODNULL);
  2601.          } /* endif */
  2602.       } /* endif */
  2603.  
  2604.       _fMenuBar->EnableMenuItem(ev, IDMS_EDIT, MenuFillPage, HasSelection);
  2605.       _fMenuBar->EnableMenuItem(ev, IDMS_EDIT, MenuSnapToGrid, HasSelection);
  2606.  
  2607.       _fMenuBar->CheckMenuItem(ev, IDMS_VIEW, MenuShowRulers,
  2608.           _fShowVertRuler || _fShowHorzRuler);
  2609.       _fMenuBar->CheckMenuItem(ev, IDMS_VIEW, MenuShowMargins,
  2610.           _fShowVertMargins || _fShowHorzMargins);
  2611.       _fMenuBar->CheckMenuItem(ev, IDMS_VIEW, MenuShowGrid, _fShowGrid);
  2612.  
  2613.       _fMenuBar->EnableMenuItem(ev, PageMenuID, MenuRemovePage,
  2614.          _fNumberOfPages>1);
  2615.  
  2616.       _fMenuBar->CheckMenuItem(ev, MenuPageNumberPosition, MenuPageNumberTopLeft,
  2617.          _fPageNumberPosition==TOP_LEFT);
  2618.       _fMenuBar->CheckMenuItem(ev, MenuPageNumberPosition, MenuPageNumberTopCenter,
  2619.          _fPageNumberPosition==TOP_CENTER);
  2620.       _fMenuBar->CheckMenuItem(ev, MenuPageNumberPosition, MenuPageNumberTopRight,
  2621.          _fPageNumberPosition==TOP_RIGHT);
  2622.       _fMenuBar->CheckMenuItem(ev, MenuPageNumberPosition, MenuPageNumberBottomLeft,
  2623.          _fPageNumberPosition==BOTTOM_LEFT);
  2624.       _fMenuBar->CheckMenuItem(ev, MenuPageNumberPosition, MenuPageNumberBottomCenter,
  2625.          _fPageNumberPosition==BOTTOM_CENTER);
  2626.       _fMenuBar->CheckMenuItem(ev, MenuPageNumberPosition, MenuPageNumberBottomRight,
  2627.          _fPageNumberPosition==BOTTOM_RIGHT);
  2628.       _fMenuBar->CheckMenuItem(ev, MenuPageNumberPosition, MenuPageNumberNone,
  2629.          _fPageNumberPosition==NONE);
  2630.  
  2631.       _fMenuBar->CheckMenuItem(ev, MenuRulerUnits, MenuRulerInches,
  2632.          _fRulerUnits==INCHES);
  2633.       _fMenuBar->CheckMenuItem(ev, MenuRulerUnits, MenuRulerCentimeters,
  2634.          _fRulerUnits==METRIC);
  2635.  
  2636.       _fMenuBar->CheckMenuItem(ev, MenuMarginLineType, MenuMarginDots,
  2637. #ifdef _PLATFORM_OS2_
  2638.          _fMarginLine==LINETYPE_DOT);
  2639. #endif
  2640. #ifdef _PLATFORM_WIN32_
  2641.          _fMarginLine==PS_DOT);
  2642. #endif
  2643.       _fMenuBar->CheckMenuItem(ev, MenuMarginLineType, MenuMarginDash,
  2644. #ifdef _PLATFORM_OS2_
  2645.          _fMarginLine==LINETYPE_LONGDASH);
  2646. #endif
  2647. #ifdef _PLATFORM_WIN32_
  2648.          _fMarginLine==PS_DASH);
  2649. #endif
  2650.       _fMenuBar->CheckMenuItem(ev, MenuMarginLineType, MenuMarginDashDot,
  2651. #ifdef _PLATFORM_OS2_
  2652.          _fMarginLine==LINETYPE_DASHDOT);
  2653. #endif
  2654. #ifdef _PLATFORM_WIN32_
  2655.          _fMarginLine==PS_DASHDOT);
  2656. #endif
  2657.       _fMenuBar->CheckMenuItem(ev, MenuMarginLineType, MenuMarginDashDoubleDot,
  2658. #ifdef _PLATFORM_OS2_
  2659.          _fMarginLine==LINETYPE_DASHDOUBLEDOT);
  2660. #endif
  2661. #ifdef _PLATFORM_WIN32_
  2662.          _fMarginLine==PS_DASHDOTDOT);
  2663. #endif
  2664.       _fMenuBar->CheckMenuItem(ev, MenuMarginLineType, MenuMarginSolid,
  2665. #ifdef _PLATFORM_OS2_
  2666.          _fMarginLine==LINETYPE_SOLID);
  2667. #endif
  2668. #ifdef _PLATFORM_WIN32_
  2669.          _fMarginLine==PS_SOLID);
  2670. #endif
  2671.  
  2672.       _fMenuBar->CheckMenuItem(ev, MenuGridLineType, MenuGridDots,
  2673. #ifdef _PLATFORM_OS2_
  2674.          _fGridLine==LINETYPE_DOT);
  2675. #endif
  2676. #ifdef _PLATFORM_WIN32_
  2677.          _fGridLine==PS_DOT);
  2678. #endif
  2679.       _fMenuBar->CheckMenuItem(ev, MenuGridLineType, MenuGridDash,
  2680. #ifdef _PLATFORM_OS2_
  2681.          _fGridLine==LINETYPE_LONGDASH);
  2682. #endif
  2683. #ifdef _PLATFORM_WIN32_
  2684.          _fGridLine==PS_DASH);
  2685. #endif
  2686.       _fMenuBar->CheckMenuItem(ev, MenuGridLineType, MenuGridDashDot,
  2687. #ifdef _PLATFORM_OS2_
  2688.          _fGridLine==LINETYPE_DASHDOT);
  2689. #endif
  2690. #ifdef _PLATFORM_WIN32_
  2691.          _fGridLine==PS_DASHDOT);
  2692. #endif
  2693.       _fMenuBar->CheckMenuItem(ev, MenuGridLineType, MenuGridDashDoubleDot,
  2694. #ifdef _PLATFORM_OS2_
  2695.          _fGridLine==LINETYPE_DASHDOUBLEDOT);
  2696. #endif
  2697. #ifdef _PLATFORM_WIN32_
  2698.          _fGridLine==PS_DASHDOTDOT);
  2699. #endif
  2700.       _fMenuBar->CheckMenuItem(ev, MenuGridLineType, MenuGridSolid,
  2701. #ifdef _PLATFORM_OS2_
  2702.          _fGridLine==LINETYPE_SOLID);
  2703. #endif
  2704. #ifdef _PLATFORM_WIN32_
  2705.          _fGridLine==PS_SOLID);
  2706. #endif
  2707.     }
  2708. }
  2709.  
  2710.  
  2711. SOM_Scope void  SOMLINK PageLayoutFacetAdded(PageLayout *somSelf,
  2712.                                               Environment *ev,
  2713.                                              ODFacet* facet)
  2714. {
  2715.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  2716.     PageLayoutMethodDebug("PageLayout","PageLayoutFacetAdded");
  2717.  
  2718.     PageLayout_parent_BaseContainer_FacetAdded(somSelf, ev, facet);
  2719.  
  2720.     ODCanvas *canvas = facet->GetCanvas(ev);
  2721.     if (canvas && canvas->IsDynamic(ev)) { /* don't do when printing */
  2722. #ifdef SMART_DRAWING
  2723.        if (_fBackgroundShape==kODNULL) {
  2724.           _fBackgroundShape = facet->CreateShape(ev);
  2725.        } /* endif */
  2726.  
  2727.        if (_fVisiblePagesShape==kODNULL) {
  2728.           _fVisiblePagesShape = facet->CreateShape(ev);
  2729.        } /* endif */
  2730. #endif
  2731.  
  2732. /* Determine scaling factor (used in MaxPagesReached()) */
  2733.        ODTransform *frameXform = facet->AcquireFrameTransform(ev, kNoBias);
  2734.  
  2735.        ODPoint scale;
  2736.        frameXform->GetScale(ev, &scale);
  2737.        _fXScaleFactor = ((double) scale.x)/((double) 0x10000);
  2738.        _fYScaleFactor = ((double) scale.y)/((double) 0x10000);
  2739.  
  2740.        frameXform->Release(ev);
  2741.  
  2742.        ODFrame *frame = facet->GetFrame(ev);
  2743.        if (_fNeedToResizeDocShell) {
  2744.           if (frame->IsRoot(ev)) {
  2745.              _ResizeDocShell(ev, facet);
  2746.           } else {
  2747.              _FrameShapeChanged(ev, frame);
  2748.           } /* endif */
  2749.           _fNeedToResizeDocShell = kODFalse;
  2750.        } /* endif */
  2751.     } /* endif */
  2752. }
  2753.  
  2754.  
  2755. SOM_Scope void  SOMLINK PageLayoutFrameShapeChanged(PageLayout *somSelf,
  2756.                                                      Environment *ev,
  2757.                                                     ODFrame* frame)
  2758. {
  2759.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  2760.     PageLayoutMethodDebug("PageLayout","PageLayoutFrameShapeChanged");
  2761.  
  2762.     PageLayout_parent_BaseContainer_FrameShapeChanged(somSelf, ev, frame);
  2763.  
  2764.     _DetermineVisiblePages(ev, frame);
  2765. }
  2766.  
  2767.  
  2768. // -------------------------------------------------------------------------
  2769. // PageLayout --> ChangeNotification
  2770. // This is a hook for subclasses of BaseContainer so that they can know
  2771. // when anything changes with respect to the embedded parts
  2772. // -------------------------------------------------------------------------
  2773.  
  2774. SOM_Scope       void
  2775. SOMLINK         PageLayoutChangeNotification
  2776.                 (
  2777.                 PageLayout     *somSelf,
  2778.                 Environment    *ev,
  2779.                 ODULong         reason,
  2780.                 ODFrame        *frame,
  2781.                 ContentObject  *content,
  2782.                 ODBoolean       bPropagate,
  2783.                 ODUpdateID      updateID
  2784.                 )
  2785. {
  2786.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  2787.     PageLayoutMethodDebug("PageLayout","PageLayoutChangeNotification");
  2788.  
  2789.     ODBoolean adjust=kODFalse;
  2790.  
  2791.     if (content!=kODNULL) {
  2792.        adjust = _KeepEmbedWithinMargins(ev, content);
  2793.     } else {
  2794.        ALinkedList *itr = _GetEmbeddedObjects(ev);
  2795.        if (itr!=kODNULL) {
  2796.           ALink *item = itr->First(ev);
  2797.           if (item!=kODNULL) {
  2798.              ContentObject *cObj = (ContentObject *) item->Content(ev);
  2799.              while (cObj!=kODNULL) {
  2800.                 if (_KeepEmbedWithinMargins(ev, cObj)) {
  2801.                    adjust = kODTrue;
  2802.                 } /* endif */
  2803.  
  2804.                 item = item->Next(ev);
  2805.                 if (item!=kODNULL) {
  2806.                    cObj = (ContentObject *) item->Content(ev);
  2807.                 } else {
  2808.                    cObj = kODNULL;
  2809.                 } /* endif */
  2810.              } /* endwhile */
  2811.           } /* endif */
  2812.        } /* endif */
  2813.     } /* endif */
  2814.  
  2815.     if (adjust) {
  2816.        _CreateSelectionBorderShapes(ev, kODNULL);
  2817.        if (frame!=kODNULL) {
  2818.           frame->Invalidate(ev, kODNULL, kNoBias);
  2819.        } /* endif */
  2820.     } /* endif */
  2821.  
  2822.     PageLayout_parent_BaseContainer_ChangeNotification(somSelf, ev,
  2823.        reason, frame, content, bPropagate, updateID);
  2824. }
  2825.  
  2826.  
  2827. // -------------------------------------------------------------------------
  2828. // PageLayout --> DrawContents
  2829. //
  2830. // -------------------------------------------------------------------------
  2831.  
  2832. SOM_Scope       ODBoolean
  2833. SOMLINK         PageLayoutDrawContents
  2834.                 (
  2835.                 PageLayout      *somSelf,       // in
  2836.                 Environment     *ev,            // in
  2837.                 ODFacet         *facet,          // in
  2838.                 ODShape         *invalidShape
  2839.                 )
  2840. {
  2841.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  2842.     PageLayoutMethodDebug("PageLayout","PageLayoutDrawContents");
  2843.  
  2844.     ODCanvas* canvas = facet->GetCanvas(ev);
  2845.     ODFrame* displayFrame = facet->GetFrame(ev);
  2846.  
  2847. #ifndef SMART_DRAWING
  2848.     ODShape *frameShape = ODCopyAndRelease(ev,
  2849. //     displayFrame->AcquireFrameShape(ev, canvas));
  2850.        displayFrame->AcquireUsedShape(ev, canvas));
  2851.  
  2852.     ODTransform *internalXform = displayFrame->AcquireInternalTransform(ev, canvas);
  2853.     frameShape->InverseTransform(ev, internalXform);
  2854.     ODReleaseObject(ev, internalXform);
  2855.  
  2856.     ODRect rect;
  2857.     frameShape->GetBoundingBox(ev, &rect);
  2858.     frameShape->Release(ev);
  2859.     Rect frameRect;
  2860.  
  2861.     // Convert to Window's rectangle
  2862. #ifdef _PLATFORM_WIN32_
  2863.        SetRect(&frameRect,
  2864.           FixedToInt(rect.left),
  2865.           FixedToInt(rect.top),
  2866.           FixedToInt(rect.right),
  2867.           FixedToInt(rect.bottom));
  2868. #endif //_PLATFORM_WIN32_
  2869.  
  2870. #ifdef _PLATFORM_OS2_
  2871.        WinSetRect((HAB) 0, &frameRect,
  2872.           FixedToInt(rect.left),
  2873.           FixedToInt(rect.bottom),
  2874.           FixedToInt(rect.right),
  2875.           FixedToInt(rect.top));
  2876. #endif //_PLATFORM_OS2_
  2877. #endif //SMART_SCROLLING
  2878.  
  2879.     HDRAW DrawingSurface;
  2880.     CFocus focus(facet, invalidShape, &DrawingSurface);
  2881.  
  2882. //  ODBoolean Printing = !(canvas->IsDynamic(ev));
  2883.     ODBoolean Printing = NULL;
  2884. #ifdef _PLATFORM_OS2_
  2885.     Printing = canvas->HasPlatformPrintJob(ev, kODPM);
  2886. #endif
  2887. #ifdef _PLATFORM_WIN32_
  2888.     if (canvas)
  2889.       Printing = canvas->HasPlatformPrintJob(ev, kODWin32);
  2890. #endif
  2891.     ODBoolean DrawAdornments = !(Printing && displayFrame->IsRoot(ev));
  2892.  
  2893. #if defined(_PLATFORM_OS2_)
  2894.  
  2895.     if (Printing) {  // Setup Font for printing
  2896.        HDC hDC = GpiQueryDevice(DrawingSurface);
  2897.        LONG resolution;
  2898.        DevQueryCaps( hDC, CAPS_HORIZONTAL_FONT_RES, 1L, &resolution);
  2899.  
  2900.        SIZEF sizfCharBox;
  2901.        //  sizfCharBox.cx = MAKEFIXED ((4)*resolution /72, 0);
  2902.        //  sizfCharBox.cy = MAKEFIXED ((4)*resolution /72, 0);
  2903.        sizfCharBox.cx = MAKEFIXED (8, 0);
  2904.        sizfCharBox.cy = MAKEFIXED (8, 0);
  2905.        GpiSetCharBox(DrawingSurface,&sizfCharBox);        // scaling
  2906.     } /* endif */
  2907.  
  2908.     // set hps to RGB mode!
  2909.     GpiCreateLogColorTable(DrawingSurface, 0, LCOLF_RGB, 0, 0, NULL);
  2910.  
  2911.     if (DrawAdornments && !_fIsTransparent) {
  2912.        GpiSetColor(DrawingSurface, _fBackgroundColor);
  2913.  
  2914. #ifdef SMART_DRAWING
  2915.        ODTransform *xform = facet->AcquireContentTransform(ev, kNoBias);
  2916.        ODShape *transformedShape = _fBackgroundShape->Copy(ev);
  2917.        transformedShape->Transform(ev, xform);
  2918.  
  2919.        HRGN BackgroundRegion = _fBackgroundShape->GetRegion(ev);
  2920.        GpiPaintRegion(DrawingSurface, BackgroundRegion);
  2921.  
  2922.        transformedShape->Release(ev);
  2923.        xform->Release(ev);
  2924. #else
  2925.        POINTL pos = {frameRect.xLeft, frameRect.yBottom};
  2926.        GpiMove(DrawingSurface, &pos);
  2927.        pos.x = frameRect.xRight; pos.y = frameRect.yTop;
  2928.        GpiBox(DrawingSurface, DRO_FILL, &pos, 0, 0);
  2929. #endif
  2930.     } /* endif */
  2931.  
  2932. #elif defined(_PLATFORM_WIN32_)
  2933.     if (Printing) {  // Setup Font for printing
  2934.        HFONT newFont = GetStockObject(ANSI_FIXED_FONT);
  2935.        SelectObject(DrawingSurface, newFont);
  2936.     } /* endif */
  2937.  
  2938.     if (DrawAdornments && !_fIsTransparent) {
  2939.        // Create a solid brush
  2940.        HBRUSH newBrush = CreateSolidBrush(_fBackgroundColor);
  2941.  
  2942.        // Fill the rectangle with the brush
  2943.        FillRect(DrawingSurface, &frameRect, newBrush);
  2944.  
  2945.        // Get rid of the brush
  2946.        DeleteObject(newBrush);
  2947.     } /* endif */
  2948.  
  2949.     SetTextColor(DrawingSurface, _fPageStringColor);
  2950.     SetBkMode(DrawingSurface, TRANSPARENT);
  2951. #endif  // end WIN32 specific
  2952.  
  2953. #ifdef SMART_DRAWING
  2954.     if (!_fIsTransparent &&
  2955.         (DrawAdornments || (Printing && _fPrintPageColor))) {
  2956. #ifdef _PLATFORM_OS2_
  2957.        ODTransform *xform = facet->AcquireContentTransform(ev, kNoBias);
  2958.        ODShape *transformedShape = _fVisiblePagesShape->Copy(ev);
  2959.        transformedShape->Transform(ev, xform);
  2960.  
  2961.        HRGN VisiblePagesRegion = _fVisiblePagesShape->GetRegion(ev);
  2962.  
  2963.        GpiPaintRegion(DrawingSurface, VisiblePagesRegion);
  2964.  
  2965.        transformedShape->Release(ev);
  2966.        xform->Release(ev);
  2967. #endif //_PLATFORM_OS2_
  2968.     } /* endif */
  2969. #endif //SMART_DRAWING
  2970.  
  2971.     short FirstPage = Printing ? 0 : _fFirstVisiblePage;
  2972.     short LastPage = Printing ? _fNumberOfPages-1 : _fLastVisiblePage;
  2973.  
  2974. //  for (short index=0; index<_fNumberOfPages; index++)
  2975.     for (short index=FirstPage; index<=LastPage; index++)
  2976.     {
  2977.        _DrawPage(ev, DrawingSurface, index, Printing, DrawAdornments);
  2978.     } /* endfor */
  2979.  
  2980.     return kODTrue;
  2981. }
  2982.  
  2983.  
  2984. // -------------------------------------------------------------------------
  2985. // PageLayout --> ReadContents
  2986. //
  2987. //      Read part's content from storage.
  2988. //
  2989. // -------------------------------------------------------------------------
  2990. SOM_Scope       void
  2991. SOMLINK         PageLayoutReadContents
  2992.                 (
  2993.                 PageLayout   *somSelf,       // in
  2994.                 Environment     *ev,            // in
  2995.                 ODStorageUnit   *fromSU,          // in
  2996.                 BCCloneInfo     *cloneInfo,
  2997.                 ODULong         readKind
  2998.                 )
  2999.  
  3000. {
  3001.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  3002.     PageLayoutMethodDebug("PageLayout", "PageLayoutReadContents");
  3003.  
  3004.     // Read in our parent's contents first
  3005.     PageLayout_parent_BaseContainer_ReadContents(somSelf, ev,
  3006.                                                  fromSU,
  3007.                                                  cloneInfo,
  3008.                                                  readKind);
  3009.  
  3010.     if (ODSUExistsThenFocus(ev, fromSU, kODPropContents, kPartKindName)) {
  3011.        StorageUnitGetValue(fromSU, ev, sizeof(short), &_fNumberOfPages);
  3012.  
  3013.        StorageUnitGetValue(fromSU, ev, sizeof(COLORREF), &_fBackgroundColor);
  3014.        StorageUnitGetValue(fromSU, ev, sizeof(COLORREF), &_fPageColor);
  3015.        StorageUnitGetValue(fromSU, ev, sizeof(COLORREF), &_fPageStringColor);
  3016.        StorageUnitGetValue(fromSU, ev, sizeof(COLORREF), &_fRulerColor);
  3017.        StorageUnitGetValue(fromSU, ev, sizeof(COLORREF), &_fHorzMarginColor);
  3018.        StorageUnitGetValue(fromSU, ev, sizeof(COLORREF), &_fVertMarginColor);
  3019.        StorageUnitGetValue(fromSU, ev, sizeof(COLORREF), &_fGridColor);
  3020.  
  3021.        StorageUnitGetValue(fromSU, ev, sizeof(ODBoolean), &_fShowHorzRuler);
  3022.        StorageUnitGetValue(fromSU, ev, sizeof(ODBoolean), &_fShowVertRuler);
  3023.        StorageUnitGetValue(fromSU, ev, sizeof(ODBoolean), &_fShowHorzMargins);
  3024.        StorageUnitGetValue(fromSU, ev, sizeof(ODBoolean), &_fShowVertMargins);
  3025.        StorageUnitGetValue(fromSU, ev, sizeof(ODBoolean), &_fShowGrid);
  3026.  
  3027.        StorageUnitGetValue(fromSU, ev, sizeof(long), &_fPageNumberPosition);
  3028.        StorageUnitGetValue(fromSU, ev, sizeof(short), &_fRulerUnits);
  3029.        StorageUnitGetValue(fromSU, ev, sizeof(short), &_fMarginLine);
  3030.        StorageUnitGetValue(fromSU, ev, sizeof(short), &_fGridLine);
  3031.  
  3032.        int len=0;
  3033.        StorageUnitGetValue(fromSU, ev, sizeof(int), &len);
  3034.        if (len>0) {
  3035.           StorageUnitGetValue(fromSU, ev, len, &_fHeaderText);
  3036.        } /* endif */
  3037.  
  3038.        StorageUnitGetValue(fromSU, ev, sizeof(int), &len);
  3039.        if (len>0) {
  3040.           StorageUnitGetValue(fromSU, ev, len, &_fFooterText);
  3041.        } /* endif */
  3042.  
  3043.        StorageUnitGetValue(fromSU, ev, sizeof(int), &len);
  3044.        if (len>0) {
  3045.           StorageUnitGetValue(fromSU, ev, len, &_fCurrentPrinterQueueName);
  3046.        } /* endif */
  3047.  
  3048.        if (_fPrintExt!=kODNULL) {
  3049.           if (len>0) {
  3050.              _fPrintExt->QuerySelectedPrinter(ev, _fCurrentPrinterQueueName,
  3051.                 kODFalse);
  3052.           } /* endif */
  3053.           _fPrintExt->SetNumberOfPages(ev, _fNumberOfPages);
  3054.        } /* endif */
  3055.  
  3056.        if (_fScrollExt!=kODNULL) {
  3057.           _fScrollExt->SetScrollableDimensions(ev, kODNULL, _fTotalPageWidth,
  3058.              _fTotalPageHeight*_fNumberOfPages);
  3059.        } /* endif */
  3060.     } /* endif */
  3061. }
  3062.  
  3063.  
  3064. // -------------------------------------------------------------------------
  3065. // PageLayout --> WriteContents
  3066. //
  3067. //      Writes part's content to storage.
  3068. //
  3069. // -------------------------------------------------------------------------
  3070. SOM_Scope       void
  3071. SOMLINK         PageLayoutWriteContents
  3072.                 (
  3073.                 PageLayout    *somSelf,       // in
  3074.                 Environment   *ev,            // in
  3075.                 ODStorageUnit *toSU,          // in
  3076.                 BCCloneInfo   *cloneInfo,
  3077.                 ODULong       writeKind
  3078.                 )
  3079.  
  3080. {
  3081.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  3082.     PageLayoutMethodDebug("PageLayout", "PageLayoutWriteContents");
  3083.  
  3084.     // Read in our parent's contents first
  3085.     PageLayout_parent_BaseContainer_WriteContents(somSelf, ev,
  3086.                                                   toSU,
  3087.                                                   cloneInfo,
  3088.                                                   writeKind);
  3089.  
  3090.     ODSUForceFocus(ev, toSU, kODPropContents, kPartKindName);
  3091.     StorageUnitSetValue(toSU, ev, sizeof(short), &_fNumberOfPages);
  3092.  
  3093.     StorageUnitSetValue(toSU, ev, sizeof(COLORREF), &_fBackgroundColor);
  3094.     StorageUnitSetValue(toSU, ev, sizeof(COLORREF), &_fPageColor);
  3095.     StorageUnitSetValue(toSU, ev, sizeof(COLORREF), &_fPageStringColor);
  3096.     StorageUnitSetValue(toSU, ev, sizeof(COLORREF), &_fRulerColor);
  3097.     StorageUnitSetValue(toSU, ev, sizeof(COLORREF), &_fHorzMarginColor);
  3098.     StorageUnitSetValue(toSU, ev, sizeof(COLORREF), &_fVertMarginColor);
  3099.     StorageUnitSetValue(toSU, ev, sizeof(COLORREF), &_fGridColor);
  3100.  
  3101.     StorageUnitSetValue(toSU, ev, sizeof(ODBoolean), &_fShowHorzRuler);
  3102.     StorageUnitSetValue(toSU, ev, sizeof(ODBoolean), &_fShowVertRuler);
  3103.     StorageUnitSetValue(toSU, ev, sizeof(ODBoolean), &_fShowHorzMargins);
  3104.     StorageUnitSetValue(toSU, ev, sizeof(ODBoolean), &_fShowVertMargins);
  3105.     StorageUnitSetValue(toSU, ev, sizeof(ODBoolean), &_fShowGrid);
  3106.  
  3107.     StorageUnitSetValue(toSU, ev, sizeof(long), &_fPageNumberPosition);
  3108.     StorageUnitSetValue(toSU, ev, sizeof(short), &_fRulerUnits);
  3109.     StorageUnitSetValue(toSU, ev, sizeof(short), &_fMarginLine);
  3110.     StorageUnitSetValue(toSU, ev, sizeof(short), &_fGridLine);
  3111.  
  3112.     int len=strlen(_fHeaderText);
  3113.     StorageUnitSetValue(toSU, ev, sizeof(int), &len);
  3114.     if (len>0) {
  3115.        StorageUnitSetValue(toSU, ev, len, &_fHeaderText);
  3116.     } /* endif */
  3117.  
  3118.     len=strlen(_fFooterText);
  3119.     StorageUnitSetValue(toSU, ev, sizeof(int), &len);
  3120.     if (len>0) {
  3121.        StorageUnitSetValue(toSU, ev, len, &_fFooterText);
  3122.     } /* endif */
  3123.  
  3124.     if (_fPrintExt!=kODNULL) {
  3125.        _fCurrentPrinterQueueName =
  3126.           _fPrintExt->GetCurrentPrinterQueuePhysicalName(ev);
  3127.     } /* endif */
  3128.  
  3129.     if (_fCurrentPrinterQueueName!=kODNULL) {
  3130.        len=strlen(_fCurrentPrinterQueueName);
  3131.     } else {
  3132.        len=0;
  3133.     } /* endif */
  3134.     StorageUnitSetValue(toSU, ev, sizeof(int), &len);
  3135.     if (len>0) {
  3136.        StorageUnitSetValue(toSU, ev, len, &_fCurrentPrinterQueueName);
  3137.     } /* endif */
  3138. }
  3139.  
  3140.  
  3141. // -------------------------------------------------------------------------
  3142. // PageLayout --> ReadKindInfo
  3143. //
  3144. //      Reads Base Container kind from the storage unit.
  3145. //
  3146. // -------------------------------------------------------------------------
  3147.  
  3148. SOM_Scope       ODBoolean
  3149. SOMLINK         PageLayoutReadKindInfo
  3150.                 (
  3151.                 PageLayout    *somSelf,       // in
  3152.                 Environment   *ev,            // in
  3153.                 ODStorageUnit *fromSU         // in
  3154.                 )
  3155. {
  3156.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  3157.     PageLayoutMethodDebug("PageLayout", "PageLayoutReadKindInfo");
  3158.  
  3159.     ODBoolean bExists = kODFalse;
  3160.  
  3161.     try {
  3162.  
  3163.     bExists = fromSU->Exists(ev, kODPropContents, kPartKindName, 0);
  3164.  
  3165.     } // end of try block
  3166.     catch (...) {}
  3167.  
  3168.     return bExists;
  3169. }
  3170.  
  3171.  
  3172. // -------------------------------------------------------------------------
  3173. // PageLayout --> WriteKindInfo
  3174. //
  3175. //      Writes Base Container kind into the storage unit.
  3176. //
  3177. // -------------------------------------------------------------------------
  3178.  
  3179. SOM_Scope       void
  3180. SOMLINK         PageLayoutWriteKindInfo
  3181.                 (
  3182.                 PageLayout    *somSelf,       // in
  3183.                 Environment   *ev,            // in
  3184.                 ODStorageUnit *toSU           // in
  3185.                 )
  3186. {
  3187.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  3188.     PageLayoutMethodDebug("PageLayout", "PageLayoutWriteKindInfo");
  3189.  
  3190.     try {
  3191.  
  3192.          PageLayout_parent_BaseContainer_WriteKindInfo(somSelf, ev, toSU);
  3193.          InitPropVal(ev, toSU, kODPropContents, kPartKindName);
  3194.          InitPropVal(ev, toSU, kODPropPreferredKind, kPartKindName);
  3195.  
  3196.     } // end of try block
  3197.     catch (...) {}
  3198. }
  3199.  
  3200.  
  3201. // -------------------------------------------------------------------------
  3202. // PageLayout--> WriteIconToSU
  3203. //
  3204. // -------------------------------------------------------------------------
  3205.  
  3206. SOM_Scope       void
  3207. SOMLINK         PageLayoutWriteIconToSU
  3208.                 (
  3209.                 PageLayout       *somSelf, // in
  3210.                 Environment      *ev,      // in
  3211.                 ODStorageUnit    *toSU     // in
  3212.                 )
  3213. {
  3214.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  3215.     PageLayoutMethodDebug("PageLayout", "PageLayoutWritePartInfo");
  3216.  
  3217. #ifdef _PLATFORM_OS2_
  3218. // Customized icon support for OS2.
  3219.  
  3220.      ULONG cbIconSize;
  3221.      PBYTE pIconData = NULL;
  3222.  
  3223.      if ( !DosQueryResourceSize(_fResources, RT_POINTER, PAGEICON, &cbIconSize) &&
  3224.          !DosGetResource(_fResources, RT_POINTER, PAGEICON, (PPVOID)&pIconData)  )
  3225.      {
  3226.         InitPropVal(ev, toSU, kODPropIconFamily, kODIconFamily);
  3227.         StorageUnitSetValue(toSU, ev, cbIconSize, (ODValue) pIconData);
  3228.         DosFreeResource(pIconData);
  3229.      } /* endif */
  3230.  
  3231. #endif // _PLATFORM_OS2_
  3232. }
  3233.  
  3234.  
  3235. // -------------------------------------------------------------------------
  3236. // PageLayout --> Initialize
  3237. //
  3238. //      Common code needed by the InitPart* methods.
  3239. //
  3240. // -------------------------------------------------------------------------
  3241.  
  3242. SOM_Scope       void
  3243. SOMLINK         PageLayoutInitialize
  3244.                 (
  3245.                 PageLayout      *somSelf,       // in
  3246.                 Environment     *ev,             // in
  3247.                 ODPart          *partWrapper    // in
  3248.                 )
  3249. {
  3250.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  3251.     PageLayoutMethodDebug("PageLayout", "PageLayoutInitialize");
  3252.  
  3253.     _fPartWrapper = partWrapper;
  3254.  
  3255. #ifdef _PLATFORM_OS2_
  3256.     DosQueryModuleHandle(kPagePartMRIFileName, &_fResources);
  3257. #endif
  3258.  
  3259. #ifdef _PLATFORM_WIN32_
  3260.     _fResources = GetModuleHandle(kPagePartMRIFileName);
  3261. #endif
  3262.  
  3263.     MyResources = _fResources; /* for use by helper functions */
  3264.  
  3265.     if (_fResources==kODNULL) {
  3266.        WarningBox(HWND_DESKTOP, WARNm, ResourceErrorMsg);
  3267.     } /* endif */
  3268.  
  3269.     PageLayout_parent_BaseContainer_Initialize(somSelf, ev, partWrapper);
  3270.  
  3271.     if (_HasExtension(ev,kODPrintExtension)) {
  3272.        _fPrintExt = (PageLayoutPrintExtension *) _AcquireExtension(ev, kODPrintExtension) ;
  3273.        _EnablePrinting(ev, kODTrue, _fCurrentPrinterQueueName);
  3274.     }
  3275.  
  3276.     if (_HasExtension(ev, kODScrollExtension)) {
  3277.        _fScrollExt = (ODScrollExtension *) _AcquireExtension(ev, kODScrollExtension) ;
  3278.        _EnableScrolling(ev, kODTrue, _fTotalPageWidth, _fTotalPageHeight*_fNumberOfPages);
  3279.     }
  3280.  
  3281.     _CreateMenuBar(ev);
  3282. }
  3283.  
  3284. //--------------------------------------------------------------------------
  3285. // ReleaseAll
  3286. //
  3287. // This method is called prior to the object destructor being invoked.
  3288. // It must release all references to other objects.  If we are the Factory
  3289. // for the object we should also ensure the object is properly deleted
  3290. //--------------------------------------------------------------------------
  3291.  
  3292. SOM_Scope       void
  3293. SOMLINK         PageLayoutReleaseAll
  3294.                 (
  3295.                 PageLayout      *somSelf,       // in
  3296.                 Environment     *ev             // in
  3297.                 )
  3298. {
  3299.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  3300.     PageLayoutMethodDebug("PageLayout","PageLayoutReleaseAll");
  3301.  
  3302.     //--------------------------------------------------------------------
  3303.     // Release the extensions we acquired in the initialize routine.
  3304.     // Put it in a try/catch block in case of failure, but ignore the
  3305.     // error since we're leaving.
  3306.     //--------------------------------------------------------------------
  3307.     if (_fScrollExt) {
  3308.        try {
  3309.          _fScrollExt->Release(ev);
  3310.          _fScrollExt = kODNULL ;
  3311.        }
  3312.        catch (ODException _exception) {
  3313.           PRINT("SOM exception occurred in TextPart::ReleaseAll\n");
  3314.           // Clear the exception, in case we got one
  3315.           SetErrorCodeEv(ev, kODNoError);
  3316.        }
  3317.     }
  3318.  
  3319.     if (_fPrintExt) {
  3320.        try {
  3321.          _fPrintExt->Release(ev);
  3322.          _fPrintExt = kODNULL ;
  3323.        }
  3324.        catch (ODException _exception) {
  3325.           PRINT("SOM exception occurred in TextPart::ReleaseAll\n");
  3326.           // Clear the exception, in case we got one
  3327.           SetErrorCodeEv(ev, kODNoError);
  3328.        }
  3329.     }
  3330.  
  3331.     PageLayout_parent_BaseContainer_ReleaseAll(somSelf, ev);
  3332.  
  3333. }
  3334.  
  3335.  
  3336. SOM_Scope void  SOMLINK PageLayoutsomInit(PageLayout *somSelf)
  3337. {
  3338.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  3339.     PageLayoutMethodDebug("PageLayout","PageLayoutsomInit");
  3340.  
  3341.     PageLayout_parent_BaseContainer_somInit(somSelf);
  3342.  
  3343.     _fPrintExt = kODNULL;
  3344.     _fScrollExt = kODNULL;
  3345.  
  3346.     _fCurrentPrinterQueueName = kODNULL;
  3347.  
  3348.     _fShowHorzRuler = kODTrue;
  3349.     _fShowVertRuler = kODTrue;
  3350.     _fShowHorzMargins = kODFalse;
  3351.     _fShowVertMargins = kODFalse;
  3352.     _fShowGrid = kODFalse;
  3353.  
  3354.     _fPrintPageColor = kODFalse;
  3355.  
  3356.     _fPageNumberPosition = BOTTOM_CENTER;
  3357.  
  3358. #ifdef _PLATFORM_OS2_
  3359.     _fGridLine = LINETYPE_DOT;
  3360.     _fMarginLine = LINETYPE_LONGDASH;
  3361. #endif
  3362.  
  3363. #ifdef _PLATFORM_WIN32_
  3364.     _fGridLine = PS_DOT;
  3365.     _fMarginLine = PS_DASH;
  3366. #endif
  3367.  
  3368.     _fPageUnitMeasure = INCHES;
  3369.     _fMarginsUnitMeasure = INCHES;
  3370.     _fGridUnitMeasure = INCHES;
  3371.  
  3372.     _fHeaderFooterStartOn = 1;
  3373.     strcpy(_fHeaderText, "");
  3374.     strcpy(_fFooterText,"");
  3375.  
  3376.     _fPageNumberStartOn = 1;
  3377.     _fPageNumberStartWith = 1;
  3378.  
  3379.     _fNumberOfPages = 1;
  3380.  
  3381.     _fGridSpacing = GRID_SPACING;
  3382.  
  3383.     _fRulerUnits = INCHES;
  3384.  
  3385.     _fPageWidth = PAGE_WIDTH;
  3386.     _fPageHeight = PAGE_HEIGHT;
  3387.  
  3388.     _fLeftPageOffset = LEFT_PAGE_OFFSET;
  3389.     _fRightPageOffset = RIGHT_PAGE_OFFSET;
  3390.     _fBottomPageOffset = BOTTOM_PAGE_OFFSET;
  3391.     _fTopPageOffset = TOP_PAGE_OFFSET;
  3392.  
  3393.     _fLeftMargin = LEFT_MARGIN;
  3394.     _fRightMargin = RIGHT_MARGIN;
  3395.     _fBottomMargin = BOTTOM_MARGIN;
  3396.     _fTopMargin = TOP_MARGIN;
  3397.  
  3398.     _fPageColor = 0x00FFFFFF;              // WHITE
  3399.     _fPageStringColor = 0x00000000;        // Black
  3400.     _fRulerColor = 0x00000000;             // Black
  3401.  
  3402. #ifdef _PLATFORM_OS2_
  3403.     _fBackgroundColor = 0x00CCCCCC;        // PaleGray
  3404.     _fHorzMarginColor =  0x00FF0000;       // Red
  3405.     _fVertMarginColor =  0x00FF0000;       // Red
  3406. #endif
  3407.  
  3408. #ifdef _PLATFORM_WIN32_
  3409.     _fBackgroundColor = 0x00C0C0C0;        // PaleGray
  3410.     _fHorzMarginColor =  0x000000FF;       // Red
  3411.     _fVertMarginColor =  0x000000FF;       // Red
  3412. #endif
  3413.  
  3414.     _fGridColor = 0x00555555;              // DarkGray
  3415.  
  3416.     strcpy(_fCurrentFont, kPagePartDefaultFont);
  3417.  
  3418.     _fTotalPageWidth = _fLeftPageOffset+_fPageWidth+_fRightPageOffset;
  3419.     _fTotalPageHeight = _fBottomPageOffset+_fPageHeight+_fTopPageOffset;
  3420.  
  3421.     _fFirstVisiblePage = 0;
  3422.     _fLastVisiblePage = 0;
  3423.  
  3424.     _fXScaleFactor = 1.0;
  3425.     _fYScaleFactor = 1.0;
  3426.  
  3427.     _fNeedToResizeDocShell = kODTrue;
  3428.  
  3429.     _fSameColorAsContainer = kODTrue;
  3430.  
  3431.     _fBackgroundShape = kODNULL;
  3432.     _fVisiblePagesShape = kODNULL;
  3433. }
  3434.  
  3435.  
  3436. SOM_Scope void  SOMLINK PageLayoutsomUninit(PageLayout *somSelf)
  3437. {
  3438.     /* PageLayoutData *somThis = PageLayoutGetData(somSelf); */
  3439.     PageLayoutData *somThis = PageLayoutGetData(somSelf);
  3440.     PageLayoutMethodDebug("PageLayout","PageLayoutsomUninit");
  3441.  
  3442.     PageLayout_parent_BaseContainer_somUninit(somSelf);
  3443. }
  3444.  
  3445.  
  3446. /*****************************************************************************
  3447.  M_PageLayout clsGetODPartHandlerName( M_PageLayout *somSelf,
  3448.                                   Environment *ev )
  3449. ******************************************************************************/
  3450.  
  3451. SOM_Scope ISOString  SOMLINK M_PageLayoutclsGetODPartHandlerName
  3452.                  (M_PageLayout *somSelf,  Environment *ev)
  3453. {
  3454.     /* M_PageLayoutData *somThis = M_PageLayoutGetData(somSelf); */
  3455.     M_PageLayoutMethodDebug("M_PageLayout","M_PageLayoutclsGetODPartHandlerName");
  3456.  
  3457.     string handlerName = (string)SOMMalloc(strlen(kPartHandlerName)+1);
  3458.     strcpy(handlerName,kPartHandlerName);
  3459.  
  3460.  
  3461.     return (ISOString) handlerName;
  3462. }
  3463.  
  3464. /*****************************************************************************
  3465.  M_PageLayout --> clsGetODPartHandlerDisplayName( M_PageLayout *somSelf,
  3466.                                   Environment *ev )
  3467. ******************************************************************************/
  3468.  
  3469. SOM_Scope string  SOMLINK M_PageLayoutclsGetODPartHandlerDisplayName(M_PageLayout *somSelf,
  3470.                                                                          Environment *ev)
  3471. {
  3472.     /* M_PageLayoutData *somThis = M_PageLayoutGetData(somSelf); */
  3473.     M_PageLayoutMethodDebug("M_PageLayout","M_PageLayoutclsGetODPartHandlerDisplayName");
  3474.  
  3475.     string handlerName = (string)SOMMalloc(strlen(kPartHandlerDisplayName)+1);
  3476.     strcpy(handlerName,kPartHandlerDisplayName);
  3477.  
  3478.  
  3479.     return (ISOString) handlerName;
  3480. }
  3481.  
  3482. /*****************************************************************************
  3483.  M_PageLayout --> clsGetODPartKinds( M_PageLayout *somSelf,
  3484.                                   Environment *ev )
  3485. ******************************************************************************/
  3486.  
  3487. SOM_Scope _IDL_SEQUENCE_PartKindInfo  SOMLINK M_PageLayoutclsGetODPartKinds(M_PageLayout *somSelf,
  3488.                                                                                 Environment *ev)
  3489. {
  3490.     /* M_PageLayoutData *somThis = M_PageLayoutGetData(somSelf); */
  3491.     M_PageLayoutMethodDebug("M_PageLayout","M_PageLayoutclsGetODPartKinds");
  3492.  
  3493.     _IDL_SEQUENCE_PartKindInfo partKindInfo;
  3494.  
  3495.     // Create structure PartKindInfo  and allocate memory for its fields
  3496.     PartKindInfo * info       =  (PartKindInfo *)SOMMalloc(sizeof(PartKindInfo));
  3497.     info->partKindName        =  (ISOString) SOMMalloc(strlen(kPartKindName) + 1);
  3498.     info->partKindDisplayName =  (string)SOMMalloc(strlen(kPartKindDisplayName)+1);
  3499.     info->filenameFilters     =  (string)SOMMalloc(strlen("")+1);
  3500.     info->filenameTypes       =  (string)SOMMalloc(strlen("")+1);
  3501.     info->categories          =  (string)SOMMalloc(strlen(kPartCategoryName)+1);
  3502.     info->categoryDisplayName =  (string)SOMMalloc(strlen(kPartCategoryDisplayName)+1);
  3503.     info->objectID            =  (string)SOMMalloc(strlen("")+1);
  3504.  
  3505.     // Copy the information into the structure
  3506.     strcpy(info->partKindName , kPartKindName);
  3507.     strcpy(info->partKindDisplayName, kPartKindDisplayName);
  3508.     strcpy(info->filenameFilters, "");
  3509.     strcpy(info->filenameTypes, "");
  3510.     strcpy(info->categories, kPartCategoryName);
  3511.     strcpy(info->categoryDisplayName, kPartCategoryDisplayName);
  3512.     strcpy(info->objectID, "");
  3513.  
  3514.     partKindInfo._maximum = 1;
  3515.     partKindInfo._length = 1;
  3516.     partKindInfo._buffer = info;
  3517.  
  3518.     return partKindInfo;
  3519. }
  3520.  
  3521. /*****************************************************************************
  3522.  M_PageLayout --> clsGetODPartGetOLE2ClassID( M_PageLayout *somSelf,
  3523.                                   Environment *ev )
  3524. ******************************************************************************/
  3525.  
  3526. SOM_Scope string  SOMLINK M_PageLayoutclsGetOLE2ClassId(M_PageLayout *somSelf,
  3527.                                                             Environment *ev)
  3528. {
  3529.     /* M_PageLayoutData *somThis = M_PageLayoutGetData(somSelf); */
  3530.     M_PageLayoutMethodDebug("M_PageLayout","M_PageLayoutclsGetOLE2ClassId");
  3531.  
  3532.     char *kID = "{f884b7a0-2de8-11d0-b6aa-08005aceddb4}";
  3533.  
  3534.     string OLE2ClassID = (string)SOMMalloc(strlen(kID)+1);
  3535.     strcpy(OLE2ClassID,kID);
  3536.  
  3537.     return OLE2ClassID;
  3538. }
  3539.  
  3540. /*****************************************************************************
  3541.  M_PageLayout --> clsGetODPartGetWindowsIconFileName ( M_PageLayout *somSelf,
  3542.                                   Environment *ev )
  3543. ******************************************************************************/
  3544.  
  3545. SOM_Scope string  SOMLINK M_PageLayoutclsGetWindowsIconFileName(M_PageLayout *somSelf,
  3546.                                                                     Environment *ev)
  3547. {
  3548.     /* M_PageLayoutData *somThis = M_PageLayoutGetData(somSelf); */
  3549.     M_PageLayoutMethodDebug("M_PageLayout","M_PageLayoutclsGetWindowsIconFileName");
  3550.  
  3551.     string windowsIcon = (string)SOMMalloc(strlen(kWindowsIcon)+1);
  3552.     strcpy(windowsIcon, kWindowsIcon);
  3553.  
  3554.     return windowsIcon;
  3555. }
  3556.  
  3557.