// Path: src/gui/TransferableUtils.java
// public class TransferableUtils {
// 
// 	public static void copy(Image image) {
// 		
// 		ImageTransferable transferable = new ImageTransferable(image);
// 		Toolkit.getDefaultToolkit().getSystemClipboard().setContents(transferable, null);
// 	}
// 
// 	static class ImageTransferable implements Transferable {
// 		private Image image;
// 
// 		public ImageTransferable (Image image) {
// 			this.image = image;
// 		}
// 
// 		public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
// 			if (isDataFlavorSupported(flavor)) {
// 				return image;
// 			}
// 			else {
// 				throw new UnsupportedFlavorException(flavor);
// 			}
// 		}
// 
// 		public boolean isDataFlavorSupported (DataFlavor flavor){
// 			return flavor.equals(DataFlavor.imageFlavor);
// 		}
// 
// 		public DataFlavor[] getTransferDataFlavors () {
// 			return new DataFlavor[] { DataFlavor.imageFlavor};
// 		}
// 	}
// 	
// 	public static void copyObject(Serializable object) {
// 		ObjectTransferable transferable = new ObjectTransferable(object);
// 		Toolkit.getDefaultToolkit().getSystemClipboard().setContents(transferable, null);
// 		Toolkit.getDefaultToolkit().getSystemClipboard().setContents(transferable, null);
// 		
// 	}
// 	
// 	public static DataFlavor objectDataFlavor = new DataFlavor(Serializable.class, "Object");
// 	
// 	public static class ObjectTransferable implements Transferable {
// 		
// 		private Serializable object;
// 		
// 		public ObjectTransferable(Serializable object) {
// 			this.object = object;
// 		}
// 
// 		@Override
// 		public DataFlavor[] getTransferDataFlavors() {
// 			return new DataFlavor[] {objectDataFlavor};
// 		}
// 
// 		@Override
// 		public boolean isDataFlavorSupported(DataFlavor flavor) {
// 			return flavor.equals(objectDataFlavor);
// 		}
// 
// 		@Override
// 		public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
// 			return object;
// 		}
// 	}
// }


import java.awt.*;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.geom.GeneralPath;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import javax.swing.*;
import javax.swing.event.ChangeListener;
import gui.TransferableUtils;
				for(float f = 0; f <= 1; f+=.02f)
					keyframes.add(new Keyframe<Float>(f, Math.min(1f, Math.max(0f, function.evalF(f)))));
				keyframes.add(new Keyframe<Float>(1f, Math.min(1f, Math.max(0f, function.evalF(1f)))));
				
				for (int i = 1; i < keyframes.size()-1; i++) {
					if(keyframes.get(i-1).getValue().equals(keyframes.get(i).getValue()) && keyframes.get(i).getValue().equals(keyframes.get(i+1).getValue())) {
						keyframes.remove(i);
						i--;
					}	
				}
				repaint();
				fireChangeEvent();
				animationButton.repaint();
			}
			else {
				equationField.setBackground(new Color(255, 127, 127));
			}
		});
	}
	
	@SuppressWarnings("unchecked")
	private void createMenuBar() {
		JMenuItem copy = new JMenuItem("Copy");
		copy.addActionListener(ae -> TransferableUtils.copyObject(Keyframe.deepCopy(keyframes)));
		copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.META_MASK));
		
		JMenuItem paste = new JMenuItem("Paste");
		paste.addActionListener(ae -> {
			Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(this);
			try {
// Path: src/gui/TransferableUtils.java
// public class TransferableUtils {
// 
// 	public static void copy(Image image) {
// 		
// 		ImageTransferable transferable = new ImageTransferable(image);
// 		Toolkit.getDefaultToolkit().getSystemClipboard().setContents(transferable, null);
// 	}
// 
// 	static class ImageTransferable implements Transferable {
// 		private Image image;
// 
// 		public ImageTransferable (Image image) {
// 			this.image = image;
// 		}
// 
// 		public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
// 			if (isDataFlavorSupported(flavor)) {
// 				return image;
// 			}
// 			else {
// 				throw new UnsupportedFlavorException(flavor);
// 			}
// 		}
// 
// 		public boolean isDataFlavorSupported (DataFlavor flavor){
// 			return flavor.equals(DataFlavor.imageFlavor);
// 		}
// 
// 		public DataFlavor[] getTransferDataFlavors () {
// 			return new DataFlavor[] { DataFlavor.imageFlavor};
// 		}
// 	}
// 	
// 	public static void copyObject(Serializable object) {
// 		ObjectTransferable transferable = new ObjectTransferable(object);
// 		Toolkit.getDefaultToolkit().getSystemClipboard().setContents(transferable, null);
// 		Toolkit.getDefaultToolkit().getSystemClipboard().setContents(transferable, null);
// 		
// 	}
// 	
// 	public static DataFlavor objectDataFlavor = new DataFlavor(Serializable.class, "Object");
// 	
// 	public static class ObjectTransferable implements Transferable {
// 		
// 		private Serializable object;
// 		
// 		public ObjectTransferable(Serializable object) {
// 			this.object = object;
// 		}
// 
// 		@Override
// 		public DataFlavor[] getTransferDataFlavors() {
// 			return new DataFlavor[] {objectDataFlavor};
// 		}
// 
// 		@Override
// 		public boolean isDataFlavorSupported(DataFlavor flavor) {
// 			return flavor.equals(objectDataFlavor);
// 		}
// 
// 		@Override
// 		public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
// 			return object;
// 		}
// 	}
// }


// Path: src/interpolation/FloatInterpolator.java
import java.awt.*;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.geom.GeneralPath;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import javax.swing.*;
import javax.swing.event.ChangeListener;
import gui.TransferableUtils;

				for(float f = 0; f <= 1; f+=.02f)
					keyframes.add(new Keyframe<Float>(f, Math.min(1f, Math.max(0f, function.evalF(f)))));
				keyframes.add(new Keyframe<Float>(1f, Math.min(1f, Math.max(0f, function.evalF(1f)))));
				
				for (int i = 1; i < keyframes.size()-1; i++) {
					if(keyframes.get(i-1).getValue().equals(keyframes.get(i).getValue()) && keyframes.get(i).getValue().equals(keyframes.get(i+1).getValue())) {
						keyframes.remove(i);
						i--;
					}	
				}
				repaint();
				fireChangeEvent();
				animationButton.repaint();
			}
			else {
				equationField.setBackground(new Color(255, 127, 127));
			}
		});
	}
	
	@SuppressWarnings("unchecked")
	private void createMenuBar() {
		JMenuItem copy = new JMenuItem("Copy");
		copy.addActionListener(ae -> TransferableUtils.copyObject(Keyframe.deepCopy(keyframes)));
		copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.META_MASK));
		
		JMenuItem paste = new JMenuItem("Paste");
		paste.addActionListener(ae -> {
			Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(this);
			try {
				ArrayList<Keyframe<Serializable>> data = (ArrayList<Keyframe<Serializable>>) t.getTransferData(TransferableUtils.objectDataFlavor);