package com.google.code.joto.ui.tree;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTree;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreePath;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.code.joto.ui.tree.AggrRecordEventTemplateTreeNodeAST.AbstractAggrEventTreeNode;
/**
* a Tree View for aggregating similar (="templatized") RecordEvent together
*/
public class AggrRecordEventTreeView {
private static Logger log = LoggerFactory.getLogger(AggrRecordEventTreeView.class);
private JPanel panel;
private AggrRecordEventTreeModel treeModel;
private JTree jtree;
// ------------------------------------------------------------------------
public AggrRecordEventTreeView(AggrRecordEventTreeModel treeModel) {
this.treeModel = treeModel;
initComponents();
}
private void initComponents() {
this.panel = new JPanel(new BorderLayout());
jtree = new JTree(treeModel);
panel.add(jtree, BorderLayout.CENTER);
TreeCellRenderer aggrTreeCellRenderer = new InnerAggrTreeCellRenderer();
jtree.setCellRenderer(aggrTreeCellRenderer);
// jtree.getSelectionModel().add()
jtree.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {
onJTreeRightClick(e);
}
}
});
}
// ------------------------------------------------------------------------
public JComponent getJComponent() {
return panel;
}
private void onJTreeRightClick(MouseEvent e) {
TreePath[] selectedPaths = jtree.getSelectionPaths();
if (selectedPaths == null || selectedPaths.length == 0) {
TreePath clickedPath = jtree.getPathForLocation(e.getX(), e.getY());
if (clickedPath != null) {
selectedPaths = new TreePath[] { clickedPath };
}
}
// convert JTree selection to AbstractAggrEventTreeNode
List<AbstractAggrEventTreeNode> nodes = new ArrayList<AbstractAggrEventTreeNode>();
if (selectedPaths != null) {
for(TreePath path : selectedPaths) {
AbstractAggrEventTreeNode node = (AbstractAggrEventTreeNode) path.getLastPathComponent();
nodes.add(node);
}
}
log.debug("right clicked:" + nodes);
JPopupMenu ctxMenu = new JPopupMenu();
if (nodes.size() == 1) {
AbstractAggrEventTreeNode node = nodes.get(0);
node.fillCtxMenu(ctxMenu);
} else {
// NOT IMPLEMENTED YET
log.error("NOT IMPLEMENTED YET ... contextual menu with multi-selection on JTree...");
}
// fill context menu with selection
ctxMenu.show(jtree, e.getX(), e.getY());
}
// ------------------------------------------------------------------------
private class InnerAggrTreeCellRenderer implements TreeCellRenderer {
JLabel label = new JLabel();
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
AbstractAggrEventTreeNode node = (AbstractAggrEventTreeNode) value;
label.setText(node.getDisplayLabel());
return label;
}
}
}