2 /* This file is part of
3 * ======================================================
5 * LyX, The Document Processor
7 * Copyright 2001 The LyX Team.
9 * ======================================================
11 * \file ControlInsets.h
12 * \author Angus Leeming <a.leeming@ic.ac.uk>
14 * ControlInset is to be used as a parent class for dialogs that display and
15 * can perhaps modify the contents of an individual inset. An example being the
16 * ubiquitous Citation dialog.
19 #ifndef CONTROLINSET_H
20 #define CONTROLINSET_H
22 #include "support/LAssert.h"
24 #include "ControlConnections.h"
28 template <class Inset, class Params>
29 class ControlInset : public ControlConnectBD
33 ControlInset(LyXView &, Dialogs &);
34 /// Allow the View access to the local copy.
37 Params const & params() const;
40 /// Slots connected in the daughter classes c-tor.
41 /// Slot launching dialog to (possibly) create a new inset.
42 void createInset(string const &);
43 /// Slot launching dialog to an existing inset.
44 void showInset(Inset *);
45 /// Allow the daughter methods to access the inset.
46 Inset * inset() const;
49 /** These 7 methods are all that the individual daughter classes
50 should need to instantiate. */
52 /// if the inset exists then do this...
53 virtual void applyParamsToInset() = 0;
55 virtual void applyParamsNoInset() = 0;
57 /// get the parameters from the string passed to createInset.
58 virtual Params const getParams(string const &) = 0;
59 /// get the parameters from the inset passed to showInset.
60 virtual Params const getParams(Inset const &) = 0;
62 /** Most derived classes won't need these two, so they default to empty.
65 /// set any daughter class-particular data on show().
66 virtual void setDaughterParams() {}
67 /// clean-up any daughter class-particular data on hide().
68 virtual void clearDaughterParams() {}
70 /** Some dialogs may find it beneficial to disconnect from the inset
71 when the Apply button is pressed. E.g., doing this with the citation
72 dialog allows multiple citiations to be inserted easily. */
73 virtual bool disconnectOnApply() { return false; }
77 /// Instantiation of ControlButtons virtual methods.
79 /// Get changed parameters and Dispatch them to the kernel.
81 /// Disconnect signals and hide View.
83 /// Update the dialog.
84 virtual void update();
86 /** Instantiation of ControlConnectBD private virtual method.
87 Slot connected to update signal. */
88 virtual void updateSlot(bool);
91 void show(Params const &);
93 void connectInset(Inset * = 0);
95 /// pointer to the inset passed through connectInset
97 /// inset::hide connection.
99 /** A local copy of the inset's params.
100 Memory is allocated only whilst the dialog is visible.
104 /// is the dialog built ?
110 template <class Inset, class Params>
111 ControlInset<Inset, Params>::ControlInset(LyXView & lv, Dialogs & d)
112 : ControlConnectBD(lv, d),
113 inset_(0), ih_(0), params_(0), dialog_built_(false)
117 template <class Inset, class Params>
118 void ControlInset<Inset, Params>::showInset(Inset * inset)
120 if (inset == 0) return; // maybe we should Assert this?
123 show(getParams(*inset));
127 template <class Inset, class Params>
128 void ControlInset<Inset, Params>::createInset(string const & arg)
133 bc().valid(); // so that the user can press Ok
135 show(getParams(arg));
139 template <class Inset, class Params>
140 void ControlInset<Inset, Params>::show(Params const & params)
142 if (params_) delete params_;
143 params_ = new Params(params);
146 if (emergency_exit_) {
151 if (!dialog_built_) {
153 dialog_built_ = true;
156 bc().readOnly(isReadonly());
161 template <class Inset, class Params>
162 void ControlInset<Inset, Params>::hide()
164 emergency_exit_ = false;
171 clearDaughterParams();
179 template <class Inset, class Params>
180 void ControlInset<Inset, Params>::update()
182 if (params_) delete params_;
185 params_ = new Params(getParams(*inset_));
187 params_ = new Params();
189 if (emergency_exit_) {
194 bc().readOnly(isReadonly());
199 template <class Inset, class Params>
200 void ControlInset<Inset, Params>::apply()
202 if (lv_.buffer()->isReadonly())
207 if (inset_ && params() != getParams(*inset_))
208 applyParamsToInset();
210 applyParamsNoInset();
212 if (disconnectOnApply() && !isClosing()) {
213 *params_ = getParams(string());
222 template <class Inset, class Params>
223 Params & ControlInset<Inset, Params>::params()
225 lyx::Assert(params_);
230 template <class Inset, class Params>
231 Params const & ControlInset<Inset, Params>::params() const
233 lyx::Assert(params_);
238 template <class Inset, class Params>
239 Inset * ControlInset<Inset, Params>::inset() const
246 template <class Inset, class Params>
247 void ControlInset<Inset, Params>::updateSlot(bool switched)
256 template <class Inset, class Params>
257 void ControlInset<Inset, Params>::connectInset(Inset * inset)
259 // If connected to another inset, disconnect from it.
267 ih_ = inset->hideDialog.connect(
268 SigC::slot(this, &ControlInset::hide));
272 #endif // CONTROLINSET_H