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