xcfw/src/xcfwtree.cpp
changeset 60 f62f87b200ec
parent 4 1a2a00e78665
child 61 8e5041d13c84
--- a/xcfw/src/xcfwtree.cpp	Tue Feb 02 00:23:10 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,551 +0,0 @@
-/*
-* Copyright (c) 2002-2005 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:  Implementation of XCFW Content tree
-*
-*/
-
-
-
-// INCLUDE FILES
-#include    "xcfwtree.h"
-#include    "xcfwnode.h"
-#include    "xcfwpanic.h"
-
-// MACROS
-//Helper macro to cast MXCFWNode pointers to CXCFWNode
-#define WRAPNODE( aNode ) static_cast<CXCFWNode*>( aNode )
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// CXCFWTree::CXCFWTree
-// C++ default constructor can NOT contain any code, that
-// might leave.
-// -----------------------------------------------------------------------------
-//
-CXCFWTree::CXCFWTree()
-    {
-    }
-
-// -----------------------------------------------------------------------------
-// CXCFWTree::ConstructL
-// Symbian 2nd phase constructor can leave.
-// -----------------------------------------------------------------------------
-//
-void CXCFWTree::ConstructL()
-    {
-    }
-
-// -----------------------------------------------------------------------------
-// CXCFWTree::NewL
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C CXCFWTree* CXCFWTree::NewL()
-    {
-    CXCFWTree* self = new( ELeave ) CXCFWTree;
-    
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop( self );
-
-    return self;
-    }
-
-    
-// Destructor
-EXPORT_C CXCFWTree::~CXCFWTree()
-    {
-    //delete dtd name buffer
-    delete iDTDName;
-    
-    //delete node array    
-    iNodeList.ResetAndDestroy();
-    iNodeList.Close();
-    
-    //reset node array for client
-    iNodeListForClient.Reset();
-    iNodeListForClient.Close();
-    
-    //Null root pointer (owned in the iNodeList array)
-    iRoot = NULL;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CXCFWTree::AddNodeL
-// this overload is for adding node under certain parent before certain child
-// -----------------------------------------------------------------------------
-//
-EXPORT_C MXCFWNode* CXCFWTree::AddNodeL(
-    CGECOObjectBase* aData, 
-    MXCFWNode* aParent, 
-    MXCFWNode* aInsertBefore )
-    {
-    CleanupStack::PushL( aData );
-    __ASSERT_LEAVE( aParent && aData && aInsertBefore &&
-        aData->TypeIdentifier() != iRoot->Data()->TypeIdentifier() &&
-        aInsertBefore->Parent() == aParent, KErrArgument );
-
-    __ASSERT_LEAVE( !iLocked, KErrAccessDenied );
-    
-    //Create new node and add to arrays.
-    CXCFWNode* nodeToAdd = CXCFWNode::NewL( aData );
-    CleanupStack::Pop( aData );
-    CleanupStack::PushL( nodeToAdd );
-    User::LeaveIfError( iNodeList.Append( nodeToAdd ) );
-    CleanupStack::Pop( nodeToAdd );
-
-    //update node references
-    nodeToAdd->SetParent( aParent );
-    nodeToAdd->SetNextSibling( aInsertBefore );
-    nodeToAdd->SetPrevSibling( aInsertBefore->PrevSibling() );
-        
-    //if "insert before" -node has previous sibling, update that
-    if ( aInsertBefore->PrevSibling() )
-        {
-        WRAPNODE( aInsertBefore->PrevSibling() )->SetNextSibling( nodeToAdd );
-        }
-
-    //set previous sibling
-    WRAPNODE( aInsertBefore )->SetPrevSibling( nodeToAdd );            
-
-    if( aParent->FirstChild() == aInsertBefore )
-        {
-        WRAPNODE( aParent )->SetFirstChild( nodeToAdd );            
-        }
-
-    //Set client list dirty => will be updated on next Nodes() request.
-    iClientListDirty = ETrue;
-    
-    return nodeToAdd;
-
-    }
-
-// -----------------------------------------------------------------------------
-// CXCFWTree::AddNodeL
-// this overload is for adding node under certain parent as last child
-// -----------------------------------------------------------------------------
-//
-EXPORT_C MXCFWNode* CXCFWTree::AddNodeL(
-    CGECOObjectBase* aData, 
-    MXCFWNode* aParent )
-    {
-    CleanupStack::PushL( aData );
-    //Legality checks
-    __ASSERT_LEAVE( aParent && aData && 
-         aData->TypeIdentifier() != iRoot->Data()->TypeIdentifier(),
-         KErrArgument );
-
-    __ASSERT_LEAVE( !iLocked, KErrAccessDenied );
-
-
-    //Create new node and add to arrays
-    CXCFWNode* nodeToAdd = CXCFWNode::NewL( aData );
-    CleanupStack::Pop( aData );
-    CleanupStack::PushL( nodeToAdd );
-    User::LeaveIfError( iNodeList.Append( nodeToAdd ) );
-    CleanupStack::Pop( nodeToAdd );
-
-    //set parent for new node
-    nodeToAdd->SetParent( aParent );
-
-    //if parent has a last child
-    if( aParent->LastChild() )
-        {
-        nodeToAdd->SetPrevSibling( aParent->LastChild() );
-        WRAPNODE( aParent->LastChild() )->SetNextSibling( nodeToAdd );
-        }
-    else
-        {
-        WRAPNODE( aParent )->SetFirstChild( nodeToAdd );
-        }
-
-    //update last child of the parent        
-    WRAPNODE( aParent )->SetLastChild( nodeToAdd );        
-
-    //Set client list dirty => will be updated on next Nodes() request.
-    iClientListDirty = ETrue;
-
-    return nodeToAdd;        
-    }
-
-// -----------------------------------------------------------------------------
-// CXCFWTree::AddNodeL
-// this overload is for adding root node only
-// -----------------------------------------------------------------------------
-//
-EXPORT_C MXCFWNode* CXCFWTree::AddNodeL(
-    CGECOObjectBase* aData )
-    {
-    CleanupStack::PushL( aData );
-    //if we already have a root, this is illegal
-    __ASSERT_LEAVE( iRoot==NULL, KErrAlreadyExists );
-
-    __ASSERT_LEAVE( !iLocked, KErrAccessDenied );
-
-    //Create root node and add to arrays
-    CXCFWNode* nodeToAdd = CXCFWNode::NewL( aData );
-    CleanupStack::Pop( aData );
-    CleanupStack::PushL( nodeToAdd );
-    User::LeaveIfError( iNodeList.Append( nodeToAdd ) );
-    CleanupStack::Pop( nodeToAdd );
-
-    //Set internal root member.
-    iRoot = nodeToAdd;
-    nodeToAdd = NULL;
-
-    //Set client list dirty => will be updated on next Nodes() request.
-    iClientListDirty = ETrue;
-
-    return iRoot;
-    }
-
-// -----------------------------------------------------------------------------
-// CXCFWTree::GetChildNodesL
-// Put child nodes of the given parent to the given array
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CXCFWTree::GetChildNodesL(
-    MXCFWNode* aParent, 
-    RNodeArray& aNodeList)
-    {
-    
-    __ASSERT_LEAVE( aParent != NULL, KErrArgument );
-    
-    MXCFWNode* pointer = aParent->FirstChild();
-    while ( pointer )
-        {
-        User::LeaveIfError( aNodeList.Append( pointer ) );
-        pointer = pointer->NextSibling();
-        }
-
-    }
-
-// -----------------------------------------------------------------------------
-// CXCFWTree::GetNodesOfTypeL
-// Put nodes that have dataobject of given type to given array.
-// In case of recursion, pre-order recursion is used
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CXCFWTree::GetNodesOfTypeL( 
-    const TDesC& aType, 
-    RNodeArray& aNodeList, 
-    MXCFWNode* aParent, 
-    TBool aRecursive )
-    {
-
-    __ASSERT_LEAVE( aParent != NULL, KErrArgument );
-
-    MXCFWNode* pointer = aParent->FirstChild();
-    
-    while ( pointer )
-        {
-        if ( pointer->Data()->TypeIdentifier().Compare( aType ) == 0 )
-            {
-            User::LeaveIfError( aNodeList.Append( pointer ) );                
-            }
-        if ( aRecursive )
-            {
-            GetNodesOfTypeL( aType, aNodeList, pointer, aRecursive );                
-            }
-        pointer = pointer->NextSibling();
-        }
-
-    }
-
-// -----------------------------------------------------------------------------
-// CXCFWTree::MoveNodeL
-// Moves a node in tree and updates the relative nodes in both original and
-// new location.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CXCFWTree::MoveNodeL(
-    MXCFWNode* aNodeToMove, 
-    MXCFWNode* aNewParent, 
-    MXCFWNode* aInsertBefore )
-    {
-
-    // assure parameter legality
-    __ASSERT_LEAVE( aNodeToMove && aNewParent && 
-        aNodeToMove != iRoot && aInsertBefore != iRoot &&
-        aNodeToMove != aNewParent,
-        KErrArgument );            
-
-    __ASSERT_LEAVE( !iLocked, KErrAccessDenied );
-
-
-    //if "insert before" node is child node of the given parent, move is illegal
-    if ( aInsertBefore && aInsertBefore->Parent() != aNewParent )
-        {
-        User::Leave( KErrArgument );            
-        }
-    
-    MXCFWNode* check = aNewParent->Parent();
-    while ( check )
-        {
-        //if user tries to move a node under itself (it is among the parents 
-        // of the given new parent) we'll leave
-        if ( check == aNodeToMove )
-            {
-            User::Leave( KErrArgument );
-            }
-        check = check->Parent();
-        }
-    check = NULL;
-    
-    //first update old parent if necessary
-    if ( aNodeToMove->Parent()->FirstChild() == aNodeToMove )
-        {
-        WRAPNODE( aNodeToMove->Parent() )->SetFirstChild( 
-                                aNodeToMove->NextSibling() );            
-        }
-    if ( aNodeToMove->Parent()->LastChild() == aNodeToMove )
-        {
-        WRAPNODE( aNodeToMove->Parent() )->SetLastChild(
-                                   aNodeToMove->PrevSibling() );            
-        }
-    
-    //update old siblings
-    if ( aNodeToMove->PrevSibling() )
-        {
-        WRAPNODE( aNodeToMove->PrevSibling())->SetNextSibling(
-                                aNodeToMove->NextSibling() );            
-        }
-    
-    if ( aNodeToMove->NextSibling() )
-        {
-        WRAPNODE( aNodeToMove->NextSibling() )->SetPrevSibling( 
-                                aNodeToMove->PrevSibling() );            
-        }
-        
-    //set new parent:
-    WRAPNODE( aNodeToMove )->SetParent( aNewParent );
-    
-    //update new siblings
-    if ( aInsertBefore )
-        {
-
-        //if "insert before" -node has a sibling before it, we update that
-        if ( aInsertBefore->PrevSibling() )
-            {
-            WRAPNODE( aInsertBefore->PrevSibling() )->SetNextSibling(
-                                aNodeToMove );                
-            }
-        else 
-        //no previous sibling => insertbefore is the first child of new parent
-            {
-            WRAPNODE( aNewParent )->SetFirstChild( aNodeToMove );                
-            }
-        WRAPNODE( aNodeToMove )->SetPrevSibling( aInsertBefore->PrevSibling() );
-        WRAPNODE( aNodeToMove )->SetNextSibling( aInsertBefore );
-        WRAPNODE( aInsertBefore )->SetPrevSibling( aNodeToMove );
-        }
-    else
-        {
-        //if new parent had children
-        if ( aNewParent->LastChild() )
-            {
-            WRAPNODE( aNewParent->LastChild() )->SetNextSibling( aNodeToMove );
-            WRAPNODE( aNodeToMove )->SetPrevSibling( aNewParent->LastChild() );
-            WRAPNODE( aNewParent )->SetLastChild( aNodeToMove );
-            WRAPNODE( aNodeToMove )->SetNextSibling(NULL);
-            }
-        else //no children before
-            {
-            WRAPNODE( aNewParent )->SetFirstChild( aNodeToMove );
-            WRAPNODE( aNewParent )->SetLastChild( aNodeToMove );
-            WRAPNODE( aNodeToMove )->SetPrevSibling( NULL );
-            WRAPNODE( aNodeToMove )->SetNextSibling( NULL );            
-            }
-        }
-
-    //Set client list dirty => will be updated on next Nodes() request.
-    iClientListDirty = ETrue;
-
-    }
-        
-// -----------------------------------------------------------------------------
-// CXCFWTree::Nodes
-// return tree nodes as array of MXCFWNode pointers
-// -----------------------------------------------------------------------------
-//
-EXPORT_C RNodeArray& CXCFWTree::Nodes()
-    {
-
-    //see if we should update the MXCFWNode array to reflect the new
-    if ( iClientListDirty )
-        {
-
-        if ( iNodeListForClient.Count() > 0 )
-            {
-            iNodeListForClient.Reset();
-            }
-
-        TInt count = iNodeList.Count();
-        for ( TInt i = 0; i < count; i++ )
-            {
-            iNodeListForClient.Append( (MXCFWNode*)iNodeList[i] );           
-            }
-        iClientListDirty = EFalse;
-        }
-
-    return iNodeListForClient;
-    }
-
-        
-// -----------------------------------------------------------------------------
-// CXCFWTree::RemoveNodeL
-// Removes a node from tree by updating all relative nodes and removing from
-// arrays.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CXCFWTree::RemoveNodeL(
-    MXCFWNode* aNodeToRemove )
-    {
-
-    __ASSERT_LEAVE( aNodeToRemove != NULL, KErrArgument );
-
-    __ASSERT_LEAVE( !iLocked, KErrAccessDenied );
-    
-    if ( iRoot != aNodeToRemove )
-        {
-        //update related nodes before removal, unless removing root node.
-        if ( aNodeToRemove->PrevSibling() )
-            {
-            WRAPNODE( aNodeToRemove->PrevSibling() )->SetNextSibling(
-                                    aNodeToRemove->NextSibling() );            
-            }
-        
-        if ( aNodeToRemove->NextSibling() )
-            {
-            WRAPNODE( aNodeToRemove->NextSibling() )->SetPrevSibling( 
-                                    aNodeToRemove->PrevSibling() );    
-            }
-
-        if ( aNodeToRemove->Parent()->FirstChild() == aNodeToRemove )
-            {
-            WRAPNODE( aNodeToRemove->Parent() )->SetFirstChild( 
-                                    aNodeToRemove->NextSibling() );            
-            }
-        
-        if ( aNodeToRemove->Parent()->LastChild() == aNodeToRemove )
-            {
-            WRAPNODE( aNodeToRemove->Parent() )->SetLastChild( 
-                                    aNodeToRemove->PrevSibling() );            
-            }
-        }
-    else
-        {
-        //root was removed.
-        iRoot = NULL;            
-        }
-
-    //Set client list dirty => will be updated on next Nodes() request.
-    iClientListDirty = ETrue;
-    
-    RemoveNodeRecursiveL( aNodeToRemove );
-
-    }
-
-
-// -----------------------------------------------------------------------------
-// CXCFWTree::RemoveFromArray
-// Removes node pointer from CXCFWNode and MXCFWNode pointer arrays. 
-// Deletes from CXCFWNode array as well.
-// -----------------------------------------------------------------------------
-//
-void CXCFWTree::RemoveFromNodeList(
-    MXCFWNode* aNode )
-    {
-
-    //remove node from the pointer array.
-    TInt i = iNodeList.Count() - 1 ;
-    for ( ;i>=0 && aNode != iNodeList[i] ; i-- ){}
-    if ( i>=0 )
-        {
-        //delete object
-        delete iNodeList[i];
-        //remove from pointer arrays.
-        iNodeList.Remove(i);
-        }
-
-    }
-
-// -----------------------------------------------------------------------------
-// CXCFWTree::RemoveNodeRecursiveL
-// Post-order recursion is used to make sure that no orhpan nodes are left
-// floating.
-// -----------------------------------------------------------------------------
-//
-void CXCFWTree::RemoveNodeRecursiveL(
-    MXCFWNode* aNode )
-    {
-
-    __ASSERT_LEAVE ( aNode != NULL, KErrArgument );
-
-    MXCFWNode* pointer = aNode->FirstChild();
-    
-    while ( pointer )
-        {
-        MXCFWNode* temp = pointer->NextSibling();
-        RemoveNodeRecursiveL( pointer );
-        pointer = temp;            
-        }
-
-    RemoveFromNodeList( aNode );
-    
-    }
-
-
-// -----------------------------------------------------------------------------
-// CXCFWTree::Root
-// Returns MXCFWNode pointer to root node.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C MXCFWNode* CXCFWTree::Root()
-    {
-    return iRoot;
-    }
-
-EXPORT_C void CXCFWTree::SetLocked( TBool aLockStatus )
-    {
-    iLocked = aLockStatus;
-    }
-
-EXPORT_C TBool CXCFWTree::IsLocked()
-    {
-    return iLocked;
-    }
-
-const TDesC& CXCFWTree::DTDName()
-    {
-    if ( !iDTDName )
-        {
-        return KNullDesC;
-        }
-    else
-        {
-        return *iDTDName;        
-        }
-    }
-
-void CXCFWTree::SetDTDNameL( const TDesC& aName )
-    {
-    delete iDTDName;
-    iDTDName = NULL;
-    iDTDName = aName.AllocL();        
-    }
-
-//  End of File