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