int KServiceGroup::childCount() { if (m_childCount == -1) { m_childCount = 0; for( List::ConstIterator it = m_serviceList.begin(); it != m_serviceList.end(); it++) { KSycocaEntry *p = (*it); if (p->isType(KST_KService)) { KService *service = static_cast<KService *>(p); if (!service->noDisplay()) m_childCount++; } else if (p->isType(KST_KServiceGroup)) { KServiceGroup *serviceGroup = static_cast<KServiceGroup *>(p); m_childCount += serviceGroup->childCount(); } } } return m_childCount; }
void TIconView::setCategory( const QString& path ) { this->clear(); QPixmap _icon = DesktopIcon( "go", KIcon::SizeMedium ); // defaultIcon KServiceGroup::Ptr category = KServiceGroup::group( path ); if ( !category || !category->isValid() ) return; KServiceGroup::List list = category->entries( true, true ); KServiceGroup::List::ConstIterator it = list.begin(); for ( ; it != list.end(); ++it ) { KSycocaEntry *p = ( *it ); if ( p->isType( KST_KService ) ) { // KCModuleInfo(KService*) KCModuleInfo *minfo = new KCModuleInfo( static_cast<KService*>( p ) ); if ( minfo->icon() ) _icon = DesktopIcon( minfo->icon(), KIcon::SizeLarge ); TIconViewItem* _item = new TIconViewItem( this, minfo->moduleName(), _icon, minfo ); connect( this, SIGNAL( executed( QIconViewItem* ) ), this, SLOT( slotItemSelected( QIconViewItem* ) ) ); } // ignore second level subGroups! }
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 PanelAddButtonMenu::slotExec(int id) { if(!entryMap_.contains(id)) return; KSycocaEntry *e = entryMap_[id]; if(e->isType(KST_KServiceGroup)) { KServiceGroup::Ptr g = static_cast< KServiceGroup * >(e); containerArea->addServiceMenuButton(g->relPath()); } else if(e->isType(KST_KService)) { KService::Ptr service = static_cast< KService * >(e); containerArea->addServiceButton(service->desktopEntryPath()); } }
void TIconView::setCategory( const QString& path ) { clear(); QPixmap _icon = DesktopIcon( "go", KIcon::SizeMedium ); // defaultIcon KServiceGroup::Ptr category = KServiceGroup::group( path ); if ( !category || !category->isValid() ) return; TIconViewItem *_item; KServiceGroup::List list = category->entries( true, true ); KServiceGroup::List::ConstIterator it = list.begin(); KServiceGroup::List::ConstIterator end = list.end(); for ( ; it != end; ++it ) { KSycocaEntry *p = ( *it ); if ( p->isType( KST_KService ) ) { // KCModuleInfo(KService*) KCModuleInfo *minfo = new KCModuleInfo( static_cast<KService*>( p ) ); if (showExtras == false) { KSimpleConfig cfg(minfo->fileName()); cfg.setDesktopGroup(); if ( cfg.readEntry("Categories").contains("X-KDE-tasma-extra") ) continue; } if ( minfo->icon() ) _icon = DesktopIcon( minfo->icon(), KIcon::SizeLarge ); _item = new TIconViewItem( this, minfo->moduleName(), _icon, minfo , minfo->comment()); } // ignore second level subGroups! } list.clear(); }
static void findMenuEntry(KServiceGroup::Ptr parent, const QString &name, const QString &menuId) { KServiceGroup::List list = parent->entries(true, true, false); KServiceGroup::List::ConstIterator it = list.begin(); for (; it != list.end(); ++it) { KSycocaEntry * e = *it; if (e->isType(KST_KServiceGroup)) { KServiceGroup::Ptr g(static_cast<KServiceGroup *>(e)); findMenuEntry(g, name.isEmpty() ? g->caption() : name+"/"+g->caption(), menuId); } else if (e->isType(KST_KService)) { KService::Ptr s(static_cast<KService *>(e)); if (s->menuId() == menuId) { if (bPrintMenuId) { result(parent->relPath()); } if (bPrintMenuName) { result(name); } if (bHighlight) { DCOPRef kicker( "kicker", "kicker" ); bool result = kicker.call( "highlightMenuItem", menuId ); if (!result) error(3, i18n("Menu item '%1' could not be highlighted.").arg(menuId).local8Bit()); } exit(0); } } } }
void KServiceGroup::save( QDataStream& s ) { KSycocaEntry::save( s ); QStringList groupList; for( List::ConstIterator it = m_serviceList.begin(); it != m_serviceList.end(); it++) { KSycocaEntry *p = (*it); if (p->isType(KST_KService)) { KService *service = static_cast<KService *>(p); groupList.append( service->desktopEntryPath()); } else if (p->isType(KST_KServiceGroup)) { KServiceGroup *serviceGroup = static_cast<KServiceGroup *>(p); groupList.append( serviceGroup->relPath()); } else { //fprintf(stderr, "KServiceGroup: Unexpected object in list!\n"); } } (void) childCount(); Q_INT8 noDisplay = d->m_bNoDisplay ? 1 : 0; Q_INT8 _showEmptyMenu = d->m_bShowEmptyMenu ? 1 : 0; Q_INT8 inlineHeader = d->m_bShowInlineHeader ? 1 : 0; Q_INT8 _inlineAlias = d->m_bInlineAlias ? 1 : 0; Q_INT8 _allowInline = d->m_bAllowInline ? 1 : 0; s << m_strCaption << m_strIcon << m_strComment << groupList << m_strBaseGroupName << m_childCount << noDisplay << d->suppressGenericNames << d->directoryEntryPath << d->sortOrder <<_showEmptyMenu <<inlineHeader<<_inlineAlias<<_allowInline; }
KServiceGroup::List KServiceGroup::entries(bool sort, bool excludeNoDisplay, bool allowSeparators, bool sortByGenericName) { KServiceGroup *group = this; // If the entries haven't been loaded yet, we have to reload ourselves // together with the entries. We can't only load the entries afterwards // since the offsets could have been changed if the database has changed. if (!m_bDeep) { group = KServiceGroupFactory::self()->findGroupByDesktopPath(relPath(), true); if (0 == group) // No guarantee that we still exist! return List(); } if (!sort) return group->m_serviceList; // Sort the list alphabetically, according to locale. // Groups come first, then services. KSortableValueList<SPtr,QCString> slist; KSortableValueList<SPtr,QCString> glist; for (List::ConstIterator it(group->m_serviceList.begin()); it != group->m_serviceList.end(); ++it) { KSycocaEntry *p = (*it); bool noDisplay = p->isType(KST_KServiceGroup) ? static_cast<KServiceGroup *>(p)->noDisplay() : static_cast<KService *>(p)->noDisplay(); if (excludeNoDisplay && noDisplay) continue; // Choose the right list KSortableValueList<SPtr,QCString> & list = p->isType(KST_KServiceGroup) ? glist : slist; QString name; if (p->isType(KST_KServiceGroup)) name = static_cast<KServiceGroup *>(p)->caption(); else if (sortByGenericName) name = static_cast<KService *>(p)->genericName() + " " + p->name(); else name = p->name() + " " + static_cast<KService *>(p)->genericName(); QCString key( name.length() * 4 + 1 ); // strxfrm() crashes on Solaris #ifndef USE_SOLARIS // maybe it'd be better to use wcsxfrm() where available size_t ln = strxfrm( key.data(), name.local8Bit().data(), key.size()); if( ln != size_t( -1 )) { if( ln >= key.size()) { // didn't fit? key.resize( ln + 1 ); if( strxfrm( key.data(), name.local8Bit().data(), key.size()) == size_t( -1 )) key = name.local8Bit(); } } else #endif { key = name.local8Bit(); } list.insert(key,SPtr(*it)); } // Now sort slist.sort(); glist.sort(); if (d->sortOrder.isEmpty()) { d->sortOrder << ":M"; d->sortOrder << ":F"; d->sortOrder << ":OIH IL[4]"; //just inline header } QString rp = relPath(); if(rp == "/") rp = QString::null; // Iterate through the sort spec list. // If an entry gets mentioned explicitly, we remove it from the sorted list for (QStringList::ConstIterator it(d->sortOrder.begin()); it != d->sortOrder.end(); ++it) { const QString &item = *it; if (item.isEmpty()) continue; if (item[0] == '/') { QString groupPath = rp + item.mid(1) + "/"; // Remove entry from sorted list of services. for(KSortableValueList<SPtr,QCString>::Iterator it2 = glist.begin(); it2 != glist.end(); ++it2) { KServiceGroup *group = (KServiceGroup *)((KSycocaEntry *)((*it2).value())); if (group->relPath() == groupPath) { glist.remove(it2); break; } } } else if (item[0] != ':') { // Remove entry from sorted list of services. // TODO: Remove item from sortOrder-list if not found // TODO: This prevents duplicates for(KSortableValueList<SPtr,QCString>::Iterator it2 = slist.begin(); it2 != slist.end(); ++it2) { KService *service = (KService *)((KSycocaEntry *)((*it2).value())); if (service->menuId() == item) { slist.remove(it2); break; } } } } List sorted; bool needSeparator = false; // Iterate through the sort spec list. // Add the entries to the list according to the sort spec. for (QStringList::ConstIterator it(d->sortOrder.begin()); it != d->sortOrder.end(); ++it) { const QString &item = *it; if (item.isEmpty()) continue; if (item[0] == ':') { // Special condition... if (item == ":S") { if (allowSeparators) needSeparator = true; } else if ( item.contains( ":O" ) ) { //todo parse attribute: QString tmp( item ); tmp = tmp.remove(":O"); QStringList optionAttribute = QStringList::split(" ",tmp); if( optionAttribute.count()==0) optionAttribute.append(tmp); bool showEmptyMenu = false; bool showInline = false; bool showInlineHeader = false; bool showInlineAlias = false; int inlineValue = -1; for ( QStringList::Iterator it3 = optionAttribute.begin(); it3 != optionAttribute.end(); ++it3 ) { parseAttribute( *it3, showEmptyMenu, showInline, showInlineHeader, showInlineAlias, inlineValue ); } for(KSortableValueList<SPtr,QCString>::Iterator it2 = glist.begin(); it2 != glist.end(); ++it2) { KServiceGroup *group = (KServiceGroup *)((KSycocaEntry *)(*it2).value()); group->setShowEmptyMenu( showEmptyMenu ); group->setAllowInline( showInline ); group->setShowInlineHeader( showInlineHeader ); group->setInlineAlias( showInlineAlias ); group->setInlineValue( inlineValue ); } } else if (item == ":M") { // Add sorted list of sub-menus for(KSortableValueList<SPtr,QCString>::Iterator it2 = glist.begin(); it2 != glist.end(); ++it2) { addItem(sorted, (*it2).value(), needSeparator); } } else if (item == ":F") { // Add sorted list of services for(KSortableValueList<SPtr,QCString>::Iterator it2 = slist.begin(); it2 != slist.end(); ++it2) { addItem(sorted, (*it2).value(), needSeparator); } } else if (item == ":A") { // Add sorted lists of services and submenus KSortableValueList<SPtr,QCString>::Iterator it_s = slist.begin(); KSortableValueList<SPtr,QCString>::Iterator it_g = glist.begin(); while(true) { if (it_s == slist.end()) { if (it_g == glist.end()) break; // Done // Insert remaining sub-menu addItem(sorted, (*it_g).value(), needSeparator); it_g++; } else if (it_g == glist.end()) { // Insert remaining service addItem(sorted, (*it_s).value(), needSeparator); it_s++; } else if ((*it_g).index() < (*it_s).index()) { // Insert sub-menu first addItem(sorted, (*it_g).value(), needSeparator); it_g++; } else { // Insert service first addItem(sorted, (*it_s).value(), needSeparator); it_s++; } } } } else if (item[0] == '/') { QString groupPath = rp + item.mid(1) + "/"; for (List::ConstIterator it2(group->m_serviceList.begin()); it2 != group->m_serviceList.end(); ++it2) { if (!(*it2)->isType(KST_KServiceGroup)) continue; KServiceGroup *group = (KServiceGroup *)((KSycocaEntry *)(*it2)); if (group->relPath() == groupPath) { if (!excludeNoDisplay || !group->noDisplay()) { const QString &nextItem = *( ++it ); if ( nextItem.startsWith( ":O" ) ) { QString tmp( nextItem ); tmp = tmp.remove(":O"); QStringList optionAttribute = QStringList::split(" ",tmp); if( optionAttribute.count()==0) optionAttribute.append(tmp); bool bShowEmptyMenu = false; bool bShowInline = false; bool bShowInlineHeader = false; bool bShowInlineAlias = false; int inlineValue = -1; for ( QStringList::Iterator it3 = optionAttribute.begin(); it3 != optionAttribute.end(); ++it3 ) { parseAttribute( *it3 , bShowEmptyMenu, bShowInline, bShowInlineHeader, bShowInlineAlias , inlineValue ); group->setShowEmptyMenu( bShowEmptyMenu ); group->setAllowInline( bShowInline ); group->setShowInlineHeader( bShowInlineHeader ); group->setInlineAlias( bShowInlineAlias ); group->setInlineValue( inlineValue ); } } else it--; addItem(sorted, (group), needSeparator); } break; } } } else { for (List::ConstIterator it2(group->m_serviceList.begin()); it2 != group->m_serviceList.end(); ++it2) { if (!(*it2)->isType(KST_KService)) continue; KService *service = (KService *)((KSycocaEntry *)(*it2)); if (service->menuId() == item) { if (!excludeNoDisplay || !service->noDisplay()) addItem(sorted, (*it2), needSeparator); break; } } } } return sorted; }
KSycocaEntry *KBuildSycoca::createEntry(const TQString &file, bool addToFactory) { TQ_UINT32 timeStamp = g_ctimeInfo->ctime(file); if (!timeStamp) { timeStamp = TDEGlobal::dirs()->calcResourceHash( g_resource, file, true); } KSycocaEntry* entry = 0; if (g_allEntries) { assert(g_ctimeDict); TQ_UINT32 *timeP = (*g_ctimeDict)[file]; TQ_UINT32 oldTimestamp = timeP ? *timeP : 0; if (timeStamp && (timeStamp == oldTimestamp)) { // Re-use old entry if (g_factory == g_bsgf) // Strip .directory from service-group entries { entry = g_entryDict->find(file.left(file.length()-10)); } else if (g_factory == g_bsf) { entry = g_entryDict->find(file); } else { entry = g_entryDict->find(file); } // remove from g_ctimeDict; if g_ctimeDict is not empty // after all files have been processed, it means // some files were removed since last time g_ctimeDict->remove( file ); } else if (oldTimestamp) { g_changed = true; kdDebug(7021) << "modified: " << file << endl; } else { g_changed = true; kdDebug(7021) << "new: " << file << endl; } } g_ctimeInfo->addCTime(file, timeStamp ); if (!entry) { // Create a new entry entry = g_factory->createEntry( file, g_resource ); } if ( entry && entry->isValid() ) { if (addToFactory) g_factory->addEntry( entry, g_resource ); else g_tempStorage.append(entry); return entry; } return 0; }
void KBuildServiceTypeFactory::savePatternLists(TQDataStream &str) { // Store each patterns in one of the 2 string lists (for sorting) TQStringList fastPatterns; // for *.a to *.abcd TQStringList otherPatterns; // for the rest (core.*, *.tar.bz2, *~) ... TQDict<KMimeType> dict; // For each mimetype in servicetypeFactory for(TQDictIterator<KSycocaEntry::Ptr> it ( *m_entryDict ); it.current(); ++it) { KSycocaEntry *entry = (*it.current()); if ( entry->isType( KST_KMimeType ) ) { KMimeType *mimeType = (KMimeType *) entry; TQStringList pat = mimeType->patterns(); TQStringList::ConstIterator patit = pat.begin(); for ( ; patit != pat.end() ; ++patit ) { const TQString &pattern = *patit; if ( pattern.findRev('*') == 0 && pattern.findRev('.') == 1 && pattern.length() <= 6 ) // it starts with "*.", has no other '*' and no other '.', and is max 6 chars // => fast patttern fastPatterns.append( pattern ); else if (!pattern.isEmpty()) // some stupid mimetype files have "Patterns=;" otherPatterns.append( pattern ); // Assumption : there is only one mimetype for that pattern // It doesn't really make sense otherwise, anyway. dict.replace( pattern, mimeType ); } } } // Sort the list - the fast one, useless for the other one fastPatterns.sort(); TQ_INT32 entrySize = 0; TQ_INT32 nrOfEntries = 0; m_fastPatternOffset = str.device()->at(); // Write out fastPatternHeader (Pass #1) str.device()->at(m_fastPatternOffset); str << nrOfEntries; str << entrySize; // For each fast pattern TQStringList::ConstIterator it = fastPatterns.begin(); for ( ; it != fastPatterns.end() ; ++it ) { int start = str.device()->at(); // Justify to 6 chars with spaces, so that the size remains constant // in the database file. TQString paddedPattern = (*it).leftJustify(6).right(4); // remove leading "*." //kdDebug(7021) << TQString("FAST : '%1' '%2'").arg(paddedPattern).arg(dict[(*it)]->name()) << endl; str << paddedPattern; str << dict[(*it)]->offset(); entrySize = str.device()->at() - start; nrOfEntries++; } // store position m_otherPatternOffset = str.device()->at(); // Write out fastPatternHeader (Pass #2) str.device()->at(m_fastPatternOffset); str << nrOfEntries; str << entrySize; // For the other patterns str.device()->at(m_otherPatternOffset); it = otherPatterns.begin(); for ( ; it != otherPatterns.end() ; ++it ) { //kdDebug(7021) << TQString("OTHER : '%1' '%2'").arg(*it).arg(dict[(*it)]->name()) << endl; str << (*it); str << dict[(*it)]->offset(); } str << TQString(""); // end of list marker (has to be a string !) }