| # kdeprint Library API Documentation
Overview | Class Hierarchy | Classes | Classes (annotated) | Members | Namespaces | Source Files

# 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"

This file is part of the documentation for kdeprint Library Version 3.4.1.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat Jun 11 20:31:01 2005 by doxygen 1.4.1 written by Dimitri van Heesch, © 1997-2003