Preview printing

This commit is contained in:
dockes 2009-09-28 18:19:19 +00:00
parent c102bb57c1
commit 09fa4f7f95
3 changed files with 94 additions and 2 deletions

View File

@ -854,6 +854,11 @@ fvwm
associated to the document (ie: author, abtract, etc.). This is associated to the document (ie: author, abtract, etc.). This is
especially useful in cases where the term match did not occur in especially useful in cases where the term match did not occur in
the main text but in one of the fields.</para> the main text but in one of the fields.</para>
<para>You can print the current preview window contents by typing
<keycap>^P</keycap> (<keycap>Ctrl</keycap> + <keycap>P</keycap>) in
the window text.</para>
</sect1> </sect1>
@ -1462,6 +1467,11 @@ fvwm
window and all its tabs.</para> window and all its tabs.</para>
</formalpara> </formalpara>
<formalpara><title>Printing previews</title>
<para>Entering <keycap>^P</keycap> in a preview window will print
the currently displayed text.</para>
</formalpara>
<formalpara><title>Quitting</title> <formalpara><title>Quitting</title>
<para>Entering <keycap>^Q</keycap> almost anywhere will <para>Entering <keycap>^Q</keycap> almost anywhere will
close the application.</para> close the application.</para>

View File

@ -33,18 +33,28 @@ using std::pair;
#include <qvariant.h> #include <qvariant.h>
#include <qpushbutton.h> #include <qpushbutton.h>
#include <qtabwidget.h> #include <qtabwidget.h>
#include <qprinter.h>
#include <qprintdialog.h>
#if (QT_VERSION < 0x040000) #if (QT_VERSION < 0x040000)
#include <qtextedit.h> #include <qtextedit.h>
#include <qpopupmenu.h> #include <qpopupmenu.h>
#include <qprogressdialog.h> #include <qprogressdialog.h>
#define THRFINISHED finished #define THRFINISHED finished
#include <qpaintdevicemetrics.h>
#include <qsimplerichtext.h>
#else #else
#include <q3popupmenu.h> #include <q3popupmenu.h>
#include <q3textedit.h> #include <q3textedit.h>
#include <q3progressdialog.h> #include <q3progressdialog.h>
#include <q3stylesheet.h> #include <q3stylesheet.h>
#include <q3paintdevicemetrics.h>
#define QPaintDeviceMetrics Q3PaintDeviceMetrics
#include <q3simplerichtext.h>
#define QSimpleRichText Q3SimpleRichText
#define THRFINISHED isFinished #define THRFINISHED isFinished
#endif #endif
#include <qevent.h> #include <qevent.h>
#include <qlabel.h> #include <qlabel.h>
#include <qlineedit.h> #include <qlineedit.h>
@ -204,6 +214,8 @@ void Preview::init()
connect(pvTab, SIGNAL(currentChanged(QWidget *)), connect(pvTab, SIGNAL(currentChanged(QWidget *)),
this, SLOT(currentChanged(QWidget *))); this, SLOT(currentChanged(QWidget *)));
connect(bt, SIGNAL(clicked()), this, SLOT(closeCurrentTab())); connect(bt, SIGNAL(clicked()), this, SLOT(closeCurrentTab()));
connect(this, SIGNAL(printCurrentPreviewRequest()),
this, SLOT(printCurrent()));
m_dynSearchActive = false; m_dynSearchActive = false;
m_canBeep = true; m_canBeep = true;
@ -266,6 +278,11 @@ bool Preview::eventFilter(QObject *target, QEvent *event)
// LOGDEB(("Preview::eventFilter: got ^W\n")); // LOGDEB(("Preview::eventFilter: got ^W\n"));
closeCurrentTab(); closeCurrentTab();
return true; return true;
} else if (keyEvent->key() == Qt::Key_P &&
(keyEvent->state() & Qt::ControlButton)) {
// LOGDEB(("Preview::eventFilter: got ^P\n"));
emit(printCurrentPreviewRequest());
return true;
} else if (m_dynSearchActive) { } else if (m_dynSearchActive) {
if (keyEvent->key() == Qt::Key_F3) { if (keyEvent->key() == Qt::Key_F3) {
doSearch(searchTextLine->text(), true, false); doSearch(searchTextLine->text(), true, false);
@ -449,6 +466,64 @@ void Preview::currentChanged(QWidget * tw)
emit(previewExposed(this, m_searchId, d->docnum)); emit(previewExposed(this, m_searchId, d->docnum));
} }
void Preview::printCurrent()
{
PreviewTextEdit *edit = Preview::getCurrentEditor();
if (edit == 0)
return;
TabData *d = tabDataForCurrent();
if (d == 0)
return;
#ifndef QT_NO_PRINTER
QPrinter printer;
QPrintDialog *dialog = new QPrintDialog(&printer, this);
#if (QT_VERSION >= 0x040000)
dialog->setWindowTitle(tr("Print Current Preview"));
#endif
if (dialog->exec() != QDialog::Accepted)
return;
// A qt4 version of this would just be :
// edit->document()->print(&printer); But as we are using a
// q3textedit, we have to do the q3 printing dance, even under
// qt4. The following code is taken from
// qt3/examples/textdrawing/qtextedit.cpp
printer.setFullPage(TRUE);
QPaintDeviceMetrics screen( edit );
printer.setResolution( screen.logicalDpiY() );
QPainter p( &printer );
QPaintDeviceMetrics metrics( p.device() );
int dpix = metrics.logicalDpiX();
int dpiy = metrics.logicalDpiY();
const int margin = 72; // pt
QRect body( margin * dpix / 72, margin * dpiy / 72,
metrics.width() - margin * dpix / 72 * 2,
metrics.height() - margin * dpiy / 72 * 2 );
QFont font( "times", 10 );
// Dont want to use edit->text() here, this is the plain text. We
// want the rich text.
QSimpleRichText richText(d->richtxt, font, edit->context(),
edit->styleSheet(),
edit->mimeSourceFactory(), body.height() );
richText.setWidth( &p, body.width() );
QRect view( body );
int page = 1;
do {
richText.draw( &p, body.left(), body.top(), view, colorGroup() );
view.moveBy( 0, body.height() );
p.translate( 0 , -body.height() );
p.setFont( font );
p.drawText( view.right() - p.fontMetrics().width( QString::number( page ) ),
view.bottom() + p.fontMetrics().ascent() + 5, QString::number( page ) );
if ( view.top() >= richText.height() )
break;
printer.newPage();
page++;
} while (TRUE);
#endif
}
#if (QT_VERSION >= 0x040000) #if (QT_VERSION >= 0x040000)
// I have absolutely no idea why this nonsense is needed to get // I have absolutely no idea why this nonsense is needed to get
// q3textedit to copy to x11 primary selection when text is // q3textedit to copy to x11 primary selection when text is
@ -912,6 +987,7 @@ bool Preview::loadFileInCurrentTab(string fn, size_t sz, const Rcl::Doc &idoc,
item->setColor(prefs.qtermcolor); item->setColor(prefs.qtermcolor);
item->setFontWeight(QFont::Bold); item->setFontWeight(QFont::Bold);
} }
TabData *d = tabDataForCurrent();
prog = 2 * nsteps / 3; prog = 2 * nsteps / 3;
progress.setLabelText(tr("Loading preview text into editor")); progress.setLabelText(tr("Loading preview text into editor"));
@ -923,6 +999,10 @@ bool Preview::loadFileInCurrentTab(string fn, size_t sz, const Rcl::Doc &idoc,
qApp->processEvents(); qApp->processEvents();
editor->append(*it); editor->append(*it);
// We need to save the rich text for printing, the editor does
// not do it for us
if (d)
d->richtxt.append(*it);
// Stay at top // Stay at top
if (instep < 5) { if (instep < 5) {
@ -938,9 +1018,8 @@ bool Preview::loadFileInCurrentTab(string fn, size_t sz, const Rcl::Doc &idoc,
} }
progress.close(); progress.close();
TabData *d = tabDataForCurrent();
if (d) { if (d) {
fdoc.text.clear(); fdoc.text.clear();
d->fdoc = fdoc; d->fdoc = fdoc;
} }
m_haveAnchors = m_plaintorich.lastanchor != 0; m_haveAnchors = m_plaintorich.lastanchor != 0;

View File

@ -74,6 +74,7 @@ class TabData {
// doc out of internfile (previous fields come from the index) with // doc out of internfile (previous fields come from the index) with
// main text erased (for space). // main text erased (for space).
Rcl::Doc fdoc; Rcl::Doc fdoc;
QString richtxt;
TabData(QWidget *wi) TabData(QWidget *wi)
: w(wi), docnum(-1) : w(wi), docnum(-1)
{} {}
@ -141,6 +142,7 @@ public slots:
virtual void closeCurrentTab(); virtual void closeCurrentTab();
virtual void textDoubleClicked(int, int); virtual void textDoubleClicked(int, int);
virtual void selecChanged(); virtual void selecChanged();
virtual void printCurrent();
signals: signals:
void previewClosed(Preview *); void previewClosed(Preview *);
@ -148,6 +150,7 @@ signals:
void showNext(Preview *w, int sid, int docnum); void showNext(Preview *w, int sid, int docnum);
void showPrev(Preview *w, int sid, int docnum); void showPrev(Preview *w, int sid, int docnum);
void previewExposed(Preview *w, int sid, int docnum); void previewExposed(Preview *w, int sid, int docnum);
void printCurrentPreviewRequest();
private: private:
// Identifier of search in main window. This is used to check that // Identifier of search in main window. This is used to check that