kexisimpleprintpreviewwindow.cpp
1/* This file is part of the KDE project
2 Copyright (C) 2005 Jaroslaw Staniek <js@iidea.pl>
3
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation; either
7 version 2 of the License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this program; see the file COPYING. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18*/
19
20#include "kexisimpleprintpreviewwindow.h"
21#include "kexisimpleprintingengine.h"
22#include "kexisimpleprintpreviewwindow_p.h"
23#include <kexi_version.h>
24
25#include <tqlayout.h>
26#include <tqaccel.h>
27#include <tqtimer.h>
28#include <tqlabel.h>
29
30#include <kdialogbase.h>
31#include <tdetoolbarbutton.h>
32#include <tdelocale.h>
33#include <kiconloader.h>
34#include <kdebug.h>
35#include <kpushbutton.h>
36#include <tdeapplication.h>
37
38KexiSimplePrintPreviewView::KexiSimplePrintPreviewView(
39 TQWidget *parent, KexiSimplePrintPreviewWindow *window)
40 : TQWidget(parent, "KexiSimplePrintPreviewView", WStaticContents)//|WNoAutoErase)
41 , m_window(window)
42{
43 enablePainting = false;
44// resize(300,400);
45// resizeContents(200, 400);
46}
47
48void KexiSimplePrintPreviewView::paintEvent( TQPaintEvent *pe )
49{
50 Q_UNUSED(pe);
51 if (!enablePainting)
52 return;
53 TQPixmap pm(size()); //dbl buffered
54 TQPainter p;
55 p.begin(&pm, this);
57 p.fillRect(TQRect(TQPoint(0,0),pm.size()), TQBrush(white));//pe->rect(), TQBrush(white));
58 if (m_window->currentPage()>=0)
59 m_window->m_engine.paintPage(m_window->currentPage(), p);
60// emit m_window->paintingPageRequested(m_window->currentPage(), p);
61 p.end();
62 bitBlt(this, 0, 0, &pm);
63}
64
65//--------------------------
66
67#define KexiSimplePrintPreviewScrollView_MARGIN KDialogBase::marginHint()
68
69KexiSimplePrintPreviewScrollView::KexiSimplePrintPreviewScrollView(
71 : TQScrollView(window, "scrollview", WStaticContents|WNoAutoErase)
72 , m_window(window)
73{
74// this->settings = settings;
75 widget = new KexiSimplePrintPreviewView(viewport(), m_window);
76
77/* int widthMM = KoPageFormat::width(
78 settings.pageLayout.format, settings.pageLayout.orientation);
79 int heightMM = KoPageFormat::height(
80 settings.pageLayout.format, settings.pageLayout.orientation);
81// int constantHeight = 400;
82// widget->resize(constantHeight * widthMM / heightMM, constantHeight ); //keep aspect
83*/
84 addChild(widget);
85}
86
87void KexiSimplePrintPreviewScrollView::resizeEvent( TQResizeEvent *re )
88{
89 TQScrollView::resizeEvent(re);
90// kdDebug() << re->size().width() << " " << re->size().height() << endl;
91// kdDebug() << contentsWidth() << " " << contentsHeight() << endl;
92// kdDebug() << widget->width() << " " << widget->height() << endl;
93 setUpdatesEnabled(false);
94 if (re->size().width() > (widget->width()+2*KexiSimplePrintPreviewScrollView_MARGIN)
95 || re->size().height() > (widget->height()+2*KexiSimplePrintPreviewScrollView_MARGIN))
96 {
97 resizeContents(
98 TQMAX(re->size().width(), widget->width()+2*KexiSimplePrintPreviewScrollView_MARGIN),
99 TQMAX(re->size().height(), widget->height()+2*KexiSimplePrintPreviewScrollView_MARGIN));
100 int vscrbarWidth = verticalScrollBar()->isVisible() ? verticalScrollBar()->width() : 0;
101 int newContentsWidth
102 = TQMAX(re->size().width(), widget->width()+2*KexiSimplePrintPreviewScrollView_MARGIN);
103 int newContentsHeight
104 = TQMAX(re->size().height(), widget->height()+2*KexiSimplePrintPreviewScrollView_MARGIN);
105 moveChild(widget, (newContentsWidth - vscrbarWidth - widget->width())/2,
106 (newContentsHeight - widget->height())/2);
107 resizeContents( newContentsWidth, newContentsHeight );
108 }
109 setUpdatesEnabled(true);
110}
111
112void KexiSimplePrintPreviewScrollView::setFullWidth()
113{
114 viewport()->setUpdatesEnabled(false);
115 double widthMM = KoPageFormat::width(
116 m_window->settings().pageLayout.format,
117 m_window->settings().pageLayout.orientation);
118 double heightMM = KoPageFormat::height(
119 m_window->settings().pageLayout.format, m_window->settings().pageLayout.orientation);
120// int constantWidth = m_window->width()- KexiSimplePrintPreviewScrollView_MARGIN*6;
121 double constantWidth = width()- KexiSimplePrintPreviewScrollView_MARGIN*6;
122 double heightForWidth = constantWidth * heightMM / widthMM;
123// heightForWidth = TQMIN(kapp->desktop()->height()*4/5, heightForWidth);
124 kdDebug() << "1: " << heightForWidth << endl;
125#if 0 //todo we can use this if we want to fix the height to width of the page
126 heightForWidth = TQMIN(height(), heightForWidth);
127 kdDebug() << "2: " << heightForWidth << endl;
128#endif
129 constantWidth = heightForWidth * widthMM / heightMM;
130 widget->resize((int)constantWidth, (int)heightForWidth); //keep aspect
131 resizeContents(int(widget->width() + 2*KexiSimplePrintPreviewScrollView_MARGIN),
132 int(widget->height() + 2*KexiSimplePrintPreviewScrollView_MARGIN));
133 moveChild(widget, (contentsWidth()-widget->width())/2,
134 (contentsHeight()-widget->height())/2);
135 viewport()->setUpdatesEnabled(true);
136 resize(size()+TQSize(1,1)); //to update pos.
137 widget->enablePainting = true;
138 widget->repaint();
139}
140
141void KexiSimplePrintPreviewScrollView::setContentsPos(int x, int y)
142{
143// kdDebug() << "############" << x << " " << y << " " << contentsX()<< " " <<contentsY() << endl;
144 if (x<0 || y<0) //to avoid endless loop on Linux
145 return;
146 TQScrollView::setContentsPos(x,y);
147}
148
149//------------------
150
152 KexiSimplePrintingEngine &engine, const TQString& previewName,
153 TQWidget *parent, WFlags f)
154 : TQWidget(parent, "KexiSimplePrintPreviewWindow", f)
155 , m_engine(engine)
156 , m_settings(*m_engine.settings())
157 , m_pageNumber(-1)
158 , m_pagesCount(-1)
159{
160 setCaption(i18n("%1 - Print Preview - %2").arg(previewName).arg(KEXI_APP_NAME));
161 setIcon(DesktopIcon("document-print-preview"));
162 TQVBoxLayout *lyr = new TQVBoxLayout(this, 6);
163
164 int id;
165 m_toolbar = new TDEToolBar(0, this);
166 m_toolbar->setLineWidth(0);
167 m_toolbar->setFrameStyle(TQFrame::NoFrame);
168 m_toolbar->setIconText(TDEToolBar::IconTextRight);
169 lyr->addWidget(m_toolbar);
170
171 id = m_toolbar->insertWidget( -1, 0, new KPushButton(KStdGuiItem::print(), m_toolbar) );
172 m_toolbar->addConnection(id, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotPrintClicked()));
173 static_cast<KPushButton*>(m_toolbar->getWidget(id))->setAccel(TQt::CTRL|TQt::Key_P);
174 m_toolbar->insertSeparator();
175
176 id = m_toolbar->insertWidget(-1, 0, new KPushButton(i18n("Page Set&up..."), m_toolbar));
177 m_toolbar->addConnection(id, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotPageSetup()));
178 m_toolbar->insertSeparator();
179
180
181#ifndef KEXI_NO_UNFINISHED
183 id = m_toolbar->insertWidget( -1, 0, new KPushButton(BarIconSet("zoom-in"), i18n("Zoom In"), m_toolbar));
184 m_toolbar->addConnection(id, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotZoomInClicked()));
185 m_toolbar->insertSeparator();
186
187 id = m_toolbar->insertWidget( -1, 0, new KPushButton(BarIconSet("zoom-out"), i18n("Zoom Out"), m_toolbar));
188 m_toolbar->addConnection(id, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotZoomOutClicked()));
189 m_toolbar->insertSeparator();
190#endif
191
192 id = m_toolbar->insertWidget(-1, 0, new KPushButton(KStdGuiItem::close(), m_toolbar));
193 m_toolbar->addConnection(id, TQ_SIGNAL(clicked()), this, TQ_SLOT(close()));
194 m_toolbar->alignItemRight(id);
195
196 m_scrollView = new KexiSimplePrintPreviewScrollView(this);
197 m_scrollView->setUpdatesEnabled(false);
198 m_view = m_scrollView->widget;
199 m_scrollView->setSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::Minimum);
200 lyr->addWidget(m_scrollView);
201
202 TQWidget* navToolbarWidget = new TQWidget(this); //widget used to center the navigator toolbar
203 navToolbarWidget->setSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::Fixed);
204 TQHBoxLayout *navToolbarLyr = new TQHBoxLayout(navToolbarWidget);
205 lyr->addWidget(navToolbarWidget);
206
207 m_navToolbar = new TDEToolBar(0, navToolbarWidget);
208 navToolbarLyr->addStretch(1);
209 navToolbarLyr->addWidget(m_navToolbar);
210 navToolbarLyr->addStretch(1);
211// m_navToolbar->setFullWidth(true);
212 m_navToolbar->setLineWidth(0);
213 m_navToolbar->setFrameStyle(TQFrame::NoFrame);
214 m_navToolbar->setIconText(TDEToolBar::IconTextRight);
215
216 m_idFirst = m_navToolbar->insertWidget( -1, 0, new KPushButton(BarIconSet("go-first"), i18n("First Page"), m_navToolbar));
217 m_navToolbar->addConnection(m_idFirst, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotFirstClicked()));
218 m_navToolbar->insertSeparator();
219
220 m_idPrevious = m_navToolbar->insertWidget( -1, 0, new KPushButton(BarIconSet("go-previous"), i18n("Previous Page"), m_navToolbar));
221 m_navToolbar->addConnection(m_idPrevious, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotPreviousClicked()));
222 m_navToolbar->insertSeparator();
223
224 m_idPageNumberLabel = m_navToolbar->insertWidget( -1, 0, new TQLabel(m_navToolbar));
225 m_navToolbar->insertSeparator();
226
227 m_idNext = m_navToolbar->insertWidget( -1, 0, new KPushButton(BarIconSet("go-next"), i18n("Next Page"), m_navToolbar));
228 m_navToolbar->addConnection(m_idNext, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotNextClicked()));
229 m_navToolbar->insertSeparator();
230
231 m_idLast = m_navToolbar->insertWidget( -1, 0, new KPushButton(BarIconSet("go-last"), i18n("Last Page"), m_navToolbar));
232 m_navToolbar->addConnection(m_idLast, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotLastClicked()));
233 m_navToolbar->insertSeparator();
234
235 resize(width(), kapp->desktop()->height()*4/5);
236
238
239 TQTimer::singleShot(50, this, TQ_SLOT(initLater()));
240}
241
242void KexiSimplePrintPreviewWindow::initLater()
243{
244 setFullWidth();
245 updatePagesCount();
246 goToPage(0);
247}
248
249KexiSimplePrintPreviewWindow::~KexiSimplePrintPreviewWindow()
250{
251}
252
253/*void KexiSimplePrintPreviewWindow::setPagesCount(int pagesCount)
254{
255 m_pagesCount = pagesCount;
256 goToPage(0);
257}*/
258
259void KexiSimplePrintPreviewWindow::slotPrintClicked()
260{
261 hide();
262 emit printRequested();
263 show();
264 raise();
265}
266
267void KexiSimplePrintPreviewWindow::slotPageSetup()
268{
269 lower();
270 emit pageSetupRequested();
271}
272
277
282
283void KexiSimplePrintPreviewWindow::slotFirstClicked()
284{
285 goToPage(0);
286}
287
288void KexiSimplePrintPreviewWindow::slotPreviousClicked()
289{
290 goToPage(m_pageNumber-1);
291}
292
293void KexiSimplePrintPreviewWindow::slotNextClicked()
294{
295 goToPage(m_pageNumber+1);
296}
297
298void KexiSimplePrintPreviewWindow::slotLastClicked()
299{
300 goToPage(m_engine.pagesCount()-1);
301}
302
303void KexiSimplePrintPreviewWindow::goToPage(int pageNumber)
304{
305 if ((pageNumber==m_pageNumber && m_pagesCount == (int)m_engine.pagesCount())
306 || pageNumber < 0 || pageNumber > ((int)m_engine.pagesCount()-1))
307 return;
308 m_pageNumber = pageNumber;
309 m_pagesCount = m_engine.pagesCount();
310
311 m_view->repaint(); //this will automatically paint a new page
312
313 m_navToolbar->setItemEnabled(m_idNext, pageNumber < ((int)m_engine.pagesCount()-1));
314 m_navToolbar->setItemEnabled(m_idLast, pageNumber < ((int)m_engine.pagesCount()-1));
315 m_navToolbar->setItemEnabled(m_idPrevious, pageNumber > 0);
316 m_navToolbar->setItemEnabled(m_idFirst, pageNumber > 0);
317 static_cast<TQLabel*>(m_navToolbar->getWidget(m_idPageNumberLabel))->setText(
318 i18n("Page (number) of (total)", "Page %1 of %2").arg(m_pageNumber+1).arg(m_engine.pagesCount()));
319}
320
321void KexiSimplePrintPreviewWindow::setFullWidth()
322{
323 m_scrollView->setFullWidth();
324}
325
326void KexiSimplePrintPreviewWindow::updatePagesCount()
327{
328 TQPixmap pm(m_view->size()); //dbl buffered
329 TQPainter p(m_view);
330 //p.begin(&pm, this);
332// p.fillRect(pe->rect(), TQBrush(white));
333 m_engine.calculatePagesCount(p);
334 p.end();
335}
336
337bool KexiSimplePrintPreviewWindow::event( TQEvent * e )
338{
339 TQEvent::Type t = e->type();
340 if (t==TQEvent::KeyPress) {
341 TQKeyEvent *ke = static_cast<TQKeyEvent*>(e);
342 const int k = ke->key();
343 bool ok = true;
344 if (k==TQt::Key_Equal || k==TQt::Key_Plus)
346 else if (k==TQt::Key_Minus)
348 else if (k==TQt::Key_Home)
349 slotFirstClicked();
350 else if (k==TQt::Key_End)
351 slotLastClicked();
352 else
353 ok = false;
354
355 if (ok) {
356 ke->accept();
357 return true;
358 }
359 }
360 else if (t==TQEvent::AccelOverride) {
361 TQKeyEvent *ke = static_cast<TQKeyEvent*>(e);
362 const int k = ke->key();
363 bool ok = true;
364 if (k==TQt::Key_PageUp)
365 slotPreviousClicked();
366 else if (k==TQt::Key_PageDown)
367 slotNextClicked();
368 else
369 ok = false;
370
371 if (ok) {
372 ke->accept();
373 return true;
374 }
375 }
376 return TQWidget::event(e);
377}
378
379
380#include "kexisimpleprintpreviewwindow.moc"
381#include "kexisimpleprintpreviewwindow_p.moc"
A window for displaying print preview for simple printing.
int m_pagesCount
needed to know that pages could has been changed
KexiSimplePrintPreviewWindow(KexiSimplePrintingEngine &engine, const TQString &previewName, TQWidget *parent, WFlags f=0)
An engine painting data on pages using TQPainter. The engine allows for random access to any page.
void calculatePagesCount(TQPainter &painter)
Calculates pafe count that can be later obtained using pagesCount().