package com.elsealabs.xshot.views;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import com.elsea.stone.property.PropertyPool;
import com.elsealabs.xshot.capture.Capture;
import com.elsealabs.xshot.capture.ClipboardCapture;
import com.elsealabs.xshot.file.SaveLocation;
import com.elsealabs.xshot.program.Program;
public class ViewSave extends JFrame {
private JPanel contentPane;
private JTextField field_fileName;
private Program program;
private PropertyPool pool;
private JComboBox combo_locations;
private JComboBox combo_fileType;
private JLabel label_fileAlert;
private List<String> positiveFileAlerts;
private boolean correctFileName;
private List<String> files;
private File defaultFilePath;
private File currentFile;
private String defaultExtension;
private String currentExtension;
private List<String> extensions;
private Capture capture;
private ClipboardCapture clipCapture;
private ViewPicture viewPicture;
public void init()
{
program = Program.getInstance();
pool = program.getPool();
positiveFileAlerts = new ArrayList<>();
positiveFileAlerts.add("Good to go.");
positiveFileAlerts.add("Ready to go.");
positiveFileAlerts.add("Okay to save!");
positiveFileAlerts.add("Ready to save!");
positiveFileAlerts.add("Awesome!");
positiveFileAlerts.add("Cool! Save it!");
positiveFileAlerts.add("Neato!");
positiveFileAlerts.add("Sweet!");
positiveFileAlerts.add("Coolio!");
positiveFileAlerts.add("Ready to savaroo!");
positiveFileAlerts.add("Wahoo!");
generateExtensions();
addListeners();
}
public void generateExtensions() {
extensions = Arrays.asList(ImageIO.getWriterFormatNames());
if (extensions.contains("png")) defaultExtension = "png";
else defaultExtension = extensions.get(0);
currentExtension = defaultExtension;
}
public void updateCurrentFile()
{
if (field_fileName.getText().length() > 0)
{
currentFile = new File(
defaultFilePath.getAbsolutePath() +
"\\" +
field_fileName.getText() +
"." + currentExtension
);
if (currentFile.exists())
{
correctFileName = false;
label_fileAlert.setForeground(Color.RED);
label_fileAlert.setText("File already exists. Name conflicts!");
}
else
{
correctFileName = true;
label_fileAlert.setForeground(Color.GRAY);
label_fileAlert.setText("File does not already exist. " + positiveFileAlerts.get(new Random().nextInt((positiveFileAlerts.size() - 1 ) + 1)));
}
}
else
{
correctFileName = true;
label_fileAlert.setForeground(Color.RED);
label_fileAlert.setText("File name not valid.");
}
}
public void doCopy()
{
clipCapture = new ClipboardCapture(capture);
clipCapture.moveToClipboard();
}
public void quit()
{
this.setVisible(false);
this.dispose();
System.exit(0);
}
public void flush()
{
if (correctFileName)
{
try {
ImageIO.write(capture.getUpdatedImage(), currentExtension, currentFile);
} catch (IOException e) {
e.printStackTrace();
}
}
else
{
label_fileAlert.setForeground(Color.RED);
label_fileAlert.setText("Unable to save file!");
}
}
public void updateLocations()
{
if (files == null) files = new ArrayList<>();
if (program.getSaveLocationPool().isUpdated())
{
for (SaveLocation sl : program.getSaveLocations())
{
System.out.println(sl.getPath());
files.add(sl.getPath());
}
}
combo_locations = new JComboBox(files.toArray());
}
/**
* Create the frame.
*/
public void build()
{
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
ex.printStackTrace();
}
setBounds(100, 100, 384, 455);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel label_title = new JLabel("Save Capture");
label_title.setFont(new Font("Segoe UI", Font.PLAIN, 28));
label_title.setBounds(28, 11, 215, 44);
contentPane.add(label_title);
JSeparator separator = new JSeparator();
separator.setBounds(28, 66, 314, 2);
contentPane.add(separator);
JLabel label_fileName = new JLabel("File Name:");
label_fileName.setBounds(28, 75, 91, 14);
contentPane.add(label_fileName);
field_fileName = new JTextField();
field_fileName.setFont(new Font("Segoe UI", Font.PLAIN, 18));
field_fileName.setBounds(28, 95, 229, 38);
contentPane.add(field_fileName);
field_fileName.setColumns(10);
// Listen for changes in the text field
field_fileName.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
updateCurrentFile();
}
@Override
public void insertUpdate(DocumentEvent e) {
updateCurrentFile();
}
@Override
public void changedUpdate(DocumentEvent e)
{
updateCurrentFile();
}
});
combo_fileType = new JComboBox(extensions.toArray());
combo_fileType.setSelectedItem(defaultExtension);
combo_fileType.setFont(new Font("Segoe UI", Font.PLAIN, 18));
combo_fileType.setBounds(267, 95, 75, 38);
contentPane.add(combo_fileType);
combo_fileType.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e)
{
if (e.getStateChange() == ItemEvent.SELECTED)
{
currentExtension = (String) e.getItem();
updateCurrentFile();
}
}
});
JButton button_copySave = new JButton("Copy & Save");
button_copySave.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
doCopy();
flush();
if (correctFileName) quit();
}
});
button_copySave.setFont(new Font("Segoe UI", Font.PLAIN, 16));
button_copySave.setBounds(193, 317, 149, 33);
contentPane.add(button_copySave);
label_fileAlert = new JLabel("File does not already exist. Good to go.");
label_fileAlert.setForeground(Color.GRAY);
label_fileAlert.setBounds(28, 144, 314, 14);
contentPane.add(label_fileAlert);
JButton button_cancel = new JButton("Cancel");
button_cancel.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
setVisible(false);
dispose();
}
});
button_cancel.setFont(new Font("Segoe UI", Font.PLAIN, 16));
button_cancel.setBounds(28, 361, 155, 33);
contentPane.add(button_cancel);
JButton button_copyQuit = new JButton("Copy & Quit");
button_copyQuit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
doCopy();
quit();
}
});
button_copyQuit.setFont(new Font("Segoe UI", Font.PLAIN, 16));
button_copyQuit.setBounds(28, 317, 155, 33);
contentPane.add(button_copyQuit);
JSeparator separator_1 = new JSeparator();
separator_1.setBounds(28, 203, 314, 2);
contentPane.add(separator_1);
JSeparator separator_2 = new JSeparator();
separator_2.setBounds(28, 304, 314, 2);
contentPane.add(separator_2);
JLabel label_defaultLocation = new JLabel("Default Save Location:");
label_defaultLocation.setBounds(28, 211, 137, 14);
contentPane.add(label_defaultLocation);
JButton button_randomName = new JButton("Generate Random Name");
button_randomName.setToolTipText("This will replace the file name in the text field with a random, non-conflicting, file name.");
button_randomName.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
}
});
button_randomName.setBounds(193, 169, 149, 23);
contentPane.add(button_randomName);
JButton button_addLocation = new JButton("Add New Location");
button_addLocation.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
program.getSaveLocationPool().addNewUI(new SaveLocation("", ""));
}
});
button_addLocation.setBounds(193, 270, 149, 23);
contentPane.add(button_addLocation);
JButton button_editLocations = new JButton("Edit Current Location");
button_editLocations.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
List<SaveLocation> locations = program.getSaveLocations();
for (SaveLocation loc : locations)
{
if (loc.getPath().equals(combo_locations.getItemAt(combo_locations.getSelectedIndex())))
{
program.getSaveLocationPool().addNewUI(loc);
}
}
}
});
button_editLocations.setBounds(28, 270, 155, 23);
contentPane.add(button_editLocations);
// Generate files
combo_locations = new JComboBox();
combo_locations.setBounds(28, 236, 314, 23);
contentPane.add(combo_locations);
updateLocations();
// Resolve Conflict Button and Action
JButton button_resolveConflict = new JButton("Resolve Conflict");
button_resolveConflict.setToolTipText("This will append numbers to the end of your file name to resolve the conflicting file.");
button_resolveConflict.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
int i = 0;
String filePath = currentFile.getAbsolutePath();
String fileName = field_fileName.getText();
while (Files.exists(Paths.get(filePath)))
{
i += 1;
fileName = field_fileName.getText() + i;
filePath = defaultFilePath.getAbsolutePath() + "\\" + fileName + "." + currentExtension;
System.out.println(filePath);
}
field_fileName.setText(fileName);
}
});
button_resolveConflict.setBounds(28, 169, 155, 23);
contentPane.add(button_resolveConflict);
JButton button_save = new JButton("Save");
button_save.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
flush();
if (correctFileName) quit();
}
});
button_save.setFont(new Font("Segoe UI", Font.PLAIN, 16));
button_save.setBounds(193, 361, 149, 33);
contentPane.add(button_save);
setLocationRelativeTo(null);
}
private void addListeners()
{
addWindowListener(viewPicture.getWindowListener());
}
public JComboBox getCombo_locations() {
return combo_locations;
}
public JComboBox getCombo_fileType() {
return combo_fileType;
}
public JLabel getLabel_fileAlert() {
return label_fileAlert;
}
public void supplyCapture(Capture capture) {
this.capture = capture;
}
public void supplyViewPicture(ViewPicture viewPicture)
{
this.viewPicture = viewPicture;
}
}