/*
* Copyright (c) 2009 Tom Parker <thpr@users.sourceforge.net>
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 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 Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
package pcgen.gui2.converter.panel;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SpringLayout;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.SystemUtils;
import pcgen.cdom.base.CDOMObject;
import pcgen.cdom.enumeration.ListKey;
import pcgen.cdom.enumeration.ObjectKey;
import pcgen.core.Campaign;
import pcgen.gui2.converter.event.ProgressEvent;
import pcgen.gui2.converter.event.TaskStrategyMessage;
import pcgen.system.PCGenSettings;
public class WriteDirectoryPanel extends ConvertSubPanel
{
private File path = null;
private SpringLayout layout = new SpringLayout();
private final JLabel fileLabel;
private final JLabel warningLabel;
private final FilenameFilter pccFileFilter = (parentDir, fileName) ->
{
if (StringUtils.endsWithIgnoreCase(fileName, ".pcc"))
{
return true;
}
return new File(parentDir, fileName).isDirectory();
};
private List<Campaign> campaignList;
public WriteDirectoryPanel()
{
fileLabel = new JLabel();
warningLabel = new JLabel();
}
@Override
public boolean performAnalysis(CDOMObject pc)
{
TaskStrategyMessage.sendStatus(this, "Finding Data Directories");
campaignList = pc.getListFor(ListKey.CAMPAIGN);
path = pc.get(ObjectKey.WRITE_DIRECTORY);
if (path != null)
{
fileLabel.setText(path.getAbsolutePath());
}
else
{
PCGenSettings context = PCGenSettings.getInstance();
String outputPathName =
context.initProperty(
PCGenSettings.CONVERT_OUTPUT_SAVE_PATH,
SystemUtils.USER_DIR);
path =
new File(outputPathName);
}
pc.put(ObjectKey.WRITE_DIRECTORY, path);
fireProgressEvent(ProgressEvent.ALLOWED);
return true;
}
@Override
public boolean autoAdvance(CDOMObject pc)
{
return false;
}
/* (non-Javadoc)
* @see pcgen.gui2.converter.panel.ConvertSubPanel#returnAllowed()
*/
@Override
public boolean returnAllowed()
{
return true;
}
@Override
public void setupDisplay(JPanel panel, final CDOMObject pc)
{
panel.setLayout(layout);
Component label = new JLabel(
"Please select the Directory where Converted files should be written: ");
AbstractButton button = new JButton("Browse...");
button.setMnemonic('r');
button.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent arg0)
{
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
chooser.setDialogType(JFileChooser.OPEN_DIALOG);
chooser.setCurrentDirectory(path.getParentFile());
chooser.setSelectedFile(path);
while (true)
{
int open = chooser.showOpenDialog(null);
if (open == JFileChooser.APPROVE_OPTION)
{
File fileToOpen = chooser.getSelectedFile();
if (fileToOpen.isDirectory() && fileToOpen.canRead()
&& fileToOpen.canWrite())
{
path = fileToOpen;
pc.put(ObjectKey.WRITE_DIRECTORY, path);
fileLabel.setText(path.getAbsolutePath());
PCGenSettings context = PCGenSettings.getInstance();
context.setProperty(
PCGenSettings.CONVERT_OUTPUT_SAVE_PATH,
path.getAbsolutePath());
showWarning();
break;
}
JOptionPane.showMessageDialog(null,
"Selection must be a valid "
+ "(readable & writeable) Directory");
chooser.setCurrentDirectory(path.getParentFile());
}
else if (open == JFileChooser.CANCEL_OPTION)
{
break;
}
}
}
});
panel.add(label);
panel.add(fileLabel);
panel.add(button);
panel.add(warningLabel);
showWarning();
layout.putConstraint(SpringLayout.NORTH, label, 50, SpringLayout.NORTH,
panel);
layout.putConstraint(SpringLayout.NORTH, fileLabel, 75 + label
.getPreferredSize().height, SpringLayout.NORTH, panel);
layout.putConstraint(SpringLayout.NORTH, button, 75 + label
.getPreferredSize().height, SpringLayout.NORTH, panel);
layout.putConstraint(SpringLayout.WEST, label, 25, SpringLayout.WEST,
panel);
layout.putConstraint(SpringLayout.WEST, fileLabel, 25,
SpringLayout.WEST, panel);
layout.putConstraint(SpringLayout.EAST, button, -50, SpringLayout.EAST,
panel);
layout.putConstraint(SpringLayout.NORTH, warningLabel, 20, SpringLayout.SOUTH,
fileLabel);
layout.putConstraint(SpringLayout.WEST, warningLabel, 25, SpringLayout.WEST,
panel);
fileLabel.setText(path.getAbsolutePath());
}
private void showWarning()
{
List<Campaign> existingCampaigns = getExistingPccs();
StringBuilder warning = new StringBuilder("<html>");
if (!existingCampaigns.isEmpty())
{
warning.append("<b>Warning</b>: Some converted campaigns already exist in this ");
warning.append("destination folder and will be skipped:\n<UL>");
final int maxCampaigns = 15;
int i = 1;
for (Campaign camp : existingCampaigns)
{
if ((i >= maxCampaigns) && (existingCampaigns.size() > maxCampaigns))
{
warning.append("<li>"
+ (existingCampaigns.size() - maxCampaigns + 1)
+ " more campaigns.</li>");
break;
}
warning.append("<li>");
warning.append(camp.getName());
warning.append("</li>");
i++;
}
warning.append("</ul>");
}
warning.append("</html>");
warningLabel.setText(warning.toString());
}
private List<Campaign> getExistingPccs()
{
List<File> existingFiles = new ArrayList<>();
findPCCFiles(path, existingFiles);
List<Campaign> matchingCampaigns = new ArrayList<>();
for (Campaign camp : campaignList)
{
File campFile = new File(camp.getSourceURI());
for (File file : existingFiles)
{
if (file.getName().equals(campFile.getName()))
{
matchingCampaigns.add(camp);
break;
}
}
}
return matchingCampaigns;
}
private void findPCCFiles(File aDirectory, List<File> existingFiles)
{
if (aDirectory.isDirectory())
{
for (File file : aDirectory.listFiles(pccFileFilter))
{
if (file.isDirectory())
{
findPCCFiles(file, existingFiles);
continue;
}
existingFiles.add(file);
}
}
}
}