]> git.lyx.org Git - lyx.git/blob - src/frontends/controllers/ControlInset.tmpl
fix rbearing
[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
39
40 template <class Inset, class Params>
41 void ControlInset<Inset, Params>::createInset(string const & arg)
42 {
43         connectInset();
44
45         if (!arg.empty())
46                 bc().valid(); // so that the user can press Ok
47
48         show(getParams(arg));
49 }
50
51
52 template <class Inset, class Params>
53 void ControlInset<Inset, Params>::show(Params const & params)
54 {
55         // paranoia check
56         if (params_) delete params_;
57
58         params_ = new Params(params);
59         setDaughterParams();
60
61         if (emergency_exit_) {
62                 hide();
63                 return;
64         }
65
66         if (!dialog_built_) {
67                 view().build();
68                 dialog_built_ = true;
69         }
70
71         bc().readOnly(bufferIsReadonly());
72         view().show();
73 }
74
75
76 template <class Inset, class Params>
77 void ControlInset<Inset, Params>::update()
78 {
79         // paranoia check
80         if (params_) delete params_;
81
82         if (inset_)
83                 params_ = new Params(getParams(*inset_));
84         else
85                 params_ = new Params();
86
87         if (emergency_exit_) {
88                 hide();
89                 return;
90         }
91
92         bc().readOnly(bufferIsReadonly());
93         view().update();
94 }
95
96
97 template <class Inset, class Params>
98 void ControlInset<Inset, Params>::hide()
99 {
100         emergency_exit_ = false;
101         if (params_) {
102                 delete params_;
103                 params_ = 0;
104         }
105         inset_ = 0;
106
107         clearDaughterParams();
108
109         ih_.disconnect();
110         disconnect();
111         view().hide();
112 }
113
114
115 template <class Inset, class Params>
116 void ControlInset<Inset, Params>::apply()
117 {
118         if (bufferIsReadonly())
119                 return;
120
121         view().apply();
122
123         if (inset_) {
124                 if (params() != getParams(*inset_)) {
125                         applyParamsToInset();
126                 }
127         } else {
128                 applyParamsNoInset();
129         }
130
131         if (disconnectOnApply() && !isClosing()) {
132                 *params_ = getParams(string());
133                 inset_ = 0;
134                 ih_.disconnect();
135
136                 view().update();
137         }
138 }
139
140
141 template <class Inset, class Params>
142 Params & ControlInset<Inset, Params>::params()
143 {
144         lyx::Assert(params_);
145         return *params_;
146 }
147
148
149 template <class Inset, class Params>
150 Params  const & ControlInset<Inset, Params>::params() const
151 {
152         lyx::Assert(params_);
153         return *params_;
154 }
155
156
157 template <class Inset, class Params>
158 Inset * ControlInset<Inset, Params>::inset() const
159 {
160         lyx::Assert(inset_);
161         return inset_;
162 }
163
164
165 template <class Inset, class Params>
166 void ControlInset<Inset, Params>::updateSlot(bool switched)
167 {
168         if (switched)
169                 hide();
170         else
171                 update();
172 }
173
174
175 template <class Inset, class Params>
176 void ControlInset<Inset, Params>::connectInset(Inset * inset)
177 {
178         // If connected to another inset, disconnect from it.
179         if (inset_) {
180                 ih_.disconnect();
181                 inset_ = 0;
182         }
183
184         if (inset) {
185                 inset_ = inset;
186                 ih_ = inset->hideDialog.connect(
187                         boost::bind(&ControlInset::hide, this));
188         }
189         connect();
190 }