protected XrayUi()

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();
            }
        });
    }