/*
GeoGebra - Dynamic Mathematics for Everyone
http://www.geogebra.org
This file is part of GeoGebra.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation.
*/
/**
* AlgebraController.java
*
* Created on 05. September 2001, 09:11
*/
package org.geogebra.desktop.gui.view.algebra;
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.DragSource;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import org.geogebra.common.awt.GPoint;
import org.geogebra.common.euclidian.EuclidianConstants;
import org.geogebra.common.euclidian.EuclidianViewInterfaceCommon;
import org.geogebra.common.euclidian.event.AbstractEvent;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.desktop.gui.util.GeoGebraIconD;
import org.geogebra.desktop.main.AppD;
public class AlgebraControllerD extends AlgebraTreeController
implements DragGestureListener, DragSourceListener {
private DragSource ds;
/**
* Creates new Algebra controller
*
* @param kernel
* kernel
*/
public AlgebraControllerD(Kernel kernel) {
super(kernel);
}
@Override
protected boolean checkDoubleClick(GeoElement geo, MouseEvent e) {
// check double click
int clicks = e.getClickCount();
// EuclidianView ev = app.getEuclidianView();
EuclidianViewInterfaceCommon ev = app.getActiveEuclidianView();
if (clicks == 2) {
selection.clearSelectedGeos(true, false);
app.updateSelection(false);
ev.resetMode();
if (geo != null && !AppD.isControlDown(e)) {
getView().startEditItem(geo);
}
return true;
}
return false;
}
@Override
protected boolean viewIsEditing() {
return getView().isEditItem();
}
@Override
public void mousePressed(MouseEvent e) {
getView().cancelEditItem();
boolean rightClick = app.isRightClickEnabled() && AppD.isRightClick(e);
if (rightClick) {// RIGHT CLICK
GPoint mouseCoords = new GPoint(e.getPoint().x, e.getPoint().y);
rightPress(e, mouseCoords);
} else {// LEFT CLICK
leftPress(e);
}
setMousePressed();
}
@Override
public void setTree(AlgebraTree tree) {
super.setTree(tree);
if (tree instanceof AlgebraViewD) {
this.setView((AlgebraViewD) tree);
}
}
protected void enableDnD() {
ds = new DragSource();
ds.createDefaultDragGestureRecognizer((AlgebraViewD) getView(),
DnDConstants.ACTION_COPY_OR_MOVE, this);
}
// =====================================================
// Drag and Drop
// =====================================================
@Override
public void dragDropEnd(DragSourceDropEvent e) {
// only handle dragGestureRecognized
}
@Override
public void dragEnter(DragSourceDragEvent e) {
// only handle dragGestureRecognized
}
@Override
public void dragExit(DragSourceEvent e) {
// only handle dragGestureRecognized
}
@Override
public void dragOver(DragSourceDragEvent e) {
// only handle dragGestureRecognized
}
@Override
public void dropActionChanged(DragSourceDragEvent e) {
// only handle dragGestureRecognized
}
private ArrayList<String> geoLabelList;
@Override
public void dragGestureRecognized(DragGestureEvent dge) {
if (geoLabelList == null) {
geoLabelList = new ArrayList<String>();
} else {
geoLabelList.clear();
}
String latex = getDragText(geoLabelList);
if (latex == null) {
return;
}
ImageIcon ic = GeoGebraIconD.createLatexIcon((AppD) app, latex,
((AppD) app).getPlainFont(), Color.DARK_GRAY, null);
// start drag
ds.startDrag(dge, DragSource.DefaultCopyDrop, ic.getImage(),
new Point(-5, -30), new TransferableAlgebraView(geoLabelList),
this);
}
/**
* Extension of Transferable for exporting AlgegraView selections as a list
* of Geo labels
*/
static class TransferableAlgebraView implements Transferable {
public final DataFlavor algebraViewFlavor = new DataFlavor(
AlgebraViewD.class, "geoLabel list");
private final DataFlavor supportedFlavors[] = { algebraViewFlavor };
private ArrayList<String> geoLabelList;
public TransferableAlgebraView(ArrayList<String> geoLabelList) {
this.geoLabelList = geoLabelList;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return supportedFlavors;
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
if (flavor.equals(algebraViewFlavor)) {
return true;
}
return false;
}
@Override
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException {
if (flavor.equals(algebraViewFlavor)) {
return geoLabelList;
}
throw new UnsupportedFlavorException(flavor);
}
}
@Override
protected void euclidianViewClick(EuclidianViewInterfaceCommon ev,
GeoElement geo, MouseEvent e) {
// let euclidianView know about the click
AbstractEvent event = org.geogebra.desktop.euclidian.event.MouseEventD
.wrapEvent(e);
ev.clickedGeo(geo, app.isControlDown(event));
event.release();
// if click created a geo, notify app to select it
ev.getEuclidianController().setJustCreatedGeosSelected();
}
@Override
protected void highlight(EuclidianViewInterfaceCommon ev, GeoElement geo) {
if (ev.getMode() == EuclidianConstants.MODE_MOVE) {
super.highlight(ev, geo);
} else {
ev.mouseMovedOver(geo);
}
}
@Override
protected void highlight(EuclidianViewInterfaceCommon ev,
ArrayList<GeoElement> geos) {
if (ev.getMode() == EuclidianConstants.MODE_MOVE) {
super.highlight(ev, geos);
} else {
ev.mouseMovedOverList(geos);
}
}
@Override
protected boolean leftPressCanSelectGeo(MouseEvent e, GeoElement geo) {
int mode = app.getActiveEuclidianView().getMode();
if ((mode == EuclidianConstants.MODE_MOVE
|| mode == EuclidianConstants.MODE_SELECTION_LISTENER
|| geo == null) && !AppD.isControlDown(e) && !e.isShiftDown()) {
if (!setSelectedGeo(geo)) {
return true;
}
}
return false;
}
@Override
protected boolean isSelectionModeForClick(int mode) {
return mode == EuclidianConstants.MODE_MOVE;
}
}