package timeflow.model;
import timeflow.data.db.filter.ValueFilter;
import timeflow.data.time.*;
import java.awt.*;
import java.util.*;
import java.net.URI;
import java.text.*;
import javax.swing.*;
// to do: read from a properties file!
public class Display {
HashMap<String, String> strings=new HashMap<String, String>();
HashMap<String, Integer> ints=new HashMap<String, Integer>();
HashMap<String, Color> colors=new HashMap<String, Color>();
HashMap<Class, String> classLabel=new HashMap<Class, String>();
Color fallback=new Color(0,53,153,128);
String fontName="Verdana";
Font tinyFont=new Font(fontName, Font.BOLD, 9);
Font smallFont=new Font(fontName, Font.PLAIN, 11);
Font boldFont=new Font(fontName, Font.BOLD, 12);
Font plainFont=UIManager.getFont("Label.font");
Font bigFont=plainFont.deriveFont(Font.BOLD);
Font hugeFont=new Font(fontName, Font.BOLD, 16);
Font timeLabelFont=tinyFont;
FontMetrics hugeFontMetrics=Toolkit.getDefaultToolkit().getFontMetrics(hugeFont);
FontMetrics bigFontMetrics=Toolkit.getDefaultToolkit().getFontMetrics(bigFont);
FontMetrics plainFontMetrics=Toolkit.getDefaultToolkit().getFontMetrics(plainFont);
FontMetrics boldFontMetrics=Toolkit.getDefaultToolkit().getFontMetrics(boldFont);
FontMetrics tinyFontMetrics=Toolkit.getDefaultToolkit().getFontMetrics(tinyFont);
FontMetrics timeLabelFontMetrics=Toolkit.getDefaultToolkit().getFontMetrics(timeLabelFont);
static DecimalFormat df=new DecimalFormat("###,###,###,###.##");
static DecimalFormat roundFormat=new DecimalFormat("###,###,###,###");
public static final String MISC_CODE="Misc. ";
public static final double MAX_DOT_SIZE=10;
public static final int CALENDAR_CELL_HEIGHT=80;
public static Color barColor=new Color(150,170,200);
private static final double PHI=(1+Math.sqrt(5))/2;
HashMap<String, Color> topColors=new HashMap<String, Color>();
static Color[] handPalette={
new Color(203,31,23),
new Color(237,131,0),
new Color(71,175,13),
new Color(6,119,207),
new Color(0,188,184),
new Color(209,80,174),
new Color(146,6,0),
new Color(175,103,0),
new Color(76,124,0),
new Color(0,80,143),
new Color(0,128,124),
new Color(153,56,126)
};
ValueFilter grayFilter;
public Display()
{
strings.put("other.label", "Other");
strings.put("null.label", "[none]");
classLabel.put(RoughTime.class, "Date/Time");
classLabel.put(String.class, "Text");
classLabel.put(Number.class, "Number");
classLabel.put(Double.class, "Number");
classLabel.put(Integer.class, "Number");
classLabel.put(String[].class, "List");
colors.put("chart.background", Color.white);
Color ui=new Color(240,240,240);
colors.put("splash.background", Color.white);
colors.put("splash.text", new Color(50,50,50));
colors.put("filterpanel.background", ui);
colors.put("visualpanel.background", ui);
colors.put("text.prominent", Color.black);
colors.put("text.normal", Color.gray);
colors.put("timeline.label", new Color(0,53,153));
colors.put("timeline.label.lesser", new Color(110,153,200));
colors.put("timeline.grid", new Color(240,240,240));
colors.put("timeline.grid.vertical", new Color(240,240,240));
colors.put("timeline.zebra", new Color(245,245,245));
colors.put("null.color", new Color(230,230,230));
colors.put("timeline.unspecified.color", new Color(0,53,153));
colors.put("highlight.color", new Color(0,53,153));
ints.put("timeline.datelabel.height",20);
ints.put("timeline.item.height.min", 16);
}
public static void launchBrowser(String urlString)
{
if (Desktop.isDesktopSupported())
{
Desktop desktop = Desktop.getDesktop();
try {
desktop.browse(new URI(urlString));
} catch (Exception e2) {
e2.printStackTrace();
}
}
else
System.out.println("Desktop not supported!");
}
public static String arrayToString(Object[] s)
{
if (s==null || s.length==0)
{
return "";
}
StringBuffer b=new StringBuffer();
for (int i=0; i<s.length; i++)
{
if (i>0)
b.append(", ");
b.append(s[i]);
}
return b.toString();
}
public static String version()
{
return "TimeFlow 0.5";
}
public Font bold()
{
return boldFont;
}
public Font plain()
{
return plainFont;
}
public Font small()
{
return smallFont;
}
public FontMetrics hugeFontMetrics()
{
return hugeFontMetrics;
}
public FontMetrics plainFontMetrics()
{
return plainFontMetrics;
}
public FontMetrics boldFontMetrics()
{
return boldFontMetrics;
}
public FontMetrics tinyFontMetrics()
{
return tinyFontMetrics;
}
public FontMetrics timeLabelFontMetrics()
{
return timeLabelFontMetrics;
}
public Font huge()
{
return hugeFont;
}
public Font big()
{
return bigFont;
}
public Font tiny()
{
return tinyFont;
}
public Font timeLabel()
{
return timeLabelFont;
}
public String getString(String s)
{
return strings.get(s);
}
public int getInt(String s)
{
return ints.get(s);
}
public Color getColor(String key)
{
if (colors.get(key)==null)
throw new IllegalArgumentException("No color for "+key);
return colors.get(key);
}
public JLabel label(String s)
{
return new JLabel(s);
}
public String format(String s, int maxLength, boolean tryNoDots)
{
if (s==null)
return "";
int n=s.length();
if (n<=maxLength)
return s;
if (maxLength<4)
return "...";
if (!tryNoDots)
{
return s.substring(0, maxLength-3)+"...";
}
// find last space before maxLength and after maxLength/2
for (int j=maxLength-1; j>maxLength/2; j--)
{
if (s.charAt(j)==' ')
return s.substring(0,j);
}
return s.length()<=maxLength ? s : (maxLength<6 ? "" : s.substring(0, maxLength-3)+"...");
}
public void refreshColors(Iterable<String> list)
{
topColors=new HashMap<String, Color>();
double x=.1;
int i=0;
for (String s: list)
{
topColors.put(s, i<handPalette.length ? handPalette[i] : palette(x));
i++;
x+=PHI;
}
}
public Color makeColor(String text)
{
if (grayFilter!=null && !grayFilter.ok(text))
return new Color(200,200,200);//"null.color");
Color c=topColors.get(text);
return c==null ? _makeColor(text) : c;
}
private Color _makeColor(String text)
{
if (text==null)
return getColor("null.color");
int c=Math.abs(text.hashCode());
double h=((c>>8)%255)/255.;
return palette(h);
}
public static Color palette(double x)
{
float h=(float)(Math.abs(x)%1);
float s=.8f-.25f*h;
float b=.8f-.25f*h;
return new Color(Color.HSBtoRGB(h,s, b));
}
public String getMiscLabel() {
return getString("other.label");
}
public String getNullLabel() {
return getString("null.label");
}
public String toString(Object o)
{
if (o==null)
return getNullLabel();
if (o instanceof Object[])
return arrayToString((Object[])o);
if (o instanceof RoughTime)
return ((RoughTime)o).format();//UnitOfTime.format((RoughTime)o);
if (o instanceof Double)
return df.format((Double)o);
return o.toString();
}
public static String format(double x)
{
return Math.abs(x)>999 ? roundFormat.format(x) : df.format(x);
}
public String format(RoughTime time)
{
if (time==null)
return getString("null.label");
return time.format();//UnitOfTime.format(time);
}
public static ArrayList<String> breakLines(String s, int lineChars, int firstOffset)
{
ArrayList<String> lines=new ArrayList<String>();
String[] words=s.split(" ");
String line="";
for (int i=0; i<words.length; i++)
{
// is the word just too, too long?
int n=words[i].length();
if (n>lineChars-5)
{
words[i]=words[i].substring(0,lineChars/2-2)+"..."+words[i].substring(n-lineChars/2+2,n);
}
if (line.length()+words[i].length()>(lines.size()==0 ? lineChars-firstOffset : lineChars))
{
lines.add(line);
line="";
}
line+=" "+words[i];
}
lines.add(line);
return lines;
}
public boolean emptyMessage(Graphics g, TFModel model)
{
if (model.getActs()==null || model.getActs().size()==0)
{
g.setColor(getColor("text.prominent"));
g.drawString(model.getDB()==null || model.getDB().size()==0 ? "Empty Database" :"No items found.", 10, 25);
return true;
}
return false;
}
}