void QPrinter::setPageSize( PageSize newPageSize ) { if ( newPageSize > NPageSize ) { #if defined(CHECK_STATE) qWarning("QPrinter::SetPageSize: illegal page size %d", newPageSize ); #endif return; } page_size = makepagesize( newPageSize, pageOrder(), colorMode() ); }
// Print a range of lines to a printer. int QsciPrinter::printRange(QsciScintillaBase *qsb, int from, int to) { // Sanity check. if (!qsb) return false; // Setup the printing area. QRect def_area; def_area.setX(0); def_area.setY(0); QPaintDeviceMetrics metrics(this); 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 = qsb->SendScintilla(QsciScintillaBase::SCI_GETLENGTH); startPos = (from > 0 ? qsb -> SendScintilla(QsciScintillaBase::SCI_POSITIONFROMLINE,from) : 0); if (to >= 0) { long toPos = qsb -> SendScintilla(QsciScintillaBase::SCI_POSITIONFROMLINE,to + 1); if (endPos > toPos) endPos = toPos; } if (startPos >= endPos) return false; QPainter painter(this); bool reverse = (pageOrder() == LastPageFirst); bool needNewPage = false; qsb -> SendScintilla(QsciScintillaBase::SCI_SETPRINTMAGNIFICATION,mag); qsb -> SendScintilla(QsciScintillaBase::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. QValueStack<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; } } QRect area = def_area; formatPage(painter,render,area,currPage); pos = qsb -> SendScintilla(QsciScintillaBase::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; QRect area = def_area; formatPage(painter,true,area,currPage); qsb->SendScintilla(QsciScintillaBase::SCI_FORMATRANGE,true,&painter,area,pos,ePos); } } return true; }
void QPrinter::setColorMode( ColorMode newColorMode ) { page_size = makepagesize( pageSize(), pageOrder(), newColorMode ); }
QValueList<int> KPrinter::pageList() const { QValueList<int> list; int mp(minPage()), MP(maxPage()); if (mp > 0 && MP > 0 && MP >= mp) { // do something only if bounds specified if (option("kde-current") == "1") { // print only current page int pp = currentPage(); if (pp >= mp && pp <= MP) list.append(pp); } else { // process range specification if (!option("kde-range").isEmpty()) { QStringList ranges = QStringList::split(',',option("kde-range"),false); for (QStringList::ConstIterator it=ranges.begin();it!=ranges.end();++it) { int p = (*it).find('-'); bool ok; if (p == -1) { int pp = (*it).toInt(&ok); if (ok && pp >= mp && pp <= MP) list.append(pp); } else { int p1(0), p2(0); p1 = (*it).left(p).toInt(&ok); if (ok) p2 = (*it).right((*it).length()-p-1).toInt(&ok); if (ok && p1 <= p2) { // clip to min/max p1 = QMAX(mp,p1); p2 = QMIN(MP,p2); for (int i=p1;i<=p2;i++) list.append(i); } } } } else { // add all pages between min and max for (int i=mp;i<=MP;i++) list.append(i); } // revert the list if needed if (pageOrder() == LastPageFirst) { for (uint i=0;i<(list.count()/2);i++) qSwap(list[i],list[list.count()-1-i]); } // select page set if needed if (pageSet() != AllPages) { bool keepEven = (pageSet() == EvenPages); for (QValueList<int>::Iterator it=list.begin();it!=list.end();) if ((((*it) % 2) != 0 && keepEven) || (((*it) % 2) == 0 && !keepEven)) it = list.remove(it); else ++it; } } } return list; }