package gui;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.List;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import nodes.MileStone;
import person.Person;
import threading.IntegratorThread;
import threading.SearchThread;
public class AdvancedSearchFrame extends JFrame implements ActionListener
{
private Vector<SearchThread> jobList = new Vector<SearchThread>();
public AdvancedSearchFrame(MainFrame caller)
{
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setPreferredSize(new Dimension(600, 350));
this.caller = caller;
this.setLocationRelativeTo(caller);
initializeComponents();
}
@SuppressWarnings({ "unchecked", "rawtypes" })
private void initializeComponents()
{
mainPanel = new JPanel();
this.setContentPane(mainPanel);
mainPanel.setLayout(new BorderLayout(0, 0));
upperPanel = new JPanel();
mainPanel.add(upperPanel, BorderLayout.NORTH);
upperPanel.setLayout(new BorderLayout(0, 0));
queryPanel = new JPanel();
upperPanel.add(queryPanel, BorderLayout.NORTH);
personLabel = new JLabel("Person: ");
personComboBox = new JComboBox();
fromYearLabel = new JLabel("from:");
fromYearTextBox = new JTextField();
fromYearTextBox.setText("");
toYearLabel = new JLabel("to: ");
toYearTextBox = new JTextField();
toYearTextBox.setText("");
queryPanel.add(personLabel);
this.personComboBox.setModel(caller.vipComboBox.getModel());
queryPanel.add(personComboBox);
queryPanel.add(fromYearLabel);
queryPanel.add(fromYearTextBox);
fromYearTextBox.setColumns(10);
queryPanel.add(toYearLabel);
queryPanel.add(toYearTextBox);
toYearTextBox.setColumns(10);
queryButtonsPanel = new JPanel();
addQueryButton = new JButton("Add");
addQueryButton.addActionListener(this);
clearQueryButton = new JButton("Clear");
clearQueryButton.addActionListener(this);
centerPanel = new JPanel();
queriesList = new List();
upperPanel.add(queryButtonsPanel);
operatorLabel = new JLabel("Operator");
queryButtonsPanel.add(operatorLabel);
operatorComboBox = new JComboBox();
queryButtonsPanel.add(operatorComboBox);
operatorComboBox.setModel(new DefaultComboBoxModel(new String[] {"And", "Or"}));
queryButtonsPanel.add(addQueryButton);
queryButtonsPanel.add(clearQueryButton);
mainPanel.add(centerPanel, BorderLayout.CENTER);
centerPanel.setLayout(new BorderLayout(0, 0));
centerPanel.add(queriesList);
bottomPanel = new JPanel();
mainPanel.add(bottomPanel, BorderLayout.SOUTH);
searchButton = new JButton("Search");
cancelButton = new JButton("Cancel");
searchButton.addActionListener(this);
cancelButton.addActionListener(this);
bottomPanel.add(searchButton);
bottomPanel.add(cancelButton);
pack();
}
@Override
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == addQueryButton)
{
queriesList.add(personComboBox.getSelectedItem().toString() +
" " + "from: " + Integer.parseInt(fromYearTextBox.getText()) +
" " + "to: " + Integer.parseInt(toYearTextBox.getText()) + ".");
jobList.add(new SearchThread( (Person)(personComboBox.getSelectedItem()),
Integer.parseInt(fromYearTextBox.getText()),
Integer.parseInt(toYearTextBox.getText()))
);
}
else if (e.getSource() == clearQueryButton)
{
personComboBox.setSelectedIndex(-1);
fromYearTextBox.setText("");
toYearTextBox.setText("");
operatorComboBox.setSelectedIndex(-1);
}
else if (e.getSource() == searchButton)
{
ExecutorService pool = Executors.newFixedThreadPool(8);
IntegratorThread integrator = new IntegratorThread(jobList.size());
pool.execute(integrator);
for (SearchThread s : jobList)
{
s.addListener(integrator);
pool.execute(s);
}
try
{
pool.awaitTermination(100, TimeUnit.MILLISECONDS);
}
catch (InterruptedException e1)
{
e1.printStackTrace();
}
Vector<Person> result = integrator.getResult();
caller.summaryArea.setText("");
if (operatorComboBox.getSelectedItem().toString().equals("Or"))
{
for (Person p : result)
{
caller.summaryArea.setText(caller.summaryArea.getText() + p.lifeHistoryToString());
}
}
else
{
Vector<Tuple<String,Vector<MileStone>>> milestones = new Vector<Tuple<String,Vector<MileStone>>>();
for (int i = 0 ; i < result.size(); i++)
{
milestones.add(new Tuple<String, Vector<MileStone>>(result.get(i).getName(),result.get(i).returnMileStoneList()));
}
for (Tuple<String,Vector<MileStone>> t : milestones)
{
for (Tuple<String,Vector<MileStone>> k : milestones)
{
if (t == k) continue;
for (int i = 0; i < t.second.size(); i++)
{
boolean found = false;
for (int j = 0; j < k.second.size(); j++)
{
if( t.second.elementAt(i).equals(k.second.elementAt(j)) )
{
found = true;
break;
}
}
if (!found)
{
t.second.remove(i--);
}
}
}
}
caller.summaryArea.setText("");
for(Tuple<String, Vector<MileStone>> t : milestones)
{
caller.summaryArea.setText(caller.summaryArea.getText() + t.first + "\n");
for (MileStone m : t.second)
{
caller.summaryArea.setText(caller.summaryArea.getText() + m.toString());
}
}
}
caller.setEnabled(true);
caller.setVisible(true);
this.dispose();
}
else if (e.getSource() == cancelButton)
{
caller.setEnabled(true);
caller.setVisible(true);
this.dispose();
}
}
private MainFrame caller;
private JTextField fromYearTextBox;
private JTextField toYearTextBox;
private JPanel mainPanel;
private JPanel upperPanel;
private JPanel queryPanel;
private JLabel personLabel;
private JComboBox personComboBox;
private JLabel fromYearLabel;
private JLabel toYearLabel;
private JLabel operatorLabel;
private JComboBox operatorComboBox;
private JPanel queryButtonsPanel;
private JButton addQueryButton;
private JButton clearQueryButton;
private JPanel centerPanel;
private List queriesList;
private JPanel bottomPanel;
private JButton searchButton;
private JButton cancelButton;
}