- /*
- * This file is part of the KDE libraries
- * Copyright (c) 2001-2002 Michael Goffioul <tdeprint@swing.be>
- * Complete rewrite on Sat Jun 15 2002 (c) Anders Lund <anders@alweb.dk>
- * Copyright (c) 2002, 2003 Anders Lund <anders@alweb.dk>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License version 2 as published by the Free Software Foundation.
- *
- * This library 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- **/
-
- #include "kateprinter.h"
-
- #include <kateconfig.h>
- #include <katedocument.h>
- #include <katefactory.h>
- #include <katehighlight.h>
- #include <katelinerange.h>
- #include <katerenderer.h>
- #include <kateschema.h>
- #include <katetextline.h>
-
- #include <tdeapplication.h>
- #include <kcolorbutton.h>
- #include <kdebug.h>
- #include <kdialog.h> // for spacingHint()
- #include <tdefontdialog.h>
- #include <tdelocale.h>
- #include <kprinter.h>
- #include <kurl.h>
- #include <kuser.h> // for loginName
-
- #include <tqpainter.h>
- #include <tqpopupmenu.h>
- #include <tqpaintdevicemetrics.h>
- #include <tqcheckbox.h>
- #include <tqcombobox.h>
- #include <tqgroupbox.h>
- #include <tqhbox.h>
- #include <tqlabel.h>
- #include <tqlayout.h>
- #include <tqlineedit.h>
- #include <tqspinbox.h>
- #include <tqstringlist.h>
- #include <tqwhatsthis.h>
-
- //BEGIN KatePrinter
- bool KatePrinter::print (KateDocument *doc)
- {
- #ifndef Q_WS_WIN //TODO: reenable
- KPrinter printer;
-
- // docname is now always there, including the right Untitled name
- printer.setDocName(doc->docName());
-
- KatePrintTextSettings *kpts = new KatePrintTextSettings(&printer, NULL);
- kpts->enableSelection( doc->hasSelection() );
- printer.addDialogPage( kpts );
- printer.addDialogPage( new KatePrintHeaderFooter(&printer, NULL) );
- printer.addDialogPage( new KatePrintLayout(&printer, NULL) );
-
- if ( printer.setup( kapp->mainWidget(), i18n("Print %1").arg(printer.docName()) ) )
- {
- KateRenderer renderer(doc);
- //renderer.config()->setSchema (1);
- renderer.setPrinterFriendly(true);
-
- TQPainter paint( &printer );
- TQPaintDeviceMetrics pdm( &printer );
- /*
- We work in tree cycles:
- 1) initialize variables and retrieve print settings
- 2) prepare data according to those settings
- 3) draw to the printer
- */
- uint pdmWidth = pdm.width();
- uint y = 0;
- uint xstart = 0; // beginning point for painting lines
- uint lineCount = 0;
- uint maxWidth = pdmWidth;
- uint headerWidth = pdmWidth;
- int startCol = 0;
- int endCol = 0;
- bool needWrap = true;
- bool pageStarted = true;
-
- // Text Settings Page
- bool selectionOnly = ( doc->hasSelection() &&
- ( printer.option("app-kate-printselection") == "true" ) );
- int selStartCol = 0;
- int selEndCol = 0;
-
- bool useGuide = ( printer.option("app-kate-printguide") == "true" );
- int guideHeight = 0;
- int guideCols = 0;
-
- bool printLineNumbers = ( printer.option("app-kate-printlinenumbers") == "true" );
- uint lineNumberWidth( 0 );
-
- // Header/Footer Page
- TQFont headerFont; // used for header/footer
- TQString f = printer.option("app-kate-hffont");
- if (!f.isEmpty())
- headerFont.fromString( f );
-
- bool useHeader = (printer.option("app-kate-useheader") == "true");
- TQColor headerBgColor(printer.option("app-kate-headerbg"));
- TQColor headerFgColor(printer.option("app-kate-headerfg"));
- uint headerHeight( 0 ); // further init only if needed
- TQStringList headerTagList; // do
- bool headerDrawBg = false; // do
-
- bool useFooter = (printer.option("app-kate-usefooter") == "true");
- TQColor footerBgColor(printer.option("app-kate-footerbg"));
- TQColor footerFgColor(printer.option("app-kate-footerfg"));
- uint footerHeight( 0 ); // further init only if needed
- TQStringList footerTagList = 0; // do
- bool footerDrawBg = 0; // do
-
- // Layout Page
- renderer.config()->setSchema( KateFactory::self()->schemaManager()->number(
- printer.option("app-kate-colorscheme") ) );
- bool useBackground = ( printer.option("app-kate-usebackground") == "true" );
- bool useBox = (printer.option("app-kate-usebox") == "true");
- int boxWidth(printer.option("app-kate-boxwidth").toInt());
- TQColor boxColor(printer.option("app-kate-boxcolor"));
- int innerMargin = useBox ? printer.option("app-kate-boxmargin").toInt() : 6;
-
- // Post initialization
- uint maxHeight = (useBox ? pdm.height()-innerMargin : pdm.height());
- uint currentPage( 1 );
- uint lastline = doc->lastLine(); // nessecary to print selection only
- uint firstline( 0 );
-
- KateHlItemDataList ilist;
-
- if (useGuide)
- doc->highlight()->getKateHlItemDataListCopy (renderer.config()->schema(), ilist);
-
- /*
- Now on for preparations...
- during preparations, variable names starting with a "_" means
- those variables are local to the enclosing block.
- */
- {
- if ( selectionOnly )
- {
- // set a line range from the first selected line to the last
- firstline = doc->selStartLine();
- selStartCol = doc->selStartCol();
- lastline = doc->selEndLine();
- selEndCol = doc->selEndCol();
-
- lineCount = firstline;
- }
-
- if ( printLineNumbers )
- {
- // figure out the horiizontal space required
- TQString s( TQString("%1 ").arg( doc->numLines() ) );
- s.fill('5', -1); // some non-fixed fonts haven't equally wide numbers
- // FIXME calculate which is actually the widest...
- lineNumberWidth = renderer.currentFontMetrics()->width( s );
- // a small space between the line numbers and the text
- int _adj = renderer.currentFontMetrics()->width( "5" );
- // adjust available width and set horizontal start point for data
- maxWidth -= (lineNumberWidth + _adj);
- xstart += lineNumberWidth + _adj;
- }
-
- if ( useHeader || useFooter )
- {
- // Set up a tag map
- // This retrieves all tags, ued or not, but
- // none of theese operations should be expensive,
- // and searcing each tag in the format strings is avoided.
- TQDateTime dt = TQDateTime::currentDateTime();
- TQMap<TQString,TQString> tags;
-
- KUser u (KUser::UseRealUserID);
- tags["u"] = u.loginName();
-
- tags["d"] = TDEGlobal::locale()->formatDateTime(dt, true, false);
- tags["D"] = TDEGlobal::locale()->formatDateTime(dt, false, false);
- tags["h"] = TDEGlobal::locale()->formatTime(TQT_TQTIME_OBJECT(dt.time()), false);
- tags["y"] = TDEGlobal::locale()->formatDate(TQT_TQDATE_OBJECT(dt.date()), true);
- tags["Y"] = TDEGlobal::locale()->formatDate(TQT_TQDATE_OBJECT(dt.date()), false);
- tags["f"] = doc->url().fileName();
- tags["U"] = doc->url().prettyURL();
- if ( selectionOnly )
- {
- TQString s( i18n("(Selection of) ") );
- tags["f"].prepend( s );
- tags["U"].prepend( s );
- }
-
- TQRegExp reTags( "%([dDfUhuyY])" ); // TODO tjeck for "%%<TAG>"
-
- if (useHeader)
- {
- headerDrawBg = ( printer.option("app-kate-headerusebg") == "true" );
- headerHeight = TQFontMetrics( headerFont ).height();
- if ( useBox || headerDrawBg )
- headerHeight += innerMargin * 2;
- else
- headerHeight += 1 + TQFontMetrics( headerFont ).leading();
-
- TQString headerTags = printer.option("app-kate-headerformat");
- int pos = reTags.search( headerTags );
- TQString rep;
- while ( pos > -1 )
- {
- rep = tags[reTags.cap( 1 )];
- headerTags.replace( (uint)pos, 2, rep );
- pos += rep.length();
- pos = reTags.search( headerTags, pos );
- }
- headerTagList = TQStringList::split('|', headerTags, true);
-
- if (!headerBgColor.isValid())
- headerBgColor = Qt::lightGray;
- if (!headerFgColor.isValid())
- headerFgColor = Qt::black;
- }
-
- if (useFooter)
- {
- footerDrawBg = ( printer.option("app-kate-footerusebg") == "true" );
- footerHeight = TQFontMetrics( headerFont ).height();
- if ( useBox || footerDrawBg )
- footerHeight += 2*innerMargin;
- else
- footerHeight += 1; // line only
-
- TQString footerTags = printer.option("app-kate-footerformat");
- int pos = reTags.search( footerTags );
- TQString rep;
- while ( pos > -1 )
- {
- rep = tags[reTags.cap( 1 )];
- footerTags.replace( (uint)pos, 2, rep );
- pos += rep.length();
- pos = reTags.search( footerTags, pos );
- }
-
- footerTagList = TQStringList::split('|', footerTags, true);
- if (!footerBgColor.isValid())
- footerBgColor = Qt::lightGray;
- if (!footerFgColor.isValid())
- footerFgColor = Qt::black;
- // adjust maxheight, so we can know when/where to print footer
- maxHeight -= footerHeight;
- }
- } // if ( useHeader || useFooter )
-
- if ( useBackground )
- {
- if ( ! useBox )
- {
- xstart += innerMargin;
- maxWidth -= innerMargin * 2;
- }
- }
-
- if ( useBox )
- {
- if (!boxColor.isValid())
- boxColor = Qt::black;
- if (boxWidth < 1) // shouldn't be pssible no more!
- boxWidth = 1;
- // set maxwidth to something sensible
- maxWidth -= ( ( boxWidth + innerMargin ) * 2 );
- xstart += boxWidth + innerMargin;
- // maxheight too..
- maxHeight -= boxWidth;
- }
- else
- boxWidth = 0;
-
- if ( useGuide )
- {
- // calculate the height required
- // the number of columns is a side effect, saved for drawing time
- // first width is needed
- int _w = pdmWidth - innerMargin * 2;
- if ( useBox )
- _w -= boxWidth * 2;
- else
- {
- if ( useBackground )
- _w -= ( innerMargin * 2 );
- _w -= 2; // 1 px line on each side
- }
-
- // base of height: margins top/bottom, above and below tetle sep line
- guideHeight = ( innerMargin * 4 ) + 1;
-
- // get a title and add the height required to draw it
- TQString _title = i18n("Typographical Conventions for %1").arg(doc->highlight()->name());
- guideHeight += paint.boundingRect( 0, 0, _w, 1000, Qt::AlignTop|Qt::AlignHCenter, _title ).height();
-
- // see how many columns we can fit in
- int _widest( 0 );
-
- TQPtrListIterator<KateHlItemData> it( ilist );
- KateHlItemData *_d;
-
- int _items ( 0 );
- while ( ( _d = it.current()) != 0 )
- {
- _widest = kMax( _widest, ((TQFontMetrics)(
- _d->bold() ?
- _d->italic() ?
- renderer.config()->fontStruct()->myFontMetricsBI :
- renderer.config()->fontStruct()->myFontMetricsBold :
- _d->italic() ?
- renderer.config()->fontStruct()->myFontMetricsItalic :
- renderer.config()->fontStruct()->myFontMetrics
- ) ).width( _d->name ) );
- _items++;
- ++it;
- }
- guideCols = _w/( _widest + innerMargin );
- // add height for required number of lines needed given columns
- guideHeight += renderer.fontHeight() * ( _items/guideCols );
- if ( _items%guideCols )
- guideHeight += renderer.fontHeight();
- }
-
- // now that we know the vertical amount of space needed,
- // it is possible to calculate the total number of pages
- // if needed, that is if any header/footer tag contains "%P".
- if ( headerTagList.grep("%P").count() || footerTagList.grep("%P").count() )
- {
- kdDebug(13020)<<"'%P' found! calculating number of pages..."<<endl;
- uint _pages = 0;
- uint _ph = maxHeight;
- if ( useHeader )
- _ph -= ( headerHeight + innerMargin );
- if ( useFooter )
- _ph -= innerMargin;
- int _lpp = _ph / renderer.fontHeight();
- uint _lt = 0, _c=0;
-
- // add space for guide if required
- if ( useGuide )
- _lt += (guideHeight + (renderer.fontHeight() /2)) / renderer.fontHeight();
- long _lw;
- for ( uint i = firstline; i < lastline; i++ )
- {
- _lw = renderer.textWidth( doc->kateTextLine( i ), -1 );
- while ( _lw >= 0 )
- {
- _c++;
- _lt++;
- if ( (int)_lt == _lpp )
- {
- _pages++;
- _lt = 0;
- }
- _lw -= maxWidth;
- if ( ! _lw ) _lw--; // skip lines matching exactly!
- }
- }
- if ( _lt ) _pages++; // last page
-
- // substitute both tag lists
- TQString re("%P");
- TQStringList::Iterator it;
- for ( it=headerTagList.begin(); it!=headerTagList.end(); ++it )
- (*it).replace( re, TQString( "%1" ).arg( _pages ) );
- for ( it=footerTagList.begin(); it!=footerTagList.end(); ++it )
- (*it).replace( re, TQString( "%1" ).arg( _pages ) );
- }
- } // end prepare block
-
- /*
- On to draw something :-)
- */
- uint _count = 0;
- while ( lineCount <= lastline )
- {
- startCol = 0;
- endCol = 0;
- needWrap = true;
-
- while (needWrap)
- {
- if ( y + renderer.fontHeight() >= (uint)(maxHeight) )
- {
- kdDebug(13020)<<"Starting new page, "<<_count<<" lines up to now."<<endl;
- printer.newPage();
- currentPage++;
- pageStarted = true;
- y=0;
- }
-
- if ( pageStarted )
- {
-
- if ( useHeader )
- {
- paint.setPen(headerFgColor);
- paint.setFont(headerFont);
- if ( headerDrawBg )
- paint.fillRect(0, 0, headerWidth, headerHeight, headerBgColor);
- if (headerTagList.count() == 3)
- {
- int valign = ( (useBox||headerDrawBg||useBackground) ?
- Qt::AlignVCenter : Qt::AlignTop );
- int align = valign|Qt::AlignLeft;
- int marg = ( useBox || headerDrawBg ) ? innerMargin : 0;
- if ( useBox ) marg += boxWidth;
- TQString s;
- for (int i=0; i<3; i++)
- {
- s = headerTagList[i];
- if (s.find("%p") != -1) s.replace("%p", TQString::number(currentPage));
- paint.drawText(marg, 0, headerWidth-(marg*2), headerHeight, align, s);
- align = valign|(i == 0 ? Qt::AlignHCenter : Qt::AlignRight);
- }
- }
- if ( ! ( headerDrawBg || useBox || useBackground ) ) // draw a 1 px (!?) line to separate header from contents
- {
- paint.drawLine( 0, headerHeight-1, headerWidth, headerHeight-1 );
- //y += 1; now included in headerHeight
- }
- y += headerHeight + innerMargin;
- }
-
- if ( useFooter )
- {
- if ( ! ( footerDrawBg || useBox || useBackground ) ) // draw a 1 px (!?) line to separate footer from contents
- paint.drawLine( 0, maxHeight + innerMargin - 1, headerWidth, maxHeight + innerMargin - 1 );
- if ( footerDrawBg )
- paint.fillRect(0, maxHeight+innerMargin+boxWidth, headerWidth, footerHeight, footerBgColor);
- if (footerTagList.count() == 3)
- {
- int align = Qt::AlignVCenter|Qt::AlignLeft;
- int marg = ( useBox || footerDrawBg ) ? innerMargin : 0;
- if ( useBox ) marg += boxWidth;
- TQString s;
- for (int i=0; i<3; i++)
- {
- s = footerTagList[i];
- if (s.find("%p") != -1) s.replace("%p", TQString::number(currentPage));
- paint.drawText(marg, maxHeight+innerMargin, headerWidth-(marg*2), footerHeight, align, s);
- align = Qt::AlignVCenter|(i == 0 ? Qt::AlignHCenter : Qt::AlignRight);
- }
- }
- } // done footer
-
- if ( useBackground )
- {
- // If we have a box, or the header/footer has backgrounds, we want to paint
- // to the border of those. Otherwise just the contents area.
- int _y = y, _h = maxHeight - y;
- if ( useBox )
- {
- _y -= innerMargin;
- _h += 2 * innerMargin;
- }
- else
- {
- if ( headerDrawBg )
- {
- _y -= innerMargin;
- _h += innerMargin;
- }
- if ( footerDrawBg )
- {
- _h += innerMargin;
- }
- }
- paint.fillRect( 0, _y, pdmWidth, _h, renderer.config()->backgroundColor());
- }
-
- if ( useBox )
- {
- paint.setPen(TQPen(boxColor, boxWidth));
- paint.drawRect(0, 0, pdmWidth, pdm.height());
- if (useHeader)
- paint.drawLine(0, headerHeight, headerWidth, headerHeight);
- else
- y += innerMargin;
-
- if ( useFooter ) // drawline is not trustable, grr.
- paint.fillRect( 0, maxHeight+innerMargin, headerWidth, boxWidth, boxColor );
- }
-
- if ( useGuide && currentPage == 1 )
- { // FIXME - this may span more pages...
- // draw a box unless we have boxes, in which case we end with a box line
-
- // use color of dsNormal for the title string and the hline
- KateAttributeList _dsList;
- KateHlManager::self()->getDefaults ( renderer.config()->schema(), _dsList );
- paint.setPen( _dsList.at(0)->textColor() );
- int _marg = 0; // this could be available globally!??
- if ( useBox )
- {
- _marg += (2*boxWidth) + (2*innerMargin);
- paint.fillRect( 0, y+guideHeight-innerMargin-boxWidth, headerWidth, boxWidth, boxColor );
- }
- else
- {
- if ( useBackground )
- _marg += 2*innerMargin;
- paint.drawRect( _marg, y, pdmWidth-(2*_marg), guideHeight );
- _marg += 1;
- y += 1 + innerMargin;
- }
- // draw a title string
- paint.setFont( renderer.config()->fontStruct()->myFontBold );
- TQRect _r;
- paint.drawText( _marg, y, pdmWidth-(2*_marg), maxHeight - y,
- Qt::AlignTop|Qt::AlignHCenter,
- i18n("Typographical Conventions for %1").arg(doc->highlight()->name()), -1, &_r );
- int _w = pdmWidth - (_marg*2) - (innerMargin*2);
- int _x = _marg + innerMargin;
- y += _r.height() + innerMargin;
- paint.drawLine( _x, y, _x + _w, y );
- y += 1 + innerMargin;
- // draw attrib names using their styles
-
- TQPtrListIterator<KateHlItemData> _it( ilist );
- KateHlItemData *_d;
- int _cw = _w/guideCols;
- int _i(0);
-
- while ( ( _d = _it.current() ) != 0 )
- {
- paint.setPen( renderer.attribute(_i)->textColor() );
- paint.setFont( renderer.attribute(_i)->font( *renderer.currentFont() ) );
- paint.drawText(( _x + ((_i%guideCols)*_cw)), y, _cw, renderer.fontHeight(),
- Qt::AlignVCenter|Qt::AlignLeft, _d->name, -1, &_r );
- _i++;
- if ( _i && ! ( _i%guideCols ) ) y += renderer.fontHeight();
- ++_it;
- }
- if ( _i%guideCols ) y += renderer.fontHeight();// last row not full
- y += ( useBox ? boxWidth : 1 ) + (innerMargin*2);
- }
-
- pageStarted = false;
- } // pageStarted; move on to contents:)
-
- if ( printLineNumbers && ! startCol ) // don't repeat!
- {
- paint.setFont( renderer.config()->fontStruct()->font( false, false ) );
- paint.setPen( renderer.config()->lineNumberColor() );
- paint.drawText( (( useBox || useBackground ) ? innerMargin : 0), y,
- lineNumberWidth, renderer.fontHeight(),
- Qt::AlignRight, TQString("%1").arg( lineCount + 1 ) );
- }
- endCol = renderer.textWidth(doc->kateTextLine(lineCount), startCol, maxWidth, &needWrap);
-
- if ( endCol < startCol )
- {
- //kdDebug(13020)<<"--- Skipping garbage, line: "<<lineCount<<" start: "<<startCol<<" end: "<<endCol<<" real EndCol; "<< buffer->line(lineCount)->length()<< " !?"<<endl;
- lineCount++;
- continue; // strange case...
- // Happens if the line fits exactly.
- // When it happens, a line of garbage would be printed.
- // FIXME Most likely this is an error in textWidth(),
- // failing to correctly set needWrap to false in this case?
- }
-
- // if we print only selection:
- // print only selected range of chars.
- bool skip = false;
- if ( selectionOnly )
- {
- bool inBlockSelection = ( doc->blockSelectionMode() && lineCount >= firstline && lineCount <= lastline );
- if ( lineCount == firstline || inBlockSelection )
- {
- if ( startCol < selStartCol )
- startCol = selStartCol;
- }
- if ( lineCount == lastline || inBlockSelection )
- {
- if ( endCol > selEndCol )
- {
- endCol = selEndCol;
- skip = true;
- }
- }
- }
-
- // HA! this is where we print [part of] a line ;]]
- // FIXME Convert this function + related functionality to a separate KatePrintView
- KateLineRange range;
- range.line = lineCount;
- range.startCol = startCol;
- range.endCol = endCol;
- range.wrap = needWrap;
- paint.translate(xstart, y);
- renderer.paintTextLine(paint, &range, 0, maxWidth);
- paint.resetXForm();
- if ( skip )
- {
- needWrap = false;
- startCol = 0;
- }
- else
- {
- startCol = endCol;
- }
-
- y += renderer.fontHeight();
- _count++;
- } // done while ( needWrap )
-
- lineCount++;
- } // done lineCount <= lastline
- return true;
- }
-
- #endif //!Q_WS_WIN
- return false;
- }
- //END KatePrinter
-
- #ifndef Q_WS_WIN //TODO: reenable
- //BEGIN KatePrintTextSettings
- KatePrintTextSettings::KatePrintTextSettings( KPrinter * /*printer*/, TQWidget *parent, const char *name )
- : KPrintDialogPage( parent, name )
- {
- setTitle( i18n("Te&xt Settings") );
-
- TQVBoxLayout *lo = new TQVBoxLayout ( this );
- lo->setSpacing( KDialog::spacingHint() );
-
- cbSelection = new TQCheckBox( i18n("Print &selected text only"), this );
- lo->addWidget( cbSelection );
-
- cbLineNumbers = new TQCheckBox( i18n("Print &line numbers"), this );
- lo->addWidget( cbLineNumbers );
-
- cbGuide = new TQCheckBox( i18n("Print syntax &guide"), this );
- lo->addWidget( cbGuide );
-
- lo->addStretch( 1 );
-
- // set defaults - nothing to do :-)
-
- // whatsthis
- TQWhatsThis::add( cbSelection, i18n(
- "<p>This option is only available if some text is selected in the document.</p>"
- "<p>If available and enabled, only the selected text is printed.</p>") );
- TQWhatsThis::add( cbLineNumbers, i18n(
- "<p>If enabled, line numbers will be printed on the left side of the page(s).</p>") );
- TQWhatsThis::add( cbGuide, i18n(
- "<p>Print a box displaying typographical conventions for the document type, as "
- "defined by the syntax highlighting being used.") );
- }
-
- void KatePrintTextSettings::getOptions( TQMap<TQString,TQString>& opts, bool )
- {
- opts["app-kate-printselection"] = cbSelection->isChecked() ? "true" : "false";
- opts["app-kate-printlinenumbers"] = cbLineNumbers->isChecked() ? "true" : "false";
- opts["app-kate-printguide"] = cbGuide->isChecked() ? "true" : "false" ;
- }
-
- void KatePrintTextSettings::setOptions( const TQMap<TQString,TQString>& opts )
- {
- TQString v;
- v = opts["app-kate-printselection"];
- if ( ! v.isEmpty() )
- cbSelection->setChecked( v == "true" );
- v = opts["app-kate-printlinenumbers"];
- if ( ! v.isEmpty() )
- cbLineNumbers->setChecked( v == "true" );
- v = opts["app-kate-printguide"];
- if ( ! v.isEmpty() )
- cbGuide->setChecked( v == "true" );
- }
-
- void KatePrintTextSettings::enableSelection( bool enable )
- {
- cbSelection->setEnabled( enable );
- }
-
- //END KatePrintTextSettings
-
- //BEGIN KatePrintHeaderFooter
- KatePrintHeaderFooter::KatePrintHeaderFooter( KPrinter * /*printer*/, TQWidget *parent, const char *name )
- : KPrintDialogPage( parent, name )
- {
- setTitle( i18n("Hea&der && Footer") );
-
- TQVBoxLayout *lo = new TQVBoxLayout ( this );
- uint sp = KDialog::spacingHint();
- lo->setSpacing( sp );
-
- // enable
- TQHBoxLayout *lo1 = new TQHBoxLayout ( lo );
- cbEnableHeader = new TQCheckBox( i18n("Pr&int header"), this );
- lo1->addWidget( cbEnableHeader );
- cbEnableFooter = new TQCheckBox( i18n("Pri&nt footer"), this );
- lo1->addWidget( cbEnableFooter );
-
- // font
- TQHBoxLayout *lo2 = new TQHBoxLayout( lo );
- lo2->addWidget( new TQLabel( i18n("Header/footer font:"), this ) );
- lFontPreview = new TQLabel( this );
- lFontPreview->setFrameStyle( TQFrame::Panel|TQFrame::Sunken );
- lo2->addWidget( lFontPreview );
- lo2->setStretchFactor( lFontPreview, 1 );
- TQPushButton *btnChooseFont = new TQPushButton( i18n("Choo&se Font..."), this );
- lo2->addWidget( btnChooseFont );
- connect( btnChooseFont, TQT_SIGNAL(clicked()), this, TQT_SLOT(setHFFont()) );
- // header
- gbHeader = new TQGroupBox( 2, Qt::Horizontal, i18n("Header Properties"), this );
- lo->addWidget( gbHeader );
-
- TQLabel *lHeaderFormat = new TQLabel( i18n("&Format:"), gbHeader );
- TQHBox *hbHeaderFormat = new TQHBox( gbHeader );
- hbHeaderFormat->setSpacing( sp );
- leHeaderLeft = new TQLineEdit( hbHeaderFormat );
- leHeaderCenter = new TQLineEdit( hbHeaderFormat );
- leHeaderRight = new TQLineEdit( hbHeaderFormat );
- lHeaderFormat->setBuddy( leHeaderLeft );
- new TQLabel( i18n("Colors:"), gbHeader );
- TQHBox *hbHeaderColors = new TQHBox( gbHeader );
- hbHeaderColors->setSpacing( sp );
- TQLabel *lHeaderFgCol = new TQLabel( i18n("Foreground:"), hbHeaderColors );
- kcbtnHeaderFg = new KColorButton( hbHeaderColors );
- lHeaderFgCol->setBuddy( kcbtnHeaderFg );
- cbHeaderEnableBgColor = new TQCheckBox( i18n("Bac&kground"), hbHeaderColors );
- kcbtnHeaderBg = new KColorButton( hbHeaderColors );
-
- gbFooter = new TQGroupBox( 2, Qt::Horizontal, i18n("Footer Properties"), this );
- lo->addWidget( gbFooter );
-
- // footer
- TQLabel *lFooterFormat = new TQLabel( i18n("For&mat:"), gbFooter );
- TQHBox *hbFooterFormat = new TQHBox( gbFooter );
- hbFooterFormat->setSpacing( sp );
- leFooterLeft = new TQLineEdit( hbFooterFormat );
- leFooterCenter = new TQLineEdit( hbFooterFormat );
- leFooterRight = new TQLineEdit( hbFooterFormat );
- lFooterFormat->setBuddy( leFooterLeft );
-
- new TQLabel( i18n("Colors:"), gbFooter );
- TQHBox *hbFooterColors = new TQHBox( gbFooter );
- hbFooterColors->setSpacing( sp );
- TQLabel *lFooterBgCol = new TQLabel( i18n("Foreground:"), hbFooterColors );
- kcbtnFooterFg = new KColorButton( hbFooterColors );
- lFooterBgCol->setBuddy( kcbtnFooterFg );
- cbFooterEnableBgColor = new TQCheckBox( i18n("&Background"), hbFooterColors );
- kcbtnFooterBg = new KColorButton( hbFooterColors );
-
- lo->addStretch( 1 );
-
- // user friendly
- connect( cbEnableHeader, TQT_SIGNAL(toggled(bool)), gbHeader, TQT_SLOT(setEnabled(bool)) );
- connect( cbEnableFooter, TQT_SIGNAL(toggled(bool)), gbFooter, TQT_SLOT(setEnabled(bool)) );
- connect( cbHeaderEnableBgColor, TQT_SIGNAL(toggled(bool)), kcbtnHeaderBg, TQT_SLOT(setEnabled(bool)) );
- connect( cbFooterEnableBgColor, TQT_SIGNAL(toggled(bool)), kcbtnFooterBg, TQT_SLOT(setEnabled(bool)) );
-
- // set defaults
- cbEnableHeader->setChecked( true );
- leHeaderLeft->setText( "%y" );
- leHeaderCenter->setText( "%f" );
- leHeaderRight->setText( "%p" );
- kcbtnHeaderFg->setColor( TQColor("black") );
- cbHeaderEnableBgColor->setChecked( true );
- kcbtnHeaderBg->setColor( TQColor("lightgrey") );
-
- cbEnableFooter->setChecked( true );
- leFooterRight->setText( "%U" );
- kcbtnFooterFg->setColor( TQColor("black") );
- cbFooterEnableBgColor->setChecked( true );
- kcbtnFooterBg->setColor( TQColor("lightgrey") );
-
- // whatsthis
- TQString s = i18n("<p>Format of the page header. The following tags are supported:</p>");
- TQString s1 = i18n(
- "<ul><li><tt>%u</tt>: current user name</li>"
- "<li><tt>%d</tt>: complete date/time in short format</li>"
- "<li><tt>%D</tt>: complete date/time in long format</li>"
- "<li><tt>%h</tt>: current time</li>"
- "<li><tt>%y</tt>: current date in short format</li>"
- "<li><tt>%Y</tt>: current date in long format</li>"
- "<li><tt>%f</tt>: file name</li>"
- "<li><tt>%U</tt>: full URL of the document</li>"
- "<li><tt>%p</tt>: page number</li>"
- "</ul><br>"
- "<u>Note:</u> Do <b>not</b> use the '|' (vertical bar) character.");
- TQWhatsThis::add(leHeaderRight, s + s1 );
- TQWhatsThis::add(leHeaderCenter, s + s1 );
- TQWhatsThis::add(leHeaderLeft, s + s1 );
- s = i18n("<p>Format of the page footer. The following tags are supported:</p>");
- TQWhatsThis::add(leFooterRight, s + s1 );
- TQWhatsThis::add(leFooterCenter, s + s1 );
- TQWhatsThis::add(leFooterLeft, s + s1 );
-
-
- }
-
- void KatePrintHeaderFooter::getOptions(TQMap<TQString,TQString>& opts, bool )
- {
- opts["app-kate-hffont"] = strFont;
-
- opts["app-kate-useheader"] = (cbEnableHeader->isChecked() ? "true" : "false");
- opts["app-kate-headerfg"] = kcbtnHeaderFg->color().name();
- opts["app-kate-headerusebg"] = (cbHeaderEnableBgColor->isChecked() ? "true" : "false");
- opts["app-kate-headerbg"] = kcbtnHeaderBg->color().name();
- opts["app-kate-headerformat"] = leHeaderLeft->text() + "|" + leHeaderCenter->text() + "|" + leHeaderRight->text();
-
- opts["app-kate-usefooter"] = (cbEnableFooter->isChecked() ? "true" : "false");
- opts["app-kate-footerfg"] = kcbtnFooterFg->color().name();
- opts["app-kate-footerusebg"] = (cbFooterEnableBgColor->isChecked() ? "true" : "false");
- opts["app-kate-footerbg"] = kcbtnFooterBg->color().name();
- opts["app-kate-footerformat"] = leFooterLeft->text() + "|" + leFooterCenter->text() + "|" + leFooterRight->text();
- }
-
- void KatePrintHeaderFooter::setOptions( const TQMap<TQString,TQString>& opts )
- {
- TQString v;
- v = opts["app-kate-hffont"];
- strFont = v;
- TQFont f = font();
- if ( ! v.isEmpty() )
- {
- if (!strFont.isEmpty())
- f.fromString( strFont );
-
- lFontPreview->setFont( f );
- }
- lFontPreview->setText( (f.family() + ", %1pt").arg( f.pointSize() ) );
-
- v = opts["app-kate-useheader"];
- if ( ! v.isEmpty() )
- cbEnableHeader->setChecked( v == "true" );
- v = opts["app-kate-headerfg"];
- if ( ! v.isEmpty() )
- kcbtnHeaderFg->setColor( TQColor( v ) );
- v = opts["app-kate-headerusebg"];
- if ( ! v.isEmpty() )
- cbHeaderEnableBgColor->setChecked( v == "true" );
- v = opts["app-kate-headerbg"];
- if ( ! v.isEmpty() )
- kcbtnHeaderBg->setColor( TQColor( v ) );
-
- TQStringList tags = TQStringList::split('|', opts["app-kate-headerformat"], "true");
- if (tags.count() == 3)
- {
- leHeaderLeft->setText(tags[0]);
- leHeaderCenter->setText(tags[1]);
- leHeaderRight->setText(tags[2]);
- }
-
- v = opts["app-kate-usefooter"];
- if ( ! v.isEmpty() )
- cbEnableFooter->setChecked( v == "true" );
- v = opts["app-kate-footerfg"];
- if ( ! v.isEmpty() )
- kcbtnFooterFg->setColor( TQColor( v ) );
- v = opts["app-kate-footerusebg"];
- if ( ! v.isEmpty() )
- cbFooterEnableBgColor->setChecked( v == "true" );
- v = opts["app-kate-footerbg"];
- if ( ! v.isEmpty() )
- kcbtnFooterBg->setColor( TQColor( v ) );
-
- tags = TQStringList::split('|', opts["app-kate-footerformat"], "true");
- if (tags.count() == 3)
- {
- leFooterLeft->setText(tags[0]);
- leFooterCenter->setText(tags[1]);
- leFooterRight->setText(tags[2]);
- }
- }
-
- void KatePrintHeaderFooter::setHFFont()
- {
- TQFont fnt( lFontPreview->font() );
- // display a font dialog
- if ( TDEFontDialog::getFont( fnt, false, this ) == TDEFontDialog::Accepted )
- {
- // change strFont
- strFont = fnt.toString();
- // set preview
- lFontPreview->setFont( fnt );
- lFontPreview->setText( (fnt.family() + ", %1pt").arg( fnt.pointSize() ) );
- }
- }
-
- //END KatePrintHeaderFooter
-
- //BEGIN KatePrintLayout
-
- KatePrintLayout::KatePrintLayout( KPrinter * /*printer*/, TQWidget *parent, const char *name )
- : KPrintDialogPage( parent, name )
- {
- setTitle( i18n("L&ayout") );
-
- TQVBoxLayout *lo = new TQVBoxLayout ( this );
- lo->setSpacing( KDialog::spacingHint() );
-
- TQHBox *hb = new TQHBox( this );
- lo->addWidget( hb );
- TQLabel *lSchema = new TQLabel( i18n("&Schema:"), hb );
- cmbSchema = new TQComboBox( false, hb );
- lSchema->setBuddy( cmbSchema );
-
- cbDrawBackground = new TQCheckBox( i18n("Draw bac&kground color"), this );
- lo->addWidget( cbDrawBackground );
-
- cbEnableBox = new TQCheckBox( i18n("Draw &boxes"), this );
- lo->addWidget( cbEnableBox );
-
- gbBoxProps = new TQGroupBox( 2, Qt::Horizontal, i18n("Box Properties"), this );
- lo->addWidget( gbBoxProps );
-
- TQLabel *lBoxWidth = new TQLabel( i18n("W&idth:"), gbBoxProps );
- sbBoxWidth = new TQSpinBox( 1, 100, 1, gbBoxProps );
- lBoxWidth->setBuddy( sbBoxWidth );
-
- TQLabel *lBoxMargin = new TQLabel( i18n("&Margin:"), gbBoxProps );
- sbBoxMargin = new TQSpinBox( 0, 100, 1, gbBoxProps );
- lBoxMargin->setBuddy( sbBoxMargin );
-
- TQLabel *lBoxColor = new TQLabel( i18n("Co&lor:"), gbBoxProps );
- kcbtnBoxColor = new KColorButton( gbBoxProps );
- lBoxColor->setBuddy( kcbtnBoxColor );
-
- connect( cbEnableBox, TQT_SIGNAL(toggled(bool)), gbBoxProps, TQT_SLOT(setEnabled(bool)) );
-
- lo->addStretch( 1 );
- // set defaults:
- sbBoxMargin->setValue( 6 );
- gbBoxProps->setEnabled( false );
- cmbSchema->insertStringList (KateFactory::self()->schemaManager()->list ());
- cmbSchema->setCurrentItem( 1 );
-
- // whatsthis
- // FIXME uncomment when string freeze is over
- // TQWhatsThis::add ( cmbSchema, i18n(
- // "Select the color scheme to use for the print." ) );
- TQWhatsThis::add( cbDrawBackground, i18n(
- "<p>If enabled, the background color of the editor will be used.</p>"
- "<p>This may be useful if your color scheme is designed for a dark background.</p>") );
- TQWhatsThis::add( cbEnableBox, i18n(
- "<p>If enabled, a box as defined in the properties below will be drawn "
- "around the contents of each page. The Header and Footer will be separated "
- "from the contents with a line as well.</p>") );
- TQWhatsThis::add( sbBoxWidth, i18n(
- "The width of the box outline" ) );
- TQWhatsThis::add( sbBoxMargin, i18n(
- "The margin inside boxes, in pixels") );
- TQWhatsThis::add( kcbtnBoxColor, i18n(
- "The line color to use for boxes") );
- }
-
- void KatePrintLayout::getOptions(TQMap<TQString,TQString>& opts, bool )
- {
- opts["app-kate-colorscheme"] = cmbSchema->currentText();
- opts["app-kate-usebackground"] = cbDrawBackground->isChecked() ? "true" : "false";
- opts["app-kate-usebox"] = cbEnableBox->isChecked() ? "true" : "false";
- opts["app-kate-boxwidth"] = sbBoxWidth->cleanText();
- opts["app-kate-boxmargin"] = sbBoxMargin->cleanText();
- opts["app-kate-boxcolor"] = kcbtnBoxColor->color().name();
- }
-
- void KatePrintLayout::setOptions( const TQMap<TQString,TQString>& opts )
- {
- TQString v;
- v = opts["app-kate-colorscheme"];
- if ( ! v.isEmpty() )
- cmbSchema->setCurrentItem( KateFactory::self()->schemaManager()->number( v ) );
- v = opts["app-kate-usebackground"];
- if ( ! v.isEmpty() )
- cbDrawBackground->setChecked( v == "true" );
- v = opts["app-kate-usebox"];
- if ( ! v.isEmpty() )
- cbEnableBox->setChecked( v == "true" );
- v = opts["app-kate-boxwidth"];
- if ( ! v.isEmpty() )
- sbBoxWidth->setValue( v.toInt() );
- v = opts["app-kate-boxmargin"];
- if ( ! v.isEmpty() )
- sbBoxMargin->setValue( v.toInt() );
- v = opts["app-kate-boxcolor"];
- if ( ! v.isEmpty() )
- kcbtnBoxColor->setColor( TQColor( v ) );
- }
- //END KatePrintLayout
-
- #include "kateprinter.moc"
- #endif //!Q_WS_WIN
-
- // kate: space-indent on; indent-width 2; replace-tabs on;
|