xref: /trunk/main/embeddedobj/test/Container1/EmbedContApp.java (revision 872b2513907e4389be70e2d9b563f47e0d2c5a9f)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 package embeddedobj.test;
25 
26 import java.awt.*;
27 import java.applet.*;
28 import java.awt.event.*;
29 import java.net.*;
30 import java.io.*;
31 import java.util.Vector;
32 
33 import javax.swing.JOptionPane;
34 import javax.swing.Timer;
35 
36 import com.sun.star.lang.XMultiServiceFactory;
37 import com.sun.star.lang.XSingleServiceFactory;
38 
39 import com.sun.star.uno.UnoRuntime;
40 import com.sun.star.uno.XInterface;
41 import com.sun.star.uno.AnyConverter;
42 import com.sun.star.uno.Type;
43 import com.sun.star.uno.Any;
44 
45 import com.sun.star.lang.XComponent;
46 
47 import com.sun.star.util.XCloseable;
48 import com.sun.star.util.XURLTransformer;
49 import com.sun.star.util.URL;
50 
51 import com.sun.star.beans.PropertyValue;
52 import com.sun.star.beans.NamedValue;
53 
54 import com.sun.star.datatransfer.DataFlavor;
55 import com.sun.star.datatransfer.XTransferable;
56 
57 import com.sun.star.container.XNameAccess;
58 
59 import com.sun.star.io.XStream;
60 import com.sun.star.io.XInputStream;
61 import com.sun.star.io.XOutputStream;
62 import com.sun.star.io.XTruncate;
63 
64 import com.sun.star.awt.XWindow;
65 import com.sun.star.awt.XBitmap;
66 
67 import com.sun.star.task.XJob;
68 
69 import com.sun.star.embed.*;
70 
71 
72 class ActionObject
73 {
74     public byte m_nID;
75     public String m_sParam;
76 
77     public ActionObject()
78     {
79         m_nID = 0;
80         m_sParam = null;
81     }
82 
83     public ActionObject( byte nID )
84     {
85         m_nID = nID;
86         m_sParam = null;
87     }
88 
89     public ActionObject( byte nID, String sParam )
90     {
91         m_nID = nID;
92         m_sParam = sParam;
93     }
94 
95     public ActionObject( ActionObject aObject )
96     {
97         m_nID = aObject.m_nID;
98         m_sParam = aObject.m_sParam;
99     }
100 };
101 
102 public class EmbedContApp extends Applet
103     implements MouseListener, XEmbeddedClient, ActionListener, XJob, XInplaceClient, XWindowSupplier
104 {
105     private XMultiServiceFactory m_xServiceFactory;
106 
107     private final boolean m_bStoreVisRepl = false;
108 
109     private XJob m_xMainThreadExecutor;
110     private NamedValue[] m_pValuesForExecutor;
111 
112     private XEmbeddedObject m_xEmbedObj;
113     private XStorage m_xStorage;
114     private float    m_nXScaling;
115     private float    m_nYScaling;
116     private float    m_nXPixelSize;
117     private float    m_nYPixelSize;
118 
119     private Frame m_aFrame;
120     private Menu m_aFileMenu;
121     private Menu m_aObjectMenu;
122     private Toolkit m_aToolkit;
123 
124     private Image m_aImage;
125     private Object m_oImageLock;
126 
127     private boolean m_bOwnFile = false;
128 
129     private boolean m_bLinkObj = false;
130     private String m_aLinkURI;
131 
132     private Object m_oActionsNumberLock;
133     private Vector m_aActionsList;
134 
135     private Timer m_aTimer;
136     private boolean m_bDestroyed = false;
137 
138     private Object m_oInHandlerLock;
139     private boolean m_bInHandler = false;
140 
141     private XURLTransformer m_xTransformer;
142 
143     private NativeView m_aNativeView;
144     private XWindow m_xVCLWindow;
145 
146     private XBitmap m_xBitmap;
147     private BitmapPainter m_aBitmapPainter;
148 
149 // Constants
150     private final byte DESTROY                  =  1;
151     private final byte ACTIVATE_OUTPLACE        =  2;
152     private final byte NEW_DOCUMENT             =  3;
153     private final byte SAVE_AS                  =  4;
154     private final byte OPEN_FILE                =  5;
155     private final byte SAVE                     =  6;
156     private final byte NEW_OBJECT               =  7;
157     private final byte OBJECT_FROM_FILE         =  8;
158     private final byte LINK_FROM_FILE           =  9;
159     private final byte CONVERT_LINK_TO_OBJECT   = 10;
160     private final byte ACTIVATE_INPLACE         = 11;
161     private final byte DEACTIVATE               = 12;
162 
163 // Methods
164     public EmbedContApp( Frame aFrame, XMultiServiceFactory xServiceFactory )
165     {
166         m_aFrame = aFrame;
167         m_xServiceFactory = xServiceFactory;
168     }
169 
170     public void init()
171     {
172         resize( 800, 600 );
173         setBackground( Color.gray );
174 
175         m_aToolkit = Toolkit.getDefaultToolkit();
176 
177         try {
178             Object oTransformer = m_xServiceFactory.createInstance( "com.sun.star.util.URLTransformer" );
179             m_xTransformer = (XURLTransformer)UnoRuntime.queryInterface( XURLTransformer.class, oTransformer );
180         } catch( Exception e ) { System.exit( 0 ); }
181 
182         m_oActionsNumberLock = new Object();
183         m_aActionsList = new Vector();
184 
185         m_oInHandlerLock = new Object();
186         m_oImageLock = new Object();
187 
188         try {
189             Object oJob = m_xServiceFactory.createInstance( "com.sun.star.comp.thread.MainThreadExecutor" );
190             m_xMainThreadExecutor = (XJob)UnoRuntime.queryInterface( XJob.class, oJob );
191         } catch( Exception e ) {}
192 
193         if ( m_xMainThreadExecutor == null )
194         {
195             System.out.println( "Can't create MainThreadExecutor! The application is unusable!" );
196             System.exit( 0 );
197         }
198 
199         m_nXScaling = 1;
200         m_nYScaling = 1;
201         m_nXPixelSize = 1;
202         m_nYPixelSize = 1;
203 
204         m_pValuesForExecutor = new NamedValue[1];
205         m_pValuesForExecutor[0] = new NamedValue( "JobToExecute", (Object)this );
206 
207         m_aTimer = new Timer( 100, this );
208         m_aTimer.start();
209 
210         // Get a menu bar.
211         MenuBar aMenuBar = m_aFrame.getMenuBar();
212         if( aMenuBar == null )
213         {
214             aMenuBar = new MenuBar();
215             m_aFrame.setMenuBar( aMenuBar );
216         }
217 
218         // Create menus for the menu bar.
219 
220         // File menu
221         m_aFileMenu = new Menu( "File", true );
222         aMenuBar.add( m_aFileMenu );
223 
224         MenuItem aItem = new NewMenuItem();
225         m_aFileMenu.add( aItem );
226 
227         aItem = new OpenFileMenuItem();
228         m_aFileMenu.add( aItem );
229 
230         aItem = new SaveMenuItem();
231         m_aFileMenu.add( aItem );
232 
233         aItem = new SaveAsMenuItem();
234         m_aFileMenu.add( aItem );
235 
236         // Object menu
237         m_aObjectMenu = new Menu( "Object", true );
238         aMenuBar.add( m_aObjectMenu );
239 
240         aItem = new NewObjectMenuItem();
241         m_aObjectMenu.add( aItem );
242 
243         aItem = new LoadObjectMenuItem();
244         m_aObjectMenu.add( aItem );
245 
246         aItem = new LinkObjectMenuItem();
247         m_aObjectMenu.add( aItem );
248 
249         aItem = new ConvertLinkToEmbedMenuItem();
250         m_aObjectMenu.add( aItem );
251 
252         // Activation menu
253         m_aObjectMenu = new Menu( "Activation", true );
254         aMenuBar.add( m_aObjectMenu );
255 
256         aItem = new ActivateOutplaceMenuItem();
257         m_aObjectMenu.add( aItem );
258 
259         aItem = new ActivateInplaceMenuItem();
260         m_aObjectMenu.add( aItem );
261 
262         aItem = new DeactivateMenuItem();
263         m_aObjectMenu.add( aItem );
264 
265         m_aNativeView = new NativeView();
266         m_aNativeView.resize( 800, 600 );
267         this.add( m_aNativeView );
268 
269         // Handle mouse clicks in our window.
270 //      addMouseListener( this );
271     }
272 
273     public void actionPerformed( ActionEvent evt )
274     {
275         synchronized( m_oInHandlerLock )
276         {
277             if ( m_bInHandler )
278                 return;
279             m_bInHandler = true;
280         }
281 
282         synchronized( m_oActionsNumberLock )
283         {
284             if ( m_aActionsList.size() > 0 )
285             {
286                 try {
287                     m_xMainThreadExecutor.execute( m_pValuesForExecutor );
288                 }
289                 catch( Exception e )
290                 {
291                     System.out.println( "Exception in actionPerformed() : " + e );
292                 }
293             }
294             else
295             {
296                 synchronized( m_oInHandlerLock )
297                 {
298                     m_bInHandler = false;
299                 }
300             }
301         }
302     }
303 
304     // XWindowSupplier
305     public XWindow getWindow()
306     {
307         return m_xVCLWindow;
308     }
309 
310     // XEmbeddedClient
311     public void saveObject()
312         throws com.sun.star.uno.Exception
313     {
314         if ( m_xEmbedObj != null )
315         {
316             try {
317                 XEmbedPersist xPersist = (XEmbedPersist)UnoRuntime.queryInterface( XEmbedPersist.class, m_xEmbedObj );
318                 if ( xPersist != null )
319                 {
320                     xPersist.storeOwn();
321                     generateNewImage();
322                 }
323                 else
324                     JOptionPane.showMessageDialog( m_aFrame, "No XEmbedPersist!", "Error:", JOptionPane.ERROR_MESSAGE );
325             }
326             catch( Exception e )
327             {
328                 JOptionPane.showMessageDialog( m_aFrame, e, "Exception in saveObject:", JOptionPane.ERROR_MESSAGE );
329             }
330         }
331 
332         generateNewImage();
333         repaint();
334     }
335 
336     public void onShowWindow( boolean bVisible )
337     {
338         // for now nothing to do
339     }
340 
341     // XInplaceClient
342     public boolean canInplaceActivate()
343     {
344         return true;
345     }
346 
347     public void onInplaceActivate()
348     {
349         // TODO
350         // prepare for inplace activation
351 
352         // REMOVE
353         // workaround for CLIPCHILDREN problem
354         if ( m_aBitmapPainter != null )
355             m_aBitmapPainter.stopPainting();
356     }
357 
358     public void onUIActivate()
359     {
360         // TODO
361         // prepare for UI activate
362     }
363 
364     public void onInplaceDeactivate()
365     {
366         // TODO
367         // inplace deactivation is done
368 
369         // REMOVE
370         // workaround for CLIPCHILDREN problem
371         if ( m_aBitmapPainter != null )
372             m_aBitmapPainter.startPainting();
373     }
374 
375     public void onUIDeactivate()
376     {
377         // TODO
378         // prepare for UI deactivate
379     }
380 
381     public XIPMainContainerWindow getTopmostWindow()
382     {
383         // TODO
384         // return an implementation of XIPMainContainerWindow
385         // mainly required for ui activation
386         // dummy implementation is enough for inplace activation
387 
388         return null;
389     }
390 
391     public XInplaceUIWindow getDocumentWindow()
392     {
393         // TODO
394         // return implementation of XInplaceUIWindow
395         // mainly required for ui activation
396         // dummy implementation is enough for inplace activation
397 
398         return null;
399     }
400 
401     public com.sun.star.awt.Rectangle getPosRect()
402     {
403         // provide position rectangle to the object
404         try {
405             // here object bitmap and scaling factor hold the size
406             com.sun.star.awt.Size aBitmapSize = m_xBitmap.getSize();
407             com.sun.star.awt.Size aVisSize = new com.sun.star.awt.Size(
408                                             (int)( aBitmapSize.Width * m_nXScaling ),
409                                             (int)( aBitmapSize.Height * m_nYScaling ) );
410             return new com.sun.star.awt.Rectangle( 10, 10, aVisSize.Width, aVisSize.Height );
411         }
412         catch( Exception e )
413         {
414             System.out.println( "Position rectangle generation failed!" );
415         }
416 
417         return new com.sun.star.awt.Rectangle( 10, 10, 110, 110 );
418     }
419 
420     public com.sun.star.awt.Rectangle getClipRect()
421     {
422         // provide clip rectangle to the object
423         // in this application position and clip rectangles are the same
424 
425         try {
426             // here object bitmap and scaling factor hold the size
427             com.sun.star.awt.Size aBitmapSize = m_xBitmap.getSize();
428             com.sun.star.awt.Size aVisSize = new com.sun.star.awt.Size(
429                                             (int)( aBitmapSize.Width * m_nXScaling ),
430                                             (int)( aBitmapSize.Height * m_nYScaling ) );
431             return new com.sun.star.awt.Rectangle( 10, 10, aVisSize.Width, aVisSize.Height );
432         }
433         catch( Exception e )
434         {
435             System.out.println( "Clip rectangle generation failed!" );
436         }
437 
438         return new com.sun.star.awt.Rectangle( 10, 10, 110, 110 );
439     }
440 
441     public void translateAccelerators( com.sun.star.awt.KeyEvent[] aKeys )
442     {
443         // TODO
444         // an accelerator table for object
445         // ui activation related
446     }
447 
448     public void scrollObj( com.sun.star.awt.Size aOffset )
449     {
450         // TODO
451         // scrolls the object to a specified offset
452         // not mandatory for the testing application :)
453     }
454 
455     public void onPosRectChange( com.sun.star.awt.Rectangle aPosRect )
456     {
457         // object asks to change the position
458         if ( m_xEmbedObj != null )
459         {
460             try {
461                 int nState = m_xEmbedObj.getCurrentState();
462                 // such a position change make sense only when object is
463                 // either inplace or ui active
464                 if ( nState == EmbedStates.EMBED_INPLACE_ACTIVE
465                 || nState == EmbedStates.EMBED_UI_ACTIVE )
466                 {
467                     XInplaceObject xInplObj = (XInplaceObject)UnoRuntime.queryInterface( XInplaceObject.class, m_xEmbedObj );
468                     if ( xInplObj != null )
469                     {
470                         xInplObj.setObjectRects( aPosRect, aPosRect ); // show the whole object
471                         if ( m_aBitmapPainter != null )
472                             m_aBitmapPainter.setRect( aPosRect );
473                     }
474                     else
475                         System.out.println( "Why object that does not support inplace activation behave like inplace object?!" );
476                 }
477                 else
478                     System.out.println( "The object is not active but asks to change visual area!" );
479             } catch( Exception e )
480             {
481                 System.out.println( "Exception is thrown in onPosRectChange: " + e );
482             }
483         }
484         else
485             System.out.println( "Who asks to change visual area?!!" );
486     }
487 
488     // XJob
489     public Object execute( NamedValue[] pValues )
490     {
491         for( int nInd = 0; nInd < m_aActionsList.size(); nInd++ )
492         {
493             ActionObject aAction = ( ActionObject ) m_aActionsList.get( nInd );
494             if ( aAction != null )
495             {
496                 if ( aAction.m_nID == DESTROY )
497                 {
498                     // free all resources
499                     clearObjectAndStorage();
500                     m_bDestroyed = true;
501                 }
502                 else if ( aAction.m_nID == ACTIVATE_OUTPLACE )
503                 {
504                     // activate object if exists and not active
505                     if ( m_xEmbedObj != null )
506                     {
507                         try {
508                             m_xEmbedObj.changeState( EmbedStates.EMBED_ACTIVE );
509                         }
510                         catch( Exception ex )
511                         {
512                             System.out.println( "Exception on mouse click" + ex );
513                         }
514                     }
515                 }
516                 else if ( aAction.m_nID == NEW_DOCUMENT )
517                 {
518                     // clear everything
519                     clearObjectAndStorage();
520 
521                     repaint();
522                 }
523                 else if ( aAction.m_nID == SAVE_AS )
524                 {
525                     // open SaveAs dialog and store
526 
527                     if ( m_xStorage != null && m_xEmbedObj != null )
528                     {
529                         try {
530                             /*
531                                 if ( m_bLinkObj )
532                                     storeLinkAsFileURI( aFileURI );
533                                 else
534                             */
535                             saveObjectAsFileURI( aAction.m_sParam );
536                         }
537                         catch( Exception ex )
538                         {
539                             System.out.println( "Exception in SaveAsMenuItem: " + ex );
540                         }
541                     }
542                 }
543                 else if ( aAction.m_nID == OPEN_FILE )
544                 {
545                     // clear everything
546                     clearObjectAndStorage();
547 
548                     // load from specified file
549                     loadFileURI( aAction.m_sParam );
550 
551                     if ( m_xEmbedObj != null )
552                     {
553                         try {
554                             m_xEmbedObj.setClientSite( this );
555                         }
556                         catch( Exception ex )
557                         {
558                             System.out.println( "Exception in OpenFileMenuItem: " + ex );
559                         }
560                     }
561 
562                     generateNewImage();
563                     repaint();
564                 }
565                 else if ( aAction.m_nID == SAVE )
566                 {
567                     if ( m_xStorage != null && m_xEmbedObj != null )
568                     {
569                         // if has persistence store there
570                         // if not it is and error, SaveAs had to be used
571 
572                         if ( m_bOwnFile )
573                         {
574                             if ( m_xStorage != null )
575                             {
576                                 try {
577                                     saveObject();
578 
579                                     if ( m_bLinkObj )
580                                         storeLinkToStorage();
581 
582                                     XTransactedObject xTransact = (XTransactedObject)UnoRuntime.queryInterface( XTransactedObject.class,
583                                                                                                                 m_xStorage );
584                                     if ( xTransact != null )
585                                         xTransact.commit();
586                                 }
587                                 catch( Exception ex )
588                                 {
589                                     System.out.println( "Exception during save operation in SaveMenuItem:" + ex );
590                                 }
591                             }
592                             else
593                             {
594                                 System.out.println( "No storage for owned file!" );
595                             }
596                         }
597                         else
598                         {
599                             System.out.println( "No owned file!" );
600                         }
601                     }
602                 }
603                 else if ( aAction.m_nID == NEW_OBJECT )
604                 {
605                     // remove current object and init a new one
606                     clearObjectAndStorage();
607 
608                     if ( aAction.m_sParam != null )
609                     {
610                         m_xStorage = createTempStorage();
611 
612                         if ( m_xStorage != null )
613                             m_xEmbedObj = createEmbedObject( aAction.m_sParam );
614                         else
615                             System.out.println( "Can't create temporary storage!" );
616 
617                         if ( m_xEmbedObj != null )
618                         {
619                             try {
620                                 m_xEmbedObj.setClientSite( this );
621                             }
622                             catch( Exception ex )
623                             {
624                                 System.out.println( "Exception in NewObjectMenuItem:" + ex );
625                             }
626                         }
627                     }
628 
629                     generateNewImage();
630                     repaint();
631                 }
632                 else if ( aAction.m_nID == OBJECT_FROM_FILE )
633                 {
634                     // first remove current object
635                     clearObjectAndStorage();
636 
637                     // create object from specified file
638                     m_xStorage = createTempStorage();
639 
640                     if ( m_xStorage != null )
641                         m_xEmbedObj = loadEmbedObject( aAction.m_sParam );
642 
643                     if ( m_xEmbedObj != null )
644                     {
645                         try {
646                             m_xEmbedObj.setClientSite( this );
647                         }
648                         catch( Exception ex )
649                         {
650                             System.out.println( "Exception in LoadObjectMenuItem: " + ex );
651                         }
652                     }
653 
654                     generateNewImage();
655                     repaint();
656                 }
657                 else if ( aAction.m_nID == LINK_FROM_FILE )
658                 {
659                     // first remove current object
660                     clearObjectAndStorage();
661 
662                     m_xStorage = createTempStorage();
663 
664                     // create object from specified file
665                     m_xEmbedObj = createLinkObject( aAction.m_sParam );
666 
667                     if ( m_xEmbedObj != null )
668                     {
669                         m_aLinkURI = aAction.m_sParam;
670                         m_bLinkObj = true;
671 
672                         try {
673                             m_xEmbedObj.setClientSite( this );
674                         }
675                         catch( Exception ex )
676                         {
677                             System.out.println( "Exception in LinkObjectMenuItem:" + ex );
678                         }
679                     }
680 
681                     generateNewImage();
682                     repaint();
683                 }
684                 else if ( aAction.m_nID == CONVERT_LINK_TO_OBJECT )
685                 {
686                     if ( !m_bLinkObj )
687                     {
688                         System.out.println( "The object is not a link!" );
689                         continue;
690                     }
691 
692                     if ( m_xEmbedObj != null )
693                     {
694                         if ( m_xStorage != null )
695                         {
696                             try {
697                                 XNameAccess xNameAccess = (XNameAccess)UnoRuntime.queryInterface( XNameAccess.class,
698                                                                                                 m_xStorage );
699                                 if ( xNameAccess != null && xNameAccess.hasByName( "LinkName" ) )
700                                     m_xStorage.removeElement( "LinkName" );
701 
702                                 XLinkageSupport xLinkage = (XLinkageSupport)UnoRuntime.queryInterface( XLinkageSupport.class,
703                                                                                                         m_xEmbedObj );
704                                 if ( xLinkage != null )
705                                 {
706                                     xLinkage.breakLink( m_xStorage, "EmbedSub" );
707                                     m_bLinkObj = false;
708                                     m_aLinkURI = null;
709                                 }
710                                 else
711                                     System.out.println( "No XLinkageSupport in ConvertLink... !" );
712                             }
713                             catch( Exception e1 )
714                             {
715                                 System.out.println( "Exception in ConvertLinkToEmbed:try 1 :" + e1 );
716                             }
717                         }
718                     }
719                 }
720                 else if ( aAction.m_nID == ACTIVATE_INPLACE )
721                 {
722                     // activate object
723                     if ( m_xEmbedObj != null )
724                     {
725                         // in general it is better to check acceptable states
726                         try {
727                             m_xEmbedObj.changeState( EmbedStates.EMBED_INPLACE_ACTIVE );
728                         }
729                         catch( Exception ex )
730                         {
731                             System.out.println( "Exception on inplace activation " + ex );
732                         }
733                     }
734                 }
735                 else if ( aAction.m_nID == DEACTIVATE )
736                 {
737                     // activate object
738 
739                     if ( m_xEmbedObj != null )
740                     {
741                         int nOldState = -1;
742                         try {
743                             nOldState = m_xEmbedObj.getCurrentState();
744                         } catch( Exception e )
745                         {}
746 
747                         if ( nOldState == EmbedStates.EMBED_ACTIVE
748                           || nOldState == EmbedStates.EMBED_INPLACE_ACTIVE
749                           || nOldState == EmbedStates.EMBED_UI_ACTIVE )
750                         {
751                             try {
752                                 m_xEmbedObj.changeState( EmbedStates.EMBED_RUNNING );
753                             }
754                             catch( Exception ex )
755                             {
756                                 System.out.println( "Exception on inplace activation " + ex );
757                             }
758                         }
759                         else
760                         {
761                             System.out.println( "Deactivation of nonactive object!" );
762                         }
763                     }
764                 }
765                 else
766                 {
767                     System.out.println( "Unknown action is requested: " + aAction.m_nID + "\n" );
768                 }
769             }
770         }
771 
772         m_aActionsList.clear();
773 
774         synchronized( m_oInHandlerLock )
775         {
776             m_bInHandler = false;
777         }
778 
779         return Any.VOID;
780     }
781 
782     public void actionRegister( byte nActionID, String sParam )
783     {
784         synchronized( m_oActionsNumberLock )
785         {
786             int nSize = m_aActionsList.size();
787             if ( nSize < 199 )
788             {
789                 if ( nSize == 0 )
790                     m_aActionsList.add( new ActionObject( nActionID, sParam ) );
791                 else
792                 {
793                     ActionObject aAction = ( ActionObject ) m_aActionsList.get( nSize - 1 );
794                     if ( aAction != null && aAction.m_nID != DESTROY )
795                         m_aActionsList.add( new ActionObject( nActionID, sParam ) );
796                 }
797             }
798         }
799     }
800 
801     public void SaveAsOperation()
802     {
803         if ( m_xStorage != null && m_xEmbedObj != null )
804         {
805             FileDialog aFileDialog = new FileDialog( m_aFrame, "SaveAs", FileDialog.SAVE );
806             aFileDialog.show();
807             if ( aFileDialog.getFile() != null )
808             {
809                 String aFileName = aFileDialog.getDirectory() + aFileDialog.getFile();
810                 File aFile = new File( aFileName );
811                 if ( aFile != null )
812                 {
813                     // create object from specified file
814                     String aFileURI = getValidURL( aFile.toURI().toASCIIString() );
815                     actionRegister( SAVE_AS, aFileURI );
816                 }
817             }
818         }
819         else
820             JOptionPane.showMessageDialog( m_aFrame, "No document is embedded!", "Error:", JOptionPane.ERROR_MESSAGE );
821 
822     }
823 
824     public void destroy()
825     {
826         // redirect the call through the timer and call super.destroy();
827         actionRegister( DESTROY, null );
828 
829         for ( int i = 0; i < 3 && !m_bDestroyed; i++ )
830         {
831             try {
832                 Thread.sleep( 200 );
833             } catch ( Exception e )
834             {}
835         }
836 
837         if ( !m_bDestroyed )
838             System.out.println( "The object application can not exit correctly!" );
839 
840         m_aTimer.stop();
841 
842         super.destroy();
843     }
844 
845     public void update( Graphics g )
846     {
847         paint( g );
848     }
849 
850     public void paint( Graphics g )
851     {
852         super.paint( g );
853 
854         // m_aNativeView.paint( g );
855 
856         createVclWindow();
857     }
858 
859     public void createVclWindow()
860     {
861         synchronized( m_oImageLock )
862         {
863             if ( m_xVCLWindow == null && m_xServiceFactory != null && m_xEmbedObj != null && m_xBitmap != null )
864             {
865                 java.awt.Rectangle aBounds = getBounds();
866                 m_xVCLWindow = WindowHelper.createWindow( m_xServiceFactory, m_aNativeView, aBounds );
867                 m_xVCLWindow.setVisible( true );
868 
869                 com.sun.star.awt.Size aBitmapSize = new com.sun.star.awt.Size( 200, 100 );
870 
871                 XVisualObject xVisObj = (XVisualObject)UnoRuntime.queryInterface( XVisualObject.class, m_xEmbedObj );
872                 try {
873                     com.sun.star.awt.Size aVisSize = xVisObj.getVisAreaSize( Aspects.MSASPECT_CONTENT );
874                     m_nXPixelSize = aVisSize.Width / aBitmapSize.Width;
875                     m_nYPixelSize = aVisSize.Height / aBitmapSize.Height;
876                 }
877                 catch( Exception e )
878                 {
879                 }
880 
881                 if ( m_xBitmap != null )
882                     aBitmapSize = m_xBitmap.getSize();
883 
884                 System.out.println( "The visual area is Width = " + aBitmapSize.Width + "; Height = " + aBitmapSize.Height );
885 
886                 com.sun.star.awt.Rectangle aRect = new com.sun.star.awt.Rectangle(
887                                                         10,
888                                                         10,
889                                                         Math.min( (int)aBounds.getWidth() - 20, aBitmapSize.Width ),
890                                                         Math.min( (int)aBounds.getHeight() - 20, aBitmapSize.Height ) );
891 
892                 m_aBitmapPainter = new BitmapPainter( m_xMainThreadExecutor, m_xVCLWindow, m_xBitmap, aRect );
893             }
894         }
895     }
896 
897     public void generateNewImage()
898     {
899         if ( m_xEmbedObj != null )
900         {
901             try {
902                 int nOldState = m_xEmbedObj.getCurrentState();
903                 int nState = nOldState;
904                 if ( nOldState == EmbedStates.EMBED_LOADED )
905                 {
906                     m_xEmbedObj.changeState( EmbedStates.EMBED_RUNNING );
907                     nState = EmbedStates.EMBED_RUNNING;
908                 }
909 
910                 if ( nState == EmbedStates.EMBED_UI_ACTIVE || nState == EmbedStates.EMBED_INPLACE_ACTIVE
911                   || nState == EmbedStates.EMBED_ACTIVE || nState == EmbedStates.EMBED_RUNNING )
912                 {
913                     XComponentSupplier xCompProv = (XComponentSupplier)UnoRuntime.queryInterface(
914                                                                                     XComponentSupplier.class,
915                                                                                     m_xEmbedObj );
916                     if ( xCompProv != null )
917                     {
918                         XCloseable xCloseable = xCompProv.getComponent();
919                         XTransferable xTransfer = (XTransferable)UnoRuntime.queryInterface(
920                                                                                     XTransferable.class,
921                                                                                     xCloseable );
922                         if ( xTransfer != null )
923                         {
924                             DataFlavor aFlavor = new DataFlavor();
925                             aFlavor.MimeType = "application/x-openoffice;windows_formatname=\"Bitmap\"";
926                             aFlavor.HumanPresentableName = "Bitmap";
927                             aFlavor.DataType = new Type( byte[].class );
928 
929                             Object aAny = xTransfer.getTransferData( aFlavor );
930                             if ( aAny != null && AnyConverter.isArray( aAny ) )
931                             {
932                                 synchronized( m_oImageLock )
933                                 {
934                                     m_xBitmap = WindowHelper.getVCLBitmapFromBytes( m_xServiceFactory, aAny );
935                                     if ( m_aBitmapPainter != null )
936                                     {
937                                         m_aBitmapPainter.setBitmap( m_xBitmap );
938 
939                                         if ( m_xBitmap != null )
940                                         {
941                                             try {
942                                                 com.sun.star.awt.Size aBitmapSize = m_xBitmap.getSize();
943                                                 com.sun.star.awt.Size aVisSize = new com.sun.star.awt.Size(
944                                                                                 (int)( aBitmapSize.Width * m_nXScaling ),
945                                                                                 (int)( aBitmapSize.Height * m_nYScaling ) );
946                                                 m_aBitmapPainter.setSize( aVisSize );
947                                             }
948                                             catch( Exception e )
949                                             {
950                                             }
951                                         }
952                                     }
953                                 }
954                             }
955                         }
956                         else
957                             System.out.println( "paint() : can not get XTransferable for the component!\n" );
958                     }
959                     else
960                         System.out.println( "paint() : XComponentSupplier is not implemented!\n" );
961                 }
962             }
963             catch( com.sun.star.uno.Exception e )
964             {
965                 // dialogs should not be used in paint()
966                 System.out.println( "Exception in paint(): " + e );
967             }
968         }
969     }
970 
971     public void mouseClicked( MouseEvent e )
972     {
973         if( e.getModifiers() == InputEvent.BUTTON1_MASK )
974         {
975             actionRegister( ACTIVATE_OUTPLACE, null );
976         }
977     }
978 
979     public void mousePressed( MouseEvent e ){};
980     public void mouseEntered( MouseEvent e ){};
981     public void mouseExited( MouseEvent e ){};
982     public void mouseReleased( MouseEvent e ){};
983 
984     // classes
985     class NewMenuItem extends MenuItem implements ActionListener // Menu New
986     {
987         public NewMenuItem()
988         {
989             super( "New", new MenuShortcut( KeyEvent.VK_A ));
990             addActionListener( this );
991         }
992 
993         public void actionPerformed( ActionEvent e )
994         {
995             actionRegister( NEW_DOCUMENT, null );
996         }
997     }
998 
999     class SaveAsMenuItem extends MenuItem implements ActionListener // Menu SaveAs...
1000     {
1001         public SaveAsMenuItem()
1002         {
1003             super( "SaveAs..." );
1004             addActionListener( this );
1005         }
1006 
1007         public void actionPerformed( ActionEvent e )
1008         {
1009             // open SaveAs dialog and store
1010 
1011             SaveAsOperation();
1012         }
1013     }
1014 
1015     class OpenFileMenuItem extends MenuItem implements ActionListener // Menu Open
1016     {
1017         public OpenFileMenuItem()
1018         {
1019             super( "Open", new MenuShortcut( KeyEvent.VK_C ));
1020             addActionListener( this );
1021         }
1022 
1023         public void actionPerformed( ActionEvent e )
1024         {
1025             // open OpenFile dialog and load doc
1026             FileDialog aFileDialog = new FileDialog( m_aFrame, "Open" );
1027             aFileDialog.show();
1028             if ( aFileDialog.getFile() != null )
1029             {
1030                 String aFileName = aFileDialog.getDirectory() + aFileDialog.getFile();
1031                 File aFile = new File( aFileName );
1032                 if ( aFile != null )
1033                 {
1034                     // create object from specified file
1035                     String aFileURI = getValidURL( aFile.toURI().toASCIIString() );
1036                     actionRegister( OPEN_FILE, aFileURI );
1037                 }
1038             }
1039         }
1040     }
1041 
1042     class SaveMenuItem extends MenuItem implements ActionListener // Menu Save
1043     {
1044         public SaveMenuItem()
1045         {
1046             super( "Save", new MenuShortcut( KeyEvent.VK_D ));
1047             addActionListener( this );
1048         }
1049 
1050         public void actionPerformed( ActionEvent e )
1051         {
1052             // if has persistence store there
1053             // if not open SaveAs dialog and store
1054             if ( m_xStorage != null && m_xEmbedObj != null )
1055             {
1056                 if ( m_bOwnFile )
1057                 {
1058                     if ( m_xStorage == null )
1059                     {
1060                         JOptionPane.showMessageDialog( m_aFrame,
1061                                                         "No storage for oned file!",
1062                                                         "Error:",
1063                                                         JOptionPane.ERROR_MESSAGE );
1064 
1065                         return;
1066                     }
1067 
1068                     actionRegister( SAVE, null );
1069                 }
1070                 else
1071                 {
1072                     SaveAsOperation();
1073                 }
1074             }
1075             else
1076                 JOptionPane.showMessageDialog( m_aFrame, "No document is embedded!", "Error:", JOptionPane.ERROR_MESSAGE );
1077         }
1078     }
1079 
1080     class NewObjectMenuItem extends MenuItem implements ActionListener // Menu NewObject
1081     {
1082         public NewObjectMenuItem()
1083         {
1084             super( "Create", new MenuShortcut( KeyEvent.VK_N ));
1085             addActionListener( this );
1086         }
1087 
1088         public void actionPerformed( ActionEvent e )
1089         {
1090             Object[] possibleValues = { "com.sun.star.comp.Writer.TextDocument",
1091                                         "com.sun.star.comp.Writer.GlobalDocument",
1092                                         "com.sun.star.comp.Writer.WebDocument",
1093                                         "com.sun.star.comp.Calc.SpreadsheetDocument",
1094                                         "com.sun.star.comp.Draw.PresentationDocument",
1095                                         "com.sun.star.comp.Draw.DrawingDocument",
1096                                         "com.sun.star.comp.Math.FormulaDocument",
1097                                         "BitmapImage" };
1098 
1099             String selectedValue = (String)JOptionPane.showInputDialog( null, "DocumentType", "Select",
1100                                                                         JOptionPane.INFORMATION_MESSAGE, null,
1101                                                                         possibleValues, possibleValues[0] );
1102 
1103             actionRegister( NEW_OBJECT, selectedValue );
1104         }
1105     }
1106 
1107     class LoadObjectMenuItem extends MenuItem implements ActionListener // Menu LoadObject
1108     {
1109         public LoadObjectMenuItem()
1110         {
1111             super( "Load from file", new MenuShortcut( KeyEvent.VK_L ));
1112             addActionListener( this );
1113         }
1114 
1115         public void actionPerformed( ActionEvent e )
1116         {
1117             // open OpenFile dialog and load doc
1118             FileDialog aFileDialog = new FileDialog( m_aFrame, "Select sources to use for object init" );
1119             aFileDialog.show();
1120             if ( aFileDialog.getFile() != null )
1121             {
1122                 String aFileName = aFileDialog.getDirectory() + aFileDialog.getFile();
1123                 File aFile = new File( aFileName );
1124                 if ( aFile != null )
1125                 {
1126                     // create object from specified file
1127                     String aFileURI = getValidURL( aFile.toURI().toASCIIString() );
1128                     actionRegister( OBJECT_FROM_FILE, aFileURI );
1129                 }
1130             }
1131         }
1132     }
1133 
1134     class LinkObjectMenuItem extends MenuItem implements ActionListener // Menu LinkObject
1135     {
1136         public LinkObjectMenuItem()
1137         {
1138             super( "Create link", new MenuShortcut( KeyEvent.VK_M ));
1139             addActionListener( this );
1140         }
1141 
1142         public void actionPerformed( ActionEvent e )
1143         {
1144             // open OpenFile dialog and load doc
1145             FileDialog aFileDialog = new FileDialog( m_aFrame, "Select sources to use for object init" );
1146             aFileDialog.show();
1147             if ( aFileDialog.getFile() != null )
1148             {
1149                 String aFileName = aFileDialog.getDirectory() + aFileDialog.getFile();
1150                 File aFile = new File( aFileName );
1151                 if ( aFile != null )
1152                 {
1153                     // create object from specified file
1154                     String aFileURI = getValidURL( aFile.toURI().toASCIIString() );
1155                     actionRegister( LINK_FROM_FILE, aFileURI );
1156                 }
1157             }
1158         }
1159     }
1160 
1161     class ConvertLinkToEmbedMenuItem extends MenuItem implements ActionListener // Menu LinkObject
1162     {
1163         public ConvertLinkToEmbedMenuItem()
1164         {
1165             super( "Convert link to embed", new MenuShortcut( KeyEvent.VK_M ));
1166             addActionListener( this );
1167         }
1168 
1169         public void actionPerformed( ActionEvent e )
1170         {
1171             actionRegister( CONVERT_LINK_TO_OBJECT, null );
1172         }
1173     }
1174 
1175     class ActivateOutplaceMenuItem extends MenuItem implements ActionListener // Menu ActiveteOutplace
1176     {
1177         public ActivateOutplaceMenuItem()
1178         {
1179             super( "Activate outplace", new MenuShortcut( KeyEvent.VK_A ));
1180             addActionListener( this );
1181         }
1182 
1183         public void actionPerformed( ActionEvent e )
1184         {
1185             actionRegister( ACTIVATE_OUTPLACE, null );
1186         }
1187     }
1188 
1189     class ActivateInplaceMenuItem extends MenuItem implements ActionListener // Menu ActivateInplace
1190     {
1191         public ActivateInplaceMenuItem()
1192         {
1193             super( "Activate inplace", new MenuShortcut( KeyEvent.VK_I ));
1194             addActionListener( this );
1195         }
1196 
1197         public void actionPerformed( ActionEvent e )
1198         {
1199             actionRegister( ACTIVATE_INPLACE, null );
1200         }
1201     }
1202 
1203     class DeactivateMenuItem extends MenuItem implements ActionListener // Menu Deactivate
1204     {
1205         public DeactivateMenuItem()
1206         {
1207             super( "Deactivate", new MenuShortcut( KeyEvent.VK_D ));
1208             addActionListener( this );
1209         }
1210 
1211         public void actionPerformed( ActionEvent e )
1212         {
1213             actionRegister( DEACTIVATE, null );
1214         }
1215     }
1216 
1217     // Helper methods
1218     public XEmbeddedObject createEmbedObject( String aServiceName )
1219     {
1220         XEmbeddedObject xEmbObj = null;
1221         byte[] pClassID = new byte[16];
1222 
1223         if ( aServiceName.equals( "com.sun.star.comp.Writer.TextDocument" ) )
1224         {
1225             int[] pTempClassID = { 0x8B, 0xC6, 0xB1, 0x65, 0xB1, 0xB2, 0x4E, 0xDD,
1226                                     0xAA, 0x47, 0xDA, 0xE2, 0xEE, 0x68, 0x9D, 0xD6 };
1227             for ( int ind = 0; ind < 16; ind++ )
1228                 pClassID[ind] = (byte)pTempClassID[ind];
1229         }
1230         else if ( aServiceName.equals( "com.sun.star.comp.Writer.GlobalDocument" ) )
1231         {
1232             int[] pTempClassID = { 0xB2, 0x1A, 0x0A, 0x7C, 0xE4, 0x03, 0x41, 0xFE,
1233                                     0x95, 0x62, 0xBD, 0x13, 0xEA, 0x6F, 0x15, 0xA0 };
1234             for ( int ind = 0; ind < 16; ind++ )
1235                 pClassID[ind] = (byte)pTempClassID[ind];
1236         }
1237         else if ( aServiceName.equals( "com.sun.star.comp.Writer.WebDocument" ) )
1238         {
1239             int[] pTempClassID = { 0xA8, 0xBB, 0xA6, 0x0C, 0x7C, 0x60, 0x45, 0x50,
1240                                     0x91, 0xCE, 0x39, 0xC3, 0x90, 0x3F, 0xAC, 0x5E };
1241             for ( int ind = 0; ind < 16; ind++ )
1242                 pClassID[ind] = (byte)pTempClassID[ind];
1243         }
1244         else if ( aServiceName.equals( "com.sun.star.comp.Calc.SpreadsheetDocument" ) )
1245         {
1246             int[] pTempClassID = { 0x47, 0xBB, 0xB4, 0xCB, 0xCE, 0x4C, 0x4E, 0x80,
1247                                     0xA5, 0x91, 0x42, 0xD9, 0xAE, 0x74, 0x95, 0x0F };
1248             for ( int ind = 0; ind < 16; ind++ )
1249                 pClassID[ind] = (byte)pTempClassID[ind];
1250         }
1251         else if ( aServiceName.equals( "com.sun.star.comp.Draw.PresentationDocument" ) )
1252         {
1253             int[] pTempClassID = { 0x91, 0x76, 0xE4, 0x8A, 0x63, 0x7A, 0x4D, 0x1F,
1254                                     0x80, 0x3B, 0x99, 0xD9, 0xBF, 0xAC, 0x10, 0x47 };
1255             for ( int ind = 0; ind < 16; ind++ )
1256                 pClassID[ind] = (byte)pTempClassID[ind];
1257         }
1258         else if ( aServiceName.equals( "com.sun.star.comp.Draw.DrawingDocument" ) )
1259         {
1260             int[] pTempClassID = { 0x4B, 0xAB, 0x89, 0x70, 0x8A, 0x3B, 0x45, 0xB3,
1261                                     0x99, 0x1C, 0xCB, 0xEE, 0xAC, 0x6B, 0xD5, 0xE3 };
1262             for ( int ind = 0; ind < 16; ind++ )
1263                 pClassID[ind] = (byte)pTempClassID[ind];
1264         }
1265         else if ( aServiceName.equals( "com.sun.star.comp.Math.FormulaDocument" ) )
1266         {
1267             int[] pTempClassID = { 0x07, 0x8B, 0x7A, 0xBA, 0x54, 0xFC, 0x45, 0x7F,
1268                                     0x85, 0x51, 0x61, 0x47, 0xE7, 0x76, 0xA9, 0x97 };
1269             for ( int ind = 0; ind < 16; ind++ )
1270                 pClassID[ind] = (byte)pTempClassID[ind];
1271         }
1272         else if ( aServiceName.equals( "BitmapImage" ) )
1273         {
1274             int[] pTempClassID = { 0xD3, 0xE3, 0x4B, 0x21, 0x9D, 0x75, 0x10, 0x1A,
1275                                     0x8C, 0x3D, 0x00, 0xAA, 0x00, 0x1A, 0x16, 0x52 };
1276             for ( int ind = 0; ind < 16; ind++ )
1277                 pClassID[ind] = (byte)pTempClassID[ind];
1278         }
1279 
1280         if ( pClassID != null )
1281         {
1282             // create embedded object based on the class ID
1283             try {
1284                 Object oEmbedCreator = m_xServiceFactory.createInstance( "com.sun.star.embed.EmbeddedObjectCreator" );
1285                 XEmbedObjectCreator xEmbedCreator = (XEmbedObjectCreator)UnoRuntime.queryInterface(
1286                                                                                         XEmbedObjectCreator.class,
1287                                                                                         oEmbedCreator );
1288                 if ( xEmbedCreator != null )
1289                 {
1290                     Object oEmbObj = xEmbedCreator.createInstanceInitNew( pClassID,
1291                                                                         "Dummy name",
1292                                                                         m_xStorage,
1293                                                                         "EmbedSub",
1294                                                                         new PropertyValue[0] );
1295                     xEmbObj = (XEmbeddedObject)UnoRuntime.queryInterface( XEmbeddedObject.class, oEmbObj );
1296                 }
1297                 else
1298                     JOptionPane.showMessageDialog( m_aFrame,
1299                                                    "Can't create EmbedCreator!",
1300                                                    "Error:",
1301                                                    JOptionPane.ERROR_MESSAGE );
1302             }
1303             catch( Exception e )
1304             {
1305                 JOptionPane.showMessageDialog( m_aFrame, e, "Exception in createInstanceInitNew():", JOptionPane.ERROR_MESSAGE );
1306             }
1307         }
1308         else
1309             JOptionPane.showMessageDialog( m_aFrame, "Can't retrieve class ID!", "Error:", JOptionPane.ERROR_MESSAGE );
1310 
1311         return xEmbObj;
1312     }
1313 
1314     public XEmbeddedObject createLinkObject( String aLinkURL )
1315     {
1316         XEmbeddedObject xEmbObj = null;
1317 
1318         try {
1319             Object oLinkCreator = m_xServiceFactory.createInstance( "com.sun.star.embed.EmbeddedObjectCreator" );
1320             XLinkCreator xLinkCreator = (XLinkCreator)UnoRuntime.queryInterface(
1321                                                                                     XLinkCreator.class,
1322                                                                                     oLinkCreator );
1323             if ( xLinkCreator != null )
1324             {
1325                 PropertyValue[] aMedDescr = { new PropertyValue(), new PropertyValue() };
1326                 aMedDescr[0].Name = "URL";
1327                 aMedDescr[0].Value = (Object) aLinkURL;
1328                 aMedDescr[1].Name = "ReadOnly";
1329                 aMedDescr[1].Value = (Object) new Boolean( false );
1330                 Object oEmbObj = xLinkCreator.createInstanceLink( m_xStorage, "EmbedSub", aMedDescr, new PropertyValue[0] );
1331                 xEmbObj = (XEmbeddedObject)UnoRuntime.queryInterface( XEmbeddedObject.class, oEmbObj );
1332             }
1333             else
1334                 JOptionPane.showMessageDialog( m_aFrame,
1335                                                "Can't create LinkCreator!",
1336                                                "Error:",
1337                                                JOptionPane.ERROR_MESSAGE );
1338         }
1339         catch( Exception e )
1340         {
1341             JOptionPane.showMessageDialog( m_aFrame, e, "Exception in createLinkObject():", JOptionPane.ERROR_MESSAGE );
1342         }
1343 
1344 
1345         return xEmbObj;
1346     }
1347 
1348 
1349     public XEmbeddedObject loadEmbedObject( String aFileURI )
1350     {
1351         XEmbeddedObject xEmbObj = null;
1352         try {
1353             Object oEmbedCreator = m_xServiceFactory.createInstance( "com.sun.star.embed.EmbeddedObjectCreator" );
1354             XEmbedObjectCreator xEmbedCreator = (XEmbedObjectCreator)UnoRuntime.queryInterface(
1355                                                                                     XEmbedObjectCreator.class,
1356                                                                                     oEmbedCreator );
1357             if ( xEmbedCreator != null )
1358             {
1359                 PropertyValue[] aMedDescr = { new PropertyValue(), new PropertyValue() };
1360                 aMedDescr[0].Name = "URL";
1361                 aMedDescr[0].Value = (Object) aFileURI;
1362                 aMedDescr[1].Name = "ReadOnly";
1363                 aMedDescr[1].Value = (Object) new Boolean( false );
1364                 Object oEmbObj = xEmbedCreator.createInstanceInitFromMediaDescriptor( m_xStorage,
1365                                                                                     "EmbedSub",
1366                                                                                     aMedDescr,
1367                                                                                     new PropertyValue[0] );
1368                 xEmbObj = (XEmbeddedObject)UnoRuntime.queryInterface( XEmbeddedObject.class, oEmbObj );
1369             }
1370             else
1371                 JOptionPane.showMessageDialog( m_aFrame,
1372                                                "Can't create EmbedFactory!",
1373                                                "Error:",
1374                                                JOptionPane.ERROR_MESSAGE );
1375         }
1376         catch( Exception e )
1377         {
1378             JOptionPane.showMessageDialog( m_aFrame, e, "Exception in loadEmbedObject():", JOptionPane.ERROR_MESSAGE );
1379         }
1380 
1381         return xEmbObj;
1382     }
1383 
1384     public void clearObjectAndStorage()
1385     {
1386         synchronized( m_oImageLock )
1387         {
1388             m_aImage = null;
1389         }
1390 
1391         m_nXScaling = 1;
1392         m_nYScaling = 1;
1393         m_nXPixelSize = 1;
1394         m_nYPixelSize = 1;
1395 
1396         m_bOwnFile = false;
1397 
1398         m_aLinkURI = null;
1399         m_bLinkObj = false;
1400 
1401         if ( m_xEmbedObj != null )
1402         {
1403             try {
1404                 XCloseable xClose = (XCloseable)UnoRuntime.queryInterface( XCloseable.class, m_xEmbedObj );
1405                 if ( xClose != null )
1406                     xClose.close( true );
1407             }
1408             catch ( Exception ex )
1409             {}
1410             m_xEmbedObj = null;
1411         }
1412 
1413         if ( m_xStorage != null )
1414         {
1415             try {
1416                 XComponent xComponent = (XComponent)UnoRuntime.queryInterface( XComponent.class, m_xStorage );
1417                 if ( xComponent != null )
1418                     xComponent.dispose();
1419             }
1420             catch ( Exception ex )
1421             {}
1422             m_xStorage = null;
1423         }
1424     }
1425 
1426     public XStorage createTempStorage()
1427     {
1428         XStorage xTempStorage = null;
1429 
1430         try {
1431             Object oStorageFactory = m_xServiceFactory.createInstance( "com.sun.star.embed.StorageFactory" );
1432             XSingleServiceFactory xStorageFactory = (XSingleServiceFactory)UnoRuntime.queryInterface(
1433                                                                                         XSingleServiceFactory.class,
1434                                                                                         oStorageFactory );
1435             if ( xStorageFactory != null )
1436             {
1437                 Object oStorage = xStorageFactory.createInstance();
1438                 xTempStorage = (XStorage)UnoRuntime.queryInterface( XStorage.class, oStorage );
1439             }
1440             else
1441                 JOptionPane.showMessageDialog( m_aFrame,
1442                                                 "Can't create StorageFactory!",
1443                                                 "Error:",
1444                                                 JOptionPane.ERROR_MESSAGE );
1445         }
1446         catch( Exception e )
1447         {
1448             JOptionPane.showMessageDialog( m_aFrame, e, "Exception in createTempStorage():", JOptionPane.ERROR_MESSAGE );
1449         }
1450 
1451         return xTempStorage;
1452     }
1453 
1454     public void saveObjectAsFileURI( String aFileURI )
1455     {
1456         try {
1457             Object oStorageFactory = m_xServiceFactory.createInstance( "com.sun.star.embed.StorageFactory" );
1458             XSingleServiceFactory xStorageFactory = (XSingleServiceFactory)UnoRuntime.queryInterface(
1459                                                                                         XSingleServiceFactory.class,
1460                                                                                         oStorageFactory );
1461             if ( xStorageFactory != null )
1462             {
1463                 XEmbedPersist xPersist = (XEmbedPersist)UnoRuntime.queryInterface( XEmbedPersist.class, m_xEmbedObj );
1464                 if ( xPersist != null )
1465                 {
1466                     Object aArgs[] = new Object[2];
1467                     aArgs[0] = aFileURI;
1468                     aArgs[1] = new Integer( ElementModes.ELEMENT_READWRITE );
1469 
1470                     Object oStorage = xStorageFactory.createInstanceWithArguments( aArgs );
1471                     XStorage xTargetStorage = (XStorage)UnoRuntime.queryInterface( XStorage.class, oStorage );
1472 
1473                     PropertyValue aProps[] = { new PropertyValue() };
1474                     aProps[0].Name = "StoreVisualReplacement";
1475                     aProps[0].Value = new Boolean( m_bStoreVisRepl );
1476 
1477                     xPersist.storeAsEntry( xTargetStorage, "EmbedSub", new PropertyValue[0], aProps );
1478                     xPersist.saveCompleted( true );
1479 
1480                     // the object must be already based on new storage
1481                     XComponent xComponent = (XComponent)UnoRuntime.queryInterface( XComponent.class, m_xStorage );
1482                     xComponent.dispose();
1483 
1484                     m_xStorage = xTargetStorage;
1485                     m_bOwnFile = true;
1486 
1487                     XTransactedObject xTransact = (XTransactedObject)UnoRuntime.queryInterface( XTransactedObject.class,
1488                                                                                             m_xStorage );
1489                     if ( xTransact != null )
1490                         xTransact.commit();
1491                 }
1492                 else
1493                     JOptionPane.showMessageDialog( m_aFrame, "No XEmbedPersist!", "Error:", JOptionPane.ERROR_MESSAGE );
1494             }
1495             else
1496                 JOptionPane.showMessageDialog( m_aFrame,
1497                                                 "Can't create StorageFactory!",
1498                                                 "Error:",
1499                                                 JOptionPane.ERROR_MESSAGE );
1500         }
1501         catch( Exception e )
1502         {
1503             JOptionPane.showMessageDialog( m_aFrame, e, "Exception in saveStorageToFileURI():", JOptionPane.ERROR_MESSAGE );
1504         }
1505 
1506     }
1507 
1508     public void loadFileURI( String aFileURI )
1509     {
1510         try
1511         {
1512             Object oStorageFactory = m_xServiceFactory.createInstance( "com.sun.star.embed.StorageFactory" );
1513             XSingleServiceFactory xStorageFactory = (XSingleServiceFactory)UnoRuntime.queryInterface(
1514                                                                                         XSingleServiceFactory.class,
1515                                                                                         oStorageFactory );
1516             Object aArgs[] = new Object[2];
1517             aArgs[0] = aFileURI;
1518             aArgs[1] = new Integer( ElementModes.ELEMENT_READWRITE );
1519 
1520             Object oStorage = xStorageFactory.createInstanceWithArguments( aArgs );
1521             XStorage xTargetStorage = (XStorage)UnoRuntime.queryInterface( XStorage.class, oStorage );
1522 
1523             Object oEmbedCreator = m_xServiceFactory.createInstance( "com.sun.star.embed.EmbeddedObjectCreator" );
1524             XEmbedObjectCreator xEmbedCreator = (XEmbedObjectCreator)UnoRuntime.queryInterface(
1525                                                                                     XEmbedObjectCreator.class,
1526                                                                                     oEmbedCreator );
1527 
1528             XNameAccess xNameAccess = (XNameAccess)UnoRuntime.queryInterface( XNameAccess.class,
1529                                                                             xTargetStorage );
1530             if ( xNameAccess == null )
1531             {
1532                 JOptionPane.showMessageDialog( m_aFrame, "No XNameAccess!", "Error:", JOptionPane.ERROR_MESSAGE );
1533                 return;
1534             }
1535 
1536             Object oEmbObj = null;
1537             if ( xNameAccess.hasByName( "LinkName" ) && xTargetStorage.isStreamElement( "LinkName" ) )
1538             {
1539             /*
1540                 // AOO links will not be tested until they have correct persistence
1541                 XStream xLinkStream = xTargetStorage.openStreamElement( "LinkName", ElementModes.ELEMENT_READ );
1542                 if ( xLinkStream != null )
1543                 {
1544                     XInputStream xInStream = xLinkStream.getInputStream();
1545                     if ( xInStream != null )
1546                     {
1547                         byte[][] pBuff = new byte[1][0];
1548                         int nRead = xInStream.readBytes( pBuff, 1000 );
1549                         m_aLinkURI = new String( pBuff[0] );
1550                         xInStream.closeInput();
1551                         oEmbObj = xEmbedCreator.createInstanceLink( m_aLinkURI );
1552                         m_bLinkObj = true;
1553                     }
1554                 }
1555             */
1556             }
1557             else
1558                 oEmbObj = xEmbedCreator.createInstanceInitFromEntry( xTargetStorage,
1559                                                                     "EmbedSub",
1560                                                                     false,
1561                                                                     new PropertyValue[0] );
1562 
1563             m_xEmbedObj = (XEmbeddedObject)UnoRuntime.queryInterface( XEmbeddedObject.class, oEmbObj );
1564 
1565             if ( m_xEmbedObj != null )
1566             {
1567                 m_xStorage = xTargetStorage;
1568                 m_bOwnFile = true;
1569             }
1570             else
1571                 JOptionPane.showMessageDialog( m_aFrame,
1572                                                "Can't create EmbedObject from storage!",
1573                                                "Error:",
1574                                                JOptionPane.ERROR_MESSAGE );
1575         }
1576         catch( Exception e )
1577         {
1578             JOptionPane.showMessageDialog( m_aFrame, e, "Exception in loadFileURI():", JOptionPane.ERROR_MESSAGE );
1579         }
1580     }
1581 
1582     public void storeLinkToStorage()
1583     {
1584         if ( m_xStorage != null && m_bLinkObj )
1585         {
1586             try {
1587                 XStream xLinkStream = m_xStorage.openStreamElement( "LinkName", ElementModes.ELEMENT_WRITE );
1588 
1589                 if ( xLinkStream != null )
1590                 {
1591                     XOutputStream xLinkOutStream = xLinkStream.getOutputStream();
1592                     XTruncate xTruncate = (XTruncate) UnoRuntime.queryInterface( XTruncate.class,
1593                                                                                 xLinkOutStream );
1594                     if ( xLinkOutStream != null && xTruncate != null )
1595                     {
1596                         xTruncate.truncate();
1597 
1598                         char[] aLinkChar = m_aLinkURI.toCharArray();
1599                         byte[] aLinkBytes = new byte[ aLinkChar.length ];
1600                         for ( int ind = 0; ind < aLinkChar.length; ind++ )
1601                             aLinkBytes[ind] = (byte)aLinkChar[ind];
1602 
1603                         xLinkOutStream.writeBytes( aLinkBytes );
1604                         xLinkOutStream.closeOutput();
1605 
1606                         XComponent xComponent = (XComponent) UnoRuntime.queryInterface( XComponent.class,
1607                                                                                         xLinkStream );
1608                         if ( xComponent != null )
1609                             xComponent.dispose();
1610                     }
1611                     else
1612                         JOptionPane.showMessageDialog( m_aFrame,
1613                                                         "The substream can not be truncated or written!",
1614                                                         "Error:",
1615                                                         JOptionPane.ERROR_MESSAGE );
1616 
1617                 }
1618                 else
1619                     JOptionPane.showMessageDialog( m_aFrame,
1620                                                     "Can't create/open substream!",
1621                                                     "Error:",
1622                                                     JOptionPane.ERROR_MESSAGE );
1623             }
1624             catch( Exception e )
1625             {
1626                 JOptionPane.showMessageDialog( m_aFrame,
1627                                             e,
1628                                             "Exception in storeLinkToStorage:",
1629                                             JOptionPane.ERROR_MESSAGE );
1630 
1631             }
1632         }
1633     }
1634 
1635     public void storeLinkAsFileURI( String aFileURI )
1636     {
1637         try {
1638             Object oStorageFactory = m_xServiceFactory.createInstance( "com.sun.star.embed.StorageFactory" );
1639             XSingleServiceFactory xStorageFactory = (XSingleServiceFactory)UnoRuntime.queryInterface(
1640                                                                                         XSingleServiceFactory.class,
1641                                                                                         oStorageFactory );
1642             if ( xStorageFactory != null )
1643             {
1644                 Object aArgs[] = new Object[2];
1645                 aArgs[0] = aFileURI;
1646                 aArgs[1] = new Integer( ElementModes.ELEMENT_READWRITE );
1647 
1648                 Object oStorage = xStorageFactory.createInstanceWithArguments( aArgs );
1649                 XStorage xTargetStorage = (XStorage)UnoRuntime.queryInterface( XStorage.class, oStorage );
1650 
1651                 XComponent xComponent = (XComponent)UnoRuntime.queryInterface( XComponent.class, m_xStorage );
1652                 xComponent.dispose();
1653 
1654                 m_xStorage = xTargetStorage;
1655                 m_bOwnFile = true;
1656 
1657                 storeLinkToStorage();
1658 
1659                 XTransactedObject xTransact = (XTransactedObject)UnoRuntime.queryInterface( XTransactedObject.class,
1660                                                                                             m_xStorage );
1661                 if ( xTransact != null )
1662                     xTransact.commit();
1663             }
1664             else
1665                 JOptionPane.showMessageDialog( m_aFrame,
1666                                                 "Can't create StorageFactory!",
1667                                                 "Error:",
1668                                                 JOptionPane.ERROR_MESSAGE );
1669         }
1670         catch( Exception e )
1671         {
1672             JOptionPane.showMessageDialog( m_aFrame, e, "Exception in saveStorageToFileURI():", JOptionPane.ERROR_MESSAGE );
1673         }
1674     }
1675 
1676     public String getValidURL( String sFileURL )
1677     {
1678         // m_xTransformer must be set!
1679         URL[] aURLs = { new URL() };
1680         aURLs[0].Complete = sFileURL;
1681 
1682         try {
1683             if ( !m_xTransformer.parseSmart( aURLs, "" ) )
1684                 throw new Exception();
1685         }
1686         catch( Exception e )
1687         {
1688             JOptionPane.showMessageDialog( m_aFrame, e, "Exception in getValidURL():", JOptionPane.ERROR_MESSAGE );
1689         }
1690 
1691         return aURLs[0].Complete;
1692     }
1693 
1694     public void disposeObject()
1695     {
1696         // TODO:
1697         // usage of object, storage and bitmap painter should be locked
1698         // but since possibility of rasecondition is very low
1699         // it is not really required for testing application
1700 
1701         clearObjectAndStorage();
1702 
1703         if ( m_aBitmapPainter != null )
1704         {
1705             m_aBitmapPainter.disconnectListener();
1706             m_aBitmapPainter = null;
1707         }
1708     }
1709 }
1710