]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/controllers/ControlInset.h
The reference dialog now disconnects from the inset on Apply. Its behaviour
[lyx.git] / src / frontends / controllers / ControlInset.h
index fea95371c8399391d4b88a561b15a6f9f62f26aa..755a4476df79dd459e6ffc36afc36cc56d4fb4d4 100644 (file)
@@ -1,3 +1,4 @@
+// -*- C++ -*-
 /* This file is part of
  * ====================================================== 
  *
  * \file ControlInsets.h
  * \author Angus Leeming <a.leeming@ic.ac.uk>
  *
- * ControlInset is to be used as a parent class for popups that display and
+ * ControlInset is to be used as a parent class for dialogs that display and
  * can perhaps modify the contents of an individual inset. An example being the
- * ubiquitous Citation popup.
+ * ubiquitous Citation dialog.
  */
 
 #ifndef CONTROLINSET_H
 #define CONTROLINSET_H
 
+#include "support/LAssert.h"
+#include "debug.h" 
 #include "ControlConnections.h"
 
 class Inset;
@@ -29,33 +32,49 @@ public:
        ///
        ControlInset(LyXView &, Dialogs &);
        /// Allow the View access to the local copy.
-       Params & params() const;
+       Params & params();
+       ///
+       Params const & params() const;
 
 protected:
        /// Slots connected in the daughter classes c-tor.
        /// Slot launching dialog to (possibly) create a new inset.
        void createInset(string const &);
        /// Slot launching dialog to an existing inset.
-       void showInset(Inset * inset);
+       void showInset(Inset *);
        /// Allow the daughter methods to access the inset.
        Inset * inset() const;
 
 private:
-       /** These 5 methods are all that the individual daughter classes
+       /** These 7 methods are all that the individual daughter classes
            should need to instantiate. */
 
        /// if the inset exists then do this...
        virtual void applyParamsToInset() = 0;
        /// else this...
        virtual void applyParamsNoInset() = 0;
-       /// clean-up any daughter class-particular data on hide.
-       virtual void clearDaughterParams() = 0;
+
        /// get the parameters from the string passed to createInset.
        virtual Params const getParams(string const &) = 0;
        /// get the parameters from the inset passed to showInset.
        virtual Params const getParams(Inset const &) = 0;
 
-       /// Instantiation of ControlBase virtual methods.
+       /** Most derived classes won't need these two, so they default to empty.
+        */
+
+       /// set any daughter class-particular data on show().
+       virtual void setDaughterParams() {}
+       /// clean-up any daughter class-particular data on hide().
+       virtual void clearDaughterParams() {}
+
+       /** Some dialogs may find it beneficial to disconnect from the inset
+        when the Apply button is pressed. E.g., doing this with the citation
+        dialog allows multiple citiations to be inserted easily. */
+       virtual bool disconnectOnApply() { return false; }
+
+
+       
+       /// Instantiation of ControlButtons virtual methods.
 
        /// Get changed parameters and Dispatch them to the kernel.
        virtual void apply();
@@ -81,18 +100,17 @@ private:
            Memory is allocated only whilst the dialog is visible.
        */
        Params * params_;
-};
-
-
-#include "LyXView.h"
-#include "support/LAssert.h"
 
+       /// is the dialog built ?
+       bool dialog_built_;
+};
 
 
 template <class Inset, class Params>
 ControlInset<Inset, Params>::ControlInset(LyXView & lv, Dialogs & d)
        : ControlConnectBD(lv, d),
-         inset_(0), ih_(0), params_(0)
+         inset_(0), ih_(0), params_(0), dialog_built_(false)
 {}
 
 
@@ -111,7 +129,7 @@ void ControlInset<Inset, Params>::createInset(string const & arg)
 {
        connectInset();
 
-       if ( !arg.empty() )
+       if (!arg.empty())
                bc().valid(); // so that the user can press Ok
 
        show(getParams(arg));
@@ -124,6 +142,13 @@ void ControlInset<Inset, Params>::show(Params const & params)
        if (params_) delete params_;
        params_ = new Params(params);
 
+       setDaughterParams();
+
+       if (!dialog_built_) {
+               view().build();
+               dialog_built_ = true;
+       }
+
        bc().readOnly(isReadonly());
        view().show();
 }
@@ -164,22 +189,38 @@ void ControlInset<Inset, Params>::update()
 template <class Inset, class Params>
 void ControlInset<Inset, Params>::apply()
 {
-       if (lv_.buffer()->isReadonly() || !inset_)
+       if (lv_.buffer()->isReadonly())
                return;
 
        view().apply();
 
-       if (inset_) {
-               if (params() != getParams(*inset_)) applyParamsToInset();
-       else
+       if (inset_ && params() != getParams(*inset_))
+               applyParamsToInset();
+       else
                applyParamsNoInset();
+
+       if (disconnectOnApply() && !isClosing()) {
+               *params_ = getParams(string());
+               inset_ = 0;
+               ih_.disconnect();
+
+               view().update();
+       }
+}
+
+
+template <class Inset, class Params>
+Params & ControlInset<Inset, Params>::params()
+{
+       lyx::Assert(params_);
+       return *params_;
 }
 
 
 template <class Inset, class Params>
-Params & ControlInset<Inset, Params>::params() const
+Params  const & ControlInset<Inset, Params>::params() const
 {
-       Assert(params_);
+       lyx::Assert(params_);
        return *params_;
 }
 
@@ -187,7 +228,7 @@ Params & ControlInset<Inset, Params>::params() const
 template <class Inset, class Params>
 Inset * ControlInset<Inset, Params>::inset() const
 {
-       Assert(inset_);
+       lyx::Assert(inset_);
        return inset_;
 }