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 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

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

"); page.append("

"); for (int i=pageStart; i0) { 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()); } } }