filemanager/GFLM/src/CGflmGroupItem.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:31:07 +0100
branchRCL_3
changeset 21 65326cf895ed
parent 0 6a9f87576119
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2002-2007 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0""
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  Group item definitions
*
*/



// INCLUDE FILES
#include "CGflmGroupItem.h"
#include "MGflmItemGroup.h"
#include <e32std.h>


// CONSTANTS
const TInt KIconIdUndefined = -1;
const TInt KSortCollationLevel = 3;


// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CGflmGroupItem::CGflmGroupItem
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CGflmGroupItem::CGflmGroupItem()
    : iIconId( KIconIdUndefined )
    {
    }

// -----------------------------------------------------------------------------
// CGflmGroupItem::~CGflmGroupItem()
// -----------------------------------------------------------------------------
//
CGflmGroupItem::~CGflmGroupItem()
    {
    }

// -----------------------------------------------------------------------------
// CGflmGroupItem::GetIconId()
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
EXPORT_C TInt CGflmGroupItem::GetIconId( TInt& aIconId )
    {
    if ( iIconId == KIconIdUndefined )
        {
        aIconId = 0;
        return KErrNotFound;
        }
    aIconId = iIconId;
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// CGflmGroupItem::SetIconId()
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
EXPORT_C void CGflmGroupItem::SetIconId( const TInt aIconId )
    {
    iIconId = aIconId;
    }

// -----------------------------------------------------------------------------
// CGflmGroupItem::CanUseCompareF()
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TBool CGflmGroupItem::CanUseCompareF() const    
    {
    if ( iStatus & ECanUseCompareF )
        {
        return ETrue;
        }
    if ( iStatus & ECannotUseCompareF )
        {
        return EFalse;
        }

    TPtrC name( Name() );
    TInt len( name.Length() );
    const TText* ptr = name.Ptr();
    while ( len-- > 0 )
        {
        TText ch = *ptr++;
        // Do not allow CompareF for non Ascii or special chars
        if ( !( ( ch >= 0x000A && ch <= 0x0039 ) ||  // Ascii basic symbols
                ( ch >= 0x0041 && ch <= 0x005A ) ||  // Ascii capital alpha
                ( ch >= 0x0061 && ch <= 0x007A ) ) ) // Ascii small alpha
            {
            iStatus |= ECannotUseCompareF;
            return EFalse;
            }
        }
    iStatus |= ECanUseCompareF;
    return ETrue;
    }

// -----------------------------------------------------------------------------
// CGflmGroupItem::SetGroup()
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CGflmGroupItem::SetGroup( MGflmItemGroup* aGroup )
    {
    iGroup = aGroup;
    }

// -----------------------------------------------------------------------------
// CGflmGroupItem::GetSortL()
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//

TLinearOrder< CGflmGroupItem > CGflmGroupItem::GetSortL(
        TGflmSortMethod aSortMethod )
    {
    switch( aSortMethod )
        {
        case EByName:
            {
            return CompareByName;
            }
        case EByType:
            {
            return CompareByType;
            }
        case EMostRecentFirst:
            {
            return CompareMostRecentFirst;
            }
        case ELargestFirst:
            {
            return CompareLargestFirst;
            }
        default:
            {
            User::Leave( KErrNotSupported );
            }
        }
    return CompareByName;
    }

// -----------------------------------------------------------------------------
// CGflmGroupItem::CompareByItemType
// Compares two CGflmGroupItem objects by name (ascending)
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt CGflmGroupItem::CompareByItemType(
        const CGflmGroupItem& aFirst, const CGflmGroupItem& aSecond )
    {
    TGflmItemType first( aFirst.Type() );
    TGflmItemType second( aSecond.Type() );
    if ( first < second )
        {
        return -1;
        }
    else if ( first > second )
        {
        return 1;
        }
    return 0;
    }

// -----------------------------------------------------------------------------
// CGflmGroupItem::CompareByNameWithoutItemType
// Compares two CGflmGroupItem objects by name (ascending)
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt CGflmGroupItem::CompareByNameWithoutItemType(
        const CGflmGroupItem& aFirst, const CGflmGroupItem& aSecond )
    {
    // Do not use CompareC by default with collation
    // because it is very bad for performance when sorting
    // large folders i.e. several 1000s of files with long item names
    // e.g. names containing over 40 chars

    // However, some languages are not sorted correctly with CompareF,
    // so do cached name check to decide what comparison to use.

    if ( !aFirst.CanUseCompareF() || !aSecond.CanUseCompareF() )
        {
        if ( aFirst.iGroup )
            {
            const TCollationMethod* collate =
                aFirst.iGroup->CollationMethod();
            if ( collate )
                {
                return aFirst.Name().CompareC(
                    aSecond.Name(),
                    KSortCollationLevel,
                    collate );
                }
            }
        }

    return aFirst.Name().CompareF( aSecond.Name() );
    }

// -----------------------------------------------------------------------------
// CGflmGroupItem::CompareByName
// Compares two CGflmGroupItem objects by name (ascending)
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt CGflmGroupItem::CompareByName(
        const CGflmGroupItem& aFirst, const CGflmGroupItem& aSecond )
    {
    TInt ret( CompareByItemType( aFirst, aSecond ) );
    if ( !ret )
        {
        return CompareByNameWithoutItemType( aFirst, aSecond );
        }
    return ret;
    }

// -----------------------------------------------------------------------------
// CGflmGroupItem::CompareByType
// Compares two CGflmGroupItem objects by file extension (ascending)
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt CGflmGroupItem::CompareByType(
        const CGflmGroupItem& aFirst, const CGflmGroupItem& aSecond )
    {
    TInt ret( CompareByItemType( aFirst, aSecond ) );
    if ( ret )
        {
        return ret;
        }

    // Do not use CompareC by default with collation
    // because it is very bad for performance when sorting
    // large folders i.e. several 1000s of files with long item names
    // e.g. names containing over 40 chars

    // However, some languages are not sorted correctly with CompareF,
    // so do cached name check to decide what comparison to use.

    if ( !aFirst.CanUseCompareF() || !aSecond.CanUseCompareF() )
        {
        if ( aFirst.iGroup )
            {
            const TCollationMethod* collate =
                aFirst.iGroup->CollationMethod();
            if ( collate )
                {
                ret = aFirst.Ext().CompareC(
                    aSecond.Ext(),
                    KSortCollationLevel,
                    collate );
                if  ( !ret )
                    {
                    ret = CompareByName( aFirst, aSecond );
                    }
                return ret;
                }
            }
        }

    ret = aFirst.Ext().CompareF( aSecond.Ext() );
    if  ( !ret )
        {
        ret = CompareByNameWithoutItemType( aFirst, aSecond );
        }
    return ret;
    }

// -----------------------------------------------------------------------------
// CGflmGroupItem::CompareMostRecentFirst
// Compares two CGflmGroupItem objects by date (ascending)
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt CGflmGroupItem::CompareMostRecentFirst(
        const CGflmGroupItem& aFirst, const CGflmGroupItem& aSecond )
    {
    TInt ret( -CompareByItemType( aFirst, aSecond ) );
    if ( ret )
        {
        return ret;
        }

    TTime first( aFirst.Date() );
    TTime second( aSecond.Date() );

    if ( first > second )
        {
        return -1;
        }
    else if ( first < second )
        {
        return 1;
        }
    return CompareByNameWithoutItemType( aFirst, aSecond );
    }

// -----------------------------------------------------------------------------
// CGflmGroupItem::CompareLargestFirst
// Compares two CGflmGroupItem objects by size (ascending)
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt CGflmGroupItem::CompareLargestFirst(
        const CGflmGroupItem& aFirst, const CGflmGroupItem& aSecond )
    {
    TInt ret( -CompareByItemType( aFirst, aSecond ) );
    if ( ret )
        {
        return ret;
        }

    TInt64 first( aFirst.Size() );
    TInt64 second( aSecond.Size() );

    if ( first > second )
        {
        return -1;
        }
    else if ( first < second )
        {
        return 1;
        }
    return CompareByNameWithoutItemType( aFirst, aSecond );
    }

//  End of File