Graphisoft®

Dialog ManagerVersion: 2.0

TreeViewDropTargetObserver::TreeViewDropped

Event handler for the drag dropped notification.

virtual void TreeViewDropped (
    const TreeViewDropTargetEvent & ev,
    DragDrop::Effect *  effect
);

Parameters

ev
A reference to the event.
effect
Drag and drop effect can take the following values: DragDrop::Reject, DragDrop::Accept, DragDrop::Copy, DragDrop::Move, DragDrop::Link, DragDrop::Delete.

Description

When a drop event occurs it is time to insert data into the drop target. If you provided custom feedback, now is the time to erase it.

Example

// Method Example:
void	DragTab2Observer::TreeViewDropped (const DG::TreeViewDropTargetEvent& ev, DG::DragDrop::Effect* effect)
{
	if (ev.GetSource () == &tabPage->treeView) {
		long i;
		long insertPos = ev.GetInsertPosition ();
		DG::DragDrop::RelativePos relativePos = ev.GetRelativePosition ();
		char* text;
		GS::VAArray<char*> textArray;		// Array used to memorize list item texts
		GS::VAArray<long> validSelItems; 	// Array for treeview elements that are not inherited from each other.

		if (ev.HasDataFormat ('LBEX')) {
			DG::ListBox* sourceList = ev.GetListBoxSource ();
			for (i = 0; i < static_cast<long> (ev.GetItemCount ()); i++) {
				short listItem = ev.GetListBoxItem (i);
				ULong size = sourceList->GetTabItemTextLength (listItem, 1);
				text = BMAllocatePtr (size, ALLOCATE_CLEAR, 0);
				sourceList->GetTabItemText (listItem, 1, text, size);
				textArray.Insert (i + 1, text);
			}
			if (*effect == DG::DragDrop::Move) {
				for (long j = ev.GetItemCount () - 1; j >= 0 ; j--) {
					short listItem = ev.GetListBoxItem (j);
					sourceList->DeleteItem (listItem);
				}
			}
			tabPage->treeView.DeselectItem (DG::TreeView::AllItems);
			for (i = 0; i < static_cast<long> (ev.GetItemCount ()); i++) {
				long insTreeItem;
				if (relativePos == DG::DragDrop::InsertOn) {
					insTreeItem = tabPage->treeView.AppendItem (insertPos);
				} else {
					if (insertPos != DG::TreeView::RootItem && tabPage->treeView.IsItemExpanded (insertPos)) {
						insTreeItem = tabPage->treeView.InsertItem (insertPos, DG::TreeView::TopItem);
					} else {
						if (insertPos == DG::TreeView::RootItem) {
							insTreeItem = tabPage->treeView.InsertItem (insertPos, DG::TreeView::TopItem);
						} else {
							long parentItem = tabPage->treeView.GetItem (insertPos, DG::TreeView::Parent);
							insTreeItem = tabPage->treeView.InsertItem (parentItem, insertPos);
						}
					}
				}
				tabPage->treeView.SetItemText (insTreeItem, textArray[i + 1]);
				tabPage->treeView.SelectItem (insTreeItem);
				BMKillPtr (&textArray[i + 1]);
			}
		} else if (ev.HasDataFormat ('TVEX')) {
			DG::MultiSelTreeView* sourceTree = reinterpret_cast<DG::MultiSelTreeView*> (ev.GetTreeViewSource ());
			for (i = ev.GetItemCount () - 1; i >= 0 ; i--) {
				long treeItem = ev.GetTreeViewItem (i);	//Getting the selected treeview items from the source
				InsertItemRecursively (sourceTree, treeItem, insertPos, relativePos);
			}
			if (*effect == DG::DragDrop::Move) {
				for (i = ev.GetItemCount () - 1; i >= 0; i--) {
					long treeItem = ev.GetTreeViewItem (i);
					sourceTree->DeleteItem (treeItem);
				}
			}
		}
	}
}

Drop event handling in tree view controls.