001package jmri.util.swing.mdi;
002
003import java.awt.Frame;
004import java.util.List;
005import javax.swing.JDesktopPane;
006import javax.swing.JInternalFrame;
007import javax.swing.JMenu;
008import javax.swing.JMenuBar;
009import jmri.util.JmriJFrame;
010
011/**
012 * Display a JmriPanel in a JInternalFrame of its own.
013 *
014 * Dispose() of the panel is invoked when the containing window is fully closed
015 * via a listener installed here.
016 *
017 * @author Bob Jacobsen Copyright 2010
018 * @since 2.9.4
019 */
020public class JmriJInternalFrameInterface implements jmri.util.swing.WindowInterface {
021
022    public JmriJInternalFrameInterface(JmriJFrame mainFrame, JDesktopPane desktop) {
023        this.mainFrame = mainFrame;
024        this.desktop = desktop;
025    }
026
027    JDesktopPane desktop;
028    JmriJFrame mainFrame;
029
030    @Override
031    public void show(final jmri.util.swing.JmriPanel child,
032            jmri.util.swing.JmriAbstractAction act,
033            Hint hint) {
034        // create new internal frame
035        JInternalFrame frame = new JInternalFrame(child.getTitle(),
036                true, //resizable
037                true, //closable
038                true, //maximizable
039                true);//iconifiable
040        frame.setLocation(50, 50);
041
042        // add gui object, responsible for own layout
043        frame.add(child);
044
045        // add menus if requested
046        JMenuBar bar = frame.getJMenuBar();
047        if (bar == null) {
048            bar = new JMenuBar();
049        }
050        List<JMenu> list = child.getMenus();
051        for (JMenu menu : list) {
052            bar.add(menu);
053        }
054
055        // add help menu if requested; this is similar
056        // to code in JmriJFrame
057        if (child.getHelpTarget() != null) {
058            // add Help menu
059            jmri.util.HelpUtil.helpMenu(bar, child.getHelpTarget(), true);
060        }
061        frame.setJMenuBar(bar);
062
063        // set title if available
064        if (child.getTitle() != null) {
065            frame.setTitle(child.getTitle());
066        }
067
068        // arrange to run dispose on close
069        //frame.addWindowListener( new java.awt.event.WindowAdapter(){
070        //    jmri.util.swing.JmriPanel c;
071        //    { c = child; }
072        //    public void windowClosed(java.awt.event.WindowEvent e) {
073        //        c.dispose();
074        //    }
075        //});
076        // add to desktop
077        frame.pack();
078        frame.setVisible(true);
079        desktop.add(frame);
080        frame.moveToFront();
081    }
082
083    @Override
084    public void show(final jmri.util.swing.JmriPanel child,
085            jmri.util.swing.JmriAbstractAction act) {
086
087        show(child, act, Hint.DEFAULT);
088    }
089
090    @Override
091    public void dispose() {
092    }
093
094    /**
095     * Create new windows on each request
096     */
097    @Override
098    public boolean multipleInstances() {
099        return true;
100    }
101
102    @Override
103    public Frame getFrame() {
104        return (this.mainFrame != null) ? this.mainFrame : null;
105    }
106
107}