xref: /AOO41X/main/embeddedobj/test/Container1/PaintThread.java (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 package embeddedobj.test;
2 
3 import java.awt.*;
4 import java.applet.*;
5 import java.awt.event.*;
6 import java.net.*;
7 import java.io.*;
8 import java.lang.Thread;
9 
10 import com.sun.star.awt.XBitmap;
11 import com.sun.star.awt.XDevice;
12 import com.sun.star.awt.XDisplayBitmap;
13 import com.sun.star.awt.XGraphics;
14 import com.sun.star.awt.XWindow;
15 import com.sun.star.awt.XWindowPeer;
16 import com.sun.star.awt.XToolkit;
17 import com.sun.star.awt.XSystemChildFactory;
18 import com.sun.star.awt.WindowDescriptor;
19 import com.sun.star.awt.WindowClass;
20 import com.sun.star.awt.WindowAttribute;
21 
22 import com.sun.star.uno.UnoRuntime;
23 import com.sun.star.lang.XMultiServiceFactory;
24 
25 class PaintThread extends java.lang.Thread
26 {
27 	private XWindow m_xWindow;
28 	private XBitmap m_xBitmap;
29 	private com.sun.star.awt.Rectangle m_aRect;
30 
31 	private Object m_oRequestsLock;
32 	private boolean m_bToPaint = false;
33 
34 	private boolean m_bDisposed = false;
35 
36 	public static boolean interceptedRects( com.sun.star.awt.Rectangle aRect1, com.sun.star.awt.Rectangle aRect2 )
37 	{
38 		return ( ( aRect1.X <= aRect2.X && aRect2.X <= aRect1.X + aRect1.Width
39 				|| aRect1.X <= aRect2.X + aRect2.Width && aRect2.X + aRect2.Width <= aRect1.X + aRect1.Width
40 				|| aRect2.X <= aRect1.X && aRect1.X <= aRect2.X + aRect2.Width
41 				|| aRect2.X <= aRect1.X + aRect1.Width && aRect1.X + aRect1.Width <= aRect2.X + aRect2.Width )
42 			  && ( aRect1.Y <= aRect2.Y && aRect2.Y <= aRect1.Y + aRect1.Height
43 				|| aRect1.Y <= aRect2.Y + aRect2.Height && aRect2.Y + aRect2.Height <= aRect1.Y + aRect1.Height
44 				|| aRect2.Y <= aRect1.Y && aRect1.Y <= aRect2.Y + aRect2.Height
45 				|| aRect2.Y <= aRect1.Y + aRect1.Height && aRect1.Y + aRect1.Height <= aRect2.Y + aRect2.Height ) );
46 	}
47 
48 	public PaintThread( XWindow xWindow )
49 	{
50 		m_oRequestsLock = new Object();
51 		m_xWindow = xWindow;
52 	}
53 
54 	public void setPaintRequest( XBitmap xBitmap, com.sun.star.awt.Rectangle aRect, com.sun.star.awt.Rectangle aClip )
55 	{
56 		synchronized( m_oRequestsLock )
57 		{
58 		/*
59 			System.out.println( "Paint request Pos( "
60 													+ aRect.X + ", "
61 													+ aRect.Y + ", "
62 													+ aRect.Width + ", "
63 													+ aRect.Height + " ), Clip ( "
64 													+ aClip.X + ", "
65 													+ aClip.Y + ", "
66 													+ aClip.Width + ", "
67 													+ aClip.Height + " )" );
68 		*/
69 
70 			if ( PaintThread.interceptedRects( aRect, aClip ) )
71 			{
72 				m_xBitmap = xBitmap;
73 				m_aRect = aRect;
74 				m_bToPaint = true;
75 			}
76 		}
77 
78 		// System.out.println( "Paint request to paint thread is done! xBitmap = " + xBitmap );
79 	}
80 
81 	public void disposeThread()
82 	{
83 		m_bDisposed = true;
84 	}
85 
86 	public void run()
87 	{
88 		while( !m_bDisposed )
89 		{
90 			try {
91 				Thread.sleep( 200 );
92 			} catch( Exception e ) {}
93 
94 			XBitmap xBitmap = null;
95 			com.sun.star.awt.Rectangle aRect = null;
96 			boolean bPaint = false;
97 
98 			synchronized( m_oRequestsLock )
99 			{
100 				if ( m_bToPaint )
101 				{
102 					xBitmap = m_xBitmap;
103 					aRect = m_aRect;
104 					m_bToPaint = false;
105 					bPaint = true;
106 				}
107 			}
108 
109 			if ( bPaint )
110 			{
111 				// System.out.println( "The bitmap is going to be painted!" );
112 				XDevice xDevice = (XDevice)UnoRuntime.queryInterface( XDevice.class, m_xWindow );
113 				if ( xDevice != null )
114 				{
115 				 	// System.out.println( "Step1" );
116 					XGraphics xGraphics = xDevice.createGraphics();
117 					if ( xBitmap != null )
118 					{
119 						// System.out.println( "Step2" );
120 						XDisplayBitmap xDisplayBitmap = xDevice.createDisplayBitmap( xBitmap );
121 
122 						com.sun.star.awt.Size aSize = xBitmap.getSize();
123 						xGraphics.draw( xDisplayBitmap, 0, 0, aSize.Width, aSize.Height,
124 													aRect.X, aRect.Y, aRect.Width, aRect.Height );
125 					}
126 
127 					// System.out.println( "Step3" );
128 					// xGraphics.drawRect( aRect.X - 1, aRect.Y - 1, aRect.Width + 2, aRect.Height + 2 );
129 					xGraphics.drawLine( aRect.X - 1, aRect.Y - 1,
130 										aRect.X + aRect.Width + 1, aRect.Y - 1 );
131 					xGraphics.drawLine( aRect.X + aRect.Width + 1, aRect.Y - 1,
132 										aRect.X + aRect.Width + 1, aRect.Y + aRect.Height + 1 );
133 					xGraphics.drawLine( aRect.X + aRect.Width + 1, aRect.Y + aRect.Height + 1,
134 										aRect.X - 1, aRect.Y + aRect.Height + 1 );
135 					xGraphics.drawLine( aRect.X - 1, aRect.Y + aRect.Height + 1,
136 										aRect.X - 1, aRect.Y - 1 );
137 
138 					// draw resize squares
139 					// System.out.println( "Step4" );
140 					// xGraphics.drawRect( aRect.X - 2, aRect.Y - 2, 4, 4 );
141 					// xGraphics.drawRect( aRect.X + aRect.Width - 2, aRect.Y - 2, 4, 4 );
142 					// xGraphics.drawRect( aRect.X - 2, aRect.Y + aRect.Height - 2, 4, 4 );
143 					// xGraphics.drawRect( aRect.X + aRect.Width - 2, aRect.Y + aRect.Height - 2, 4, 4 );
144 
145 					// System.out.println( "Step5" );
146 
147 					// System.out.println( "The bitmap is painted by paint thread!" );
148 				}
149 			}
150 		}
151 	}
152 };
153 
154