/*
* $Id$
*
* Copyright (C) 2003-2014 JNode.org
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library 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 Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; If not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jnode.awt.swingpeers;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dialog;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.InvocationEvent;
import java.awt.event.WindowEvent;
import java.awt.peer.WindowPeer;
import java.beans.PropertyVetoException;
import javax.swing.JComponent;
import javax.swing.JDesktopPane;
import javax.swing.UIManager;
import javax.swing.event.InternalFrameEvent;
import javax.swing.event.InternalFrameListener;
import org.jnode.awt.JNodeToolkit;
import sun.awt.AppContext;
import sun.awt.SunToolkit;
/**
* @author Ewout Prangsma (epr@users.sourceforge.net)
*/
abstract class SwingBaseWindowPeer<awtT extends Window, swingPeerT extends SwingBaseWindow<awtT, swingPeerT>>
extends SwingContainerPeer<awtT, swingPeerT> implements WindowPeer {
private final WindowEventDispatcher eventDispatcher;
public SwingBaseWindowPeer(SwingToolkit toolkit, awtT window,
swingPeerT jComponent) {
super(toolkit, window, jComponent);
jComponent.initialize(this);
jComponent.getContentPane().setLayout(new SwingContainerLayout(targetComponent, this));
jComponent.setLocation(targetComponent.getLocation());
jComponent.setSize(targetComponent.getSize());
this.eventDispatcher = new WindowEventDispatcher();
jComponent.addInternalFrameListener(eventDispatcher);
jComponent.validatePeerOnly();
if (!window.isBackgroundSet()) {
Color bg = peerComponent.getBackground();
if (bg == null) bg = UIManager.getColor("window");
if (bg == null) bg = UIManager.getColor("control");
if (bg == null) bg = Color.GRAY;
window.setBackground(bg);
}
}
/**
* Add this window to the desktop.
*/
protected final void addToDesktop() {
Runnable run = new Runnable() {
public void run() {
final JDesktopPane desktop = toolkit.getAwtContext().getDesktop();
desktop.add(peerComponent);
try {
peerComponent.setSelected(true);
desktop.getDesktopManager().activateFrame(peerComponent);
peerComponent.toFront();
desktop.doLayout();
} catch (PropertyVetoException x) {
log.warn("", x);
}
}
};
final JDesktopPane desktop = toolkit.getAwtContext().getDesktop();
AppContext ac = SunToolkit.targetToAppContext(desktop);
if (ac != null) {
EventQueue eq = (EventQueue) ac.get(AppContext.EVENT_QUEUE_KEY);
if (eq != null) {
eq.postEvent(new InvocationEvent(Toolkit.getDefaultToolkit(), run));
return;
}
}
//shouldn't get here
throw new RuntimeException("Desktop event queue not found!");
}
/**
* @see org.jnode.awt.swingpeers.ISwingContainerPeer#addAWTComponent(java.awt.Component,
* javax.swing.JComponent)
*/
public final void addAWTComponent(Component awtComponent, JComponent peer) {
peerComponent.getContentPane().add(peer);
}
public final Point getLocationOnScreen() {
return peerComponent.getLocation();
}
/**
* @see java.awt.peer.ComponentPeer#getGraphics()
*/
public final Graphics getGraphics() {
//TODO review this
//return peerComponent.getGraphics();
return super.getGraphics();
}
/**
* @see java.awt.peer.ContainerPeer#getInsets()
*/
public final Insets getInsets() {
final Insets insets = new Insets(0, 0, 0, 0);
Object obj = this; //javac detects error for: this instanceof SwingWindowPeer
if (obj instanceof SwingWindowPeer) {
return insets;
} else {
final Container contentPane = peerComponent.getContentPane();
Component c = contentPane;
while (c != peerComponent) {
insets.left += c.getX();
insets.top += c.getY();
c = c.getParent();
}
final int dw = peerComponent.getWidth() - contentPane.getWidth();
final int dh = peerComponent.getHeight() - contentPane.getHeight();
insets.right = dw - insets.left;
insets.bottom = dh - insets.top;
return insets;
}
}
/**
* Sets the resizable flag of this window.
*
* @param resizeable
*/
public final void setResizable(boolean resizeable) {
peerComponent.setResizable(resizeable);
}
/**
* Sets the title of this window
*
* @param title
*/
public void setTitle(String title) {
peerComponent.setTitle(title);
}
public final void dispose() {
peerComponent.dispose();
toolkit.onDisposeFrame(this);
}
public void toBack() {
SwingToolkit.invokeNowOrLater(new Runnable() {
public void run() {
peerComponent.toBack();
}
});
}
public void toFront() {
SwingToolkit.invokeNowOrLater(new Runnable() {
public void run() {
peerComponent.toFront();
try {
peerComponent.setSelected(true);
} catch (PropertyVetoException x) {
log.warn(x);
}
}
});
}
/**
* Fire a WindowEvent with a given id to the awtComponent.
*/
private final void fireWindowEvent(int id) {
JNodeToolkit.postToTarget(new WindowEvent(targetComponent, id), targetComponent);
}
public void updateAlwaysOnTop() {
//TODO implement it
}
public boolean requestWindowFocus() {
//TODO implement it
return peerComponent.requestFocusInWindow();
}
public void updateIconImages() {
//TODO implement it
}
public void updateMinimumSize() {
//TODO implement it
}
public void setModalBlocked(Dialog blocker, boolean blocked) {
//TODO implement it
}
public void updateFocusableWindowState() {
//TODO implement it
}
public void setAlwaysOnTop(boolean alwaysOnTop) {
//TODO implement it
}
private class WindowEventDispatcher implements InternalFrameListener {
/**
* @see javax.swing.event.InternalFrameListener#internalFrameActivated(javax.swing.event.InternalFrameEvent)
*/
public void internalFrameActivated(InternalFrameEvent event) {
fireWindowEvent(WindowEvent.WINDOW_GAINED_FOCUS);
}
/**
* @see javax.swing.event.InternalFrameListener#internalFrameClosed(javax.swing.event.InternalFrameEvent)
*/
public void internalFrameClosed(InternalFrameEvent event) {
fireWindowEvent(WindowEvent.WINDOW_CLOSED);
}
/**
* @see javax.swing.event.InternalFrameListener#internalFrameClosing(javax.swing.event.InternalFrameEvent)
*/
public void internalFrameClosing(InternalFrameEvent event) {
fireWindowEvent(WindowEvent.WINDOW_CLOSING);
}
/**
* @see javax.swing.event.InternalFrameListener#internalFrameDeactivated(javax.swing.event.InternalFrameEvent)
*/
public void internalFrameDeactivated(InternalFrameEvent event) {
fireWindowEvent(WindowEvent.WINDOW_DEACTIVATED);
}
/**
* @see javax.swing.event.InternalFrameListener#internalFrameDeiconified(javax.swing.event.InternalFrameEvent)
*/
public void internalFrameDeiconified(InternalFrameEvent event) {
fireWindowEvent(WindowEvent.WINDOW_DEICONIFIED);
}
/**
* @see javax.swing.event.InternalFrameListener#internalFrameIconified(javax.swing.event.InternalFrameEvent)
*/
public void internalFrameIconified(InternalFrameEvent event) {
fireWindowEvent(WindowEvent.WINDOW_ICONIFIED);
}
/**
* @see javax.swing.event.InternalFrameListener#internalFrameOpened(javax.swing.event.InternalFrameEvent)
*/
public void internalFrameOpened(InternalFrameEvent event) {
fireWindowEvent(WindowEvent.WINDOW_OPENED);
}
}
}