package timeflow.app.ui;
import javax.swing.*;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
// custom JTabbedPane-like thing.
public class LinkTabPane extends JPanel {
ArrayList<String> tabNames=new ArrayList<String>();
HashMap<String, JComponent> tabMap=new HashMap<String, JComponent>();
String currentName;
CardLayout cards=new CardLayout();
JPanel center=new JPanel();
LinkTop top=new LinkTop();
public LinkTabPane()
{
setBackground(Color.white);
setLayout(new BorderLayout());
add(top, BorderLayout.NORTH);
add(center, BorderLayout.CENTER);
center.setLayout(cards);
top.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
String s=top.getName(e.getX());
if (s!=null)
{
String old=currentName;
setCurrentName(s);
firePropertyChange("tab", old, s);
}
}});
}
public String getTitleAt(int i)
{
return tabNames.get(i);
}
public void setSelectedIndex(int i)
{
setCurrentName(getTitleAt(i));
}
public void addTab(JComponent component, String name, boolean left)
{
tabNames.add(name);
tabMap.put(name, component);
center.add(component, name);
top.addName(name, left);
repaint();
if (currentName==null)
currentName=name;
}
public String getCurrentName()
{
return currentName;
}
public void setCurrentName(final String currentName)
{
this.currentName=currentName;
top.repaint();
SwingUtilities.invokeLater(new Runnable() {public void run() {cards.show(center, currentName);}});
}
class LinkTop extends JPanel
{
int left, right;
ArrayList<HotLink> leftHots=new ArrayList<HotLink>();
ArrayList<HotLink> rightHots=new ArrayList<HotLink>();
Font font=new Font("Verdana", Font.PLAIN, 14);
FontMetrics fm=getFontMetrics(font);
LinkTop()
{
setLayout(new FlowLayout(FlowLayout.LEFT));
setBackground(new Color(220,220,220));
}
public void paintComponent(Graphics g1)
{
int w=getSize().width, h=getSize().height;
Graphics2D g=(Graphics2D)g1;
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(getBackground());
g.fillRect(0,0,w,h);
g.setColor(Color.gray);
for (int i=0; i<2; i++)
{
g.drawLine(0,i,w,i);
g.drawLine(0,h-1-i,w,h-1-i);
}
for (HotLink hot: leftHots)
{
draw(g, hot, h, 0);
}
for (HotLink hot: rightHots)
{
draw(g, hot, h, w);
}
for (int i=0; i<leftHots.size(); i++)
{
if (i<leftHots.size()-1)
{
HotLink hot=leftHots.get(i);
for (int j=0; j<1; j++)
g.drawLine(hot.x+hot.width-1-j, 7, hot.x+hot.width-1-j, h-7);
}
}
for (int i=0; i<rightHots.size(); i++)
{
if (i<rightHots.size()-1)
{
HotLink hot=rightHots.get(i);
for (int j=0; j<1; j++)
g.drawLine(hot.x+w-1-j, 7, hot.x+w-1-j, h-7);
}
}
}
void draw(Graphics g, HotLink hot, int h, int dx)
{
int x=hot.x+dx;
if (hot.s.equals(currentName))
{
g.setColor(Color.lightGray);
g.fillRect(x,2,hot.width,h-4);
g.setColor(Color.gray);
g.drawLine(x-1, 0, x-1, h);
g.drawLine(x+hot.width-1, 0, x+hot.width-1, h);
}
g.setColor(Color.darkGray);
g.setFont(font);
int sw=fm.stringWidth(hot.s);
g.drawString(hot.s, x+(hot.width-sw)/2, h-10);
}
String getName(int x)
{
for (HotLink h: leftHots)
{
if (h.x<=x && h.x+h.width>x)
return h.s;
}
for (HotLink h: rightHots)
{
int w=getSize().width;
if (h.x+w<=x && h.x+h.width+w>x)
return h.s;
}
if (leftHots.size()>0)
return leftHots.get(leftHots.size()-1).s;
if (rightHots.size()>0)
return rightHots.get(0).s;
return null;
}
void addName(String name, boolean leftward)
{
if (leftward)
{
int x=right;
int w=fm.stringWidth(name)+24;
leftHots.add(new HotLink(name, x, 0, w, 30));
right+=w;
}
else
{
int x=left;
int w=fm.stringWidth(name)+24;
rightHots.add(new HotLink(name, x-w, 0, w, 30));
left-=w;
}
}
class HotLink extends Rectangle
{
String s;
HotLink(String s, int x, int y, int w, int h)
{
super(x,y,w,h);
this.s=s;
}
}
public Dimension getPreferredSize()
{
return new Dimension(30,30);
}
}
}