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