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