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.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Apr 12 23:26:33 2005 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003