/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_comphelper.hxx"

#include "comphelper/documentinfo.hxx"
#include "comphelper/namedvaluecollection.hxx"

/** === begin UNO includes === **/
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
#include <com/sun/star/document/XDocumentProperties.hpp>
#include <com/sun/star/frame/XStorable.hpp>
#include <com/sun/star/frame/XTitle.hpp>
/** === end UNO includes === **/

#include <cppuhelper/exc_hlp.hxx>

#include <osl/diagnose.h>
#include <osl/thread.h>

#include <boost/current_function.hpp>

//........................................................................
namespace comphelper {
//........................................................................

	/** === begin UNO using === **/
	using ::com::sun::star::uno::Reference;
	using ::com::sun::star::uno::UNO_QUERY;
	using ::com::sun::star::uno::UNO_QUERY_THROW;
	using ::com::sun::star::uno::Exception;
	using ::com::sun::star::uno::RuntimeException;
    using ::com::sun::star::frame::XModel;
	using ::com::sun::star::frame::XTitle;
    using ::com::sun::star::frame::XController;
    using ::com::sun::star::beans::XPropertySet;
    using ::com::sun::star::document::XDocumentPropertiesSupplier;
    using ::com::sun::star::document::XDocumentProperties;
    using ::com::sun::star::frame::XStorable;
    using ::com::sun::star::beans::XPropertySetInfo;
    using ::com::sun::star::frame::XTitle;
    using ::com::sun::star::uno::XInterface;
    using ::com::sun::star::frame::XFrame;
	/** === end UNO using === **/

	//====================================================================
	//= helper
	//====================================================================
    namespace
    {
        ::rtl::OUString lcl_getTitle( const Reference< XInterface >& _rxComponent )
        {
            Reference< XTitle > xTitle( _rxComponent, UNO_QUERY );
            if ( xTitle.is() )
                return xTitle->getTitle();
            return ::rtl::OUString();
        }
    }

    //====================================================================
	//= DocumentInfo
	//====================================================================
	//--------------------------------------------------------------------
    ::rtl::OUString DocumentInfo::getDocumentTitle( const Reference< XModel >& _rxDocument )
    {
        ::rtl::OUString sTitle;

	    if ( !_rxDocument.is() )
            return sTitle;

        ::rtl::OUString sDocURL;
	    try
	    {
            // 1. ask the model and the controller for their XTitle::getTitle
            sTitle = lcl_getTitle( _rxDocument );
            if ( !sTitle.isEmpty() )
                return sTitle;

            Reference< XController > xController( _rxDocument->getCurrentController() );
            sTitle = lcl_getTitle( xController );
            if ( !sTitle.isEmpty() )
                return sTitle;

            // work around a problem with embedded objects, which sometimes return
            // private:object as URL
            sDocURL = _rxDocument->getURL();
            if ( sDocURL.matchAsciiL( "private:", 8 ) )
                sDocURL = ::rtl::OUString();

            // 2. if the document is not saved, yet, check the frame title
            if ( sDocURL.isEmpty() )
            {
                Reference< XFrame > xFrame;
                if ( xController.is() )
                    xFrame.set( xController->getFrame() );
                sTitle = lcl_getTitle( xFrame );
                if ( !sTitle.isEmpty() )
                    return sTitle;
            }

            // 3. try the UNO DocumentInfo
			Reference< XDocumentPropertiesSupplier > xDPS( _rxDocument, UNO_QUERY );
			if ( xDPS.is() )
			{
                Reference< XDocumentProperties > xDocProps (
                    xDPS->getDocumentProperties(), UNO_QUERY_THROW );
                OSL_ENSURE(xDocProps.is(), "no DocumentProperties");
                sTitle = xDocProps->getTitle();
                if ( !sTitle.isEmpty() )
                    return sTitle;
			}

            // 4. try model arguments
            NamedValueCollection aModelArgs( _rxDocument->getArgs() );
            sTitle = aModelArgs.getOrDefault( "Title", sTitle );
            if ( !sTitle.isEmpty() )
                return sTitle;

            // 5. try the last segment of the document URL
            // this formerly was an INetURLObject::getName( LAST_SEGMENT, true, DECODE_WITH_CHARSET ),
            // but since we moved this code to comphelper, we do not have access to an INetURLObject anymore
            // This heuristics here should be sufficient - finally, we will get an UNO title API in a not
            // too distant future (hopefully), then  this complete class is superfluous)
            if ( sDocURL.isEmpty() )
            {
                Reference< XStorable > xDocStorable( _rxDocument, UNO_QUERY_THROW );
                sDocURL = xDocStorable->getLocation();
            }
            sal_Int32 nLastSepPos = sDocURL.lastIndexOf( '/' );
            if ( ( nLastSepPos != -1 ) && ( nLastSepPos == sDocURL.getLength() - 1 ) )
            {
                sDocURL = sDocURL.copy( 0, nLastSepPos );
                nLastSepPos = sDocURL.lastIndexOf( '/' );
            }
            sTitle = sDocURL.copy( nLastSepPos + 1 );

			if ( !sTitle.isEmpty() )
                return sTitle;

			// 5.
			// <-- #i88104# (05-16-08) TKR: use the new XTitle Interface to get the Title -->
				
		    Reference< XTitle > xTitle( _rxDocument, UNO_QUERY );
			if ( xTitle.is() )
			{
				if ( !xTitle->getTitle().isEmpty() )
					return xTitle->getTitle();
			}
	    }
	    catch ( const Exception& )
	    {
            ::com::sun::star::uno::Any caught( ::cppu::getCaughtException() );
	        ::rtl::OString sMessage( "caught an exception!" );
	        sMessage += "\ntype   : ";
	        sMessage += ::rtl::OString( caught.getValueTypeName().getStr(), caught.getValueTypeName().getLength(), osl_getThreadTextEncoding() );
	        sMessage += "\nmessage: ";
            ::com::sun::star::uno::Exception exception;
            caught >>= exception;
	        sMessage += ::rtl::OString( exception.Message.getStr(), exception.Message.getLength(), osl_getThreadTextEncoding() );
            sMessage += "\nin function:\n";
            sMessage += BOOST_CURRENT_FUNCTION;
            sMessage += "\n";
	        OSL_ENSURE( false, sMessage );
	    }

        return sTitle;
    }

//........................................................................
} // namespace comphelper
//........................................................................
