Files
odfstudio/bean/com/sun/star/comp/beans/LocalOfficeWindow.java
T
David Ostrovsky 1fd41f43eb Add build toolchain to upload LibreOffice API to Maven Central
Set up the toolchain to create sources and javadocs artifacts in
addition to JARs created during the build. Use Buck build tool for
that: [1]. This is a fork of Google's build tool Blaze, created by
Xooglers at Facebook. This build tool (like Blaze itself) uses
Python to write build files.

Add needed tools and build files to install LibreOffice API artifacts
to local Maven repository or deploy them to Maven Central.

To build all needed artifacts LibreOffice must be built regularly
with GNU make first. To build the rest of the API (sources and
javadocs):

  $> buck build api

To replace version number with upcoming release version:

  $> solenv/bin/version.py 5.1.0

To install the API to local Maven repository:

  $> buck build api_install

To deploy the API to Maven Central:

  $> buck build api_deploy

Detailed documentation is added to document the prerequisites and
the workflow to upload LibreOffice API to Maven Central.

* [1] https://buckbuild.com

Change-Id: Ibdd552a01110836703bc069abe829b9921491cac
Reviewed-on: https://gerrit.libreoffice.org/20343
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Tested-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
2015-12-03 23:32:11 +00:00

267 lines
8.7 KiB
Java

/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 .
*/
package com.sun.star.comp.beans;
import java.awt.Component;
import com.sun.star.lang.EventObject;
import com.sun.star.lang.SystemDependent;
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.Any;
import com.sun.star.uno.Type;
import com.sun.star.beans.NamedValue;
/**
* This class represents a local office window.
*
* @since OOo 2.0.0
*/
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.
*/
protected LocalOfficeWindow(OfficeConnection connection)
{
mConnection = connection;
mConnection.addEventListener(this);
}
/**
* Retrieves an AWT component object associated with the OfficeWindow.
*
* @return The AWT component object associated with the OfficeWindow.
*/
public Component getAWTComponent()
{
return this;
}
/**
* Receives a notification about the connection has been closed.
* This method has to set the connection to <code>null</code>.
*
* @param 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.
XComponentContext xContext = mConnection.getComponentContext();
XMultiComponentFactory compfactory = xContext.getServiceManager();
XMultiServiceFactory factory = UnoRuntime.queryInterface(
XMultiServiceFactory.class, compfactory);
Object object = factory.createInstance( "com.sun.star.awt.Toolkit");
return UnoRuntime.queryInterface(XToolkit.class, object);
}
/// called when system parent is available, reparents the bean window
private synchronized void aquireSystemWindow()
{
if ( !bPeer )
{
// set real parent
XVclWindowPeer xVclWindowPeer = UnoRuntime.queryInterface(
XVclWindowPeer.class, mWindow);
xVclWindowPeer.setProperty( "PluginParent", getWrappedWindowHandle());
bPeer = true;
// show document window
XWindow aWindow = UnoRuntime.queryInterface(XWindow.class, mWindow);
aWindow.setVisible( true );
}
}
/// called when system parent is about to die, reparents the bean window
private synchronized void releaseSystemWindow()
{
if ( bPeer )
{
// hide document window
XWindow aWindow = UnoRuntime.queryInterface(XWindow.class, mWindow);
aWindow.setVisible( false );
// set null parent
XVclWindowPeer xVclWindowPeer = UnoRuntime.queryInterface(
XVclWindowPeer.class, mWindow);
xVclWindowPeer.setProperty( "PluginParent", Long.valueOf(0) );
bPeer = false;
}
}
/// Overriding java.awt.Component.setVisible() due to Java bug (no showing event).
@Override
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();
}
/**
* Retrieves an UNO XWindowPeer object associated with the OfficeWindow.
*
* @return The UNO XWindowPeer object associated with the OfficeWindow.
*/
public synchronized XWindowPeer getUNOWindowPeer()
{
if (mWindow != null)
return mWindow;
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
parentPeer = new JavaWindowPeerFake(getWrappedWindowHandle(), 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);
// set initial visibility
XWindow aWindow = UnoRuntime.queryInterface(XWindow.class, mWindow);
aWindow.setVisible( bPeer );
}
catch (com.sun.star.uno.Exception exp) {
}
return mWindow;
}
/** We make sure that the office window is notified that the parent
* will be removed.
*/
@Override
public void removeNotify()
{
try {
releaseSystemWindow();
} catch (java.lang.Exception e) {
System.err.println("LocaleOfficeWindow.removeNotify: Exception in releaseSystemWindow.");
System.err.println(e.getMessage());
e.printStackTrace(System.err);
}
super.removeNotify();
}
/**
* Retrieves a platform dependent system window identifier.
*
* @return The system window identifier.
*/
private native long getNativeWindow();
/**
* Retrieves a platform dependent system window type.
*
* @return The system window type.
*/
private native int getNativeWindowSystemType();
/**
* Returns an Any containing a sequences of com.sun.star.beans.NamedValue. One NamedValue
* contains the name "WINDOW" and the value is a Long representing the window handle.
* The second NamedValue has the name "XEMBED" and the value is true, when the XEmbed
* protocol shall be used fore embedding the native Window.
*/
protected Any getWrappedWindowHandle()
{
NamedValue window = new NamedValue(
"WINDOW", new Any(new Type(Long.class), Long.valueOf(getNativeWindow())));
NamedValue xembed = new NamedValue(
"XEMBED", new Any(new Type(Boolean.class), Boolean.FALSE));
if (getNativeWindowSystemType() == SystemDependent.SYSTEM_XWINDOW )
{
String vendor = System.getProperty("java.vendor");
if ((vendor.equals("Sun Microsystems Inc.") || vendor.equals("Oracle Corporation"))
&& Boolean.getBoolean("sun.awt.xembedserver"))
{
xembed = new NamedValue(
"XEMBED",
new Any(new Type(Boolean.class), Boolean.TRUE));
}
}
return new Any(
new Type("[]com.sun.star.beans.NamedValue"),
new NamedValue[] {window, xembed});
}
}