]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/InsetParamsDialog.cpp
Migrate GuiLabel to InsetParamsDialog.
[lyx.git] / src / frontends / qt4 / InsetParamsDialog.cpp
1 /**\r
2  * \file InsetParamsDialog.cpp\r
3  * This file is part of LyX, the document processor.\r
4  * Licence details can be found in the file COPYING.\r
5  *\r
6  * \author Abdelrazak Younes\r
7  *\r
8  * Full author contact details are available in file CREDITS.\r
9  */\r
10 \r
11 #include <config.h>\r
12 \r
13 #include "InsetParamsDialog.h"\r
14 \r
15 #include "GuiBox.h"\r
16 #include "GuiBranch.h"\r
17 #include "GuiBibitem.h"\r
18 #include "GuiERT.h"\r
19 #include "GuiHyperlink.h"\r
20 #include "GuiInfo.h"\r
21 #include "GuiLabel.h"\r
22 #include "GuiLine.h"\r
23 #include "GuiHSpace.h"\r
24 #include "GuiTabular.h"\r
25 #include "GuiVSpace.h"\r
26 #include "FloatPlacement.h"\r
27 \r
28 #include "InsetParamsWidget.h"\r
29 #include "qt_helpers.h"\r
30 \r
31 #include "Buffer.h"\r
32 #include "buffer_funcs.h"\r
33 #include "BufferParams.h"\r
34 #include "BufferView.h"\r
35 #include "Cursor.h"\r
36 #include "FuncRequest.h"\r
37 #include "FuncStatus.h"\r
38 #include "LyX.h"\r
39 \r
40 #include "support/debug.h"\r
41 #include "support/lstrings.h"\r
42 \r
43 using namespace std;\r
44 using namespace lyx::support;\r
45 \r
46 namespace lyx {\r
47 namespace frontend {\r
48 \r
49 /////////////////////////////////////////////////////////////////\r
50 //\r
51 // InsetParamsDialog::Private\r
52 //\r
53 /////////////////////////////////////////////////////////////////\r
54 \r
55 struct InsetParamsDialog::Private\r
56 {\r
57         Private() : widget_(0), inset_(0), changed_(false) {}\r
58         ///\r
59         InsetParamsWidget * widget_;\r
60         /// The inset that was used at last Restore or Apply operation.\r
61         Inset const * inset_;\r
62         /// Set to true whenever the dialog is changed and set back to\r
63         /// false when the dialog is applied or restored.\r
64         bool changed_;\r
65 };\r
66 \r
67 /////////////////////////////////////////////////////////////////\r
68 //\r
69 // InsetParamsDialog\r
70 //\r
71 /////////////////////////////////////////////////////////////////\r
72 \r
73 InsetParamsDialog::InsetParamsDialog(GuiView & lv, InsetParamsWidget * widget)\r
74         : DialogView(lv, toqstr(insetName(widget->insetCode())),\r
75         toqstr(insetName(widget->insetCode()))), d(new Private)\r
76 {\r
77         setupUi(this);\r
78         setInsetParamsWidget(widget);\r
79         synchronizedViewCB->setChecked(false);\r
80         on_synchronizedViewCB_stateChanged(false);\r
81         setFocusProxy(widget);\r
82 }\r
83 \r
84 InsetParamsDialog::~InsetParamsDialog()\r
85 {\r
86         delete d;\r
87 }\r
88 \r
89 \r
90 bool InsetParamsDialog::initialiseParams(std::string const &)\r
91 {\r
92         on_restorePB_clicked();\r
93         return true;\r
94 }\r
95 \r
96 void InsetParamsDialog::setInsetParamsWidget(InsetParamsWidget * widget)\r
97 {\r
98         d->widget_ = widget;\r
99         stackedWidget->addWidget(widget);\r
100         stackedWidget->setCurrentWidget(widget);\r
101         connect(d->widget_, SIGNAL(changed()), this, SLOT(onWidget_changed()));\r
102 }\r
103 \r
104 \r
105 void InsetParamsDialog::on_restorePB_clicked()\r
106 {\r
107         updateView(true);\r
108         restorePB->setEnabled(false);\r
109         d->changed_ = false;\r
110         d->inset_ = inset(d->widget_->insetCode());\r
111 }\r
112 \r
113 \r
114 void InsetParamsDialog::on_okPB_clicked()\r
115 {\r
116         Inset const * i = inset(d->widget_->insetCode());\r
117         if (i)\r
118                 applyView();\r
119         else\r
120                 newInset();\r
121         hide();\r
122 }\r
123 \r
124 \r
125 void InsetParamsDialog::newInset()\r
126 {\r
127         docstring const argument = d->widget_->dialogToParams();\r
128         dispatch(FuncRequest(d->widget_->creationCode(), argument));\r
129 }\r
130 \r
131 \r
132 void InsetParamsDialog::on_newPB_clicked()\r
133 {\r
134         newInset();\r
135 }\r
136 \r
137 \r
138 void InsetParamsDialog::on_applyPB_clicked()\r
139 {\r
140         applyView();\r
141 }\r
142 \r
143 \r
144 void InsetParamsDialog::on_closePB_clicked()\r
145 {\r
146         hide();\r
147 }\r
148 \r
149 \r
150 void InsetParamsDialog::on_synchronizedViewCB_stateChanged(int state)\r
151 {\r
152         checkWidgets(state == Qt::Checked);\r
153 }\r
154 \r
155 \r
156 docstring InsetParamsDialog::checkWidgets(bool synchronized_view)\r
157 {\r
158         bool const widget_ok = d->widget_->checkWidgets();\r
159         Inset const * ins = inset(d->widget_->insetCode());\r
160         docstring const argument = d->widget_->dialogToParams();\r
161         bool valid_argument = !argument.empty();\r
162         if (ins)\r
163                 valid_argument &= ins->validateModifyArgument(argument);\r
164         FuncCode const code = synchronized_view\r
165                 ? d->widget_->creationCode() : LFUN_INSET_MODIFY;\r
166         bool const lfun_ok = lyx::getStatus(FuncRequest(code, argument)).enabled();\r
167         bool const read_only = buffer().isReadonly();\r
168 \r
169         okPB->setEnabled(!synchronized_view && widget_ok && !read_only && valid_argument);\r
170         bool const can_be_restored = !synchronized_view && !read_only\r
171                         && ins && (ins != d->inset_ || d->changed_);\r
172         restorePB->setEnabled(can_be_restored);\r
173         applyPB->setEnabled(lfun_ok && widget_ok && !read_only && valid_argument);\r
174         d->widget_->setEnabled(!read_only);\r
175         return argument;\r
176 }\r
177 \r
178 \r
179 void InsetParamsDialog::onWidget_changed()\r
180 {\r
181         d->changed_ = true;\r
182         docstring const argument = checkWidgets(synchronizedViewCB->isChecked());\r
183         if (synchronizedViewCB->isChecked())\r
184                 dispatch(FuncRequest(LFUN_INSET_MODIFY, argument));\r
185 }\r
186 \r
187 \r
188 void InsetParamsDialog::applyView()\r
189 {\r
190         docstring const argument = checkWidgets(synchronizedViewCB->isChecked());\r
191         dispatch(FuncRequest(LFUN_INSET_MODIFY, argument));\r
192         d->changed_ = false;\r
193         d->inset_ = inset(d->widget_->insetCode());\r
194         updateView(true);\r
195 }\r
196 \r
197 \r
198 void InsetParamsDialog::updateView(bool update_widget)\r
199 {\r
200         if (update_widget) {\r
201                 Inset const * i = inset(d->widget_->insetCode());\r
202                 if (i) {\r
203                         d->widget_->blockSignals(true);\r
204                         d->widget_->paramsToDialog(i);\r
205                         d->widget_->blockSignals(false);\r
206                 }\r
207         }\r
208         checkWidgets(synchronizedViewCB->isChecked());\r
209 }\r
210 \r
211 \r
212 void InsetParamsDialog::updateView()\r
213 {\r
214         updateView(synchronizedViewCB->isChecked());\r
215 }\r
216 \r
217 \r
218 Dialog * createDialog(GuiView & lv, InsetCode code)\r
219 {\r
220         InsetParamsWidget * widget;\r
221         switch (code) {\r
222         case ERT_CODE:\r
223                 widget = new GuiERT;\r
224                 break;\r
225         case FLOAT_CODE:\r
226                 widget = new FloatPlacement(true);\r
227                 break;\r
228         case BIBITEM_CODE:\r
229                 widget = new GuiBibitem;\r
230                 break;\r
231         case BRANCH_CODE:\r
232                 widget = new GuiBranch;\r
233                 break;\r
234         case BOX_CODE:\r
235                 widget = new GuiBox;\r
236                 break;\r
237         case HYPERLINK_CODE:\r
238                 widget = new GuiHyperlink;\r
239                 break;\r
240         case INFO_CODE:\r
241                 widget = new GuiInfo;\r
242                 break;\r
243         case LABEL_CODE:\r
244                 widget = new GuiLabel;\r
245                 break;\r
246         case LINE_CODE:\r
247                 widget = new GuiLine;\r
248                 break;\r
249         case MATH_SPACE_CODE:\r
250                 widget = new GuiHSpace(true);\r
251                 break;\r
252         case SPACE_CODE:\r
253                 widget = new GuiHSpace(false);\r
254                 break;\r
255         case TABULAR_CODE:\r
256                 widget = new GuiTabular;\r
257                 break;\r
258         case VSPACE_CODE:\r
259                 widget = new GuiVSpace;\r
260                 break;\r
261         default: return 0;\r
262         }\r
263         InsetParamsDialog * dialog = new InsetParamsDialog(lv, widget);\r
264         return dialog;\r
265 }\r
266 \r
267 \r
268 Dialog * createDialog(GuiView & lv, string const & name)\r
269 {\r
270         return createDialog(lv, insetCode(name));\r
271 }\r
272 \r
273 } // namespace frontend\r
274 } // namespace lyx\r
275 \r
276 #include "moc_InsetParamsDialog.cpp"\r