summaryrefslogtreecommitdiffstats
path: root/scribus/plugins/barcodegenerator/barcodegenerator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scribus/plugins/barcodegenerator/barcodegenerator.cpp')
-rw-r--r--scribus/plugins/barcodegenerator/barcodegenerator.cpp360
1 files changed, 360 insertions, 0 deletions
diff --git a/scribus/plugins/barcodegenerator/barcodegenerator.cpp b/scribus/plugins/barcodegenerator/barcodegenerator.cpp
new file mode 100644
index 0000000..73b0b70
--- /dev/null
+++ b/scribus/plugins/barcodegenerator/barcodegenerator.cpp
@@ -0,0 +1,360 @@
+/*
+For general Scribus (>=1.3.2) copyright and licensing information please refer
+to the COPYING file provided with the program. Following this notice may exist
+a copyright and/or license notice that predates the release of Scribus 1.3.2
+for which a new license (GPL+exception) is in place.
+*/
+
+#include "../formatidlist.h"
+#include "barcodegenerator.h"
+#include "commonstrings.h"
+#include "loadsaveplugin.h"
+#include "scpaths.h"
+#include "scribus.h"
+#include "scribuscore.h"
+#include "undomanager.h"
+#include "util_ghostscript.h"
+#include "util_icon.h"
+
+#include <QSharedPointer>
+#include <QColorDialog>
+#include <QTextStream>
+
+BarcodeType::BarcodeType(QString cmd, QString exa,
+ QString comm, QString regExp,
+ bool includeCheck, bool includeCheckInText)
+{
+ command = cmd;
+ example = exa;
+ comment = comm;
+ regularExp = regExp;
+ this->includeCheck = includeCheck;
+ this->includeCheckInText = includeCheckInText;
+}
+
+BarcodeGenerator::BarcodeGenerator(QWidget* parent, const char* name)
+ : QDialog(parent)
+{
+ ui.setupUi(this);
+ setObjectName(name);
+ setModal(true);
+ map["EAN-13"] = BarcodeType("ean13", "9781860742712", tr("12 or 13 digits"),
+ "[0-9]{12,13}");
+ map["EAN-8"] = BarcodeType("ean8", "12345678", tr("8 digits"),
+ "[0-9]{8,8}");
+ map["UPC-A"] = BarcodeType("upca", "78858101497", tr("11 or 12 digits"),
+ "[0-9]{11,12}");
+ map["UPC-E"] = BarcodeType("upce", "0123456", tr("7 or 8 digits"),
+ "[0-9]{7,8}");
+ map["EAN-5"] = BarcodeType("ean5", "90200", tr("5 digits"),
+ "[0-9]{5,5}");
+ map["EAN-2"] = BarcodeType("ean2", "42", tr("2 digits"),
+ "[0-9]{2,2}");
+ map["ISBN"] = BarcodeType("isbn", "1-58880-149",
+ tr("12 or 13 digits with dashes. The legacy ISBN-10 format accepts 9 or 10 digits with dashes, but this standard was depreciated for public use after 1st January 2007. (Note: To convert an old ISBN-10 to a new ISBN-13, prefix 978- to the first 9 digits, e.g. 1-56592-479-7 -> 978-1-56592-479. The final check-digit will be calculated automatically.)"),
+ "[0-9]*\\-[0-9]*\\-[0-9]*");
+// "Code-11"] = "code11"
+ map["Code-39"] = BarcodeType("code39", "CODE-39",
+ tr("Variable number of characters, digits and any of the symbols -. *$/+%."),
+ "[0-9a-zA-Z\\-\\.\\ \\*\\$\\/\\+\\%]*",
+ true, true);
+// "Code-93"] = "code93"
+ map["Code-128"] = BarcodeType("code128", "^104^102Count^0991234^101!",
+ tr("Variable number of ASCII characters and special function symbols, starting with the appropriate start character for the initial character set. UCC/EAN-128s must have a mandatory FNC 1 symbol immediately following the start character."),
+ "\\^[0-9a-zA-Z\\^\\!]*",
+ true, true);
+ map["UCC/EAN-128"] = BarcodeType("code128", "^104^102Count^0991234^101!",
+ tr("Variable number of ASCII characters and special function symbols, starting with the appropriate start character for the initial character set. UCC/EAN-128s must have a mandatory FNC 1 symbol immediately following the start character."),
+ "\\^[0-9a-zA-Z\\^\\!]*");
+ map["Rationalized Codabar"] = BarcodeType("rationalizedCodabar", "0123456789",
+ tr("Variable number of digits and any of the symbols -$:/.+ABCD."),
+ "[0-9A-D\\-\\$\\:\\/\\.\\+]*",
+ true, true);
+ map["Interleaved 2 of 5"] = BarcodeType("interleaved2of5", "05012345678900",
+ tr("Variable number of digits"),
+ "[0-9]*",
+ true, true);
+ map["ITF-14"] = BarcodeType("interleaved2of5", "05012345678900",
+ tr("Variable number of digits. An ITF-14 is 14 characters and does not have a check digit"),
+ "[0-9]*",
+ true, true);
+ map["Code 2 of 5"] = BarcodeType("code2of5", "0123456789",
+ tr("Variable number of digits"),
+ "[0-9]*");
+ map["Postnet"] = BarcodeType("postnet", "01234567",
+ tr("Variable number of digits"),
+ "[0-9]*",
+ false, true);
+ map["Royal Mail"] = BarcodeType("royalmail", "LE28HS9Z",
+ tr("Variable number of digits and capital letters"),
+ "[0-9A-Z]*",
+ false, true);
+// "Auspost"] = "auspost"
+ map["MSI"] = BarcodeType("msi", "0120823635162", tr("Variable number of digits"),
+ "[0-9]*",
+ true, true);
+// "KIX"] = "kix"
+ map["Plessey"] = BarcodeType("plessey", "012345ABCDEF",
+ tr("Variable number of hexadecimal characters"),
+ "[0-9A-F]*",
+ false, true);
+ // "Symbol"] = "symbol"
+
+ useSamples = true;
+ guiColor = ui.codeEdit->palette().color(QPalette::Window);
+ ui.bcCombo->addItem(tr("Select Type")); // to prevent 1st gs call
+ ui.bcCombo->addItems(map.keys());
+ ui.okButton->setText(CommonStrings::tr_OK);
+ ui.cancelButton->setText(CommonStrings::tr_Cancel);
+ ui.resetButton->setIcon(loadIcon("u_undo16.png"));
+ lnColor = Qt::black;
+ txtColor = Qt::black;
+ bgColor = Qt::white;
+ paintColorSample(ui.linesLabel, lnColor);
+ paintColorSample(ui.txtLabel, txtColor);
+ paintColorSample(ui.bgLabel, bgColor);
+
+ tmpFile = QDir::toNativeSeparators(ScPaths::getTempFileDir() + "bcode.png");
+ psFile = QDir::toNativeSeparators(ScPaths::getTempFileDir() + "bcode.ps");
+
+ // PS engine
+ psCommand.append("%!PS-Adobe-2.0 EPSF-2.0\n");
+ QFile f( ScPaths::instance().shareDir() + QString("/plugins/barcode.ps") );
+ f.open(QIODevice::ReadOnly);
+ QTextStream ts(&f);
+ QString s = ts.readAll();
+ int begin = s.indexOf("% --BEGIN TEMPLATE--");
+ int end = s.indexOf("% --END TEMPLATE--");
+ psCommand.append(s.mid(begin, end));
+ f.close();
+ psCommand.append("\n\n%command\n");
+ bcComboChanged();
+}
+
+BarcodeGenerator::~BarcodeGenerator()
+{
+ QFile::remove(psFile);
+ QFile::remove(tmpFile);
+}
+
+void BarcodeGenerator::bcComboChanged()
+{
+ if (ui.bcCombo->currentIndex() == 0)
+ {
+ ui.okButton->setEnabled(false);
+ ui.sampleLabel->setText(tr("Select Barcode Type"));
+ return;
+ }
+ else
+ ui.okButton->setEnabled(true);
+
+ QString s = ui.bcCombo->currentText();
+ ui.commentEdit->setText(map[s].comment);
+ if (useSamples)
+ {
+ disconnect(ui.codeEdit, SIGNAL(textChanged(const QString&)), this, SLOT(codeEdit_textChanged(const QString&)));
+ ui.codeEdit->setText(map[s].example);
+ connect(ui.codeEdit, SIGNAL(textChanged(const QString&)), this, SLOT(codeEdit_textChanged(const QString&)));
+ }
+
+ ui.includeCheck->setEnabled(map[s].includeCheck ? true : false);
+ if (ui.textCheck->isChecked())
+ ui.includeCheckInText->setEnabled(map[s].includeCheckInText ? true : false);
+ else
+ ui.includeCheckInText->setEnabled(false);
+
+ codeEdit_check(ui.codeEdit->text());
+ paintBarcode();
+}
+
+void BarcodeGenerator::textCheck_changed()
+{
+ bool s = ui.textCheck->checkState();
+ ui.txtColorButton->setEnabled(s);
+ ui.includeCheckInText->setEnabled(s);
+ paintBarcode();
+}
+
+void BarcodeGenerator::guardCheck_changed()
+{
+ paintBarcode();
+}
+
+void BarcodeGenerator::includeCheck_stateChanged(int)
+{
+ paintBarcode();
+}
+
+void BarcodeGenerator::includeCheckInText_stateChanged(int)
+{
+ paintBarcode();
+}
+
+void BarcodeGenerator::paintColorSample(QLabel *l, QColor c)
+{
+ QRect rect = l->frameRect();
+ QPixmap pm(rect.width(), rect.height());
+ pm.fill(c);
+ l->setPixmap(pm);
+}
+
+void BarcodeGenerator::bgColorButton_pressed()
+{
+ bgColor = QColorDialog::getColor(bgColor, this);
+ if (bgColor.isValid())
+ {
+ paintColorSample(ui.bgLabel, bgColor);
+ paintBarcode();
+ }
+}
+
+void BarcodeGenerator::lnColorButton_pressed()
+{
+ lnColor = QColorDialog::getColor(lnColor, this);
+ if (lnColor.isValid())
+ {
+ paintColorSample(ui.linesLabel, lnColor);
+ paintBarcode();
+ }
+}
+
+void BarcodeGenerator::txtColorButton_pressed()
+{
+ txtColor = QColorDialog::getColor(txtColor, this);
+ if (txtColor.isValid())
+ {
+ paintColorSample(ui.txtLabel, txtColor);
+ paintBarcode();
+ }
+}
+
+void BarcodeGenerator::okButton_pressed()
+{
+ // no need to call paintBarcode(tmpFile, 300); because
+ // it's created by previous run...
+ hide();
+ const FileFormat * fmt = LoadSavePlugin::getFormatById(FORMATID_PSIMPORT);
+
+ QSharedPointer<UndoTransaction> tran;
+ if (UndoManager::undoEnabled())
+ {
+ tran = QSharedPointer<UndoTransaction>( new UndoTransaction(
+ UndoManager::instance()->beginTransaction(
+ ScCore->primaryMainWindow()->doc->currentPage()->getUName(),
+ Um::IImageFrame,
+ Um::ImportBarcode,
+ ui.bcCombo->currentText() + " (" + ui.codeEdit->text() + ")",
+ Um::IEPS)
+ )
+ );
+ }
+
+ if (fmt)
+ {
+ fmt->loadFile(psFile, LoadSavePlugin::lfUseCurrentPage|LoadSavePlugin::lfInteractive);
+ if (tran)
+ tran->commit();
+ }
+ accept();
+}
+
+void BarcodeGenerator::cancelButton_pressed()
+{
+ reject();
+}
+
+bool BarcodeGenerator::codeEdit_check(const QString& )//s)
+{
+ /* probably not needed as the backend do it for us (PV)
+ QRegExp rx(map[bcCombo->currentText()].regularExp);
+ if (!rx.exactMatch(s))
+ {
+ ui.codeEdit->setPaletteBackgroundColor(QColor(255, 0, 0));
+ ui.sampleLabel->setText("<qt>" + tr("Barcode incomplete") + "</qt>");
+ ui.okButton->setEnabled(false);
+ return false;
+ }
+ else
+ {
+ ui.codeEdit->setPaletteBackgroundColor(guiColor);
+ ui.okButton->setEnabled(true);
+ paintBarcode();
+ return true;
+ } */
+ paintBarcode();
+ return true;
+}
+
+void BarcodeGenerator::codeEdit_textChanged(const QString& s)
+{
+ useSamples = false;
+ codeEdit_check(s);
+}
+
+bool BarcodeGenerator::paintBarcode(QString fileName, int dpi)
+{
+ if (fileName.isEmpty())
+ fileName = tmpFile;
+ QString opts("barcolor=%1 showbackground backgroundcolor=%2 textcolor=%3");
+ opts = opts.arg(lnColor.name().replace('#', "")) \
+ .arg(bgColor.name().replace('#', "")) \
+ .arg(txtColor.name().replace('#', ""));
+ if (ui.textCheck->isChecked())
+ opts += " includetext";
+ if (ui.guardCheck->isChecked())
+ opts += " guardwhitespace";
+ if (ui.includeCheckInText->isChecked() & ui.includeCheckInText->isEnabled())
+ opts += " includecheckintext";
+ if (ui.includeCheck->isChecked() & ui.includeCheck->isEnabled())
+ opts += " includecheck";
+ QString comm("15 10 moveto (%1) (%2) %3");
+ comm = comm.arg(ui.codeEdit->text()).arg(opts).arg(map[ui.bcCombo->currentText()].command);
+ comm = psCommand + comm;
+ QFile f(psFile);
+ if (!f.open(QIODevice::WriteOnly))
+ {
+ ui.sampleLabel->setText("<qt>" + tr("Error opening file: %1").arg(psFile) + "</qt>");
+ return false;
+ }
+ QTextStream ts(&f);
+ ts << comm;
+ f.close();
+
+ QStringList gargs;
+ // limit the area only for preview. EPS importer bounds the box itself.
+ if (fileName == tmpFile)
+ {
+ gargs.append("-dDEVICEWIDTHPOINTS=200");
+ gargs.append("-dDEVICEHEIGHTPOINTS=150");
+ }
+ gargs.append( QString("-r%1").arg(dpi) );
+ gargs.append( QString("-sOutputFile=%1").arg(fileName) );
+ gargs.append( psFile );
+ qApp->changeOverrideCursor(Qt::WaitCursor);
+ int gs = callGS(gargs);
+ bool retval = true;
+ if (gs != 0)
+ retval = false;
+ qApp->changeOverrideCursor(Qt::ArrowCursor);
+// qApp->restoreOverrideCursor();
+ // setup only preview
+ if (fileName != tmpFile)
+ return retval;
+ if (gs == 0)
+ {
+ ui.sampleLabel->setPixmap(QPixmap(fileName));
+ ui.okButton->setEnabled(true);
+ }
+ else
+ {
+ ui.sampleLabel->setText("<qt>" + tr("Barcode incomplete") + "</qt>");
+ ui.okButton->setEnabled(false);
+ }
+ return retval;
+}
+
+void BarcodeGenerator::resetButton_clicked()
+{
+ useSamples = true;
+ bcComboChanged();
+}