28 #include <QApplication>
32 #include <QContextMenuEvent>
35 #include <QToolButton>
37 class K3ListViewSearchLine::K3ListViewSearchLinePrivate
40 K3ListViewSearchLinePrivate() :
44 canChooseColumns(true),
46 allVisibleColumnsAction(0)
53 bool canChooseColumns;
57 QAction *allVisibleColumnsAction;
67 d =
new K3ListViewSearchLinePrivate;
70 connect(
this, SIGNAL(textChanged(
QString)),
79 const QList<K3ListView *> &listViews) :
82 d =
new K3ListViewSearchLinePrivate;
85 connect(
this, SIGNAL(textChanged(
QString)),
99 return (d->caseSensitive ==Qt::CaseSensitive);
104 if (d->canChooseColumns)
105 return d->searchColumns;
112 return d->keepParentsVisible;
117 if ( d->listViews.count() == 1 )
118 return d->listViews.first();
138 d->listViews.append(lv);
139 setEnabled(!d->listViews.isEmpty());
148 int idx = d->listViews.indexOf(lv);
151 d->listViews.removeAt( idx );
156 setEnabled(!d->listViews.isEmpty());
163 d->search = s.isNull() ? text() : s;
165 for (QList<K3ListView *>::Iterator it = d->listViews.begin();
166 it != d->listViews.end(); ++it)
181 switch(listView->selectionMode())
186 currentItem = listView->selectedItem();
190 int flags = Q3ListViewItemIterator::Selected | Q3ListViewItemIterator::Visible;
191 for(Q3ListViewItemIterator it(listView, flags);
192 it.current() && !currentItem;
195 if(listView->itemRect(it.current()).isValid())
196 currentItem = it.current();
201 if(d->keepParentsVisible)
202 checkItemParentsVisible(listView->firstChild());
204 checkItemParentsNotVisible(listView);
207 listView->ensureItemVisible(currentItem);
212 d->caseSensitive = cs?Qt::CaseSensitive:Qt::CaseInsensitive;
217 d->keepParentsVisible = v;
222 if (d->canChooseColumns)
223 d->searchColumns = columns;
234 for (QList<K3ListView *>::Iterator it = d->listViews.begin();
235 it != d->listViews.end(); ++it)
240 for (QList<K3ListView *>::Iterator it = d->listViews.begin();
241 it != d->listViews.end(); ++it)
245 setEnabled(!d->listViews.isEmpty());
260 if(!d->searchColumns.isEmpty()) {
261 QList<int>::ConstIterator it = d->searchColumns.constBegin();
262 for(; it != d->searchColumns.constEnd(); ++it) {
263 if(*it < item->
listView()->columns() &&
264 item->text(*it).indexOf(s, 0, d->caseSensitive) >= 0)
269 for(
int i = 0; i < item->listView()->columns(); i++) {
270 if(item->listView()->columnWidth(i) > 0 &&
271 item->text(i).indexOf(s, 0, d->caseSensitive) >= 0)
285 if (d->canChooseColumns) {
286 popup->addSeparator();
287 QMenu *subMenu = popup->addMenu(
i18n(
"Search Columns"));
288 connect(subMenu, SIGNAL(triggered(
QAction*)),
this, SLOT(searchColumnsMenuActivated(
QAction*)));
290 d->allVisibleColumnsAction = subMenu->addAction(
i18n(
"All Visible Columns"));
291 d->allVisibleColumnsAction->setCheckable(
true );
292 subMenu->addSeparator();
294 bool allColumnsAreSearchColumns =
true;
296 Q3Header*
const header = d->listViews.first()->header();
297 int visibleColumns = 0;
298 for(
int i = 0; i < d->listViews.first()->columns(); i++) {
299 if(d->listViews.first()->columnWidth(i)>0) {
300 QString columnText = d->listViews.first()->columnText(i);
301 if(columnText.isEmpty()) {
302 int visiblePosition=1;
303 for(
int j = 0; j < header->mapToIndex(i); j++)
304 if(d->listViews.first()->columnWidth(header->mapToSection(j))>0)
307 columnText =
i18nc(
"Column number %1",
"Column No. %1", visiblePosition);
309 QAction *action = subMenu->addAction(columnText);
310 action->setData( visibleColumns );
311 action->setCheckable(
true );
313 if(d->searchColumns.isEmpty() || d->searchColumns.indexOf(i) != -1)
314 action->setChecked(
true);
316 allColumnsAreSearchColumns =
false;
321 d->allVisibleColumnsAction->setChecked( allColumnsAreSearchColumns );
324 if(allColumnsAreSearchColumns && !d->searchColumns.isEmpty())
325 d->searchColumns.clear();
328 popup->exec( e->globalPos() );
335 connect(lv, SIGNAL(destroyed(
QObject*)),
336 this, SLOT(listViewDeleted(
QObject*)));
343 disconnect(lv, SIGNAL(destroyed(
QObject*)),
344 this, SLOT(listViewDeleted(
QObject*)));
354 if (d->listViews.isEmpty())
357 const K3ListView *first = d->listViews.first();
359 const unsigned int numcols = first->columns();
365 for (
unsigned int i = 0; i < numcols; ++i)
366 headers.append(first->columnText(i));
368 QList<K3ListView *>::ConstIterator it = d->listViews.constBegin();
369 for (++it ; it !=d->listViews.constEnd(); ++it) {
371 if ((
unsigned int) (*it)->columns() != numcols)
375 QStringList::ConstIterator jt;
377 for (i = 0, jt = headers.constBegin(); i < numcols; ++i, ++jt) {
378 Q_ASSERT(jt != headers.constEnd());
379 if ((*it)->columnText(i) != *jt)
400 --(d->queuedSearches);
402 if(d->queuedSearches == 0)
415 void K3ListViewSearchLine::listViewDeleted(
QObject *o)
417 d->listViews.removeAll(static_cast<K3ListView *>(o));
418 setEnabled(d->listViews.isEmpty());
421 void K3ListViewSearchLine::searchColumnsMenuActivated(
QAction *action)
423 int id = action->data().toInt();
425 if(action == d->allVisibleColumnsAction) {
426 if(d->searchColumns.isEmpty())
427 d->searchColumns.append(0);
429 d->searchColumns.clear();
432 if(d->searchColumns.indexOf(
id) != -1)
433 d->searchColumns.removeAll(
id);
435 if(d->searchColumns.isEmpty()) {
436 for(
int i = 0; i < d->listViews.first()->columns(); i++) {
438 d->searchColumns.append(i);
442 d->searchColumns.append(
id);
452 void K3ListViewSearchLine::checkColumns()
457 void K3ListViewSearchLine::checkItemParentsNotVisible(
K3ListView *listView)
459 Q3ListViewItemIterator it(listView);
460 for(; it.current(); ++it)
464 item->setVisible(
true);
466 item->setVisible(
false);
483 bool visible =
false;
485 for(; item; item = item->nextSibling())
488 Q3ListViewItem * hhp = highestHiddenParent ? highestHiddenParent : item->isVisible() ? 0L : item;
489 bool childMatch =
false;
490 if(item->firstChild() && checkItemParentsVisible(item->firstChild(), hhp))
496 if (highestHiddenParent)
498 highestHiddenParent->setVisible(
true);
501 for(
Q3ListViewItem *hide = first; hide != item; hide = hide->nextSibling())
502 hide->setVisible(
false);
503 highestHiddenParent = 0;
507 for(
Q3ListViewItem *hide = item->firstChild(); hide; hide = hide->nextSibling())
508 hide->setVisible(
false);
511 item->setVisible(
true);
514 item->setVisible(
false);
523 class K3ListViewSearchLineWidget::K3ListViewSearchLineWidgetPrivate
526 K3ListViewSearchLineWidgetPrivate() : listView(0),
searchLine(0) {}
535 d =
new K3ListViewSearchLineWidgetPrivate;
536 d->listView = listView;
552 return d->searchLine;
558 label->setObjectName(QLatin1String(
"kde toolbar widget"));
561 d->searchLine->show();
563 label->setBuddy(d->searchLine);
569 return d->searchLine;
572 #include "k3listviewsearchline.moc"