Subversion Repositories Scribus

Rev

Rev 11299 | Rev 13293 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4460 subik 1
/*
2
For general Scribus (>=1.3.2) copyright and licensing information please refer
3
to the COPYING file provided with the program. Following this notice may exist
4
a copyright and/or license notice that predates the release of Scribus 1.3.2
5
for which a new license (GPL+exception) is in place.
6
*/
7
 
10212 cbradney 8
#include "../formatidlist.h"
4460 subik 9
#include "barcodegenerator.h"
10212 cbradney 10
#include "commonstrings.h"
11
#include "loadsaveplugin.h"
12
#include "scpaths.h"
4468 subik 13
#include "scribus.h"
12042 subik 14
#include "scribuscore.h"
4685 subik 15
#include "undomanager.h"
10212 cbradney 16
#include "util_ghostscript.h"
17
#include "util_icon.h"
4460 subik 18
 
10212 cbradney 19
 
9461 subik 20
#include <QTextStream>
21
#include <QColorDialog>
22
 
4835 subik 23
BarcodeType::BarcodeType(QString cmd, QString exa,
24
                                                 QString comm, QString regExp,
25
                                                 bool includeCheck, bool includeCheckInText)
4460 subik 26
{
27
        command = cmd;
28
        example = exa;
29
        comment = comm;
4762 subik 30
        regularExp = regExp;
4835 subik 31
        this->includeCheck = includeCheck;
32
        this->includeCheckInText = includeCheckInText;
4460 subik 33
}
34
 
35
BarcodeGenerator::BarcodeGenerator(QWidget* parent, const char* name)
10593 fschmid 36
        : QDialog(parent)
4460 subik 37
{
8513 cbradney 38
        ui.setupUi(this);
10593 fschmid 39
        setObjectName(name);
40
        setModal(true);
4818 subik 41
        map["EAN-13"] = BarcodeType("ean13", "9781860742712", tr("12 or 13 digits"),
4762 subik 42
                                                                "[0-9]{12,13}");
4818 subik 43
        map["EAN-8"] = BarcodeType("ean8", "12345678", tr("8 digits"),
4762 subik 44
                                                           "[0-9]{8,8}");
4818 subik 45
        map["UPC-A"] = BarcodeType("upca", "78858101497", tr("11 or 12 digits"),
4762 subik 46
                                                           "[0-9]{11,12}");
4818 subik 47
        map["UPC-E"] = BarcodeType("upce", "0123456", tr("7 or 8 digits"),
4762 subik 48
                                                           "[0-9]{7,8}");
4818 subik 49
        map["EAN-5"] = BarcodeType("ean5", "90200", tr("5 digits"),
4762 subik 50
                                                           "[0-9]{5,5}");
4818 subik 51
        map["EAN-2"] = BarcodeType("ean2", "42", tr("2 digits"),
4762 subik 52
                                                           "[0-9]{2,2}");
53
        map["ISBN"] = BarcodeType("isbn", "1-58880-149",
7829 subik 54
                                                          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.)"),
4762 subik 55
                                                          "[0-9]*\\-[0-9]*\\-[0-9]*");
4460 subik 56
//    "Code-11"] = "code11"
4762 subik 57
        map["Code-39"] = BarcodeType("code39", "CODE-39",
4818 subik 58
                                                                 tr("Variable number of characters, digits and any of the symbols -. *$/+%."),
4835 subik 59
                                                                 "[0-9a-zA-Z\\-\\.\\ \\*\\$\\/\\+\\%]*",
60
                                                                true, true);
4460 subik 61
//    "Code-93"] = "code93"
4762 subik 62
        map["Code-128"] = BarcodeType("code128", "^104^102Count^0991234^101!",
4818 subik 63
                                                                  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."),
4835 subik 64
                                                                  "\\^[0-9a-zA-Z\\^\\!]*",
65
                                                                  true, true);
4762 subik 66
        map["UCC/EAN-128"] = BarcodeType("code128", "^104^102Count^0991234^101!",
4818 subik 67
                                                                         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."),
4762 subik 68
                                                                         "\\^[0-9a-zA-Z\\^\\!]*");
69
        map["Rationalized Codabar"] = BarcodeType("rationalizedCodabar", "0123456789",
4818 subik 70
                                                                                          tr("Variable number of digits and any of the symbols -$:/.+ABCD."),
4835 subik 71
                                                                                          "[0-9A-D\\-\\$\\:\\/\\.\\+]*",
72
                                                                                         true, true);
