--- kdebase-3.4.0/kicker/ui/service_mnu.h.support_complet_xdg_menu 2005-04-08 12:02:39.000000000 -0400 +++ kdebase-3.4.0/kicker/ui/service_mnu.h 2005-04-12 05:30:07.366246258 -0400 @@ -29,7 +29,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE #include <ksycocaentry.h> #include <kservice.h> #include <kpanelmenu.h> - +#include <kservicegroup.h> /** * PanelServiceMenu is filled with KDE services and service groups. The sycoca * database is queried and the hierarchical structure built by creating child @@ -49,7 +49,7 @@ class KDE_EXPORT PanelServiceMenu : publ public: PanelServiceMenu(const QString & label, const QString & relPath, - QWidget* parent = 0, const char* name = 0, bool addmenumode = false); + QWidget* parent = 0, const char* name = 0, bool addmenumode = false,const QString &insertInlineHeader = QString::null); virtual ~PanelServiceMenu(); @@ -65,7 +65,8 @@ public: void selectFirstItem(); private: - void insertMenuItem(KService::Ptr & s, int nId, int nIndex = -1, const QStringList *suppressGenericNames=0); + void insertMenuItem(KService::Ptr & s, int nId, int nIndex = -1, const QStringList *suppressGenericNames=0, const QString &aliasname = QString::null); + void fillMenu( KServiceGroup::Ptr &_root, KServiceGroup::List &_list, const QString &_relPath, int & id ); protected slots: virtual void initialize(); @@ -79,7 +80,7 @@ protected slots: protected: virtual PanelServiceMenu * newSubMenu(const QString & label, const QString & relPath, - QWidget * parent, const char * name); + QWidget * parent, const char * name, const QString & _inlineHeader=QString::null); virtual void mousePressEvent(QMouseEvent *); virtual void mouseReleaseEvent(QMouseEvent *); @@ -97,7 +98,7 @@ protected: bool loaded_; bool excludeNoDisplay_; - + QString insertInlineHeader_; QPopupMenu * opPopup_; bool clearOnClose_; bool addmenumode_; --- kdebase-3.4.0/kicker/ui/service_mnu.cpp.support_complet_xdg_menu 2005-04-08 12:02:39.000000000 -0400 +++ kdebase-3.4.0/kicker/ui/service_mnu.cpp 2005-04-12 06:58:06.509220576 -0400 @@ -61,10 +61,11 @@ const int kRecentMenusOffset = 1001; static RecentlyLaunchedApps s_RecentApps; PanelServiceMenu::PanelServiceMenu(const QString & label, const QString & relPath, QWidget * parent, - const char * name, bool addmenumode) + const char * name, bool addmenumode,const QString &insertInlineHeader) : KPanelMenu(label, parent, name), relPath_(relPath), clearOnClose_(false), + insertInlineHeader_( insertInlineHeader ), addmenumode_(addmenumode), popupMenu_(0) { @@ -266,11 +267,25 @@ void PanelServiceMenu::doInitialize() id++; } } + if ( !insertInlineHeader_.isEmpty() ) + { + int mid = insertItem(new PopupMenuTitle(insertInlineHeader_, font()), -1, 0); + setItemEnabled( mid, false ); + } + fillMenu( root, list, relPath_, id ); - QStringList suppressGenericNames = root->suppressGenericNames(); - KServiceGroup::List::ConstIterator it = list.begin(); - for (; it != list.end(); ++it) { +} + +void PanelServiceMenu::fillMenu(KServiceGroup::Ptr& _root, + KServiceGroup::List& _list, + const QString& /* _relPath */, + int& id) +{ + QStringList suppressGenericNames = _root->suppressGenericNames(); + + KServiceGroup::List::ConstIterator it = _list.begin(); + for (; it != _list.end(); ++it) { KSycocaEntry * e = *it; @@ -279,35 +294,72 @@ void PanelServiceMenu::doInitialize() KServiceGroup::Ptr g(static_cast<KServiceGroup *>(e)); QString groupCaption = g->caption(); - // Avoid adding empty groups. + // Avoid adding empty groups. KServiceGroup::Ptr subMenuRoot = KServiceGroup::group(g->relPath()); - if (subMenuRoot->childCount() == 0) - continue; - // Ignore dotfiles. - if ((g->name().at(0) == '.')) + int nbChildCount = subMenuRoot->childCount(); + if ( nbChildCount == 0 && !g->showEmptyMenu()) continue; - + groupCaption.replace("&", "&&"); + QString inlineHeaderName = g->showInlineHeader() ? groupCaption : ""; // Item names may contain ampersands. To avoid them being converted // to accelerators, replace them with two ampersands. groupCaption.replace("&", "&&"); + if ( nbChildCount == 1 && g->allowInline() && g->inlineAlias()) + { + KServiceGroup::Ptr element = KServiceGroup::group(g->relPath()); + if ( element ) + { + //just one element + KServiceGroup::List listElement = element->entries(true, excludeNoDisplay_, true, KickerSettings::detailedMenuEntries() &&!KickerSettings::detailedEntriesNamesFirst()); + KSycocaEntry * e1 = *( listElement.begin() ); + if ( e1->isType( KST_KService ) ) + { + KService::Ptr s(static_cast<KService *>(e1)); + insertMenuItem(s, id++, -1, &suppressGenericNames,g->caption()); + continue; + } + } + } + if ( g->allowInline() && ( ( nbChildCount <= g->inlineValue() ) || ( g->inlineValue()==0 ) )) + { + //inline all entries + KServiceGroup::Ptr rootElement = KServiceGroup::group(g->relPath()); + + if (!rootElement || !rootElement->isValid()) + break; + + KServiceGroup::List listElement = rootElement->entries(true, excludeNoDisplay_, true, KickerSettings::detailedMenuEntries() &&!KickerSettings::detailedEntriesNamesFirst()); + + if ( !g->inlineAlias() && !inlineHeaderName.isEmpty() ) + { + int mid = insertItem(new PopupMenuTitle(inlineHeaderName, font()), id + 1, id++); + setItemEnabled( mid, false ); + } + + fillMenu( rootElement, listElement, g->relPath(), id ); + continue; + } + // Ignore dotfiles. + if ((g->name().at(0) == '.')) + continue; PanelServiceMenu * m = - newSubMenu(g->name(), g->relPath(), this, g->name().utf8()); + newSubMenu(g->name(), g->relPath(), this, g->name().utf8(), inlineHeaderName); m->setCaption( groupCaption ); QIconSet iconset; if (KickerSettings::menuEntryHeight() > 0) { - iconset = KGlobal::instance()->iconLoader()->loadIconSet( + iconset = KGlobal::iconLoader()->loadIconSet( g->icon(), KIcon::NoGroup, KickerSettings::menuEntryHeight()); } else if (KickerSettings::menuEntryHeight() == 0) { - QPixmap normal = KGlobal::instance()->iconLoader()->loadIcon( + QPixmap normal = KGlobal::iconLoader()->loadIcon( g->icon(), KIcon::Small, 0, @@ -315,7 +367,7 @@ void PanelServiceMenu::doInitialize() 0L, true); - QPixmap active = KGlobal::instance()->iconLoader()->loadIcon( + QPixmap active = KGlobal::iconLoader()->loadIcon( g->icon(), KIcon::Small, 0, @@ -359,8 +411,10 @@ void PanelServiceMenu::doInitialize() if (KGlobalSettings::insertTearOffHandle()) insertTearOffHandle(); #endif + } + void PanelServiceMenu::configChanged() { s_RecentApps.m_bNeedToUpdate = false; @@ -368,9 +422,9 @@ void PanelServiceMenu::configChanged() deinitialize(); } -void PanelServiceMenu::insertMenuItem(KService::Ptr & s, int nId, int nIndex/*= -1*/, const QStringList *suppressGenericNames /* = 0 */) +void PanelServiceMenu::insertMenuItem(KService::Ptr & s, int nId, int nIndex/*= -1*/, const QStringList *suppressGenericNames /* = 0 */, const QString & aliasname) { - QString serviceName = s->name(); + QString serviceName = aliasname.isEmpty() ? s->name():aliasname; // add comment if (KickerSettings::detailedMenuEntries()) { QString comment = s->genericName(); @@ -777,9 +831,9 @@ void PanelServiceMenu::slotDragObjectDes } PanelServiceMenu *PanelServiceMenu::newSubMenu(const QString & label, const QString & relPath, - QWidget * parent, const char * name) + QWidget * parent, const char * name, const QString& _inlineHeader) { - return new PanelServiceMenu(label, relPath, parent, name); + return new PanelServiceMenu(label, relPath, parent, name, false,_inlineHeader); } void PanelServiceMenu::slotClearOnClose()