1 /*
2   SPDX-FileCopyrightText: 2001 Cornelius Schumacher <schumacher@kde.org>
3   SPDX-FileCopyrightText: 2009 Allen Winter <winter@kde.org>
4 
5   SPDX-License-Identifier: LGPL-2.0-or-later
6 */
7 
8 // TODO: validate hand-entered email addresses
9 // TODO: don't allow duplicates; at least remove dupes when passing back
10 // TODO: the list in PublishDialog::addresses()
11 
12 #include "publishdialog_p.h"
13 
14 #include <KCalendarCore/Person>
15 
16 #include <KEmailAddress>
17 
18 #include <KLocalizedString>
19 #include <KMessageBox>
20 
21 #include <QDesktopServices>
22 #include <QDialogButtonBox>
23 #include <QPushButton>
24 #include <QUrl>
25 
26 using namespace KCalendarCore;
27 using namespace Akonadi;
28 
PublishDialog(QWidget * parent)29 PublishDialog::PublishDialog(QWidget *parent)
30     : QDialog(parent)
31     , d(new PublishDialogPrivate(this))
32 {
33     setWindowTitle(i18nc("@title:window", "Select Addresses"));
34     auto layout = new QVBoxLayout(this);
35     auto widget = new QWidget(this);
36     widget->setObjectName(QStringLiteral("PublishFreeBusy"));
37     d->mUI.setupUi(widget);
38     layout->addWidget(widget);
39     d->mUI.mListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
40     d->mUI.mNameLineEdit->setEnabled(false);
41     d->mUI.mEmailLineEdit->setEnabled(false);
42 
43     d->mUI.mNew->setIcon(QIcon::fromTheme(QStringLiteral("list-add")));
44     d->mUI.mRemove->setIcon(QIcon::fromTheme(QStringLiteral("list-remove")));
45     d->mUI.mRemove->setEnabled(false);
46     d->mUI.mSelectAddressee->setIcon(QIcon::fromTheme(QStringLiteral("view-pim-contacts")));
47     connect(d->mUI.mListWidget, &QListWidget::itemSelectionChanged, d.get(), &PublishDialogPrivate::updateInput);
48     connect(d->mUI.mNew, &QAbstractButton::clicked, d.get(), &PublishDialogPrivate::addItem);
49     connect(d->mUI.mRemove, &QAbstractButton::clicked, d.get(), &PublishDialogPrivate::removeItem);
50     connect(d->mUI.mSelectAddressee, &QAbstractButton::clicked, d.get(), &PublishDialogPrivate::openAddressbook);
51     connect(d->mUI.mNameLineEdit, &QLineEdit::textChanged, d.get(), &PublishDialogPrivate::updateItem);
52     connect(d->mUI.mEmailLineEdit, &QLineEdit::textChanged, d.get(), &PublishDialogPrivate::updateItem);
53 
54     auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Help, this);
55     QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok);
56     okButton->setDefault(true);
57     okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
58     layout->addWidget(buttonBox);
59 
60     okButton->setToolTip(i18n("Send email to these recipients"));
61     okButton->setWhatsThis(
62         i18n("Clicking the <b>Ok</b> button will cause "
63              "an email to be sent to the recipients you "
64              "have entered."));
65 
66     QPushButton *cancelButton = buttonBox->button(QDialogButtonBox::Cancel);
67     cancelButton->setToolTip(i18n("Cancel recipient selection and the email"));
68     cancelButton->setWhatsThis(
69         i18n("Clicking the <b>Cancel</b> button will "
70              "cause the email operation to be terminated."));
71 
72     QPushButton *helpButton = buttonBox->button(QDialogButtonBox::Help);
73     helpButton->setWhatsThis(
74         i18n("Click the <b>Help</b> button to read "
75              "more information about Group Scheduling."));
76 
77     connect(buttonBox, &QDialogButtonBox::accepted, this, &PublishDialog::accept);
78     connect(buttonBox, &QDialogButtonBox::rejected, this, &PublishDialog::reject);
79     connect(buttonBox->button(QDialogButtonBox::Help), &QPushButton::clicked, this, &PublishDialog::slotHelp);
80 }
81 
82 PublishDialog::~PublishDialog() = default;
83 
slotHelp()84 void PublishDialog::slotHelp()
85 {
86     const QUrl url = QUrl(QStringLiteral("help:/")).resolved(QUrl(QStringLiteral("korganizer/group-scheduling.html")));
87     // launch khelpcenter, or a browser for URIs not handled by khelpcenter
88     QDesktopServices::openUrl(url);
89 }
90 
addAttendee(const Attendee & attendee)91 void PublishDialog::addAttendee(const Attendee &attendee)
92 {
93     d->mUI.mNameLineEdit->setEnabled(true);
94     d->mUI.mEmailLineEdit->setEnabled(true);
95     auto item = new QListWidgetItem(d->mUI.mListWidget);
96     Person person(attendee.name(), attendee.email());
97     item->setText(person.fullName());
98     d->mUI.mListWidget->addItem(item);
99     d->mUI.mRemove->setEnabled(!d->mUI.mListWidget->selectedItems().isEmpty());
100 }
101 
addresses() const102 QString PublishDialog::addresses() const
103 {
104     QStringList toList;
105     const int count = d->mUI.mListWidget->count();
106     for (int i = 0; i < count; ++i) {
107         QListWidgetItem *item = d->mUI.mListWidget->item(i);
108         if (!item->text().isEmpty()) {
109             toList << item->text();
110         }
111     }
112 
113     return toList.join(QLatin1Char(','));
114 }
115 
accept()116 void PublishDialog::accept()
117 {
118     QString badAddress;
119     const KEmailAddress::EmailParseResult addressOk = KEmailAddress::isValidAddressList(addresses(), badAddress);
120     if (addressOk != KEmailAddress::AddressOk) {
121         KMessageBox::sorry(this,
122                            i18n("Unable to publish the calendar incidence due to an "
123                                 "invalid recipients string. %1",
124                                 emailParseResultToString(addressOk)),
125                            i18n("Publishing Error"));
126     } else {
127         QDialog::accept();
128     }
129 }
130