]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiDialog.cpp
set eol-style.
[lyx.git] / src / frontends / qt4 / GuiDialog.cpp
index a46c9ce1eaded75f3b491b79fea5914093a39429..950fedf40b0cd26b29b9ead02851e1e49f8c7a05 100644 (file)
 
 #include "GuiDialog.h"
 #include "debug.h"
+#include "qt_helpers.h"
+#include "frontends/LyXView.h"
 
+#include <QCloseEvent>
+#include <QSettings>
+#include <QShowEvent>
+
+using std::string;
 
 namespace lyx {
 namespace frontend {
 
 GuiDialog::GuiDialog(LyXView & lv, std::string const & name)
-       : Dialog(lv, name)
-{}
+       : is_closing_(false), name_(name), controller_(0)
+{
+       lyxview_ = &lv;
+}
+
+
+GuiDialog::~GuiDialog()
+{
+       delete controller_;
+}
+
+
+void GuiDialog::setViewTitle(docstring const & title)
+{
+       setWindowTitle("LyX: " + toqstr(title));
+}
 
 
 void GuiDialog::setButtonsValid(bool valid)
@@ -28,94 +49,220 @@ void GuiDialog::setButtonsValid(bool valid)
 }
 
 
-void GuiDialog::ApplyButton()
+void GuiDialog::slotApply()
 {
        apply();
        bc().apply();
 }
 
 
-void GuiDialog::OKButton()
+void GuiDialog::slotOK()
 {
        is_closing_ = true;
        apply();
        is_closing_ = false;
-       hide();
+       QDialog::hide();
        bc().ok();
 }
 
 
-void GuiDialog::CancelButton()
+void GuiDialog::slotClose()
 {
-       hide();
+       QDialog::hide();
        bc().cancel();
 }
 
 
-void GuiDialog::RestoreButton()
+void GuiDialog::slotRestore()
 {
-       // Tell the kernel that a request to refresh the dialog's contents
-       // has been received. It's up to the kernel to supply the necessary
+       // Tell the controller that a request to refresh the dialog's contents
+       // has been received. It's up to the controller to supply the necessary
        // info by calling GuiDialog::updateView().
-       kernel().updateDialog(name_);
+       controller().updateDialog(name_);
        bc().restore();
 }
 
+void GuiDialog::checkStatus()
+{
+       // buffer independant dialogs are always active.
+       // This check allows us leave canApply unimplemented for some dialogs.
+       if (!controller().isBufferDependent())
+               return;
+
+       // deactivate the dialog if we have no buffer
+       if (!controller().isBufferAvailable()) {
+               bc().setReadOnly(true);
+               return;
+       }
+
+       // check whether this dialog may be active
+       if (controller().canApply()) {
+               bool const readonly = controller().isBufferReadonly();
+               bc().setReadOnly(readonly);
+               // refreshReadOnly() is too generous in _enabling_ widgets
+               // update dialog to disable disabled widgets again
+
+               if (!readonly || controller().canApplyToReadOnly())
+                       updateView();
+
+       } else {
+               bc().setReadOnly(true);
+       }       
+}
+
 
-void GuiDialog::preShow()
+bool GuiDialog::isVisibleView() const
 {
-       bc().setReadOnly(kernel().isBufferReadonly());
+       return QDialog::isVisible();
 }
 
 
-void GuiDialog::postShow()
+void GuiDialog::showView()
 {
-       // The widgets may not be valid, so refresh the button controller
-       bc().refresh();
+       QSize const hint = sizeHint();
+       if (hint.height() >= 0 && hint.width() >= 0)
+               setMinimumSize(hint);
+
+       updateView();  // make sure its up-to-date
+       if (controller().exitEarly())
+               return;
+
+       if (QWidget::isVisible()) {
+               raise();
+               activateWindow();
+       } else {
+               QWidget::show();
+       }
+       setFocus();
 }
 
 
-void GuiDialog::preUpdate()
+void GuiDialog::hideView()
 {
-       bc().setReadOnly(kernel().isBufferReadonly());
+       QDialog::hide();
 }
 
 
-void GuiDialog::postUpdate()
+void GuiDialog::changed()
 {
+       if (updating_)
+               return;
+       bc().setValid(isValid());
+}
+
+
+void GuiDialog::updateView()
+{
+       setUpdatesEnabled(false);
+
+       // protect the BC from unwarranted state transitions
+       updating_ = true;
+       updateContents();
+       updating_ = false;
+
+       setUpdatesEnabled(true);
+       QDialog::update();
+}
+
+
+void GuiDialog::showData(string const & data)
+{
+       if (controller().isBufferDependent() && !controller().isBufferAvailable())
+               return;
+
+       if (!controller().initialiseParams(data)) {
+               lyxerr << "Dialog \"" << name_
+                      << "\" failed to translate the data "
+                       "string passed to show()" << std::endl;
+               return;
+       }
+
+       bc().setReadOnly(controller().isBufferReadonly());
+       showView();
        // The widgets may not be valid, so refresh the button controller
        bc().refresh();
 }
 
 
-void GuiDialog::checkStatus()
+void GuiDialog::updateData(string const & data)
 {
-       // buffer independant dialogs are always active.
-       // This check allows us leave canApply unimplemented for some dialogs.
-       if (!controller().isBufferDependent())
+       if (controller().isBufferDependent() && !controller().isBufferAvailable())
                return;
 
-       // deactivate the dialog if we have no buffer
-       if (!kernel().isBufferAvailable()) {
-               bc().setReadOnly(true);
+       if (!controller().initialiseParams(data)) {
+               lyxerr << "Dialog \"" << name_
+                      << "\" could not be initialized" << std::endl;
                return;
        }
 
-       // check whether this dialog may be active
-       if (controller().canApply()) {
-               bool const readonly = kernel().isBufferReadonly();
-               bc().setReadOnly(readonly);
-               // refreshReadOnly() is too generous in _enabling_ widgets
-               // update dialog to disable disabled widgets again
-/*
- *     FIXME:
-               if (!readonly || controller().canApplyToReadOnly())
-                       update();
-*/
-       } else {
-               bc().setReadOnly(true);
-       }       
+       bc().setReadOnly(controller().isBufferReadonly());
+       updateView();
+       // The widgets may not be valid, so refresh the button controller
+       bc().refresh();
+}
+
+
+void GuiDialog::hide()
+{
+       if (!isVisibleView())
+               return;
+
+       controller().clearParams();
+       hideView();
+       controller().disconnect(name_);
+}
+
+
+void GuiDialog::apply()
+{
+       if (controller().isBufferDependent()) {
+               if (!controller().isBufferAvailable() ||
+                   (controller().isBufferReadonly() && !controller().canApplyToReadOnly()))
+                       return;
+       }
+
+       applyView();
+       controller().dispatchParams();
+
+       if (controller().disconnectOnApply() && !is_closing_) {
+               controller().disconnect(name_);
+               controller().initialiseParams(string());
+               updateView();
+       }
+}
+
+
+void GuiDialog::setController(Controller * controller)
+{
+       BOOST_ASSERT(controller);
+       BOOST_ASSERT(!controller_);
+       controller_ = controller;
+       controller_->setLyXView(*lyxview_);
+}
+
+
+void GuiDialog::showEvent(QShowEvent * e)
+{
+#if (QT_VERSION >= 0x040200)
+       QSettings settings;
+       string key = name_ + "/geometry";
+       restoreGeometry(settings.value(key.c_str()).toByteArray());
+#endif
+       QDialog::showEvent(e);
+}
+
+
+void GuiDialog::closeEvent(QCloseEvent * e)
+{
+#if (QT_VERSION >= 0x040200)
+       QSettings settings;
+       string key = name_ + "/geometry";
+       settings.setValue(key.c_str(), saveGeometry());
+#endif
+       QDialog::closeEvent(e);
 }
 
 } // namespace frontend
 } // namespace lyx
+
+#include "GuiDialog_moc.cpp"