home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / tybc4 / xped4 / apxprev.cpp < prev    next >
C/C++ Source or Header  |  1994-02-13  |  9KB  |  283 lines

  1. /*  Main xped4
  2.     
  3.     Copyright ⌐ 1993. All Rights Reserved.
  4.  
  5.     SUBSYSTEM:    xped4.exe Application
  6.     FILE:         APXPrev.CPP
  7.     AUTHOR:       
  8.  
  9.  
  10.     OVERVIEW
  11.     ========
  12.     Source file for implementation of Print Preview.      
  13. */
  14.  
  15.  
  16. #include <owl\owlpch.h>
  17. #pragma hdrstop
  18.  
  19. #include <owl\controlb.h>
  20. #include <owl\buttonga.h>
  21. #include <owl\textgadg.h>
  22.  
  23. #include "apxprev.h"
  24.  
  25. #include "xped4app.rh"
  26.  
  27.  
  28. //{{PreviewWindow Implementation}}
  29.  
  30. DEFINE_RESPONSE_TABLE1(PreviewWindow, TDecoratedFrame)
  31.     EV_COMMAND(APX_PPR_PREVIOUS, PPR_Previous),
  32.     EV_COMMAND(APX_PPR_NEXT, PPR_Next),
  33.     EV_COMMAND(APX_PPR_ONEUP, PPR_OneUp),
  34.     EV_COMMAND(APX_PPR_TWOUP, PPR_TwoUp),
  35. //{{PreviewWindowRSP_TBL_BEGIN}}
  36.     EV_WM_NCLBUTTONDOWN,
  37.     EV_WM_CLOSE,
  38. //{{PreviewWindowRSP_TBL_END}}
  39. END_RESPONSE_TABLE;
  40.  
  41.  
  42. PreviewWindow::PreviewWindow (TWindow *parentWindow, TPrinter *printer, TWindow* currWindow, const char far* title, TLayoutWindow* client) :
  43.                  TDecoratedFrame(parentWindow, title, client)
  44. {
  45.     CurrWindow = currWindow;
  46.     Printer = printer;
  47.     Client = client;
  48.     Page1 = 0;
  49.     Page2 = 0;
  50.  
  51.     TPrintDialog::TData& data = Printer->GetSetup();
  52.     PrnDC = new TPrintDC(data.GetDriverName(),
  53.                          data.GetDeviceName(),
  54.                          data.GetOutputName(),
  55.                          data.GetDevMode());
  56.  
  57.     PrintExtent = new TSize(PrnDC->GetDeviceCaps(HORZRES), PrnDC->GetDeviceCaps(VERTRES));
  58.     Printout = new APXPrintOut(Printer, "Print Preview", currWindow, TRUE);
  59.  
  60.     SetBkgndColor(GetSysColor(COLOR_APPWORKSPACE));
  61.  
  62.     //
  63.     // Create default toolbar New and associate toolbar buttons with commands.
  64.     //
  65.     PreviewSpeedBar = new TControlBar(this);
  66.     PreviewSpeedBar->Insert(*new TButtonGadget(APX_PPR_PREVIOUS, APX_PPR_PREVIOUS, TButtonGadget::Command, TRUE));
  67.     PreviewSpeedBar->Insert(*new TButtonGadget(APX_PPR_NEXT, APX_PPR_NEXT, TButtonGadget::Command, TRUE));
  68.     PreviewSpeedBar->Insert(*new TSeparatorGadget(6));
  69.     PreviewSpeedBar->Insert(*new TButtonGadget(APX_PPR_ONEUP, APX_PPR_ONEUP, TButtonGadget::Exclusive, TRUE, TButtonGadget::Down));
  70.     PreviewSpeedBar->Insert(*new TButtonGadget(APX_PPR_TWOUP, APX_PPR_TWOUP, TButtonGadget::Exclusive, TRUE));
  71.     PreviewSpeedBar->Insert(*new TSeparatorGadget(12));
  72.     PreviewSpeedBar->Insert(*new TTextGadget(APX_PPR_CURRPAGE, TGadget::Recessed, TTextGadget::Left, 10, "Page 1"));
  73.     Insert(*PreviewSpeedBar, TDecoratedFrame::Top);
  74.  
  75.     // We want a window that can be sized, maximized, or minimized.
  76.     Attr.Style &= ~(WS_THICKFRAME | WS_BORDER | WS_MAXIMIZEBOX | WS_MINIMIZEBOX);
  77.     Attr.Style |= (WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU);
  78.  
  79.     // Don't show the border of the preview window.
  80.     Attr.X = -1;
  81.     Attr.Y = -1;
  82.     Attr.W = Parent->GetClientRect().Width() + 2;
  83.     Attr.H = Parent->GetClientRect().Height() + 2;
  84.     parentWindow->MapWindowPoints(HWindow, (TPoint *)&(Attr.X), 1);
  85. }
  86.  
  87.  
  88. PreviewWindow::~PreviewWindow ()
  89. {
  90.     delete Page1;
  91.     Page1 = 0;
  92.     delete Page2;
  93.     Page2 = 0;
  94.  
  95.     delete PrnDC;
  96.     PrnDC = 0;
  97.     delete PrintExtent;
  98.     PrintExtent = 0;
  99.     delete Printout;
  100.     Printout = 0;
  101. }
  102.  
  103.  
  104. void PreviewWindow::SetupWindow ()
  105. {
  106.     TDecoratedFrame::SetupWindow();
  107.  
  108.     TPrintDialog::TData& data = Printer->GetSetup();
  109.     Page1 = new TPreviewPage(Client, *Printout, *PrnDC, *PrintExtent, 1);
  110.     Page1->SetPageNumber(1);
  111.     data.FromPage = 1;
  112.     data.ToPage = 1;
  113.     data.MinPage = 1;
  114.     data.MaxPage = 1;
  115.  
  116.     Page2 = 0;
  117.  
  118.     TLayoutMetrics metrics1;
  119.  
  120.     metrics1.X.Set(lmLeft, lmRightOf, lmParent, lmLeft, 15);
  121.     metrics1.Y.Set(lmTop, lmBelow, lmParent, lmTop, 15);
  122.  
  123.     //
  124.     // Determine major axis of preview page, have that follow parent size.
  125.     // Make minor axis a percentage (aspect ratio) of the page's major axis
  126.     //
  127.     if (PrintExtent->cx > PrintExtent->cy)  {
  128.         metrics1.Width.Set(lmRight, lmLeftOf, lmParent, lmRight, 15);
  129.         metrics1.Height.PercentOf(Page1, int((long(PrintExtent->cy) * 100) / PrintExtent->cx), lmWidth);
  130.  
  131.         // Two up is only available for portrait mode.
  132.         TGadget *theGadget = PreviewSpeedBar->GadgetWithId(APX_PPR_TWOUP);
  133.         theGadget->SetEnabled(FALSE);
  134.    } else {
  135.         metrics1.Height.Set(lmBottom, lmAbove, lmParent, lmBottom, 15);
  136.         metrics1.Width.PercentOf(Page1, int((long(PrintExtent->cx) * 95) / PrintExtent->cy), lmHeight);
  137.     }
  138.  
  139.     TGadget *theGadget = PreviewSpeedBar->GadgetWithId(APX_PPR_PREVIOUS);
  140.     theGadget->SetEnabled(FALSE);
  141.  
  142.     Page1->Create();
  143.  
  144.     Client->SetChildLayoutMetrics(*Page1, metrics1);
  145.     Client->Layout();
  146. }
  147.  
  148.  
  149. void PreviewWindow::SpeedBarState ()
  150. {
  151.     TPrintDialog::TData &printerData = Printer->GetSetup();
  152.  
  153.     // Only have previous on if we're not at the first page.
  154.     TGadget *theGadget = PreviewSpeedBar->GadgetWithId(APX_PPR_PREVIOUS);
  155.     theGadget->SetEnabled(printerData.FromPage != 1);
  156.  
  157.     // Only have next on if we're not at the last page.
  158.     theGadget = PreviewSpeedBar->GadgetWithId(APX_PPR_NEXT);
  159.     theGadget->SetEnabled(printerData.ToPage != printerData.MaxPage);
  160.  
  161.     // Update the page count.
  162.     TTextGadget *theTGadget = TYPESAFE_DOWNCAST(PreviewSpeedBar->GadgetWithId(APX_PPR_CURRPAGE), TTextGadget);
  163.     if (theTGadget) {
  164.         char    buffer[32];
  165.         if (Page2 && (printerData.FromPage != printerData.ToPage))
  166.             wsprintf(buffer, "Page %d - %d", printerData.FromPage, printerData.ToPage);
  167.         else
  168.             wsprintf(buffer, "Page %d", printerData.FromPage);
  169.         theTGadget->SetText(buffer);
  170.     }
  171. }
  172.  
  173.  
  174. void PreviewWindow::EvClose ()
  175. {
  176.     // Don't call the base class EvClose we do not want PreviewWindow to be destructed.
  177.     GetApplication()->EndModal(IDCANCEL);
  178. }
  179.  
  180.  
  181. void PreviewWindow::PPR_Previous ()
  182. {
  183.     TPrintDialog::TData &printerData = Printer->GetSetup();
  184.  
  185.     if (printerData.FromPage > printerData.MinPage) { 
  186.         printerData.FromPage--;
  187.         printerData.ToPage--;
  188.  
  189.         Page1->SetPageNumber(printerData.FromPage);
  190.         if (Page2)
  191.             Page2->SetPageNumber(printerData.ToPage);
  192.     }
  193.  
  194.     SpeedBarState();
  195. }
  196.  
  197.  
  198. void PreviewWindow::PPR_Next ()
  199. {
  200.     TPrintDialog::TData &printerData = Printer->GetSetup();
  201.  
  202.     if (printerData.ToPage < printerData.MaxPage) {
  203.         printerData.FromPage++;
  204.         printerData.ToPage++;
  205.  
  206.         Page1->SetPageNumber(printerData.FromPage);
  207.         if (Page2)
  208.             Page2->SetPageNumber(printerData.ToPage);
  209.     }
  210.  
  211.     SpeedBarState();
  212. }
  213.  
  214.  
  215. void PreviewWindow::PPR_OneUp ()
  216. {
  217.     if (Page2) {
  218.         Client->RemoveChildLayoutMetrics(*Page2);
  219.  
  220.         delete Page2;
  221.         Page2 = 0;
  222.  
  223.         Client->Layout();
  224.  
  225.         TPrintDialog::TData &printerData = Printer->GetSetup();
  226.         printerData.ToPage = printerData.FromPage;
  227.  
  228.         SpeedBarState();
  229.     }
  230. }
  231.  
  232.  
  233. void PreviewWindow::PPR_TwoUp ()
  234. {
  235.     if (Page2 == 0) {
  236.         Page2 = new TPreviewPage(Client, *Printout, *PrnDC, *PrintExtent, PageNumber + 1);
  237.         Page2->Create();
  238.  
  239.         TLayoutMetrics metrics2;
  240.  
  241.         metrics2.X.Set(lmLeft, lmRightOf, Page1, lmRight, 30);
  242.         metrics2.Y.SameAs(Page1, lmTop);
  243.  
  244.         // Assume portrait
  245.         //
  246.         metrics2.Width.SameAs(Page1, lmWidth);
  247.         metrics2.Height.SameAs(Page1, lmBottom);
  248.  
  249.         Client->SetChildLayoutMetrics(*Page2, metrics2);
  250.         Client->Layout();
  251.  
  252.         TPrintDialog::TData &printerData = Printer->GetSetup();
  253.  
  254.         // Page 2 is the next page.  If the next page is outside of our
  255.         // range then set the first page back one and the 2nd page is
  256.         // the current page.  If the document is only 1 page long then
  257.         // the 2nd page is empty.
  258.         if (printerData.FromPage == printerData.MaxPage) {
  259.             if (printerData.FromPage > 1) {
  260.                 printerData.FromPage--;
  261.                 printerData.ToPage = printerData.FromPage + 1;
  262.                 Page1->SetPageNumber(printerData.FromPage);
  263.                 Page2->SetPageNumber(printerData.ToPage);
  264.             } else
  265.                 Page2->SetPageNumber(0);
  266.         } else {
  267.             printerData.ToPage = printerData.FromPage + 1;
  268.             Page2->SetPageNumber(printerData.ToPage);
  269.         }
  270.  
  271.         SpeedBarState();
  272.     }
  273. }
  274.  
  275.  
  276. // Don't allow the print preview window to be dragged around.
  277. void PreviewWindow::EvNCLButtonDown(UINT wHitTestCode, TPoint & point)
  278. {
  279.     // If the LButtonDown isn't in the caption then process it normally.
  280.     if (wHitTestCode != HTCAPTION)
  281.         TDecoratedFrame::EvNCLButtonDown(wHitTestCode, point);
  282. }
  283.