]> 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 d91b7d2c6808685ea86b8b36b363c3a43ae3fbc0..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,7 +32,9 @@ 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.
@@ -41,7 +46,7 @@ protected:
        Inset * inset() const;
 
 private:
-       /** These 6 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...
@@ -62,10 +67,14 @@ private:
        /// 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 ControlButton virtual methods.
+       /// Instantiation of ControlButtons virtual methods.
 
        /// Get changed parameters and Dispatch them to the kernel.
        virtual void apply();
@@ -91,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)
 {}
 
 
@@ -121,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));
@@ -136,6 +144,11 @@ void ControlInset<Inset, Params>::show(Params const & params)
 
        setDaughterParams();
 
+       if (!dialog_built_) {
+               view().build();
+               dialog_built_ = true;
+       }
+
        bc().readOnly(isReadonly());
        view().show();
 }
@@ -185,13 +198,29 @@ void ControlInset<Inset, Params>::apply()
                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_;
 }
 
@@ -199,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_;
 }