36 #include <QStyleOption>
37 #include <QVBoxLayout>
41 using namespace KParts;
47 if ((!mime || mime->
isDefault()) && !fileName.isEmpty()) {
53 class KParts::BrowserOpenOrSaveQuestionPrivate :
public KDialog
63 BrowserOpenOrSaveQuestionPrivate(
QWidget* parent,
const KUrl& url,
const QString& mimeType)
64 :
KDialog(parent), url(url), mimeType(mimeType),
70 setCaption(url.host());
71 setButtons(Save | OpenDefault | OpenWith | Cancel);
72 setObjectName(
"questionYesNoCancel");
75 setDefaultButton(Save);
77 QVBoxLayout *mainLayout =
new QVBoxLayout(mainWidget());
79 mainLayout->setMargin(0);
81 QHBoxLayout *hLayout =
new QHBoxLayout();
82 hLayout->setMargin(0);
83 hLayout->setSpacing(-1);
84 mainLayout->addLayout(hLayout, 5);
88 option.initFrom(
this);
89 KIcon icon(
"dialog-information");
90 iconLabel->setPixmap(icon.pixmap(style()->pixelMetric(QStyle::PM_MessageBoxIconSize, &option,
this)));
92 hLayout->addWidget(iconLabel, 0, Qt::AlignCenter);
95 QVBoxLayout* textVLayout =
new QVBoxLayout;
97 textVLayout->addWidget(questionLabel);
99 fileNameLabel =
new QLabel(mainWidget());
100 fileNameLabel->hide();
101 textVLayout->addWidget(fileNameLabel);
104 QString mimeDescription (mimeType);
107 mimeDescription = (mime->comment().isEmpty() ? mime->name() : mime->comment());
109 mimeTypeLabel =
new QLabel(mainWidget());
110 mimeTypeLabel->setText(
i18nc(
"@label Type of file",
"Type: %1", mimeDescription));
111 mimeTypeLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
112 textVLayout->addWidget(mimeTypeLabel);
114 hLayout->addLayout(textVLayout,5);
116 mainLayout->addStretch(15);
117 dontAskAgainCheckBox =
new QCheckBox(mainWidget());
118 dontAskAgainCheckBox->setText(
i18nc(
"@label:checkbox",
"Remember action for files of this type"));
119 mainLayout->addWidget(dontAskAgainCheckBox);
122 bool autoEmbedMimeType(
int flags);
124 int executeDialog(
const QString& dontShowAgainName)
126 KConfigGroup cg(dontAskConfig,
"Notification Messages");
127 const QString dontAsk = cg.readEntry(dontShowAgainName,
QString()).toLower();
128 if (dontAsk ==
"yes" || dontAsk ==
"true") {
130 }
else if (dontAsk ==
"no" || dontAsk ==
"false") {
135 questionLabel->text(),
138 const int result = exec();
140 if (dontAskAgainCheckBox->isChecked()) {
141 cg.writeEntry(dontShowAgainName, result == Save);
149 KGuiItem openItem(
i18nc(
"@label:button",
"&Open with %1", selectedService->name()), selectedService->icon());
150 setButtonGuiItem(OpenWith, openItem);
158 BrowserOpenOrSaveQuestion::Features features;
163 virtual void slotButtonClicked(
int buttonId)
165 if (buttonId != OpenDefault)
168 if (button && !button->menu()) {
173 QCheckBox* dontAskAgainCheckBox;
177 void slotAppSelected(
QAction* action)
187 : d(new BrowserOpenOrSaveQuestionPrivate(parent, url, mimeType))
198 QString actionName(service->name().replace(
'&',
"&&"));
199 actionName =
i18nc(
"@action:inmenu",
"Open &with %1", actionName);
202 act->setIcon(
KIcon(service->icon()));
203 act->setText(actionName);
204 act->setData(QVariant::fromValue(service));
210 d->questionLabel->setText(
i18nc(
"@info",
"Open '%1'?", d->url.pathOrUrl()));
211 d->questionLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
212 d->showButton(BrowserOpenOrSaveQuestionPrivate::OpenWith,
false);
214 KGuiItem openWithDialogItem(
i18nc(
"@label:button",
"&Open with..."),
"document-open");
221 if (apps.isEmpty()) {
222 d->setButtonGuiItem(BrowserOpenOrSaveQuestionPrivate::OpenDefault, openWithDialogItem);
226 d->setButtonGuiItem(BrowserOpenOrSaveQuestionPrivate::OpenDefault, openItem);
229 d->selectedService = apps.first();
230 d->showButton(BrowserOpenOrSaveQuestionPrivate::OpenWith,
true);
232 if (apps.count() > 1) {
234 KGuiItem openWithItem(
i18nc(
"@label:button",
"&Open with"),
"document-open");
235 d->setButtonGuiItem(BrowserOpenOrSaveQuestionPrivate::OpenWith, openWithItem);
237 QObject::connect(menu, SIGNAL(triggered(
QAction*)), d, SLOT(slotAppSelected(
QAction*)));
238 for (KService::List::const_iterator it = apps.begin(); it != apps.end(); ++it) {
240 menu->addAction(act);
243 openWithDialogAction->setIcon(
KIcon(
"document-open"));
244 openWithDialogAction->setText(openWithDialogItem.
text());
245 menu->addAction(openWithDialogAction);
248 d->setButtonGuiItem(BrowserOpenOrSaveQuestionPrivate::OpenWith, openWithDialogItem);
251 kDebug() <<
"Not using new feature ServiceSelection; port the caller to BrowserOpenOrSaveQuestion::setFeature(ServiceSelection)";
257 const QString dontAskAgain = QLatin1String(
"askSave") + d->mimeType;
259 const int choice = d->executeDialog(dontAskAgain);
260 return choice == BrowserOpenOrSaveQuestionPrivate::Save ?
Save
261 : (choice == BrowserOpenOrSaveQuestionPrivate::Cancel ?
Cancel :
Open);
266 return d->selectedService;
269 bool BrowserOpenOrSaveQuestionPrivate::autoEmbedMimeType(
int flags)
285 mime->is(
"text/html") ||
286 mime->is(
"application/xml") ||
287 mime->is(
"inode/directory") ||
288 mimeType.startsWith(QLatin1String(
"image")) ||
289 mime->is(
"multipart/x-mixed-replace") ||
290 mime->is(
"multipart/replace")))
297 if (d->autoEmbedMimeType(flags))
301 d->setButtonGuiItem(BrowserOpenOrSaveQuestionPrivate::OpenDefault,
KGuiItem(
i18nc(
"@label:button",
"&Open"),
"document-open"));
302 d->showButton(BrowserOpenOrSaveQuestionPrivate::OpenWith,
false);
304 d->questionLabel->setText(
i18nc(
"@info",
"Open '%1'?", d->url.pathOrUrl()));
305 d->questionLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
307 const QString dontAskAgain = QLatin1String(
"askEmbedOrSave")+ d->mimeType;
310 const int choice = d->executeDialog(dontAskAgain);
311 return choice == BrowserOpenOrSaveQuestionPrivate::Save ?
Save
312 : (choice == BrowserOpenOrSaveQuestionPrivate::Cancel ?
Cancel :
Embed);
317 d->features = features;
322 if (suggestedFileName.isEmpty()) {
326 d->fileNameLabel->setText(
i18nc(
"@label File name",
"Name: %1", suggestedFileName));
327 d->fileNameLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
328 d->fileNameLabel->setWhatsThis(
i18nc(
"@info:whatsthis",
"This is the file name suggested by the server"));
329 d->fileNameLabel->show();
334 if (mimePtr && mimePtr->
name() != d->mimeType) {
336 d->mimeType = mimePtr->
name();
339 d->mimeTypeLabel->setText(
i18nc(
"@label Type of file",
"Type: %1", mimeDescription));
343 #include "browseropenorsavequestion.moc"