diff options
author | Michael Hönnig <mi@openoffice.org> | 2004-10-18 06:17:33 +0000 |
---|---|---|
committer | Michael Hönnig <mi@openoffice.org> | 2004-10-18 06:17:33 +0000 |
commit | 0f1804d788cef94b54092fa904af0d947f3da284 (patch) | |
tree | fad84973b80d156d1238cbf7041716ca2a52b5c3 /bean/com/sun/star/beans/LocalOfficeWindow.java | |
parent | 821f00019c6dcf54e801bedc38ff65899c844b1f (diff) |
SO7 compatibility
Diffstat (limited to 'bean/com/sun/star/beans/LocalOfficeWindow.java')
-rw-r--r-- | bean/com/sun/star/beans/LocalOfficeWindow.java | 287 |
1 files changed, 277 insertions, 10 deletions
diff --git a/bean/com/sun/star/beans/LocalOfficeWindow.java b/bean/com/sun/star/beans/LocalOfficeWindow.java index 832b1e3030f7..60bf52c7e433 100644 --- a/bean/com/sun/star/beans/LocalOfficeWindow.java +++ b/bean/com/sun/star/beans/LocalOfficeWindow.java @@ -2,9 +2,9 @@ * * $RCSfile: LocalOfficeWindow.java,v $ * - * $Revision: 1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: mi $ $Date: 2004-10-14 10:34:39 $ + * last change: $Author: mi $ $Date: 2004-10-18 07:15:35 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -12,11 +12,11 @@ * - GNU Lesser General Public License Version 2.1 * - Sun Industry Standards Source License Version 1.1 * - * Sun Microsystems Inc., September, 2004 + * Sun Microsystems Inc., October, 2000 * * GNU Lesser General Public License Version 2.1 * ============================================= - * Copyright 2004 by Sun Microsystems, Inc. + * Copyright 2000 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * This library is free software; you can redistribute it and/or @@ -50,7 +50,7 @@ * * The Initial Developer of the Original Code is: Sun Microsystems, Inc. * - * Copyright: 2004 by Sun Microsystems, Inc. + * Copyright: 2000 by Sun Microsystems, Inc. * * All Rights Reserved. * @@ -61,16 +61,283 @@ package com.sun.star.beans; -/** This class represents a local office window. +import java.awt.Component; +import java.awt.Canvas; - @deprecated - use com.sun.star.comp.beans.LocalOfficeWindow instead +import com.sun.star.lang.EventObject; +import com.sun.star.lang.SystemDependent; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XEventListener; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.XMultiComponentFactory; +import com.sun.star.awt.Rectangle; +import com.sun.star.awt.XWindow; +import com.sun.star.awt.XWindowPeer; +import com.sun.star.awt.XVclWindowPeer; +import com.sun.star.awt.XToolkit; +import com.sun.star.awt.WindowDescriptor; +import com.sun.star.awt.WindowAttribute; +import com.sun.star.awt.WindowClass; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XComponentContext; +import com.sun.star.uno.Exception; + +/** + * This class represents a local office window. */ public class LocalOfficeWindow - extends com.sun.star.comp.beans.LocalOfficeWindow + extends java.awt.Canvas + implements OfficeWindow, XEventListener { + private transient OfficeConnection mConnection; + private transient XWindowPeer mParentProxy; + private transient XWindowPeer mWindow; + private boolean bPeer = false; + + /** + * Construnctor. + * + * @param connection The office connection object the window + * belongs to. + */ /* package */ LocalOfficeWindow(OfficeConnection connection) { - super( connection ); + mConnection = connection; + mConnection.addEventListener((XEventListener)this); + } + + /** + * Retrives an AWT component object associated with the OfficeWindow. + * + * @return The AWT component object associated with the OfficeWindow. + */ + public Component getAWTComponent() + { + return this; + } + + /** + * Retrives an UNO XWindowPeer object associated with the OfficeWindow. + * + * @return The UNO XWindowPeer object associated with the OfficeWindow. + */ + public XWindowPeer getUNOWindowPeer() + { + if (mWindow == null) + createUNOWindowPeer(); + return mWindow; + } + + /** + * Receives a notification about the connection has been closed. + * This method has to set the connection to <code>null</code>. + * + * @source The event object. + */ + public void disposing(EventObject source) + { + // the window will be disposed by the framework + mWindow = null; + mConnection = null; } + + /** + * Returns an AWT toolkit. + */ + private XToolkit queryAWTToolkit() + throws com.sun.star.uno.Exception + { + // Create a UNO toolkit. + XMultiComponentFactory compfactory; + XComponentContext xContext = mConnection.getComponentContext(); + if ( xContext != null ) + { + compfactory = mConnection.getComponentContext().getServiceManager(); + XMultiServiceFactory factory; + factory = (XMultiServiceFactory)UnoRuntime.queryInterface( + XMultiServiceFactory.class, compfactory); + Object object = factory.createInstance( "com.sun.star.awt.Toolkit"); + return (XToolkit)UnoRuntime.queryInterface(XToolkit.class, object); + } + else + return null; + } + + /// called when system parent is available, reparents the bean window + private void aquireSystemWindow() + { + if ( !bPeer ) + { + // set real parent + XVclWindowPeer xVclWindowPeer = (XVclWindowPeer)UnoRuntime.queryInterface( + XVclWindowPeer.class, mWindow); + xVclWindowPeer.setProperty( "PluginParent", new Long(getNativeWindow()) ); + bPeer = true; + + // show document window + XWindow aWindow = (XWindow)UnoRuntime.queryInterface(XWindow.class, mWindow); + aWindow.setVisible( true ); + } + } + + /// called when system parent is about to die, reparents the bean window + private void releaseSystemWindow() + { + if ( bPeer ) + { + // hide document window + XWindow aWindow = (XWindow)UnoRuntime.queryInterface(XWindow.class, mWindow); + aWindow.setVisible( false ); + + // set null parent + XVclWindowPeer xVclWindowPeer = (XVclWindowPeer)UnoRuntime.queryInterface( + XVclWindowPeer.class, mWindow); + xVclWindowPeer.setProperty( "PluginParent", new Long(0) ); + bPeer = false; + } + } + + /// callback handler to get to know when we become visible + class ComponentEventHandler + extends java.awt.event.ComponentAdapter + { + public void componentHidden( java.awt.event.ComponentEvent e) + { + // only when we become invisible, we might lose our system window + CallWatchThread aCallWatchThread = new CallWatchThread( 500 ); + setVisible(false); + try { aCallWatchThread.cancel(); } + catch ( java.lang.InterruptedException aExc ) + {} // ignore + } + + public void componentShown( java.awt.event.ComponentEvent e) + { + // only when we become visible, we get a system window + aquireSystemWindow(); + } + } + + /// Overriding java.awt.Component.setVisible() due to Java bug (no showing event). + public void setVisible( boolean b ) + { + super.setVisible(b); + + // Java-Bug: componentShown() is never called :-( + // is still at least in Java 1.4.1_02 + if ( b ) + aquireSystemWindow(); + else + releaseSystemWindow(); + } + + /** Factory method for a UNO AWT toolkit window as a child of this Java window. + * + */ + private XWindowPeer createUNOWindowPeer() + { + try + { + // get this windows native window type + int type = getNativeWindowSystemType(); + + // Java AWT windows only have a system window when showing. + XWindowPeer parentPeer; + if ( isShowing() ) + { + // create direct parent relationship + //setVisible( true ); + parentPeer = new JavaWindowPeerFake( getNativeWindow(), type); + bPeer = true; + } + else + { + // no parent yet + parentPeer = null; + bPeer = false; + } + + // create native window (mWindow) + Rectangle aRect = new Rectangle( 0, 0, 20, 20 ); + WindowDescriptor desc = new WindowDescriptor(); + desc.Type = WindowClass.TOP; + desc.Parent = parentPeer; + desc.Bounds = aRect; + desc.WindowServiceName = "workwindow"; + desc.WindowAttributes = (type == SystemDependent.SYSTEM_WIN32) + ? WindowAttribute.SHOW : 0; + mWindow = queryAWTToolkit().createWindow(desc); + + // to get notified when we become visible + addComponentListener( new ComponentEventHandler() ); + + // set initial visibility + XWindow aWindow = (XWindow)UnoRuntime.queryInterface(XWindow.class, mWindow); + aWindow.setVisible( bPeer ); + } + catch (com.sun.star.uno.Exception exp) { + } + + return mWindow; + } + + /** + * Retrives a platform dependant system window identifier. + * + * @return The system window identifier. + */ + private native long getNativeWindow(); + + /** + * Retrives a platform dependant system window type. + * + * @return The system window type. + */ + private native int getNativeWindowSystemType(); + + //--------------------------------------------------------------------------- + /** Helper class to watch calls into OOo with a timeout. + */ + class CallWatchThread extends Thread + { + Thread aWatchedThread; + long nTimeout; + + CallWatchThread( long nTimeout ) + { + this.aWatchedThread = Thread.currentThread(); + this.nTimeout = nTimeout; + start(); + } + + void cancel() + throws java.lang.InterruptedException + { + Thread aThread = aWatchedThread; + aWatchedThread = null; + stop(); + + if ( aThread.interrupted() ) + throw new InterruptedException(); + } + + public void run() + { + while ( aWatchedThread != null ) + { + try { sleep( nTimeout ); } + catch ( java.lang.InterruptedException aExc ) + {} + + //synchronized + { + if ( aWatchedThread != null ) + { + aWatchedThread.interrupt(); + } + } + } + } + }; + } |