--- /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