eba1d9c405
* OPT: Cache the welcome Gambas SVG logo in an image for faster redrawing. * NEW: Start defining new control hidden properties in all components: _IsControl, _Group, _Family, _IsVirtual, _IsContainer, _IsMultiContainer. [EXAMPLES] * NEW: Use new Paint methods in the Painting example. [INTERPRETER] * BUG: Instr() and RInstr() correctly handle non-ASCII characters. [GB.DRAW] * NEW: Support for Paint.RichText and Paint.RichTextExtents. [GB.GTK] * BUG: Rich text relative font sizes are now correctly handled. * NEW: Implement Paint.RichText and Paint.RichTextExtents. [GB.QT4] * NEW: Implement Paint.RichText and Paint.RichTextExtents. git-svn-id: svn://localhost/gambas/trunk@2698 867c0c6c-44f3-4631-809d-bfa615b0a4ec
333 lines
7.3 KiB
C++
333 lines
7.3 KiB
C++
/***************************************************************************
|
|
|
|
cprinter.cpp
|
|
|
|
(c) 2004-2006 - Daniel Campos Fernández <dcamposf@gmail.com>
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2, or (at your option)
|
|
any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
***************************************************************************/
|
|
|
|
#define __CPRINTER_CPP
|
|
|
|
#include "main.h"
|
|
#include "gambas.h"
|
|
#include "widgets.h"
|
|
#include "cpaint_impl.h"
|
|
#include "gb.form.print.h"
|
|
#include "cprinter.h"
|
|
|
|
DECLARE_EVENT(EVENT_Begin);
|
|
DECLARE_EVENT(EVENT_End);
|
|
DECLARE_EVENT(EVENT_Paginate);
|
|
DECLARE_EVENT(EVENT_Draw);
|
|
|
|
static void cb_begin(gPrinter *printer)
|
|
{
|
|
void *_object = printer->tag;
|
|
THIS->current = 0;
|
|
GB.Raise(THIS, EVENT_Begin, 0);
|
|
}
|
|
|
|
static void cb_end(gPrinter *printer)
|
|
{
|
|
void *_object = printer->tag;
|
|
THIS->current = 0;
|
|
GB.Raise(THIS, EVENT_End, 0);
|
|
}
|
|
|
|
static void cb_paginate(gPrinter *printer)
|
|
{
|
|
void *_object = printer->tag;
|
|
|
|
if (GB.CanRaise(THIS, EVENT_Paginate))
|
|
GB.Raise(THIS, EVENT_Paginate, 0);
|
|
else
|
|
printer->setPageCount(printer->pageCount());
|
|
}
|
|
|
|
static void cb_draw(gPrinter *printer, GtkPrintContext *context, int page)
|
|
{
|
|
void *_object = printer->tag;
|
|
THIS->current = page + 1;
|
|
THIS->context = context;
|
|
PAINT_begin(THIS);
|
|
GB.Raise(THIS, EVENT_Draw, 0);
|
|
PAINT_end();
|
|
}
|
|
|
|
BEGIN_METHOD_VOID(Printer_new)
|
|
|
|
THIS->printer = new gPrinter();
|
|
PRINTER->tag = THIS;
|
|
PRINTER->onBegin = cb_begin;
|
|
PRINTER->onEnd = cb_end;
|
|
PRINTER->onDraw = cb_draw;
|
|
PRINTER->onPaginate = cb_paginate;
|
|
|
|
END_METHOD
|
|
|
|
BEGIN_METHOD_VOID(Printer_free)
|
|
|
|
delete THIS->printer;
|
|
|
|
END_METHOD
|
|
|
|
BEGIN_METHOD_VOID(Printer_Configure)
|
|
|
|
GB.ReturnBoolean(PRINTER->configure());
|
|
|
|
END_METHOD
|
|
|
|
BEGIN_METHOD_VOID(Printer_Print)
|
|
|
|
GB.ReturnBoolean(PRINTER->print());
|
|
|
|
END_METHOD
|
|
|
|
BEGIN_METHOD_VOID(Printer_Cancel)
|
|
|
|
PRINTER->cancel();
|
|
|
|
END_METHOD
|
|
|
|
BEGIN_PROPERTY(Printer_Count)
|
|
|
|
if (READ_PROPERTY)
|
|
GB.ReturnInteger(PRINTER->pageCount());
|
|
else
|
|
PRINTER->setPageCount(VPROP(GB_INTEGER));
|
|
|
|
END_PROPERTY
|
|
|
|
BEGIN_PROPERTY(Printer_Current)
|
|
|
|
GB.ReturnInteger(THIS->current);
|
|
|
|
END_PROPERTY
|
|
|
|
BEGIN_PROPERTY(Printer_Name)
|
|
|
|
if (READ_PROPERTY)
|
|
GB.ReturnNewZeroString(PRINTER->name());
|
|
else
|
|
PRINTER->setName(GB.ToZeroString(PROP(GB_STRING)));
|
|
|
|
END_PROPERTY
|
|
|
|
BEGIN_PROPERTY(Printer_Orientation)
|
|
|
|
if (READ_PROPERTY)
|
|
GB.ReturnInteger(PRINTER->orientation());
|
|
else
|
|
PRINTER->setOrientation(VPROP(GB_INTEGER));
|
|
|
|
END_PROPERTY
|
|
|
|
BEGIN_PROPERTY(Printer_Paper)
|
|
|
|
if (READ_PROPERTY)
|
|
GB.ReturnInteger(PRINTER->paperModel());
|
|
else
|
|
PRINTER->setPaperModel(VPROP(GB_INTEGER));
|
|
|
|
END_PROPERTY
|
|
|
|
BEGIN_PROPERTY(Printer_PaperWidth)
|
|
|
|
double w, h;
|
|
|
|
PRINTER->getPaperSize(&w, &h);
|
|
|
|
if (READ_PROPERTY)
|
|
GB.ReturnFloat(w);
|
|
else
|
|
PRINTER->setPaperSize(VPROP(GB_FLOAT), h);
|
|
|
|
END_PROPERTY
|
|
|
|
BEGIN_PROPERTY(Printer_PaperHeight)
|
|
|
|
double w, h;
|
|
|
|
PRINTER->getPaperSize(&w, &h);
|
|
|
|
if (READ_PROPERTY)
|
|
GB.ReturnFloat(h);
|
|
else
|
|
PRINTER->setPaperSize(w, VPROP(GB_FLOAT));
|
|
|
|
END_PROPERTY
|
|
|
|
BEGIN_PROPERTY(Printer_CollateCopies)
|
|
|
|
if (READ_PROPERTY)
|
|
GB.ReturnBoolean(PRINTER->collateCopies());
|
|
else
|
|
PRINTER->setCollateCopies(VPROP(GB_BOOLEAN));
|
|
|
|
END_PROPERTY
|
|
|
|
BEGIN_PROPERTY(Printer_ReverseOrder)
|
|
|
|
if (READ_PROPERTY)
|
|
GB.ReturnBoolean(PRINTER->reverserOrder());
|
|
else
|
|
PRINTER->setReverseOrder(VPROP(GB_BOOLEAN));
|
|
|
|
END_PROPERTY
|
|
|
|
BEGIN_PROPERTY(Printer_Duplex)
|
|
|
|
if (READ_PROPERTY)
|
|
GB.ReturnInteger(PRINTER->duplex());
|
|
else
|
|
PRINTER->setDuplex(VPROP(GB_INTEGER));
|
|
|
|
END_PROPERTY
|
|
|
|
BEGIN_PROPERTY(Printer_GrayScale)
|
|
|
|
if (READ_PROPERTY)
|
|
GB.ReturnBoolean(!PRINTER->useColor());
|
|
else
|
|
PRINTER->setUseColor(!VPROP(GB_BOOLEAN));
|
|
|
|
END_PROPERTY
|
|
|
|
BEGIN_PROPERTY(Printer_NumCopies)
|
|
|
|
if (READ_PROPERTY)
|
|
GB.ReturnInteger(PRINTER->numCopies());
|
|
else
|
|
PRINTER->setNumCopies(VPROP(GB_INTEGER));
|
|
|
|
END_PROPERTY
|
|
|
|
BEGIN_PROPERTY(Printer_Resolution)
|
|
|
|
if (READ_PROPERTY)
|
|
GB.ReturnInteger(PRINTER->resolution());
|
|
else
|
|
PRINTER->setResolution(VPROP(GB_INTEGER));
|
|
|
|
END_PROPERTY
|
|
|
|
BEGIN_PROPERTY(Printer_FirstPage)
|
|
|
|
int from, to;
|
|
|
|
PRINTER->getPrintPages(&from, &to);
|
|
|
|
if (READ_PROPERTY)
|
|
GB.ReturnInteger(from + 1);
|
|
else
|
|
PRINTER->setPrintPages(VPROP(GB_INTEGER) - 1, to);
|
|
|
|
END_PROPERTY
|
|
|
|
BEGIN_PROPERTY(Printer_LastPage)
|
|
|
|
int from, to;
|
|
|
|
PRINTER->getPrintPages(&from, &to);
|
|
|
|
if (READ_PROPERTY)
|
|
GB.ReturnInteger(to + 1);
|
|
else
|
|
PRINTER->setPrintPages(from, VPROP(GB_INTEGER) - 1);
|
|
|
|
END_PROPERTY
|
|
|
|
BEGIN_PROPERTY(Printer_FullPage)
|
|
|
|
if (READ_PROPERTY)
|
|
GB.ReturnBoolean(PRINTER->useFullPage());
|
|
else
|
|
PRINTER->setUseFullPage(VPROP(GB_BOOLEAN));
|
|
|
|
END_PROPERTY
|
|
|
|
BEGIN_PROPERTY(Printer_OutputFile)
|
|
|
|
if (READ_PROPERTY)
|
|
GB.ReturnNewZeroString(PRINTER->outputFileName());
|
|
else
|
|
PRINTER->setOutputFileName(GB.FileName(PSTRING(), PLENGTH()));
|
|
|
|
END_PROPERTY
|
|
|
|
|
|
GB_DESC PrinterDesc[] =
|
|
{
|
|
GB_DECLARE("Printer", sizeof(CPRINTER)),
|
|
|
|
GB_CONSTANT("Portrait", "i", GB_PRINT_PORTRAIT),
|
|
GB_CONSTANT("Landscape", "i", GB_PRINT_LANDSCAPE),
|
|
//GB_CONSTANT("ReversePortrait", "i", GB_PRINT_REVERSE_PORTRAIT),
|
|
//GB_CONSTANT("ReverseLandscape", "i", GB_PRINT_REVERSE_LANDSCAPE),
|
|
|
|
GB_CONSTANT("Custom", "i", GB_PRINT_CUSTOM),
|
|
GB_CONSTANT("A3", "i", GB_PRINT_A3),
|
|
GB_CONSTANT("A4", "i", GB_PRINT_A4),
|
|
GB_CONSTANT("A5", "i", GB_PRINT_A5),
|
|
GB_CONSTANT("B5", "i", GB_PRINT_B5),
|
|
GB_CONSTANT("Letter", "i", GB_PRINT_LETTER),
|
|
GB_CONSTANT("Executive", "i", GB_PRINT_EXECUTIVE),
|
|
GB_CONSTANT("Legal", "i", GB_PRINT_LEGAL),
|
|
|
|
GB_CONSTANT("Simplex", "i", GB_PRINT_SIMPLEX),
|
|
GB_CONSTANT("Horizontal", "i", GB_PRINT_DUPLEX_HORIZONTAL),
|
|
GB_CONSTANT("Vertical", "i", GB_PRINT_DUPLEX_VERTICAL),
|
|
|
|
GB_METHOD("_new", NULL, Printer_new, NULL),
|
|
GB_METHOD("_free", NULL, Printer_free, NULL),
|
|
|
|
GB_METHOD("Configure", "b", Printer_Configure, NULL),
|
|
GB_METHOD("Print", "b", Printer_Print, NULL),
|
|
GB_METHOD("Cancel", NULL, Printer_Cancel, NULL),
|
|
|
|
GB_PROPERTY("Count", "i", Printer_Count),
|
|
GB_PROPERTY_READ("Page", "i", Printer_Current),
|
|
|
|
GB_PROPERTY("Name", "s", Printer_Name),
|
|
GB_PROPERTY("Orientation", "i", Printer_Orientation),
|
|
GB_PROPERTY("Paper", "i", Printer_Paper),
|
|
GB_PROPERTY("PaperWidth", "f", Printer_PaperWidth),
|
|
GB_PROPERTY("PaperHeight", "f", Printer_PaperHeight),
|
|
GB_PROPERTY("CollateCopies", "b", Printer_CollateCopies),
|
|
GB_PROPERTY("ReverseOrder", "b", Printer_ReverseOrder),
|
|
GB_PROPERTY("Duplex", "i", Printer_Duplex),
|
|
GB_PROPERTY("GrayScale", "b", Printer_GrayScale),
|
|
GB_PROPERTY("NumCopies", "i", Printer_NumCopies),
|
|
GB_PROPERTY("Resolution", "i", Printer_Resolution),
|
|
GB_PROPERTY("FirstPage", "i", Printer_FirstPage),
|
|
GB_PROPERTY("LastPage", "i", Printer_LastPage),
|
|
GB_PROPERTY("FullPage", "b", Printer_FullPage),
|
|
GB_PROPERTY("OutputFile", "s", Printer_OutputFile),
|
|
|
|
GB_EVENT("Begin", NULL, NULL, &EVENT_Begin),
|
|
GB_EVENT("End", NULL, NULL, &EVENT_End),
|
|
GB_EVENT("Paginate", NULL, NULL, &EVENT_Paginate),
|
|
GB_EVENT("Draw", NULL, NULL, &EVENT_Draw),
|
|
|
|
GB_INTERFACE("Paint", &PAINT_Interface),
|
|
|
|
PRINTER_DESCRIPTION,
|
|
|
|
GB_END_DECLARE
|
|
};
|
|
|