diff options
author | Michael Hönnig <mi@openoffice.org> | 2004-09-06 14:11:38 +0000 |
---|---|---|
committer | Michael Hönnig <mi@openoffice.org> | 2004-09-06 14:11:38 +0000 |
commit | 4d05ec4dff25bd784b0aed90799729c43c165a82 (patch) | |
tree | e94bc3e849449051892fc1beb2206704768e82b5 /bean/com/sun/star/comp/beans/LocalOfficeWindow.java | |
parent | 99231b5f902d8bd0e413c9ab769f308baf901201 (diff) |
initial release
Diffstat (limited to 'bean/com/sun/star/comp/beans/LocalOfficeWindow.java')
-rw-r--r-- | bean/com/sun/star/comp/beans/LocalOfficeWindow.java | 343 |
1 files changed, 343 insertions, 0 deletions
diff --git a/bean/com/sun/star/comp/beans/LocalOfficeWindow.java b/bean/com/sun/star/comp/beans/LocalOfficeWindow.java new file mode 100644 index 000000000000..29ea22613c7f --- /dev/null +++ b/bean/com/sun/star/comp/beans/LocalOfficeWindow.java @@ -0,0 +1,343 @@ +/************************************************************************* + * + * $RCSfile: LocalOfficeWindow.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: mi $ $Date: 2004-09-06 15:11:33 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., September, 2004 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2004 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * 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., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2004 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package com.sun.star.comp.beans; + +import java.awt.Component; +import java.awt.Canvas; + +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 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) + { + 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(); + } + } + } + } + }; + +} |