00001
00002
00003
00004
00005
00006
00007
00008 #include <QDebug>
00009 #include <QFileDialog>
00010 #include <QMessageBox>
00011
00012 #include "charselect.h"
00013 #include "chartableview.h"
00014 #include "commonstrings.h"
00015 #include "fontcombo.h"
00016 #include "fonts/scfontmetrics.h"
00017 #include "pageitem_textframe.h"
00018 #include "prefscontext.h"
00019 #include "prefsfile.h"
00020 #include "prefsmanager.h"
00021 #include "sccombobox.h"
00022 #include "scpaths.h"
00023 #include "scribusdoc.h"
00024 #include "scribusview.h"
00025 #include "unicodesearch.h"
00026 #include "util.h"
00027 #include "util_icon.h"
00028
00029
00030 CharSelect::CharSelect(QWidget* parent)
00031 : ScrPaletteBase(parent, "CharSelect"),
00032 m_doc(0),
00033 m_characterClass(0),
00034 m_Item(0)
00035 {
00036 setupUi(this);
00037
00038 paletteFileMask = tr("Scribus Char Palette (*.ucp);;All Files (*)");
00039
00040 m_charTableModel = new CharTableModel(m_bigPalette, 26, m_doc,
00041 PrefsManager::instance()->appPrefs.toolSettings.defFont);
00042 m_charTable->setModel(m_charTableModel);
00043 m_charTable->setDragEnabled(true);
00044
00045 hideButton->setIcon(loadIcon("22/insert-table.png"));
00046 unicodeButton->setIcon(loadIcon("find.png"));
00047 uniLoadButton->setIcon(loadIcon("22/document-open.png"));
00048 uniSaveButton->setIcon(loadIcon("22/document-save.png"));
00049 uniClearButton->setIcon(loadIcon("22/document-new.png"));
00050
00051 m_userTableModel = new CharTableModel(m_quickPalette, 6, m_doc,
00052 PrefsManager::instance()->appPrefs.toolSettings.defFont);
00053 m_userTable->setModel(m_userTableModel);
00054 m_userTable->setAcceptDrops(true);
00055
00056
00057 connect(deleteButton, SIGNAL(clicked()), this, SLOT(delEdit()));
00058 connect(insertButton, SIGNAL(clicked()), this, SLOT(insChar()));
00059 connect(m_charTable, SIGNAL(selectChar(uint)), this, SLOT(newChar(uint)));
00060 connect(m_charTable, SIGNAL(delChar()), this, SLOT(delChar()));
00061 connect(m_userTable, SIGNAL(selectChar(uint)), this, SLOT(userNewChar(uint)));
00062 connect(m_userTable, SIGNAL(delChar()), this, SLOT(delChar()));
00063 connect(m_userTableModel, SIGNAL(selectionChanged(QItemSelectionModel*)),
00064 m_userTable, SLOT(modelSelectionChanged(QItemSelectionModel*)));
00065 connect(unicodeButton, SIGNAL(chosenUnicode(QString)), m_userTableModel, SLOT(appendUnicode(QString)));
00066 connect(fontSelector, SIGNAL(activated(int)), this, SLOT(newFont(int)));
00067 connect(rangeSelector, SIGNAL(activated(int)), this, SLOT(newCharClass(int)));
00068 connect(hideButton, SIGNAL(toggled(bool)), this, SLOT(hideButton_toggled(bool)));
00069 connect(this, SIGNAL(insertSpecialChar()), this, SLOT(slot_insertSpecialChar()));
00070 connect(this, SIGNAL(insertUserSpecialChar(QChar)), this, SLOT(slot_insertUserSpecialChar(QChar)));
00071 connect(uniLoadButton, SIGNAL(clicked()), this, SLOT(uniLoadButton_clicked()));
00072 connect(uniSaveButton, SIGNAL(clicked()), this, SLOT(uniSaveButton_clicked()));
00073 connect(uniClearButton, SIGNAL(clicked()), this, SLOT(uniClearButton_clicked()));
00074
00075 loadUserContent(ScPaths::getApplicationDataDir() + "charpalette.ucp");
00076 setupRangeCombo();
00077 newCharClass(0);
00078 }
00079
00080 CharSelect::~CharSelect()
00081 {
00082 }
00083
00084 void CharSelect::setDoc(ScribusDoc* doc)
00085 {
00086 if (m_doc != doc)
00087 {
00088 m_doc = doc;
00089 m_charTableModel->setDoc(m_doc);
00090 m_userTableModel->setDoc(m_doc);
00091 delEdit();
00092 setupRangeCombo();
00093 newCharClass(0);
00094 }
00095
00096 if (!m_doc)
00097 {
00098 saveUserContent(ScPaths::getApplicationDataDir() + "charpalette.ucp");
00099 return;
00100 }
00101
00102 QString oldFont(m_fontInUse);
00103 m_fontInUse = m_doc->currentStyle.charStyle().font().scName();
00104 if (oldFont != m_fontInUse && !m_fontInUse.isEmpty())
00105 {
00106 setCurrentComboItem(fontSelector, m_fontInUse);
00107 newFont(fontSelector->currentIndex());
00108 unicodeButton->setFont((*m_doc->AllFonts)[m_fontInUse]);
00109 }
00110 }
00111
00112 const QString & CharSelect::getCharacters()
00113 {
00114 return chToIns;
00115 }
00116
00117 void CharSelect::scanFont()
00118 {
00119 uint charcode;
00120 uint gindex;
00121 QString gname;
00122 allClasses.clear();
00123 charactersFull.clear();
00124 charactersLatin1.clear();
00125 charactersLatin1Supplement.clear();
00126 charactersLatinExtendedA.clear();
00127 charactersLatinExtendedB.clear();
00128 charactersGeneralPunctuation.clear();
00129 charactersSuperSubscripts.clear();
00130 charactersCurrencySymbols.clear();
00131 charactersLetterlikeSymbols.clear();
00132 charactersNumberForms.clear();
00133 charactersArrows.clear();
00134 charactersMathematicalOperators.clear();
00135 charactersBoxDrawing.clear();
00136 charactersBlockElements.clear();
00137 charactersGeometricShapes.clear();
00138 charactersMiscellaneousSymbols.clear();
00139 charactersDingbats.clear();
00140 charactersSmallFormVariants.clear();
00141 charactersAlphabeticPresentationForms.clear();
00142 charactersSpecial.clear();
00143 charactersGreek.clear();
00144 charactersGreekExtended.clear();
00145 charactersCyrillic.clear();
00146 charactersCyrillicSupplement.clear();
00147 charactersArabic.clear();
00148 charactersArabicPresentationFormsA.clear();
00149 charactersArabicPresentationFormsB.clear();
00150 charactersHebrew.clear();
00151 QMap<uint, std::pair<QChar, QString> > glyphs;
00152 (*m_doc->AllFonts)[m_fontInUse].glyphNames(glyphs);
00153 for (QMap<uint, std::pair<QChar, QString> >::iterator it=glyphs.begin();
00154 it != glyphs.end(); ++it)
00155 {
00156 charcode = it.value().first.unicode();
00157 gindex = it.key();
00158 gname = it.value().second;
00159 charactersFull.append(charcode);
00160 if ((charcode >= 0x0020) && (charcode <= 0x007F))
00161 charactersLatin1.append(charcode);
00162 else if ((charcode >= 0x0080) && (charcode <= 0x00FF))
00163 charactersLatin1Supplement.append(charcode);
00164 else if ((charcode >= 0x0100) && (charcode <= 0x017F))
00165 charactersLatinExtendedA.append(charcode);
00166 else if ((charcode >= 0x0180) && (charcode <= 0x024F))
00167 charactersLatinExtendedB.append(charcode);
00168 else if ((charcode >= 0x0370) && (charcode <= 0x03FF))
00169 charactersGreek.append(charcode);
00170 else if ((charcode >= 0x0400) && (charcode <= 0x04FF))
00171 charactersCyrillic.append(charcode);
00172 else if ((charcode >= 0x0500) && (charcode <= 0x052F))
00173 charactersCyrillicSupplement.append(charcode);
00174 else if ((charcode >= 0x0590) && (charcode <= 0x05FF))
00175 charactersHebrew.append(charcode);
00176 else if ((charcode >= 0x0600) && (charcode <= 0x06FF))
00177 charactersArabic.append(charcode);
00178 else if ((charcode >= 0x1F00) && (charcode <= 0x1FFF))
00179 charactersGreekExtended.append(charcode);
00180 else if ((charcode >= 0x2000) && (charcode <= 0x206F))
00181 charactersGeneralPunctuation.append(charcode);
00182 else if ((charcode >= 0x2070) && (charcode <= 0x209F))
00183 charactersSuperSubscripts.append(charcode);
00184 else if ((charcode >= 0x20A0) && (charcode <= 0x20CF))
00185 charactersCurrencySymbols.append(charcode);
00186 else if ((charcode >= 0x2100) && (charcode <= 0x214F))
00187 charactersLetterlikeSymbols.append(charcode);
00188 else if ((charcode >= 0x2150) && (charcode <= 0x218F))
00189 charactersNumberForms.append(charcode);
00190 else if ((charcode >= 0x2190) && (charcode <= 0x2190))
00191 charactersArrows.append(charcode);
00192 else if ((charcode >= 0x2200) && (charcode <= 0x22FF))
00193 charactersMathematicalOperators.append(charcode);
00194 else if ((charcode >= 0x2500) && (charcode <= 0x257F))
00195 charactersBoxDrawing.append(charcode);
00196 else if ((charcode >= 0x2580) && (charcode <= 0x259F))
00197 charactersBlockElements.append(charcode);
00198 else if ((charcode >= 0x25A0) && (charcode <= 0x25FF))
00199 charactersGeometricShapes.append(charcode);
00200 else if ((charcode >= 0x2600) && (charcode <= 0x26FF))
00201 charactersMiscellaneousSymbols.append(charcode);
00202 else if ((charcode >= 0x2700) && (charcode <= 0x27BF))
00203 charactersDingbats.append(charcode);
00204 else if ((charcode >= 0xFE50) && (charcode <= 0xFE6F))
00205 charactersSmallFormVariants.append(charcode);
00206 else if ((charcode >= 0xFB00) && (charcode <= 0xFB4F))
00207 charactersAlphabeticPresentationForms.append(charcode);
00208 else if ((charcode >= 0xFB50) && (charcode <= 0xFDFF))
00209 charactersArabicPresentationFormsA.append(charcode);
00210 else if ((charcode >= 0xFE70) && (charcode <= 0xFEFF))
00211 charactersArabicPresentationFormsB.append(charcode);
00212 else if ((charcode >= 0xFFF0) && (charcode <= 0xFFFF))
00213 charactersSpecial.append(charcode);
00214 }
00215 allClasses.append(charactersFull);
00216 allClasses.append(charactersLatin1);
00217 allClasses.append(charactersLatin1Supplement);
00218 allClasses.append(charactersLatinExtendedA);
00219 allClasses.append(charactersLatinExtendedB);
00220 allClasses.append(charactersGeneralPunctuation);
00221 allClasses.append(charactersSuperSubscripts);
00222 allClasses.append(charactersCurrencySymbols);
00223 allClasses.append(charactersLetterlikeSymbols);
00224 allClasses.append(charactersNumberForms);
00225 allClasses.append(charactersArrows);
00226 allClasses.append(charactersMathematicalOperators);
00227 allClasses.append(charactersBoxDrawing);
00228 allClasses.append(charactersBlockElements);
00229 allClasses.append(charactersGeometricShapes);
00230 allClasses.append(charactersMiscellaneousSymbols);
00231 allClasses.append(charactersDingbats);
00232 allClasses.append(charactersSmallFormVariants);
00233 allClasses.append(charactersAlphabeticPresentationForms);
00234 allClasses.append(charactersSpecial);
00235 allClasses.append(charactersGreek);
00236 allClasses.append(charactersGreekExtended);
00237 allClasses.append(charactersCyrillic);
00238 allClasses.append(charactersCyrillicSupplement);
00239 allClasses.append(charactersArabic);
00240 allClasses.append(charactersArabicPresentationFormsA);
00241 allClasses.append(charactersArabicPresentationFormsB);
00242 allClasses.append(charactersHebrew);
00243 }
00244
00245 void CharSelect::setupRangeCombo()
00246 {
00247 disconnect(rangeSelector, SIGNAL(activated(int)), this, SLOT(newCharClass(int)));
00248 int counter = 0;
00249 rangeSelector->clear();
00250 rangeSelector->addItem( tr("Full Character Set"));
00251 usedCharClasses.insert(counter, 0);
00252 counter++;
00253 if (charactersLatin1.count() != 0)
00254 {
00255 rangeSelector->addItem( tr("Basic Latin"));
00256 usedCharClasses.insert(counter, 1);
00257 counter++;
00258 }
00259 if (charactersLatin1Supplement.count() != 0)
00260 {
00261 rangeSelector->addItem( tr("Latin-1 Supplement"));
00262 usedCharClasses.insert(counter, 2);
00263 counter++;
00264 }
00265 if (charactersLatinExtendedA.count() != 0)
00266 {
00267 rangeSelector->addItem( tr("Latin Extended-A"));
00268 usedCharClasses.insert(counter, 3);
00269 counter++;
00270 }
00271 if (charactersLatinExtendedB.count() != 0)
00272 {
00273 rangeSelector->addItem( tr("Latin Extended-B"));
00274 usedCharClasses.insert(counter, 4);
00275 counter++;
00276 }
00277 if (charactersGeneralPunctuation.count() != 0)
00278 {
00279 rangeSelector->addItem( tr("General Punctuation"));
00280 usedCharClasses.insert(counter, 5);
00281 counter++;
00282 }
00283 if (charactersSuperSubscripts.count() != 0)
00284 {
00285 rangeSelector->addItem( tr("Super- and Subscripts"));
00286 usedCharClasses.insert(counter, 6);
00287 counter++;
00288 }
00289 if (charactersCurrencySymbols.count() != 0)
00290 {
00291 rangeSelector->addItem( tr("Currency Symbols"));
00292 usedCharClasses.insert(counter, 7);
00293 counter++;
00294 }
00295 if (charactersLetterlikeSymbols.count() != 0)
00296 {
00297 rangeSelector->addItem( tr("Letterlike Symbols"));
00298 usedCharClasses.insert(counter, 8);
00299 counter++;
00300 }
00301 if (charactersNumberForms.count() != 0)
00302 {
00303 rangeSelector->addItem( tr("Number Forms"));
00304 usedCharClasses.insert(counter, 9);
00305 counter++;
00306 }
00307 if (charactersArrows.count() != 0)
00308 {
00309 rangeSelector->addItem( tr("Arrows"));
00310 usedCharClasses.insert(counter, 10);
00311 counter++;
00312 }
00313 if (charactersMathematicalOperators.count() != 0)
00314 {
00315 rangeSelector->addItem( tr("Mathematical Operators"));
00316 usedCharClasses.insert(counter, 11);
00317 counter++;
00318 }
00319 if (charactersBoxDrawing.count() != 0)
00320 {
00321 rangeSelector->addItem( tr("Box Drawing"));
00322 usedCharClasses.insert(counter, 12);
00323 counter++;
00324 }
00325 if (charactersBlockElements.count() != 0)
00326 {
00327 rangeSelector->addItem( tr("Block Elements"));
00328 usedCharClasses.insert(counter, 13);
00329 counter++;
00330 }
00331 if (charactersGeometricShapes.count() != 0)
00332 {
00333 rangeSelector->addItem( tr("Geometric Shapes"));
00334 usedCharClasses.insert(counter, 14);
00335 counter++;
00336 }
00337 if (charactersMiscellaneousSymbols.count() != 0)
00338 {
00339 rangeSelector->addItem( tr("Miscellaneous Symbols"));
00340 usedCharClasses.insert(counter, 15);
00341 counter++;
00342 }
00343 if (charactersDingbats.count() != 0)
00344 {
00345 rangeSelector->addItem( tr("Dingbats"));
00346 usedCharClasses.insert(counter, 16);
00347 counter++;
00348 }
00349 if (charactersSmallFormVariants.count() != 0)
00350 {
00351 rangeSelector->addItem( tr("Small Form Variants"));
00352 usedCharClasses.insert(counter, 17);
00353 counter++;
00354 }
00355 if (charactersAlphabeticPresentationForms.count() != 0)
00356 {
00357 rangeSelector->addItem( tr("Ligatures"));
00358 usedCharClasses.insert(counter, 18);
00359 counter++;
00360 }
00361 if (charactersSpecial.count() != 0)
00362 {
00363 rangeSelector->addItem( tr("Specials"));
00364 usedCharClasses.insert(counter, 19);
00365 counter++;
00366 }
00367 if (charactersGreek.count() != 0)
00368 {
00369 rangeSelector->addItem( tr("Greek"));
00370 usedCharClasses.insert(counter, 20);
00371 counter++;
00372 }
00373 if (charactersGreekExtended.count() != 0)
00374 {
00375 rangeSelector->addItem( tr("Greek Extended"));
00376 usedCharClasses.insert(counter, 21);
00377 counter++;
00378 }
00379 if (charactersCyrillic.count() != 0)
00380 {
00381 rangeSelector->addItem( tr("Cyrillic"));
00382 usedCharClasses.insert(counter, 22);
00383 counter++;
00384 }
00385 if (charactersCyrillicSupplement.count() != 0)
00386 {
00387 rangeSelector->addItem( tr("Cyrillic Supplement"));
00388 usedCharClasses.insert(counter, 23);
00389 counter++;
00390 }
00391 if (charactersArabic.count() != 0)
00392 {
00393 rangeSelector->addItem( tr("Arabic"));
00394 usedCharClasses.insert(counter, 24);
00395 counter++;
00396 }
00397 if (charactersArabicPresentationFormsA.count() != 0)
00398 {
00399 rangeSelector->addItem( tr("Arabic Extended A"));
00400 usedCharClasses.insert(counter, 25);
00401 counter++;
00402 }
00403 if (charactersArabicPresentationFormsB.count() != 0)
00404 {
00405 rangeSelector->addItem( tr("Arabic Extended B"));
00406 usedCharClasses.insert(counter, 26);
00407 counter++;
00408 }
00409 if (charactersHebrew.count() != 0)
00410 {
00411 rangeSelector->addItem( tr("Hebrew"));
00412 usedCharClasses.insert(counter, 27);
00413 counter++;
00414 }
00415 rangeSelector->setCurrentIndex(0);
00416 connect(rangeSelector, SIGNAL(activated(int)), this, SLOT(newCharClass(int)));
00417 }
00418
00419 void CharSelect::generatePreview(int charClass)
00420 {
00421 characters.clear();
00422 if (charClass>=0 && charClass<allClasses.count())
00423 characters = allClasses[charClass];
00424 m_charTableModel->setCharacters(characters);
00425 }
00426
00427 void CharSelect::newCharClass(int c)
00428 {
00429 m_characterClass = usedCharClasses[c];
00430 generatePreview(m_characterClass);
00431 }
00432
00433 void CharSelect::newFont(int font)
00434 {
00435 QString oldFont(m_fontInUse);
00436 m_fontInUse = fontSelector->itemText(font);
00437 if (!m_fontInUse.isEmpty())
00438 {
00439 m_charTableModel->setFontInUse(m_fontInUse);
00440 m_userTableModel->setFontInUse(m_fontInUse);
00441 unicodeButton->setFont((*m_doc->AllFonts)[m_fontInUse]);
00442 (*m_doc->AllFonts)[m_fontInUse].increaseUsage();
00443 if (!oldFont.isEmpty())
00444 (*m_doc->AllFonts)[oldFont].decreaseUsage();
00445 delEdit();
00446 scanFont();
00447 generatePreview(0);
00448 m_characterClass = 0;
00449 setupRangeCombo();
00450 }
00451 }
00452
00453 void CharSelect::userNewChar(uint i)
00454 {
00455 emit insertUserSpecialChar(QChar(i));
00456 }
00457
00458 void CharSelect::newChar(uint i)
00459 {
00460 chToIns += QChar(i);
00461 sample->setPixmap(FontSample((*m_doc->AllFonts)[m_fontInUse], 28, chToIns, palette().color(QPalette::Window), true));
00462 insertButton->setEnabled(true);
00463 QString tmp;
00464 tmp.sprintf("%04X", i);
00465 }
00466
00467 void CharSelect::delChar()
00468 {
00469 if (chToIns.length() == 0)
00470 return;
00471 if (chToIns.length() == 1)
00472 {
00473 delEdit();
00474 return;
00475 }
00476 chToIns.truncate(chToIns.length() - 1);
00477 sample->setPixmap(FontSample((*m_doc->AllFonts)[m_fontInUse], 28, chToIns, palette().color(QPalette::Window), true));
00478 insertButton->setEnabled(true);
00479 }
00480
00481 void CharSelect::delEdit()
00482 {
00483 chToIns = "";
00484 QPixmap pm(1,28);
00485 pm.fill(palette().color(QPalette::Window));
00486 sample->setPixmap(pm);
00487 insertButton->setEnabled(false);
00488 }
00489
00490 void CharSelect::insChar()
00491 {
00492 emit insertSpecialChar();
00493 }
00494
00495 void CharSelect::slot_insertSpecialChar()
00496 {
00497 if (!m_Item)
00498 return;
00499
00500 if (m_Item->HasSel)
00501 m_Item->asTextFrame()->deleteSelectedTextFromFrame();
00502 if (m_Item->asTextFrame())
00503 m_Item->asTextFrame()->invalidateLayout();
00504
00505 QChar ch;
00506 for (int a=0; a<chToIns.length(); ++a)
00507 {
00508 ch = chToIns.at(a);
00509 if (ch == QChar(10))
00510 ch = QChar(13);
00511 if (ch == QChar(9))
00512 ch = QChar(32);
00513 m_Item->itemText.insertChars(m_Item->CPos, ch, true);
00514 m_Item->CPos += 1;
00515 }
00516 m_doc->updateFrameItems();
00517 m_doc->view()->DrawNew();
00518 m_doc->changed();
00519 delEdit();
00520 }
00521
00522 void CharSelect::slot_insertUserSpecialChar(QChar ch)
00523 {
00524 if (!m_Item)
00525 return;
00526 if (m_Item->HasSel)
00527 m_Item->asTextFrame()->deleteSelectedTextFromFrame();
00528 if (m_Item->asTextFrame())
00529 m_Item->asTextFrame()->invalidateLayout();
00530
00531 if (ch == QChar(10))
00532 ch = QChar(13);
00533 if (ch == QChar(9))
00534 ch = QChar(32);
00535 m_Item->itemText.insertChars(m_Item->CPos, ch, true);
00536 m_doc->updateFrameItems();
00537 m_Item->CPos += 1;
00538 m_doc->view()->DrawNew();
00539 m_doc->changed();
00540 }
00541
00542 void CharSelect::hideButton_toggled(bool state)
00543 {
00544
00545 QSize sz(m_quickPalette->size());
00546
00547 m_bigPalette->setShown(!state);
00548 if (state)
00549 resize(sz);
00550 m_quickPalette->resize(sz);
00551 updateGeometry();
00552 adjustSize();
00553 }
00554
00555 void CharSelect::show()
00556 {
00557 ScrPaletteBase::show();
00558 PrefsContext* p = PrefsManager::instance()->prefsFile->getContext("charpalette");
00559 bool state = p->getBool("hideCheck", true);
00560
00561 if (state && m_userTableModel->characters().count() == 0)
00562 state = false;
00563 hideButton->setChecked(state);
00564 hideButton_toggled(state);
00565 }
00566
00567 void CharSelect::hide()
00568 {
00569 ScrPaletteBase::hide();
00570 PrefsContext* p = PrefsManager::instance()->prefsFile->getContext("charpalette");
00571 p->set("hideCheck", hideButton->isChecked());
00572 }
00573
00574 void CharSelect::setEnabled(bool state, PageItem* item)
00575 {
00576 ScrPaletteBase::setEnabled(state);
00577 m_Item = item;
00578 if (state)
00579 setDoc(m_doc);
00580 }
00581
00582 void CharSelect::uniLoadButton_clicked()
00583 {
00584 QString f = QFileDialog::getOpenFileName(this, tr("Choose a filename to open"), QDir::currentPath(), paletteFileMask);
00585 if (!f.isNull())
00586 loadUserContent(f);
00587 }
00588
00589 void CharSelect::loadUserContent(QString f)
00590 {
00591 CharClassDef newChars;
00592 QFile file(f);
00593 if (!file.exists())
00594 return;
00595 if (file.open(QIODevice::ReadOnly))
00596 {
00597 QTextStream stream(&file);
00598 QString line;
00599 while (!stream.atEnd())
00600 {
00601 bool ok = false;
00602 line = stream.readLine();
00603 if (line.left(1) == "#")
00604 continue;
00605 int val = line.toInt(&ok, 10);
00606 if (ok)
00607 newChars.append(val);
00608 else
00609 {
00610 QMessageBox::warning(this, tr("Error"),
00611 "<qt>" + tr("Error reading file %1 - file is corrupted propably.").arg(f) + "</qt>",
00612 QMessageBox::Ok, QMessageBox::NoButton);
00613 break;
00614 }
00615 }
00616 file.close();
00617 m_userTableModel->setCharacters(newChars);
00618 }
00619 }
00620
00621 void CharSelect::uniSaveButton_clicked()
00622 {
00623 if (m_userTableModel->characters().count() == 0)
00624 return;
00625 QString f = QFileDialog::getSaveFileName(this, tr("Choose a filename to save under"), QDir::currentPath(), paletteFileMask);
00626 if (f.isNull() || !overwrite(this, f))
00627 return;
00628 saveUserContent(f);
00629 }
00630
00631 void CharSelect::saveUserContent(QString f)
00632 {
00633 QFile file(f);
00634 if (file.open(QIODevice::WriteOnly))
00635 {
00636 QTextStream stream(&file);
00637 CharClassDef chars = m_userTableModel->characters();
00638 stream << "# This is a character palette file for Scribus\n";
00639 for (CharClassDef::Iterator it = chars.begin(); it != chars.end(); ++it)
00640 stream << (*it) << "\n";
00641 file.close();
00642 }
00643 else
00644 QMessageBox::warning(this, tr("Error"),
00645 "<qt>" + tr("Cannot write file %1").arg(f) + "</qt>",
00646 QMessageBox::Ok, QMessageBox::NoButton);
00647 }
00648
00649 void CharSelect::uniClearButton_clicked()
00650 {
00651 if (m_userTableModel->characters().count() > 0
00652 &&
00653 !QMessageBox::question(this, tr("Empty the Palette?"),
00654 "<qt>" + tr("You will remove all characters from this palette. Are you sure?") + "</qt>",
00655 CommonStrings::trYesKey, CommonStrings::trNoKey,
00656 QString::null, 0, 1 )
00657 )
00658 {
00659 m_userTableModel->setCharacters(CharClassDef());
00660 }
00661 }
00662
00663 void CharSelect::changeEvent(QEvent *e)
00664 {
00665 if (e->type() == QEvent::LanguageChange)
00666 {
00667 Ui::CharSelect::retranslateUi(this);
00668 int i=rangeSelector->currentIndex();
00669 setupRangeCombo();
00670 disconnect(rangeSelector, SIGNAL(activated(int)), this, SLOT(newCharClass(int)));
00671 rangeSelector->setCurrentIndex(i);
00672 connect(rangeSelector, SIGNAL(activated(int)), this, SLOT(newCharClass(int)));
00673 }
00674 else
00675 QWidget::changeEvent(e);
00676 }