void NavigatorAppItem::populate(bool recursive) { if(mPopulated) return; KServiceGroup::Ptr root = KServiceGroup::group(mRelpath); if(!root) { kdWarning() << "No Service groups\n"; return; } KServiceGroup::List list = root->entries(); for(KServiceGroup::List::ConstIterator it = list.begin(); it != list.end(); ++it) { KSycocaEntry *e = *it; KService::Ptr s; NavigatorItem *item; KServiceGroup::Ptr g; QString url; switch(e->sycocaType()) { case KST_KService: { s = static_cast< KService * >(e); url = documentationURL(s); if(!url.isEmpty()) { DocEntry *entry = new DocEntry(s->name(), url, s->icon()); item = new NavigatorItem(entry, this); item->setAutoDeleteDocEntry(true); item->setExpandable(true); } break; } case KST_KServiceGroup: { g = static_cast< KServiceGroup * >(e); if((g->childCount() == 0) || g->name().startsWith(".")) continue; DocEntry *entry = new DocEntry(g->caption(), "", g->icon()); NavigatorAppItem *appItem; appItem = new NavigatorAppItem(entry, this, g->relPath()); appItem->setAutoDeleteDocEntry(true); if(recursive) appItem->populate(recursive); break; } default: break; } } sortChildItems(0, true /* ascending */); mPopulated = true; }
void NavigatorAppItem::populate( bool recursive ) { if ( mPopulated ) return; KServiceGroup::Ptr root = KServiceGroup::group(mRelpath); if ( !root ) { kWarning() << "No Service groups\n"; return; } KServiceGroup::List list = root->entries(); for ( KServiceGroup::List::ConstIterator it = list.constBegin(); it != list.constEnd(); ++it ) { const KSycocaEntry::Ptr e = *it; NavigatorItem *item; QString url; switch ( e->sycocaType() ) { case KST_KService: { const KService::Ptr s = KService::Ptr::staticCast(e); url = documentationURL( s.data() ); if ( !url.isEmpty() ) { DocEntry *entry = new DocEntry( s->name(), url, s->icon() ); item = new NavigatorItem( entry, this ); item->setAutoDeleteDocEntry( true ); } break; } case KST_KServiceGroup: { KServiceGroup::Ptr g = KServiceGroup::Ptr::staticCast(e); if ( ( g->childCount() == 0 ) || g->name().startsWith( '.' ) ) continue; DocEntry *entry = new DocEntry( g->caption(), "", g->icon() ); NavigatorAppItem *appItem; appItem = new NavigatorAppItem( entry, this, g->relPath() ); appItem->setAutoDeleteDocEntry( true ); if ( recursive ) appItem->populate( recursive ); break; } default: break; } } sortChildren( 0, Qt::AscendingOrder /* ascending */ ); mPopulated = true; }
void Navigator::selectItem( const KUrl &url ) { kDebug() << "Navigator::selectItem(): " << url.url(); if ( url.url() == "khelpcenter:home" ) { clearSelection(); return; } // help:/foo&anchor=bar gets redirected to help:/foo#bar // Make sure that we match both the original URL as well as // its counterpart. KUrl alternativeURL = url; if (url.hasRef()) { alternativeURL.setQuery("anchor="+url.ref()); alternativeURL.setRef(QString()); } // If the navigator already has the given URL selected, do nothing. NavigatorItem *item; item = static_cast<NavigatorItem *>( mContentsTree->currentItem() ); if ( item && mSelected ) { KUrl currentURL ( item->entry()->url() ); if ( (currentURL == url) || (currentURL == alternativeURL) ) { kDebug() << "URL already shown."; return; } } // First, populate the NavigatorAppItems if we don't want the home page if ( url != homeURL() ) { QTreeWidgetItemIterator it1( mContentsTree ); while( (*it1) ) { NavigatorAppItem *appItem = dynamic_cast<NavigatorAppItem *>( (*it1) ); if ( appItem ) appItem->populate( true ); ++it1; } } QTreeWidgetItemIterator it( mContentsTree ); while ( (*it) ) { NavigatorItem *item = static_cast<NavigatorItem *>( (*it) ); KUrl itemUrl( item->entry()->url() ); if ( (itemUrl == url) || (itemUrl == alternativeURL) ) { mContentsTree->setCurrentItem( item ); // If the current item was not selected and remained unchanged it // needs to be explicitly selected mContentsTree->setCurrentItem(item); item->setExpanded( true ); break; } ++it; } if ( !(*it) ) { clearSelection(); } else { mSelected = true; } }