ComponentDropLocation (RadContainer container, @Nullable final Point location) { if (container.getGridRowCount() == 1 && container.getGridColumnCount() == 1 && getComponentAtGrid(container, 0, 0) == null) { final Rectangle rc = getGridCellRangeRect(container, 0, 0, 0, 0); if (location == null) { return new FirstComponentInsertLocation(container, rc, 0, 0); } return new FirstComponentInsertLocation(container, location, rc); } if (location == null) { if (getComponentAtGrid(container, 0, 0) == null) { return new GridDropLocation(container, 0, 0); } return new GridInsertLocation(container, getLastNonSpacerRow(container), 0, GridInsertMode.RowAfter); } int[] xs = getGridCellCoords(container, false); int[] ys = getGridCellCoords(container, true); int[] widths = getGridCellSizes(container, false); int[] heights = getGridCellSizes(container, true); int[] horzGridLines = getHorizontalGridLines(container); int[] vertGridLines = getVerticalGridLines(container); int row=ys.length-1; int col=xs.length-1; for(int i=0; i<xs.length; i++) { if (location.x < xs[i] + widths[i]) { col=i; break; } } for(int i=0; i<ys.length; i++) { if (location.getY() < ys [i]+heights [i]) { row=i; break; } } GridInsertMode mode = null; int EPSILON = 4; int dy = (int)(location.getY() - ys [row]); if (dy < EPSILON) { mode = GridInsertMode.RowBefore; } else if (heights [row] - dy < EPSILON) { mode = GridInsertMode.RowAfter; } int dx = location.x - xs[col]; if (dx < EPSILON) { mode = GridInsertMode.ColumnBefore; } else if (widths [col] - dx < EPSILON) { mode = GridInsertMode.ColumnAfter; } boolean spanInsertMode = canSpanningAllowed() && mode == null; boolean normalize = true; final int cellWidth = vertGridLines[col + 1] - vertGridLines[col]; final int cellHeight = horzGridLines[row + 1] - horzGridLines[row]; if (mode == null) { RadComponent component = getComponentAtGrid(container, row, col); if (component != null) { Rectangle rc = component.getBounds(); rc.translate(-xs [col], -ys [row]); int right = rc.x + rc.width + GridInsertLocation.INSERT_RECT_MIN_SIZE; int bottom = rc.y + rc.height + GridInsertLocation.INSERT_RECT_MIN_SIZE; if (dy < rc.y - GridInsertLocation.INSERT_RECT_MIN_SIZE) { mode = GridInsertMode.RowBefore; } else if (dy > bottom && dy < cellHeight) { mode = GridInsertMode.RowAfter; } if (dx < rc.x - GridInsertLocation.INSERT_RECT_MIN_SIZE) { mode = GridInsertMode.ColumnBefore; } else if (dx > right && dx < cellWidth) { mode = GridInsertMode.ColumnAfter; } normalize = false; } } if (mode != null) { GridInsertLocation dropLocation = new GridInsertLocation(container, row, col, mode); dropLocation.setSpanInsertMode(spanInsertMode); return normalize ? dropLocation.normalize() : dropLocation; } if (getComponentAtGrid(container, row, col) instanceof RadVSpacer || getComponentAtGrid(container, row, col) instanceof RadHSpacer) { return new GridReplaceDropLocation(container, row, col); } return new GridDropLocation(container, row, col); }