/* Kopete Groupwise Protocol gwsearch.cpp - logic for server side search widget Copyright (c) 2004 SUSE Linux AG http://www.suse.com Kopete (c) 2002-2004 by the Kopete developers ************************************************************************* * * * 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 #include #include #include #include //#include #include #include #include #include "client.h" #include "gwaccount.h" #include "gwcontact.h" #include "gwcontactproperties.h" #include "gwprotocol.h" #include "tasks/searchusertask.h" #include "gwsearch.h" class GWSearchResultsLVI : public TQListViewItem { public: GWSearchResultsLVI( TQListView * parent, GroupWise::ContactDetails details, int status, const TQPixmap & statusPM/*, const TQString & userId */) : TQListViewItem( parent, TQString(), details.givenName, details.surname, GroupWiseProtocol::protocol()->dnToDotted( details.dn ) ), m_details( details ), m_status( status ) { setPixmap( 0, statusPM ); } TQString key( int column, bool ascending ) const { if ( column == 0 ) return TQString::number( 99 - m_status ); else return TQListViewItem::key( column, ascending ); } GroupWise::ContactDetails m_details; int m_status; }; GroupWiseContactSearch::GroupWiseContactSearch( GroupWiseAccount * account, TQListView::SelectionMode mode, bool onlineOnly, TQWidget *parent, const char *name) : GroupWiseContactSearchWidget(parent, name), m_account( account ), m_onlineOnly( onlineOnly ) { m_results->setSelectionMode( mode ); m_results->setAllColumnsShowFocus( true ); connect( m_details, TQT_SIGNAL( clicked() ), TQT_SLOT( slotShowDetails() ) ); connect( m_results, TQT_SIGNAL( selectionChanged() ), TQT_SLOT( slotValidateSelection() ) ); connect( m_search, TQT_SIGNAL( clicked() ), TQT_SLOT( slotDoSearch() ) ); connect( m_clear, TQT_SIGNAL( clicked() ), TQT_SLOT( slotClear() ) ); } GroupWiseContactSearch::~GroupWiseContactSearch() { } void GroupWiseContactSearch::slotClear() { m_firstName->clear(); m_lastName->clear(); m_userId->clear(); m_title->clear(); m_dept->clear(); } void GroupWiseContactSearch::slotDoSearch() { // build a query TQValueList< GroupWise::UserSearchQueryTerm > searchTerms; if ( !m_firstName->text().isEmpty() ) { GroupWise::UserSearchQueryTerm arg; arg.argument = m_firstName->text(); arg.field = "Given Name"; arg.operation = searchOperation( m_firstNameOperation->currentItem() ); searchTerms.append( arg ); } if ( !m_lastName->text().isEmpty() ) { GroupWise::UserSearchQueryTerm arg; arg.argument = m_lastName->text(); arg.field = "Surname"; arg.operation = searchOperation( m_lastNameOperation->currentItem() ); searchTerms.append( arg ); } if ( !m_userId->text().isEmpty() ) { GroupWise::UserSearchQueryTerm arg; arg.argument = m_userId->text(); arg.field = NM_A_SZ_USERID; arg.operation = searchOperation( m_userIdOperation->currentItem() ); searchTerms.append( arg ); } if ( !m_title->text().isEmpty() ) { GroupWise::UserSearchQueryTerm arg; arg.argument = m_title->text(); arg.field = NM_A_SZ_TITLE; arg.operation = searchOperation( m_titleOperation->currentItem() ); searchTerms.append( arg ); } if ( !m_dept->text().isEmpty() ) { GroupWise::UserSearchQueryTerm arg; arg.argument = m_dept->text(); arg.field = NM_A_SZ_DEPARTMENT; arg.operation = searchOperation( m_deptOperation->currentItem() ); searchTerms.append( arg ); } if ( !searchTerms.isEmpty() ) { // start a search task SearchUserTask * st = new SearchUserTask( m_account->client()->rootTask() ); st->search( searchTerms ); connect( st, TQT_SIGNAL( finished() ), TQT_SLOT( slotGotSearchResults() ) ); st->go( true ); m_matchCount->setText( i18n( "Searching" ) ); } else { kdDebug( GROUPWISE_DEBUG_GLOBAL ) << k_funcinfo << "no query to perform!" << endl; } } void GroupWiseContactSearch::slotShowDetails() { kdDebug( GROUPWISE_DEBUG_GLOBAL ) << k_funcinfo << endl; // get the first selected result TQValueList< ContactDetails > selected = selectedResults(); if ( selected.count() ) { // if they are already in our contact list, show that version ContactDetails dt = selected.first(); GroupWiseContact * c = m_account->contactForDN( dt.dn ); if ( c ) new GroupWiseContactProperties( c, this, "gwcontactproperties" ); else new GroupWiseContactProperties( dt, this, "gwcontactproperties" ); } } void GroupWiseContactSearch::slotGotSearchResults() { kdDebug( GROUPWISE_DEBUG_GLOBAL ) << k_funcinfo << endl; SearchUserTask * st = ( SearchUserTask * ) sender(); m_searchResults = st->results(); m_matchCount->setText( i18n( "1 matching user found", "%n matching users found", m_searchResults.count() ) ); m_results->clear(); TQValueList< GroupWise::ContactDetails >::Iterator it = m_searchResults.begin(); TQValueList< GroupWise::ContactDetails >::Iterator end = m_searchResults.end(); for ( ; it != end; ++it ) { // it's necessary to change the status used for the LVIs, // because the status returned by the server does not go linearly from Unknown to Available // which is no use for us to sort on, and converting it to a Kopete::OnlineStatus is overkill here int statusOrdered; switch ( (*it).status ) { case 0: //unknown statusOrdered = 0; break; case 1: //offline statusOrdered = 1; break; case 2: //online statusOrdered = 5; break; case 3: //busy statusOrdered = 2; break; case 4: // away statusOrdered = 3; break; case 5: //idle statusOrdered = 4; break; default: statusOrdered = 0; break; } new GWSearchResultsLVI( m_results, *it, statusOrdered, m_account->protocol()->gwStatusToKOS( (*it).status ).iconFor( m_account ) ); } // if there was only one hit, select it if ( m_results->childCount() == 1 ) m_results->firstChild()->setSelected( true ); slotValidateSelection(); } TQValueList< GroupWise::ContactDetails > GroupWiseContactSearch::selectedResults() { TQValueList< GroupWise::ContactDetails > lst; TQListViewItemIterator it( m_results ); while ( it.current() ) { if ( it.current()->isSelected() ) lst.append( static_cast< GWSearchResultsLVI * >( it.current() )->m_details ); ++it; } return lst; } // GWSearchResultsLVI * selection = static_cast< GWSearchResultsLVI * >( m_results->selectedItem() ); // contactId = selection->m_dn; // if ( displayName.isEmpty() ) // displayName = selection->text( 1 ) + " " + selection->text( 3 ); unsigned char GroupWiseContactSearch::searchOperation( int comboIndex ) { switch ( comboIndex ) { case 0: return NMFIELD_METHOD_SEARCH; case 1: return NMFIELD_METHOD_MATCHBEGIN; case 2: return NMFIELD_METHOD_EQUAL; } return NMFIELD_METHOD_IGNORE; } void GroupWiseContactSearch::slotValidateSelection() { bool ok = false; // if we only allow online contacts to be selected if ( m_onlineOnly ) { // check that one of the selected items is online TQListViewItemIterator it( m_results ); while ( it.current() ) { if ( it.current()->isSelected() && !( static_cast< GWSearchResultsLVI * >( it.current() )->m_status == 1 ) ) { ok = true; break; } ++it; } } else { // check that at least one item is selected TQListViewItemIterator it( m_results ); while ( it.current() ) { if ( it.current()->isSelected() ) { ok = true; break; } ++it; } } emit selectionValidates( ok ); } #include "gwsearch.moc"