📄 qprintdialog_unix.cpp
字号:
/******************************************************************************** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.**** This file is part of the QtGui module of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file. Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "qplatformdefs.h"#ifndef QT_NO_PRINTDIALOG#include "private/qabstractprintdialog_p.h"#include <QtGui/qapplication.h>#include <QtGui/qcheckbox.h>#include <QtCore/qlibrary.h>#include <QtCore/qlist.h>#include <QtGui/qprinter.h>#include <QtGui/qtreeview.h>#include <QtGui/qlistview.h>#include <QtGui/qevent.h>#include <QtGui/qmessagebox.h>#include "qprintdialog.h"#include "qfiledialog.h"#include <QtCore/qdebug.h>#include <QtCore/qobject.h>#include <QtGui/qabstractprintdialog.h>#include <QtGui/qitemdelegate.h>#include "qprintengine.h"#include "ui_qprintdialog.h"#include "ui_qprintpropertiesdialog.h"#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)# include <private/qcups_p.h># include <cups/cups.h># include <private/qpdf_p.h>#endif#ifndef QT_NO_NIS# ifndef BOOL_DEFINED# define BOOL_DEFINED# endif# include <sys/types.h># include <rpc/rpc.h># include <rpcsvc/ypclnt.h># include <rpcsvc/yp_prot.h>#endif // QT_NO_NIS#ifdef Success# undef Success#endif#include <ctype.h>class OptionTreeItem;struct QPrinterDescription { QPrinterDescription(const QString &n, const QString &h, const QString &c, const QStringList &a) : name(n), host(h), comment(c), aliases(a) {} QString name; QString host; QString comment; QStringList aliases; bool samePrinter(const QString& printer) const { return name == printer || aliases.contains(printer); }};class QPrintDialogPrivate : public QAbstractPrintDialogPrivate{ Q_DECLARE_PUBLIC(QPrintDialog)public: QPrintDialogPrivate(); ~QPrintDialogPrivate(); void init(); void applyPrinterProperties(QPrinter *p); void _q_printToFileChanged(int); void _q_rbPrintRangeToggled(bool); void _q_printerChanged(int index); void _q_chbPrintLastFirstToggled(bool);#ifndef QT_NO_FILEDIALOG void _q_btnBrowseClicked();#endif void _q_btnPropertiesClicked(); void refreshPageSizes(); bool setupPrinter(); void updateWidgets(); Ui::QPrintDialog ui; QList<QPrinterDescription> lprPrinters;#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) QCUPSSupport* cups; int cupsPrinterCount; const cups_dest_t* cupsPrinters; const ppd_file_t* cupsPPD;#endif};#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)class PPDOptionsModel : public QAbstractItemModel{ friend class PPDPropertiesDialog; friend class PPDOptionsEditor;public: PPDOptionsModel(QCUPSSupport *cups, QObject *parent = 0); ~PPDOptionsModel(); int columnCount(const QModelIndex& parent = QModelIndex()) const; int rowCount(const QModelIndex& parent = QModelIndex()) const; QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const; QModelIndex parent(const QModelIndex& index) const; Qt::ItemFlags flags(const QModelIndex& index) const; QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const;private: OptionTreeItem* rootItem; QCUPSSupport *cups; const ppd_file_t* ppd; void parseItems(); void parseGroups(OptionTreeItem* parent); void parseOptions(OptionTreeItem* parent); void parseChoices(OptionTreeItem* parent);};class PPDOptionsEditor : public QItemDelegate{ Q_OBJECTpublic: PPDOptionsEditor(QObject* parent = 0) : QItemDelegate(parent) {}; ~PPDOptionsEditor() {}; QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const; void setEditorData(QWidget* editor, const QModelIndex& index) const; void setModelData( QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const;private slots: void cbChanged(int index);};class PPDPropertiesDialog : public QDialog , Ui::QPrintPropertiesDialog{ Q_OBJECTpublic: PPDPropertiesDialog(PPDOptionsModel* model, QWidget* parent = 0, Qt::WindowFlags f = 0); ~PPDPropertiesDialog(); void showEvent(QShowEvent * event);private: void addItemToOptions(OptionTreeItem *parent, QList<const ppd_option_t*>& options, QList<const char*>& markedOptions);private slots: void btnSaveClicked();};#endif////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////enum { Success = 's', Unavail = 'u', NotFound = 'n', TryAgain = 't' };enum { Continue = 'c', Return = 'r' };static void perhapsAddPrinter(QList<QPrinterDescription> *printers, const QString &name, QString host, QString comment, QStringList aliases = QStringList()){ for (int i = 0; i < printers->size(); ++i) if (printers->at(i).samePrinter(name)) return; if (host.isEmpty()) host = QPrintDialog::tr("locally connected"); printers->append(QPrinterDescription(name.simplified(), host.simplified(), comment.simplified(), aliases));}static void parsePrinterDesc(QString printerDesc, QList<QPrinterDescription> *printers){ if (printerDesc.length() < 1) return; printerDesc = printerDesc.simplified(); int i = printerDesc.indexOf(QLatin1Char(':')); QString printerName, printerComment, printerHost; QStringList aliases; if (i >= 0) { // have ':' want '|' int j = printerDesc.indexOf(QLatin1Char('|')); if (j > 0 && j < i) { printerName = printerDesc.left(j); aliases = printerDesc.mid(j + 1, i - j - 1).split(QLatin1Char('|')); // try extracting a comment from the aliases printerComment = QPrintDialog::tr("Aliases: %1") .arg(aliases.join(QLatin1String(", "))); } else { printerName = printerDesc.left(i); } // look for lprng pseudo all printers entry i = printerDesc.indexOf(QRegExp(QLatin1String(": *all *="))); if (i >= 0) printerName = QString(); // look for signs of this being a remote printer i = printerDesc.indexOf(QRegExp(QLatin1String(": *rm *="))); if (i >= 0) { // point k at the end of remote host name while (printerDesc[i] != QLatin1Char('=')) i++; while (printerDesc[i] == QLatin1Char('=') || printerDesc[i].isSpace()) i++; j = i; while (j < (int)printerDesc.length() && printerDesc[j] != QLatin1Char(':')) j++; // and stuff that into the string printerHost = printerDesc.mid(i, j - i); } } if (printerName.length()) perhapsAddPrinter(printers, printerName, printerHost, printerComment, aliases);}static int parsePrintcap(QList<QPrinterDescription> *printers, const QString& fileName){ QFile printcap(fileName); if (!printcap.open(QIODevice::ReadOnly)) return NotFound; char *line_ascii = new char[1025]; line_ascii[1024] = '\0'; QString printerDesc; bool atEnd = false; while (!atEnd) { if (printcap.atEnd() || printcap.readLine(line_ascii, 1024) <= 0) atEnd = true; QString line = QString::fromLocal8Bit(line_ascii); line = line.trimmed(); if (line.length() >= 1 && line[int(line.length()) - 1] == QLatin1Char('\\')) line.chop(1); if (line[0] == QLatin1Char('#')) { if (!atEnd) continue; } else if (line[0] == QLatin1Char('|') || line[0] == QLatin1Char(':')) { printerDesc += line; if (!atEnd) continue; } parsePrinterDesc(printerDesc, printers); // add the first line of the new printer definition printerDesc = line; } delete[] line_ascii; return Success;}// solaris, not 2.6static void parseEtcLpPrinters(QList<QPrinterDescription> *printers){ QDir lp(QLatin1String("/etc/lp/printers")); QFileInfoList dirs = lp.entryInfoList(); if (dirs.isEmpty()) return; QString tmp; for (int i = 0; i < dirs.size(); ++i) { QFileInfo printer = dirs.at(i); if (printer.isDir()) { tmp.sprintf("/etc/lp/printers/%s/configuration", printer.fileName().toAscii().data()); QFile configuration(tmp); char *line = new char[1025]; QString remote(QLatin1String("Remote:")); QString contentType(QLatin1String("Content types:")); QString printerHost; bool canPrintPostscript = false; if (configuration.open(QIODevice::ReadOnly)) { while (!configuration.atEnd() && configuration.readLine(line, 1024) > 0) { if (QString::fromLatin1(line).startsWith(remote)) { const char *p = line; while (*p != ':') p++; p++; while (isspace((uchar) *p)) p++; printerHost = QString::fromLocal8Bit(p); printerHost = printerHost.simplified(); } else if (QString::fromLatin1(line).startsWith(contentType)) { char *p = line; while (*p != ':') p++; p++; char *e; while (*p) { while (isspace((uchar) *p)) p++; if (*p) { char s; e = p; while (isalnum((uchar) *e)) e++; s = *e; *e = '\0'; if (!qstrcmp(p, "postscript") || !qstrcmp(p, "any")) canPrintPostscript = true; *e = s; if (s == ',') e++; p = e; } } } } if (canPrintPostscript) perhapsAddPrinter(printers, printer.fileName(), printerHost, QLatin1String("")); } delete[] line; } }}// solaris 2.6static char *parsePrintersConf(QList<QPrinterDescription> *printers, bool *found = 0){ QFile pc(QLatin1String("/etc/printers.conf")); if (!pc.open(QIODevice::ReadOnly)) { if (found) *found = false; return 0; } if (found) *found = true; char *line = new char[1025]; line[1024] = '\0'; QString printerDesc; int lineLength = 0; char *defaultPrinter = 0; while (!pc.atEnd() && (lineLength=pc.readLine(line, 1024)) > 0) { if (*line == '#') { *line = '\0'; lineLength = 0; } if (lineLength >= 2 && line[lineLength-2] == '\\') { line[lineLength-2] = '\0'; printerDesc += QString::fromLocal8Bit(line); } else { printerDesc += QString::fromLocal8Bit(line); printerDesc = printerDesc.simplified(); int i = printerDesc.indexOf(QLatin1Char(':')); QString printerName, printerHost, printerComment; QStringList aliases; if (i >= 0) { // have : want | int j = printerDesc.indexOf(QLatin1Char('|')); if (j >= i) j = -1; printerName = printerDesc.mid(0, j < 0 ? i : j); if (printerName == QLatin1String("_default")) { i = printerDesc.indexOf( QRegExp(QLatin1String(": *use *="))); while (printerDesc[i] != QLatin1Char('=')) i++; while (printerDesc[i] == QLatin1Char('=') || printerDesc[i].isSpace()) i++; j = i; while (j < (int)printerDesc.length() && printerDesc[j] != QLatin1Char(':') && printerDesc[j] != QLatin1Char(',')) j++; // that's our default printer defaultPrinter = qstrdup(printerDesc.mid(i, j-i).toAscii().data()); printerName = QString(); printerDesc = QString();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -