kpilot Library API Documentation

listCat.cc

00001 /* listCat.cc                   KPilot
00002 **
00003 ** Copyright (C) 2000-2001 by Adriaan de Groot
00004 **
00005 ** This file defines a specialization of KListView that can
00006 ** be used to sort some fixed set of object into some fixed
00007 ** set of categories.
00008 */
00009 
00010 /*
00011 ** This program is free software; you can redistribute it and/or modify
00012 ** it under the terms of the GNU General Public License as published by
00013 ** the Free Software Foundation; either version 2 of the License, or
00014 ** (at your option) any later version.
00015 **
00016 ** This program is distributed in the hope that it will be useful,
00017 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
00018 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00019 ** GNU General Public License for more details.
00020 **
00021 ** You should have received a copy of the GNU General Public License
00022 ** along with this program in a file called COPYING; if not, write to
00023 ** the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
00024 ** MA 02111-1307, USA.
00025 */
00026 
00027 /*
00028 ** Bug reports and questions can be sent to kde-pim@kde.org
00029 */
00030 
00031 static const char *listCat_id =
00032         "$Id: listCat.cc,v 1.9.4.2 2003/03/12 23:31:14 adridg Exp $";
00033 
00034 #include "options.h"
00035 
00036 #include <qpainter.h>
00037 #include <klocale.h>
00038 
00039 #include "listCat.moc"
00040 
00041 
00042 ListCategorizer::ListCategorizer(QWidget * parent,
00043         const char *name) :
00044         KListView(parent, name), 
00045         fStartOpen(false)
00046 {
00047         FUNCTIONSETUP;
00048         setupWidget();
00049         (void) listCat_id;
00050 }
00051 
00052 ListCategorizer::ListCategorizer(const QStringList & i,
00053         bool startOpen,
00054         QWidget * parent,
00055         const char *name) :
00056         KListView(parent, name), 
00057         fStartOpen(startOpen)
00058 {
00059         FUNCTIONSETUP;
00060         addCategories(i);
00061 }
00062 
00063 void ListCategorizer::addCategories(const QStringList & l)
00064 {
00065         FUNCTIONSETUP;
00066         QStringList::ConstIterator i;
00067 
00068         for (i = l.begin(); i != l.end(); ++i)
00069         {
00070                 (void) addCategory(*i);
00071         }
00072 }
00073 
00074 QListViewItem *ListCategorizer::addCategory(const QString & name,
00075         const QString & desc)
00076 {
00077         FUNCTIONSETUP;
00078         QListViewItem *m = new QListViewItem(this, name, desc);
00079 
00080         m->setSelectable(false);
00081         m->setOpen(fStartOpen);
00082         return m;
00083 }
00084 
00085 void ListCategorizer::setupWidget()
00086 {
00087         FUNCTIONSETUP;
00088         addColumn(i18n("Category"));
00089         addColumn(i18n("Description"));
00090         setItemsMovable(false);
00091         setDragEnabled(true);
00092         setAcceptDrops(true);
00093         setDropVisualizer(true);
00094         setRootIsDecorated(true);
00095 }
00096 
00097 /* virtual */ bool ListCategorizer::acceptDrag(QDropEvent * event) const
00098 {
00099         FUNCTIONSETUP;
00100         if (!(event->source()))
00101                 return false;
00102         QListViewItem *p = itemAt(event->pos());
00103 
00104         if (!p)
00105                 return false;
00106 
00107         return true;
00108 }
00109 
00110 /* virtual */ void ListCategorizer::contentsDropEvent(QDropEvent * e)
00111 {
00112         FUNCTIONSETUP;
00113         cleanDropVisualizer();
00114 
00115         if (!acceptDrag(e))
00116                 return;
00117         e->accept();
00118 
00119         QListViewItem *p = itemAt(e->pos());
00120         QListViewItem *selection = currentItem();
00121 
00122         if (!p)
00123         {
00124                 kdWarning() << "Drop without a category!" << endl;
00125                 return;
00126         }
00127 
00128         QListViewItem *category = p->parent();
00129 
00130         if (!category)
00131         {
00132                 category = p;
00133         }
00134 
00135         moveItem(selection, category, 0L);
00136 }
00137 
00138 /* virtual */ void ListCategorizer::startDrag()
00139 {
00140         FUNCTIONSETUP;
00141         QListViewItem *p = currentItem();
00142 
00143         if (!p || !p->parent())
00144                 return;
00145 
00146         KListView::startDrag();
00147 }
00148 
00149 QStringList ListCategorizer::listSiblings(const QListViewItem * p, int column) const
00150 {
00151         FUNCTIONSETUP;
00152         QStringList l;
00153 
00154         while (p)
00155         {
00156                 l.append(p->text(column));
00157                 p = p->nextSibling();
00158         }
00159 
00160         return l;
00161 }
00162 
00163 QListViewItem *ListCategorizer::findCategory(const QString & category) const
00164 {
00165         FUNCTIONSETUP;
00166         QListViewItem *p = firstChild();
00167 
00168         while (p)
00169         {
00170                 if (p->text(0) == category)
00171                         return p;
00172                 p = p->nextSibling();
00173         }
00174 
00175         return 0L;
00176 }
00177 
00178 QListViewItem *ListCategorizer::addItem(const QString & category,
00179         const QString & name, const QString & description)
00180 {
00181         FUNCTIONSETUP;
00182         QListViewItem *p = findCategory(category);
00183 
00184         if (!p)
00185                 return 0L;
00186 
00187         return new QListViewItem(p, name, description);
00188 }
00189 
00190 #define RVPAD   (4)
00191 
00192 RichListViewItem::RichListViewItem(QListViewItem *p,
00193         QString l,
00194         int c) :
00195         QListViewItem(p,l)
00196 {
00197         FUNCTIONSETUP;
00198 
00199         fColumns=c;
00200         fIsRich = new bool[c];
00201         fRect = new QRect[c];
00202 
00203         for (int i=0; i<c; i++)
00204         {
00205                 fIsRich[i]=false;
00206         }
00207 }
00208 
00209 RichListViewItem::~RichListViewItem()
00210 {
00211         FUNCTIONSETUP;
00212 
00213         delete[] fIsRich;
00214         delete[] fRect;
00215 }
00216 
00217 void RichListViewItem::computeHeight(int c)
00218 {
00219         FUNCTIONSETUP;
00220 
00221         if (!fIsRich[c]) return;
00222 
00223         QListView *v = listView();
00224         
00225         fRect[c] = v->fontMetrics().boundingRect(v->itemMargin()+RVPAD,0+RVPAD,
00226                 v->columnWidth(c)-v->itemMargin()-RVPAD,300,
00227                 AlignLeft | AlignTop | WordBreak,
00228                 text(c));
00229 }
00230 
00231 
00232 /* virtual */ void RichListViewItem::setup()
00233 {
00234         FUNCTIONSETUP;
00235 
00236         QListViewItem::setup();
00237 
00238         int h = height();
00239 
00240         for (int i=0; i<fColumns; i++)
00241         {
00242                 computeHeight(i);
00243                 h = QMAX(h,fRect[i].height()+2*RVPAD);
00244         }
00245 
00246         setHeight(h);
00247 }
00248 
00249 
00250 /* virtual */ void RichListViewItem::paintCell(QPainter *p,
00251         const QColorGroup &gc,
00252         int column,
00253         int width,
00254         int alignment)
00255 {
00256         FUNCTIONSETUP;
00257 
00258         if ((!column) || (!fIsRich[column]))
00259         {
00260                 QListViewItem::paintCell(p,gc,column,width,alignment);
00261                 return;
00262         }
00263 
00264         QListView *v = listView();
00265 
00266         p->eraseRect(0,0,width,height());
00267         p->setBackgroundColor(gc.background());
00268         p->eraseRect(RVPAD,RVPAD,width-RVPAD,height()-RVPAD);
00269         p->setPen(gc.text());
00270         p->drawText(v->itemMargin()+RVPAD,0+RVPAD,
00271                 width-v->itemMargin()-RVPAD,height()-RVPAD,
00272                 AlignTop | AlignLeft | WordBreak,
00273                 text(column),
00274                 -1,
00275                 &fRect[column]);
00276 }
KDE Logo
This file is part of the documentation for kdelibs Version 3.1.4.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Sat Oct 18 02:47:14 2003 by doxygen 1.3.4 written by Dimitri van Heesch, © 1997-2001