Package org.jnode.awt.swingpeers

Source Code of org.jnode.awt.swingpeers.SwingBaseWindowPeer

/*
* $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);
        }
    }
}
TOP

Related Classes of org.jnode.awt.swingpeers.SwingBaseWindowPeer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.