1 #include <QMessageBox>
2
3 #include "notesstyleseditor.h"
4 #include "pageitem_noteframe.h"
5 #include "prefsmanager.h"
6 #include "prefsfile.h"
7 #include "scribusdoc.h"
8
9 #include "scribus.h"
10 #include "undomanager.h"
11 #include "util.h"
12
NotesStylesEditor(QWidget * parent,const char * name)13 NotesStylesEditor::NotesStylesEditor(QWidget *parent, const char *name)
14 : ScrPaletteBase(parent, name), m_Doc(nullptr)
15 {
16 setupUi(this);
17 QString pname(name);
18 if (pname.isEmpty())
19 pname = "notesStylesEditor";
20 m_prefs = PrefsManager::instance().prefsFile->getContext(pname);
21
22 setBlockSignals(true);
23
24 addNewNsMode = false;
25 setDoc(nullptr);
26 NSlistBox->setInsertPolicy(QComboBox::InsertAlphabetically);
27
28 RangeBox->addItem(tr("Document"), static_cast<int>(NSRdocument));
29 RangeBox->addItem(tr("Story"), static_cast<int>(NSRstory));
30
31 languageChange();
32
33 StartSpinBox->setMinimum(1);
34 StartSpinBox->setMaximum(99999);
35 changesMap.clear();
36
37 setBlockSignals(isVisible());
38 }
39
~NotesStylesEditor()40 NotesStylesEditor::~NotesStylesEditor()
41 {
42 storeVisibility(this->isVisible());
43 storePosition();
44 storeSize();
45 }
46
changeEvent(QEvent * e)47 void NotesStylesEditor::changeEvent(QEvent *e)
48 {
49 if (e->type() == QEvent::LanguageChange)
50 {
51 languageChange();
52 return;
53 }
54 ScrPaletteBase::changeEvent(e);
55 }
56
languageChange()57 void NotesStylesEditor::languageChange()
58 {
59 bool wasSignalsBlocked = signalsBlocked();
60 setBlockSignals(true);
61
62 retranslateUi(this);
63
64 if (addNewNsMode)
65 {
66 OKButton->setText(tr("Cancel"));
67 OKButton->setToolTip(tr("Dialog is in adding new notes style mode. After pressing Cancel button dialog will be switched into normal notes styles edit mode."));
68 ApplyButton->setText(tr("Add Style"));
69 }
70 else
71 {
72 OKButton->setText("OK");
73 OKButton->setToolTip("");
74 ApplyButton->setText(tr("Apply"));
75 }
76
77 bool paraStyleBlocked = paraStyleCombo->blockSignals(true);
78 int paraStyleIndex = paraStyleCombo->currentIndex();
79 paraStyleCombo->setDoc(m_Doc);
80 if (paraStyleIndex >= 0)
81 paraStyleCombo->setCurrentIndex(paraStyleIndex);
82 paraStyleCombo->blockSignals(paraStyleBlocked);
83
84 bool charStyleBlocked = charStyleCombo->blockSignals(true);
85 int charStyleIndex = charStyleCombo->currentIndex();
86 charStyleCombo->setDoc(m_Doc);
87 if (charStyleIndex >= 0)
88 charStyleCombo->setCurrentIndex(charStyleIndex);
89 charStyleCombo->blockSignals(charStyleBlocked);
90
91 bool rangeBlocked = RangeBox->blockSignals(true);
92 int rangeIndex = RangeBox->currentIndex();
93 RangeBox->clear();
94 RangeBox->addItem(tr("Document"), static_cast<int>(NSRdocument));
95 RangeBox->addItem(tr("Story"), static_cast<int>(NSRstory));
96 if (rangeIndex >= 0)
97 RangeBox->setCurrentIndex(rangeIndex);
98 RangeBox->blockSignals(rangeBlocked);
99
100 setBlockSignals(wasSignalsBlocked);
101 }
102
setDoc(ScribusDoc * doc)103 void NotesStylesEditor::setDoc(ScribusDoc *doc)
104 {
105 bool wasSignalsBlocked = signalsBlocked();
106 setBlockSignals(true);
107 if (m_Doc != nullptr)
108 disconnect(m_Doc->scMW(), SIGNAL(UpdateRequest(int)), this , SLOT(handleUpdateRequest(int)));
109 m_Doc = doc;
110 paraStyleCombo->setDoc(m_Doc);
111 charStyleCombo->setDoc(m_Doc);
112 if (m_Doc != nullptr)
113 {
114 updateNSList();
115 NSlistBox->setCurrentIndex(0);
116 readNotesStyle(NSlistBox->currentText());
117 setEnabled(true);
118 ApplyButton->setEnabled(false);
119 connect(m_Doc->scMW(), SIGNAL(UpdateRequest(int)), this , SLOT(handleUpdateRequest(int)));
120 }
121 else
122 {
123 changesMap.clear();
124 NewNameEdit->clear();
125 setEnabled(false);
126 }
127 setBlockSignals(wasSignalsBlocked);
128 }
129
handleUpdateRequest(int updateFlags)130 void NotesStylesEditor::handleUpdateRequest(int updateFlags)
131 {
132 bool wasSignalsBlocked = signalsBlocked();
133 setBlockSignals(true);
134 if ((updateFlags & reqCharStylesUpdate) || (updateFlags & reqTextStylesUpdate))
135 charStyleCombo->updateStyleList();
136 if ((updateFlags & reqParaStylesUpdate) || (updateFlags & reqTextStylesUpdate))
137 paraStyleCombo->updateStyleList();
138 readNotesStyle(NSlistBox->currentText());
139 setBlockSignals(wasSignalsBlocked);
140 }
141
updateNSList()142 void NotesStylesEditor::updateNSList()
143 {
144 bool wasSignalsBlocked = signalsBlocked();
145 NSlistBox->blockSignals(true);
146 if (m_Doc == nullptr)
147 NSlistBox->setEnabled(false);
148 else
149 {
150 NSlistBox->clear();
151 changesMap.clear();
152 for (int a = 0; a < m_Doc->m_docNotesStylesList.count(); ++a)
153 {
154 NSlistBox->addItem(m_Doc->m_docNotesStylesList.at(a)->name());
155 changesMap.insert(m_Doc->m_docNotesStylesList.at(a)->name(), *(m_Doc->m_docNotesStylesList.at(a)));
156 }
157 if (!m_Doc->m_docNotesStylesList.isEmpty())
158 NSlistBox->setEnabled(true);
159 if (NSlistBox->currentText() != tr("default"))
160 DeleteButton->setEnabled(true);
161 else
162 DeleteButton->setEnabled(false);
163 }
164 NSlistBox->blockSignals(wasSignalsBlocked);
165
166 DeleteButton->setEnabled(NSlistBox->currentText() != tr("default"));
167 }
168
setBlockSignals(bool block)169 void NotesStylesEditor::setBlockSignals(bool block)
170 {
171 foreach (QWidget* obj, findChildren<QWidget *>())
172 {
173 obj->blockSignals(block);
174 }
175 paraStyleCombo->blockSignals(block);
176 charStyleCombo->blockSignals(block);
177 }
178
setNotesStyle(NotesStyle * NS)179 void NotesStylesEditor::setNotesStyle(NotesStyle * NS)
180 {
181 if (NS == nullptr)
182 return;
183 bool wasSignalsBlocked = signalsBlocked();
184 setBlockSignals(true);
185 NSlistBox->setCurrentIndex(NSlistBox->findText(NS->name()));
186 NewNameEdit->setText(NS->name());
187 if (NS->name() == tr("default"))
188 NewNameEdit->setEnabled(false);
189 else
190 NewNameEdit->setEnabled(true);
191 FootRadio->setChecked(!NS->isEndNotes());
192 EndRadio->setEnabled(true);
193 EndRadio->setChecked(NS->isEndNotes());
194 NumberingBox->setCurrentFormat(NS->getType());
195 int rangeIndex = RangeBox->findData((int) NS->range());
196 RangeBox->setCurrentIndex((rangeIndex >= 0) ? rangeIndex : 0);
197 StartSpinBox->setValue(NS->start());
198 PrefixEdit->setText(NS->prefix());
199 SuffixEdit->setText(NS->suffix());
200 SuperMasterCheck->setChecked(NS->isSuperscriptInMaster());
201 SuperNoteCheck->setChecked(NS->isSuperscriptInNote());
202 if (!NS->notesParStyle().isEmpty() && (NS->notesParStyle() != tr("No Style")))
203 paraStyleCombo->setCurrentIndex(paraStyleCombo->findText(NS->notesParStyle()));
204 if (!NS->marksChStyle().isEmpty() && (NS->marksChStyle() != tr("No Style")))
205 charStyleCombo->setCurrentIndex(charStyleCombo->findText(NS->marksChStyle()));
206 AutoH->setChecked(NS->isAutoNotesHeight());
207 AutoW->setChecked(NS->isAutoNotesWidth());
208 AutoWeld->setChecked(NS->isAutoWeldNotesFrames());
209 //for endnotes disable autofixing size of notes frames
210 if (NS->isEndNotes())
211 {
212 AutoW->setEnabled(false);
213 AutoWeld->setEnabled(false);
214 }
215 else
216 {
217 AutoW->setEnabled(true);
218 AutoWeld->setEnabled(true);
219 }
220 AutoRemove->setChecked(NS->isAutoRemoveEmptyNotesFrames());
221
222 ApplyButton->setEnabled(false);
223 setBlockSignals(wasSignalsBlocked);
224 }
225
readNotesStyle(const QString & nsName)226 void NotesStylesEditor::readNotesStyle(const QString& nsName)
227 {
228 NotesStyle * NS = m_Doc->getNotesStyle(nsName);
229 setNotesStyle(NS);
230 }
231
on_NSlistBox_currentIndexChanged(const QString & arg1)232 void NotesStylesEditor::on_NSlistBox_currentIndexChanged(const QString &arg1)
233 {
234 if (arg1 != tr("default"))
235 DeleteButton->setEnabled(true);
236 else
237 DeleteButton->setEnabled(false);
238 readNotesStyle(arg1);
239 }
240
on_ApplyButton_clicked()241 void NotesStylesEditor::on_ApplyButton_clicked()
242 {
243 if (addNewNsMode)
244 {
245 QString newName = NSlistBox->currentText();
246 NotesStyle newNS = changesMap.value(newName);
247 if (m_Doc->validateNSet(newNS))
248 {
249 addNewNsMode = false;
250 OKButton->setText(tr("OK"));
251 OKButton->setToolTip("");
252 ApplyButton->setText(tr("Apply"));
253 m_Doc->newNotesStyle(newNS);
254 updateNSList();
255 NSlistBox->setCurrentIndex(NSlistBox->findText(newNS.name()));
256 }
257 else
258 return;
259 }
260 else
261 {
262 //remember current NStyle
263 QString currNS = NSlistBox->currentText();
264 NotesStyle* NS = nullptr;
265
266 foreach (const QString &nsName, changesMap.keys())
267 {
268 NotesStyle n = changesMap.value(nsName);
269
270 //validate settings
271 if (!m_Doc->validateNSet(n))
272 {
273 NSlistBox->setCurrentIndex(NSlistBox->findText(n.name()));
274 break;
275 }
276 //rename
277 if (nsName != n.name())
278 {
279 //new name for existing set
280 QString newName = n.name();
281 getUniqueName(newName, changesMap.keys(),"=");
282 n.setName(newName);
283 NewNameEdit->setText(newName);
284 //current NSet name change
285 if (currNS == nsName)
286 currNS = newName;
287 NS = m_Doc->getNotesStyle(nsName);
288 m_Doc->renameNotesStyle(NS, newName);
289 m_Doc->setNotesChanged(true);
290 }
291 //change settings and update marks
292 NS = m_Doc->getNotesStyle(n.name());
293 Q_ASSERT(NS != nullptr);
294 if (*NS != n)
295 {
296 SimpleState* ss = nullptr;
297 if (UndoManager::undoEnabled())
298 {
299 ss = new SimpleState(UndoManager::EditNotesStyle);
300 ss->set("NSTYLE", QString("edit"));
301 m_Doc->undoSetNotesStyle(ss, NS);
302 }
303 //converting foot <--> end notes or changing footnotes range
304 if ((NS->isEndNotes() != n.isEndNotes()) || (NS->isEndNotes() && n.isEndNotes() && NS->range() != n.range()))
305 {
306 foreach (PageItem_NoteFrame* nF, m_Doc->listNotesFrames(NS))
307 m_Doc->delNoteFrame(nF, false);
308 if (n.isEndNotes())
309 m_Doc->flag_updateEndNotes = true;
310 }
311 m_Doc->setNotesChanged(true); //notesframes width must be updated
312 *NS = n;
313 if (ss)
314 {
315 ss->set("NEWname", NS->name());
316 ss->set("NEWstart", NS->start());
317 ss->set("NEWendNotes", NS->isEndNotes());
318 ss->set("NEWnumFormat", (int) NS->getType());
319 ss->set("NEWrange", (int) NS->range());
320 ss->set("NEWprefix", NS->prefix());
321 ss->set("NEWsuffix", NS->suffix());
322 ss->set("NEWautoH", NS->isAutoNotesHeight());
323 ss->set("NEWautoW", NS->isAutoNotesWidth());
324 ss->set("NEWautoWeld", NS->isAutoWeldNotesFrames());
325 ss->set("NEWautoRemove", NS->isAutoRemoveEmptyNotesFrames());
326 ss->set("NEWsuperMaster", NS->isSuperscriptInMaster());
327 ss->set("NEWsuperNote", NS->isSuperscriptInNote());
328 ss->set("NEWmarksChStyle", NS->marksChStyle());
329 ss->set("NEWnotesParStyle", NS->notesParStyle());
330 UndoManager::instance()->action(m_Doc, ss);
331 }
332 //invalidate all text frames with marks from current changed notes style
333 foreach (PageItem* item, m_Doc->DocItems)
334 {
335 if (item->isTextFrame() && !item->isNoteFrame() && item->asTextFrame()->hasNoteMark(NS))
336 item->invalid = true;
337 }
338 m_Doc->updateNotesNums(NS);
339 m_Doc->updateNotesFramesSettings(NS);
340 if (m_Doc->flag_updateEndNotes)
341 m_Doc->updateEndnotesFrames(NS);
342 m_Doc->updateNotesFramesStyles(NS);
343 }
344 }
345 if (m_Doc->notesChanged())
346 {
347 updateNSList();
348 m_Doc->flag_updateMarksLabels = true;
349 m_Doc->changed();
350 m_Doc->regionsChanged()->update(QRectF());
351 }
352 //restore NStyle index
353 readNotesStyle(currNS);
354 }
355
356 ApplyButton->setEnabled(false);
357 NSlistBox->setEnabled(true);
358 NewButton->setEnabled(true);
359 }
360
on_DeleteButton_clicked()361 void NotesStylesEditor::on_DeleteButton_clicked()
362 {
363 QString nsName = NSlistBox->currentText();
364 int t = ScMessageBox::warning(m_Doc->scMW(), tr("Warning! Deleting Notes Style"), "<qt>" +
365 tr("You are going to delete notes style %1. All notes and marks using that style are also going to be deleted.").arg(nsName) + "</qt>",
366 QMessageBox::Ok | QMessageBox::Abort,
367 QMessageBox::Abort, // GUI default
368 QMessageBox::Ok); // batch default
369 if (t == QMessageBox::Ok)
370 {
371 m_Doc->deleteNotesStyle(nsName);
372 m_Doc->changed();
373 m_Doc->regionsChanged()->update(QRectF());
374 setDoc(m_Doc);
375 }
376 }
377
on_NewButton_clicked()378 void NotesStylesEditor::on_NewButton_clicked()
379 {
380 QString oldName = NSlistBox->currentText();
381 NotesStyle newNS = changesMap.value(oldName);
382 QString newName = oldName;
383 getUniqueName(newName, changesMap.keys(), "_");
384 newNS.setName(newName);
385 changesMap.insert(newName, newNS);
386 setNotesStyle(&newNS);
387
388 NewNameEdit->setEnabled(true);
389 NSlistBox->addItem(newName);
390 NSlistBox->setCurrentIndex(NSlistBox->findText(newName));
391 NSlistBox->setEnabled(false);
392 ApplyButton->setText(tr("Add Style"));
393 ApplyButton->setEnabled(true);
394 DeleteButton->setEnabled(false);
395 NewButton->setEnabled(false);
396 addNewNsMode = true;
397 OKButton->setText(tr("Cancel Adding"));
398 OKButton->setToolTip(tr("Notes Styles Editor is in adding new notes style mode. After pressing Cancel button Notes Styles Editor switch into normal notes styles edit mode."));
399 }
400
on_OKButton_clicked()401 void NotesStylesEditor::on_OKButton_clicked()
402 {
403 if (OKButton->text() != tr("OK"))
404 {
405 //in adding new style mode go back to normal editing mode
406 OKButton->setText(tr("OK"));
407 NewButton->setEnabled(true);
408 addNewNsMode = false;
409 QString newName = NSlistBox->currentText();
410 changesMap.remove(newName);
411 int index = NSlistBox->findText(newName);
412 NSlistBox->removeItem(index);
413 NSlistBox->setCurrentIndex(index-1);
414 on_NSlistBox_currentIndexChanged(NSlistBox->currentText());
415 }
416 else
417 {
418 if (ApplyButton->isEnabled())
419 //apply changes
420 on_ApplyButton_clicked();
421
422 //in normal mode close
423 close();
424 }
425 }
426
on_NewNameEdit_textChanged(const QString & arg1)427 void NotesStylesEditor::on_NewNameEdit_textChanged(const QString &arg1)
428 {
429 NotesStyle ns = changesMap.value(NSlistBox->currentText());
430 ns.setName(arg1);
431 changesMap.insert(NSlistBox->currentText(), ns);
432 ApplyButton->setEnabled(true);
433 }
434
on_FootRadio_toggled(bool checked)435 void NotesStylesEditor::on_FootRadio_toggled(bool checked)
436 {
437 bool wasSignalsBlocked = signalsBlocked();
438 setBlockSignals(true);
439
440 NotesStyle ns = changesMap.value(NSlistBox->currentText());
441 ns.setEndNotes(!checked);
442 changesMap.insert(NSlistBox->currentText(), ns);
443 EndRadio->setChecked(!checked);
444 if (checked)
445 {
446 ns.setAutoNotesWidth(true);
447 AutoW->setEnabled(true);
448 AutoW->setChecked(true);
449 ns.setAutoWeldNotesFrames(true);
450 AutoWeld->setEnabled(true);
451 AutoWeld->setChecked(true);
452 }
453
454 changesMap.insert(NSlistBox->currentText(), ns);
455 ApplyButton->setEnabled(true);
456 setBlockSignals(wasSignalsBlocked);
457 }
458
on_EndRadio_toggled(bool checked)459 void NotesStylesEditor::on_EndRadio_toggled(bool checked)
460 {
461 bool wasSignalsBlocked = signalsBlocked();
462 setBlockSignals(true);
463
464 NotesStyle ns = changesMap.value(NSlistBox->currentText());
465 ns.setEndNotes(checked);
466 FootRadio->setChecked(!checked);
467 if (checked)
468 {
469 ns.setAutoNotesWidth(false);
470 AutoW->setChecked(false);
471 AutoW->setEnabled(false);
472 ns.setAutoWeldNotesFrames(false);
473 AutoWeld->setChecked(false);
474 AutoWeld->setEnabled(false);
475 }
476
477 changesMap.insert(NSlistBox->currentText(), ns);
478 ApplyButton->setEnabled(true);
479 setBlockSignals(wasSignalsBlocked);
480 }
481
on_NumberingBox_currentIndexChanged(int)482 void NotesStylesEditor::on_NumberingBox_currentIndexChanged(int /*index*/)
483 {
484 NotesStyle ns = changesMap.value(NSlistBox->currentText());
485
486 NumFormat formatType = NumberingBox->currentFormat();
487 ns.setType(formatType);
488
489 changesMap.insert(NSlistBox->currentText(), ns);
490 ApplyButton->setEnabled(true);
491 }
492
on_RangeBox_currentIndexChanged(int index)493 void NotesStylesEditor::on_RangeBox_currentIndexChanged(int index)
494 {
495 NotesStyle ns = changesMap.value(NSlistBox->currentText());
496 ns.setRange((NumerationRange) RangeBox->itemData(index).toInt());
497
498 changesMap.insert(NSlistBox->currentText(), ns);
499 ApplyButton->setEnabled(true);
500 }
501
on_StartSpinBox_valueChanged(int arg1)502 void NotesStylesEditor::on_StartSpinBox_valueChanged(int arg1)
503 {
504 NotesStyle ns = changesMap.value(NSlistBox->currentText());
505 ns.setStart(arg1);
506
507 changesMap.insert(NSlistBox->currentText(), ns);
508 ApplyButton->setEnabled(true);
509 }
510
on_PrefixEdit_textChanged(const QString & arg1)511 void NotesStylesEditor::on_PrefixEdit_textChanged(const QString &arg1)
512 {
513 NotesStyle ns = changesMap.value(NSlistBox->currentText());
514 ns.setPrefix(arg1);
515
516 changesMap.insert(NSlistBox->currentText(), ns);
517 ApplyButton->setEnabled(true);
518 }
519
on_SuffixEdit_textChanged(const QString & arg1)520 void NotesStylesEditor::on_SuffixEdit_textChanged(const QString &arg1)
521 {
522 NotesStyle ns = changesMap.value(NSlistBox->currentText());
523 ns.setSuffix(arg1);
524
525 changesMap.insert(NSlistBox->currentText(), ns);
526 ApplyButton->setEnabled(true);
527 }
528
on_SuperMasterCheck_toggled(bool checked)529 void NotesStylesEditor::on_SuperMasterCheck_toggled(bool checked)
530 {
531 NotesStyle ns = changesMap.value(NSlistBox->currentText());
532 ns.setSuperscriptInMaster(checked);
533
534 changesMap.insert(NSlistBox->currentText(), ns);
535 ApplyButton->setEnabled(true);
536 }
537
on_SuperNoteCheck_toggled(bool checked)538 void NotesStylesEditor::on_SuperNoteCheck_toggled(bool checked)
539 {
540 NotesStyle ns = changesMap.value(NSlistBox->currentText());
541 ns.setSuperscriptInNote(checked);
542
543 changesMap.insert(NSlistBox->currentText(), ns);
544 ApplyButton->setEnabled(true);
545 }
546
on_AutoH_toggled(bool checked)547 void NotesStylesEditor::on_AutoH_toggled(bool checked)
548 {
549 NotesStyle ns = changesMap.value(NSlistBox->currentText());
550 ns.setAutoNotesHeight(checked);
551
552 changesMap.insert(NSlistBox->currentText(), ns);
553 ApplyButton->setEnabled(true);
554 }
555
on_AutoW_toggled(bool checked)556 void NotesStylesEditor::on_AutoW_toggled(bool checked)
557 {
558 NotesStyle ns = changesMap.value(NSlistBox->currentText());
559 ns.setAutoNotesWidth(checked);
560
561 changesMap.insert(NSlistBox->currentText(), ns);
562 ApplyButton->setEnabled(true);
563 }
564
on_AutoWeld_toggled(bool checked)565 void NotesStylesEditor::on_AutoWeld_toggled(bool checked)
566 {
567 NotesStyle ns = changesMap.value(NSlistBox->currentText());
568 ns.setAutoWeldNotesFrames(checked);
569
570 changesMap.insert(NSlistBox->currentText(), ns);
571 ApplyButton->setEnabled(true);
572 }
573
on_AutoRemove_toggled(bool checked)574 void NotesStylesEditor::on_AutoRemove_toggled(bool checked)
575 {
576 NotesStyle ns = changesMap.value(NSlistBox->currentText());
577 ns.setAutoRemoveEmptyNotesFrames(checked);
578
579 changesMap.insert(NSlistBox->currentText(), ns);
580 ApplyButton->setEnabled(true);
581 }
582
on_paraStyleCombo_currentIndexChanged(const int & arg1)583 void NotesStylesEditor::on_paraStyleCombo_currentIndexChanged(const int &arg1)
584 {
585 NotesStyle ns = changesMap.value(NSlistBox->currentText());
586 if (arg1 == 0)
587 ns.setNotesParStyle("");
588 else
589 ns.setNotesParStyle(paraStyleCombo->itemText(arg1));
590 changesMap.insert(NSlistBox->currentText(), ns);
591 ApplyButton->setEnabled(true);
592 }
593
on_charStyleCombo_currentIndexChanged(const int & arg1)594 void NotesStylesEditor::on_charStyleCombo_currentIndexChanged(const int &arg1)
595 {
596 NotesStyle ns = changesMap.value(NSlistBox->currentText());
597 if (arg1 == 0)
598 ns.setMarksCharStyle("");
599 else
600 ns.setMarksCharStyle(charStyleCombo->itemText(arg1));
601 changesMap.insert(NSlistBox->currentText(), ns);
602 ApplyButton->setEnabled(true);
603 }
604