xref: /trunk/main/embeddedobj/test/Container1/PaintThread.java (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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