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" bool caseSensitive() const
Returns true if the search is case sensitive.
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...
KListView * listView() const
Returns the listview that is currently filtered by the search.
TQValueList< int > searchColumns() const
Returns the current list of columns that will be searched.
virtual TQPopupMenu * createPopupMenu()
Re-implemented for internal reasons.
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.
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.
bool keepParentsVisible() const
If this is true (the default) then the parents of matched items will also be shown.
KListViewSearchLine(TQWidget *parent=0, KListView *listView=0, const char *name=0)
Constructs a KListViewSearchLine with listView being the KListView to be filtered.