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}