/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/

package embeddedobj.test;

import java.awt.*;
import java.awt.event.*;

import com.sun.star.comp.servicemanager.ServiceManager;

import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.connection.XConnector;
import com.sun.star.connection.XConnection;

import com.sun.star.bridge.XUnoUrlResolver;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XInterface;
import com.sun.star.uno.XNamingService;
import com.sun.star.uno.XComponentContext;

import com.sun.star.container.*;
import com.sun.star.beans.*;
import com.sun.star.lang.*;


public class EmbedContFrame extends Frame 
{
	private EmbedContApp m_aApp;

	WindowListener m_aCloser = new WindowAdapter()
	{
		public void windowClosing( WindowEvent e )
		{
			if ( m_aApp != null )
			{
				m_aApp.disposeObject();
				m_aApp = null;
			}

			dispose();
			System.exit( 0 );
		}
	};

	public EmbedContFrame( String sName ) 
	{
		super( sName );
		addWindowListener( m_aCloser );
	}

	public static void start()
	{
		EmbedContFrame aFrame = new EmbedContFrame( "Testing container." );

		// connect to the office
		XMultiServiceFactory aServiceFactory = null;
		try {
			aServiceFactory = connectOfficeGetServiceFactory();
		}
		catch( Exception e )
		{}

		if ( aServiceFactory == null )
		{
			System.out.println( "Can't get service manager!\n" );
			System.exit( 1 );
		}

		aFrame.m_aApp = new EmbedContApp( aFrame, aServiceFactory );
		aFrame.m_aApp.init();
		aFrame.m_aApp.start();

		Dimension aSize = aFrame.m_aApp.getSize();

		aFrame.add( "Center", aFrame.m_aApp );
		aFrame.pack();
		aFrame.setSize( aSize );

		aFrame.setVisible( true );
	}

	public static void main( String args[] )
	{
		EmbedContFrame.start();
	}

	public static XMultiServiceFactory connectOfficeGetServiceFactory()
    throws com.sun.star.uno.Exception,
    com.sun.star.uno.RuntimeException,
	Exception
	{
        String sConnectionString = "uno:socket,host=localhost,port=8100;urp;StarOffice.NamingService";

	    // Get component context
        XComponentContext xComponentContext =
        	com.sun.star.comp.helper.Bootstrap.createInitialComponentContext( null );
        
        // initial serviceManager
        XMultiComponentFactory xLocalServiceManager = xComponentContext.getServiceManager();
                
        // create a connector, so that it can contact the office
        Object  oUrlResolver  = xLocalServiceManager.createInstanceWithContext( "com.sun.star.bridge.UnoUrlResolver",
																				xComponentContext );
        XUnoUrlResolver xUrlResolver = (XUnoUrlResolver)UnoRuntime.queryInterface( XUnoUrlResolver.class, oUrlResolver );
        
        Object oInitialObject = xUrlResolver.resolve( sConnectionString );
        XNamingService xName = (XNamingService)UnoRuntime.queryInterface( XNamingService.class, oInitialObject );
        
        XMultiServiceFactory xMSF = null;
        if( xName != null ) {
            Object oMSF = xName.getRegisteredObject( "StarOffice.ServiceManager" );
            xMSF = (XMultiServiceFactory)UnoRuntime.queryInterface( XMultiServiceFactory.class, oMSF );
        }
		else
			System.out.println( "Error: Can't get XNamingService interface from url resolver!" );
        
        return xMSF;
	}
}  

