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