int KexiWindow::id() const { return (partItem() && partItem()->identifier() > 0) ? partItem()->identifier() : d->id; }
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; }