File indexing completed on 2024-05-12 05:10:49
0001 /* 0002 SPDX-FileCopyrightText: 2001 Cornelius Schumacher <schumacher@kde.org> 0003 SPDX-FileCopyrightText: 2009 Allen Winter <winter@kde.org> 0004 0005 SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 0008 // TODO: validate hand-entered email addresses 0009 // TODO: don't allow duplicates; at least remove dupes when passing back 0010 // TODO: the list in PublishDialog::addresses() 0011 0012 #include "publishdialog_p.h" 0013 0014 #include <KCalendarCore/Person> 0015 0016 #include <KEmailAddress> 0017 0018 #include <KLocalizedString> 0019 #include <KMessageBox> 0020 0021 #include <QDesktopServices> 0022 #include <QDialogButtonBox> 0023 #include <QPushButton> 0024 #include <QUrl> 0025 0026 using namespace KCalendarCore; 0027 using namespace Akonadi; 0028 0029 PublishDialog::PublishDialog(QWidget *parent) 0030 : QDialog(parent) 0031 , d(new PublishDialogPrivate(this)) 0032 { 0033 setWindowTitle(i18nc("@title:window", "Select Addresses")); 0034 auto layout = new QVBoxLayout(this); 0035 auto widget = new QWidget(this); 0036 widget->setObjectName(QLatin1StringView("PublishFreeBusy")); 0037 d->mUI.setupUi(widget); 0038 layout->addWidget(widget); 0039 d->mUI.mListWidget->setSelectionMode(QAbstractItemView::SingleSelection); 0040 d->mUI.mNameLineEdit->setEnabled(false); 0041 d->mUI.mEmailLineEdit->setEnabled(false); 0042 0043 d->mUI.mNew->setIcon(QIcon::fromTheme(QStringLiteral("list-add"))); 0044 d->mUI.mRemove->setIcon(QIcon::fromTheme(QStringLiteral("list-remove"))); 0045 d->mUI.mRemove->setEnabled(false); 0046 d->mUI.mSelectAddressee->setIcon(QIcon::fromTheme(QStringLiteral("view-pim-contacts"))); 0047 connect(d->mUI.mListWidget, &QListWidget::itemSelectionChanged, d.get(), &PublishDialogPrivate::updateInput); 0048 connect(d->mUI.mNew, &QAbstractButton::clicked, d.get(), &PublishDialogPrivate::addItem); 0049 connect(d->mUI.mRemove, &QAbstractButton::clicked, d.get(), &PublishDialogPrivate::removeItem); 0050 connect(d->mUI.mSelectAddressee, &QAbstractButton::clicked, d.get(), &PublishDialogPrivate::openAddressbook); 0051 connect(d->mUI.mNameLineEdit, &QLineEdit::textChanged, d.get(), &PublishDialogPrivate::updateItem); 0052 connect(d->mUI.mEmailLineEdit, &QLineEdit::textChanged, d.get(), &PublishDialogPrivate::updateItem); 0053 0054 auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Help, this); 0055 QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); 0056 okButton->setDefault(true); 0057 okButton->setShortcut(Qt::CTRL | Qt::Key_Return); 0058 layout->addWidget(buttonBox); 0059 0060 okButton->setToolTip(i18n("Send email to these recipients")); 0061 okButton->setWhatsThis( 0062 i18n("Clicking the <b>Ok</b> button will cause " 0063 "an email to be sent to the recipients you " 0064 "have entered.")); 0065 0066 QPushButton *cancelButton = buttonBox->button(QDialogButtonBox::Cancel); 0067 cancelButton->setToolTip(i18n("Cancel recipient selection and the email")); 0068 cancelButton->setWhatsThis( 0069 i18n("Clicking the <b>Cancel</b> button will " 0070 "cause the email operation to be terminated.")); 0071 0072 QPushButton *helpButton = buttonBox->button(QDialogButtonBox::Help); 0073 helpButton->setWhatsThis( 0074 i18n("Click the <b>Help</b> button to read " 0075 "more information about Group Scheduling.")); 0076 0077 connect(buttonBox, &QDialogButtonBox::accepted, this, &PublishDialog::accept); 0078 connect(buttonBox, &QDialogButtonBox::rejected, this, &PublishDialog::reject); 0079 connect(buttonBox->button(QDialogButtonBox::Help), &QPushButton::clicked, this, &PublishDialog::slotHelp); 0080 } 0081 0082 PublishDialog::~PublishDialog() = default; 0083 0084 void PublishDialog::slotHelp() 0085 { 0086 const QUrl url = QUrl(QStringLiteral("help:/")).resolved(QUrl(QStringLiteral("korganizer/group-scheduling.html"))); 0087 // launch khelpcenter, or a browser for URIs not handled by khelpcenter 0088 QDesktopServices::openUrl(url); 0089 } 0090 0091 void PublishDialog::addAttendee(const Attendee &attendee) 0092 { 0093 d->mUI.mNameLineEdit->setEnabled(true); 0094 d->mUI.mEmailLineEdit->setEnabled(true); 0095 auto item = new QListWidgetItem(d->mUI.mListWidget); 0096 Person person(attendee.name(), attendee.email()); 0097 item->setText(person.fullName()); 0098 d->mUI.mListWidget->addItem(item); 0099 d->mUI.mRemove->setEnabled(!d->mUI.mListWidget->selectedItems().isEmpty()); 0100 } 0101 0102 QString PublishDialog::addresses() const 0103 { 0104 QStringList toList; 0105 const int count = d->mUI.mListWidget->count(); 0106 for (int i = 0; i < count; ++i) { 0107 QListWidgetItem *item = d->mUI.mListWidget->item(i); 0108 if (!item->text().isEmpty()) { 0109 toList << KEmailAddress::extractEmailAddress(KEmailAddress::normalizeAddressesAndEncodeIdn(item->text())); 0110 } 0111 } 0112 0113 return toList.join(QLatin1Char(',')); 0114 } 0115 0116 void PublishDialog::accept() 0117 { 0118 QString badAddress; 0119 const KEmailAddress::EmailParseResult addressOk = KEmailAddress::isValidAddressList(addresses(), badAddress); 0120 if (addressOk != KEmailAddress::AddressOk) { 0121 KMessageBox::error(this, 0122 i18n("Unable to publish the calendar incidence due to an " 0123 "invalid recipients string.\n%1", 0124 emailParseResultToString(addressOk)), 0125 i18nc("@title:window", "Publishing Error")); 0126 } else { 0127 QDialog::accept(); 0128 } 0129 } 0130 0131 #include "moc_publishdialog.cpp"