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