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., 51 Franklin Street, Fifth Floor,
00017  *  Boston, MA 02110-1301, 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"
KDE Home | KDE Accessibility Home | Description of Access Keys