/* * Copyright (C) 2011 Thedeath<www.fseek.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package mpq.Tree; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.swing.JFileChooser; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPopupMenu; import javax.swing.filechooser.FileFilter; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; import mpq.MpqUtil; import mwt.wow.mpq.MpqFile; import wowimage.ConversionException; public class MpqTreePopupMenu extends JPopupMenu { private DefaultMutableTreeNode node; private MpqTree mpqTree; public MpqTreePopupMenu(MpqTree tree, DefaultMutableTreeNode node, boolean remove) { this.node = node; this.mpqTree = tree; if(remove) { showMpqArchiveFileMenu(); } else { showMpqFileMenu(); } } private void showMpqFileMenu() { this.add(createSaveAsItem()); } private void showMpqArchiveFileMenu() { this.add(createDeleteItem()); this.add(createSaveAsItem()); } private JMenuItem createDeleteItem() { JMenuItem item = new JMenuItem("Remove"); item.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { mpqTree.removeSelectedArchives(); } }); return item; } private JMenuItem createSaveAsItem() { JMenuItem item = new JMenuItem("Save as..."); item.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { saveAs(); } }); return item; } private void saveAs() { while(true) { String toString = node.getUserObject().toString(); boolean endsWith = toString.endsWith(".blp"); boolean isDir = true; if(node.isLeaf()) { isDir = false; } JFileChooser chooser = createSaveChooser(endsWith, isDir); int showSaveDialog = chooser.showSaveDialog(null); if (showSaveDialog == JFileChooser.APPROVE_OPTION) { File selectedFile = chooser.getSelectedFile(); String path = selectedFile.getAbsolutePath(); String extension = findExtension(chooser); if(extension.length() == 0 && isDir == false) { String[] split = toString.split("\\."); if(split.length > 1) { extension = "." + split[1]; } } if (!path.endsWith(extension)) { selectedFile = new File(path + extension); } // JOptionPane.CANCEL_OPTION = -1,JOptionPane.NO_OPTION = 0; JOptionPane.YES_OPTION = 1 int handleFileExists = 1; if(selectedFile.exists() && isDir == false) { handleFileExists = handleFileExists(); } if(handleFileExists == -1)return; if(handleFileExists == 1) { saveFile(selectedFile); break; } } else { break; } } } private void saveFile(File selectedFile) { String absolutePath = selectedFile.getAbsolutePath(); int lastIndexOf = absolutePath.lastIndexOf("."); if (lastIndexOf != -1) { try { TreePath path1 = MpqTreeUtil.getPath(node); MpqFile file = mpqTree.getMqpFileOfPath(path1); if(file == null) { MpqTreeUtil.exportNode(node, selectedFile, mpqTree); } else { if(file.getFilePath().endsWith("blp")) { String suffix = absolutePath.substring(lastIndexOf + 1, absolutePath.length()); if(suffix.toLowerCase().equals("blp")) { file.extractTo(selectedFile); } else { ImageIO.write(MpqUtil.convertMpqFileToImage(file), suffix, selectedFile); } } else { file.extractTo(selectedFile); } } } catch (ConversionException ex) { Logger.getLogger(MpqTreePopupMenu.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(MpqTreePopupMenu.class.getName()).log(Level.SEVERE, null, ex); } } } private String findExtension(JFileChooser chooser) { FileFilter filter = chooser.getFileFilter(); FileFilter[] choosableFileFilters = chooser.getChoosableFileFilters(); String extension = ""; if(choosableFileFilters.length >=2) { if(choosableFileFilters[0] == filter) { extension = ".blp"; } else if((choosableFileFilters[1] == filter)) { extension = ".png"; } } return extension; } private JFileChooser createSaveChooser(boolean isImage, boolean isDir) { final JFileChooser chooser = new JFileChooser(); if(isImage) { FileFilter blpFileFilter = new FileFilter() { @Override public boolean accept(File f) { if (f.getAbsolutePath().toLowerCase().endsWith(".blp") || f.isDirectory()) { return true; } return false; } @Override public String getDescription() { return "Warcraft Skin File (.blp)"; } }; FileFilter pngFileFilter = new FileFilter() { @Override public boolean accept(File f) { if (f.getAbsolutePath().toLowerCase().endsWith(".png") || f.isDirectory()) { return true; } return false; } @Override public String getDescription() { return "Portable Network Graphic (.png)"; } }; FileFilter[] newFilter = new FileFilter[] { blpFileFilter, pngFileFilter }; for (FileFilter f : newFilter) { chooser.addChoosableFileFilter(f); } } if(isDir == false) { chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); chooser.setAcceptAllFileFilterUsed(false); } else { chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); } return chooser; } private int handleFileExists() { int showOptionDialog = JOptionPane.showOptionDialog(this, "This file exists already !\nDo you want to overwrite it ?", "File Exists !",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,null,null,null); if(showOptionDialog == JOptionPane.CANCEL_OPTION) { return -1; } else if(showOptionDialog == JOptionPane.NO_OPTION) { return 0; } return 1; } }