4762 subik 73
        map["Interleaved 2 of 5"] = BarcodeType("interleaved2of5", "05012345678900",
4883 subik 74
                                                                                        tr("Variable number of digits"),
4835 subik 75
                                                                                        "[0-9]*",
76
                                                                                   true, true);
4762 subik 77
        map["ITF-14"] = BarcodeType("interleaved2of5", "05012345678900",
4818 subik 78
                                                                tr("Variable number of digits. An ITF-14 is 14 characters and does not have a check digit"),
4835 subik 79
                                                                "[0-9]*",
80
                                                           true, true);
4762 subik 81
        map["Code 2 of 5"] = BarcodeType("code2of5", "0123456789",
4818 subik 82
                                                                         tr("Variable number of digits"),
4762 subik 83
                                                                         "[0-9]*");
84
        map["Postnet"] = BarcodeType("postnet", "01234567",
4818 subik 85
                                                                 tr("Variable number of digits"),
4835 subik 86
                                                                 "[0-9]*",
87
                                                                false, true);
4762 subik 88
        map["Royal Mail"] = BarcodeType("royalmail", "LE28HS9Z",
4818 subik 89
                                                                        tr("Variable number of digits and capital letters"),
4835 subik 90
                                                                        "[0-9A-Z]*",
91
                                                                        false, true);
4460 subik 92
//    "Auspost"] = "auspost"
4818 subik 93
        map["MSI"] = BarcodeType("msi", "0120823635162", tr("Variable number of digits"),
4835 subik 94
                                                         "[0-9]*",
95
                                                        true, true);
4460 subik 96
//    "KIX"] = "kix"
4762 subik 97
        map["Plessey"] = BarcodeType("plessey", "012345ABCDEF",
4818 subik 98
                                                                 tr("Variable number of hexadecimal characters"),
4835 subik 99
                                                                 "[0-9A-F]*",
100
                                                                false, true);
4762 subik 101
        //    "Symbol"] = "symbol"
4527 subik 102
 
4468 subik 103
        useSamples = true;
10593 fschmid 104
        guiColor = ui.codeEdit->palette().color(QPalette::Window);
11228 subik 105
        ui.bcCombo->addItem(tr("Select Type")); // to prevent 1st gs call
10593 fschmid 106
        ui.bcCombo->addItems(map.keys());
8513 cbradney 107
        ui.okButton->setText(CommonStrings::tr_OK);
108
        ui.cancelButton->setText(CommonStrings::tr_Cancel);
10593 fschmid 109
        ui.resetButton->setIcon(loadIcon("u_undo16.png"));
4460 subik 110
        lnColor = Qt::black;
111
        txtColor = Qt::black;
112
        bgColor = Qt::white;
8513 cbradney 113
        paintColorSample(ui.linesLabel, lnColor);
114
        paintColorSample(ui.txtLabel, txtColor);
115
        paintColorSample(ui.bgLabel, bgColor);
4460 subik 116
 
5917 jghali 117
        tmpFile = QDir::convertSeparators(ScPaths::getTempFileDir() + "bcode.png");
118
        psFile = QDir::convertSeparators(ScPaths::getTempFileDir() + "bcode.ps");
4460 subik 119
 
120
        // PS engine
121
        psCommand.append("%!PS-Adobe-2.0 EPSF-2.0\n");
4527 subik 122
        QFile f( ScPaths::instance().shareDir() + QString("/plugins/barcode.ps") );
8501 cbradney 123
        f.open(QIODevice::ReadOnly);
9461 subik 124
        QTextStream ts(&f);
10593 fschmid 125
        QString s = ts.readAll();
10517 cbradney 126
        int begin = s.indexOf("% --BEGIN TEMPLATE--");
127
        int end = s.indexOf("% --END TEMPLATE--");
4460 subik 128
        psCommand.append(s.mid(begin, end));
129
        f.close();
130
        psCommand.append("\n\n%command\n");
131
        bcComboChanged();
132
}
133
 
134
BarcodeGenerator::~BarcodeGenerator()
135
{
136
        QFile::remove(psFile);
137
        QFile::remove(tmpFile);
138
}
139
 
