package org.geogebra.desktop.gui.view.algebra; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; import java.util.ArrayList; import javax.swing.JComponent; import javax.swing.TransferHandler; import javax.swing.text.JTextComponent; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.desktop.gui.GuiManagerD; import org.geogebra.desktop.main.AppD; import org.geogebra.desktop.util.AlgebraViewTransferHandler; /** * Transfer handler for InputBar * * @author gsturr * */ public class AlgebraInputTransferHandler extends TransferHandler implements Transferable { private static final long serialVersionUID = 1L; private AppD app; private JTextComponent ta; // supported data flavors private static final DataFlavor supportedFlavors[] = { DataFlavor.javaFileListFlavor, DataFlavor.stringFlavor, AlgebraViewTransferHandler.algebraViewFlavor }; private String text; /**************************************** * Constructor * * @param ev */ public AlgebraInputTransferHandler(AppD app, JTextComponent ta) { this.ta = ta; this.app = app; } /** * Ensures that transfers are done in COPY mode */ @Override public int getSourceActions(JComponent c) { return TransferHandler.COPY; } /** * Returns true if any element of the DataFlavor parameter array is a * supported flavor. */ @Override public boolean canImport(JComponent comp, DataFlavor flavor[]) { for (int i = 0, n = flavor.length; i < n; i++) { for (int j = 0, m = supportedFlavors.length; j < m; j++) { if (flavor[i].equals(supportedFlavors[j])) { return true; } } } return false; } /** * Handles data import. */ @Override public boolean importData(JComponent comp, Transferable t) { // handle text if (t.isDataFlavorSupported(DataFlavor.stringFlavor) || t.isDataFlavorSupported( AlgebraViewTransferHandler.algebraViewFlavor)) { try { // handle plain text flavor if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) { text = (String) t.getTransferData(DataFlavor.stringFlavor); } // handle algebraView flavor else if (t.isDataFlavorSupported( AlgebraViewTransferHandler.algebraViewFlavor)) { // get list of selected geo labels ArrayList<String> list = (ArrayList<String>) t .getTransferData( AlgebraViewTransferHandler.algebraViewFlavor); // exit if empty list if (list.size() == 0) { return false; } // if only one geo, get definition string if (list.size() == 1) { GeoElement geo = app.getKernel() .lookupLabel(list.get(0)); if (geo != null) { text = geo.getDefinitionForInputBar(); } } // if more than one geo, create list string else { text = list.toString(); text = text.replace("]", "}"); text = text.replace("[", "{"); } } ta.setText(text); return true; } catch (UnsupportedFlavorException ignored) { } catch (IOException ignored) { } } // handle potential ggb file drop ((GuiManagerD) app.getGuiManager()).handleGGBFileDrop(t); return false; } @Override public Transferable createTransferable(JComponent comp) { return null; } @Override public Object getTransferData(DataFlavor flavor) { return null; } @Override public DataFlavor[] getTransferDataFlavors() { return supportedFlavors; } @Override public boolean isDataFlavorSupported(DataFlavor flavor) { for (int i = 0; i < supportedFlavors.length; i++) { if (supportedFlavors[i].equals(flavor)) { return true; } } return false; } }