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

kmail

  • sources
  • kde-4.12
  • kdepim
  • kmail
  • identity
identitypage.cpp
Go to the documentation of this file.
1 /* -*- mode: C++; c-file-style: "gnu" -*-
2  * kmail: KDE mail client
3  * Copyright (C) 2000 Espen Sand, espen@kde.org
4  * Copyright (C) 2001-2003 Marc Mutz, mutz@kde.org
5  * Contains code segments and ideas from earlier kmail dialog code.
6  * Copyright (C) 2010 Volker Krause <vkrause@kde.org>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21  *
22  */
23 
24 #include "identitypage.h"
25 
26 #include "identitydialog.h"
27 #include "newidentitydialog.h"
28 #ifndef KCM_KPIMIDENTITIES_STANDALONE
29 #include "kmkernel.h"
30 #include "settings/globalsettings.h"
31 #endif
32 
33 #include <mailcommon/kernel/mailkernel.h>
34 #include <messageviewer/utils/autoqpointer.h>
35 #include <kpimidentities/identity.h>
36 #include <kpimidentities/identitymanager.h>
37 
38 #include <KDebug>
39 #include <KMessageBox>
40 #include <QMenu>
41 
42 using namespace KMail;
43 
44 QString IdentityPage::helpAnchor() const
45 {
46  return QString::fromLatin1( "configure-identity" );
47 }
48 
49 IdentityPage::IdentityPage( const KComponentData &instance, QWidget *parent )
50  : ConfigModule( instance, parent ),
51  mIdentityDialog( 0 ),
52  mOldNumberOfIdentities( 0 ),
53  mIdentityManager( 0 )
54 {
55  if ( !MailCommon::Kernel::self()->kernelIsRegistered() ) {
56  return;
57  }
58  mIdentityManager = KernelIf->identityManager();
59 
60  mIPage.setupUi( this );
61  mIPage.mIdentityList->setIdentityManager( mIdentityManager );
62 
63  connect( mIPage.mIdentityList, SIGNAL(itemSelectionChanged()),
64  SLOT(slotIdentitySelectionChanged()) );
65  connect( this, SIGNAL(changed(bool)),
66  SLOT(slotIdentitySelectionChanged()) );
67  connect( mIPage.mIdentityList, SIGNAL(rename(KMail::IdentityListViewItem*,QString)),
68  SLOT(slotRenameIdentity(KMail::IdentityListViewItem*,QString)) );
69  connect( mIPage.mIdentityList, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),
70  SLOT(slotModifyIdentity()) );
71  connect( mIPage.mIdentityList, SIGNAL(contextMenu(KMail::IdentityListViewItem*,QPoint)),
72  SLOT(slotContextMenu(KMail::IdentityListViewItem*,QPoint)) );
73  // ### connect dragged(...), ...
74 
75  connect( mIPage.mButtonAdd, SIGNAL(clicked()),
76  this, SLOT(slotNewIdentity()) );
77  connect( mIPage.mModifyButton, SIGNAL(clicked()),
78  this, SLOT(slotModifyIdentity()) );
79  connect( mIPage.mRenameButton, SIGNAL(clicked()),
80  this, SLOT(slotRenameIdentity()) );
81  connect( mIPage.mRemoveButton, SIGNAL(clicked()),
82  this, SLOT(slotRemoveIdentity()) );
83  connect( mIPage.mSetAsDefaultButton, SIGNAL(clicked()),
84  this, SLOT(slotSetAsDefault()) );
85 }
86 
87 IdentityPage::~IdentityPage()
88 {
89 }
90 
91 void IdentityPage::load()
92 {
93  if ( !MailCommon::Kernel::self()->kernelIsRegistered() ) {
94  return;
95  }
96  mOldNumberOfIdentities = mIdentityManager->shadowIdentities().count();
97  // Fill the list:
98  mIPage.mIdentityList->clear();
99  QTreeWidgetItem *item = 0;
100  KPIMIdentities::IdentityManager::Iterator end( mIdentityManager->modifyEnd() );
101 
102  for ( KPIMIdentities::IdentityManager::Iterator it = mIdentityManager->modifyBegin(); it != end; ++it ) {
103  item = new IdentityListViewItem( mIPage.mIdentityList, item, *it );
104  }
105  if ( mIPage.mIdentityList->currentItem() ) {
106  mIPage.mIdentityList->currentItem()->setSelected( true );
107  }
108 }
109 
110 void IdentityPage::save()
111 {
112  if ( !MailCommon::Kernel::self()->kernelIsRegistered() ) {
113  return;
114  }
115  mIdentityManager->sort();
116  mIdentityManager->commit();
117 
118 #ifndef KCM_KPIMIDENTITIES_STANDALONE
119  if( mOldNumberOfIdentities < 2 && mIPage.mIdentityList->topLevelItemCount() > 1 ) {
120  // have more than one identity, so better show the combo in the
121  // composer now:
122  int showHeaders = GlobalSettings::self()->headers();
123  showHeaders |= KMail::Composer::HDR_IDENTITY;
124  GlobalSettings::self()->setHeaders( showHeaders );
125  }
126  // and now the reverse
127  if( mOldNumberOfIdentities > 1 && mIPage.mIdentityList->topLevelItemCount() < 2 ) {
128  // have only one identity, so remove the combo in the composer:
129  int showHeaders = GlobalSettings::self()->headers();
130  showHeaders &= ~KMail::Composer::HDR_IDENTITY;
131  GlobalSettings::self()->setHeaders( showHeaders );
132  }
133 #endif
134 }
135 
136 void IdentityPage::slotNewIdentity()
137 {
138  Q_ASSERT( !mIdentityDialog );
139 
140  MessageViewer::AutoQPointer<NewIdentityDialog> dialog( new NewIdentityDialog(
141  mIdentityManager, this ) );
142  dialog->setObjectName( QLatin1String("new") );
143 
144  if ( dialog->exec() == QDialog::Accepted && dialog ) {
145  QString identityName = dialog->identityName().trimmed();
146  Q_ASSERT( !identityName.isEmpty() );
147 
148  //
149  // Construct a new Identity:
150  //
151  switch ( dialog->duplicateMode() ) {
152  case NewIdentityDialog::ExistingEntry:
153  {
154  KPIMIdentities::Identity &dupThis = mIdentityManager->modifyIdentityForName( dialog->duplicateIdentity() );
155  mIdentityManager->newFromExisting( dupThis, identityName );
156  break;
157  }
158  case NewIdentityDialog::ControlCenter:
159  mIdentityManager->newFromControlCenter( identityName );
160  break;
161  case NewIdentityDialog::Empty:
162  mIdentityManager->newFromScratch( identityName );
163  default: ;
164  }
165 
166  //
167  // Insert into listview:
168  //
169  KPIMIdentities::Identity &newIdent = mIdentityManager->modifyIdentityForName( identityName );
170  QTreeWidgetItem *item = 0;
171  if ( !mIPage.mIdentityList->selectedItems().isEmpty() ) {
172  item = mIPage.mIdentityList->selectedItems()[0];
173  }
174 
175  QTreeWidgetItem * newItem = 0;
176  if ( item ) {
177  newItem = new IdentityListViewItem( mIPage.mIdentityList, mIPage.mIdentityList->itemAbove( item ), newIdent );
178  } else {
179  newItem = new IdentityListViewItem( mIPage.mIdentityList, newIdent );
180  }
181 
182  mIPage.mIdentityList->selectionModel()->clearSelection();
183  if ( newItem ) {
184  newItem->setSelected( true );
185  }
186 
187  slotModifyIdentity();
188  updateButtons();
189  }
190 }
191 
192 void IdentityPage::slotModifyIdentity()
193 {
194  Q_ASSERT( !mIdentityDialog );
195 
196  IdentityListViewItem *item = 0;
197  if ( !mIPage.mIdentityList->selectedItems().isEmpty() ) {
198  item = dynamic_cast<IdentityListViewItem*>( mIPage.mIdentityList->selectedItems().first() );
199  }
200  if ( !item ) {
201  return;
202  }
203 
204  mIdentityDialog = new IdentityDialog( this );
205  mIdentityDialog->setIdentity( item->identity() );
206 
207  // Hmm, an unmodal dialog would be nicer, but a modal one is easier ;-)
208  if ( mIdentityDialog->exec() == QDialog::Accepted ) {
209  mIdentityDialog->updateIdentity( item->identity() );
210  item->redisplay();
211  save();
212  }
213 
214  delete mIdentityDialog;
215  mIdentityDialog = 0;
216 }
217 
218 void IdentityPage::slotRemoveIdentity()
219 {
220  Q_ASSERT( !mIdentityDialog );
221 
222  if ( mIdentityManager->shadowIdentities().count() < 2 ) {
223  kFatal() << "Attempted to remove the last identity!";
224  }
225 
226  IdentityListViewItem *item = 0;
227  if ( !mIPage.mIdentityList->selectedItems().isEmpty() ) {
228  item = dynamic_cast<IdentityListViewItem*>( mIPage.mIdentityList->selectedItems()[0] );
229  }
230  if ( !item ) {
231  return;
232  }
233 
234  const QString msg = i18n( "<qt>Do you really want to remove the identity named "
235  "<b>%1</b>?</qt>", item->identity().identityName() );
236  if( KMessageBox::warningContinueCancel( this, msg, i18n("Remove Identity"),
237  KGuiItem(i18n("&Remove"),
238  QLatin1String("edit-delete")) )
239  == KMessageBox::Continue ) {
240  if ( mIdentityManager->removeIdentity( item->identity().identityName() ) ) {
241  delete item;
242  if ( mIPage.mIdentityList->currentItem() ) {
243  mIPage.mIdentityList->currentItem()->setSelected( true );
244  }
245  refreshList();
246  updateButtons();
247  }
248  }
249 }
250 
251 void IdentityPage::slotRenameIdentity()
252 {
253  Q_ASSERT( !mIdentityDialog );
254 
255  QTreeWidgetItem *item = 0;
256 
257  if ( !mIPage.mIdentityList->selectedItems().isEmpty() ) {
258  item = mIPage.mIdentityList->selectedItems().first();
259  }
260  if ( !item )
261  return;
262 
263  mIPage.mIdentityList->editItem( item );
264 }
265 
266 void IdentityPage::slotRenameIdentity( KMail::IdentityListViewItem *item , const QString &text )
267 {
268  if ( !item )
269  return;
270 
271  const QString newName = text.trimmed();
272  if ( !newName.isEmpty() &&
273  !mIdentityManager->shadowIdentities().contains( newName ) ) {
274  KPIMIdentities::Identity &ident = item->identity();
275  ident.setIdentityName( newName );
276  save();
277  }
278  item->redisplay();
279 }
280 
281 void IdentityPage::slotContextMenu( IdentityListViewItem *item, const QPoint &pos )
282 {
283  QMenu *menu = new QMenu( this );
284  menu->addAction( i18n( "Add..." ), this, SLOT(slotNewIdentity()) );
285  if ( item ) {
286  menu->addAction( i18n( "Modify..." ), this, SLOT(slotModifyIdentity()) );
287  menu->addAction( i18n( "Rename" ), this, SLOT(slotRenameIdentity()) );
288  if ( mIPage.mIdentityList->topLevelItemCount() > 1 ) {
289  menu->addAction( i18n( "Remove" ), this, SLOT(slotRemoveIdentity()) );
290  }
291  if ( !item->identity().isDefault() ) {
292  menu->addSeparator();
293  menu->addAction( i18n( "Set as Default" ), this, SLOT(slotSetAsDefault()) );
294  }
295  }
296  menu->exec( pos );
297  delete menu;
298 }
299 
300 
301 void IdentityPage::slotSetAsDefault()
302 {
303  Q_ASSERT( !mIdentityDialog );
304 
305  IdentityListViewItem *item = 0;
306  if ( !mIPage.mIdentityList->selectedItems().isEmpty() ) {
307  item = dynamic_cast<IdentityListViewItem*>( mIPage.mIdentityList->selectedItems().first() );
308  }
309  if ( !item ) {
310  return;
311  }
312 
313  mIdentityManager->setAsDefault( item->identity().uoid() );
314  refreshList();
315  mIPage.mSetAsDefaultButton->setEnabled( false );
316 }
317 
318 void IdentityPage::refreshList()
319 {
320  const int numberOfTopLevel( mIPage.mIdentityList->topLevelItemCount() );
321  for ( int i = 0; i < numberOfTopLevel; ++i ) {
322  IdentityListViewItem *item = dynamic_cast<IdentityListViewItem*>( mIPage.mIdentityList->topLevelItem( i ) );
323  if ( item ) {
324  item->redisplay();
325  }
326  }
327  save();
328 }
329 
330 void IdentityPage::slotIdentitySelectionChanged()
331 {
332  updateButtons();
333 }
334 
335 void IdentityPage::updateButtons()
336 {
337  IdentityListViewItem *item = 0;
338  if ( !mIPage.mIdentityList->selectedItems().isEmpty() ) {
339  item = dynamic_cast<IdentityListViewItem*>( mIPage.mIdentityList->selectedItems().first() );
340  }
341  mIPage.mRemoveButton->setEnabled( item && mIPage.mIdentityList->topLevelItemCount() > 1 );
342  mIPage.mModifyButton->setEnabled( item );
343  mIPage.mRenameButton->setEnabled( item );
344  mIPage.mSetAsDefaultButton->setEnabled( item && !item->identity().isDefault() );
345 }
346 
347 #include "identitypage.moc"
globalsettings.h
newidentitydialog.h
KMail::IdentityPage::~IdentityPage
~IdentityPage()
Definition: identitypage.cpp:87
KMail::NewIdentityDialog::Empty
Definition: newidentitydialog.h:44
KMail::IdentityDialog::updateIdentity
void updateIdentity(KPIMIdentities::Identity &ident)
Definition: identitydialog.cpp:855
ConfigModule
Definition: configmodule.h:31
KMail::IdentityPage::IdentityPage
IdentityPage(const KComponentData &instance, QWidget *parent=0)
Definition: identitypage.cpp:49
text
virtual QByteArray text(quint32 serialNumber) const =0
QWidget
identitypage.h
KMail::IdentityListViewItem::identity
KPIMIdentities::Identity & identity() const
Definition: identitylistview.cpp:74
KMail::NewIdentityDialog::ExistingEntry
Definition: newidentitydialog.h:44
KMail::IdentityPage::load
void load()
Definition: identitypage.cpp:91
KMail::NewIdentityDialog
Definition: newidentitydialog.h:39
KMail::IdentityPage::helpAnchor
QString helpAnchor() const
Should return the help anchor for this page or tab.
Definition: identitypage.cpp:44
KMail::NewIdentityDialog::ControlCenter
Definition: newidentitydialog.h:44
KMail::IdentityListViewItem
A QWidgetTreeItem for use in IdentityListView.
Definition: identitylistview.h:51
KMail::IdentityPage::save
void save()
Definition: identitypage.cpp:110
QTreeWidgetItem
QMenu
GlobalSettings::self
static GlobalSettings * self()
Definition: globalsettings.cpp:30
kmkernel.h
KMail::Composer::HDR_IDENTITY
Definition: composer.h:51
identitydialog.h
KMail::IdentityDialog
Definition: identitydialog.h:83
KMail::IdentityListViewItem::redisplay
void redisplay()
Definition: identitylistview.cpp:87
KMail::IdentityDialog::setIdentity
void setIdentity(KPIMIdentities::Identity &ident)
Definition: identitydialog.cpp:759
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:58:51 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kmail

Skip menu "kmail"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer

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