From 86f4e9c75951153ae9825f4772633e45698cb602 Mon Sep 17 00:00:00 2001
From: Normand Briere <nbriere@noware.ca>
Date: Sun, 16 Dec 2018 21:21:43 -0500
Subject: [PATCH] Timeflow clean-up.

---
 ObjEditor.java                                  |   13 
 timeflow/app/ui/ColorLegendPanel.java           |    2 
 timeflow/app/ui/EditValuePanel.java             |    1 
 timeflow/vis/VisualActFactory.java              |    4 
 timeflow/app/ui/MassDeletePanel.java            |    4 
 timeflow/model/TFListener.java                  |    5 
 timeflow/views/AbstractVisualizationView.java   |    6 
 timeflow/app/TimeflowApp.java                   |    8 
 timeflow/views/TableView.java                   |    2 
 timeflow/app/actions/TimeflowAction.java        |    2 
 timeflow/model/TimeflowModel.java               |    3 
 timeflow/app/ui/filter/FilterCategoryPanel.java |  314 +++++----
 timeflow/app/ui/ComponentCluster.java           |    6 
 timeflow/app/ui/StatusPanel.java                |    2 
 timeflow/views/ListView.java                    |    2 
 timeflow/views/SummaryView.java                 |    2 
 timeflow/app/actions/DeleteFieldAction.java     |    2 
 timeflow/app/actions/DeleteSelectedAction.java  |   77 +-
 timeflow/format/file/HtmlFormat.java            |    8 
 timeflow/format/file/Export.java                |    2 
 timeflow/app/ui/filter/SearchPanel.java         |    2 
 timeflow/data/db/ActDB.java                     |    9 
 timeflow/data/time/TimeUnit.java                |    9 
 timeflow/format/file/TimeflowFormat.java        |  301 +++++----
 timeflow/data/time/RoughTime.java               |  250 ++++----
 timeflow/app/ui/SizeLegendPanel.java            |    4 
 timeflow/views/TimelineView.java                |   10 
 timeflow/app/ui/ReorderFieldsPanel.java         |    4 
 timeflow/app/ui/DateFieldPanel.java             |    6 
 timeflow/model/ModelPanel.java                  |    6 
 timeflow/views/BarGraphView.java                |    6 
 timeflow/app/ui/filter/FilterDatePanel.java     |  310 +++++-----
 timeflow/vis/calendar/CalendarVisuals.java      |    4 
 timeflow/app/actions/NewDataAction.java         |   26 
 timeflow/vis/timeline/AxisRenderer.java         |    4 
 timeflow/data/db/Field.java                     |   89 +-
 timeflow/app/actions/AddRecordAction.java       |   23 
 timeflow/vis/timeline/TimelineVisuals.java      |    8 
 timeflow/views/CalendarView.java                |    4 
 timeflow/vis/timeline/TimelineRenderer.java     |    2 
 timeflow/views/AbstractView.java                |    4 
 timeflow/app/actions/AddFieldAction.java        |    2 
 timeflow/app/ui/GlobalDisplayPanel.java         |   11 
 timeflow/views/IntroView.java                   |    2 
 timeflow/vis/VisualEncoder.java                 |    4 
 timeflow/model/Display.java                     |    2 
 timeflow/views/DescriptionView.java             |    2 
 timeflow/app/ui/ImportDelimitedPanel.java       |    6 
 timeflow/app/ui/EditRecordPanel.java            |   14 
 timeflow/app/ui/filter/FilterControlPanel.java  |    2 
 timeflow/app/actions/QuitAction.java            |    2 
 timeflow/app/actions/EditSourceAction.java      |    2 
 timeflow/format/field/FieldFormat.java          |  112 ++-
 53 files changed, 902 insertions(+), 805 deletions(-)

diff --git a/ObjEditor.java b/ObjEditor.java
index f7c8293..751955c 100644
--- a/ObjEditor.java
+++ b/ObjEditor.java
@@ -1189,6 +1189,13 @@
 	timelinePanel = new JPanel(new BorderLayout());
         timelineMenubar = new timeflow.app.TimeflowApp().TimeFlowWindow(timelinePanel);
 
+        cameraPanel = new JSplitPane(JSplitPane.VERTICAL_SPLIT, cameraView, timelinePanel);
+        cameraPanel.setContinuousLayout(true);
+        cameraPanel.setOneTouchExpandable(true);
+//        cameraPanel.setDividerLocation(0.9);
+//        cameraPanel.setDividerSize(9);
+        cameraPanel.setResizeWeight(1.0);
+        
         centralPanel.add(cameraView);
         //frame.setJMenuBar(timelineMenubar);
         //centralPanel.add(timelinePanel);
@@ -2996,7 +3003,8 @@
             if (timeline)
             {
                 centralPanel.remove(cameraView);
-                centralPanel.add(timelinePanel);
+                cameraPanel.add(cameraView);
+                centralPanel.add(cameraPanel);
                 frame.setJMenuBar(timelineMenubar);
                 wasFullScreen = CameraPane.FULLSCREEN;
                 if (!CameraPane.FULLSCREEN)
@@ -3005,7 +3013,7 @@
             }
             else
             {
-                centralPanel.remove(timelinePanel);
+                centralPanel.remove(cameraPanel);
                 centralPanel.add(cameraView);
                 frame.setJMenuBar(null);
                 if (!wasFullScreen)
@@ -4533,6 +4541,7 @@
     JPanel bigThree;
     JTabbedPane scenePanel;
     JPanel centralPanel;
+    JSplitPane cameraPanel;
     JPanel timelinePanel;
     JMenuBar timelineMenubar;
     JSplitPane framePanel;
diff --git a/timeflow/app/TimeflowApp.java b/timeflow/app/TimeflowApp.java
index c579393..a057ddb 100755
--- a/timeflow/app/TimeflowApp.java
+++ b/timeflow/app/TimeflowApp.java
@@ -25,7 +25,7 @@
 
 public class TimeflowApp extends JFrame
 {
-        public TFModel model = new TFModel();
+        public TimeflowModel model = new TimeflowModel();
         public JFileChooser fileChooser;
         AboutWindow splash;
         String[][] examples;
@@ -84,6 +84,7 @@
                         examples[i][0] = s;
                         examples[i][1] = "settings/examples/" + ex[i];
                 }
+                
                 templates = getVisibleFiles("settings/templates");
                 fileChooser = new JFileChooser(state.getCurrentFile());
 
@@ -180,7 +181,9 @@
                 JMenu fileMenu = new JMenu("File");
                 menubar.add(fileMenu);
 
-                fileMenu.add(new NewDataAction(this));
+                TimeflowAction tlAction = new NewDataAction(this);
+                fileMenu.add(tlAction);
+                tlAction.actionPerformed(null);
                 fileMenu.add(new CopySchemaAction(this));
 
                 JMenu templateMenu = new JMenu("New From Template");
@@ -202,7 +205,6 @@
                 }
 
                 fileMenu.addSeparator();
-
 
                 JMenuItem open = new JMenuItem("Open...");
                 fileMenu.add(open);
