Source:
<code>protected void handleRowMove(final NodeMouseMoveEvent event) { final GridWidget activeGridWidget = state.getActiveGridWidget(); final List<GridRow> activeGridRows = state.getActiveGridRows(); final GridData activeGridModel = activeGridWidget.getModel(); final List<GridColumn<?>> allGridColumns = activeGridModel.getColumns(); final BaseGridRendererHelper rendererHelper = activeGridWidget.getRendererHelper(); <START> final BaseGridRendererHelper.RenderingInformation renderingInformation = rendererHelper.getRenderingInformation(); <END> final GridRenderer renderer = activeGridWidget.getRenderer(); final List<Double> allRowHeights = renderingInformation.getAllRowHeights(); final double headerHeight = renderer.getHeaderHeight(); final GridRow leadRow = activeGridRows.get(0); final int leadRowIndex = activeGridModel.getRows().indexOf(leadRow); final Point2D ap = CoordinateUtilities.convertDOMToGridCoordinate(activeGridWidget, new Point2D(event.getX(), event.getY())); final double cy = ap.getY(); if (cy < headerHeight || cy > activeGridWidget.getHeight()) { return; } double rowHeight; int uiRowIndex = 0; double offsetY = cy - headerHeight; while ((rowHeight = allRowHeights.get(uiRowIndex)) < offsetY) { offsetY = offsetY - rowHeight; uiRowIndex++; } if (uiRowIndex < 0 || uiRowIndex > activeGridModel.getRowCount() - 1) { return; } if (uiRowIndex == leadRowIndex) { return; } else if (uiRowIndex < activeGridModel.getRows().indexOf(leadRow)) { if (offsetY > allRowHeights.get(uiRowIndex) / 2) { return; } } else if (uiRowIndex > activeGridModel.getRows().indexOf(leadRow)) { if (offsetY < allRowHeights.get(uiRowIndex) / 2) { return; } } destroyColumns(allGridColumns); activeGridModel.moveRowsTo(uiRowIndex, activeGridRows); final double rowOffsetY = rendererHelper.getRowOffset(leadRow) + headerHeight; state.getEventColumnHighlight().setY(activeGridWidget.getComputedLocation().getY() + rowOffsetY); layer.batch(); }</code><technical_language>Mmmm ok rendererHelper.getRenderingInformation() is reliable. a bit confused</technical_language>

Target:
protected void handleRowMove(final NodeMouseMoveEvent event) { final GridWidget activeGridWidget = state.getActiveGridWidget(); final List<GridRow> activeGridRows = state.getActiveGridRows(); final GridData activeGridModel = activeGridWidget.getModel(); final List<GridColumn<?>> allGridColumns = activeGridModel.getColumns(); final BaseGridRendererHelper rendererHelper = activeGridWidget.getRendererHelper(); final GridRenderer renderer = activeGridWidget.getRenderer(); final double headerHeight = renderer.getHeaderHeight(); final GridRow leadRow = activeGridRows.get(0); final int leadRowIndex = activeGridModel.getRows().indexOf(leadRow); final Point2D ap = CoordinateUtilities.convertDOMToGridCoordinate(activeGridWidget, new Point2D(event.getX(), event.getY())); final double cy = ap.getY(); if (cy < headerHeight || cy > activeGridWidget.getHeight()) { return; } GridRow row; int uiRowIndex = 0; double offsetY = cy - headerHeight; while ((row = activeGridModel.getRow(uiRowIndex)).getHeight() < offsetY) { offsetY = offsetY - row.getHeight(); uiRowIndex++; } if (uiRowIndex < 0 || uiRowIndex > activeGridModel.getRowCount() - 1) { return; } if (uiRowIndex == leadRowIndex) { return; } else if (uiRowIndex < activeGridModel.getRows().indexOf(leadRow)) { if (offsetY > activeGridModel.getRow(uiRowIndex).getHeight() / 2) { return; } } else if (uiRowIndex > activeGridModel.getRows().indexOf(leadRow)) { if (offsetY < activeGridModel.getRow(uiRowIndex).getHeight() / 2) { return; } } destroyColumns(allGridColumns); activeGridModel.moveRowsTo(uiRowIndex, activeGridRows); final double rowOffsetY = rendererHelper.getRowOffset(leadRow) + headerHeight; state.getEventColumnHighlight().setY(activeGridWidget.getComputedLocation().getY() + rowOffsetY); layer.batch(); }