File indexing completed on 2024-05-19 05:14:36

0001 /*
0002   This file is part of KAddressBook.
0003 
0004   SPDX-FileCopyrightText: 2009 Tobias Koenig <tokoe@kde.org>
0005 
0006   SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "contactsorter.h"
0010 
0011 #include <KContacts/Addressee>
0012 
0013 using namespace KAddressBookImportExport;
0014 
0015 class ContactSortHelper
0016 {
0017 public:
0018     ContactSortHelper(ContactFields::Field field, Qt::SortOrder sortOrder)
0019         : mSortField(field)
0020         , mSortOrder(sortOrder)
0021     {
0022     }
0023 
0024     inline bool operator()(const KContacts::Addressee &contact, const KContacts::Addressee &otherContact) const
0025     {
0026         int result = QString::localeAwareCompare(ContactFields::value(mSortField, contact), ContactFields::value(mSortField, otherContact));
0027 
0028         if (result == 0) {
0029             int givenNameResult = QString::localeAwareCompare(ContactFields::value(ContactFields::GivenName, contact),
0030                                                               ContactFields::value(ContactFields::GivenName, otherContact));
0031 
0032             if (givenNameResult == 0) {
0033                 int familyNameResult = QString::localeAwareCompare(ContactFields::value(ContactFields::FamilyName, contact),
0034                                                                    ContactFields::value(ContactFields::FamilyName, otherContact));
0035 
0036                 if (familyNameResult == 0) {
0037                     result = QString::localeAwareCompare(ContactFields::value(ContactFields::FormattedName, contact),
0038                                                          ContactFields::value(ContactFields::FormattedName, otherContact));
0039                 } else {
0040                     result = familyNameResult;
0041                 }
0042             } else {
0043                 result = givenNameResult;
0044             }
0045         }
0046 
0047         bool lesser = result < 0;
0048 
0049         if (mSortOrder == Qt::DescendingOrder) {
0050             lesser = !lesser;
0051         }
0052 
0053         return lesser;
0054     }
0055 
0056 private:
0057     const ContactFields::Field mSortField;
0058     const Qt::SortOrder mSortOrder;
0059 };
0060 
0061 ContactSorter::ContactSorter(ContactFields::Field field, Qt::SortOrder sortOrder)
0062     : mSortField(field)
0063     , mSortOrder(sortOrder)
0064 {
0065 }
0066 
0067 void ContactSorter::sort(KContacts::Addressee::List &contacts) const
0068 {
0069     std::stable_sort(contacts.begin(), contacts.end(), ContactSortHelper(mSortField, mSortOrder));
0070 }