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

akonadi/contact

  • sources
  • kde-4.14
  • kdepimlibs
  • 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 
44 PhoneTypeCombo::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 
61 PhoneTypeCombo::~PhoneTypeCombo()
62 {
63 }
64 
65 void 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 
75 KABC::PhoneNumber::Type PhoneTypeCombo::type() const
76 {
77  return mType;
78 }
79 
80 void 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 
95 void 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 
105 void 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 
120 PhoneNumberWidget::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 
140 void 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 
151 KABC::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 
161 void PhoneNumberWidget::setReadOnly(bool readOnly)
162 {
163  mTypeCombo->setEnabled(!readOnly);
164  mNumberEdit->setReadOnly(readOnly);
165 }
166 
167 PhoneNumberListWidget::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 
179 PhoneNumberListWidget::~PhoneNumberListWidget()
180 {
181 }
182 
183 void PhoneNumberListWidget::setReadOnly(bool readOnly)
184 {
185  mReadOnly = readOnly;
186 
187  foreach (PhoneNumberWidget *const widget, mWidgets) {
188  widget->setReadOnly(readOnly);
189  }
190 }
191 
192 int PhoneNumberListWidget::phoneNumberCount() const
193 {
194  return mPhoneNumberList.count();
195 }
196 
197 void 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 
216 KABC::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 
230 void PhoneNumberListWidget::add()
231 {
232  mPhoneNumberList.append(KABC::PhoneNumber());
233 
234  recreateNumberWidgets();
235 }
236 
237 void PhoneNumberListWidget::remove()
238 {
239  mPhoneNumberList.removeLast();
240 
241  recreateNumberWidgets();
242 }
243 
244 void 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 
271 void PhoneNumberListWidget::changed(int pos)
272 {
273  mPhoneNumberList[pos] = mWidgets.at(pos)->number();
274 }
275 
276 PhoneEditWidget::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 
308 PhoneEditWidget::~PhoneEditWidget()
309 {
310 }
311 
312 void 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 
321 void PhoneEditWidget::changed()
322 {
323  mRemoveButton->setEnabled(!mReadOnly && mPhoneNumberListWidget->phoneNumberCount() > 3);
324 }
325 
326 void PhoneEditWidget::loadContact(const KABC::Addressee &contact)
327 {
328  mPhoneNumberListWidget->setPhoneNumbers(contact.phoneNumbers());
329  changed();
330 }
331 
332 void 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
347 PhoneTypeDialog::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 
396 KABC::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 }
QWidget::layout
QLayout * layout() const
QList::clear
void clear()
PhoneTypeDialog::PhoneTypeDialog
PhoneTypeDialog(KABC::PhoneNumber::Type type, QWidget *parent=0)
Creates a new phone type dialog.
Definition: phoneeditwidget.cpp:347
QWidget
PhoneNumberListWidget::~PhoneNumberListWidget
~PhoneNumberListWidget()
Destroys the phone number list widget.
Definition: phoneeditwidget.cpp:179
PhoneNumberWidget::number
KABC::PhoneNumber number() const
Returns the phone number of the widget.
Definition: phoneeditwidget.cpp:151
QScrollBar::sizeHint
virtual QSize sizeHint() const
QScrollArea::setWidget
void setWidget(QWidget *widget)
PhoneNumberWidget
A widget that provides selectors for the type and number of a phone number entry. ...
Definition: phoneeditwidget.h:85
PhoneNumberListWidget::setReadOnly
void setReadOnly(bool readOnly)
Sets the widget to readOnly mode.
Definition: phoneeditwidget.cpp:183
QPushButton::sizeHint
virtual QSize sizeHint() const
QGridLayout::addWidget
void addWidget(QWidget *widget, int row, int column, QFlags< Qt::AlignmentFlag > alignment)
PhoneNumberWidget::setReadOnly
void setReadOnly(bool readOnly)
Sets the widget to readOnly mode.
Definition: phoneeditwidget.cpp:161
QButtonGroup::addButton
void addButton(QAbstractButton *button)
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
QList::at
const T & at(int i) const
QHBoxLayout
QGridLayout
QFontMetrics
PhoneEditWidget::setReadOnly
void setReadOnly(bool readOnly)
Sets the widget to readOnly mode.
Definition: phoneeditwidget.cpp:312
QObject::disconnect
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
PhoneTypeDialog
A dialog for editing phone number types.
Definition: phoneeditwidget.h:238
PhoneEditWidget::storeContact
void storeContact(KABC::Addressee &contact) const
Stores the data from the widget to the contact.
Definition: phoneeditwidget.cpp:332
QGridLayout::setSpacing
void setSpacing(int spacing)
QButtonGroup
QList::indexOf
int indexOf(const T &value, int from) const
PhoneNumberListWidget::phoneNumberCount
int phoneNumberCount() const
Returns the number of phone numbers available.
Definition: phoneeditwidget.cpp:192
QLayout::removeWidget
void removeWidget(QWidget *widget)
QSignalMapper::setMapping
void setMapping(QObject *sender, int id)
QWidget::setEnabled
void setEnabled(bool)
QBoxLayout::addWidget
void addWidget(QWidget *widget, int stretch, QFlags< Qt::AlignmentFlag > alignment)
QList::count
int count(const T &value) const
QList::append
void append(const T &value)
QGroupBox
PhoneTypeCombo
A combobox to select a phone number type.
Definition: phoneeditwidget.h:42
QCheckBox
QButtonGroup::setExclusive
void setExclusive(bool)
PhoneTypeCombo::~PhoneTypeCombo
~PhoneTypeCombo()
Destroys the phone type combo.
Definition: phoneeditwidget.cpp:61
QWidget::pos
QPoint pos() const
QVBoxLayout
QString
QtConcurrent::map
QFuture< void > map(Sequence &sequence, MapFunction function)
QLayout::setMargin
void setMargin(int margin)
PhoneEditWidget::PhoneEditWidget
PhoneEditWidget(QWidget *parent=0)
Creates a new phone edit widget.
Definition: phoneeditwidget.cpp:276
AutoQPointer
A QPointer which when destructed, deletes the object it points to.
Definition: autoqpointer_p.h:34
QWidget::font
const QFont & font() const
PhoneEditWidget::loadContact
void loadContact(const KABC::Addressee &contact)
Loads the data from contact to the widget.
Definition: phoneeditwidget.cpp:326
QScrollArea::setWidgetResizable
void setWidgetResizable(bool resizable)
QFontMetrics::width
int width(const QString &text, int len) const
PhoneNumberListWidget::phoneNumbers
KABC::PhoneNumber::List phoneNumbers() const
Returns the list of phone numbers.
Definition: phoneeditwidget.cpp:216
QList::contains
bool contains(const T &value) const
QWidget::sizeHint
sizeHint
PhoneTypeDialog::type
KABC::PhoneNumber::Type type() const
Returns the selected type.
Definition: phoneeditwidget.cpp:396
PhoneTypeCombo::PhoneTypeCombo
PhoneTypeCombo(QWidget *parent=0)
Creates a phone type combo.
Definition: phoneeditwidget.cpp:44
QWidget::setMaximumSize
void setMaximumSize(const QSize &)
PhoneTypeCombo::setType
void setType(KABC::PhoneNumber::Type type)
Sets the phone number type that shall be selected.
Definition: phoneeditwidget.cpp:65
QAbstractButton::setChecked
void setChecked(bool)
PhoneNumberWidget::setNumber
void setNumber(const KABC::PhoneNumber &number)
Sets the phone number of the widget.
Definition: phoneeditwidget.cpp:140
PhoneNumberListWidget::add
void add()
Adds a new phone number widget to this widget.
Definition: phoneeditwidget.cpp:230
QButtonGroup::buttons
QList< QAbstractButton * > buttons() const
QLatin1String
QList::insert
void insert(int i, const T &value)
PhoneNumberWidget::PhoneNumberWidget
PhoneNumberWidget(QWidget *parent=0)
Creates a new phone number widget.
Definition: phoneeditwidget.cpp:120
PhoneNumberListWidget::setPhoneNumbers
void setPhoneNumbers(const KABC::PhoneNumber::List &list)
Sets the list of phone numbers the widget shall show.
Definition: phoneeditwidget.cpp:197
QSize::height
int height() const
PhoneTypeCombo::type
KABC::PhoneNumber::Type type() const
Returns the selected phone number type.
Definition: phoneeditwidget.cpp:75
PhoneEditWidget::~PhoneEditWidget
~PhoneEditWidget()
Destroys the phone edit widget.
Definition: phoneeditwidget.cpp:308
QWidget::setMinimumHeight
void setMinimumHeight(int minh)
QAbstractScrollArea::horizontalScrollBar
QScrollBar * horizontalScrollBar() const
QPushButton
PhoneNumberListWidget
A widgets that groups together a list of PhoneNumberWidgets.
Definition: phoneeditwidget.h:124
QWidget::show
void show()
QScrollArea
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QSignalMapper
QBoxLayout::setSpacing
void setSpacing(int spacing)
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:38:19 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

akonadi/contact

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

kdepimlibs API Reference

Skip menu "kdepimlibs 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

Search



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