package timeflow.app.ui;
import timeflow.model.*;
import timeflow.data.time.*;
import timeflow.data.db.*;
import timeflow.data.db.filter.*;
import timeflow.format.field.*;
import timeflow.format.file.TimeflowFormat;
import javax.swing.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
public class DateFieldPanel extends JPanel
{
TFModel model;
int numRows;
HashMap<String, Integer> numBad=new HashMap<String, Integer>();
private static String[] mappable={VirtualField.START, VirtualField.END};
JLabel status=new JLabel("");
FieldMap[] panels=new FieldMap[mappable.length];
JButton submit, cancel;
public DateFieldPanel(TFModel model, boolean hasButtons)
{
this.model=model;
ActDB db=model.getDB();
numRows=db.size();
ActList all=db.all();
// calculate stats.
for (Field f: db.getFields(RoughTime.class))
{
int bad=DBUtils.count(all, new MissingValueFilter(f));
numBad.put(f.getName(),bad);
}
setLayout(new BorderLayout());
JPanel top=new JPanel();
if (hasButtons)
{
submit=new JButton("Submit");
top.add(submit);
cancel=new JButton("Cancel");
top.add(cancel);
}
else
{
JLabel about=new JLabel("Dates");
top.add(about);
}
top.add(status);
status.setForeground(Color.red);
add(top, BorderLayout.SOUTH);
JPanel bottom=new JPanel();
add(bottom, BorderLayout.CENTER);
bottom.setLayout(new GridLayout(mappable.length,1));
// add panels.
for (int i=0; i<mappable.length; i++)
{
panels[i]=new FieldMap(mappable[i],i==0);
bottom.add(panels[i]);
}
// to do: add a status field or something
// note inconsistencies, like:
// * no start defined.
// * ends after starts
}
public void map()
{
ActDB db=model.getDB();
for (int i=0; i<panels.length; i++)
{
String choice=(String)panels[i].choices.getSelectedItem();
db.setAlias("None".equals(choice) ? null : db.getField(choice), panels[i].name);
}
model.noteSchemaChange(this);
}
class FieldMap extends JPanel
{
String name;
int bad;
JComboBox choices;
JLabel definedLabel=new JLabel("# def goes here");
boolean important;
FieldMap(String name, boolean important)
{
this.name=name;
this.important=important;
setBackground(Color.white);
setLayout(new GridLayout(1,3));
add(new JLabel(" "+(important? "* ":"")+VirtualField.humanName(name)));//, BorderLayout.NORTH);
choices=new JComboBox();
choices.addItem("None");
for (Field f: model.getDB().getFields(RoughTime.class))
{
choices.addItem(f.getName());//+" "+percentDef+"% defined");
}
add(choices);
choices.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
showDefined();
}});
add(definedLabel);
definedLabel.setForeground(Color.gray);
Field current=model.getDB().getField(name);
if (current!=null)
choices.setSelectedItem(current.getName());
showDefined();
}
void showDefined()
{
String choice=(String)choices.getSelectedItem();
String val="";
boolean none="None".equals(choice);
int percentDef=0;
if (!none)
{
percentDef=(int)(100*(1-numBad.get(choice)/(double)numRows));
val=" "+percentDef+"% defined";
}
definedLabel.setText(val);
if (important)
{
if (none)
status.setText(" Need \"Start\" for timeline/calendar.");
else if (percentDef==0)
status.setText(" No dates defined in "+choice+".");
else
status.setText("");
}
}
}
public Dimension getPreferredSize()
{
return new Dimension(400,80+mappable.length*25);
}
public static void popWindow(TFModel model)
{
final JFrame window=new JFrame("Date Fields");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.getContentPane().setLayout(new GridLayout(1,1));
final DateFieldPanel p=new DateFieldPanel(model, true);
p.submit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
p.map();
window.setVisible(false);
}});
p.cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
window.setVisible(false);
}});
window.getContentPane().add(p);
window.setBounds(50,50,window.getPreferredSize().width,window.getPreferredSize().height);
window.setVisible(true);
}
}