Rev 10379 | Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
10355 | subik | 1 | /* |
2 | For general Scribus (>=1.3.2) copyright and licensing information please refer |
||
3 | to the COPYING file provided with the program. Following this notice may exist |
||
4 | a copyright and/or license notice that predates the release of Scribus 1.3.2 |
||
5 | for which a new license (GPL+exception) is in place. |
||
6 | */ |
||
7 | #include "smcstylewidget.h" |
||
8 | #include "util_icon.h" |
||
9 | #include "util.h" |
||
10 | #include "units.h" |
||
11 | |||
12 | |||
13 | SMCStyleWidget::SMCStyleWidget(QWidget *parent) : QWidget() |
||
14 | { |
||
15 | setupUi(this); |
||
16 | |||
17 | fontSize_->setMinimum(1.0); |
||
18 | fontSize_->setMaximum(2048.0); |
||
19 | fontSizeLabel_->setPixmap(loadIcon("Zeichen.xpm")); |
||
20 | |||
21 | trackingLabel_->setPixmap( loadIcon("textkern.png") ); |
||
22 | tracking_->setMinimum(-300.0); |
||
23 | tracking_->setMaximum(300.0); |
||
24 | tracking_->setSuffix( tr( " %" ) ); |
||
25 | |||
26 | baselineOffsetLabel_->setPixmap( loadIcon("textbase.png") ); |
||
27 | baselineOffset_->setMinimum(-100.0); |
||
28 | baselineOffset_->setMaximum(100.0); |
||
29 | baselineOffset_->setSuffix( tr( " %" ) ); |
||
30 | |||
31 | hscaleLabel_->setPixmap( loadIcon("textscaleh.png") ); |
||
32 | fontHScale_->setMinimum(10.0); |
||
33 | fontHScale_->setMaximum(400.0); |
||
34 | fontHScale_->setSuffix( tr( " %" ) ); |
||
35 | |||
36 | vscaleLabel_->setPixmap( loadIcon("textscalev.png") ); |
||
37 | fontVScale_->setMinimum(10.0); |
||
38 | fontVScale_->setMaximum(400.0); |
||
39 | fontVScale_->setSuffix( tr( " %" ) ); |
||
40 | |||
41 | FillIcon->setPixmap(loadIcon("16/color-fill.png")); |
||
42 | fillShadeLabel->setPixmap( loadIcon("shade.png") ); |
||
43 | StrokeIcon->setPixmap(loadIcon("16/color-stroke.png")); |
||
44 | strokeShadeLabel->setPixmap( loadIcon("shade.png") ); |
||
45 | |||
46 | fillColor_->clear(); |
||
47 | strokeColor_->clear(); |
||
48 | ColorList::Iterator it; |
||
49 | QPixmap pm = QPixmap(15, 15); |
||
50 | fillColor_->insertItem(CommonStrings::tr_NoneColor); |
||
51 | strokeColor_->insertItem(CommonStrings::tr_NoneColor); |
||
52 | StrokeIcon->setEnabled(false); |
||
53 | strokeShade_->setEnabled(false); |
||
54 | strokeColor_->setEnabled(false); |
||
55 | |||
56 | connect(effects_, SIGNAL(State(int)), this, SLOT(slotColorChange())); |
||
57 | } |
||
58 | |||
59 | void SMCStyleWidget::languageChange() |
||
60 | { |
||
61 | /***********************************/ |
||
62 | /* Begin Tooltips */ |
||
63 | /***********************************/ |
||
64 | // These are for the character style page |
||
65 | // as in character styles and in paragraph style's character style |
||
66 | |||
67 | QToolTip::add(parentCombo, tr("Parent style")); |
||
68 | QToolTip::add(fontFace_, tr("Font face")); |
||
69 | QToolTip::add(fontSize_, tr("Font size")); |
||
70 | QToolTip::add(tracking_, tr("Tracking")); |
||
71 | QToolTip::add(baselineOffset_, tr("Baseline offset")); |
||
72 | QToolTip::add(fontHScale_, tr("Horizontal scaling")); |
||
73 | QToolTip::add(fontVScale_, tr("Vertical scaling")); |
||
74 | QToolTip::add(language_, tr("Language")); |
||
75 | QToolTip::add(fillColor_, tr("Fill color")); |
||
76 | QToolTip::add(fillShade_, tr("Fill shade")); |
||
77 | QToolTip::add(strokeColor_, tr("Stroke color")); |
||
78 | QToolTip::add(strokeShade_, tr("Stroke shade")); |
||
79 | |||
80 | /***********************************/ |
||
81 | /* End Tooltips */ |
||
82 | /***********************************/ |
||
83 | |||
84 | parentLabel->setText( tr("Based On:")); |
||
85 | languageLabel_->setText( tr("Language:")); |
||
86 | fontVScale_->setSuffix( tr(" %")); |
||
87 | fontHScale_->setSuffix( tr(" %")); |
||
88 | baselineOffset_->setSuffix( tr(" %")); |
||
89 | tracking_->setSuffix( tr(" %")); |
||
90 | fontSize_->setSuffix(unitGetSuffixFromIndex(0)); |
||
91 | } |
||
92 | |||
93 | void SMCStyleWidget::fillLangCombo(QMap<QString,QString> langMap) |
||
94 | { |
||
95 | QStringList sortList; |
||
96 | QMap<QString,QString>::Iterator it; |
||
97 | |||
98 | langMap_ = langMap; |
||
99 | |||
100 | language_->clear(); |
||
101 | |||
102 | for (it = langMap.begin(); it != langMap.end(); ++it) |
||
103 | sortList.push_back(it.data()); |
||
104 | |||
105 | language_->insertStringList(sortQStringList(sortList)); |
||
106 | |||
107 | QListView *tmpView = dynamic_cast<QListView*>(language_->view()); Q_ASSERT(tmpView); |
||
108 | int tmpWidth = tmpView->sizeHintForColumn(0); |
||
109 | if (tmpWidth > 0) |
||
110 | tmpView->setMinimumWidth(tmpWidth + 24); |
||
111 | } |
||
112 | |||
113 | void SMCStyleWidget::fillColorCombo(ColorList &colors) |
||
114 | { |
||
115 | fillColor_->clear(); |
||
116 | strokeColor_->clear(); |
||
117 | |||
118 | fillColor_->insertItem(CommonStrings::tr_NoneColor); |
||
119 | strokeColor_->insertItem(CommonStrings::tr_NoneColor); |
||
120 | ColorList::Iterator itend=colors.end(); |
||
121 | ScribusDoc* doc = colors.document(); |
||
122 | for (ColorList::Iterator it = colors.begin(); it != itend; ++it) |
||
123 | { |
||
124 | fillColor_->insertSmallItem(it.data(), doc, it.key()); |
||
125 | strokeColor_->insertSmallItem(it.data(), doc, it.key()); |
||
126 | } |
||
127 | fillColor_->view()->setMinimumWidth(fillColor_->view()->maximumViewportSize().width()+24); |
||
128 | strokeColor_->view()->setMinimumWidth(strokeColor_->view()->maximumViewportSize().width()+24); |
||
129 | } |
||
130 | |||
131 | void SMCStyleWidget::show(CharStyle *cstyle, QList<CharStyle> &cstyles, const QString &defLang, int unitIndex) |
||
132 | { |
||
133 | disconnect(effects_, SIGNAL(State(int)), this, SLOT(slotColorChange())); |
||
134 | parentCombo->setEnabled(true); |
||
135 | const CharStyle *parent = dynamic_cast<const CharStyle*>(cstyle->parentStyle()); |
||
136 | bool hasParent = cstyle->hasParent() && parent != 0 && parent->hasName() && cstyle->parent() != ""; |
||
137 | if (hasParent) |
||
138 | { |
||
139 | fontSize_->setValue(cstyle->fontSize() / 10.0, cstyle->isInhFontSize()); |
||
140 | fontSize_->setParentValue(parent->fontSize() / 10.0); |
||
141 | |||
142 | fontHScale_->setValue(cstyle->scaleH() / 10.0, cstyle->isInhScaleH()); |
||
143 | fontHScale_->setParentValue(parent->scaleH() / 10.0); |
||
144 | |||
145 | fontVScale_->setValue(cstyle->scaleV() / 10.0, cstyle->isInhScaleV()); |
||
146 | fontVScale_->setParentValue(parent->scaleV() / 10.0); |
||
147 | |||
148 | baselineOffset_->setValue(cstyle->baselineOffset() / 10.0, cstyle->isInhBaselineOffset()); |
||
149 | baselineOffset_->setParentValue(parent->baselineOffset() / 10.0); |
||
150 | |||
151 | tracking_->setValue(cstyle->tracking() / 10.0, cstyle->isInhTracking()); |
||
152 | tracking_->setParentValue(parent->tracking() / 10.0); |
||
153 | |||
154 | effects_->setStyle(static_cast<int>(cstyle->effects()), cstyle->isInhFeatures()); |
||
155 | effects_->setParentItem(static_cast<int>(parent->effects())); // FIXME |
||
156 | |||
157 | fillShade_->setValue(qRound(cstyle->fillShade()), cstyle->isInhFillShade()); |
||
158 | fillShade_->setParentValue(qRound(parent->fillShade())); |
||
159 | |||
160 | strokeShade_->setValue(qRound(cstyle->strokeShade()), cstyle->isInhStrokeShade()); |
||
161 | strokeShade_->setParentValue(qRound(parent->strokeShade())); |
||
162 | |||
163 | fillColor_->setCurrentText(cstyle->fillColor(), cstyle->isInhFillColor()); |
||
164 | fillColor_->setParentText(parent->fillColor()); |
||
165 | |||
166 | strokeColor_->setCurrentText(cstyle->strokeColor(), cstyle->isInhStrokeColor()); |
||
167 | strokeColor_->setParentText(parent->strokeColor()); |
||
168 | |||
169 | fontFace_->setCurrentFont(cstyle->font().scName(), cstyle->isInhFont()); |
||
170 | fontFace_->setParentFont(parent->font().scName()); |
||
171 | } |
||
172 | else |
||
173 | { |
||
174 | fontSize_->setValue(cstyle->fontSize() / 10.0); |
||
175 | fontHScale_->setValue(cstyle->scaleH() / 10.0); |
||
176 | fontVScale_->setValue(cstyle->scaleV() / 10.0); |
||
177 | baselineOffset_->setValue(cstyle->baselineOffset() / 10.0); |
||
178 | tracking_->setValue(cstyle->tracking() / 10.0); |
||
179 | effects_->setStyle(static_cast<int>(cstyle->effects())); |
||
180 | fillShade_->setValue(qRound(cstyle->fillShade())); |
||
181 | strokeShade_->setValue(qRound(cstyle->strokeShade())); |
||
182 | fillColor_->setCurrentText(cstyle->fillColor()); |
||
183 | strokeColor_->setCurrentText(cstyle->strokeColor()); |
||
184 | fontFace_->setCurrentFont(cstyle->font().scName()); |
||
185 | } |
||
186 | |||
187 | effects_->ShadowVal->Xoffset->setValue(cstyle->shadowXOffset() / 10.0); |
||
188 | effects_->ShadowVal->Yoffset->setValue(cstyle->shadowYOffset() / 10.0); |
||
189 | effects_->OutlineVal->LWidth->setValue(cstyle->outlineWidth() / 10.0); |
||
190 | effects_->StrikeVal->LPos->setValue(cstyle->strikethruOffset() / 10.0); |
||
191 | effects_->StrikeVal->LWidth->setValue(cstyle->strikethruWidth() / 10.0); |
||
192 | effects_->UnderlineVal->LPos->setValue(cstyle->underlineOffset() / 10.0); |
||
193 | effects_->UnderlineVal->LWidth->setValue(cstyle->underlineWidth() / 10.0); |
||
194 | slotColorChange(); |
||
195 | |||
196 | parentCombo->clear(); |
||
197 | parentCombo->insertItem(""); |
||
198 | for (int i = 0; i < cstyles.count(); ++i) |
||
199 | { |
||
200 | if (cstyles[i].name() != cstyle->name()) |
||
201 | parentCombo->insertItem(cstyles[i].name()); |
||
202 | } |
||
203 | |||
204 | if (hasParent) |
||
205 | { |
||
206 | int index = 0; |
||
207 | for (int i = 0; i < parentCombo->count(); ++i) |
||
208 | { |
||
209 | if (parentCombo->text(i) == cstyle->parentStyle()->name()) |
||
210 | { |
||
211 | index = i; |
||
212 | break; |
||
213 | } |
||
214 | } |
||
215 | parentCombo->setCurrentItem(index); |
||
216 | } |
||
217 | else |
||
218 | parentCombo->setCurrentItem(0); |
||
219 | |||
220 | QString clang = cstyle->language().isNull() || cstyle->language().isEmpty() ? |
||
221 | defLang : cstyle->language(); |
||
222 | QString plang(QString::null); |
||
223 | if (hasParent) |
||
224 | plang = parent->language().isNull() || parent->language().isEmpty() ? |
||
225 | defLang : parent->language(); |
||
226 | |||
227 | int ci = -1, pi = -1, di = -1; |
||
228 | for (int i = 0; i < language_->count(); ++i) |
||
229 | { |
||
230 | if (language_->text(i) == langMap_[clang]) |
||
231 | ci = i; |
||
232 | |||
233 | if (hasParent && language_->text(i) == langMap_[plang]) |
||
234 | pi = i; |
||
235 | |||
236 | if (language_->text(i) == defLang || language_->text(i) == langMap_[defLang]) |
||
237 | di = i; |
||
238 | } |
||
239 | |||
240 | // qDebug(QString("SMCStyleWidget::show(): deflan='%1'->'%2'").arg(defLang).arg(langMap_[defLang])); |
||
241 | Q_ASSERT(di != -1); |
||
242 | |||
243 | if (hasParent) |
||
244 | { |
||
245 | if (ci == -1) |
||
246 | language_->setCurrentItem(di, cstyle->isInhLanguage()); |
||
247 | else |
||
248 | language_->setCurrentItem(ci, cstyle->isInhLanguage()); |
||
249 | |||
250 | language_->setParentItem(pi); |
||
251 | } |
||
252 | else |
||
253 | { |
||
254 | if (ci == -1) |
||
255 | language_->setCurrentItem(di); |
||
256 | else |
||
257 | language_->setCurrentItem(ci); |
||
258 | } |
||
259 | |||
260 | connect(effects_, SIGNAL(State(int)), this, SLOT(slotColorChange())); |
||
261 | } |
||
262 | |||
263 | void SMCStyleWidget::show(QList<CharStyle*> &cstyles, QList<CharStyle> &cstylesAll, const QString &defLang, int unitIndex) |
||
264 | { |
||
265 | // int decimals = unitGetDecimalsFromIndex(unitIndex); |
||
266 | // QString suffix = unitGetSuffixFromIndex(unitIndex); |
||
267 | |||
268 | if (cstyles.count() == 1) |
||
269 | show(cstyles[0], cstylesAll, defLang, unitIndex); |
||
270 | else if (cstyles.count() > 1) |
||
271 | { |
||
272 | showSizeAndPosition(cstyles); |
||
273 | showEffects(cstyles); |
||
274 | showColors(cstyles); |
||
275 | showLanguage(cstyles, defLang); |
||
276 | showParent(cstyles); |
||
277 | } |
||
278 | } |
||
279 | |||
280 | void SMCStyleWidget::showSizeAndPosition(const QList<CharStyle*> &cstyles) |
||
281 | { |
||
282 | double d = -30000; |
||
283 | for (int i = 0; i < cstyles.count(); ++i) |
||
284 | { |
||
285 | if (d != -30000 && cstyles[i]->fontSize() != d) |
||
286 | { |
||
287 | d = -30000; |
||
288 | break; |
||
289 | } |
||
290 | else |
||
291 | d = cstyles[i]->fontSize(); |
||
292 | } |
||
293 | if (d == -30000) |
||
294 | fontSize_->clear(); |
||
295 | else |
||
296 | fontSize_->setValue(d / 10.0); |
||
297 | |||
298 | d = -30000; |
||
299 | for (int i = 0; i < cstyles.count(); ++i) |
||
300 | { |
||
301 | if (d != -30000 && cstyles[i]->scaleH() != d) |
||
302 | { |
||
303 | d = -30000; |
||
304 | break; |
||
305 | } |
||
306 | else |
||
307 | d = cstyles[i]->scaleH(); |
||
308 | } |
||
309 | if (d == -30000) |
||
310 | fontHScale_->clear(); |
||
311 | else |
||
312 | fontHScale_->setValue(d / 10.0); |
||
313 | |||
314 | d = -30000; |
||
315 | for (int i = 0; i < cstyles.count(); ++i) |
||
316 | { |
||
317 | if (d != -30000 && cstyles[i]->scaleV() != d) |
||
318 | { |
||
319 | d = -30000; |
||
320 | break; |
||
321 | } |
||
322 | else |
||
323 | d = cstyles[i]->scaleV(); |
||
324 | } |
||
325 | if (d == -30000) |
||
326 | fontVScale_->clear(); |
||
327 | else |
||
328 | fontVScale_->setValue(d / 10.0); |
||
329 | |||
330 | d = -30000; |
||
331 | for (int i = 0; i < cstyles.count(); ++i) |
||
332 | { |
||
333 | if (d != -30000 && cstyles[i]->baselineOffset() != d) |
||
334 | { |
||
335 | d = -30000; |
||
336 | break; |
||
337 | } |
||
338 | else |
||
339 | d = cstyles[i]->baselineOffset(); |
||
340 | } |
||
341 | if (d == -30000) |
||
342 | baselineOffset_->clear(); |
||
343 | else |
||
344 | baselineOffset_->setValue(d / 10.0); |
||
345 | |||
346 | d = -30000; |
||
347 | for (int i = 0; i < cstyles.count(); ++i) |
||
348 | { |
||
349 | if (d != -30000 && cstyles[i]->tracking() != d) |
||
350 | { |
||
351 | d = -30000; |
||
352 | break; |
||
353 | } |
||
354 | else |
||
355 | d = cstyles[i]->tracking(); |
||
356 | } |
||
357 | if (d == -30000) |
||
358 | tracking_->clear(); |
||
359 | else |
||
360 | tracking_->setValue(d / 10.0); |
||
361 | } |
||
362 | |||
363 | void SMCStyleWidget::showEffects(const QList<CharStyle*> &cstyles) |
||
364 | { |
||
365 | int d = -30000; |
||
366 | for (int i = 0; i < cstyles.count(); ++i) |
||
367 | { |
||
368 | if (d != -30000 && static_cast<int>(cstyles[i]->effects()) != d) |
||
369 | { |
||
370 | d = -30000; |
||
371 | break; |
||
372 | } |
||
373 | else |
||
374 | d = static_cast<int>(cstyles[i]->effects()); |
||
375 | } |
||
376 | if (d == -30000) |
||
377 | effects_->setStyle(0); |
||
378 | else |
||
379 | effects_->setStyle(d); |
||
380 | |||
381 | // TODO these things still missing: |
||
382 | // effects_->ShadowVal->Xoffset->setValue(cstyle->shadowXOffset() / 10.0); |
||
383 | // effects_->ShadowVal->Yoffset->setValue(cstyle->shadowYOffset() / 10.0); |
||
384 | // effects_->OutlineVal->LWidth->setValue(cstyle->outlineWidth() / 10.0); |
||
385 | // effects_->StrikeVal->LPos->setValue(cstyle->strikethruOffset() / 10.0); |
||
386 | // effects_->StrikeVal->LWidth->setValue(cstyle->strikethruWidth() / 10.0); |
||
387 | // effects_->UnderlineVal->LPos->setValue(cstyle->underlineOffset() / 10.0); |
||
388 | // effects_->UnderlineVal->LWidth->setValue(cstyle->underlineWidth() / 10.0); |
||
389 | } |
||
390 | |||
391 | void SMCStyleWidget::showColors(const QList<CharStyle*> &cstyles) |
||
392 | { |
||
393 | strokeShade_->setEnabled(true); |
||
394 | strokeColor_->setEnabled(true); |
||
395 | |||
396 | double d = -30000; |
||
397 | for (int i = 0; i < cstyles.count(); ++i) |
||
398 | { |
||
399 | if (d != -30000 && cstyles[i]->fillShade() != d) |
||
400 | { |
||
401 | d = -30000; |
||
402 | break; |
||
403 | } |
||
404 | else |
||
405 | d = cstyles[i]->fillShade(); |
||
406 | } |
||
407 | if (d == -30000) |
||
408 | fillShade_->setText( tr("Shade")); |
||
409 | else |
||
410 | fillShade_->setValue(qRound(d)); |
||
411 | |||
412 | d = -30000; |
||
413 | for (int i = 0; i < cstyles.count(); ++i) |
||
414 | { |
||
415 | if (d != -30000 && cstyles[i]->strokeShade() != d) |
||
416 | { |
||
417 | d = -30000; |
||
418 | break; |
||
419 | } |
||
420 | else |
||
421 | d = cstyles[i]->strokeShade(); |
||
422 | } |
||
423 | if (d == -30000) |
||
424 | { |
||
425 | strokeShade_->setValue(21); |
||
426 | strokeShade_->setText( tr("Shade")); |
||
427 | } |
||
428 | else |
||
429 | strokeShade_->setValue(qRound(d)); |
||
430 | |||
431 | QString s; |
||
432 | QString emptyString; |
||
433 | for (int i = 0; i < cstyles.count(); ++i) |
||
434 | { |
||
435 | if (!s.isNull() && s != cstyles[i]->fillColor()) |
||
436 | { |
||
437 | s = emptyString; |
||
438 | break; |
||
439 | } |
||
440 | else |
||
441 | s = cstyles[i]->fillColor(); |
||
442 | } |
||
443 | if (s.isEmpty()) |
||
444 | { |
||
445 | if (fillColor_->text(fillColor_->count() - 1) != "") |
||
446 | fillColor_->insertItem(""); |
||
447 | fillColor_->setCurrentItem(fillColor_->count() - 1); |
||
448 | } |
||
449 | else |
||
450 | fillColor_->setCurrentText(s); |
||
451 | |||
452 | s = emptyString; |
||
453 | for (int i = 0; i < cstyles.count(); ++i) |
||
454 | { |
||
455 | if (!s.isNull() && s != cstyles[i]->strokeColor()) |
||
456 | { |
||
457 | s = emptyString; |
||
458 | break; |
||
459 | } |
||
460 | else |
||
461 | s = cstyles[i]->strokeColor(); |
||
462 | } |
||
463 | if (s.isEmpty()) |
||
464 | { |
||
465 | if (strokeColor_->text(strokeColor_->count() - 1) != "") |
||
466 | strokeColor_->insertItem(""); |
||
467 | strokeColor_->setCurrentItem(fillColor_->count() - 1); |
||
468 | } |
||
469 | else |
||
470 | strokeColor_->setCurrentText(s); |
||
471 | } |
||
472 | |||
473 | void SMCStyleWidget::showLanguage(const QList<CharStyle*> &cstyles, const QString &defLang) |
||
474 | { |
||
475 | QString emptyString; |
||
476 | QString s(cstyles[0]->language()); |
||
477 | for (int i = 0; i < cstyles.count(); ++i) |
||
478 | { |
||
479 | if (s != cstyles[i]->language()) |
||
480 | { |
||
481 | s = emptyString; |
||
482 | break; |
||
483 | } |
||
484 | else |
||
485 | s = cstyles[i]->language(); |
||
486 | } |
||
487 | |||
488 | if (s.isEmpty()) |
||
489 | { |
||
490 | if (language_->text(language_->count() - 1) != "") |
||
491 | language_->insertItem(""); |
||
492 | language_->setCurrentItem(language_->count() - 1); |
||
493 | } |
||
494 | else |
||
495 | { |
||
496 | Q_ASSERT(langMap_.contains(s)); |
||
497 | language_->setCurrentText(langMap_[s]); |
||
498 | } |
||
499 | } |
||
500 | |||
501 | void SMCStyleWidget::showParent(const QList<CharStyle*> &cstyles) |
||
502 | { |
||
503 | parentCombo->setEnabled(false); |
||
504 | } |
||
505 | |||
506 | void SMCStyleWidget::clearAll() |
||
507 | { |
||
508 | |||
509 | } |
||
510 | |||
511 | void SMCStyleWidget::slotColorChange() |
||
512 | { |
||
513 | int s = effects_->getStyle(); |
||
514 | bool enabled; |
||
515 | if ((s & 4) || (s & 256)) |
||
516 | enabled = true; |
||
517 | else |
||
518 | enabled = false; |
||
519 | StrokeIcon->setEnabled(enabled); |
||
520 | strokeShade_->setEnabled(enabled); |
||
521 | strokeColor_->setEnabled(enabled); |
||
522 | } |
||
523 | |||
524 | |||
525 | SMCStyleWidget::~SMCStyleWidget() |
||
526 | { |
||
527 | |||
528 | } |