// Near Infinity - An Infinity Engine Browser and Editor
// Copyright (C) 2001 - 2005 Jon Olav Hauglid
// See LICENSE.txt for license information
package org.infinity.resource.graphics;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import org.infinity.gui.ButtonPanel;
import org.infinity.gui.ButtonPopupMenu;
import org.infinity.gui.RenderCanvas;
import org.infinity.gui.WindowBlocker;
import org.infinity.resource.Closeable;
import org.infinity.resource.Profile;
import org.infinity.resource.Resource;
import org.infinity.resource.ResourceFactory;
import org.infinity.resource.ViewableContainer;
import org.infinity.resource.key.ResourceEntry;
import org.infinity.search.ReferenceSearcher;
import org.infinity.util.io.StreamUtils;
public class PvrzResource implements Resource, ActionListener, Closeable
{
private final ResourceEntry entry;
private final ButtonPanel buttonPanel = new ButtonPanel();
private JMenuItem miExport, miPNG;
private RenderCanvas rcImage;
private JPanel panel;
public PvrzResource(ResourceEntry entry) throws Exception
{
this.entry = entry;
}
//--------------------- Begin Interface ActionListener ---------------------
@Override
public void actionPerformed(ActionEvent event)
{
if (buttonPanel.getControlByType(ButtonPanel.Control.FIND_REFERENCES) == event.getSource()) {
new ReferenceSearcher(entry, new String[]{"BAM", "MOS", "TIS"}, panel.getTopLevelAncestor());
}
else if (event.getSource() == miExport) {
// export as original PVRZ
ResourceFactory.exportResource(entry, panel.getTopLevelAncestor());
} else if (event.getSource() == miPNG) {
try {
ByteArrayOutputStream os = new ByteArrayOutputStream();
String fileName = entry.toString().replace(".PVRZ", ".PNG");
BufferedImage image = getImage();
if (ImageIO.write(image, "png", os)) {
ResourceFactory.exportResource(entry, StreamUtils.getByteBuffer(os.toByteArray()),
fileName, panel.getTopLevelAncestor());
} else {
JOptionPane.showMessageDialog(panel.getTopLevelAncestor(),
"Error while exporting " + entry, "Error",
JOptionPane.ERROR_MESSAGE);
}
os.close();
os = null;
image = null;
} catch (Exception e) {
e.printStackTrace();
}
}
}
//--------------------- End Interface ActionListener ---------------------
//--------------------- Begin Interface Resource ---------------------
@Override
public ResourceEntry getResourceEntry()
{
return entry;
}
//--------------------- End Interface Resource ---------------------
//--------------------- Begin Interface Closeable ---------------------
@Override
public void close() throws Exception
{
panel.removeAll();
rcImage.setImage(null);
rcImage = null;
}
//--------------------- End Interface Closeable ---------------------
//--------------------- Begin Interface Viewable ---------------------
@Override
public JComponent makeViewer(ViewableContainer container)
{
JButton btn = ((JButton)buttonPanel.addControl(ButtonPanel.Control.FIND_REFERENCES));
btn.addActionListener(this);
btn.setEnabled(Profile.isEnhancedEdition());
miExport = new JMenuItem("original");
miExport.addActionListener(this);
miPNG = new JMenuItem("as PNG");
miPNG.addActionListener(this);
ButtonPopupMenu bpmExport = (ButtonPopupMenu)buttonPanel.addControl(ButtonPanel.Control.EXPORT_MENU);
bpmExport.setMenuItems(new JMenuItem[]{miExport, miPNG});
rcImage = new RenderCanvas();
rcImage.setHorizontalAlignment(SwingConstants.CENTER);
rcImage.setVerticalAlignment(SwingConstants.CENTER);
WindowBlocker.blockWindow(true);
try {
rcImage.setImage(loadImage());
WindowBlocker.blockWindow(false);
} catch (Exception e) {
WindowBlocker.blockWindow(false);
}
JScrollPane scroll = new JScrollPane(rcImage);
scroll.getVerticalScrollBar().setUnitIncrement(16);
scroll.getHorizontalScrollBar().setUnitIncrement(16);
panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(scroll, BorderLayout.CENTER);
panel.add(buttonPanel, BorderLayout.SOUTH);
scroll.setBorder(BorderFactory.createLoweredBevelBorder());
return panel;
}
//--------------------- End Interface Viewable ---------------------
public BufferedImage getImage()
{
if (rcImage != null) {
return ColorConvert.toBufferedImage(rcImage.getImage(), false);
} else if (entry != null) {
return loadImage();
}
return null;
}
private BufferedImage loadImage()
{
BufferedImage image = null;
PvrDecoder decoder = null;
if (entry != null) {
try {
decoder = PvrDecoder.loadPvr(entry);
image = new BufferedImage(decoder.getWidth(), decoder.getHeight(), BufferedImage.TYPE_INT_ARGB);
if (!decoder.decode(image)) {
image = null;
}
decoder = null;
} catch (Exception e) {
image = null;
if (decoder != null) {
decoder = null;
}
e.printStackTrace();
}
}
return image;
}
}