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());
|
|
}
|
}
|
}
|