19 #include "klistviewsearchline.h" 21 #include <klistview.h> 22 #include <kiconloader.h> 24 #include <ktoolbarbutton.h> 28 #include <tqapplication.h> 30 #include <tqpopupmenu.h> 34 #define KLISTVIEWSEARCHLINE_ALLVISIBLECOLUMNS_ID 2004 36 class KListViewSearchLine::KListViewSearchLinePrivate
39 KListViewSearchLinePrivate() :
62 d =
new KListViewSearchLinePrivate;
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 KListViewSearchLinePrivate;
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 KListView::NoSelection:
138 case KListView::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 KListViewSearchLine::itemAdded(TQListViewItem *item)
const 308 void KListViewSearchLine::listViewDeleted()
314 void KListViewSearchLine::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 KListViewSearchLine::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 KListViewSearchLine::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 KListViewSearchLineWidget::KListViewSearchLineWidgetPrivate
412 KListViewSearchLineWidgetPrivate() :
listView(0), searchLine(0), clearButton(0) {}
415 TQToolButton *clearButton;
423 d =
new KListViewSearchLineWidgetPrivate;
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,
"kde 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 KListViewSearchLineWidget::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 "klistviewsearchline.moc"
This class makes it easy to add a search line for filtering the items in a listview based on a simple...
void setKeepParentsVisible(bool v)
When a search is active on a list that's organized into a tree view if a parent or ancesestor of an i...
virtual TQPopupMenu * createPopupMenu()
Re-implemented for internal reasons.
bool keepParentsVisible() const
If this is true (the default) then the parents of matched items will also be shown.
bool caseSensitive() const
Returns true if the search is case sensitive.
void setListView(KListView *lv)
Sets the KListView that is filtered by this search line.
This Widget extends the functionality of TQListView to honor the system wide settings for Single Clic...
void queueSearch(const TQString &search)
When keys are pressed a new search string is created and a timer is activated.
virtual TQPopupMenu * createPopupMenu()
Re-implemented for internal reasons.
virtual bool itemMatches(const TQListViewItem *item, const TQString &s) const
Returns true if item matches the search s.
void activateSearch()
When the timer started with queueSearch() expires this slot is called.
virtual void updateSearch(const TQString &s=TQString::null)
Updates search to only make visible the items that match s.
virtual ~KListViewSearchLine()
Destroys the KListViewSearchLine.
An enhanced TQLineEdit widget for inputting text.
TQValueList< int > searchColumns() const
Returns the current list of columns that will be searched.
void setCaseSensitive(bool cs)
Make the search case sensitive or case insensitive.
void setSearchColumns(const TQValueList< int > &columns)
Sets the list of columns to be searched.
KListView * listView() const
Returns the listview that is currently filtered by the search.
KListViewSearchLine(TQWidget *parent=0, KListView *listView=0, const char *name=0)
Constructs a KListViewSearchLine with listView being the KListView to be filtered.