]> git.lyx.org Git - lyx.git/blob - src/frontends/controllers/ControlInset.tmpl
We don't currently use fork anywhere (or if we do it's by mistake!), so
[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 #include "support/LAssert.h"
15 #include "debug.h" 
16
17
18 template <class Inset, class Params>
19 ControlInset<Inset, Params>::ControlInset(LyXView & lv, Dialogs & d)
20         : ControlConnectBD(lv, d),
21           inset_(0), ih_(0), params_(0), dialog_built_(false)
22 {}
23
24
25 template <class Inset, class Params>
26 void ControlInset<Inset, Params>::showInset(Inset * inset)
27 {
28         if (inset == 0) return;  // maybe we should Assert this?
29
30         connectInset(inset);
31         show(getParams(*inset));
32 }
33
34
35 template <class Inset, class Params>
36 void ControlInset<Inset, Params>::createInset(string const & arg)
37 {
38         connectInset();
39
40         if (!arg.empty())
41                 bc().valid(); // so that the user can press Ok
42
43         show(getParams(arg));
44 }
45
46
47 template <class Inset, class Params>
48 void ControlInset<Inset, Params>::show(Params const & params)
49 {
50         // paranoia check
51         if (params_) delete params_;
52
53         params_ = new Params(params);
54         setDaughterParams();
55
56         if (emergency_exit_) {
57                 hide();
58                 return;
59         }
60
61         if (!dialog_built_) {
62                 view().build();
63                 dialog_built_ = true;
64         }
65
66         bc().readOnly(isReadonly());
67         view().show();
68 }
69
70
71 template <class Inset, class Params>
72 void ControlInset<Inset, Params>::update()
73 {
74         // paranoia check
75         if (params_) delete params_;
76
77         if (inset_)
78                 params_ = new Params(getParams(*inset_));
79         else
80                 params_ = new Params();
81
82         if (emergency_exit_) {
83                 hide();
84                 return;
85         }
86
87         bc().readOnly(isReadonly());
88         view().update();
89 }
90
91
92 template <class Inset, class Params>
93 void ControlInset<Inset, Params>::hide()
94 {
95         emergency_exit_ = false;
96         if (params_) {
97                 delete params_;
98                 params_ = 0;
99         }
100         inset_ = 0;
101
102         clearDaughterParams();
103
104         ih_.disconnect();
105         disconnect();
106         view().hide();
107 }
108
109
110 template <class Inset, class Params>
111 void ControlInset<Inset, Params>::apply()
112 {
113         if (lv_.buffer()->isReadonly())
114                 return;
115
116         view().apply();
117
118         if (inset_) {
119                 if (params() != getParams(*inset_)) {
120                         applyParamsToInset();
121                 }
122         } else {
123                 applyParamsNoInset();
124         }
125
126         if (disconnectOnApply() && !isClosing()) {
127                 *params_ = getParams(string());
128                 inset_ = 0;
129                 ih_.disconnect();
130
131                 view().update();
132         }
133 }
134
135
136 template <class Inset, class Params>
137 Params & ControlInset<Inset, Params>::params()
138 {
139         lyx::Assert(params_);
140         return *params_;
141 }
142
143
144 template <class Inset, class Params>
145 Params  const & ControlInset<Inset, Params>::params() const
146 {
147         lyx::Assert(params_);
148         return *params_;
149 }
150
151
152 template <class Inset, class Params>
153 Inset * ControlInset<Inset, Params>::inset() const
154 {
155         lyx::Assert(inset_);
156         return inset_;
157 }
158
159
160 template <class Inset, class Params>
161 void ControlInset<Inset, Params>::updateSlot(bool switched)
162 {
163         if (switched)
164                 hide();
165         else
166                 update();
167 }
168
169
170 template <class Inset, class Params>
171 void ControlInset<Inset, Params>::connectInset(Inset * inset)
172 {
173         // If connected to another inset, disconnect from it.
174         if (inset_) {
175                 ih_.disconnect();
176                 inset_ = 0;
177         }
178
179         if (inset) {
180                 inset_ = inset;
181                 ih_ = inset->hideDialog.connect(
182                         SigC::slot(this, &ControlInset::hide));
183         }
184         connect();
185 }