00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "kexireportview.h"
00022
00023 #include <kdebug.h>
00024
00025 #include <form.h>
00026 #include <formIO.h>
00027 #include <formmanager.h>
00028 #include <objecttree.h>
00029 #include <widgetpropertyset.h>
00030 #include <container.h>
00031
00032 #include <kexidialogbase.h>
00033
00034 #include <kexidb/fieldlist.h>
00035 #include <kexidb/connection.h>
00036
00037 #include "kexireportform.h"
00038 #include <utils/kexirecordnavigator.h>
00039
00040 #define NO_DSWIZARD
00041
00042 KexiReportScrollView::KexiReportScrollView(QWidget *parent, bool preview)
00043 : KexiScrollView(parent, preview)
00044 {
00045 if(preview) {
00046 setRecordNavigatorVisible(true);
00047 recordNavigator()->setLabelText(i18n("Page:"));
00048 recordNavigator()->setInsertingButtonVisible(false);
00049 }
00050 connect(this, SIGNAL(resizingStarted()), this, SLOT(slotResizingStarted()));
00051 }
00052
00053 KexiReportScrollView::~KexiReportScrollView()
00054 {
00055 }
00056
00057 void
00058 KexiReportScrollView::show()
00059 {
00060 KexiScrollView::show();
00061
00062
00063 if (m_preview) {
00064 KexiReportView* fv = dynamic_cast<KexiReportView*>(parent());
00065 int resizeMode = fv ? fv->resizeMode() : KexiReportView::ResizeAuto;
00066 if (resizeMode == KexiReportView::ResizeAuto)
00067 setResizePolicy(AutoOneFit);
00068 }
00069 }
00070
00071 void
00072 KexiReportScrollView::slotResizingStarted()
00073 {
00074 if(m_form && KFormDesigner::FormManager::self())
00075 setSnapToGrid(KFormDesigner::FormManager::self()->snapWidgetsToGrid(), m_form->gridSize());
00076 else
00077 setSnapToGrid(false);
00078 }
00079
00082
00083 KexiReportView::KexiReportView(KexiMainWindow *win, QWidget *parent, const char *name,
00084 KexiDB::Connection *conn)
00085 : KexiViewBase(win, parent, name), m_propertySet(0), m_conn(conn)
00086 , m_resizeMode(KexiReportView::ResizeDefault)
00087 {
00088 QHBoxLayout *l = new QHBoxLayout(this);
00089 l->setAutoAdd(true);
00090
00091 m_scrollView = new KexiReportScrollView(this, viewMode()==Kexi::DataViewMode);
00092 setViewWidget(m_scrollView);
00093
00094
00095 m_reportform = new KexiReportForm(m_scrollView->viewport(), name);
00096
00097 m_scrollView->setWidget(m_reportform);
00098 m_scrollView->setResizingEnabled(viewMode()!=Kexi::DataViewMode);
00099
00100
00101
00102 if (viewMode()==Kexi::DataViewMode) {
00103 m_scrollView->viewport()->setPaletteBackgroundColor(m_reportform->palette().active().background());
00104 #if 0
00105 connect(reportPart()->manager(), SIGNAL(noFormSelected()), SLOT(slotNoFormSelected()));
00106 #endif
00107 }
00108 else {
00109 connect(KFormDesigner::FormManager::self(), SIGNAL(propertySetSwitched(KoProperty::Set *, bool)),
00110 this, SLOT(slotPropertySetSwitched(KoProperty::Set *, bool)));
00111 connect(KFormDesigner::FormManager::self(), SIGNAL(dirty(KFormDesigner::Form *, bool)),
00112 this, SLOT(slotDirty(KFormDesigner::Form *, bool)));
00113
00114
00115
00116
00117
00118
00119
00120 plugSharedAction("edit_copy", KFormDesigner::FormManager::self(), SLOT(copyWidget()));
00121 plugSharedAction("edit_cut", KFormDesigner::FormManager::self(), SLOT(cutWidget()));
00122 plugSharedAction("edit_paste", KFormDesigner::FormManager::self(), SLOT(pasteWidget()));
00123 plugSharedAction("edit_delete", KFormDesigner::FormManager::self(), SLOT(deleteWidget()));
00124 plugSharedAction("edit_select_all", KFormDesigner::FormManager::self(), SLOT(selectAll()));
00125 plugSharedAction("reportpart_clear_contents", KFormDesigner::FormManager::self(), SLOT(clearWidgetContent()));
00126 plugSharedAction("edit_undo", KFormDesigner::FormManager::self(), SLOT(undo()));
00127 plugSharedAction("edit_redo", KFormDesigner::FormManager::self(), SLOT(redo()));
00128
00129 plugSharedAction("reportpart_format_raise", KFormDesigner::FormManager::self(), SLOT(bringWidgetToFront()) );
00130 plugSharedAction("reportpart_format_lower", KFormDesigner::FormManager::self(), SLOT(sendWidgetToBack()) );
00131
00132 plugSharedAction("reportpart_align_menu", KFormDesigner::FormManager::self(), 0 );
00133 plugSharedAction("reportpart_align_to_left", KFormDesigner::FormManager::self(),SLOT(alignWidgetsToLeft()) );
00134 plugSharedAction("reportpart_align_to_right", KFormDesigner::FormManager::self(), SLOT(alignWidgetsToRight()) );
00135 plugSharedAction("reportpart_align_to_top", KFormDesigner::FormManager::self(), SLOT(alignWidgetsToTop()) );
00136 plugSharedAction("reportpart_align_to_bottom", KFormDesigner::FormManager::self(), SLOT(alignWidgetsToBottom()) );
00137 plugSharedAction("reportpart_align_to_grid", KFormDesigner::FormManager::self(), SLOT(alignWidgetsToGrid()) );
00138
00139 plugSharedAction("reportpart_adjust_size_menu", KFormDesigner::FormManager::self(), 0 );
00140 plugSharedAction("reportpart_adjust_to_fit", KFormDesigner::FormManager::self(), SLOT(adjustWidgetSize()) );
00141 plugSharedAction("reportpart_adjust_size_grid", KFormDesigner::FormManager::self(), SLOT(adjustSizeToGrid()) );
00142 plugSharedAction("reportpart_adjust_height_small", KFormDesigner::FormManager::self(), SLOT(adjustHeightToSmall()) );
00143 plugSharedAction("reportpart_adjust_height_big", KFormDesigner::FormManager::self(), SLOT(adjustHeightToBig()) );
00144 plugSharedAction("reportpart_adjust_width_small", KFormDesigner::FormManager::self(), SLOT(adjustWidthToSmall()) );
00145 plugSharedAction("reportpart_adjust_width_big", KFormDesigner::FormManager::self(), SLOT(adjustWidthToBig()) );
00146 }
00147
00148 initForm();
00149
00150 connect(this, SIGNAL(focus(bool)), this, SLOT(slotFocus(bool)));
00152
00153 }
00154
00155 KexiReportView::~KexiReportView()
00156 {
00157
00158
00159
00160 m_propertySet = 0;
00161 propertySetSwitched();
00162 }
00163
00164 KFormDesigner::Form*
00165 KexiReportView::form() const
00166 {
00167 if(viewMode()==Kexi::DataViewMode)
00168 return tempData()->previewForm;
00169 else
00170 return tempData()->form;
00171 }
00172
00173 void
00174 KexiReportView::setForm(KFormDesigner::Form *f)
00175 {
00176 if(viewMode()==Kexi::DataViewMode)
00177 tempData()->previewForm = f;
00178 else
00179 tempData()->form = f;
00180 }
00181
00182 void
00183 KexiReportView::initForm()
00184 {
00185 setForm( new KFormDesigner::Form(KexiReportPart::library()) );
00186 form()->createToplevel(m_reportform, m_reportform);
00187
00188
00189
00190 if(parentDialog()->id() < 0)
00191 {
00192 #ifndef NO_DSWIZARD
00193 KexiDataSourceWizard *w = new KexiDataSourceWizard(mainWin(), (QWidget*)mainWin(), "datasource_wizard");
00194 if(!w->exec())
00195 fields = 0;
00196 else
00197 fields = w->fields();
00198 delete w;
00199 #endif
00200 }
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210 loadForm();
00211
00212 KFormDesigner::FormManager::self()->importForm(form(), viewMode()==Kexi::DataViewMode);
00213 m_scrollView->setForm(form());
00214 m_scrollView->refreshContentsSize();
00215 }
00216
00217 void
00218 KexiReportView::loadForm()
00219 {
00220
00221
00222
00223 kexipluginsdbg << "KexiReportForm::loadForm() Loading the form with id : " << parentDialog()->id() << endl;
00224
00225 if(viewMode()==Kexi::DataViewMode && !tempData()->tempForm.isNull() ) {
00226 KFormDesigner::FormIO::loadFormFromString(form(), m_reportform, tempData()->tempForm);
00227 return;
00228 }
00229
00230
00231 QString data;
00232 loadDataBlock(data);
00233 KFormDesigner::FormIO::loadFormFromString(form(), m_reportform, data);
00234 }
00235
00236 void
00237 KexiReportView::slotPropertySetSwitched(KoProperty::Set *set, bool forceReload)
00238 {
00239 m_propertySet = set;
00240 if (forceReload)
00241 propertySetReloaded(true);
00242 else
00243 propertySetSwitched();
00244 }
00245
00246 tristate
00247 KexiReportView::beforeSwitchTo(int mode, bool &dontStore)
00248 {
00249 if (mode!=viewMode() && viewMode()!=Kexi::DataViewMode) {
00250
00251 tempData()->scrollViewContentsPos
00252 = QPoint(m_scrollView->contentsX(), m_scrollView->contentsY());
00253 }
00254
00255
00256 dontStore = true;
00257 if(dirty() && (mode == Kexi::DataViewMode) && form()->objectTree())
00258 KFormDesigner::FormIO::saveFormToString(form(), tempData()->tempForm);
00259
00260 return true;
00261 }
00262
00263 tristate
00264 KexiReportView::afterSwitchFrom(int mode)
00265 {
00266 if (mode != 0 && mode != Kexi::DesignViewMode) {
00267
00268 m_scrollView->setContentsPos(tempData()->scrollViewContentsPos.x(),
00269 tempData()->scrollViewContentsPos.y());
00270 }
00271
00272
00273
00274
00275
00276
00277 if((mode == Kexi::DesignViewMode) && viewMode()==Kexi::DataViewMode) {
00278
00279 delete m_reportform;
00280 m_reportform = new KexiReportForm(m_scrollView->viewport());
00281 m_scrollView->setWidget(m_reportform);
00282
00283 initForm();
00284 #if 0
00285 slotNoFormSelected();
00286 #endif
00287
00288
00289 m_scrollView->setContentsPos(0,0);
00290 m_reportform->move(0,0);
00291 }
00292 return true;
00293 }
00294
00295 void
00296 KexiReportView::slotDirty(KFormDesigner::Form *dirtyForm, bool isDirty)
00297 {
00298 if(dirtyForm == form())
00299 KexiViewBase::setDirty(isDirty);
00300 }
00301
00302 KexiDB::SchemaData*
00303 KexiReportView::storeNewData(const KexiDB::SchemaData& sdata, bool &cancel)
00304 {
00305 KexiDB::SchemaData *s = KexiViewBase::storeNewData(sdata, cancel);
00306 kexipluginsdbg << "KexiReportForm::storeNewData(): new id:" << s->id() << endl;
00307
00308 if (!s || cancel) {
00309 delete s;
00310 return 0;
00311 }
00312 if (!storeData()) {
00313
00314 m_conn->removeObject( s->id() );
00315 delete s;
00316 return 0;
00317 }
00318 return s;
00319 }
00320
00321 tristate
00322 KexiReportView::storeData(bool dontAsk)
00323 {
00324 Q_UNUSED(dontAsk)
00325 kexipluginsdbg << "KexiReportForm::storeData(): " << parentDialog()->partItem()->name() << " [" << parentDialog()->id() << "]" << endl;
00326 QString data;
00327 KFormDesigner::FormIO::saveFormToString(tempData()->form, data);
00328 if (!storeDataBlock(data))
00329 return false;
00330 tempData()->tempForm = QString();
00331
00332 return true;
00333 }
00334
00335 #if 0
00337 void
00338 KexiReportView::slotWidgetSelected(KFormDesigner::Form *f, bool multiple)
00339 {
00340 if(f != form())
00341 return;
00342
00343 enableFormActions();
00344
00345 setAvailable("edit_copy", true);
00346 setAvailable("edit_cut", true);
00347 setAvailable("edit_clear", true);
00348
00349
00350 setAvailable("reportpart_align_menu", multiple);
00351 setAvailable("reportpart_align_to_left", multiple);
00352 setAvailable("reportpart_align_to_right", multiple);
00353 setAvailable("reportpart_align_to_top", multiple);
00354 setAvailable("reportpart_align_to_bottom", multiple);
00355
00356 setAvailable("reportpart_adjust_size_menu", true);
00357 setAvailable("reportpart_adjust_width_small", multiple);
00358 setAvailable("reportpart_adjust_width_big", multiple);
00359 setAvailable("reportpart_adjust_height_small", multiple);
00360 setAvailable("reportpart_adjust_height_big", multiple);
00361
00362 setAvailable("reportpart_format_raise", true);
00363 setAvailable("reportpart_format_lower", true);
00364 }
00365
00366 void
00367 KexiReportView::slotFormWidgetSelected(KFormDesigner::Form *f)
00368 {
00369 if(f != form())
00370 return;
00371
00372 disableWidgetActions();
00373 enableFormActions();
00374 }
00375
00376 void
00377 KexiReportView::slotNoFormSelected()
00378 {
00379 disableWidgetActions();
00380
00381
00382 setAvailable("edit_paste", false);
00383 setAvailable("edit_undo", false);
00384 setAvailable("edit_redo", false);
00385 }
00386
00387 void
00388 KexiReportView::enableFormActions()
00389 {
00390 setAvailable("edit_paste", KFormDesigner::FormManager::self()->isPasteEnabled());
00391 }
00392
00393 void
00394 KexiReportView::disableWidgetActions()
00395 {
00396
00397 setAvailable("edit_copy", false);
00398 setAvailable("edit_cut", false);
00399 setAvailable("edit_clear", false);
00400
00401
00402 setAvailable("reportpart_align_menu", false);
00403 setAvailable("reportpart_align_to_left", false);
00404 setAvailable("reportpart_align_to_right", false);
00405 setAvailable("reportpart_align_to_top", false);
00406 setAvailable("reportpart_align_to_bottom", false);
00407
00408 setAvailable("reportpart_adjust_size_menu", false);
00409 setAvailable("reportpart_adjust_width_small", false);
00410 setAvailable("reportpart_adjust_width_big", false);
00411 setAvailable("reportpart_adjust_height_small", false);
00412 setAvailable("reportpart_adjust_height_big", false);
00413
00414 setAvailable("reportpart_format_raise", false);
00415 setAvailable("reportpart_format_lower", false);
00416 }
00417
00418 void
00419 KexiReportView::setUndoEnabled(bool enabled)
00420 {
00421 setAvailable("edit_undo", enabled);
00422 }
00423
00424 void
00425 KexiReportView::setRedoEnabled(bool enabled)
00426 {
00427 setAvailable("edit_redo", enabled);
00428 }
00429 #endif
00430
00431 QSize
00432 KexiReportView::preferredSizeHint(const QSize& otherSize)
00433 {
00434 return (m_reportform->size()
00435 +QSize(m_scrollView->verticalScrollBar()->isVisible() ? m_scrollView->verticalScrollBar()->width()*3/2 : 10,
00436 m_scrollView->horizontalScrollBar()->isVisible() ? m_scrollView->horizontalScrollBar()->height()*3/2 : 10))
00437 .expandedTo( KexiViewBase::preferredSizeHint(otherSize) );
00438 }
00439
00440 void
00441 KexiReportView::resizeEvent( QResizeEvent *e )
00442 {
00443 if (viewMode()==Kexi::DataViewMode) {
00444 m_scrollView->refreshContentsSizeLater(
00445 e->size().width()!=e->oldSize().width(),
00446 e->size().height()!=e->oldSize().height()
00447 );
00448 }
00449 KexiViewBase::resizeEvent(e);
00450 m_scrollView->updateNavPanelGeometry();
00451 }
00452
00453 void
00454 KexiReportView::show()
00455 {
00456 KexiViewBase::show();
00457
00458
00459
00460
00461
00462 if (viewMode()==Kexi::DataViewMode) {
00463 if (resizeMode() == ResizeAuto)
00464 m_scrollView->setResizePolicy(QScrollView::AutoOneFit);
00465 }
00466 }
00467
00468 void
00469 KexiReportView::slotFocus(bool in)
00470 {
00471 if(in && form() && KFormDesigner::FormManager::self() && KFormDesigner::FormManager::self()->activeForm() != form())
00472 KFormDesigner::FormManager::self()->windowChanged(form()->widget());
00473 }
00474
00475
00476 #include "kexireportview.moc"
00477