summaryrefslogtreecommitdiffstats
path: root/kopete/protocols/oscar/icq/ui/icqsearchdialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kopete/protocols/oscar/icq/ui/icqsearchdialog.cpp')
-rw-r--r--kopete/protocols/oscar/icq/ui/icqsearchdialog.cpp320
1 files changed, 320 insertions, 0 deletions
diff --git a/kopete/protocols/oscar/icq/ui/icqsearchdialog.cpp b/kopete/protocols/oscar/icq/ui/icqsearchdialog.cpp
new file mode 100644
index 00000000..0010166a
--- /dev/null
+++ b/kopete/protocols/oscar/icq/ui/icqsearchdialog.cpp
@@ -0,0 +1,320 @@
+/*
+ Kopete Oscar Protocol
+ icqsearchdialog.cpp - search for people
+
+ Copyright (c) 2005 Matt Rogers <mattr@kde.org>
+
+ Kopete (c) 2002-2005 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 Lesser General Public *
+ * License as published by the Free Software Foundation; either *
+ * version 2 of the License, or (at your option) any later version. *
+ * *
+ *************************************************************************
+*/
+
+#include "icqsearchdialog.h"
+
+#include <qlineedit.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qlayout.h>
+#include <qtextcodec.h>
+#include <qtabwidget.h>
+#include <kdebug.h>
+#include <kiconloader.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kpushbutton.h>
+#include <kmessagebox.h>
+
+#include "kopeteuiglobal.h"
+
+#include "icqaccount.h"
+#include "icqaddcontactpage.h"
+#include "icqprotocol.h"
+#include "icqsearchbase.h"
+#include "oscartypes.h"
+#include "icqcontact.h"
+#include "icquserinfowidget.h"
+
+ICQSearchDialog::ICQSearchDialog( ICQAccount* account, QWidget* parent, const char* name )
+: KDialogBase( parent, name, true, i18n( "ICQ User Search" ), 0, NoDefault )
+{
+ m_account = account;
+ m_searchUI = new ICQSearchBase( this, name );
+ setMainWidget( m_searchUI );
+ connect( m_searchUI->searchButton, SIGNAL( clicked() ), this, SLOT( startSearch() ) );
+ connect( m_searchUI->searchResults, SIGNAL( selectionChanged() ), this, SLOT( resultSelectionChanged() ) );
+ connect( m_searchUI->addButton, SIGNAL( clicked() ), this, SLOT( addContact() ) );
+ connect( m_searchUI->clearButton, SIGNAL( clicked() ), this, SLOT( clearResults() ) );
+ connect( m_searchUI->stopButton, SIGNAL( clicked() ), this, SLOT( stopSearch() ) );
+ connect( m_searchUI->closeButton, SIGNAL( clicked() ), this, SLOT( closeDialog() ) );
+ connect( m_searchUI->userInfoButton, SIGNAL( clicked() ), this, SLOT( userInfo() ) );
+ connect( m_searchUI->newSearchButton, SIGNAL( clicked() ), this, SLOT( newSearch() ) );
+
+ ICQProtocol *p = ICQProtocol::protocol();
+ p->fillComboFromTable( m_searchUI->gender, p->genders() );
+ p->fillComboFromTable( m_searchUI->country, p->countries() );
+ p->fillComboFromTable( m_searchUI->language, p->languages() );
+
+ m_contact = NULL;
+ m_infoWidget = NULL;
+
+ m_contact = NULL;
+ m_infoWidget = NULL;
+}
+
+
+ICQSearchDialog::~ICQSearchDialog()
+{
+}
+
+void ICQSearchDialog::startSearch()
+{
+ // Doing the search only if the account is online, otherwise warn the user
+ if(!m_account->isConnected())
+ {
+ // Account currently offline
+ m_searchUI->searchButton->setEnabled( false );
+ KMessageBox::sorry( this, i18n("You must be online to search the ICQ Whitepages."), i18n("ICQ Plugin") );
+ }
+ else
+ {
+ // Account is online
+ clearResults();
+
+ m_searchUI->stopButton->setEnabled( true );
+ m_searchUI->searchButton->setEnabled( false );
+ m_searchUI->newSearchButton->setEnabled( false );
+
+ connect( m_account->engine(), SIGNAL( gotSearchResults( const ICQSearchResult& ) ),
+ this, SLOT( newResult( const ICQSearchResult& ) ) );
+ connect( m_account->engine(), SIGNAL( endOfSearch( int ) ),
+ this, SLOT( searchFinished( int ) ) );
+
+ const QWidget* currentPage = m_searchUI->tabWidget3->currentPage();
+
+ if ( currentPage == m_searchUI->tab )
+ {
+ if( m_searchUI->uin->text().isEmpty() || m_searchUI->uin->text().toULong() == 0 )
+ {
+ // Invalid UIN
+ stopSearch();
+ clearResults();
+ KMessageBox::sorry( this, i18n("You must enter a valid UIN."), i18n("ICQ Plugin") );
+ kdDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "Search aborted: invalid UIN " << m_searchUI->uin->text() << endl;
+ }
+ else
+ {
+ //doing a uin search
+ m_account->engine()->uinSearch( m_searchUI->uin->text() );
+ }
+ }
+ else if ( currentPage == m_searchUI->tab_2 )
+ {
+ //create a ICQWPSearchInfo struct and send it
+ ICQProtocol* p = ICQProtocol::protocol();
+ ICQWPSearchInfo info;
+ QTextCodec* codec = m_account->defaultCodec();
+ info.firstName = codec->fromUnicode( m_searchUI->firstName->text() );
+ info.lastName = codec->fromUnicode( m_searchUI->lastName->text() );
+ info.nickName = codec->fromUnicode( m_searchUI->nickName->text() );
+ info.email = codec->fromUnicode( m_searchUI->email->text() );
+ info.city = codec->fromUnicode( m_searchUI->city->text() ); // City
+ info.gender = p->getCodeForCombo(m_searchUI->gender, p->genders()); // Gender
+ info.language = p->getCodeForCombo(m_searchUI->language, p->languages()); // Lang
+ info.country =p->getCodeForCombo(m_searchUI->country, p->countries()); // country code
+ info.onlineOnly = m_searchUI->onlyOnline->isChecked();
+
+ // Check if the user has actually entered things to search
+ if( info.firstName.isEmpty() &&
+ info.lastName.isEmpty() &&
+ info.nickName.isEmpty() &&
+ info.email.isEmpty() &&
+ info.city.isEmpty() &&
+ (info.gender == 0) &&
+ (info.language == 0) &&
+ (info.country == 0)
+ )
+ {
+ // All fields were blank
+ stopSearch();
+ clearResults();
+ KMessageBox::information(this, i18n("You must enter search criteria."), i18n("ICQ Plugin") );
+ kdDebug(OSCAR_ICQ_DEBUG) << k_funcinfo << "Search aborted: all fields were blank" << endl;
+ }
+ else
+ {
+ // Start the search
+ m_account->engine()->whitePagesSearch( info );
+ kdDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "Starting whitepage search" << endl;
+ }
+ }
+ }
+}
+
+void ICQSearchDialog::stopSearch()
+{
+ disconnect( m_account->engine(), SIGNAL( gotSearchResults( const ICQSearchResult& ) ),
+ this, SLOT( newResult( const ICQSearchResult& ) ) );
+ disconnect( m_account->engine(), SIGNAL( endOfSearch( int ) ),
+ this, SLOT( searchFinished( int ) ) );
+
+ m_searchUI->stopButton->setEnabled( false );
+ m_searchUI->searchButton->setEnabled( true );
+ m_searchUI->newSearchButton->setEnabled( true );
+}
+
+void ICQSearchDialog::addContact()
+{
+ ICQAddContactPage* iacp = dynamic_cast<ICQAddContactPage*>( parent() );
+ if ( !iacp )
+ {
+ kdDebug(OSCAR_ICQ_DEBUG) << k_funcinfo << "The ICQ ACP is not our parent!!" << endl;
+ }
+ else
+ {
+ QString uin = m_searchUI->searchResults->selectedItem()->text( 0 );
+ kdDebug(OSCAR_ICQ_DEBUG) << k_funcinfo << "Passing " << uin << " back to the ACP" << endl;
+ iacp->setUINFromSearch( uin );
+
+ // Closing the dialog
+ closeDialog();
+ }
+}
+
+void ICQSearchDialog::userInfo()
+{
+ // Lookup user info only if the account is online, otherwise warn the user
+ if(!m_account->isConnected())
+ {
+ // Account currently offline
+ KMessageBox::sorry( this, i18n("You must be online to display user info."), i18n("ICQ Plugin") );
+ }
+ else
+ {
+ // Account currently online
+ m_contact = new ICQContact( m_account,
+ m_searchUI->searchResults->selectedItem()->text( 0 ),
+ NULL);
+
+ m_infoWidget = new ICQUserInfoWidget( Kopete::UI::Global::mainWidget(), "icq info" );
+ QObject::connect( m_infoWidget, SIGNAL( finished() ), this, SLOT( closeUserInfo() ) );
+
+ m_infoWidget->setContact( m_contact );
+ m_infoWidget->setModal(true);
+ m_infoWidget->show();
+ if ( m_contact->account()->isConnected() )
+ m_account->engine()->requestFullInfo( m_contact->contactId() );
+ kdDebug(OSCAR_ICQ_DEBUG) << k_funcinfo << "Displaying user info" << endl;
+ }
+}
+
+void ICQSearchDialog::closeUserInfo()
+{
+ // Free the ICQUserInfoWidget
+ QObject::disconnect( this, 0, m_infoWidget, 0 );
+ m_infoWidget->delayedDestruct();
+ m_infoWidget = NULL;
+
+ // Free the ICQContact
+ delete m_contact;
+ m_contact = NULL;
+}
+
+void ICQSearchDialog::clearResults()
+{
+ stopSearch();
+ m_searchUI->searchResults->clear();
+ m_searchUI->addButton->setEnabled( false );
+ m_searchUI->userInfoButton->setEnabled( false );
+ m_searchUI->searchButton->setEnabled( true );
+}
+
+void ICQSearchDialog::closeDialog()
+{
+ stopSearch();
+ clearResults();
+ clearFields();
+
+ slotClose();
+}
+
+void ICQSearchDialog::resultSelectionChanged()
+{
+ if ( !m_searchUI->searchResults->selectedItem() )
+ {
+ m_searchUI->addButton->setEnabled( false );
+ m_searchUI->userInfoButton->setEnabled( false );
+ }
+ else
+ {
+ m_searchUI->addButton->setEnabled( true );
+ m_searchUI->userInfoButton->setEnabled( true );
+ }
+}
+
+void ICQSearchDialog::newResult( const ICQSearchResult& info )
+{
+ if ( info.uin == 1 )
+ {
+ //TODO update progress
+ return;
+ }
+
+ QTextCodec* codec = m_account->defaultCodec();
+
+ QListViewItem *item = new QListViewItem( m_searchUI->searchResults, QString::number( info.uin ),
+ codec->toUnicode( info.nickName ),
+ codec->toUnicode( info.firstName ),
+ codec->toUnicode( info.lastName ),
+ codec->toUnicode( info.email ),
+ info.auth ? i18n( "Yes" ) : i18n( "No" ) );
+
+ if ( !item )
+ return;
+
+ if ( info.online )
+ item->setPixmap( 0, SmallIcon( "icq_online" ) );
+ else
+ item->setPixmap( 0, SmallIcon( "icq_offline" ) );
+
+}
+
+void ICQSearchDialog::searchFinished( int numLeft )
+{
+ kdWarning(OSCAR_ICQ_DEBUG) << k_funcinfo << "There are " << numLeft << "contact left out of this search" << endl;
+ m_searchUI->stopButton->setEnabled( false );
+ m_searchUI->clearButton->setEnabled( true );
+ m_searchUI->searchButton->setEnabled( true );
+ m_searchUI->newSearchButton->setEnabled( true );
+}
+
+void ICQSearchDialog::clearFields()
+{
+ m_searchUI->uin->setText( QString::null );
+
+ m_searchUI->firstName->setText( QString::null );
+ m_searchUI->lastName->setText( QString::null );
+ m_searchUI->nickName->setText( QString::null );
+ m_searchUI->email->setText( QString::null );
+ m_searchUI->city->setText( QString::null );
+ m_searchUI->gender->setCurrentItem( 0 ); // Unspecified
+ m_searchUI->country->setCurrentItem( 0 );
+ m_searchUI->language->setCurrentItem( 0 );
+ m_searchUI->onlyOnline->setChecked( false );
+}
+
+void ICQSearchDialog::newSearch()
+{
+ clearResults();
+ clearFields();
+}
+
+//kate: indent-mode csands; space-indent off; replace-tabs off; tab-width 4;
+
+#include "icqsearchdialog.moc"