001 package org.shiftone.jrat.desktop; 002 003 import org.jdesktop.swingx.JXStatusBar; 004 import org.shiftone.jrat.desktop.action.file.*; 005 import org.shiftone.jrat.desktop.action.help.AboutAction; 006 import org.shiftone.jrat.desktop.action.help.DocsAction; 007 import org.shiftone.jrat.desktop.action.help.TipsAction; 008 import org.shiftone.jrat.desktop.action.inject.InjectDirectoryAction; 009 import org.shiftone.jrat.desktop.action.inject.InjectFileAction; 010 import org.shiftone.jrat.util.log.Logger; 011 012 import javax.swing.*; 013 import java.awt.*; 014 import java.awt.event.ComponentAdapter; 015 import java.awt.event.ComponentEvent; 016 import java.awt.event.ContainerEvent; 017 import java.awt.event.ContainerListener; 018 import java.io.InputStream; 019 020 /** 021 * @author jeff@shiftone.org (Jeff Drost) 022 */ 023 public class DesktopFrame extends JFrame { 024 025 private static final Logger LOG = Logger.getLogger(DesktopFrame.class); 026 027 private JXStatusBar statusBar = createStatusBar(); 028 private JTabbedPane tabbedPane = new JTabbedPane(); 029 private CloseAction closeAction = new CloseAction(tabbedPane); 030 private CloseAllAction closeAllAction = new CloseAllAction(tabbedPane); 031 private OpenAction openAction = new OpenAction(this); 032 private int waiters = 0; 033 034 public DesktopFrame() { 035 036 super("JRat Desktop"); 037 038 DesktopPreferences.setLastRunTime(System.currentTimeMillis()); 039 DesktopPreferences.incrementRunCount(); 040 041 setDefaultCloseOperation(EXIT_ON_CLOSE); 042 043 Rectangle windowBounds = DesktopPreferences.getWindowBounds(); 044 045 if (windowBounds == null) { 046 Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); 047 windowBounds = new Rectangle(50, 50, (int) dimension.getWidth() - 150, (int) dimension.getHeight() - 150); 048 } 049 050 setBounds(windowBounds); 051 052 053 setJMenuBar(createMenuBar()); 054 055 Container pane = getContentPane(); 056 pane.setLayout(new BorderLayout()); 057 pane.add(tabbedPane, BorderLayout.CENTER); 058 pane.add(statusBar, BorderLayout.SOUTH); 059 060 tabbedPane.addMouseListener(new TabMouseListener(tabbedPane)); 061 tabbedPane.addContainerListener(new TabChangeListener()); 062 checkTabs(); 063 064 addComponentListener(new ComponentListener()); 065 066 } 067 068 069 public void waitCursor() { 070 waiters++; 071 setCursor(Cursor.WAIT_CURSOR); 072 } 073 074 public void unwaitCursor() { 075 waiters--; 076 if (waiters == 0) { 077 setCursor(Cursor.DEFAULT_CURSOR); 078 } 079 } 080 081 private JMenuBar createMenuBar() { 082 JMenuBar toolBar = new JMenuBar(); 083 { 084 JMenu file = new JMenu("File"); 085 file.setMnemonic('F'); 086 file.add(openAction); 087 file.add(closeAction); 088 file.add(closeAllAction); 089 { 090 JMenu resize = new JMenu("Window Size"); 091 resize.setMnemonic('S'); 092 resize.add(new WindowSizeAction(this, 640, 480)); 093 resize.add(new WindowSizeAction(this, 800, 600)); 094 resize.add(new WindowSizeAction(this, 1024, 768)); 095 file.add(resize); 096 } 097 file.add(new ExitAction()); 098 file.add(new ClearPreferencesAction(this)); 099 100 toolBar.add(file); 101 } 102 103 { 104 JMenu inject = new JMenu("Inject"); 105 inject.setMnemonic('I'); 106 inject.add(new InjectDirectoryAction(this)); 107 inject.add(new InjectFileAction(this)); 108 109 toolBar.add(inject); 110 } 111 112 { 113 JMenu help = new JMenu("Help"); 114 help.setMnemonic('H'); 115 help.add(new AboutAction(this)); 116 help.add(new DocsAction(this)); 117 help.add(new TipsAction(this)); 118 119 toolBar.add(help); 120 } 121 122 return toolBar; 123 } 124 125 void open(String name, InputStream inputStream) { 126 openAction.open(name, inputStream); 127 } 128 129 public static JXStatusBar createStatusBar() { 130 131 JXStatusBar statusBar = new JXStatusBar(); 132 133 statusBar.setLayout(new BorderLayout()); 134 statusBar.add(Memory.createMemoryButton(), BorderLayout.EAST); 135 136 return statusBar; 137 } 138 139 public void createView(final String title, JComponent component) { 140 tabbedPane.addTab(title, component); 141 tabbedPane.setSelectedComponent(component); 142 } 143 144 private void checkTabs() { 145 boolean enableClose = tabbedPane.getTabCount() > 0; 146 closeAction.setEnabled(enableClose); 147 closeAllAction.setEnabled(enableClose); 148 } 149 150 private class ComponentListener extends ComponentAdapter { 151 152 public void componentResized(ComponentEvent e) { 153 DesktopPreferences.setWindowBounds(getBounds()); 154 } 155 156 public void componentMoved(ComponentEvent e) { 157 DesktopPreferences.setWindowBounds(getBounds()); 158 } 159 } 160 161 private class TabChangeListener implements ContainerListener { 162 163 public void componentAdded(ContainerEvent e) { 164 checkTabs(); 165 } 166 167 public void componentRemoved(ContainerEvent e) { 168 checkTabs(); 169 } 170 } 171 }