1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_comphelper.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include "comphelper/documentinfo.hxx" 32*cdf0e10cSrcweir #include "comphelper/namedvaluecollection.hxx" 33*cdf0e10cSrcweir 34*cdf0e10cSrcweir /** === begin UNO includes === **/ 35*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 36*cdf0e10cSrcweir #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp> 37*cdf0e10cSrcweir #include <com/sun/star/document/XDocumentProperties.hpp> 38*cdf0e10cSrcweir #include <com/sun/star/frame/XStorable.hpp> 39*cdf0e10cSrcweir #include <com/sun/star/frame/XTitle.hpp> 40*cdf0e10cSrcweir /** === end UNO includes === **/ 41*cdf0e10cSrcweir 42*cdf0e10cSrcweir #include <cppuhelper/exc_hlp.hxx> 43*cdf0e10cSrcweir 44*cdf0e10cSrcweir #include <osl/diagnose.h> 45*cdf0e10cSrcweir #include <osl/thread.h> 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir #include <boost/current_function.hpp> 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir //........................................................................ 50*cdf0e10cSrcweir namespace comphelper { 51*cdf0e10cSrcweir //........................................................................ 52*cdf0e10cSrcweir 53*cdf0e10cSrcweir /** === begin UNO using === **/ 54*cdf0e10cSrcweir using ::com::sun::star::uno::Reference; 55*cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY; 56*cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY_THROW; 57*cdf0e10cSrcweir using ::com::sun::star::uno::Exception; 58*cdf0e10cSrcweir using ::com::sun::star::uno::RuntimeException; 59*cdf0e10cSrcweir using ::com::sun::star::frame::XModel; 60*cdf0e10cSrcweir using ::com::sun::star::frame::XTitle; 61*cdf0e10cSrcweir using ::com::sun::star::frame::XController; 62*cdf0e10cSrcweir using ::com::sun::star::beans::XPropertySet; 63*cdf0e10cSrcweir using ::com::sun::star::document::XDocumentPropertiesSupplier; 64*cdf0e10cSrcweir using ::com::sun::star::document::XDocumentProperties; 65*cdf0e10cSrcweir using ::com::sun::star::frame::XStorable; 66*cdf0e10cSrcweir using ::com::sun::star::beans::XPropertySetInfo; 67*cdf0e10cSrcweir using ::com::sun::star::frame::XTitle; 68*cdf0e10cSrcweir using ::com::sun::star::uno::XInterface; 69*cdf0e10cSrcweir using ::com::sun::star::frame::XFrame; 70*cdf0e10cSrcweir /** === end UNO using === **/ 71*cdf0e10cSrcweir 72*cdf0e10cSrcweir //==================================================================== 73*cdf0e10cSrcweir //= helper 74*cdf0e10cSrcweir //==================================================================== 75*cdf0e10cSrcweir namespace 76*cdf0e10cSrcweir { 77*cdf0e10cSrcweir ::rtl::OUString lcl_getTitle( const Reference< XInterface >& _rxComponent ) 78*cdf0e10cSrcweir { 79*cdf0e10cSrcweir Reference< XTitle > xTitle( _rxComponent, UNO_QUERY ); 80*cdf0e10cSrcweir if ( xTitle.is() ) 81*cdf0e10cSrcweir return xTitle->getTitle(); 82*cdf0e10cSrcweir return ::rtl::OUString(); 83*cdf0e10cSrcweir } 84*cdf0e10cSrcweir } 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir //==================================================================== 87*cdf0e10cSrcweir //= DocumentInfo 88*cdf0e10cSrcweir //==================================================================== 89*cdf0e10cSrcweir //-------------------------------------------------------------------- 90*cdf0e10cSrcweir ::rtl::OUString DocumentInfo::getDocumentTitle( const Reference< XModel >& _rxDocument ) 91*cdf0e10cSrcweir { 92*cdf0e10cSrcweir ::rtl::OUString sTitle; 93*cdf0e10cSrcweir 94*cdf0e10cSrcweir if ( !_rxDocument.is() ) 95*cdf0e10cSrcweir return sTitle; 96*cdf0e10cSrcweir 97*cdf0e10cSrcweir ::rtl::OUString sDocURL; 98*cdf0e10cSrcweir try 99*cdf0e10cSrcweir { 100*cdf0e10cSrcweir // 1. ask the model and the controller for their XTitle::getTitle 101*cdf0e10cSrcweir sTitle = lcl_getTitle( _rxDocument ); 102*cdf0e10cSrcweir if ( sTitle.getLength() ) 103*cdf0e10cSrcweir return sTitle; 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir Reference< XController > xController( _rxDocument->getCurrentController() ); 106*cdf0e10cSrcweir sTitle = lcl_getTitle( xController ); 107*cdf0e10cSrcweir if ( sTitle.getLength() ) 108*cdf0e10cSrcweir return sTitle; 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir // work around a problem with embedded objects, which sometimes return 111*cdf0e10cSrcweir // private:object as URL 112*cdf0e10cSrcweir sDocURL = _rxDocument->getURL(); 113*cdf0e10cSrcweir if ( sDocURL.matchAsciiL( "private:", 8 ) ) 114*cdf0e10cSrcweir sDocURL = ::rtl::OUString(); 115*cdf0e10cSrcweir 116*cdf0e10cSrcweir // 2. if the document is not saved, yet, check the frame title 117*cdf0e10cSrcweir if ( sDocURL.getLength() == 0 ) 118*cdf0e10cSrcweir { 119*cdf0e10cSrcweir Reference< XFrame > xFrame; 120*cdf0e10cSrcweir if ( xController.is() ) 121*cdf0e10cSrcweir xFrame.set( xController->getFrame() ); 122*cdf0e10cSrcweir sTitle = lcl_getTitle( xFrame ); 123*cdf0e10cSrcweir if ( sTitle.getLength() ) 124*cdf0e10cSrcweir return sTitle; 125*cdf0e10cSrcweir } 126*cdf0e10cSrcweir 127*cdf0e10cSrcweir // 3. try the UNO DocumentInfo 128*cdf0e10cSrcweir Reference< XDocumentPropertiesSupplier > xDPS( _rxDocument, UNO_QUERY ); 129*cdf0e10cSrcweir if ( xDPS.is() ) 130*cdf0e10cSrcweir { 131*cdf0e10cSrcweir Reference< XDocumentProperties > xDocProps ( 132*cdf0e10cSrcweir xDPS->getDocumentProperties(), UNO_QUERY_THROW ); 133*cdf0e10cSrcweir OSL_ENSURE(xDocProps.is(), "no DocumentProperties"); 134*cdf0e10cSrcweir sTitle = xDocProps->getTitle(); 135*cdf0e10cSrcweir if ( sTitle.getLength() ) 136*cdf0e10cSrcweir return sTitle; 137*cdf0e10cSrcweir } 138*cdf0e10cSrcweir 139*cdf0e10cSrcweir // 4. try model arguments 140*cdf0e10cSrcweir NamedValueCollection aModelArgs( _rxDocument->getArgs() ); 141*cdf0e10cSrcweir sTitle = aModelArgs.getOrDefault( "Title", sTitle ); 142*cdf0e10cSrcweir if ( sTitle.getLength() ) 143*cdf0e10cSrcweir return sTitle; 144*cdf0e10cSrcweir 145*cdf0e10cSrcweir // 5. try the last segment of the document URL 146*cdf0e10cSrcweir // this formerly was an INetURLObject::getName( LAST_SEGMENT, true, DECODE_WITH_CHARSET ), 147*cdf0e10cSrcweir // but since we moved this code to comphelper, we do not have access to an INetURLObject anymore 148*cdf0e10cSrcweir // This heuristics here should be sufficient - finally, we will get an UNO title API in a not 149*cdf0e10cSrcweir // too distant future (hopefully), then this complete class is superfluous) 150*cdf0e10cSrcweir if ( sDocURL.getLength() == 0 ) 151*cdf0e10cSrcweir { 152*cdf0e10cSrcweir Reference< XStorable > xDocStorable( _rxDocument, UNO_QUERY_THROW ); 153*cdf0e10cSrcweir sDocURL = xDocStorable->getLocation(); 154*cdf0e10cSrcweir } 155*cdf0e10cSrcweir sal_Int32 nLastSepPos = sDocURL.lastIndexOf( '/' ); 156*cdf0e10cSrcweir if ( ( nLastSepPos != -1 ) && ( nLastSepPos == sDocURL.getLength() - 1 ) ) 157*cdf0e10cSrcweir { 158*cdf0e10cSrcweir sDocURL = sDocURL.copy( 0, nLastSepPos ); 159*cdf0e10cSrcweir nLastSepPos = sDocURL.lastIndexOf( '/' ); 160*cdf0e10cSrcweir } 161*cdf0e10cSrcweir sTitle = sDocURL.copy( nLastSepPos + 1 ); 162*cdf0e10cSrcweir 163*cdf0e10cSrcweir if ( sTitle.getLength() != 0 ) 164*cdf0e10cSrcweir return sTitle; 165*cdf0e10cSrcweir 166*cdf0e10cSrcweir // 5. 167*cdf0e10cSrcweir // <-- #i88104# (05-16-08) TKR: use the new XTitle Interface to get the Title --> 168*cdf0e10cSrcweir 169*cdf0e10cSrcweir Reference< XTitle > xTitle( _rxDocument, UNO_QUERY ); 170*cdf0e10cSrcweir if ( xTitle.is() ) 171*cdf0e10cSrcweir { 172*cdf0e10cSrcweir if ( xTitle->getTitle().getLength() != 0 ) 173*cdf0e10cSrcweir return xTitle->getTitle(); 174*cdf0e10cSrcweir } 175*cdf0e10cSrcweir } 176*cdf0e10cSrcweir catch ( const Exception& ) 177*cdf0e10cSrcweir { 178*cdf0e10cSrcweir ::com::sun::star::uno::Any caught( ::cppu::getCaughtException() ); 179*cdf0e10cSrcweir ::rtl::OString sMessage( "caught an exception!" ); 180*cdf0e10cSrcweir sMessage += "\ntype : "; 181*cdf0e10cSrcweir sMessage += ::rtl::OString( caught.getValueTypeName().getStr(), caught.getValueTypeName().getLength(), osl_getThreadTextEncoding() ); 182*cdf0e10cSrcweir sMessage += "\nmessage: "; 183*cdf0e10cSrcweir ::com::sun::star::uno::Exception exception; 184*cdf0e10cSrcweir caught >>= exception; 185*cdf0e10cSrcweir sMessage += ::rtl::OString( exception.Message.getStr(), exception.Message.getLength(), osl_getThreadTextEncoding() ); 186*cdf0e10cSrcweir sMessage += "\nin function:\n"; 187*cdf0e10cSrcweir sMessage += BOOST_CURRENT_FUNCTION; 188*cdf0e10cSrcweir sMessage += "\n"; 189*cdf0e10cSrcweir OSL_ENSURE( false, sMessage ); 190*cdf0e10cSrcweir } 191*cdf0e10cSrcweir 192*cdf0e10cSrcweir return sTitle; 193*cdf0e10cSrcweir } 194*cdf0e10cSrcweir 195*cdf0e10cSrcweir //........................................................................ 196*cdf0e10cSrcweir } // namespace comphelper 197*cdf0e10cSrcweir //........................................................................ 198