/*
JPC: An x86 PC Hardware Emulator for a pure Java Virtual Machine
Release Version 2.4
A project from the Physics Dept, The University of Oxford
Copyright (C) 2007-2010 The University of Oxford
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2 as published by
the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Details (including contact information) can be found at:
jpc.sourceforge.net
or the developer website
sourceforge.net/projects/jpc/
Conceived and Developed by:
Rhys Newman, Ian Preston, Chris Dennis
End of licence header
*/
package org.jpc.debugger.util;
import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyVetoException;
import java.util.logging.*;
import javax.swing.*;
public class ApplicationFrame extends JFrame
{
private static final Logger LOGGING = Logger.getLogger(ApplicationFrame.class.getName());
public ApplicationFrame(String name)
{
super(name);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
addWindowListener(new W1());
setBoundsToMaximum();
}
public void setBoundsToMaximum()
{
setBounds(getMaximumBounds());
}
class W1 extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
frameCloseRequested();
}
}
protected void frameCloseRequested()
{
}
protected void unhandledAWTException(Throwable t)
{
LOGGING.log(Level.FINE, "unhandled AWT exception", t);
}
public void addInternalFrame(JDesktopPane desktop, int x, int y, JInternalFrame f)
{
int width = f.getPreferredSize().width;
int height = f.getPreferredSize().height;
if (x < 0)
x = desktop.getWidth() + x - width;
if (y < 0)
y = desktop.getHeight() + y - height;
f.setBounds(x, y, width, height);
f.setVisible(true);
desktop.add(f);
desktop.moveToFront(f);
desktop.setSelectedFrame(f);
f.requestFocus();
}
public void reviveFrame(JDesktopPane desktop, JInternalFrame jf)
{
try {
if (jf.isIcon())
jf.setIcon(false);
} catch (PropertyVetoException e) {
LOGGING.log(Level.INFO, "Couldn't de-iconfiy frame", e);
}
Rectangle bounds = jf.getBounds();
if (!getBounds().contains(bounds))
jf.setBounds(100, 100, bounds.width, bounds.height);
desktop.moveToFront(jf);
desktop.setSelectedFrame(jf);
jf.requestFocus();
}
public void alert(String message)
{
alert(message, JOptionPane.INFORMATION_MESSAGE);
}
public void alert(String message, int type)
{
alert(message, getTitle(), type);
}
public void alert(String message, String title, int type)
{
JOptionPane.showMessageDialog(this, message, title, type);
}
public void alert(String message, String title, Throwable e)
{
JOptionPane.showMessageDialog(this, message+"\n"+e, title, JOptionPane.ERROR_MESSAGE);
}
public boolean confirm(String message, String title)
{
return JOptionPane.showConfirmDialog(this, message, title, JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION;
}
public int confirm(String message, String title, int optionType)
{
return JOptionPane.showConfirmDialog(this, message, title, optionType);
}
public static class AWTErrorHandler
{
public void handle(Throwable t)
{
if (t instanceof ThreadDeath)
throw (ThreadDeath) t;
AWTEvent evt = EventQueue.getCurrentEvent();
if (evt == null)
{
LOGGING.log(Level.FINE, "exception during event dispatch", t);
return;
}
Object source = evt.getSource();
if (source instanceof Component)
{
Component comp = (Component) source;
while (comp != null)
{
if (comp instanceof UtilityFrame)
{
UtilityFrame af = (UtilityFrame) comp;
af.getReportPanel().unhandledAWTException(t);
return;
}
if (comp instanceof ApplicationFrame)
{
ApplicationFrame af = (ApplicationFrame) comp;
af.unhandledAWTException(t);
return;
}
comp = comp.getParent();
}
}
LOGGING.log(Level.FINE, "exception during event dispatch (on unknown source type)", t);
t.printStackTrace();
}
}
public static Rectangle getMaximumBounds()
{
GraphicsDevice ge = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
GraphicsConfiguration gf = ge.getDefaultConfiguration();
Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gf);
Rectangle bounds = gf.getBounds();
return new Rectangle(bounds.x + insets.left, bounds.y + insets.top, bounds.width - insets.left - insets.right, bounds.height - insets.top - insets.bottom);
}
public static String scanArgs(String[] args, String key, String defaultValue)
{
if (key.startsWith("-"))
key = key.substring(1);
for (int i=0; i<args.length-1; i++)
{
if (!args[i].startsWith("-"))
continue;
if (!args[i].substring(1).toLowerCase().equals(key.toLowerCase()))
continue;
String value = args[i+1];
if (value.startsWith("\""))
value = value.substring(1);
if (value.startsWith("'"))
value = value.substring(1);
if (value.endsWith("'"))
value = value.substring(0, value.length()-1);
if (value.endsWith("\""))
value = value.substring(0, value.length()-1);
return args[i+1];
}
return defaultValue;
}
public static void initialise()
{
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
LOGGING.log(Level.INFO, "Couldn't load System Look-and-Feel", e);
} catch (InstantiationException e) {
LOGGING.log(Level.INFO, "Couldn't load System Look-and-Feel", e);
} catch (IllegalAccessException e) {
LOGGING.log(Level.INFO, "Couldn't load System Look-and-Feel", e);
} catch (UnsupportedLookAndFeelException e) {
LOGGING.log(Level.INFO, "Couldn't load System Look-and-Feel", e);
}
System.setProperty("sun.awt.exception.handler", AWTErrorHandler.class.getName());
}
}