kurlcombobox.cpp
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         item = new KURLComboItem;
00184         item->url = u;
00185         item->pixmap = getPixmap( u );
00186 
00187         if ( u.isLocalFile() )
00188             item->text = u.path( myMode ); 
00189         else
00190             item->text = *it;
00191 
00192         insertURLItem( item );
00193         itemList.append( item );
00194         ++it;
00195     }
00196 }
00197 
00198 
00199 void KURLComboBox::setURL( const KURL& url )
00200 {
00201     if ( url.isEmpty() )
00202         return;
00203 
00204     blockSignals( true );
00205 
00206     
00207     QMap<int,const KURLComboItem*>::ConstIterator mit = itemMapper.begin();
00208     QString urlToInsert = url.url(-1);
00209     while ( mit != itemMapper.end() ) {
00210         if ( urlToInsert == mit.data()->url.url(-1) ) {
00211             setCurrentItem( mit.key() );
00212 
00213             if ( myMode == Directories )
00214                 updateItem( mit.data(), mit.key(), opendirPix );
00215 
00216             blockSignals( false );
00217             return;
00218         }
00219         ++mit;
00220     }
00221 
00222     
00223 
00224     
00225     if ( urlAdded ) {
00226         itemList.removeLast();
00227         urlAdded = false;
00228     }
00229 
00230     setDefaults();
00231 
00232     QPtrListIterator<KURLComboItem> it( itemList );
00233     for( ; it.current(); ++it )
00234         insertURLItem( it.current() );
00235 
00236     KURLComboItem *item = new KURLComboItem;
00237     item->url = url;
00238     item->pixmap = getPixmap( url );
00239     if ( url.isLocalFile() )
00240         item->text = url.path( myMode );
00241     else
00242         item->text = url.prettyURL( myMode );
00243      kdDebug(250) << "setURL: text=" << item->text << endl;
00244 
00245     int id = count();
00246     QString text =  item->text;
00247 
00248     if ( myMode == Directories )
00249         KComboBox::insertItem( opendirPix, text, id );
00250     else
00251         KComboBox::insertItem( item->pixmap, text, id );
00252     itemMapper.insert( id, item );
00253     itemList.append( item );
00254 
00255     setCurrentItem( id );
00256     urlAdded = true;
00257     blockSignals( false );
00258 }
00259 
00260 
00261 void KURLComboBox::slotActivated( int index )
00262 {
00263     const KURLComboItem *item = itemMapper[ index ];
00264 
00265     if ( item ) {
00266         setURL( item->url );
00267         emit urlActivated( item->url );
00268     }
00269 }
00270 
00271 
00272 void KURLComboBox::insertURLItem( const KURLComboItem *item )
00273 {
00274 
00275     int id = count();
00276     KComboBox::insertItem( item->pixmap, item->text, id );
00277     itemMapper.insert( id, item );
00278 }
00279 
00280 
00281 void KURLComboBox::setMaxItems( int max )
00282 {
00283     myMaximum = max;
00284 
00285     if ( count() > myMaximum ) {
00286         int oldCurrent = currentItem();
00287 
00288         setDefaults();
00289 
00290         QPtrListIterator<KURLComboItem> it( itemList );
00291         int Overload = itemList.count() - myMaximum + defaultList.count();
00292         for ( int i = 0; i <= Overload; i++ )
00293             ++it;
00294 
00295         for( ; it.current(); ++it )
00296             insertURLItem( it.current() );
00297 
00298         if ( count() > 0 ) { 
00299             if ( oldCurrent >= count() )
00300                 oldCurrent = count() -1;
00301             setCurrentItem( oldCurrent );
00302         }
00303     }
00304 }
00305 
00306 
00307 void KURLComboBox::removeURL( const KURL& url, bool checkDefaultURLs )
00308 {
00309     QMap<int,const KURLComboItem*>::ConstIterator mit = itemMapper.begin();
00310     while ( mit != itemMapper.end() ) {
00311         if ( url.url(-1) == mit.data()->url.url(-1) ) {
00312             if ( !itemList.remove( mit.data() ) && checkDefaultURLs )
00313                 defaultList.remove( mit.data() );
00314         }
00315         ++mit;
00316     }
00317 
00318     blockSignals( true );
00319     setDefaults();
00320     QPtrListIterator<KURLComboItem> it( itemList );
00321     while ( it.current() ) {
00322         insertURLItem( *it );
00323         ++it;
00324     }
00325     blockSignals( false );
00326 }
00327 
00328 
00329 QPixmap KURLComboBox::getPixmap( const KURL& url ) const
00330 {
00331     if ( myMode == Directories )
00332         return d->dirpix;
00333     else
00334         return KMimeType::pixmapForURL( url, 0, KIcon::Small );
00335 }
00336 
00337 
00338 
00339 
00340 void KURLComboBox::updateItem( const KURLComboItem *item,
00341                                int index, const QPixmap& pixmap )
00342 {
00343     
00344     
00345     if ( editable() ) {
00346     removeItem( index );
00347     insertItem( pixmap,
00348             item->url.isLocalFile() ? item->url.path( myMode ) :
00349                                       item->url.prettyURL( myMode ),
00350             index );
00351     }
00352     else
00353         changeItem( pixmap, item->text, index );
00354 }
00355 
00356 
00357 #include "kurlcombobox.moc"
 
This file is part of the documentation for kio Library Version 3.2.0.