/******************************************************************************* * Copyright (c) 2012, 2016 Original authors and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Original authors and others - initial API and implementation ******************************************************************************/ package org.eclipse.nebula.widgets.nattable.ui.action; import org.eclipse.nebula.widgets.nattable.NatTable; import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry; import org.eclipse.nebula.widgets.nattable.layer.ILayer; import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell; import org.eclipse.nebula.widgets.nattable.painter.IOverlayPainter; import org.eclipse.nebula.widgets.nattable.painter.cell.ICellPainter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.Rectangle; public class CellDragMode implements IDragMode { private MouseEvent initialEvent; private MouseEvent currentEvent; private int xOffset; private int yOffset; private Image cellImage; protected CellImageOverlayPainter cellImageOverlayPainter = new CellImageOverlayPainter(); @Override public void mouseDown(NatTable natTable, MouseEvent event) { this.initialEvent = event; this.currentEvent = this.initialEvent; setCellImage(natTable); natTable.forceFocus(); natTable.addOverlayPainter(this.cellImageOverlayPainter); } @Override public void mouseMove(NatTable natTable, MouseEvent event) { this.currentEvent = event; natTable.redraw(0, 0, natTable.getWidth(), natTable.getHeight(), false); } @Override public void mouseUp(NatTable natTable, MouseEvent event) { natTable.removeOverlayPainter(this.cellImageOverlayPainter); if (this.cellImage != null) { this.cellImage.dispose(); } natTable.redraw(0, 0, natTable.getWidth(), natTable.getHeight(), false); } protected MouseEvent getInitialEvent() { return this.initialEvent; } protected MouseEvent getCurrentEvent() { return this.currentEvent; } private void setCellImage(NatTable natTable) { int columnPosition = natTable.getColumnPositionByX(this.currentEvent.x); int rowPosition = natTable.getRowPositionByY(this.currentEvent.y); ILayerCell cell = natTable.getCellByPosition(columnPosition, rowPosition); if (cell != null) { Rectangle cellBounds = cell.getBounds(); this.xOffset = this.currentEvent.x - cellBounds.x; this.yOffset = this.currentEvent.y - cellBounds.y; Image image = new Image(natTable.getDisplay(), cellBounds.width, cellBounds.height); GC gc = new GC(image); IConfigRegistry configRegistry = natTable.getConfigRegistry(); ICellPainter cellPainter = cell.getLayer().getCellPainter(columnPosition, rowPosition, cell, configRegistry); if (cellPainter != null) { cellPainter.paintCell(cell, gc, new Rectangle(0, 0, cellBounds.width, cellBounds.height), configRegistry); } gc.dispose(); ImageData imageData = image.getImageData(); image.dispose(); imageData.alpha = 150; this.cellImage = new Image(natTable.getDisplay(), imageData); } } private class CellImageOverlayPainter implements IOverlayPainter { @Override public void paintOverlay(GC gc, ILayer layer) { if (CellDragMode.this.cellImage != null & !CellDragMode.this.cellImage.isDisposed()) { gc.drawImage( CellDragMode.this.cellImage, CellDragMode.this.currentEvent.x - CellDragMode.this.xOffset, CellDragMode.this.currentEvent.y - CellDragMode.this.yOffset); } } } }