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