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(TimeflowModel 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 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("

Empty Database

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

" + (pages ? (pageStart + 1) + "-" + (last) + " of " : "") + acts.size() + " Events

"); page.append("

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