/**
* Chart.java
* Created On 2006, Mar 31, 2006 4:56:17 PM
* @author E. Rajasekar
*/
package app.astrosoft.ui.comp;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List;
import java.util.Set;
import javax.swing.BorderFactory;
import javax.swing.DefaultSingleSelectionModel;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTable;
import javax.swing.ToolTipManager;
import javax.swing.border.BevelBorder;
import javax.swing.border.EtchedBorder;
import javax.swing.border.LineBorder;
import app.astrosoft.beans.ChartData;
import app.astrosoft.beans.PlanetChartData;
import app.astrosoft.consts.AstrosoftTableColumn;
import app.astrosoft.consts.Language;
import app.astrosoft.consts.Planet;
import app.astrosoft.consts.Rasi;
import app.astrosoft.consts.TableStyle;
import app.astrosoft.ui.table.AstrosoftTable;
import app.astrosoft.ui.table.AstrosoftTableModel;
import app.astrosoft.ui.table.PlanetCellRenderer;
import app.astrosoft.ui.table.Table;
import app.astrosoft.ui.util.UIConsts;
import app.astrosoft.ui.window.AstrosoftWindow;
import app.astrosoft.ui.window.DefaultWindowLabelModel;
import app.astrosoft.ui.window.WindowLabelModel;
public class Chart extends JPanel{
private ChartData chartData;
private List<JPanel> housePanel;
private Dimension houseSize;
private Dimension tableSize;
private int rowHeight;
private JLabel title;
public Chart(ChartData chartData, Dimension chartSize) {
this.chartData = chartData;
houseSize = new Dimension(chartSize.width / 4, chartSize.height / 4);
tableSize = new Dimension((int)(houseSize.width * 0.80), (int)(houseSize.height * 0.80));
rowHeight = tableSize.height / 3;
//Thirteen-th fills center
housePanel = new ArrayList<JPanel>();
title = new TitleLabel(chartData.getChartName());
setLayout(new GridBagLayout());
//setPreferredSize(new Dimension(chartSize.width + (3 * 4), chartSize.height + (3 * 4)));
setPreferredSize(chartSize);
addHouseTables();
setVisible(true);
}
private void addHouseTables() {
Set<Rasi> dataHouses = chartData.getHouses();
boolean isPlanetChart = (chartData instanceof PlanetChartData);
int houseNo;
String toolTip;
ToolTipManager toolTipManager = ToolTipManager.sharedInstance();
Rasi ascendant = chartData.getAscendant();
for(Rasi house : Rasi.values()){
houseNo = house.ordinal();
JPanel panel = new JPanel();
if(dataHouses.contains(house)){
Table table = chartData.getChartHouseTable(house);
AstrosoftTable houseTable = new AstrosoftTable(new AstrosoftTableModel(table), TableStyle.NONE);
panel.add(houseTable, getConstrains(houseNo));
//houseTable.setDefaultRenderer(Planet.class, new PlanetCellRenderer());
houseTable.setRowHeight(rowHeight);
houseTable.setPreferredSize(tableSize);
houseTable.setBackground(UIConsts.getChartBackground());
if (isPlanetChart){
decoratePlanetChart(table, houseTable);
toolTip = house.toString(Language.ENGLISH) + ": " + house.bhava(ascendant);
houseTable.setToolTipText(toolTip);
toolTipManager.registerComponent(houseTable);
}
//houseTable.addMouseListener(new ChartHouseMouseListener());
}
panel.setPreferredSize(houseSize);
panel.setBackground(UIConsts.getChartBackground());
panel.setBorder(UIConsts.getChartBorder());
add(panel, getConstrains(houseNo));
if (isPlanetChart){
toolTip = house.toString(Language.ENGLISH) + ": " + house.bhava(ascendant);
panel.setToolTipText(toolTip);
toolTipManager.registerComponent(panel);
}
housePanel.add(houseNo, panel);
//panel.addMouseListener(new ChartHouseMouseListener());
}
// Add ChartName at Center
houseNo = 12;
JPanel panel = new JPanel();
panel.add(title);
add(panel, getConstrains(houseNo));
}
public void setTitleFont(Font font){
title.setFont(font);
}
private void decoratePlanetChart(Table table, AstrosoftTable houseTable) {
PlanetChartData planetChartData = (PlanetChartData) chartData;
boolean highlightRetrogrades = planetChartData.highlightRetrogrades();
EnumMap<Planet, Boolean> planetDir = planetChartData.getPlanetDir();
for(AstrosoftTableColumn col : table.getColumnMetaData().getVisibleColumns()){
houseTable.setCellRenderer(new PlanetCellRenderer(houseTable.getCellRenderer(col), highlightRetrogrades, false, planetDir ), col);
}
createPopups();
}
private void createPopups() {
JPopupMenu popup = new JPopupMenu();
popup.add("Rajasekar");
//popup.setSelectionModel();
MouseListener popupListener = new PopupListener(popup);
this.addMouseListener(popupListener);
}
private class ChartHouseMouseListener extends MouseAdapter{
AstrosoftWindow window;
//Container previous_source;
Container source;
public void mouseEntered(MouseEvent e) {
source = (Container) e.getSource();
if (source instanceof JTable){
source = ((JTable)source).getParent();
}
//if (previous_source != null && previous_source == source){
// return;
//}
Rasi ascendant = chartData.getAscendant();
if (ascendant != null){
int bhava = Rasi.ofIndex(housePanel.indexOf(source)).bhava(ascendant);
WindowLabelModel windowModel = new DefaultWindowLabelModel(String.valueOf(bhava));
window = new AstrosoftWindow(windowModel);
window.setPreferredSize(new Dimension(30,20));
Point houseLoc = source.getLocationOnScreen();
Point loc = e.getPoint();
loc.translate(houseLoc.x + 10,houseLoc.y - 10);
window.show(loc);
}
}
@Override
public void mouseExited(MouseEvent e) {
if (window != null){
window.dispose();
}
//previous_source = source;
}
}
private static GridBagConstraints getConstrains(int house){
GridBagConstraints c = new GridBagConstraints();
switch(house){
case 0: c.gridx = 1;
c.gridy = 0;
break;
case 1: c.gridx = 2;
c.gridy = 0;
break;
case 2: c.gridx = 3;
c.gridy = 0;
break;
case 3: c.gridx = 3;
c.gridy = 1;
break;
case 4: c.gridx = 3;
c.gridy = 2;
break;
case 5: c.gridx = 3;
c.gridy = 3;
break;
case 6: c.gridx = 2;
c.gridy = 3;
break;
case 7: c.gridx = 1;
c.gridy = 3;
break;
case 8: c.gridx = 0;
c.gridy = 3;
break;
case 9: c.gridx = 0;
c.gridy = 2;
break;
case 10: c.gridx = 0;
c.gridy = 1;
break;
case 11: c.gridx = 0;
c.gridy = 0;
break;
//Center Panel
case 12: c.gridx = 1;
c.gridy = 1;
c.gridwidth = 2;
c.gridheight = 2;
break;
default : throw new IllegalArgumentException("house > 12");
}
/*c.ipadx = 1;
c.ipady = 1;
c.insets = new Insets(1,1,1,1);*/
return c;
}
public void updateChartData(ChartData chartData){
this.chartData = chartData;
title.setText(chartData.getChartName());
//title = new TitleLabel(chartData.getChartName());
this.removeAll();
addHouseTables();
}
}