kexireportview.cpp
1/* This file is part of the KDE project
2 Copyright (C) 2004 Cedric Pasteur <cedric.pasteur@free.fr>
3 Copyright (C) 2004 Jaroslaw Staniek <js@iidea.pl>
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
19*/
20
21#include "kexireportview.h"
22
23#include <kdebug.h>
24
25#include <form.h>
26#include <formIO.h>
27#include <formmanager.h>
28#include <objecttree.h>
29#include <widgetpropertyset.h>
30#include <container.h>
31
32#include <kexidialogbase.h>
33//#include <kexidatasourcewizard.h>
34#include <kexidb/fieldlist.h>
35#include <kexidb/connection.h>
36
37#include "kexireportform.h"
38#include <utils/kexirecordnavigator.h>
39
40#define NO_DSWIZARD
41
42KexiReportScrollView::KexiReportScrollView(TQWidget *parent, bool preview)
43 : KexiScrollView(parent, preview)
44{
45 if(preview) {
46 setRecordNavigatorVisible(true);
47 recordNavigator()->setLabelText(i18n("Page:"));
48 recordNavigator()->setInsertingButtonVisible(false);
49 }
50 connect(this, TQ_SIGNAL(resizingStarted()), this, TQ_SLOT(slotResizingStarted()));
51}
52
53KexiReportScrollView::~KexiReportScrollView()
54{
55}
56
57void
58KexiReportScrollView::show()
59{
60 KexiScrollView::show();
61
62 //now get resize mode settings for entire form
63 if (m_preview) {
64 KexiReportView* fv = dynamic_cast<KexiReportView*>(parent());
65 int resizeMode = fv ? fv->resizeMode() : KexiReportView::ResizeAuto;
66 if (resizeMode == KexiReportView::ResizeAuto)
67 setResizePolicy(AutoOneFit);
68 }
69}
70
71void
72KexiReportScrollView::slotResizingStarted()
73{
75 setSnapToGrid(KFormDesigner::FormManager::self()->snapWidgetsToGrid(), m_form->gridSize());
76 else
77 setSnapToGrid(false);
78}
79
82
83KexiReportView::KexiReportView(KexiMainWindow *win, TQWidget *parent, const char *name,
85 : KexiViewBase(win, parent, name), m_propertySet(0), m_conn(conn)
86 , m_resizeMode(KexiReportView::ResizeDefault)
87{
88 TQHBoxLayout *l = new TQHBoxLayout(this);
89 l->setAutoAdd(true);
90
91 m_scrollView = new KexiReportScrollView(this, viewMode()==Kexi::DataViewMode);
92 setViewWidget(m_scrollView);
93// m_scrollView->show();
94
95 m_reportform = new KexiReportForm(m_scrollView->viewport(), name/*, conn*/);
96// m_reportform->resize(TQSize(400, 300));
97 m_scrollView->setWidget(m_reportform);
98 m_scrollView->setResizingEnabled(viewMode()!=Kexi::DataViewMode);
99
100// initForm();
101
102 if (viewMode()==Kexi::DataViewMode) {
103 m_scrollView->viewport()->setPaletteBackgroundColor(m_reportform->palette().active().background());
104#if 0
105 connect(reportPart()->manager(), TQ_SIGNAL(noFormSelected()), TQ_SLOT(slotNoFormSelected()));
106#endif
107 }
108 else {
109 connect(KFormDesigner::FormManager::self(), TQ_SIGNAL(propertySetSwitched(KoProperty::Set *, bool)),
110 this, TQ_SLOT(slotPropertySetSwitched(KoProperty::Set *, bool)));
111 connect(KFormDesigner::FormManager::self(), TQ_SIGNAL(dirty(KFormDesigner::Form *, bool)),
112 this, TQ_SLOT(slotDirty(KFormDesigner::Form *, bool)));
113
114 // action stuff
115 /*connect(reportPart()->manager(), TQ_SIGNAL(widgetSelected(KFormDesigner::Form*, bool)), TQ_SLOT(slotWidgetSelected(KFormDesigner::Form*, bool)));
116 connect(reportPart()->manager(), TQ_SIGNAL(formWidgetSelected(KFormDesigner::Form*)), TQ_SLOT(slotFormWidgetSelected(KFormDesigner::Form*)));
117 connect(reportPart()->manager(), TQ_SIGNAL(undoEnabled(bool, const TQString&)), this, TQ_SLOT(setUndoEnabled(bool)));
118 connect(reportPart()->manager(), TQ_SIGNAL(redoEnabled(bool, const TQString&)), this, TQ_SLOT(setRedoEnabled(bool)));*/
119
120 plugSharedAction("edit_copy", KFormDesigner::FormManager::self(), TQ_SLOT(copyWidget()));
121 plugSharedAction("edit_cut", KFormDesigner::FormManager::self(), TQ_SLOT(cutWidget()));
122 plugSharedAction("edit_paste", KFormDesigner::FormManager::self(), TQ_SLOT(pasteWidget()));
123 plugSharedAction("edit_delete", KFormDesigner::FormManager::self(), TQ_SLOT(deleteWidget()));
124 plugSharedAction("edit_select_all", KFormDesigner::FormManager::self(), TQ_SLOT(selectAll()));
125 plugSharedAction("reportpart_clear_contents", KFormDesigner::FormManager::self(), TQ_SLOT(clearWidgetContent()));
126 plugSharedAction("edit_undo", KFormDesigner::FormManager::self(), TQ_SLOT(undo()));
127 plugSharedAction("edit_redo", KFormDesigner::FormManager::self(), TQ_SLOT(redo()));
128
129 plugSharedAction("reportpart_format_raise", KFormDesigner::FormManager::self(), TQ_SLOT(bringWidgetToFront()) );
130 plugSharedAction("reportpart_format_lower", KFormDesigner::FormManager::self(), TQ_SLOT(sendWidgetToBack()) );
131
132 plugSharedAction("reportpart_align_menu", KFormDesigner::FormManager::self(), 0 );
133 plugSharedAction("reportpart_align_to_left", KFormDesigner::FormManager::self(),TQ_SLOT(alignWidgetsToLeft()) );
134 plugSharedAction("reportpart_align_to_right", KFormDesigner::FormManager::self(), TQ_SLOT(alignWidgetsToRight()) );
135 plugSharedAction("reportpart_align_to_top", KFormDesigner::FormManager::self(), TQ_SLOT(alignWidgetsToTop()) );
136 plugSharedAction("reportpart_align_to_bottom", KFormDesigner::FormManager::self(), TQ_SLOT(alignWidgetsToBottom()) );
137 plugSharedAction("reportpart_align_to_grid", KFormDesigner::FormManager::self(), TQ_SLOT(alignWidgetsToGrid()) );
138
139 plugSharedAction("reportpart_adjust_size_menu", KFormDesigner::FormManager::self(), 0 );
140 plugSharedAction("reportpart_adjust_to_fit", KFormDesigner::FormManager::self(), TQ_SLOT(adjustWidgetSize()) );
141 plugSharedAction("reportpart_adjust_size_grid", KFormDesigner::FormManager::self(), TQ_SLOT(adjustSizeToGrid()) );
142 plugSharedAction("reportpart_adjust_height_small", KFormDesigner::FormManager::self(), TQ_SLOT(adjustHeightToSmall()) );
143 plugSharedAction("reportpart_adjust_height_big", KFormDesigner::FormManager::self(), TQ_SLOT(adjustHeightToBig()) );
144 plugSharedAction("reportpart_adjust_width_small", KFormDesigner::FormManager::self(), TQ_SLOT(adjustWidthToSmall()) );
145 plugSharedAction("reportpart_adjust_width_big", KFormDesigner::FormManager::self(), TQ_SLOT(adjustWidthToBig()) );
146 }
147
148 initForm();
149
150 connect(this, TQ_SIGNAL(focus(bool)), this, TQ_SLOT(slotFocus(bool)));
152// m_reportform->resize( m_reportform->size()+TQSize(m_scrollView->verticalScrollBar()->width(), m_scrollView->horizontalScrollBar()->height()) );
153}
154
155KexiReportView::~KexiReportView()
156{
157 // Important: form window is closed.
158 // Set property set to 0 because there is *only one* instance of a property set class
159 // in Kexi, so the main window wouldn't know the set in fact has been changed.
160 m_propertySet = 0;
162}
163
165KexiReportView::form() const
166{
167 if(viewMode()==Kexi::DataViewMode)
168 return tempData()->previewForm;
169 else
170 return tempData()->form;
171}
172
173void
174KexiReportView::setForm(KFormDesigner::Form *f)
175{
176 if(viewMode()==Kexi::DataViewMode)
177 tempData()->previewForm = f;
178 else
179 tempData()->form = f;
180}
181
182void
183KexiReportView::initForm()
184{
186 form()->createToplevel(m_reportform, m_reportform);
187
188 // Show the form wizard if this is a new Form
189// KexiDB::FieldList *fields = 0;
190 if(parentDialog()->id() < 0)
191 {
192#ifndef NO_DSWIZARD
193 KexiDataSourceWizard *w = new KexiDataSourceWizard(mainWin(), (TQWidget*)mainWin(), "datasource_wizard");
194 if(!w->exec())
195 fields = 0;
196 else
197 fields = w->fields();
198 delete w;
199#endif
200 }
201
202/* if(fields)
203 {
204 @todo generate a report from a table or a query
205 TQDomDocument dom;
206 reportPart()->generateForm(fields, dom);
207 KFormDesigner::FormIO::loadFormFromDom(form(), m_reportform, dom);
208 }
209 else*/
210 loadForm();
211
212 KFormDesigner::FormManager::self()->importForm(form(), viewMode()==Kexi::DataViewMode);
213 m_scrollView->setForm(form());
214 m_scrollView->refreshContentsSize();
215}
216
217void
218KexiReportView::loadForm()
219{
220
221//@todo also load m_resizeMode !
222
223 kexipluginsdbg << "KexiReportForm::loadForm() Loading the form with id : " << parentDialog()->id() << endl;
224 // If we are previewing the Form, use the tempData instead of the form stored in the db
225 if(viewMode()==Kexi::DataViewMode && !tempData()->tempForm.isNull() ) {
226 KFormDesigner::FormIO::loadFormFromString(form(), m_reportform, tempData()->tempForm);
227 return;
228 }
229
230 // normal load
231 TQString data;
232 loadDataBlock(data);
233 KFormDesigner::FormIO::loadFormFromString(form(), m_reportform, data);
234}
235
236void
237KexiReportView::slotPropertySetSwitched(KoProperty::Set *set, bool forceReload)
238{
239 m_propertySet = set;
240 if (forceReload)
241 propertySetReloaded(true/*preservePrevSelection*/);
242 else
244}
245
247KexiReportView::beforeSwitchTo(int mode, bool &dontStore)
248{
249 if (mode!=viewMode() && viewMode()!=Kexi::DataViewMode) {
250 //remember our pos
251 tempData()->scrollViewContentsPos
252 = TQPoint(m_scrollView->contentsX(), m_scrollView->contentsY());
253 }
254
255 // we don't store on db, but in our TempData
256 dontStore = true;
257 if(dirty() && (mode == Kexi::DataViewMode) && form()->objectTree())
258 KFormDesigner::FormIO::saveFormToString(form(), tempData()->tempForm);
259
260 return true;
261}
262
265{
266 if (mode != 0 && mode != Kexi::DesignViewMode) {
267 //preserve contents pos after switching to other view
268 m_scrollView->setContentsPos(tempData()->scrollViewContentsPos.x(),
269 tempData()->scrollViewContentsPos.y());
270 }
271// if (mode == Kexi::DesignViewMode) {
272 //m_scrollView->move(0,0);
273 //m_scrollView->setContentsPos(0,0);
274 //m_scrollView->moveChild(m_reportform, 0, 0);
275// }
276
277 if((mode == Kexi::DesignViewMode) && viewMode()==Kexi::DataViewMode) {
278 // The form may have been modified, so we must recreate the preview
279 delete m_reportform; // also deletes form()
280 m_reportform = new KexiReportForm(m_scrollView->viewport());
281 m_scrollView->setWidget(m_reportform);
282
283 initForm();
284#if 0
285 slotNoFormSelected();
286#endif
287
288 //reset position
289 m_scrollView->setContentsPos(0,0);
290 m_reportform->move(0,0);
291 }
292 return true;
293}
294
295void
296KexiReportView::slotDirty(KFormDesigner::Form *dirtyForm, bool isDirty)
297{
298 if(dirtyForm == form())
299 KexiViewBase::setDirty(isDirty);
300}
301
304{
306 kexipluginsdbg << "KexiReportForm::storeNewData(): new id:" << s->id() << endl;
307
308 if (!s || cancel) {
309 delete s;
310 return 0;
311 }
312 if (!storeData()) {
313 //failure: remove object's schema data to avoid garbage
314 m_conn->removeObject( s->id() );
315 delete s;
316 return 0;
317 }
318 return s;
319}
320
323{
324 Q_UNUSED(dontAsk)
325 kexipluginsdbg << "KexiReportForm::storeData(): " << parentDialog()->partItem()->name() << " [" << parentDialog()->id() << "]" << endl;
326 TQString data;
327 KFormDesigner::FormIO::saveFormToString(tempData()->form, data);
328 if (!storeDataBlock(data))
329 return false;
330 tempData()->tempForm = TQString();
331
332 return true;
333}
334
335#if 0
337void
338KexiReportView::slotWidgetSelected(KFormDesigner::Form *f, bool multiple)
339{
340 if(f != form())
341 return;
342
343 enableFormActions();
344 // Enable edit actions
345 setAvailable("edit_copy", true);
346 setAvailable("edit_cut", true);
347 setAvailable("edit_clear", true);
348
349 // 'Align Widgets' menu
350 setAvailable("reportpart_align_menu", multiple);
351 setAvailable("reportpart_align_to_left", multiple);
352 setAvailable("reportpart_align_to_right", multiple);
353 setAvailable("reportpart_align_to_top", multiple);
354 setAvailable("reportpart_align_to_bottom", multiple);
355
356 setAvailable("reportpart_adjust_size_menu", true);
357 setAvailable("reportpart_adjust_width_small", multiple);
358 setAvailable("reportpart_adjust_width_big", multiple);
359 setAvailable("reportpart_adjust_height_small", multiple);
360 setAvailable("reportpart_adjust_height_big", multiple);
361
362 setAvailable("reportpart_format_raise", true);
363 setAvailable("reportpart_format_lower", true);
364}
365
366void
367KexiReportView::slotFormWidgetSelected(KFormDesigner::Form *f)
368{
369 if(f != form())
370 return;
371
372 disableWidgetActions();
373 enableFormActions();
374}
375
376void
377KexiReportView::slotNoFormSelected() // == form in preview mode
378{
379 disableWidgetActions();
380
381 // Disable paste action
382 setAvailable("edit_paste", false);
383 setAvailable("edit_undo", false);
384 setAvailable("edit_redo", false);
385}
386
387void
388KexiReportView::enableFormActions()
389{
390 setAvailable("edit_paste", KFormDesigner::FormManager::self()->isPasteEnabled());
391}
392
393void
394KexiReportView::disableWidgetActions()
395{
396 // Disable edit actions
397 setAvailable("edit_copy", false);
398 setAvailable("edit_cut", false);
399 setAvailable("edit_clear", false);
400
401 // Disable format functions
402 setAvailable("reportpart_align_menu", false);
403 setAvailable("reportpart_align_to_left", false);
404 setAvailable("reportpart_align_to_right", false);
405 setAvailable("reportpart_align_to_top", false);
406 setAvailable("reportpart_align_to_bottom", false);
407
408 setAvailable("reportpart_adjust_size_menu", false);
409 setAvailable("reportpart_adjust_width_small", false);
410 setAvailable("reportpart_adjust_width_big", false);
411 setAvailable("reportpart_adjust_height_small", false);
412 setAvailable("reportpart_adjust_height_big", false);
413
414 setAvailable("reportpart_format_raise", false);
415 setAvailable("reportpart_format_lower", false);
416}
417
418void
419KexiReportView::setUndoEnabled(bool enabled)
420{
421 setAvailable("edit_undo", enabled);
422}
423
424void
425KexiReportView::setRedoEnabled(bool enabled)
426{
427 setAvailable("edit_redo", enabled);
428}
429#endif
430
431TQSize
432KexiReportView::preferredSizeHint(const TQSize& otherSize)
433{
434 return (m_reportform->size()
435 +TQSize(m_scrollView->verticalScrollBar()->isVisible() ? m_scrollView->verticalScrollBar()->width()*3/2 : 10,
436 m_scrollView->horizontalScrollBar()->isVisible() ? m_scrollView->horizontalScrollBar()->height()*3/2 : 10))
437 .expandedTo( KexiViewBase::preferredSizeHint(otherSize) );
438}
439
440void
441KexiReportView::resizeEvent( TQResizeEvent *e )
442{
443 if (viewMode()==Kexi::DataViewMode) {
444 m_scrollView->refreshContentsSizeLater(
445 e->size().width()!=e->oldSize().width(),
446 e->size().height()!=e->oldSize().height()
447 );
448 }
449 KexiViewBase::resizeEvent(e);
450 m_scrollView->updateNavPanelGeometry();
451}
452
453void
455{
456 KexiViewBase::show();
457
458//moved from KexiFormScrollView::show():
459
460 //now get resize mode settings for entire form
461 // if (resizeMode() == KexiFormView::ResizeAuto)
462 if (viewMode()==Kexi::DataViewMode) {
463 if (resizeMode() == ResizeAuto)
464 m_scrollView->setResizePolicy(TQScrollView::AutoOneFit);
465 }
466}
467
468void
469KexiReportView::slotFocus(bool in)
470{
471 if(in && form() && KFormDesigner::FormManager::self() && KFormDesigner::FormManager::self()->activeForm() != form())
472 KFormDesigner::FormManager::self()->windowChanged(form()->widget());//m_dbform);
473}
474
475
476#include "kexireportview.moc"
477
void importForm(Form *form=0, bool preview=false)
static FormManager * self()
Access to FormManager singleton.
void windowChanged(TQWidget *w)
A simple class representing a form.
Definition form.h:136
void createToplevel(TQWidget *container, FormWidget *formWidget=0, const TQCString &classname="TQWidget")
Definition form.cpp:127
void plugSharedAction(const char *action_name, TQObject *receiver, const char *slot)
Provides database connection, allowing queries and data modification.
Definition connection.h:62
bool removeObject(uint objId)
KexiPart::Item * partItem() const
Kexi's main window interface This interface is implemented by KexiMainWindowImpl class.
The report top widget.
static KFormDesigner::WidgetLibrary * library()
The FormPart's view.
virtual tristate storeData(bool dontAsk=false)
virtual TQSize preferredSizeHint(const TQSize &otherSize)
virtual KexiDB::SchemaData * storeNewData(const KexiDB::SchemaData &sdata, bool &cancel)
virtual tristate beforeSwitchTo(int mode, bool &dontStore)
virtual void show()
virtual tristate afterSwitchFrom(int mode)
KexiReportView(KexiMainWindow *win, TQWidget *parent, const char *name, KexiDB::Connection *conn)
The scrollview which includes KexiDBForm.
Base class for single view embeddable of in KexiDialogBase.
virtual bool dirty() const
virtual KexiDB::SchemaData * storeNewData(const KexiDB::SchemaData &sdata, bool &cancel)
virtual void setAvailable(const char *action_name, bool set)
virtual void propertySetSwitched()
void propertySetReloaded(bool preservePrevSelection=false, const TQCString &propertyToSelect=TQCString())
int viewMode() const
bool storeDataBlock(const TQString &dataString, const TQString &dataID=TQString())
bool loadDataBlock(TQString &dataString, const TQString &dataID=TQString(), bool canBeEmpty=false)
KexiDialogBase * parentDialog() const
virtual TQSize preferredSizeHint(const TQSize &otherSize)
KexiMainWindow * mainWin() const
3-state logical type with three values: true, false and cancelled and convenient operators.
Definition tristate.h:100