package org.chartsy.main.favorites; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Font; import java.text.DecimalFormat; import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.JTree; import javax.swing.ListSelectionModel; import javax.swing.UIManager; import javax.swing.table.TableCellRenderer; import javax.swing.tree.DefaultTreeCellRenderer; import org.chartsy.main.favorites.nodes.StockAPI; import org.chartsy.main.favorites.nodes.StockAPINode; import org.chartsy.main.resources.ResourcesUtils; import org.openide.explorer.view.Visualizer; import org.openide.nodes.Node; /** * * @author Viorel */ public class FavoritesNodeRenderer extends DefaultTreeCellRenderer { public FavoritesNodeRenderer() { super(); setOpenIcon(ResourcesUtils.getIcon("folder")); setClosedIcon(getOpenIcon()); setLeafIcon(null); } public @Override Component getTreeCellRendererComponent (JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); Node node = Visualizer.findNode(value); if (node instanceof StockAPINode) { StockAPINode stockNode = (StockAPINode) node; StockAPI stockObject = stockNode.getStock(); StockTable stockTable = new StockTable(stockObject.getData()); stockTable.setFont(getRendererFont()); stockTable.setBackground(FavoritesTreeView.rowColors[row&1]); stockTable.setRowHeight(tree.getRowHeight()); if (selected) stockTable.selectAll(); return stockTable; } setEnabled(tree.isEnabled()); setFont(getRendererFont()); setOpaque(false); return this; } private Font getRendererFont() { int fs = 11; Object cfs = UIManager.get("customFontSize"); if (cfs instanceof Integer) fs = ((Integer) cfs).intValue(); Font font = new Font("Monospaced", Font.PLAIN, fs); return font; } public @Override void validate() {} public @Override void repaint(long tm, int x, int y, int w, int h) {} public @Override void repaint() {} public @Override void invalidate() {} public @Override void revalidate() {} public static class StockTable extends JTable { public static String[] columns = { "Stock", "Last Value", "Change", "Percent" }; public StockTable(Object[][] rowData) { super(rowData, columns); setSelectionMode(ListSelectionModel.SINGLE_SELECTION); setColumnSelectionAllowed(false); setRowSelectionAllowed(true); setIntercellSpacing(new Dimension(0, 0)); setOpaque(true); setBorder(null); setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); int columnCount = getColumnCount(); for (int i = 0; i < columnCount; i++) { columnModel.getColumn(i).setCellRenderer(new StockCellRenderer()); columnModel.getColumn(i).setPreferredWidth(50); } } } public static class StockCellRenderer extends JLabel implements TableCellRenderer { public StockCellRenderer() { setOpaque(true); } @Override public Component getTableCellRendererComponent (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (isSelected) { setForeground(table.getSelectionForeground()); setBackground(table.getSelectionBackground()); } else { setForeground(table.getForeground()); setBackground(table.getBackground()); } DecimalFormat df = new DecimalFormat("#,##0.00"); String stringValue = ""; if (column > 1) { double d = Double.parseDouble(value.toString()); stringValue = df.format(d); if (d > 0) { stringValue = " " + stringValue; setForeground(Color.decode("0x73d216")); } else if (d < 0) setForeground(Color.decode("0xef2929")); else stringValue = " " + stringValue; if (column == 3) stringValue += "%"; } else if (column == 1) { double d = Double.parseDouble(value.toString()); stringValue = df.format(d); } else { stringValue = value.toString(); } setBorder(BorderFactory.createEmptyBorder()); setFont(table.getFont()); setText(stringValue); return this; } public @Override void validate() {} public @Override void repaint(long tm, int x, int y, int w, int h) {} public @Override void repaint() {} public @Override void invalidate() {} public @Override void revalidate() {} } }