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