140
void BarcodeGenerator::bcComboChanged()
141
{
11228 subik 142
        if (ui.bcCombo->currentIndex() == 0)
143
        {
144
                ui.okButton->setEnabled(false);
145
                ui.sampleLabel->setText(tr("Select Barcode Type"));
146
                return;
147
        }
148
        else
149
                ui.okButton->setEnabled(true);
150
 
8513 cbradney 151
        QString s = ui.bcCombo->currentText();
152
        ui.commentEdit->setText(map[s].comment);
4468 subik 153
        if (useSamples)
154
        {
8513 cbradney 155
                disconnect(ui.codeEdit, SIGNAL(textChanged(const QString&)), this, SLOT(codeEdit_textChanged(const QString&)));
156
                ui.codeEdit->setText(map[s].example);
157
                connect(ui.codeEdit, SIGNAL(textChanged(const QString&)), this, SLOT(codeEdit_textChanged(const QString&)));
4468 subik 158
        }
4835 subik 159
 
8513 cbradney 160
        ui.includeCheck->setEnabled(map[s].includeCheck ? true : false);
161
        if (ui.textCheck->isChecked())
162
                ui.includeCheckInText->setEnabled(map[s].includeCheckInText ? true : false);
4835 subik 163
        else
8513 cbradney 164
                ui.includeCheckInText->setEnabled(false);
4835 subik 165
 
8513 cbradney 166
        codeEdit_check(ui.codeEdit->text());
4460 subik 167
        paintBarcode();
168
}
169
 
170
void BarcodeGenerator::textCheck_changed()
171
{
10593 fschmid 172
        bool s = ui.textCheck->checkState();
8513 cbradney 173
        ui.txtColorButton->setEnabled(s);
174
        ui.includeCheckInText->setEnabled(s);
4460 subik 175
        paintBarcode();
176
}
177
 
178
void BarcodeGenerator::guardCheck_changed()
179
{
180
        paintBarcode();
181
}
182
 
4835 subik 183
void BarcodeGenerator::includeCheck_stateChanged(int)
184
{
185
        paintBarcode();
186
}
187
 
188
void BarcodeGenerator::includeCheckInText_stateChanged(int)
189
{
190
        paintBarcode();
191
}
192
 
4460 subik 193
void BarcodeGenerator::paintColorSample(QLabel *l, QColor c)
194
{
9485 jghali 195
        QRect rect = l->frameRect();
196
        QPixmap pm(rect.width(), rect.height());
4460 subik 197
        pm.fill(c);
198
        l->setPixmap(pm);
199
}
200
 
201
void BarcodeGenerator::bgColorButton_pressed()
202
{
203
        bgColor = QColorDialog::getColor(bgColor, this);
204
        if (bgColor.isValid())
205
        {
8513 cbradney 206
                paintColorSample(ui.bgLabel, bgColor);
4460 subik 207
                paintBarcode();
208
        }
209
}
210
 
211
void BarcodeGenerator::lnColorButton_pressed()
212
{
213
        lnColor = QColorDialog::getColor(lnColor, this);
214
        if (lnColor.isValid())
215
        {
8513 cbradney 216
                paintColorSample(ui.linesLabel, lnColor);
4460 subik 217
                paintBarcode();
218
        }
219
}
220
 
221
void BarcodeGenerator::txtColorButton_pressed()
222
{
223
        txtColor = QColorDialog::getColor(txtColor, this);
224
        if (txtColor.isValid())
225
        {
8513 cbradney 226
                paintColorSample(ui.txtLabel, txtColor);
4460 subik 227
                paintBarcode();
228
        }
229
}
230
 
231
void BarcodeGenerator::okButton_pressed()
232
{
4685 subik 233
        // no need to call paintBarcode(tmpFile, 300); because
234
        // it's created by previous run...
4762 subik 235
        hide();
5539 mrdocs 236
        const FileFormat * fmt = LoadSavePlugin::getFormatById(FORMATID_PSIMPORT);
12042 subik 237
 
238
        UndoTransaction * tran = 0;
239
        if (UndoManager::undoEnabled())
240
        {
241
                tran = new UndoTransaction(
242
                                UndoManager::instance()->beginTransaction(
243
                                                        ScCore->primaryMainWindow()->doc->currentPage()->getUName(),
244
                                                        Um::IImageFrame,
245
                                                        Um::ImportBarcode,
246
                                                        ui.bcCombo->currentText() + " (" + ui.codeEdit->text() + ")",
247
                                                        Um::IEPS)
248
                                                );
249
        }
250
 
251
        if (fmt)
252
        {
10593 fschmid 253
                fmt->loadFile(psFile, LoadSavePlugin::lfUseCurrentPage|LoadSavePlugin::lfInteractive);
12042 subik 254
                if (tran)
255
                        tran->commit();
256
        }
4460 subik 257
        accept();
258
}
259
 
260
void BarcodeGenerator::cancelButton_pressed()
261
{
262
        reject();
263
}
264
 
