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

# kmlistview.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 "kmlistview.h"
    00021 #include "kmprinter.h"
    00022 #include "kmobject.h"
    00023
    00024 #include <qheader.h>
    00025 #include <qpainter.h>
    00026 #include <klocale.h>
    00027 #include <kiconloader.h>
    00028 #include <kcursor.h>
    00029
    00030 class KMListViewItem : public QListViewItem, public KMObject
    00031 {
    00032 public:
    00033     KMListViewItem(QListView *parent, const QString& txt);
    00034     KMListViewItem(QListViewItem *parent, const QString& txt);
    00035     KMListViewItem(QListViewItem *parent, KMPrinter *p);
    00036
    00037     virtual void paintCell(QPainter*, const QColorGroup&, int, int, int);
    00038     void updatePrinter(KMPrinter *p);
    00039     bool isClass() const    { return m_isclass; }
    00040
    00041 protected:
    00042     void init(KMPrinter *p = 0);
    00043
    00044 private:
    00045     int m_state;
    00046     bool    m_isclass;
    00047 };
    00048
    00049 KMListViewItem::KMListViewItem(QListView *parent, const QString& txt)
    00050 : QListViewItem(parent,txt)
    00051 {
    00052     init();
    00053 }
    00054
    00055 KMListViewItem::KMListViewItem(QListViewItem *parent, const QString& txt)
    00056 : QListViewItem(parent,txt)
    00057 {
    00058     init();
    00059 }
    00060
    00061 KMListViewItem::KMListViewItem(QListViewItem *parent, KMPrinter *p)
    00062 : QListViewItem(parent)
    00063 {
    00064     init(p);
    00065 }
    00066
    00067 void KMListViewItem::init(KMPrinter *p)
    00068 {
    00069     m_state = 0;
    00070     if (p)
    00071         updatePrinter(p);
    00072     setSelectable(depth() == 2);
    00073 }
    00074
    00075 void KMListViewItem::updatePrinter(KMPrinter *p)
    00076 {
    00077     bool    update(false);
    00078     if (p)
    00079     {
    00080         int oldstate = m_state;
    00081         int st(p->isValid() ? (int)KIcon::DefaultState : (int)KIcon::LockOverlay);
    00082         m_state = ((p->isHardDefault() ? 0x1 : 0x0) | (p->ownSoftDefault() ? 0x2 : 0x0) | (p->isValid() ? 0x4 : 0x0));
    00083         update = (oldstate != m_state);
    00084         QString name = (p->isVirtual() ? p->instanceName() : p->name());
    00085         if (name != text(0))
    00086             setText(0, name);
    00087         setPixmap(0, SmallIcon(p->pixmap(), 0, st));
    00088         m_isclass = p->isClass();
    00089     }
    00090     setDiscarded(false);
    00091     if (update)
    00092         repaint();
    00093 }
    00094
    00095 void KMListViewItem::paintCell(QPainter *p, const QColorGroup& cg, int c, int w, int a)
    00096 {
    00097     if (m_state != 0)
    00098     {
    00099         QFont   f(p->font());
    00100         if (m_state & 0x1) f.setBold(true);
    00101         if (m_state & 0x2) f.setItalic(true);
    00102         p->setFont(f);
    00103     }
    00104     QListViewItem::paintCell(p,cg,c,w,a);
    00105 }
    00106
    00107 //************************************************************************************************
    00108
    00109 KMListView::KMListView(QWidget *parent, const char *name)
    00110 : QListView(parent,name)
    00111 {
    00112     m_items.setAutoDelete(false);
    00113
    00114     addColumn("");
    00115     header()->hide();
    00116     setFrameStyle(QFrame::WinPanel|QFrame::Sunken);
    00117     setLineWidth(1);
    00118     setSorting(0);
    00119
    00120     connect(this,SIGNAL(contextMenuRequested(QListViewItem*,const QPoint&,int)),SLOT(slotRightButtonClicked(QListViewItem*,const QPoint&,int)));
    00121     connect(this,SIGNAL(selectionChanged()),SLOT(slotSelectionChanged()));
    00122     connect(this,SIGNAL(onItem(QListViewItem*)),SLOT(slotOnItem(QListViewItem*)));
    00123     connect(this,SIGNAL(onViewport()),SLOT(slotOnViewport()));
    00124
    00125     m_root = new KMListViewItem(this,i18n("Print System"));
    00126     m_root->setPixmap(0,SmallIcon("kdeprint_printer"));
    00127     m_root->setOpen(true);
    00128     m_classes = new KMListViewItem(m_root,i18n("Classes"));
    00129     m_classes->setPixmap(0,SmallIcon("package"));
    00130     m_classes->setOpen(true);
    00131     m_printers = new KMListViewItem(m_root,i18n("Printers"));
    00132     m_printers->setPixmap(0,SmallIcon("package"));
    00133     m_printers->setOpen(true);
    00134     m_specials = new KMListViewItem(m_root,i18n("Specials"));
    00135     m_specials->setPixmap(0,SmallIcon("package"));
    00136     m_specials->setOpen(true);
    00137
    00138     sort();
    00139 }
    00140
    00141 KMListView::~KMListView()
    00142 {
    00143 }
    00144
    00145 void KMListView::slotRightButtonClicked(QListViewItem *item, const QPoint& p, int)
    00146 {
    00147     emit rightButtonClicked(item && item->depth() == 2 ? item->text(0) : QString::null, p);
    00148 }
    00149
    00150 KMListViewItem* KMListView::findItem(KMPrinter *p)
    00151 {
    00152     if (p)
    00153     {
    00154         QPtrListIterator<KMListViewItem>    it(m_items);
    00155         bool    isVirtual(p->isVirtual()), isClass(p->isClass());
    00156         for (;it.current();++it)
    00157             if (isVirtual)
    00158             {
    00159                 if (it.current()->depth() == 3 && it.current()->text(0) == p->instanceName()
    00160                         && it.current()->parent()->text(0) == p->printerName())
    00161                     return it.current();
    00162             }
    00163             else
    00164             {
    00165                 if (it.current()->isClass() == isClass && it.current()->text(0) == p->name())
    00166                     return it.current();
    00167             }
    00168     }
    00169     return 0;
    00170 }
    00171
    00172 KMListViewItem* KMListView::findItem(const QString& prname)
    00173 {
    00174     QPtrListIterator<KMListViewItem>    it(m_items);
    00175     for (; it.current(); ++it)
    00176         if (it.current()->depth() == 2 && it.current()->text(0) == prname)
    00177             return it.current();
    00178     return 0;
    00179 }
    00180
    00181 void KMListView::setPrinterList(QPtrList<KMPrinter> *list)
    00182 {
    00183     bool    changed(false);
    00184
    00185     QPtrListIterator<KMListViewItem>    it(m_items);
    00186     for (;it.current();++it)
    00187         it.current()->setDiscarded(true);
    00188
    00189     if (list)
    00190     {
    00191         QPtrListIterator<KMPrinter> it(*list);
    00192         KMListViewItem          *item (0);
    00193         for (;it.current();++it)
    00194         {
    00195             item = findItem(it.current());
    00196             if (!item)
    00197             {
    00198                 if (it.current()->isVirtual())
    00199                 {
    00200                     KMListViewItem  *pItem = findItem(it.current()->printerName());
    00201                     if (!pItem)
    00202                         continue;
    00203                     item = new KMListViewItem(pItem, it.current());
    00204                     pItem->setOpen(true);
    00205                 }
    00206                 else
    00207                     item = new KMListViewItem((it.current()->isSpecial() ? m_specials : (it.current()->isClass(false) ? m_classes : m_printers)),it.current());
    00208                 m_items.append(item);
    00209                 changed = true;
    00210             }
    00211             else
    00212                 item->updatePrinter(it.current());
    00213         }
    00214     }
    00215
    00216     QPtrList<KMListViewItem>    deleteList;
    00217     deleteList.setAutoDelete(true);
    00218     for (uint i=0; i<m_items.count(); i++)
    00219         if (m_items.at(i)->isDiscarded())
    00220         {
    00221             // instance items are put in front of the list
    00222             // so that they are destroyed first
    00223             KMListViewItem  *item = m_items.take(i);
    00224             if (item->depth() == 2)
    00225                 deleteList.append(item);
    00226             else
    00227                 deleteList.prepend(item);
    00228             i--;
    00229             changed = true;
    00230         }
    00231     deleteList.clear();
    00232
    00233     if (changed) sort();
    00234     emit selectionChanged();
    00235 }
    00236
    00237 void KMListView::slotSelectionChanged()
    00238 {
    00239     KMListViewItem  *item = static_cast<KMListViewItem*>(currentItem());
    00240     emit printerSelected((item && !item->isDiscarded() && item->depth() == 2 ? item->text(0) : QString::null));
    00241 }
    00242
    00243 void KMListView::setPrinter(const QString& prname)
    00244 {
    00245     QPtrListIterator<KMListViewItem>    it(m_items);
    00246     for (;it.current();++it)
    00247         if (it.current()->text(0) == prname)
    00248         {
    00249             setSelected(it.current(),true);
    00250             break;
    00251         }
    00252 }
    00253
    00254 void KMListView::setPrinter(KMPrinter *p)
    00255 {
    00256     setPrinter(p ? p->name() : QString::null);
    00257 }
    00258
    00259 void KMListView::slotOnItem(QListViewItem *)
    00260 {
    00261     setCursor(KCursor::handCursor());
    00262 }
    00263
    00264 void KMListView::slotOnViewport()
    00265 {
    00266     setCursor(KCursor::arrowCursor());
    00267 }
    00268 #include "kmlistview.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:02 2005 by doxygen 1.4.1 written by Dimitri van Heesch, © 1997-2003