xref: /AOO41X/main/odk/examples/java/EmbedDocument/Container1/EmbedContApp.java (revision ae15d43ae9bc0d57b88b38bfa728519a0f7db121)
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 import java.awt.*;
23 import java.applet.*;
24 import java.awt.event.*;
25 import java.net.*;
26 import java.io.*;
27 
28 import javax.swing.JOptionPane;
29 
30 import com.sun.star.lang.XMultiServiceFactory;
31 import com.sun.star.lang.XSingleServiceFactory;
32 
33 import com.sun.star.uno.UnoRuntime;
34 import com.sun.star.uno.XInterface;
35 import com.sun.star.uno.AnyConverter;
36 import com.sun.star.uno.Type;
37 
38 import com.sun.star.lang.XComponent;
39 
40 import com.sun.star.beans.PropertyValue;
41 
42 import com.sun.star.datatransfer.DataFlavor;
43 import com.sun.star.datatransfer.XTransferable;
44 
45 import com.sun.star.container.XNameAccess;
46 
47 import com.sun.star.io.XStream;
48 import com.sun.star.io.XInputStream;
49 import com.sun.star.io.XOutputStream;
50 import com.sun.star.io.XTruncate;
51 
52 import com.sun.star.embed.*;
53 
54 public class EmbedContApp extends Applet implements MouseListener, XEmbeddedClient
55 {
56     private XMultiServiceFactory m_xServiceFactory;
57 
58     private XEmbeddedObject m_xEmbedObj;
59     private XStorage m_xStorage;
60 
61     private Frame m_aFrame;
62     private Menu m_aFileMenu;
63     private Menu m_aObjectMenu;
64     private Toolkit m_aToolkit;
65     private Image m_aImage;
66 
67     private boolean m_bOwnFile = false;
68 
69     private boolean m_bLinkObj = false;
70     private String m_aLinkURI;
71 
EmbedContApp( Frame aFrame, XMultiServiceFactory xServiceFactory )72     public EmbedContApp( Frame aFrame, XMultiServiceFactory xServiceFactory )
73     {
74         m_aFrame = aFrame;
75         m_xServiceFactory = xServiceFactory;
76     }
77 
init()78     public void init()
79     {
80         resize( 640, 480 );
81         setBackground( Color.gray );
82 
83         m_aToolkit = Toolkit.getDefaultToolkit();
84 
85         // Get a menu bar.
86         MenuBar aMenuBar = m_aFrame.getMenuBar();
87         if( aMenuBar == null )
88         {
89             aMenuBar = new MenuBar();
90             m_aFrame.setMenuBar( aMenuBar );
91         }
92 
93         // Create menus for the menu bar.
94 
95         // File menu
96         m_aFileMenu = new Menu( "File", true );
97         aMenuBar.add( m_aFileMenu );
98 
99         MenuItem aItem = new NewMenuItem();
100         m_aFileMenu.add( aItem );
101 
102         aItem = new OpenFileMenuItem();
103         m_aFileMenu.add( aItem );
104 
105         aItem = new SaveMenuItem();
106         m_aFileMenu.add( aItem );
107 
108         aItem = new SaveAsMenuItem();
109         m_aFileMenu.add( aItem );
110 
111         // Object menu
112         m_aObjectMenu = new Menu( "Object", true );
113         aMenuBar.add( m_aObjectMenu );
114 
115         aItem = new NewObjectMenuItem();
116         m_aObjectMenu.add( aItem );
117 
118         aItem = new LoadObjectMenuItem();
119         m_aObjectMenu.add( aItem );
120 
121         aItem = new LinkObjectMenuItem();
122         m_aObjectMenu.add( aItem );
123 
124         aItem = new ConvertLinkToEmbedMenuItem();
125         m_aObjectMenu.add( aItem );
126 
127         // Handle mouse clicks in our window.
128 //      addMouseListener( new MouseWatcher() );
129         addMouseListener( this );
130     }
131 
update( Graphics g )132     public void update( Graphics g )
133     {
134         paint( g );
135     }
136 
paint( Graphics g )137     public void paint( Graphics g )
138     {
139         super.paint( g );
140 
141         if ( m_xEmbedObj != null )
142         {
143             synchronized( this )
144             {
145                 if ( m_aImage != null )
146                     g.drawImage( m_aImage, 0, 0, EmbedContApp.this );
147             }
148         }
149     }
150 
generateNewImage()151     public void generateNewImage()
152     {
153         if ( m_xEmbedObj != null )
154         {
155             try {
156                 int nOldState = m_xEmbedObj.getCurrentState();
157                 int nState = nOldState;
158                 if ( nOldState == EmbedStates.EMBED_LOADED )
159                 {
160                     m_xEmbedObj.changeState( EmbedStates.EMBED_RUNNING );
161                     nState = EmbedStates.EMBED_RUNNING;
162                 }
163 
164                 if ( nState == EmbedStates.EMBED_ACTIVE || nState == EmbedStates.EMBED_RUNNING )
165                 {
166                     XComponentSupplier xCompProv = (XComponentSupplier)UnoRuntime.queryInterface(
167                                                                                     XComponentSupplier.class,
168                                                                                     m_xEmbedObj );
169                     if ( xCompProv != null )
170                     {
171                         XComponent xComp = xCompProv.getComponent();
172                         XTransferable xTransfer = (XTransferable)UnoRuntime.queryInterface(
173                                                                                     XTransferable.class,
174                                                                                     xComp );
175                         if ( xTransfer != null )
176                         {
177                             DataFlavor aFlavor = new DataFlavor();
178                             aFlavor.MimeType = "image/png";
179                             aFlavor.HumanPresentableName = "Portable Network Graphics";
180                             aFlavor.DataType = new Type( byte[].class );
181 
182                             byte[] aPNGData = (byte[])AnyConverter.toArray( xTransfer.getTransferData( aFlavor ) );
183                             if ( aPNGData != null && aPNGData.length != 0 )
184                             {
185                                 synchronized( this )
186                                 {
187                                     m_aImage = m_aToolkit.createImage( aPNGData );
188                                 }
189                             }
190                         }
191                         else
192                             System.out.println( "paint() : can not get XTransferable for the component!\n" );
193                     }
194                     else
195                         System.out.println( "paint() : XComponentSupplier is not implemented!\n" );
196                 }
197             }
198             catch( com.sun.star.uno.Exception e )
199             {
200                 // dialogs should not be used in paint()
201                 System.out.println( "Exception in paint(): " + e );
202             }
203         }
204     }
205 
mouseClicked( MouseEvent e )206     public void mouseClicked( MouseEvent e )
207     {
208         if( e.getModifiers() == InputEvent.BUTTON1_MASK )
209         {
210             // activate object if exists and not active
211             if ( m_xEmbedObj != null )
212             {
213                 try {
214                     m_xEmbedObj.changeState( EmbedStates.EMBED_ACTIVE );
215                 }
216                 catch( Exception ex )
217                 {
218                     JOptionPane.showMessageDialog( m_aFrame, ex, "Exception on mouse click", JOptionPane.ERROR_MESSAGE );
219                 }
220             }
221         }
222     }
223 
mousePressed( MouseEvent e )224     public void mousePressed( MouseEvent e ){};
mouseEntered( MouseEvent e )225     public void mouseEntered( MouseEvent e ){};
mouseExited( MouseEvent e )226     public void mouseExited( MouseEvent e ){};
mouseReleased( MouseEvent e )227     public void mouseReleased( MouseEvent e ){};
228 
229     // XEmbeddedClient
saveObject()230     public void saveObject()
231         throws com.sun.star.uno.Exception
232     {
233         if ( m_xEmbedObj != null )
234         {
235             try {
236                 XEmbedPersist xPersist = (XEmbedPersist)UnoRuntime.queryInterface( XEmbedPersist.class, m_xEmbedObj );
237                 if ( xPersist != null )
238                 {
239                     xPersist.storeOwn();
240                     generateNewImage();
241                 }
242                 else
243                     JOptionPane.showMessageDialog( m_aFrame, "No XEmbedPersist!", "Error:", JOptionPane.ERROR_MESSAGE );
244             }
245             catch( Exception e )
246             {
247                 JOptionPane.showMessageDialog( m_aFrame, e, "Exception in saveObject:", JOptionPane.ERROR_MESSAGE );
248             }
249         }
250 
251         generateNewImage();
252         repaint();
253     }
254 
onShowWindow( boolean bVisible )255     public void onShowWindow( boolean bVisible )
256     {
257         // for now nothing to do
258     }
259 
260     // classes
261     class NewMenuItem extends MenuItem implements ActionListener // Menu New
262     {
NewMenuItem()263         public NewMenuItem()
264         {
265             super( "New", new MenuShortcut( KeyEvent.VK_A ));
266             addActionListener( this );
267         }
268 
actionPerformed( ActionEvent e )269         public void actionPerformed( ActionEvent e )
270         {
271             // clear everything
272             clearObjectAndStorage();
273 
274             repaint();
275         }
276     }
277 
278     class SaveAsMenuItem extends MenuItem implements ActionListener // Menu SaveAs...
279     {
SaveAsMenuItem()280         public SaveAsMenuItem()
281         {
282             super( "SaveAs..." );
283             addActionListener( this );
284         }
285 
actionPerformed( ActionEvent e )286         public void actionPerformed( ActionEvent e )
287         {
288             // open SaveAs dialog and store
289 
290             if ( m_xStorage != null && m_xEmbedObj != null )
291             {
292                 FileDialog aFileDialog = new FileDialog( m_aFrame, "SaveAs", FileDialog.SAVE );
293                 aFileDialog.show();
294                 if ( aFileDialog.getFile() != null )
295                 {
296                     String aFileName = aFileDialog.getDirectory() + aFileDialog.getFile();
297                     File aFile = new File( aFileName );
298                     if ( aFile != null )
299                     {
300                         // create object from specified file
301                         String aFileURI = aFile.toURI().toASCIIString();
302                         try {
303                             saveObject();
304 
305                             if ( m_bLinkObj )
306                                 storeLinkToStorage();
307 
308                             saveStorageAsFileURI( aFileURI );
309                         }
310                         catch( Exception ex )
311                         {
312                             JOptionPane.showMessageDialog( m_aFrame,
313                                                             ex,
314                                                             "Exception in SaveAsMenuItem:",
315                                                             JOptionPane.ERROR_MESSAGE );
316                         }
317                     }
318                 }
319             }
320             else
321                 JOptionPane.showMessageDialog( m_aFrame, "No document is embedded!", "Error:", JOptionPane.ERROR_MESSAGE );
322         }
323     }
324 
325     class OpenFileMenuItem extends MenuItem implements ActionListener // Menu Open
326     {
OpenFileMenuItem()327         public OpenFileMenuItem()
328         {
329             super( "Open", new MenuShortcut( KeyEvent.VK_C ));
330             addActionListener( this );
331         }
332 
actionPerformed( ActionEvent e )333         public void actionPerformed( ActionEvent e )
334         {
335             // clear everything
336             clearObjectAndStorage();
337 
338             // open OpenFile dialog and load doc
339             FileDialog aFileDialog = new FileDialog( m_aFrame, "Open" );
340             aFileDialog.show();
341             if ( aFileDialog.getFile() != null )
342             {
343                 String aFileName = aFileDialog.getDirectory() + aFileDialog.getFile();
344                 File aFile = new File( aFileName );
345                 if ( aFile != null )
346                 {
347                     // create object from specified file
348                     String aFileURI = aFile.toURI().toASCIIString();
349 
350                     // load from specified file
351                     loadFileURI( aFileURI );
352 
353                     if ( m_xEmbedObj != null )
354                     {
355                         try {
356                             m_xEmbedObj.setClientSite( EmbedContApp.this );
357                         }
358                         catch( Exception ex )
359                         {
360                             JOptionPane.showMessageDialog( m_aFrame,
361                                                             ex,
362                                                             "Exception in OpenFileMenuItem:",
363                                                             JOptionPane.ERROR_MESSAGE );
364                         }
365                     }
366                 }
367             }
368 
369             generateNewImage();
370             repaint();
371         }
372     }
373 
374     class SaveMenuItem extends MenuItem implements ActionListener // Menu Save
375     {
SaveMenuItem()376         public SaveMenuItem()
377         {
378             super( "Save", new MenuShortcut( KeyEvent.VK_D ));
379             addActionListener( this );
380         }
381 
actionPerformed( ActionEvent e )382         public void actionPerformed( ActionEvent e )
383         {
384             // if has persistance store there
385             // if not open SaveAs dialog and store
386             if ( m_xStorage != null && m_xEmbedObj != null )
387             {
388                 if ( m_bOwnFile )
389                 {
390                     if ( m_xStorage == null )
391                     {
392                         JOptionPane.showMessageDialog( m_aFrame,
393                                                         "No storage for oned file!",
394                                                         "Error:",
395                                                         JOptionPane.ERROR_MESSAGE );
396                         return;
397                     }
398 
399                     try {
400                         saveObject();
401 
402                         if ( m_bLinkObj )
403                             storeLinkToStorage();
404 
405                         XTransactedObject xTransact = (XTransactedObject)UnoRuntime.queryInterface( XTransactedObject.class,
406                                                                                                     m_xStorage );
407                         if ( xTransact != null )
408                             xTransact.commit();
409                     }
410                     catch( Exception ex )
411                     {
412                         JOptionPane.showMessageDialog( m_aFrame,
413                                                         ex,
414                                                         "Exception during save operation in SaveMenuItem:",
415                                                         JOptionPane.ERROR_MESSAGE );
416                     }
417                 }
418                 else
419                 {
420                     FileDialog aFileDialog = new FileDialog( m_aFrame, "SaveAs", FileDialog.SAVE );
421                     aFileDialog.show();
422                     if ( aFileDialog.getFile() != null )
423                     {
424                         String aFileName = aFileDialog.getDirectory() + aFileDialog.getFile();
425                         File aFile = new File( aFileName );
426                         if ( aFile != null )
427                         {
428                             // create object from specified file
429                             String aFileURI = aFile.toURI().toASCIIString();
430                             try {
431                                 saveObject();
432 
433                                 if ( m_bLinkObj )
434                                     storeLinkToStorage();
435 
436                                 saveStorageAsFileURI( aFileURI );
437                             }
438                             catch( Exception ex )
439                             {
440                                 JOptionPane.showMessageDialog( m_aFrame,
441                                                                 ex,
442                                                                 "Exception during 'save as' operation in SaveMenuItem:",
443                                                                 JOptionPane.ERROR_MESSAGE );
444                             }
445                         }
446                     }
447                 }
448             }
449             else
450                 JOptionPane.showMessageDialog( m_aFrame, "No document is embedded!", "Error:", JOptionPane.ERROR_MESSAGE );
451         }
452     }
453 
454     class NewObjectMenuItem extends MenuItem implements ActionListener // Menu NewObject
455     {
NewObjectMenuItem()456         public NewObjectMenuItem()
457         {
458             super( "Create", new MenuShortcut( KeyEvent.VK_N ));
459             addActionListener( this );
460         }
461 
actionPerformed( ActionEvent e )462         public void actionPerformed( ActionEvent e )
463         {
464             // remove current object an init a new one
465             clearObjectAndStorage();
466 
467             Object[] possibleValues = { "com.sun.star.comp.Writer.TextDocument",
468                                         "com.sun.star.comp.Writer.GlobalDocument",
469                                         "com.sun.star.comp.Writer.WebDocument",
470                                         "com.sun.star.comp.Calc.SpreadsheetDocument",
471                                         "com.sun.star.comp.Draw.PresentationDocument",
472                                         "com.sun.star.comp.Draw.DrawingDocument",
473                                         "com.sun.star.comp.Math.FormulaDocument" };
474 
475             String selectedValue = (String)JOptionPane.showInputDialog( null, "DocumentType", "Select",
476                                                                         JOptionPane.INFORMATION_MESSAGE, null,
477                                                                         possibleValues, possibleValues[0] );
478 
479             if ( selectedValue != null )
480             {
481                 m_xStorage = createTempStorage();
482 
483                 if ( m_xStorage != null )
484                     m_xEmbedObj = createEmbedObject( selectedValue );
485                 else
486                     JOptionPane.showMessageDialog( m_aFrame,
487                                                     "Can't create temporary storage!",
488                                                     "Error:",
489                                                     JOptionPane.ERROR_MESSAGE );
490 
491 
492                 if ( m_xEmbedObj != null )
493                 {
494                     try {
495                         m_xEmbedObj.setClientSite( EmbedContApp.this );
496                     }
497                     catch( Exception ex )
498                     {
499                         JOptionPane.showMessageDialog( m_aFrame,
500                                                         ex,
501                                                         "Exception in NewObjectMenuItem:",
502                                                         JOptionPane.ERROR_MESSAGE );
503                     }
504                 }
505             }
506 
507             generateNewImage();
508             repaint();
509         }
510     }
511 
512     class LoadObjectMenuItem extends MenuItem implements ActionListener // Menu LoadObject
513     {
LoadObjectMenuItem()514         public LoadObjectMenuItem()
515         {
516             super( "Load from file", new MenuShortcut( KeyEvent.VK_L ));
517             addActionListener( this );
518         }
519 
actionPerformed( ActionEvent e )520         public void actionPerformed( ActionEvent e )
521         {
522             // first remove current object
523             clearObjectAndStorage();
524 
525             // open OpenFile dialog and load doc
526             FileDialog aFileDialog = new FileDialog( m_aFrame, "Select sources to use for object init" );
527             aFileDialog.show();
528             if ( aFileDialog.getFile() != null )
529             {
530                 String aFileName = aFileDialog.getDirectory() + aFileDialog.getFile();
531                 File aFile = new File( aFileName );
532                 if ( aFile != null )
533                 {
534                     // create object from specified file
535                     String aFileURI = aFile.toURI().toASCIIString();
536                     m_xStorage = createTempStorage();
537 
538                     if ( m_xStorage != null )
539                         m_xEmbedObj = loadEmbedObject( aFileURI );
540 
541                     if ( m_xEmbedObj != null )
542                     {
543                         try {
544                             m_xEmbedObj.setClientSite( EmbedContApp.this );
545                         }
546                         catch( Exception ex )
547                         {
548                             JOptionPane.showMessageDialog( m_aFrame,
549                                                             ex,
550                                                             "Exception in LoadObjectMenuItem:",
551                                                             JOptionPane.ERROR_MESSAGE );
552                         }
553                     }
554                 }
555             }
556 
557             generateNewImage();
558             repaint();
559         }
560     }
561 
562     class LinkObjectMenuItem extends MenuItem implements ActionListener // Menu LinkObject
563     {
LinkObjectMenuItem()564         public LinkObjectMenuItem()
565         {
566             super( "Create link", new MenuShortcut( KeyEvent.VK_M ));
567             addActionListener( this );
568         }
569 
actionPerformed( ActionEvent e )570         public void actionPerformed( ActionEvent e )
571         {
572             // first remove current object
573             clearObjectAndStorage();
574 
575             // open OpenFile dialog and load doc
576             FileDialog aFileDialog = new FileDialog( m_aFrame, "Select sources to use for object init" );
577             aFileDialog.show();
578             if ( aFileDialog.getFile() != null )
579             {
580                 m_xStorage = createTempStorage();
581 
582                 String aFileName = aFileDialog.getDirectory() + aFileDialog.getFile();
583                 File aFile = new File( aFileName );
584                 if ( aFile != null )
585                 {
586                     // create object from specified file
587                     String aFileURI = aFile.toURI().toASCIIString();
588 
589                     m_xEmbedObj = createLinkObject( aFileURI );
590 
591                     if ( m_xEmbedObj != null )
592                     {
593                         m_aLinkURI = aFileURI;
594                         m_bLinkObj = true;
595 
596                         try {
597                             m_xEmbedObj.setClientSite( EmbedContApp.this );
598                         }
599                         catch( Exception ex )
600                         {
601                             JOptionPane.showMessageDialog( m_aFrame,
602                                                             ex,
603                                                             "Exception in LinkObjectMenuItem:",
604                                                             JOptionPane.ERROR_MESSAGE );
605                         }
606                     }
607                 }
608             }
609 
610             generateNewImage();
611             repaint();
612         }
613     }
614 
615     class ConvertLinkToEmbedMenuItem extends MenuItem implements ActionListener // Menu LinkObject
616     {
ConvertLinkToEmbedMenuItem()617         public ConvertLinkToEmbedMenuItem()
618         {
619             super( "Convert link to embed", new MenuShortcut( KeyEvent.VK_M ));
620             addActionListener( this );
621         }
622 
actionPerformed( ActionEvent e )623         public void actionPerformed( ActionEvent e )
624         {
625             if ( !m_bLinkObj )
626             {
627                 JOptionPane.showMessageDialog( m_aFrame, "The object is not a link!", "Error:", JOptionPane.ERROR_MESSAGE );
628                 return;
629             }
630 
631             if ( m_xEmbedObj != null )
632             {
633                 if ( m_xStorage != null )
634                 {
635                     try {
636                         XNameAccess xNameAccess = (XNameAccess)UnoRuntime.queryInterface( XNameAccess.class,
637                                                                                         m_xStorage );
638                         if ( xNameAccess != null && xNameAccess.hasByName( "LinkName" ) )
639                             m_xStorage.removeElement( "LinkName" );
640 
641                         XEmbedPersist xPersist = (XEmbedPersist)UnoRuntime.queryInterface( XEmbedPersist.class,
642                                                                                         m_xEmbedObj );
643                         if ( xPersist != null )
644                         {
645                             PropertyValue[] pEmp = new PropertyValue[0];
646                             xPersist.setPersistentEntry( m_xStorage, "EmbedSub", EntryInitModes.ENTRY_NO_INIT, pEmp );
647                             m_bLinkObj = false;
648                             m_aLinkURI = null;
649                         }
650                         else
651                             JOptionPane.showMessageDialog( m_aFrame,
652                                                             "No XEmbedPersist in ConvertLink... !",
653                                                             "Error:",
654                                                             JOptionPane.ERROR_MESSAGE );
655                     }
656                     catch( Exception e1 )
657                     {
658                         JOptionPane.showMessageDialog( m_aFrame,
659                                                         e1,
660                                                         "Exception in ConvertLinkToEmbed:try 1 :",
661                                                         JOptionPane.ERROR_MESSAGE );
662                     }
663                 }
664             }
665         }
666     }
667 
668     // Helper methods
createEmbedObject( String aServiceName )669     public XEmbeddedObject createEmbedObject( String aServiceName )
670     {
671         XEmbeddedObject xEmbObj = null;
672         byte[] pClassID = new byte[16];
673 
674         if ( aServiceName.equals( "com.sun.star.comp.Writer.TextDocument" ) )
675         {
676             int[] pTempClassID = { 0x8B, 0xC6, 0xB1, 0x65, 0xB1, 0xB2, 0x4E, 0xDD,
677                                     0xAA, 0x47, 0xDA, 0xE2, 0xEE, 0x68, 0x9D, 0xD6 };
678             for ( int ind = 0; ind < 16; ind++ )
679                 pClassID[ind] = (byte)pTempClassID[ind];
680         }
681         else if ( aServiceName.equals( "com.sun.star.comp.Writer.GlobalDocument" ) )
682         {
683             int[] pTempClassID = { 0xB2, 0x1A, 0x0A, 0x7C, 0xE4, 0x03, 0x41, 0xFE,
684                                     0x95, 0x62, 0xBD, 0x13, 0xEA, 0x6F, 0x15, 0xA0 };
685             for ( int ind = 0; ind < 16; ind++ )
686                 pClassID[ind] = (byte)pTempClassID[ind];
687         }
688         else if ( aServiceName.equals( "com.sun.star.comp.Writer.WebDocument" ) )
689         {
690             int[] pTempClassID = { 0xA8, 0xBB, 0xA6, 0x0C, 0x7C, 0x60, 0x45, 0x50,
691                                     0x91, 0xCE, 0x39, 0xC3, 0x90, 0x3F, 0xAC, 0x5E };
692             for ( int ind = 0; ind < 16; ind++ )
693                 pClassID[ind] = (byte)pTempClassID[ind];
694         }
695         else if ( aServiceName.equals( "com.sun.star.comp.Calc.SpreadsheetDocument" ) )
696         {
697             int[] pTempClassID = { 0x47, 0xBB, 0xB4, 0xCB, 0xCE, 0x4C, 0x4E, 0x80,
698                                     0xA5, 0x91, 0x42, 0xD9, 0xAE, 0x74, 0x95, 0x0F };
699             for ( int ind = 0; ind < 16; ind++ )
700                 pClassID[ind] = (byte)pTempClassID[ind];
701         }
702         else if ( aServiceName.equals( "com.sun.star.comp.Draw.PresentationDocument" ) )
703         {
704             int[] pTempClassID = { 0x91, 0x76, 0xE4, 0x8A, 0x63, 0x7A, 0x4D, 0x1F,
705                                     0x80, 0x3B, 0x99, 0xD9, 0xBF, 0xAC, 0x10, 0x47 };
706             for ( int ind = 0; ind < 16; ind++ )
707                 pClassID[ind] = (byte)pTempClassID[ind];
708         }
709         else if ( aServiceName.equals( "com.sun.star.comp.Draw.DrawingDocument" ) )
710         {
711             int[] pTempClassID = { 0x4B, 0xAB, 0x89, 0x70, 0x8A, 0x3B, 0x45, 0xB3,
712                                     0x99, 0x1C, 0xCB, 0xEE, 0xAC, 0x6B, 0xD5, 0xE3 };
713             for ( int ind = 0; ind < 16; ind++ )
714                 pClassID[ind] = (byte)pTempClassID[ind];
715         }
716         else if ( aServiceName.equals( "com.sun.star.comp.Math.FormulaDocument" ) )
717         {
718             int[] pTempClassID = { 0x07, 0x8B, 0x7A, 0xBA, 0x54, 0xFC, 0x45, 0x7F,
719                                     0x85, 0x51, 0x61, 0x47, 0xE7, 0x76, 0xA9, 0x97 };
720             for ( int ind = 0; ind < 16; ind++ )
721                 pClassID[ind] = (byte)pTempClassID[ind];
722         }
723 
724         if ( pClassID != null )
725         {
726             // create embedded object based on the class ID
727             try {
728                 Object oEmbedFactory = m_xServiceFactory.createInstance( "com.sun.star.embed.EmbeddedObjectFactory" );
729                 XEmbedObjectFactory xEmbedFactory = (XEmbedObjectFactory)UnoRuntime.queryInterface(
730                                                                                         XEmbedObjectFactory.class,
731                                                                                         oEmbedFactory );
732                 if ( xEmbedFactory != null )
733                 {
734                     Object oEmbObj = xEmbedFactory.createInstanceInitNew( pClassID,
735                                                                         "Dummy name",
736                                                                         m_xStorage,
737                                                                         "EmbedSub" );
738                     xEmbObj = (XEmbeddedObject)UnoRuntime.queryInterface( XEmbeddedObject.class, oEmbObj );
739                 }
740                 else
741                     JOptionPane.showMessageDialog( m_aFrame,
742                                                    "Can't create EmbedFactory!",
743                                                    "Error:",
744                                                    JOptionPane.ERROR_MESSAGE );
745             }
746             catch( Exception e )
747             {
748                 JOptionPane.showMessageDialog( m_aFrame, e, "Exception in createInstanceInitNew():", JOptionPane.ERROR_MESSAGE );
749             }
750         }
751         else
752             JOptionPane.showMessageDialog( m_aFrame, "Can't retrieve class ID!", "Error:", JOptionPane.ERROR_MESSAGE );
753 
754         return xEmbObj;
755     }
756 
createLinkObject( String aLinkURL )757     public XEmbeddedObject createLinkObject( String aLinkURL )
758     {
759         XEmbeddedObject xEmbObj = null;
760 
761         try {
762             Object oEmbedFactory = m_xServiceFactory.createInstance( "com.sun.star.embed.EmbeddedObjectFactory" );
763             XEmbedObjectFactory xEmbedFactory = (XEmbedObjectFactory)UnoRuntime.queryInterface(
764                                                                                     XEmbedObjectFactory.class,
765                                                                                     oEmbedFactory );
766             if ( xEmbedFactory != null )
767             {
768                 Object oEmbObj = xEmbedFactory.createInstanceLink( aLinkURL );
769                 xEmbObj = (XEmbeddedObject)UnoRuntime.queryInterface( XEmbeddedObject.class, oEmbObj );
770             }
771             else
772                 JOptionPane.showMessageDialog( m_aFrame,
773                                                "Can't create EmbedFactory!",
774                                                "Error:",
775                                                JOptionPane.ERROR_MESSAGE );
776         }
777         catch( Exception e )
778         {
779             JOptionPane.showMessageDialog( m_aFrame, e, "Exception in createLinkObject():", JOptionPane.ERROR_MESSAGE );
780         }
781 
782 
783         return xEmbObj;
784     }
785 
786 
loadEmbedObject( String aFileURI )787     public XEmbeddedObject loadEmbedObject( String aFileURI )
788     {
789         XEmbeddedObject xEmbObj = null;
790         try {
791             Object oEmbedFactory = m_xServiceFactory.createInstance( "com.sun.star.embed.EmbeddedObjectFactory" );
792             XEmbedObjectFactory xEmbedFactory = (XEmbedObjectFactory)UnoRuntime.queryInterface(
793                                                                                     XEmbedObjectFactory.class,
794                                                                                     oEmbedFactory );
795             if ( xEmbedFactory != null )
796             {
797                 PropertyValue[] aMedDescr = { new PropertyValue(), new PropertyValue() };
798                 aMedDescr[0].Name = "URL";
799                 aMedDescr[0].Value = (Object) aFileURI;
800                 aMedDescr[1].Name = "ReadOnly";
801                 aMedDescr[1].Value = (Object) new Boolean( false );
802                 Object oEmbObj = xEmbedFactory.createInstanceInitFromMediaDescriptor( m_xStorage,
803                                                                                     "EmbedSub",
804                                                                                     aMedDescr );
805                 xEmbObj = (XEmbeddedObject)UnoRuntime.queryInterface( XEmbeddedObject.class, oEmbObj );
806             }
807             else
808                 JOptionPane.showMessageDialog( m_aFrame,
809                                                "Can't create EmbedFactory!",
810                                                "Error:",
811                                                JOptionPane.ERROR_MESSAGE );
812         }
813         catch( Exception e )
814         {
815             JOptionPane.showMessageDialog( m_aFrame, e, "Exception in loadEmbedObject():", JOptionPane.ERROR_MESSAGE );
816         }
817 
818         return xEmbObj;
819     }
820 
clearObjectAndStorage()821     public void clearObjectAndStorage()
822     {
823         synchronized( this )
824         {
825             m_aImage = null;
826         }
827 
828         m_bOwnFile = false;
829 
830         m_aLinkURI = null;
831         m_bLinkObj = false;
832 
833         if ( m_xEmbedObj != null )
834         {
835             try {
836                 XComponent xComponent = (XComponent)UnoRuntime.queryInterface( XComponent.class, m_xEmbedObj );
837                 if ( xComponent != null )
838                     xComponent.dispose();
839             }
840             catch ( Exception ex )
841             {}
842             m_xEmbedObj = null;
843         }
844 
845         if ( m_xStorage != null )
846         {
847             try {
848                 XComponent xComponent = (XComponent)UnoRuntime.queryInterface( XComponent.class, m_xStorage );
849                 if ( xComponent != null )
850                     xComponent.dispose();
851             }
852             catch ( Exception ex )
853             {}
854             m_xStorage = null;
855         }
856     }
857 
createTempStorage()858     public XStorage createTempStorage()
859     {
860         XStorage xTempStorage = null;
861 
862         try {
863             Object oStorageFactory = m_xServiceFactory.createInstance( "com.sun.star.embed.StorageFactory" );
864             XSingleServiceFactory xStorageFactory = (XSingleServiceFactory)UnoRuntime.queryInterface(
865                                                                                         XSingleServiceFactory.class,
866                                                                                         oStorageFactory );
867             if ( xStorageFactory != null )
868             {
869                 Object oStorage = xStorageFactory.createInstance();
870                 xTempStorage = (XStorage)UnoRuntime.queryInterface( XStorage.class, oStorage );
871             }
872             else
873                 JOptionPane.showMessageDialog( m_aFrame,
874                                                 "Can't create StorageFactory!",
875                                                 "Error:",
876                                                 JOptionPane.ERROR_MESSAGE );
877         }
878         catch( Exception e )
879         {
880             JOptionPane.showMessageDialog( m_aFrame, e, "Exception in createTempStorage():", JOptionPane.ERROR_MESSAGE );
881         }
882 
883         return xTempStorage;
884     }
885 
saveStorageAsFileURI( String aFileURI )886     public void saveStorageAsFileURI( String aFileURI )
887     {
888         try {
889             Object oStorageFactory = m_xServiceFactory.createInstance( "com.sun.star.embed.StorageFactory" );
890             XSingleServiceFactory xStorageFactory = (XSingleServiceFactory)UnoRuntime.queryInterface(
891                                                                                         XSingleServiceFactory.class,
892                                                                                         oStorageFactory );
893             if ( xStorageFactory != null )
894             {
895                 Object aArgs[] = new Object[2];
896                 aArgs[0] = aFileURI;
897                 aArgs[1] = new Integer( ElementModes.ELEMENT_READWRITE );
898 
899                 Object oStorage = xStorageFactory.createInstanceWithArguments( aArgs );
900                 XStorage xTargetStorage = (XStorage)UnoRuntime.queryInterface( XStorage.class, oStorage );
901                 m_xStorage.copyToStorage( xTargetStorage );
902 
903                 XComponent xComponent = (XComponent)UnoRuntime.queryInterface( XComponent.class, m_xStorage );
904                 xComponent.dispose();
905 
906                 m_xStorage = xTargetStorage;
907                 m_bOwnFile = true;
908             }
909             else
910                 JOptionPane.showMessageDialog( m_aFrame,
911                                                 "Can't create StorageFactory!",
912                                                 "Error:",
913                                                 JOptionPane.ERROR_MESSAGE );
914         }
915         catch( Exception e )
916         {
917             JOptionPane.showMessageDialog( m_aFrame, e, "Exception in saveStorageToFileURI():", JOptionPane.ERROR_MESSAGE );
918         }
919 
920     }
921 
loadFileURI( String aFileURI )922     public void loadFileURI( String aFileURI )
923     {
924         try
925         {
926             Object oStorageFactory = m_xServiceFactory.createInstance( "com.sun.star.embed.StorageFactory" );
927             XSingleServiceFactory xStorageFactory = (XSingleServiceFactory)UnoRuntime.queryInterface(
928                                                                                         XSingleServiceFactory.class,
929                                                                                         oStorageFactory );
930             Object aArgs[] = new Object[2];
931             aArgs[0] = aFileURI;
932             aArgs[1] = new Integer( ElementModes.ELEMENT_READWRITE );
933 
934             Object oStorage = xStorageFactory.createInstanceWithArguments( aArgs );
935             XStorage xTargetStorage = (XStorage)UnoRuntime.queryInterface( XStorage.class, oStorage );
936 
937             Object oEmbedFactory = m_xServiceFactory.createInstance( "com.sun.star.embed.EmbeddedObjectFactory" );
938             XEmbedObjectFactory xEmbedFactory = (XEmbedObjectFactory)UnoRuntime.queryInterface(
939                                                                                     XEmbedObjectFactory.class,
940                                                                                     oEmbedFactory );
941 
942             XNameAccess xNameAccess = (XNameAccess)UnoRuntime.queryInterface( XNameAccess.class,
943                                                                             xTargetStorage );
944             if ( xNameAccess == null )
945             {
946                 JOptionPane.showMessageDialog( m_aFrame, "No XNameAccess!", "Error:", JOptionPane.ERROR_MESSAGE );
947                 return;
948             }
949 
950             Object oEmbObj = null;
951             if ( xNameAccess.hasByName( "LinkName" ) && xTargetStorage.isStreamElement( "LinkName" ) )
952             {
953                 XStream xLinkStream = xTargetStorage.openStreamElement( "LinkName", ElementModes.ELEMENT_READ );
954                 if ( xLinkStream != null )
955                 {
956                     XInputStream xInStream = xLinkStream.getInputStream();
957                     if ( xInStream != null )
958                     {
959                         byte[][] pBuff = new byte[1][0];
960                         int nRead = xInStream.readBytes( pBuff, 1000 );
961                         m_aLinkURI = new String( pBuff[0] );
962                         xInStream.closeInput();
963                         oEmbObj = xEmbedFactory.createInstanceLink( m_aLinkURI );
964                         m_bLinkObj = true;
965                     }
966                 }
967             }
968             else
969                 oEmbObj = xEmbedFactory.createInstanceInitFromEntry( xTargetStorage,
970                                                                     "EmbedSub",
971                                                                     false );
972 
973             m_xEmbedObj = (XEmbeddedObject)UnoRuntime.queryInterface( XEmbeddedObject.class, oEmbObj );
974 
975             if ( m_xEmbedObj != null )
976             {
977                 m_xStorage = xTargetStorage;
978                 m_bOwnFile = true;
979             }
980             else
981                 JOptionPane.showMessageDialog( m_aFrame,
982                                                "Can't create EmbedObject from storage!",
983                                                "Error:",
984                                                JOptionPane.ERROR_MESSAGE );
985         }
986         catch( Exception e )
987         {
988             JOptionPane.showMessageDialog( m_aFrame, e, "Exception in loadFileURI():", JOptionPane.ERROR_MESSAGE );
989         }
990     }
991 
storeLinkToStorage()992     public void storeLinkToStorage()
993     {
994         if ( m_xStorage != null && m_bLinkObj )
995         {
996             try {
997                 XStream xLinkStream = m_xStorage.openStreamElement( "LinkName", ElementModes.ELEMENT_WRITE );
998 
999                 if ( xLinkStream != null )
1000                 {
1001                     XOutputStream xLinkOutStream = xLinkStream.getOutputStream();
1002                     XTruncate xTruncate = (XTruncate) UnoRuntime.queryInterface( XTruncate.class,
1003                                                                                 xLinkOutStream );
1004                     if ( xLinkOutStream != null && xTruncate != null )
1005                     {
1006                         xTruncate.truncate();
1007 
1008                         char[] aLinkChar = m_aLinkURI.toCharArray();
1009                         byte[] aLinkBytes = new byte[ aLinkChar.length ];
1010                         for ( int ind = 0; ind < aLinkChar.length; ind++ )
1011                             aLinkBytes[ind] = (byte)aLinkChar[ind];
1012 
1013                         xLinkOutStream.writeBytes( aLinkBytes );
1014                         xLinkOutStream.closeOutput();
1015 
1016                         XComponent xComponent = (XComponent) UnoRuntime.queryInterface( XComponent.class,
1017                                                                                         xLinkStream );
1018                         if ( xComponent != null )
1019                             xComponent.dispose();
1020                     }
1021                     else
1022                         JOptionPane.showMessageDialog( m_aFrame,
1023                                                         "The substream can not be truncated or written!",
1024                                                         "Error:",
1025                                                         JOptionPane.ERROR_MESSAGE );
1026 
1027                 }
1028                 else
1029                     JOptionPane.showMessageDialog( m_aFrame,
1030                                                     "Can't create/open substream!",
1031                                                     "Error:",
1032                                                     JOptionPane.ERROR_MESSAGE );
1033             }
1034             catch( Exception e )
1035             {
1036                 JOptionPane.showMessageDialog( m_aFrame,
1037                                             e,
1038                                             "Exception in storeLinkToStorage:",
1039                                             JOptionPane.ERROR_MESSAGE );
1040 
1041             }
1042         }
1043     }
1044 }
1045 
1046