diff options
Diffstat (limited to 'tqt/tqextscintillaprinter.cpp')
-rw-r--r-- | tqt/tqextscintillaprinter.cpp | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/tqt/tqextscintillaprinter.cpp b/tqt/tqextscintillaprinter.cpp new file mode 100644 index 0000000..a7dd282 --- /dev/null +++ b/tqt/tqextscintillaprinter.cpp @@ -0,0 +1,189 @@ +// This module implements the TQextScintillaPrinter class. +// +// Copyright (c) 2006 +// Riverbank Computing Limited <[email protected]> +// +// This file is part of TQScintilla. +// +// This copy of TQScintilla 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. +// +// TQScintilla is supplied 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 +// TQScintilla; see the file LICENSE. If not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <tqprinter.h> +#include <tqpainter.h> +#include <tqpaintdevicemetrics.h> +#include <tqvaluestack.h> + +#include "tqextscintillaprinter.h" +#include "tqextscintillabase.h" + + +// The ctor. +TQextScintillaPrinter::TQextScintillaPrinter(TQPrinter::PrinterMode mode) : + TQPrinter(mode), mag(0), + wrap(TQextScintilla::WrapWord) +{ +} + + +// The dtor. +TQextScintillaPrinter::~TQextScintillaPrinter() +{ +} + + +// Format the page before the document text is drawn. +void TQextScintillaPrinter::formatPage(TQPainter &,bool,TQRect &,int) +{ +} + + +// Print a range of lines to a printer. +int TQextScintillaPrinter::printRange(TQextScintillaBase *tqsb,int from,int to) +{ + // Sanity check. + if (!tqsb) + return FALSE; + + // Setup the printing area. + TQPaintDeviceMetrics metrics(this); + TQRect def_area; + + def_area.setX(0); + def_area.setY(0); + def_area.setWidth(metrics.width()); + def_area.setHeight(metrics.height()); + + // Get the page range. + int pgFrom, pgTo; + + pgFrom = fromPage(); + pgTo = toPage(); + + // Find the position range. + long startPos, endPos; + + endPos = tqsb -> SendScintilla(TQextScintillaBase::SCI_GETLENGTH); + + startPos = (from > 0 ? tqsb -> SendScintilla(TQextScintillaBase::SCI_POSITIONFROMLINE,from) : 0); + + if (to >= 0) + { + long toPos = tqsb -> SendScintilla(TQextScintillaBase::SCI_POSITIONFROMLINE,to + 1); + + if (endPos > toPos) + endPos = toPos; + } + + if (startPos >= endPos) + return FALSE; + + TQPainter painter(this); + bool reverse = (pageOrder() == LastPageFirst); + bool needNewPage = FALSE; + + tqsb -> SendScintilla(TQextScintillaBase::SCI_SETPRINTMAGNIFICATION,mag); + tqsb -> SendScintilla(TQextScintillaBase::SCI_SETPRINTWRAPMODE,wrap); + + for (int i = 1; i <= numCopies(); ++i) + { + // If we are printing in reverse page order then remember the + // start position of each page. + TQValueStack<long> pageStarts; + + int currPage = 1; + long pos = startPos; + + while (pos < endPos) + { + // See if we have finished the requested page range. + if (pgTo > 0 && pgTo < currPage) + break; + + // See if we are going to render this page, or just see + // how much would fit onto it. + bool render = FALSE; + + if (pgFrom == 0 || pgFrom <= currPage) + { + if (reverse) + pageStarts.push(pos); + else + { + render = TRUE; + + if (needNewPage) + { + if (!newPage()) + return FALSE; + } + else + needNewPage = TRUE; + } + } + + TQRect area = def_area; + + formatPage(painter,render,area,currPage); + pos = tqsb -> SendScintilla(TQextScintillaBase::SCI_FORMATRANGE,render,&painter,area,pos,endPos); + + ++currPage; + } + + // All done if we are printing in normal page order. + if (!reverse) + continue; + + // Now go through each page on the stack and really print it. + while (!pageStarts.isEmpty()) + { + --currPage; + + long ePos = pos; + pos = pageStarts.pop(); + + if (needNewPage) + { + if (!newPage()) + return FALSE; + } + else + needNewPage = TRUE; + + TQRect area = def_area; + + formatPage(painter,TRUE,area,currPage); + tqsb -> SendScintilla(TQextScintillaBase::SCI_FORMATRANGE,TRUE,&painter,area,pos,ePos); + } + } + + return TRUE; +} + + +// Set the print magnification in points. +void TQextScintillaPrinter::setMagnification(int magnification) +{ + mag = magnification; +} + + +// Set the line wrap mode. +void TQextScintillaPrinter::setWrapMode(TQextScintilla::WrapMode wmode) +{ + wrap = wmode; +} |