#include <owl\owlpch.h>
#pragma hdrstop
#include "apxprev.h"
#include "plntsapp.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),
//{{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));
//
// Create default toolbar New and associate toolbar buttons with commands.
//
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);
// We want a window that cannot be sized, maximized, or minimized.
Attr.Style = (WS_VISIBLE | WS_POPUP);
// 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);
//
// Determine major axis of preview page, have that follow parent size.
// Make minor axis a percentage (aspect ratio) of the page's major axis
//
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();
// 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)
{
// 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)
{
// 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)
{
// 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);
// Assume portrait
//
metrics2.Width.SameAs(Page1, lmWidth);
metrics2.Height.SameAs(Page1, lmBottom);
Client->SetChildLayoutMetrics(*Page2, metrics2);
Client->Layout();
TPrintDialog::TData &printerData = Printer->GetSetup();
// 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.
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 ()
{
// Don't call the base class EvClose we do not want PreviewWindow to be destructed.
GetApplication()->GetMainWindow()->SetRedraw(false);
GetApplication()->EndModal(IDCANCEL);
}
------------------------------------------------------------------
/* Project planets
Copyright ゥ 1995. All Rights Reserved.
SUBSYSTEM: planets.exe Application
FILE: plntsapp.cpp
AUTHOR:
OVERVIEW
========
Source file for implementation of planetsApp (TApplication).
*/
#include <owl\owlpch.h>
#pragma hdrstop
#include <dir.h>
#include "plntsapp.h"
#include "plntsedv.h" // Definition of client class.
#include "plntsabd.h" // Definition of about dialog.
// Drag / Drop support:
TFileDrop::TFileDrop (char* fileName, TPoint& p, bool inClient, TModule*)
{
char exePath[MAXPATH];
exePath[0] = 0;
FileName = strcpy(new char[strlen(fileName) + 1], fileName);
Point = p;
InClientArea = inClient;
}
TFileDrop::~TFileDrop ()
{
delete FileName;
}
const char *TFileDrop::WhoAmI ()
{
return FileName;
}
//{{planetsApp Implementation}}
//{{DOC_VIEW}}
DEFINE_DOC_TEMPLATE_CLASS(TFileDocument, planetsEditView, DocType1);
//{{DOC_VIEW_END}}
//{{DOC_MANAGER}}
DocType1 __dvt1("All Files (*.*)", "*.*", 0, "TXT", dtAutoDelete | dtUpdateDir);
//{{DOC_MANAGER_END}}
//
// Build a response table for all messages/commands handled
// by the application.
//
DEFINE_RESPONSE_TABLE1(planetsApp, TApplication)
//{{planetsAppRSP_TBL_BEGIN}}
EV_OWLVIEW(dnCreate, EvNewView),
EV_OWLVIEW(dnClose, EvCloseView),
EV_COMMAND(CM_HELPABOUT, CmHelpAbout),
EV_COMMAND(CM_FILEPRINT, CmFilePrint),
EV_COMMAND(CM_FILEPRINTERSETUP, CmFilePrintSetup),
EV_COMMAND(CM_FILEPRINTPREVIEW, CmFilePrintPreview),
EV_COMMAND_ENABLE(CM_FILEPRINT, CmPrintEnable),
EV_COMMAND_ENABLE(CM_FILEPRINTERSETUP, CmPrintEnable),
EV_COMMAND_ENABLE(CM_FILEPRINTPREVIEW, CmPrintEnable),
EV_WM_DROPFILES,
EV_WM_WININICHANGE,
//{{planetsAppRSP_TBL_END}}
END_RESPONSE_TABLE;
//////////////////////////////////////////////////////////
// planetsApp
// =====
//
planetsApp::planetsApp () : TApplication("planets")
{
Printer = 0;
Printing = 0;
SetDocManager(new TDocManager(dmSDI, this));
// INSERT>> Your constructor code here.
}
planetsApp::~planetsApp ()
{
if (Printer)
delete Printer;
// INSERT>> Your destructor code here.
}
void planetsApp::CreateGadgets (TControlBar *cb, bool server)
{
if (!server) {
cb->Insert(*new TButtonGadget(CM_FILENEW, CM_FILENEW));
cb->Insert(*new TButtonGadget(CM_FILEOPEN, CM_FILEOPEN));
cb->Insert(*new TButtonGadget(CM_FILESAVE, CM_FILESAVE));
cb->Insert(*new TSeparatorGadget(6));
}
cb->Insert(*new TButtonGadget(CM_EDITCUT, CM_EDITCUT));
cb->Insert(*new TButtonGadget(CM_EDITCOPY, CM_EDITCOPY));
cb->Insert(*new TButtonGadget(CM_EDITPASTE, CM_EDITPASTE));
cb->Insert(*new TSeparatorGadget(6));
cb->Insert(*new TButtonGadget(CM_EDITUNDO, CM_EDITUNDO));
cb->Insert(*new TSeparatorGadget(6));
cb->Insert(*new TButtonGadget(CM_EDITFIND, CM_EDITFIND));
cb->Insert(*new TButtonGadget(CM_EDITFINDNEXT, CM_EDITFINDNEXT));
if (!server) {
cb->Insert(*new TSeparatorGadget(6));
cb->Insert(*new TButtonGadget(CM_FILEPRINT, CM_FILEPRINT));
cb->Insert(*new TButtonGadget(CM_FILEPRINTPREVIEW, CM_FILEPRINTPREVIEW));
}
// Add fly-over help hints.
cb->SetHintMode(TGadgetWindow::EnterHints);
}
void planetsApp::SetupSpeedBar (TDecoratedFrame *frame)
{
//
// Create default toolbar New and associate toolbar buttons with commands.
//
TControlBar* cb = new TControlBar(frame);
CreateGadgets(cb);
// Setup the toolbar ID used by OLE 2 for toolbar negotiation.
cb->Attr.Id = IDW_TOOLBAR;
frame->Insert(*cb, TDecoratedFrame::Top);
}
//////////////////////////////////////////////////////////
// planetsApp
// =====
// Application intialization.
//
void planetsApp::InitMainWindow ()
{
if (nCmdShow != SW_HIDE)
nCmdShow = (nCmdShow != SW_SHOWMINNOACTIVE) ? SW_SHOWNORMAL : nCmdShow;
SDIDecFrame *frame = new SDIDecFrame(0, GetName(), 0, true, this);
//
// Assign ICON w/ this application.
//
frame->SetIcon(this, IDI_SDIAPPLICATION);
//
// Menu associated with window and accelerator table associated with table.
//
frame->AssignMenu(SDI_MENU);
//
// Associate with the accelerator table.
//
frame->Attr.AccelTable = SDI_MENU;
SetupSpeedBar(frame);
TStatusBar *sb = new TStatusBar(frame, TGadget::Recessed,
TStatusBar::CapsLock |
TStatusBar::NumLock |
TStatusBar::ScrollLock |
TStatusBar::Overtype);
frame->Insert(*sb, TDecoratedFrame::Bottom);
SetMainWindow(frame);
frame->SetMenuDescr(TMenuDescr(SDI_MENU));
}
//////////////////////////////////////////////////////////
// planetsApp
// =====
// Response Table handlers:
//
void planetsApp::EvNewView (TView& view)
{
GetMainWindow()->SetClientWindow(view.GetWindow());
if (!view.IsOK())
GetMainWindow()->SetClientWindow(0);
else if (view.GetViewMenu())
GetMainWindow()->MergeMenu(*view.GetViewMenu());
}
void planetsApp::EvCloseView (TView&)
{
GetMainWindow()->SetClientWindow(0);
GetMainWindow()->SetCaption("planets");
}
//{{SDIDecFrame Implementation}}
SDIDecFrame::SDIDecFrame (TWindow *parent, const char far *title, TWindow *clientWnd, bool trackMenuSelection, TModule *module)
: TDecoratedFrame(parent, title, clientWnd, trackMenuSelection, module)
{
// INSERT>> Your constructor code here.
}
SDIDecFrame::~SDIDecFrame ()
{
// INSERT>> Your destructor code here.
}
//////////////////////////////////////////////////////////
// planetsApp
// ==========
// Menu File Print command
void planetsApp::CmFilePrint ()
{
//
// Create Printer object if not already created.
//
if (!Printer)
Printer = new TPrinter(this);
//
// Create Printout window and set characteristics.
//
APXPrintOut printout(Printer, "Title", GetMainWindow()->GetClientWindow());
printout.SetBanding(true);
Printing++;
//
// Bring up the Print dialog and print the document.
//
Printer->Print(GetWindowPtr(GetActiveWindow()), printout, true);
Printing--;
}
//////////////////////////////////////////////////////////
// planetsApp
// ==========
// Menu File Print Setup command
void planetsApp::CmFilePrintSetup ()
{
if (!Printer)
Printer = new TPrinter(this);
//
// Bring up the Print Setup dialog.
//
Printer->Setup(GetMainWindow());
}
//////////////////////////////////////////////////////////
// planetsApp
// ==========
// Menu File Print Preview command
void planetsApp::CmFilePrintPreview ()
{
SDIDecFrame *sdiFrame = TYPESAFE_DOWNCAST(GetMainWindow(), SDIDecFrame);
if (sdiFrame) {
if (!Printer)
Printer = new TPrinter(this);
Printing++;
PreviewWindow *prevW = new PreviewWindow(sdiFrame, Printer, sdiFrame->GetClientWindow(), "Print Preview", new TLayoutWindow(0));
prevW->Create();
BeginModal(GetMainWindow());
Printing--;
// Now that printing is off we can invalidate because the edit window to repaint.
GetMainWindow()->SetRedraw(true);
GetMainWindow()->Invalidate();
// We must destroy the preview window explicitly. Otherwise, the window will not be destroyed until
// it's parent the MainWindow is destroyed.
prevW->Destroy();
delete prevW;
}
}
//////////////////////////////////////////////////////////
// planetsApp
// ==========
// Menu enabler used by Print, Print Setup and Print Preview.
void planetsApp::CmPrintEnable (TCommandEnabler &tce)
{
// If we have a Printer already created just test if all is okay.
// Otherwise create a Printer object and make sure the printer
// really exists and then delete the Printer object.
if (!Printer) {
Printer = new TPrinter(this);
tce.Enable(Printer->GetSetup().Error == 0);
} else
tce.Enable(Printer->GetSetup().Error == 0);
}
//////////////////////////////////////////////////////////
// planetsApp
// ===========
// Menu Help About planets.exe command
void planetsApp::CmHelpAbout ()
{
//
// Show the modal dialog.
//
planetsAboutDlg(GetMainWindow()).Execute();
}
void planetsApp::InitInstance ()
{
TApplication::InitInstance();
// Accept files via drag/drop in the frame window.
GetMainWindow()->DragAcceptFiles(true);
}
void planetsApp::EvDropFiles (TDropInfo drop)
{
// Tell DragQueryFile the file interested in (0) and the length of your buffer.
int fileLength = drop.DragQueryFileNameLen(0) + 1;
char *fileName = new char[fileLength];
drop.DragQueryFile(0, fileName, fileLength);
// Open the file that was dropped.
AddFile(fileName);
// Release the memory allocated for this handle with DragFinish.
drop.DragFinish();
}
void planetsApp::AddFile (const char *FileName)
{
TDocTemplate* tpl = GetDocManager()->MatchTemplate(FileName);
if (tpl)
tpl->CreateDoc(FileName);
}
void planetsApp::EvWinIniChange (char far* section)
{
if (strcmp(section, "windows") == 0) {
// If the device changed in the WIN.INI file then the printer
// might have changed. If we have a TPrinter (Printer) then
// check and make sure it's identical to the current device
// entry in WIN.INI.
if (Printer) {
char printDBuffer[255];
LPSTR printDevice = printDBuffer;
LPSTR devName;
LPSTR driverName = 0;
LPSTR outputName = 0;
if (::GetProfileString("windows", "device", "", printDevice, sizeof(printDevice))) {
// The string which should come back is something like:
//
// HP LaserJet III,hppcl5a,LPT1:
//
// Where the format is:
//
// devName,driverName,outputName
//
devName = printDevice;
while (*printDevice) {
if (*printDevice == ',') {
*printDevice++ = 0;
if (!driverName)
driverName = printDevice;
else
outputName = printDevice;
} else
printDevice = ::AnsiNext(printDevice);
}
if ((Printer->GetSetup().Error != 0) ||
(strcmp(devName, Printer->GetSetup().GetDeviceName()) != 0) ||
(strcmp(driverName, Printer->GetSetup().GetDriverName()) != 0) ||
(strcmp(outputName, Printer->GetSetup().GetOutputName()) != 0)) {
// New printer installed so get the new printer device now.
delete Printer;
Printer = new TPrinter(this);
}
} else {
// No printer installed (GetProfileString failed).
delete Printer;
Printer = new TPrinter(this);
}
}
}
}
int OwlMain (int , char* [])
{
try {
planetsApp app;
return app.Run();
}
catch (xmsg& x) {
::MessageBox(0, x.why().c_str(), "Exception", MB_OK);
}
return -1;
}