00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <unistd.h>
00020
00021 #include <tqapplication.h>
00022 #include <tqcheckbox.h>
00023 #include <tqdrawutil.h>
00024 #include <tqfontmetrics.h>
00025 #include <tqlabel.h>
00026 #include <tqgrid.h>
00027 #include <tqpainter.h>
00028 #include <tqpopupmenu.h>
00029 #include <tqstyle.h>
00030 #include <tqvbox.h>
00031 #include <tqwhatsthis.h>
00032
00033 #include <tdeaboutdata.h>
00034 #include <tdeconfig.h>
00035 #include <kdebug.h>
00036 #include <tdeglobal.h>
00037 #include <kicondialog.h>
00038 #include <kiconloader.h>
00039 #include <kinstance.h>
00040 #include <klineedit.h>
00041 #include <tdelocale.h>
00042 #include <kmimetype.h>
00043 #include <kprotocolinfo.h>
00044 #include <kstringhandler.h>
00045 #include <kurldrag.h>
00046 #include <kurlrequester.h>
00047 #include <tdeio/global.h>
00048 #include <tdeio/netaccess.h>
00049
00050 #include "kurlbar.h"
00051
00056 class KURLBarToolTip : public TQToolTip
00057 {
00058 public:
00059 KURLBarToolTip( TQListBox *view ) : TQToolTip( view ), m_view( view ) {}
00060
00061 protected:
00062 virtual void maybeTip( const TQPoint& point ) {
00063 TQListBoxItem *item = m_view->itemAt( point );
00064 if ( item ) {
00065 TQString text = static_cast<KURLBarItem*>( item )->toolTip();
00066 if ( !text.isEmpty() )
00067 tip( m_view->itemRect( item ), text );
00068 }
00069 }
00070
00071 private:
00072 TQListBox *m_view;
00073 };
00074
00075
00078
00079 class KURLBarItem::KURLBarItemPrivate
00080 {
00081 public:
00082 KURLBarItemPrivate()
00083 {
00084 isPersistent = true;
00085 }
00086
00087 bool isPersistent;
00088 };
00089
00090 KURLBarItem::KURLBarItem( KURLBar *parent,
00091 const KURL& url, bool persistent, const TQString& description,
00092 const TQString& icon, TDEIcon::Group group )
00093 : TQListBoxPixmap( TDEIconLoader::unknown() ),
00094 m_url( url ),
00095 m_pixmap( 0L ),
00096 m_parent( parent ),
00097 m_appLocal( false )
00098 {
00099 init( icon, group, description, persistent );
00100 }
00101
00102 KURLBarItem::KURLBarItem( KURLBar *parent,
00103 const KURL& url, const TQString& description,
00104 const TQString& icon, TDEIcon::Group group )
00105 : TQListBoxPixmap( TDEIconLoader::unknown() ),
00106 m_url( url ),
00107 m_pixmap( 0L ),
00108 m_parent( parent ),
00109 m_appLocal( false )
00110 {
00111 init( icon, group, description, true );
00112 }
00113
00114 void KURLBarItem::init( const TQString& icon, TDEIcon::Group group,
00115 const TQString& description, bool persistent )
00116 {
00117 d = new KURLBarItemPrivate;
00118 d->isPersistent = persistent;
00119
00120 setCustomHighlighting( true );
00121 setIcon( icon, group );
00122 setDescription( description );
00123 }
00124
00125 KURLBarItem::~KURLBarItem()
00126 {
00127 delete d;
00128 }
00129
00130 void KURLBarItem::setURL( const KURL& url )
00131 {
00132 m_url = url;
00133 if ( m_description.isEmpty() )
00134 setText( url.fileName() );
00135 }
00136
00137 void KURLBarItem::setIcon( const TQString& icon, TDEIcon::Group group )
00138 {
00139 m_icon = icon;
00140 m_group = group;
00141
00142 if ( icon.isEmpty() )
00143 m_pixmap = KMimeType::pixmapForURL( m_url, 0, group, iconSize() );
00144 else
00145 m_pixmap = TDEGlobal::iconLoader()->loadIcon( icon, group, iconSize(),
00146 TDEIcon::DefaultState );
00147 }
00148
00149 void KURLBarItem::setDescription( const TQString& desc )
00150 {
00151 m_description = desc;
00152 setText( desc.isEmpty() ? m_url.fileName() : desc );
00153 }
00154
00155 void KURLBarItem::setApplicationLocal( bool local )
00156 {
00157 if ( !local && !isPersistent() )
00158 {
00159 kdWarning() << "KURLBar: dynamic (non-persistent) items can not be global." << endl;
00160 return;
00161 }
00162
00163 m_appLocal = local;
00164 }
00165
00166 void KURLBarItem::setToolTip( const TQString& tip )
00167 {
00168 m_toolTip = tip;
00169 }
00170
00171 TQString KURLBarItem::toolTip() const
00172 {
00173 return m_toolTip.isEmpty() ? m_url.prettyURL() : m_toolTip;
00174 }
00175
00176 int KURLBarItem::iconSize() const
00177 {
00178 return m_parent->iconSize();
00179 }
00180
00181 void KURLBarItem::paint( TQPainter *p )
00182 {
00183 TQListBox *box = listBox();
00184 int w = width( box );
00185 static const int margin = KDialog::spacingHint();
00186
00187
00188 if ( isCurrent() || isSelected() ) {
00189 int h = height( box );
00190
00191 TQBrush brush = box->colorGroup().brush( TQColorGroup::Highlight );
00192 p->fillRect( 0, 0, w, h, brush );
00193 TQPen pen = p->pen();
00194 TQPen oldPen = pen;
00195 pen.setColor( box->colorGroup().mid() );
00196 p->setPen( pen );
00197
00198 p->drawPoint( 0, 0 );
00199 p->drawPoint( 0, h - 1 );
00200 p->drawPoint( w - 1, 0 );
00201 p->drawPoint( w - 1, h - 1 );
00202
00203 p->setPen( oldPen );
00204 }
00205
00206 if ( m_parent->iconSize() < TDEIcon::SizeMedium ) {
00207
00208
00209
00210
00211 const TQPixmap *pm = pixmap();
00212 int yPos = TQMAX( 0, (height(box) - pm->height())/2 );
00213
00214 p->drawPixmap( margin, yPos, *pm );
00215 if ( !text().isEmpty() ) {
00216 TQFontMetrics fm = p->fontMetrics();
00217 if ( pm->height() < fm.height() ) {
00218 yPos = fm.ascent() + fm.leading()/2;
00219 }
00220 else {
00221 yPos = height(box)/2 - fm.height()/2 + fm.ascent() - margin;
00222 }
00223
00224 yPos += margin;
00225 int stringWidth = box->width() - pm->width() - 2 - (margin * 2);
00226 TQString visibleText = KStringHandler::rPixelSqueeze( text(), fm, stringWidth );
00227 int xPos = pm->width() + margin + 2;
00228
00229 if ( isCurrent() || isSelected() ) {
00230 p->setPen( box->colorGroup().highlight().dark(115) );
00231 p->drawText( xPos + ( TQApplication::reverseLayout() ? -1 : 1),
00232 yPos + 1, visibleText );
00233 p->setPen( box->colorGroup().highlightedText() );
00234 }
00235
00236 p->drawText( xPos, yPos, visibleText );
00237 }
00238
00239 }
00240
00241 else {
00242
00243 int y = margin;
00244 const TQPixmap *pm = pixmap();
00245
00246 if ( !pm->isNull() ) {
00247 int x = (w - pm->width()) / 2;
00248 x = TQMAX( x, margin );
00249 p->drawPixmap( x, y, *pm );
00250 }
00251
00252 if ( !text().isEmpty() ) {
00253 TQFontMetrics fm = p->fontMetrics();
00254 y += pm->height() + fm.height() - fm.descent();
00255
00256 int stringWidth = box->width() - (margin * 2);
00257 TQString visibleText = KStringHandler::rPixelSqueeze( text(), fm, stringWidth );
00258 int x = (w - fm.width( visibleText )) / 2;
00259 x = TQMAX( x, margin );
00260
00261 if ( isCurrent() || isSelected() ) {
00262 p->setPen( box->colorGroup().highlight().dark(115) );
00263 p->drawText( x + ( TQApplication::reverseLayout() ? -1 : 1),
00264 y + 1, visibleText );
00265 p->setPen( box->colorGroup().highlightedText() );
00266 }
00267
00268 p->drawText( x, y, visibleText );
00269 }
00270 }
00271 }
00272
00273 TQSize KURLBarItem::sizeHint() const
00274 {
00275 int wmin = 0;
00276 int hmin = 0;
00277 const KURLBarListBox *lb =static_cast<const KURLBarListBox*>(listBox());
00278
00279 if ( m_parent->iconSize() < TDEIcon::SizeMedium ) {
00280 wmin = TQListBoxPixmap::width( lb ) + KDialog::spacingHint() * 2;
00281 hmin = TQListBoxPixmap::height( lb ) + KDialog::spacingHint() * 2;
00282 }
00283 else {
00284 wmin = TQMAX(lb->fontMetrics().width(text()), pixmap()->width()) + KDialog::spacingHint() * 2;
00285 hmin = lb->fontMetrics().lineSpacing() + pixmap()->height() + KDialog::spacingHint() * 2;
00286 }
00287
00288 if ( lb->isVertical() )
00289 wmin = TQMIN( wmin, lb->viewport()->sizeHint().width() );
00290 else
00291 hmin = TQMIN( hmin, lb->viewport()->sizeHint().height() );
00292
00293 return TQSize( wmin, hmin );
00294 }
00295
00296 int KURLBarItem::width( const TQListBox *lb ) const
00297 {
00298 if ( static_cast<const KURLBarListBox *>( lb )->isVertical() )
00299 return TQMAX( sizeHint().width(), lb->viewport()->width() );
00300 else
00301 return sizeHint().width();
00302 }
00303
00304 int KURLBarItem::height( const TQListBox *lb ) const
00305 {
00306 if ( static_cast<const KURLBarListBox *>( lb )->isVertical() )
00307 return sizeHint().height();
00308 else
00309 return TQMAX( sizeHint().height(), lb->viewport()->height() );
00310 }
00311
00312 bool KURLBarItem::isPersistent() const
00313 {
00314 return d->isPersistent;
00315 }
00316
00319
00320 class KURLBar::KURLBarPrivate
00321 {
00322 public:
00323 KURLBarPrivate()
00324 {
00325 currentURL.setPath( TQDir::homeDirPath() );
00326 defaultIconSize = 0;
00327 }
00328
00329 int defaultIconSize;
00330 KURL currentURL;
00331 };
00332
00333
00334 KURLBar::KURLBar( bool useGlobalItems, TQWidget *parent, const char *name, WFlags f )
00335 : TQFrame( parent, name, f ),
00336 m_activeItem( 0L ),
00337 m_useGlobal( useGlobalItems ),
00338 m_isModified( false ),
00339 m_isImmutable( false ),
00340 m_listBox( 0L ),
00341 m_iconSize( TDEIcon::SizeMedium )
00342 {
00343 d = new KURLBarPrivate();
00344
00345 setListBox( 0L );
00346 setSizePolicy( TQSizePolicy( isVertical() ?
00347 TQSizePolicy::Maximum :
00348 TQSizePolicy::Preferred,
00349 isVertical() ?
00350 TQSizePolicy::Preferred :
00351 TQSizePolicy::Maximum ));
00352 TQWhatsThis::add(this, i18n("<qt>The <b>Quick Access</b> panel provides easy access to commonly used file locations.<p>"
00353 "Clicking on one of the shortcut entries will take you to that location.<p>"
00354 "By right clicking on an entry you can add, edit and remove shortcuts.</qt>"));
00355 }
00356
00357 KURLBar::~KURLBar()
00358 {
00359 delete d;
00360 }
00361
00362 KURLBarItem * KURLBar::insertItem(const KURL& url, const TQString& description,
00363 bool applicationLocal,
00364 const TQString& icon, TDEIcon::Group group )
00365 {
00366 KURLBarItem *item = new KURLBarItem(this, url, description, icon, group);
00367 item->setApplicationLocal( applicationLocal );
00368 m_listBox->insertItem( item );
00369 return item;
00370 }
00371
00372 KURLBarItem * KURLBar::insertDynamicItem(const KURL& url, const TQString& description,
00373 const TQString& icon, TDEIcon::Group group )
00374 {
00375 KURLBarItem *item = new KURLBarItem(this, url, false, description, icon, group);
00376 m_listBox->insertItem( item );
00377 return item;
00378 }
00379
00380 void KURLBar::setOrientation( Qt::Orientation orient )
00381 {
00382 m_listBox->setOrientation( orient );
00383 setSizePolicy( TQSizePolicy( isVertical() ?
00384 TQSizePolicy::Maximum :
00385 TQSizePolicy::Preferred,
00386 isVertical() ?
00387 TQSizePolicy::Preferred :
00388 TQSizePolicy::Maximum ));
00389 }
00390
00391 Qt::Orientation KURLBar::orientation() const
00392 {
00393 return m_listBox->orientation();
00394 }
00395
00396 void KURLBar::setListBox( KURLBarListBox *view )
00397 {
00398 delete m_listBox;
00399
00400 if ( !view ) {
00401 m_listBox = new KURLBarListBox( this, "urlbar listbox" );
00402 setOrientation( Qt::Vertical );
00403 }
00404 else {
00405 m_listBox = view;
00406 if ( m_listBox->parentWidget() != this )
00407 m_listBox->reparent( this, TQPoint(0,0) );
00408 m_listBox->resize( width(), height() );
00409 }
00410
00411 m_listBox->setSelectionMode( TDEListBox::Single );
00412 paletteChange( palette() );
00413 m_listBox->setFocusPolicy( TQ_TabFocus );
00414
00415 connect( m_listBox, TQT_SIGNAL( mouseButtonClicked( int, TQListBoxItem *, const TQPoint & ) ),
00416 TQT_SLOT( slotSelected( int, TQListBoxItem * )));
00417 connect( m_listBox, TQT_SIGNAL( dropped( TQDropEvent * )),
00418 this, TQT_SLOT( slotDropped( TQDropEvent * )));
00419 connect( m_listBox, TQT_SIGNAL( contextMenuRequested( TQListBoxItem *,
00420 const TQPoint& )),
00421 TQT_SLOT( slotContextMenuRequested( TQListBoxItem *, const TQPoint& )));
00422 connect( m_listBox, TQT_SIGNAL( returnPressed( TQListBoxItem * ) ),
00423 TQT_SLOT( slotSelected( TQListBoxItem * ) ));
00424 }
00425
00426 void KURLBar::setIconSize( int size )
00427 {
00428 if ( size == m_iconSize )
00429 return;
00430
00431 m_iconSize = size;
00432
00433
00434 KURLBarItem *item = static_cast<KURLBarItem*>( m_listBox->firstItem() );
00435 while ( item ) {
00436 item->setIcon( item->icon(), item->iconGroup() );
00437 item = static_cast<KURLBarItem*>( item->next() );
00438 }
00439
00440 resize( sizeHint() );
00441 updateGeometry();
00442 }
00443
00444 void KURLBar::clear()
00445 {
00446 m_listBox->clear();
00447 }
00448
00449 void KURLBar::resizeEvent( TQResizeEvent *e )
00450 {
00451 TQFrame::resizeEvent( e );
00452 m_listBox->resize( width(), height() );
00453 }
00454
00455 void KURLBar::paletteChange( const TQPalette & )
00456 {
00457 TQPalette pal = palette();
00458 TQColor gray = pal.color( TQPalette::Normal, TQColorGroup::Background );
00459 TQColor selectedTextColor = pal.color( TQPalette::Normal, TQColorGroup::BrightText );
00460 TQColor foreground = pal.color( TQPalette::Normal, TQColorGroup::Foreground );
00461 pal.setColor( TQPalette::Normal, TQColorGroup::Base, gray );
00462 pal.setColor( TQPalette::Normal, TQColorGroup::HighlightedText, selectedTextColor );
00463 pal.setColor( TQPalette::Normal, TQColorGroup::Text, foreground );
00464 pal.setColor( TQPalette::Inactive, TQColorGroup::Base, gray );
00465 pal.setColor( TQPalette::Inactive, TQColorGroup::HighlightedText, selectedTextColor );
00466 pal.setColor( TQPalette::Inactive, TQColorGroup::Text, foreground );
00467
00468 setPalette( pal );
00469 }
00470
00471 TQSize KURLBar::sizeHint() const
00472 {
00473 return m_listBox->sizeHint();
00474
00475 #if 0
00476
00477
00478
00479
00480 int w = 0;
00481 int h = 0;
00482 KURLBarItem *item;
00483 bool vertical = isVertical();
00484
00485 for ( item = static_cast<KURLBarItem*>( m_listBox->firstItem() );
00486 item;
00487 item = static_cast<KURLBarItem*>( item->next() ) ) {
00488
00489 TQSize sh = item->sizeHint();
00490
00491 if ( vertical ) {
00492 w = TQMAX( w, sh.width() );
00493 h += sh.height();
00494 }
00495 else {
00496 w += sh.width();
00497 h = TQMAX( h, sh.height() );
00498 }
00499 }
00500
00501
00502
00503
00504
00505
00506 if ( w == 0 && h == 0 )
00507 return TQSize( 100, 200 );
00508 else
00509 return TQSize( 6 + w, h );
00510 #endif
00511 }
00512
00513 TQSize KURLBar::minimumSizeHint() const
00514 {
00515 TQSize s = sizeHint();
00516 int w = s.width() + m_listBox->verticalScrollBar()->width();
00517 int h = s.height() + m_listBox->horizontalScrollBar()->height();
00518 return TQSize( w, h );
00519 }
00520
00521 void KURLBar::slotSelected( int button, TQListBoxItem *item )
00522 {
00523 if ( button != Qt::LeftButton )
00524 return;
00525
00526 slotSelected( item );
00527 }
00528
00529 void KURLBar::slotSelected( TQListBoxItem *item )
00530 {
00531 if ( item && item != m_activeItem )
00532 m_activeItem = static_cast<KURLBarItem*>( item );
00533
00534 if ( m_activeItem ) {
00535 m_listBox->setCurrentItem( m_activeItem );
00536 emit activated( m_activeItem->url() );
00537 }
00538 }
00539
00540 void KURLBar::setCurrentItem( const KURL& url )
00541 {
00542 d->currentURL = url;
00543
00544 TQString u = url.url(-1);
00545
00546 if ( m_activeItem && m_activeItem->url().url(-1) == u )
00547 return;
00548
00549 bool hasURL = false;
00550 TQListBoxItem *item = m_listBox->firstItem();
00551 while ( item ) {
00552 if ( static_cast<KURLBarItem*>( item )->url().url(-1) == u ) {
00553 m_activeItem = static_cast<KURLBarItem*>( item );
00554 m_listBox->setCurrentItem( item );
00555 m_listBox->setSelected( item, true );
00556 hasURL = true;
00557 break;
00558 }
00559 item = item->next();
00560 }
00561
00562 if ( !hasURL ) {
00563 m_activeItem = 0L;
00564 m_listBox->clearSelection();
00565 }
00566 }
00567
00568 KURLBarItem * KURLBar::currentItem() const
00569 {
00570 TQListBoxItem *item = m_listBox->item( m_listBox->currentItem() );
00571 if ( item )
00572 return static_cast<KURLBarItem *>( item );
00573 return 0L;
00574 }
00575
00576 KURL KURLBar::currentURL() const
00577 {
00578 KURLBarItem *item = currentItem();
00579 return item ? item->url() : KURL();
00580 }
00581
00582 void KURLBar::readConfig( TDEConfig *appConfig, const TQString& itemGroup )
00583 {
00584 m_isImmutable = appConfig->groupIsImmutable( itemGroup );
00585 TDEConfigGroupSaver cs( appConfig, itemGroup );
00586 d->defaultIconSize = m_iconSize;
00587 m_iconSize = appConfig->readNumEntry( "Speedbar IconSize", m_iconSize );
00588
00589 if ( m_useGlobal ) {
00590 TDEConfig *globalConfig = TDEGlobal::config();
00591 TDEConfigGroupSaver cs( globalConfig, (TQString)(itemGroup +" (Global)"));
00592 int num = globalConfig->readNumEntry( "Number of Entries" );
00593 for ( int i = 0; i < num; i++ ) {
00594 readItem( i, globalConfig, false );
00595 }
00596 }
00597
00598
00599 int num = appConfig->readNumEntry( "Number of Entries" );
00600 for ( int i = 0; i < num; i++ ) {
00601 readItem( i, appConfig, true );
00602 }
00603 }
00604
00605 void KURLBar::readItem( int i, TDEConfig *config, bool applicationLocal )
00606 {
00607 TQString number = TQString::number( i );
00608 KURL url = KURL::fromPathOrURL( config->readPathEntry( TQString("URL_") + number ));
00609 if ( !url.isValid() || !KProtocolInfo::isKnownProtocol( url ))
00610 return;
00611
00612 TQString description = config->readEntry( TQString("Description_") + number );
00613
00614 if (description.isEmpty() && url.protocol()=="beagle") {
00615 TDEIO::UDSEntry uds;
00616 const KURL kurl("beagle:?beagled-status");
00617 if (!TDEIO::NetAccess::stat(kurl, uds))
00618 return;
00619
00620 description = i18n("Desktop Search");
00621 }
00622
00623 insertItem( url,
00624 description,
00625 applicationLocal,
00626 config->readEntry( TQString("Icon_") + number ),
00627 static_cast<TDEIcon::Group>(
00628 config->readNumEntry( TQString("IconGroup_") + number )) );
00629 }
00630
00631 void KURLBar::writeConfig( TDEConfig *config, const TQString& itemGroup )
00632 {
00633 TDEConfigGroupSaver cs1( config, itemGroup );
00634 if(!config->hasDefault("Speedbar IconSize") && m_iconSize == d->defaultIconSize )
00635 config->revertToDefault("Speedbar IconSize");
00636 else
00637 config->writeEntry( "Speedbar IconSize", m_iconSize );
00638
00639 if ( !m_isModified )
00640 return;
00641
00642 int i = 0;
00643 int numLocal = 0;
00644 KURLBarItem *item = static_cast<KURLBarItem*>( m_listBox->firstItem() );
00645
00646 while ( item )
00647 {
00648 if ( item->isPersistent() )
00649 {
00650 if ( item->applicationLocal() )
00651 {
00652 writeItem( item, numLocal, config, false );
00653 numLocal++;
00654 }
00655
00656 i++;
00657 }
00658 item = static_cast<KURLBarItem*>( item->next() );
00659 }
00660 config->writeEntry("Number of Entries", numLocal);
00661
00662
00663
00664 bool haveGlobalEntries = (i > numLocal);
00665 if ( m_useGlobal && haveGlobalEntries ) {
00666 config->setGroup( itemGroup + " (Global)" );
00667
00668 int numGlobals = 0;
00669 item = static_cast<KURLBarItem*>( m_listBox->firstItem() );
00670
00671 while ( item )
00672 {
00673 if ( item->isPersistent() )
00674 {
00675 if ( !item->applicationLocal() )
00676 {
00677 writeItem( item, numGlobals, config, true );
00678 numGlobals++;
00679 }
00680 }
00681
00682 item = static_cast<KURLBarItem*>( item->next() );
00683 }
00684 config->writeEntry("Number of Entries", numGlobals, true, true);
00685 }
00686
00687 m_isModified = false;
00688 }
00689
00690 void KURLBar::writeItem( KURLBarItem *item, int i, TDEConfig *config,
00691 bool global )
00692 {
00693 if ( !item->isPersistent() )
00694 return;
00695
00696 TQString Description = "Description_";
00697 TQString URL = "URL_";
00698 TQString Icon = "Icon_";
00699 TQString IconGroup = "IconGroup_";
00700
00701 TQString number = TQString::number( i );
00702 config->writePathEntry( URL + number, item->url().prettyURL(), true, global );
00703
00704 config->writeEntry( Description + number, item->description(),true,global);
00705 config->writeEntry( Icon + number, item->icon(), true, global );
00706 config->writeEntry( IconGroup + number, item->iconGroup(), true, global );
00707 }
00708
00709
00710 void KURLBar::slotDropped( TQDropEvent *e )
00711 {
00712 KURL::List urls;
00713 if ( KURLDrag::decode( e, urls ) ) {
00714 KURL url;
00715 TQString description;
00716 TQString icon;
00717 bool appLocal = false;
00718
00719 KURL::List::Iterator it = urls.begin();
00720 for ( ; it != urls.end(); ++it ) {
00721 (void) insertItem( *it, description, appLocal, icon );
00722 m_isModified = true;
00723 updateGeometry();
00724 }
00725 }
00726 }
00727
00728 void KURLBar::slotContextMenuRequested( TQListBoxItem *_item, const TQPoint& pos )
00729 {
00730 if (m_isImmutable)
00731 return;
00732
00733 KURLBarItem *item = dynamic_cast<KURLBarItem*>( _item );
00734
00735 static const int IconSize = 10;
00736 static const int AddItem = 20;
00737 static const int EditItem = 30;
00738 static const int RemoveItem = 40;
00739
00740 KURL lastURL = m_activeItem ? m_activeItem->url() : KURL();
00741
00742 bool smallIcons = m_iconSize < TDEIcon::SizeMedium;
00743 TQPopupMenu *popup = new TQPopupMenu();
00744 popup->insertItem( smallIcons ?
00745 i18n("&Large Icons") : i18n("&Small Icons"),
00746 IconSize );
00747 popup->insertSeparator();
00748
00749 if (item != 0L && item->isPersistent())
00750 {
00751 popup->insertItem(SmallIconSet("edit"), i18n("&Edit Entry..."), EditItem);
00752 popup->insertSeparator();
00753 }
00754
00755 popup->insertItem(SmallIconSet("document-new"), i18n("&Add Entry..."), AddItem);
00756
00757 if (item != 0L && item->isPersistent())
00758 {
00759 popup->insertItem( SmallIconSet("edit-delete"), i18n("&Remove Entry"),
00760 RemoveItem );
00761 }
00762
00763 int result = popup->exec( pos );
00764 switch ( result ) {
00765 case IconSize:
00766 setIconSize( smallIcons ? TDEIcon::SizeMedium : TDEIcon::SizeSmallMedium );
00767 m_listBox->triggerUpdate( true );
00768 break;
00769 case AddItem:
00770 addNewItem();
00771 break;
00772 case EditItem:
00773 editItem( static_cast<KURLBarItem *>( item ) );
00774 break;
00775 case RemoveItem:
00776 delete item;
00777 m_isModified = true;
00778 break;
00779 default:
00780 break;
00781 }
00782
00783
00784 m_activeItem = 0L;
00785 setCurrentItem( lastURL );
00786 }
00787
00788 bool KURLBar::addNewItem()
00789 {
00790 KURLBarItem *item = new KURLBarItem( this, d->currentURL,
00791 i18n("Enter a description") );
00792 if ( editItem( item ) ) {
00793 m_listBox->insertItem( item );
00794 return true;
00795 }
00796
00797 delete item;
00798 return false;
00799 }
00800
00801 bool KURLBar::editItem( KURLBarItem *item )
00802 {
00803 if ( !item || !item->isPersistent() )
00804 return false;
00805
00806 KURL url = item->url();
00807 TQString description = item->description();
00808 TQString icon = item->icon();
00809 bool appLocal = item->applicationLocal();
00810
00811 if ( KURLBarItemDialog::getInformation( m_useGlobal,
00812 url, description,
00813 icon, appLocal,
00814 m_iconSize, this ))
00815 {
00816 item->setURL( url );
00817 item->setDescription( description );
00818 item->setIcon( icon );
00819 item->setApplicationLocal( appLocal );
00820 m_listBox->triggerUpdate( true );
00821 m_isModified = true;
00822 updateGeometry();
00823 return true;
00824 }
00825
00826 return false;
00827 }
00828
00831
00832
00833 KURLBarListBox::KURLBarListBox( TQWidget *parent, const char *name )
00834 : TDEListBox( parent, name )
00835 {
00836 m_toolTip = new KURLBarToolTip( this );
00837 setAcceptDrops( true );
00838 viewport()->setAcceptDrops( true );
00839 }
00840
00841 KURLBarListBox::~KURLBarListBox()
00842 {
00843 delete m_toolTip;
00844 }
00845
00846 void KURLBarListBox::paintEvent( TQPaintEvent* )
00847 {
00848 TQPainter p(this);
00849 p.setPen( colorGroup().mid() );
00850 p.drawRect( 0, 0, width(), height() );
00851 }
00852
00853 TQDragObject * KURLBarListBox::dragObject()
00854 {
00855 KURL::List urls;
00856 KURLBarItem *item = static_cast<KURLBarItem*>( firstItem() );
00857
00858 while ( item ) {
00859 if ( item->isSelected() )
00860 urls.append( item->url() );
00861 item = static_cast<KURLBarItem*>( item->next() );
00862 }
00863
00864 if ( !urls.isEmpty() )
00865 return new KURLDrag( urls, this, "urlbar drag" );
00866
00867 return 0L;
00868 }
00869
00870 void KURLBarListBox::contentsDragEnterEvent( TQDragEnterEvent *e )
00871 {
00872 e->accept( KURLDrag::canDecode( e ));
00873 }
00874
00875 void KURLBarListBox::contentsDropEvent( TQDropEvent *e )
00876 {
00877 emit dropped( e );
00878 }
00879
00880 void KURLBarListBox::contextMenuEvent( TQContextMenuEvent *e )
00881 {
00882 if (e)
00883 {
00884 emit contextMenuRequested( itemAt( e->globalPos() ), e->globalPos() );
00885 e->consume();
00886 }
00887 }
00888
00889 void KURLBarListBox::setOrientation( Qt::Orientation orient )
00890 {
00891 if ( orient == Qt::Vertical ) {
00892 setColumnMode( 1 );
00893 setRowMode( Variable );
00894 }
00895 else {
00896 setRowMode( 1 );
00897 setColumnMode( Variable );
00898 }
00899
00900 m_orientation = orient;
00901 }
00902
00905
00906
00907 bool KURLBarItemDialog::getInformation( bool allowGlobal, KURL& url,
00908 TQString& description, TQString& icon,
00909 bool& appLocal, int iconSize,
00910 TQWidget *parent )
00911 {
00912 KURLBarItemDialog *dialog = new KURLBarItemDialog( allowGlobal, url,
00913 description, icon,
00914 appLocal,
00915 iconSize, parent );
00916 if ( dialog->exec() == TQDialog::Accepted ) {
00917
00918 url = dialog->url();
00919 description = dialog->description();
00920 icon = dialog->icon();
00921 appLocal = dialog->applicationLocal();
00922
00923 delete dialog;
00924 return true;
00925 }
00926
00927 delete dialog;
00928 return false;
00929 }
00930
00931 KURLBarItemDialog::KURLBarItemDialog( bool allowGlobal, const KURL& url,
00932 const TQString& description,
00933 TQString icon, bool appLocal,
00934 int iconSize,
00935 TQWidget *parent, const char *name )
00936 : KDialogBase( parent, name, true,
00937 i18n("Edit Quick Access Entry"), Ok | Cancel, Ok, true )
00938 {
00939 TQVBox *box = new TQVBox( this );
00940 TQString text = i18n("<qt><b>Please provide a description, URL and icon for this Quick Access entry.</b></br></qt>");
00941 TQLabel *label = new TQLabel( text, box );
00942 box->setSpacing( spacingHint() );
00943
00944 TQGrid *grid = new TQGrid( 2, box );
00945 grid->setSpacing( spacingHint() );
00946
00947 TQString whatsThisText = i18n("<qt>This is the text that will appear in the Quick Access panel.<p>"
00948 "The description should consist of one or two words "
00949 "that will help you remember what this entry refers to.</qt>");
00950 label = new TQLabel( i18n("&Description:"), grid );
00951 m_edit = new KLineEdit( grid, "description edit" );
00952 m_edit->setText( description.isEmpty() ? url.fileName() : description );
00953 label->setBuddy( m_edit );
00954 TQWhatsThis::add( label, whatsThisText );
00955 TQWhatsThis::add( m_edit, whatsThisText );
00956
00957 whatsThisText = i18n("<qt>This is the location associated with the entry. Any valid URL may be used. For example:<p>"
00958 "%1<br>http://www.trinitydesktop.org<p>"
00959 "By clicking on the button next to the text edit box you can browse to an "
00960 "appropriate URL.</qt>").arg(TQDir::homeDirPath());
00961 label = new TQLabel( i18n("&URL:"), grid );
00962 m_urlEdit = new KURLRequester( url.prettyURL(), grid );
00963 m_urlEdit->setMode( KFile::Directory );
00964 label->setBuddy( m_urlEdit );
00965 TQWhatsThis::add( label, whatsThisText );
00966 TQWhatsThis::add( m_urlEdit, whatsThisText );
00967
00968 whatsThisText = i18n("<qt>This is the icon that will appear in the Quick Access panel.<p>"
00969 "Click on the button to select a different icon.</qt>");
00970 label = new TQLabel( i18n("Choose an &icon:"), grid );
00971 m_iconButton = new TDEIconButton( grid, "icon button" );
00972 m_iconButton->setIconSize( iconSize );
00973 if ( icon.isEmpty() )
00974 icon = KMimeType::iconForURL( url );
00975 m_iconButton->setIcon( icon );
00976 label->setBuddy( m_iconButton );
00977 TQWhatsThis::add( label, whatsThisText );
00978 TQWhatsThis::add( m_iconButton, whatsThisText );
00979
00980 if ( allowGlobal ) {
00981 TQString appName;
00982 if ( TDEGlobal::instance()->aboutData() )
00983 appName = TDEGlobal::instance()->aboutData()->programName();
00984 if ( appName.isEmpty() )
00985 appName = TQString::fromLatin1( TDEGlobal::instance()->instanceName() );
00986 m_appLocal = new TQCheckBox( i18n("&Only show when using this application (%1)").arg( appName ), box );
00987 m_appLocal->setChecked( appLocal );
00988 TQWhatsThis::add( m_appLocal,
00989 i18n("<qt>Select this setting if you want this "
00990 "entry to show only when using the current application (%1).<p>"
00991 "If this setting is not selected, the entry will be available in all "
00992 "applications.</qt>")
00993 .arg(appName));
00994 }
00995 else
00996 m_appLocal = 0L;
00997 connect(m_urlEdit->lineEdit(),TQT_SIGNAL(textChanged ( const TQString & )),this,TQT_SLOT(urlChanged(const TQString & )));
00998 m_edit->setFocus();
00999 setMainWidget( box );
01000 }
01001
01002 KURLBarItemDialog::~KURLBarItemDialog()
01003 {
01004 }
01005
01006 void KURLBarItemDialog::urlChanged(const TQString & text )
01007 {
01008 enableButtonOK( !text.isEmpty() );
01009 }
01010
01011 KURL KURLBarItemDialog::url() const
01012 {
01013 TQString text = m_urlEdit->url();
01014 KURL u;
01015 if ( text.at(0) == '/' )
01016 u.setPath( text );
01017 else
01018 u = text;
01019
01020 return u;
01021 }
01022
01023 TQString KURLBarItemDialog::description() const
01024 {
01025 return m_edit->text();
01026 }
01027
01028 TQString KURLBarItemDialog::icon() const
01029 {
01030 return m_iconButton->icon();
01031 }
01032
01033 bool KURLBarItemDialog::applicationLocal() const
01034 {
01035 if ( !m_appLocal )
01036 return true;
01037
01038 return m_appLocal->isChecked();
01039 }
01040
01041 void KURLBarItem::virtual_hook( int, void* )
01042 { }
01043
01044 void KURLBar::virtual_hook( int, void* )
01045 { }
01046
01047 void KURLBarListBox::virtual_hook( int id, void* data )
01048 { TDEListBox::virtual_hook( id, data ); }
01049
01050
01051 #include "kurlbar.moc"