00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00026
#include "kiconviewsearchline.h"
00027
00028
#include <qiconview.h>
00029
#include <klocale.h>
00030
#include <qtimer.h>
00031
#include <kdebug.h>
00032
00033
#define DEFAULT_CASESENSITIVE false
00034
00035
typedef QValueList <QIconViewItem *>
QIconViewItemList;
00036
00037
class KIconViewSearchLine::KIconViewSearchLinePrivate
00038 {
00039
public:
00040 KIconViewSearchLinePrivate() :
00041 iconView( 0 ),
00042 caseSensitive( DEFAULT_CASESENSITIVE ),
00043 activeSearch( false ),
00044 queuedSearches( 0 ) {}
00045
00046
QIconView *iconView;
00047
bool caseSensitive;
00048
bool activeSearch;
00049
QString search;
00050
int queuedSearches;
00051 QIconViewItemList hiddenItems;
00052 };
00053
00054
00055
00056
00057 KIconViewSearchLine::KIconViewSearchLine(
QWidget *parent,
00058
QIconView *iconView,
00059
const char *name ) :
00060
KLineEdit( parent, name )
00061 {
00062 d = NULL;
00063
init( iconView );
00064 }
00065
00066 KIconViewSearchLine::KIconViewSearchLine(
QWidget *parent,
const char *name ) :
00067
KLineEdit( parent, name )
00068 {
00069 d = NULL;
00070
init( NULL );
00071 }
00072
00073 KIconViewSearchLine::~KIconViewSearchLine()
00074 {
00075
clear();
00076
delete d;
00077 }
00078
00079 bool KIconViewSearchLine::caseSensitive()
const
00080
{
00081
return d->caseSensitive;
00082 }
00083
00084 QIconView *
KIconViewSearchLine::iconView()
const
00085
{
00086
return d->iconView;
00087 }
00088
00089
00090
00091
00092 void KIconViewSearchLine::updateSearch(
const QString &s )
00093 {
00094
QIconView *iv = d->iconView;
00095
if( ! iv )
00096
return;
00097
00098
QString search = d->search = s.isNull() ? text() : s;
00099
00100 QIconViewItemList *hi = &(d->hiddenItems);
00101
00102
QIconViewItem *currentItem = iv->currentItem();
00103
00104
QIconViewItem *item = NULL;
00105
00106
00107
QIconViewItem *i = iv->firstItem();
00108
while ( i != NULL )
00109 {
00110 item = i;
00111 i = i->nextItem();
00112
if ( !
itemMatches( item, search ) )
00113 {
00114
hideItem( item );
00115
00116
if ( item == currentItem )
00117 currentItem = NULL;
00118 }
00119 }
00120
00121
00122 QIconViewItemList::iterator it = hi->begin();
00123
while ( it != hi->end() )
00124 {
00125 item = *it;
00126 ++it;
00127
if (
itemMatches( item, search ) )
00128
showItem( item );
00129 }
00130
00131 iv->sort();
00132
00133
if ( currentItem != NULL )
00134 iv->ensureItemVisible( currentItem );
00135 }
00136
00137 void KIconViewSearchLine::clear()
00138 {
00139
00140
QIconViewItem *item = NULL;
00141 QIconViewItemList::iterator it = d->hiddenItems.begin();
00142
while ( it != d->hiddenItems.end() )
00143 {
00144 item = *it;
00145 ++it;
00146
if ( item != NULL )
00147 {
00148
if ( d->iconView != NULL )
00149
showItem( item );
00150
else
00151
delete item;
00152 }
00153 }
00154
if ( ! d->hiddenItems.isEmpty() )
00155
kdDebug() << __FILE__ <<
":" << __LINE__ <<
00156
"hiddenItems is not empty as it should be. " <<
00157 d->hiddenItems.count() <<
" items are still there.\n" <<
endl;
00158
00159 d->search =
"";
00160 d->queuedSearches = 0;
00161
KLineEdit::clear();
00162 }
00163
00164 void KIconViewSearchLine::setCaseSensitive(
bool cs )
00165 {
00166 d->caseSensitive = cs;
00167 }
00168
00169 void KIconViewSearchLine::setIconView(
QIconView *iv )
00170 {
00171
if ( d->iconView != NULL )
00172 disconnect( d->iconView, SIGNAL( destroyed() ),
00173
this, SLOT( iconViewDeleted() ) );
00174
00175 d->iconView = iv;
00176
00177
if ( iv != NULL )
00178 {
00179 connect( d->iconView, SIGNAL( destroyed() ),
00180
this, SLOT( iconViewDeleted() ) );
00181 setEnabled(
true );
00182 }
00183
else
00184 setEnabled(
false );
00185 }
00186
00187
00188
00189
00190 bool KIconViewSearchLine::itemMatches(
const QIconViewItem *item,
00191
const QString &s )
const
00192
{
00193
if ( s.isEmpty() )
00194
return true;
00195
00196
if ( item == NULL )
00197
return false;
00198
00199
return ( item->text().find( s, 0,
caseSensitive() ) >= 0 );
00200 }
00201
00202 void KIconViewSearchLine::init(
QIconView *iconView )
00203 {
00204
delete d;
00205 d =
new KIconViewSearchLinePrivate;
00206
00207 d->iconView = iconView;
00208
00209 connect(
this, SIGNAL( textChanged(
const QString & ) ),
00210
this, SLOT(
queueSearch(
const QString & ) ) );
00211
00212
if ( iconView != NULL )
00213 {
00214 connect( iconView, SIGNAL( destroyed() ),
00215
this, SLOT( iconViewDeleted() ) );
00216 setEnabled(
true );
00217 }
00218
else
00219 setEnabled(
false );
00220 }
00221
00222 void KIconViewSearchLine::hideItem(
QIconViewItem *item )
00223 {
00224
if ( ( item == NULL ) || ( d->iconView == NULL ) )
00225
return;
00226
00227 d->hiddenItems.append( item );
00228 d->iconView->takeItem( item );
00229 }
00230
00231 void KIconViewSearchLine::showItem(
QIconViewItem *item )
00232 {
00233
if ( d->iconView == NULL )
00234 {
00235
kdDebug() << __FILE__ <<
":" << __LINE__ <<
00236
"showItem() could not be called while there's no iconView set." <<
00237
endl;
00238
return;
00239 }
00240 d->iconView->insertItem( item );
00241 d->hiddenItems.remove( item );
00242 }
00243
00244
00245
00246
00247 void KIconViewSearchLine::queueSearch(
const QString &s )
00248 {
00249 d->queuedSearches++;
00250 d->search = s;
00251 QTimer::singleShot( 200,
this, SLOT(
activateSearch() ) );
00252 }
00253
00254 void KIconViewSearchLine::activateSearch()
00255 {
00256 d->queuedSearches--;
00257
00258
if ( d->queuedSearches <= 0 )
00259 {
00260
updateSearch( d->search );
00261 d->queuedSearches = 0;
00262 }
00263 }
00264
00265
00266
00267
00268
void KIconViewSearchLine::iconViewDeleted()
00269 {
00270 d->iconView = NULL;
00271 setEnabled(
false );
00272 }
00273
00274
#include "kiconviewsearchline.moc"