1*cdf0e10cSrcweir package embeddedobj.test; 2*cdf0e10cSrcweir 3*cdf0e10cSrcweir import java.awt.*; 4*cdf0e10cSrcweir import java.applet.*; 5*cdf0e10cSrcweir import java.awt.event.*; 6*cdf0e10cSrcweir import java.net.*; 7*cdf0e10cSrcweir import java.io.*; 8*cdf0e10cSrcweir 9*cdf0e10cSrcweir import com.sun.star.awt.XBitmap; 10*cdf0e10cSrcweir import com.sun.star.awt.XDevice; 11*cdf0e10cSrcweir import com.sun.star.awt.XDisplayBitmap; 12*cdf0e10cSrcweir import com.sun.star.awt.XGraphics; 13*cdf0e10cSrcweir import com.sun.star.awt.XWindow; 14*cdf0e10cSrcweir import com.sun.star.awt.XWindowPeer; 15*cdf0e10cSrcweir import com.sun.star.awt.XToolkit; 16*cdf0e10cSrcweir import com.sun.star.awt.XSystemChildFactory; 17*cdf0e10cSrcweir import com.sun.star.awt.WindowDescriptor; 18*cdf0e10cSrcweir import com.sun.star.awt.WindowClass; 19*cdf0e10cSrcweir import com.sun.star.awt.WindowAttribute; 20*cdf0e10cSrcweir 21*cdf0e10cSrcweir import com.sun.star.awt.XPaintListener; 22*cdf0e10cSrcweir import com.sun.star.awt.PaintEvent; 23*cdf0e10cSrcweir import com.sun.star.awt.XMouseListener; 24*cdf0e10cSrcweir import com.sun.star.awt.XMouseMotionListener; 25*cdf0e10cSrcweir import com.sun.star.awt.MouseEvent; 26*cdf0e10cSrcweir import com.sun.star.awt.Point; 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime; 29*cdf0e10cSrcweir import com.sun.star.uno.Any; 30*cdf0e10cSrcweir import com.sun.star.lang.XMultiServiceFactory; 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir import com.sun.star.task.XJob; 33*cdf0e10cSrcweir import com.sun.star.beans.NamedValue; 34*cdf0e10cSrcweir 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir class BitmapPainter implements XPaintListener, XMouseListener, XMouseMotionListener, XJob 37*cdf0e10cSrcweir { 38*cdf0e10cSrcweir private XWindow m_xWindow; 39*cdf0e10cSrcweir private XBitmap m_xBitmap; 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir private com.sun.star.awt.Rectangle m_aDrawRect; 42*cdf0e10cSrcweir 43*cdf0e10cSrcweir private Object m_oImageLock; 44*cdf0e10cSrcweir 45*cdf0e10cSrcweir private PaintThread m_aPaintThread; 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir // private XJob m_xMainThreadExecutor; 48*cdf0e10cSrcweir // private NamedValue[] m_pValuesForExecutor; 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir private boolean m_bFree = true; 51*cdf0e10cSrcweir 52*cdf0e10cSrcweir private boolean m_bProceedWithPainting = true; 53*cdf0e10cSrcweir 54*cdf0e10cSrcweir // Methods 55*cdf0e10cSrcweir //------------------------------------------------------ 56*cdf0e10cSrcweir public BitmapPainter( XJob xJob, XWindow xWindow, XBitmap xBitmap, com.sun.star.awt.Rectangle aDrawRect ) 57*cdf0e10cSrcweir { 58*cdf0e10cSrcweir if ( xJob == null ) 59*cdf0e10cSrcweir { 60*cdf0e10cSrcweir System.out.println( "No mainthreadexecutor is provided to BimapPainter on init!" ); 61*cdf0e10cSrcweir throw new com.sun.star.uno.RuntimeException(); 62*cdf0e10cSrcweir } 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir if ( xWindow == null ) 65*cdf0e10cSrcweir { 66*cdf0e10cSrcweir System.out.println( "No window is provided to BimapPainter on init!" ); 67*cdf0e10cSrcweir throw new com.sun.star.uno.RuntimeException(); 68*cdf0e10cSrcweir } 69*cdf0e10cSrcweir 70*cdf0e10cSrcweir // m_xMainThreadExecutor = xJob; 71*cdf0e10cSrcweir // m_pValuesForExecutor = new NamedValue[1]; 72*cdf0e10cSrcweir // m_pValuesForExecutor[0] = new NamedValue( "JobToExecute", (Object)this ); 73*cdf0e10cSrcweir 74*cdf0e10cSrcweir m_xWindow = xWindow; 75*cdf0e10cSrcweir m_xBitmap = xBitmap; 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir m_aDrawRect = aDrawRect; 78*cdf0e10cSrcweir 79*cdf0e10cSrcweir m_oImageLock = new Object(); 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir m_aPaintThread = new PaintThread( m_xWindow ); 82*cdf0e10cSrcweir m_aPaintThread.start(); 83*cdf0e10cSrcweir 84*cdf0e10cSrcweir m_xWindow.addPaintListener( this ); 85*cdf0e10cSrcweir m_xWindow.addMouseListener( this ); 86*cdf0e10cSrcweir m_xWindow.addMouseMotionListener( this ); 87*cdf0e10cSrcweir } 88*cdf0e10cSrcweir 89*cdf0e10cSrcweir //------------------------------------------------------ 90*cdf0e10cSrcweir public void disconnectListener() 91*cdf0e10cSrcweir { 92*cdf0e10cSrcweir m_aPaintThread.disposeThread(); 93*cdf0e10cSrcweir m_xWindow.removePaintListener( this ); 94*cdf0e10cSrcweir m_xWindow.removeMouseListener( this ); 95*cdf0e10cSrcweir m_xWindow.removeMouseMotionListener( this ); 96*cdf0e10cSrcweir } 97*cdf0e10cSrcweir 98*cdf0e10cSrcweir //------------------------------------------------------ 99*cdf0e10cSrcweir public void setBitmap( XBitmap xBitmap ) 100*cdf0e10cSrcweir { 101*cdf0e10cSrcweir synchronized( m_oImageLock ) 102*cdf0e10cSrcweir { 103*cdf0e10cSrcweir m_xBitmap = xBitmap; 104*cdf0e10cSrcweir } 105*cdf0e10cSrcweir } 106*cdf0e10cSrcweir 107*cdf0e10cSrcweir //------------------------------------------------------ 108*cdf0e10cSrcweir public void setPos( com.sun.star.awt.Point aPoint ) 109*cdf0e10cSrcweir { 110*cdf0e10cSrcweir synchronized( m_oImageLock ) 111*cdf0e10cSrcweir { 112*cdf0e10cSrcweir m_aDrawRect.X = aPoint.X; 113*cdf0e10cSrcweir m_aDrawRect.Y = aPoint.Y; 114*cdf0e10cSrcweir } 115*cdf0e10cSrcweir } 116*cdf0e10cSrcweir 117*cdf0e10cSrcweir //------------------------------------------------------ 118*cdf0e10cSrcweir public void setRect( com.sun.star.awt.Rectangle aRect ) 119*cdf0e10cSrcweir { 120*cdf0e10cSrcweir synchronized( m_oImageLock ) 121*cdf0e10cSrcweir { 122*cdf0e10cSrcweir m_aDrawRect = aRect; 123*cdf0e10cSrcweir } 124*cdf0e10cSrcweir } 125*cdf0e10cSrcweir 126*cdf0e10cSrcweir //------------------------------------------------------ 127*cdf0e10cSrcweir public void setSize( com.sun.star.awt.Size aSize ) 128*cdf0e10cSrcweir { 129*cdf0e10cSrcweir synchronized( m_oImageLock ) 130*cdf0e10cSrcweir { 131*cdf0e10cSrcweir m_aDrawRect.Width = aSize.Width; 132*cdf0e10cSrcweir m_aDrawRect.Height = aSize.Height; 133*cdf0e10cSrcweir } 134*cdf0e10cSrcweir } 135*cdf0e10cSrcweir 136*cdf0e10cSrcweir //------------------------------------------------------ 137*cdf0e10cSrcweir public void stopPainting() 138*cdf0e10cSrcweir { 139*cdf0e10cSrcweir m_bProceedWithPainting = false; 140*cdf0e10cSrcweir } 141*cdf0e10cSrcweir 142*cdf0e10cSrcweir //------------------------------------------------------ 143*cdf0e10cSrcweir public void startPainting() 144*cdf0e10cSrcweir { 145*cdf0e10cSrcweir m_bProceedWithPainting = true; 146*cdf0e10cSrcweir } 147*cdf0e10cSrcweir 148*cdf0e10cSrcweir // XPaintListener 149*cdf0e10cSrcweir //------------------------------------------------------ 150*cdf0e10cSrcweir public void windowPaint( PaintEvent e ) 151*cdf0e10cSrcweir { 152*cdf0e10cSrcweir if ( !m_bProceedWithPainting ) 153*cdf0e10cSrcweir return; 154*cdf0e10cSrcweir 155*cdf0e10cSrcweir XBitmap xBitmap = null; 156*cdf0e10cSrcweir com.sun.star.awt.Rectangle aRect = null; 157*cdf0e10cSrcweir // boolean bFree = false; 158*cdf0e10cSrcweir 159*cdf0e10cSrcweir synchronized( m_oImageLock ) 160*cdf0e10cSrcweir { 161*cdf0e10cSrcweir xBitmap = m_xBitmap; 162*cdf0e10cSrcweir aRect = m_aDrawRect; 163*cdf0e10cSrcweir // if ( m_bFree ) 164*cdf0e10cSrcweir // { 165*cdf0e10cSrcweir // bFree = true; 166*cdf0e10cSrcweir // m_bFree = false; 167*cdf0e10cSrcweir // } 168*cdf0e10cSrcweir } 169*cdf0e10cSrcweir 170*cdf0e10cSrcweir m_aPaintThread.setPaintRequest( xBitmap, aRect, e.UpdateRect ); 171*cdf0e10cSrcweir // if ( bFree ) 172*cdf0e10cSrcweir // { 173*cdf0e10cSrcweir // try { 174*cdf0e10cSrcweir // m_xMainThreadExecutor.execute( m_pValuesForExecutor ); 175*cdf0e10cSrcweir // } catch( Exception ex ) 176*cdf0e10cSrcweir // { 177*cdf0e10cSrcweir // m_bFree = true; 178*cdf0e10cSrcweir // } 179*cdf0e10cSrcweir // } 180*cdf0e10cSrcweir 181*cdf0e10cSrcweir System.out.println( "VCL window paint event!" ); 182*cdf0e10cSrcweir } 183*cdf0e10cSrcweir 184*cdf0e10cSrcweir // XMouseListener 185*cdf0e10cSrcweir //------------------------------------------------------ 186*cdf0e10cSrcweir public void mousePressed( MouseEvent e ) 187*cdf0e10cSrcweir { 188*cdf0e10cSrcweir } 189*cdf0e10cSrcweir 190*cdf0e10cSrcweir //------------------------------------------------------ 191*cdf0e10cSrcweir public void mouseReleased( MouseEvent e ) 192*cdf0e10cSrcweir { 193*cdf0e10cSrcweir } 194*cdf0e10cSrcweir 195*cdf0e10cSrcweir //------------------------------------------------------ 196*cdf0e10cSrcweir public void mouseEntered( MouseEvent e ) 197*cdf0e10cSrcweir { 198*cdf0e10cSrcweir } 199*cdf0e10cSrcweir 200*cdf0e10cSrcweir //------------------------------------------------------ 201*cdf0e10cSrcweir public void mouseExited( MouseEvent e ) 202*cdf0e10cSrcweir { 203*cdf0e10cSrcweir } 204*cdf0e10cSrcweir 205*cdf0e10cSrcweir // XMouseMotionListener 206*cdf0e10cSrcweir //------------------------------------------------------ 207*cdf0e10cSrcweir public void mouseDragged( MouseEvent e ) 208*cdf0e10cSrcweir { 209*cdf0e10cSrcweir // TODO: react to resizing of object bitmap 210*cdf0e10cSrcweir // if the object is inplace active the object must control resizing 211*cdf0e10cSrcweir } 212*cdf0e10cSrcweir 213*cdf0e10cSrcweir //------------------------------------------------------ 214*cdf0e10cSrcweir public void mouseMoved( MouseEvent e ) 215*cdf0e10cSrcweir { 216*cdf0e10cSrcweir 217*cdf0e10cSrcweir } 218*cdf0e10cSrcweir 219*cdf0e10cSrcweir // XEventListener 220*cdf0e10cSrcweir //------------------------------------------------------ 221*cdf0e10cSrcweir public void disposing( com.sun.star.lang.EventObject e ) 222*cdf0e10cSrcweir { 223*cdf0e10cSrcweir // do nothing, the window can die only when the application is closed 224*cdf0e10cSrcweir } 225*cdf0e10cSrcweir 226*cdf0e10cSrcweir // XJob 227*cdf0e10cSrcweir //------------------------------------------------------ 228*cdf0e10cSrcweir public Object execute( NamedValue[] pValues ) 229*cdf0e10cSrcweir { 230*cdf0e10cSrcweir /* 231*cdf0e10cSrcweir // means request for painting 232*cdf0e10cSrcweir 233*cdf0e10cSrcweir XBitmap xBitmap = null; 234*cdf0e10cSrcweir com.sun.star.awt.Rectangle aRect = null; 235*cdf0e10cSrcweir 236*cdf0e10cSrcweir synchronized( m_oImageLock ) 237*cdf0e10cSrcweir { 238*cdf0e10cSrcweir xBitmap = m_xBitmap; 239*cdf0e10cSrcweir aRect = m_aDrawRect; 240*cdf0e10cSrcweir } 241*cdf0e10cSrcweir 242*cdf0e10cSrcweir System.out.println( "The bitmap is going to be painted!" ); 243*cdf0e10cSrcweir 244*cdf0e10cSrcweir try { 245*cdf0e10cSrcweir XDevice xDevice = (XDevice)UnoRuntime.queryInterface( XDevice.class, m_xWindow ); 246*cdf0e10cSrcweir if ( xDevice != null ) 247*cdf0e10cSrcweir { 248*cdf0e10cSrcweir System.out.println( "Step1" ); 249*cdf0e10cSrcweir XGraphics xGraphics = xDevice.createGraphics(); 250*cdf0e10cSrcweir if ( xBitmap != null ) 251*cdf0e10cSrcweir { 252*cdf0e10cSrcweir System.out.println( "Step2" ); 253*cdf0e10cSrcweir XDisplayBitmap xDisplayBitmap = xDevice.createDisplayBitmap( xBitmap ); 254*cdf0e10cSrcweir 255*cdf0e10cSrcweir com.sun.star.awt.Size aSize = xBitmap.getSize(); 256*cdf0e10cSrcweir xGraphics.draw( xDisplayBitmap, 0, 0, aSize.Width, aSize.Height, 257*cdf0e10cSrcweir aRect.X, aRect.Y, aRect.Width, aRect.Height ); 258*cdf0e10cSrcweir } 259*cdf0e10cSrcweir 260*cdf0e10cSrcweir System.out.println( "Step3" ); 261*cdf0e10cSrcweir xGraphics.drawRect( aRect.X - 1, aRect.Y - 1, aRect.Width + 2, aRect.Height + 2 ); 262*cdf0e10cSrcweir 263*cdf0e10cSrcweir // draw resize squares 264*cdf0e10cSrcweir System.out.println( "Step4" ); 265*cdf0e10cSrcweir xGraphics.drawRect( aRect.X - 2, aRect.Y - 2, 4, 4 ); 266*cdf0e10cSrcweir xGraphics.drawRect( aRect.X + aRect.Width - 2, aRect.Y - 2, 4, 4 ); 267*cdf0e10cSrcweir xGraphics.drawRect( aRect.X - 2, aRect.Y + aRect.Height - 2, 4, 4 ); 268*cdf0e10cSrcweir xGraphics.drawRect( aRect.X + aRect.Width - 2, aRect.Y + aRect.Height - 2, 4, 4 ); 269*cdf0e10cSrcweir 270*cdf0e10cSrcweir System.out.println( "Step5" ); 271*cdf0e10cSrcweir 272*cdf0e10cSrcweir System.out.println( "The bitmap is painted by BitmapPainter!" ); 273*cdf0e10cSrcweir } 274*cdf0e10cSrcweir } 275*cdf0e10cSrcweir catch ( Exception e ) 276*cdf0e10cSrcweir { 277*cdf0e10cSrcweir } 278*cdf0e10cSrcweir 279*cdf0e10cSrcweir m_bFree = true; 280*cdf0e10cSrcweir 281*cdf0e10cSrcweir */ 282*cdf0e10cSrcweir return Any.VOID; 283*cdf0e10cSrcweir } 284*cdf0e10cSrcweir 285*cdf0e10cSrcweir }; 286*cdf0e10cSrcweir 287