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, TQ_SIGNAL(textChanged(
const TQString &)),
70 connect(listView, TQ_SIGNAL(destroyed()),
71 this, TQ_SLOT(listViewDeleted()));
73 connect(listView, TQ_SIGNAL(itemAdded(TQListViewItem *)),
74 this, TQ_SLOT(itemAdded(TQListViewItem *)));
83 d =
new TDEListViewSearchLinePrivate;
87 connect(
this, TQ_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, TQ_SIGNAL(destroyed()),
182 this, TQ_SLOT(listViewDeleted()));
184 disconnect(d->listView, TQ_SIGNAL(itemAdded(TQListViewItem *)),
185 this, TQ_SLOT(itemAdded(TQListViewItem *)));
191 connect(d->listView, TQ_SIGNAL(destroyed()),
192 this, TQ_SLOT(listViewDeleted()));
194 connect(d->listView, TQ_SIGNAL(itemAdded(TQListViewItem *)),
195 this, TQ_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, TQ_SIGNAL(activated(
int)),
this, TQ_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, TQ_SIGNAL(clicked()), d->searchLine, TQ_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" virtual ~TDEListViewSearchLine()
Destroys the TDEListViewSearchLine.
void queueSearch(const TQString &search)
When keys are pressed a new search string is created and a timer is activated.
TQValueList< int > searchColumns() const
Returns the current list of columns that will be searched.
void activateSearch()
When the timer started with queueSearch() expires this slot is called.
virtual bool itemMatches(const TQListViewItem *item, const TQString &s) const
Returns true if item matches the search s.
virtual TQPopupMenu * createPopupMenu()
Re-implemented for internal reasons.
void setCaseSensitive(bool cs)
Make the search case sensitive or case insensitive.
TDEListView * listView() const
Returns the listview that is currently filtered by the search.
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.
This class makes it easy to add a search line for filtering the items in a listview based on a simple...
This Widget extends the functionality of TQListView to honor the system wide settings for Single Clic...
An enhanced TQLineEdit widget for inputting text.
virtual void updateSearch(const TQString &s=TQString::null)
Updates search to only make visible the items that match s.
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...
TDEListViewSearchLine(TQWidget *parent=0, TDEListView *listView=0, const char *name=0)
Constructs a TDEListViewSearchLine with listView being the TDEListView to be filtered.
void setSearchColumns(const TQValueList< int > &columns)
Sets the list of columns to be searched.
void setListView(TDEListView *lv)
Sets the TDEListView that is filtered by this search line.
virtual TQPopupMenu * createPopupMenu()
Re-implemented for internal reasons.