package org.geogebra.desktop.util;
import java.awt.Color;
import java.awt.Point;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragGestureRecognizer;
import java.awt.dnd.DragSource;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.StringTemplate;
import org.geogebra.common.kernel.geos.GeoCasCell;
import org.geogebra.common.main.App;
import org.geogebra.desktop.cas.view.CASTableD;
import org.geogebra.desktop.gui.util.GeoGebraIconD;
import org.geogebra.desktop.main.AppD;
public class CASDragGestureListener
implements DragGestureListener, DragSourceListener {
private Kernel kernel;
private App app;
private CASTableD table;
private DragSource ds;
private ArrayList<String> geoLabelList;
private DragGestureRecognizer dgr;
public CASDragGestureListener(Kernel kern, CASTableD table) {
super();
kernel = kern;
app = kernel.getApplication();
this.table = table;
ds = new DragSource();
}
/**
* enables Drag and Drop for this listener
*/
public void enableDnD() {
if (dgr == null) {
dgr = ds.createDefaultDragGestureRecognizer(table,
DnDConstants.ACTION_COPY_OR_MOVE, this);
}
}
@Override
public void dragGestureRecognized(DragGestureEvent dge) {
table.stopEditing();
if (geoLabelList == null) {
geoLabelList = new ArrayList<String>();
} else {
geoLabelList.clear();
}
int row = table.rowAtPoint(dge.getDragOrigin());
GeoCasCell cell = table.getGeoCasCell(row);
// needed for #3972
if (cell.isError()) {
return;
}
geoLabelList.add(cell.getLabel(StringTemplate.defaultTemplate));
int cellnumber = cell.getRowNumber();
// String tableRef = "$" + (cellnumber+1);
String latex;
latex = cell.getLaTeXAlgebraDescription(true,
StringTemplate.latexTemplate);
ImageIcon ic = GeoGebraIconD.createLatexIcon((AppD) app, latex,
((AppD) app).getPlainFont(), Color.DARK_GRAY, null);
TransferableCAS transferable = new TransferableCAS(geoLabelList,
cellnumber);
transferable.setIsAssignment(cell.isAssignmentVariableDefined());
// start drag
ds.startDrag(dge, DragSource.DefaultCopyDrop, ic.getImage(),
new Point(-5, -30), transferable, this);
}
/**
* Extension of Transferable for exporting CAS selections as a list of Geo
* labels can transfer: algebraViewFlavor: geoLabelList (ArrayList) only
* with the labels of the transfered variables casTableFlavor: tableRef
* (int) return the reference to the specific cell number casLaTeXFlavor:
* latexText (String) for not dynamic functionality, return the content of
* the cas cell as latex string
*/
static class TransferableCAS implements Transferable {
private final DataFlavor supportedFlavors[] = {
AlgebraViewTransferHandler.algebraViewFlavor,
CASTransferHandler.casTableFlavor, };
private ArrayList<String> geoLabels;
private int tableRef;
private boolean isAssignment;
/**
* @param geoLabelList
* list of labels
* @param tableRef
* table reference
*/
public TransferableCAS(ArrayList<String> geoLabelList, int tableRef) {
this.geoLabels = geoLabelList;
this.tableRef = tableRef;
isAssignment = false;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return supportedFlavors;
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
// algebraViewFlavor can only be used if the cas cell contains an
// assignment
if (flavor.equals(AlgebraViewTransferHandler.algebraViewFlavor)
&& isAssignment) {
return true;
}
if (flavor.equals(CASTransferHandler.casTableFlavor)) {
return true;
}
return false;
}
@Override
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException {
if (flavor.equals(AlgebraViewTransferHandler.algebraViewFlavor)) {
return geoLabels;
}
if (flavor.equals(CASTransferHandler.casTableFlavor)) {
return tableRef;
}
throw new UnsupportedFlavorException(flavor);
}
/**
* @param ass
* whether the cell contains assignment
*/
public void setIsAssignment(boolean ass) {
isAssignment = ass;
}
}
// =====================================================
// Drag and Drop
// =====================================================
@Override
public void dragDropEnd(DragSourceDropEvent e) {
// do nothing
}
@Override
public void dragEnter(DragSourceDragEvent e) {
// do nothing
}
@Override
public void dragExit(DragSourceEvent e) {
// do nothing
}
@Override
public void dragOver(DragSourceDragEvent e) {
// do nothing
}
@Override
public void dropActionChanged(DragSourceDragEvent e) {
// do nothing
}
}