]> git.lyx.org Git - lyx.git/blob - src/frontends/controllers/ControlInset.tmpl
* Constify Buffer::getLabelList.
[lyx.git] / src / frontends / controllers / ControlInset.tmpl
1 // -*- C++ -*-
2 /*
3  * \file ControlInset.tmpl
4  * Copyright 2002 the LyX Team
5  * Read the file COPYING
6  *
7  * \author Angus Leeming <a.leeming@ic.ac.uk>
8  *
9  * ControlInset is a base class and so these templatised methods will be
10  * instantiated if this file is #included in the derived classes' .C file.
11  */
12
13 #include "ControlInset.h"
14
15 #include "ButtonControllerBase.h"
16 #include "ViewBase.h"
17 #include "support/LAssert.h"
18
19 #include <boost/bind.hpp>
20
21 template <class Inset, class Params>
22 ControlInset<Inset, Params>::ControlInset(LyXView & lv, Dialogs & d)
23         : ControlConnectBD(lv, d),
24           inset_(0), params_(0), dialog_built_(false)
25 {}
26
27
28 template <class Inset, class Params>
29 void ControlInset<Inset, Params>::showInset(Inset * inset)
30 {
31         if (inset == 0) return;  // maybe we should Assert this?
32
33         connectInset(inset);
34         show(getParams(*inset));
35 }
36
37
38 template <class Inset, class Params>
39 void ControlInset<Inset, Params>::createInset(string const & arg)
40 {
41         connectInset();
42
43         if (!arg.empty())
44                 bc().valid(); // so that the user can press Ok
45
46         show(getParams(arg));
47 }
48
49
50 template <class Inset, class Params>
51 void ControlInset<Inset, Params>::show(Params const & params)
52 {
53         // paranoia check
54         if (params_) delete params_;
55
56         params_ = new Params(params);
57         setDaughterParams();
58
59         if (emergency_exit_) {
60                 hide();
61                 return;
62         }
63
64         if (!dialog_built_) {
65                 view().build();
66                 dialog_built_ = true;
67         }
68
69         bc().readOnly(bufferIsReadonly());
70         view().show();
71 }
72
73
74 template <class Inset, class Params>
75 void ControlInset<Inset, Params>::update()
76 {
77         // paranoia check
78         if (params_) delete params_;
79
80         if (inset_)
81                 params_ = new Params(getParams(*inset_));
82         else
83                 params_ = new Params();
84
85         if (emergency_exit_) {
86                 hide();
87                 return;
88         }
89
90         bc().readOnly(bufferIsReadonly());
91         view().update();
92 }
93
94
95 template <class Inset, class Params>
96 void ControlInset<Inset, Params>::hide()
97 {
98         emergency_exit_ = false;
99         if (params_) {
100                 delete params_;
101                 params_ = 0;
102         }
103         inset_ = 0;
104
105         clearDaughterParams();
106
107         ih_.disconnect();
108         disconnect();
109         view().hide();
110 }
111
112
113 template <class Inset, class Params>
114 void ControlInset<Inset, Params>::apply()
115 {
116         if (bufferIsReadonly())
117                 return;
118
119         view().apply();
120
121         if (inset_) {
122                 if (params() != getParams(*inset_)) {
123                         applyParamsToInset();
124                 }
125         } else {
126                 applyParamsNoInset();
127         }
128
129         if (disconnectOnApply() && !isClosing()) {
130                 *params_ = getParams(string());
131                 inset_ = 0;
132                 ih_.disconnect();
133
134                 view().update();
135         }
136 }
137
138
139 template <class Inset, class Params>
140 Params & ControlInset<Inset, Params>::params()
141 {
142         lyx::Assert(params_);
143         return *params_;
144 }
145
146
147 template <class Inset, class Params>
148 Params  const & ControlInset<Inset, Params>::params() const
149 {
150         lyx::Assert(params_);
151         return *params_;
152 }
153
154
155 template <class Inset, class Params>
156 Inset * ControlInset<Inset, Params>::inset() const
157 {
158         lyx::Assert(inset_);
159         return inset_;
160 }
161
162
163 template <class Inset, class Params>
164 void ControlInset<Inset, Params>::updateSlot(bool switched)
165 {
166         if (switched)
167                 hide();
168         else
169                 update();
170 }
171
172
173 template <class Inset, class Params>
174 void ControlInset<Inset, Params>::connectInset(Inset * inset)
175 {
176         // If connected to another inset, disconnect from it.
177         if (inset_) {
178                 ih_.disconnect();
179                 inset_ = 0;
180         }
181
182         if (inset) {
183                 inset_ = inset;
184                 ih_ = inset->hideDialog.connect(
185                         boost::bind(&ControlInset::hide, this));
186         }
187         connect();
188 }