in commons/src/main/java/org/apache/causeway/commons/internal/debug/xray/XrayUi.java [119:248]
protected XrayUi(final int defaultCloseOperation) {
//create the root node
root = new DefaultMutableTreeNode("X-ray");
xrayModel = new XrayModelSimple(root);
//create the tree by passing in the root node
tree = new JTree(root);
tree.setShowsRootHandles(false);
val detailPanel = layoutUIAndGetDetailPanel(tree);
tree.getSelectionModel().addTreeSelectionListener((final TreeSelectionEvent e) -> {
val selPath = e.getNewLeadSelectionPath();
if(selPath==null) {
return; // ignore event
}
val selectedNode = (DefaultMutableTreeNode) selPath.getLastPathComponent();
val userObject = selectedNode.getUserObject();
//detailPanel.removeAll();
if(userObject instanceof XrayDataModel) {
((XrayDataModel) userObject).render(detailPanel);
} else {
val infoPanel = new JPanel();
infoPanel.add(new JLabel("Details"));
detailPanel.setViewportView(infoPanel);
}
detailPanel.revalidate();
detailPanel.repaint();
//System.out.println("selected: " + selectedNode.toString());
});
val popupMenu = new JPopupMenu();
val clearThreadsAction = popupMenu.add(new JMenuItem("Clear Threads"));
clearThreadsAction.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
doClearThreads();
}
});
val callStackMergeAction = popupMenu.add(new JMenuItem("Merge Logged Call-Stack"));
callStackMergeAction.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
doMergeCallStacksOnSelectedNodes();
}
});
val deleteAction = popupMenu.add(new JMenuItem("Delete"));
deleteAction.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
doRemoveSelectedNodes();
}
});
tree.setCellRenderer(new XrayTreeCellRenderer(
(DefaultTreeCellRenderer) tree.getCellRenderer(),
iconCache));
tree.addMouseListener(new MouseListener() {
@Override public void mouseReleased(final MouseEvent e) {}
@Override public void mousePressed(final MouseEvent e) {}
@Override public void mouseExited(final MouseEvent e) {}
@Override public void mouseEntered(final MouseEvent e) {}
@Override
public void mouseClicked(final MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) {
popupMenu.show(e.getComponent(), e.getX(), e.getY());
}
}
});
tree.addKeyListener(new KeyListener() {
@Override public void keyReleased(final KeyEvent e) {}
@Override public void keyTyped(final KeyEvent e) {}
@Override
public void keyPressed(final KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_DELETE) {
doRemoveSelectedNodes();
return;
}
if(e.getKeyCode() == KeyEvent.VK_F5) {
doClearThreads();
return;
}
}
});
// report key bindings to the UI
{
val root = xrayModel.getRootNode();
val env = xrayModel.addDataNode(root,
new XrayDataModel.KeyValue("causeway-xray-keys", "X-ray Keybindings", Stickiness.CANNOT_DELETE_NODE));
env.getData().put("F5", "Clear Threads");
env.getData().put("DELETE", "Delete Selected Nodes");
}
this.setDefaultCloseOperation(defaultCloseOperation);
this.setTitle("X-ray Viewer (Apache Causeway™)");
this.pack();
this.setSize(800, 600);
this.setLocationRelativeTo(null);
this.setVisible(true);
INSTANCE = this;
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(final WindowEvent e) {
latch.countDown();
}
});
}