Scribus Developer Documentation - API
logo-pen

Scribus Developer Documentation - API

satdialog.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  *   Riku Leino, tsoots@gmail.com                                          *
00009  ***************************************************************************/
00010 #include "satdialog.h"
00011 #include "scribusapi.h"
00012 
00013 #include <QXmlDefaultHandler>
00014 #include <QXmlSimpleReader>
00015 
00016 #include "prefsmanager.h"
00017 #include "prefsfile.h"
00018 #include "scpaths.h"
00019 #include "scribuscore.h"
00020 #include "util_icon.h"
00021 
00022 class CategoriesReader : public QXmlDefaultHandler
00023 {
00024 public:
00025     QStringList categories;
00026     virtual bool startElement(const QString&, const QString&, const QString &name, const QXmlAttributes &attrs)
00027     {
00028         if (name == QLatin1String("template"))
00029         {
00030             QString cat = attrs.value(QLatin1String("category"));
00031             if (!categories.contains(cat))
00032                 categories.append(cat);
00033         }
00034         return true;
00035     };
00036 };
00037 
00038 satdialog::satdialog(QWidget* parent, QString tmplName, int pageW, int pageH) : QDialog(parent)
00039 {
00040     setupUi(this);
00041     setModal(true);
00042     setWindowTitle( tr("Save as Template"));
00043     setWindowIcon(loadIcon("AppIcon.png"));
00044     readPrefs();
00045     
00046     nameEdit->setText(tmplName);
00047     setupCategories();
00048     setupPageSize(pageW, pageH);
00049     authorEdit->setText(author);
00050     emailEdit->setText(email);
00051 
00052     // Slots and signals connections
00053     connect(detailButton, SIGNAL(stateChanged(int)), this, SLOT(detailClicked(int)));
00054 }
00055 
00056 void satdialog::detailClicked(int state)
00057 {
00058     isFullDetail = state == Qt::Checked;
00059 
00060     psizeLabel->setVisible(isFullDetail);
00061     catsLabel->setVisible(isFullDetail);
00062     colorsLabel->setVisible(isFullDetail);
00063     descrLabel->setVisible(isFullDetail);
00064     usageLabel->setVisible(isFullDetail);
00065     authorLabel->setVisible(isFullDetail);
00066     emailLabel->setVisible(isFullDetail);
00067     psizeEdit->setVisible(isFullDetail);
00068     catsCombo->setVisible(isFullDetail);
00069     colorsEdit->setVisible(isFullDetail);
00070     descrEdit->setVisible(isFullDetail);
00071     usageEdit->setVisible(isFullDetail);
00072     authorEdit->setVisible(isFullDetail);
00073     emailEdit->setVisible(isFullDetail);
00074 }
00075 
00076 void satdialog::readPrefs()
00077 {
00078     prefs = PrefsManager::instance()->prefsFile->getPluginContext("satemplate");
00079     author = prefs->get("author", "");
00080     email = prefs->get("email", "");
00081     isFullDetail = prefs->getBool("isFullDetail", false);
00082     detailClicked(isFullDetail ? Qt::Checked : Qt::Unchecked);
00083     detailButton->setCheckState(isFullDetail ? Qt::Checked : Qt::Unchecked);
00084 }
00085 
00086 void satdialog::writePrefs()
00087 {
00088     prefs->set("author", authorEdit->text());
00089     prefs->set("email", emailEdit->text());
00090     prefs->set("isFullDetail", isFullDetail);
00091 }
00092 
00093 QString satdialog::findTemplateXml(QString dir)
00094 {
00095     QString lang = ScCore->getGuiLanguage();
00096     QString tmp = dir + "/template." + lang + ".xml";
00097     if (QFile::exists(tmp))
00098         return tmp;
00099 
00100     if (lang.length() > 2)
00101     {
00102         tmp = dir + "/template." + lang.left(2) + ".xml";
00103         if (QFile::exists(tmp))
00104             return tmp;
00105     }
00106     return dir + "/template.xml";   
00107 }
00108 
00109 void satdialog::addCategories(const QString& dir)
00110 {
00111     // Read categories from the dir itself
00112     QString tmplFile = findTemplateXml(dir);
00113     if (QFile::exists(tmplFile))
00114         readCategories(tmplFile);
00115 
00116     // And from all the subdirectories. template.xml file is only searched one dir level deeper than the dir
00117     QDir tmpldir(dir);
00118     if (tmpldir.exists())
00119     {
00120         tmpldir.setFilter(QDir::Dirs);
00121         QStringList dirs = tmpldir.entryList();
00122         for (int i = 0; i < dirs.size(); ++i)
00123         {
00124             if ((dirs[i] != ".") && (dirs[i] != "..")) 
00125             {
00126                 tmplFile = findTemplateXml(dir + "/" + dirs[i]);
00127                 if (QFile::exists(tmplFile))
00128                     readCategories(tmplFile);
00129             }
00130         }
00131     }
00132 }
00133 
00134 void satdialog::readCategories(const QString& fileName)
00135 {
00136     QFile file(fileName);
00137     CategoriesReader catReader;
00138     QXmlInputSource  xmlSource(&file);
00139     QXmlSimpleReader reader;
00140     reader.setContentHandler(&catReader);
00141     reader.parse(&xmlSource);
00142     QStringList& categories = catReader.categories;
00143     for (int i = 0; i < categories.count(); ++i)
00144     {
00145         QString category = categories.at(i);
00146         if (!category.isEmpty() && !cats.contains(category))
00147             cats.insert(category, category);
00148     }
00149 }
00150 
00151 void satdialog::setupCategories() 
00152 {
00153     // en will be used in template.xml and it will be then replaced with the lang when used for users
00154     // to get the categories in their language.
00155     cats.insert(QString("Newsletters"), QObject::tr("Newsletters"));
00156     cats.insert(QString("Brochures")  , QObject::tr("Brochures"));
00157     cats.insert(QString("Catalogs")   , QObject::tr("Catalogs"));
00158     cats.insert(QString("Flyers")     , QObject::tr("Flyers"));
00159     cats.insert(QString("Signs")      , QObject::tr("Signs"));
00160     cats.insert(QString("Cards")      , QObject::tr("Cards"));
00161     cats.insert(QString("Letterheads"), QObject::tr("Letterheads"));
00162     cats.insert(QString("Envelopes")  , QObject::tr("Envelopes"));
00163     cats.insert(QString("Business Cards"), QObject::tr("Business Cards"));
00164     cats.insert(QString("Calendars")  , QObject::tr("Calendars"));
00165     cats.insert(QString("Advertisements"), QObject::tr("Advertisements"));
00166     cats.insert(QString("Labels")     , QObject::tr("Labels"));
00167     cats.insert(QString("Menus")      , QObject::tr("Menus"));
00168     cats.insert(QString("Programs")   , QObject::tr("Programs"));
00169     cats.insert(QString("PDF Forms")  , QObject::tr("PDF Forms"));
00170     cats.insert(QString("PDF Presentations") , QObject::tr("PDF Presentations"));
00171     cats.insert(QString("Magazines")  , QObject::tr("Magazines"));
00172     cats.insert(QString("Posters")    , QObject::tr("Posters"));
00173     cats.insert(QString("Announcements") , QObject::tr("Announcements"));
00174     cats.insert(QString("Text Documents"), QObject::tr("Text Documents"));
00175     cats.insert(QString("Folds")        , QObject::tr("Folds"));
00176     cats.insert(QString("Media Cases")  , QObject::tr("Media Cases"));
00177     cats.insert(QString("Own Templates"), QObject::tr("Own Templates"));
00178 
00179     QString scribusHome  = ScPaths::getApplicationDataDir();
00180     QString scribusShare = ScPaths::instance().templateDir();
00181     
00182     addCategories(scribusHome + "/templates");
00183     addCategories(scribusShare); 
00184     
00185     QStringList list;
00186     QMap<QString, QString>::ConstIterator it;
00187     for (it = cats.constBegin(); it != cats.constEnd(); ++it)
00188         list.append(it.value());
00189     list.sort();
00190     catsCombo->addItem("");
00191     catsCombo->addItems(list);
00192     catsCombo->setEditable(true);
00193 }
00194 
00195 void satdialog::setupPageSize(int w, int h)
00196 {
00197     QString sizelist[] = 
00198         {"2380x3368", "1684x2380", "1190x1684", "842x1190", "595x842", "421x595", "297x421", "210x297", "148x210",
00199          "105x148", "2836x4008", "2004x2836", "1418x2004", "1002x1418", "709x1002", "501x709", "355x501", "250x355",
00200          "178x250", "125x178", "89x125", "462x649", "298x683", "312x624", "542x720", "595x935", "1224x792", "612x1008",
00201          "612x792", "792x1225"};
00202     QString namelist[] = 
00203         {"A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8",
00204          "A9", "B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7",
00205          "B8", "B9", "B10", "C5E", "Comm10E", "DLE", "Executive", "Folio", "Ledger", tr("Legal"),
00206          tr("Letter"), tr("Tabloid")};
00207 
00208     QString orient, search, psize;
00209     QString wString = QString("%1").arg(w);
00210     QString hString = QString("%1").arg(h);
00211     if (w > h)
00212     {
00213         orient = ", "+ tr("landscape");
00214         search = hString+"x"+wString;
00215     }
00216     else if (w < h)
00217     {
00218         orient = ", "+ tr("portrait");
00219         search = wString+"x"+hString;
00220     }
00221     int index = -1;
00222     for (int i = 0; i < 30; ++i)
00223     {
00224         if (sizelist[i] == search)
00225         {
00226             index = i;
00227             psize = namelist[i];
00228             break;
00229         }
00230     }
00231     
00232     if (index == -1)
00233     {
00234         psize = tr("custom")+", "+wString+"x"+hString;
00235         orient = "";
00236     }
00237 
00238     psizeEdit->setText(psize + orient);
00239 }
00240 
00241 satdialog::~satdialog()
00242 {
00243     writePrefs();
00244 }
Created with personalized Doxygen. This is documentation for GPL software Scribus - Open Source Desktop Publishing.