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