Copy an item to new location


Copying an item is simple but Ive listed a function for copying anyway. This function is used by other functions discussed later and it also contains a component that we often forget - extensibility. At the end of the function, the OnItemCopied() function is called to give the derived class the oppurtunity to update any internal information.
 
// CopyItem             - Copies an item to a new location
// Returns              - Handle of the new item
// hItem                - Item to be copied
// htiNewParent         - Handle of the parent for new item
// htiAfter             - Item after which the new item should be created
HTREEITEM CTreeCtrlX::CopyItem( HTREEITEM hItem, HTREEITEM htiNewParent, 
                                        HTREEITEM htiAfter /*= TVI_LAST*/ )
{
        TV_INSERTSTRUCT         tvstruct;
        HTREEITEM                       hNewItem;
        CString                         sText;

        // get information of the source item
        tvstruct.item.hItem = hItem;
        tvstruct.item.mask = TVIF_CHILDREN | TVIF_HANDLE | 
                                TVIF_IMAGE | TVIF_SELECTEDIMAGE;
        GetItem(&tvstruct.item);  
        sText = GetItemText( hItem );
        
        tvstruct.item.cchTextMax = sText.GetLength();
        tvstruct.item.pszText = sText.LockBuffer();

        // Insert the item at proper location
        tvstruct.hParent = htiNewParent;
        tvstruct.hInsertAfter = htiAfter;
        tvstruct.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
        hNewItem = InsertItem(&tvstruct);
        sText.ReleaseBuffer();

        // Now copy item data and item state.
        SetItemData( hNewItem, GetItemData( hItem ));
        SetItemState( hNewItem, GetItemState( hItem, TVIS_STATEIMAGEMASK ), 
                                                        TVIS_STATEIMAGEMASK );

        // Call virtual function to allow further processing in derived class
        OnItemCopied( hItem, hNewItem );

        return hNewItem;
}

void CTreeCtrlX::OnItemCopied(HTREEITEM /*hItem*/, HTREEITEM /*hNewItem*/ )
{
        // Virtual function 
}


In the class declaration add the following.

public:
        HTREEITEM CopyItem( HTREEITEM hItem, HTREEITEM htiNewParent, 
                                        HTREEITEM htiAfter = TVI_LAST );

protected:
        virtual void OnItemCopied( HTREEITEM hItem, HTREEITEM hNewItem );




Comments

  • Copy to last node in the tree fails

    Posted by Legacy on 07/31/1999 12:00am

    Originally posted by: Lawrence Perepolkin

    Copy item does not copy to last node in the tree. If one selects a leaf node in the tree control then drags it to the last node in the tree, copy item fails to copy the item.

    Reply
  • /treeview/copy_item.shtml

    Posted by Legacy on 07/31/1999 12:00am

    Originally posted by: Lawrence Perepolkin

    Copy item does not copy to last node in the tree. If one selects a leaf node in the tree control then drags it to the last node in the tree, copy item fails to copy the item.

    Reply
  • Copy Item is really a move?

    Posted by Legacy on 07/21/1999 12:00am

    Originally posted by: Lawrence Perepolkin

    To me copy means to copy a branch to a new location. One should have two instances of the branch in the tree. The copy function does not seem to do this. What it does is moves the branch to a new location?

    Reply
  • Copy tree "as is", without collapsing it.

    Posted by Legacy on 07/16/1999 12:00am

    Originally posted by: Arnt Witteveen

    If you change the line(s):
    
    

    SetItemState( hNewItem, GetItemState( hItem, TVIS_STATEIMAGEMASK ),
    TVIS_STATEIMAGEMASK );

    to:

    SetItemState( hNewItem, GetItemState( hItem, TVIS_STATEIMAGEMASK | TVIS_EXPANDED ),
    TVIS_STATEIMAGEMASK | TVIS_EXPANDED );

    the CopyBranch() function will be copy a branch exactly like it was, with expanded items expanded (and not expanded ones not expanded ... duh).
    Maybe you can also add: TVIS_EXPANDEDONCE and/or TVIS_EXPANDPARTIAL according to your needs.

    I have not been able to copy the TVIS_SELECTED status, because this leaves both the selected item and the "hItem" selected.


    Reply
  • If using callbacks won't work

    Posted by Legacy on 11/10/1998 12:00am

    Originally posted by: John Armstrong

    //use something like
    
    

    tvstruct.item.pszText = LPSTR_TEXTCALLBACK;
    tvstruct.item.pszText = LPSTR_TEXTCALLBACK;
    tvstruct.item.iImage = I_IMAGECALLBACK;
    tvstruct.item.iSelectedImage = I_IMAGECALLBACK;
    tvstruct.item.state = INDEXTOSTATEIMAGEMASK(1);
    tvstruct.item.stateMask = TVIS_STATEIMAGEMASK;
    tvstruct.item.cChildren = I_CHILDRENCALLBACK;

    // instead of the existing code inside copyitem

    sText = Tree.GetItemText( hItem );

    tvstruct.item.cchTextMax = sText.GetLength();
    tvstruct.item.pszText = sText.LockBuffer();

    Reply
  • Re: Help

    Posted by Legacy on 11/05/1998 12:00am

    Originally posted by: Sergey

    Are you moooooooooooooron!

    Reply
  • Help

    Posted by Legacy on 10/06/1998 12:00am

    Originally posted by: Andrew Ardvark

    MOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO!

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: August 20, 2014 @ 1:00 p.m. ET / 10:00 a.m. PT When you look at natural user interfaces as a developer, it isn't just fun and games. There are some very serious, real-world usage models of how things can help make the world a better place – things like Intel® RealSense™ technology. Check out this upcoming eSeminar and join the panel of experts, both from inside and outside of Intel, as they discuss how natural user interfaces will likely be getting adopted in a wide variety …

  • Savvy enterprises are discovering that the cloud holds the power to transform IT processes and support business objectives. IT departments can use the cloud to redefine the continuum of development and operations—a process that is becoming known as DevOps. Download the Executive Brief DevOps: Why IT Operations Managers Should Care About the Cloud—prepared by Frost & Sullivan and sponsored by IBM—to learn how IBM SmartCloud Application services provide a robust platform that streamlines …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds