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