kdeprint Library API Documentation

escpwidget.cpp

00001 /*
00002  *  This file is part of the KDE libraries
00003  *  Copyright (c) 2001 Michael Goffioul <kdeprint@swing.be>
00004  *
00005  *  This library is free software; you can redistribute it and/or
00006  *  modify it under the terms of the GNU Library General Public
00007  *  License version 2 as published by the Free Software Foundation.
00008  *
00009  *  This library is distributed in the hope that it will be useful,
00010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  *  Library General Public License for more details.
00013  *
00014  *  You should have received a copy of the GNU Library General Public License
00015  *  along with this library; see the file COPYING.LIB.  If not, write to
00016  *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00017  *  Boston, MA 02111-1307, USA.
00018  **/
00019 
00020 #include "escpwidget.h"
00021 
00022 #include <qpushbutton.h>
00023 #include <qlayout.h>
00024 #include <qlabel.h>
00025 #include <qcheckbox.h>
00026 #include <qaccel.h>
00027 #include <kdemacros.h>
00028 #include <klocale.h>
00029 #include <kmessagebox.h>
00030 #include <kstandarddirs.h>
00031 #include <kiconloader.h>
00032 #include <kdialogbase.h>
00033 #include <klibloader.h>
00034 #include <kseparator.h>
00035 #include <kdebug.h>
00036 
00037 class EscpFactory : public KLibFactory
00038 {
00039 public:
00040     EscpFactory(QObject *parent = 0, const char *name = 0) : KLibFactory(parent, name) {}
00041 protected:
00042     QObject* createObject(QObject *parent = 0, const char *name = 0, const char * /*classname*/ = "QObject", const QStringList& args = QStringList())
00043     {
00044         KDialogBase *dlg = new KDialogBase(static_cast<QWidget*>(parent), name, true, i18n("EPSON InkJet Printer Utilities"), KDialogBase::Close);
00045         EscpWidget  *w = new EscpWidget(dlg);
00046         if (args.count() > 0)
00047             w->setDevice(args[0]);
00048         if (args.count() > 1)
00049             w->setPrinterName(args[1]);
00050         dlg->setMainWidget(w);
00051         return dlg;
00052     }
00053 };
00054 
00055 extern "C"
00056 {
00057     void* init_kdeprint_tool_escputil() KDE_EXPORT;
00058     void* init_kdeprint_tool_escputil()
00059     {
00060         return new EscpFactory;
00061     }
00062 }
00063 
00064 EscpWidget::EscpWidget(QWidget *parent, const char *name)
00065 : QWidget(parent, name)
00066 {
00067     m_hasoutput = false;
00068 
00069     connect(&m_proc, SIGNAL(processExited(KProcess*)), SLOT(slotProcessExited(KProcess*)));
00070     connect(&m_proc, SIGNAL(receivedStdout(KProcess*,char*,int)), SLOT(slotReceivedStdout(KProcess*,char*,int)));
00071     connect(&m_proc, SIGNAL(receivedStderr(KProcess*,char*,int)), SLOT(slotReceivedStderr(KProcess*,char*,int)));
00072 
00073     QPushButton *cleanbtn = new QPushButton(this, "-c");
00074     cleanbtn->setPixmap(DesktopIcon("exec"));
00075     QPushButton *nozzlebtn = new QPushButton(this, "-n");
00076     nozzlebtn->setPixmap(DesktopIcon("exec"));
00077     QPushButton *alignbtn = new QPushButton(this, "-a");
00078     alignbtn->setPixmap(DesktopIcon("exec"));
00079     QPushButton *inkbtn = new QPushButton(this, "-i");
00080     inkbtn->setPixmap(DesktopIcon("kdeprint_inklevel"));
00081     QPushButton *identbtn = new QPushButton(this, "-d");
00082     identbtn->setPixmap(DesktopIcon("exec"));
00083 
00084     QFont   f(font());
00085     f.setBold(true);
00086     m_printer = new QLabel(this);
00087     m_printer->setFont(f);
00088     m_device = new QLabel(this);
00089     m_device->setFont(f);
00090     m_useraw = new QCheckBox(i18n("&Use direct connection (might need root permissions)"), this);
00091 
00092     connect(cleanbtn, SIGNAL(clicked()), SLOT(slotButtonClicked()));
00093     connect(nozzlebtn, SIGNAL(clicked()), SLOT(slotButtonClicked()));
00094     connect(alignbtn, SIGNAL(clicked()), SLOT(slotButtonClicked()));
00095     connect(inkbtn, SIGNAL(clicked()), SLOT(slotButtonClicked()));
00096     connect(identbtn, SIGNAL(clicked()), SLOT(slotButtonClicked()));
00097 
00098     QLabel  *printerlab = new QLabel(i18n("Printer:"), this);
00099     printerlab->setAlignment(AlignRight|AlignVCenter);
00100     QLabel  *devicelab = new QLabel(i18n("Device:"), this);
00101     devicelab->setAlignment(AlignRight|AlignVCenter);
00102     QLabel  *cleanlab = new QLabel(i18n("Clea&n print head"), this);
00103     QLabel  *nozzlelab = new QLabel(i18n("&Print a nozzle test pattern"), this);
00104     QLabel  *alignlab = new QLabel(i18n("&Align print head"), this);
00105     QLabel  *inklab = new QLabel(i18n("&Ink level"), this);
00106     QLabel  *identlab = new QLabel(i18n("P&rinter identification"), this);
00107 
00108     cleanlab->setAlignment(AlignLeft|AlignVCenter|ShowPrefix);
00109     nozzlelab->setAlignment(AlignLeft|AlignVCenter|ShowPrefix);
00110     alignlab->setAlignment(AlignLeft|AlignVCenter|ShowPrefix);
00111     inklab->setAlignment(AlignLeft|AlignVCenter|ShowPrefix);
00112     identlab->setAlignment(AlignLeft|AlignVCenter|ShowPrefix);
00113 
00114     cleanbtn->setAccel(QAccel::shortcutKey(cleanlab->text()));
00115     nozzlebtn->setAccel(QAccel::shortcutKey(nozzlelab->text()));
00116     alignbtn->setAccel(QAccel::shortcutKey(alignlab->text()));
00117     inkbtn->setAccel(QAccel::shortcutKey(inklab->text()));
00118     identbtn->setAccel(QAccel::shortcutKey(identlab->text()));
00119 
00120     KSeparator  *sep = new KSeparator(this);
00121     sep->setFixedHeight(10);
00122 
00123     QGridLayout *l0 = new QGridLayout(this, 8, 2, 10, 10);
00124     QGridLayout *l1 = new QGridLayout(0, 2, 2, 0, 5);
00125     l0->addMultiCellLayout(l1, 0, 0, 0, 1);
00126     l1->addWidget(printerlab, 0, 0);
00127     l1->addWidget(devicelab, 1, 0);
00128     l1->addWidget(m_printer, 0, 1);
00129     l1->addWidget(m_device, 1, 1);
00130     l1->setColStretch(1, 1);
00131     l0->addMultiCellWidget(sep, 1, 1, 0, 1);
00132     l0->addWidget(cleanbtn, 2, 0);
00133     l0->addWidget(nozzlebtn, 3, 0);
00134     l0->addWidget(alignbtn, 4, 0);
00135     l0->addWidget(inkbtn, 5, 0);
00136     l0->addWidget(identbtn, 6, 0);
00137     l0->addWidget(cleanlab, 2, 1);
00138     l0->addWidget(nozzlelab, 3, 1);
00139     l0->addWidget(alignlab, 4, 1);
00140     l0->addWidget(inklab, 5, 1);
00141     l0->addWidget(identlab, 6, 1);
00142     l0->addMultiCellWidget(m_useraw, 7, 7, 0, 1);
00143     l0->setColStretch(1, 1);
00144 }
00145 
00146 void EscpWidget::startCommand(const QString& arg)
00147 {
00148     bool    useUSB(false);
00149 
00150     if (m_deviceURL.isEmpty())
00151     {
00152         KMessageBox::error(this, i18n("Internal error: no device set."));
00153         return;
00154     }
00155     else
00156     {
00157         QString protocol = m_deviceURL.protocol();
00158         if (protocol == "usb")
00159             useUSB = true;
00160         else if (protocol != "file" && protocol != "parallel" && protocol != "serial" && !protocol.isEmpty())
00161         {
00162             KMessageBox::error(this,
00163                 i18n("Unsupported connection type: %1").arg(protocol));
00164             return;
00165         }
00166     }
00167 
00168     if (m_proc.isRunning())
00169     {
00170         KMessageBox::error(this, i18n("An escputil process is still running. "
00171                                       "You must wait until its completion before continuing."));
00172         return;
00173     }
00174 
00175     QString exestr = KStandardDirs::findExe("escputil");
00176     if (exestr.isEmpty())
00177     {
00178         KMessageBox::error(this, i18n("The executable escputil cannot be found in your "
00179                                       "PATH environment variable. Make sure gimp-print is "
00180                                       "installed and that escputil is in your PATH."));
00181         return;
00182     }
00183 
00184     m_proc.clearArguments();
00185     m_proc << exestr;
00186     if (m_useraw->isChecked() || arg == "-i")
00187         m_proc << "-r" << m_deviceURL.path();
00188     else
00189         m_proc << "-P" << m_printer->text();
00190     if (useUSB)
00191         m_proc << "-u";
00192 
00193     m_proc << arg << "-q";
00194     m_errorbuffer = m_outbuffer = QString::null;
00195     m_hasoutput = ( arg == "-i" || arg == "-d" );
00196     for ( QValueList<QCString>::ConstIterator it=m_proc.args().begin(); it!=m_proc.args().end(); ++it )
00197         kdDebug() << "ARG: " << *it << endl;
00198     if (m_proc.start(KProcess::NotifyOnExit, KProcess::AllOutput))
00199         setEnabled(false);
00200     else
00201     {
00202         KMessageBox::error(this,
00203             i18n("Internal error: unable to start escputil process."));
00204         return;
00205     }
00206 }
00207 
00208 void EscpWidget::slotProcessExited(KProcess*)
00209 {
00210     setEnabled(true);
00211     if (!m_proc.normalExit() || m_proc.exitStatus() != 0)
00212     {
00213         QString msg1 = "<qt>"+i18n("Operation terminated with errors.")+"</qt>";
00214         QString msg2;
00215         if (!m_outbuffer.isEmpty())
00216             msg2 += "<p><b><u>"+i18n("Output")+"</u></b></p><p>"+m_outbuffer+"</p>";
00217         if (!m_errorbuffer.isEmpty())
00218             msg2 += "<p><b><u>"+i18n("Error")+"</u></b></p><p>"+m_errorbuffer+"</p>";
00219         if (!msg2.isEmpty())
00220             KMessageBox::detailedError(this, msg1, msg2);
00221         else
00222             KMessageBox::error(this, msg1);
00223     }
00224     else if ( !m_outbuffer.isEmpty() && m_hasoutput )
00225     {
00226         KMessageBox::information( this, m_outbuffer );
00227     }
00228     m_hasoutput = false;
00229 }
00230 
00231 void EscpWidget::slotReceivedStdout(KProcess*, char *buf, int len)
00232 {
00233     QString bufstr = QCString(buf, len);
00234     m_outbuffer.append(bufstr);
00235 }
00236 
00237 void EscpWidget::slotReceivedStderr(KProcess*, char *buf, int len)
00238 {
00239     QString bufstr = QCString(buf, len);
00240     m_errorbuffer.append(bufstr);
00241 }
00242 
00243 void EscpWidget::slotButtonClicked()
00244 {
00245     QString arg = sender()->name();
00246     startCommand(arg);
00247 }
00248 
00249 void EscpWidget::setPrinterName(const QString& p)
00250 {
00251     m_printer->setText(p);
00252 }
00253 
00254 void EscpWidget::setDevice(const QString& dev)
00255 {
00256     m_deviceURL = dev;
00257     m_device->setText(dev);
00258 }
00259 
00260 #include "escpwidget.moc"
KDE Logo
This file is part of the documentation for kdeprint Library Version 3.4.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Jul 20 12:45:43 2006 by doxygen 1.4.4 written by Dimitri van Heesch, © 1997-2003