All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.nakedobjects.plugins.dnd.viewer.debug.DebugFrame Maven / Gradle / Ivy

The newest version!
package org.nakedobjects.plugins.dnd.viewer.debug;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Panel;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.TextArea;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.URL;
import java.util.Vector;

import org.apache.log4j.Logger;
import org.nakedobjects.metamodel.commons.debug.DebugInfo;
import org.nakedobjects.metamodel.commons.debug.DebugString;


/**
 * A specialised frame for displaying the details of an object and its display mechanisms.
 */
public abstract class DebugFrame extends Frame {
    private static final long serialVersionUID = 1L;
    private static final Logger LOG = Logger.getLogger(DebugFrame.class);
    private static Vector frames = new Vector();
    private int panel = 0;

    /**
     * Calls dispose on all the open debug frames
     * 
     */
    public static void disposeAll() {
        final Frame[] f = new Frame[frames.size()];

        for (int i = 0; i < f.length; i++) {
            f[i] = (Frame) frames.elementAt(i);
        }

        for (int i = 0; i < f.length; i++) {
            f[i].dispose();
        }
    }

    private TextArea field;
    private TabPane tabPane;

    public DebugFrame() {
        frames.addElement(this);

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(final WindowEvent e) {
                closeDialog();
            }
        });

        final URL url = DebugFrame.class.getResource("/" + "images/debug-log.gif");
        if (url != null) {
            final Image image = Toolkit.getDefaultToolkit().getImage(url);
            if (image != null) {
                setIconImage(image);
            }
        }

        setLayout(new BorderLayout(7, 7));
        final Panel tabPane = createTabPane();
        add(tabPane);
    }

    private Panel createTabPane() {
        tabPane = new TabPane();
        tabPane.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(final MouseEvent e) {
                final Point point = e.getPoint();
                panel = tabPane.select(point);

                showDebugForPane();
            }
        });

        tabPane.setLayout(new BorderLayout(7, 7));

        final TextArea textArea = new TextArea("", 60, 110, TextArea.SCROLLBARS_BOTH);
        textArea.setForeground(Color.black);
        textArea.setEditable(false);
        // Font font = NakedObjects.getConfiguration().getFont("nakedobjects.debug.font", new
        // Font("Monospaced", Font.PLAIN, 10));
        final Font font = new Font("Monospaced", Font.PLAIN, 11);
        textArea.setFont(font);
        tabPane.add("Center", textArea);
        field = textArea;

        final Panel buttons = new Panel();
        buttons.setLayout(new FlowLayout());
        tabPane.add(buttons, BorderLayout.SOUTH);

        // add buttons
        Button b = new java.awt.Button("Refresh");
        b.setFont(font);

        buttons.add(b);
        b.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                showDebugForPane();
            }
        });

        b = new java.awt.Button("Print...");
        b.setFont(font);

        buttons.add(b);
        b.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                DebugOutput.print("Debug " + tabPane.getName(), field.getText());
            }
        });

        b = new java.awt.Button("Save...");
        b.setFont(font);

        buttons.add(b);
        b.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                DebugOutput.saveToFile("Save details", "Debug " + tabPane.getName(), field.getText());
            }
        });

        b = new java.awt.Button("Copy");
        b.setFont(font);

        buttons.add(b);
        b.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                DebugOutput.saveToClipboard(field.getText());
            }
        });

        b = new java.awt.Button("Close");
        b.setFont(font);

        buttons.add(b);
        b.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                closeDialog();
            }
        });

        return tabPane;
    }

    @Override
    public Insets getInsets() {
        final Insets insets = super.getInsets();
        insets.left += 10;
        insets.right += 10;
        insets.top += 10;
        insets.bottom += 10;
        return insets;
    }

    private void closeDialog() {
        dialogClosing();
        // hide();
        dispose();
    }

    public void dialogClosing() {}

    @Override
    public void dispose() {
        LOG.debug("dispose...");
        tabPane.removeAll();
        frames.removeElement(this);
        super.dispose();
        LOG.debug("...disposed");
    }

    protected abstract DebugInfo[] getInfo();

    /**
     * show the frame at the specified coordinates
     */
    public void show(final int x, final int y) {
        /*
         * WARNING - When refresh button is pressed it is in the AWT thread; if the naked objects repository
         * is thread based then the wrong set of components will be used giving strange results, particularly
         * in the object persistor.
         */
        // TODO run in correct thread
        refresh();

        pack();
        limitBounds(x, y);
        setVisible(true);
    }

    private void refresh() {
        final DebugInfo[] infos = getInfo();
        final DebugInfo info = infos[panel];
        if (info != null) {
            setTitle(info.debugTitle());
            final DebugString str = new DebugString();
            info.debugData(str);
            field.setText(str.toString());
            field.setCaretPosition(0);
        }
    }

    public void showDebugForPane() {
        refresh();
    }

    private void limitBounds(final int xLimit, final int yLimit) {
        final Dimension screenSize = getToolkit().getScreenSize();
        final int maxWidth = screenSize.width - 50;
        final int maxHeight = screenSize.height - 50;

        int width = getSize().width;
        int height = getSize().height;

        int x = xLimit;
        if (x + width > maxWidth) {
            x = 0;
            if (x + width > maxWidth) {
                width = maxWidth;
            }
        }

        int y = yLimit;
        if (y + height > maxHeight) {
            y = 0;
            if (y + height > maxHeight) {
                height = maxHeight;
            }
        }

        setSize(width, height);
        setLocation(x, y);
    }

    private class TabPane extends Panel {
        private static final long serialVersionUID = 1L;
        private Rectangle[] tabs;
        private int panel = 0;

        public int select(final Point point) {
            for (int i = 0; i < tabs.length; i++) {
                if (tabs[i] != null && tabs[i].contains(point)) {
                    panel = i;
                    repaint();
                    break;
                }
            }
            return panel;
        }

        @Override
        public Insets getInsets() {
            final Insets insets = super.getInsets();
            insets.left += 10;
            insets.right += 10;
            insets.top += 30;
            insets.bottom += 10;
            return insets;
        }

        @Override
        public void paint(final Graphics g) {
            final DebugInfo[] info = getInfo();

            if (info != null) {
                if (tabs == null) {
                    tabs = new Rectangle[getInfo().length];
                }
                final Dimension size = getSize();
                g.setColor(Color.gray);
                g.drawRect(0, 20, size.width - 1, size.height - 21);

                FontMetrics fm;
                fm = g.getFontMetrics();
                int offset = 0;
                final int maxWidth = info.length == 0 ? size.width : size.width / info.length - 1;
                for (int i = 0; i < info.length; i++) {
                    String title = info[i].debugTitle();
                    title = title == null ? info[i].getClass().getName() : title;
                    final int width = Math.min(maxWidth, fm.stringWidth(title) + 20);

                    tabs[i] = new Rectangle(offset, 0, width, 20);
                    g.setColor(Color.gray);
                    g.drawRect(offset + 0, 0, width, 20);
                    if (i == panel) {
                        g.setColor(Color.white);
                        g.fillRect(offset + 1, 1, width - 1, 20);
                        // g.drawLine(offset + 1, 20, offset + width, 20);
                        g.setColor(Color.black);
                    } else {
                        g.setColor(Color.lightGray);
                        g.fillRect(offset + 1, 1, width - 1, 20 - 1);
                        g.setColor(Color.gray);
                    }

                    g.drawString(title, offset + 9, 20 - 5);

                    offset += width;
                }
                g.setColor(Color.white);
                g.fillRect(offset + 1, 1, size.width - offset, 20 - 1);
            }
        }

    }
}
// Copyright (c) Naked Objects Group Ltd.




© 2015 - 2025 Weber Informatics LLC | Privacy Policy