*/
	protected void dropRow(DropTargetDropEvent dtde) {
		removeDragHighlight(this);
		if (mDragChildInsertIndex != -1) {
			StateEdit edit = new StateEdit(mModel, ROW_DROP_UNDO_TITLE);
			Row[] dragRows = mModel.getDragRows();
			boolean isFromSelf = dragRows != null && dragRows.length > 0 && mModel.getRows().contains(dragRows[0]);
			int count = mModel.getRowCount();
			ArrayList<Row> rows = new ArrayList<>(count);
			ArrayList<Row> selection = new ArrayList<>(count);
			ArrayList<Row> needSelected = new ArrayList<>(count);
			List<Row> modelRows;
			int i;
			int insertAt;
			Row row;

			// Collect up the selected rows
			if (!isFromSelf) {
				convertDragRowsToSelf(selection);
			} else {
				for (i = 0; i < count; i++) {
					row = mModel.getRowAtIndex(i);
					if (mModel.isExtendedRowSelected(row)) {
						selection.add(row);
					}
				}
			}

			// Re-order the visible rows
			if (mDragParentRow != null && !mDragParentRow.isOpen()) {
				insertAt = -1;
			} else {
				insertAt = getAbsoluteInsertionIndex(mDragParentRow, mDragChildInsertIndex);
			}
			for (i = 0; i < count; i++) {
				row = mModel.getRowAtIndex(i);
				if (i == insertAt) {
					rows.addAll(selection);
				}
				if (!isFromSelf || !mModel.isExtendedRowSelected(row)) {
					rows.add(row);
				}
			}
			if (count == insertAt) {
				rows.addAll(selection);
			}

			// Prune the selected rows that don't need to have their parents updated
			needSelected.addAll(selection);
			count = selection.size() - 1;
			for (i = count; i >= 0; i--) {
				Row parent;

				row = selection.get(i);
				parent = row.getParent();
				if (insertAt == -1) {
					row.setOwner(null);
				}
				if (parent != null && (!isFromSelf && !selection.contains(parent) || isFromSelf && !mModel.isExtendedRowSelected(parent))) {
					row.removeFromParent();
				} else if (parent != null) {
					selection.remove(i);
				}
			}

			// Update the parents of the remaining selected rows
			if (mDragParentRow != null) {
				count = selection.size() - 1;
				for (i = count; i >= 0; i--) {
					mDragParentRow.insertChild(mDragChildInsertIndex, selection.get(i));
				}
			}

			mModel.deselect();
			mModel.clearSort();
			mDragParentRow = null;
			mDragChildInsertIndex = -1;
			modelRows = mModel.getRows();
			modelRows.clear();
			modelRows.addAll(rows);
			mModel.getSelection().setSize(modelRows.size());
			setSize(getPreferredSize());
			mModel.select(needSelected, false);
			edit.end();
			postUndo(edit);
			repaint();
			contentSizeMayHaveChanged();
			rowsWereDropped();
		}
		mModel.setDragRows(null);
	}