diff options
author | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2013-01-27 01:04:16 -0600 |
---|---|---|
committer | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2013-01-27 01:04:16 -0600 |
commit | 5159cd2beb2e87806a5b54e9991b7895285c9d3e (patch) | |
tree | 9b70e8be47a390f8f4d56ead812ab0c9dad88709 /tdeio/tdeio/kservicegroup.cpp | |
parent | c17cb900dcf52b8bd6dc300d4f103392900ec2b4 (diff) | |
download | tdelibs-5159cd2beb2e87806a5b54e9991b7895285c9d3e.tar.gz tdelibs-5159cd2beb2e87806a5b54e9991b7895285c9d3e.zip |
Rename a number of libraries and executables to avoid conflicts with KDE4
Diffstat (limited to 'tdeio/tdeio/kservicegroup.cpp')
-rw-r--r-- | tdeio/tdeio/kservicegroup.cpp | 724 |
1 files changed, 724 insertions, 0 deletions
diff --git a/tdeio/tdeio/kservicegroup.cpp b/tdeio/tdeio/kservicegroup.cpp new file mode 100644 index 000000000..2e27c99b0 --- /dev/null +++ b/tdeio/tdeio/kservicegroup.cpp @@ -0,0 +1,724 @@ +/* This file is part of the KDE libraries + * Copyright (C) 2000 Waldo Bastian <bastian@kde.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License version 2 as published by the Free Software Foundation; + * + * 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 <tqdir.h> + +#include <kiconloader.h> +#include <kglobal.h> +#include <kstandarddirs.h> +#include <klocale.h> +#include <kdebug.h> +#include <ksortablevaluelist.h> + +#include "kservicefactory.h" +#include "kservicegroupfactory.h" +#include "kservicegroup.h" +#include "kservice.h" +#include "tdesycoca.h" + +class KServiceGroup::Private +{ +public: + Private() { m_bNoDisplay = false; m_bShowEmptyMenu = false;m_bShowInlineHeader=false;m_bInlineAlias=false; m_bAllowInline = false; m_inlineValue = 4; m_bShortMenu = false; m_bGeneralDescription = false;} + bool m_bNoDisplay; + bool m_bShortMenu; + bool m_bGeneralDescription; + bool m_bShowEmptyMenu; + bool m_bShowInlineHeader; + bool m_bInlineAlias; + bool m_bAllowInline; + int m_inlineValue; + TQStringList suppressGenericNames; + TQString directoryEntryPath; + TQStringList sortOrder; +}; + +KServiceGroup::KServiceGroup( const TQString & name ) + : KSycocaEntry(name), m_childCount(-1) +{ + d = new KServiceGroup::Private; + m_bDeleted = false; + m_bDeep = false; +} + +KServiceGroup::KServiceGroup( const TQString &configFile, const TQString & _relpath ) + : KSycocaEntry(_relpath), m_childCount(-1) +{ + d = new KServiceGroup::Private; + m_bDeleted = false; + m_bDeep = false; + + TQString cfg = configFile; + if (cfg.isEmpty()) + cfg = _relpath+".directory"; + + d->directoryEntryPath = cfg; + + KDesktopFile config( cfg, true, "apps" ); + + m_strCaption = config.readName(); + m_strIcon = config.readIcon(); + m_strComment = config.readComment(); + m_bDeleted = config.readBoolEntry( "Hidden", false ); + d->m_bNoDisplay = config.readBoolEntry( "NoDisplay", false ); + if (d->directoryEntryPath.startsWith(TQDir::homeDirPath())) + d->m_bShortMenu = false; + else + d->m_bShortMenu = config.readBoolEntry( "X-SuSE-AutoShortMenu", false ); + d->m_bGeneralDescription = config.readBoolEntry( "X-SuSE-GeneralDescription", false ); + TQStringList tmpList; + if (config.hasKey("OnlyShowIn")) + { + if ((!config.readListEntry("OnlyShowIn", ';').contains("TDE")) && (!config.readListEntry("OnlyShowIn", ';').contains("KDE"))) + d->m_bNoDisplay = true; + } + if (config.hasKey("NotShowIn")) + { + if ((config.readListEntry("NotShowIn", ';').contains("TDE")) || (config.readListEntry("NotShowIn", ';').contains("KDE"))) + d->m_bNoDisplay = true; + } + + m_strBaseGroupName = config.readEntry( "X-TDE-BaseGroup" ); + d->suppressGenericNames = config.readListEntry( "X-TDE-SuppressGenericNames" ); + d->sortOrder = config.readListEntry("SortOrder"); + + // Fill in defaults. + if (m_strCaption.isEmpty()) + { + m_strCaption = _relpath; + if (m_strCaption.right(1) == "/") + m_strCaption = m_strCaption.left(m_strCaption.length()-1); + int i = m_strCaption.findRev('/'); + if (i > 0) + m_strCaption = m_strCaption.mid(i+1); + } + if (m_strIcon.isEmpty()) + m_strIcon = "folder"; +} + +KServiceGroup::KServiceGroup( TQDataStream& _str, int offset, bool deep ) : + KSycocaEntry( _str, offset ) +{ + d = new KServiceGroup::Private; + m_bDeep = deep; + load( _str ); +} + +KServiceGroup::~KServiceGroup() +{ + delete d; +} + +int KServiceGroup::childCount() +{ + if (m_childCount == -1) + { + TDEConfig global("kdeglobals"); + global.setGroup("KDE"); + bool showUnimportant = global.readBoolEntry("showUnimportant", true); + + 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()) + if ( showUnimportant || !service->SuSEunimportant() ) + m_childCount++; + } + else if (p->isType(KST_KServiceGroup)) + { + KServiceGroup *serviceGroup = static_cast<KServiceGroup *>(p); + m_childCount += serviceGroup->childCount(); + } + } + } + return m_childCount; +} + + +bool KServiceGroup::showInlineHeader() const +{ + return d->m_bShowInlineHeader; +} + +bool KServiceGroup::showEmptyMenu() const +{ + return d->m_bShowEmptyMenu; +} + +bool KServiceGroup::inlineAlias() const +{ + return d->m_bInlineAlias; +} + +void KServiceGroup::setInlineAlias(bool _b) +{ + d->m_bInlineAlias = _b; +} + +void KServiceGroup::setShowEmptyMenu(bool _b) +{ + d->m_bShowEmptyMenu=_b; +} + +void KServiceGroup::setShowInlineHeader(bool _b) +{ + d->m_bShowInlineHeader=_b; +} + +int KServiceGroup::inlineValue() const +{ + return d->m_inlineValue; +} + +void KServiceGroup::setInlineValue(int _val) +{ + d->m_inlineValue = _val; +} + +bool KServiceGroup::allowInline() const +{ + return d->m_bAllowInline; +} + +void KServiceGroup::setAllowInline(bool _b) +{ + d->m_bAllowInline = _b; +} + +bool KServiceGroup::noDisplay() const +{ + return d->m_bNoDisplay || m_strCaption.startsWith("."); +} + +TQStringList KServiceGroup::suppressGenericNames() const +{ + return d->suppressGenericNames; +} + +bool KServiceGroup::SuSEgeneralDescription() const +{ + return d->m_bGeneralDescription; +} + +bool KServiceGroup::SuSEshortMenu() const +{ + return d->m_bShortMenu; +} + +void KServiceGroup::load( TQDataStream& s ) +{ + TQStringList groupList; + TQ_INT8 noDisplay; + TQ_INT8 _showEmptyMenu; + TQ_INT8 inlineHeader; + TQ_INT8 _inlineAlias; + TQ_INT8 _allowInline; + s >> m_strCaption >> m_strIcon >> + m_strComment >> groupList >> m_strBaseGroupName >> m_childCount >> + noDisplay >> d->suppressGenericNames >> d->directoryEntryPath >> + d->sortOrder >> _showEmptyMenu >> inlineHeader >> _inlineAlias >> + _allowInline >> d->m_bShortMenu >> d->m_bGeneralDescription; + + d->m_bNoDisplay = (noDisplay != 0); + d->m_bShowEmptyMenu = ( _showEmptyMenu != 0 ); + d->m_bShowInlineHeader = ( inlineHeader != 0 ); + d->m_bInlineAlias = ( _inlineAlias != 0 ); + d->m_bAllowInline = ( _allowInline != 0 ); + + if (m_bDeep) + { + for(TQStringList::ConstIterator it = groupList.begin(); + it != groupList.end(); it++) + { + TQString path = *it; + if (path[path.length()-1] == '/') + { + KServiceGroup *serviceGroup; + serviceGroup = KServiceGroupFactory::self()->findGroupByDesktopPath(path, false); + if (serviceGroup) + m_serviceList.append( SPtr(serviceGroup) ); + } + else + { + KService *service; + service = KServiceFactory::self()->findServiceByDesktopPath(path); + if (service) + m_serviceList.append( SPtr(service) ); + } + } + } +} + +void KServiceGroup::addEntry( KSycocaEntry *entry) +{ + m_serviceList.append(entry); +} + +void KServiceGroup::save( TQDataStream& s ) +{ + KSycocaEntry::save( s ); + + TQStringList 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(); + + TQ_INT8 noDisplay = d->m_bNoDisplay ? 1 : 0; + TQ_INT8 _showEmptyMenu = d->m_bShowEmptyMenu ? 1 : 0; + TQ_INT8 inlineHeader = d->m_bShowInlineHeader ? 1 : 0; + TQ_INT8 _inlineAlias = d->m_bInlineAlias ? 1 : 0; + TQ_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 << + d->m_bShortMenu << d->m_bGeneralDescription; +} + +KServiceGroup::List +KServiceGroup::entries(bool sort) +{ + return entries(sort, true); +} + +KServiceGroup::List +KServiceGroup::entries(bool sort, bool excludeNoDisplay) +{ + return entries(sort, excludeNoDisplay, false); +} + +static void addItem(KServiceGroup::List &sorted, const KSycocaEntry::Ptr &p, bool &addSeparator) +{ + if (addSeparator && !sorted.isEmpty()) + sorted.append(new KServiceSeparator()); + sorted.append(p); + addSeparator = false; +} + +KServiceGroup::List +KServiceGroup::entries(bool sort, bool excludeNoDisplay, bool allowSeparators, bool sortByGenericName) +{ + return SuSEentries(sort, excludeNoDisplay, allowSeparators, sortByGenericName); +} + +KServiceGroup::List +KServiceGroup::SuSEentries(bool sort, bool excludeNoDisplay, bool allowSeparators, bool sortByGenericName, bool excludeSuSEunimportant) +{ + 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,TQCString> slist; + KSortableValueList<SPtr,TQCString> glist; + for (List::ConstIterator it(group->m_serviceList.begin()); it != group->m_serviceList.end(); ++it) + { + KSycocaEntry *p = (*it); +// if( !p->isType(KST_KServiceGroup) && !p->isType(KST_KService)) +// continue; + bool noDisplay = p->isType(KST_KServiceGroup) ? + static_cast<KServiceGroup *>(p)->noDisplay() : + static_cast<KService *>(p)->noDisplay(); + if (excludeNoDisplay && noDisplay) + continue; + bool SuSEunimportant = p->isType(KST_KService) && + static_cast<KService *>(p)->SuSEunimportant(); + if (excludeSuSEunimportant && SuSEunimportant) + continue; + + // Choose the right list + KSortableValueList<SPtr,TQCString> & list = p->isType(KST_KServiceGroup) ? glist : slist; + TQString 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(); + + TQCString 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)); + } + + return group->SuSEsortEntries( slist, glist, excludeNoDisplay, allowSeparators ); +} + +KServiceGroup::List +KServiceGroup::SuSEsortEntries( KSortableValueList<SPtr,TQCString> slist, KSortableValueList<SPtr,TQCString> glist, bool excludeNoDisplay, bool allowSeparators ) +{ + KServiceGroup *group = this; + + // Now sort + slist.sort(); + glist.sort(); + + if (d->sortOrder.isEmpty()) + { + d->sortOrder << ":M"; + d->sortOrder << ":F"; + d->sortOrder << ":OIH IL[4]"; //just inline header + } + + TQString rp = relPath(); + if(rp == "/") rp = TQString::null; + + // Iterate through the sort spec list. + // If an entry gets mentioned explicitly, we remove it from the sorted list + for (TQStringList::ConstIterator it(d->sortOrder.begin()); it != d->sortOrder.end(); ++it) + { + const TQString &item = *it; + if (item.isEmpty()) continue; + if (item[0] == '/') + { + TQString groupPath = rp + item.mid(1) + "/"; + // Remove entry from sorted list of services. + for(KSortableValueList<SPtr,TQCString>::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,TQCString>::Iterator it2 = slist.begin(); it2 != slist.end(); ++it2) + { + if (!(*it2).value()->isType(KST_KService)) + continue; + 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 (TQStringList::ConstIterator it(d->sortOrder.begin()); it != d->sortOrder.end(); ++it) + { + const TQString &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: + TQString tmp( item ); + tmp = tmp.remove(":O"); + TQStringList optionAttribute = TQStringList::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 ( TQStringList::Iterator it3 = optionAttribute.begin(); it3 != optionAttribute.end(); ++it3 ) + { + parseAttribute( *it3, showEmptyMenu, showInline, showInlineHeader, showInlineAlias, inlineValue ); + } + for(KSortableValueList<SPtr,TQCString>::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,TQCString>::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,TQCString>::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,TQCString>::Iterator it_s = slist.begin(); + KSortableValueList<SPtr,TQCString>::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] == '/') + { + TQString 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 TQString &nextItem = *( ++it ); + if ( nextItem.startsWith( ":O" ) ) + { + TQString tmp( nextItem ); + tmp = tmp.remove(":O"); + TQStringList optionAttribute = TQStringList::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 ( TQStringList::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; +} + +void KServiceGroup::parseAttribute( const TQString &item , bool &showEmptyMenu, bool &showInline, bool &showInlineHeader, bool & showInlineAlias , int &inlineValue ) +{ + if( item == "ME") //menu empty + showEmptyMenu=true; + else if ( item == "NME") //not menu empty + showEmptyMenu=false; + else if( item == "I") //inline menu ! + showInline = true; + else if ( item == "NI") //not inline menu! + showInline = false; + else if( item == "IH") //inline header! + showInlineHeader= true; + else if ( item == "NIH") //not inline header! + showInlineHeader = false; + else if( item == "IA") //inline alias! + showInlineAlias = true; + else if ( item == "NIA") //not inline alias! + showInlineAlias = false; + else if( ( item ).contains( "IL" )) //inline limite! + { + TQString tmp( item ); + tmp = tmp.remove( "IL[" ); + tmp = tmp.remove( "]" ); + bool ok; + int _inlineValue = tmp.toInt(&ok); + if ( !ok ) //error + _inlineValue = -1; + inlineValue = _inlineValue; + } + else + kdDebug()<<" This attribute is not supported :"<<item<<endl; +} + +void KServiceGroup::setLayoutInfo(const TQStringList &layout) +{ + d->sortOrder = layout; +} + +TQStringList KServiceGroup::layoutInfo() const +{ + return d->sortOrder; +} + +KServiceGroup::Ptr +KServiceGroup::baseGroup( const TQString & _baseGroupName ) +{ + return KServiceGroupFactory::self()->findBaseGroup(_baseGroupName, true); +} + +KServiceGroup::Ptr +KServiceGroup::root() +{ + return KServiceGroupFactory::self()->findGroupByDesktopPath("/", true); +} + +KServiceGroup::Ptr +KServiceGroup::group(const TQString &relPath) +{ + if (relPath.isEmpty()) return root(); + return KServiceGroupFactory::self()->findGroupByDesktopPath(relPath, true); +} + +KServiceGroup::Ptr +KServiceGroup::childGroup(const TQString &parent) +{ + return KServiceGroupFactory::self()->findGroupByDesktopPath("#parent#"+parent, true); +} + +TQString +KServiceGroup::directoryEntryPath() const +{ + return d->directoryEntryPath; +} + + +void KServiceGroup::virtual_hook( int id, void* data ) +{ KSycocaEntry::virtual_hook( id, data ); } + + +KServiceSeparator::KServiceSeparator( ) + : KSycocaEntry("separator") +{ +} |