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