]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/InsetParamsDialog.cpp
33344c7675fb9325ae156fa70b7595abd4cff00c
[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 void InsetParamsDialog::setInsetParamsWidget(InsetParamsWidget * widget)\r
78 {\r
79         d->widget_ = widget;\r
80         stackedWidget->addWidget(widget);\r
81         stackedWidget->setCurrentWidget(widget);\r
82         connect(d->widget_, SIGNAL(changed()), this, SLOT(onWidget_changed()));\r
83 }\r
84 \r
85 \r
86 void InsetParamsDialog::on_restorePB_clicked()\r
87 {\r
88         updateView();\r
89 }\r
90 \r
91 \r
92 void InsetParamsDialog::on_okPB_clicked()\r
93 {\r
94         Inset const * i = inset(d->widget_->insetCode());\r
95         if (i)\r
96                 applyView();\r
97         else\r
98                 newInset();\r
99         hide();\r
100 }\r
101 \r
102 \r
103 void InsetParamsDialog::newInset()\r
104 {\r
105         docstring const argument = d->widget_->dialogToParams();\r
106         dispatch(FuncRequest(d->widget_->creationCode(), argument));\r
107 }\r
108 \r
109 \r
110 void InsetParamsDialog::on_applyPB_clicked()\r
111 {\r
112         if (synchronizedViewCB->isChecked())\r
113                 newInset();\r
114         else\r
115                 applyView();\r
116 }\r
117 \r
118 \r
119 void InsetParamsDialog::on_closePB_clicked()\r
120 {\r
121         hide();\r
122 }\r
123 \r
124 \r
125 void InsetParamsDialog::on_synchronizedViewCB_stateChanged(int state)\r
126 {\r
127         bool const sync = (state == Qt::Checked);\r
128         QString const label = sync ? qt_("&New") :  qt_("&Apply");\r
129         applyPB->setText(label);\r
130         checkWidgets(sync);\r
131 }\r
132 \r
133 \r
134 docstring InsetParamsDialog::checkWidgets(bool synchronized_view)\r
135 {\r
136         bool const widget_ok = d->widget_->checkWidgets();\r
137         Inset const * ins = inset(d->widget_->insetCode());\r
138         docstring const argument = d->widget_->dialogToParams();\r
139         bool valid_argument = !argument.empty();\r
140         if (ins)\r
141                 valid_argument &= ins->validateModifyArgument(argument);\r
142         FuncCode const code = synchronized_view\r
143                 ? d->widget_->creationCode() : LFUN_INSET_MODIFY;\r
144         bool const lfun_ok = lyx::getStatus(FuncRequest(code, argument)).enabled();\r
145         bool const read_only = buffer().isReadonly();\r
146 \r
147         okPB->setEnabled(!synchronized_view && widget_ok && !read_only && valid_argument);\r
148         restorePB->setEnabled(!synchronized_view && ins && !read_only);\r
149         applyPB->setEnabled(lfun_ok && widget_ok && !read_only && valid_argument);\r
150         d->widget_->setEnabled(!read_only);\r
151         return argument;\r
152 }\r
153 \r
154 \r
155 void InsetParamsDialog::onWidget_changed()\r
156 {\r
157         docstring const argument = checkWidgets(synchronizedViewCB->isChecked());\r
158         if (synchronizedViewCB->isChecked())\r
159                 dispatch(FuncRequest(LFUN_INSET_MODIFY, argument));\r
160 }\r
161 \r
162 \r
163 void InsetParamsDialog::applyView()\r
164 {\r
165         docstring const argument = checkWidgets(synchronizedViewCB->isChecked());\r
166         dispatch(FuncRequest(LFUN_INSET_MODIFY, argument));\r
167 }\r
168 \r
169 \r
170 void InsetParamsDialog::updateView()\r
171 {\r
172         Inset const * i = inset(d->widget_->insetCode());\r
173         if (i) {\r
174                 d->widget_->blockSignals(true);\r
175                 d->widget_->paramsToDialog(i);\r
176                 d->widget_->blockSignals(false);\r
177         }\r
178         checkWidgets(synchronizedViewCB->isChecked());\r
179 }\r
180 \r
181 \r
182 Dialog * createDialog(GuiView & lv, InsetCode code)\r
183 {\r
184         InsetParamsWidget * widget;\r
185         switch (code) {\r
186         case ERT_CODE:\r
187                 widget = new GuiERT;\r
188                 break;\r
189         case FLOAT_CODE:\r
190                 widget = new FloatPlacement(true);\r
191                 break;\r
192         case BOX_CODE:\r
193                 widget = new GuiBox;\r
194                 break;\r
195         case INFO_CODE:\r
196                 widget = new GuiInfo;\r
197                 break;\r
198         case TABULAR_CODE:\r
199                 widget = new GuiTabular;\r
200                 break;\r
201         case VSPACE_CODE:\r
202                 widget = new GuiVSpace;\r
203                 break;\r
204         default: return 0;\r
205         }\r
206         InsetParamsDialog * dialog = new InsetParamsDialog(lv, widget);\r
207         return dialog;\r
208 }\r
209 \r
210 \r
211 Dialog * createDialog(GuiView & lv, string const & name)\r
212 {\r
213         return createDialog(lv, insetCode(name));\r
214 }\r
215 \r
216 } // namespace frontend\r
217 } // namespace lyx\r
218 \r
219 #include "moc_InsetParamsDialog.cpp"\r