kio
kurlcombobox.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <qdir.h>
00020 #include <qlistbox.h>
00021
00022 #include <kdebug.h>
00023 #include <kglobal.h>
00024 #include <kiconloader.h>
00025 #include <klocale.h>
00026 #include <kmimetype.h>
00027
00028 #include <kurlcombobox.h>
00029
00030 class KURLComboBox::KURLComboBoxPrivate
00031 {
00032 public:
00033 KURLComboBoxPrivate() {
00034 dirpix = SmallIcon(QString::fromLatin1("folder"));
00035 }
00036
00037 QPixmap dirpix;
00038 };
00039
00040
00041 KURLComboBox::KURLComboBox( Mode mode, QWidget *parent, const char *name )
00042 : KComboBox( parent, name )
00043 {
00044 init( mode );
00045 }
00046
00047
00048 KURLComboBox::KURLComboBox( Mode mode, bool rw, QWidget *parent,
00049 const char *name )
00050 : KComboBox( rw, parent, name )
00051 {
00052 init( mode );
00053 }
00054
00055
00056 KURLComboBox::~KURLComboBox()
00057 {
00058 delete d;
00059 }
00060
00061
00062 void KURLComboBox::init( Mode mode )
00063 {
00064 d = new KURLComboBoxPrivate();
00065
00066 myMode = mode;
00067 urlAdded = false;
00068 myMaximum = 10;
00069 itemList.setAutoDelete( true );
00070 defaultList.setAutoDelete( true );
00071 setInsertionPolicy( NoInsertion );
00072 setTrapReturnKey( true );
00073 setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ));
00074
00075 opendirPix = SmallIcon(QString::fromLatin1("folder_open"));
00076
00077 connect( this, SIGNAL( activated( int )), SLOT( slotActivated( int )));
00078 }
00079
00080
00081 QStringList KURLComboBox::urls() const
00082 {
00083 kdDebug(250) << "::urls()" << endl;
00084
00085 QStringList list;
00086 QString url;
00087 for ( int i = defaultList.count(); i < count(); i++ ) {
00088 url = text( i );
00089 if ( !url.isEmpty() ) {
00090
00091
00092
00093 list.append( url );
00094 }
00095 }
00096
00097 return list;
00098 }
00099
00100
00101 void KURLComboBox::addDefaultURL( const KURL& url, const QString& text )
00102 {
00103 addDefaultURL( url, getPixmap( url ), text );
00104 }
00105
00106
00107 void KURLComboBox::addDefaultURL( const KURL& url, const QPixmap& pix,
00108 const QString& text )
00109 {
00110 KURLComboItem *item = new KURLComboItem;
00111 item->url = url;
00112 item->pixmap = pix;
00113 if ( text.isEmpty() )
00114 if ( url.isLocalFile() )
00115 item->text = url.path( myMode );
00116 else
00117 item->text = url.prettyURL( myMode );
00118 else
00119 item->text = text;
00120
00121 defaultList.append( item );
00122 }
00123
00124
00125 void KURLComboBox::setDefaults()
00126 {
00127 clear();
00128 itemMapper.clear();
00129
00130 KURLComboItem *item;
00131 for ( unsigned int id = 0; id < defaultList.count(); id++ ) {
00132 item = defaultList.at( id );
00133 insertURLItem( item );
00134 }
00135 }
00136
00137 void KURLComboBox::setURLs( QStringList urls )
00138 {
00139 setURLs( urls, RemoveBottom );
00140 }
00141
00142 void KURLComboBox::setURLs( QStringList urls, OverLoadResolving remove )
00143 {
00144 setDefaults();
00145 itemList.clear();
00146
00147 if ( urls.isEmpty() )
00148 return;
00149
00150 QStringList::Iterator it = urls.begin();
00151
00152
00153 QString text;
00154 while ( it != urls.end() ) {
00155 while ( urls.contains( *it ) > 1 ) {
00156 it = urls.remove( it );
00157 continue;
00158 }
00159 ++it;
00160 }
00161
00162
00163
00164
00165 int Overload = urls.count() - myMaximum + defaultList.count();
00166 while ( Overload > 0 ) {
00167 urls.remove((remove == RemoveBottom) ? urls.fromLast() : urls.begin());
00168 Overload--;
00169 }
00170
00171 it = urls.begin();
00172
00173 KURLComboItem *item = 0L;
00174 KURL u;
00175
00176 while ( it != urls.end() ) {
00177 if ( (*it).isEmpty() ) {
00178 ++it;
00179 continue;
00180 }
00181 u = KURL::fromPathOrURL( *it );
00182
00183
00184 if (u.isLocalFile() && !QFile::exists(u.path())) {
00185 ++it;
00186 continue;
00187 }
00188
00189 item = new KURLComboItem;
00190 item->url = u;
00191 item->pixmap = getPixmap( u );
00192
00193 if ( u.isLocalFile() )
00194 item->text = u.path( myMode );
00195 else
00196 item->text = *it;
00197
00198 insertURLItem( item );
00199 itemList.append( item );
00200 ++it;
00201 }
00202 }
00203
00204
00205 void KURLComboBox::setURL( const KURL& url )
00206 {
00207 if ( url.isEmpty() )
00208 return;
00209
00210 blockSignals( true );
00211
00212
00213 QMap<int,const KURLComboItem*>::ConstIterator mit = itemMapper.begin();
00214 QString urlToInsert = url.url(-1);
00215 while ( mit != itemMapper.end() ) {
00216 if ( urlToInsert == mit.data()->url.url(-1) ) {
00217 setCurrentItem( mit.key() );
00218
00219 if ( myMode == Directories )
00220 updateItem( mit.data(), mit.key(), opendirPix );
00221
00222 blockSignals( false );
00223 return;
00224 }
00225 ++mit;
00226 }
00227
00228
00229
00230
00231 if ( urlAdded ) {
00232 itemList.removeLast();
00233 urlAdded = false;
00234 }
00235
00236 setDefaults();
00237
00238 QPtrListIterator<KURLComboItem> it( itemList );
00239 for( ; it.current(); ++it )
00240 insertURLItem( it.current() );
00241
00242 KURLComboItem *item = new KURLComboItem;
00243 item->url = url;
00244 item->pixmap = getPixmap( url );
00245 if ( url.isLocalFile() )
00246 item->text = url.path( myMode );
00247 else
00248 item->text = url.prettyURL( myMode );
00249 kdDebug(250) << "setURL: text=" << item->text << endl;
00250
00251 int id = count();
00252 QString text = item->text;
00253
00254 if ( myMode == Directories )
00255 KComboBox::insertItem( opendirPix, text, id );
00256 else
00257 KComboBox::insertItem( item->pixmap, text, id );
00258 itemMapper.insert( id, item );
00259 itemList.append( item );
00260
00261 setCurrentItem( id );
00262 urlAdded = true;
00263 blockSignals( false );
00264 }
00265
00266
00267 void KURLComboBox::slotActivated( int index )
00268 {
00269 const KURLComboItem *item = itemMapper[ index ];
00270
00271 if ( item ) {
00272 setURL( item->url );
00273 emit urlActivated( item->url );
00274 }
00275 }
00276
00277
00278 void KURLComboBox::insertURLItem( const KURLComboItem *item )
00279 {
00280
00281 int id = count();
00282 KComboBox::insertItem( item->pixmap, item->text, id );
00283 itemMapper.insert( id, item );
00284 }
00285
00286
00287 void KURLComboBox::setMaxItems( int max )
00288 {
00289 myMaximum = max;
00290
00291 if ( count() > myMaximum ) {
00292 int oldCurrent = currentItem();
00293
00294 setDefaults();
00295
00296 QPtrListIterator<KURLComboItem> it( itemList );
00297 int Overload = itemList.count() - myMaximum + defaultList.count();
00298 for ( int i = 0; i <= Overload; i++ )
00299 ++it;
00300
00301 for( ; it.current(); ++it )
00302 insertURLItem( it.current() );
00303
00304 if ( count() > 0 ) {
00305 if ( oldCurrent >= count() )
00306 oldCurrent = count() -1;
00307 setCurrentItem( oldCurrent );
00308 }
00309 }
00310 }
00311
00312
00313 void KURLComboBox::removeURL( const KURL& url, bool checkDefaultURLs )
00314 {
00315 QMap<int,const KURLComboItem*>::ConstIterator mit = itemMapper.begin();
00316 while ( mit != itemMapper.end() ) {
00317 if ( url.url(-1) == mit.data()->url.url(-1) ) {
00318 if ( !itemList.remove( mit.data() ) && checkDefaultURLs )
00319 defaultList.remove( mit.data() );
00320 }
00321 ++mit;
00322 }
00323
00324 blockSignals( true );
00325 setDefaults();
00326 QPtrListIterator<KURLComboItem> it( itemList );
00327 while ( it.current() ) {
00328 insertURLItem( *it );
00329 ++it;
00330 }
00331 blockSignals( false );
00332 }
00333
00334
00335 QPixmap KURLComboBox::getPixmap( const KURL& url ) const
00336 {
00337 if ( myMode == Directories )
00338 return d->dirpix;
00339 else
00340 return KMimeType::pixmapForURL( url, 0, KIcon::Small );
00341 }
00342
00343
00344
00345
00346 void KURLComboBox::updateItem( const KURLComboItem *item,
00347 int index, const QPixmap& pixmap )
00348 {
00349
00350
00351 if ( editable() ) {
00352 removeItem( index );
00353 insertItem( pixmap,
00354 item->url.isLocalFile() ? item->url.path( myMode ) :
00355 item->url.prettyURL( myMode ),
00356 index );
00357 }
00358 else
00359 changeItem( pixmap, item->text, index );
00360 }
00361
00362
00363 #include "kurlcombobox.moc"