filemanager/GFLM/src/CGflmGroupItem.cpp
changeset 0 6a9f87576119
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/filemanager/GFLM/src/CGflmGroupItem.cpp	Mon Jan 18 20:09:41 2010 +0200
@@ -0,0 +1,343 @@
+/*
+* 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