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