final RootBandRenderer rendererRoot = getRendererRoot();
final ReportRenderContext renderContext = getRenderContext();
if (clearSelectionOnDrag)
{
final ReportSelectionModel selectionModel = renderContext.getSelectionModel();
selectionModel.clearSelection();
clearSelectionOnDrag = false;
}
selectionRectangleTarget = e.getPoint();
final DesignerPageDrawable pageDrawable = rendererRoot.getLogicalPageDrawable();
final double y1 = Math.min(normalizedSelectionRectangleOrigin.getY(), normalizedSelectionRectangleTarget.getY());
final double x1 = Math.min(normalizedSelectionRectangleOrigin.getX(), normalizedSelectionRectangleTarget.getX());
final double y2 = Math.max(normalizedSelectionRectangleOrigin.getY(), normalizedSelectionRectangleTarget.getY());
final double x2 = Math.max(normalizedSelectionRectangleOrigin.getX(), normalizedSelectionRectangleTarget.getX());
final RenderNode[] allNodes = pageDrawable.getNodesAt(x1, y1, x2 - x1, y2 - y1, null, null);
final ReportSelectionModel selectionModel = renderContext.getSelectionModel();
final HashMap<InstanceID, Element> id = rendererRoot.getElementsById();
final StrictBounds rect1 = StrictGeomUtility.createBounds(x1, y1, x2 - x1, y2 - y1);
final StrictBounds rect2 = new StrictBounds();
for (int i = allNodes.length - 1; i >= 0; i -= 1)
{
final RenderNode node = allNodes[i];
final InstanceID instanceId = node.getInstanceId();
final Element element = id.get(instanceId);
if (element == null || element instanceof RootLevelBand)
{
continue;
}
final CachedLayoutData data = ModelUtility.getCachedLayoutData(element);
rect2.setRect(data.getX(), data.getY(), data.getWidth(), data.getHeight());
if (StrictBounds.intersects(rect1, rect2))
{
if (selectionModel.add(element))
{
newlySelectedElements.add(element);
}
}
}
// second step, check which previously added elements are no longer selected by the rectangle.
for (Iterator<Element> visualReportElementIterator = newlySelectedElements.iterator(); visualReportElementIterator.hasNext();)
{
final Element element = visualReportElementIterator.next();
final CachedLayoutData data = ModelUtility.getCachedLayoutData(element);
rect2.setRect(data.getX(), data.getY(), data.getWidth(), data.getHeight());
if (StrictBounds.intersects(rect1, rect2) == false)
{
selectionModel.remove(element);
visualReportElementIterator.remove();
}
}
RootBandRenderComponent.this.repaint();