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/gadu/gadupubdir.cpp

345 lines
8.7 KiB

//
// Copyright (C) 2003 Grzegorz Jaskiewicz <gj at pointblue.com.pl>
//
// gadupubdir.cpp
// Gadu-Gadu Public directory contains people data, using it you can search friends
// different criteria
//
// This program 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.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
// 02110-1301, USA.
//
#include "gadupubdir.h"
#include "gadueditcontact.h"
#include "gaducontactlist.h"
#include "gaduaccount.h"
#include "gaduprotocol.h"
#include <qwidgetstack.h>
#include <qlistview.h>
#include <qptrlist.h>
#include <qradiobutton.h>
#include <qspinbox.h>
#include <qcheckbox.h>
#include <kcombobox.h>
#include <krestrictedline.h>
#include <klineedit.h>
#include <klistview.h>
#include <klocale.h>
GaduPublicDir::GaduPublicDir( GaduAccount* account, QWidget* parent, const char* name )
: KDialogBase( parent, name, false, QString::null, User1|User2|User3|Cancel, User2 )
{
mAccount = account;
createWidget();
initConnections();
show();
}
GaduPublicDir::GaduPublicDir( GaduAccount* account, int searchFor, QWidget* parent, const char* name )
: KDialogBase( parent, name, false, QString::null, User1|User2|User3|Cancel, User2 )
{
ResLine rs;
mAccount = account;
createWidget();
initConnections();
kdDebug( 14100 ) << "search for Uin: " << searchFor << endl;
mMainWidget->listFound->clear();
show();
if ( searchFor == 0 ) {
return;
}
mMainWidget->pubsearch->raiseWidget( 1 );
mMainWidget->radioByUin->setChecked( true );
setButtonText( User2, i18n( "Search &More..." ) );
showButton( User3, true );
showButton( User1, true );
enableButton( User3, false );
enableButton( User2, false );
// now it is time to switch to Right Page(tm)
rs.uin = searchFor;
fName = fSurname = fNick = fCity = QString::null;
fUin = searchFor;
fGender = fAgeFrom = fAgeTo = 0;
fOnlyOnline = false;
mAccount->pubDirSearch( rs, fAgeFrom, fAgeTo, fOnlyOnline );
}
void
GaduPublicDir::createWidget()
{
setCaption( i18n( "Gadu-Gadu Public Directory" ) );
mMainWidget = new GaduPublicDirectory( this );
setMainWidget( mMainWidget );
mMainWidget->UIN->setValidChars( "1234567890" );
setButtonText( User1, i18n( "&New Search" ) );
setButtonText( User2, i18n( "S&earch" ) );
setButtonText( User3, i18n( "&Add User..." ) );
setButtonText( Cancel, i18n( "&Close" ) );
showButton( User1, false );
showButton( User3, false );
enableButton( User2, false );
mMainWidget->radioByData->setChecked( true );
mAccount->pubDirSearchClose();
}
void
GaduPublicDir::slotAddContact()
{
GaduContactsList::ContactLine* cl = new GaduContactsList::ContactLine;
QListViewItem* item = mMainWidget->listFound->currentItem();
cl->ignored = false;
cl->firstname = item->text( 1 );
cl->uin = item->text( 5 );
cl->nickname = item->text( 2 );
cl->surname = fSurname;
// GaduEditContact *ed =
new GaduEditContact( mAccount, cl, this );
}
void
GaduPublicDir::slotListSelected( )
{
QListViewItem* item = mMainWidget->listFound->currentItem();
if ( item ) {
enableButton( User3, true );
}
else {
enableButton( User3, false );
}
}
void
GaduPublicDir::initConnections()
{
connect( this, SIGNAL( user2Clicked() ), SLOT( slotSearch() ) );
connect( this, SIGNAL( user1Clicked() ), SLOT( slotNewSearch() ) );
connect( this, SIGNAL( user3Clicked() ), SLOT( slotAddContact() ) );
connect( mAccount, SIGNAL( pubDirSearchResult( const SearchResult&, unsigned int ) ),
SLOT( slotSearchResult( const SearchResult&, unsigned int ) ) );
connect( mMainWidget->nameS, SIGNAL( textChanged( const QString &) ), SLOT( inputChanged( const QString & ) ) );
connect( mMainWidget->surname, SIGNAL( textChanged( const QString &) ), SLOT( inputChanged( const QString & ) ) );
connect( mMainWidget->nick, SIGNAL( textChanged( const QString &) ), SLOT( inputChanged( const QString & ) ) );
connect( mMainWidget->UIN, SIGNAL( textChanged( const QString &) ), SLOT( inputChanged( const QString & ) ) );
connect( mMainWidget->cityS, SIGNAL( textChanged( const QString &) ), SLOT( inputChanged( const QString & ) ) );
connect( mMainWidget->gender, SIGNAL( activated( const QString &) ), SLOT( inputChanged( const QString & ) ) );
connect( mMainWidget->ageFrom, SIGNAL( valueChanged( const QString &) ), SLOT( inputChanged( const QString & ) ) );
connect( mMainWidget->ageTo, SIGNAL( valueChanged( const QString &) ), SLOT( inputChanged( const QString & ) ) );
connect( mMainWidget->radioByData, SIGNAL( toggled( bool ) ), SLOT( inputChanged( bool ) ) );
connect( mMainWidget->listFound, SIGNAL( selectionChanged () ), SLOT( slotListSelected() ) );
}
void
GaduPublicDir::inputChanged( bool )
{
inputChanged( QString::null );
}
void
GaduPublicDir::inputChanged( const QString& )
{
if ( validateData() == false ) {
enableButton( User2, false );
}
else {
enableButton( User2, true );
}
}
void
GaduPublicDir::getData()
{
fName = mMainWidget->nameS->text();
fSurname = mMainWidget->surname->text();
fNick = mMainWidget->nick->text();
fUin = mMainWidget->UIN->text().toInt();
fGender = mMainWidget->gender->currentItem();
fOnlyOnline = mMainWidget->onlyOnline->isChecked();
fAgeFrom = mMainWidget->ageFrom->value();
fAgeTo = mMainWidget->ageTo->value();
fCity = mMainWidget->cityS->text();
}
// return true if not empty
#define CHECK_STRING(A) { if ( !A.isEmpty() ) { return true; } }
#define CHECK_INT(A) { if ( A ) { return true; } }
bool
GaduPublicDir::validateData()
{
getData();
if ( mMainWidget->radioByData->isChecked() ) {
CHECK_STRING( fCity );
CHECK_STRING( fName );
CHECK_STRING( fSurname );
CHECK_STRING( fNick );
CHECK_INT( fGender );
CHECK_INT( fAgeFrom );
CHECK_INT( fAgeTo );
}
else {
fSurname = QString::null;
CHECK_INT( fUin );
}
return false;
}
// Move to GaduProtocol someday
QPixmap
GaduPublicDir::iconForStatus( uint status )
{
QPixmap n;
if ( GaduProtocol::protocol() ) {
return GaduProtocol::protocol()->convertStatus( status ).protocolIcon();
}
return n;
}
void
GaduPublicDir::slotSearchResult( const SearchResult& result, unsigned int )
{
QListView* list = mMainWidget->listFound;
kdDebug(14100) << "searchResults(" << result.count() <<")" << endl;
QListViewItem* sl;
SearchResult::const_iterator r;
for ( r = result.begin(); r != result.end() ; ++r ){
kdDebug(14100) << "adding" << (*r).uin << endl;
sl= new QListViewItem(
list, QString::fromAscii(""),
(*r).firstname,
(*r).nickname,
(*r).age,
(*r).city,
QString::number( (*r).uin ).ascii()
);
sl->setPixmap( 0, iconForStatus( (*r).status ) );
}
// if not found anything, obviously we don't want to search for more
// if we are looking just for one UIN, don't allow search more - it is pointless
if ( result.count() && fUin==0 ) {
enableButton( User2, true );
}
enableButton( User1, true );
enableButton( User3, false );
mMainWidget->pubsearch->setDisabled( false );
}
void
GaduPublicDir::slotNewSearch()
{
mMainWidget->pubsearch->raiseWidget( 0 );
setButtonText( User2, i18n( "S&earch" ) );
showButton( User1, false );
showButton( User3, false );
enableButton( User2, false );
inputChanged( QString::null );
mAccount->pubDirSearchClose();
}
void
GaduPublicDir::slotSearch()
{
mMainWidget->listFound->clear();
QString empty;
// search more, or search ?
if ( mMainWidget->pubsearch->id( mMainWidget->pubsearch->visibleWidget() ) == 0 ) {
kdDebug(14100) << "start search... " << endl;
getData();
// validate data
if ( validateData() == false ) {
return;
}
// go on
mMainWidget->pubsearch->raiseWidget( 1 );
}
else{
kdDebug(14100) << "search more... " << endl;
// Search for more
}
mMainWidget->pubsearch->setDisabled( true );
setButtonText( User2, i18n( "Search &More..." ) );
showButton( User3, true );
showButton( User1, true );
enableButton( User3, false );
enableButton( User2, false );
ResLine rs;
rs.firstname = fName;
rs.surname = fSurname;
rs.nickname = fNick;
rs.uin = fUin;
rs.city = fCity;
if ( fGender == 1 ) {
rs.gender = GG_PUBDIR50_GENDER_MALE;
}
if ( fGender == 2 ) {
rs.gender = GG_PUBDIR50_GENDER_FEMALE;
}
if ( mMainWidget->radioByData->isChecked() ) {
mAccount->pubDirSearch( rs, fAgeFrom, fAgeTo, fOnlyOnline );
}
else {
mAccount->pubDirSearch( rs, 0, 0, fOnlyOnline );
}
}
#include "gadupubdir.moc"