/* * 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) { } }