/**************************************************************
 *
 * 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 java.applet.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.lang.Thread;

import com.sun.star.awt.XBitmap;
import com.sun.star.awt.XDevice;
import com.sun.star.awt.XDisplayBitmap;
import com.sun.star.awt.XGraphics;
import com.sun.star.awt.XWindow;
import com.sun.star.awt.XWindowPeer;
import com.sun.star.awt.XToolkit;
import com.sun.star.awt.XSystemChildFactory;
import com.sun.star.awt.WindowDescriptor;
import com.sun.star.awt.WindowClass;
import com.sun.star.awt.WindowAttribute;

import com.sun.star.uno.UnoRuntime;
import com.sun.star.lang.XMultiServiceFactory;

class PaintThread extends java.lang.Thread
{
	private XWindow m_xWindow;
	private XBitmap m_xBitmap;
	private com.sun.star.awt.Rectangle m_aRect;

	private Object m_oRequestsLock;
	private boolean m_bToPaint = false;

	private boolean m_bDisposed = false;

	public static boolean interceptedRects( com.sun.star.awt.Rectangle aRect1, com.sun.star.awt.Rectangle aRect2 )
	{
		return ( ( aRect1.X <= aRect2.X && aRect2.X <= aRect1.X + aRect1.Width
				|| aRect1.X <= aRect2.X + aRect2.Width && aRect2.X + aRect2.Width <= aRect1.X + aRect1.Width
				|| aRect2.X <= aRect1.X && aRect1.X <= aRect2.X + aRect2.Width
				|| aRect2.X <= aRect1.X + aRect1.Width && aRect1.X + aRect1.Width <= aRect2.X + aRect2.Width )
			  && ( aRect1.Y <= aRect2.Y && aRect2.Y <= aRect1.Y + aRect1.Height
				|| aRect1.Y <= aRect2.Y + aRect2.Height && aRect2.Y + aRect2.Height <= aRect1.Y + aRect1.Height
				|| aRect2.Y <= aRect1.Y && aRect1.Y <= aRect2.Y + aRect2.Height
				|| aRect2.Y <= aRect1.Y + aRect1.Height && aRect1.Y + aRect1.Height <= aRect2.Y + aRect2.Height ) );
	}

	public PaintThread( XWindow xWindow )
	{
		m_oRequestsLock = new Object();
		m_xWindow = xWindow;
	}

	public void setPaintRequest( XBitmap xBitmap, com.sun.star.awt.Rectangle aRect, com.sun.star.awt.Rectangle aClip )
	{
		synchronized( m_oRequestsLock )
		{
		/*
			System.out.println( "Paint request Pos( "
													+ aRect.X + ", "
													+ aRect.Y + ", "
													+ aRect.Width + ", "
													+ aRect.Height + " ), Clip ( "
													+ aClip.X + ", "
													+ aClip.Y + ", "
													+ aClip.Width + ", "
													+ aClip.Height + " )" );
		*/

			if ( PaintThread.interceptedRects( aRect, aClip ) )
			{
				m_xBitmap = xBitmap;
				m_aRect = aRect;
				m_bToPaint = true;
			}
		}

		// System.out.println( "Paint request to paint thread is done! xBitmap = " + xBitmap );
	}

	public void disposeThread()
	{
		m_bDisposed = true;
	}

	public void run()
	{
		while( !m_bDisposed )
		{
			try {
				Thread.sleep( 200 );
			} catch( Exception e ) {}

			XBitmap xBitmap = null;
			com.sun.star.awt.Rectangle aRect = null;
			boolean bPaint = false;

			synchronized( m_oRequestsLock )
			{
				if ( m_bToPaint )
				{
					xBitmap = m_xBitmap;
					aRect = m_aRect;
					m_bToPaint = false;
					bPaint = true;
				}
			}

			if ( bPaint )
			{
				// System.out.println( "The bitmap is going to be painted!" );
				XDevice xDevice = (XDevice)UnoRuntime.queryInterface( XDevice.class, m_xWindow );
				if ( xDevice != null )
				{
				 	// System.out.println( "Step1" );
					XGraphics xGraphics = xDevice.createGraphics();
					if ( xBitmap != null )
					{
						// System.out.println( "Step2" );
						XDisplayBitmap xDisplayBitmap = xDevice.createDisplayBitmap( xBitmap );

						com.sun.star.awt.Size aSize = xBitmap.getSize();
						xGraphics.draw( xDisplayBitmap, 0, 0, aSize.Width, aSize.Height,
													aRect.X, aRect.Y, aRect.Width, aRect.Height );
					}

					// System.out.println( "Step3" );
					// xGraphics.drawRect( aRect.X - 1, aRect.Y - 1, aRect.Width + 2, aRect.Height + 2 );
					xGraphics.drawLine( aRect.X - 1, aRect.Y - 1,
										aRect.X + aRect.Width + 1, aRect.Y - 1 );
					xGraphics.drawLine( aRect.X + aRect.Width + 1, aRect.Y - 1,
										aRect.X + aRect.Width + 1, aRect.Y + aRect.Height + 1 );
					xGraphics.drawLine( aRect.X + aRect.Width + 1, aRect.Y + aRect.Height + 1,
										aRect.X - 1, aRect.Y + aRect.Height + 1 );
					xGraphics.drawLine( aRect.X - 1, aRect.Y + aRect.Height + 1,
										aRect.X - 1, aRect.Y - 1 );

					// draw resize squares
					// System.out.println( "Step4" );
					// xGraphics.drawRect( aRect.X - 2, aRect.Y - 2, 4, 4 );
					// xGraphics.drawRect( aRect.X + aRect.Width - 2, aRect.Y - 2, 4, 4 );
					// xGraphics.drawRect( aRect.X - 2, aRect.Y + aRect.Height - 2, 4, 4 );
					// xGraphics.drawRect( aRect.X + aRect.Width - 2, aRect.Y + aRect.Height - 2, 4, 4 );

					// System.out.println( "Step5" );

					// System.out.println( "The bitmap is painted by paint thread!" );
				}
			}
		}
	}
};
