/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * 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 . */ #include "comphelper/documentinfo.hxx" #include "comphelper/namedvaluecollection.hxx" #include #include #include #include #include #include #include #include #include //........................................................................ 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 XDocumentProperties 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_FAIL( sMessage.getStr() ); } return sTitle; } //........................................................................ } // namespace comphelper //........................................................................ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */