/* This file is part of the KDE project Copyright (C) 2004 Cedric Pasteur Copyright (C) 2004 Jaroslaw Staniek This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "kexireportview.h" #include #include #include #include #include #include #include #include //#include #include #include #include "kexireportform.h" #include #define NO_DSWIZARD KexiReportScrollView::KexiReportScrollView(TQWidget *parent, bool preview) : KexiScrollView(parent, preview) { if(preview) { setRecordNavigatorVisible(true); recordNavigator()->setLabelText(i18n("Page:")); recordNavigator()->setInsertingButtonVisible(false); } connect(this, TQT_SIGNAL(resizingStarted()), this, TQT_SLOT(slotResizingStarted())); } KexiReportScrollView::~KexiReportScrollView() { } void KexiReportScrollView::show() { KexiScrollView::show(); //now get resize mode settings for entire form if (m_preview) { KexiReportView* fv = dynamic_cast(parent()); int resizeMode = fv ? fv->resizeMode() : KexiReportView::ResizeAuto; if (resizeMode == KexiReportView::ResizeAuto) setResizePolicy(AutoOneFit); } } void KexiReportScrollView::slotResizingStarted() { if(m_form && KFormDesigner::FormManager::self()) setSnapToGrid(KFormDesigner::FormManager::self()->snapWidgetsToGrid(), m_form->gridSize()); else setSnapToGrid(false); } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// KexiReportView::KexiReportView(KexiMainWindow *win, TQWidget *parent, const char *name, KexiDB::Connection *conn) : KexiViewBase(win, parent, name), m_propertySet(0), m_conn(conn) , m_resizeMode(KexiReportView::ResizeDefault) { TQHBoxLayout *l = new TQHBoxLayout(this); l->setAutoAdd(true); m_scrollView = new KexiReportScrollView(this, viewMode()==Kexi::DataViewMode); setViewWidget(m_scrollView); // m_scrollView->show(); m_reportform = new KexiReportForm(m_scrollView->viewport(), name/*, conn*/); // m_reportform->resize(TQSize(400, 300)); m_scrollView->setWidget(m_reportform); m_scrollView->setResizingEnabled(viewMode()!=Kexi::DataViewMode); // initForm(); if (viewMode()==Kexi::DataViewMode) { m_scrollView->viewport()->setPaletteBackgroundColor(m_reportform->palette().active().background()); #if 0 connect(reportPart()->manager(), TQT_SIGNAL(noFormSelected()), TQT_SLOT(slotNoFormSelected())); #endif } else { connect(KFormDesigner::FormManager::self(), TQT_SIGNAL(propertySetSwitched(KoProperty::Set *, bool)), this, TQT_SLOT(slotPropertySetSwitched(KoProperty::Set *, bool))); connect(KFormDesigner::FormManager::self(), TQT_SIGNAL(dirty(KFormDesigner::Form *, bool)), this, TQT_SLOT(slotDirty(KFormDesigner::Form *, bool))); // action stuff /*connect(reportPart()->manager(), TQT_SIGNAL(widgetSelected(KFormDesigner::Form*, bool)), TQT_SLOT(slotWidgetSelected(KFormDesigner::Form*, bool))); connect(reportPart()->manager(), TQT_SIGNAL(formWidgetSelected(KFormDesigner::Form*)), TQT_SLOT(slotFormWidgetSelected(KFormDesigner::Form*))); connect(reportPart()->manager(), TQT_SIGNAL(undoEnabled(bool, const TQString&)), this, TQT_SLOT(setUndoEnabled(bool))); connect(reportPart()->manager(), TQT_SIGNAL(redoEnabled(bool, const TQString&)), this, TQT_SLOT(setRedoEnabled(bool)));*/ plugSharedAction("edit_copy", KFormDesigner::FormManager::self(), TQT_SLOT(copyWidget())); plugSharedAction("edit_cut", KFormDesigner::FormManager::self(), TQT_SLOT(cutWidget())); plugSharedAction("edit_paste", KFormDesigner::FormManager::self(), TQT_SLOT(pasteWidget())); plugSharedAction("edit_delete", KFormDesigner::FormManager::self(), TQT_SLOT(deleteWidget())); plugSharedAction("edit_select_all", KFormDesigner::FormManager::self(), TQT_SLOT(selectAll())); plugSharedAction("reportpart_clear_contents", KFormDesigner::FormManager::self(), TQT_SLOT(clearWidgetContent())); plugSharedAction("edit_undo", KFormDesigner::FormManager::self(), TQT_SLOT(undo())); plugSharedAction("edit_redo", KFormDesigner::FormManager::self(), TQT_SLOT(redo())); plugSharedAction("reportpart_format_raise", KFormDesigner::FormManager::self(), TQT_SLOT(bringWidgetToFront()) ); plugSharedAction("reportpart_format_lower", KFormDesigner::FormManager::self(), TQT_SLOT(sendWidgetToBack()) ); plugSharedAction("reportpart_align_menu", KFormDesigner::FormManager::self(), 0 ); plugSharedAction("reportpart_align_to_left", KFormDesigner::FormManager::self(),TQT_SLOT(alignWidgetsToLeft()) ); plugSharedAction("reportpart_align_to_right", KFormDesigner::FormManager::self(), TQT_SLOT(alignWidgetsToRight()) ); plugSharedAction("reportpart_align_to_top", KFormDesigner::FormManager::self(), TQT_SLOT(alignWidgetsToTop()) ); plugSharedAction("reportpart_align_to_bottom", KFormDesigner::FormManager::self(), TQT_SLOT(alignWidgetsToBottom()) ); plugSharedAction("reportpart_align_to_grid", KFormDesigner::FormManager::self(), TQT_SLOT(alignWidgetsToGrid()) ); plugSharedAction("reportpart_adjust_size_menu", KFormDesigner::FormManager::self(), 0 ); plugSharedAction("reportpart_adjust_to_fit", KFormDesigner::FormManager::self(), TQT_SLOT(adjustWidgetSize()) ); plugSharedAction("reportpart_adjust_size_grid", KFormDesigner::FormManager::self(), TQT_SLOT(adjustSizeToGrid()) ); plugSharedAction("reportpart_adjust_height_small", KFormDesigner::FormManager::self(), TQT_SLOT(adjustHeightToSmall()) ); plugSharedAction("reportpart_adjust_height_big", KFormDesigner::FormManager::self(), TQT_SLOT(adjustHeightToBig()) ); plugSharedAction("reportpart_adjust_width_small", KFormDesigner::FormManager::self(), TQT_SLOT(adjustWidthToSmall()) ); plugSharedAction("reportpart_adjust_width_big", KFormDesigner::FormManager::self(), TQT_SLOT(adjustWidthToBig()) ); } initForm(); connect(this, TQT_SIGNAL(focus(bool)), this, TQT_SLOT(slotFocus(bool))); /// @todo skip this if ther're no borders // m_reportform->resize( m_reportform->size()+TQSize(m_scrollView->verticalScrollBar()->width(), m_scrollView->horizontalScrollBar()->height()) ); } KexiReportView::~KexiReportView() { // Important: form window is closed. // Set property set to 0 because there is *only one* instance of a property set class // in Kexi, so the main window wouldn't know the set in fact has been changed. m_propertySet = 0; propertySetSwitched(); } KFormDesigner::Form* KexiReportView::form() const { if(viewMode()==Kexi::DataViewMode) return tempData()->previewForm; else return tempData()->form; } void KexiReportView::setForm(KFormDesigner::Form *f) { if(viewMode()==Kexi::DataViewMode) tempData()->previewForm = f; else tempData()->form = f; } void KexiReportView::initForm() { setForm( new KFormDesigner::Form(KexiReportPart::library()) ); form()->createToplevel(m_reportform, m_reportform); // Show the form wizard if this is a new Form // KexiDB::FieldList *fields = 0; if(parentDialog()->id() < 0) { #ifndef NO_DSWIZARD KexiDataSourceWizard *w = new KexiDataSourceWizard(mainWin(), (TQWidget*)mainWin(), "datasource_wizard"); if(!w->exec()) fields = 0; else fields = w->fields(); delete w; #endif } /* if(fields) { @todo generate a report from a table or a query TQDomDocument dom; reportPart()->generateForm(fields, dom); KFormDesigner::FormIO::loadFormFromDom(form(), m_reportform, dom); } else*/ loadForm(); KFormDesigner::FormManager::self()->importForm(form(), viewMode()==Kexi::DataViewMode); m_scrollView->setForm(form()); m_scrollView->refreshContentsSize(); } void KexiReportView::loadForm() { //@todo also load m_resizeMode ! kexipluginsdbg << "KexiReportForm::loadForm() Loading the form with id : " << parentDialog()->id() << endl; // If we are previewing the Form, use the tempData instead of the form stored in the db if(viewMode()==Kexi::DataViewMode && !tempData()->tempForm.isNull() ) { KFormDesigner::FormIO::loadFormFromString(form(), m_reportform, tempData()->tempForm); return; } // normal load TQString data; loadDataBlock(data); KFormDesigner::FormIO::loadFormFromString(form(), m_reportform, data); } void KexiReportView::slotPropertySetSwitched(KoProperty::Set *set, bool forceReload) { m_propertySet = set; if (forceReload) propertySetReloaded(true/*preservePrevSelection*/); else propertySetSwitched(); } tristate KexiReportView::beforeSwitchTo(int mode, bool &dontStore) { if (mode!=viewMode() && viewMode()!=Kexi::DataViewMode) { //remember our pos tempData()->scrollViewContentsPos = TQPoint(m_scrollView->contentsX(), m_scrollView->contentsY()); } // we don't store on db, but in our TempData dontStore = true; if(dirty() && (mode == Kexi::DataViewMode) && form()->objectTree()) KFormDesigner::FormIO::saveFormToString(form(), tempData()->tempForm); return true; } tristate KexiReportView::afterSwitchFrom(int mode) { if (mode != 0 && mode != Kexi::DesignViewMode) { //preserve contents pos after switching to other view m_scrollView->setContentsPos(tempData()->scrollViewContentsPos.x(), tempData()->scrollViewContentsPos.y()); } // if (mode == Kexi::DesignViewMode) { //m_scrollView->move(0,0); //m_scrollView->setContentsPos(0,0); //m_scrollView->moveChild(m_reportform, 0, 0); // } if((mode == Kexi::DesignViewMode) && viewMode()==Kexi::DataViewMode) { // The form may have been modified, so we must recreate the preview delete m_reportform; // also deletes form() m_reportform = new KexiReportForm(m_scrollView->viewport()); m_scrollView->setWidget(m_reportform); initForm(); #if 0 slotNoFormSelected(); #endif //reset position m_scrollView->setContentsPos(0,0); m_reportform->move(0,0); } return true; } void KexiReportView::slotDirty(KFormDesigner::Form *dirtyForm, bool isDirty) { if(dirtyForm == form()) KexiViewBase::setDirty(isDirty); } KexiDB::SchemaData* KexiReportView::storeNewData(const KexiDB::SchemaData& sdata, bool &cancel) { KexiDB::SchemaData *s = KexiViewBase::storeNewData(sdata, cancel); kexipluginsdbg << "KexiReportForm::storeNewData(): new id:" << s->id() << endl; if (!s || cancel) { delete s; return 0; } if (!storeData()) { //failure: remove object's schema data to avoid garbage m_conn->removeObject( s->id() ); delete s; return 0; } return s; } tristate KexiReportView::storeData(bool dontAsk) { Q_UNUSED(dontAsk) kexipluginsdbg << "KexiReportForm::storeData(): " << parentDialog()->partItem()->name() << " [" << parentDialog()->id() << "]" << endl; TQString data; KFormDesigner::FormIO::saveFormToString(tempData()->form, data); if (!storeDataBlock(data)) return false; tempData()->tempForm = TQString(); return true; } #if 0 /// Action stuff ///////////////// void KexiReportView::slotWidgetSelected(KFormDesigner::Form *f, bool multiple) { if(f != form()) return; enableFormActions(); // Enable edit actions setAvailable("edit_copy", true); setAvailable("edit_cut", true); setAvailable("edit_clear", true); // 'Align Widgets' menu setAvailable("reportpart_align_menu", multiple); setAvailable("reportpart_align_to_left", multiple); setAvailable("reportpart_align_to_right", multiple); setAvailable("reportpart_align_to_top", multiple); setAvailable("reportpart_align_to_bottom", multiple); setAvailable("reportpart_adjust_size_menu", true); setAvailable("reportpart_adjust_width_small", multiple); setAvailable("reportpart_adjust_width_big", multiple); setAvailable("reportpart_adjust_height_small", multiple); setAvailable("reportpart_adjust_height_big", multiple); setAvailable("reportpart_format_raise", true); setAvailable("reportpart_format_lower", true); } void KexiReportView::slotFormWidgetSelected(KFormDesigner::Form *f) { if(f != form()) return; disableWidgetActions(); enableFormActions(); } void KexiReportView::slotNoFormSelected() // == form in preview mode { disableWidgetActions(); // Disable paste action setAvailable("edit_paste", false); setAvailable("edit_undo", false); setAvailable("edit_redo", false); } void KexiReportView::enableFormActions() { setAvailable("edit_paste", KFormDesigner::FormManager::self()->isPasteEnabled()); } void KexiReportView::disableWidgetActions() { // Disable edit actions setAvailable("edit_copy", false); setAvailable("edit_cut", false); setAvailable("edit_clear", false); // Disable format functions setAvailable("reportpart_align_menu", false); setAvailable("reportpart_align_to_left", false); setAvailable("reportpart_align_to_right", false); setAvailable("reportpart_align_to_top", false); setAvailable("reportpart_align_to_bottom", false); setAvailable("reportpart_adjust_size_menu", false); setAvailable("reportpart_adjust_width_small", false); setAvailable("reportpart_adjust_width_big", false); setAvailable("reportpart_adjust_height_small", false); setAvailable("reportpart_adjust_height_big", false); setAvailable("reportpart_format_raise", false); setAvailable("reportpart_format_lower", false); } void KexiReportView::setUndoEnabled(bool enabled) { setAvailable("edit_undo", enabled); } void KexiReportView::setRedoEnabled(bool enabled) { setAvailable("edit_redo", enabled); } #endif TQSize KexiReportView::preferredSizeHint(const TQSize& otherSize) { return (m_reportform->size() +TQSize(m_scrollView->verticalScrollBar()->isVisible() ? m_scrollView->verticalScrollBar()->width()*3/2 : 10, m_scrollView->horizontalScrollBar()->isVisible() ? m_scrollView->horizontalScrollBar()->height()*3/2 : 10)) .expandedTo( KexiViewBase::preferredSizeHint(otherSize) ); } void KexiReportView::resizeEvent( TQResizeEvent *e ) { if (viewMode()==Kexi::DataViewMode) { m_scrollView->refreshContentsSizeLater( e->size().width()!=e->oldSize().width(), e->size().height()!=e->oldSize().height() ); } KexiViewBase::resizeEvent(e); m_scrollView->updateNavPanelGeometry(); } void KexiReportView::show() { KexiViewBase::show(); //moved from KexiFormScrollView::show(): //now get resize mode settings for entire form // if (resizeMode() == KexiFormView::ResizeAuto) if (viewMode()==Kexi::DataViewMode) { if (resizeMode() == ResizeAuto) m_scrollView->setResizePolicy(TQScrollView::AutoOneFit); } } void KexiReportView::slotFocus(bool in) { if(in && form() && KFormDesigner::FormManager::self() && KFormDesigner::FormManager::self()->activeForm() != form()) KFormDesigner::FormManager::self()->windowChanged(form()->widget());//m_dbform); } #include "kexireportview.moc"