001: package org.uispec4j.interception.toolkit;
002:
003: import org.uispec4j.UISpec4J;
004:
005: import javax.swing.*;
006: import java.awt.*;
007: import java.awt.peer.*;
008:
009: /**
010: * Mock toolkit used for intercepting displayed frames and dialogs.<p>
011: * You can set it up by calling the {@link #setUp()} method.
012: *
013: * @see <a href="http://www.uispec4j.org/interception.html">Intercepting windows</a>
014: */
015: public class UISpecToolkit extends ToolkitDelegate {
016: static final String SYSTEM_PROPERTY = "awt.toolkit";
017: static final String UNIX_SYSTEM_DEFAULT_VALUE = "sun.awt.motif.MToolkit";
018: static final String WINDOWS_SYSTEM_DEFAULT_VALUE = "sun.awt.windows.WToolkit";
019:
020: private static String awtToolkit;
021:
022: public UISpecToolkit() {
023: setUp();
024: }
025:
026: /**
027: * @see UISpec4J#init
028: * @deprecated Do not call this one directly anymore - use {@link UISpec4J#init} instead
029: */
030: public static void setUp() {
031: if (underlyingToolkit != null) {
032: return;
033: }
034: awtToolkit = System.getProperty(SYSTEM_PROPERTY);
035: if (awtToolkit == null) {
036: setAwtToolkitProperty();
037: }
038: buildUnderlyingToolkit(awtToolkit);
039: System.setProperty(SYSTEM_PROPERTY, UISpecToolkit.class
040: .getName());
041: }
042:
043: /**
044: * Sets the <code>awt.toolkit</code> to its initial value.
045: * <p>This method will only work properly if the toolkit has not yet been instanciated by Swing.
046: */
047: public static void restoreAwtToolkit() {
048: System.setProperty(SYSTEM_PROPERTY, awtToolkit);
049: }
050:
051: public static UISpecToolkit instance() {
052: Toolkit defaultToolkit = Toolkit.getDefaultToolkit();
053: if (!(defaultToolkit instanceof UISpecToolkit)) {
054: fail("You must call UISpec4J.init() before using it");
055: }
056: return (UISpecToolkit) defaultToolkit;
057: }
058:
059: protected LightweightPeer createComponent(Component target) {
060: if (target instanceof JPopupMenu) {
061: UISpecDisplay.instance().setCurrentPopup(
062: (JPopupMenu) target);
063: }
064: return super .createComponent(target);
065: }
066:
067: public FramePeer createFrame(Frame target) {
068: return new UISpecFramePeer(target);
069: }
070:
071: public DialogPeer createDialog(Dialog target)
072: throws HeadlessException {
073: if (!(target instanceof JDialog)) {
074: throw new InterceptionInternalError("Dialogs of type '"
075: + target.getClass().getName()
076: + "' are not supported.");
077: }
078: return new UISpecDialogPeer((JDialog) target);
079: }
080:
081: public WindowPeer createWindow(Window target)
082: throws HeadlessException {
083: return new UISpecWindowPeer(target);
084: }
085:
086: public CanvasPeer createCanvas(Canvas target) {
087: return Empty.NULL_CANVAS_PEER;
088: }
089:
090: public PanelPeer createPanel(Panel target) {
091: return Empty.NULL_PANEL_PEER;
092: }
093:
094: public RobotPeer createRobot(Robot robot, GraphicsDevice device)
095: throws AWTException, HeadlessException {
096: return Empty.NULL_ROBOT;
097: }
098:
099: private static void fail(String msg) {
100: throw new InterceptionInternalError(msg);
101: }
102:
103: private static void setAwtToolkitProperty() {
104: try {
105: Class.forName(WINDOWS_SYSTEM_DEFAULT_VALUE);
106: awtToolkit = WINDOWS_SYSTEM_DEFAULT_VALUE;
107: } catch (ClassNotFoundException e) {
108: try {
109: Class.forName(UNIX_SYSTEM_DEFAULT_VALUE);
110: awtToolkit = UNIX_SYSTEM_DEFAULT_VALUE;
111: } catch (ClassNotFoundException e1) {
112: throw new AWTError("Unable to locate AWT Toolkit");
113: }
114: }
115: }
116:
117: private static void buildUnderlyingToolkit(String awtToolkit) {
118: try {
119: underlyingToolkit = (Toolkit) Class.forName(awtToolkit)
120: .newInstance();
121: } catch (Exception e) {
122: throw new AWTError("Unable to load AWT Toolkit: "
123: + awtToolkit + " - " + e.getLocalizedMessage());
124: }
125: }
126: }
|