23 #include <QtGui/QCheckBox>
24 #include <QtGui/QLayout>
25 #include <QtGui/QHeaderView>
26 #include <QtGui/QBoxLayout>
27 #include <QtCore/QPointer>
28 #include <QtCore/QTimer>
29 #include <QtGui/QContextMenuEvent>
31 #include <kcolorbutton.h>
32 #include <kpushbutton.h>
35 #include <kpluginfactory.h>
36 #include <kiconloader.h>
38 #include <kmessagebox.h>
42 #include <kcolordialog.h>
45 #include "editaccountwidget.h"
46 #include "kopeteaccountmanager.h"
47 #include "kopeteidentitymanager.h"
48 #include "kopeteidentity.h"
49 #include "kopeteprotocol.h"
50 #include "kopeteaccount.h"
51 #include "kopetecontact.h"
57 registerPlugin<KopeteAccountConfig>(); )
58 K_EXPORT_PLUGIN( KopeteAccountConfigFactory(
"kcm_kopete_accountconfig") )
61 :
KCModule( KopeteAccountConfigFactory::componentData(), parent, args )
73 connect( mAccountList, SIGNAL(itemPositionChanged()),
this, SLOT(changed()) );
74 connect( mAccountList, SIGNAL(itemSelectionChanged()),
this, SLOT(slotItemSelected()) );
75 connect( mAccountList, SIGNAL(itemDoubleClicked(
QTreeWidgetItem*,
int)),
this, SLOT(slotModify()) );
80 connect( Kopete::AccountManager::self(), SIGNAL(accountRegistered(Kopete::Account*)),
this, SLOT(slotAccountAdded(Kopete::Account*)) );
81 connect( Kopete::AccountManager::self(), SIGNAL(accountUnregistered(
const Kopete::Account*)),
this, SLOT(slotAccountRemoved(
const Kopete::Account*)) );
83 mAccountList->installEventFilter(
this );
92 if(!selectedItems.
empty())
93 return dynamic_cast<KopeteAccountLVI*>( selectedItems.
first() );
100 if(!selectedItems.
empty())
101 return dynamic_cast<KopeteIdentityLVI*>( selectedItems.
first() );
108 for (
int i = 0; i < mAccountList->topLevelItemCount(); i++ )
109 priority += mAccountList->topLevelItem( i )->childCount();
111 for (
int i = 0; i < mAccountList->topLevelItemCount(); i++ )
114 for (
int j = 0; j < identity->
childCount(); j++ )
118 account->
account()->setPriority( priority-- );
122 Kopete::AccountManager::self()->save();
123 Kopete::IdentityManager::self()->save();
131 return (a->priority() > b->priority());
136 if ( a->accounts().isEmpty() )
139 if ( b->accounts().isEmpty() && !a->accounts().isEmpty() )
142 return (a->accounts().first()->priority() > b->accounts().first()->priority());
147 mAccountList->clear();
150 Kopete::Identity *defaultIdentity = Kopete::IdentityManager::self()->defaultIdentity();
156 foreach(Kopete::Identity *i, identityList)
162 identityItem->
setText( 0, i->label() );
163 identityItem->
setIcon( 0, KIcon( i->customIcon()) );
167 if (i == defaultIdentity)
171 identityItem->
setFont( 0, font );
176 identityItemHash.
insert(i,identityItem);
183 foreach( Kopete::Account *account, accountList )
185 Kopete::Identity *idnt = account->identity();
187 Q_ASSERT(identityItemHash.
contains(idnt));
189 lvi->setText( 0, account->accountLabel() );
190 lvi->setIcon( 0, account->myself()->onlineStatus().iconFor( account ) );
191 QFont font = lvi->font( 0 );
193 lvi->setFont( 0, font );
195 lvi->setSizeHint( 0,
QSize(0, 42) );
197 lvi->setText( 1, account->myself()->onlineStatus().description() );
198 lvi->setTextAlignment( 1, Qt::AlignRight | Qt::AlignVCenter );
199 lvi->setFont( 1, font );
201 lvi->setFlags( (lvi->flags() & ~Qt::ItemIsDropEnabled) | Qt::ItemIsUserCheckable );
202 lvi->setCheckState ( 0, account->excludeConnect() ? Qt::Unchecked : Qt::Checked );
204 connect( account->myself(), SIGNAL(onlineStatusChanged(Kopete::Contact*,Kopete::OnlineStatus,Kopete::OnlineStatus)),
205 this, SLOT(slotOnlineStatusChanged(Kopete::Contact*,Kopete::OnlineStatus,Kopete::OnlineStatus)));
212 void KopeteAccountConfig::slotItemSelected()
214 bool accountSelected = selectedAccount();
215 bool hasMultipleIdentities = ( Kopete::IdentityManager::self()->identities().size() > 1 );
216 mButtonAccountModify->setEnabled( accountSelected );
217 mButtonAccountRemove->setEnabled( accountSelected );
218 m_actionAccountSwitchIdentity->setEnabled( accountSelected && hasMultipleIdentities );
219 mButtonAccountSwitchIdentity->setEnabled( m_actionAccountSwitchIdentity->isEnabled() );
220 mButtonAccountSetColor->setEnabled( accountSelected );
222 bool identitySelected = selectedIdentity();
223 bool isDefaultIdentity = (identitySelected && Kopete::IdentityManager::self()->defaultIdentity() == selectedIdentity()->
identity());
224 mButtonAccountAdd->setEnabled( identitySelected );
225 mButtonIdentityCopy->setEnabled( identitySelected );
226 mButtonIdentityModify->setEnabled( identitySelected );
227 m_actionIdentityRemove->setEnabled( identitySelected && !isDefaultIdentity );
228 mButtonIdentityRemove->setEnabled( m_actionIdentityRemove->isEnabled() );
229 m_actionIdentitySetDefault->setEnabled( identitySelected && !isDefaultIdentity );
230 mButtonIdentitySetDefault->setEnabled( m_actionIdentitySetDefault->isEnabled() );
233 void KopeteAccountConfig::slotAddAccount()
244 void KopeteAccountConfig::slotModify()
250 return modifyIdentity( ilvi->
identity() );
253 return modifyAccount( alvi->
account() );
257 void KopeteAccountConfig::modifyAccount(Kopete::Account *account)
259 Kopete::Protocol *proto = account->protocol();
262 editDialog->setCaption( i18n(
"Modify Account" ) );
263 editDialog->setButtons( KDialog::Ok | KDialog::Cancel );
264 editDialog->setDefaultButton(KDialog::Ok);
265 editDialog->showButtonSeparator(
true);
267 KopeteEditAccountWidget *m_accountWidget = proto->createEditAccountWidget( account, editDialog );
268 if ( !m_accountWidget )
281 editDialog->setMainWidget( w );
282 if ( editDialog->exec() == QDialog::Accepted )
284 if( m_accountWidget->validateData() )
285 m_accountWidget->apply();
290 Kopete::AccountManager::self()->save();
293 void KopeteAccountConfig::modifyIdentity(Kopete::Identity *)
300 Kopete::Identity *ident = lvi->
identity();
307 Kopete::IdentityManager::self()->save();
310 void KopeteAccountConfig::removeAccount()
315 Kopete::Account *i = lvi->
account();
316 if ( KMessageBox::warningContinueCancel(
this, i18n(
"Are you sure you want to remove the account \"%1\"?", i->accountLabel() ),
317 i18n(
"Remove Account" ), KGuiItem(i18n(
"Remove Account" ),
"edit-delete"), KStandardGuiItem::cancel(),
318 QString(), KMessageBox::Notify | KMessageBox::Dangerous ) == KMessageBox::Continue )
320 Kopete::AccountManager::self()->removeAccount( i );
325 void KopeteAccountConfig::removeIdentity()
330 if ( lvi && ( i = lvi->
identity() ) ) {
331 if (!i->accounts().count())
333 if ( KMessageBox::warningContinueCancel(
this, i18n(
"Are you sure you want to remove the identity \"%1\"?", i->label() ),
334 i18n(
"Remove Identity" ), KGuiItem(i18n(
"Remove Identity" ),
"edit-delete"), KStandardGuiItem::cancel(),
335 "askRemoveIdentity", KMessageBox::Notify | KMessageBox::Dangerous ) == KMessageBox::Continue )
337 Kopete::IdentityManager::self()->removeIdentity( i );
345 i18n(
"Before removing the identity %1, the following accounts must be "
346 "assigned to another identity:", i->label())) )
348 Kopete::IdentityManager::self()->removeIdentity( i );
353 Kopete::IdentityManager::self()->defaultIdentity();
360 void KopeteAccountConfig::slotAccountSwitchIdentity()
369 Kopete::Account *a = lvi->
account();
370 if ( Kopete::IdentityManager::self()->identities().size() == 2 ) {
371 foreach ( Kopete::Identity *
id, Kopete::IdentityManager::self()->identities() ) {
372 if (
id != a->identity() ) {
373 a->setIdentity(
id );
384 void KopeteAccountConfig::slotAccountSetColor()
391 Kopete::Account *a = lvi->
account();
393 QColor color = a->color();
395 if ( KColorDialog::getColor(color, Qt::black,
this) == KColorDialog::Accepted ) {
402 void KopeteAccountConfig::slotSetDefaultIdentity()
409 Kopete::IdentityManager::self()->setDefaultIdentity( lvi->
identity() );
413 void KopeteAccountConfig::slotAddIdentity()
415 Kopete::Identity *ident =
new Kopete::Identity(i18n(
"New Identity"));
421 if ( dialog->exec() == QDialog::Accepted ) {
422 ident = Kopete::IdentityManager::self()->registerIdentity(ident);
424 Kopete::IdentityManager::self()->save();
433 void KopeteAccountConfig::slotCopyIdentity()
435 Kopete::Identity * existing = selectedIdentity()->
identity();
437 QString newLabel = i18nc(
"String used for creating first copy of a named item",
438 "Copy of %1", existing->label() );
439 Kopete::Identity::List ids = Kopete::IdentityManager::self()->identities();
441 foreach ( Kopete::Identity *i, ids ) {
442 idLabels.
append( i->label() );
444 while ( idLabels.
contains( newLabel ) && copyCount < 100 ) {
445 newLabel = i18nc(
"String used for creating second and subsequent copies of a named item",
446 "Copy %1 of %2", copyCount++, existing->label() );
448 Kopete::Identity * ident = existing->clone();
449 ident->setLabel( newLabel );
452 if ( dialog->exec() == QDialog::Accepted ) {
453 if ( Kopete::IdentityManager::self()->registerIdentity(ident) ) {
462 void KopeteAccountConfig::slotOnlineStatusChanged( Kopete::Contact *contact,
463 const Kopete::OnlineStatus &newStatus,
464 const Kopete::OnlineStatus &)
469 for (it = items.
begin(); it != items.
end(); ++it)
475 if (i->
account()->myself() == contact)
478 (*it)->setText( 1, newStatus.description() );
485 void KopeteAccountConfig::slotAccountAdded( Kopete::Account * account )
492 void KopeteAccountConfig::slotAccountRemoved(
const Kopete::Account * account )
496 for (it = items.
begin(); it != items.
end(); ++it)
499 if ( lvi && lvi->
account() == account)
525 if ( obj == mAccountList && event->
type() == QEvent::ContextMenu )
531 m_identityContextMenu->popup(cmEvent->
globalPos());
537 m_accountContextMenu->popup(cmEvent->
globalPos());
545 void KopeteAccountConfig::configureActions()
548 m_actionAccountAdd =
new KAction( i18n(
"&Add Account..." ),
this );
549 m_actionAccountAdd->setIcon( KIcon(
"list-add") );
550 mButtonAccountAdd->setIcon( m_actionAccountAdd->icon() );
551 mButtonAccountAdd->setText( m_actionAccountAdd->text() );
552 connect( m_actionAccountAdd, SIGNAL(triggered(
bool)),
this, SLOT(slotAddAccount()) );
553 connect( mButtonAccountAdd, SIGNAL(clicked()), m_actionAccountAdd, SLOT(trigger()) );
556 m_actionAccountModify =
new KAction( i18n(
"&Modify Account..." ),
this );
557 m_actionAccountModify->setIcon( KIcon(
"configure") );
558 mButtonAccountModify->setIcon( m_actionAccountModify->icon() );
559 mButtonAccountModify->setText( m_actionAccountModify->text() );
560 connect( m_actionAccountModify, SIGNAL(triggered(
bool)),
this, SLOT(slotModify()));
561 connect( mButtonAccountModify, SIGNAL(clicked()), m_actionAccountModify, SLOT(trigger()) );
564 m_actionAccountRemove =
new KAction( i18n(
"&Remove Account" ),
this );
565 m_actionAccountRemove->setIcon( KIcon(
"edit-delete") );
566 m_actionAccountRemove->setShortcut(KShortcut(Qt::Key_Delete));
567 mButtonAccountRemove->setIcon( m_actionAccountRemove->icon() );
568 mButtonAccountRemove->setText( m_actionAccountRemove->text() );
569 connect( m_actionAccountRemove, SIGNAL(triggered(
bool)),
this, SLOT(removeAccount()) );
570 connect( mButtonAccountRemove, SIGNAL(clicked()), m_actionAccountRemove, SLOT(trigger()) );
573 m_actionAccountSwitchIdentity =
new KAction( i18n(
"&Switch Identity..." ),
this );
574 mButtonAccountSwitchIdentity->setText( m_actionAccountSwitchIdentity->text() );
575 connect( m_actionAccountSwitchIdentity, SIGNAL(triggered(
bool)),
this, SLOT(slotAccountSwitchIdentity()) );
576 connect( mButtonAccountSwitchIdentity, SIGNAL(clicked()), m_actionAccountSwitchIdentity, SLOT(trigger()) );
579 m_actionAccountSetColor =
new KAction( i18n(
"Set C&olor..." ),
this );
580 mButtonAccountSetColor->setText( m_actionAccountSetColor->text() );
581 connect( m_actionAccountSetColor, SIGNAL(triggered(
bool)),
this, SLOT(slotAccountSetColor()) );
582 connect( mButtonAccountSetColor, SIGNAL(clicked()), m_actionAccountSetColor, SLOT(trigger()) );
585 m_actionIdentityAdd =
new KAction( i18n(
"Add &Identity..." ),
this );
586 m_actionIdentityAdd->setIcon( KIcon(
"list-add") );
587 mButtonIdentityAdd->setIcon( m_actionIdentityAdd->icon() );
588 mButtonIdentityAdd->setText( m_actionIdentityAdd->text() );
589 connect( m_actionIdentityAdd, SIGNAL(triggered(
bool)),
this, SLOT(slotAddIdentity()) );
590 connect( mButtonIdentityAdd, SIGNAL(clicked()), m_actionIdentityAdd, SLOT(trigger()) );
593 m_actionIdentityCopy =
new KAction( i18n(
"&Copy Identity..." ),
this );
594 m_actionIdentityCopy->setIcon( KIcon(
"edit-copy") );
595 mButtonIdentityCopy->setIcon( m_actionIdentityCopy->icon() );
596 mButtonIdentityCopy->setText( m_actionIdentityCopy->text() );
597 connect( m_actionIdentityCopy, SIGNAL(triggered(
bool)),
this, SLOT(slotCopyIdentity()) );
598 connect( mButtonIdentityCopy, SIGNAL(clicked()), m_actionIdentityCopy, SLOT(trigger()) );
601 m_actionIdentityModify =
new KAction( i18n(
"M&odify Identity..." ),
this );
602 m_actionIdentityModify->setIcon( KIcon(
"configure") );
603 mButtonIdentityModify->setIcon( m_actionIdentityModify->icon() );
604 mButtonIdentityModify->setText( m_actionIdentityModify->text() );
605 connect( m_actionIdentityModify, SIGNAL(triggered(
bool)),
this, SLOT(slotModify()) );
606 connect( mButtonIdentityModify, SIGNAL(clicked()), m_actionIdentityModify, SLOT(trigger()) );
609 m_actionIdentityRemove =
new KAction( i18n(
"R&emove Identity" ),
this );
610 m_actionIdentityRemove->setIcon( KIcon(
"edit-delete") );
611 mButtonIdentityRemove->setIcon( m_actionIdentityRemove->icon() );
612 mButtonIdentityRemove->setText( m_actionIdentityRemove->text() );
613 connect( m_actionIdentityRemove, SIGNAL(triggered(
bool)),
this, SLOT(removeIdentity()) );
614 connect( mButtonIdentityRemove, SIGNAL(clicked()), m_actionIdentityRemove, SLOT(trigger()) );
617 m_actionIdentitySetDefault =
new KAction( i18n(
"Set &Default" ),
this );
618 mButtonIdentitySetDefault->setText( m_actionIdentitySetDefault->text() );
619 connect( m_actionIdentitySetDefault, SIGNAL(triggered(
bool)),
this, SLOT(slotSetDefaultIdentity()) );
620 connect( mButtonIdentitySetDefault, SIGNAL(clicked()), m_actionIdentitySetDefault, SLOT(trigger()) );
623 void KopeteAccountConfig::configureMenus()
626 m_accountContextMenu =
new KMenu (
this );
627 m_accountContextMenu->addAction( m_actionAccountModify );
628 m_accountContextMenu->addAction( m_actionAccountRemove );
629 m_accountContextMenu->addAction( m_actionAccountSetColor );
632 m_identityContextMenu =
new KMenu (
this );
633 m_identityContextMenu->addAction( m_actionAccountAdd );
634 m_identityContextMenu->addSeparator();
635 m_identityContextMenu->addAction( m_actionIdentityModify );
636 m_identityContextMenu->addAction( m_actionIdentityRemove );
637 m_identityContextMenu->addAction( m_actionIdentitySetDefault );
640 void KopeteAccountConfig::slotItemClicked(
QTreeWidgetItem * item,
int )
643 if ( account && account->
parent() )
644 account->
account()->setExcludeConnect ( account->
checkState(0) == Qt::Unchecked ?
true : false );
648 #include "kopeteaccountconfig.moc"
bool accountPriorityLessThan(const Kopete::Account *a, const Kopete::Account *b)
iterator insert(const Key &key, const T &value)
bool identityPriorityLessThan(const Kopete::Identity *a, const Kopete::Identity *b)
void setIdentity(Kopete::Identity *identity)
Set the identity assigned to the account.
bool contains(const QString &str, Qt::CaseSensitivity cs) const
K_PLUGIN_FACTORY(KopeteAccountConfigFactory, registerPlugin< KopeteAccountConfig >();) KopeteAccountConfig
void setBold(bool enable)
void append(const T &value)
virtual bool eventFilter(QObject *watched, QEvent *event)
Kopete::Identity * identity()
virtual bool eventFilter(QObject *obj, QEvent *event)
void setText(int column, const QString &text)
bool contains(const Key &key) const
static bool changeAccountIdentity(QWidget *parent, Kopete::Account *account, Kopete::Identity *hidden_ident=0, const QString &message=QString())
This is the easiest (and the recommended) way of changing the account identity.
Kopete::Account * account()