1 /*
2 This file is part of KAddressBook.
3
4 SPDX-FileCopyrightText: 2009 Tobias Koenig <tokoe@kde.org>
5
6 SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
9 #include "contactsorter.h"
10
11 #include <KContacts/Addressee>
12
13 using namespace KAddressBookImportExport;
14
15 class ContactSortHelper
16 {
17 public:
ContactSortHelper(ContactFields::Field field,Qt::SortOrder sortOrder)18 ContactSortHelper(ContactFields::Field field, Qt::SortOrder sortOrder)
19 : mSortField(field)
20 , mSortOrder(sortOrder)
21 {
22 }
23
operator ()(const KContacts::Addressee & contact,const KContacts::Addressee & otherContact) const24 inline bool operator()(const KContacts::Addressee &contact, const KContacts::Addressee &otherContact) const
25 {
26 int result = QString::localeAwareCompare(ContactFields::value(mSortField, contact), ContactFields::value(mSortField, otherContact));
27
28 if (result == 0) {
29 int givenNameResult = QString::localeAwareCompare(ContactFields::value(ContactFields::GivenName, contact),
30 ContactFields::value(ContactFields::GivenName, otherContact));
31
32 if (givenNameResult == 0) {
33 int familyNameResult = QString::localeAwareCompare(ContactFields::value(ContactFields::FamilyName, contact),
34 ContactFields::value(ContactFields::FamilyName, otherContact));
35
36 if (familyNameResult == 0) {
37 result = QString::localeAwareCompare(ContactFields::value(ContactFields::FormattedName, contact),
38 ContactFields::value(ContactFields::FormattedName, otherContact));
39 } else {
40 result = familyNameResult;
41 }
42 } else {
43 result = givenNameResult;
44 }
45 }
46
47 bool lesser = result < 0;
48
49 if (mSortOrder == Qt::DescendingOrder) {
50 lesser = !lesser;
51 }
52
53 return lesser;
54 }
55
56 private:
57 const ContactFields::Field mSortField;
58 const Qt::SortOrder mSortOrder;
59 };
60
ContactSorter(ContactFields::Field field,Qt::SortOrder sortOrder)61 ContactSorter::ContactSorter(ContactFields::Field field, Qt::SortOrder sortOrder)
62 : mSortField(field)
63 , mSortOrder(sortOrder)
64 {
65 }
66
sort(KContacts::Addressee::List & contacts) const67 void ContactSorter::sort(KContacts::Addressee::List &contacts) const
68 {
69 std::stable_sort(contacts.begin(), contacts.end(), ContactSortHelper(mSortField, mSortOrder));
70 }
71