kexi

kexireportview.cpp

00001 /* This file is part of the KDE project
00002    Copyright (C) 2004 Cedric Pasteur <cedric.pasteur@free.fr>
00003    Copyright (C) 2004 Jaroslaw Staniek <js@iidea.pl>
00004 
00005    This library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Library General Public
00007    License as published by the Free Software Foundation; either
00008    version 2 of the License, or (at your option) any later version.
00009 
00010    This library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Library General Public License for more details.
00014 
00015    You should have received a copy of the GNU Library General Public License
00016    along with this library; see the file COPYING.LIB.  If not, write to
00017    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018  * Boston, MA 02110-1301, USA.
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 //#include <kexidatasourcewizard.h>
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     //now get resize mode settings for entire form
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 //  m_scrollView->show();
00094 
00095     m_reportform = new KexiReportForm(m_scrollView->viewport(), name/*, conn*/);
00096 //  m_reportform->resize(QSize(400, 300));
00097     m_scrollView->setWidget(m_reportform);
00098     m_scrollView->setResizingEnabled(viewMode()!=Kexi::DataViewMode);
00099 
00100 //  initForm();
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         // action stuff
00115         /*connect(reportPart()->manager(), SIGNAL(widgetSelected(KFormDesigner::Form*, bool)), SLOT(slotWidgetSelected(KFormDesigner::Form*, bool)));
00116         connect(reportPart()->manager(), SIGNAL(formWidgetSelected(KFormDesigner::Form*)), SLOT(slotFormWidgetSelected(KFormDesigner::Form*)));
00117         connect(reportPart()->manager(), SIGNAL(undoEnabled(bool, const QString&)), this, SLOT(setUndoEnabled(bool)));
00118         connect(reportPart()->manager(), SIGNAL(redoEnabled(bool, const QString&)), this, SLOT(setRedoEnabled(bool)));*/
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 //  m_reportform->resize( m_reportform->size()+QSize(m_scrollView->verticalScrollBar()->width(), m_scrollView->horizontalScrollBar()->height()) );
00153 }
00154 
00155 KexiReportView::~KexiReportView()
00156 {
00157     // Important: form window is closed.
00158     // Set property set to 0 because there is *only one* instance of a property set class
00159     // in Kexi, so the main window wouldn't know the set in fact has been changed.
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     // Show the form wizard if this is a new Form
00189 //  KexiDB::FieldList *fields = 0;
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 /*  if(fields)
00203     {
00204      @todo generate a report from a table or a query
00205         QDomDocument dom;
00206         reportPart()->generateForm(fields, dom);
00207         KFormDesigner::FormIO::loadFormFromDom(form(), m_reportform, dom);
00208     }
00209     else*/
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 //@todo also load m_resizeMode !
00222 
00223     kexipluginsdbg << "KexiReportForm::loadForm() Loading the form with id : " << parentDialog()->id() << endl;
00224     // If we are previewing the Form, use the tempData instead of the form stored in the db
00225     if(viewMode()==Kexi::DataViewMode && !tempData()->tempForm.isNull() ) {
00226         KFormDesigner::FormIO::loadFormFromString(form(), m_reportform, tempData()->tempForm);
00227         return;
00228     }
00229 
00230     // normal load
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/*preservePrevSelection*/);
00242     else
00243         propertySetSwitched();
00244 }
00245 
00246 tristate
00247 KexiReportView::beforeSwitchTo(int mode, bool &dontStore)
00248 {
00249     if (mode!=viewMode() && viewMode()!=Kexi::DataViewMode) {
00250         //remember our pos
00251         tempData()->scrollViewContentsPos
00252             = QPoint(m_scrollView->contentsX(), m_scrollView->contentsY());
00253     }
00254 
00255     // we don't store on db, but in our TempData
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         //preserve contents pos after switching to other view
00268         m_scrollView->setContentsPos(tempData()->scrollViewContentsPos.x(),
00269             tempData()->scrollViewContentsPos.y());
00270     }
00271 //  if (mode == Kexi::DesignViewMode) {
00272         //m_scrollView->move(0,0);
00273         //m_scrollView->setContentsPos(0,0);
00274         //m_scrollView->moveChild(m_reportform, 0, 0);
00275 //  }
00276 
00277     if((mode == Kexi::DesignViewMode) && viewMode()==Kexi::DataViewMode) {
00278         // The form may have been modified, so we must recreate the preview
00279         delete m_reportform; // also deletes form()
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         //reset position
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         //failure: remove object's schema data to avoid garbage
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
00336 
00337 void
00338 KexiReportView::slotWidgetSelected(KFormDesigner::Form *f, bool multiple)
00339 {
00340     if(f != form())
00341         return;
00342 
00343     enableFormActions();
00344     // Enable edit actions
00345     setAvailable("edit_copy", true);
00346     setAvailable("edit_cut", true);
00347     setAvailable("edit_clear", true);
00348 
00349     // 'Align Widgets' menu
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() // == form in preview mode
00378 {
00379     disableWidgetActions();
00380 
00381     // Disable paste action
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     // Disable edit actions
00397     setAvailable("edit_copy", false);
00398     setAvailable("edit_cut", false);
00399     setAvailable("edit_clear", false);
00400 
00401     // Disable format functions
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 //moved from KexiFormScrollView::show():
00459 
00460     //now get resize mode settings for entire form
00461     //  if (resizeMode() == KexiFormView::ResizeAuto)
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());//m_dbform);
00473 }
00474 
00475 
00476 #include "kexireportview.moc"
00477 
KDE Home | KDE Accessibility Home | Description of Access Keys