package general;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.KeyboardFocusManager;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import utils.CardUtils;
import utils.Log;
import algorithms.DealingAlgorithm;
public class Main extends JFrame{
private static final long serialVersionUID = 3206847208968227199L;
private final Toolkit toolkit = getToolkit();
private JPanel textPanel;
private JPanel[] cardLimits;
private JTextField[][] rangeFields;
private JTextField[][][] cardLimitsFields;
private JTextField pathField;
private File outputFile;
private String filename;
private Config config = Config.getInstance();
private DealingAlgorithm algorithm;
private Card[] deck;
private int handsNumber;
private JTextField handsNumberField;
public Main() {
Log.write("Starting application");
this.loadConfig();
}
private void loadConfig()
{
deck = CardUtils.createAll();
this.handsNumber = config.getHands();
this.algorithm = config.getAlgorithm();
}
private void centerWindow()
{
Dimension size = toolkit.getScreenSize();
setLocation(size.width/2 - getWidth()/2,
size.height/2 - getHeight()/2);
}
public void run(){
filename = System.getProperty("user.home")+File.separatorChar + "hands.html";
this.outputFile = new File(filename);
setTitle("Bridge hand dealer");
setSize(350,710);
centerWindow();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
int align = FlowLayout.CENTER;
setLayout(new FlowLayout(align));
String[] names = new String[]{"North","East","South","West"};
rangeFields = new JTextField[4][2];
JLabel label = new JLabel("Players score limits");
this.add(label);
textPanel = new JPanel(new GridLayout(4,3,3,3));
textPanel.setBorder(BorderFactory.createEmptyBorder(10, 20, 10, 20));
for (int i=0;i<4;i++)
{
Range range = algorithm.getPointlimit(i);
rangeFields[i][0] = new JTextField(""+range.getMin(),2);
rangeFields[i][1] = new JTextField(""+range.getMax(),2);
textPanel.add(new JLabel(names[i]));
textPanel.add(rangeFields[i][0]);
textPanel.add(rangeFields[i][1]);
}
this.add(textPanel);
cardLimits = new JPanel[4];
cardLimitsFields = new JTextField[4][4][2];
for (int i=0; i< cardLimits.length;i++)
{
label = new JLabel(names[i] + " cards limits");
this.add(label);
cardLimits[i] = new JPanel(new GridLayout(4,3,3,3));
cardLimits[i].setBorder(BorderFactory.createEmptyBorder(10, 20, 10, 20));
for (Symbol sym: Symbol.values())
{
Range range = algorithm.getCardLimit(i, sym.getLocation());
cardLimitsFields[i][sym.getLocation()][0] = new JTextField(""+range.getMin(),3);
cardLimitsFields[i][sym.getLocation()][1] = new JTextField(""+range.getMax(),3);
cardLimits[i].add(new JLabel(""+sym.getUnicode()));
cardLimits[i].add(cardLimitsFields[i][sym.getLocation()][0]);
cardLimits[i].add(cardLimitsFields[i][sym.getLocation()][1]);
}
this.add(cardLimits[i]);
}
//textPanel.setAlignmentX(Component.CENTER_ALIGNMENT);
this.add(new JLabel(" Filename:"));
pathField = new JTextField(filename,20);
pathField.setEditable(false);
this.add(pathField);
this.add(new JLabel(" num of hands:"));
handsNumberField = new JTextField(""+this.handsNumber,20);
this.add(handsNumberField);
JButton fileButton = new JButton("File");
fileButton.addActionListener(new ActionListener() {
private JFileChooser file;
public void actionPerformed(ActionEvent event) {
file = new JFileChooser(filename);
int ans = file.showSaveDialog(textPanel);
if (ans == JFileChooser.APPROVE_OPTION){
outputFile = file.getSelectedFile();
pathField.setText(outputFile.getAbsolutePath());
}
}
});
this.add(fileButton);
JButton goButton = new JButton("Go");
goButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
final JButton b = (JButton)event.getSource();
b.setEnabled(false);
Thread worker = new Thread() {
public void run() {
executeRun();
// Report the result using invokeLater().
SwingUtilities.invokeLater(new Runnable() {
public void run() {
b.setEnabled(true);
}
});
}
};
worker.start(); // So we don't hold up the dispatch thread.
}
});
this.add(goButton);
JButton exitButton = new JButton("Exit");
exitButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
saveConfig();
System.exit(0);
}
});
this.add(exitButton);
KeyboardFocusManager.getCurrentKeyboardFocusManager()
.addPropertyChangeListener("permanentFocusOwner", new PropertyChangeListener()
{
public void propertyChange(final PropertyChangeEvent e)
{
if (e.getNewValue() instanceof JTextField)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
JTextField textField = (JTextField)e.getNewValue();
textField.selectAll();
}
});
}
}
});
}
private void executeRun()
{
setRanges();
try
{
this.handsNumber = Integer.parseInt(handsNumberField.getText());
}catch( Exception ex)
{
;
}
config.setHands(this.handsNumber);
this.algorithm.setNum(this.handsNumber);
saveConfig();
System.out.println("Running");
PrintStream out = System.out;
try {
System.setOut(new PrintStream(outputFile,"UTF-8"));
algorithm.deal(this.deck);
} catch (Exception e) {
e.printStackTrace();
}
finally{
System.out.close();
System.setOut(out);
}
System.out.println("Finished");
this.afterRun();
}
private void saveConfig()
{
algorithm.saveConfig();
config.save();
}
private void setRanges()
{
for (int i=0;i<4;i++)
{
algorithm.addPointLimit(i, Integer.parseInt(this.rangeFields[i][0].getText()), Integer.parseInt(this.rangeFields[i][1].getText()));
for (Symbol symb: Symbol.values())
{
algorithm.addCardLimit(i, symb.getLocation(), Integer.parseInt(this.cardLimitsFields[i][symb.getLocation()][0].getText()), Integer.parseInt(this.cardLimitsFields[i][symb.getLocation()][1].getText()));
}
}
}
private void afterRun()
{
String os = System.getProperty("os.name");
if (os.toLowerCase().contains("windows"))
{
System.out.println("here1");
try {
String[] cmd = new String[]{"cmd","/C",""+(char)34+outputFile.getAbsolutePath()+(char)34};
//String cmd = "cmd /C start " + (char)34+outputFile.getAbsolutePath()+(char)34;
Runtime.getRuntime().exec(cmd);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else
{
System.out.println("here2");
try {
Runtime.getRuntime().exec("gnome-open " + outputFile.getAbsolutePath());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Main main = new Main();
main.run();
main.setVisible(true);
Log.close();
}
}