/**************************************************************
 * 
 * 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!" );
				}
			}
		}
	}
};

