/*
* Copyright (c) 2014 tabletoptool.com team.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* rptools.com team - initial implementation
* tabletoptool.com team - further development
*/
package com.t3.client.ui.token;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.TexturePaint;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import org.apache.log4j.Logger;
import com.t3.MD5Key;
import com.t3.client.AppStyle;
import com.t3.client.TabletopTool;
import com.t3.client.TransferableHelper;
import com.t3.client.swing.ImageChooserDialog;
import com.t3.model.Asset;
import com.t3.swing.SwingUtil;
import com.t3.util.ImageManager;
public class ImageAssetPanel extends JPanel implements DropTargetListener {
private static final Logger log = Logger.getLogger(ImageAssetPanel.class);
private MD5Key imageId;
private JButton cancelButton;
private JButton addButton;
private ImageObserver[] observers;
private boolean allowEmpty = true;
public ImageAssetPanel() {
new DropTarget(this, this);
init();
}
private void init() {
setLayout(new BorderLayout());
add(BorderLayout.NORTH, createNorthPanel());
setImageId(null);
}
private JPanel createNorthPanel() {
JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 0));
panel.setOpaque(false);
panel.add(getAddButton());
panel.add(getCancelButton());
return panel;
}
public JButton getCancelButton() {
if (cancelButton == null) {
cancelButton = new JButton(new ImageIcon(AppStyle.cancelButton));
cancelButton.setContentAreaFilled(false);
cancelButton.setBorderPainted(false);
cancelButton.setFocusable(false);
cancelButton.setMargin(new Insets(0, 0, 0, 0));
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setImageId(null);
}
});
}
return cancelButton;
}
public JButton getAddButton() {
if (addButton == null) {
addButton = new JButton(new ImageIcon(AppStyle.addButton));
addButton.setContentAreaFilled(false);
addButton.setBorderPainted(false);
addButton.setFocusable(false);
addButton.setMargin(new Insets(0, 0, 0, 0));
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ImageChooserDialog chooserDialog = TabletopTool.getFrame().getImageChooserDialog();
chooserDialog.setVisible(true);
MD5Key imageId = chooserDialog.getImageId();
if (imageId == null) {
return;
}
setImageId(imageId);
}
});
}
return addButton;
}
public MD5Key getImageId() {
return imageId;
}
public void setAllowEmptyImage(boolean allow) {
allowEmpty = allow;
}
public void setImageId(MD5Key sheetAssetId, ImageObserver... observers) {
this.imageId = sheetAssetId;
this.observers = observers != null && observers.length > 0 ? observers : new ImageObserver[] { this };
getCancelButton().setVisible(allowEmpty && sheetAssetId != null);
revalidate();
repaint();
}
@Override
protected void paintComponent(Graphics g) {
Dimension size = getSize();
((Graphics2D) g).setPaint(new TexturePaint(AppStyle.panelTexture, new Rectangle(0, 0, AppStyle.panelTexture.getWidth(), AppStyle.panelTexture.getHeight())));
g.fillRect(0, 0, size.width, size.height);
if (imageId == null) {
return;
}
BufferedImage image = ImageManager.getImage(imageId, observers);
Dimension imgSize = new Dimension(image.getWidth(), image.getHeight());
SwingUtil.constrainTo(imgSize, size.width - 8, size.height - 8);
g.drawImage(image, (size.width - imgSize.width) / 2, (size.height - imgSize.height) / 2, imgSize.width, imgSize.height, this);
}
////
// DROP TARGET LISTENER
@Override
public void dragEnter(DropTargetDragEvent dtde) {
}
@Override
public void dragExit(DropTargetEvent dte) {
}
@Override
public void dragOver(DropTargetDragEvent dtde) {
}
@Override
public void drop(DropTargetDropEvent dtde) {
Transferable t = dtde.getTransferable();
if (!(TransferableHelper.isSupportedAssetFlavor(t) || TransferableHelper.isSupportedTokenFlavor(t)) || (dtde.getDropAction() & DnDConstants.ACTION_COPY_OR_MOVE) == 0) {
dtde.rejectDrop(); // Not a supported flavor or not a copy/move
log.warn("Couldn't figure out the drop type");
return;
}
dtde.acceptDrop(dtde.getDropAction());
List<Object> assets = TransferableHelper.getAsset(dtde.getTransferable());
if (assets == null || assets.isEmpty() || !(assets.get(0) instanceof Asset)) {
return;
}
setImageId(((Asset) assets.get(0)).getId());
}
@Override
public void dropActionChanged(DropTargetDragEvent dtde) {
}
}