QSize KexiWindow::minimumSizeHint() const { KexiView *v = selectedView(); if (!v) return QWidget::minimumSizeHint(); return v->minimumSizeHint(); }
QSize KexiWindow::sizeHint() const { KexiView *v = selectedView(); if (!v) return QWidget::sizeHint(); return v->preferredSizeHint(v->sizeHint()); }
KoProperty::Set* KexiWindow::propertySet() { KexiView *v = selectedView(); if (!v) return 0; return v->propertySet(); }
tristate KexiWindow::storeDataAs(KexiPart::Item *item, KexiView::StoreNewDataOptions options) { if (neverSaved()) { kWarning() << "The data was never saved, so storeNewData() should be called instead, giving up."; return false; } KexiView *v = selectedView(); if (!v) { return false; } //create schema object and assign information KexiProject *project = KexiMainWindowIface::global()->project(); KexiDB::SchemaData sdata(project->idForClass(d->part->info()->partClass())); if (!d->setupSchemaData(&sdata, item, options)) { return false; } bool cancel = false; KexiDB::SchemaData *newSchemaData; if (isDirty()) { // full save of new data newSchemaData = v->storeNewData(sdata, options, cancel); } else { // there were no changes; full copy of the data is enough // - gives better performance (e.g. tables are copied on server side) // - works without bothering the user (no unnecessary questions) newSchemaData = v->copyData(sdata, options, cancel); } if (cancel) { return cancelled; } if (!newSchemaData) { setStatus(project->dbConnection(), i18n("Saving object's definition failed."), ""); return false; } setSchemaData(newSchemaData); // deletes previous schema if owned if (project->idForClass(part()->info()->partClass()) < 0) { if (!project->createIdForPart(*part()->info())) return false; } // for now this Window has new item assigned d->item = item; // new schema data has now ID updated to a unique value // -assign that to item's identifier item->setIdentifier(d->schemaData->id()); project->addStoredItem(part()->info(), d->item); // set 'dirty' flag on every dialog's view setDirty(false); return true; }
QString KexiWindow::itemIconName() { if (!d->part || !d->part->info()) { KexiView *v = selectedView(); if (v) { return v->defaultIconName(); } return QString(); } return d->part->info()->itemIconName(); }
void KexiWindow::activate() { KexiView *v = selectedView(); //kDebug() << "focusWidget(): " << focusWidget()->name(); if (!KexiUtils::hasParent(v, KexiMainWindowIface::global()->focusWidget())) { //ah, focused widget is not in this view, move focus: if (v) v->setFocus(); } if (v) v->updateActions(true); }
tristate KexiWindow::storeNewData(KexiView::StoreNewDataOptions options) { if (!neverSaved()) { return false; } if (d->schemaData) { return false; //schema must not exist } KexiView *v = selectedView(); if (!v) { return false; } //create schema object and assign information KexiProject *project = KexiMainWindowIface::global()->project(); KexiDB::SchemaData sdata(project->idForClass(d->part->info()->partClass())); if (!d->setupSchemaData(&sdata, d->item, options)) { return false; } bool cancel = false; d->schemaData = v->storeNewData(sdata, options, cancel); if (cancel) return cancelled; if (!d->schemaData) { setStatus(project->dbConnection(), i18n("Saving object's definition failed."), ""); return false; } if (project->idForClass(part()->info()->partClass()) < 0) { if (!project->createIdForPart(*part()->info())) return false; } /* Sets 'dirty' flag on every dialog's view. */ setDirty(false); //new schema data has now ID updated to a unique value //-assign that to item's identifier d->item->setIdentifier(d->schemaData->id()); project->addStoredItem(part()->info(), d->item); return true; }
tristate KexiWindow::storeData(bool dontAsk) { if (neverSaved()) return false; KexiView *v = selectedView(); if (!v) return false; #define storeData_ERR \ setStatus(KexiMainWindowIface::global()->project()->dbConnection(), \ i18n("Saving object's data failed."),""); //save changes using transaction KexiDB::Transaction transaction = KexiMainWindowIface::global() ->project()->dbConnection()->beginTransaction(); if (transaction.isNull()) { storeData_ERR; return false; } KexiDB::TransactionGuard tg(transaction); const tristate res = v->storeData(dontAsk); if (~res) //trans. will be cancelled return res; if (!res) { storeData_ERR; return res; } if (!tg.commit()) { storeData_ERR; return false; } /* Sets 'dirty' flag on every dialog's view. */ setDirty(false); return true; }
void KexiWindow::sendAttachedStateToCurrentView() { KexiView *v = selectedView(); if (v) v->windowAttached(); }
void KexiWindow::deactivate() { KexiView *v = selectedView(); if (v) v->updateActions(false); }
tristate KexiWindow::switchToViewMode( Kexi::ViewMode newViewMode, QMap<QString, QVariant>* staticObjectArgs, bool& proposeOpeningInTextViewModeBecauseOfProblems) { KexiMainWindowIface::global()->acceptPropertySetEditing(); const bool designModePreloadedForTextModeHack = isDesignModePreloadedForTextModeHackUsed(newViewMode); tristate res = true; if (designModePreloadedForTextModeHack) { /* A HACK: open design BEFORE text mode: otherwise Query schema becames crazy */ bool _proposeOpeningInTextViewModeBecauseOfProblems = false; // used because even if opening the view failed, // text view can be opened res = switchToViewMode(Kexi::DesignViewMode, staticObjectArgs, _proposeOpeningInTextViewModeBecauseOfProblems); if ((!res && !_proposeOpeningInTextViewModeBecauseOfProblems) || ~res) return res; } kDebug(); bool dontStore = false; KexiView *view = selectedView(); if (d->currentViewMode == newViewMode) return true; if (!supportsViewMode(newViewMode)) { kWarning() << "!" << Kexi::nameForViewMode(newViewMode); return false; } if (view) { res = true; if (view->isDataEditingInProgress()) { KGuiItem saveItem(KStandardGuiItem::save()); saveItem.setText(i18n("Save Changes")); KGuiItem dontSaveItem(KStandardGuiItem::dontSave()); KGuiItem cancelItem(KStandardGuiItem::cancel()); cancelItem.setText(i18n("Do Not Switch")); const int res = KMessageBox::questionYesNoCancel( selectedView(), i18n("There are unsaved changes in object \"%1\". " "Do you want to save these changes before switching to other view?") .arg(partItem()->captionOrName()), i18n("Confirm Saving Changes"), saveItem, dontSaveItem, cancelItem ); if (res == KMessageBox::Yes) { if (true != view->saveDataChanges()) return cancelled; } else if (res == KMessageBox::No) { if (true != view->cancelDataChanges()) return cancelled; } else { // Cancel: return cancelled; } } if (!designModePreloadedForTextModeHack) { res = view->beforeSwitchTo(newViewMode, dontStore); } if (~res || !res) return res; if (!dontStore && view->isDirty()) { res = KexiMainWindowIface::global()->saveObject(this, i18n("Design has been changed. " "You must save it before switching to other view.")); if (~res || !res) return res; // KMessageBox::questionYesNo(0, i18n("Design has been changed. You must save it before switching to other view.")) // ==KMessageBox::No } } //get view for viewMode KexiView *newView = viewForMode(newViewMode); if (newView && !newView->inherits("KexiView")) { newView = 0; } if (!newView) { KexiUtils::setWaitCursor(); //ask the part to create view for the new mode d->creatingViewsMode = newViewMode; KexiPart::StaticPart *staticPart = dynamic_cast<KexiPart::StaticPart*>((KexiPart::Part*)d->part); if (staticPart) newView = staticPart->createView(this, this, *d->item, newViewMode, staticObjectArgs); else newView = d->part->createView(this, this, *d->item, newViewMode, staticObjectArgs); KexiUtils::removeWaitCursor(); if (!newView) { //js TODO error? kWarning() << "Switching to mode " << newViewMode << " failed. Previous mode " << d->currentViewMode << " restored."; return false; } d->creatingViewsMode = Kexi::NoViewMode; newView->initViewActions(); newView->initMainMenuActions(); addView(newView, newViewMode); } const Kexi::ViewMode prevViewMode = d->currentViewMode; res = true; if (designModePreloadedForTextModeHack) { d->currentViewMode = Kexi::NoViewMode; //SAFE? } res = newView->beforeSwitchTo(newViewMode, dontStore); proposeOpeningInTextViewModeBecauseOfProblems = data()->proposeOpeningInTextViewModeBecauseOfProblems; if (!res) { removeView(newViewMode); delete newView; kWarning() << "Switching to mode " << newViewMode << " failed. Previous mode " << d->currentViewMode << " restored."; return false; } d->currentViewMode = newViewMode; d->newlySelectedView = newView; if (prevViewMode == Kexi::NoViewMode) d->newlySelectedView->setDirty(false); res = newView->afterSwitchFrom( designModePreloadedForTextModeHack ? Kexi::NoViewMode : prevViewMode); proposeOpeningInTextViewModeBecauseOfProblems = data()->proposeOpeningInTextViewModeBecauseOfProblems; if (!res) { removeView(newViewMode); delete newView; kWarning() << "Switching to mode " << newViewMode << " failed. Previous mode " << prevViewMode << " restored."; const Kexi::ObjectStatus status(*this); setStatus(KexiMainWindowIface::global()->project()->dbConnection(), i18n("Switching to other view failed (%1).", Kexi::nameForViewMode(newViewMode)), ""); append(status); d->currentViewMode = prevViewMode; return false; } d->newlySelectedView = 0; if (~res) { d->currentViewMode = prevViewMode; return cancelled; } if (view) { takeActionProxyChild(view); //take current proxy child // views have distinct local toolbars, and user has switched the mode button so switch it back //view->toggleViewModeButtonBack(); } addActionProxyChild(newView); //new proxy child d->stack->setCurrentWidget(newView); newView->propertySetSwitched(); KexiMainWindowIface::global()->invalidateSharedActions(newView); newView->setFocus(); return true; }