private void drawDataSourceActions(
        @NotNull GC gc,
        @NotNull DBNDataSource node,
        @NotNull Rectangle item,
        @NotNull Rectangle client,
        boolean hovering
    ) {
        var actions = NavigatorExtensionsRegistry.getInstance().getNodeActions(getView(), node);
        if (actions.isEmpty()) {
            return;
        }

        // Compute width required to draw all actions
        int width = (actions.size() - 1) * ELEMENT_MARGIN;
        for (INavigatorNodeActionHandler action : actions) {
            Image image = DBeaverIcons.getImage(action.getNodeActionIcon(getView(), node));
            Rectangle size = image.getBounds();
            width += size.width;
        }

        // Allow to show action button even if it does not fit into the bounds
        boolean overdraw = hovering && item.width < width;
        Rectangle bounds = item;
        if (overdraw) {
            bounds = new Rectangle(client.x, bounds.y, client.width, bounds.height);
        }

        // Draw actions
        for (int i = actions.size() - 1; i >= 0; i--) {
            INavigatorNodeActionHandler action = actions.get(i);
            Image image = DBeaverIcons.getImage(action.getNodeActionIcon(getView(), node));
            Rectangle size = image.getBounds();

            if (bounds.width < size.width) {
                return;
            }

            if (overdraw) {
                gc.setBackground(gc.getDevice().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
                gc.fillRectangle(bounds.x + bounds.width - size.width - ELEMENT_MARGIN, bounds.y, size.width + ELEMENT_MARGIN * 2, bounds.height);
            }

            gc.drawImage(image, bounds.x + bounds.width - size.width, bounds.y + (bounds.height - size.height) / 2);
            bounds.width -= size.width + ELEMENT_MARGIN;
        }

        // Draw delimiter between whatever is left from the tree item and the actions
        if (overdraw) {
            gc.setBackground(gc.getDevice().getSystemColor(SWT.COLOR_LIST_SELECTION));
            gc.fillRectangle(bounds.x + bounds.width - 1, bounds.y, 1, bounds.height);
            item.width -= client.width - bounds.width;
        }
    }
Statistics node renderer.
Draws connection type marker next to the item name.
Draws item statistics in the right part.
plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/database/StatisticsNavigatorNodeRenderer.java