- BORLAND/: Borland C++ 4.52 (chosen over 4.5 by byte-match: CODE/RP/CW32.LIB
is identical to 4.52's install lib). BCC32/TLINK32/TLIB/MAKE run natively on
Win11; CODE/BT/OPT.MAK is the shipped BTL4OPT.EXE's exact flag recipe
(extender = Borland PowerPack DPMI32, not Phar Lap TNT).
- restoration/source410/: the literal 1995-form reconstruction of the missing
BT game source (never mixed into CODE/). Round 1-3 state:
* 6 of 10 surviving original TUs COMPILE CLEAN under the period toolchain
(BTMSSN, BTCNSL, BTSCNRL, BTTEAM, BTL4MODE, BTL4ARND) - first builds
since 1996.
* BT_L4/BTL4APP.CPP pilot reconstruction: 12/12 functions, Fail() lands on
its binary-recorded line 400 exactly.
* BT/BTCNSL.HPP: console wire IDs recovered from the binary's ctors
(Killed=9, Damaged=10, ScoreUpdate=13, DeathWithoutHonor=15 [T1];
TeamScore=12 flagged [T4]).
* MUNGA/: 8 engine-header backfills back-dated from the BT412 WinTesla tree
(VDATA numbering decomp-verified; AUDREND's OpenAL-era virtual removed -
the period compiler is the drift detector).
* Tooling: backdate.py (WinTesla->1995 header transform), compile410.sh
(per-TU verification sweep under authentic OPT.MAK flags).
* README: corrected roadmap - MECH.HPP is the capstone grown with the mech
TU reconstructions; BTREG.CPP green = the header-family milestone.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
335 lines
10 KiB
C++
335 lines
10 KiB
C++
##@QUERY_PRJ_NAME [[Project]]
|
|
/* Project [[Project]]
|
|
##@QUERY_PRJ_COMPANY [[CompanyName]] 2
|
|
##@QUERY_PRJ_COPYRIGHT [[Copyright]] 2
|
|
##\\Copyright Copyright 2
|
|
[[CompanyName]]
|
|
[[Copyright]]
|
|
|
|
##@QUERY_TARGET_NAME [[Target]]
|
|
SUBSYSTEM: [[Target]] Application
|
|
FILE: APXPrev.CPP
|
|
##@QUERY_PRJ_USER [[Author]]
|
|
AUTHOR: [[Author]]
|
|
|
|
|
|
OVERVIEW
|
|
========
|
|
Source file for implementation of Print Preview.
|
|
*/
|
|
|
|
|
|
#include <owl\owlpch.h>
|
|
#pragma hdrstop
|
|
|
|
#include "apxprev.h"
|
|
|
|
##<<TApplication QUERY_FILENAME_CPP [[FileName]]
|
|
#include "[[FileName]].rh"
|
|
|
|
|
|
//{{PreviewWindow Implementation}}
|
|
|
|
DEFINE_RESPONSE_TABLE1(PreviewWindow, TDecoratedFrame)
|
|
EV_COMMAND_ENABLE(APX_PPR_PREVIOUS, PPR_PreviousEnable),
|
|
EV_COMMAND_ENABLE(APX_PPR_NEXT, PPR_NextEnable),
|
|
EV_COMMAND(APX_PPR_PREVIOUS, PPR_Previous),
|
|
EV_COMMAND(APX_PPR_NEXT, PPR_Next),
|
|
EV_COMMAND(APX_PPR_ONEUP, PPR_OneUp),
|
|
EV_COMMAND_ENABLE(APX_PPR_TWOUP, PPR_TwoUpEnable),
|
|
EV_COMMAND(APX_PPR_TWOUP, PPR_TwoUp),
|
|
EV_COMMAND(APX_PPR_DONE, PPR_Done),
|
|
##@QUERY_APPL_MODEL == VALUE_MDI 2
|
|
EV_COMMAND(CM_FILEPRINT, CmPrint),
|
|
EV_COMMAND_ENABLE(CM_FILEPRINT, CmPrintEnable),
|
|
//{{PreviewWindowRSP_TBL_BEGIN}}
|
|
//{{PreviewWindowRSP_TBL_END}}
|
|
END_RESPONSE_TABLE;
|
|
|
|
|
|
PreviewWindow::PreviewWindow (TWindow *parentWindow, TPrinter *printer, TWindow* currWindow, const char far* title, TLayoutWindow* client) :
|
|
TDecoratedFrame(parentWindow, title, client)
|
|
{
|
|
CurrWindow = currWindow;
|
|
Printer = printer;
|
|
Client = client;
|
|
Page1 = 0;
|
|
Page2 = 0;
|
|
|
|
TPrintDialog::TData& data = Printer->GetSetup();
|
|
PrnDC = new TPrintDC(data.GetDriverName(),
|
|
data.GetDeviceName(),
|
|
data.GetOutputName(),
|
|
data.GetDevMode());
|
|
|
|
PrintExtent = new TSize(PrnDC->GetDeviceCaps(HORZRES), PrnDC->GetDeviceCaps(VERTRES));
|
|
Printout = new APXPrintOut(Printer, "Print Preview", currWindow, true);
|
|
|
|
SetBkgndColor(::GetSysColor(COLOR_APPWORKSPACE));
|
|
|
|
##--BEGIN-- @QUERY_APPL_COMMENT == VALUE_VERBOSE
|
|
//
|
|
// Create default toolbar New and associate toolbar buttons with commands.
|
|
//
|
|
##--END-- @QUERY_APPL_COMMENT == VALUE_VERBOSE
|
|
PreviewSpeedBar = new TControlBar(this);
|
|
PreviewSpeedBar->Insert(*new TButtonGadget(APX_PPR_PREVIOUS, APX_PPR_PREVIOUS, TButtonGadget::Command, true));
|
|
PreviewSpeedBar->Insert(*new TButtonGadget(APX_PPR_NEXT, APX_PPR_NEXT, TButtonGadget::Command, true));
|
|
PreviewSpeedBar->Insert(*new TSeparatorGadget(6));
|
|
PreviewSpeedBar->Insert(*new TButtonGadget(APX_PPR_ONEUP, APX_PPR_ONEUP, TButtonGadget::Exclusive, true, TButtonGadget::Down));
|
|
PreviewSpeedBar->Insert(*new TButtonGadget(APX_PPR_TWOUP, APX_PPR_TWOUP, TButtonGadget::Exclusive, true));
|
|
PreviewSpeedBar->Insert(*new TSeparatorGadget(12));
|
|
PreviewSpeedBar->Insert(*new TTextGadget(APX_PPR_CURRPAGE, TGadget::Recessed, TTextGadget::Left, 10, "Page 1"));
|
|
PreviewSpeedBar->Insert(*new TSeparatorGadget(20));
|
|
PreviewSpeedBar->Insert(*new TButtonGadget(CM_FILEPRINT, CM_FILEPRINT, TButtonGadget::Command, true));
|
|
PreviewSpeedBar->Insert(*new TSeparatorGadget(20));
|
|
PreviewSpeedBar->Insert(*new TButtonGadget(APX_PPR_DONE, APX_PPR_DONE, TButtonGadget::Command, true));
|
|
Insert(*PreviewSpeedBar, TDecoratedFrame::Top);
|
|
|
|
##:@QUERY_APPL_COMMENT == VALUE_VERBOSE
|
|
// We want a window that cannot be sized, maximized, or minimized.
|
|
Attr.Style = (WS_VISIBLE | WS_POPUP);
|
|
|
|
##:@QUERY_APPL_COMMENT == VALUE_VERBOSE
|
|
// Don't show the border of the preview window.
|
|
Attr.X = 0;
|
|
Attr.Y = -1;
|
|
Attr.W = Parent->GetClientRect().Width();
|
|
Attr.H = Parent->GetClientRect().Height() + 1;
|
|
parentWindow->MapWindowPoints(HWindow, (TPoint *)&(Attr.X), 1);
|
|
}
|
|
|
|
|
|
PreviewWindow::~PreviewWindow ()
|
|
{
|
|
delete Page1;
|
|
Page1 = 0;
|
|
delete Page2;
|
|
Page2 = 0;
|
|
|
|
delete PrnDC;
|
|
PrnDC = 0;
|
|
delete PrintExtent;
|
|
PrintExtent = 0;
|
|
delete Printout;
|
|
Printout = 0;
|
|
}
|
|
|
|
|
|
void PreviewWindow::SetupWindow ()
|
|
{
|
|
TDecoratedFrame::SetupWindow();
|
|
|
|
TPrintDialog::TData& data = Printer->GetSetup();
|
|
Page1 = new TPreviewPage(Client, *Printout, *PrnDC, *PrintExtent, 1);
|
|
Page1->SetPageNumber(1);
|
|
data.FromPage = 1;
|
|
data.ToPage = 1;
|
|
data.MinPage = 1;
|
|
data.MaxPage = 1;
|
|
|
|
Page2 = 0;
|
|
|
|
TLayoutMetrics metrics1;
|
|
|
|
metrics1.X.Set(lmLeft, lmRightOf, lmParent, lmLeft, 15);
|
|
metrics1.Y.Set(lmTop, lmBelow, lmParent, lmTop, 15);
|
|
|
|
##--BEGIN-- @QUERY_APPL_COMMENT == VALUE_VERBOSE
|
|
//
|
|
// Determine major axis of preview page, have that follow parent size.
|
|
// Make minor axis a percentage (aspect ratio) of the page's major axis
|
|
//
|
|
##--END-- @QUERY_APPL_COMMENT == VALUE_VERBOSE
|
|
TRect r = Client->GetClientRect();
|
|
long ratio;
|
|
|
|
if (PrintExtent->cx > PrintExtent->cy)
|
|
ratio = ((long)PrintExtent->cy * 100) / PrintExtent->cx;
|
|
else
|
|
ratio = ((long)PrintExtent->cx * 100) / PrintExtent->cy;
|
|
|
|
bool xMajor = (((r.Width() * ratio) / 100) > r.Height());
|
|
if (xMajor){
|
|
metrics1.Height.Set(lmBottom, lmAbove, lmParent, lmBottom, 15);
|
|
metrics1.Width.PercentOf(Page1, (int)((long)PrintExtent->cx * 95 / PrintExtent->cy), lmHeight);
|
|
} else {
|
|
metrics1.Height.PercentOf(Page1, (int)((long)PrintExtent->cy * 95 / PrintExtent->cx), lmWidth);
|
|
metrics1.Width.Set(lmRight, lmLeftOf, lmParent, lmRight, 15);
|
|
}
|
|
|
|
Page1->Create();
|
|
|
|
Client->SetChildLayoutMetrics(*Page1, metrics1);
|
|
Client->Layout();
|
|
}
|
|
|
|
|
|
void PreviewWindow::SpeedBarState ()
|
|
{
|
|
TPrintDialog::TData &printerData = Printer->GetSetup();
|
|
|
|
##:@QUERY_APPL_COMMENT == VALUE_VERBOSE
|
|
// Update the page count.
|
|
TTextGadget *theTGadget = TYPESAFE_DOWNCAST(PreviewSpeedBar->GadgetWithId(APX_PPR_CURRPAGE), TTextGadget);
|
|
if (theTGadget) {
|
|
char buffer[32];
|
|
if (Page2 && (printerData.FromPage != printerData.ToPage))
|
|
wsprintf(buffer, "Page %d - %d", printerData.FromPage, printerData.ToPage);
|
|
else
|
|
wsprintf(buffer, "Page %d", printerData.FromPage);
|
|
theTGadget->SetText(buffer);
|
|
}
|
|
}
|
|
|
|
|
|
void PreviewWindow::PPR_PreviousEnable (TCommandEnabler &tce)
|
|
{
|
|
##:@QUERY_APPL_COMMENT == VALUE_VERBOSE
|
|
// Only have previous on if we're not at the first page.
|
|
TPrintDialog::TData &printerData = Printer->GetSetup();
|
|
tce.Enable(printerData.FromPage != 1);
|
|
}
|
|
|
|
|
|
void PreviewWindow::PPR_NextEnable (TCommandEnabler &tce)
|
|
{
|
|
##:@QUERY_APPL_COMMENT == VALUE_VERBOSE
|
|
// Only have next on if we're not at the last page.
|
|
TPrintDialog::TData &printerData = Printer->GetSetup();
|
|
tce.Enable(printerData.ToPage != printerData.MaxPage);
|
|
}
|
|
|
|
|
|
void PreviewWindow::PPR_Previous ()
|
|
{
|
|
TPrintDialog::TData &printerData = Printer->GetSetup();
|
|
|
|
if (printerData.FromPage > printerData.MinPage) {
|
|
printerData.FromPage--;
|
|
printerData.ToPage--;
|
|
|
|
Page1->SetPageNumber(printerData.FromPage);
|
|
if (Page2)
|
|
Page2->SetPageNumber(printerData.ToPage);
|
|
}
|
|
|
|
SpeedBarState();
|
|
}
|
|
|
|
|
|
void PreviewWindow::PPR_Next ()
|
|
{
|
|
TPrintDialog::TData &printerData = Printer->GetSetup();
|
|
|
|
if (printerData.ToPage < printerData.MaxPage) {
|
|
printerData.FromPage++;
|
|
printerData.ToPage++;
|
|
|
|
Page1->SetPageNumber(printerData.FromPage);
|
|
if (Page2)
|
|
Page2->SetPageNumber(printerData.ToPage);
|
|
}
|
|
|
|
SpeedBarState();
|
|
}
|
|
|
|
|
|
void PreviewWindow::PPR_OneUp ()
|
|
{
|
|
if (Page2) {
|
|
Client->RemoveChildLayoutMetrics(*Page2);
|
|
|
|
delete Page2;
|
|
Page2 = 0;
|
|
|
|
Client->Layout();
|
|
|
|
TPrintDialog::TData &printerData = Printer->GetSetup();
|
|
printerData.ToPage = printerData.FromPage;
|
|
|
|
SpeedBarState();
|
|
}
|
|
}
|
|
|
|
|
|
void PreviewWindow::PPR_TwoUpEnable (TCommandEnabler &tce)
|
|
{
|
|
##:@QUERY_APPL_COMMENT == VALUE_VERBOSE
|
|
// Two up is only available for portrait mode.
|
|
tce.Enable(PrintExtent->cx <= PrintExtent->cy);
|
|
}
|
|
|
|
|
|
void PreviewWindow::PPR_TwoUp ()
|
|
{
|
|
if (Page2 == 0) {
|
|
Page2 = new TPreviewPage(Client, *Printout, *PrnDC, *PrintExtent, PageNumber + 1);
|
|
Page2->Create();
|
|
|
|
TLayoutMetrics metrics2;
|
|
|
|
metrics2.X.Set(lmLeft, lmRightOf, Page1, lmRight, 30);
|
|
metrics2.Y.SameAs(Page1, lmTop);
|
|
|
|
##:@QUERY_APPL_COMMENT == VALUE_VERBOSE 2
|
|
// Assume portrait
|
|
//
|
|
metrics2.Width.SameAs(Page1, lmWidth);
|
|
metrics2.Height.SameAs(Page1, lmBottom);
|
|
|
|
Client->SetChildLayoutMetrics(*Page2, metrics2);
|
|
Client->Layout();
|
|
|
|
TPrintDialog::TData &printerData = Printer->GetSetup();
|
|
|
|
##--BEGIN-- @QUERY_APPL_COMMENT == VALUE_VERBOSE
|
|
// Page 2 is the next page. If the next page is outside of our
|
|
// range then set the first page back one and the 2nd page is
|
|
// the current page. If the document is only 1 page long then
|
|
// the 2nd page is empty.
|
|
##--END-- @QUERY_APPL_COMMENT == VALUE_VERBOSE
|
|
if (printerData.FromPage == printerData.MaxPage) {
|
|
if (printerData.FromPage > 1) {
|
|
printerData.FromPage--;
|
|
printerData.ToPage = printerData.FromPage + 1;
|
|
Page1->SetPageNumber(printerData.FromPage);
|
|
Page2->SetPageNumber(printerData.ToPage);
|
|
} else
|
|
Page2->SetPageNumber(0);
|
|
} else {
|
|
printerData.ToPage = printerData.FromPage + 1;
|
|
Page2->SetPageNumber(printerData.ToPage);
|
|
}
|
|
|
|
SpeedBarState();
|
|
}
|
|
}
|
|
|
|
|
|
void PreviewWindow::PPR_Done ()
|
|
{
|
|
##:@QUERY_APPL_COMMENT == VALUE_VERBOSE
|
|
// Don't call the base class EvClose we do not want PreviewWindow to be destructed.
|
|
##@QUERY_APPL_MODEL == VALUE_SDI
|
|
GetApplication()->GetMainWindow()->SetRedraw(false);
|
|
GetApplication()->EndModal(IDCANCEL);
|
|
}
|
|
##--BEGIN-- @QUERY_APPL_MODEL == VALUE_MDI
|
|
|
|
|
|
void PreviewWindow::CmPrint ()
|
|
{
|
|
TWindow *client = GetApplication()->GetMainWindow()->GetClientWindow();
|
|
|
|
if (client)
|
|
client->SendMessage(WM_COMMAND, CM_FILEPRINT, 0);
|
|
}
|
|
|
|
|
|
void PreviewWindow::CmPrintEnable (TCommandEnabler &tce)
|
|
{
|
|
tce.Enable(true);
|
|
}
|
|
##--END-- @QUERY_APPL_MODEL == VALUE_MDI
|