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