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