summaryrefslogtreecommitdiffabout
path: root/kaddressbook
authorzautrix <zautrix>2004-09-09 20:39:55 (UTC)
committer zautrix <zautrix>2004-09-09 20:39:55 (UTC)
commit480ffef4859d24cc0a936377f8983fd59312d4b6 (patch) (unidiff)
tree9661e8b5e892ef653ffc2ed630dbe89acfeb4851 /kaddressbook
parent880518b6f1d4b06e3df45224c244d9c62f6fb7a9 (diff)
downloadkdepimpi-480ffef4859d24cc0a936377f8983fd59312d4b6.zip
kdepimpi-480ffef4859d24cc0a936377f8983fd59312d4b6.tar.gz
kdepimpi-480ffef4859d24cc0a936377f8983fd59312d4b6.tar.bz2
Added senseful searching in Kapi
Diffstat (limited to 'kaddressbook') (more/less context) (ignore whitespace changes)
-rw-r--r--kaddressbook/kabcore.cpp75
-rw-r--r--kaddressbook/kaddressbookview.h1
-rw-r--r--kaddressbook/viewmanager.cpp5
-rw-r--r--kaddressbook/viewmanager.h1
-rw-r--r--kaddressbook/views/kaddressbookcardview.cpp53
-rw-r--r--kaddressbook/views/kaddressbookcardview.h2
-rw-r--r--kaddressbook/views/kaddressbookiconview.cpp47
-rw-r--r--kaddressbook/views/kaddressbookiconview.h1
-rw-r--r--kaddressbook/views/kaddressbooktableview.cpp49
-rw-r--r--kaddressbook/views/kaddressbooktableview.h1
10 files changed, 159 insertions, 76 deletions
diff --git a/kaddressbook/kabcore.cpp b/kaddressbook/kabcore.cpp
index 1a1bcff..2a2f904 100644
--- a/kaddressbook/kabcore.cpp
+++ b/kaddressbook/kabcore.cpp
@@ -724,330 +724,257 @@ void KABCore::selectAllContacts()
724 724
725void KABCore::deleteContacts() 725void KABCore::deleteContacts()
726{ 726{
727 QStringList uidList = mViewManager->selectedUids(); 727 QStringList uidList = mViewManager->selectedUids();
728 deleteContacts( uidList ); 728 deleteContacts( uidList );
729} 729}
730 730
731void KABCore::deleteContacts( const QStringList &uids ) 731void KABCore::deleteContacts( const QStringList &uids )
732{ 732{
733 if ( uids.count() > 0 ) { 733 if ( uids.count() > 0 ) {
734 PwDeleteCommand *command = new PwDeleteCommand( mAddressBook, uids ); 734 PwDeleteCommand *command = new PwDeleteCommand( mAddressBook, uids );
735 UndoStack::instance()->push( command ); 735 UndoStack::instance()->push( command );
736 RedoStack::instance()->clear(); 736 RedoStack::instance()->clear();
737 737
738 // now if we deleted anything, refresh 738 // now if we deleted anything, refresh
739 setContactSelected( QString::null ); 739 setContactSelected( QString::null );
740 setModified( true ); 740 setModified( true );
741 } 741 }
742} 742}
743 743
744void KABCore::copyContacts() 744void KABCore::copyContacts()
745{ 745{
746 KABC::Addressee::List addrList = mViewManager->selectedAddressees(); 746 KABC::Addressee::List addrList = mViewManager->selectedAddressees();
747 747
748 QString clipText = AddresseeUtil::addresseesToClipboard( addrList ); 748 QString clipText = AddresseeUtil::addresseesToClipboard( addrList );
749 749
750 kdDebug(5720) << "KABCore::copyContacts: " << clipText << endl; 750 kdDebug(5720) << "KABCore::copyContacts: " << clipText << endl;
751 751
752 QClipboard *cb = QApplication::clipboard(); 752 QClipboard *cb = QApplication::clipboard();
753 cb->setText( clipText ); 753 cb->setText( clipText );
754} 754}
755 755
756void KABCore::cutContacts() 756void KABCore::cutContacts()
757{ 757{
758 QStringList uidList = mViewManager->selectedUids(); 758 QStringList uidList = mViewManager->selectedUids();
759 759
760//US if ( uidList.size() > 0 ) { 760//US if ( uidList.size() > 0 ) {
761 if ( uidList.count() > 0 ) { 761 if ( uidList.count() > 0 ) {
762 PwCutCommand *command = new PwCutCommand( mAddressBook, uidList ); 762 PwCutCommand *command = new PwCutCommand( mAddressBook, uidList );
763 UndoStack::instance()->push( command ); 763 UndoStack::instance()->push( command );
764 RedoStack::instance()->clear(); 764 RedoStack::instance()->clear();
765 765
766 setModified( true ); 766 setModified( true );
767 } 767 }
768} 768}
769 769
770void KABCore::pasteContacts() 770void KABCore::pasteContacts()
771{ 771{
772 QClipboard *cb = QApplication::clipboard(); 772 QClipboard *cb = QApplication::clipboard();
773 773
774 KABC::Addressee::List list = AddresseeUtil::clipboardToAddressees( cb->text() ); 774 KABC::Addressee::List list = AddresseeUtil::clipboardToAddressees( cb->text() );
775 775
776 pasteContacts( list ); 776 pasteContacts( list );
777} 777}
778 778
779void KABCore::pasteContacts( KABC::Addressee::List &list ) 779void KABCore::pasteContacts( KABC::Addressee::List &list )
780{ 780{
781 KABC::Resource *resource = requestResource( this ); 781 KABC::Resource *resource = requestResource( this );
782 KABC::Addressee::List::Iterator it; 782 KABC::Addressee::List::Iterator it;
783 for ( it = list.begin(); it != list.end(); ++it ) 783 for ( it = list.begin(); it != list.end(); ++it )
784 (*it).setResource( resource ); 784 (*it).setResource( resource );
785 785
786 PwPasteCommand *command = new PwPasteCommand( this, list ); 786 PwPasteCommand *command = new PwPasteCommand( this, list );
787 UndoStack::instance()->push( command ); 787 UndoStack::instance()->push( command );
788 RedoStack::instance()->clear(); 788 RedoStack::instance()->clear();
789 789
790 setModified( true ); 790 setModified( true );
791} 791}
792 792
793void KABCore::setWhoAmI() 793void KABCore::setWhoAmI()
794{ 794{
795 KABC::Addressee::List addrList = mViewManager->selectedAddressees(); 795 KABC::Addressee::List addrList = mViewManager->selectedAddressees();
796 796
797 if ( addrList.count() > 1 ) { 797 if ( addrList.count() > 1 ) {
798 KMessageBox::sorry( this, i18n( "Please select only one contact." ) ); 798 KMessageBox::sorry( this, i18n( "Please select only one contact." ) );
799 return; 799 return;
800 } 800 }
801 801
802 QString text( i18n( "<qt>Do you really want to use <b>%1</b> as your new personal contact?</qt>" ) ); 802 QString text( i18n( "<qt>Do you really want to use <b>%1</b> as your new personal contact?</qt>" ) );
803 if ( KMessageBox::questionYesNo( this, text.arg( addrList[ 0 ].assembledName() ) ) == KMessageBox::Yes ) 803 if ( KMessageBox::questionYesNo( this, text.arg( addrList[ 0 ].assembledName() ) ) == KMessageBox::Yes )
804 static_cast<KABC::StdAddressBook*>( KABC::StdAddressBook::self() )->setWhoAmI( addrList[ 0 ] ); 804 static_cast<KABC::StdAddressBook*>( KABC::StdAddressBook::self() )->setWhoAmI( addrList[ 0 ] );
805} 805}
806 806
807void KABCore::setCategories() 807void KABCore::setCategories()
808{ 808{
809 KPIM::CategorySelectDialog dlg( KABPrefs::instance(), this, "", true ); 809 KPIM::CategorySelectDialog dlg( KABPrefs::instance(), this, "", true );
810 if ( !dlg.exec() ) 810 if ( !dlg.exec() )
811 return; 811 return;
812 812
813 bool merge = false; 813 bool merge = false;
814 QString msg = i18n( "Merge with existing categories?" ); 814 QString msg = i18n( "Merge with existing categories?" );
815 if ( KMessageBox::questionYesNo( this, msg ) == KMessageBox::Yes ) 815 if ( KMessageBox::questionYesNo( this, msg ) == KMessageBox::Yes )
816 merge = true; 816 merge = true;
817 817
818 QStringList categories = dlg.selectedCategories(); 818 QStringList categories = dlg.selectedCategories();
819 819
820 QStringList uids = mViewManager->selectedUids(); 820 QStringList uids = mViewManager->selectedUids();
821 QStringList::Iterator it; 821 QStringList::Iterator it;
822 for ( it = uids.begin(); it != uids.end(); ++it ) { 822 for ( it = uids.begin(); it != uids.end(); ++it ) {
823 KABC::Addressee addr = mAddressBook->findByUid( *it ); 823 KABC::Addressee addr = mAddressBook->findByUid( *it );
824 if ( !addr.isEmpty() ) { 824 if ( !addr.isEmpty() ) {
825 if ( !merge ) 825 if ( !merge )
826 addr.setCategories( categories ); 826 addr.setCategories( categories );
827 else { 827 else {
828 QStringList addrCategories = addr.categories(); 828 QStringList addrCategories = addr.categories();
829 QStringList::Iterator catIt; 829 QStringList::Iterator catIt;
830 for ( catIt = categories.begin(); catIt != categories.end(); ++catIt ) { 830 for ( catIt = categories.begin(); catIt != categories.end(); ++catIt ) {
831 if ( !addrCategories.contains( *catIt ) ) 831 if ( !addrCategories.contains( *catIt ) )
832 addrCategories.append( *catIt ); 832 addrCategories.append( *catIt );
833 } 833 }
834 addr.setCategories( addrCategories ); 834 addr.setCategories( addrCategories );
835 } 835 }
836 836
837 mAddressBook->insertAddressee( addr ); 837 mAddressBook->insertAddressee( addr );
838 } 838 }
839 } 839 }
840 840
841 if ( uids.count() > 0 ) 841 if ( uids.count() > 0 )
842 setModified( true ); 842 setModified( true );
843} 843}
844 844
845void KABCore::setSearchFields( const KABC::Field::List &fields ) 845void KABCore::setSearchFields( const KABC::Field::List &fields )
846{ 846{
847 mIncSearchWidget->setFields( fields ); 847 mIncSearchWidget->setFields( fields );
848} 848}
849 849
850void KABCore::incrementalSearch( const QString& text ) 850void KABCore::incrementalSearch( const QString& text )
851{ 851{
852 mViewManager->setSelected( QString::null, false ); 852 mViewManager->doSearch( text, mIncSearchWidget->currentField() );
853
854 if ( !text.isEmpty() ) {
855 KABC::Field *field = mIncSearchWidget->currentField();
856 QString pattern = text.lower()+"*";
857 QRegExp re;
858 re.setWildcard(true); // most people understand these better.
859 re.setCaseSensitive(false);
860 re.setPattern( pattern );
861 QStringList foundUids;
862 if (!re.isValid())
863 return;
864#if 1 //KDE_VERSION >= 319
865 KABC::AddresseeList list( mAddressBook->allAddressees() );
866 if ( field ) {
867 list.sortByField( field );
868 KABC::AddresseeList::Iterator it;
869 for ( it = list.begin(); it != list.end(); ++it ) {
870
871#if QT_VERSION >= 300
872 if (re.search(field->value( *it ).lower()) != -1)
873#else
874 if (re.match(field->value( *it ).lower()) != -1)
875#endif
876 {
877 // if ( field->value( *it ).lower().startsWith( pattern ) ) {
878 //mViewManager->setSelected( (*it).uid(), true );
879 foundUids.append( (*it).uid() );
880 //return;
881 }
882 }
883 } else {
884 KABC::AddresseeList::Iterator it;
885 for ( it = list.begin(); it != list.end(); ++it ) {
886 KABC::Field::List fieldList = mIncSearchWidget->fields();
887 KABC::Field::List::ConstIterator fieldIt;
888 for ( fieldIt = fieldList.begin(); fieldIt != fieldList.end(); ++fieldIt ) {
889#if QT_VERSION >= 300
890 if (re.search((*fieldIt)->value( *it ).lower()) != -1)
891#else
892 if (re.match((*fieldIt)->value( *it ).lower()) != -1)
893#endif
894 {
895 // if ( (*fieldIt)->value( *it ).lower().startsWith( pattern ) ) {
896 //mViewManager->setSelected( (*it).uid(), true );
897 foundUids.append( (*it).uid() );
898 //return;
899 }
900 }
901 }
902 }
903 if ( foundUids.count() > 0 )
904 mViewManager->setListSelected( foundUids );
905#else
906 KABC::AddressBook::Iterator it;
907 for ( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) {
908 if ( field ) {
909 if ( field->value( *it ).lower().startsWith( pattern ) ) {
910 mViewManager->setSelected( (*it).uid(), true );
911 return;
912 }
913 } else {
914 KABC::Field::List fieldList = mIncSearchWidget->fields();
915 KABC::Field::List::ConstIterator fieldIt;
916 for ( fieldIt = fieldList.begin(); fieldIt != fieldList.end(); ++fieldIt ) {
917 if ( (*fieldIt)->value( *it ).lower().startsWith( pattern ) ) {
918 mViewManager->setSelected( (*it).uid(), true );
919 return;
920 }
921 }
922 }
923 }
924#endif
925 }
926} 853}
927 854
928void KABCore::setModified() 855void KABCore::setModified()
929{ 856{
930 setModified( true ); 857 setModified( true );
931} 858}
932 859
933void KABCore::setModifiedWOrefresh() 860void KABCore::setModifiedWOrefresh()
934{ 861{
935 // qDebug("KABCore::setModifiedWOrefresh() "); 862 // qDebug("KABCore::setModifiedWOrefresh() ");
936 mModified = true; 863 mModified = true;
937 mActionSave->setEnabled( mModified ); 864 mActionSave->setEnabled( mModified );
938#ifdef DESKTOP_VERSION 865#ifdef DESKTOP_VERSION
939 mDetails->refreshView(); 866 mDetails->refreshView();
940#endif 867#endif
941 868
942} 869}
943void KABCore::setModified( bool modified ) 870void KABCore::setModified( bool modified )
944{ 871{
945 mModified = modified; 872 mModified = modified;
946 mActionSave->setEnabled( mModified ); 873 mActionSave->setEnabled( mModified );
947 874
948 if ( modified ) 875 if ( modified )
949 mJumpButtonBar->recreateButtons(); 876 mJumpButtonBar->recreateButtons();
950 877
951 mViewManager->refreshView(); 878 mViewManager->refreshView();
952 mDetails->refreshView(); 879 mDetails->refreshView();
953 880
954} 881}
955 882
956bool KABCore::modified() const 883bool KABCore::modified() const
957{ 884{
958 return mModified; 885 return mModified;
959} 886}
960 887
961void KABCore::contactModified( const KABC::Addressee &addr ) 888void KABCore::contactModified( const KABC::Addressee &addr )
962{ 889{
963 890
964 Command *command = 0; 891 Command *command = 0;
965 QString uid; 892 QString uid;
966 893
967 // check if it exists already 894 // check if it exists already
968 KABC::Addressee origAddr = mAddressBook->findByUid( addr.uid() ); 895 KABC::Addressee origAddr = mAddressBook->findByUid( addr.uid() );
969 if ( origAddr.isEmpty() ) 896 if ( origAddr.isEmpty() )
970 command = new PwNewCommand( mAddressBook, addr ); 897 command = new PwNewCommand( mAddressBook, addr );
971 else { 898 else {
972 command = new PwEditCommand( mAddressBook, origAddr, addr ); 899 command = new PwEditCommand( mAddressBook, origAddr, addr );
973 uid = addr.uid(); 900 uid = addr.uid();
974 } 901 }
975 902
976 UndoStack::instance()->push( command ); 903 UndoStack::instance()->push( command );
977 RedoStack::instance()->clear(); 904 RedoStack::instance()->clear();
978 905
979 setModified( true ); 906 setModified( true );
980} 907}
981 908
982void KABCore::newContact() 909void KABCore::newContact()
983{ 910{
984 911
985 912
986 QPtrList<KABC::Resource> kabcResources = mAddressBook->resources(); 913 QPtrList<KABC::Resource> kabcResources = mAddressBook->resources();
987 914
988 QPtrList<KRES::Resource> kresResources; 915 QPtrList<KRES::Resource> kresResources;
989 QPtrListIterator<KABC::Resource> it( kabcResources ); 916 QPtrListIterator<KABC::Resource> it( kabcResources );
990 KABC::Resource *resource; 917 KABC::Resource *resource;
991 while ( ( resource = it.current() ) != 0 ) { 918 while ( ( resource = it.current() ) != 0 ) {
992 ++it; 919 ++it;
993 if ( !resource->readOnly() ) { 920 if ( !resource->readOnly() ) {
994 KRES::Resource *res = static_cast<KRES::Resource*>( resource ); 921 KRES::Resource *res = static_cast<KRES::Resource*>( resource );
995 if ( res ) 922 if ( res )
996 kresResources.append( res ); 923 kresResources.append( res );
997 } 924 }
998 } 925 }
999 926
1000 KRES::Resource *res = KRES::SelectDialog::getResource( kresResources, this ); 927 KRES::Resource *res = KRES::SelectDialog::getResource( kresResources, this );
1001 resource = static_cast<KABC::Resource*>( res ); 928 resource = static_cast<KABC::Resource*>( res );
1002 929
1003 if ( resource ) { 930 if ( resource ) {
1004 KABC::Addressee addr; 931 KABC::Addressee addr;
1005 addr.setResource( resource ); 932 addr.setResource( resource );
1006 mEditorDialog->setAddressee( addr ); 933 mEditorDialog->setAddressee( addr );
1007 KApplication::execDialog ( mEditorDialog ); 934 KApplication::execDialog ( mEditorDialog );
1008 935
1009 } else 936 } else
1010 return; 937 return;
1011 938
1012 // mEditorDict.insert( dialog->addressee().uid(), dialog ); 939 // mEditorDict.insert( dialog->addressee().uid(), dialog );
1013 940
1014 941
1015} 942}
1016 943
1017void KABCore::addEmail( QString aStr ) 944void KABCore::addEmail( QString aStr )
1018{ 945{
1019#ifndef KAB_EMBEDDED 946#ifndef KAB_EMBEDDED
1020 QString fullName, email; 947 QString fullName, email;
1021 948
1022 KABC::Addressee::parseEmailAddress( aStr, fullName, email ); 949 KABC::Addressee::parseEmailAddress( aStr, fullName, email );
1023 950
1024 // Try to lookup the addressee matching the email address 951 // Try to lookup the addressee matching the email address
1025 bool found = false; 952 bool found = false;
1026 QStringList emailList; 953 QStringList emailList;
1027 KABC::AddressBook::Iterator it; 954 KABC::AddressBook::Iterator it;
1028 for ( it = mAddressBook->begin(); !found && (it != mAddressBook->end()); ++it ) { 955 for ( it = mAddressBook->begin(); !found && (it != mAddressBook->end()); ++it ) {
1029 emailList = (*it).emails(); 956 emailList = (*it).emails();
1030 if ( emailList.contains( email ) > 0 ) { 957 if ( emailList.contains( email ) > 0 ) {
1031 found = true; 958 found = true;
1032 (*it).setNameFromString( fullName ); 959 (*it).setNameFromString( fullName );
1033 editContact( (*it).uid() ); 960 editContact( (*it).uid() );
1034 } 961 }
1035 } 962 }
1036 963
1037 if ( !found ) { 964 if ( !found ) {
1038 KABC::Addressee addr; 965 KABC::Addressee addr;
1039 addr.setNameFromString( fullName ); 966 addr.setNameFromString( fullName );
1040 addr.insertEmail( email, true ); 967 addr.insertEmail( email, true );
1041 968
1042 mAddressBook->insertAddressee( addr ); 969 mAddressBook->insertAddressee( addr );
1043 mViewManager->refreshView( addr.uid() ); 970 mViewManager->refreshView( addr.uid() );
1044 editContact( addr.uid() ); 971 editContact( addr.uid() );
1045 } 972 }
1046#else //KAB_EMBEDDED 973#else //KAB_EMBEDDED
1047 qDebug("KABCore::addEmail finsih method"); 974 qDebug("KABCore::addEmail finsih method");
1048#endif //KAB_EMBEDDED 975#endif //KAB_EMBEDDED
1049} 976}
1050 977
1051void KABCore::importVCard( const KURL &url, bool showPreview ) 978void KABCore::importVCard( const KURL &url, bool showPreview )
1052{ 979{
1053 mXXPortManager->importVCard( url, showPreview ); 980 mXXPortManager->importVCard( url, showPreview );
diff --git a/kaddressbook/kaddressbookview.h b/kaddressbook/kaddressbookview.h
index 7457080..17106e8 100644
--- a/kaddressbook/kaddressbookview.h
+++ b/kaddressbook/kaddressbookview.h
@@ -1,194 +1,195 @@
1/* 1/*
2 This file is part of KAddressBook. 2 This file is part of KAddressBook.
3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com> 3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com>
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 18
19 As a special exception, permission is given to link this program 19 As a special exception, permission is given to link this program
20 with any edition of Qt, and distribute the resulting executable, 20 with any edition of Qt, and distribute the resulting executable,
21 without including the source code for Qt in the source distribution. 21 without including the source code for Qt in the source distribution.
22*/ 22*/
23 23
24#ifndef KADDRESSBOOKVIEW_H 24#ifndef KADDRESSBOOKVIEW_H
25#define KADDRESSBOOKVIEW_H 25#define KADDRESSBOOKVIEW_H
26 26
27#ifndef KAB_EMBEDDED 27#ifndef KAB_EMBEDDED
28#include <klibloader.h> 28#include <klibloader.h>
29#endif //KAB_EMBEDDED 29#endif //KAB_EMBEDDED
30 30
31class KConfig; 31class KConfig;
32class QDropEvent; 32class QDropEvent;
33 33
34#include <qstringlist.h> 34#include <qstringlist.h>
35#include <kabc/field.h> 35#include <kabc/field.h>
36#include <qwidget.h> 36#include <qwidget.h>
37 37
38#include "viewconfigurewidget.h" 38#include "viewconfigurewidget.h"
39#include "filter.h" 39#include "filter.h"
40 40
41namespace KABC { class AddressBook; } 41namespace KABC { class AddressBook; }
42 42
43/** 43/**
44 Base class for all views in kaddressbook. This class implements 44 Base class for all views in kaddressbook. This class implements
45 all the common methods needed to provide a view to the user. 45 all the common methods needed to provide a view to the user.
46 46
47 To implement a specific view (table, card, etc), just inherit from 47 To implement a specific view (table, card, etc), just inherit from
48 this class and implement all the pure virtuals. 48 this class and implement all the pure virtuals.
49 49
50 @author Mike Pilone <mpilone@slac.com> 50 @author Mike Pilone <mpilone@slac.com>
51 */ 51 */
52class KAddressBookView : public QWidget 52class KAddressBookView : public QWidget
53{ 53{
54 Q_OBJECT 54 Q_OBJECT
55 55
56 public: 56 public:
57 enum DefaultFilterType { None = 0, Active = 1, Specific = 2 }; 57 enum DefaultFilterType { None = 0, Active = 1, Specific = 2 };
58 58
59 KAddressBookView( KABC::AddressBook *ab, QWidget *parent, const char *name ); 59 KAddressBookView( KABC::AddressBook *ab, QWidget *parent, const char *name );
60 virtual ~KAddressBookView(); 60 virtual ~KAddressBookView();
61 61
62 /** 62 /**
63 Must be overloaded in subclasses. Should return a list of 63 Must be overloaded in subclasses. Should return a list of
64 all the uids of selected contacts. 64 all the uids of selected contacts.
65 */ 65 */
66 virtual QStringList selectedUids() = 0; 66 virtual QStringList selectedUids() = 0;
67 virtual void doSearch( const QString& s ,KABC::Field *field ) = 0;
67 68
68 /** 69 /**
69 Called whenever this view should read the config. This can be used 70 Called whenever this view should read the config. This can be used
70 as a sign that the config has changed, therefore the view should 71 as a sign that the config has changed, therefore the view should
71 assume the worst and rebuild itself if necessary. For example, 72 assume the worst and rebuild itself if necessary. For example,
72 in a table view this method may be called when the user adds or 73 in a table view this method may be called when the user adds or
73 removes columns from the view. 74 removes columns from the view.
74 75
75 If overloaded in the subclass, do not forget to call super class's 76 If overloaded in the subclass, do not forget to call super class's
76 method. 77 method.
77 78
78 @param config The KConfig object to read from. The group will already 79 @param config The KConfig object to read from. The group will already
79 be set, so do not change the group. 80 be set, so do not change the group.
80 */ 81 */
81 virtual void readConfig( KConfig *config ); 82 virtual void readConfig( KConfig *config );
82 83
83 /** 84 /**
84 Called whenever this view should write the config. The view should not 85 Called whenever this view should write the config. The view should not
85 write out information handled by the application, such as which fields 86 write out information handled by the application, such as which fields
86 are visible. The view should only write out information specific 87 are visible. The view should only write out information specific
87 to itself (i.e.: All information in the ViewConfigWidget) 88 to itself (i.e.: All information in the ViewConfigWidget)
88 89
89 If overloaded in the subclass, do not forget to call the super class's 90 If overloaded in the subclass, do not forget to call the super class's
90 method. 91 method.
91 92
92 @param config The KConfig object to read from. The group will already 93 @param config The KConfig object to read from. The group will already
93 be set, so do not change the group. 94 be set, so do not change the group.
94 */ 95 */
95 virtual void writeConfig( KConfig *config ); 96 virtual void writeConfig( KConfig *config );
96 97
97 /** 98 /**
98 Returns a QString with all the selected email addresses concatenated 99 Returns a QString with all the selected email addresses concatenated
99 together with a ',' seperator. 100 together with a ',' seperator.
100 */ 101 */
101 virtual QString selectedEmails(); 102 virtual QString selectedEmails();
102 103
103 /** 104 /**
104 Return the type of the view: Icon, Table, etc. Please make sure that 105 Return the type of the view: Icon, Table, etc. Please make sure that
105 this is the same value that ViewWrapper::type() will return for your 106 this is the same value that ViewWrapper::type() will return for your
106 view. 107 view.
107 */ 108 */
108 virtual QString type() const = 0; 109 virtual QString type() const = 0;
109 110
110 /** 111 /**
111 Returns a list of the fields that should be displayed. The list 112 Returns a list of the fields that should be displayed. The list
112 is composed of the fields proper names (ie: Home Address), so 113 is composed of the fields proper names (ie: Home Address), so
113 the view may need to translate them in order to get the 114 the view may need to translate them in order to get the
114 value from the addressee. 115 value from the addressee.
115 116
116 This list is generated from the config file, so it is advisable to call 117 This list is generated from the config file, so it is advisable to call
117 this method whenever a readConfig() is called in order to get the newest 118 this method whenever a readConfig() is called in order to get the newest
118 list of fields. 119 list of fields.
119 */ 120 */
120 KABC::Field::List fields() const; 121 KABC::Field::List fields() const;
121 122
122 /** 123 /**
123 Sets the active filter. This filter will be used for filtering 124 Sets the active filter. This filter will be used for filtering
124 the list of addressees to display. The view will <b>not</b> 125 the list of addressees to display. The view will <b>not</b>
125 automatically refresh itself, so in most cases you will want to call 126 automatically refresh itself, so in most cases you will want to call
126 KAddressBookView::refresh() after this method. 127 KAddressBookView::refresh() after this method.
127 */ 128 */
128 void setFilter( const Filter& ); 129 void setFilter( const Filter& );
129 130
130 /** 131 /**
131 @return The default filter type selection. If the selection 132 @return The default filter type selection. If the selection
132 is SpecificFilter, the name of the filter can be retrieved with 133 is SpecificFilter, the name of the filter can be retrieved with
133 defaultFilterName() 134 defaultFilterName()
134 */ 135 */
135 DefaultFilterType defaultFilterType() const; 136 DefaultFilterType defaultFilterType() const;
136 137
137 /** 138 /**
138 @return The name of the default filter. This string is 139 @return The name of the default filter. This string is
139 only valid if defaultFilterType() is returning SpecificFilter. 140 only valid if defaultFilterType() is returning SpecificFilter.
140 */ 141 */
141 const QString &defaultFilterName() const; 142 const QString &defaultFilterName() const;
142 143
143 /** 144 /**
144 @return The address book. 145 @return The address book.
145 */ 146 */
146 KABC::AddressBook *addressBook() const; 147 KABC::AddressBook *addressBook() const;
147 148
148 public slots: 149 public slots:
149 /** 150 /**
150 Must be overloaded in subclasses to refresh the view. 151 Must be overloaded in subclasses to refresh the view.
151 Refreshing includes updating the view to ensure that only items 152 Refreshing includes updating the view to ensure that only items
152 in the document are visible. If <i>uid</i> is valid, only the 153 in the document are visible. If <i>uid</i> is valid, only the
153 addressee with uid needs to be refreshed. This is an optimization 154 addressee with uid needs to be refreshed. This is an optimization
154 only. 155 only.
155 */ 156 */
156 virtual void refresh( QString uid = QString::null ) = 0; 157 virtual void refresh( QString uid = QString::null ) = 0;
157 158
158 /** 159 /**
159 This method must be overloaded in subclasses. Select (highlight) 160 This method must be overloaded in subclasses. Select (highlight)
160 the addressee matching <i>uid</i>. If uid 161 the addressee matching <i>uid</i>. If uid
161 is equal to QString::null, then all addressees should be selected. 162 is equal to QString::null, then all addressees should be selected.
162 */ 163 */
163#ifndef KAB_EMBEDDED 164#ifndef KAB_EMBEDDED
164//MOC_SKIP_BEGIN 165//MOC_SKIP_BEGIN
165 virtual void setSelected( QString uid = QString::null, bool selected = true ) = 0; 166 virtual void setSelected( QString uid = QString::null, bool selected = true ) = 0;
166//MOC_SKIP_END 167//MOC_SKIP_END
167#else //KAB_EMBEDDED 168#else //KAB_EMBEDDED
168 //US my moc can not handle the default parameters. Is this a problem ??? 169 //US my moc can not handle the default parameters. Is this a problem ???
169 virtual void setSelected( QString uid, bool selected) = 0; 170 virtual void setSelected( QString uid, bool selected) = 0;
170#endif //KAB_EMBEDDED 171#endif //KAB_EMBEDDED
171 172
172 signals: 173 signals:
173 /** 174 /**
174 This signal should be emitted by a subclass whenever an addressee 175 This signal should be emitted by a subclass whenever an addressee
175 is modified. 176 is modified.
176 */ 177 */
177 void modified(); 178 void modified();
178 179
179 /** 180 /**
180 This signal should be emitted by a subclass whenever an addressee 181 This signal should be emitted by a subclass whenever an addressee
181 is selected. Selected means that the addressee was given the focus. 182 is selected. Selected means that the addressee was given the focus.
182 Some widgets may call this 'highlighted'. The view is responsible for 183 Some widgets may call this 'highlighted'. The view is responsible for
183 emitting this signal multiple times if multiple items are selected, 184 emitting this signal multiple times if multiple items are selected,
184 with the last item selected being the last emit. 185 with the last item selected being the last emit.
185 186
186 @param uid The uid of the selected addressee. 187 @param uid The uid of the selected addressee.
187 188
188 @see KListView 189 @see KListView
189 */ 190 */
190 void selected( const QString &uid ); 191 void selected( const QString &uid );
191 void deleteRequest(); 192 void deleteRequest();
192 /** 193 /**
193 This signal should be emitted by a subclass whenever an addressee 194 This signal should be emitted by a subclass whenever an addressee
194 is executed. This is defined by the KDE system wide config, but it 195 is executed. This is defined by the KDE system wide config, but it
diff --git a/kaddressbook/viewmanager.cpp b/kaddressbook/viewmanager.cpp
index c93d51a..c6baeac 100644
--- a/kaddressbook/viewmanager.cpp
+++ b/kaddressbook/viewmanager.cpp
@@ -421,257 +421,262 @@ void ViewManager::addView()
421 mActionSelectView->setCurrentItem( mViewNameList.findIndex( newName ) ); 421 mActionSelectView->setCurrentItem( mViewNameList.findIndex( newName ) );
422 setActiveView( newName ); 422 setActiveView( newName );
423 423
424 editView(); 424 editView();
425 425
426 mActionDeleteView->setEnabled( mViewNameList.count() > 1 ); 426 mActionDeleteView->setEnabled( mViewNameList.count() > 1 );
427 } 427 }
428} 428}
429 429
430void ViewManager::createViewFactories() 430void ViewManager::createViewFactories()
431{ 431{
432#ifndef KAB_EMBEDDED 432#ifndef KAB_EMBEDDED
433 KTrader::OfferList plugins = KTrader::self()->query( "KAddressBook/View" ); 433 KTrader::OfferList plugins = KTrader::self()->query( "KAddressBook/View" );
434 KTrader::OfferList::ConstIterator it; 434 KTrader::OfferList::ConstIterator it;
435 for ( it = plugins.begin(); it != plugins.end(); ++it ) { 435 for ( it = plugins.begin(); it != plugins.end(); ++it ) {
436 if ( !(*it)->hasServiceType( "KAddressBook/View" ) ) 436 if ( !(*it)->hasServiceType( "KAddressBook/View" ) )
437 continue; 437 continue;
438 438
439 KLibFactory *factory = KLibLoader::self()->factory( (*it)->library().latin1() ); 439 KLibFactory *factory = KLibLoader::self()->factory( (*it)->library().latin1() );
440 440
441 if ( !factory ) { 441 if ( !factory ) {
442 kdDebug(5720) << "ViewManager::createViewFactories(): Factory creation failed" << endl; 442 kdDebug(5720) << "ViewManager::createViewFactories(): Factory creation failed" << endl;
443 continue; 443 continue;
444 } 444 }
445 445
446 ViewFactory *viewFactory = static_cast<ViewFactory*>( factory ); 446 ViewFactory *viewFactory = static_cast<ViewFactory*>( factory );
447 447
448 if ( !viewFactory ) { 448 if ( !viewFactory ) {
449 kdDebug(5720) << "ViewManager::createViewFactories(): Cast failed" << endl; 449 kdDebug(5720) << "ViewManager::createViewFactories(): Cast failed" << endl;
450 continue; 450 continue;
451 } 451 }
452 452
453 mViewFactoryDict.insert( viewFactory->type(), viewFactory ); 453 mViewFactoryDict.insert( viewFactory->type(), viewFactory );
454 } 454 }
455 455
456#else //KAB_EMBEDDED 456#else //KAB_EMBEDDED
457 ViewFactory* viewFactory = new IconViewFactory(); 457 ViewFactory* viewFactory = new IconViewFactory();
458 mViewFactoryDict.insert( viewFactory->type(), viewFactory ); 458 mViewFactoryDict.insert( viewFactory->type(), viewFactory );
459// qDebug("ViewManager::createViewFactories() Loading factory: %s", viewFactory->type().latin1()); 459// qDebug("ViewManager::createViewFactories() Loading factory: %s", viewFactory->type().latin1());
460 460
461 viewFactory = new TableViewFactory(); 461 viewFactory = new TableViewFactory();
462 mViewFactoryDict.insert( viewFactory->type(), viewFactory ); 462 mViewFactoryDict.insert( viewFactory->type(), viewFactory );
463// qDebug("ViewManager::createViewFactories() Loading factory: %s", viewFactory->type().latin1()); 463// qDebug("ViewManager::createViewFactories() Loading factory: %s", viewFactory->type().latin1());
464 464
465 viewFactory = new CardViewFactory(); 465 viewFactory = new CardViewFactory();
466 mViewFactoryDict.insert( viewFactory->type(), viewFactory ); 466 mViewFactoryDict.insert( viewFactory->type(), viewFactory );
467// qDebug("ViewManager::createViewFactories() Loading factory: %s", viewFactory->type().latin1()); 467// qDebug("ViewManager::createViewFactories() Loading factory: %s", viewFactory->type().latin1());
468 468
469#endif //KAB_EMBEDDED 469#endif //KAB_EMBEDDED
470 470
471} 471}
472 472
473void ViewManager::dropped( QDropEvent *e ) 473void ViewManager::dropped( QDropEvent *e )
474{ 474{
475 kdDebug(5720) << "ViewManager::dropped: got a drop event" << endl; 475 kdDebug(5720) << "ViewManager::dropped: got a drop event" << endl;
476 476
477#ifndef KAB_EMBEDDED 477#ifndef KAB_EMBEDDED
478 478
479 QString clipText, vcards; 479 QString clipText, vcards;
480 KURL::List urls; 480 KURL::List urls;
481 481
482 if ( KURLDrag::decode( e, urls) ) { 482 if ( KURLDrag::decode( e, urls) ) {
483 KURL::List::Iterator it = urls.begin(); 483 KURL::List::Iterator it = urls.begin();
484 int c = urls.count(); 484 int c = urls.count();
485 if ( c > 1 ) { 485 if ( c > 1 ) {
486 QString questionString = i18n( "Import one contact into your addressbook?", "Import %n contacts into your addressbook?", c ); 486 QString questionString = i18n( "Import one contact into your addressbook?", "Import %n contacts into your addressbook?", c );
487 if ( KMessageBox::questionYesNo( this, questionString, i18n( "Import Contacts?" ) ) == KMessageBox::Yes ) { 487 if ( KMessageBox::questionYesNo( this, questionString, i18n( "Import Contacts?" ) ) == KMessageBox::Yes ) {
488 for ( ; it != urls.end(); ++it ) 488 for ( ; it != urls.end(); ++it )
489 emit urlDropped( *it ); 489 emit urlDropped( *it );
490 } 490 }
491 } else if ( c == 1 ) 491 } else if ( c == 1 )
492 emit urlDropped( *it ); 492 emit urlDropped( *it );
493 } else if ( KVCardDrag::decode( e, vcards ) ) { 493 } else if ( KVCardDrag::decode( e, vcards ) ) {
494 KABC::Addressee addr; 494 KABC::Addressee addr;
495 KABC::VCardConverter converter; 495 KABC::VCardConverter converter;
496 QStringList list = QStringList::split( "\r\n\r\n", vcards ); 496 QStringList list = QStringList::split( "\r\n\r\n", vcards );
497 QStringList::Iterator it; 497 QStringList::Iterator it;
498 for ( it = list.begin(); it != list.end(); ++it ) { 498 for ( it = list.begin(); it != list.end(); ++it ) {
499 if ( converter.vCardToAddressee( (*it).stripWhiteSpace(), addr ) ) { 499 if ( converter.vCardToAddressee( (*it).stripWhiteSpace(), addr ) ) {
500 KABC::Addressee a = mCore->addressBook()->findByUid( addr.uid() ); 500 KABC::Addressee a = mCore->addressBook()->findByUid( addr.uid() );
501 if ( a.isEmpty() ) { 501 if ( a.isEmpty() ) {
502 mCore->addressBook()->insertAddressee( addr ); 502 mCore->addressBook()->insertAddressee( addr );
503 emit modified(); 503 emit modified();
504 } 504 }
505 } 505 }
506 } 506 }
507 507
508 mActiveView->refresh(); 508 mActiveView->refresh();
509 } 509 }
510#else //KAB_EMBEDDED 510#else //KAB_EMBEDDED
511qDebug("ViewManager::dropped() has to be changed!!" ); 511qDebug("ViewManager::dropped() has to be changed!!" );
512#endif //KAB_EMBEDDED 512#endif //KAB_EMBEDDED
513 513
514} 514}
515 515
516void ViewManager::startDrag() 516void ViewManager::startDrag()
517{ 517{
518 kdDebug(5720) << "ViewManager::startDrag: starting to drag" << endl; 518 kdDebug(5720) << "ViewManager::startDrag: starting to drag" << endl;
519 519
520#ifndef KAB_EMBEDDED 520#ifndef KAB_EMBEDDED
521 521
522 // Get the list of all the selected addressees 522 // Get the list of all the selected addressees
523 KABC::Addressee::List addrList; 523 KABC::Addressee::List addrList;
524 QStringList uidList = selectedUids(); 524 QStringList uidList = selectedUids();
525 QStringList::Iterator iter; 525 QStringList::Iterator iter;
526 for ( iter = uidList.begin(); iter != uidList.end(); ++iter ) 526 for ( iter = uidList.begin(); iter != uidList.end(); ++iter )
527 addrList.append( mCore->addressBook()->findByUid( *iter ) ); 527 addrList.append( mCore->addressBook()->findByUid( *iter ) );
528 528
529 KMultipleDrag *drag = new KMultipleDrag( this ); 529 KMultipleDrag *drag = new KMultipleDrag( this );
530 drag->addDragObject( new QTextDrag( AddresseeUtil::addresseesToClipboard(addrList), this ) ); 530 drag->addDragObject( new QTextDrag( AddresseeUtil::addresseesToClipboard(addrList), this ) );
531 KABC::Addressee::List::Iterator it; 531 KABC::Addressee::List::Iterator it;
532 QStringList vcards; 532 QStringList vcards;
533 for ( it = addrList.begin(); it != addrList.end(); ++it ) { 533 for ( it = addrList.begin(); it != addrList.end(); ++it ) {
534 QString vcard = QString::null; 534 QString vcard = QString::null;
535 KABC::VCardConverter converter; 535 KABC::VCardConverter converter;
536 if ( converter.addresseeToVCard( *it, vcard ) ) 536 if ( converter.addresseeToVCard( *it, vcard ) )
537 vcards.append( vcard ); 537 vcards.append( vcard );
538 } 538 }
539 drag->addDragObject( new KVCardDrag( vcards.join( "\r\n" ), this ) ); 539 drag->addDragObject( new KVCardDrag( vcards.join( "\r\n" ), this ) );
540 540
541 drag->setPixmap( KGlobal::iconLoader()->loadIcon( "vcard", KIcon::Desktop ) ); 541 drag->setPixmap( KGlobal::iconLoader()->loadIcon( "vcard", KIcon::Desktop ) );
542 drag->dragCopy(); 542 drag->dragCopy();
543 543
544#else //KAB_EMBEDDED 544#else //KAB_EMBEDDED
545qDebug("ViewManager::startDrag() has to be changed!!" ); 545qDebug("ViewManager::startDrag() has to be changed!!" );
546#endif //KAB_EMBEDDED 546#endif //KAB_EMBEDDED
547 547
548} 548}
549void ViewManager::doSearch( const QString& s,KABC::Field *field )
550{
551 if ( mActiveView )
552 mActiveView->doSearch( s, field );
549 553
554}
550void ViewManager::setActiveFilter( int index ) 555void ViewManager::setActiveFilter( int index )
551{ 556{
552 Filter currentFilter; 557 Filter currentFilter;
553 558
554 if ( ( index - 1 ) < 0 ) 559 if ( ( index - 1 ) < 0 )
555 currentFilter = Filter(); 560 currentFilter = Filter();
556 else 561 else
557 currentFilter = mFilterList[ index - 1 ]; 562 currentFilter = mFilterList[ index - 1 ];
558 563
559 // Check if we have a view. Since the filter combo is created before 564 // Check if we have a view. Since the filter combo is created before
560 // the view, this slot could be called before there is a valid view. 565 // the view, this slot could be called before there is a valid view.
561 if ( mActiveView ) { 566 if ( mActiveView ) {
562 mActiveView->setFilter( currentFilter ); 567 mActiveView->setFilter( currentFilter );
563 mActiveView->refresh(); 568 mActiveView->refresh();
564 emit selected( QString::null ); 569 emit selected( QString::null );
565 } 570 }
566} 571}
567 572
568void ViewManager::configureFilters() 573void ViewManager::configureFilters()
569{ 574{
570 FilterDialog dlg( this ); 575 FilterDialog dlg( this );
571 576
572 dlg.setFilters( mFilterList ); 577 dlg.setFilters( mFilterList );
573 578
574 if ( dlg.exec() ) 579 if ( dlg.exec() )
575 mFilterList = dlg.filters(); 580 mFilterList = dlg.filters();
576 581
577 uint pos = mActionSelectFilter->currentItem(); 582 uint pos = mActionSelectFilter->currentItem();
578 mActionSelectFilter->setItems( filterNames() ); 583 mActionSelectFilter->setItems( filterNames() );
579 mActionSelectFilter->setCurrentItem( pos ); 584 mActionSelectFilter->setCurrentItem( pos );
580 setActiveFilter( pos ); 585 setActiveFilter( pos );
581} 586}
582 587
583QStringList ViewManager::filterNames() const 588QStringList ViewManager::filterNames() const
584{ 589{
585 QStringList names( i18n( "No Filter" ) ); 590 QStringList names( i18n( "No Filter" ) );
586 591
587 Filter::List::ConstIterator it; 592 Filter::List::ConstIterator it;
588 for ( it = mFilterList.begin(); it != mFilterList.end(); ++it ) 593 for ( it = mFilterList.begin(); it != mFilterList.end(); ++it )
589 names.append( (*it).name() ); 594 names.append( (*it).name() );
590 595
591 return names; 596 return names;
592} 597}
593 598
594int ViewManager::filterPosition( const QString &name ) const 599int ViewManager::filterPosition( const QString &name ) const
595{ 600{
596 int pos = 0; 601 int pos = 0;
597 602
598 Filter::List::ConstIterator it; 603 Filter::List::ConstIterator it;
599 for ( it = mFilterList.begin(); it != mFilterList.end(); ++it, ++pos ) 604 for ( it = mFilterList.begin(); it != mFilterList.end(); ++it, ++pos )
600 if ( name == (*it).name() ) 605 if ( name == (*it).name() )
601 return pos + 1; 606 return pos + 1;
602 607
603 return 0; 608 return 0;
604} 609}
605 610
606void ViewManager::initActions() 611void ViewManager::initActions()
607{ 612{
608//US <ActionList name="view_loadedviews"/> 613//US <ActionList name="view_loadedviews"/>
609//US <Separator/> 614//US <Separator/>
610 615
611#ifdef KAB_EMBEDDED 616#ifdef KAB_EMBEDDED
612 QPopupMenu *viewmenu = (QPopupMenu*)mCore->getViewMenu(); 617 QPopupMenu *viewmenu = (QPopupMenu*)mCore->getViewMenu();
613 QPopupMenu *settingsmenu = (QPopupMenu*)mCore->getSettingsMenu(); 618 QPopupMenu *settingsmenu = (QPopupMenu*)mCore->getSettingsMenu();
614 QPopupMenu *filtermenu = (QPopupMenu*)mCore->getFilterMenu(); 619 QPopupMenu *filtermenu = (QPopupMenu*)mCore->getFilterMenu();
615#endif //KAB_EMBEDDED 620#endif //KAB_EMBEDDED
616 621
617 mActionSelectView = new KSelectAction( i18n( "Select View" ), 0, mCore->actionCollection(), "select_view" ); 622 mActionSelectView = new KSelectAction( i18n( "Select View" ), 0, mCore->actionCollection(), "select_view" );
618#if KDE_VERSION >= 309 623#if KDE_VERSION >= 309
619 mActionSelectView->setMenuAccelsEnabled( false ); 624 mActionSelectView->setMenuAccelsEnabled( false );
620#endif 625#endif
621 connect( mActionSelectView, SIGNAL( activated( const QString& ) ), 626 connect( mActionSelectView, SIGNAL( activated( const QString& ) ),
622 SLOT( setActiveView( const QString& ) ) ); 627 SLOT( setActiveView( const QString& ) ) );
623 628
624 629
625#ifdef KAB_EMBEDDED 630#ifdef KAB_EMBEDDED
626 mActionSelectView->plug(viewmenu); 631 mActionSelectView->plug(viewmenu);
627 viewmenu->insertSeparator(); 632 viewmenu->insertSeparator();
628#endif //KAB_EMBEDDED 633#endif //KAB_EMBEDDED
629 634
630 KAction *action; 635 KAction *action;
631 636
632 action = new KAction( i18n( "Modify View..." ), "configure", 0, this, 637 action = new KAction( i18n( "Modify View..." ), "configure", 0, this,
633 SLOT( editView() ), mCore->actionCollection(), "view_modify" ); 638 SLOT( editView() ), mCore->actionCollection(), "view_modify" );
634#ifndef KAB_EMBEDDED 639#ifndef KAB_EMBEDDED
635 action->setWhatsThis( i18n( "By pressing this button a dialog opens that allows you to modify the view of the addressbook. There you can add or remove fields that you want to be shown or hidden in the addressbook like the name for example." ) ); 640 action->setWhatsThis( i18n( "By pressing this button a dialog opens that allows you to modify the view of the addressbook. There you can add or remove fields that you want to be shown or hidden in the addressbook like the name for example." ) );
636#else //KAB_EMBEDDED 641#else //KAB_EMBEDDED
637 action->plug(viewmenu); 642 action->plug(viewmenu);
638#endif //KAB_EMBEDDED 643#endif //KAB_EMBEDDED
639 644
640 action = new KAction( i18n( "Add View..." ), "window_new", 0, this, 645 action = new KAction( i18n( "Add View..." ), "window_new", 0, this,
641 SLOT( addView() ), mCore->actionCollection(), "view_add" ); 646 SLOT( addView() ), mCore->actionCollection(), "view_add" );
642#ifndef KAB_EMBEDDED 647#ifndef KAB_EMBEDDED
643 action->setWhatsThis( i18n( "You can add a new view by choosing one of the dialog that appears after pressing the button. You have to give the view a name, so that you can distinguish between the different views." ) ); 648 action->setWhatsThis( i18n( "You can add a new view by choosing one of the dialog that appears after pressing the button. You have to give the view a name, so that you can distinguish between the different views." ) );
644#else //KAB_EMBEDDED 649#else //KAB_EMBEDDED
645 action->plug(viewmenu); 650 action->plug(viewmenu);
646#endif //KAB_EMBEDDED 651#endif //KAB_EMBEDDED
647 652
648 mActionDeleteView = new KAction( i18n( "Delete View" ), "view_remove", 0, 653 mActionDeleteView = new KAction( i18n( "Delete View" ), "view_remove", 0,
649 this, SLOT( deleteView() ), 654 this, SLOT( deleteView() ),
650 mCore->actionCollection(), "view_delete" ); 655 mCore->actionCollection(), "view_delete" );
651#ifndef KAB_EMBEDDED 656#ifndef KAB_EMBEDDED
652 mActionDeleteView->setWhatsThis( i18n( "By pressing this button you can delete the actual view, which you have added before." ) ); 657 mActionDeleteView->setWhatsThis( i18n( "By pressing this button you can delete the actual view, which you have added before." ) );
653#else //KAB_EMBEDDED 658#else //KAB_EMBEDDED
654 mActionDeleteView->plug(viewmenu); 659 mActionDeleteView->plug(viewmenu);
655 viewmenu->insertSeparator(); 660 viewmenu->insertSeparator();
656#endif //KAB_EMBEDDED 661#endif //KAB_EMBEDDED
657 662
658#ifndef KAB_EMBEDDED 663#ifndef KAB_EMBEDDED
659 action = new KAction( i18n( "Refresh View" ), "reload", 0, this, 664 action = new KAction( i18n( "Refresh View" ), "reload", 0, this,
660 SLOT( refreshView(const QString &) ), mCore->actionCollection(), 665 SLOT( refreshView(const QString &) ), mCore->actionCollection(),
661 "view_refresh" ); 666 "view_refresh" );
662 action->setWhatsThis( i18n( "The view will be refreshed by pressing this button." ) ); 667 action->setWhatsThis( i18n( "The view will be refreshed by pressing this button." ) );
663#else //KAB_EMBEDDED 668#else //KAB_EMBEDDED
664 action = new KAction( i18n( "Refresh View" ), "reload", 0, this, 669 action = new KAction( i18n( "Refresh View" ), "reload", 0, this,
665 SLOT( refreshView()), mCore->actionCollection(), 670 SLOT( refreshView()), mCore->actionCollection(),
666 "view_refresh" ); 671 "view_refresh" );
667 action->plug(viewmenu); 672 action->plug(viewmenu);
668 viewmenu->insertSeparator(); 673 viewmenu->insertSeparator();
669#endif //KAB_EMBEDDED 674#endif //KAB_EMBEDDED
670 675
671 action = new KAction( i18n( "Edit &Filters..." ), "filter", 0, this, 676 action = new KAction( i18n( "Edit &Filters..." ), "filter", 0, this,
672 SLOT( configureFilters() ), mCore->actionCollection(), 677 SLOT( configureFilters() ), mCore->actionCollection(),
673 "options_edit_filters" ); 678 "options_edit_filters" );
674 679
675 mActionSelectFilter = new KSelectAction( i18n( "Select Filter" ), "filter", mCore->actionCollection(), "select_filter" ); 680 mActionSelectFilter = new KSelectAction( i18n( "Select Filter" ), "filter", mCore->actionCollection(), "select_filter" );
676 681
677#if KDE_VERSION >= 309 682#if KDE_VERSION >= 309
diff --git a/kaddressbook/viewmanager.h b/kaddressbook/viewmanager.h
index 97c2275..6def6b6 100644
--- a/kaddressbook/viewmanager.h
+++ b/kaddressbook/viewmanager.h
@@ -1,153 +1,154 @@
1/* 1/*
2 This file is part of KAddressBook. 2 This file is part of KAddressBook.
3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com> 3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com>
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 18
19 As a special exception, permission is given to link this program 19 As a special exception, permission is given to link this program
20 with any edition of Qt, and distribute the resulting executable, 20 with any edition of Qt, and distribute the resulting executable,
21 without including the source code for Qt in the source distribution. 21 without including the source code for Qt in the source distribution.
22*/ 22*/
23 23
24#ifndef VIEWMANAGER_H 24#ifndef VIEWMANAGER_H
25#define VIEWMANAGER_H 25#define VIEWMANAGER_H
26 26
27#include <qwidget.h> 27#include <qwidget.h>
28#include <qstringlist.h> 28#include <qstringlist.h>
29#include <kaddressbookview.h> 29#include <kaddressbookview.h>
30#include <qdict.h> 30#include <qdict.h>
31 31
32class KAction; 32class KAction;
33class KSelectAction; 33class KSelectAction;
34 34
35class KABCore; 35class KABCore;
36class QWidgetStack; 36class QWidgetStack;
37class QDropEvent; 37class QDropEvent;
38 38
39namespace KABC { class AddressBook; } 39namespace KABC { class AddressBook; }
40 40
41/** 41/**
42 The view manager manages the views and everything related to them. The 42 The view manager manages the views and everything related to them. The
43 manager will load the views at startup and display a view when told to 43 manager will load the views at startup and display a view when told to
44 make one active. 44 make one active.
45 45
46 The view manager will also create and manage all dialogs directly related to 46 The view manager will also create and manage all dialogs directly related to
47 views (ie: AddView, ConfigureView, DeleteView, etc). 47 views (ie: AddView, ConfigureView, DeleteView, etc).
48 */ 48 */
49class ViewManager : public QWidget 49class ViewManager : public QWidget
50{ 50{
51 Q_OBJECT 51 Q_OBJECT
52 public: 52 public:
53 ViewManager( KABCore *core, QWidget *parent, const char *name = 0 ); 53 ViewManager( KABCore *core, QWidget *parent, const char *name = 0 );
54 ~ViewManager(); 54 ~ViewManager();
55 55
56 void restoreSettings(); 56 void restoreSettings();
57 void saveSettings(); 57 void saveSettings();
58 void doSearch( const QString& s ,KABC::Field *field );
58 59
59 void unloadViews(); 60 void unloadViews();
60 KSelectAction * getFilterAction() { return mActionSelectFilter; } 61 KSelectAction * getFilterAction() { return mActionSelectFilter; }
61 62
62 QStringList selectedUids() const; 63 QStringList selectedUids() const;
63 QStringList selectedEmails() const; 64 QStringList selectedEmails() const;
64 KABC::Addressee::List selectedAddressees() const; 65 KABC::Addressee::List selectedAddressees() const;
65 void setListSelected(QStringList); 66 void setListSelected(QStringList);
66 67
67 public slots: 68 public slots:
68 69
69//US void setSelected( const QString &uid = QString::null, bool selected = true ); 70//US void setSelected( const QString &uid = QString::null, bool selected = true );
70 void setSelected( const QString &uid, bool); 71 void setSelected( const QString &uid, bool);
71//US added another method with no parameter, since my moc compiler does not support default parameters. 72//US added another method with no parameter, since my moc compiler does not support default parameters.
72 void setSelected(); 73 void setSelected();
73 74
74 75
75 76
76//US added another method with no parameter, since my moc compiler does not support default parameters. 77//US added another method with no parameter, since my moc compiler does not support default parameters.
77 void refreshView(); 78 void refreshView();
78 void refreshView( const QString &uid); 79 void refreshView( const QString &uid);
79 80
80 void editView(); 81 void editView();
81 void deleteView(); 82 void deleteView();
82 void addView(); 83 void addView();
83 84
84 protected slots: 85 protected slots:
85 /** 86 /**
86 Called whenever the user drops something in the active view. 87 Called whenever the user drops something in the active view.
87 This method will try to decode what was dropped, and if it was 88 This method will try to decode what was dropped, and if it was
88 a valid addressee, add it to the addressbook. 89 a valid addressee, add it to the addressbook.
89 */ 90 */
90 void dropped( QDropEvent* ); 91 void dropped( QDropEvent* );
91 92
92 /** 93 /**
93 Called whenever the user attempts to start a drag in the view. 94 Called whenever the user attempts to start a drag in the view.
94 This method will convert all the selected addressees into text (vcard) 95 This method will convert all the selected addressees into text (vcard)
95 and create a drag object. 96 and create a drag object.
96 */ 97 */
97 void startDrag(); 98 void startDrag();
98 99
99 signals: 100 signals:
100 /** 101 /**
101 Emitted whenever the user selects an entry in the view. 102 Emitted whenever the user selects an entry in the view.
102 */ 103 */
103 void selected( const QString &uid ); 104 void selected( const QString &uid );
104 void deleteRequest( ); 105 void deleteRequest( );
105 106
106 /** 107 /**
107 Emitted whenever the user activates an entry in the view. 108 Emitted whenever the user activates an entry in the view.
108 */ 109 */
109 void executed( const QString &uid ); 110 void executed( const QString &uid );
110 111
111 /** 112 /**
112 Emitted whenever the address book is modified in some way. 113 Emitted whenever the address book is modified in some way.
113 */ 114 */
114 void modified(); 115 void modified();
115 116
116 /** 117 /**
117 Emitted whenever a url is dragged on a view. 118 Emitted whenever a url is dragged on a view.
118 */ 119 */
119 void urlDropped( const KURL& ); 120 void urlDropped( const KURL& );
120 121
121 private slots: 122 private slots:
122 void setActiveView( const QString &name ); 123 void setActiveView( const QString &name );
123 void setActiveFilter( int index ); 124 void setActiveFilter( int index );
124 void configureFilters(); 125 void configureFilters();
125 126
126 private: 127 private:
127 void createViewFactories(); 128 void createViewFactories();
128 QStringList filterNames() const; 129 QStringList filterNames() const;
129 int filterPosition( const QString &name ) const; 130 int filterPosition( const QString &name ) const;
130 QStringList viewNames() const; 131 QStringList viewNames() const;
131 int viewPosition( const QString &name ) const; 132 int viewPosition( const QString &name ) const;
132 void initActions(); 133 void initActions();
133 void initGUI(); 134 void initGUI();
134 135
135 KABCore *mCore; 136 KABCore *mCore;
136 137
137 Filter mCurrentFilter; 138 Filter mCurrentFilter;
138 Filter::List mFilterList; 139 Filter::List mFilterList;
139 140
140 QDict<KAddressBookView> mViewDict; 141 QDict<KAddressBookView> mViewDict;
141 QDict<ViewFactory> mViewFactoryDict; 142 QDict<ViewFactory> mViewFactoryDict;
142 QStringList mViewNameList; 143 QStringList mViewNameList;
143 144
144 QWidgetStack *mViewWidgetStack; 145 QWidgetStack *mViewWidgetStack;
145 KAddressBookView *mActiveView; 146 KAddressBookView *mActiveView;
146 147
147 KAction *mActionDeleteView; 148 KAction *mActionDeleteView;
148 KSelectAction *mActionSelectFilter; 149 KSelectAction *mActionSelectFilter;
149 KSelectAction *mActionSelectView; 150 KSelectAction *mActionSelectView;
150 151
151}; 152};
152 153
153#endif 154#endif
diff --git a/kaddressbook/views/kaddressbookcardview.cpp b/kaddressbook/views/kaddressbookcardview.cpp
index 239429f..49c0691 100644
--- a/kaddressbook/views/kaddressbookcardview.cpp
+++ b/kaddressbook/views/kaddressbookcardview.cpp
@@ -1,371 +1,422 @@
1/* 1/*
2 This file is part of KAddressBook. 2 This file is part of KAddressBook.
3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com> 3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com>
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 18
19 As a special exception, permission is given to link this program 19 As a special exception, permission is given to link this program
20 with any edition of Qt, and distribute the resulting executable, 20 with any edition of Qt, and distribute the resulting executable,
21 without including the source code for Qt in the source distribution. 21 without including the source code for Qt in the source distribution.
22*/ 22*/
23 23
24#include <qdragobject.h> 24#include <qdragobject.h>
25#include <qevent.h> 25#include <qevent.h>
26#include <qiconview.h> 26#include <qiconview.h>
27#include <qlayout.h> 27#include <qlayout.h>
28#include <qstringlist.h> 28#include <qstringlist.h>
29 29
30#include <kabc/addressbook.h> 30#include <kabc/addressbook.h>
31#include <kabc/addressee.h> 31#include <kabc/addressee.h>
32#include <kconfig.h> 32#include <kconfig.h>
33#include <kdebug.h> 33#include <kdebug.h>
34#include <klocale.h> 34#include <klocale.h>
35 35
36#include "kabprefs.h" 36#include "kabprefs.h"
37#include "viewmanager.h" 37#include "viewmanager.h"
38 38
39#include "kaddressbookcardview.h" 39#include "kaddressbookcardview.h"
40 40
41#ifndef KAB_EMBEDDED 41#ifndef KAB_EMBEDDED
42extern "C" { 42extern "C" {
43 void *init_libkaddrbk_cardview() 43 void *init_libkaddrbk_cardview()
44 { 44 {
45 return ( new CardViewFactory ); 45 return ( new CardViewFactory );
46 } 46 }
47} 47}
48#endif //KAB_EMBEDDED 48#endif //KAB_EMBEDDED
49 49
50//////////////////////////////// 50////////////////////////////////
51// AddresseeCardViewItem (internal class) 51// AddresseeCardViewItem (internal class)
52class AddresseeCardViewItem : public CardViewItem 52class AddresseeCardViewItem : public CardViewItem
53{ 53{
54 public: 54 public:
55 AddresseeCardViewItem(const KABC::Field::List &fields, 55 AddresseeCardViewItem(const KABC::Field::List &fields,
56 bool showEmptyFields, 56 bool showEmptyFields,
57 KABC::AddressBook *doc, const KABC::Addressee &a, 57 KABC::AddressBook *doc, const KABC::Addressee &a,
58 CardView *parent) 58 CardView *parent)
59 : CardViewItem(parent, a.formattedName()), 59 : CardViewItem(parent, a.formattedName()),
60 mFields( fields ), mShowEmptyFields(showEmptyFields), 60 mFields( fields ), mShowEmptyFields(showEmptyFields),
61 mDocument(doc), mAddressee(a) 61 mDocument(doc), mAddressee(a)
62 { 62 {
63 if ( mFields.isEmpty() ) { 63 if ( mFields.isEmpty() ) {
64 mFields = KABC::Field::defaultFields(); 64 mFields = KABC::Field::defaultFields();
65 } 65 }
66 refresh(); 66 refresh();
67 } 67 }
68 68
69 const KABC::Addressee &addressee() const { return mAddressee; } 69 const KABC::Addressee &addressee() const { return mAddressee; }
70 70
71 void refresh() 71 void refresh()
72 { 72 {
73 // Update our addressee, since it may have changed elsewhere 73 // Update our addressee, since it may have changed elsewhere
74 mAddressee = mDocument->findByUid(mAddressee.uid()); 74 mAddressee = mDocument->findByUid(mAddressee.uid());
75 75
76 if (!mAddressee.isEmpty()) 76 if (!mAddressee.isEmpty())
77 { 77 {
78 clearFields(); 78 clearFields();
79 79
80 // Try all the selected fields until we find one with text. 80 // Try all the selected fields until we find one with text.
81 // This will limit the number of unlabeled icons in the view 81 // This will limit the number of unlabeled icons in the view
82 KABC::Field::List::Iterator iter; 82 KABC::Field::List::Iterator iter;
83 for (iter = mFields.begin(); iter != mFields.end(); ++iter) 83 for (iter = mFields.begin(); iter != mFields.end(); ++iter)
84 { 84 {
85 // insert empty fields or not? not doing so saves a bit of memory and CPU 85 // insert empty fields or not? not doing so saves a bit of memory and CPU
86 // (during geometry calculations), but prevents having equally 86 // (during geometry calculations), but prevents having equally
87 // wide label columns in all cards, unless CardViewItem/CardView search 87 // wide label columns in all cards, unless CardViewItem/CardView search
88 // globally for the widest label. (anders) 88 // globally for the widest label. (anders)
89 //if (mShowEmptyFields || !(*iter)->value( mAddressee ).isEmpty()) 89 //if (mShowEmptyFields || !(*iter)->value( mAddressee ).isEmpty())
90 insertField((*iter)->label(), (*iter)->value( mAddressee )); 90 insertField((*iter)->label(), (*iter)->value( mAddressee ));
91 } 91 }
92 92
93 // We might want to make this the first field. hmm... -mpilone 93 // We might want to make this the first field. hmm... -mpilone
94 setCaption( mAddressee.realName() ); 94 setCaption( mAddressee.realName() );
95 } 95 }
96 } 96 }
97 97
98 private: 98 private:
99 KABC::Field::List mFields; 99 KABC::Field::List mFields;
100 bool mShowEmptyFields; 100 bool mShowEmptyFields;
101 KABC::AddressBook *mDocument; 101 KABC::AddressBook *mDocument;
102 KABC::Addressee mAddressee; 102 KABC::Addressee mAddressee;
103}; 103};
104 104
105/////////////////////////////// 105///////////////////////////////
106// AddresseeCardView 106// AddresseeCardView
107 107
108AddresseeCardView::AddresseeCardView(QWidget *parent, const char *name) 108AddresseeCardView::AddresseeCardView(QWidget *parent, const char *name)
109 : CardView(parent, name) 109 : CardView(parent, name)
110{ 110{
111 setAcceptDrops(true); 111 setAcceptDrops(true);
112} 112}
113 113
114AddresseeCardView::~AddresseeCardView() 114AddresseeCardView::~AddresseeCardView()
115{ 115{
116} 116}
117 117
118
118void AddresseeCardView::dragEnterEvent(QDragEnterEvent *e) 119void AddresseeCardView::dragEnterEvent(QDragEnterEvent *e)
119{ 120{
120#ifndef KAB_EMBEDDED 121#ifndef KAB_EMBEDDED
121 if (QTextDrag::canDecode(e)) 122 if (QTextDrag::canDecode(e))
122 e->accept(); 123 e->accept();
123#else //KAB_EMBEDDED 124#else //KAB_EMBEDDED
124qDebug("AddresseeCardView::dragEnterEvent drag&drop is not implemented"); 125qDebug("AddresseeCardView::dragEnterEvent drag&drop is not implemented");
125#endif //KAB_EMBEDDED 126#endif //KAB_EMBEDDED
126} 127}
127 128
128void AddresseeCardView::dropEvent(QDropEvent *e) 129void AddresseeCardView::dropEvent(QDropEvent *e)
129{ 130{
130 emit addresseeDropped(e); 131 emit addresseeDropped(e);
131} 132}
132 133
133void AddresseeCardView::startDrag() 134void AddresseeCardView::startDrag()
134{ 135{
135 emit startAddresseeDrag(); 136 emit startAddresseeDrag();
136} 137}
137 138
138 139
139/////////////////////////////// 140///////////////////////////////
140// KAddressBookCardView 141// KAddressBookCardView
141 142
142KAddressBookCardView::KAddressBookCardView( KABC::AddressBook *ab, 143KAddressBookCardView::KAddressBookCardView( KABC::AddressBook *ab,
143 QWidget *parent, const char *name ) 144 QWidget *parent, const char *name )
144 : KAddressBookView( ab, parent, name ) 145 : KAddressBookView( ab, parent, name )
145{ 146{
146 mShowEmptyFields = false; 147 mShowEmptyFields = false;
147 148
148 // Init the GUI 149 // Init the GUI
149 QVBoxLayout *layout = new QVBoxLayout(viewWidget()); 150 QVBoxLayout *layout = new QVBoxLayout(viewWidget());
150 151
151 mCardView = new AddresseeCardView(viewWidget(), "mCardView"); 152 mCardView = new AddresseeCardView(viewWidget(), "mCardView");
152 mCardView->setSelectionMode(CardView::Extended); 153 mCardView->setSelectionMode(CardView::Extended);
153 layout->addWidget(mCardView); 154 layout->addWidget(mCardView);
154 155
155 // Connect up the signals 156 // Connect up the signals
156 connect(mCardView, SIGNAL(executed(CardViewItem *)), 157 connect(mCardView, SIGNAL(executed(CardViewItem *)),
157 this, SLOT(addresseeExecuted(CardViewItem *))); 158 this, SLOT(addresseeExecuted(CardViewItem *)));
158 connect(mCardView, SIGNAL(selectionChanged()), 159 connect(mCardView, SIGNAL(selectionChanged()),
159 this, SLOT(addresseeSelected())); 160 this, SLOT(addresseeSelected()));
160 connect(mCardView, SIGNAL(addresseeDropped(QDropEvent*)), 161 connect(mCardView, SIGNAL(addresseeDropped(QDropEvent*)),
161 this, SIGNAL(dropped(QDropEvent*))); 162 this, SIGNAL(dropped(QDropEvent*)));
162 connect(mCardView, SIGNAL(startAddresseeDrag()), 163 connect(mCardView, SIGNAL(startAddresseeDrag()),
163 this, SIGNAL(startDrag())); 164 this, SIGNAL(startDrag()));
164} 165}
165 166
166KAddressBookCardView::~KAddressBookCardView() 167KAddressBookCardView::~KAddressBookCardView()
167{ 168{
168} 169}
169 170
170void KAddressBookCardView::readConfig(KConfig *config) 171void KAddressBookCardView::readConfig(KConfig *config)
171{ 172{
172 KAddressBookView::readConfig(config); 173 KAddressBookView::readConfig(config);
173 174
174 // costum colors? 175 // costum colors?
175 if ( config->readBoolEntry( "EnableCustomColors", false ) ) 176 if ( config->readBoolEntry( "EnableCustomColors", false ) )
176 { 177 {
177 QPalette p( mCardView->palette() ); 178 QPalette p( mCardView->palette() );
178 QColor c = p.color(QPalette::Normal, QColorGroup::Base ); 179 QColor c = p.color(QPalette::Normal, QColorGroup::Base );
179 p.setColor( QPalette::Normal, QColorGroup::Base, config->readColorEntry( "BackgroundColor", &c ) ); 180 p.setColor( QPalette::Normal, QColorGroup::Base, config->readColorEntry( "BackgroundColor", &c ) );
180 c = p.color(QPalette::Normal, QColorGroup::Text ); 181 c = p.color(QPalette::Normal, QColorGroup::Text );
181 p.setColor( QPalette::Normal, QColorGroup::Text, config->readColorEntry( "TextColor", &c ) ); 182 p.setColor( QPalette::Normal, QColorGroup::Text, config->readColorEntry( "TextColor", &c ) );
182 c = p.color(QPalette::Normal, QColorGroup::Button ); 183 c = p.color(QPalette::Normal, QColorGroup::Button );
183 p.setColor( QPalette::Normal, QColorGroup::Button, config->readColorEntry( "HeaderColor", &c ) ); 184 p.setColor( QPalette::Normal, QColorGroup::Button, config->readColorEntry( "HeaderColor", &c ) );
184 c = p.color(QPalette::Normal, QColorGroup::ButtonText ); 185 c = p.color(QPalette::Normal, QColorGroup::ButtonText );
185 p.setColor( QPalette::Normal, QColorGroup::ButtonText, config->readColorEntry( "HeaderTextColor", &c ) ); 186 p.setColor( QPalette::Normal, QColorGroup::ButtonText, config->readColorEntry( "HeaderTextColor", &c ) );
186 c = p.color(QPalette::Normal, QColorGroup::Highlight ); 187 c = p.color(QPalette::Normal, QColorGroup::Highlight );
187 p.setColor( QPalette::Normal, QColorGroup::Highlight, config->readColorEntry( "HighlightColor", &c ) ); 188 p.setColor( QPalette::Normal, QColorGroup::Highlight, config->readColorEntry( "HighlightColor", &c ) );
188 c = p.color(QPalette::Normal, QColorGroup::HighlightedText ); 189 c = p.color(QPalette::Normal, QColorGroup::HighlightedText );
189 p.setColor( QPalette::Normal, QColorGroup::HighlightedText, config->readColorEntry( "HighlightedTextColor", &c ) ); 190 p.setColor( QPalette::Normal, QColorGroup::HighlightedText, config->readColorEntry( "HighlightedTextColor", &c ) );
190 mCardView->viewport()->setPalette( p ); 191 mCardView->viewport()->setPalette( p );
191 } 192 }
192 else 193 else
193 { 194 {
194 // needed if turned off during a session. 195 // needed if turned off during a session.
195 mCardView->viewport()->setPalette( mCardView->palette() ); 196 mCardView->viewport()->setPalette( mCardView->palette() );
196 } 197 }
197 198
198 //custom fonts? 199 //custom fonts?
199 QFont f( font() ); 200 QFont f( font() );
200 if ( config->readBoolEntry( "EnableCustomFonts", false ) ) 201 if ( config->readBoolEntry( "EnableCustomFonts", false ) )
201 { 202 {
202 mCardView->setFont( config->readFontEntry( "TextFont", &f) ); 203 mCardView->setFont( config->readFontEntry( "TextFont", &f) );
203 f.setBold( true ); 204 f.setBold( true );
204 mCardView->setHeaderFont( config->readFontEntry( "HeaderFont", &f ) ); 205 mCardView->setHeaderFont( config->readFontEntry( "HeaderFont", &f ) );
205 } 206 }
206 else 207 else
207 { 208 {
208 mCardView->setFont( f ); 209 mCardView->setFont( f );
209 f.setBold( true ); 210 f.setBold( true );
210 mCardView->setHeaderFont( f ); 211 mCardView->setHeaderFont( f );
211 } 212 }
212 213
213 mCardView->setDrawCardBorder(config->readBoolEntry("DrawBorder", true)); 214 mCardView->setDrawCardBorder(config->readBoolEntry("DrawBorder", true));
214 mCardView->setDrawColSeparators(config->readBoolEntry("DrawSeparators", 215 mCardView->setDrawColSeparators(config->readBoolEntry("DrawSeparators",
215 true)); 216 true));
216 mCardView->setDrawFieldLabels(config->readBoolEntry("DrawFieldLabels",false)); 217 mCardView->setDrawFieldLabels(config->readBoolEntry("DrawFieldLabels",false));
217 mShowEmptyFields = config->readBoolEntry("ShowEmptyFields", false); 218 mShowEmptyFields = config->readBoolEntry("ShowEmptyFields", false);
218 219
219 mCardView->setShowEmptyFields( mShowEmptyFields ); 220 mCardView->setShowEmptyFields( mShowEmptyFields );
220 221
221 mCardView->setItemWidth( config->readNumEntry( "ItemWidth", 200 ) ); 222 mCardView->setItemWidth( config->readNumEntry( "ItemWidth", 200 ) );
222 mCardView->setItemMargin( config->readNumEntry( "ItemMargin", 0 ) ); 223 mCardView->setItemMargin( config->readNumEntry( "ItemMargin", 0 ) );
223 mCardView->setItemSpacing( config->readNumEntry( "ItemSpacing", 10 ) ); 224 mCardView->setItemSpacing( config->readNumEntry( "ItemSpacing", 10 ) );
224 mCardView->setSeparatorWidth( config->readNumEntry( "SeparatorWidth", 2 ) ); 225 mCardView->setSeparatorWidth( config->readNumEntry( "SeparatorWidth", 2 ) );
225 226
226 disconnect(mCardView, SIGNAL(executed(CardViewItem *)), 227 disconnect(mCardView, SIGNAL(executed(CardViewItem *)),
227 this, SLOT(addresseeExecuted(CardViewItem *))); 228 this, SLOT(addresseeExecuted(CardViewItem *)));
228 229
229 if (KABPrefs::instance()->mHonorSingleClick) 230 if (KABPrefs::instance()->mHonorSingleClick)
230 connect(mCardView, SIGNAL(executed(CardViewItem *)), 231 connect(mCardView, SIGNAL(executed(CardViewItem *)),
231 this, SLOT(addresseeExecuted(CardViewItem *))); 232 this, SLOT(addresseeExecuted(CardViewItem *)));
232 else 233 else
233 connect(mCardView, SIGNAL(doubleClicked(CardViewItem *)), 234 connect(mCardView, SIGNAL(doubleClicked(CardViewItem *)),
234 this, SLOT(addresseeExecuted(CardViewItem *))); 235 this, SLOT(addresseeExecuted(CardViewItem *)));
235 236
236} 237}
237 238
238void KAddressBookCardView::writeConfig( KConfig *config ) 239void KAddressBookCardView::writeConfig( KConfig *config )
239{ 240{
240 config->writeEntry( "ItemWidth", mCardView->itemWidth() ); 241 config->writeEntry( "ItemWidth", mCardView->itemWidth() );
241 KAddressBookView::writeConfig( config ); 242 KAddressBookView::writeConfig( config );
242} 243}
243 244void KAddressBookCardView::doSearch( const QString& s,KABC::Field *field )
245{
246 mCardView->clear();
247 if ( s.isEmpty() || s == "*" ) {
248 refresh();
249 return;
250 }
251 QString pattern = s.lower()+"*";
252 QRegExp re;
253 re.setWildcard(true); // most people understand these better.
254 re.setCaseSensitive(false);
255 re.setPattern( pattern );
256 if (!re.isValid())
257 return;
258 mCardView->viewport()->setUpdatesEnabled( false );
259 KABC::Addressee::List addresseeList = addressees();
260 KABC::Addressee::List::Iterator it;
261 if ( field ) {
262 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) {
263#if QT_VERSION >= 300
264 if (re.search(field->value( *it ).lower()) != -1)
265#else
266 if (re.match(field->value( *it ).lower()) != -1)
267#endif
268 new AddresseeCardViewItem(fields(), mShowEmptyFields,
269 addressBook(), *it, mCardView);
270
271 }
272 } else {
273 KABC::Field::List fieldList = fields();
274 KABC::Field::List::ConstIterator fieldIt;
275 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) {
276 for ( fieldIt = fieldList.begin(); fieldIt != fieldList.end(); ++fieldIt ) {
277#if QT_VERSION >= 300
278 if (re.search((*fieldIt)->value( *it ).lower()) != -1)
279#else
280 if (re.match((*fieldIt)->value( *it ).lower()) != -1)
281#endif
282 {
283 new AddresseeCardViewItem(fields(), mShowEmptyFields,
284 addressBook(), *it, mCardView);
285 continue;
286 }
287 }
288 }
289 }
290 mCardView->viewport()->setUpdatesEnabled( true );
291 mCardView->viewport()->update();
292 // by default nothing is selected
293 emit selected(QString::null);
294}
244QStringList KAddressBookCardView::selectedUids() 295QStringList KAddressBookCardView::selectedUids()
245{ 296{
246 QStringList uidList; 297 QStringList uidList;
247 CardViewItem *item; 298 CardViewItem *item;
248 AddresseeCardViewItem *aItem; 299 AddresseeCardViewItem *aItem;
249 300
250 for (item = mCardView->firstItem(); item; item = item->nextItem()) 301 for (item = mCardView->firstItem(); item; item = item->nextItem())
251 { 302 {
252 if (item->isSelected()) 303 if (item->isSelected())
253 { 304 {
254#ifndef KAB_EMBEDDED 305#ifndef KAB_EMBEDDED
255 aItem = dynamic_cast<AddresseeCardViewItem*>(item); 306 aItem = dynamic_cast<AddresseeCardViewItem*>(item);
256#else //KAB_EMBEDDED 307#else //KAB_EMBEDDED
257 aItem = (AddresseeCardViewItem*)(item); 308 aItem = (AddresseeCardViewItem*)(item);
258#endif //KAB_EMBEDDED 309#endif //KAB_EMBEDDED
259 if (aItem) 310 if (aItem)
260 uidList << aItem->addressee().uid(); 311 uidList << aItem->addressee().uid();
261 } 312 }
262 } 313 }
263 314
264 return uidList; 315 return uidList;
265} 316}
266 317
267void KAddressBookCardView::refresh(QString uid) 318void KAddressBookCardView::refresh(QString uid)
268{ 319{
269 CardViewItem *item; 320 CardViewItem *item;
270 AddresseeCardViewItem *aItem; 321 AddresseeCardViewItem *aItem;
271 322
272 if (uid.isNull()) 323 if (uid.isNull())
273 { 324 {
274 // Rebuild the view 325 // Rebuild the view
275 mCardView->viewport()->setUpdatesEnabled( false ); 326 mCardView->viewport()->setUpdatesEnabled( false );
276 mCardView->clear(); 327 mCardView->clear();
277 328
278 KABC::Addressee::List addresseeList = addressees(); 329 KABC::Addressee::List addresseeList = addressees();
279 KABC::Addressee::List::Iterator iter; 330 KABC::Addressee::List::Iterator iter;
280 for (iter = addresseeList.begin(); iter != addresseeList.end(); ++iter) 331 for (iter = addresseeList.begin(); iter != addresseeList.end(); ++iter)
281 { 332 {
282 aItem = new AddresseeCardViewItem(fields(), mShowEmptyFields, 333 aItem = new AddresseeCardViewItem(fields(), mShowEmptyFields,
283 addressBook(), *iter, mCardView); 334 addressBook(), *iter, mCardView);
284 } 335 }
285 mCardView->viewport()->setUpdatesEnabled( true ); 336 mCardView->viewport()->setUpdatesEnabled( true );
286 mCardView->viewport()->update(); 337 mCardView->viewport()->update();
287 338
288 // by default nothing is selected 339 // by default nothing is selected
289 emit selected(QString::null); 340 emit selected(QString::null);
290 } 341 }
291 else 342 else
292 { 343 {
293 // Try to find the one to refresh 344 // Try to find the one to refresh
294 bool found = false; 345 bool found = false;
295 for (item = mCardView->firstItem(); item && !found; 346 for (item = mCardView->firstItem(); item && !found;
296 item = item->nextItem()) 347 item = item->nextItem())
297 { 348 {
298#ifndef KAB_EMBEDDED 349#ifndef KAB_EMBEDDED
299 aItem = dynamic_cast<AddresseeCardViewItem*>(item); 350 aItem = dynamic_cast<AddresseeCardViewItem*>(item);
300#else //KAB_EMBEDDED 351#else //KAB_EMBEDDED
301 aItem = (AddresseeCardViewItem*)(item); 352 aItem = (AddresseeCardViewItem*)(item);
302#endif //KAB_EMBEDDED 353#endif //KAB_EMBEDDED
303 354
304 if ((aItem) && (aItem->addressee().uid() == uid)) 355 if ((aItem) && (aItem->addressee().uid() == uid))
305 { 356 {
306 aItem->refresh(); 357 aItem->refresh();
307 found = true; 358 found = true;
308 } 359 }
309 } 360 }
310 } 361 }
311} 362}
312 363
313void KAddressBookCardView::setSelected(QString uid, bool selected) 364void KAddressBookCardView::setSelected(QString uid, bool selected)
314{ 365{
315 CardViewItem *item; 366 CardViewItem *item;
316 AddresseeCardViewItem *aItem; 367 AddresseeCardViewItem *aItem;
317 368
318 if (uid.isNull()) 369 if (uid.isNull())
319 { 370 {
320 mCardView->selectAll(selected); 371 mCardView->selectAll(selected);
321 } 372 }
322 else 373 else
323 { 374 {
324 bool found = false; 375 bool found = false;
325 for (item = mCardView->firstItem(); item && !found; 376 for (item = mCardView->firstItem(); item && !found;
326 item = item->nextItem()) 377 item = item->nextItem())
327 { 378 {
328#ifndef KAB_EMBEDDED 379#ifndef KAB_EMBEDDED
329 aItem = dynamic_cast<AddresseeCardViewItem*>(item); 380 aItem = dynamic_cast<AddresseeCardViewItem*>(item);
330#else //KAB_EMBEDDED 381#else //KAB_EMBEDDED
331 aItem = (AddresseeCardViewItem*)(item); 382 aItem = (AddresseeCardViewItem*)(item);
332#endif //KAB_EMBEDDED 383#endif //KAB_EMBEDDED
333 384
334 if ((aItem) && (aItem->addressee().uid() == uid)) 385 if ((aItem) && (aItem->addressee().uid() == uid))
335 { 386 {
336 mCardView->setSelected(aItem, selected); 387 mCardView->setSelected(aItem, selected);
337 mCardView->ensureItemVisible(item); 388 mCardView->ensureItemVisible(item);
338 found = true; 389 found = true;
339 } 390 }
340 } 391 }
341 } 392 }
342} 393}
343 394
344//US added an additional method without parameter 395//US added an additional method without parameter
345void KAddressBookCardView::setSelected() 396void KAddressBookCardView::setSelected()
346{ 397{
347 setSelected(QString::null, true); 398 setSelected(QString::null, true);
348} 399}
349 400
350void KAddressBookCardView::addresseeExecuted(CardViewItem *item) 401void KAddressBookCardView::addresseeExecuted(CardViewItem *item)
351{ 402{
352#ifndef KAB_EMBEDDED 403#ifndef KAB_EMBEDDED
353 AddresseeCardViewItem *aItem = dynamic_cast<AddresseeCardViewItem*>(item); 404 AddresseeCardViewItem *aItem = dynamic_cast<AddresseeCardViewItem*>(item);
354#else //KAB_EMBEDDED 405#else //KAB_EMBEDDED
355 AddresseeCardViewItem *aItem = (AddresseeCardViewItem*)(item); 406 AddresseeCardViewItem *aItem = (AddresseeCardViewItem*)(item);
356#endif //KAB_EMBEDDED 407#endif //KAB_EMBEDDED
357 if (aItem) 408 if (aItem)
358 { 409 {
359 //kdDebug()<<"... even has a valid item:)"<<endl; 410 //kdDebug()<<"... even has a valid item:)"<<endl;
360 emit executed(aItem->addressee().uid()); 411 emit executed(aItem->addressee().uid());
361 } 412 }
362} 413}
363 414
364void KAddressBookCardView::addresseeSelected() 415void KAddressBookCardView::addresseeSelected()
365{ 416{
366 CardViewItem *item; 417 CardViewItem *item;
367 AddresseeCardViewItem *aItem; 418 AddresseeCardViewItem *aItem;
368 419
369 bool found = false; 420 bool found = false;
370 for (item = mCardView->firstItem(); item && !found; 421 for (item = mCardView->firstItem(); item && !found;
371 item = item->nextItem()) 422 item = item->nextItem())
diff --git a/kaddressbook/views/kaddressbookcardview.h b/kaddressbook/views/kaddressbookcardview.h
index cd70371..b8efb01 100644
--- a/kaddressbook/views/kaddressbookcardview.h
+++ b/kaddressbook/views/kaddressbookcardview.h
@@ -1,117 +1,117 @@
1#ifndef KADDRESSBOOKCARDVIEW_H 1#ifndef KADDRESSBOOKCARDVIEW_H
2#define KADDRESSBOOKCARDVIEW_H 2#define KADDRESSBOOKCARDVIEW_H
3 3
4/* 4/*
5 This file is part of KAddressBook. 5 This file is part of KAddressBook.
6 Copyright (c) 2002 Mike Pilone <mpilone@slac.com> 6 Copyright (c) 2002 Mike Pilone <mpilone@slac.com>
7 7
8 This program is free software; you can redistribute it and/or modify 8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by 9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or 10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version. 11 (at your option) any later version.
12 12
13 This program is distributed in the hope that it will be useful, 13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details. 16 GNU General Public License for more details.
17 17
18 You should have received a copy of the GNU General Public License 18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software 19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 21
22 As a special exception, permission is given to link this program 22 As a special exception, permission is given to link this program
23 with any edition of Qt, and distribute the resulting executable, 23 with any edition of Qt, and distribute the resulting executable,
24 without including the source code for Qt in the source distribution. 24 without including the source code for Qt in the source distribution.
25*/ 25*/
26 26
27#include <qstring.h> 27#include <qstring.h>
28#ifndef KAB_EMBEDDED 28#ifndef KAB_EMBEDDED
29#include <kiconview.h> 29#include <kiconview.h>
30#else //KAB_EMBEDDED 30#else //KAB_EMBEDDED
31#include <klocale.h> 31#include <klocale.h>
32#endif //KAB_EMBEDDED 32#endif //KAB_EMBEDDED
33 33
34#include "cardview.h" 34#include "cardview.h"
35#include "kaddressbookview.h" 35#include "kaddressbookview.h"
36#include "configurecardviewdialog.h" 36#include "configurecardviewdialog.h"
37 37
38class QDragEnterEvent; 38class QDragEnterEvent;
39class QDragEntryEvent; 39class QDragEntryEvent;
40class QDropEvent; 40class QDropEvent;
41class KConfig; 41class KConfig;
42class AddresseeCardView; 42class AddresseeCardView;
43 43
44/** 44/**
45 This view uses the CardView class to create a card view. At some 45 This view uses the CardView class to create a card view. At some
46 point in the future I think this will be the default view of 46 point in the future I think this will be the default view of
47 KAddressBook. 47 KAddressBook.
48 */ 48 */
49class KAddressBookCardView : public KAddressBookView 49class KAddressBookCardView : public KAddressBookView
50{ 50{
51 Q_OBJECT 51 Q_OBJECT
52 52
53 public: 53 public:
54 KAddressBookCardView( KABC::AddressBook *ab, QWidget *parent, 54 KAddressBookCardView( KABC::AddressBook *ab, QWidget *parent,
55 const char *name = 0 ); 55 const char *name = 0 );
56 virtual ~KAddressBookCardView(); 56 virtual ~KAddressBookCardView();
57 57 void doSearch( const QString& s,KABC::Field *field );
58 virtual QStringList selectedUids(); 58 virtual QStringList selectedUids();
59 virtual QString type() const { return "Card"; } 59 virtual QString type() const { return "Card"; }
60 60
61 virtual void readConfig(KConfig *config); 61 virtual void readConfig(KConfig *config);
62 virtual void writeConfig(KConfig *); 62 virtual void writeConfig(KConfig *);
63 63
64 public slots: 64 public slots:
65 void refresh(QString uid = QString::null); 65 void refresh(QString uid = QString::null);
66 void setSelected(QString uid/*US = QString::null*/, bool selected/*US = true*/); 66 void setSelected(QString uid/*US = QString::null*/, bool selected/*US = true*/);
67//US added an additional method without parameter 67//US added an additional method without parameter
68 void setSelected(); 68 void setSelected();
69 69
70 protected slots: 70 protected slots:
71 void addresseeExecuted(CardViewItem *item); 71 void addresseeExecuted(CardViewItem *item);
72 void addresseeSelected(); 72 void addresseeSelected();
73 73
74 private: 74 private:
75 AddresseeCardView *mCardView; 75 AddresseeCardView *mCardView;
76 bool mShowEmptyFields; 76 bool mShowEmptyFields;
77}; 77};
78 78
79class AddresseeCardView : public CardView 79class AddresseeCardView : public CardView
80{ 80{
81 Q_OBJECT 81 Q_OBJECT
82 public: 82 public:
83 AddresseeCardView(QWidget *parent, const char *name = 0); 83 AddresseeCardView(QWidget *parent, const char *name = 0);
84 ~AddresseeCardView(); 84 ~AddresseeCardView();
85 85
86 signals: 86 signals:
87 void startAddresseeDrag(); 87 void startAddresseeDrag();
88 void addresseeDropped(QDropEvent *); 88 void addresseeDropped(QDropEvent *);
89 89
90 protected: 90 protected:
91 virtual void dragEnterEvent(QDragEnterEvent *); 91 virtual void dragEnterEvent(QDragEnterEvent *);
92 virtual void dropEvent(QDropEvent *); 92 virtual void dropEvent(QDropEvent *);
93 virtual void startDrag(); 93 virtual void startDrag();
94}; 94};
95 95
96 96
97class CardViewFactory : public ViewFactory 97class CardViewFactory : public ViewFactory
98{ 98{
99 public: 99 public:
100 KAddressBookView *view( KABC::AddressBook *ab, QWidget *parent, const char *name ) 100 KAddressBookView *view( KABC::AddressBook *ab, QWidget *parent, const char *name )
101 { 101 {
102 return new KAddressBookCardView( ab, parent, name ); 102 return new KAddressBookCardView( ab, parent, name );
103 } 103 }
104 104
105 QString type() const { return "Card"; } 105 QString type() const { return "Card"; }
106 106
107 QString description() const { return i18n( "Rolodex style cards represent contacts." ); } 107 QString description() const { return i18n( "Rolodex style cards represent contacts." ); }
108 108
109 ViewConfigureWidget *configureWidget( KABC::AddressBook *ab, QWidget *parent, 109 ViewConfigureWidget *configureWidget( KABC::AddressBook *ab, QWidget *parent,
110 const char *name = 0 ) 110 const char *name = 0 )
111 { 111 {
112 return new ConfigureCardViewWidget( ab, parent, name ); 112 return new ConfigureCardViewWidget( ab, parent, name );
113 } 113 }
114}; 114};
115 115
116 116
117#endif 117#endif
diff --git a/kaddressbook/views/kaddressbookiconview.cpp b/kaddressbook/views/kaddressbookiconview.cpp
index 50ff285..78d63b0 100644
--- a/kaddressbook/views/kaddressbookiconview.cpp
+++ b/kaddressbook/views/kaddressbookiconview.cpp
@@ -1,363 +1,410 @@
1/* 1/*
2 This file is part of KAddressBook. 2 This file is part of KAddressBook.
3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com> 3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com>
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 18
19 As a special exception, permission is given to link this program 19 As a special exception, permission is given to link this program
20 with any edition of Qt, and distribute the resulting executable, 20 with any edition of Qt, and distribute the resulting executable,
21 without including the source code for Qt in the source distribution. 21 without including the source code for Qt in the source distribution.
22*/ 22*/
23 23
24#ifndef KAB_EMBEDDED 24#ifndef KAB_EMBEDDED
25#include <qiconview.h> 25#include <qiconview.h>
26#include <qstringlist.h> 26#include <qstringlist.h>
27 27
28#include <kabc/addressee.h> 28#include <kabc/addressee.h>
29#include <kconfig.h> 29#include <kconfig.h>
30#include <kdebug.h> 30#include <kdebug.h>
31#include <kglobal.h> 31#include <kglobal.h>
32#include <kiconloader.h> 32#include <kiconloader.h>
33#include <klocale.h> 33#include <klocale.h>
34 34
35#else //KAB_EMBEDDED 35#else //KAB_EMBEDDED
36#endif //KAB_EMBEDDED 36#endif //KAB_EMBEDDED
37 37
38#include <kabc/addressbook.h> 38#include <kabc/addressbook.h>
39#include "kabprefs.h" 39#include "kabprefs.h"
40#include "viewmanager.h" 40#include "viewmanager.h"
41#include "kaddressbookiconview.h" 41#include "kaddressbookiconview.h"
42#include <qlayout.h> 42#include <qlayout.h>
43#include <kglobal.h> 43#include <kglobal.h>
44/*US transfered to the headerfile 44/*US transfered to the headerfile
45class IconViewFactory : public ViewFactory 45class IconViewFactory : public ViewFactory
46{ 46{
47 public: 47 public:
48 KAddressBookView *view( KABC::AddressBook *ab, QWidget *parent, const char *name ) 48 KAddressBookView *view( KABC::AddressBook *ab, QWidget *parent, const char *name )
49 { 49 {
50 return new KAddressBookIconView( ab, parent, name ); 50 return new KAddressBookIconView( ab, parent, name );
51 } 51 }
52 52
53 QString type() const { return "Icon"; } 53 QString type() const { return "Icon"; }
54 54
55 QString description() const { return i18n( "Icons represent contacts. Very simple view." ); } 55 QString description() const { return i18n( "Icons represent contacts. Very simple view." ); }
56}; 56};
57 57
58*/ 58*/
59 59
60extern "C" { 60extern "C" {
61 void *init_libkaddrbk_iconview() 61 void *init_libkaddrbk_iconview()
62 { 62 {
63 return ( new IconViewFactory ); 63 return ( new IconViewFactory );
64 } 64 }
65} 65}
66 66
67//////////////////////////////// 67////////////////////////////////
68// AddresseeIconView (internal class) 68// AddresseeIconView (internal class)
69#ifndef KAB_EMBEDDED 69#ifndef KAB_EMBEDDED
70AddresseeIconView::AddresseeIconView(QWidget *parent, const char *name) 70AddresseeIconView::AddresseeIconView(QWidget *parent, const char *name)
71 : KIconView(parent, name) 71 : KIconView(parent, name)
72#else //KAB_EMBEDDED 72#else //KAB_EMBEDDED
73AddresseeIconView::AddresseeIconView(QWidget *parent, const char *name) 73AddresseeIconView::AddresseeIconView(QWidget *parent, const char *name)
74 : QIconView(parent, name) 74 : QIconView(parent, name)
75#endif //KAB_EMBEDDED 75#endif //KAB_EMBEDDED
76 76
77{ 77{
78 setSelectionMode( QIconView::Extended ); 78 setSelectionMode( QIconView::Extended );
79 setResizeMode( QIconView::Adjust ); 79 setResizeMode( QIconView::Adjust );
80 setWordWrapIconText( true ); 80 setWordWrapIconText( true );
81 setGridX( 100 ); 81 setGridX( 100 );
82 setItemsMovable(false); 82 setItemsMovable(false);
83 setSorting(true, true); 83 setSorting(true, true);
84 84
85 85
86//US ??? setMode( KIconView::Select ); 86//US ??? setMode( KIconView::Select );
87 87
88#ifndef KAB_EMBEDDED 88#ifndef KAB_EMBEDDED
89 89
90 connect(this, SIGNAL(dropped(QDropEvent*, const QValueList<QIconDragItem>&)), 90 connect(this, SIGNAL(dropped(QDropEvent*, const QValueList<QIconDragItem>&)),
91 this, SLOT(itemDropped(QDropEvent*, const QValueList<QIconDragItem>&))); 91 this, SLOT(itemDropped(QDropEvent*, const QValueList<QIconDragItem>&)));
92#endif //KAB_EMBEDDED 92#endif //KAB_EMBEDDED
93} 93}
94 94
95AddresseeIconView::~AddresseeIconView() 95AddresseeIconView::~AddresseeIconView()
96{ 96{
97} 97}
98 98
99
99void AddresseeIconView::itemDropped(QDropEvent *e, 100void AddresseeIconView::itemDropped(QDropEvent *e,
100 const QValueList<QIconDragItem> &) 101 const QValueList<QIconDragItem> &)
101{ 102{
102 emit addresseeDropped(e); 103 emit addresseeDropped(e);
103} 104}
104 105
105QDragObject *AddresseeIconView::dragObject() 106QDragObject *AddresseeIconView::dragObject()
106{ 107{
107 emit startAddresseeDrag(); 108 emit startAddresseeDrag();
108 109
109 // We never want IconView to start the drag 110 // We never want IconView to start the drag
110 return 0; 111 return 0;
111} 112}
112//////////////////////////////// 113////////////////////////////////
113// AddresseeIconViewItem (internal class) 114// AddresseeIconViewItem (internal class)
114#ifndef KAB_EMBEDDED 115#ifndef KAB_EMBEDDED
115class AddresseeIconViewItem : public KIconViewItem 116class AddresseeIconViewItem : public KIconViewItem
116#else //KAB_EMBEDDED 117#else //KAB_EMBEDDED
117class AddresseeIconViewItem : public QIconViewItem 118class AddresseeIconViewItem : public QIconViewItem
118#endif //KAB_EMBEDDED 119#endif //KAB_EMBEDDED
119{ 120{
120 public: 121 public:
121#ifndef KAB_EMBEDDED 122#ifndef KAB_EMBEDDED
122 AddresseeIconViewItem(const KABC::Field::List &fields, 123 AddresseeIconViewItem(const KABC::Field::List &fields,
123 KABC::AddressBook *doc, const KABC::Addressee &a, 124 KABC::AddressBook *doc, const KABC::Addressee &a,
124 QIconView *parent) 125 QIconView *parent)
125 : KIconViewItem(parent), mFields( fields ), mDocument(doc), mAddressee(a) 126 : KIconViewItem(parent), mFields( fields ), mDocument(doc), mAddressee(a)
126#else //KAB_EMBEDDED 127#else //KAB_EMBEDDED
127 AddresseeIconViewItem(const KABC::Field::List &fields, 128 AddresseeIconViewItem(const KABC::Field::List &fields,
128 KABC::AddressBook *doc, const KABC::Addressee &a, 129 KABC::AddressBook *doc, const KABC::Addressee &a,
129 QIconView *parent) 130 QIconView *parent)
130 : QIconViewItem(parent), mFields( fields ), mDocument(doc), mAddressee(a) 131 : QIconViewItem(parent), mFields( fields ), mDocument(doc), mAddressee(a)
131#endif //KAB_EMBEDDED 132#endif //KAB_EMBEDDED
132 { 133 {
133 if ( mFields.isEmpty() ) { 134 if ( mFields.isEmpty() ) {
134 mFields = KABC::Field::defaultFields(); 135 mFields = KABC::Field::defaultFields();
135 } 136 }
136 refresh(); 137 refresh();
137 } 138 }
138 139
139 const KABC::Addressee &addressee() const { return mAddressee; } 140 const KABC::Addressee &addressee() const { return mAddressee; }
140 141
141 void refresh() 142 void refresh()
142 { 143 {
143 // Update our addressee, since it may have changed elsewhere 144 // Update our addressee, since it may have changed elsewhere
144 mAddressee = mDocument->findByUid(mAddressee.uid()); 145 mAddressee = mDocument->findByUid(mAddressee.uid());
145 146
146 if (!mAddressee.isEmpty()) 147 if (!mAddressee.isEmpty())
147 setText( mAddressee.givenName() + " " + mAddressee.familyName() ); 148 setText( mAddressee.givenName() + " " + mAddressee.familyName() );
148 149
149 QPixmap icon; 150 QPixmap icon;
150 QPixmap defaultIcon( KGlobal::iconLoader()->loadIcon( "vcard", KIcon::Desktop, 128 ) ); 151 QPixmap defaultIcon( KGlobal::iconLoader()->loadIcon( "vcard", KIcon::Desktop, 128 ) );
151 KABC::Picture pic = mAddressee.photo(); 152 KABC::Picture pic = mAddressee.photo();
152 if ( pic.data().isNull() ) 153 if ( pic.data().isNull() )
153 pic = mAddressee.logo(); 154 pic = mAddressee.logo();
154 155
155 if ( pic.isIntern() && !pic.data().isNull() ) { 156 if ( pic.isIntern() && !pic.data().isNull() ) {
156 QImage img = pic.data(); 157 QImage img = pic.data();
157#ifndef KAB_EMBEDDED 158#ifndef KAB_EMBEDDED
158 if ( img.width() > img.height() ) 159 if ( img.width() > img.height() )
159 icon = img.scaleWidth( 32 ); 160 icon = img.scaleWidth( 32 );
160 else 161 else
161 icon = img.scaleHeight( 32 ); 162 icon = img.scaleHeight( 32 );
162#else //KAB_EMBEDDED 163#else //KAB_EMBEDDED
163 qDebug("AddresseeIconViewItem::refresh - scale here dependend of the displaysize and the right factor"); 164 qDebug("AddresseeIconViewItem::refresh - scale here dependend of the displaysize and the right factor");
164 icon.convertFromImage(img.smoothScale(32, 32)); 165 icon.convertFromImage(img.smoothScale(32, 32));
165#endif //KAB_EMBEDDED 166#endif //KAB_EMBEDDED
166 167
167 } else 168 } else
168 icon = defaultIcon; 169 icon = defaultIcon;
169 170
170 setPixmap( icon ); 171 setPixmap( icon );
171 } 172 }
172 173
173 private: 174 private:
174 KABC::Field::List mFields; 175 KABC::Field::List mFields;
175 KABC::AddressBook *mDocument; 176 KABC::AddressBook *mDocument;
176 KABC::Addressee mAddressee; 177 KABC::Addressee mAddressee;
177}; 178};
178 179
179/////////////////////////////// 180///////////////////////////////
180// KAddressBookView 181// KAddressBookView
181 182
182KAddressBookIconView::KAddressBookIconView( KABC::AddressBook *ab, 183KAddressBookIconView::KAddressBookIconView( KABC::AddressBook *ab,
183 QWidget *parent, const char *name) 184 QWidget *parent, const char *name)
184 : KAddressBookView( ab, parent, name ) 185 : KAddressBookView( ab, parent, name )
185{ 186{
186 // Init the GUI 187 // Init the GUI
187 QVBoxLayout *layout = new QVBoxLayout(viewWidget()); 188 QVBoxLayout *layout = new QVBoxLayout(viewWidget());
188 189
189 mIconView = new AddresseeIconView(viewWidget(), "mIconView"); 190 mIconView = new AddresseeIconView(viewWidget(), "mIconView");
190 layout->addWidget(mIconView); 191 layout->addWidget(mIconView);
191 192
192 // Connect up the signals 193 // Connect up the signals
193 194
194//US method executed is part of KIconView 195//US method executed is part of KIconView
195//US connect(mIconView, SIGNAL(executed(QIconViewItem *)), 196//US connect(mIconView, SIGNAL(executed(QIconViewItem *)),
196//US this, SLOT(addresseeExecuted(QIconViewItem *))); 197//US this, SLOT(addresseeExecuted(QIconViewItem *)));
197 connect(mIconView, SIGNAL(selectionChanged(QIconViewItem *)), 198 connect(mIconView, SIGNAL(selectionChanged(QIconViewItem *)),
198 this, SLOT(addresseeExecuted(QIconViewItem *))); 199 this, SLOT(addresseeExecuted(QIconViewItem *)));
199 200
200 connect(mIconView, SIGNAL(selectionChanged()), 201 connect(mIconView, SIGNAL(selectionChanged()),
201 this, SLOT(addresseeSelected())); 202 this, SLOT(addresseeSelected()));
202 connect(mIconView, SIGNAL(addresseeDropped(QDropEvent*)), 203 connect(mIconView, SIGNAL(addresseeDropped(QDropEvent*)),
203 this, SIGNAL(dropped(QDropEvent*))); 204 this, SIGNAL(dropped(QDropEvent*)));
204 connect(mIconView, SIGNAL(startAddresseeDrag()), 205 connect(mIconView, SIGNAL(startAddresseeDrag()),
205 this, SIGNAL(startDrag())); 206 this, SIGNAL(startDrag()));
206} 207}
207 208
208KAddressBookIconView::~KAddressBookIconView() 209KAddressBookIconView::~KAddressBookIconView()
209{ 210{
210} 211}
211 212
212void KAddressBookIconView::readConfig(KConfig *config) 213void KAddressBookIconView::readConfig(KConfig *config)
213{ 214{
214 KAddressBookView::readConfig(config); 215 KAddressBookView::readConfig(config);
215 216
216//US method executed is part of KIconView 217//US method executed is part of KIconView
217//US disconnect(mIconView, SIGNAL(executed(QIconViewItem *)), 218//US disconnect(mIconView, SIGNAL(executed(QIconViewItem *)),
218//US this, SLOT(addresseeExecuted(QIconViewItem *))); 219//US this, SLOT(addresseeExecuted(QIconViewItem *)));
219 disconnect(mIconView, SIGNAL(selectionChanged(QIconViewItem *)), 220 disconnect(mIconView, SIGNAL(selectionChanged(QIconViewItem *)),
220 this, SLOT(addresseeExecuted(QIconViewItem *))); 221 this, SLOT(addresseeExecuted(QIconViewItem *)));
221 222
222//US method executed is part of KIconView. Use selectionChanged instead 223//US method executed is part of KIconView. Use selectionChanged instead
223/*US 224/*US
224 if (KABPrefs::instance()->mHonorSingleClick) 225 if (KABPrefs::instance()->mHonorSingleClick)
225 connect(mIconView, SIGNAL(executed(QIconViewItem *)), 226 connect(mIconView, SIGNAL(executed(QIconViewItem *)),
226 this, SLOT(addresseeExecuted(QIconViewItem *))); 227 this, SLOT(addresseeExecuted(QIconViewItem *)));
227 else 228 else
228 connect(mIconView, SIGNAL(doubleClicked(QIconViewItem *)), 229 connect(mIconView, SIGNAL(doubleClicked(QIconViewItem *)),
229 this, SLOT(addresseeExecuted(QIconViewItem *))); 230 this, SLOT(addresseeExecuted(QIconViewItem *)));
230*/ 231*/
231 connect(mIconView, SIGNAL(selectionChanged(QIconViewItem *)), 232 connect(mIconView, SIGNAL(selectionChanged(QIconViewItem *)),
232 this, SLOT(addresseeExecuted(QIconViewItem *))); 233 this, SLOT(addresseeExecuted(QIconViewItem *)));
233 234
234} 235}
236void KAddressBookIconView::doSearch( const QString& s ,KABC::Field *field )
237{
238 mIconView->clear();
239 mIconList.clear();
240 if ( s.isEmpty() || s == "*" ) {
241 refresh();
242 return;
243 }
244 QString pattern = s.lower()+"*";
245 QRegExp re;
246 re.setWildcard(true); // most people understand these better.
247 re.setCaseSensitive(false);
248 re.setPattern( pattern );
249 if (!re.isValid())
250 return;
251 KABC::Addressee::List addresseeList = addressees();
252 KABC::Addressee::List::Iterator it;
253 if ( field ) {
254 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) {
255#if QT_VERSION >= 300
256 if (re.search(field->value( *it ).lower()) != -1)
257#else
258 if (re.match(field->value( *it ).lower()) != -1)
259#endif
260 mIconList.append(new AddresseeIconViewItem( fields(), addressBook(), *it, mIconView ));
261
235 262
263 }
264 } else {
265 KABC::Field::List fieldList = fields();
266 KABC::Field::List::ConstIterator fieldIt;
267 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) {
268 for ( fieldIt = fieldList.begin(); fieldIt != fieldList.end(); ++fieldIt ) {
269#if QT_VERSION >= 300
270 if (re.search((*fieldIt)->value( *it ).lower()) != -1)
271#else
272 if (re.match((*fieldIt)->value( *it ).lower()) != -1)
273#endif
274 {
275 mIconList.append( new AddresseeIconViewItem( fields(), addressBook(), *it, mIconView ));
276 continue;
277 }
278 }
279 }
280 }
281 mIconView->arrangeItemsInGrid( true );
282}
236QStringList KAddressBookIconView::selectedUids() 283QStringList KAddressBookIconView::selectedUids()
237{ 284{
238 QStringList uidList; 285 QStringList uidList;
239 QIconViewItem *item; 286 QIconViewItem *item;
240 AddresseeIconViewItem *aItem; 287 AddresseeIconViewItem *aItem;
241 288
242 for (item = mIconView->firstItem(); item; item = item->nextItem()) 289 for (item = mIconView->firstItem(); item; item = item->nextItem())
243 { 290 {
244 if (item->isSelected()) 291 if (item->isSelected())
245 { 292 {
246#ifndef KAB_EMBEDDED 293#ifndef KAB_EMBEDDED
247 aItem = dynamic_cast<AddresseeIconViewItem*>(item); 294 aItem = dynamic_cast<AddresseeIconViewItem*>(item);
248#else //KAB_EMBEDDED 295#else //KAB_EMBEDDED
249 aItem = (AddresseeIconViewItem*)(item); 296 aItem = (AddresseeIconViewItem*)(item);
250#endif //KAB_EMBEDDED 297#endif //KAB_EMBEDDED
251 if (aItem) 298 if (aItem)
252 uidList << aItem->addressee().uid(); 299 uidList << aItem->addressee().uid();
253 } 300 }
254 } 301 }
255 302
256 return uidList; 303 return uidList;
257} 304}
258 305
259void KAddressBookIconView::refresh(QString uid) 306void KAddressBookIconView::refresh(QString uid)
260{ 307{
261 QIconViewItem *item; 308 QIconViewItem *item;
262 AddresseeIconViewItem *aItem; 309 AddresseeIconViewItem *aItem;
263 310
264 if ( uid.isNull() ) { 311 if ( uid.isNull() ) {
265 // Rebuild the view 312 // Rebuild the view
266 mIconView->clear(); 313 mIconView->clear();
267 mIconList.clear(); 314 mIconList.clear();
268 315
269 KABC::Addressee::List addresseeList = addressees(); 316 KABC::Addressee::List addresseeList = addressees();
270 KABC::Addressee::List::Iterator iter; 317 KABC::Addressee::List::Iterator iter;
271 for ( iter = addresseeList.begin(); iter != addresseeList.end(); ++iter ) 318 for ( iter = addresseeList.begin(); iter != addresseeList.end(); ++iter )
272 aItem = new AddresseeIconViewItem( fields(), addressBook(), *iter, mIconView ); 319 aItem = new AddresseeIconViewItem( fields(), addressBook(), *iter, mIconView );
273 320
274 mIconView->arrangeItemsInGrid( true ); 321 mIconView->arrangeItemsInGrid( true );
275 322
276 for ( item = mIconView->firstItem(); item; item = item->nextItem() ) 323 for ( item = mIconView->firstItem(); item; item = item->nextItem() )
277 { 324 {
278#ifndef KAB_EMBEDDED 325#ifndef KAB_EMBEDDED
279 AddresseeIconViewItem* aivi = dynamic_cast<AddresseeIconViewItem*>( item ); 326 AddresseeIconViewItem* aivi = dynamic_cast<AddresseeIconViewItem*>( item );
280#else //KAB_EMBEDDED 327#else //KAB_EMBEDDED
281 AddresseeIconViewItem* aivi = (AddresseeIconViewItem*)( item ); 328 AddresseeIconViewItem* aivi = (AddresseeIconViewItem*)( item );
282#endif //KAB_EMBEDDED 329#endif //KAB_EMBEDDED
283 mIconList.append( aivi ); 330 mIconList.append( aivi );
284 } 331 }
285 332
286 } else { 333 } else {
287 // Try to find the one to refresh 334 // Try to find the one to refresh
288 for ( item = mIconView->firstItem(); item; item = item->nextItem() ) { 335 for ( item = mIconView->firstItem(); item; item = item->nextItem() ) {
289#ifndef KAB_EMBEDDED 336#ifndef KAB_EMBEDDED
290 aItem = dynamic_cast<AddresseeIconViewItem*>(item); 337 aItem = dynamic_cast<AddresseeIconViewItem*>(item);
291#else //KAB_EMBEDDED 338#else //KAB_EMBEDDED
292 aItem = (AddresseeIconViewItem*)(item); 339 aItem = (AddresseeIconViewItem*)(item);
293#endif //KAB_EMBEDDED 340#endif //KAB_EMBEDDED
294 if ((aItem) && (aItem->addressee().uid() == uid)) { 341 if ((aItem) && (aItem->addressee().uid() == uid)) {
295 aItem->refresh(); 342 aItem->refresh();
296 mIconView->arrangeItemsInGrid( true ); 343 mIconView->arrangeItemsInGrid( true );
297 return; 344 return;
298 } 345 }
299 } 346 }
300 refresh( QString::null ); 347 refresh( QString::null );
301 } 348 }
302} 349}
303 350
304void KAddressBookIconView::setSelected(QString uid, bool selected) 351void KAddressBookIconView::setSelected(QString uid, bool selected)
305{ 352{
306 QIconViewItem *item; 353 QIconViewItem *item;
307 AddresseeIconViewItem *aItem; 354 AddresseeIconViewItem *aItem;
308 355
309 if (uid.isNull()) 356 if (uid.isNull())
310 { 357 {
311 mIconView->selectAll(selected); 358 mIconView->selectAll(selected);
312 } 359 }
313 else 360 else
314 { 361 {
315 bool found = false; 362 bool found = false;
316 for (item = mIconView->firstItem(); item && !found; 363 for (item = mIconView->firstItem(); item && !found;
317 item = item->nextItem()) 364 item = item->nextItem())
318 { 365 {
319#ifndef KAB_EMBEDDED 366#ifndef KAB_EMBEDDED
320 aItem = dynamic_cast<AddresseeIconViewItem*>(item); 367 aItem = dynamic_cast<AddresseeIconViewItem*>(item);
321#else //KAB_EMBEDDED 368#else //KAB_EMBEDDED
322 aItem = (AddresseeIconViewItem*)(item); 369 aItem = (AddresseeIconViewItem*)(item);
323#endif //KAB_EMBEDDED 370#endif //KAB_EMBEDDED
324 371
325 if ((aItem) && (aItem->addressee().uid() == uid)) 372 if ((aItem) && (aItem->addressee().uid() == uid))
326 { 373 {
327 mIconView->setSelected(aItem, selected); 374 mIconView->setSelected(aItem, selected);
328 mIconView->ensureItemVisible( aItem ); 375 mIconView->ensureItemVisible( aItem );
329 found = true; 376 found = true;
330 } 377 }
331 } 378 }
332 } 379 }
333} 380}
334 381
335void KAddressBookIconView::addresseeExecuted(QIconViewItem *item) 382void KAddressBookIconView::addresseeExecuted(QIconViewItem *item)
336{ 383{
337#ifndef KAB_EMBEDDED 384#ifndef KAB_EMBEDDED
338 AddresseeIconViewItem *aItem = dynamic_cast<AddresseeIconViewItem*>(item); 385 AddresseeIconViewItem *aItem = dynamic_cast<AddresseeIconViewItem*>(item);
339#else //KAB_EMBEDDED 386#else //KAB_EMBEDDED
340 AddresseeIconViewItem *aItem = (AddresseeIconViewItem*)(item); 387 AddresseeIconViewItem *aItem = (AddresseeIconViewItem*)(item);
341#endif //KAB_EMBEDDED 388#endif //KAB_EMBEDDED
342 389
343 if (aItem) { 390 if (aItem) {
344 emit executed(aItem->addressee().uid()); 391 emit executed(aItem->addressee().uid());
345 } 392 }
346} 393}
347 394
348void KAddressBookIconView::addresseeSelected() 395void KAddressBookIconView::addresseeSelected()
349{ 396{
350 QIconViewItem *item; 397 QIconViewItem *item;
351 AddresseeIconViewItem *aItem; 398 AddresseeIconViewItem *aItem;
352 399
353 bool found = false; 400 bool found = false;
354 for (item = mIconView->firstItem(); item && !found; 401 for (item = mIconView->firstItem(); item && !found;
355 item = item->nextItem()) 402 item = item->nextItem())
356 { 403 {
357 if (item->isSelected()) 404 if (item->isSelected())
358 { 405 {
359#ifndef KAB_EMBEDDED 406#ifndef KAB_EMBEDDED
360 aItem = dynamic_cast<AddresseeIconViewItem*>(item); 407 aItem = dynamic_cast<AddresseeIconViewItem*>(item);
361#else //KAB_EMBEDDED 408#else //KAB_EMBEDDED
362 aItem = (AddresseeIconViewItem*)(item); 409 aItem = (AddresseeIconViewItem*)(item);
363#endif //KAB_EMBEDDED 410#endif //KAB_EMBEDDED
diff --git a/kaddressbook/views/kaddressbookiconview.h b/kaddressbook/views/kaddressbookiconview.h
index 3afada3..963ee7c 100644
--- a/kaddressbook/views/kaddressbookiconview.h
+++ b/kaddressbook/views/kaddressbookiconview.h
@@ -1,130 +1,131 @@
1/* 1/*
2 This file is part of KAddressBook. 2 This file is part of KAddressBook.
3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com> 3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com>
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 18
19 As a special exception, permission is given to link this program 19 As a special exception, permission is given to link this program
20 with any edition of Qt, and distribute the resulting executable, 20 with any edition of Qt, and distribute the resulting executable,
21 without including the source code for Qt in the source distribution. 21 without including the source code for Qt in the source distribution.
22*/ 22*/
23 23
24#ifndef KADDRESSBOOKICONVIEW_H 24#ifndef KADDRESSBOOKICONVIEW_H
25#define KADDRESSBOOKICONVIEW_H 25#define KADDRESSBOOKICONVIEW_H
26 26
27#include <qstring.h> 27#include <qstring.h>
28#ifndef KAB_EMBEDDED 28#ifndef KAB_EMBEDDED
29#include <kiconview.h> 29#include <kiconview.h>
30#else //KAB_EMBEDDED 30#else //KAB_EMBEDDED
31#include <qiconview.h> 31#include <qiconview.h>
32#include <qptrlist.h> 32#include <qptrlist.h>
33#include <klocale.h> 33#include <klocale.h>
34#endif //KAB_EMBEDDED 34#endif //KAB_EMBEDDED
35#include "kaddressbookview.h" 35#include "kaddressbookview.h"
36 36
37class QIconViewItem; 37class QIconViewItem;
38class KConfig; 38class KConfig;
39class AddresseeIconView; 39class AddresseeIconView;
40class AddresseeIconViewItem; 40class AddresseeIconViewItem;
41class QIconDragItem; 41class QIconDragItem;
42class KAddressBookIconView; 42class KAddressBookIconView;
43 43
44namespace KABC { class AddressBook; } 44namespace KABC { class AddressBook; }
45 45
46/** This is an example kaddressbook view that is implemented using 46/** This is an example kaddressbook view that is implemented using
47* KIconView. This view is not the most useful view, but it displays 47* KIconView. This view is not the most useful view, but it displays
48* how simple implementing a new view can be. 48* how simple implementing a new view can be.
49*/ 49*/
50class KAddressBookIconView : public KAddressBookView 50class KAddressBookIconView : public KAddressBookView
51{ 51{
52 Q_OBJECT 52 Q_OBJECT
53 53
54 public: 54 public:
55 KAddressBookIconView( KABC::AddressBook *ab, QWidget *parent, 55 KAddressBookIconView( KABC::AddressBook *ab, QWidget *parent,
56 const char *name = 0 ); 56 const char *name = 0 );
57 virtual ~KAddressBookIconView(); 57 virtual ~KAddressBookIconView();
58 58
59 virtual QStringList selectedUids(); 59 virtual QStringList selectedUids();
60 virtual QString type() const { return "Icon"; } 60 virtual QString type() const { return "Icon"; }
61 void doSearch( const QString& s ,KABC::Field *field );
61 62
62 virtual void readConfig(KConfig *config); 63 virtual void readConfig(KConfig *config);
63 64
64 public slots: 65 public slots:
65 void refresh(QString uid = QString::null); 66 void refresh(QString uid = QString::null);
66#ifndef KAB_EMBEDDED 67#ifndef KAB_EMBEDDED
67//MOC_SKIP_BEGIN 68//MOC_SKIP_BEGIN
68 void setSelected(QString uid = QString::null, bool selected = true); 69 void setSelected(QString uid = QString::null, bool selected = true);
69//MOC_SKIP_END 70//MOC_SKIP_END
70#else //KAB_EMBEDDED 71#else //KAB_EMBEDDED
71//US my MOC do not like default parameters ??? 72//US my MOC do not like default parameters ???
72 void setSelected(QString uid, bool selected); 73 void setSelected(QString uid, bool selected);
73#endif //KAB_EMBEDDED 74#endif //KAB_EMBEDDED
74 75
75 protected slots: 76 protected slots:
76 void addresseeExecuted(QIconViewItem *item); 77 void addresseeExecuted(QIconViewItem *item);
77 void addresseeSelected(); 78 void addresseeSelected();
78 79
79 private: 80 private:
80 AddresseeIconView *mIconView; 81 AddresseeIconView *mIconView;
81 QPtrList<AddresseeIconViewItem> mIconList; 82 QPtrList<AddresseeIconViewItem> mIconList;
82}; 83};
83 84
84 85
85#ifndef KAB_EMBEDDED 86#ifndef KAB_EMBEDDED
86//MOC_SKIP_BEGIN 87//MOC_SKIP_BEGIN
87class AddresseeIconView : public KIconView 88class AddresseeIconView : public KIconView
88//MOC_SKIP_END 89//MOC_SKIP_END
89#else //KAB_EMBEDDED 90#else //KAB_EMBEDDED
90class AddresseeIconView : public QIconView 91class AddresseeIconView : public QIconView
91#endif //KAB_EMBEDDED 92#endif //KAB_EMBEDDED
92{ 93{
93 Q_OBJECT 94 Q_OBJECT
94 95
95 public: 96 public:
96 AddresseeIconView(QWidget *parent, const char *name); 97 AddresseeIconView(QWidget *parent, const char *name);
97 ~AddresseeIconView(); 98 ~AddresseeIconView();
98 99
99 signals: 100 signals:
100 void addresseeDropped(QDropEvent *); 101 void addresseeDropped(QDropEvent *);
101 void startAddresseeDrag(); 102 void startAddresseeDrag();
102 103
103 protected: 104 protected:
104 virtual QDragObject *dragObject(); 105 virtual QDragObject *dragObject();
105 106
106 protected slots: 107 protected slots:
107 void itemDropped(QDropEvent *, const QValueList<QIconDragItem> &); 108 void itemDropped(QDropEvent *, const QValueList<QIconDragItem> &);
108}; 109};
109 110
110class IconViewFactory : public ViewFactory 111class IconViewFactory : public ViewFactory
111{ 112{
112 public: 113 public:
113 KAddressBookView *view( KABC::AddressBook *ab, QWidget *parent, const char *name ) 114 KAddressBookView *view( KABC::AddressBook *ab, QWidget *parent, const char *name )
114 { 115 {
115 return new KAddressBookIconView( ab, parent, name ); 116 return new KAddressBookIconView( ab, parent, name );
116 } 117 }
117 118
118 QString type() const { return "Icon"; } 119 QString type() const { return "Icon"; }
119 120
120 QString description() const { return i18n( "Icons represent contacts. Very simple view." ); } 121 QString description() const { return i18n( "Icons represent contacts. Very simple view." ); }
121}; 122};
122/* 123/*
123extern "C" { 124extern "C" {
124 void *init_libkaddrbk_iconview() 125 void *init_libkaddrbk_iconview()
125 { 126 {
126 return ( new IconViewFactory ); 127 return ( new IconViewFactory );
127 } 128 }
128} 129}
129*/ 130*/
130#endif 131#endif
diff --git a/kaddressbook/views/kaddressbooktableview.cpp b/kaddressbook/views/kaddressbooktableview.cpp
index ab11e2a..12f7c27 100644
--- a/kaddressbook/views/kaddressbooktableview.cpp
+++ b/kaddressbook/views/kaddressbooktableview.cpp
@@ -1,242 +1,291 @@
1// $Id$ 1// $Id$
2 2
3#include <qvbox.h> 3#include <qvbox.h>
4#include <qlistbox.h> 4#include <qlistbox.h>
5#include <qwidget.h> 5#include <qwidget.h>
6#include <qfile.h> 6#include <qfile.h>
7#include <qimage.h> 7#include <qimage.h>
8#include <qcombobox.h> 8#include <qcombobox.h>
9#include <qapplication.h> 9#include <qapplication.h>
10#include <qdragobject.h> 10#include <qdragobject.h>
11#include <qevent.h> 11#include <qevent.h>
12#include <qurl.h> 12#include <qurl.h>
13#include <qpixmap.h> 13#include <qpixmap.h>
14 14
15#include <kabc/addressbook.h> 15#include <kabc/addressbook.h>
16#include <kapplication.h> 16#include <kapplication.h>
17#include <kconfig.h> 17#include <kconfig.h>
18#include <kcolorbutton.h> 18#include <kcolorbutton.h>
19#include <kdebug.h> 19#include <kdebug.h>
20#include <kglobal.h> 20#include <kglobal.h>
21#include <kiconloader.h> 21#include <kiconloader.h>
22#include <klineedit.h> 22#include <klineedit.h>
23#include <klocale.h> 23#include <klocale.h>
24#include <kmessagebox.h> 24#include <kmessagebox.h>
25#include <kurl.h> 25#include <kurl.h>
26#include <kurlrequester.h> 26#include <kurlrequester.h>
27 27
28//US#include "configuretableviewdialog.h" 28//US#include "configuretableviewdialog.h"
29#include "contactlistview.h" 29#include "contactlistview.h"
30#include "kabprefs.h" 30#include "kabprefs.h"
31#include "undocmds.h" 31#include "undocmds.h"
32#include "viewmanager.h" 32#include "viewmanager.h"
33 33
34#include <qlayout.h> 34#include <qlayout.h>
35#include <qheader.h> 35#include <qheader.h>
36 36
37#include "kaddressbooktableview.h" 37#include "kaddressbooktableview.h"
38 38
39 39
40KAddressBookTableView::KAddressBookTableView( KABC::AddressBook *ab, 40KAddressBookTableView::KAddressBookTableView( KABC::AddressBook *ab,
41 QWidget *parent, const char *name ) 41 QWidget *parent, const char *name )
42 : KAddressBookView( ab, parent, name ) 42 : KAddressBookView( ab, parent, name )
43{ 43{
44 mainLayout = new QVBoxLayout( viewWidget(), 2 ); 44 mainLayout = new QVBoxLayout( viewWidget(), 2 );
45 45
46 // The list view will be created when the config is read. 46 // The list view will be created when the config is read.
47 mListView = 0; 47 mListView = 0;
48} 48}
49 49
50KAddressBookTableView::~KAddressBookTableView() 50KAddressBookTableView::~KAddressBookTableView()
51{ 51{
52} 52}
53 53
54void KAddressBookTableView::reconstructListView() 54void KAddressBookTableView::reconstructListView()
55{ 55{
56 if (mListView) 56 if (mListView)
57 { 57 {
58 disconnect(mListView, SIGNAL(selectionChanged()), 58 disconnect(mListView, SIGNAL(selectionChanged()),
59 this, SLOT(addresseeSelected())); 59 this, SLOT(addresseeSelected()));
60 disconnect(mListView, SIGNAL(executed(QListViewItem*)), 60 disconnect(mListView, SIGNAL(executed(QListViewItem*)),
61 this, SLOT(addresseeExecuted(QListViewItem*))); 61 this, SLOT(addresseeExecuted(QListViewItem*)));
62 disconnect(mListView, SIGNAL(doubleClicked(QListViewItem*)), 62 disconnect(mListView, SIGNAL(doubleClicked(QListViewItem*)),
63 this, SLOT(addresseeExecuted(QListViewItem*))); 63 this, SLOT(addresseeExecuted(QListViewItem*)));
64 disconnect(mListView, SIGNAL(startAddresseeDrag()), this, 64 disconnect(mListView, SIGNAL(startAddresseeDrag()), this,
65 SIGNAL(startDrag())); 65 SIGNAL(startDrag()));
66 disconnect(mListView, SIGNAL(returnPressed(QListViewItem*)), 66 disconnect(mListView, SIGNAL(returnPressed(QListViewItem*)),
67 this, SLOT(addresseeExecuted(QListViewItem*))); 67 this, SLOT(addresseeExecuted(QListViewItem*)));
68 68
69 disconnect(mListView, SIGNAL(addresseeDropped(QDropEvent*)), this, 69 disconnect(mListView, SIGNAL(addresseeDropped(QDropEvent*)), this,
70 SIGNAL(dropped(QDropEvent*))); 70 SIGNAL(dropped(QDropEvent*)));
71 delete mListView; 71 delete mListView;
72 } 72 }
73 73
74 mListView = new ContactListView( this, addressBook(), viewWidget() ); 74 mListView = new ContactListView( this, addressBook(), viewWidget() );
75 75
76 // Add the columns 76 // Add the columns
77 KABC::Field::List fieldList = fields(); 77 KABC::Field::List fieldList = fields();
78 KABC::Field::List::ConstIterator it; 78 KABC::Field::List::ConstIterator it;
79 79
80 int c = 0; 80 int c = 0;
81 for( it = fieldList.begin(); it != fieldList.end(); ++it ) { 81 for( it = fieldList.begin(); it != fieldList.end(); ++it ) {
82 mListView->addColumn( (*it)->label() ); 82 mListView->addColumn( (*it)->label() );
83 mListView->setColumnWidthMode(c++, QListView::Manual); 83 mListView->setColumnWidthMode(c++, QListView::Manual);
84//US 84//US
85 // qDebug("KAddressBookTableView::reconstructListView: field %s", (*it)->label().latin1()); 85 // qDebug("KAddressBookTableView::reconstructListView: field %s", (*it)->label().latin1());
86 } 86 }
87 87
88 connect(mListView, SIGNAL(selectionChanged()), 88 connect(mListView, SIGNAL(selectionChanged()),
89 this, SLOT(addresseeSelected())); 89 this, SLOT(addresseeSelected()));
90 connect(mListView, SIGNAL(startAddresseeDrag()), this, 90 connect(mListView, SIGNAL(startAddresseeDrag()), this,
91 SIGNAL(startDrag())); 91 SIGNAL(startDrag()));
92 connect(mListView, SIGNAL(addresseeDropped(QDropEvent*)), this, 92 connect(mListView, SIGNAL(addresseeDropped(QDropEvent*)), this,
93 SIGNAL(dropped(QDropEvent*))); 93 SIGNAL(dropped(QDropEvent*)));
94 94
95 if (KABPrefs::instance()->mHonorSingleClick) 95 if (KABPrefs::instance()->mHonorSingleClick)
96 connect(mListView, SIGNAL(executed(QListViewItem*)), 96 connect(mListView, SIGNAL(executed(QListViewItem*)),
97 this, SLOT(addresseeExecuted(QListViewItem*))); 97 this, SLOT(addresseeExecuted(QListViewItem*)));
98 else 98 else
99 connect(mListView, SIGNAL(doubleClicked(QListViewItem*)), 99 connect(mListView, SIGNAL(doubleClicked(QListViewItem*)),
100 this, SLOT(addresseeExecuted(QListViewItem*))); 100 this, SLOT(addresseeExecuted(QListViewItem*)));
101 connect(mListView, SIGNAL(returnPressed(QListViewItem*)), 101 connect(mListView, SIGNAL(returnPressed(QListViewItem*)),
102 this, SLOT(addresseeExecuted(QListViewItem*))); 102 this, SLOT(addresseeExecuted(QListViewItem*)));
103 connect(mListView, SIGNAL(signalDelete()), 103 connect(mListView, SIGNAL(signalDelete()),
104 this, SLOT(addresseeDeleted())); 104 this, SLOT(addresseeDeleted()));
105 105
106//US performceimprovement. Refresh is done from the outside 106//US performceimprovement. Refresh is done from the outside
107//US refresh(); 107//US refresh();
108 108
109 mListView->setSorting( 0, true ); 109 mListView->setSorting( 0, true );
110 mainLayout->addWidget( mListView ); 110 mainLayout->addWidget( mListView );
111 mainLayout->activate(); 111 mainLayout->activate();
112 mListView->show(); 112 mListView->show();
113} 113}
114 114
115void KAddressBookTableView::doSearch( const QString& s, KABC::Field *field )
116{
117 mListView->clear();
118 if ( s.isEmpty() || s == "*" ) {
119 refresh();
120 return;
121 }
122 QString pattern = s.lower()+"*";
123 QRegExp re;
124 re.setWildcard(true); // most people understand these better.
125 re.setCaseSensitive(false);
126 re.setPattern( pattern );
127 if (!re.isValid())
128 return;
129 KABC::Addressee::List addresseeList = addressees();
130 KABC::Addressee::List::Iterator it;
131 if ( field ) {
132 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) {
133#if QT_VERSION >= 300
134 if (re.search(field->value( *it ).lower()) != -1)
135#else
136 if (re.match(field->value( *it ).lower()) != -1)
137#endif
138 ContactListViewItem *item = new ContactListViewItem(*it, mListView, addressBook(), fields());
139
140 }
141 } else {
142 KABC::Field::List fieldList = fields();
143 KABC::Field::List::ConstIterator fieldIt;
144 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) {
145 for ( fieldIt = fieldList.begin(); fieldIt != fieldList.end(); ++fieldIt ) {
146#if QT_VERSION >= 300
147 if (re.search((*fieldIt)->value( *it ).lower()) != -1)
148#else
149 if (re.match((*fieldIt)->value( *it ).lower()) != -1)
150#endif
151 {
152 ContactListViewItem *item = new ContactListViewItem(*it, mListView, addressBook(), fields());
153 continue;
154 }
155 }
156 }
157 }
158 // Sometimes the background pixmap gets messed up when we add lots
159 // of items.
160 mListView->repaint();
161 emit selected(QString::null);
162
163}
115void KAddressBookTableView::writeConfig(KConfig *config) 164void KAddressBookTableView::writeConfig(KConfig *config)
116{ 165{
117 KAddressBookView::writeConfig(config); 166 KAddressBookView::writeConfig(config);
118 167
119 mListView->saveLayout(config, config->group()); 168 mListView->saveLayout(config, config->group());
120} 169}
121 170
122void KAddressBookTableView::readConfig(KConfig *config) 171void KAddressBookTableView::readConfig(KConfig *config)
123{ 172{
124 KAddressBookView::readConfig( config ); 173 KAddressBookView::readConfig( config );
125 // The config could have changed the fields, so we need to reconstruct 174 // The config could have changed the fields, so we need to reconstruct
126 // the listview. 175 // the listview.
127 reconstructListView(); 176 reconstructListView();
128 177
129 // costum colors? 178 // costum colors?
130 if ( config->readBoolEntry( "EnableCustomColors", false ) ) 179 if ( config->readBoolEntry( "EnableCustomColors", false ) )
131 { 180 {
132 QPalette p( mListView->palette() ); 181 QPalette p( mListView->palette() );
133 QColor c = p.color(QPalette::Normal, QColorGroup::Base ); 182 QColor c = p.color(QPalette::Normal, QColorGroup::Base );
134 p.setColor( QPalette::Normal, QColorGroup::Base, config->readColorEntry( "BackgroundColor", &c ) ); 183 p.setColor( QPalette::Normal, QColorGroup::Base, config->readColorEntry( "BackgroundColor", &c ) );
135 c = p.color(QPalette::Normal, QColorGroup::Text ); 184 c = p.color(QPalette::Normal, QColorGroup::Text );
136 p.setColor( QPalette::Normal, QColorGroup::Text, config->readColorEntry( "TextColor", &c ) ); 185 p.setColor( QPalette::Normal, QColorGroup::Text, config->readColorEntry( "TextColor", &c ) );
137 c = p.color(QPalette::Normal, QColorGroup::Button ); 186 c = p.color(QPalette::Normal, QColorGroup::Button );
138 p.setColor( QPalette::Normal, QColorGroup::Button, config->readColorEntry( "HeaderColor", &c ) ); 187 p.setColor( QPalette::Normal, QColorGroup::Button, config->readColorEntry( "HeaderColor", &c ) );
139 c = p.color(QPalette::Normal, QColorGroup::ButtonText ); 188 c = p.color(QPalette::Normal, QColorGroup::ButtonText );
140 p.setColor( QPalette::Normal, QColorGroup::ButtonText, config->readColorEntry( "HeaderTextColor", &c ) ); 189 p.setColor( QPalette::Normal, QColorGroup::ButtonText, config->readColorEntry( "HeaderTextColor", &c ) );
141 c = p.color(QPalette::Normal, QColorGroup::Highlight ); 190 c = p.color(QPalette::Normal, QColorGroup::Highlight );
142 p.setColor( QPalette::Normal, QColorGroup::Highlight, config->readColorEntry( "HighlightColor", &c ) ); 191 p.setColor( QPalette::Normal, QColorGroup::Highlight, config->readColorEntry( "HighlightColor", &c ) );
143 c = p.color(QPalette::Normal, QColorGroup::HighlightedText ); 192 c = p.color(QPalette::Normal, QColorGroup::HighlightedText );
144 p.setColor( QPalette::Normal, QColorGroup::HighlightedText, config->readColorEntry( "HighlightedTextColor", &c ) ); 193 p.setColor( QPalette::Normal, QColorGroup::HighlightedText, config->readColorEntry( "HighlightedTextColor", &c ) );
145#ifndef KAB_EMBEDDED 194#ifndef KAB_EMBEDDED
146 c = KGlobalSettings::alternateBackgroundColor(); 195 c = KGlobalSettings::alternateBackgroundColor();
147#else //KAB_EMBEDDED 196#else //KAB_EMBEDDED
148 c = QColor(240, 240, 240); 197 c = QColor(240, 240, 240);
149#endif //KAB_EMBEDDED 198#endif //KAB_EMBEDDED
150 c = config->readColorEntry ("AlternatingBackgroundColor", &c); 199 c = config->readColorEntry ("AlternatingBackgroundColor", &c);
151 mListView->setAlternateColor(c); 200 mListView->setAlternateColor(c);
152 201
153 202
154 //US mListView->viewport()->setPalette( p ); 203 //US mListView->viewport()->setPalette( p );
155 mListView->setPalette( p ); 204 mListView->setPalette( p );
156 } 205 }
157 else 206 else
158 { 207 {
159 // needed if turned off during a session. 208 // needed if turned off during a session.
160 //US mListView->viewport()->setPalette( mListView->palette() ); 209 //US mListView->viewport()->setPalette( mListView->palette() );
161 mListView->setPalette( mListView->palette() ); 210 mListView->setPalette( mListView->palette() );
162 } 211 }
163 212
164 //custom fonts? 213 //custom fonts?
165 QFont f( font() ); 214 QFont f( font() );
166 if ( config->readBoolEntry( "EnableCustomFonts", false ) ) 215 if ( config->readBoolEntry( "EnableCustomFonts", false ) )
167 { 216 {
168 mListView->setFont( config->readFontEntry( "TextFont", &f) ); 217 mListView->setFont( config->readFontEntry( "TextFont", &f) );
169 f.setBold( true ); 218 f.setBold( true );
170 //US mListView->setHeaderFont( config->readFontEntry( "HeaderFont", &f ) ); 219 //US mListView->setHeaderFont( config->readFontEntry( "HeaderFont", &f ) );
171 mListView->header()->setFont( config->readFontEntry( "HeaderFont", &f ) ); 220 mListView->header()->setFont( config->readFontEntry( "HeaderFont", &f ) );
172 } 221 }
173 else 222 else
174 { 223 {
175 mListView->setFont( f ); 224 mListView->setFont( f );
176 f.setBold( true ); 225 f.setBold( true );
177 //US mListView->setHeaderFont( f ); 226 //US mListView->setHeaderFont( f );
178 mListView->header()->setFont( f ); 227 mListView->header()->setFont( f );
179 } 228 }
180 229
181 230
182 231
183 232
184 233
185 // Set the list view options 234 // Set the list view options
186 mListView->setAlternateBackgroundEnabled(config->readBoolEntry("ABackground", 235 mListView->setAlternateBackgroundEnabled(config->readBoolEntry("ABackground",
187 true)); 236 true));
188 mListView->setSingleLineEnabled(config->readBoolEntry("SingleLine", false)); 237 mListView->setSingleLineEnabled(config->readBoolEntry("SingleLine", false));
189 mListView->setToolTipsEnabled(config->readBoolEntry("ToolTips", true)); 238 mListView->setToolTipsEnabled(config->readBoolEntry("ToolTips", true));
190 239
191 if (config->readBoolEntry("Background", false)) 240 if (config->readBoolEntry("Background", false))
192 mListView->setBackgroundPixmap(config->readEntry("BackgroundName")); 241 mListView->setBackgroundPixmap(config->readEntry("BackgroundName"));
193 242
194 // Restore the layout of the listview 243 // Restore the layout of the listview
195 mListView->restoreLayout(config, config->group()); 244 mListView->restoreLayout(config, config->group());
196} 245}
197 246
198void KAddressBookTableView::refresh(QString uid) 247void KAddressBookTableView::refresh(QString uid)
199{ 248{
200 // For now just repopulate. In reality this method should 249 // For now just repopulate. In reality this method should
201 // check the value of uid, and if valid iterate through 250 // check the value of uid, and if valid iterate through
202 // the listview to find the entry, then tell it to refresh. 251 // the listview to find the entry, then tell it to refresh.
203 252
204 if (uid.isNull()) { 253 if (uid.isNull()) {
205 // Clear the list view 254 // Clear the list view
206 QString currentUID, nextUID; 255 QString currentUID, nextUID;
207#ifndef KAB_EMBEDDED 256#ifndef KAB_EMBEDDED
208 ContactListViewItem *currentItem = dynamic_cast<ContactListViewItem*>( mListView->currentItem() ); 257 ContactListViewItem *currentItem = dynamic_cast<ContactListViewItem*>( mListView->currentItem() );
209#else //KAB_EMBEDDED 258#else //KAB_EMBEDDED
210 ContactListViewItem *currentItem = (ContactListViewItem*)( mListView->currentItem() ); 259 ContactListViewItem *currentItem = (ContactListViewItem*)( mListView->currentItem() );
211#endif //KAB_EMBEDDED 260#endif //KAB_EMBEDDED
212 261
213 if ( currentItem ) { 262 if ( currentItem ) {
214#ifndef KAB_EMBEDDED 263#ifndef KAB_EMBEDDED
215 ContactListViewItem *nextItem = dynamic_cast<ContactListViewItem*>( currentItem->itemBelow() ); 264 ContactListViewItem *nextItem = dynamic_cast<ContactListViewItem*>( currentItem->itemBelow() );
216#else //KAB_EMBEDDED 265#else //KAB_EMBEDDED
217 ContactListViewItem *nextItem = (ContactListViewItem*)( currentItem->itemBelow() ); 266 ContactListViewItem *nextItem = (ContactListViewItem*)( currentItem->itemBelow() );
218#endif //KAB_EMBEDDED 267#endif //KAB_EMBEDDED
219 if ( nextItem ) 268 if ( nextItem )
220 nextUID = nextItem->addressee().uid(); 269 nextUID = nextItem->addressee().uid();
221 currentUID = currentItem->addressee().uid(); 270 currentUID = currentItem->addressee().uid();
222 } 271 }
223 272
224 mListView->clear(); 273 mListView->clear();
225 274
226 currentItem = 0; 275 currentItem = 0;
227 KABC::Addressee::List addresseeList = addressees(); 276 KABC::Addressee::List addresseeList = addressees();
228 KABC::Addressee::List::Iterator it; 277 KABC::Addressee::List::Iterator it;
229 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) { 278 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) {
230 ContactListViewItem *item = new ContactListViewItem(*it, mListView, addressBook(), fields()); 279 ContactListViewItem *item = new ContactListViewItem(*it, mListView, addressBook(), fields());
231 if ( (*it).uid() == currentUID ) 280 if ( (*it).uid() == currentUID )
232 currentItem = item; 281 currentItem = item;
233 else if ( (*it).uid() == nextUID && !currentItem ) 282 else if ( (*it).uid() == nextUID && !currentItem )
234 currentItem = item; 283 currentItem = item;
235 } 284 }
236 285
237 // Sometimes the background pixmap gets messed up when we add lots 286 // Sometimes the background pixmap gets messed up when we add lots
238 // of items. 287 // of items.
239 mListView->repaint(); 288 mListView->repaint();
240 289
241 if ( currentItem ) { 290 if ( currentItem ) {
242 mListView->setCurrentItem( currentItem ); 291 mListView->setCurrentItem( currentItem );
diff --git a/kaddressbook/views/kaddressbooktableview.h b/kaddressbook/views/kaddressbooktableview.h
index bb991bc..ecfe7a1 100644
--- a/kaddressbook/views/kaddressbooktableview.h
+++ b/kaddressbook/views/kaddressbooktableview.h
@@ -1,114 +1,115 @@
1#ifndef KADDRESSBOOKTABLEVIEW_H 1#ifndef KADDRESSBOOKTABLEVIEW_H
2#define KADDRESSBOOKTABLEVIEW_H 2#define KADDRESSBOOKTABLEVIEW_H
3 3
4 4
5#ifndef KAB_EMBEDDED 5#ifndef KAB_EMBEDDED
6 6
7 7
8#ifdef HAVE_CONFIG_H 8#ifdef HAVE_CONFIG_H
9#include <config.h> 9#include <config.h>
10#endif 10#endif
11 11
12#include <qwidget.h> 12#include <qwidget.h>
13#include <qlistview.h> 13#include <qlistview.h>
14#include <qstring.h> 14#include <qstring.h>
15#include <qdialog.h> 15#include <qdialog.h>
16#include <qtabdialog.h> 16#include <qtabdialog.h>
17#include <qstringlist.h> 17#include <qstringlist.h>
18#include <qvaluelist.h> 18#include <qvaluelist.h>
19 19
20#include "undo.h" 20#include "undo.h"
21 21
22#else //KAB_EMBEDDED 22#else //KAB_EMBEDDED
23#include "views/configuretableviewdialog.h" 23#include "views/configuretableviewdialog.h"
24#endif //KAB_EMBEDDED 24#endif //KAB_EMBEDDED
25 25
26#include "klocale.h" 26#include "klocale.h"
27#include "kaddressbookview.h" 27#include "kaddressbookview.h"
28 28
29class QListViewItem; 29class QListViewItem;
30class QListBox; 30class QListBox;
31class QVBoxLayout; 31class QVBoxLayout;
32class KConfig; 32class KConfig;
33 33
34class ContactListViewItem; 34class ContactListViewItem;
35class ContactListView; 35class ContactListView;
36 36
37 37
38namespace KABC { class AddressBook; } 38namespace KABC { class AddressBook; }
39 39
40/** 40/**
41 * This class is the table view for kaddressbook. This view is a KListView 41 * This class is the table view for kaddressbook. This view is a KListView
42 * with multiple columns for the selected fields. 42 * with multiple columns for the selected fields.
43 * 43 *
44 * @short Table View 44 * @short Table View
45 * @author Don Sanders <dsanders@kde.org> 45 * @author Don Sanders <dsanders@kde.org>
46 * @version 0.1 46 * @version 0.1
47 */ 47 */
48class KAddressBookTableView : public KAddressBookView 48class KAddressBookTableView : public KAddressBookView
49{ 49{
50friend class ContactListView; 50friend class ContactListView;
51 51
52 Q_OBJECT 52 Q_OBJECT
53 53
54 public: 54 public:
55 KAddressBookTableView( KABC::AddressBook *ab, QWidget *parent, 55 KAddressBookTableView( KABC::AddressBook *ab, QWidget *parent,
56 const char *name = 0 ); 56 const char *name = 0 );
57 virtual ~KAddressBookTableView(); 57 virtual ~KAddressBookTableView();
58 58
59 virtual void refresh(QString uid = QString::null); 59 virtual void refresh(QString uid = QString::null);
60 virtual QStringList selectedUids(); 60 virtual QStringList selectedUids();
61 virtual void setSelected(QString uid = QString::null, bool selected = false); 61 virtual void setSelected(QString uid = QString::null, bool selected = false);
62 virtual void readConfig(KConfig *config); 62 virtual void readConfig(KConfig *config);
63 virtual void writeConfig(KConfig *config); 63 virtual void writeConfig(KConfig *config);
64 virtual QString type() const { return "Table"; } 64 virtual QString type() const { return "Table"; }
65 void doSearch( const QString& s ,KABC::Field *field );
65 66
66 public slots: 67 public slots:
67 virtual void reconstructListView(); 68 virtual void reconstructListView();
68 69
69 protected slots: 70 protected slots:
70 /** Called whenever the user selects an addressee in the list view. 71 /** Called whenever the user selects an addressee in the list view.
71 */ 72 */
72 void addresseeSelected(); 73 void addresseeSelected();
73 void addresseeDeleted(); 74 void addresseeDeleted();
74 75
75 /** Called whenever the user executes an addressee. In terms of the 76 /** Called whenever the user executes an addressee. In terms of the
76 * list view, this is probably a double click 77 * list view, this is probably a double click
77 */ 78 */
78 void addresseeExecuted(QListViewItem*); 79 void addresseeExecuted(QListViewItem*);
79 80
80 private: 81 private:
81 QVBoxLayout *mainLayout; 82 QVBoxLayout *mainLayout;
82 ContactListView *mListView; 83 ContactListView *mListView;
83}; 84};
84 85
85 86
86class TableViewFactory : public ViewFactory 87class TableViewFactory : public ViewFactory
87{ 88{
88 public: 89 public:
89 KAddressBookView *view( KABC::AddressBook *ab, QWidget *parent, const char *name ) 90 KAddressBookView *view( KABC::AddressBook *ab, QWidget *parent, const char *name )
90 { 91 {
91 return new KAddressBookTableView( ab, parent, name ); 92 return new KAddressBookTableView( ab, parent, name );
92 } 93 }
93 94
94 QString type() const { return "Table"; } 95 QString type() const { return "Table"; }
95 96
96 QString description() const { return i18n( "A listing of contacts in a table. Each cell of " 97 QString description() const { return i18n( "A listing of contacts in a table. Each cell of "
97 "the table holds a field of the contact." ); } 98 "the table holds a field of the contact." ); }
98 99
99 ViewConfigureWidget *configureWidget( KABC::AddressBook *ab, QWidget *parent, 100 ViewConfigureWidget *configureWidget( KABC::AddressBook *ab, QWidget *parent,
100 const char *name = 0 ) 101 const char *name = 0 )
101 { 102 {
102 return new ConfigureTableViewWidget( ab, parent, name ); 103 return new ConfigureTableViewWidget( ab, parent, name );
103 } 104 }
104}; 105};
105/*US 106/*US
106extern "C" { 107extern "C" {
107 void *init_libkaddrbk_tableview() 108 void *init_libkaddrbk_tableview()
108 { 109 {
109 return ( new TableViewFactory ); 110 return ( new TableViewFactory );
110 } 111 }
111} 112}
112*/ 113*/
113 114
114#endif 115#endif