/**************************************************************
 *
 * 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
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/



package embeddedobj.test;

import java.awt.*;

import com.sun.star.uno.*;
import com.sun.star.lang.*;
import com.sun.star.awt.*;
import com.sun.star.util.*;
import com.sun.star.beans.*;
import com.sun.star.container.*;

/** <p>Class to pass the system window handle to the OpenOffice toolkit.</p>
 */
class JavaWindowPeerFake implements XSystemDependentWindowPeer,
									XWindowPeer
{
	NativeView maView;

	public JavaWindowPeerFake( NativeView aNative )
	{
		maView = aNative;
	}

	// ____________________
	/**
	 * Implementation of XSystemDependentWindowPeer (that's all we really need).
	 * This method is called back from the OpenOffice toolkit to retrieve the system data.
	 */
	public java.lang.Object getWindowHandle( byte[] aProcessId, short aSystem )
		throws com.sun.star.uno.RuntimeException
	{
		Object aReturn = null;
		if( aSystem == maView.maSystem )
			aReturn = ( Object )maView.maHandle;

		return aReturn;
	}

	/** not really needed.
	 */
	public XToolkit getToolkit()
		throws com.sun.star.uno.RuntimeException
	{
		return null;
	}

	public void setPointer( XPointer xPointer )
		throws com.sun.star.uno.RuntimeException
	{
	}

	public void setBackground( int nColor )
		throws com.sun.star.uno.RuntimeException
	{
	}

	public void invalidate( short nFlags )
		throws com.sun.star.uno.RuntimeException
	{
	}

	public void invalidateRect( com.sun.star.awt.Rectangle aRect,short nFlags )
		throws com.sun.star.uno.RuntimeException
	{
	}

	public void dispose()
		throws com.sun.star.uno.RuntimeException
	{
	}

	public void addEventListener( XEventListener xListener )
		throws com.sun.star.uno.RuntimeException
	{
	}

	public void removeEventListener( XEventListener xListener )
		throws com.sun.star.uno.RuntimeException
	{
	}
}
