package org.chartsy.main.favorites;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyVetoException;
import javax.swing.BorderFactory;
import javax.swing.JTree;
import javax.swing.tree.TreePath;
import org.chartsy.main.ChartFrame;
import org.chartsy.main.data.ChartData;
import org.chartsy.main.favorites.nodes.StockAPI;
import org.chartsy.main.favorites.nodes.StockAPINode;
import org.chartsy.main.intervals.DailyInterval;
import org.chartsy.main.managers.ChartManager;
import org.chartsy.main.managers.TemplateManager;
import org.chartsy.main.templates.Template;
import org.openide.explorer.ExplorerManager;
import org.openide.explorer.view.NodeTreeModel;
import org.openide.explorer.view.TreeView;
import org.openide.explorer.view.Visualizer;
import org.openide.nodes.Node;
/**
*
* @author Viorel
*/
public class FavoritesTreeView extends TreeView
{
public static Color rowColors[] = new Color[]
{
Color.decode("0xffffff"),
Color.decode("0xeeeeee")
};
private boolean drawStripes = true;
private static FavoritesTreeView instance;
public static FavoritesTreeView getDefault()
{
if (instance == null)
instance = new FavoritesTreeView();
return instance;
}
private FavoritesTreeView()
{
setBorder(BorderFactory.createEmptyBorder());
setRootVisible(false);
tree.setCellRenderer(new FavoritesNodeRenderer());
setOpaque(true);
getViewport().setOpaque(false);
tree.setOpaque(false);
tree.addMouseListener(new MouseAdapter()
{
public @Override void mouseClicked(MouseEvent e)
{
if (e.getButton() == MouseEvent.BUTTON1
&& e.getClickCount() == 2)
{
TreePath treePath
= tree.getPathForLocation(e.getX(), e.getY());
if (treePath != null)
{
Node node = Visualizer.findNode(treePath.getLastPathComponent());
if (node instanceof StockAPINode)
{
StockAPINode stockNode = (StockAPINode) node;
StockAPI stock = stockNode.getStock();
if (stock != null)
{
String defaultTemplate = TemplateManager.getDefault().getDefaultTemplate();
Template template = TemplateManager.getDefault().getTemplate(defaultTemplate);
ChartData chartData = new ChartData();
chartData.setStock(stock.getStock());
chartData.setDataProviderName(stock.getDataProviderName());
chartData.setInterval(new DailyInterval());
chartData.setChart(ChartManager.getDefault().getChart("Candle Stick"));
ChartFrame chartFrame = ChartFrame.getInstance();
chartFrame.setChartData(chartData);
chartFrame.setTemplate(template);
chartFrame.open();
chartFrame.requestActive();
}
}
}
}
}
});
}
protected NodeTreeModel createModel()
{
return new NodeTreeModel();
}
protected void selectionChanged(Node[] nodes, ExplorerManager em)
throws PropertyVetoException
{
if (nodes.length > 0)
{
Node context = nodes[0].getParentNode();
for (int i = 1; i < nodes.length; i++)
{
if (context != nodes[i].getParentNode())
{
em.setSelectedNodes(nodes);
return;
}
}
if (em.getRootContext().getParentNode() == context)
em.setExploredContextAndSelection(null, nodes);
else
em.setExploredContextAndSelection(context, nodes);
}
else
em.setSelectedNodes(nodes);
}
protected boolean selectionAccept(Node[] nodes)
{
return true;
}
protected void showPath(TreePath path)
{
tree.expandPath(path);
showPathWithoutExpansion(path);
}
private void showPathWithoutExpansion(TreePath path)
{
Rectangle rect = tree.getPathBounds(path);
if (rect != null)
tree.scrollRectToVisible(rect);
}
protected void showSelection(TreePath[] treePaths)
{
tree.getSelectionModel().setSelectionPaths(treePaths);
if (treePaths.length == 1)
showPathWithoutExpansion(treePaths[0]);
}
public @Override void setEnabled(boolean enabled)
{
this.tree.setEnabled(enabled);
}
public @Override boolean isEnabled()
{
if (this.tree == null)
return true;
return this.tree.isEnabled();
}
public JTree getTree()
{
return tree;
}
public @Override void paintComponent(Graphics g)
{
if (!(drawStripes = isOpaque()))
{
super.paintComponent(g);
return;
}
final java.awt.Insets insets = tree.getInsets();
final int w = tree.getWidth() - insets.left - insets.right;
final int h = tree.getHeight() - insets.top - insets.bottom;
final int x = insets.left;
int y = insets.top;
int nRows = 0;
int startRow = 0;
int rowHeight = tree.getRowHeight();
if (rowHeight > 0)
{
nRows = h / rowHeight;
}
else
{
final int nItems = tree.getRowCount();
rowHeight = 17;
for (int i = 0; i < nItems; i++, y += rowHeight)
{
rowHeight = tree.getRowBounds(i).height;
g.setColor(rowColors[i&1]);
g.fillRect(x, y, w, rowHeight);
}
nRows = nItems + (insets.top + h - y) / rowHeight;
startRow = nItems;
}
for (int i = startRow; i < nRows; i++, y += rowHeight)
{
g.setColor(rowColors[i&1]);
g.fillRect(x, y, w, rowHeight);
}
final int remainder = insets.top + h - y;
if (remainder > 0)
{
g.setColor(rowColors[nRows&1]);
g.fillRect(x, y, w, remainder);
}
setOpaque(false);
super.paintComponent(g);
setOpaque(true);
}
}