4837 subik 265
bool BarcodeGenerator::codeEdit_check(const QString& )//s)
4460 subik 266
{
5588 cbradney 267
        /* probably not needed as the backend do it for us (PV)
4762 subik 268
        QRegExp rx(map[bcCombo->currentText()].regularExp);
269
        if (!rx.exactMatch(s))
270
        {
8513 cbradney 271
                ui.codeEdit->setPaletteBackgroundColor(QColor(255, 0, 0));
272
                ui.sampleLabel->setText("<qt>" + tr("Barcode incomplete") + "</qt>");
273
                ui.okButton->setEnabled(false);
4762 subik 274
                return false;
275
        }
276
        else
277
        {
8513 cbradney 278
                ui.codeEdit->setPaletteBackgroundColor(guiColor);
279
                ui.okButton->setEnabled(true);
4762 subik 280
                paintBarcode();
281
                return true;
4818 subik 282
        } */
283
        paintBarcode();
284
        return true;
4762 subik 285
}
286
 
287
void BarcodeGenerator::codeEdit_textChanged(const QString& s)
288
{
4468 subik 289
        useSamples = false;
4762 subik 290
        codeEdit_check(s);
4460 subik 291
}
292
 
4468 subik 293
bool BarcodeGenerator::paintBarcode(QString fileName, int dpi)
4460 subik 294
{
4468 subik 295
        if (fileName == QString::null)
296
                fileName = tmpFile;
4460 subik 297
        QString opts("barcolor=%1 showbackground backgroundcolor=%2 textcolor=%3");
298
        opts = opts.arg(lnColor.name().replace('#', "")) \
299
                        .arg(bgColor.name().replace('#', "")) \
300
                        .arg(txtColor.name().replace('#', ""));
8513 cbradney 301
        if (ui.textCheck->isChecked())
4460 subik 302
                opts += " includetext";
8513 cbradney 303
        if (ui.guardCheck->isChecked())
4460 subik 304
                opts += " guardwhitespace";
8513 cbradney 305
        if (ui.includeCheckInText->isChecked() & ui.includeCheckInText->isEnabled())
4835 subik 306
                opts += " includecheckintext";
8513 cbradney 307
        if (ui.includeCheck->isChecked() & ui.includeCheck->isEnabled())
4835 subik 308
                opts += " includecheck";
4460 subik 309
        QString comm("15 10 moveto (%1) (%2) %3 barcode");
8513 cbradney 310
        comm = comm.arg(ui.codeEdit->text()).arg(opts).arg(map[ui.bcCombo->currentText()].command);
4460 subik 311
        comm = psCommand + comm;
312
        QFile f(psFile);
8501 cbradney 313
        if (!f.open(QIODevice::WriteOnly))
4460 subik 314
        {
8513 cbradney 315
                ui.sampleLabel->setText("<qt>" + tr("Error opening file: %1").arg(psFile) + "</qt>");
4468 subik 316
                return false;
4460 subik 317
        }
9461 subik 318
        QTextStream ts(&f);
4460 subik 319
        ts << comm;
320
        f.close();
4527 subik 321
 
322
        QStringList gargs;
4818 subik 323
        // limit the area only for preview. EPS importer bounds the box itself.
324
        if (fileName == tmpFile)
325
        {
326
                gargs.append("-dDEVICEWIDTHPOINTS=200");
327
                gargs.append("-dDEVICEHEIGHTPOINTS=150");
328
        }
4527 subik 329
        gargs.append( QString("-r%1").arg(dpi) );
4685 subik 330
        gargs.append( QString("-sOutputFile=%1").arg(fileName) );
4527 subik 331
        gargs.append( psFile );
11228 subik 332
        qApp->changeOverrideCursor(Qt::WaitCursor);
4460 subik 333
        int gs = callGS(gargs);
4468 subik 334
        bool retval = true;
335
        if (gs != 0)
336
                retval = false;
11299 fschmid 337
        qApp->changeOverrideCursor(Qt::ArrowCursor);
338
//      qApp->restoreOverrideCursor();
4468 subik 339
        // setup only preview
340
        if (fileName != tmpFile)
341
                return retval;
4460 subik 342
    if (gs == 0)
4762 subik 343
        {
8513 cbradney 344
                ui.sampleLabel->setPixmap(QPixmap(fileName));
345
                ui.okButton->setEnabled(true);
4762 subik 346
        }
4460 subik 347
        else
4762 subik 348
        {
8513 cbradney 349
                ui.sampleLabel->setText("<qt>" + tr("Barcode incomplete") + "</qt>");
350
                ui.okButton->setEnabled(false);
4762 subik 351
        }
4468 subik 352
        return retval;
4460 subik 353
}
4468 subik 354
 
355
void BarcodeGenerator::resetButton_clicked()
356
{
357
        useSamples = true;
358
        bcComboChanged();
359
}