You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdenetwork/kopete/protocols/groupwise/ui/gwprivacydialog.cpp

350 lines
11 KiB

/*
Kopete Groupwise Protocol
gwprivacydialog.cpp - dialog summarising, and editing, the user's privacy settings
Copyright (c) 2004 SUSE Linux AG http://www.suse.com
Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.org>
*************************************************************************
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
*************************************************************************
*/
#include <tqlabel.h>
#include <tqlistbox.h>
#include <tqpushbutton.h>
#include <tqstringlist.h>
#include <tqlistview.h>
#include <kdebug.h>
#include <kiconloader.h>
#include <klocale.h>
#include <kmessagebox.h>
#include "client.h"
#include "gwaccount.h"
#include "gwprivacy.h"
#include "gwprotocol.h"
#include "gwsearch.h"
#include "privacymanager.h"
#include "userdetailsmanager.h"
#include "gwprivacydialog.h"
class PrivacyLBI : public TQListBoxPixmap
{
public:
PrivacyLBI( TQListBox * listBox, const TQPixmap & pixmap, const TQString & text, const TQString & dn )
: TQListBoxPixmap( listBox, pixmap, text ), m_dn( dn )
{
}
TQString dn() { return m_dn; }
private:
TQString m_dn;
};
GroupWisePrivacyDialog::GroupWisePrivacyDialog( GroupWiseAccount * account, TQWidget *parent, const char *name )
: KDialogBase( parent, name, false, i18n( "Account specific privacy settings", "Manage Privacy for %1" ).arg( account->accountId() ),
KDialogBase::Ok|KDialogBase::Apply|KDialogBase::Cancel, Ok, true ), m_account( account ), m_dirty( false ), m_searchDlg(0)
{
m_privacy = new GroupWisePrivacyWidget( this );
setMainWidget( m_privacy );
PrivacyManager * mgr = m_account->client()->privacyManager();
// populate the widget;
// admin lock
if ( mgr->isPrivacyLocked() )
{
m_privacy->m_status->setText( i18n( "Privacy settings have been administratively locked" ) );
disableWidgets();
}
populateWidgets();
m_privacy->m_allowList->setSelectionMode( TQListBox::Extended );
m_privacy->m_denyList->setSelectionMode( TQListBox::Extended );
connect( m_privacy->m_btnAllow, TQT_SIGNAL( clicked() ), TQT_SLOT( slotAllowClicked() ) );
connect( m_privacy->m_btnBlock, TQT_SIGNAL( clicked() ), TQT_SLOT( slotBlockClicked() ) );
connect( m_privacy->m_btnAdd, TQT_SIGNAL( clicked() ), TQT_SLOT( slotAddClicked() ) );
connect( m_privacy->m_btnRemove, TQT_SIGNAL( clicked() ), TQT_SLOT( slotRemoveClicked() ) );
connect( m_privacy->m_allowList, TQT_SIGNAL( selectionChanged() ), TQT_SLOT( slotAllowListClicked() ) );
connect( m_privacy->m_denyList, TQT_SIGNAL( selectionChanged() ), TQT_SLOT( slotDenyListClicked() ) );
connect( mgr, TQT_SIGNAL( privacyChanged( const TQString &, bool ) ), TQT_SLOT( slotPrivacyChanged() ) );
m_privacy->m_btnAdd->setEnabled( true );
m_privacy->m_btnAllow->setEnabled( false );
m_privacy->m_btnBlock->setEnabled( false );
m_privacy->m_btnRemove->setEnabled( false );
/* showButtonOK( true );
showButtonApply( true );
showButtonCancel( true );
*/
show();
}
GroupWisePrivacyDialog::~GroupWisePrivacyDialog()
{
}
void GroupWisePrivacyDialog::populateWidgets()
{
m_dirty = false;
PrivacyManager * mgr = m_account->client()->privacyManager();
// default policy
TQString defaultPolicyText = i18n( "<Everyone Else>" );
if ( mgr->defaultAllow() )
m_defaultPolicy = new TQListBoxText( m_privacy->m_allowList, defaultPolicyText );
else
m_defaultPolicy = new TQListBoxText( m_privacy->m_denyList, defaultPolicyText );
TQPixmap icon = m_account->protocol()->groupwiseAvailable.iconFor( m_account );
// allow list
TQStringList allowList = mgr->allowList();
TQStringList::Iterator end = allowList.end();
for ( TQStringList::Iterator it = allowList.begin(); it != end; ++it )
{
GroupWise::ContactDetails cd = m_account->client()->userDetailsManager()->details( *it );
if ( cd.fullName.isEmpty() )
cd.fullName = cd.givenName + " " + cd.surname;
new PrivacyLBI( m_privacy->m_allowList, icon, cd.fullName, *it );
}
// deny list
TQStringList denyList = mgr->denyList();
end = denyList.end();
for ( TQStringList::Iterator it = denyList.begin(); it != end; ++it )
{
GroupWise::ContactDetails cd = m_account->client()->userDetailsManager()->details( *it );
if ( cd.fullName.isEmpty() )
cd.fullName = cd.givenName + " " + cd.surname;
new PrivacyLBI( m_privacy->m_denyList, icon, cd.fullName, *it );
}
updateButtonState();
}
void GroupWisePrivacyDialog::disableWidgets()
{
if ( m_privacy )
{
m_privacy->m_btnAllow->setEnabled( false );
m_privacy->m_btnBlock->setEnabled( false );
m_privacy->m_btnAdd->setEnabled( false );
m_privacy->m_btnRemove->setEnabled( false );
}
}
void GroupWisePrivacyDialog::slotBlockClicked()
{
// take each selected item from the allow list and add it to the deny list
// start at the bottom, as we are changing the contents of the list as we go
for( int i = m_privacy->m_allowList->count() - 1; i >= 0 ; --i )
{
if ( m_privacy->m_allowList->isSelected( i ) )
{
m_dirty = true;
TQListBoxItem * lbi = m_privacy->m_allowList->item( i );
m_privacy->m_allowList->takeItem( lbi );
m_privacy->m_denyList->insertItem( lbi );
}
}
updateButtonState();
}
void GroupWisePrivacyDialog::slotAllowClicked()
{
// take each selected item from the deny list and add it to the allow list
for( int i = m_privacy->m_denyList->count() - 1; i >= 0 ; --i )
{
if ( m_privacy->m_denyList->isSelected( i ) )
{
m_dirty = true;
TQListBoxItem * lbi = m_privacy->m_denyList->item( i );
m_privacy->m_denyList->takeItem( lbi );
m_privacy->m_allowList->insertItem( lbi );
}
}
updateButtonState();
}
void GroupWisePrivacyDialog::slotAddClicked()
{
if ( !m_searchDlg )
{
m_searchDlg = new KDialogBase( this, "privacysearchdialog", false,
i18n( "Search for Contact to Block" ),
KDialogBase::Ok|KDialogBase::Cancel );
m_search = new GroupWiseContactSearch( m_account, TQListView::Multi, false, m_searchDlg, "privacysearchwidget" );
m_searchDlg->setMainWidget( m_search );
connect( m_searchDlg, TQT_SIGNAL( okClicked() ), TQT_SLOT( slotSearchedForUsers() ) );
connect( m_search, TQT_SIGNAL( selectionValidates( bool ) ), m_searchDlg, TQT_SLOT( enableButtonOK( bool ) ) );
m_searchDlg->enableButtonOK( false );
}
m_searchDlg->show();
}
void GroupWisePrivacyDialog::slotSearchedForUsers()
{
// create an item for each result, in the block list
TQValueList< ContactDetails > selected = m_search->selectedResults();
TQValueList< ContactDetails >::Iterator it = selected.begin();
const TQValueList< ContactDetails >::Iterator end = selected.end();
TQPixmap icon = m_account->protocol()->groupwiseAvailable.iconFor( m_account );
for ( ; it != end; ++it )
{
m_dirty = true;
m_account->client()->userDetailsManager()->addDetails( *it );
if ( (*it).fullName.isEmpty() )
(*it).fullName = (*it).givenName + " " + (*it).surname;
new PrivacyLBI( m_privacy->m_denyList, icon, (*it).fullName, (*it).dn );
}
}
void GroupWisePrivacyDialog::slotRemoveClicked()
{
// remove any selected items from either list, except the default policy
for( int i = m_privacy->m_denyList->count() - 1; i >= 0 ; --i )
{
if ( m_privacy->m_denyList->isSelected( i ) )
{
m_dirty = true;
TQListBoxItem * lbi = m_privacy->m_denyList->item( i );
// can't remove the default policy
if ( lbi == m_defaultPolicy )
continue;
m_privacy->m_denyList->removeItem( i );
}
}
for( int i = m_privacy->m_allowList->count() - 1; i >= 0 ; --i )
{
if ( m_privacy->m_allowList->isSelected( i ) )
{
m_dirty = true;
TQListBoxItem * lbi = m_privacy->m_allowList->item( i );
// can't remove the default policy
if ( lbi == m_defaultPolicy )
continue;
m_privacy->m_allowList->removeItem( i );
}
}
updateButtonState();
}
void GroupWisePrivacyDialog::slotAllowListClicked()
{
// don't get into feedback
disconnect( m_privacy->m_denyList, TQT_SIGNAL( selectionChanged() ), this, TQT_SLOT( slotDenyListClicked() ) );
m_privacy->m_denyList->clearSelection();
connect( m_privacy->m_denyList, TQT_SIGNAL( selectionChanged() ), TQT_SLOT( slotDenyListClicked() ) );
bool selected = false;
for( int i = m_privacy->m_allowList->count() - 1; i >= 0 ; --i )
{
if ( m_privacy->m_allowList->isSelected( i ) )
{
selected = true;
break;
}
}
m_privacy->m_btnAllow->setEnabled( false );
m_privacy->m_btnBlock->setEnabled( selected );
m_privacy->m_btnRemove->setEnabled( selected );
}
void GroupWisePrivacyDialog::slotDenyListClicked()
{
// don't get into feedback
disconnect( m_privacy->m_allowList, TQT_SIGNAL( selectionChanged() ), this, TQT_SLOT( slotAllowListClicked() ) );
m_privacy->m_allowList->clearSelection();
connect( m_privacy->m_allowList, TQT_SIGNAL( selectionChanged() ), TQT_SLOT( slotAllowListClicked() ) );
bool selected = false;
for( int i = m_privacy->m_denyList->count() - 1; i >= 0 ; --i )
{
if ( m_privacy->m_denyList->isSelected( i ) )
{
selected = true;
break;
}
}
m_privacy->m_btnAllow->setEnabled( selected );
m_privacy->m_btnBlock->setEnabled( false );
m_privacy->m_btnRemove->setEnabled( selected );
}
void GroupWisePrivacyDialog::slotPrivacyChanged()
{
m_privacy->m_denyList->clear();
m_privacy->m_allowList->clear();
populateWidgets();
}
void GroupWisePrivacyDialog::updateButtonState()
{
enableButtonApply( m_dirty );
}
void GroupWisePrivacyDialog::slotOk()
{
if ( m_dirty )
commitChanges();
KDialogBase::slotOk();
}
void GroupWisePrivacyDialog::slotApply()
{
if ( m_dirty )
{
commitChanges();
m_dirty = false;
updateButtonState();
}
KDialogBase::slotApply();
}
void GroupWisePrivacyDialog::commitChanges()
{
if ( m_account->isConnected() )
{
bool defaultDeny = false;
TQStringList denyList;
TQStringList allowList;
// pass on our current allow, deny and default policy to the PrivacyManager
for( int i = 0; i < (int)m_privacy->m_denyList->count(); ++i )
{
if ( m_privacy->m_denyList->item( i ) == m_defaultPolicy )
defaultDeny = true;
else
{
PrivacyLBI * lbi = static_cast<PrivacyLBI *>( m_privacy->m_denyList->item( i ) );
denyList.append( lbi->dn() );
}
}
for( int i = 0; i < (int)m_privacy->m_allowList->count(); ++i )
{
if ( m_privacy->m_allowList->item( i ) == m_defaultPolicy )
defaultDeny = false;
else
{
PrivacyLBI * lbi = static_cast<PrivacyLBI *>( m_privacy->m_allowList->item( i ) );
allowList.append( lbi->dn() );
}
}
PrivacyManager * mgr = m_account->client()->privacyManager();
mgr->setPrivacy( defaultDeny, allowList, denyList );
}
else
errorNotConnected();
}
void GroupWisePrivacyDialog::errorNotConnected()
{
KMessageBox::queuedMessageBox( this, KMessageBox::Information,
i18n( "You can only change privacy settings while you are logged in to the GroupWise Messenger server." ) , i18n("'%1' Not Logged In").arg( m_account->accountId() ) );
}
#include "gwprivacydialog.moc"