Scribus Developer Documentation - API
logo-pen

Scribus Developer Documentation - API

charselect.cpp

Go to the documentation of this file.
00001 /*
00002 For general Scribus (>=1.3.2) copyright and licensing information please refer
00003 to the COPYING file provided with the program. Following this notice may exist
00004 a copyright and/or license notice that predates the release of Scribus 1.3.2
00005 for which a new license (GPL+exception) is in place.
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     // signals and slots connections
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     //CB: Avox please make text->insertchar(char) so none of this happens in gui code, and item can tell doc its changed so the view and mainwindow slotdocch are not necessary
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 //  //CB: Avox please make text->insertchar(char) so none of this happens in gui code, and item can tell doc its changed so the view and mainwindow slotdocch are not necessary
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     // megahact #1 to keep user palette unchanged after resizing
00545     QSize sz(m_quickPalette->size());
00546 
00547     m_bigPalette->setShown(!state);
00548     if (state)
00549         resize(sz); // megahack #2 to keep palette small
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     // always open big palette when there is no glyph in the custom one
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; // don't mess with a comment
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 }
Created with personalized Doxygen. This is documentation for GPL software Scribus - Open Source Desktop Publishing.