protected int dragOverRow(DropTargetDragEvent dtde) {
		Row savedParentRow = mDragParentRow;
		int savedChildInsertIndex = mDragChildInsertIndex;
		Row parentRow = null;
		int childInsertIndex = -1;
		Point pt = dtde.getLocation();
		int y = getInsets().top;
		int last = getLastRowToDisplay();
		Row[] dragRows = mModel.getDragRows();
		boolean isFromSelf = dragRows != null && dragRows.length > 0 && mModel.getRows().contains(dragRows[0]);
		Rectangle bounds;
		int indent;
		Row row;

		for (int i = getFirstRowToDisplay(); i <= last; i++) {
			row = mModel.getRowAtIndex(i);
			if (!mModel.isRowFiltered(row)) {
				int height = row.getHeight();
				if (pt.y <= y + height / 2) {
					if (!isFromSelf || !mModel.isExtendedRowSelected(i) || i != 0 && !mModel.isExtendedRowSelected(i - 1)) {
						parentRow = row.getParent();
						if (parentRow != null) {
							childInsertIndex = parentRow.getIndexOfChild(row);
						} else {
							childInsertIndex = i;
						}
						break;
					}
				} else if (pt.y <= y + height) {
					if (row.canHaveChildren()) {
						bounds = getRowBounds(row);
						indent = mModel.getIndentWidth() + mModel.getIndentWidth(row, mModel.getColumns().get(0));
						if (pt.x >= bounds.x + indent && (!isFromSelf || !mModel.isExtendedRowSelected(row))) {
							parentRow = row;
							childInsertIndex = 0;
							break;
						}
					}
					if (!isFromSelf || !mModel.isExtendedRowSelected(i) || i < last && !mModel.isExtendedRowSelected(i + 1)) {
						parentRow = row.getParent();
						if (parentRow != null) {
							if (!isFromSelf || !mModel.isExtendedRowSelected(i)) {
								childInsertIndex = parentRow.getIndexOfChild(row) + 1;
								break;
							}
						} else {
							childInsertIndex = i + 1;
							break;
						}
					}
				}
				y += height + (mDrawRowDividers ? 1 : 0);
			}
		}
		if (childInsertIndex == -1) {
			if (last > 0) {
				row = mModel.getRowAtIndex(last);
				if (row.canHaveChildren()) {
					bounds = getRowBounds(row);
					indent = mModel.getIndentWidth() + mModel.getIndentWidth(row, mModel.getColumns().get(0));
					if (pt.x >= bounds.x + indent && (!isFromSelf || !mModel.isExtendedRowSelected(row))) {
						parentRow = row;
						childInsertIndex = 0;
					}
				}
				if (childInsertIndex == -1) {
					parentRow = row.getParent();
					if (parentRow != null && (!isFromSelf || !mModel.isExtendedRowSelected(parentRow))) {
						childInsertIndex = parentRow.getIndexOfChild(row) + 1;
					} else {
						parentRow = null;
						childInsertIndex = last + 1;
					}
				}
			} else {
				parentRow = null;
				childInsertIndex = 0;
			}
		}

		if (!isDragToRowAcceptable(parentRow)) {
			mDragParentRow = null;
			mDragChildInsertIndex = 0;
			if (mDragParentRow != savedParentRow || mDragChildInsertIndex != savedChildInsertIndex) {
				repaint(getDragRowInsertionMarkerBounds(savedParentRow, savedChildInsertIndex));
			}
			return DnDConstants.ACTION_NONE;
		}

		if (mDragParentRow != parentRow || mDragChildInsertIndex != childInsertIndex) {
			Graphics gc = getGraphics();
			mDragParentRow = parentRow;
			mDragChildInsertIndex = childInsertIndex;
			drawDragRowInsertionMarker(gc, mDragParentRow, mDragChildInsertIndex);
			gc.dispose();
		}

		if (mDragParentRow != savedParentRow || mDragChildInsertIndex != savedChildInsertIndex) {
			repaint(getDragRowInsertionMarkerBounds(savedParentRow, savedChildInsertIndex));
		}
		return DnDConstants.ACTION_MOVE;
	}