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>
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.
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.
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.
24 #include "identitypage.h"
26 #include "identitydialog.h"
27 #include "newidentitydialog.h"
28 #ifndef KCM_KPIMIDENTITIES_STANDALONE
30 #include "globalsettings.h"
33 #include <mailcommon/mailkernel.h>
34 #include <messageviewer/autoqpointer.h>
35 #include <kpimidentities/identity.h>
36 #include <kpimidentities/identitymanager.h>
39 #include <KMessageBox>
42 using namespace KMail
;
44 QString
IdentityPage::helpAnchor() const
46 return QString::fromLatin1( "configure-identity" );
49 IdentityPage::IdentityPage( const KComponentData
&instance
, QWidget
*parent
)
50 : ConfigModule( instance
, parent
),
54 if ( !MailCommon::Kernel::self()->kernelIsRegistered() ) {
57 mIdentityManager
= KernelIf
->identityManager();
59 mIPage
.setupUi( this );
60 mIPage
.mIdentityList
->setIdentityManager( mIdentityManager
);
62 connect( mIPage
.mIdentityList
, SIGNAL(itemSelectionChanged()),
63 SLOT(slotIdentitySelectionChanged()) );
64 connect( this, SIGNAL(changed(bool)),
65 SLOT(slotIdentitySelectionChanged()) );
66 connect( mIPage
.mIdentityList
, SIGNAL(rename(KMail::IdentityListViewItem
*,QString
)),
67 SLOT(slotRenameIdentity(KMail::IdentityListViewItem
*,QString
)) );
68 connect( mIPage
.mIdentityList
, SIGNAL(itemDoubleClicked(QTreeWidgetItem
*,int)),
69 SLOT(slotModifyIdentity()) );
70 connect( mIPage
.mIdentityList
, SIGNAL(contextMenu(KMail::IdentityListViewItem
*,QPoint
)),
71 SLOT(slotContextMenu(KMail::IdentityListViewItem
*,QPoint
)) );
72 // ### connect dragged(...), ...
74 connect( mIPage
.mButtonAdd
, SIGNAL(clicked()),
75 this, SLOT(slotNewIdentity()) );
76 connect( mIPage
.mModifyButton
, SIGNAL(clicked()),
77 this, SLOT(slotModifyIdentity()) );
78 connect( mIPage
.mRenameButton
, SIGNAL(clicked()),
79 this, SLOT(slotRenameIdentity()) );
80 connect( mIPage
.mRemoveButton
, SIGNAL(clicked()),
81 this, SLOT(slotRemoveIdentity()) );
82 connect( mIPage
.mSetAsDefaultButton
, SIGNAL(clicked()),
83 this, SLOT(slotSetAsDefault()) );
86 IdentityPage::~IdentityPage()
90 void IdentityPage::load()
92 mOldNumberOfIdentities
= mIdentityManager
->shadowIdentities().count();
94 mIPage
.mIdentityList
->clear();
95 QTreeWidgetItem
*item
= 0;
96 KPIMIdentities::IdentityManager::Iterator
end( mIdentityManager
->modifyEnd() );
98 for ( KPIMIdentities::IdentityManager::Iterator it
= mIdentityManager
->modifyBegin(); it
!= end
; ++it
) {
99 item
= new IdentityListViewItem( mIPage
.mIdentityList
, item
, *it
);
101 if ( mIPage
.mIdentityList
->currentItem() ) {
102 mIPage
.mIdentityList
->currentItem()->setSelected( true );
106 void IdentityPage::save()
108 mIdentityManager
->sort();
109 mIdentityManager
->commit();
111 #ifndef KCM_KPIMIDENTITIES_STANDALONE
112 if( mOldNumberOfIdentities
< 2 && mIPage
.mIdentityList
->topLevelItemCount() > 1 ) {
113 // have more than one identity, so better show the combo in the
115 int showHeaders
= GlobalSettings::self()->headers();
116 showHeaders
|= KMail::Composer::HDR_IDENTITY
;
117 GlobalSettings::self()->setHeaders( showHeaders
);
119 // and now the reverse
120 if( mOldNumberOfIdentities
> 1 && mIPage
.mIdentityList
->topLevelItemCount() < 2 ) {
121 // have only one identity, so remove the combo in the composer:
122 int showHeaders
= GlobalSettings::self()->headers();
123 showHeaders
&= ~KMail::Composer::HDR_IDENTITY
;
124 GlobalSettings::self()->setHeaders( showHeaders
);
129 void IdentityPage::slotNewIdentity()
131 Q_ASSERT( !mIdentityDialog
);
133 MessageViewer::AutoQPointer
<NewIdentityDialog
> dialog( new NewIdentityDialog(
134 mIdentityManager
, this ) );
135 dialog
->setObjectName( "new" );
137 if ( dialog
->exec() == QDialog::Accepted
&& dialog
) {
138 QString identityName
= dialog
->identityName().trimmed();
139 Q_ASSERT( !identityName
.isEmpty() );
142 // Construct a new Identity:
144 switch ( dialog
->duplicateMode() ) {
145 case NewIdentityDialog::ExistingEntry
:
147 KPIMIdentities::Identity
&dupThis
= mIdentityManager
->modifyIdentityForName( dialog
->duplicateIdentity() );
148 mIdentityManager
->newFromExisting( dupThis
, identityName
);
151 case NewIdentityDialog::ControlCenter
:
152 mIdentityManager
->newFromControlCenter( identityName
);
154 case NewIdentityDialog::Empty
:
155 mIdentityManager
->newFromScratch( identityName
);
160 // Insert into listview:
162 KPIMIdentities::Identity
&newIdent
= mIdentityManager
->modifyIdentityForName( identityName
);
163 QTreeWidgetItem
*item
= 0;
164 if ( !mIPage
.mIdentityList
->selectedItems().isEmpty() ) {
165 item
= mIPage
.mIdentityList
->selectedItems()[0];
168 QTreeWidgetItem
* newItem
= 0;
170 newItem
= new IdentityListViewItem( mIPage
.mIdentityList
, mIPage
.mIdentityList
->itemAbove( item
), newIdent
);
172 newItem
= new IdentityListViewItem( mIPage
.mIdentityList
, newIdent
);
175 mIPage
.mIdentityList
->selectionModel()->clearSelection();
177 newItem
->setSelected( true );
180 slotModifyIdentity();
185 void IdentityPage::slotModifyIdentity()
187 Q_ASSERT( !mIdentityDialog
);
189 IdentityListViewItem
*item
= 0;
190 if ( !mIPage
.mIdentityList
->selectedItems().isEmpty() ) {
191 item
= dynamic_cast<IdentityListViewItem
*>( mIPage
.mIdentityList
->selectedItems()[0] );
197 mIdentityDialog
= new IdentityDialog( this );
198 mIdentityDialog
->setIdentity( item
->identity() );
200 // Hmm, an unmodal dialog would be nicer, but a modal one is easier ;-)
201 if ( mIdentityDialog
->exec() == QDialog::Accepted
) {
202 mIdentityDialog
->updateIdentity( item
->identity() );
207 delete mIdentityDialog
;
211 void IdentityPage::slotRemoveIdentity()
213 Q_ASSERT( !mIdentityDialog
);
215 if ( mIdentityManager
->shadowIdentities().count() < 2 ) {
216 kFatal() << "Attempted to remove the last identity!";
219 IdentityListViewItem
*item
= 0;
220 if ( !mIPage
.mIdentityList
->selectedItems().isEmpty() ) {
221 item
= dynamic_cast<IdentityListViewItem
*>( mIPage
.mIdentityList
->selectedItems()[0] );
227 QString msg
= i18n( "<qt>Do you really want to remove the identity named "
228 "<b>%1</b>?</qt>", item
->identity().identityName() );
229 if( KMessageBox::warningContinueCancel( this, msg
, i18n("Remove Identity"),
230 KGuiItem(i18n("&Remove"),
232 == KMessageBox::Continue
) {
233 if ( mIdentityManager
->removeIdentity( item
->identity().identityName() ) ) {
235 if ( mIPage
.mIdentityList
->currentItem() ) {
236 mIPage
.mIdentityList
->currentItem()->setSelected( true );
244 void IdentityPage::slotRenameIdentity()
246 Q_ASSERT( !mIdentityDialog
);
248 QTreeWidgetItem
*item
= 0;
250 if ( !mIPage
.mIdentityList
->selectedItems().isEmpty() ) {
251 item
= mIPage
.mIdentityList
->selectedItems()[0];
255 mIPage
.mIdentityList
->editItem( item
);
258 void IdentityPage::slotRenameIdentity( KMail::IdentityListViewItem
*item
, const QString
&text
)
262 const QString newName
= text
.trimmed();
263 if ( !newName
.isEmpty() &&
264 !mIdentityManager
->shadowIdentities().contains( newName
) ) {
265 KPIMIdentities::Identity
&ident
= item
->identity();
266 ident
.setIdentityName( newName
);
272 void IdentityPage::slotContextMenu( IdentityListViewItem
*item
, const QPoint
&pos
)
274 QMenu
*menu
= new QMenu( this );
275 menu
->addAction( i18n( "Add..." ), this, SLOT(slotNewIdentity()) );
277 menu
->addAction( i18n( "Modify..." ), this, SLOT(slotModifyIdentity()) );
278 if ( mIPage
.mIdentityList
->topLevelItemCount() > 1 ) {
279 menu
->addAction( i18n( "Remove" ), this, SLOT(slotRemoveIdentity()) );
281 if ( !item
->identity().isDefault() ) {
282 menu
->addAction( i18n( "Set as Default" ), this, SLOT(slotSetAsDefault()) );
290 void IdentityPage::slotSetAsDefault()
292 Q_ASSERT( !mIdentityDialog
);
294 IdentityListViewItem
*item
= 0;
295 if ( !mIPage
.mIdentityList
->selectedItems().isEmpty() ) {
296 item
= dynamic_cast<IdentityListViewItem
*>( mIPage
.mIdentityList
->selectedItems()[0] );
302 mIdentityManager
->setAsDefault( item
->identity().uoid() );
306 void IdentityPage::refreshList()
308 const int numberOfTopLevel( mIPage
.mIdentityList
->topLevelItemCount() );
309 for ( int i
= 0; i
< numberOfTopLevel
; ++i
) {
310 IdentityListViewItem
*item
= dynamic_cast<IdentityListViewItem
*>( mIPage
.mIdentityList
->topLevelItem( i
) );
318 void IdentityPage::slotIdentitySelectionChanged()
323 void IdentityPage::updateButtons()
325 IdentityListViewItem
*item
= 0;
326 if ( !mIPage
.mIdentityList
->selectedItems().isEmpty() ) {
327 item
= dynamic_cast<IdentityListViewItem
*>( mIPage
.mIdentityList
->selectedItems()[0] );
329 mIPage
.mRemoveButton
->setEnabled( item
&& mIPage
.mIdentityList
->topLevelItemCount() > 1 );
330 mIPage
.mModifyButton
->setEnabled( item
);
331 mIPage
.mRenameButton
->setEnabled( item
);
332 mIPage
.mSetAsDefaultButton
->setEnabled( item
&& !item
->identity().isDefault() );
335 #include "identitypage.moc"