Graphisoft®

Dialog ManagerVersion: 2.0

ListViewDropTargetObserver::ListViewDropped

Event handler for the drag dropped notification.

virtual void ListViewDropped (
    const ListViewDropTargetEvent & 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	DragTab3Observer::ListViewDropped (const DG::ListViewDropTargetEvent& ev, DG::DragDrop::Effect* effect)
{
	ULong i;
	short insertPos = ev.GetInsertPosition ();
	char* text;
	GS::VAArray<char*> textArray;			// Array used to memorize list item texts
	GS::VAArray<const void*>  iconArray;	// Array used to memorize list item icons

	if (ev.HasDataFormat ('LVEX')) {
		DG::ListView* sourceList = ev.GetListViewSource ();			// Getting the source listview control
		if (sourceList->GetId () != tabPage->listView.GetId () || sourceList->GetPanelId () != tabPage->listView.GetPanelId ())
			sourceList->DisableDraw ();
		tabPage->listView.DisableDraw ();
		for (i = 0; i < ev.GetItemCount (); i++) {
			short listItem = ev.GetListViewItem (i);
			ULong size = sourceList->GetItemTextLength (listItem);
			text = BMAllocatePtr (size, ALLOCATE_CLEAR, 0);
			sourceList->GetItemText (listItem, text, size);
			textArray.Insert (i + 1, text);							// Getting the text of the selected items
			if (sourceList->GetItemImageType (listItem) == DG::ListView::Icon) {
				DG::Icon icon = sourceList->GetItemIcon (listItem);
				iconArray.Insert (i + 1, icon.GetData ());
			}
		}
		if (*effect == DG::DragDrop::Move) {						// If move occurs than delete the selected elements from the source
			for (long j = ev.GetItemCount () - 1; j >= 0 ; j--) {
				short listItem = ev.GetListViewItem (j);
				sourceList->DeleteItem (listItem);
				if (listItem <= insertPos && sourceList->GetId () == tabPage->listView.GetId () &&
					sourceList->GetPanelId () == tabPage->listView.GetPanelId ())
					insertPos--;
				}
		}
		short tempInsPos = static_cast<short> (insertPos + 1);
		if (insertPos == DG::ListView::BottomItem)
			tempInsPos = insertPos;
		tabPage->listView.DeselectItem (DG::ListView::AllItems);	// Deselect the original selection
		for (i = 0; i < ev.GetItemCount (); i++) {					// Insert elements in the target list, than select them.
			tabPage->listView.InsertItem (tempInsPos);
			tabPage->listView.SelectItem (tempInsPos);
			tabPage->listView.SetItemText (tempInsPos, textArray[i + 1]);
			tabPage->listView.SetItemIcon (tempInsPos++, DG::Icon (iconArray[i + 1]));
			BMKillPtr (&textArray[i + 1]);
		}
		sourceList->EnableDraw ();
		sourceList->Redraw ();
		tabPage->listView.EnableDraw ();
		tabPage->listView.Redraw ();
	}
}

Drop event handling in list view controls.