kio Library API Documentation

kurlbar.cpp

00001 /* This file is part of the KDE libraries
00002     Copyright (C) 2001,2002 Carsten Pfeiffer <pfeiffer@kde.org>
00003 
00004     library is free software; you can redistribute it and/or
00005     modify it under the terms of the GNU Library General Public
00006     License as published by the Free Software Foundation, version 2.
00007 
00008     This library is distributed in the hope that it will be useful,
00009     but WITHOUT ANY WARRANTY; without even the implied warranty of
00010     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011     Library General Public License for more details.
00012 
00013     You should have received a copy of the GNU Library General Public License
00014     along with this library; see the file COPYING.LIB.  If not, write to
00015     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00016     Boston, MA 02111-1307, USA.
00017 */
00018 
00019 #include <unistd.h>
00020 
00021 #include <qcheckbox.h>
00022 #include <qdrawutil.h>
00023 #include <qfontmetrics.h>
00024 #include <qlabel.h>
00025 #include <qgrid.h>
00026 #include <qpainter.h>
00027 #include <qpopupmenu.h>
00028 #include <qvbox.h>
00029 #include <qwhatsthis.h>
00030 
00031 #include <kaboutdata.h>
00032 #include <kconfig.h>
00033 #include <kglobal.h>
00034 #include <kicondialog.h>
00035 #include <kiconloader.h>
00036 #include <kinstance.h>
00037 #include <klineedit.h>
00038 #include <klocale.h>
00039 #include <kmimetype.h>
00040 #include <kprotocolinfo.h>
00041 #include <kurldrag.h>
00042 #include <kurlrequester.h>
00043 
00044 #include "kurlbar.h"
00045 
00050 class KURLBarToolTip : public QToolTip
00051 {
00052 public:
00053     KURLBarToolTip( QListBox *view ) : QToolTip( view ), m_view( view ) {}
00054 
00055 protected:
00056     virtual void maybeTip( const QPoint& point ) {
00057         QListBoxItem *item = m_view->itemAt( point );
00058         if ( item ) {
00059             QString text = static_cast<KURLBarItem*>( item )->toolTip();
00060             if ( !text.isEmpty() )
00061                 tip( m_view->itemRect( item ), text );
00062         }
00063     }
00064 
00065 private:
00066     QListBox *m_view;
00067 };
00068 
00069 
00072 
00073 
00074 KURLBarItem::KURLBarItem( KURLBar *parent,
00075                           const KURL& url, const QString& description,
00076                           const QString& icon, KIcon::Group group )
00077     : QListBoxPixmap( KIconLoader::unknown() /*, parent->listBox()*/ ),
00078       m_url( url ),
00079       m_pixmap( 0L ),
00080       m_parent( parent ),
00081       m_appLocal( true )
00082 {
00083     setCustomHighlighting( true );
00084     setDescription( description );
00085     setIcon( icon, group );
00086 }
00087 
00088 KURLBarItem::~KURLBarItem()
00089 {
00090 }
00091 
00092 void KURLBarItem::setURL( const KURL& url )
00093 {
00094     m_url = url;
00095     if ( m_description.isEmpty() )
00096         setText( url.fileName() );
00097 }
00098 
00099 void KURLBarItem::setIcon( const QString& icon, KIcon::Group group )
00100 {
00101     m_icon  = icon;
00102     m_group = group;
00103 
00104     if ( icon.isEmpty() )
00105         m_pixmap = KMimeType::pixmapForURL( m_url, 0, group, iconSize() );
00106     else
00107         m_pixmap = KGlobal::iconLoader()->loadIcon( icon, group, iconSize(),
00108                                                     KIcon::DefaultState );
00109 }
00110 
00111 void KURLBarItem::setDescription( const QString& desc )
00112 {
00113     m_description = desc;
00114     setText( desc.isEmpty() ? m_url.fileName() : desc );
00115 }
00116 
00117 void KURLBarItem::setToolTip( const QString& tip )
00118 {
00119     m_toolTip = tip;
00120 }
00121 
00122 QString KURLBarItem::toolTip() const
00123 {
00124     return m_toolTip.isEmpty() ? m_url.prettyURL() : m_toolTip;
00125 }
00126 
00127 int KURLBarItem::iconSize() const
00128 {
00129     return m_parent->iconSize();
00130 }
00131 
00132 void KURLBarItem::paint( QPainter *p )
00133 {
00134     QListBox *box = listBox();
00135     int w = width( box );
00136 
00137     if ( m_parent->iconSize() < KIcon::SizeMedium ) {
00138         // small icon -> draw icon next to text
00139 
00140         // ### mostly cut & paste of QListBoxPixmap::paint() until Qt 3.1
00141         // (where it will properly use pixmap() instead of the internal pixmap)
00142         const QPixmap *pm = pixmap();
00143         int yPos = QMAX( 0, (height(box) - pm->height())/2 );
00144 
00145         p->drawPixmap( 3, yPos, *pm );
00146         if ( !text().isEmpty() ) {
00147             QFontMetrics fm = p->fontMetrics();
00148             if ( pm->height() < fm.height() )
00149                 yPos = fm.ascent() + fm.leading()/2;
00150             else
00151                 yPos = pm->height()/2 - fm.height()/2 + fm.ascent();
00152             p->drawText( pm->width() + 5, yPos, text() );
00153         }
00154         // end cut & paste (modulo pixmap centering)
00155     }
00156 
00157     else {
00158         // big icons -> draw text below icon
00159         static const int margin = 3;
00160         int y = margin;
00161         const QPixmap *pm = pixmap();
00162 
00163         if ( !pm->isNull() ) {
00164             int x = (w - pm->width()) / 2;
00165             x = QMAX( x, margin );
00166             p->drawPixmap( x, y, *pm );
00167         }
00168 
00169         if ( !text().isEmpty() ) {
00170             QFontMetrics fm = p->fontMetrics();
00171             y += pm->height() + fm.height() - fm.descent();
00172             int x = (w - fm.width( text() )) / 2;
00173             x = QMAX( x, margin );
00174             p->drawText( x, y, text() );
00175         }
00176     }
00177 
00178     // draw sunken selection
00179     if ( isCurrent() || isSelected() ) {
00180         qDrawShadePanel( p, 1, 0, w -2, height(box),
00181                          box->colorGroup(), true, 1, 0L );
00182     }
00183 }
00184 
00185 QSize KURLBarItem::sizeHint() const
00186 {
00187     int wmin = 0;
00188     int hmin = 0;
00189     const KURLBarListBox *lb =static_cast<const KURLBarListBox*>(listBox());
00190 
00191     if ( m_parent->iconSize() < KIcon::SizeMedium ) {
00192         wmin = QListBoxPixmap::width( lb );
00193         hmin = QListBoxPixmap::height( lb );
00194     }
00195     else {
00196         wmin = QMAX(lb->fontMetrics().width(text()), pixmap()->width()) + 6;
00197         hmin = lb->fontMetrics().lineSpacing() + pixmap()->height() + 6;
00198     }
00199 
00200     if ( lb->isVertical() )
00201         wmin = QMAX( wmin, lb->viewport()->sizeHint().width() );
00202     else
00203         hmin = QMAX( hmin, lb->viewport()->sizeHint().height() );
00204 
00205     return QSize( wmin, hmin );
00206 }
00207 
00208 int KURLBarItem::width( const QListBox *lb ) const
00209 {
00210     if ( static_cast<const KURLBarListBox *>( lb )->isVertical() )
00211         return QMAX( sizeHint().width(), lb->viewport()->width() );
00212     else
00213         return sizeHint().width();
00214 }
00215 
00216 int KURLBarItem::height( const QListBox *lb ) const
00217 {
00218     if ( static_cast<const KURLBarListBox *>( lb )->isVertical() )
00219         return sizeHint().height();
00220     else
00221         return QMAX( sizeHint().height(), lb->viewport()->height() );
00222 }
00223 
00226 
00227 
00228 KURLBar::KURLBar( bool useGlobalItems, QWidget *parent, const char *name, WFlags f )
00229     : QFrame( parent, name, f ),
00230       m_activeItem( 0L ),
00231       m_useGlobal( useGlobalItems ),
00232       m_isModified( false ),
00233       m_listBox( 0L ),
00234       m_iconSize( KIcon::SizeMedium )
00235 {
00236     setListBox( 0L );
00237     setSizePolicy( QSizePolicy( isVertical() ?
00238                                 QSizePolicy::Maximum :
00239                                 QSizePolicy::Preferred,
00240                                 isVertical() ?
00241                                 QSizePolicy::Preferred :
00242                                 QSizePolicy::Maximum ));
00243     QWhatsThis::add(this, i18n("<qt>The <b>Quick Access</b> panel provides easy access to commonly used file locations.<p>"
00244                                "Clicking on one of the shortcut entries will take you to that location.<p>"
00245                                "By right clicking on an entry you can add, edit and remove shortcuts.</qt>"));
00246 }
00247 
00248 KURLBar::~KURLBar()
00249 {
00250 }
00251 
00252 KURLBarItem * KURLBar::insertItem(const KURL& url, const QString& description,
00253                                   bool applicationLocal,
00254                                   const QString& icon, KIcon::Group group )
00255 {
00256     KURLBarItem *item = new KURLBarItem(this, url, description, icon, group);
00257     item->setApplicationLocal( applicationLocal );
00258     m_listBox->insertItem( item );
00259     return item;
00260 }
00261 
00262 void KURLBar::setOrientation( Qt::Orientation orient )
00263 {
00264     m_listBox->setOrientation( orient );
00265     setSizePolicy( QSizePolicy( isVertical() ?
00266                                 QSizePolicy::Maximum :
00267                                 QSizePolicy::Preferred,
00268                                 isVertical() ?
00269                                 QSizePolicy::Preferred :
00270                                 QSizePolicy::Maximum ));
00271 }
00272 
00273 Qt::Orientation KURLBar::orientation() const
00274 {
00275     return m_listBox->orientation();
00276 }
00277 
00278 void KURLBar::setListBox( KURLBarListBox *view )
00279 {
00280     delete m_listBox;
00281 
00282     if ( !view ) {
00283         m_listBox = new KURLBarListBox( this, "urlbar listbox" );
00284         setOrientation( Vertical );
00285     }
00286     else {
00287         m_listBox = view;
00288         if ( m_listBox->parentWidget() != this )
00289             m_listBox->reparent( this, QPoint(0,0) );
00290         m_listBox->resize( width(), height() );
00291     }
00292 
00293     m_listBox->setSelectionMode( KListBox::Single );
00294     QPalette pal = palette();
00295     QColor gray = pal.color( QPalette::Normal, QColorGroup::Mid );
00296     QColor selectedTextColor = pal.color( QPalette::Normal, QColorGroup::BrightText );
00297     pal.setColor( QPalette::Normal,   QColorGroup::Base, gray );
00298     pal.setColor( QPalette::Normal,   QColorGroup::HighlightedText, selectedTextColor );
00299     pal.setColor( QPalette::Inactive, QColorGroup::Base, gray );
00300     pal.setColor( QPalette::Inactive, QColorGroup::HighlightedText, selectedTextColor );
00301 
00302     setPalette( pal );
00303     m_listBox->viewport()->setBackgroundMode( PaletteMid );
00304 
00305     connect( m_listBox, SIGNAL( mouseButtonClicked( int, QListBoxItem *, const QPoint & ) ),
00306              SLOT( slotSelected( int, QListBoxItem * )));
00307     connect( m_listBox, SIGNAL( dropped( QDropEvent * )),
00308              this, SLOT( slotDropped( QDropEvent * )));
00309     connect( m_listBox, SIGNAL( contextMenuRequested( QListBoxItem *,
00310                                                       const QPoint& )),
00311              SLOT( slotContextMenuRequested( QListBoxItem *, const QPoint& )));
00312 }
00313 
00314 void KURLBar::setIconSize( int size )
00315 {
00316     if ( size == m_iconSize )
00317         return;
00318 
00319     m_iconSize = size;
00320 
00321     // reload the icons with the new size
00322     KURLBarItem *item = static_cast<KURLBarItem*>( m_listBox->firstItem() );
00323     while ( item ) {
00324         item->setIcon( item->icon(), item->iconGroup() );
00325         item = static_cast<KURLBarItem*>( item->next() );
00326     }
00327 
00328     resize( sizeHint() );
00329     updateGeometry();
00330 }
00331 
00332 void KURLBar::clear()
00333 {
00334     m_listBox->clear();
00335 }
00336 
00337 void KURLBar::resizeEvent( QResizeEvent *e )
00338 {
00339     QFrame::resizeEvent( e );
00340     m_listBox->resize( width(), height() );
00341 }
00342 
00343 QSize KURLBar::sizeHint() const
00344 {
00345     return m_listBox->sizeHint();
00346 
00347 #if 0
00348     // this code causes vertical and or horizontal scrollbars appearing
00349     // depending on the text, font, moonphase and earth rotation. Just using
00350     // m_listBox->sizeHint() fixes this (although the widget can then be 
00351     // resized to a smaller size so that scrollbars appear).
00352     int w = 0;
00353     int h = 0;
00354     KURLBarItem *item;
00355     bool vertical = isVertical();
00356 
00357     for ( item = static_cast<KURLBarItem*>( m_listBox->firstItem() );
00358           item;
00359           item = static_cast<KURLBarItem*>( item->next() ) ) {
00360 
00361         QSize sh = item->sizeHint();
00362 
00363         if ( vertical ) {
00364             w = QMAX( w, sh.width() );
00365             h += sh.height();
00366         }
00367         else {
00368             w += sh.width();
00369             h = QMAX( h, sh.height() );
00370         }
00371     }
00372 
00373 //     if ( vertical && m_listBox->verticalScrollBar()->isVisible() )
00374 //         w += m_listBox->verticalScrollBar()->width();
00375 //     else if ( !vertical && m_listBox->horizontalScrollBar()->isVisible() )
00376 //         h += m_listBox->horizontalScrollBar()->height();
00377 
00378     if ( w == 0 && h == 0 )
00379         return QSize( 100, 200 );
00380     else
00381         return QSize( 6 + w, h );
00382 #endif
00383 }
00384 
00385 QSize KURLBar::minimumSizeHint() const
00386 {
00387     QSize s = sizeHint(); // ###
00388     int w = s.width()  + m_listBox->verticalScrollBar()->width();
00389     int h = s.height() + m_listBox->horizontalScrollBar()->height();
00390     return QSize( w, h );
00391 }
00392 
00393 void KURLBar::slotSelected( int button, QListBoxItem *item )
00394 {
00395     if ( button != Qt::LeftButton )
00396         return;
00397 
00398     slotSelected( item );
00399 }
00400 
00401 void KURLBar::slotSelected( QListBoxItem *item )
00402 {
00403     if ( item && item != m_activeItem )
00404         m_activeItem = static_cast<KURLBarItem*>( item );
00405 
00406     if ( m_activeItem ) {
00407         m_listBox->setCurrentItem( m_activeItem );
00408         emit activated( m_activeItem->url() );
00409     }
00410 }
00411 
00412 void KURLBar::setCurrentItem( const KURL& url )
00413 {
00414     QString u = url.url(-1);
00415 
00416     if ( m_activeItem && m_activeItem->url().url(-1) == u )
00417         return;
00418 
00419     bool hasURL = false;
00420     QListBoxItem *item = m_listBox->firstItem();
00421     while ( item ) {
00422         if ( static_cast<KURLBarItem*>( item )->url().url(-1) == u ) {
00423             m_activeItem = static_cast<KURLBarItem*>( item );
00424             m_listBox->setCurrentItem( item );
00425             m_listBox->setSelected( item, true );
00426             hasURL = true;
00427             break;
00428         }
00429         item = item->next();
00430     }
00431 
00432     if ( !hasURL ) {
00433         m_activeItem = 0L;
00434         m_listBox->clearSelection();
00435     }
00436 }
00437 
00438 KURLBarItem * KURLBar::currentItem() const
00439 {
00440     QListBoxItem *item = m_listBox->item( m_listBox->currentItem() );
00441     if ( item )
00442         return static_cast<KURLBarItem *>( item );
00443     return 0L;
00444 }
00445 
00446 KURL KURLBar::currentURL() const
00447 {
00448     KURLBarItem *item = currentItem();
00449     return item ? item->url() : KURL();
00450 }
00451 
00452 void KURLBar::readConfig( KConfig *appConfig, const QString& itemGroup )
00453 {
00454     KConfigGroupSaver cs( appConfig, itemGroup );
00455     m_iconSize = appConfig->readNumEntry( "Speedbar IconSize", m_iconSize );
00456 
00457     if ( m_useGlobal ) { // read global items
00458         KConfig *globalConfig = KGlobal::config();
00459         KConfigGroupSaver cs( globalConfig, (QString)(itemGroup +" (Global)"));
00460         int num = globalConfig->readNumEntry( "Number of Entries" );
00461         for ( int i = 0; i < num; i++ ) {
00462             readItem( i, globalConfig, false );
00463         }
00464     }
00465 
00466     // read application local items
00467     int num = appConfig->readNumEntry( "Number of Entries" );
00468     for ( int i = 0; i < num; i++ ) {
00469         readItem( i, appConfig, true );
00470     }
00471 }
00472 
00473 void KURLBar::readItem( int i, KConfig *config, bool applicationLocal )
00474 {
00475     QString number = QString::number( i );
00476 
00477     const KURL& url = config->readEntry( QString("URL_") + number );
00478     if ( url.isMalformed() || !KProtocolInfo::isKnownProtocol( url ))
00479         return; // nothing we could do.
00480 
00481     insertItem( url,
00482                 config->readEntry( QString("Description_") + number ),
00483                 applicationLocal,
00484                 config->readEntry( QString("Icon_") + number ),
00485                 static_cast<KIcon::Group>(
00486                     config->readNumEntry( QString("IconGroup_") + number )) );
00487 }
00488 
00489 void KURLBar::writeConfig( KConfig *config, const QString& itemGroup )
00490 {
00491     KConfigGroupSaver cs1( config, itemGroup );
00492     config->writeEntry( "Speedbar IconSize", m_iconSize );
00493 
00494     if ( !m_isModified )
00495         return;
00496 
00497     int i = 0;
00498     int numLocal = 0;
00499     KURLBarItem *item = static_cast<KURLBarItem*>( m_listBox->firstItem() );
00500 
00501     while ( item ) {
00502         if ( item->applicationLocal() ) {
00503             writeItem( item, numLocal, config, false );
00504             numLocal++;
00505         }
00506 
00507         i++;
00508         item = static_cast<KURLBarItem*>( item->next() );
00509     }
00510     config->writeEntry("Number of Entries", numLocal);
00511 
00512 
00513     // write the global entries to kdeglobals, if any
00514     bool haveGlobalEntries = (i > numLocal);
00515     if ( m_useGlobal && haveGlobalEntries ) {
00516         config->setGroup( itemGroup + " (Global)" );
00517 
00518         int numGlobals = 0;
00519         item = static_cast<KURLBarItem*>( m_listBox->firstItem() );
00520 
00521         while ( item ) {
00522             if ( !item->applicationLocal() ) {
00523                 writeItem( item, numGlobals, config, true );
00524                 numGlobals++;
00525             }
00526 
00527             item = static_cast<KURLBarItem*>( item->next() );
00528         }
00529         config->writeEntry("Number of Entries", numGlobals, true, true);
00530     }
00531 
00532     m_isModified = false;
00533 }
00534 
00535 void KURLBar::writeItem( KURLBarItem *item, int i, KConfig *config,
00536                          bool global )
00537 {
00538     QString Description = "Description_";
00539     QString URL = "URL_";
00540     QString Icon = "Icon_";
00541     QString IconGroup = "IconGroup_";
00542 
00543     QString number = QString::number( i );
00544     config->writeEntry( URL + number, item->url().prettyURL(), true, global );
00545     config->writeEntry( Description + number, item->description(),true,global);
00546     config->writeEntry( Icon + number, item->icon(), true, global );
00547     config->writeEntry( IconGroup + number, item->iconGroup(), true, global );
00548 }
00549 
00550 
00551 void KURLBar::slotDropped( QDropEvent *e )
00552 {
00553     KURL::List urls;
00554     if ( KURLDrag::decode( e, urls ) ) {
00555         KURL url;
00556         QString description;
00557         QString icon;
00558         bool appLocal = false;
00559 
00560         KURL::List::Iterator it = urls.begin();
00561         for ( ; it != urls.end(); ++it ) {
00562             url = *it;
00563             if ( KURLBarItemDialog::getInformation( m_useGlobal,
00564                                                     url, description, icon,
00565                                                     appLocal, m_iconSize,
00566                                                     this ) ) {
00567                 (void) insertItem( url, description, appLocal, icon );
00568                 m_isModified = true;
00569                 updateGeometry();
00570             }
00571         }
00572     }
00573 }
00574 
00575 void KURLBar::slotContextMenuRequested( QListBoxItem *item, const QPoint& pos )
00576 {
00577     static const int IconSize   = 10;
00578     static const int AddItem    = 20;
00579     static const int EditItem   = 30;
00580     static const int RemoveItem = 40;
00581 
00582     KURL lastURL = m_activeItem ? m_activeItem->url() : KURL();
00583 
00584     bool smallIcons = m_iconSize < KIcon::SizeMedium;
00585     QPopupMenu *popup = new QPopupMenu();
00586     popup->insertItem( smallIcons ?
00587                        i18n("&Large Icons") : i18n("&Small Icons"),
00588                        IconSize );
00589     popup->insertSeparator();
00590     popup->insertItem(SmallIcon("filenew"), i18n("&Add Entry..."), AddItem);
00591     popup->insertItem(SmallIcon("edit"), i18n("&Edit Entry..."), EditItem);
00592     popup->insertSeparator();
00593     popup->insertItem( SmallIcon("editdelete"), i18n("&Remove Entry"),
00594                        RemoveItem );
00595 
00596     popup->setItemEnabled( EditItem, item != 0L );
00597     popup->setItemEnabled( RemoveItem, item != 0L );
00598 
00599     int result = popup->exec( pos );
00600     switch ( result ) {
00601         case IconSize:
00602             setIconSize( smallIcons ? KIcon::SizeMedium : KIcon::SizeSmall );
00603             m_listBox->triggerUpdate( true );
00604             break;
00605         case AddItem:
00606             addNewItem();
00607             break;
00608         case EditItem:
00609             editItem( static_cast<KURLBarItem *>( item ) );
00610             break;
00611         case RemoveItem:
00612             delete item;
00613             m_isModified = true;
00614             break;
00615         default: // abort
00616             break;
00617     }
00618 
00619     // reset current item
00620     m_activeItem = 0L;
00621     setCurrentItem( lastURL );
00622 }
00623 
00624 bool KURLBar::addNewItem()
00625 {
00626     KURL url;
00627     url.setPath( QDir::homeDirPath() );
00628     KURLBarItem *item = new KURLBarItem( this, url,
00629                                          i18n("Enter a description") );
00630     if ( editItem( item ) ) {
00631         m_listBox->insertItem( item );
00632         return true;
00633     }
00634 
00635     delete item;
00636     return false;
00637 }
00638 
00639 bool KURLBar::editItem( KURLBarItem *item )
00640 {
00641     KURL url            = item->url();
00642     QString description = item->description();
00643     QString icon        = item->icon();
00644     bool appLocal       = item->applicationLocal();
00645 
00646     if ( KURLBarItemDialog::getInformation( m_useGlobal,
00647                                             url, description,
00648                                             icon, appLocal,
00649                                             m_iconSize, this ))
00650     {
00651         item->setURL( url );
00652         item->setDescription( description );
00653         item->setIcon( icon );
00654         item->setApplicationLocal( appLocal );
00655         m_listBox->triggerUpdate( true );
00656         m_isModified = true;
00657         updateGeometry();
00658         return true;
00659     }
00660 
00661     return false;
00662 }
00663 
00666 
00667 
00668 KURLBarListBox::KURLBarListBox( QWidget *parent, const char *name )
00669     : KListBox( parent, name )
00670 {
00671     m_toolTip = new KURLBarToolTip( this );
00672     setAcceptDrops( true );
00673     viewport()->setAcceptDrops( true );
00674 }
00675 
00676 KURLBarListBox::~KURLBarListBox()
00677 {
00678     delete m_toolTip;
00679 }
00680 
00681 QDragObject * KURLBarListBox::dragObject()
00682 {
00683     KURL::List urls;
00684     KURLBarItem *item = static_cast<KURLBarItem*>( firstItem() );
00685 
00686     while ( item ) {
00687         if ( item->isSelected() )
00688             urls.append( item->url() );
00689         item = static_cast<KURLBarItem*>( item->next() );
00690     }
00691 
00692     if ( !urls.isEmpty() ) // ### use custom drag-object with description etc.?
00693         return KURLDrag::newDrag( urls, this, "urlbar drag" );
00694 
00695     return 0L;
00696 }
00697 
00698 void KURLBarListBox::contentsDragEnterEvent( QDragEnterEvent *e )
00699 {
00700     e->accept( KURLDrag::canDecode( e ));
00701 }
00702 
00703 void KURLBarListBox::contentsDropEvent( QDropEvent *e )
00704 {
00705     emit dropped( e );
00706 }
00707 
00708 void KURLBarListBox::setOrientation( Qt::Orientation orient )
00709 {
00710     if ( orient == Vertical ) {
00711         setColumnMode( 1 );
00712         setRowMode( Variable );
00713     }
00714     else {
00715         setRowMode( 1 );
00716         setColumnMode( Variable );
00717     }
00718 
00719     m_orientation = orient;
00720 }
00721 
00724 
00725 
00726 bool KURLBarItemDialog::getInformation( bool allowGlobal, KURL& url,
00727                                         QString& description, QString& icon,
00728                                         bool& appLocal, int iconSize,
00729                                         QWidget *parent )
00730 {
00731     KURLBarItemDialog *dialog = new KURLBarItemDialog( allowGlobal, url,
00732                                                        description, icon,
00733                                                        appLocal,
00734                                                        iconSize, parent );
00735     if ( dialog->exec() == QDialog::Accepted ) {
00736         // set the return parameters
00737         url         = dialog->url();
00738         description = dialog->description();
00739         icon        = dialog->icon();
00740         appLocal    = dialog->applicationLocal();
00741 
00742         delete dialog;
00743         return true;
00744     }
00745 
00746     delete dialog;
00747     return false;
00748 }
00749 
00750 KURLBarItemDialog::KURLBarItemDialog( bool allowGlobal, const KURL& url,
00751                                       const QString& description,
00752                                       QString icon, bool appLocal,
00753                                       int iconSize,
00754                                       QWidget *parent, const char *name )
00755     : KDialogBase( parent, name, true,
00756                    i18n("Edit Quick Access Entry"), Ok | Cancel, Ok, true )
00757 {
00758     QVBox *box = new QVBox( this );
00759     QString text = i18n("<qt><b>Please provide a description, URL and icon for this Quick Access entry.</b></br></qt>");
00760     QLabel *label = new QLabel( text, box );
00761     box->setSpacing( spacingHint() );
00762 
00763     QGrid *grid = new QGrid( 2, box );
00764     grid->setSpacing( spacingHint() );
00765 
00766     QString whatsThisText = i18n("<qt>This is the text that will appear in the Quick Access panel.<p>"
00767                                  "The description should consist of one or two words "
00768                                  "that will help you remember what this entry refers to.</qt>");
00769     label = new QLabel( i18n("&Description:"), grid );
00770     m_edit = new KLineEdit( grid, "description edit" );
00771     m_edit->setText( description.isEmpty() ? url.fileName() : description );
00772     label->setBuddy( m_edit );
00773     QWhatsThis::add( label, whatsThisText );
00774     QWhatsThis::add( m_edit, whatsThisText );
00775 
00776     whatsThisText = i18n("<qt>This is the location associated with the entry. Any valid URL may be used. For example:<p>"
00777                          "%1<br>http://www.kde.org<br>ftp://ftp.kde.org/pub/kde/stable<p>"
00778                          "By clicking on the button next to the text edit box you can browse to an "
00779                          "appropriate URL.</qt>").arg(QDir::homeDirPath());
00780     label = new QLabel( i18n("&URL:"), grid );
00781     m_urlEdit = new KURLRequester( url.prettyURL(), grid );
00782     m_urlEdit->setMode( KFile::Directory );
00783     label->setBuddy( m_urlEdit );
00784     QWhatsThis::add( label, whatsThisText );
00785     QWhatsThis::add( m_urlEdit, whatsThisText );
00786 
00787     whatsThisText = i18n("<qt>This is the icon that will appear in the Quick Access panel.<p>"
00788                          "Click on the button to select a different icon.</qt>");
00789     label = new QLabel( i18n("Choose an &icon:"), grid );
00790     m_iconButton = new KIconButton( grid, "icon button" );
00791     m_iconButton->setIconSize( iconSize );
00792     m_iconButton->setStrictIconSize( true );
00793     if ( icon.isEmpty() )
00794         icon = KMimeType::iconForURL( url );
00795     m_iconButton->setIcon( icon );
00796     label->setBuddy( m_iconButton );
00797     QWhatsThis::add( label, whatsThisText );
00798     QWhatsThis::add( m_iconButton, whatsThisText );
00799 
00800     if ( allowGlobal ) {
00801         QString appName;
00802         if ( KGlobal::instance()->aboutData() )
00803             appName = KGlobal::instance()->aboutData()->programName();
00804         if ( appName.isEmpty() )
00805             appName = QString::fromLatin1( KGlobal::instance()->instanceName() );
00806         m_appLocal = new QCheckBox( i18n("&Only show when using this application (%1)").arg( appName ), box );
00807         m_appLocal->setChecked( appLocal );
00808         QWhatsThis::add( m_appLocal,
00809                          i18n("<qt>Select this setting if you want this "
00810                               "entry to show only when using the current application (%1).<p>"
00811                               "If this setting is not selected, the entry will be available in all "
00812                               "applications.</qt>")
00813                               .arg(appName));
00814     }
00815     else
00816         m_appLocal = 0L;
00817     connect(m_urlEdit->lineEdit(),SIGNAL(textChanged ( const QString & )),this,SLOT(urlChanged(const QString & )));
00818     m_edit->setFocus();
00819     setMainWidget( box );
00820 }
00821 
00822 KURLBarItemDialog::~KURLBarItemDialog()
00823 {
00824 }
00825 
00826 void KURLBarItemDialog::urlChanged(const QString & text )
00827 {
00828     enableButtonOK( !text.isEmpty() );
00829 }
00830 
00831 KURL KURLBarItemDialog::url() const
00832 {
00833     QString text = m_urlEdit->url();
00834     KURL u;
00835     if ( text.at(0) == '/' )
00836         u.setPath( text );
00837     else
00838         u = text;
00839 
00840     return u;
00841 }
00842 
00843 QString KURLBarItemDialog::description() const
00844 {
00845     return m_edit->text();
00846 }
00847 
00848 QString KURLBarItemDialog::icon() const
00849 {
00850     return m_iconButton->icon();
00851 }
00852 
00853 bool KURLBarItemDialog::applicationLocal() const
00854 {
00855     if ( !m_appLocal )
00856         return true;
00857 
00858     return m_appLocal->isChecked();
00859 }
00860 
00861 void KURLBarItem::virtual_hook( int, void* )
00862 { /*BASE::virtual_hook( id, data );*/ }
00863 
00864 void KURLBar::virtual_hook( int, void* )
00865 { /*BASE::virtual_hook( id, data );*/ }
00866 
00867 void KURLBarListBox::virtual_hook( int id, void* data )
00868 { KListBox::virtual_hook( id, data ); }
00869 
00870 
00871 #include "kurlbar.moc"
KDE Logo
This file is part of the documentation for kdelibs Version 3.1.0.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Wed Oct 8 12:21:32 2003 by doxygen 1.2.18 written by Dimitri van Heesch, © 1997-2001