Files
stegsolve-legacy/stegsolve/DPanel.java

206 lines
5.6 KiB
Java

/*
* DPanel.java
*/
package stegsolve;
import javax.swing.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.*;
import java.awt.image.*;
import java.awt.*;
import java.io.File;
import java.util.TooManyListenersException;
/**
* A JPanel with an image attached to it
* @author Caesum
*/
public class DPanel extends JPanel
{
private Dimension preferredSize = new Dimension(200, 200);
private Dimension defaultSize = new Dimension();
private Dimension currentSize = new Dimension();
private DropTarget dropTarget;
private DropTargetHandler dropTargetHandler;
private Point dragPoint;
private boolean dragOver = false;
public DPanel() {
//setBackground(Color.RED);
}
/**
* The image attached to this panel
*/
private BufferedImage bi = null;
/**
* Overridden paint method for the panel which
* paints the image on the panel
* @param g graphics object
*/
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if(bi!=null)
g.drawImage(bi, 0, 0, currentSize.width, currentSize.height, this);
}
/**
* Sets the image for the panel, and calls
* repaint
* @param bix Image to show on the panel
*/
public void setImage(BufferedImage bix)
{
bi = bix;
defaultSize.width = bi.getWidth();
defaultSize.height = bi.getHeight();
setSize(bi.getWidth(), bi.getHeight());
repaint();
//apply(100);
}
@Override
public Dimension getPreferredSize() {
return preferredSize;
}
public void apply(int percent) {
currentSize.width = (int)(defaultSize.width * (((float)percent)/100));
currentSize.height = (int)(defaultSize.height * (((float)percent)/100));
preferredSize = currentSize;
revalidate();
repaint();
}
protected class DropTargetHandler implements DropTargetListener {
protected void processDrag(DropTargetDragEvent dtde) {
if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
dtde.acceptDrag(DnDConstants.ACTION_COPY);
} else {
dtde.rejectDrag();
}
}
@Override
public void dragEnter(DropTargetDragEvent dtde) {
processDrag(dtde);
SwingUtilities.invokeLater(new DragUpdate(true, dtde.getLocation()));
repaint();
}
@Override
public void dragOver(DropTargetDragEvent dtde) {
processDrag(dtde);
SwingUtilities.invokeLater(new DragUpdate(true, dtde.getLocation()));
repaint();
}
@Override
public void dropActionChanged(DropTargetDragEvent dtde) {
}
@Override
public void dragExit(DropTargetEvent dte) {
SwingUtilities.invokeLater(new DragUpdate(false, null));
repaint();
}
@Override
public void drop(DropTargetDropEvent dtde) {
SwingUtilities.invokeLater(new DragUpdate(false, null));
Transferable transferable = dtde.getTransferable();
if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
dtde.acceptDrop(dtde.getDropAction());
try {
java.util.List transferData = (java.util.List) transferable.getTransferData(DataFlavor.javaFileListFlavor);
if (transferData.size() == 1) {
StegSolve.that.loadImage((File)transferData.get(0));
dtde.dropComplete(true);
}
} catch (Exception ex) {
ex.printStackTrace();
}
} else {
dtde.rejectDrop();
}
}
}
protected DropTarget getMyDropTarget() {
if (dropTarget == null) {
dropTarget = new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, null);
}
return dropTarget;
}
protected DropTargetHandler getDropTargetHandler() {
if (dropTargetHandler == null) {
dropTargetHandler = new DropTargetHandler();
}
return dropTargetHandler;
}
@Override
public void addNotify() {
super.addNotify();
try {
getMyDropTarget().addDropTargetListener(getDropTargetHandler());
} catch (TooManyListenersException ex) {
ex.printStackTrace();
}
}
@Override
public void removeNotify() {
super.removeNotify();
getMyDropTarget().removeDropTargetListener(getDropTargetHandler());
}
/*
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (dragOver) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(new Color(0, 255, 0, 64));
g2d.fill(new Rectangle(getWidth(), getHeight()));
if (dragPoint != null && target != null) {
int x = dragPoint.x - 12;
int y = dragPoint.y - 12;
g2d.drawImage(target, x, y, this);
}
g2d.dispose();
}
}
*/
public class DragUpdate implements Runnable {
private boolean dragOver;
private Point dragPoint;
public DragUpdate(boolean dragOver, Point dragPoint) {
this.dragOver = dragOver;
this.dragPoint = dragPoint;
}
@Override
public void run() {
DPanel.this.dragOver = dragOver;
DPanel.this.dragPoint = dragPoint;
DPanel.this.repaint();
}
}
}