diff --git a/timeflow/app/actions/AddFieldAction.java b/timeflow/app/actions/AddFieldAction.java
index 5af658e..2469434 100755
--- a/timeflow/app/actions/AddFieldAction.java
+++ b/timeflow/app/actions/AddFieldAction.java
@@ -32,7 +32,7 @@
 		if (n==1)
 		{
 			String fieldName=p.name.getText();
-			TFModel model=getModel();
+			TimeflowModel model=getModel();
 			if (fieldName.trim().length()==0)
 				app.showUserError("Field names can't be all spaces!");
 			else if (model.getDB().getField(fieldName)!=null)
diff --git a/timeflow/app/actions/AddRecordAction.java b/timeflow/app/actions/AddRecordAction.java
index c295e6b..b5251e7 100755
--- a/timeflow/app/actions/AddRecordAction.java
+++ b/timeflow/app/actions/AddRecordAction.java
@@ -11,16 +11,17 @@
 import javax.swing.*;
 import java.util.*;
 
-public class AddRecordAction extends TimeflowAction {
+public class AddRecordAction extends TimeflowAction
+{
+        public AddRecordAction(TimeflowApp app)
+        {
+                super(app, "Add Record...", null, "Add a record to this database");
+                accelerate('A');
+        }
 
-	public AddRecordAction(TimeflowApp app)
-	{
-		super(app, "Add Record...", null, "Add a record to this database");
-		accelerate('A');
-	}
-	
-	@Override
-	public void actionPerformed(ActionEvent e) {
-		EditRecordPanel.add(getModel());
-	}
+        @Override
+        public void actionPerformed(ActionEvent e)
+        {
+                EditRecordPanel.add(getModel());
+        }
 }
diff --git a/timeflow/app/actions/DeleteFieldAction.java b/timeflow/app/actions/DeleteFieldAction.java
index c7e60cc..604f66b 100755
--- a/timeflow/app/actions/DeleteFieldAction.java
+++ b/timeflow/app/actions/DeleteFieldAction.java
@@ -33,7 +33,7 @@
 
 		if (fieldToDelete!=null)
 		{
-			TFModel model=getModel();
+			TimeflowModel model=getModel();
 			Field f=model.getDB().getField(fieldToDelete);
 			model.getDB().deleteField(f);			
 			model.noteSchemaChange(this);
diff --git a/timeflow/app/actions/DeleteSelectedAction.java b/timeflow/app/actions/DeleteSelectedAction.java
index 824ac9b..bec172f 100755
--- a/timeflow/app/actions/DeleteSelectedAction.java
+++ b/timeflow/app/actions/DeleteSelectedAction.java
@@ -9,43 +9,48 @@
 import javax.swing.*;
 import java.util.*;
 
+public class DeleteSelectedAction extends TimeflowAction
+{
 
-public class DeleteSelectedAction extends TimeflowAction {
+        public DeleteSelectedAction(TimeflowApp app)
+        {
+                super(app, "Delete Selected Items...", null, "Delete the currently visible events");
+        }
 
-	public DeleteSelectedAction(TimeflowApp app)
-	{
-		super(app, "Delete Selected Items...", null, "Delete the currently visible events");
-	}
-	
-	@Override
-	public void actionPerformed(ActionEvent e) {
-		
-		HashSet<Act> keepers=new HashSet<Act>(); // switching between sets and lists
-		keepers.addAll(getModel().getDB().all()); // for efficiency. maybe silly?
-		ActList selected=getModel().getActs();
-		for (Act a: selected)
-			keepers.remove(a);
-		ActList keepList=new ActList(getModel().getDB());
-		keepList.addAll(keepers);
-		
-		MassDeletePanel panel=new MassDeletePanel(getModel(), keepList, 
-				"Delete all selected items.");
-		Object[] options = {"Cancel", "Proceed"};
-		int n = JOptionPane.showOptionDialog(app,
-					panel,
-					"Delete Selected",
-					JOptionPane.YES_NO_CANCEL_OPTION,
-					JOptionPane.PLAIN_MESSAGE,
-					null,
-					options,
-					"Proceed");
-		panel.detachFromModel();
-		if (n==1)
-		{
-			panel.applyAction();
-			app.clearFilters();
-			getModel().noteSchemaChange(this);
-		}
-	}
+        @Override
+        public void actionPerformed(ActionEvent e)
+        {
 
+                HashSet<Act> keepers = new HashSet<Act>(); // switching between sets and lists
+                keepers.addAll(getModel().getDB().all()); // for efficiency. maybe silly?
+                ActList selected = getModel().getActs();
+                for (Act a : selected)
+                {
+                        keepers.remove(a);
+                }
+                ActList keepList = new ActList(getModel().getDB());
+                keepList.addAll(keepers);
+
+                MassDeletePanel panel = new MassDeletePanel(getModel(), keepList,
+                        "Delete all selected items.");
+                Object[] options =
+                {
+                        "Cancel", "Proceed"
+                };
+                int n = JOptionPane.showOptionDialog(app,
+                        panel,
+                        "Delete Selected",
+                        JOptionPane.YES_NO_CANCEL_OPTION,
+                        JOptionPane.PLAIN_MESSAGE,
+                        null,
+                        options,
+                        "Proceed");
+                panel.detachFromModel();
+                if (n == 1)
+                {
+                        panel.applyAction();
+                        app.clearFilters();
+                        getModel().noteSchemaChange(this);
+                }
+        }
 }
diff --git a/timeflow/app/actions/EditSourceAction.java b/timeflow/app/actions/EditSourceAction.java
index eec0280..655c3fe 100755
--- a/timeflow/app/actions/EditSourceAction.java
+++ b/timeflow/app/actions/EditSourceAction.java
@@ -17,7 +17,7 @@
 	
 	@Override
 	public void actionPerformed(ActionEvent e) {
-		TFModel model=getModel();
+		TimeflowModel model=getModel();
 		String source = (String)JOptionPane.showInputDialog(
                 app,
                 null,
diff --git a/timeflow/app/actions/NewDataAction.java b/timeflow/app/actions/NewDataAction.java
index 357fb60..71fa9ec 100755
--- a/timeflow/app/actions/NewDataAction.java
+++ b/timeflow/app/actions/NewDataAction.java
@@ -10,18 +10,20 @@
 import javax.swing.*;
 import java.util.*;
 
-public class NewDataAction extends TimeflowAction {
+public class NewDataAction extends TimeflowAction
+{
+        public NewDataAction(TimeflowApp app)
+        {
+                super(app, "New", null, "Create a new, blank database");
+                accelerate('N');
 
-	public NewDataAction(TimeflowApp app)
-	{
-		super(app, "New", null, "Create a new, blank database");
-		accelerate('N');
+        }
 
-	}
-	
-	public void actionPerformed(ActionEvent e) 
-	{
-		if (app.checkSaveStatus())
-			getModel().setDB(new BasicDB("Unspecified"), "[new data]", true, this);
-	}
+        public void actionPerformed(ActionEvent e)
+        {
+                if (app.checkSaveStatus())
+                {
+                        getModel().setDB(new BasicDB("Unspecified"), "[new data]", true, this);
+                }
+        }
 }
diff --git a/timeflow/app/actions/QuitAction.java b/timeflow/app/actions/QuitAction.java
index bdd6726..7264bd1 100755
--- a/timeflow/app/actions/QuitAction.java
+++ b/timeflow/app/actions/QuitAction.java
@@ -12,7 +12,7 @@
 
 public class QuitAction extends TimeflowAction {
 
-	public QuitAction(TimeflowApp app, TFModel model)
+	public QuitAction(TimeflowApp app, TimeflowModel model)
 	{
 		super(app, "Quit", null, "Quit the program");
 	}
diff --git a/timeflow/app/actions/TimeflowAction.java b/timeflow/app/actions/TimeflowAction.java
index aae5d23..217afbd 100755
--- a/timeflow/app/actions/TimeflowAction.java
+++ b/timeflow/app/actions/TimeflowAction.java
@@ -27,7 +27,7 @@
 	}
 
 
-    protected TFModel getModel()
+    protected TimeflowModel getModel()
     {
     	return app.model;
     }
diff --git a/timeflow/app/ui/ColorLegendPanel.java b/timeflow/app/ui/ColorLegendPanel.java
index e8552a0..2ce67de 100755
--- a/timeflow/app/ui/ColorLegendPanel.java
+++ b/timeflow/app/ui/ColorLegendPanel.java
@@ -20,7 +20,7 @@
 
 	Field oldColor;
 
-	public ColorLegendPanel(TFModel model)
+	public ColorLegendPanel(TimeflowModel model)
 	{
 		super(model);
 		setBackground(Color.white);
diff --git a/timeflow/app/ui/ComponentCluster.java b/timeflow/app/ui/ComponentCluster.java
index d32b3b6..057f2dd 100755
--- a/timeflow/app/ui/ComponentCluster.java
+++ b/timeflow/app/ui/ComponentCluster.java
@@ -8,7 +8,7 @@
 	int numComps=0;
 	int x1=80;
 	int width=200;
-	int compH=30;
+	int compH=20;
 	DottedLine line=new DottedLine();
 	
 	public ComponentCluster(String name)
@@ -25,9 +25,9 @@
 	{
 		add(c);
 		c.setBorder(null);
-		c.setBounds(x1,10+numComps*compH, c.getPreferredSize().width, c.getPreferredSize().height);
+		c.setBounds(x1,numComps*compH, c.getPreferredSize().width, c.getPreferredSize().height);
 		numComps++;
-		line.setBounds(x1-10,10,1,numComps*compH-5);
+		line.setBounds(x1-10,10,0,numComps*compH);
 	}
 	
 	public Dimension getPreferredSize()
diff --git a/timeflow/app/ui/DateFieldPanel.java b/timeflow/app/ui/DateFieldPanel.java
index f36e1f3..4480b1c 100755
--- a/timeflow/app/ui/DateFieldPanel.java
+++ b/timeflow/app/ui/DateFieldPanel.java
@@ -15,7 +15,7 @@
 
 public class DateFieldPanel extends JPanel
 {
-	TFModel model;
+	TimeflowModel model;
 	int numRows;
 	HashMap<String, Integer> numBad=new HashMap<String, Integer>();
 	private static String[] mappable={VirtualField.START, VirtualField.END};
@@ -23,7 +23,7 @@
 	FieldMap[] panels=new FieldMap[mappable.length];
 	JButton submit, cancel;
 	
-	public DateFieldPanel(TFModel model, boolean hasButtons)
+	public DateFieldPanel(TimeflowModel model, boolean hasButtons)
 	{
 		this.model=model;
 		
@@ -154,7 +154,7 @@
 		return new Dimension(400,80+mappable.length*25);
 	}
 	
-	public static void popWindow(TFModel model)
+	public static void popWindow(TimeflowModel model)
 	{
 		final JFrame window=new JFrame("Date Fields");
 		window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
diff --git a/timeflow/app/ui/EditRecordPanel.java b/timeflow/app/ui/EditRecordPanel.java
index 08d7aec..bdde65b 100755
--- a/timeflow/app/ui/EditRecordPanel.java
+++ b/timeflow/app/ui/EditRecordPanel.java
@@ -20,12 +20,12 @@
         HashMap<Field, EditValuePanel> fieldUI = new HashMap<Field, EditValuePanel>();
         JButton submit, cancel;
         Dimension idealSize = new Dimension();
-        TFModel model;
+        TimeflowModel model;
 
-        private static void edit(final TFModel model, final Act act, final boolean isAdd)
+        private static void edit(final TimeflowModel model, final Act act, final boolean isAdd)
         {
                 final JFrame window = new JFrame(isAdd ? "Add Record" : "Edit Record");
-                window.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
+                //window.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                 final EditRecordPanel editor = new EditRecordPanel(model, act);
                 window.getContentPane().setLayout(new GridLayout(1, 1));
                 window.getContentPane().add(editor);
@@ -58,25 +58,25 @@
                 window.setVisible(true);
         }
 
-        public static void edit(TFModel model, Act act)
+        public static void edit(TimeflowModel model, Act act)
         {
                 edit(model, act, false);
         }
 
-        public static void add(TFModel model)
+        public static void add(TimeflowModel model)
         {
                 Act act = model.getDB().createAct();
                 edit(model, act, true);
         }
 
-        public static void add(TFModel model, RoughTime r)
+        public static void add(TimeflowModel model, RoughTime r)
         {
                 Act act = model.getDB().createAct();
                 act.set(act.getDB().getField(VirtualField.START), r);
                 edit(model, act, true);
         }
 
-        public EditRecordPanel(TFModel model, Act act)
+        public EditRecordPanel(TimeflowModel model, Act act)
         {
                 this.model = model;
                 this.act = act;
diff --git a/timeflow/app/ui/EditValuePanel.java b/timeflow/app/ui/EditValuePanel.java
index 2f148d8..a6798f3 100755
--- a/timeflow/app/ui/EditValuePanel.java
+++ b/timeflow/app/ui/EditValuePanel.java
@@ -10,7 +10,6 @@
 
 public class EditValuePanel extends JPanel
 {
-
         FieldFormat parser;
         boolean longField;
         JLabel feedback = new JLabel()
diff --git a/timeflow/app/ui/GlobalDisplayPanel.java b/timeflow/app/ui/GlobalDisplayPanel.java
index 59f4c8a..8f4e6c5 100755
--- a/timeflow/app/ui/GlobalDisplayPanel.java
+++ b/timeflow/app/ui/GlobalDisplayPanel.java
@@ -21,7 +21,7 @@
         JPanel globalControls = new JPanel();
         CardLayout localCards = new CardLayout();
 
-        public GlobalDisplayPanel(TFModel model, FilterControlPanel filterControls)
+        public GlobalDisplayPanel(TimeflowModel model, FilterControlPanel filterControls)
         {
                 super(model);
                 setBackground(Color.white);
@@ -56,12 +56,12 @@
                 };
                 label.setBackground(Color.lightGray);
                 label.setForeground(Color.darkGray);
-                globalLabel.add(label, BorderLayout.CENTER);
+                //globalLabel.add(label, BorderLayout.CENTER);
                 p.add(globalLabel, BorderLayout.NORTH);
 
                 JPanel global = new JPanel();
                 global.setLayout(new BorderLayout());
-                global.add(new StatusPanel(model, filterControls), BorderLayout.NORTH);
+                //global.add(new StatusPanel(model, filterControls), BorderLayout.NORTH);
 
                 encodings.setLayout(new GridLayout(4, 1));
                 encodings.setBackground(Color.white);
@@ -74,12 +74,13 @@
 
         public void showLocalControl(String name)
         {
-                localCards.show(localControls, name);
+                //localCards.show(localControls, name);
         }
 
         public void addLocalControl(String name, JComponent control)
         {
-                localControls.add(control, name);
+                if (name.equals("Timeline"))
+                        localControls.add(control, name);
         }
 
         void makeEncodingPanel()
diff --git a/timeflow/app/ui/ImportDelimitedPanel.java b/timeflow/app/ui/ImportDelimitedPanel.java
index c626219..b05eb0f 100755
--- a/timeflow/app/ui/ImportDelimitedPanel.java
+++ b/timeflow/app/ui/ImportDelimitedPanel.java
@@ -24,7 +24,7 @@
 	SchemaPanel schemaPanel;
 	boolean exitOnClose=false; // for testing!
 	JScrollPane scroller;
-	TFModel model;
+	TimeflowModel model;
 	JLabel numLinesLabel=new JLabel();
 	
 	// for testing:
@@ -33,7 +33,7 @@
 		System.out.println("Starting test of ImportEditor");
 		String file="data/probate.tsv";
 		String[][] data=DelimitedFormat.readArrayGuessDelim(file, System.out);
-		ImportDelimitedPanel editor=new ImportDelimitedPanel(new TFModel());
+		ImportDelimitedPanel editor=new ImportDelimitedPanel(new TimeflowModel());
 		editor.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 		editor.setFileName(file);
 		editor.setData(data);
@@ -42,7 +42,7 @@
 		editor.exitOnClose=true;
 	}
 	
-	public ImportDelimitedPanel(final TFModel model)
+	public ImportDelimitedPanel(final TimeflowModel model)
 	{
 		super("Import File");
 		this.model=model;
diff --git a/timeflow/app/ui/MassDeletePanel.java b/timeflow/app/ui/MassDeletePanel.java
index 10acc13..b4cedd4 100755
--- a/timeflow/app/ui/MassDeletePanel.java
+++ b/timeflow/app/ui/MassDeletePanel.java
@@ -15,7 +15,7 @@
 	TableView table;
 	ActList keepers;
 	
-	public MassDeletePanel(TFModel model, ActList keepers, String title)
+	public MassDeletePanel(TimeflowModel model, ActList keepers, String title)
 	{
 		super(model);
 		this.keepers=keepers;
@@ -61,7 +61,7 @@
 	
 	public void detachFromModel()
 	{
-		TFModel model=getModel();
+		TimeflowModel model=getModel();
 		model.removeListener(table);
 		model.removeListener(this);
 	}
diff --git a/timeflow/app/ui/ReorderFieldsPanel.java b/timeflow/app/ui/ReorderFieldsPanel.java
index 1db474d..3aebe64 100755
--- a/timeflow/app/ui/ReorderFieldsPanel.java
+++ b/timeflow/app/ui/ReorderFieldsPanel.java
@@ -14,7 +14,7 @@
 {
 	TableView table;
 	
-	public ReorderFieldsPanel(TFModel model)
+	public ReorderFieldsPanel(TimeflowModel model)
 	{
 		super(model);
 		setLayout(new BorderLayout());
@@ -49,7 +49,7 @@
 	
 	public void detachFromModel()
 	{
-		TFModel model=getModel();
+		TimeflowModel model=getModel();
 		model.removeListener(table);
 		model.removeListener(this);
 	}
diff --git a/timeflow/app/ui/SizeLegendPanel.java b/timeflow/app/ui/SizeLegendPanel.java
index a689d4a..d5ffde7 100755
--- a/timeflow/app/ui/SizeLegendPanel.java
+++ b/timeflow/app/ui/SizeLegendPanel.java
@@ -13,7 +13,7 @@
 	Field sizeField;
 	double min, max;
 
-	public SizeLegendPanel(TFModel model)
+	public SizeLegendPanel(TimeflowModel model)
 	{
 		super(model);
 		setBackground(Color.white);
@@ -44,7 +44,7 @@
 		g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 		int w=getSize().width;
 		int h=getSize().height;
-		TFModel model=getModel();
+		TimeflowModel model=getModel();
 		Display display=model.getDisplay();
 		g.setColor(getBackground());
 		g.setFont(display.plain());
diff --git a/timeflow/app/ui/StatusPanel.java b/timeflow/app/ui/StatusPanel.java
index 0cdf2fb..ae41848 100755
--- a/timeflow/app/ui/StatusPanel.java
+++ b/timeflow/app/ui/StatusPanel.java
@@ -30,7 +30,7 @@
 	
 	static final DecimalFormat niceFormat=new DecimalFormat("###,###");
 	
-	public StatusPanel(TFModel model, final FilterControlPanel filterControls) {
+	public StatusPanel(TimeflowModel model, final FilterControlPanel filterControls) {
 		super(model);	
 		setLayout(new BorderLayout());
 		setBackground(new Color(245, 245, 245));
diff --git a/timeflow/app/ui/filter/FilterCategoryPanel.java b/timeflow/app/ui/filter/FilterCategoryPanel.java
index 9207469..6728292 100755
--- a/timeflow/app/ui/filter/FilterCategoryPanel.java
+++ b/timeflow/app/ui/filter/FilterCategoryPanel.java
@@ -11,154 +11,180 @@
 import java.awt.*;
 import java.awt.event.*;
 
-public class FilterCategoryPanel extends FilterDefinitionPanel 
+public class FilterCategoryPanel extends FilterDefinitionPanel
 {
-	public JList dataList=new JList();
-	Field field;
-	
-	public FilterCategoryPanel(final Field field, final ModelPanel parent)
-	{
-		this(field.getName(), field, parent);
-	}
-	
-	public FilterCategoryPanel(String title, final Field field, final ModelPanel parent)
-	{
-		this.field=field;
-		setLayout(new BorderLayout());
-		setBackground(Color.white);
-		setBorder(BorderFactory.createEmptyBorder(0,5,0,5));
 
-		add(new FilterTitle(title, field, parent, true), BorderLayout.NORTH);
-		
-		
-		JScrollPane scroller=new JScrollPane(dataList);
-		scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
-		scroller.setBorder(null);
-		add(scroller, BorderLayout.CENTER);
-		dataList.setForeground(Color.darkGray);
-		dataList.setSelectionForeground(Color.black);
-		dataList.setSelectionBackground(new Color(220,235,255));
-		dataList.setFont(parent.getModel().getDisplay().small());
-		scroller.getVerticalScrollBar().setBackground(Color.white);
-		
-		
-		// ok, the following is ugly code to insert a new mouselistener
-		// that lets the user deselect items when they are clicked.
-		// i tried a bunch of stuff but this is all that would work--
-		// and searching the web yielded only solutions similar to this.
-		// also, there's a weird dance with consuming/not consuming events
-		// that is designed to allow a certain kind of multi-selection behavior
-		// with the mouse, while letting you scroll through items one at a time
-		// with the keyboard. this was the product of a long series of
-		// conversations with target users.
-		MouseListener[] old = dataList.getMouseListeners();
-		for (MouseListener m: old)
-		   dataList.removeMouseListener(m);
-		
-		dataList.addMouseListener(new MouseAdapter()
-		{
-		   public void mousePressed(MouseEvent e)
-		   {
-			  if (e.isControlDown() || e.isMetaDown() || e.isShiftDown())
-				  return;
-		      final int index = dataList.locationToIndex(e.getPoint());
-		      if (dataList.isSelectedIndex(index))
-		      {
-		         SwingUtilities.invokeLater(new Runnable()
-		         {
-		            public void run()
-		            {
-		               dataList.removeSelectionInterval(index, index);
-		              
-		            }
-		         });
-		         e.consume();
-		      }
-		      else
-		      {
-		    	  SwingUtilities.invokeLater(new Runnable()
-			         {
-			            public void run()
-			            {
-			            	dataList.addSelectionInterval(index, index);
-			              
-			            }
-			         });		    	  
-		    	  e.consume();
-		      }
-		   }
-		});
+        public JList dataList = new JList();
+        Field field;
 
-		for (MouseListener m: old)
-		   dataList.addMouseListener(m);
-		
-		dataList.setCellRenderer(new DefaultListCellRenderer() {
-			@Override
-			public Component getListCellRendererComponent(JList list,
-					Object value, int index, boolean isSelected,
-					boolean cellHasFocus) {
-				Component c=super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
-				if (field==parent.getModel().getColorField())
-				{
-					String text=value.toString();
-					int n=text.lastIndexOf('-');
-					if (n>1)
-						text=text.substring(0,n-1);
-					c.setForeground(parent.getModel().getDisplay().makeColor(text));
-				}
-				return c;
-			}});
-			
-	}
+        public FilterCategoryPanel(final Field field, final ModelPanel parent)
+        {
+                this(field.getName(), field, parent);
+        }
 
-	public void setData(Bag<String> data)
-	{
-		dataList.removeAll();
-		java.util.List<String> items=data.list();
-		String[] s=(String[])items.toArray(new String[0]);
-		for (int i=0; i<s.length; i++)
-		{
-			int num=data.num(s[i]);
-			if (s[i]==null || s[i].length()==0)
-				s[i]="(missing)";
-			s[i]+=" - "+num;
-		}
-		dataList.setListData(s);
-	}
-	
-	public Dimension getPreferredSize()
-	{
-		return new Dimension(200,200);
-	}
+        public FilterCategoryPanel(String title, final Field field, final ModelPanel parent)
+        {
+                this.field = field;
+                setLayout(new BorderLayout());
+                setBackground(Color.white);
+                setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
 
-	@Override
-	public ActFilter defineFilter() {
-		Object[] o=dataList.getSelectedValues();	
-		if (o==null || o.length==0)
-			return null;
-		
-		int n=o.length;
-		String[] s=new String[n];
-		for (int i=0; i<n; i++)
-		{
-			String w=(String)o[i];
-			int m=w.lastIndexOf('-');
-			s[i]=w.substring(0, m-1);
-			if ("(missing)".equals(s[i]))
-				s[i]="";
-		}
-		
-		if (s.length==1)
-			return new FieldValueFilter(field, s[0]);
-		FieldValueSetFilter f=new FieldValueSetFilter(field);
-		for (int i=0; i<s.length; i++)
-			f.addValue(s[i]);
-		return f;
-	}
+                add(new FilterTitle(title, field, parent, true), BorderLayout.NORTH);
 
-	@Override
-	public void clearFilter() {
-		dataList.clearSelection();
-	}
-	
+
+                JScrollPane scroller = new JScrollPane(dataList);
+                scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+                scroller.setBorder(null);
+                add(scroller, BorderLayout.CENTER);
+                dataList.setForeground(Color.darkGray);
+                dataList.setSelectionForeground(Color.black);
+                dataList.setSelectionBackground(new Color(220, 235, 255));
+                dataList.setFont(parent.getModel().getDisplay().small());
+                scroller.getVerticalScrollBar().setBackground(Color.white);
+
+
+                // ok, the following is ugly code to insert a new mouselistener
+                // that lets the user deselect items when they are clicked.
+                // i tried a bunch of stuff but this is all that would work--
+                // and searching the web yielded only solutions similar to this.
+                // also, there's a weird dance with consuming/not consuming events
+                // that is designed to allow a certain kind of multi-selection behavior
+                // with the mouse, while letting you scroll through items one at a time
+                // with the keyboard. this was the product of a long series of
+                // conversations with target users.
+                MouseListener[] old = dataList.getMouseListeners();
+                for (MouseListener m : old)
+                {
+                        dataList.removeMouseListener(m);
+                }
+
+                dataList.addMouseListener(new MouseAdapter()
+                {
+
+                        public void mousePressed(MouseEvent e)
+                        {
+                                if (e.isControlDown() || e.isMetaDown() || e.isShiftDown())
+                                {
+                                        return;
+                                }
+                                final int index = dataList.locationToIndex(e.getPoint());
+                                if (dataList.isSelectedIndex(index))
+                                {
+                                        SwingUtilities.invokeLater(new Runnable()
+                                        {
+
+                                                public void run()
+                                                {
+                                                        dataList.removeSelectionInterval(index, index);
+
+                                                }
+                                        });
+                                        e.consume();
+                                } else
+                                {
+                                        SwingUtilities.invokeLater(new Runnable()
+                                        {
+
+                                                public void run()
+                                                {
+                                                        dataList.addSelectionInterval(index, index);
+
+                                                }
+                                        });
+                                        e.consume();
+                                }
+                        }
+                });
+
+                for (MouseListener m : old)
+                {
+                        dataList.addMouseListener(m);
+                }
+
+                dataList.setCellRenderer(new DefaultListCellRenderer()
+                {
+
+                        @Override
+                        public Component getListCellRendererComponent(JList list,
+                                Object value, int index, boolean isSelected,
+                                boolean cellHasFocus)
+                        {
+                                Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+                                if (field == parent.getModel().getColorField())
+                                {
+                                        String text = value.toString();
+                                        int n = text.lastIndexOf('-');
+                                        if (n > 1)
+                                        {
+                                                text = text.substring(0, n - 1);
+                                        }
+                                        c.setForeground(parent.getModel().getDisplay().makeColor(text));
+                                }
+                                return c;
+                        }
+                });
+
+        }
+
+        public void setData(Bag<String> data)
+        {
+                dataList.removeAll();
+                java.util.List<String> items = data.list();
+                String[] s = (String[]) items.toArray(new String[0]);
+                for (int i = 0; i < s.length; i++)
+                {
+                        int num = data.num(s[i]);
+                        if (s[i] == null || s[i].length() == 0)
+                        {
+                                s[i] = "(missing)";
+                        }
+                        s[i] += " - " + num;
+                }
+                dataList.setListData(s);
+        }
+
+        public Dimension getPreferredSize()
+        {
+                return new Dimension(200, 200);
+        }
+
+        @Override
+        public ActFilter defineFilter()
+        {
+                Object[] o = dataList.getSelectedValues();
+                if (o == null || o.length == 0)
+                {
+                        return null;
+                }
+
+                int n = o.length;
+                String[] s = new String[n];
+                for (int i = 0; i < n; i++)
+                {
+                        String w = (String) o[i];
+                        int m = w.lastIndexOf('-');
+                        s[i] = w.substring(0, m - 1);
+                        if ("(missing)".equals(s[i]))
+                        {
+                                s[i] = "";
+                        }
+                }
+
+                if (s.length == 1)
+                {
+                        return new FieldValueFilter(field, s[0]);
+                }
+                FieldValueSetFilter f = new FieldValueSetFilter(field);
+                for (int i = 0; i < s.length; i++)
+                {
+                        f.addValue(s[i]);
+                }
+                return f;
+        }
+
+        @Override
+        public void clearFilter()
+        {
+                dataList.clearSelection();
+        }
 }
diff --git a/timeflow/app/ui/filter/FilterControlPanel.java b/timeflow/app/ui/filter/FilterControlPanel.java
index fafdb7e..24b8095 100755
--- a/timeflow/app/ui/filter/FilterControlPanel.java
+++ b/timeflow/app/ui/filter/FilterControlPanel.java
@@ -23,7 +23,7 @@
 	JMenu menuToSyncWith;
 	
 	
-	public FilterControlPanel(TFModel model, JMenu menuToSyncWith)
+	public FilterControlPanel(TimeflowModel model, JMenu menuToSyncWith)
 	{
 		super(model);
 		this.menuToSyncWith=menuToSyncWith;
diff --git a/timeflow/app/ui/filter/FilterDatePanel.java b/timeflow/app/ui/filter/FilterDatePanel.java
index 17c1801..a07615b 100755
--- a/timeflow/app/ui/filter/FilterDatePanel.java
+++ b/timeflow/app/ui/filter/FilterDatePanel.java
@@ -16,158 +16,168 @@
 // NumberFilterPanel.
 // but, i'm not sure how to do it in a way that doesn't make the code
 // seem too complicated.
-
-public class FilterDatePanel  extends FilterDefinitionPanel 
+public class FilterDatePanel extends FilterDefinitionPanel
 {
-	BabyHistogram histogram;
-	Field field;
-	JTextField startEntry;
-	JTextField endEntry;
-	JCheckBox nullBox;
-	Runnable action;
-	SimpleDateFormat df=new SimpleDateFormat("MMM dd yyyy");
-	
-	public FilterDatePanel(final Field field, final Runnable action, final FilterControlPanel parent)
-	{
-		this.field=field;
-		this.action=action;
-		setLayout(new BorderLayout());
-		setBorder(BorderFactory.createEmptyBorder(0,5,0,5));
-		setBackground(Color.white);
-		add(new FilterTitle(field, parent, false), BorderLayout.NORTH);
-		
-		Runnable fullAction=new Runnable()
-		{
-			public void run()
-			{
-				startEntry.setText(format(histogram.getLow()));
-				endEntry.setText(format(histogram.getHigh()));
-				action.run();
-			}
-		};
-		
-		histogram=new BabyHistogram(fullAction);
-		
-		add(histogram, BorderLayout.CENTER);
-		
-		JPanel bottomStuff=new JPanel();
-		bottomStuff.setLayout(new GridLayout(2,1));
-		add(bottomStuff, BorderLayout.SOUTH);
-		
-		JPanel lowHighPanel=new JPanel();
-		bottomStuff.add(lowHighPanel);
-		lowHighPanel.setBackground(Color.white);
-		lowHighPanel.setLayout(new BorderLayout());
-		Font small=parent.getModel().getDisplay().small();
-		
-		startEntry=new JTextField(7);
-		startEntry.addActionListener(new ActionListener() {
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				setLowFromText();
-				action.run();
-			}});
-		lowHighPanel.add(startEntry, BorderLayout.WEST);
-		startEntry.setFont(small);
-		
-		JLabel rangeLabel=new JLabel("to", JLabel.CENTER);
-		rangeLabel.setForeground(Color.gray);
-		rangeLabel.setFont(small);
-		lowHighPanel.add(rangeLabel, BorderLayout.CENTER);
-		endEntry=new JTextField(7);
-		lowHighPanel.add(endEntry, BorderLayout.EAST);
-		endEntry.addActionListener(new ActionListener() {
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				setHighFromText();
-				action.run();
-			}});
-		endEntry.setFont(small);
-		
-		nullBox=new JCheckBox("Include Missing Values");
-		nullBox.addActionListener(new ActionListener() {
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				action.run();
-			}});
-		bottomStuff.add(nullBox);
-		bottomStuff.setBackground(Color.white);
-		nullBox.setBackground(Color.white);
-		nullBox.setForeground(Color.gray);
-		nullBox.setFont(small);
-		
-	}
-	
-	String format(double x)
-	{
-		Date date=new Date((long)x);
-		return df.format(date);
-	}
-	
-	void setLowFromText()
-	{
-		try
-		{
-			long low=df.parse(startEntry.getText()).getTime();
-			long high=(long)histogram.getHigh();
-			if (low>high)
-			{
-				high=low;
-				endEntry.setText(startEntry.getText());
-			}
-			histogram.setTrueRange(low,high);
-			
-		}
-		catch (Exception e)
-		{
-			
-		}
-	}
-	
-	
-	void setHighFromText()
-	{
-		try
-		{
-			long high=df.parse(endEntry.getText()).getTime();
-			double low=(long)histogram.getLow();
-			if (low>high)
-			{
-				low=high;
-				startEntry.setText(endEntry.getText());
-			}
-			histogram.setTrueRange(low,high);
-			
-		}
-		catch (Exception e)
-		{
-			
-		}		
-	}
 
-	public void setData(double[] data)
-	{
-		histogram.setData(data);
-		startEntry.setText(format(histogram.getLow()));
-		endEntry.setText(format(histogram.getHigh()));
-		repaint();
-	}
-	
-	public Dimension getPreferredSize()
-	{
-		return new Dimension(200,160);
-	}
+        BabyHistogram histogram;
+        Field field;
+        JTextField startEntry;
+        JTextField endEntry;
+        JCheckBox nullBox;
+        Runnable action;
+        SimpleDateFormat df = new SimpleDateFormat("MMM dd yyyy");
 
-	@Override
-	public ActFilter defineFilter() {
-		long low=(long)histogram.getLow();
-		long high=(long)histogram.getHigh();
-		boolean acceptNull=nullBox.isSelected();
-		return new TimeIntervalFilter(low, high, acceptNull, field);
-	}
+        public FilterDatePanel(final Field field, final Runnable action, final FilterControlPanel parent)
+        {
+                this.field = field;
+                this.action = action;
+                setLayout(new BorderLayout());
+                setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
+                setBackground(Color.white);
+                add(new FilterTitle(field, parent, false), BorderLayout.NORTH);
 
-	@Override
-	public void clearFilter() {
-		histogram.setRelRange(0, 1);
-	}
+                Runnable fullAction = new Runnable()
+                {
+
+                        public void run()
+                        {
+                                startEntry.setText(format(histogram.getLow()));
+                                endEntry.setText(format(histogram.getHigh()));
+                                action.run();
+                        }
+                };
+
+                histogram = new BabyHistogram(fullAction);
+
+                add(histogram, BorderLayout.CENTER);
+
+                JPanel bottomStuff = new JPanel();
+                bottomStuff.setLayout(new GridLayout(2, 1));
+                add(bottomStuff, BorderLayout.SOUTH);
+
+                JPanel lowHighPanel = new JPanel();
+                bottomStuff.add(lowHighPanel);
+                lowHighPanel.setBackground(Color.white);
+                lowHighPanel.setLayout(new BorderLayout());
+                Font small = parent.getModel().getDisplay().small();
+
+                startEntry = new JTextField(7);
+                startEntry.addActionListener(new ActionListener()
+                {
+
+                        @Override
+                        public void actionPerformed(ActionEvent e)
+                        {
+                                setLowFromText();
+                                action.run();
+                        }
+                });
+                lowHighPanel.add(startEntry, BorderLayout.WEST);
+                startEntry.setFont(small);
+
+                JLabel rangeLabel = new JLabel("to", JLabel.CENTER);
+                rangeLabel.setForeground(Color.gray);
+                rangeLabel.setFont(small);
+                lowHighPanel.add(rangeLabel, BorderLayout.CENTER);
+                endEntry = new JTextField(7);
+                lowHighPanel.add(endEntry, BorderLayout.EAST);
+                endEntry.addActionListener(new ActionListener()
+                {
+
+                        @Override
+                        public void actionPerformed(ActionEvent e)
+                        {
+                                setHighFromText();
+                                action.run();
+                        }
+                });
+                endEntry.setFont(small);
+
+                nullBox = new JCheckBox("Include Missing Values");
+                nullBox.addActionListener(new ActionListener()
+                {
+
+                        @Override
+                        public void actionPerformed(ActionEvent e)
+                        {
+                                action.run();
+                        }
+                });
+                bottomStuff.add(nullBox);
+                bottomStuff.setBackground(Color.white);
+                nullBox.setBackground(Color.white);
+                nullBox.setForeground(Color.gray);
+                nullBox.setFont(small);
+
+        }
+
+        String format(double x)
+        {
+                Date date = new Date((long) x);
+                return df.format(date);
+        }
+
+        void setLowFromText()
+        {
+                try
+                {
+                        long low = df.parse(startEntry.getText()).getTime();
+                        long high = (long) histogram.getHigh();
+                        if (low > high)
+                        {
+                                high = low;
+                                endEntry.setText(startEntry.getText());
+                        }
+                        histogram.setTrueRange(low, high);
+
+                } catch (Exception e)
+                {
+                }
+        }
+
+        void setHighFromText()
+        {
+                try
+                {
+                        long high = df.parse(endEntry.getText()).getTime();
+                        double low = (long) histogram.getLow();
+                        if (low > high)
+                        {
+                                low = high;
+                                startEntry.setText(endEntry.getText());
+                        }
+                        histogram.setTrueRange(low, high);
+
+                } catch (Exception e)
+                {
+                }
+        }
+
+        public void setData(double[] data)
+        {
+                histogram.setData(data);
+                startEntry.setText(format(histogram.getLow()));
+                endEntry.setText(format(histogram.getHigh()));
+                repaint();
+        }
+
+        public Dimension getPreferredSize()
+        {
+                return new Dimension(200, 160);
+        }
+
+        @Override
+        public ActFilter defineFilter()
+        {
+                long low = (long) histogram.getLow();
+                long high = (long) histogram.getHigh();
+                boolean acceptNull = nullBox.isSelected();
+                return new TimeIntervalFilter(low, high, acceptNull, field);
+        }
+
+        @Override
+        public void clearFilter()
+        {
+                histogram.setRelRange(0, 1);
+        }
 }
\ No newline at end of file
diff --git a/timeflow/app/ui/filter/SearchPanel.java b/timeflow/app/ui/filter/SearchPanel.java
index eca2702..6ce0bbe 100755
--- a/timeflow/app/ui/filter/SearchPanel.java
+++ b/timeflow/app/ui/filter/SearchPanel.java
@@ -14,7 +14,7 @@
 	JTextField entry;
     JCheckBox invert;
 	
-	public SearchPanel(TFModel model, final FilterControlPanel f) {
+	public SearchPanel(TimeflowModel model, final FilterControlPanel f) {
 		super(model);
 		setBackground(Color.white);
 		setBorder(BorderFactory.createEmptyBorder(15, 5,0,0));
diff --git a/timeflow/data/db/ActDB.java b/timeflow/data/db/ActDB.java
index 46e4bb1..dc1f552 100755
--- a/timeflow/data/db/ActDB.java
+++ b/timeflow/data/db/ActDB.java
@@ -4,13 +4,15 @@
 
 import timeflow.data.db.filter.ActFilter;
 
-public interface ActDB extends Iterable<Act> {
-	
+public interface ActDB extends Iterable<Act>
+{
+        // Source
 	public String getSource();
 	public String getDescription();
 	public void setSource(String source);
 	public void setDescription(String description);
-	
+
+        // Fields
 	public List<String> getFieldKeys();
 	public List<Field> getFields();
 	public List<Field> getFields(Class type);
@@ -21,6 +23,7 @@
 	public void setNewFieldOrder(List<Field> newOrder);
 	public void renameField(Field field, String name);
 
+        // Acts
 	public void delete(Act act);
 	public Act createAct();
 	public ActList select(ActFilter filter);
diff --git a/timeflow/data/db/Field.java b/timeflow/data/db/Field.java
index 9fac035..eaad409 100755
--- a/timeflow/data/db/Field.java
+++ b/timeflow/data/db/Field.java
@@ -1,50 +1,53 @@
 package timeflow.data.db;
 
+public class Field
+{
 
-public class Field {
-	private String name;
-	private Class type;
-	int index;
-	private int recommendedSize=-1;
-	
-	public Field(String name, Class type)
-	{
-		this.name=name;
-		this.type=type;
-	}
-	
-	public Field(String name, Class type, int recommendedSize)
-	{
-		this.name=name;
-		this.type=type;
-		this.recommendedSize=recommendedSize;
-	}
-	
-	public int getRecommendedSize() {
-		return recommendedSize;
-	}
+        private String name;
+        private Class type;
+        int index;
+        private int recommendedSize = -1;
 
-	public void setRecommendedSize(int recommendedSize) {
-		this.recommendedSize = recommendedSize;
-	}
-	
-	void setName(String name)
-	{
-		this.name=name;
-	}
+        public Field(String name, Class type)
+        {
+                this.name = name;
+                this.type = type;
+        }
 
-	public String getName()
-	{
-		return name;
-	}
-	
-	public Class getType()
-	{
-		return type;
-	}
+        public Field(String name, Class type, int recommendedSize)
+        {
+                this.name = name;
+                this.type = type;
+                this.recommendedSize = recommendedSize;
+        }
 
-	public String toString()
-	{
-		return "[Field: name='"+name+"', type="+type+", index="+index+"]";
-	}
+        public int getRecommendedSize()
+        {
+                return recommendedSize;
+        }
+
+        public void setRecommendedSize(int recommendedSize)
+        {
+                this.recommendedSize = recommendedSize;
+        }
+
+        void setName(String name)
+        {
+                this.name = name;
+        }
+
+        public String getName()
+        {
+                return name;
+        }
+
+        public Class getType()
+        {
+                return type;
+        }
+
+        public String toString()
+        {
+                return "[Field: name='" + name + "', type=" + type + ", index=" + index + "]";
+        }
 }
diff --git a/timeflow/data/time/RoughTime.java b/timeflow/data/time/RoughTime.java
index 55b4bbb..85403f3 100755
--- a/timeflow/data/time/RoughTime.java
+++ b/timeflow/data/time/RoughTime.java
@@ -3,127 +3,141 @@
 import java.util.Calendar;
 import java.util.Date;
 
-public class RoughTime implements Comparable {
+public class RoughTime implements Comparable
+{
 
-	public static final long UNKNOWN=Long.MIN_VALUE;
-	private TimeUnit units;
-	private long time;
-		
-	public RoughTime(TimeUnit units)
-	{
-		time=UNKNOWN;
-		this.units=units;
-	}
-	
-	public RoughTime(long time, TimeUnit units)
-	{
-		this.time=time;
-		this.units=units;
-	}
-	
-	public boolean isDefined()
-	{
-		return time!=UNKNOWN;
-	}
-	
-	public long getTime()
-	{
-		return time;
-	}
-	
-	public void setTime(long time)
-	{
-		this.time=time;
-	}
-	
-	public Date toDate()
-	{
-		return new Date(time);
-	}
-	
-	public boolean after(RoughTime t)
-	{
-		return t.time<time;
-	}
-	
-	public boolean before(RoughTime t)
-	{
-		return t.time>time;
-	}
-	
-	public RoughTime plus(int numUnits)
-	{
-		return plus(units, numUnits);
-	}
-	
-	public RoughTime plus(TimeUnit unit, int times)
-	{
-		RoughTime r=copy();
-		unit.addTo(r,times);
-		return r;
-	}
-	
-	public String toString()
-	{
-		if (isKnown())
-			return new Date(time).toString();
-		return "unknown";
-	}
-	
-	public boolean isKnown()
-	{
-		return time!=UNKNOWN;
-	}
-	
-	public boolean equals(Object o)
-	{
-		if (!(o instanceof RoughTime))
-			return false;
-		RoughTime t=(RoughTime)o;
-		return t.units==units  && t.time==time;
-	}
-	
-	public RoughTime copy()
-	{
-		RoughTime t=new RoughTime(time, units);
-		return t;
-	}
-	
-	public void setUnits(TimeUnit units)
-	{
-		this.units=units;
-	}
+        public static final long UNKNOWN = Long.MIN_VALUE;
+        private TimeUnit units;
+        private long time;
 
-	public TimeUnit getUnits() {
-		return units;
-	}
-	
-	public String format()
-	{
-		//return units.formatFull(time);
-		return TimeUnit.SECOND.formatFull(time);
-	}
-	
-	public static int compare(RoughTime t1, RoughTime t2)
-	{
-		if (t1==t2)
-			return 0;
-		if (t1==null)
-			return -1;
-		if (t2==null)
-			return 1;
-		long dt= t1.time-t2.time;
-		if (dt==0)
-			return 0;
-		if (dt>0)
-			return 1;
-		return -1;
-	}
+//	public RoughTime(TimeUnit units)
+//	{
+//		time=UNKNOWN;
+//		this.units=units;
+//	}
+        public RoughTime(long time, TimeUnit units)
+        {
+                this.time = time;
+                this.units = units;
+        }
 
-	@Override
-	public int compareTo(Object o) {
-		return compare(this, (RoughTime)o);
-	}
+        public boolean isDefined()
+        {
+                return time != UNKNOWN;
+        }
 
+        public long getTime()
+        {
+                return time;
+        }
 
+        public void setTime(long time)
+        {
+                this.time = time;
+        }
+
+        public Date toDate()
+        {
+                return new Date(time);
+        }
+
+        public boolean after(RoughTime t)
+        {
+                return t.time < time;
+        }
+
+        public boolean before(RoughTime t)
+        {
+                return t.time > time;
+        }
+
+        public RoughTime plus(int numUnits)
+        {
+                return plus(units, numUnits);
+        }
+
+        public RoughTime plus(TimeUnit unit, int times)
+        {
+                RoughTime r = copy();
+                unit.addTo(r, times);
+                return r;
+        }
+
+        public String toString()
+        {
+                if (isKnown())
+                {
+                        return new Date(time).toString();
+                }
+                return "unknown";
+        }
+
+        public boolean isKnown()
+        {
+                return time != UNKNOWN;
+        }
+
+        public boolean equals(Object o)
+        {
+                if (!(o instanceof RoughTime))
+                {
+                        return false;
+                }
+                RoughTime t = (RoughTime) o;
+                return t.units == units && t.time == time;
+        }
+
+        public RoughTime copy()
+        {
+                RoughTime t = new RoughTime(time, units);
+                return t;
+        }
+
+        public void setUnits(TimeUnit units)
+        {
+                this.units = units;
+        }
+
+        public TimeUnit getUnits()
+        {
+                return units;
+        }
+
+        public String format()
+        {
+                //return units.formatFull(time);
+                return TimeUnit.SECOND.formatFull(time);
+        }
+
+        public static int compare(RoughTime t1, RoughTime t2)
+        {
+                if (t1 == t2)
+                {
+                        return 0;
+                }
+                if (t1 == null)
+                {
+                        return -1;
+                }
+                if (t2 == null)
+                {
+                        return 1;
+                }
+                long dt = t1.time - t2.time;
+                if (dt == 0)
+                {
+                        return 0;
+                }
+                if (dt > 0)
+                {
+                        return 1;
+                }
+                return -1;
+        }
+
+        @Override
+        public int compareTo(Object o)
+        {
+                return compare(this, (RoughTime) o);
+        }
 }
diff --git a/timeflow/data/time/TimeUnit.java b/timeflow/data/time/TimeUnit.java
index 4032258..bbba6e1 100755
--- a/timeflow/data/time/TimeUnit.java
+++ b/timeflow/data/time/TimeUnit.java
@@ -5,15 +5,16 @@
 
 public class TimeUnit
 {
-
         public static final TimeUnit YEAR = new TimeUnit("Years", Calendar.YEAR, 365 * 24 * 60 * 60 * 1000L, "yyyy", "yyyy");
         public static final TimeUnit MONTH = new TimeUnit("Months", Calendar.MONTH, 30 * 24 * 60 * 60 * 1000L, "MMM", "MMM yyyy");
         public static final TimeUnit WEEK = new TimeUnit("Weeks", Calendar.WEEK_OF_YEAR, 7 * 24 * 60 * 60 * 1000L, "d", "MMM d yyyy");
         public static final TimeUnit DAY = new TimeUnit("Days", Calendar.DAY_OF_MONTH, 24 * 60 * 60 * 1000L, "d", "MMM d yyyy");
         public static final TimeUnit DAY_OF_WEEK = new TimeUnit("Days", Calendar.DAY_OF_WEEK, 24 * 60 * 60 * 1000L, "d", "MMM d yyyy");
-        public static final TimeUnit HOUR = new TimeUnit("Hours", Calendar.HOUR_OF_DAY, 60 * 60 * 1000L, "kk:mm", "MMM d yyyy kk:mm");
-        public static final TimeUnit MINUTE = new TimeUnit("Minutes", Calendar.MINUTE, 60 * 1000L, ":mm", "MMM d yyyy kk:mm");
-        public static final TimeUnit SECOND = new TimeUnit("Seconds", Calendar.SECOND, 1000L, ":ss", "MMM d yyyy kk:mm:ss");
+        public static final TimeUnit HOUR = new TimeUnit("Hours", Calendar.HOUR_OF_DAY, 60 * 60 * 1000L, "HH:mm", "MMM d yyyy HH:mm");
+        public static final TimeUnit MINUTE = new TimeUnit("Minutes", Calendar.MINUTE, 60 * 1000L, ":mm", "MMM d yyyy HH:mm");
+        public static final TimeUnit SECOND = new TimeUnit("Seconds", Calendar.SECOND, 1000L, ":ss", "MMM d yyyy HH:mm:ss");
+        public static final TimeUnit REALTIME = new TimeUnit("Realtime", Calendar.MILLISECOND, 8L, ":SSS", "MMM d yyyy HH:mm:ss:SSS");
+        
         public static final TimeUnit DECADE = multipleYears(10);
         public static final TimeUnit CENTURY = multipleYears(100);
         private static final double DAY_SIZE = 24 * 60 * 60 * 1000L;
diff --git a/timeflow/format/field/FieldFormat.java b/timeflow/format/field/FieldFormat.java
index a8c7223..a899ab0 100755
--- a/timeflow/format/field/FieldFormat.java
+++ b/timeflow/format/field/FieldFormat.java
@@ -4,61 +4,65 @@
 
 import timeflow.data.time.*;
 
-public abstract class FieldFormat {	
-	protected String lastInput;
-	protected Object lastValue;
-	protected boolean understood=true;
-	
-	double value;
-	
-	void add(double x)
-	{
-		value+=x;
-	}
-	
-	void note(String s)
-	{
-		add(scoreFormatMatch(s));
-	}
+public abstract class FieldFormat
+{
+        protected String lastInput;
+        protected Object lastValue;
+        protected boolean understood = true;
+        double value;
 
-	
-	protected abstract Object _parse(String s) throws Exception;
-	public abstract String format(Object o);
-	public abstract Class getType();
-	public abstract double scoreFormatMatch(String s);
-	public abstract String getHumanName();
+        void add(double x)
+        {
+                value += x;
+        }
 
+        void note(String s)
+        {
+                add(scoreFormatMatch(s));
+        }
 
-	public void setValue(Object o)
-	{
-		lastValue=o;
-		lastInput=o==null ? "" : format(o);
-	}
-	
-	public Object parse(String s) throws Exception
-	{
-		lastInput=s;
-		lastValue=null;
-		understood=false;
-		lastValue=_parse(s);
-		understood=true;
-		return lastValue;
-	}
-	
-	public Object getLastValue()
-	{
-		return lastValue;
-	}
-	
-	public String feedback() 
-	{
-		if (!understood)
-			return "Couldn't understand";
-		return lastValue==null ? "(missing)" : "Read: "+format(lastValue);
-	}
-	
-	public boolean isUnderstood()
-	{
-		return understood;
-	}
+        protected abstract Object _parse(String s) throws Exception;
+
+        public abstract String format(Object o);
+
+        public abstract Class getType();
+
+        public abstract double scoreFormatMatch(String s);
+
+        public abstract String getHumanName();
+
+        public void setValue(Object o)
+        {
+                lastValue = o;
+                lastInput = o == null ? "" : format(o);
+        }
+
+        public Object parse(String s) throws Exception
+        {
+                lastInput = s;
+                lastValue = null;
+                understood = false;
+                lastValue = _parse(s);
+                understood = true;
+                return lastValue;
+        }
+
+        public Object getLastValue()
+        {
+                return lastValue;
+        }
+
+        public String feedback()
+        {
+                if (!understood)
+                {
+                        return "Couldn't understand";
+                }
+                return lastValue == null ? "(missing)" : "Read: " + format(lastValue);
+        }
+
+        public boolean isUnderstood()
+        {
+                return understood;
+        }
 }
diff --git a/timeflow/format/file/Export.java b/timeflow/format/file/Export.java
index 24361e8..f0a6e86 100755
--- a/timeflow/format/file/Export.java
+++ b/timeflow/format/file/Export.java
@@ -6,5 +6,5 @@
 
 public interface Export {
 	public String getName();
-	public void export(TFModel model, BufferedWriter out) throws Exception;
+	public void export(TimeflowModel model, BufferedWriter out) throws Exception;
 }
diff --git a/timeflow/format/file/HtmlFormat.java b/timeflow/format/file/HtmlFormat.java
index 3792f28..b431001 100755
--- a/timeflow/format/file/HtmlFormat.java
+++ b/timeflow/format/file/HtmlFormat.java
@@ -9,7 +9,7 @@
 
 public class HtmlFormat implements Export
 {
-        TFModel model;
+        TimeflowModel model;
         java.util.List<Field> fields;
         Field title;
 
@@ -17,12 +17,12 @@
         {
         }
 
-        public HtmlFormat(TFModel model)
+        public HtmlFormat(TimeflowModel model)
         {
                 setModel(model);
         }
 
-        public void setModel(TFModel model)
+        public void setModel(TimeflowModel model)
         {
                 this.model = model;
                 fields = model.getDB().getFields();
@@ -30,7 +30,7 @@
         }
 
         @Override
-        public void export(TFModel model, BufferedWriter out) throws Exception
+        public void export(TimeflowModel model, BufferedWriter out) throws Exception
         {
                 setModel(model);
                 out.write(makeHeader());
diff --git a/timeflow/format/file/TimeflowFormat.java b/timeflow/format/file/TimeflowFormat.java
index 3778235..50310d0 100755
--- a/timeflow/format/file/TimeflowFormat.java
+++ b/timeflow/format/file/TimeflowFormat.java
@@ -13,151 +13,168 @@
 
 public class TimeflowFormat implements Import, Export
 {
-	private static final String END_OF_SCHEMA="#TIMEFLOW\tend-metadata";
-	private static final String END_OF_METADATA="#TIMEFLOW\t====== End of Header. Data below is in tab-delimited format. =====";
-	public ActDB readFile(String fileName, PrintStream messages) throws Exception
-	{
-		return read(new File(fileName), messages);
-	}
-	
-	public static ActDB read(File file, PrintStream out) throws Exception
-	{
-		String text=IO.read(file.getAbsolutePath());		
-		DelimitedText quote=new DelimitedText('\t');
-		Iterator<String[]> lines=quote.read(text).iterator();
-		
 
-		ActDB db=null;
-		List<String> fieldNames=new ArrayList<String>();
-		List<Class> fieldTypes=new ArrayList<Class>();
-		List<Integer> fieldSizes=new ArrayList<Integer>();
-		String source="[unknown]", description="";
-		for (;;)
-		{
-			String[] t=lines.next();
+        private static final String END_OF_SCHEMA = "#TIMEFLOW\tend-metadata";
+        private static final String END_OF_METADATA = "#TIMEFLOW\t====== End of Header. Data below is in tab-delimited format. =====";
 
-			if (t[1].equals("field"))
-			{
-				fieldNames.add(t[2]);
-				fieldTypes.add(FieldFormatCatalog.javaClass(t[3]));
-				if (t.length>4)
-				{
-					fieldSizes.add(Integer.parseInt(t[4]));
-				}
-				else
-					fieldSizes.add(-1);
-			}
-			else if (t[1].equals("source"))
-			{
-				source=t[2];
-			}
-			else if (t[1].equals("description"))
-			{
-				description=t[2];
-				
-			}
-			else if (t[1].equals("end-metadata"))
-				break;
-		}
-		db=new ArrayDB((String[])fieldNames.toArray(new String[0]), 
-				         (Class[])fieldTypes.toArray(new Class[0]), source);
-		db.setDescription(description);
-		for (int i=0; i<fieldNames.size(); i++)
-			if (fieldSizes.get(i)>0)
-				db.getField(fieldNames.get(i)).setRecommendedSize(fieldSizes.get(i));
-		for (;;)
-		{
-			String[] t=lines.next();
-			if (t[1].startsWith("==="))
-				break;		
-			if (t[1].equals("alias"))
-				db.setAlias(db.getField(t[3]), t[2]);
-		}
-		
-		// note: in some cases headers may be in a different order than in
-		// metadata section, so we will read these.
-		String[] headers=lines.next();
-		if (headers.length!=fieldNames.size())
-			throw new IllegalArgumentException("Different number of headers than fields!");
-		
-		
-		while (lines.hasNext())
-		{
-			String[] t=lines.next();
-			Act a=db.createAct();
-			for (int i=0; i<t.length; i++)
-			{
-				Field f=db.getField(headers[i]);
-				FieldFormat format=FieldFormatCatalog.getFormat(f.getType());
-				a.set(f, format.parse(t[i]));
-			}
-		}
-		
-		return db;
-	}
-	
-	public static void write(ActList acts, BufferedWriter bw) throws IOException
-	{
-		ActDB db=acts.getDB();
-		
-		PrintWriter out=new PrintWriter(bw);
-		
-		DelimitedText tab=new DelimitedText('\t');
-		
-		// Write version
-		out.println("#TIMEFLOW\tformat version\t1");
-		
-		// Write source of data.
-		out.println("#TIMEFLOW\tsource\t"+tab.write(db.getSource()));
-		
-		// Write description of data.
-		out.println("#TIMEFLOW\tdescription\t"+tab.write(db.getDescription()));
-		
-		// Write schema.
-		List<Field> fields=db.getFields();
-		for (Field f: fields)
-		{
-			String recSize=f.getRecommendedSize()<=0 ? "" : "\t"+f.getRecommendedSize();
-			out.println("#TIMEFLOW\tfield\t"+tab.write(f.getName())+
-					    "\t"+FieldFormatCatalog.humanName(f.getType())+recSize);
-		}
-		
-		out.println(END_OF_SCHEMA);
-		
-		// Write column mappings.
-		List<String> aliases=DBUtils.getFieldAliases(db);
-		for (String a:aliases)
-			out.println("#TIMEFLOW\talias\t"+a+"\t"+tab.write(db.getField(a).getName()));
-		
-		// Write end of header indicator
-		out.println(END_OF_METADATA);
-		
-		// Write data!
-		new DelimitedFormat('\t').writeDelimited(db, acts, out);
-		
-		out.flush();
-		out.close();
-	}
-	
-	public static void main(String[] args) throws Exception
-	{
-		System.out.println("Reading");
-		ActDB db=read(new File("test/monet.txt"), System.out);
-		System.out.println("# lines: "+db.size());
-	}
+        public ActDB readFile(String fileName, PrintStream messages) throws Exception
+        {
+                return read(new File(fileName), messages);
+        }
 
-	@Override
-	public String getName() {
-		return "TimeFlow Format";
-	}
+        public static ActDB read(File file, PrintStream out) throws Exception
+        {
+                String text = IO.read(file.getAbsolutePath());
+                DelimitedText quote = new DelimitedText('\t');
+                Iterator<String[]> lines = quote.read(text).iterator();
 
-	@Override
-	public ActDB importFile(File file) throws Exception {
-		return read(file, System.out);
-	}
 
-	@Override
-	public void export(TFModel model, BufferedWriter out) throws Exception {
-		write(model.getDB().all(), out);
-	}
+                ActDB db = null;
+                List<String> fieldNames = new ArrayList<String>();
+                List<Class> fieldTypes = new ArrayList<Class>();
+                List<Integer> fieldSizes = new ArrayList<Integer>();
+                String source = "[unknown]", description = "";
+                for (;;)
+                {
+                        String[] t = lines.next();
+
+                        if (t[1].equals("field"))
+                        {
+                                fieldNames.add(t[2]);
+                                fieldTypes.add(FieldFormatCatalog.javaClass(t[3]));
+                                if (t.length > 4)
+                                {
+                                        fieldSizes.add(Integer.parseInt(t[4]));
+                                } else
+                                {
+                                        fieldSizes.add(-1);
+                                }
+                        } else if (t[1].equals("source"))
+                        {
+                                source = t[2];
+                        } else if (t[1].equals("description"))
+                        {
+                                description = t[2];
+
+                        } else if (t[1].equals("end-metadata"))
+                        {
+                                break;
+                        }
+                }
+                db = new ArrayDB((String[]) fieldNames.toArray(new String[0]),
+                        (Class[]) fieldTypes.toArray(new Class[0]), source);
+                db.setDescription(description);
+                for (int i = 0; i < fieldNames.size(); i++)
+                {
+                        if (fieldSizes.get(i) > 0)
+                        {
+                                db.getField(fieldNames.get(i)).setRecommendedSize(fieldSizes.get(i));
+                        }
+                }
+                for (;;)
+                {
+                        String[] t = lines.next();
+                        if (t[1].startsWith("==="))
+                        {
+                                break;
+                        }
+                        if (t[1].equals("alias"))
+                        {
+                                db.setAlias(db.getField(t[3]), t[2]);
+                        }
+                }
+
+                // note: in some cases headers may be in a different order than in
+                // metadata section, so we will read these.
+                String[] headers = lines.next();
+                if (headers.length != fieldNames.size())
+                {
+                        throw new IllegalArgumentException("Different number of headers than fields!");
+                }
+
+
+                while (lines.hasNext())
+                {
+                        String[] t = lines.next();
+                        Act a = db.createAct();
+                        for (int i = 0; i < t.length; i++)
+                        {
+                                Field f = db.getField(headers[i]);
+                                FieldFormat format = FieldFormatCatalog.getFormat(f.getType());
+                                a.set(f, format.parse(t[i]));
+                        }
+                }
+
+                return db;
+        }
+
+        public static void write(ActList acts, BufferedWriter bw) throws IOException
+        {
+                ActDB db = acts.getDB();
+
+                PrintWriter out = new PrintWriter(bw);
+
+                DelimitedText tab = new DelimitedText('\t');
+
+                // Write version
+                out.println("#TIMEFLOW\tformat version\t1");
+
+                // Write source of data.
+                out.println("#TIMEFLOW\tsource\t" + tab.write(db.getSource()));
+
+                // Write description of data.
+                out.println("#TIMEFLOW\tdescription\t" + tab.write(db.getDescription()));
+
+                // Write schema.
+                List<Field> fields = db.getFields();
+                for (Field f : fields)
+                {
+                        String recSize = f.getRecommendedSize() <= 0 ? "" : "\t" + f.getRecommendedSize();
+                        out.println("#TIMEFLOW\tfield\t" + tab.write(f.getName())
+                                + "\t" + FieldFormatCatalog.humanName(f.getType()) + recSize);
+                }
+
+                out.println(END_OF_SCHEMA);
+
+                // Write column mappings.
+                List<String> aliases = DBUtils.getFieldAliases(db);
+                for (String a : aliases)
+                {
+                        out.println("#TIMEFLOW\talias\t" + a + "\t" + tab.write(db.getField(a).getName()));
+                }
+
+                // Write end of header indicator
+                out.println(END_OF_METADATA);
+
+                // Write data!
+                new DelimitedFormat('\t').writeDelimited(db, acts, out);
+
+                out.flush();
+                out.close();
+        }
+
+        public static void main(String[] args) throws Exception
+        {
+                System.out.println("Reading");
+                ActDB db = read(new File("test/monet.txt"), System.out);
+                System.out.println("# lines: " + db.size());
+        }
+
+        @Override
+        public String getName()
+        {
+                return "TimeFlow Format";
+        }
+
+        @Override
+        public ActDB importFile(File file) throws Exception
+        {
+                return read(file, System.out);
+        }
+
+        @Override
+        public void export(TimeflowModel model, BufferedWriter out) throws Exception
+        {
+                write(model.getDB().all(), out);
+        }
 }
diff --git a/timeflow/model/Display.java b/timeflow/model/Display.java
index b56c86b..47c3481 100755
--- a/timeflow/model/Display.java
+++ b/timeflow/model/Display.java
@@ -360,7 +360,7 @@
                 return lines;
         }
 
-        public boolean emptyMessage(Graphics g, TFModel model)
+        public boolean emptyMessage(Graphics g, TimeflowModel model)
         {
                 if (model.getActs() == null || model.getActs().size() == 0)
                 {
diff --git a/timeflow/model/ModelPanel.java b/timeflow/model/ModelPanel.java
index 4326f4e..f538e18 100755
--- a/timeflow/model/ModelPanel.java
+++ b/timeflow/model/ModelPanel.java
@@ -4,9 +4,9 @@
 
 public abstract class ModelPanel extends JPanel implements TFListener {
 	
-	TFModel model;
+	TimeflowModel model;
 	
-	public ModelPanel(TFModel model)
+	public ModelPanel(TimeflowModel model)
 	{
 		this.model=model;
 	}
@@ -26,7 +26,7 @@
 		model.removeListener(this);
 	}
 	
-	public TFModel getModel()
+	public TimeflowModel getModel()
 	{
 		return model;
 	}
diff --git a/timeflow/model/TFListener.java b/timeflow/model/TFListener.java
index 3268d05..6f2468d 100755
--- a/timeflow/model/TFListener.java
+++ b/timeflow/model/TFListener.java
@@ -1,5 +1,6 @@
 package timeflow.model;
 
-public interface TFListener {
-	public void note(TFEvent e);
+public interface TFListener
+{
+        public void note(TFEvent e);
 }
diff --git a/timeflow/model/TFModel.java b/timeflow/model/TimeflowModel.java
similarity index 99%
rename from timeflow/model/TFModel.java
rename to timeflow/model/TimeflowModel.java
index f4e30e4..eba0c1b 100755
--- a/timeflow/model/TFModel.java
+++ b/timeflow/model/TimeflowModel.java
@@ -10,9 +10,8 @@
 // encapsulates all properties of a timeline model:
 // data, display properties, etc.
 // also does listening, etc.
-public class TFModel
+public class TimeflowModel
 {
-
         private ActDB db;
         private ActList acts;
         private ActFilter filter = new ConstFilter(true);
diff --git a/timeflow/views/AbstractView.java b/timeflow/views/AbstractView.java
index a56a933..566a5a3 100755
--- a/timeflow/views/AbstractView.java
+++ b/timeflow/views/AbstractView.java
@@ -15,7 +15,7 @@
         JPanel panel;
         ActDB lastDrawn, lastNotified;
 
-        public AbstractView(TFModel model)
+        public AbstractView(TimeflowModel model)
         {
                 super(model);
         }
@@ -45,7 +45,7 @@
                 };
                 controlLabel.setBackground(Color.lightGray);
                 controlLabel.setForeground(Color.darkGray);
-                panel.add(controlLabel, BorderLayout.NORTH);
+                //panel.add(controlLabel, BorderLayout.NORTH);
 
                 return panel;
         }
diff --git a/timeflow/views/AbstractVisualizationView.java b/timeflow/views/AbstractVisualizationView.java
index 349ee29..9450b2b 100755
--- a/timeflow/views/AbstractVisualizationView.java
+++ b/timeflow/views/AbstractVisualizationView.java
@@ -22,12 +22,12 @@
         Point mouse = new Point(-10000, 0), firstMouse = new Point();
         boolean mouseIsDown;
         ArrayList<Mouseover> objectLocations = new ArrayList<Mouseover>();
-        TFModel model;
+        TimeflowModel model;
         Act selectedAct;
         RoughTime selectedTime;
         Set<JMenuItem> urlItems = new HashSet<JMenuItem>();
 
-        public AbstractVisualizationView(TFModel model)
+        public AbstractVisualizationView(TimeflowModel model)
         {
                 this.model = model;
 
@@ -176,7 +176,7 @@
                 return null;
         }
 
-        public TFModel getModel()
+        public TimeflowModel getModel()
         {
                 return model;
         }
diff --git a/timeflow/views/BarGraphView.java b/timeflow/views/BarGraphView.java
index a55ad05..07e1459 100755
--- a/timeflow/views/BarGraphView.java
+++ b/timeflow/views/BarGraphView.java
@@ -28,7 +28,7 @@
         Aggregate agg;
         JComboBox splitFieldChoice, numFieldChoice;
 
-        public BarGraphView(TFModel model)
+        public BarGraphView(TimeflowModel model)
         {
                 super(model);
 
@@ -55,7 +55,7 @@
                 int ch = 25, pad = 5, cw = 160;
 
                 controls.removeAll();
-                TFModel model = getModel();
+                TimeflowModel model = getModel();
                 if (model.getDB() == null || model.getDB().size() == 0)
                 {
                         JLabel empty = new JLabel("Empty database");
@@ -267,7 +267,7 @@
                         int w = getSize().width, h = getSize().height;
                         g.setColor(Color.white);
                         g.fillRect(0, 0, w, h);
-                        TFModel model = getModel();
+                        TimeflowModel model = getModel();
                         Display display = model.getDisplay();
 
                         if (display.emptyMessage(g, model))
diff --git a/timeflow/views/CalendarView.java b/timeflow/views/CalendarView.java
index 354b939..d0fcda9 100755
--- a/timeflow/views/CalendarView.java
+++ b/timeflow/views/CalendarView.java
@@ -32,7 +32,7 @@
 		return controls;
 	}
 	
-	public CalendarView(TFModel model)
+	public CalendarView(TimeflowModel model)
 	{
 		super(model);
 		calendarPanel=new CalendarPanel(model);
@@ -276,7 +276,7 @@
 	class CalendarPanel extends AbstractVisualizationView
 	{		
 
-		CalendarPanel(TFModel model)
+		CalendarPanel(TimeflowModel model)
 		{
 			super(model);
 			setBackground(Color.white);
diff --git a/timeflow/views/DescriptionView.java b/timeflow/views/DescriptionView.java
index 45d66c7..dfd5fb6 100755
--- a/timeflow/views/DescriptionView.java
+++ b/timeflow/views/DescriptionView.java
@@ -14,7 +14,7 @@
 	JTextArea content;
 	JComponent controls;
 	
-	public DescriptionView(TFModel model) {
+	public DescriptionView(TimeflowModel model) {
 		super(model);
 		setLayout(new BorderLayout());
 		JPanel left=new Pad(5,5);
diff --git a/timeflow/views/IntroView.java b/timeflow/views/IntroView.java
index 8540401..e049ed8 100755
--- a/timeflow/views/IntroView.java
+++ b/timeflow/views/IntroView.java
@@ -34,7 +34,7 @@
         Image image;
         Image repeat;
 
-        public IntroView(TFModel model)
+        public IntroView(TimeflowModel model)
         {
                 super(model);
                 setBackground(Color.white);
diff --git a/timeflow/views/ListView.java b/timeflow/views/ListView.java
index 1302bfa..37fbe11 100755
--- a/timeflow/views/ListView.java
+++ b/timeflow/views/ListView.java
@@ -35,7 +35,7 @@
         private boolean changing = false;
         private JPanel controls;
 
-        public ListView(TFModel model)
+        public ListView(TimeflowModel model)
         {
                 super(model);
 
diff --git a/timeflow/views/SummaryView.java b/timeflow/views/SummaryView.java
index ba198d6..aac546c 100755
--- a/timeflow/views/SummaryView.java
+++ b/timeflow/views/SummaryView.java
@@ -27,7 +27,7 @@
         private Interval range;
         private JComponent controls;
 
-        public SummaryView(TFModel model)
+        public SummaryView(TimeflowModel model)
         {
                 super(model);
                 analysisDisplay = HtmlDisplay.create();
diff --git a/timeflow/views/TableView.java b/timeflow/views/TableView.java
index 4ce1ff1..0fa9313 100755
--- a/timeflow/views/TableView.java
+++ b/timeflow/views/TableView.java
@@ -23,7 +23,7 @@
 	private boolean editable=true;
 	private JPanel controls;
 	
-	public TableView(TFModel model)
+	public TableView(TimeflowModel model)
 	{
 		super(model);
 		
diff --git a/timeflow/views/TimelineView.java b/timeflow/views/TimelineView.java
index 06190c6..2e22fb6 100755
--- a/timeflow/views/TimelineView.java
+++ b/timeflow/views/TimelineView.java
@@ -37,7 +37,7 @@
                 return controls;
         }
 
-        public TimelineView(TFModel model)
+        public TimelineView(TimeflowModel model)
         {
                 super(model);
                 visuals = new TimelineVisuals(model);
@@ -65,7 +65,7 @@
                 bottom.add(slider, BorderLayout.CENTER);
 
                 controls = new JPanel();
-                controls.setBackground(Color.white);
+                controls.setBackground(Color.red);
                 controls.setLayout(new BorderLayout());//new GridLayout(2,1));
 
                 // top part of grid: zoom buttons.
@@ -123,7 +123,7 @@
                 moveTime(visuals.getFitToVisibleRange());
                 }});
                  */
-                controls.add(buttons, BorderLayout.NORTH);
+                controls.add(buttons, BorderLayout.SOUTH);
 
                 // ok, now do second part of grid: layout style buttons.
                 ComponentCluster layoutPanel = new ComponentCluster("Layout");
@@ -151,7 +151,7 @@
                 graph.addActionListener(new LayoutSetter(TimelineVisuals.Layout.GRAPH));
                 layoutGroup.add(graph);
 
-                controls.add(layoutPanel, BorderLayout.CENTER);
+                //controls.add(layoutPanel, BorderLayout.CENTER);
         }
 
         class LayoutSetter implements ActionListener
@@ -325,7 +325,7 @@
 
         class TimelinePanel extends AbstractVisualizationView
         {
-                public TimelinePanel(TFModel model)
+                public TimelinePanel(TimeflowModel model)
                 {
                         super(model);
                         
diff --git a/timeflow/vis/VisualActFactory.java b/timeflow/vis/VisualActFactory.java
index bd267b6..919a766 100755
--- a/timeflow/vis/VisualActFactory.java
+++ b/timeflow/vis/VisualActFactory.java
@@ -10,7 +10,7 @@
 import timeflow.data.db.ActDB;
 import timeflow.data.db.ActList;
 import timeflow.data.db.Field;
-import timeflow.model.TFModel;
+import timeflow.model.TimeflowModel;
 import timeflow.model.VirtualField;
 
 public class VisualActFactory
@@ -60,7 +60,7 @@
                 return list;
         }
 
-        public static Collection<VisualAct> makeEmFit(TFModel model, ArrayList<VisualAct> vacts, Rectangle bounds)
+        public static Collection<VisualAct> makeEmFit(TimeflowModel model, ArrayList<VisualAct> vacts, Rectangle bounds)
         {
                 // Does everything fit? Because, if so, we're already good to go.
                 int area = bounds.width * bounds.height;
diff --git a/timeflow/vis/VisualEncoder.java b/timeflow/vis/VisualEncoder.java
index 9deee56..2dc61c2 100755
--- a/timeflow/vis/VisualEncoder.java
+++ b/timeflow/vis/VisualEncoder.java
@@ -9,11 +9,11 @@
 public class VisualEncoder
 {
 
-        private TFModel model;
+        private TimeflowModel model;
         private java.util.List<VisualAct> visualActs = new ArrayList<VisualAct>();
         private double maxSize = 0;
 
-        public VisualEncoder(TFModel model)
+        public VisualEncoder(TimeflowModel model)
         {
                 this.model = model;
         }
diff --git a/timeflow/vis/calendar/CalendarVisuals.java b/timeflow/vis/calendar/CalendarVisuals.java
index d37f51c..5f3783e 100755
--- a/timeflow/vis/calendar/CalendarVisuals.java
+++ b/timeflow/vis/calendar/CalendarVisuals.java
@@ -11,7 +11,7 @@
 
 public class CalendarVisuals {
 	VisualEncoder encoder;
-	TFModel model;
+	TimeflowModel model;
 	Rectangle bounds=new Rectangle();
 	public Grid grid;
 	
@@ -24,7 +24,7 @@
 	public enum FitStyle {LOOSE, TIGHT};
 	FitStyle fitStyle=FitStyle.LOOSE;
 	
-	public CalendarVisuals(TFModel model)
+	public CalendarVisuals(TimeflowModel model)
 	{
 		this.model=model;
 		encoder=new VisualEncoder(model);
diff --git a/timeflow/vis/timeline/AxisRenderer.java b/timeflow/vis/timeline/AxisRenderer.java
index 9e69341..68bc5fe 100755
--- a/timeflow/vis/timeline/AxisRenderer.java
+++ b/timeflow/vis/timeline/AxisRenderer.java
@@ -20,7 +20,7 @@
 
         public void render(Graphics2D g, Collection<Mouseover> objectLocations)
         {
-                TFModel model = visuals.getModel();
+                TimeflowModel model = visuals.getModel();
                 g.setColor(model.getDisplay().getColor("chart.background"));
                 Rectangle bounds = visuals.getBounds();
 
@@ -41,7 +41,7 @@
 
         void render(AxisTicMarks t, Graphics2D g, int x, int y, int h, int top, boolean full, Collection<Mouseover> objectLocations)
         {
-                TFModel model = visuals.getModel();
+                TimeflowModel model = visuals.getModel();
 
                 int n = t.tics.size();
                 for (int i = 0; i < n - 1; i++)
diff --git a/timeflow/vis/timeline/TimelineRenderer.java b/timeflow/vis/timeline/TimelineRenderer.java
index 4c115a5..1c5aa54 100755
--- a/timeflow/vis/timeline/TimelineRenderer.java
+++ b/timeflow/vis/timeline/TimelineRenderer.java
@@ -36,7 +36,7 @@
                 g.setTransform(AffineTransform.getTranslateInstance(0, -dy));
 
                 g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-                TFModel model = visuals.getModel();
+                TimeflowModel model = visuals.getModel();
                 Display display = model.getDisplay();
                 ActDB db = model.getDB();
 
diff --git a/timeflow/vis/timeline/TimelineVisuals.java b/timeflow/vis/timeline/TimelineVisuals.java
index 4e54d8a..f19c09d 100755
--- a/timeflow/vis/timeline/TimelineVisuals.java
+++ b/timeflow/vis/timeline/TimelineVisuals.java
@@ -28,12 +28,12 @@
         
         public enum Layout
         {
-
                 TIGHT, LOOSE, GRAPH
         };
+        
         private Layout layoutStyle = Layout.TIGHT;
         private VisualEncoder encoder;
-        private TFModel model;
+        private TimeflowModel model;
         private int fullHeight;
 
         public int getFullHeight()
@@ -41,7 +41,7 @@
                 return fullHeight;
         }
 
-        public TimelineVisuals(TFModel model)
+        public TimelineVisuals(TimeflowModel model)
         {
                 this.model = model;
                 encoder = new VisualEncoder(model);
@@ -224,7 +224,7 @@
                 layout();
         }
 
-        public TFModel getModel()
+        public TimeflowModel getModel()
         {
                 return model;
         }

--
Gitblit v1.6.2