import java.awt.*; import java.applet.*; import java.awt.event.*; import java.net.*; import java.io.*; import javax.swing.JOptionPane; import javax.swing.Timer; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.lang.XSingleServiceFactory; import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.XInterface; import com.sun.star.uno.AnyConverter; import com.sun.star.uno.Type; import com.sun.star.uno.Any; import com.sun.star.lang.XComponent; import com.sun.star.util.XCloseable; import com.sun.star.beans.PropertyValue; import com.sun.star.beans.NamedValue; import com.sun.star.datatransfer.DataFlavor; import com.sun.star.datatransfer.XTransferable; import com.sun.star.container.XNameAccess; import com.sun.star.io.XStream; import com.sun.star.io.XInputStream; import com.sun.star.io.XOutputStream; import com.sun.star.io.XTruncate; import com.sun.star.task.XJob; import com.sun.star.embed.*; public class EmbedContApp extends Applet implements MouseListener, XEmbeddedClient, ActionListener, XJob { private XMultiServiceFactory m_xServiceFactory; private XJob m_xMainThreadExecutor; private NamedValue[] m_pValuesForExecutor; private XEmbeddedObject m_xEmbedObj; private XStorage m_xStorage; private Frame m_aFrame; private Menu m_aFileMenu; private Menu m_aObjectMenu; private Toolkit m_aToolkit; private Image m_aImage; private Object m_oImageLock; private boolean m_bOwnFile = false; private boolean m_bLinkObj = false; private String m_aLinkURI; private Object m_oActionsNumberLock; private int m_nActionsNumber; private byte[] m_pActionsList; private Timer m_aTimer; private boolean m_bDestroyed = false; private Object m_oInHandlerLock; private boolean m_bInHandler = false; // Constants private final byte DESTROY = 1; private final byte MOUSE_CLICKED = 2; private final byte NEW_DOCUMENT = 3; private final byte SAVE_AS = 4; private final byte OPEN_FILE = 5; private final byte SAVE = 6; private final byte NEW_OBJECT = 7; private final byte OBJECT_FROM_FILE = 8; private final byte LINK_FROM_FILE = 9; private final byte CONVERT_LINK_TO_OBJECT = 10; // Methods public EmbedContApp( Frame aFrame, XMultiServiceFactory xServiceFactory ) { m_aFrame = aFrame; m_xServiceFactory = xServiceFactory; } public void init() { resize( 640, 480 ); setBackground( Color.gray ); m_aToolkit = Toolkit.getDefaultToolkit(); m_pActionsList = new byte[200]; m_nActionsNumber = 0; m_oActionsNumberLock = new Object(); m_oInHandlerLock = new Object(); m_oImageLock = new Object(); try { Object oJob = m_xServiceFactory.createInstance( "com.sun.star.comp.thread.MainThreadExecutor" ); m_xMainThreadExecutor = (XJob)UnoRuntime.queryInterface( XJob.class, oJob ); } catch( Exception e ) {} if ( m_xMainThreadExecutor == null ) { System.out.println( "Can't create MainThreadExecutor! The application is unusable!" ); System.exit( 0 ); } m_pValuesForExecutor = new NamedValue[1]; m_pValuesForExecutor[0] = new NamedValue( "JobToExecute", (Object)this ); m_aTimer = new Timer( 100, this ); m_aTimer.start(); // Get a menu bar. MenuBar aMenuBar = m_aFrame.getMenuBar(); if( aMenuBar == null ) { aMenuBar = new MenuBar(); m_aFrame.setMenuBar( aMenuBar ); } // Create menus for the menu bar. // File menu m_aFileMenu = new Menu( "File", true ); aMenuBar.add( m_aFileMenu ); MenuItem aItem = new NewMenuItem(); m_aFileMenu.add( aItem ); aItem = new OpenFileMenuItem(); m_aFileMenu.add( aItem ); aItem = new SaveMenuItem(); m_aFileMenu.add( aItem ); aItem = new SaveAsMenuItem(); m_aFileMenu.add( aItem ); // Object menu m_aObjectMenu = new Menu( "Object", true ); aMenuBar.add( m_aObjectMenu ); aItem = new NewObjectMenuItem(); m_aObjectMenu.add( aItem ); aItem = new LoadObjectMenuItem(); m_aObjectMenu.add( aItem ); aItem = new LinkObjectMenuItem(); m_aObjectMenu.add( aItem ); aItem = new ConvertLinkToEmbedMenuItem(); m_aObjectMenu.add( aItem ); // Handle mouse clicks in our window. // addMouseListener( new MouseWatcher() ); addMouseListener( this ); } public void actionPerformed( ActionEvent evt ) { synchronized( m_oInHandlerLock ) { if ( m_bInHandler ) return; m_bInHandler = true; } synchronized( m_oActionsNumberLock ) { if ( m_nActionsNumber > 0 ) { try { m_xMainThreadExecutor.execute( m_pValuesForExecutor ); } catch( Exception e ) { System.out.println( "Exception in actionPerformed() : " + e ); } } else { synchronized( m_oInHandlerLock ) { m_bInHandler = false; } } } } public Object execute( NamedValue[] pValues ) { { for( int nInd = 0; nInd < m_nActionsNumber; nInd++ ) { // TODO: execute m_pActionsList[ nInd ] operation if ( m_pActionsList[ nInd ] == DESTROY ) { // free all resources clearObjectAndStorage(); m_bDestroyed = true; } else if ( m_pActionsList[ nInd ] == MOUSE_CLICKED ) { // activate object if exists and not active if ( m_xEmbedObj != null ) { try { m_xEmbedObj.changeState( EmbedStates.EMBED_ACTIVE ); } catch( Exception ex ) { JOptionPane.showMessageDialog( m_aFrame, ex, "Exception on mouse click", JOptionPane.ERROR_MESSAGE ); } } } else if ( m_pActionsList[ nInd ] == NEW_DOCUMENT ) { // clear everything clearObjectAndStorage(); repaint(); } else if ( m_pActionsList[ nInd ] == SAVE_AS ) { // open SaveAs dialog and store if ( m_xStorage != null && m_xEmbedObj != null ) { FileDialog aFileDialog = new FileDialog( m_aFrame, "SaveAs", FileDialog.SAVE ); aFileDialog.show(); if ( aFileDialog.getFile() != null ) { String aFileName = aFileDialog.getDirectory() + aFileDialog.getFile(); File aFile = new File( aFileName ); if ( aFile != null ) { // create object from specified file String aFileURI = aFile.toURI().toASCIIString(); try { saveObject(); if ( m_bLinkObj ) storeLinkToStorage(); saveStorageAsFileURI( aFileURI ); } catch( Exception ex ) { JOptionPane.showMessageDialog( m_aFrame, ex, "Exception in SaveAsMenuItem:", JOptionPane.ERROR_MESSAGE ); } } } } else JOptionPane.showMessageDialog( m_aFrame, "No document is embedded!", "Error:", JOptionPane.ERROR_MESSAGE ); } else if ( m_pActionsList[ nInd ] == OPEN_FILE ) { // clear everything clearObjectAndStorage(); // open OpenFile dialog and load doc FileDialog aFileDialog = new FileDialog( m_aFrame, "Open" ); aFileDialog.show(); if ( aFileDialog.getFile() != null ) { String aFileName = aFileDialog.getDirectory() + aFileDialog.getFile(); File aFile = new File( aFileName ); if ( aFile != null ) { // create object from specified file String aFileURI = aFile.toURI().toASCIIString(); // load from specified file loadFileURI( aFileURI ); if ( m_xEmbedObj != null ) { try { m_xEmbedObj.setClientSite( this ); } catch( Exception ex ) { JOptionPane.showMessageDialog( m_aFrame, ex, "Exception in OpenFileMenuItem:", JOptionPane.ERROR_MESSAGE ); } } } } generateNewImage(); repaint(); } else if ( m_pActionsList[ nInd ] == SAVE ) { // if has persistance store there // if not open SaveAs dialog and store if ( m_xStorage != null && m_xEmbedObj != null ) { if ( m_bOwnFile ) { if ( m_xStorage == null ) { JOptionPane.showMessageDialog( m_aFrame, "No storage for oned file!", "Error:", JOptionPane.ERROR_MESSAGE ); synchronized( m_oInHandlerLock ) { m_bInHandler = false; } return Any.VOID; } try { saveObject(); if ( m_bLinkObj ) storeLinkToStorage(); XTransactedObject xTransact = (XTransactedObject)UnoRuntime.queryInterface( XTransactedObject.class, m_xStorage ); if ( xTransact != null ) xTransact.commit(); } catch( Exception ex ) { JOptionPane.showMessageDialog( m_aFrame, ex, "Exception during save operation in SaveMenuItem:", JOptionPane.ERROR_MESSAGE ); } } else { FileDialog aFileDialog = new FileDialog( m_aFrame, "SaveAs", FileDialog.SAVE ); aFileDialog.show(); if ( aFileDialog.getFile() != null ) { String aFileName = aFileDialog.getDirectory() + aFileDialog.getFile(); File aFile = new File( aFileName ); if ( aFile != null ) { // create object from specified file String aFileURI = aFile.toURI().toASCIIString(); try { saveObject(); if ( m_bLinkObj ) storeLinkToStorage(); saveStorageAsFileURI( aFileURI ); } catch( Exception ex ) { JOptionPane.showMessageDialog( m_aFrame, ex, "Exception during 'save as' operation in SaveMenuItem:", JOptionPane.ERROR_MESSAGE ); } } } } } else JOptionPane.showMessageDialog( m_aFrame, "No document is embedded!", "Error:", JOptionPane.ERROR_MESSAGE ); } else if ( m_pActionsList[ nInd ] == NEW_OBJECT ) { // remove current object an init a new one clearObjectAndStorage(); Object[] possibleValues = { "com.sun.star.comp.Writer.TextDocument", "com.sun.star.comp.Writer.GlobalDocument", "com.sun.star.comp.Writer.WebDocument", "com.sun.star.comp.Calc.SpreadsheetDocument", "com.sun.star.comp.Draw.PresentationDocument", "com.sun.star.comp.Draw.DrawingDocument", "com.sun.star.comp.Math.FormulaDocument", "BitmapImage" }; String selectedValue = (String)JOptionPane.showInputDialog( null, "DocumentType", "Select", JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0] ); if ( selectedValue != null ) { m_xStorage = createTempStorage(); if ( m_xStorage != null ) m_xEmbedObj = createEmbedObject( selectedValue ); else JOptionPane.showMessageDialog( m_aFrame, "Can't create temporary storage!", "Error:", JOptionPane.ERROR_MESSAGE ); if ( m_xEmbedObj != null ) { try { m_xEmbedObj.setClientSite( this ); } catch( Exception ex ) { JOptionPane.showMessageDialog( m_aFrame, ex, "Exception in NewObjectMenuItem:", JOptionPane.ERROR_MESSAGE ); } } } generateNewImage(); repaint(); } else if ( m_pActionsList[ nInd ] == OBJECT_FROM_FILE ) { // first remove current object clearObjectAndStorage(); // open OpenFile dialog and load doc FileDialog aFileDialog = new FileDialog( m_aFrame, "Select sources to use for object init" ); aFileDialog.show(); if ( aFileDialog.getFile() != null ) { String aFileName = aFileDialog.getDirectory() + aFileDialog.getFile(); File aFile = new File( aFileName ); if ( aFile != null ) { // create object from specified file String aFileURI = aFile.toURI().toASCIIString(); m_xStorage = createTempStorage(); if ( m_xStorage != null ) m_xEmbedObj = loadEmbedObject( aFileURI ); if ( m_xEmbedObj != null ) { try { m_xEmbedObj.setClientSite( this ); } catch( Exception ex ) { JOptionPane.showMessageDialog( m_aFrame, ex, "Exception in LoadObjectMenuItem:", JOptionPane.ERROR_MESSAGE ); } } } } generateNewImage(); repaint(); } else if ( m_pActionsList[ nInd ] == LINK_FROM_FILE ) { // first remove current object clearObjectAndStorage(); // open OpenFile dialog and load doc FileDialog aFileDialog = new FileDialog( m_aFrame, "Select sources to use for object init" ); aFileDialog.show(); if ( aFileDialog.getFile() != null ) { m_xStorage = createTempStorage(); String aFileName = aFileDialog.getDirectory() + aFileDialog.getFile(); File aFile = new File( aFileName ); if ( aFile != null ) { // create object from specified file String aFileURI = aFile.toURI().toASCIIString(); m_xEmbedObj = createLinkObject( aFileURI ); if ( m_xEmbedObj != null ) { m_aLinkURI = aFileURI; m_bLinkObj = true; try { m_xEmbedObj.setClientSite( this ); } catch( Exception ex ) { JOptionPane.showMessageDialog( m_aFrame, ex, "Exception in LinkObjectMenuItem:", JOptionPane.ERROR_MESSAGE ); } } } } generateNewImage(); repaint(); } else if ( m_pActionsList[ nInd ] == CONVERT_LINK_TO_OBJECT ) { if ( !m_bLinkObj ) { JOptionPane.showMessageDialog( m_aFrame, "The object is not a link!", "Error:", JOptionPane.ERROR_MESSAGE ); synchronized( m_oInHandlerLock ) { m_bInHandler = false; } return Any.VOID; } if ( m_xEmbedObj != null ) { if ( m_xStorage != null ) { try { XNameAccess xNameAccess = (XNameAccess)UnoRuntime.queryInterface( XNameAccess.class, m_xStorage ); if ( xNameAccess != null && xNameAccess.hasByName( "LinkName" ) ) m_xStorage.removeElement( "LinkName" ); XLinkageSupport xLinkage = (XLinkageSupport)UnoRuntime.queryInterface( XLinkageSupport.class, m_xEmbedObj ); if ( xLinkage != null ) { xLinkage.breakLink( m_xStorage, "EmbedSub" ); m_bLinkObj = false; m_aLinkURI = null; } else JOptionPane.showMessageDialog( m_aFrame, "No XLinkageSupport in ConvertLink... !", "Error:", JOptionPane.ERROR_MESSAGE ); } catch( Exception e1 ) { JOptionPane.showMessageDialog( m_aFrame, e1, "Exception in ConvertLinkToEmbed:try 1 :", JOptionPane.ERROR_MESSAGE ); } } } } else { System.out.println( "Unknoun action is requested: " + m_pActionsList[nInd] + "\n" ); } } m_nActionsNumber = 0; } synchronized( m_oInHandlerLock ) { m_bInHandler = false; } return Any.VOID; } public void actionRegister( byte nActionID ) { synchronized( m_oActionsNumberLock ) { if ( m_nActionsNumber < 199 && ( m_nActionsNumber == 0 || m_pActionsList[ m_nActionsNumber - 1 ] != DESTROY ) ) { m_pActionsList[ m_nActionsNumber++ ] = nActionID; } } } public void destroy() { // redirect the call through the timer and call super.destroy(); actionRegister( DESTROY ); for ( int i = 0; i < 3 && !m_bDestroyed; i++ ) { try { Thread.sleep( 200 ); } catch ( Exception e ) {} } if ( !m_bDestroyed ) System.out.println( "The object application can not exit correctly!" ); m_aTimer.stop(); super.destroy(); } public void update( Graphics g ) { paint( g ); } public void paint( Graphics g ) { super.paint( g ); if ( m_xEmbedObj != null ) { synchronized( m_oImageLock ) { if ( m_aImage != null ) g.drawImage( m_aImage, 0, 0, this ); } } } public void generateNewImage() { if ( m_xEmbedObj != null ) { try { int nOldState = m_xEmbedObj.getCurrentState(); int nState = nOldState; if ( nOldState == EmbedStates.EMBED_LOADED ) { m_xEmbedObj.changeState( EmbedStates.EMBED_RUNNING ); nState = EmbedStates.EMBED_RUNNING; } if ( nState == EmbedStates.EMBED_ACTIVE || nState == EmbedStates.EMBED_RUNNING ) { XComponentSupplier xCompProv = (XComponentSupplier)UnoRuntime.queryInterface( XComponentSupplier.class, m_xEmbedObj ); if ( xCompProv != null ) { XCloseable xCloseable = xCompProv.getComponent(); XTransferable xTransfer = (XTransferable)UnoRuntime.queryInterface( XTransferable.class, xCloseable ); if ( xTransfer != null ) { DataFlavor aFlavor = new DataFlavor(); aFlavor.MimeType = "image/png"; aFlavor.HumanPresentableName = "Portable Network Graphics"; aFlavor.DataType = new Type( byte[].class ); Object aAny = xTransfer.getTransferData( aFlavor ); if ( aAny != null && AnyConverter.isArray( aAny ) ) { byte[] aPNGData = (byte[])AnyConverter.toArray( aAny ); if ( aPNGData != null && aPNGData.length != 0 ) { synchronized( m_oImageLock ) { m_aImage = m_aToolkit.createImage( aPNGData ); } } } } else System.out.println( "paint() : can not get XTransferable for the component!\n" ); } else System.out.println( "paint() : XComponentSupplier is not implemented!\n" ); } } catch( com.sun.star.uno.Exception e ) { // dialogs should not be used in paint() System.out.println( "Exception in paint(): " + e ); } } } public void mouseClicked( MouseEvent e ) { if( e.getModifiers() == InputEvent.BUTTON1_MASK ) { actionRegister( MOUSE_CLICKED ); } } public void mousePressed( MouseEvent e ){}; public void mouseEntered( MouseEvent e ){}; public void mouseExited( MouseEvent e ){}; public void mouseReleased( MouseEvent e ){}; // XEmbeddedClient public void saveObject() throws com.sun.star.uno.Exception { if ( m_xEmbedObj != null ) { try { XEmbedPersist xPersist = (XEmbedPersist)UnoRuntime.queryInterface( XEmbedPersist.class, m_xEmbedObj ); if ( xPersist != null ) { xPersist.storeOwn(); generateNewImage(); } else JOptionPane.showMessageDialog( m_aFrame, "No XEmbedPersist!", "Error:", JOptionPane.ERROR_MESSAGE ); } catch( Exception e ) { JOptionPane.showMessageDialog( m_aFrame, e, "Exception in saveObject:", JOptionPane.ERROR_MESSAGE ); } } generateNewImage(); repaint(); } public void onShowWindow( boolean bVisible ) { // for now nothing to do } // classes class NewMenuItem extends MenuItem implements ActionListener // Menu New { public NewMenuItem() { super( "New", new MenuShortcut( KeyEvent.VK_A )); addActionListener( this ); } public void actionPerformed( ActionEvent e ) { actionRegister( NEW_DOCUMENT ); } } class SaveAsMenuItem extends MenuItem implements ActionListener // Menu SaveAs... { public SaveAsMenuItem() { super( "SaveAs..." ); addActionListener( this ); } public void actionPerformed( ActionEvent e ) { actionRegister( SAVE_AS ); } } class OpenFileMenuItem extends MenuItem implements ActionListener // Menu Open { public OpenFileMenuItem() { super( "Open", new MenuShortcut( KeyEvent.VK_C )); addActionListener( this ); } public void actionPerformed( ActionEvent e ) { actionRegister( OPEN_FILE ); } } class SaveMenuItem extends MenuItem implements ActionListener // Menu Save { public SaveMenuItem() { super( "Save", new MenuShortcut( KeyEvent.VK_D )); addActionListener( this ); } public void actionPerformed( ActionEvent e ) { actionRegister( SAVE ); } } class NewObjectMenuItem extends MenuItem implements ActionListener // Menu NewObject { public NewObjectMenuItem() { super( "Create", new MenuShortcut( KeyEvent.VK_N )); addActionListener( this ); } public void actionPerformed( ActionEvent e ) { actionRegister( NEW_OBJECT ); } } class LoadObjectMenuItem extends MenuItem implements ActionListener // Menu LoadObject { public LoadObjectMenuItem() { super( "Load from file", new MenuShortcut( KeyEvent.VK_L )); addActionListener( this ); } public void actionPerformed( ActionEvent e ) { actionRegister( OBJECT_FROM_FILE ); } } class LinkObjectMenuItem extends MenuItem implements ActionListener // Menu LinkObject { public LinkObjectMenuItem() { super( "Create link", new MenuShortcut( KeyEvent.VK_M )); addActionListener( this ); } public void actionPerformed( ActionEvent e ) { actionRegister( LINK_FROM_FILE ); } } class ConvertLinkToEmbedMenuItem extends MenuItem implements ActionListener // Menu LinkObject { public ConvertLinkToEmbedMenuItem() { super( "Convert link to embed", new MenuShortcut( KeyEvent.VK_M )); addActionListener( this ); } public void actionPerformed( ActionEvent e ) { actionRegister( CONVERT_LINK_TO_OBJECT ); } } // Helper methods public XEmbeddedObject createEmbedObject( String aServiceName ) { XEmbeddedObject xEmbObj = null; byte[] pClassID = new byte[16]; if ( aServiceName.equals( "com.sun.star.comp.Writer.TextDocument" ) ) { int[] pTempClassID = { 0x8B, 0xC6, 0xB1, 0x65, 0xB1, 0xB2, 0x4E, 0xDD, 0xAA, 0x47, 0xDA, 0xE2, 0xEE, 0x68, 0x9D, 0xD6 }; for ( int ind = 0; ind < 16; ind++ ) pClassID[ind] = (byte)pTempClassID[ind]; } else if ( aServiceName.equals( "com.sun.star.comp.Writer.GlobalDocument" ) ) { int[] pTempClassID = { 0xB2, 0x1A, 0x0A, 0x7C, 0xE4, 0x03, 0x41, 0xFE, 0x95, 0x62, 0xBD, 0x13, 0xEA, 0x6F, 0x15, 0xA0 }; for ( int ind = 0; ind < 16; ind++ ) pClassID[ind] = (byte)pTempClassID[ind]; } else if ( aServiceName.equals( "com.sun.star.comp.Writer.WebDocument" ) ) { int[] pTempClassID = { 0xA8, 0xBB, 0xA6, 0x0C, 0x7C, 0x60, 0x45, 0x50, 0x91, 0xCE, 0x39, 0xC3, 0x90, 0x3F, 0xAC, 0x5E }; for ( int ind = 0; ind < 16; ind++ ) pClassID[ind] = (byte)pTempClassID[ind]; } else if ( aServiceName.equals( "com.sun.star.comp.Calc.SpreadsheetDocument" ) ) { int[] pTempClassID = { 0x47, 0xBB, 0xB4, 0xCB, 0xCE, 0x4C, 0x4E, 0x80, 0xA5, 0x91, 0x42, 0xD9, 0xAE, 0x74, 0x95, 0x0F }; for ( int ind = 0; ind < 16; ind++ ) pClassID[ind] = (byte)pTempClassID[ind]; } else if ( aServiceName.equals( "com.sun.star.comp.Draw.PresentationDocument" ) ) { int[] pTempClassID = { 0x91, 0x76, 0xE4, 0x8A, 0x63, 0x7A, 0x4D, 0x1F, 0x80, 0x3B, 0x99, 0xD9, 0xBF, 0xAC, 0x10, 0x47 }; for ( int ind = 0; ind < 16; ind++ ) pClassID[ind] = (byte)pTempClassID[ind]; } else if ( aServiceName.equals( "com.sun.star.comp.Draw.DrawingDocument" ) ) { int[] pTempClassID = { 0x4B, 0xAB, 0x89, 0x70, 0x8A, 0x3B, 0x45, 0xB3, 0x99, 0x1C, 0xCB, 0xEE, 0xAC, 0x6B, 0xD5, 0xE3 }; for ( int ind = 0; ind < 16; ind++ ) pClassID[ind] = (byte)pTempClassID[ind]; } else if ( aServiceName.equals( "com.sun.star.comp.Math.FormulaDocument" ) ) { int[] pTempClassID = { 0x07, 0x8B, 0x7A, 0xBA, 0x54, 0xFC, 0x45, 0x7F, 0x85, 0x51, 0x61, 0x47, 0xE7, 0x76, 0xA9, 0x97 }; for ( int ind = 0; ind < 16; ind++ ) pClassID[ind] = (byte)pTempClassID[ind]; } else if ( aServiceName.equals( "BitmapImage" ) ) { int[] pTempClassID = { 0xD3, 0xE3, 0x4B, 0x21, 0x9D, 0x75, 0x10, 0x1A, 0x8C, 0x3D, 0x00, 0xAA, 0x00, 0x1A, 0x16, 0x52 }; for ( int ind = 0; ind < 16; ind++ ) pClassID[ind] = (byte)pTempClassID[ind]; } if ( pClassID != null ) { // create embedded object based on the class ID try { Object oEmbedFactory = m_xServiceFactory.createInstance( "com.sun.star.embed.EmbeddedObjectFactory" ); XEmbedObjectFactory xEmbedFactory = (XEmbedObjectFactory)UnoRuntime.queryInterface( XEmbedObjectFactory.class, oEmbedFactory ); if ( xEmbedFactory != null ) { Object oEmbObj = xEmbedFactory.createInstanceInitNew( pClassID, "Dummy name", m_xStorage, "EmbedSub" ); xEmbObj = (XEmbeddedObject)UnoRuntime.queryInterface( XEmbeddedObject.class, oEmbObj ); } else JOptionPane.showMessageDialog( m_aFrame, "Can't create EmbedFactory!", "Error:", JOptionPane.ERROR_MESSAGE ); } catch( Exception e ) { JOptionPane.showMessageDialog( m_aFrame, e, "Exception in createInstanceInitNew():", JOptionPane.ERROR_MESSAGE ); } } else JOptionPane.showMessageDialog( m_aFrame, "Can't retrieve class ID!", "Error:", JOptionPane.ERROR_MESSAGE ); return xEmbObj; } public XEmbeddedObject createLinkObject( String aLinkURL ) { XEmbeddedObject xEmbObj = null; try { Object oEmbedFactory = m_xServiceFactory.createInstance( "com.sun.star.embed.EmbeddedObjectFactory" ); XEmbedObjectFactory xEmbedFactory = (XEmbedObjectFactory)UnoRuntime.queryInterface( XEmbedObjectFactory.class, oEmbedFactory ); if ( xEmbedFactory != null ) { Object oEmbObj = xEmbedFactory.createInstanceLink( aLinkURL ); xEmbObj = (XEmbeddedObject)UnoRuntime.queryInterface( XEmbeddedObject.class, oEmbObj ); } else JOptionPane.showMessageDialog( m_aFrame, "Can't create EmbedFactory!", "Error:", JOptionPane.ERROR_MESSAGE ); } catch( Exception e ) { JOptionPane.showMessageDialog( m_aFrame, e, "Exception in createLinkObject():", JOptionPane.ERROR_MESSAGE ); } return xEmbObj; } public XEmbeddedObject loadEmbedObject( String aFileURI ) { XEmbeddedObject xEmbObj = null; try { Object oEmbedFactory = m_xServiceFactory.createInstance( "com.sun.star.embed.EmbeddedObjectFactory" ); XEmbedObjectFactory xEmbedFactory = (XEmbedObjectFactory)UnoRuntime.queryInterface( XEmbedObjectFactory.class, oEmbedFactory ); if ( xEmbedFactory != null ) { PropertyValue[] aMedDescr = { new PropertyValue(), new PropertyValue() }; aMedDescr[0].Name = "URL"; aMedDescr[0].Value = (Object) aFileURI; aMedDescr[1].Name = "ReadOnly"; aMedDescr[1].Value = (Object) new Boolean( false ); Object oEmbObj = xEmbedFactory.createInstanceInitFromMediaDescriptor( m_xStorage, "EmbedSub", aMedDescr ); xEmbObj = (XEmbeddedObject)UnoRuntime.queryInterface( XEmbeddedObject.class, oEmbObj ); } else JOptionPane.showMessageDialog( m_aFrame, "Can't create EmbedFactory!", "Error:", JOptionPane.ERROR_MESSAGE ); } catch( Exception e ) { JOptionPane.showMessageDialog( m_aFrame, e, "Exception in loadEmbedObject():", JOptionPane.ERROR_MESSAGE ); } return xEmbObj; } public void clearObjectAndStorage() { synchronized( m_oImageLock ) { m_aImage = null; } m_bOwnFile = false; m_aLinkURI = null; m_bLinkObj = false; if ( m_xEmbedObj != null ) { try { XComponent xComponent = (XComponent)UnoRuntime.queryInterface( XComponent.class, m_xEmbedObj ); if ( xComponent != null ) xComponent.dispose(); } catch ( Exception ex ) {} m_xEmbedObj = null; } if ( m_xStorage != null ) { try { XComponent xComponent = (XComponent)UnoRuntime.queryInterface( XComponent.class, m_xStorage ); if ( xComponent != null ) xComponent.dispose(); } catch ( Exception ex ) {} m_xStorage = null; } } public XStorage createTempStorage() { XStorage xTempStorage = null; try { Object oStorageFactory = m_xServiceFactory.createInstance( "com.sun.star.embed.StorageFactory" ); XSingleServiceFactory xStorageFactory = (XSingleServiceFactory)UnoRuntime.queryInterface( XSingleServiceFactory.class, oStorageFactory ); if ( xStorageFactory != null ) { Object oStorage = xStorageFactory.createInstance(); xTempStorage = (XStorage)UnoRuntime.queryInterface( XStorage.class, oStorage ); } else JOptionPane.showMessageDialog( m_aFrame, "Can't create StorageFactory!", "Error:", JOptionPane.ERROR_MESSAGE ); } catch( Exception e ) { JOptionPane.showMessageDialog( m_aFrame, e, "Exception in createTempStorage():", JOptionPane.ERROR_MESSAGE ); } return xTempStorage; } public void saveStorageAsFileURI( String aFileURI ) { try { Object oStorageFactory = m_xServiceFactory.createInstance( "com.sun.star.embed.StorageFactory" ); XSingleServiceFactory xStorageFactory = (XSingleServiceFactory)UnoRuntime.queryInterface( XSingleServiceFactory.class, oStorageFactory ); if ( xStorageFactory != null ) { Object aArgs[] = new Object[2]; aArgs[0] = aFileURI; aArgs[1] = new Integer( ElementModes.ELEMENT_READWRITE ); Object oStorage = xStorageFactory.createInstanceWithArguments( aArgs ); XStorage xTargetStorage = (XStorage)UnoRuntime.queryInterface( XStorage.class, oStorage ); m_xStorage.copyToStorage( xTargetStorage ); XComponent xComponent = (XComponent)UnoRuntime.queryInterface( XComponent.class, m_xStorage ); xComponent.dispose(); m_xStorage = xTargetStorage; m_bOwnFile = true; } else JOptionPane.showMessageDialog( m_aFrame, "Can't create StorageFactory!", "Error:", JOptionPane.ERROR_MESSAGE ); } catch( Exception e ) { JOptionPane.showMessageDialog( m_aFrame, e, "Exception in saveStorageToFileURI():", JOptionPane.ERROR_MESSAGE ); } } public void loadFileURI( String aFileURI ) { try { Object oStorageFactory = m_xServiceFactory.createInstance( "com.sun.star.embed.StorageFactory" ); XSingleServiceFactory xStorageFactory = (XSingleServiceFactory)UnoRuntime.queryInterface( XSingleServiceFactory.class, oStorageFactory ); Object aArgs[] = new Object[2]; aArgs[0] = aFileURI; aArgs[1] = new Integer( ElementModes.ELEMENT_READWRITE ); Object oStorage = xStorageFactory.createInstanceWithArguments( aArgs ); XStorage xTargetStorage = (XStorage)UnoRuntime.queryInterface( XStorage.class, oStorage ); Object oEmbedFactory = m_xServiceFactory.createInstance( "com.sun.star.embed.EmbeddedObjectFactory" ); XEmbedObjectFactory xEmbedFactory = (XEmbedObjectFactory)UnoRuntime.queryInterface( XEmbedObjectFactory.class, oEmbedFactory ); XNameAccess xNameAccess = (XNameAccess)UnoRuntime.queryInterface( XNameAccess.class, xTargetStorage ); if ( xNameAccess == null ) { JOptionPane.showMessageDialog( m_aFrame, "No XNameAccess!", "Error:", JOptionPane.ERROR_MESSAGE ); return; } Object oEmbObj = null; if ( xNameAccess.hasByName( "LinkName" ) && xTargetStorage.isStreamElement( "LinkName" ) ) { XStream xLinkStream = xTargetStorage.openStreamElement( "LinkName", ElementModes.ELEMENT_READ ); if ( xLinkStream != null ) { XInputStream xInStream = xLinkStream.getInputStream(); if ( xInStream != null ) { byte[][] pBuff = new byte[1][0]; int nRead = xInStream.readBytes( pBuff, 1000 ); m_aLinkURI = new String( pBuff[0] ); xInStream.closeInput(); oEmbObj = xEmbedFactory.createInstanceLink( m_aLinkURI ); m_bLinkObj = true; } } } else oEmbObj = xEmbedFactory.createInstanceInitFromEntry( xTargetStorage, "EmbedSub", false ); m_xEmbedObj = (XEmbeddedObject)UnoRuntime.queryInterface( XEmbeddedObject.class, oEmbObj ); if ( m_xEmbedObj != null ) { m_xStorage = xTargetStorage; m_bOwnFile = true; } else JOptionPane.showMessageDialog( m_aFrame, "Can't create EmbedObject from storage!", "Error:", JOptionPane.ERROR_MESSAGE ); } catch( Exception e ) { JOptionPane.showMessageDialog( m_aFrame, e, "Exception in loadFileURI():", JOptionPane.ERROR_MESSAGE ); } } public void storeLinkToStorage() { if ( m_xStorage != null && m_bLinkObj ) { try { XStream xLinkStream = m_xStorage.openStreamElement( "LinkName", ElementModes.ELEMENT_WRITE ); if ( xLinkStream != null ) { XOutputStream xLinkOutStream = xLinkStream.getOutputStream(); XTruncate xTruncate = (XTruncate) UnoRuntime.queryInterface( XTruncate.class, xLinkOutStream ); if ( xLinkOutStream != null && xTruncate != null ) { xTruncate.truncate(); char[] aLinkChar = m_aLinkURI.toCharArray(); byte[] aLinkBytes = new byte[ aLinkChar.length ]; for ( int ind = 0; ind < aLinkChar.length; ind++ ) aLinkBytes[ind] = (byte)aLinkChar[ind]; xLinkOutStream.writeBytes( aLinkBytes ); xLinkOutStream.closeOutput(); XComponent xComponent = (XComponent) UnoRuntime.queryInterface( XComponent.class, xLinkStream ); if ( xComponent != null ) xComponent.dispose(); } else JOptionPane.showMessageDialog( m_aFrame, "The substream can not be truncated or written!", "Error:", JOptionPane.ERROR_MESSAGE ); } else JOptionPane.showMessageDialog( m_aFrame, "Can't create/open substream!", "Error:", JOptionPane.ERROR_MESSAGE ); } catch( Exception e ) { JOptionPane.showMessageDialog( m_aFrame, e, "Exception in storeLinkToStorage:", JOptionPane.ERROR_MESSAGE ); } } } }