You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdelibs/kdeprint/management/kmwlocal.cpp

207 lines
5.6 KiB

/*
* This file is part of the KDE libraries
* Copyright (c) 2001 Michael Goffioul <kdeprint@swing.be>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License version 2 as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
**/
#include "kmwlocal.h"
#include "kmwizard.h"
#include "kmprinter.h"
#include "kmfactory.h"
#include "kmmanager.h"
#include <klocale.h>
#include <qlayout.h>
#include <qlineedit.h>
#include <qlabel.h>
#include <qheader.h>
#include <klistview.h>
#include <kmessagebox.h>
#include <kiconloader.h>
KMWLocal::KMWLocal(QWidget *parent, const char *name)
: KMWizardPage(parent,name)
{
m_title = i18n("Local Port Selection");
m_ID = KMWizard::Local;
m_nextpage = KMWizard::Driver;
m_initialized = false;
m_block = false;
m_ports = new KListView(this);
m_ports->setFrameStyle(QFrame::WinPanel|QFrame::Sunken);
m_ports->setLineWidth(1);
m_ports->header()->hide();
m_ports->addColumn("");
m_ports->setSorting(-1);
QListViewItem *root = new QListViewItem(m_ports, i18n("Local System"));
root->setPixmap(0, SmallIcon("kdeprint_computer"));
root->setOpen(true);
connect(m_ports, SIGNAL(selectionChanged(QListViewItem*)), SLOT(slotPortSelected(QListViewItem*)));
QLabel *l1 = new QLabel(i18n("URI:"), this);
m_localuri = new QLineEdit(this);
connect( m_localuri, SIGNAL( textChanged( const QString& ) ), SLOT( slotTextChanged( const QString& ) ) );
m_parents[0] = new QListViewItem(root, i18n("Parallel"));
m_parents[1] = new QListViewItem(root, m_parents[0], i18n("Serial"));
m_parents[2] = new QListViewItem(root, m_parents[1], i18n("USB"));
m_parents[3] = new QListViewItem(root, m_parents[2], i18n("Others"));
for (int i=0;i<4;i++)
m_parents[i]->setPixmap(0, SmallIcon("input_devices_settings"));
QLabel *l2 = new QLabel(i18n("<p>Select a valid detected port, or enter directly the corresponding URI in the bottom edit field.</p>"), this);
QVBoxLayout *lay0 = new QVBoxLayout(this, 0, 10);
QHBoxLayout *lay1 = new QHBoxLayout(0, 0, 10);
lay0->addWidget(l2, 0);
lay0->addWidget(m_ports, 1);
lay0->addLayout(lay1, 0);
lay1->addWidget(l1, 0);
lay1->addWidget(m_localuri, 1);
}
bool KMWLocal::isValid(QString& msg)
{
if (m_localuri->text().isEmpty())
{
msg = i18n("The URI is empty","Empty URI.");
return false;
}
else if (m_uris.findIndex(m_localuri->text()) == -1)
{
if (KMessageBox::warningContinueCancel(this, i18n("The local URI doesn't correspond to a detected port. Continue?")) == KMessageBox::Cancel)
{
msg = i18n("Select a valid port.");
return false;
}
}
return true;
}
void KMWLocal::slotPortSelected(QListViewItem *item)
{
if ( m_block )
return;
QString uri;
if (!item || item->depth() <= 1 || item->depth() > 3)
uri = QString::null;
else if (item->depth() == 3)
uri = item->parent()->text( 1 );
else
uri = item->text( 1 );
m_block = true;
m_localuri->setText( uri );
m_block = false;
}
void KMWLocal::updatePrinter(KMPrinter *printer)
{
QListViewItem *item = m_ports->selectedItem();
if ( item && item->depth() == 3 )
printer->setOption( "kde-autodetect", item->text( 0 ) );
printer->setDevice(m_localuri->text());
}
void KMWLocal::initPrinter(KMPrinter *printer)
{
if (!m_initialized)
initialize();
if (printer)
{
m_localuri->setText(printer->device());
}
}
QListViewItem* KMWLocal::lookForItem( const QString& uri )
{
for ( int i=0; i<4; i++ )
{
QListViewItem *item = m_parents[ i ]->firstChild();
while ( item )
if ( item->text( 1 ) == uri )
if ( item->firstChild() )
return item->firstChild();
else
return item;
else
item = item->nextSibling();
}
return 0;
}
void KMWLocal::slotTextChanged( const QString& txt )
{
if ( m_block )
return;
QListViewItem *item = lookForItem( txt );
if ( item )
{
m_block = true;
m_ports->setSelected( item, true );
m_block = false;
}
else
m_ports->clearSelection();
}
void KMWLocal::initialize()
{
QStringList list = KMFactory::self()->manager()->detectLocalPrinters();
if (list.isEmpty() || (list.count() % 4) != 0)
{
KMessageBox::error(this, i18n("Unable to detect local ports."));
return;
}
QListViewItem *last[4] = {0, 0, 0, 0};
for (QStringList::Iterator it=list.begin(); it!=list.end(); ++it)
{
QString cl = *it;
++it;
QString uri = *it;
int p = uri.find( ':' );
QString desc = *(++it), prot = ( p != -1 ? uri.left( p ) : QString::null );
QString printer = *(++it);
int index(-1);
if (desc.isEmpty())
desc = uri;
if (prot == "parallel" || prot == "file")
index = 0;
else if (prot == "serial")
index = 1;
else if (prot == "usb")
index = 2;
else if (cl == "direct")
index = 3;
else
continue;
last[index] = new QListViewItem(m_parents[index], last[index], desc, uri);
last[index]->setPixmap(0, SmallIcon("blockdevice"));
m_parents[index]->setOpen(true);
m_uris << uri;
if (!printer.isEmpty())
{
QListViewItem *pItem = new QListViewItem(last[index], printer);
last[index]->setOpen(true);
pItem->setPixmap(0, SmallIcon("kdeprint_printer"));
}
}
m_initialized = true;
}
#include "kmwlocal.moc"