• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdepimlibs-4.14.10 API Reference
  • KDE Home
  • Contact Us
 

akonadi

  • akonadi
  • contact
  • editor
phoneeditwidget.cpp
1/*
2 This file is part of Akonadi Contact.
3
4 Copyright (c) 2009 Tobias Koenig <tokoe@kde.org>
5
6 This library is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Library General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or (at your
9 option) any later version.
10
11 This library is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
14 License for more details.
15
16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301, USA.
20*/
21
22#include "phoneeditwidget.h"
23
24#include "autoqpointer_p.h"
25
26#include <QtCore/QSignalMapper>
27#include <QtCore/QString>
28#include <QButtonGroup>
29#include <QCheckBox>
30#include <QGridLayout>
31#include <QGroupBox>
32#include <QHBoxLayout>
33#include <QPushButton>
34#include <QScrollArea>
35#include <QScrollBar>
36#include <QVBoxLayout>
37
38#include <kabc/phonenumber.h>
39#include <kcombobox.h>
40#include <kdebug.h>
41#include <klineedit.h>
42#include <klocalizedstring.h>
43
44PhoneTypeCombo::PhoneTypeCombo(QWidget *parent)
45 : KComboBox(parent)
46 , mType(KABC::PhoneNumber::Home)
47 , mLastSelected(0)
48{
49 for (int i = 0; i < KABC::PhoneNumber::typeList().count(); ++i) {
50 mTypeList.append(KABC::PhoneNumber::typeList().at(i));
51 }
52
53 mTypeList.append(-1); // Others...
54
55 update();
56
57 connect(this, SIGNAL(activated(int)),
58 this, SLOT(selected(int)));
59}
60
61PhoneTypeCombo::~PhoneTypeCombo()
62{
63}
64
65void PhoneTypeCombo::setType(KABC::PhoneNumber::Type type)
66{
67 if (!mTypeList.contains(type)) {
68 mTypeList.insert(mTypeList.at(mTypeList.count() - 1), type);
69 }
70
71 mType = type;
72 update();
73}
74
75KABC::PhoneNumber::Type PhoneTypeCombo::type() const
76{
77 return mType;
78}
79
80void PhoneTypeCombo::update()
81{
82 clear();
83
84 for (int i = 0; i < mTypeList.count(); ++i) {
85 if (mTypeList.at(i) == -1) { // "Other..." entry
86 addItem(i18nc("@item:inlistbox Category of contact info field", "Other..."));
87 } else {
88 addItem(KABC::PhoneNumber::typeLabel(KABC::PhoneNumber::Type(mTypeList.at(i))));
89 }
90 }
91
92 setCurrentIndex(mLastSelected = mTypeList.indexOf(mType));
93}
94
95void PhoneTypeCombo::selected(int pos)
96{
97 if (mTypeList.at(pos) == -1) {
98 otherSelected();
99 } else {
100 mType = KABC::PhoneNumber::Type(mTypeList.at(pos));
101 mLastSelected = pos;
102 }
103}
104
105void PhoneTypeCombo::otherSelected()
106{
107 AutoQPointer<PhoneTypeDialog> dlg = new PhoneTypeDialog(mType, this);
108 if (dlg->exec()) {
109 mType = dlg->type();
110 if (!mTypeList.contains(mType)) {
111 mTypeList.insert(mTypeList.at(mTypeList.count() - 1), mType);
112 }
113 } else {
114 setType(KABC::PhoneNumber::Type(mTypeList.at(mLastSelected)));
115 }
116
117 update();
118}
119
120PhoneNumberWidget::PhoneNumberWidget(QWidget *parent)
121 : QWidget(parent)
122{
123 QHBoxLayout *layout = new QHBoxLayout(this);
124 layout->setSpacing(11);
125 layout->setMargin(0);
126
127 mTypeCombo = new PhoneTypeCombo(this);
128 mNumberEdit = new KLineEdit(this);
129 mNumberEdit->setTrapReturnKey(true);
130 QFontMetrics fm(font());
131 mNumberEdit->setMinimumWidth(fm.width(QLatin1String("MMMMMMMMMM")));
132
133 layout->addWidget(mTypeCombo);
134 layout->addWidget(mNumberEdit);
135
136 connect(mTypeCombo, SIGNAL(activated(int)), SIGNAL(modified()));
137 connect(mNumberEdit, SIGNAL(textChanged(QString)), SIGNAL(modified()));
138}
139
140void PhoneNumberWidget::setNumber(const KABC::PhoneNumber &number)
141{
142 mNumber = number;
143
144 disconnect(mTypeCombo, SIGNAL(activated(int)), this, SIGNAL(modified()));
145 mTypeCombo->setType(number.type());
146 connect(mTypeCombo, SIGNAL(activated(int)), SIGNAL(modified()));
147
148 mNumberEdit->setText(number.number());
149}
150
151KABC::PhoneNumber PhoneNumberWidget::number() const
152{
153 KABC::PhoneNumber number(mNumber);
154
155 number.setType(mTypeCombo->type());
156 number.setNumber(mNumberEdit->text());
157
158 return number;
159}
160
161void PhoneNumberWidget::setReadOnly(bool readOnly)
162{
163 mTypeCombo->setEnabled(!readOnly);
164 mNumberEdit->setReadOnly(readOnly);
165}
166
167PhoneNumberListWidget::PhoneNumberListWidget(QWidget *parent)
168 : QWidget(parent)
169 , mReadOnly(false)
170{
171 mWidgetLayout = new QVBoxLayout(this);
172
173 mMapper = new QSignalMapper(this);
174 connect(mMapper, SIGNAL(mapped(int)), SLOT(changed(int)));
175
176 setPhoneNumbers(KABC::PhoneNumber::List());
177}
178
179PhoneNumberListWidget::~PhoneNumberListWidget()
180{
181}
182
183void PhoneNumberListWidget::setReadOnly(bool readOnly)
184{
185 mReadOnly = readOnly;
186
187 foreach (PhoneNumberWidget *const widget, mWidgets) {
188 widget->setReadOnly(readOnly);
189 }
190}
191
192int PhoneNumberListWidget::phoneNumberCount() const
193{
194 return mPhoneNumberList.count();
195}
196
197void PhoneNumberListWidget::setPhoneNumbers(const KABC::PhoneNumber::List &list)
198{
199 mPhoneNumberList = list;
200
201 KABC::PhoneNumber::TypeList types;
202 types << KABC::PhoneNumber::Home;
203 types << KABC::PhoneNumber::Work;
204 types << KABC::PhoneNumber::Cell;
205
206 // add an empty entry per default
207 if (mPhoneNumberList.count() < 3) {
208 for (int i = mPhoneNumberList.count(); i < 3; ++i) {
209 mPhoneNumberList.append(KABC::PhoneNumber(QString(), types[i]));
210 }
211 }
212
213 recreateNumberWidgets();
214}
215
216KABC::PhoneNumber::List PhoneNumberListWidget::phoneNumbers() const
217{
218 KABC::PhoneNumber::List list;
219
220 KABC::PhoneNumber::List::ConstIterator it;
221 for (it = mPhoneNumberList.constBegin(); it != mPhoneNumberList.constEnd(); ++it) {
222 if (!(*it).number().isEmpty()) {
223 list.append(*it);
224 }
225 }
226
227 return list;
228}
229
230void PhoneNumberListWidget::add()
231{
232 mPhoneNumberList.append(KABC::PhoneNumber());
233
234 recreateNumberWidgets();
235}
236
237void PhoneNumberListWidget::remove()
238{
239 mPhoneNumberList.removeLast();
240
241 recreateNumberWidgets();
242}
243
244void PhoneNumberListWidget::recreateNumberWidgets()
245{
246 foreach (QWidget *const widget, mWidgets) {
247 mWidgetLayout->removeWidget(widget);
248 delete widget;
249 }
250 mWidgets.clear();
251
252 KABC::PhoneNumber::List::ConstIterator it;
253 int counter = 0;
254 for (it = mPhoneNumberList.constBegin(); it != mPhoneNumberList.constEnd(); ++it) {
255 PhoneNumberWidget *wdg = new PhoneNumberWidget(this);
256 wdg->setNumber(*it);
257
258 mMapper->setMapping(wdg, counter);
259 connect(wdg, SIGNAL(modified()), mMapper, SLOT(map()));
260
261 mWidgetLayout->addWidget(wdg);
262 mWidgets.append(wdg);
263 wdg->show();
264
265 ++counter;
266 }
267
268 setReadOnly(mReadOnly);
269}
270
271void PhoneNumberListWidget::changed(int pos)
272{
273 mPhoneNumberList[pos] = mWidgets.at(pos)->number();
274}
275
276PhoneEditWidget::PhoneEditWidget(QWidget *parent)
277 : QWidget(parent)
278 , mReadOnly(false)
279{
280 QGridLayout *layout = new QGridLayout(this);
281 layout->setSpacing(KDialog::spacingHint());
282
283 mListScrollArea = new QScrollArea(this);
284 mPhoneNumberListWidget = new PhoneNumberListWidget;
285 mListScrollArea->setWidget(mPhoneNumberListWidget);
286 mListScrollArea->setWidgetResizable(true);
287
288 // ugly but size policies seem to be messed up dialog (parent) wide
289 const int scrollAreaMinHeight = mPhoneNumberListWidget->sizeHint().height() +
290 mListScrollArea->horizontalScrollBar()->sizeHint().height();
291 mListScrollArea->setMinimumHeight(scrollAreaMinHeight);
292 layout->addWidget(mListScrollArea, 0, 0, 1, 2);
293
294 mAddButton = new QPushButton(i18n("Add"), this);
295 mAddButton->setMaximumSize(mAddButton->sizeHint());
296 layout->addWidget(mAddButton, 1, 0, Qt::AlignRight);
297
298 mRemoveButton = new QPushButton(i18n("Remove"), this);
299 mRemoveButton->setMaximumSize(mRemoveButton->sizeHint());
300 layout->addWidget(mRemoveButton, 1, 1);
301
302 connect(mAddButton, SIGNAL(clicked()), mPhoneNumberListWidget, SLOT(add()));
303 connect(mRemoveButton, SIGNAL(clicked()), mPhoneNumberListWidget, SLOT(remove()));
304 connect(mAddButton, SIGNAL(clicked()), SLOT(changed()));
305 connect(mRemoveButton, SIGNAL(clicked()), SLOT(changed()));
306}
307
308PhoneEditWidget::~PhoneEditWidget()
309{
310}
311
312void PhoneEditWidget::setReadOnly(bool readOnly)
313{
314 mReadOnly = readOnly;
315 mAddButton->setEnabled(!readOnly);
316 mRemoveButton->setEnabled(!readOnly && mPhoneNumberListWidget->phoneNumberCount() > 3);
317
318 mPhoneNumberListWidget->setReadOnly(readOnly);
319}
320
321void PhoneEditWidget::changed()
322{
323 mRemoveButton->setEnabled(!mReadOnly && mPhoneNumberListWidget->phoneNumberCount() > 3);
324}
325
326void PhoneEditWidget::loadContact(const KABC::Addressee &contact)
327{
328 mPhoneNumberListWidget->setPhoneNumbers(contact.phoneNumbers());
329 changed();
330}
331
332void PhoneEditWidget::storeContact(KABC::Addressee &contact) const
333{
334 const KABC::PhoneNumber::List oldNumbers = contact.phoneNumbers();
335 for (int i = 0; i < oldNumbers.count(); ++i) {
336 contact.removePhoneNumber(oldNumbers.at(i));
337 }
338
339 const KABC::PhoneNumber::List newNumbers = mPhoneNumberListWidget->phoneNumbers();
340 for (int i = 0; i < newNumbers.count(); ++i) {
341 contact.insertPhoneNumber(newNumbers.at(i));
342 }
343}
344
346// PhoneTypeDialog
347PhoneTypeDialog::PhoneTypeDialog(KABC::PhoneNumber::Type type, QWidget *parent)
348 : KDialog(parent)
349 , mType(type)
350{
351 setCaption(i18n("Edit Phone Number"));
352 setButtons(Ok | Cancel);
353 setDefaultButton(Ok);
354 showButtonSeparator(true);
355
356 QWidget *page = new QWidget(this);
357 setMainWidget(page);
358
359 QVBoxLayout *layout = new QVBoxLayout(page);
360 layout->setSpacing(spacingHint());
361 layout->setMargin(0);
362
363 mPreferredBox = new QCheckBox(i18n("This is the preferred phone number"), page);
364 layout->addWidget(mPreferredBox);
365
366 QGroupBox *box = new QGroupBox(i18n("Types"), page);
367 layout->addWidget(box);
368
369 QGridLayout *buttonLayout = new QGridLayout(box);
370
371 // fill widgets
372 mTypeList = KABC::PhoneNumber::typeList();
373 mTypeList.removeAll(KABC::PhoneNumber::Pref);
374
375 KABC::PhoneNumber::TypeList::ConstIterator it;
376 mGroup = new QButtonGroup(box);
377 mGroup->setExclusive(false);
378 int row, column, counter;
379 row = column = counter = 0;
380 for (it = mTypeList.constBegin(); it != mTypeList.constEnd(); ++it, ++counter) {
381 QCheckBox *cb = new QCheckBox(KABC::PhoneNumber::typeLabel(*it), box);
382 cb->setChecked(type & mTypeList[counter]);
383 buttonLayout->addWidget(cb, row, column);
384 mGroup->addButton(cb);
385
386 column++;
387 if (column == 5) {
388 column = 0;
389 ++row;
390 }
391 }
392
393 mPreferredBox->setChecked(mType & KABC::PhoneNumber::Pref);
394}
395
396KABC::PhoneNumber::Type PhoneTypeDialog::type() const
397{
398 KABC::PhoneNumber::Type type = 0;
399
400 for (int i = 0; i < mGroup->buttons().count(); ++i) {
401 QCheckBox *box = dynamic_cast<QCheckBox *>(mGroup->buttons().at(i)) ;
402 if (box && box->isChecked()) {
403 type |= mTypeList[i];
404 }
405 }
406
407 if (mPreferredBox->isChecked()) {
408 type = type | KABC::PhoneNumber::Pref;
409 } else {
410 type = type & ~KABC::PhoneNumber::Pref;
411 }
412
413 return type;
414}
AutoQPointer
A QPointer which when destructed, deletes the object it points to.
Definition autoqpointer_p.h:35
PhoneEditWidget::~PhoneEditWidget
~PhoneEditWidget()
Destroys the phone edit widget.
Definition phoneeditwidget.cpp:308
PhoneEditWidget::loadContact
void loadContact(const KABC::Addressee &contact)
Loads the data from contact to the widget.
Definition phoneeditwidget.cpp:326
PhoneEditWidget::setReadOnly
void setReadOnly(bool readOnly)
Sets the widget to readOnly mode.
Definition phoneeditwidget.cpp:312
PhoneEditWidget::PhoneEditWidget
PhoneEditWidget(QWidget *parent=0)
Creates a new phone edit widget.
Definition phoneeditwidget.cpp:276
PhoneEditWidget::storeContact
void storeContact(KABC::Addressee &contact) const
Stores the data from the widget to the contact.
Definition phoneeditwidget.cpp:332
PhoneNumberListWidget
A widgets that groups together a list of PhoneNumberWidgets.
Definition phoneeditwidget.h:125
PhoneNumberListWidget::add
void add()
Adds a new phone number widget to this widget.
Definition phoneeditwidget.cpp:230
PhoneNumberListWidget::phoneNumbers
KABC::PhoneNumber::List phoneNumbers() const
Returns the list of phone numbers.
Definition phoneeditwidget.cpp:216
PhoneNumberListWidget::~PhoneNumberListWidget
~PhoneNumberListWidget()
Destroys the phone number list widget.
Definition phoneeditwidget.cpp:179
PhoneNumberListWidget::setPhoneNumbers
void setPhoneNumbers(const KABC::PhoneNumber::List &list)
Sets the list of phone numbers the widget shall show.
Definition phoneeditwidget.cpp:197
PhoneNumberListWidget::setReadOnly
void setReadOnly(bool readOnly)
Sets the widget to readOnly mode.
Definition phoneeditwidget.cpp:183
PhoneNumberListWidget::remove
void remove()
Removes the last phone number widget from this widget.
Definition phoneeditwidget.cpp:237
PhoneNumberListWidget::PhoneNumberListWidget
PhoneNumberListWidget(QWidget *parent=0)
Creates a new phone number list widget.
Definition phoneeditwidget.cpp:167
PhoneNumberListWidget::phoneNumberCount
int phoneNumberCount() const
Returns the number of phone numbers available.
Definition phoneeditwidget.cpp:192
PhoneNumberWidget
A widget that provides selectors for the type and number of a phone number entry.
Definition phoneeditwidget.h:86
PhoneNumberWidget::number
KABC::PhoneNumber number() const
Returns the phone number of the widget.
Definition phoneeditwidget.cpp:151
PhoneNumberWidget::setReadOnly
void setReadOnly(bool readOnly)
Sets the widget to readOnly mode.
Definition phoneeditwidget.cpp:161
PhoneNumberWidget::setNumber
void setNumber(const KABC::PhoneNumber &number)
Sets the phone number of the widget.
Definition phoneeditwidget.cpp:140
PhoneNumberWidget::PhoneNumberWidget
PhoneNumberWidget(QWidget *parent=0)
Creates a new phone number widget.
Definition phoneeditwidget.cpp:120
PhoneTypeCombo
A combobox to select a phone number type.
Definition phoneeditwidget.h:43
PhoneTypeCombo::PhoneTypeCombo
PhoneTypeCombo(QWidget *parent=0)
Creates a phone type combo.
Definition phoneeditwidget.cpp:44
PhoneTypeCombo::setType
void setType(KABC::PhoneNumber::Type type)
Sets the phone number type that shall be selected.
Definition phoneeditwidget.cpp:65
PhoneTypeCombo::type
KABC::PhoneNumber::Type type() const
Returns the selected phone number type.
Definition phoneeditwidget.cpp:75
PhoneTypeCombo::~PhoneTypeCombo
~PhoneTypeCombo()
Destroys the phone type combo.
Definition phoneeditwidget.cpp:61
PhoneTypeDialog
A dialog for editing phone number types.
Definition phoneeditwidget.h:239
PhoneTypeDialog::type
KABC::PhoneNumber::Type type() const
Returns the selected type.
Definition phoneeditwidget.cpp:396
PhoneTypeDialog::PhoneTypeDialog
PhoneTypeDialog(KABC::PhoneNumber::Type type, QWidget *parent=0)
Creates a new phone type dialog.
Definition phoneeditwidget.cpp:347
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Wed Jan 24 2024 00:00:00 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

akonadi

Skip menu "akonadi"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • Related Pages

kdepimlibs-4.14.10 API Reference

Skip menu "kdepimlibs-4.14.10 API Reference"
  • akonadi
  •   contact
  •   kmime
  •   socialutils
  • kabc
  • kalarmcal
  • kblog
  • kcal
  • kcalcore
  • kcalutils
  • kholidays
  • kimap
  • kioslave
  •   imap4
  •   mbox
  •   nntp
  • kldap
  • kmbox
  • kmime
  • kontactinterface
  • kpimidentities
  • kpimtextedit
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • microblog
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal