38 #include <QtAlgorithms>
40 #include <QtDBus/QtDBus>
44 if (!cfg.
hasKey(
"X-KDE-AuthorizeAction")) {
48 for(QStringList::ConstIterator it = list.constBegin();
49 it != list.constEnd(); ++it) {
50 if (!KAuthorized::authorize((*it).trimmed())) {
74 if (submenuName.isEmpty()) {
75 if (priority ==
"TopLevel") {
77 }
else if (priority ==
"Important") {
80 }
else if (priority ==
"TopLevel") {
81 return userToplevelSubmenus[submenuName];
82 }
else if (priority ==
"Important") {
83 return userPrioritySubmenus[submenuName];
85 return userSubmenus[submenuName];
96 m_executeServiceActionGroup(static_cast<
QWidget *>(0)),
97 m_runApplicationActionGroup(static_cast<
QWidget *>(0)),
101 this, SLOT(slotExecuteService(
QAction*)));
103 this, SLOT(slotRunApplication(
QAction*)));
117 for (it = submenus.begin(); it != submenus.end(); ++it) {
118 if (it.value().isEmpty()) {
124 actionSubmenu->setTitle(it.key());
125 actionSubmenu->menuAction()->setObjectName(
"services_submenu");
126 menu->addMenu(actionSubmenu);
138 ServiceList::const_iterator it = list.begin();
139 for(; it != list.end(); ++it) {
140 if ((*it).isSeparator()) {
142 if (!actions.isEmpty() && !actions.last()->isSeparator()) {
143 menu->addSeparator();
148 if (isBuiltin || !(*it).noDisplay()) {
151 act->setObjectName(
"menuaction");
153 text.replace(
'&',
"&&");
155 if (!(*it).icon().isEmpty()) {
156 act->setIcon(
KIcon((*it).icon()));
158 act->setData(QVariant::fromValue(*it));
161 menu->addAction(act);
169 void KFileItemActionsPrivate::slotExecuteService(
QAction* act)
172 if (KAuthorized::authorizeKAction(serviceAction.
name())) {
192 d->
m_props = itemListProperties;
196 KFileItemList::const_iterator kit = items.constBegin();
197 const KFileItemList::const_iterator kend = items.constEnd();
198 for (; kit != kend; ++kit) {
207 const KFileItem firstItem = items.first();
209 const bool isLocal = !firstItem.
localPath().isEmpty();
210 const bool isSingleLocal = items.count() == 1 && isLocal;
213 KIO::PopupServices s;
216 if (isSingleLocal && (d->
m_props.
mimeType() ==
"application/x-desktop" ||
241 if (QFile::exists(dotDirectoryFile)) {
261 KService::List::const_iterator eEnd = entries.end();
262 for (KService::List::const_iterator it2 = entries.begin(); it2 != eEnd; ++it2) {
271 if (cfg.
hasKey(
"X-KDE-ShowIfRunning")) {
273 if (QDBusConnection::sessionBus().interface()->isServiceRegistered(app)) {
277 if (cfg.
hasKey(
"X-KDE-ShowIfDBusCall")) {
280 const QString &app = parts.at(0);
281 const QString &obj = parts.at(1);
282 QString interface = parts.at(2);
284 int pos = interface.lastIndexOf(QLatin1Char(
'.'));
286 method = interface.mid(pos + 1);
287 interface.truncate(pos);
293 QDBusMessage reply = QDBusInterface(app, obj, interface).
295 if (reply.arguments().count() < 1 || reply.arguments().at(0).type() != QVariant::Bool || !reply.arguments().at(0).toBool()) {
300 if (cfg.
hasKey(
"X-KDE-Protocol")) {
302 if (theProtocol.startsWith(
'!')) {
303 const QString excludedProtocol = theProtocol.mid(1);
304 if (excludedProtocol == protocol) {
307 }
else if (protocol != theProtocol) {
311 else if (cfg.
hasKey(
"X-KDE-Protocols")) {
313 if (!protocols.contains(protocol)) {
317 else if (protocol ==
"trash") {
324 if (cfg.
hasKey(
"X-KDE-Require")) {
330 if (cfg.
hasKey(
"Actions") || cfg.
hasKey(
"X-KDE-GetActionMenu")) {
337 if (types.isEmpty()) {
344 for (QStringList::ConstIterator it = types.constBegin();
345 it != types.constEnd() && !ok;
349 bool checkTheMimetypes =
false;
350 if (*it ==
"all/all" ||
351 *it ==
"allfiles" ) {
352 checkTheMimetypes =
true;
358 (*it ==
"all/allfiles" || *it ==
"application/octet-stream")) {
359 checkTheMimetypes =
true;
364 (mimeTypePtr && mimeTypePtr->is(*it)) ||
365 (!commonMimeGroup.isEmpty() &&
366 ((*it).right(1) ==
"*" &&
367 (*it).left((*it).indexOf(
'/')) == commonMimeGroup)))) {
368 checkTheMimetypes =
true;
371 if (checkTheMimetypes) {
373 for (QStringList::ConstIterator itex = excludeTypes.constBegin(); itex != excludeTypes.constEnd(); ++itex) {
374 if(((*itex).endsWith(
'*') && (*itex).left((*itex).indexOf(
'/')) == commonMimeGroup) ||
375 ((*itex) == commonMimeType)) {
400 QMenu* actionMenu = mainMenu;
401 int userItemCount = 0;
402 if (s.user.count() + s.userSubmenus.count() +
403 s.userPriority.count() + s.userPrioritySubmenus.count() > 1) {
405 actionMenu =
new KMenu(
i18nc(
"@title:menu",
"&Actions"), mainMenu);
406 actionMenu->menuAction()->setObjectName(
"actions_submenu");
407 mainMenu->addMenu(actionMenu);
411 userItemCount += d->
insertServices(s.userPriority, actionMenu,
false);
414 if (userItemCount > 0 &&
415 (s.user.count() > 0 ||
416 s.userSubmenus.count() > 0 ||
417 s.builtin.count() > 0) &&
418 !actionMenu->actions().last()->isSeparator()) {
419 actionMenu->addSeparator();
425 userItemCount += d->
insertServices(s.userToplevel, mainMenu,
false);
426 return userItemCount;
433 if (!KAuthorized::authorizeKAction(
"openwith") || mimeTypeList.isEmpty()) {
446 for (
int i = 0; i < firstOffers.count(); ++i) {
448 tempRank.
service = firstOffers[i];
450 rankings << tempRank;
451 serviceList << tempRank.service->storageId();
454 for (
int j = 1; j < mimeTypeList.count(); ++j) {
457 for (
int i = 0; i != offers.count(); ++i) {
458 const QString serviceId = offers[i]->storageId();
459 subservice << serviceId;
460 const int idPos = serviceList.indexOf(serviceId);
462 rankings[idPos].score += i;
467 for (
int i = 0; i < serviceList.count(); ++i) {
468 if (!subservice.contains(serviceList[i])) {
469 serviceList.removeAt(i);
470 rankings.removeAt(i);
475 if (rankings.isEmpty()) {
494 return !services.isEmpty() ? services.first() :
KService::Ptr();
499 if (!KAuthorized::authorizeKAction(
"openwith")) {
509 const KFileItem firstItem = items.first();
514 if (!topMenu->actions().isEmpty()) {
515 topMenu->addSeparator();
528 && !serviceIdList.isEmpty()
529 && !(serviceIdList.count()==1 && serviceIdList.first().isEmpty())) {
533 if (serviceIdList.count() == 1) {
535 runActionName =
i18n(
"&Open with %1", app->name());
539 for (
int i = 0; i < offers.count() ; ++i) {
540 if (offers[i]->storageId() == app->
storageId()) {
546 runActionName =
i18n(
"&Open");
549 runAct->setText(runActionName);
553 QObject::connect(runAct, SIGNAL(triggered()), d, SLOT(slotRunPreferredApplications()));
554 topMenu->addAction(runAct);
557 if (!offers.isEmpty()) {
558 QMenu* menu = topMenu;
560 if (offers.count() > 1) {
561 menu =
new QMenu(
i18nc(
"@title:menu",
"&Open With"), topMenu);
562 menu->menuAction()->setObjectName(
"openWith_submenu");
563 topMenu->addMenu(menu);
567 KService::List::ConstIterator it = offers.constBegin();
568 for(; it != offers.constEnd(); it++) {
572 menu->addAction(act);
576 if (menu != topMenu) {
577 menu->addSeparator();
578 openWithActionName =
i18nc(
"@action:inmenu Open With",
"&Other...");
580 openWithActionName =
i18nc(
"@title:menu",
"&Open With...");
584 openWithAct->setText(openWithActionName);
585 openWithAct->setObjectName(
"openwith_browse");
586 QObject::connect(openWithAct, SIGNAL(triggered()), d, SLOT(slotOpenWithDialog()));
587 menu->addAction(openWithAct);
593 act->setText(
i18nc(
"@title:menu",
"&Open With..."));
594 QObject::connect(act, SIGNAL(triggered()), d, SLOT(slotOpenWithDialog()));
595 topMenu->addAction(act);
608 foreach (
const QString serviceId, serviceIdList) {
610 foreach (
const KFileItem& item, fileItems) {
613 if (preferredServiceId == serviceId) {
614 serviceItems << item;
618 if (serviceId.isEmpty()) {
619 openWithByMime(serviceItems);
624 if (servicePtr.
isNull()) {
639 void KFileItemActionsPrivate::openWithByMime(
const KFileItemList& fileItems)
642 foreach (
const QString mimeType, mimeTypeList) {
644 foreach (
const KFileItem& item, fileItems) {
653 void KFileItemActionsPrivate::slotRunApplication(
QAction* act)
663 void KFileItemActionsPrivate::slotOpenWithDialog()
674 if (!mimeTypeList.contains(item.
mimetype()))
683 Q_FOREACH(
const QString& mimeType, mimeTypeList) {
686 serviceIdList << newOffer;
688 serviceIdList.removeDuplicates();
689 return serviceIdList;
694 QString actionName(service->name().replace(
'&',
"&&"));
696 actionName =
i18n(
"Open &with %1", actionName);
698 actionName =
i18nc(
"@item:inmenu Open With, %1 is application name",
"%1", actionName);
702 act->setObjectName(
"openwith");
705 act->setText(actionName);
706 act->setData(QVariant::fromValue(service));
714 if (offers.isEmpty()) {