19 #include "tdelistviewsearchline.h"
21 #include <tdelistview.h>
22 #include <kiconloader.h>
23 #include <tdetoolbar.h>
24 #include <tdetoolbarbutton.h>
28 #include <tqapplication.h>
30 #include <tqpopupmenu.h>
34 #define KLISTVIEWSEARCHLINE_ALLVISIBLECOLUMNS_ID 2004
36 class TDEListViewSearchLine::TDEListViewSearchLinePrivate
39 TDEListViewSearchLinePrivate() :
62 d =
new TDEListViewSearchLinePrivate;
66 connect(
this, TQT_SIGNAL(textChanged(
const TQString &)),
70 connect(listView, TQT_SIGNAL(destroyed()),
71 this, TQT_SLOT(listViewDeleted()));
73 connect(listView, TQT_SIGNAL(itemAdded(TQListViewItem *)),
74 this, TQT_SLOT(itemAdded(TQListViewItem *)));
83 d =
new TDEListViewSearchLinePrivate;
87 connect(
this, TQT_SIGNAL(textChanged(
const TQString &)),
100 return d->caseSensitive;
105 return d->searchColumns;
110 return d->keepParentsVisible;
127 d->search = s.isNull() ? text() : s;
132 TQListViewItem *currentItem = 0;
134 switch(d->listView->selectionMode())
136 case TDEListView::NoSelection:
138 case TDEListView::Single:
139 currentItem = d->listView->selectedItem();
143 int flags = TQListViewItemIterator::Selected | TQListViewItemIterator::Visible;
144 for(TQListViewItemIterator it(d->listView, flags);
145 it.current() && !currentItem;
148 if(d->listView->itemRect(it.current()).isValid())
149 currentItem = it.current();
154 if(d->keepParentsVisible)
155 checkItemParentsVisible(d->listView->firstChild());
157 checkItemParentsNotVisible();
160 d->listView->ensureItemVisible(currentItem);
165 d->caseSensitive = cs;
170 d->keepParentsVisible = v;
175 d->searchColumns = columns;
181 disconnect(d->listView, TQT_SIGNAL(destroyed()),
182 this, TQT_SLOT(listViewDeleted()));
184 disconnect(d->listView, TQT_SIGNAL(itemAdded(TQListViewItem *)),
185 this, TQT_SLOT(itemAdded(TQListViewItem *)));
191 connect(d->listView, TQT_SIGNAL(destroyed()),
192 this, TQT_SLOT(listViewDeleted()));
194 connect(d->listView, TQT_SIGNAL(itemAdded(TQListViewItem *)),
195 this, TQT_SLOT(itemAdded(TQListViewItem *)));
198 setEnabled(
bool(lv));
213 if(!d->searchColumns.isEmpty()) {
214 TQValueList<int>::ConstIterator it = d->searchColumns.begin();
215 for(; it != d->searchColumns.end(); ++it) {
216 if(*it < item->
listView()->columns() &&
217 item->text(*it).find(s, 0, d->caseSensitive) >= 0)
222 for(
int i = 0; i < item->listView()->columns(); i++) {
223 if(item->listView()->columnWidth(i) > 0 &&
224 item->text(i).find(s, 0, d->caseSensitive) >= 0)
238 if (d->listView->columns()>1) {
239 TQPopupMenu *subMenu =
new TQPopupMenu(popup);
240 connect(subMenu, TQT_SIGNAL(activated(
int)),
this, TQT_SLOT(searchColumnsMenuActivated(
int)));
242 popup->insertSeparator();
243 popup->insertItem(i18n(
"Search Columns"), subMenu);
245 subMenu->insertItem(i18n(
"All Visible Columns"), KLISTVIEWSEARCHLINE_ALLVISIBLECOLUMNS_ID);
246 subMenu->insertSeparator();
248 bool allColumnsAreSearchColumns =
true;
250 TQHeader*
const header = d->listView->header();
251 int visibleColumns = 0;
252 for(
int i = 0; i < d->listView->columns(); i++) {
253 if(d->listView->columnWidth(i)>0) {
254 TQString columnText = d->listView->columnText(i);
255 if(columnText.isEmpty()) {
256 int visiblePosition=1;
257 for(
int j = 0; j < header->mapToIndex(i); j++)
258 if(d->listView->columnWidth(header->mapToSection(j))>0)
260 columnText = i18n(
"Column number %1",
"Column No. %1").arg(visiblePosition);
262 subMenu->insertItem(columnText, visibleColumns);
263 if(d->searchColumns.isEmpty() || d->searchColumns.find(i) != d->searchColumns.end())
264 subMenu->setItemChecked(visibleColumns,
true);
266 allColumnsAreSearchColumns =
false;
270 subMenu->setItemChecked(KLISTVIEWSEARCHLINE_ALLVISIBLECOLUMNS_ID, allColumnsAreSearchColumns);
273 if(allColumnsAreSearchColumns && !d->searchColumns.isEmpty())
274 d->searchColumns.clear();
293 --(d->queuedSearches);
295 if(d->queuedSearches == 0)
303 void TDEListViewSearchLine::itemAdded(TQListViewItem *item)
const
308 void TDEListViewSearchLine::listViewDeleted()
314 void TDEListViewSearchLine::searchColumnsMenuActivated(
int id)
316 if(
id == KLISTVIEWSEARCHLINE_ALLVISIBLECOLUMNS_ID) {
317 if(d->searchColumns.isEmpty())
318 d->searchColumns.append(0);
320 d->searchColumns.clear();
323 if(d->searchColumns.find(
id) != d->searchColumns.end())
324 d->searchColumns.remove(
id);
326 if(d->searchColumns.isEmpty()) {
327 for(
int i = 0; i < d->listView->columns(); i++) {
329 d->searchColumns.append(i);
333 d->searchColumns.append(
id);
343 void TDEListViewSearchLine::checkItemParentsNotVisible()
345 TQListViewItemIterator it(d->listView);
346 for(; it.current(); ++it)
348 TQListViewItem *item = it.current();
350 item->setVisible(
true);
352 item->setVisible(
false);
367 bool TDEListViewSearchLine::checkItemParentsVisible(TQListViewItem *item, TQListViewItem *highestHiddenParent)
369 bool visible =
false;
370 TQListViewItem * first = item;
371 for(; item; item = item->nextSibling())
374 TQListViewItem * hhp = highestHiddenParent ? highestHiddenParent : item->isVisible() ? 0L : item;
375 bool childMatch =
false;
376 if(item->firstChild() && checkItemParentsVisible(item->firstChild(), hhp))
382 if (highestHiddenParent)
384 highestHiddenParent->setVisible(
true);
387 for(TQListViewItem *hide = first; hide != item; hide = hide->nextSibling())
388 hide->setVisible(
false);
389 highestHiddenParent = 0;
393 for(TQListViewItem *hide = item->firstChild(); hide; hide = hide->nextSibling())
394 hide->setVisible(
false);
397 item->setVisible(
true);
400 item->setVisible(
false);
409 class TDEListViewSearchLineWidget::TDEListViewSearchLineWidgetPrivate
412 TDEListViewSearchLineWidgetPrivate() : listView(0),
searchLine(0), clearButton(0) {}
415 TQToolButton *clearButton;
423 d =
new TDEListViewSearchLineWidgetPrivate;
424 d->listView = listView;
440 return d->searchLine;
447 if(!d->clearButton) {
448 d->clearButton =
new TQToolButton(
this);
449 TQIconSet icon = SmallIconSet(TQApplication::reverseLayout() ?
"clear_left" :
"locationbar_erase");
450 d->clearButton->setIconSet(icon);
453 d->clearButton->show();
455 TQLabel *label =
new TQLabel(i18n(
"S&earch:"),
this,
"tde toolbar widget");
458 d->searchLine->show();
460 label->setBuddy(d->searchLine);
463 connect(d->clearButton, TQT_SIGNAL(clicked()), d->searchLine, TQT_SLOT(clear()));
468 return d->searchLine;
471 void TDEListViewSearchLineWidget::positionInToolBar()
481 int widgetCount = toolBar->
count();
483 for(
int index = 0; index < widgetCount; index++) {
484 int id = toolBar->
idAt(index);
487 if(!d->clearButton) {
488 TQString icon = TQApplication::reverseLayout() ?
"clear_left" :
"locationbar_erase";
491 toolBar->
insertWidget(2005, d->clearButton->width(), d->clearButton, index);
498 d->searchLine->show();
501 #include "tdelistviewsearchline.moc"