00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 static const char *listCat_id =
00032 "$Id: listCat.cc,v 1.11 2003/03/08 01:43:07 waba 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 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 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 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 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 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 }