diff options
Diffstat (limited to 'kio/kfile/kurlbar.cpp')
-rw-r--r-- | kio/kfile/kurlbar.cpp | 1036 |
1 files changed, 1036 insertions, 0 deletions
diff --git a/kio/kfile/kurlbar.cpp b/kio/kfile/kurlbar.cpp new file mode 100644 index 000000000..446087522 --- /dev/null +++ b/kio/kfile/kurlbar.cpp @@ -0,0 +1,1036 @@ +/* This file is part of the KDE libraries + Copyright (C) 2001,2002,2003 Carsten Pfeiffer <pfeiffer@kde.org> + + library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation, version 2. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include <unistd.h> + +#include <qapplication.h> +#include <qcheckbox.h> +#include <qdrawutil.h> +#include <qfontmetrics.h> +#include <qlabel.h> +#include <qgrid.h> +#include <qpainter.h> +#include <qpopupmenu.h> +#include <qstyle.h> +#include <qvbox.h> +#include <qwhatsthis.h> + +#include <kaboutdata.h> +#include <kconfig.h> +#include <kdebug.h> +#include <kglobal.h> +#include <kicondialog.h> +#include <kiconloader.h> +#include <kinstance.h> +#include <klineedit.h> +#include <klocale.h> +#include <kmimetype.h> +#include <kprotocolinfo.h> +#include <kstringhandler.h> +#include <kurldrag.h> +#include <kurlrequester.h> + +#include "kurlbar.h" + +/** + * Handles tooltips in the KURLBar + * @internal + */ +class KURLBarToolTip : public QToolTip +{ +public: + KURLBarToolTip( QListBox *view ) : QToolTip( view ), m_view( view ) {} + +protected: + virtual void maybeTip( const QPoint& point ) { + QListBoxItem *item = m_view->itemAt( point ); + if ( item ) { + QString text = static_cast<KURLBarItem*>( item )->toolTip(); + if ( !text.isEmpty() ) + tip( m_view->itemRect( item ), text ); + } + } + +private: + QListBox *m_view; +}; + + +/////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////// + +class KURLBarItem::KURLBarItemPrivate +{ +public: + KURLBarItemPrivate() + { + isPersistent = true; + } + + bool isPersistent; +}; + +KURLBarItem::KURLBarItem( KURLBar *parent, + const KURL& url, bool persistent, const QString& description, + const QString& icon, KIcon::Group group ) + : QListBoxPixmap( KIconLoader::unknown() /*, parent->listBox()*/ ), + m_url( url ), + m_pixmap( 0L ), + m_parent( parent ), + m_appLocal( true ) +{ + init( icon, group, description, persistent ); +} + +KURLBarItem::KURLBarItem( KURLBar *parent, + const KURL& url, const QString& description, + const QString& icon, KIcon::Group group ) + : QListBoxPixmap( KIconLoader::unknown() /*, parent->listBox()*/ ), + m_url( url ), + m_pixmap( 0L ), + m_parent( parent ), + m_appLocal( true ) +{ + init( icon, group, description, true /*persistent*/ ); +} + +void KURLBarItem::init( const QString& icon, KIcon::Group group, + const QString& description, bool persistent ) +{ + d = new KURLBarItemPrivate; + d->isPersistent = persistent; + + setCustomHighlighting( true ); + setIcon( icon, group ); + setDescription( description ); +} + +KURLBarItem::~KURLBarItem() +{ + delete d; +} + +void KURLBarItem::setURL( const KURL& url ) +{ + m_url = url; + if ( m_description.isEmpty() ) + setText( url.fileName() ); +} + +void KURLBarItem::setIcon( const QString& icon, KIcon::Group group ) +{ + m_icon = icon; + m_group = group; + + if ( icon.isEmpty() ) + m_pixmap = KMimeType::pixmapForURL( m_url, 0, group, iconSize() ); + else + m_pixmap = KGlobal::iconLoader()->loadIcon( icon, group, iconSize(), + KIcon::DefaultState ); +} + +void KURLBarItem::setDescription( const QString& desc ) +{ + m_description = desc; + setText( desc.isEmpty() ? m_url.fileName() : desc ); +} + +void KURLBarItem::setApplicationLocal( bool local ) +{ + if ( !local && !isPersistent() ) + { + kdWarning() << "KURLBar: dynamic (non-persistent) items can not be global." << endl; + return; + } + + m_appLocal = local; +} + +void KURLBarItem::setToolTip( const QString& tip ) +{ + m_toolTip = tip; +} + +QString KURLBarItem::toolTip() const +{ + return m_toolTip.isEmpty() ? m_url.prettyURL() : m_toolTip; +} + +int KURLBarItem::iconSize() const +{ + return m_parent->iconSize(); +} + +void KURLBarItem::paint( QPainter *p ) +{ + QListBox *box = listBox(); + int w = width( box ); + static const int margin = KDialog::spacingHint(); + + // draw sunken selection + if ( isCurrent() || isSelected() ) { + int h = height( box ); + + QBrush brush = box->colorGroup().brush( QColorGroup::Highlight ); + p->fillRect( 0, 0, w, h, brush ); + QPen pen = p->pen(); + QPen oldPen = pen; + pen.setColor( box->colorGroup().mid() ); + p->setPen( pen ); + + p->drawPoint( 0, 0 ); + p->drawPoint( 0, h - 1 ); + p->drawPoint( w - 1, 0 ); + p->drawPoint( w - 1, h - 1 ); + + p->setPen( oldPen ); + } + + if ( m_parent->iconSize() < KIcon::SizeMedium ) { + // small icon -> draw icon next to text + + // ### mostly cut & paste of QListBoxPixmap::paint() until Qt 3.1 + // (where it will properly use pixmap() instead of the internal pixmap) + const QPixmap *pm = pixmap(); + int yPos = QMAX( 0, (height(box) - pm->height())/2 ); + + p->drawPixmap( margin, yPos, *pm ); + if ( !text().isEmpty() ) { + QFontMetrics fm = p->fontMetrics(); + if ( pm->height() < fm.height() ) + yPos = fm.ascent() + fm.leading()/2; + else + yPos = pm->height()/2 - fm.height()/2 + fm.ascent(); + + yPos += margin; + int stringWidth = box->width() - pm->width() - 2 - (margin * 2); + QString visibleText = KStringHandler::rPixelSqueeze( text(), fm, stringWidth ); + int xPos = pm->width() + margin + 2; + + if ( isCurrent() || isSelected() ) { + p->setPen( box->colorGroup().highlight().dark(115) ); + p->drawText( xPos + ( QApplication::reverseLayout() ? -1 : 1), + yPos + 1, visibleText ); + p->setPen( box->colorGroup().highlightedText() ); + } + + p->drawText( xPos, yPos, visibleText ); + } + // end cut & paste (modulo pixmap centering) + } + + else { + // big icons -> draw text below icon + int y = margin; + const QPixmap *pm = pixmap(); + + if ( !pm->isNull() ) { + int x = (w - pm->width()) / 2; + x = QMAX( x, margin ); + p->drawPixmap( x, y, *pm ); + } + + if ( !text().isEmpty() ) { + QFontMetrics fm = p->fontMetrics(); + y += pm->height() + fm.height() - fm.descent(); + + int stringWidth = box->width() - (margin * 2); + QString visibleText = KStringHandler::rPixelSqueeze( text(), fm, stringWidth ); + int x = (w - fm.width( visibleText )) / 2; + x = QMAX( x, margin ); + + if ( isCurrent() || isSelected() ) { + p->setPen( box->colorGroup().highlight().dark(115) ); + p->drawText( x + ( QApplication::reverseLayout() ? -1 : 1), + y + 1, visibleText ); + p->setPen( box->colorGroup().highlightedText() ); + } + + p->drawText( x, y, visibleText ); + } + } +} + +QSize KURLBarItem::sizeHint() const +{ + int wmin = 0; + int hmin = 0; + const KURLBarListBox *lb =static_cast<const KURLBarListBox*>(listBox()); + + if ( m_parent->iconSize() < KIcon::SizeMedium ) { + wmin = QListBoxPixmap::width( lb ) + KDialog::spacingHint() * 2; + hmin = QListBoxPixmap::height( lb ) + KDialog::spacingHint() * 2; + } + else { + wmin = QMAX(lb->fontMetrics().width(text()), pixmap()->width()) + KDialog::spacingHint() * 2; + hmin = lb->fontMetrics().lineSpacing() + pixmap()->height() + KDialog::spacingHint() * 2; + } + + if ( lb->isVertical() ) + wmin = QMIN( wmin, lb->viewport()->sizeHint().width() ); + else + hmin = QMIN( hmin, lb->viewport()->sizeHint().height() ); + + return QSize( wmin, hmin ); +} + +int KURLBarItem::width( const QListBox *lb ) const +{ + if ( static_cast<const KURLBarListBox *>( lb )->isVertical() ) + return QMAX( sizeHint().width(), lb->viewport()->width() ); + else + return sizeHint().width(); +} + +int KURLBarItem::height( const QListBox *lb ) const +{ + if ( static_cast<const KURLBarListBox *>( lb )->isVertical() ) + return sizeHint().height(); + else + return QMAX( sizeHint().height(), lb->viewport()->height() ); +} + +bool KURLBarItem::isPersistent() const +{ + return d->isPersistent; +} + +/////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////// + +class KURLBar::KURLBarPrivate +{ +public: + KURLBarPrivate() + { + currentURL.setPath( QDir::homeDirPath() ); + defaultIconSize = 0; + } + + int defaultIconSize; + KURL currentURL; +}; + + +KURLBar::KURLBar( bool useGlobalItems, QWidget *parent, const char *name, WFlags f ) + : QFrame( parent, name, f ), + m_activeItem( 0L ), + m_useGlobal( useGlobalItems ), + m_isModified( false ), + m_isImmutable( false ), + m_listBox( 0L ), + m_iconSize( KIcon::SizeMedium ) +{ + d = new KURLBarPrivate(); + + setListBox( 0L ); + setSizePolicy( QSizePolicy( isVertical() ? + QSizePolicy::Maximum : + QSizePolicy::Preferred, + isVertical() ? + QSizePolicy::Preferred : + QSizePolicy::Maximum )); + QWhatsThis::add(this, i18n("<qt>The <b>Quick Access</b> panel provides easy access to commonly used file locations.<p>" + "Clicking on one of the shortcut entries will take you to that location.<p>" + "By right clicking on an entry you can add, edit and remove shortcuts.</qt>")); +} + +KURLBar::~KURLBar() +{ + delete d; +} + +KURLBarItem * KURLBar::insertItem(const KURL& url, const QString& description, + bool applicationLocal, + const QString& icon, KIcon::Group group ) +{ + KURLBarItem *item = new KURLBarItem(this, url, description, icon, group); + item->setApplicationLocal( applicationLocal ); + m_listBox->insertItem( item ); + return item; +} + +KURLBarItem * KURLBar::insertDynamicItem(const KURL& url, const QString& description, + const QString& icon, KIcon::Group group ) +{ + KURLBarItem *item = new KURLBarItem(this, url, false, description, icon, group); + m_listBox->insertItem( item ); + return item; +} + +void KURLBar::setOrientation( Qt::Orientation orient ) +{ + m_listBox->setOrientation( orient ); + setSizePolicy( QSizePolicy( isVertical() ? + QSizePolicy::Maximum : + QSizePolicy::Preferred, + isVertical() ? + QSizePolicy::Preferred : + QSizePolicy::Maximum )); +} + +Qt::Orientation KURLBar::orientation() const +{ + return m_listBox->orientation(); +} + +void KURLBar::setListBox( KURLBarListBox *view ) +{ + delete m_listBox; + + if ( !view ) { + m_listBox = new KURLBarListBox( this, "urlbar listbox" ); + setOrientation( Vertical ); + } + else { + m_listBox = view; + if ( m_listBox->parentWidget() != this ) + m_listBox->reparent( this, QPoint(0,0) ); + m_listBox->resize( width(), height() ); + } + + m_listBox->setSelectionMode( KListBox::Single ); + paletteChange( palette() ); + m_listBox->setFocusPolicy( TabFocus ); + + connect( m_listBox, SIGNAL( mouseButtonClicked( int, QListBoxItem *, const QPoint & ) ), + SLOT( slotSelected( int, QListBoxItem * ))); + connect( m_listBox, SIGNAL( dropped( QDropEvent * )), + this, SLOT( slotDropped( QDropEvent * ))); + connect( m_listBox, SIGNAL( contextMenuRequested( QListBoxItem *, + const QPoint& )), + SLOT( slotContextMenuRequested( QListBoxItem *, const QPoint& ))); + connect( m_listBox, SIGNAL( returnPressed( QListBoxItem * ) ), + SLOT( slotSelected( QListBoxItem * ) )); +} + +void KURLBar::setIconSize( int size ) +{ + if ( size == m_iconSize ) + return; + + m_iconSize = size; + + // reload the icons with the new size + KURLBarItem *item = static_cast<KURLBarItem*>( m_listBox->firstItem() ); + while ( item ) { + item->setIcon( item->icon(), item->iconGroup() ); + item = static_cast<KURLBarItem*>( item->next() ); + } + + resize( sizeHint() ); + updateGeometry(); +} + +void KURLBar::clear() +{ + m_listBox->clear(); +} + +void KURLBar::resizeEvent( QResizeEvent *e ) +{ + QFrame::resizeEvent( e ); + m_listBox->resize( width(), height() ); +} + +void KURLBar::paletteChange( const QPalette & ) +{ + QPalette pal = palette(); + QColor gray = pal.color( QPalette::Normal, QColorGroup::Background ); + QColor selectedTextColor = pal.color( QPalette::Normal, QColorGroup::BrightText ); + QColor foreground = pal.color( QPalette::Normal, QColorGroup::Foreground ); + pal.setColor( QPalette::Normal, QColorGroup::Base, gray ); + pal.setColor( QPalette::Normal, QColorGroup::HighlightedText, selectedTextColor ); + pal.setColor( QPalette::Normal, QColorGroup::Text, foreground ); + pal.setColor( QPalette::Inactive, QColorGroup::Base, gray ); + pal.setColor( QPalette::Inactive, QColorGroup::HighlightedText, selectedTextColor ); + pal.setColor( QPalette::Inactive, QColorGroup::Text, foreground ); + + setPalette( pal ); +} + +QSize KURLBar::sizeHint() const +{ + return m_listBox->sizeHint(); + +#if 0 + // this code causes vertical and or horizontal scrollbars appearing + // depending on the text, font, moonphase and earth rotation. Just using + // m_listBox->sizeHint() fixes this (although the widget can then be + // resized to a smaller size so that scrollbars appear). + int w = 0; + int h = 0; + KURLBarItem *item; + bool vertical = isVertical(); + + for ( item = static_cast<KURLBarItem*>( m_listBox->firstItem() ); + item; + item = static_cast<KURLBarItem*>( item->next() ) ) { + + QSize sh = item->sizeHint(); + + if ( vertical ) { + w = QMAX( w, sh.width() ); + h += sh.height(); + } + else { + w += sh.width(); + h = QMAX( h, sh.height() ); + } + } + +// if ( vertical && m_listBox->verticalScrollBar()->isVisible() ) +// w += m_listBox->verticalScrollBar()->width(); +// else if ( !vertical && m_listBox->horizontalScrollBar()->isVisible() ) +// h += m_listBox->horizontalScrollBar()->height(); + + if ( w == 0 && h == 0 ) + return QSize( 100, 200 ); + else + return QSize( 6 + w, h ); +#endif +} + +QSize KURLBar::minimumSizeHint() const +{ + QSize s = sizeHint(); // ### + int w = s.width() + m_listBox->verticalScrollBar()->width(); + int h = s.height() + m_listBox->horizontalScrollBar()->height(); + return QSize( w, h ); +} + +void KURLBar::slotSelected( int button, QListBoxItem *item ) +{ + if ( button != Qt::LeftButton ) + return; + + slotSelected( item ); +} + +void KURLBar::slotSelected( QListBoxItem *item ) +{ + if ( item && item != m_activeItem ) + m_activeItem = static_cast<KURLBarItem*>( item ); + + if ( m_activeItem ) { + m_listBox->setCurrentItem( m_activeItem ); + emit activated( m_activeItem->url() ); + } +} + +void KURLBar::setCurrentItem( const KURL& url ) +{ + d->currentURL = url; + + QString u = url.url(-1); + + if ( m_activeItem && m_activeItem->url().url(-1) == u ) + return; + + bool hasURL = false; + QListBoxItem *item = m_listBox->firstItem(); + while ( item ) { + if ( static_cast<KURLBarItem*>( item )->url().url(-1) == u ) { + m_activeItem = static_cast<KURLBarItem*>( item ); + m_listBox->setCurrentItem( item ); + m_listBox->setSelected( item, true ); + hasURL = true; + break; + } + item = item->next(); + } + + if ( !hasURL ) { + m_activeItem = 0L; + m_listBox->clearSelection(); + } +} + +KURLBarItem * KURLBar::currentItem() const +{ + QListBoxItem *item = m_listBox->item( m_listBox->currentItem() ); + if ( item ) + return static_cast<KURLBarItem *>( item ); + return 0L; +} + +KURL KURLBar::currentURL() const +{ + KURLBarItem *item = currentItem(); + return item ? item->url() : KURL(); +} + +void KURLBar::readConfig( KConfig *appConfig, const QString& itemGroup ) +{ + m_isImmutable = appConfig->groupIsImmutable( itemGroup ); + KConfigGroupSaver cs( appConfig, itemGroup ); + d->defaultIconSize = m_iconSize; + m_iconSize = appConfig->readNumEntry( "Speedbar IconSize", m_iconSize ); + + if ( m_useGlobal ) { // read global items + KConfig *globalConfig = KGlobal::config(); + KConfigGroupSaver cs( globalConfig, (QString)(itemGroup +" (Global)")); + int num = globalConfig->readNumEntry( "Number of Entries" ); + for ( int i = 0; i < num; i++ ) { + readItem( i, globalConfig, false ); + } + } + + // read application local items + int num = appConfig->readNumEntry( "Number of Entries" ); + for ( int i = 0; i < num; i++ ) { + readItem( i, appConfig, true ); + } +} + +void KURLBar::readItem( int i, KConfig *config, bool applicationLocal ) +{ + QString number = QString::number( i ); + KURL url = KURL::fromPathOrURL( config->readPathEntry( QString("URL_") + number )); + if ( !url.isValid() || !KProtocolInfo::isKnownProtocol( url )) + return; // nothing we could do. + + insertItem( url, + config->readEntry( QString("Description_") + number ), + applicationLocal, + config->readEntry( QString("Icon_") + number ), + static_cast<KIcon::Group>( + config->readNumEntry( QString("IconGroup_") + number )) ); +} + +void KURLBar::writeConfig( KConfig *config, const QString& itemGroup ) +{ + KConfigGroupSaver cs1( config, itemGroup ); + if(!config->hasDefault("Speedbar IconSize") && m_iconSize == d->defaultIconSize ) + config->revertToDefault("Speedbar IconSize"); + else + config->writeEntry( "Speedbar IconSize", m_iconSize ); + + if ( !m_isModified ) + return; + + int i = 0; + int numLocal = 0; + KURLBarItem *item = static_cast<KURLBarItem*>( m_listBox->firstItem() ); + + while ( item ) + { + if ( item->isPersistent() ) // we only save persistent items + { + if ( item->applicationLocal() ) + { + writeItem( item, numLocal, config, false ); + numLocal++; + } + + i++; + } + item = static_cast<KURLBarItem*>( item->next() ); + } + config->writeEntry("Number of Entries", numLocal); + + + // write the global entries to kdeglobals, if any + bool haveGlobalEntries = (i > numLocal); + if ( m_useGlobal && haveGlobalEntries ) { + config->setGroup( itemGroup + " (Global)" ); + + int numGlobals = 0; + item = static_cast<KURLBarItem*>( m_listBox->firstItem() ); + + while ( item ) + { + if ( item->isPersistent() ) // we only save persistent items + { + if ( !item->applicationLocal() ) + { + writeItem( item, numGlobals, config, true ); + numGlobals++; + } + } + + item = static_cast<KURLBarItem*>( item->next() ); + } + config->writeEntry("Number of Entries", numGlobals, true, true); + } + + m_isModified = false; +} + +void KURLBar::writeItem( KURLBarItem *item, int i, KConfig *config, + bool global ) +{ + if ( !item->isPersistent() ) + return; + + QString Description = "Description_"; + QString URL = "URL_"; + QString Icon = "Icon_"; + QString IconGroup = "IconGroup_"; + + QString number = QString::number( i ); + config->writePathEntry( URL + number, item->url().prettyURL(), true, global ); + + config->writeEntry( Description + number, item->description(),true,global); + config->writeEntry( Icon + number, item->icon(), true, global ); + config->writeEntry( IconGroup + number, item->iconGroup(), true, global ); +} + + +void KURLBar::slotDropped( QDropEvent *e ) +{ + KURL::List urls; + if ( KURLDrag::decode( e, urls ) ) { + KURL url; + QString description; + QString icon; + bool appLocal = false; + + KURL::List::Iterator it = urls.begin(); + for ( ; it != urls.end(); ++it ) { + (void) insertItem( *it, description, appLocal, icon ); + m_isModified = true; + updateGeometry(); + } + } +} + +void KURLBar::slotContextMenuRequested( QListBoxItem *_item, const QPoint& pos ) +{ + if (m_isImmutable) + return; + + KURLBarItem *item = dynamic_cast<KURLBarItem*>( _item ); + + static const int IconSize = 10; + static const int AddItem = 20; + static const int EditItem = 30; + static const int RemoveItem = 40; + + KURL lastURL = m_activeItem ? m_activeItem->url() : KURL(); + + bool smallIcons = m_iconSize < KIcon::SizeMedium; + QPopupMenu *popup = new QPopupMenu(); + popup->insertItem( smallIcons ? + i18n("&Large Icons") : i18n("&Small Icons"), + IconSize ); + popup->insertSeparator(); + + if (item != 0L && item->isPersistent()) + { + popup->insertItem(SmallIconSet("edit"), i18n("&Edit Entry..."), EditItem); + popup->insertSeparator(); + } + + popup->insertItem(SmallIconSet("filenew"), i18n("&Add Entry..."), AddItem); + + if (item != 0L && item->isPersistent()) + { + popup->insertItem( SmallIconSet("editdelete"), i18n("&Remove Entry"), + RemoveItem ); + } + + int result = popup->exec( pos ); + switch ( result ) { + case IconSize: + setIconSize( smallIcons ? KIcon::SizeMedium : KIcon::SizeSmallMedium ); + m_listBox->triggerUpdate( true ); + break; + case AddItem: + addNewItem(); + break; + case EditItem: + editItem( static_cast<KURLBarItem *>( item ) ); + break; + case RemoveItem: + delete item; + m_isModified = true; + break; + default: // abort + break; + } + + // reset current item + m_activeItem = 0L; + setCurrentItem( lastURL ); +} + +bool KURLBar::addNewItem() +{ + KURLBarItem *item = new KURLBarItem( this, d->currentURL, + i18n("Enter a description") ); + if ( editItem( item ) ) { + m_listBox->insertItem( item ); + return true; + } + + delete item; + return false; +} + +bool KURLBar::editItem( KURLBarItem *item ) +{ + if ( !item || !item->isPersistent() ) // should never happen tho + return false; + + KURL url = item->url(); + QString description = item->description(); + QString icon = item->icon(); + bool appLocal = item->applicationLocal(); + + if ( KURLBarItemDialog::getInformation( m_useGlobal, + url, description, + icon, appLocal, + m_iconSize, this )) + { + item->setURL( url ); + item->setDescription( description ); + item->setIcon( icon ); + item->setApplicationLocal( appLocal ); + m_listBox->triggerUpdate( true ); + m_isModified = true; + updateGeometry(); + return true; + } + + return false; +} + +/////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////// + + +KURLBarListBox::KURLBarListBox( QWidget *parent, const char *name ) + : KListBox( parent, name ) +{ + m_toolTip = new KURLBarToolTip( this ); + setAcceptDrops( true ); + viewport()->setAcceptDrops( true ); +} + +KURLBarListBox::~KURLBarListBox() +{ + delete m_toolTip; +} + +void KURLBarListBox::paintEvent( QPaintEvent* ) +{ + QPainter p(this); + p.setPen( colorGroup().mid() ); + p.drawRect( 0, 0, width(), height() ); +} + +QDragObject * KURLBarListBox::dragObject() +{ + KURL::List urls; + KURLBarItem *item = static_cast<KURLBarItem*>( firstItem() ); + + while ( item ) { + if ( item->isSelected() ) + urls.append( item->url() ); + item = static_cast<KURLBarItem*>( item->next() ); + } + + if ( !urls.isEmpty() ) // ### use custom drag-object with description etc.? + return new KURLDrag( urls, this, "urlbar drag" ); + + return 0L; +} + +void KURLBarListBox::contentsDragEnterEvent( QDragEnterEvent *e ) +{ + e->accept( KURLDrag::canDecode( e )); +} + +void KURLBarListBox::contentsDropEvent( QDropEvent *e ) +{ + emit dropped( e ); +} + +void KURLBarListBox::contextMenuEvent( QContextMenuEvent *e ) +{ + if (e) + { + emit contextMenuRequested( itemAt( e->globalPos() ), e->globalPos() ); + e->consume(); // Consume the event to avoid multiple contextMenuEvent calls... + } +} + +void KURLBarListBox::setOrientation( Qt::Orientation orient ) +{ + if ( orient == Vertical ) { + setColumnMode( 1 ); + setRowMode( Variable ); + } + else { + setRowMode( 1 ); + setColumnMode( Variable ); + } + + m_orientation = orient; +} + +/////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////// + + +bool KURLBarItemDialog::getInformation( bool allowGlobal, KURL& url, + QString& description, QString& icon, + bool& appLocal, int iconSize, + QWidget *parent ) +{ + KURLBarItemDialog *dialog = new KURLBarItemDialog( allowGlobal, url, + description, icon, + appLocal, + iconSize, parent ); + if ( dialog->exec() == QDialog::Accepted ) { + // set the return parameters + url = dialog->url(); + description = dialog->description(); + icon = dialog->icon(); + appLocal = dialog->applicationLocal(); + + delete dialog; + return true; + } + + delete dialog; + return false; +} + +KURLBarItemDialog::KURLBarItemDialog( bool allowGlobal, const KURL& url, + const QString& description, + QString icon, bool appLocal, + int iconSize, + QWidget *parent, const char *name ) + : KDialogBase( parent, name, true, + i18n("Edit Quick Access Entry"), Ok | Cancel, Ok, true ) +{ + QVBox *box = new QVBox( this ); + QString text = i18n("<qt><b>Please provide a description, URL and icon for this Quick Access entry.</b></br></qt>"); + QLabel *label = new QLabel( text, box ); + box->setSpacing( spacingHint() ); + + QGrid *grid = new QGrid( 2, box ); + grid->setSpacing( spacingHint() ); + + QString whatsThisText = i18n("<qt>This is the text that will appear in the Quick Access panel.<p>" + "The description should consist of one or two words " + "that will help you remember what this entry refers to.</qt>"); + label = new QLabel( i18n("&Description:"), grid ); + m_edit = new KLineEdit( grid, "description edit" ); + m_edit->setText( description.isEmpty() ? url.fileName() : description ); + label->setBuddy( m_edit ); + QWhatsThis::add( label, whatsThisText ); + QWhatsThis::add( m_edit, whatsThisText ); + + whatsThisText = i18n("<qt>This is the location associated with the entry. Any valid URL may be used. For example:<p>" + "%1<br>http://www.kde.org<br>ftp://ftp.kde.org/pub/kde/stable<p>" + "By clicking on the button next to the text edit box you can browse to an " + "appropriate URL.</qt>").arg(QDir::homeDirPath()); + label = new QLabel( i18n("&URL:"), grid ); + m_urlEdit = new KURLRequester( url.prettyURL(), grid ); + m_urlEdit->setMode( KFile::Directory ); + label->setBuddy( m_urlEdit ); + QWhatsThis::add( label, whatsThisText ); + QWhatsThis::add( m_urlEdit, whatsThisText ); + + whatsThisText = i18n("<qt>This is the icon that will appear in the Quick Access panel.<p>" + "Click on the button to select a different icon.</qt>"); + label = new QLabel( i18n("Choose an &icon:"), grid ); + m_iconButton = new KIconButton( grid, "icon button" ); + m_iconButton->setIconSize( iconSize ); + if ( icon.isEmpty() ) + icon = KMimeType::iconForURL( url ); + m_iconButton->setIcon( icon ); + label->setBuddy( m_iconButton ); + QWhatsThis::add( label, whatsThisText ); + QWhatsThis::add( m_iconButton, whatsThisText ); + + if ( allowGlobal ) { + QString appName; + if ( KGlobal::instance()->aboutData() ) + appName = KGlobal::instance()->aboutData()->programName(); + if ( appName.isEmpty() ) + appName = QString::fromLatin1( KGlobal::instance()->instanceName() ); + m_appLocal = new QCheckBox( i18n("&Only show when using this application (%1)").arg( appName ), box ); + m_appLocal->setChecked( appLocal ); + QWhatsThis::add( m_appLocal, + i18n("<qt>Select this setting if you want this " + "entry to show only when using the current application (%1).<p>" + "If this setting is not selected, the entry will be available in all " + "applications.</qt>") + .arg(appName)); + } + else + m_appLocal = 0L; + connect(m_urlEdit->lineEdit(),SIGNAL(textChanged ( const QString & )),this,SLOT(urlChanged(const QString & ))); + m_edit->setFocus(); + setMainWidget( box ); +} + +KURLBarItemDialog::~KURLBarItemDialog() +{ +} + +void KURLBarItemDialog::urlChanged(const QString & text ) +{ + enableButtonOK( !text.isEmpty() ); +} + +KURL KURLBarItemDialog::url() const +{ + QString text = m_urlEdit->url(); + KURL u; + if ( text.at(0) == '/' ) + u.setPath( text ); + else + u = text; + + return u; +} + +QString KURLBarItemDialog::description() const +{ + return m_edit->text(); +} + +QString KURLBarItemDialog::icon() const +{ + return m_iconButton->icon(); +} + +bool KURLBarItemDialog::applicationLocal() const +{ + if ( !m_appLocal ) + return true; + + return m_appLocal->isChecked(); +} + +void KURLBarItem::virtual_hook( int, void* ) +{ /*BASE::virtual_hook( id, data );*/ } + +void KURLBar::virtual_hook( int, void* ) +{ /*BASE::virtual_hook( id, data );*/ } + +void KURLBarListBox::virtual_hook( int id, void* data ) +{ KListBox::virtual_hook( id, data ); } + + +#include "kurlbar.moc" |