package timeflow.views;
import timeflow.app.ui.EditRecordPanel;
import timeflow.app.ui.HtmlDisplay;
import timeflow.data.db.*;
import timeflow.format.file.HtmlFormat;
import timeflow.model.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import javax.swing.text.html.*;
import timeflow.util.*;
import java.net.URI;
import java.net.URL;
import java.util.*;
public class ListView extends AbstractView {
private JEditorPane listDisplay;
private JComboBox sortMenu=new JComboBox();
private ActComparator sort;//=ActComparator.byTime();
private int maxPerPage=50;
private int pageStart=0;
private int lastSize=0;
private ActList acts;
private Field sortField;
private JLabel pageLabel=new JLabel("Page", JLabel.LEFT);
private JComboBox pageMenu=new JComboBox();
private boolean changing=false;
private JPanel controls;
public ListView(TFModel model)
{
super(model);
listDisplay=HtmlDisplay.create();
listDisplay.addHyperlinkListener(new LinkIt());
JScrollPane scrollPane = new JScrollPane(listDisplay);
setLayout(new BorderLayout());
add(scrollPane, BorderLayout.CENTER);
controls=new JPanel();
controls.setLayout(null);
controls.setBackground(Color.white);
int x=10, y=10;
int ch=25, pad=5, cw=160;
JLabel sortLabel=new JLabel("Sort Order", JLabel.LEFT);
controls.add(sortLabel);
sortLabel.setBounds(x,y,cw,ch);
y+=ch+pad;
controls.add(sortMenu);
sortMenu.setBounds(x,y,cw,ch);
y+=ch+3*pad;
controls.add(pageLabel);
pageLabel.setBounds(x,y,cw,ch);
y+=ch+pad;
controls.add(pageMenu);
pageMenu.setBounds(x,y,cw,ch);
showPageMenu(false);
pageMenu.addActionListener(pageListener);
sortMenu.addActionListener(sortListener);
}
protected JComponent _getControls()
{
return controls;
}
ActionListener sortListener=new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (changing || sortMenu.getItemCount()<=0) // this means the action was fired after all items removed.
return;
sortField=getModel().getDB().getField((String)sortMenu.getSelectedItem());
sort=sortField==null ? null : ActComparator.by(sortField);
setToFirstPage();
makeList();
}};
ActionListener pageListener=new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (changing)
return;
pageStart=maxPerPage*pageMenu.getSelectedIndex();
System.out.println(e.getActionCommand());
makeList();
}};
@Override
protected void onscreen(boolean majorChange)
{
_note(null);
}
public void _note(TFEvent e) {
changing=true;
if (e==null || e.affectsSchema() || e.affectsRowSet())
{
sortMenu.removeActionListener(sortListener);
sortMenu.removeAllItems();
pageStart=0;
java.util.List<Field> fields=getModel().getDB().getFields();
Field firstField=null;
if (fields.size()>0)
firstField=fields.get(0);
for (Field f: fields)
{
sortMenu.addItem(f.getName());
}
sortField=getModel().getDB().getField(VirtualField.START);
if (sortField!=null)
sortMenu.setSelectedItem(sortField.getName());
else
sortField=firstField;
sortMenu.addActionListener(sortListener);
sort=null;
}
if (e!=null && e.affectsData())
{
setToFirstPage();
}
changing=false;
makeList();
}
private void setToFirstPage()
{
pageStart=0;
if (pageMenu.isVisible())
{
pageMenu.removeActionListener(pageListener);
pageMenu.setSelectedIndex(0);
pageMenu.addActionListener(pageListener);
}
}
void showPageMenu(boolean visible)
{
pageLabel.setVisible(visible);
pageMenu.setVisible(visible);
if (visible)
{
pageMenu.removeActionListener(pageListener);
pageMenu.setSelectedIndex(pageStart/maxPerPage);
pageMenu.addActionListener(pageListener);
}
}
void makeList()
{
HtmlFormat html=new HtmlFormat();
html.setModel(getModel());
StringBuffer page=new StringBuffer();
page.append(html.makeHeader());
ActList as=getModel().getActs();
if (as==null || as.size()==0 && getModel().getDB().size()==0)
{
page.append("<tr><td><h1><font color=#003399>Empty Database</font></h1></td></tr>");
showPageMenu(false);
}
else
{
if (sort==null)
{
Field timeField=getModel().getDB().getField(VirtualField.START);
if (timeField!=null)
sort=ActComparator.by(timeField);
}
acts=as.copy();
if (sort!=null)
Collections.sort(acts, sort);
boolean pages=acts.size()>maxPerPage;
int last=Math.min(acts.size(), pageStart+maxPerPage);
if (pages)
{
int n=acts.size();
if (lastSize!=n)
{
pageMenu.removeActionListener(pageListener);
pageMenu.removeAllItems();
for (int i=0; i*maxPerPage<n;i++)
{
pageMenu.addItem("Items "+((i*maxPerPage)+1)+" to "+
Math.min(n, (i+1)*maxPerPage));
}
pageMenu.addActionListener(pageListener);
lastSize=n;
}
}
showPageMenu(pages);
page.append("<tr><td><h1><font color=#003399>"+(pages? (pageStart+1)+"-"+(last) +" of ": "")+acts.size()+" Events</font></h1>");
page.append("<br><br></td></tr>");
for (int i=pageStart; i<last; i++)
{
Act a=acts.get(i);
page.append(html.makeItem(a,i));
}
}
page.append(html.makeFooter());
listDisplay.setText(page.toString());
listDisplay.setCaretPosition(0);
repaint();
}
@Override
public String getName() {
return "List";
}
static class ArrayRenderer extends DefaultTableCellRenderer {
public void setValue(Object value) {
setText(Display.arrayToString((Object[])value));
}
}
public class LinkIt implements HyperlinkListener
{
public void hyperlinkUpdate(HyperlinkEvent e)
{
if (e.getEventType() != HyperlinkEvent.EventType.ACTIVATED)
return;
String s=e.getDescription();
System.out.println(s);
if (s.length()>0)
{
char c=s.charAt(0);
if (c=='e') // code for "edit"
{
int i=Integer.parseInt(s.substring(1));
EditRecordPanel.edit(getModel(), acts.get(i));
return;
}
}
Display.launchBrowser(e.getURL().toString());
}
}
}