1d119d52dSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3d119d52dSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4d119d52dSAndrew Rist * or more contributor license agreements. See the NOTICE file
5d119d52dSAndrew Rist * distributed with this work for additional information
6d119d52dSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7d119d52dSAndrew Rist * to you under the Apache License, Version 2.0 (the
8d119d52dSAndrew Rist * "License"); you may not use this file except in compliance
9d119d52dSAndrew Rist * with the License. You may obtain a copy of the License at
10d119d52dSAndrew Rist *
11d119d52dSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12d119d52dSAndrew Rist *
13d119d52dSAndrew Rist * Unless required by applicable law or agreed to in writing,
14d119d52dSAndrew Rist * software distributed under the License is distributed on an
15d119d52dSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16d119d52dSAndrew Rist * KIND, either express or implied. See the License for the
17d119d52dSAndrew Rist * specific language governing permissions and limitations
18d119d52dSAndrew Rist * under the License.
19d119d52dSAndrew Rist *
20d119d52dSAndrew Rist *************************************************************/
21d119d52dSAndrew Rist
22d119d52dSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sfx2.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include "sfx2/sfxhelp.hxx"
28cdf0e10cSrcweir
29cdf0e10cSrcweir #include <set>
30cdf0e10cSrcweir #include <algorithm>
31cdf0e10cSrcweir #include <com/sun/star/uno/Reference.h>
32cdf0e10cSrcweir #include <com/sun/star/frame/XFrame.hpp>
33cdf0e10cSrcweir #include <com/sun/star/frame/XComponentLoader.hpp>
34cdf0e10cSrcweir #include <com/sun/star/lang/XComponent.hpp>
35cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
36cdf0e10cSrcweir #include <com/sun/star/awt/XWindow.hpp>
37cdf0e10cSrcweir #include <com/sun/star/awt/XTopWindow.hpp>
38cdf0e10cSrcweir #include <com/sun/star/awt/PosSize.hpp>
39cdf0e10cSrcweir #include <com/sun/star/frame/XDesktop.hpp>
40cdf0e10cSrcweir #include <com/sun/star/util/XURLTransformer.hpp>
41cdf0e10cSrcweir #include <com/sun/star/frame/XDispatch.hpp>
42cdf0e10cSrcweir #include <com/sun/star/frame/XDispatchProvider.hpp>
43cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp>
44cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
45cdf0e10cSrcweir #include <com/sun/star/frame/FrameSearchFlag.hpp>
46cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx>
47cdf0e10cSrcweir #include <com/sun/star/frame/XModuleManager.hpp>
48cdf0e10cSrcweir #include <unotools/configmgr.hxx>
49cdf0e10cSrcweir #include <unotools/configitem.hxx>
50cdf0e10cSrcweir #include <svtools/helpopt.hxx>
51cdf0e10cSrcweir #include <unotools/moduleoptions.hxx>
52cdf0e10cSrcweir #include <tools/urlobj.hxx>
53cdf0e10cSrcweir #include <unotools/configmgr.hxx>
54cdf0e10cSrcweir #include <ucbhelper/content.hxx>
55cdf0e10cSrcweir #include <unotools/pathoptions.hxx>
56cdf0e10cSrcweir #include <rtl/ustring.hxx>
57cdf0e10cSrcweir #include <osl/process.h>
58cdf0e10cSrcweir #include <osl/file.hxx>
59cdf0e10cSrcweir #include <unotools/bootstrap.hxx>
60cdf0e10cSrcweir #include <rtl/uri.hxx>
61cdf0e10cSrcweir #include <vcl/msgbox.hxx>
62cdf0e10cSrcweir #include <svtools/ehdl.hxx>
63cdf0e10cSrcweir #include <svtools/sfxecode.hxx>
64cdf0e10cSrcweir
65cdf0e10cSrcweir #define _SVSTDARR_STRINGSDTOR
66cdf0e10cSrcweir #define _SVSTDARR_ULONGSSORT
67cdf0e10cSrcweir #include <svl/svstdarr.hxx>
68cdf0e10cSrcweir
69cdf0e10cSrcweir #include "newhelp.hxx"
70cdf0e10cSrcweir #include <sfx2/objsh.hxx>
71cdf0e10cSrcweir #include <sfx2/docfac.hxx>
72cdf0e10cSrcweir #include "sfx2/sfxresid.hxx"
73cdf0e10cSrcweir #include "helper.hxx"
74cdf0e10cSrcweir #include "app.hrc"
75cdf0e10cSrcweir #include <sfx2/sfxuno.hxx>
76cdf0e10cSrcweir #include <vcl/svapp.hxx>
77cdf0e10cSrcweir #include <sfx2/frame.hxx>
78cdf0e10cSrcweir #include <rtl/string.hxx>
79cdf0e10cSrcweir
80cdf0e10cSrcweir using namespace ::com::sun::star::beans;
81cdf0e10cSrcweir using namespace ::com::sun::star::frame;
82cdf0e10cSrcweir using namespace ::com::sun::star::uno;
83cdf0e10cSrcweir using namespace ::com::sun::star::util;
84cdf0e10cSrcweir using namespace ::com::sun::star::frame;
85cdf0e10cSrcweir using namespace ::com::sun::star::lang;
86cdf0e10cSrcweir
87cdf0e10cSrcweir #define ERROR_TAG String( DEFINE_CONST_UNICODE("Error: ") )
88cdf0e10cSrcweir #define PATH_TAG String( DEFINE_CONST_UNICODE("\nPath: ") )
89cdf0e10cSrcweir
90cdf0e10cSrcweir // class NoHelpErrorBox --------------------------------------------------
91cdf0e10cSrcweir
92cdf0e10cSrcweir class NoHelpErrorBox : public ErrorBox
93cdf0e10cSrcweir {
94cdf0e10cSrcweir public:
95cdf0e10cSrcweir NoHelpErrorBox( Window* _pParent );
96cdf0e10cSrcweir
97cdf0e10cSrcweir virtual void RequestHelp( const HelpEvent& rHEvt );
98cdf0e10cSrcweir };
99cdf0e10cSrcweir
NoHelpErrorBox(Window * _pParent)100cdf0e10cSrcweir NoHelpErrorBox::NoHelpErrorBox( Window* _pParent ) :
101cdf0e10cSrcweir
102cdf0e10cSrcweir ErrorBox( _pParent, WB_OK, String( SfxResId( RID_STR_HLPFILENOTEXIST ) ) )
103cdf0e10cSrcweir {
104cdf0e10cSrcweir // Error message: "No help available"
105cdf0e10cSrcweir }
106cdf0e10cSrcweir
RequestHelp(const HelpEvent &)107cdf0e10cSrcweir void NoHelpErrorBox::RequestHelp( const HelpEvent& )
108cdf0e10cSrcweir {
109cdf0e10cSrcweir // do nothing, because no help available
110cdf0e10cSrcweir }
111cdf0e10cSrcweir
112cdf0e10cSrcweir // -----------------------------------------------------------------------
113cdf0e10cSrcweir
114cdf0e10cSrcweir #define STARTERLIST 0
115cdf0e10cSrcweir
HelpLocaleString()116cdf0e10cSrcweir rtl::OUString HelpLocaleString()
117cdf0e10cSrcweir {
118cdf0e10cSrcweir static rtl::OUString aLocaleStr;
119cdf0e10cSrcweir if (!aLocaleStr.getLength())
120cdf0e10cSrcweir {
121cdf0e10cSrcweir // detect installed locale
122cdf0e10cSrcweir Any aLocale =
123cdf0e10cSrcweir ::utl::ConfigManager::GetConfigManager()->GetDirectConfigProperty(
124cdf0e10cSrcweir ::utl::ConfigManager::LOCALE );
125cdf0e10cSrcweir aLocale >>= aLocaleStr;
126cdf0e10cSrcweir bool bOk = aLocaleStr.getLength() != 0;
127cdf0e10cSrcweir if ( bOk )
128cdf0e10cSrcweir {
129cdf0e10cSrcweir rtl::OUString aBaseInstallPath;
130cdf0e10cSrcweir // utl::Bootstrap::PathStatus aBaseLocateResult =
131cdf0e10cSrcweir utl::Bootstrap::locateBaseInstallation(aBaseInstallPath);
132cdf0e10cSrcweir static const char *szHelpPath = "/help/";
133cdf0e10cSrcweir
134cdf0e10cSrcweir rtl::OUString sHelpPath = aBaseInstallPath +
135cdf0e10cSrcweir rtl::OUString::createFromAscii(szHelpPath) + aLocaleStr;
136cdf0e10cSrcweir osl::DirectoryItem aDirItem;
137cdf0e10cSrcweir
138cdf0e10cSrcweir if (!osl::DirectoryItem::get(sHelpPath, aDirItem) == osl::FileBase::E_None)
139cdf0e10cSrcweir {
140cdf0e10cSrcweir bOk = false;
141cdf0e10cSrcweir String sLang(aLocaleStr);
142cdf0e10cSrcweir xub_StrLen nSepPos = sLang.Search( '-' );
143cdf0e10cSrcweir if (nSepPos != STRING_NOTFOUND)
144cdf0e10cSrcweir {
145cdf0e10cSrcweir bOk = true;
146cdf0e10cSrcweir sLang = sLang.Copy( 0, nSepPos );
147cdf0e10cSrcweir sHelpPath = aBaseInstallPath +
148cdf0e10cSrcweir rtl::OUString::createFromAscii(szHelpPath) + sLang;
149cdf0e10cSrcweir if (!osl::DirectoryItem::get(sHelpPath, aDirItem) == osl::FileBase::E_None)
150cdf0e10cSrcweir bOk = false;
151cdf0e10cSrcweir }
152cdf0e10cSrcweir }
153cdf0e10cSrcweir }
154cdf0e10cSrcweir if (!bOk)
155cdf0e10cSrcweir aLocaleStr = rtl::OUString( DEFINE_CONST_UNICODE("en") );
156cdf0e10cSrcweir }
157cdf0e10cSrcweir return aLocaleStr;
158cdf0e10cSrcweir }
159cdf0e10cSrcweir
AppendConfigToken_Impl(String & rURL,sal_Bool bQuestionMark)160cdf0e10cSrcweir void AppendConfigToken_Impl( String& rURL, sal_Bool bQuestionMark )
161cdf0e10cSrcweir {
162cdf0e10cSrcweir ::rtl::OUString aLocaleStr(HelpLocaleString());
163cdf0e10cSrcweir
164cdf0e10cSrcweir // query part exists?
165cdf0e10cSrcweir if ( bQuestionMark )
166cdf0e10cSrcweir // no, so start with '?'
167cdf0e10cSrcweir rURL += '?';
168cdf0e10cSrcweir else
169cdf0e10cSrcweir // yes, so only append with '&'
170cdf0e10cSrcweir rURL += '&';
171cdf0e10cSrcweir
172cdf0e10cSrcweir // set parameters
173cdf0e10cSrcweir rURL += DEFINE_CONST_UNICODE("Language=");
174cdf0e10cSrcweir rURL += String( aLocaleStr );
175cdf0e10cSrcweir rURL += DEFINE_CONST_UNICODE("&System=");
176cdf0e10cSrcweir rURL += SvtHelpOptions().GetSystem();
177cdf0e10cSrcweir
178cdf0e10cSrcweir }
179cdf0e10cSrcweir
180cdf0e10cSrcweir // -----------------------------------------------------------------------
181cdf0e10cSrcweir
GetHelpAnchor_Impl(const String & _rURL,String & _rAnchor)182cdf0e10cSrcweir sal_Bool GetHelpAnchor_Impl( const String& _rURL, String& _rAnchor )
183cdf0e10cSrcweir {
184cdf0e10cSrcweir sal_Bool bRet = sal_False;
185cdf0e10cSrcweir ::rtl::OUString sAnchor;
186cdf0e10cSrcweir
187cdf0e10cSrcweir // --> OD 2009-07-01 #159496#
188cdf0e10cSrcweir // do not release solar mutex due to crash regarding accessibility
189cdf0e10cSrcweir // sal_uIntPtr nSolarCount = Application::ReleaseSolarMutex();
190cdf0e10cSrcweir // <--
191cdf0e10cSrcweir try
192cdf0e10cSrcweir {
193cdf0e10cSrcweir ::ucbhelper::Content aCnt( INetURLObject( _rURL ).GetMainURL( INetURLObject::NO_DECODE ),
194cdf0e10cSrcweir Reference< ::com::sun::star::ucb::XCommandEnvironment > () );
195cdf0e10cSrcweir if ( ( aCnt.getPropertyValue( ::rtl::OUString::createFromAscii( "AnchorName" ) ) >>= sAnchor ) )
196cdf0e10cSrcweir {
197cdf0e10cSrcweir
198cdf0e10cSrcweir if ( sAnchor.getLength() > 0 )
199cdf0e10cSrcweir {
200cdf0e10cSrcweir _rAnchor = String( sAnchor );
201cdf0e10cSrcweir bRet = sal_True;
202cdf0e10cSrcweir }
203cdf0e10cSrcweir }
204cdf0e10cSrcweir else
205cdf0e10cSrcweir {
206cdf0e10cSrcweir DBG_ERRORFILE( "Property 'AnchorName' is missing" );
207cdf0e10cSrcweir }
208cdf0e10cSrcweir }
209cdf0e10cSrcweir catch( ::com::sun::star::uno::Exception& )
210cdf0e10cSrcweir {
211cdf0e10cSrcweir }
212cdf0e10cSrcweir // --> OD 2009-07-01 #159496#
213cdf0e10cSrcweir // Application::AcquireSolarMutex( nSolarCount );
214cdf0e10cSrcweir // <--
215cdf0e10cSrcweir
216cdf0e10cSrcweir return bRet;
217cdf0e10cSrcweir }
218cdf0e10cSrcweir
219cdf0e10cSrcweir // -----------------------------------------------------------------------
220cdf0e10cSrcweir
221cdf0e10cSrcweir class SfxHelpOptions_Impl : public utl::ConfigItem
222cdf0e10cSrcweir {
223cdf0e10cSrcweir private:
224cdf0e10cSrcweir std::set < rtl::OString > m_aIds;
225cdf0e10cSrcweir
226cdf0e10cSrcweir public:
227cdf0e10cSrcweir SfxHelpOptions_Impl();
228cdf0e10cSrcweir ~SfxHelpOptions_Impl();
229cdf0e10cSrcweir
HasId(const rtl::OString & rId)230cdf0e10cSrcweir bool HasId( const rtl::OString& rId ) { return m_aIds.size() ? m_aIds.find( rId ) != m_aIds.end() : false; }
231cdf0e10cSrcweir virtual void Notify( const com::sun::star::uno::Sequence< rtl::OUString >& aPropertyNames );
232cdf0e10cSrcweir virtual void Commit();
233cdf0e10cSrcweir };
234cdf0e10cSrcweir
GetPropertyNames()235cdf0e10cSrcweir static Sequence< ::rtl::OUString > GetPropertyNames()
236cdf0e10cSrcweir {
237cdf0e10cSrcweir static const char* aPropNames[] =
238cdf0e10cSrcweir {
239cdf0e10cSrcweir "HelpAgentStarterList",
240cdf0e10cSrcweir };
241cdf0e10cSrcweir
242cdf0e10cSrcweir const int nCount = sizeof( aPropNames ) / sizeof( const char* );
243cdf0e10cSrcweir Sequence< ::rtl::OUString > aNames( nCount );
244cdf0e10cSrcweir ::rtl::OUString* pNames = aNames.getArray();
245cdf0e10cSrcweir ::rtl::OUString* pEnd = pNames + aNames.getLength();
246cdf0e10cSrcweir int i = 0;
247cdf0e10cSrcweir for ( ; pNames != pEnd; ++pNames )
248cdf0e10cSrcweir *pNames = ::rtl::OUString::createFromAscii( aPropNames[i++] );
249cdf0e10cSrcweir
250cdf0e10cSrcweir return aNames;
251cdf0e10cSrcweir }
252cdf0e10cSrcweir
253cdf0e10cSrcweir // -----------------------------------------------------------------------
254cdf0e10cSrcweir
SfxHelpOptions_Impl()255cdf0e10cSrcweir SfxHelpOptions_Impl::SfxHelpOptions_Impl()
256cdf0e10cSrcweir : ConfigItem( ::rtl::OUString::createFromAscii("Office.SFX/Help") )
257cdf0e10cSrcweir {
258cdf0e10cSrcweir Sequence< ::rtl::OUString > aNames = GetPropertyNames();
259cdf0e10cSrcweir Sequence< Any > aValues = GetProperties( aNames );
260cdf0e10cSrcweir EnableNotification( aNames );
261cdf0e10cSrcweir const Any* pValues = aValues.getConstArray();
262cdf0e10cSrcweir DBG_ASSERT( aValues.getLength() == aNames.getLength(), "GetProperties failed" );
263cdf0e10cSrcweir if ( aValues.getLength() == aNames.getLength() )
264cdf0e10cSrcweir {
265cdf0e10cSrcweir for ( int nProp = 0; nProp < aNames.getLength(); nProp++ )
266cdf0e10cSrcweir {
267cdf0e10cSrcweir DBG_ASSERT( pValues[nProp].hasValue(), "property value missing" );
268cdf0e10cSrcweir if ( pValues[nProp].hasValue() )
269cdf0e10cSrcweir {
270cdf0e10cSrcweir switch ( nProp )
271cdf0e10cSrcweir {
272cdf0e10cSrcweir case STARTERLIST :
273cdf0e10cSrcweir {
274cdf0e10cSrcweir ::rtl::OUString aCodedList;
275cdf0e10cSrcweir if ( pValues[nProp] >>= aCodedList )
276cdf0e10cSrcweir {
277*24c56ab9SHerbert Dürr const rtl::OString aTmp( OUStringToOString( aCodedList, RTL_TEXTENCODING_UTF8 ));
278cdf0e10cSrcweir sal_Int32 nIndex = 0;
279cdf0e10cSrcweir do
280cdf0e10cSrcweir {
281cdf0e10cSrcweir rtl::OString aToken = aTmp.getToken( 0, ',', nIndex );
282cdf0e10cSrcweir if ( aToken.getLength() )
283cdf0e10cSrcweir m_aIds.insert( aToken );
284cdf0e10cSrcweir }
285cdf0e10cSrcweir while ( nIndex >= 0 );
286cdf0e10cSrcweir }
287cdf0e10cSrcweir else {
288cdf0e10cSrcweir DBG_ERRORFILE( "Wrong property type!" );
289cdf0e10cSrcweir }
290cdf0e10cSrcweir
291cdf0e10cSrcweir break;
292cdf0e10cSrcweir }
293cdf0e10cSrcweir
294cdf0e10cSrcweir default:
295cdf0e10cSrcweir DBG_ERRORFILE( "Wrong property!" );
296cdf0e10cSrcweir break;
297cdf0e10cSrcweir }
298cdf0e10cSrcweir }
299cdf0e10cSrcweir }
300cdf0e10cSrcweir }
301cdf0e10cSrcweir }
302cdf0e10cSrcweir
~SfxHelpOptions_Impl()303cdf0e10cSrcweir SfxHelpOptions_Impl::~SfxHelpOptions_Impl()
304cdf0e10cSrcweir {
305cdf0e10cSrcweir }
306cdf0e10cSrcweir
307cdf0e10cSrcweir
Notify(const com::sun::star::uno::Sequence<rtl::OUString> &)308cdf0e10cSrcweir void SfxHelpOptions_Impl::Notify( const com::sun::star::uno::Sequence< rtl::OUString >& )
309cdf0e10cSrcweir {
310cdf0e10cSrcweir }
311cdf0e10cSrcweir
Commit()312cdf0e10cSrcweir void SfxHelpOptions_Impl::Commit()
313cdf0e10cSrcweir {
314cdf0e10cSrcweir }
315cdf0e10cSrcweir
316cdf0e10cSrcweir // class SfxHelp_Impl ----------------------------------------------------
317cdf0e10cSrcweir
318cdf0e10cSrcweir class SfxHelp_Impl
319cdf0e10cSrcweir {
320cdf0e10cSrcweir private:
321cdf0e10cSrcweir sal_Bool m_bIsDebug; // environment variable "help_debug=1"
322cdf0e10cSrcweir SfxHelpOptions_Impl* m_pOpt; // the options
323cdf0e10cSrcweir ::std::vector< ::rtl::OUString > m_aModulesList; // list of all installed modules
324cdf0e10cSrcweir void Load();
325cdf0e10cSrcweir
326cdf0e10cSrcweir public:
327cdf0e10cSrcweir SfxHelp_Impl( sal_Bool bDebug );
328cdf0e10cSrcweir ~SfxHelp_Impl();
329cdf0e10cSrcweir
330cdf0e10cSrcweir SfxHelpOptions_Impl* GetOptions();
331cdf0e10cSrcweir static String GetHelpText( const rtl::OUString& aCommandURL, const String& rModule );
332cdf0e10cSrcweir sal_Bool HasModule( const ::rtl::OUString& rModule ); // module installed
333cdf0e10cSrcweir sal_Bool IsHelpInstalled(); // module list not empty
334cdf0e10cSrcweir };
335cdf0e10cSrcweir
SfxHelp_Impl(sal_Bool bDebug)336cdf0e10cSrcweir SfxHelp_Impl::SfxHelp_Impl( sal_Bool bDebug ) :
337cdf0e10cSrcweir
338cdf0e10cSrcweir m_bIsDebug ( bDebug ),
339cdf0e10cSrcweir m_pOpt ( NULL )
340cdf0e10cSrcweir
341cdf0e10cSrcweir {
342cdf0e10cSrcweir }
343cdf0e10cSrcweir
~SfxHelp_Impl()344cdf0e10cSrcweir SfxHelp_Impl::~SfxHelp_Impl()
345cdf0e10cSrcweir {
346cdf0e10cSrcweir delete m_pOpt;
347cdf0e10cSrcweir }
348cdf0e10cSrcweir
Load()349cdf0e10cSrcweir void SfxHelp_Impl::Load()
350cdf0e10cSrcweir {
351cdf0e10cSrcweir // fill modules list
352cdf0e10cSrcweir // create the help url (empty, without module and helpid)
353cdf0e10cSrcweir String sHelpURL( DEFINE_CONST_UNICODE("vnd.sun.star.help://") );
354cdf0e10cSrcweir AppendConfigToken_Impl( sHelpURL, sal_True );
355cdf0e10cSrcweir
356cdf0e10cSrcweir // open ucb content and get the list of the help modules
357cdf0e10cSrcweir // the list contains strings with three tokens "ui title \t type \t url"
358cdf0e10cSrcweir Sequence< ::rtl::OUString > aAllModulesList = SfxContentHelper::GetResultSet( sHelpURL );
359cdf0e10cSrcweir sal_Int32 nLen = aAllModulesList.getLength();
360cdf0e10cSrcweir m_aModulesList.reserve( nLen + 1 );
361cdf0e10cSrcweir const ::rtl::OUString* pBegin = aAllModulesList.getConstArray();
362cdf0e10cSrcweir const ::rtl::OUString* pEnd = pBegin + nLen;
363cdf0e10cSrcweir for ( ; pBegin != pEnd; ++pBegin )
364cdf0e10cSrcweir {
365cdf0e10cSrcweir // get one module string
366cdf0e10cSrcweir String sModule( *pBegin );
367cdf0e10cSrcweir // extract the url
368cdf0e10cSrcweir String sURL = sModule.GetToken( 2, '\t' );
369cdf0e10cSrcweir // insert the module (the host part of the "vnd.sun.star.help" url)
370cdf0e10cSrcweir m_aModulesList.push_back( ::rtl::OUString( INetURLObject( sURL ).GetHost() ) );
371cdf0e10cSrcweir }
372cdf0e10cSrcweir }
373cdf0e10cSrcweir
GetHelpText(const rtl::OUString & aCommandURL,const String & rModule)374cdf0e10cSrcweir String SfxHelp_Impl::GetHelpText( const rtl::OUString& aCommandURL, const String& rModule )
375cdf0e10cSrcweir {
376cdf0e10cSrcweir // create help url
377cdf0e10cSrcweir String aHelpURL = SfxHelp::CreateHelpURL( aCommandURL, rModule );
378cdf0e10cSrcweir // added 'active' parameter
379cdf0e10cSrcweir aHelpURL.Insert( String( DEFINE_CONST_UNICODE("&Active=true") ), aHelpURL.SearchBackward( '#' ) );
380cdf0e10cSrcweir // load help string
381cdf0e10cSrcweir return SfxContentHelper::GetActiveHelpString( aHelpURL );
382cdf0e10cSrcweir }
383cdf0e10cSrcweir
GetOptions()384cdf0e10cSrcweir SfxHelpOptions_Impl* SfxHelp_Impl::GetOptions()
385cdf0e10cSrcweir {
386cdf0e10cSrcweir // create if not exists
387cdf0e10cSrcweir if ( !m_pOpt )
388cdf0e10cSrcweir m_pOpt = new SfxHelpOptions_Impl;
389cdf0e10cSrcweir return m_pOpt;
390cdf0e10cSrcweir }
391cdf0e10cSrcweir
HasModule(const::rtl::OUString & rModule)392cdf0e10cSrcweir sal_Bool SfxHelp_Impl::HasModule( const ::rtl::OUString& rModule )
393cdf0e10cSrcweir {
394cdf0e10cSrcweir if ( !m_aModulesList.size() )
395cdf0e10cSrcweir Load();
396cdf0e10cSrcweir return ( ::std::find( m_aModulesList.begin(), m_aModulesList.end(), rModule ) != m_aModulesList.end() );
397cdf0e10cSrcweir }
398cdf0e10cSrcweir
IsHelpInstalled()399cdf0e10cSrcweir sal_Bool SfxHelp_Impl::IsHelpInstalled()
400cdf0e10cSrcweir {
401cdf0e10cSrcweir if ( !m_aModulesList.size() )
402cdf0e10cSrcweir Load();
403cdf0e10cSrcweir return ( m_aModulesList.begin() != m_aModulesList.end() );
404cdf0e10cSrcweir }
405cdf0e10cSrcweir
406cdf0e10cSrcweir // class SfxHelp ---------------------------------------------------------
407cdf0e10cSrcweir /* some test code for HID conversion - please don't remove
408cdf0e10cSrcweir
409cdf0e10cSrcweir #include <tools/stream.hxx>
410cdf0e10cSrcweir void TestHids()
411cdf0e10cSrcweir {
412cdf0e10cSrcweir static const char* aModules[] =
413cdf0e10cSrcweir {
414cdf0e10cSrcweir "swriter",
415cdf0e10cSrcweir "scalc",
416cdf0e10cSrcweir "simpress",
417cdf0e10cSrcweir "sdraw",
418cdf0e10cSrcweir "sdatabase",
419cdf0e10cSrcweir "smath",
420cdf0e10cSrcweir "schart",
421cdf0e10cSrcweir "sbasic"
422cdf0e10cSrcweir };
423cdf0e10cSrcweir
424cdf0e10cSrcweir SvFileStream* pOut[] =
425cdf0e10cSrcweir {
426cdf0e10cSrcweir 0,0,0,0,0,0,0,0,0
427cdf0e10cSrcweir };
428cdf0e10cSrcweir
429cdf0e10cSrcweir String aIn = String::CreateFromAscii("/data/OOo/replacer/hidsin.lst");
430cdf0e10cSrcweir String aOut = String::CreateFromAscii("/data/OOo/replacer/");
431cdf0e10cSrcweir SvFileStream aInStrm( aIn, STREAM_READ );
432cdf0e10cSrcweir ByteString aBuffer;
433cdf0e10cSrcweir while ( aInStrm.ReadLine( aBuffer ) )
434cdf0e10cSrcweir {
435cdf0e10cSrcweir ByteString aHid = aBuffer.GetToken(0, ' ');
436cdf0e10cSrcweir ByteString aNr = aBuffer.GetToken(1, ' ');
437cdf0e10cSrcweir bool bFound=false;
438cdf0e10cSrcweir for (sal_Int32 n= 0; n<8; n++)
439cdf0e10cSrcweir {
440cdf0e10cSrcweir bFound = false;
441cdf0e10cSrcweir String aHelpURL = SfxHelp::CreateHelpURL( String( aNr, RTL_TEXTENCODING_UTF8 ), String( aModules[n], RTL_TEXTENCODING_UTF8 ) );
442cdf0e10cSrcweir if ( !SfxContentHelper::IsHelpErrorDocument( aHelpURL ) )
443cdf0e10cSrcweir {
444cdf0e10cSrcweir if (!pOut[n])
445cdf0e10cSrcweir {
446cdf0e10cSrcweir String aTmp( aOut );
447cdf0e10cSrcweir aTmp += String( aModules[n], RTL_TEXTENCODING_UTF8 );
448cdf0e10cSrcweir aTmp += String::CreateFromAscii(".lst");
449cdf0e10cSrcweir pOut[n] = new SvFileStream( aTmp, STREAM_WRITE | STREAM_TRUNC );
450cdf0e10cSrcweir }
451cdf0e10cSrcweir pOut[n]->WriteLine( aHid );
452cdf0e10cSrcweir bFound = true;
453cdf0e10cSrcweir break;
454cdf0e10cSrcweir }
455cdf0e10cSrcweir }
456cdf0e10cSrcweir
457cdf0e10cSrcweir if (!bFound)
458cdf0e10cSrcweir {
459cdf0e10cSrcweir if (!pOut[8])
460cdf0e10cSrcweir {
461cdf0e10cSrcweir String aTmp( aOut );
462cdf0e10cSrcweir aTmp += String( "notfound", RTL_TEXTENCODING_UTF8 );
463cdf0e10cSrcweir aTmp += String::CreateFromAscii(".lst");
464cdf0e10cSrcweir pOut[8] = new SvFileStream( aTmp, STREAM_WRITE | STREAM_TRUNC );
465cdf0e10cSrcweir }
466cdf0e10cSrcweir pOut[8]->WriteLine( aHid );
467cdf0e10cSrcweir }
468cdf0e10cSrcweir }
469cdf0e10cSrcweir
470cdf0e10cSrcweir for (sal_Int32 n= 0; n<9; n++)
471cdf0e10cSrcweir DELETEZ( pOut[n] );
472cdf0e10cSrcweir }
473cdf0e10cSrcweir
474cdf0e10cSrcweir void TestHids2()
475cdf0e10cSrcweir {
476cdf0e10cSrcweir static const char* aModules[] =
477cdf0e10cSrcweir {
478cdf0e10cSrcweir "swriter",
479cdf0e10cSrcweir "scalc",
480cdf0e10cSrcweir "simpress",
481cdf0e10cSrcweir "smath",
482cdf0e10cSrcweir "sbasic"
483cdf0e10cSrcweir };
484cdf0e10cSrcweir
485cdf0e10cSrcweir String aOut = String::CreateFromAscii("/data/OOo/replacer/");
486cdf0e10cSrcweir aOut += String::CreateFromAscii("lost.lst");
487cdf0e10cSrcweir SvFileStream aOutStrm( aOut, STREAM_WRITE | STREAM_TRUNC );
488cdf0e10cSrcweir for (sal_Int32 n= 0; n<5; n++)
489cdf0e10cSrcweir {
490cdf0e10cSrcweir String aIn = String::CreateFromAscii("/data/OOo/replacer/help/");
491cdf0e10cSrcweir aIn += String::CreateFromAscii( aModules[n] );
492cdf0e10cSrcweir aIn += String::CreateFromAscii(".lst");
493cdf0e10cSrcweir SvFileStream aInStrm( aIn, STREAM_READ );
494cdf0e10cSrcweir ByteString aBuffer;
495cdf0e10cSrcweir while ( aInStrm.ReadLine( aBuffer ) )
496cdf0e10cSrcweir {
497cdf0e10cSrcweir String aHelpURL = SfxHelp::CreateHelpURL( String( aBuffer, RTL_TEXTENCODING_UTF8 ), String( aModules[n], RTL_TEXTENCODING_UTF8 ) );
498cdf0e10cSrcweir if ( SfxContentHelper::IsHelpErrorDocument( aHelpURL ) )
499cdf0e10cSrcweir aOutStrm.WriteLine( aBuffer );
500cdf0e10cSrcweir }
501cdf0e10cSrcweir }
502cdf0e10cSrcweir }
503cdf0e10cSrcweir
504cdf0e10cSrcweir #include <tools/stream.hxx>
505cdf0e10cSrcweir void TestHids3()
506cdf0e10cSrcweir {
507cdf0e10cSrcweir static const char* aModules[] =
508cdf0e10cSrcweir {
509cdf0e10cSrcweir "swriter",
510cdf0e10cSrcweir "scalc",
511cdf0e10cSrcweir "simpress",
512cdf0e10cSrcweir "sdraw",
513cdf0e10cSrcweir "sdatabase",
514cdf0e10cSrcweir "smath",
515cdf0e10cSrcweir "schart",
516cdf0e10cSrcweir "sbasic"
517cdf0e10cSrcweir };
518cdf0e10cSrcweir
519cdf0e10cSrcweir SvFileStream* pOut[] =
520cdf0e10cSrcweir {
521cdf0e10cSrcweir 0,0,0,0,0,0,0,0,0
522cdf0e10cSrcweir };
523cdf0e10cSrcweir
524cdf0e10cSrcweir String aIn = String::CreateFromAscii("/data/OOo/replacer/hidsin.lst");
525cdf0e10cSrcweir String aOut = String::CreateFromAscii("/data/OOo/replacer/quickhelp/");
526cdf0e10cSrcweir SvFileStream aInStrm( aIn, STREAM_READ );
527cdf0e10cSrcweir ByteString aBuffer;
528cdf0e10cSrcweir while ( aInStrm.ReadLine( aBuffer ) )
529cdf0e10cSrcweir {
530cdf0e10cSrcweir ByteString aHid = aBuffer.GetToken(0, ' ');
531cdf0e10cSrcweir ByteString aNr = aBuffer.GetToken(1, ' ');
532cdf0e10cSrcweir bool bFound=false;
533cdf0e10cSrcweir for (sal_Int32 n= 0; n<8; n++)
534cdf0e10cSrcweir {
535cdf0e10cSrcweir bFound = false;
536cdf0e10cSrcweir String aHelpURL = SfxHelp::CreateHelpURL( String( aNr, RTL_TEXTENCODING_UTF8 ), String( aModules[n], RTL_TEXTENCODING_UTF8 ) );
537cdf0e10cSrcweir if ( SfxContentHelper::GetActiveHelpString( aHelpURL ).Len() )
538cdf0e10cSrcweir // if ( SfxHelp_Impl::GetHelpText( String( aNr, RTL_TEXTENCODING_UTF8 ), String( aModules[n], RTL_TEXTENCODING_UTF8 ) ).Len() )
539cdf0e10cSrcweir {
540cdf0e10cSrcweir if (!pOut[n])
541cdf0e10cSrcweir {
542cdf0e10cSrcweir String aTmp( aOut );
543cdf0e10cSrcweir aTmp += String( aModules[n], RTL_TEXTENCODING_UTF8 );
544cdf0e10cSrcweir aTmp += String::CreateFromAscii(".lst");
545cdf0e10cSrcweir pOut[n] = new SvFileStream( aTmp, STREAM_WRITE | STREAM_TRUNC );
546cdf0e10cSrcweir }
547cdf0e10cSrcweir pOut[n]->WriteLine( aHid );
548cdf0e10cSrcweir bFound = true;
549cdf0e10cSrcweir break;
550cdf0e10cSrcweir }
551cdf0e10cSrcweir }
552cdf0e10cSrcweir
553cdf0e10cSrcweir if (!bFound)
554cdf0e10cSrcweir {
555cdf0e10cSrcweir if (!pOut[8])
556cdf0e10cSrcweir {
557cdf0e10cSrcweir String aTmp( aOut );
558cdf0e10cSrcweir aTmp += String( "notfound", RTL_TEXTENCODING_UTF8 );
559cdf0e10cSrcweir aTmp += String::CreateFromAscii(".lst");
560cdf0e10cSrcweir pOut[8] = new SvFileStream( aTmp, STREAM_WRITE | STREAM_TRUNC );
561cdf0e10cSrcweir }
562cdf0e10cSrcweir pOut[8]->WriteLine( aHid );
563cdf0e10cSrcweir }
564cdf0e10cSrcweir }
565cdf0e10cSrcweir
566cdf0e10cSrcweir for (sal_Int32 n= 0; n<9; n++)
567cdf0e10cSrcweir DELETEZ( pOut[n] );
568cdf0e10cSrcweir }
569cdf0e10cSrcweir
570cdf0e10cSrcweir void TestHids4()
571cdf0e10cSrcweir {
572cdf0e10cSrcweir static const char* aModules[] =
573cdf0e10cSrcweir {
574cdf0e10cSrcweir "swriter",
575cdf0e10cSrcweir "scalc",
576cdf0e10cSrcweir "simpress",
577cdf0e10cSrcweir "smath",
578cdf0e10cSrcweir "sbasic"
579cdf0e10cSrcweir };
580cdf0e10cSrcweir
581cdf0e10cSrcweir String aOut = String::CreateFromAscii("/data/OOo/replacer/quickhelp/");
582cdf0e10cSrcweir aOut += String::CreateFromAscii("lost.lst");
583cdf0e10cSrcweir SvFileStream aOutStrm( aOut, STREAM_WRITE | STREAM_TRUNC );
584cdf0e10cSrcweir for (sal_Int32 n= 0; n<5; n++)
585cdf0e10cSrcweir {
586cdf0e10cSrcweir String aIn = String::CreateFromAscii("/data/OOo/replacer/quickhelp/");
587cdf0e10cSrcweir aIn += String::CreateFromAscii( aModules[n] );
588cdf0e10cSrcweir aIn += String::CreateFromAscii(".lst");
589cdf0e10cSrcweir SvFileStream aInStrm( aIn, STREAM_READ );
590cdf0e10cSrcweir ByteString aBuffer;
591cdf0e10cSrcweir while ( aInStrm.ReadLine( aBuffer ) )
592cdf0e10cSrcweir {
593cdf0e10cSrcweir String aHelpURL = SfxHelp::CreateHelpURL( String( aBuffer, RTL_TEXTENCODING_UTF8 ), String( aModules[n], RTL_TEXTENCODING_UTF8 ) );
594cdf0e10cSrcweir if ( !SfxContentHelper::GetActiveHelpString( aHelpURL ).Len() )
595cdf0e10cSrcweir aOutStrm.WriteLine( aBuffer );
596cdf0e10cSrcweir }
597cdf0e10cSrcweir }
598cdf0e10cSrcweir }
599cdf0e10cSrcweir */
600cdf0e10cSrcweir
SfxHelp()601cdf0e10cSrcweir SfxHelp::SfxHelp() :
602cdf0e10cSrcweir
603cdf0e10cSrcweir bIsDebug( sal_False ),
604cdf0e10cSrcweir pImp ( NULL )
605cdf0e10cSrcweir
606cdf0e10cSrcweir {
607cdf0e10cSrcweir // read the environment variable "HELP_DEBUG"
608cdf0e10cSrcweir // if it's set, you will see debug output on active help
609cdf0e10cSrcweir {
610cdf0e10cSrcweir ::rtl::OUString sHelpDebug;
611cdf0e10cSrcweir ::rtl::OUString sEnvVarName( RTL_CONSTASCII_USTRINGPARAM( "HELP_DEBUG" ) );
612cdf0e10cSrcweir osl_getEnvironment( sEnvVarName.pData, &sHelpDebug.pData );
613cdf0e10cSrcweir bIsDebug = ( 0 != sHelpDebug.getLength() );
614cdf0e10cSrcweir }
615cdf0e10cSrcweir
616cdf0e10cSrcweir pImp = new SfxHelp_Impl( bIsDebug );
617cdf0e10cSrcweir
618cdf0e10cSrcweir ::rtl::OUString aLocaleStr = HelpLocaleString();
619cdf0e10cSrcweir
620cdf0e10cSrcweir sal_Int32 nSepPos = aLocaleStr.indexOf( '_' );
621cdf0e10cSrcweir if ( nSepPos != -1 )
622cdf0e10cSrcweir {
623cdf0e10cSrcweir aLanguageStr = aLocaleStr.copy( 0, nSepPos );
624cdf0e10cSrcweir aCountryStr = aLocaleStr.copy( nSepPos+1 );
625cdf0e10cSrcweir }
626cdf0e10cSrcweir else
627cdf0e10cSrcweir {
628cdf0e10cSrcweir nSepPos = aLocaleStr.indexOf( '-' );
629cdf0e10cSrcweir if ( nSepPos != -1 )
630cdf0e10cSrcweir {
631cdf0e10cSrcweir aLanguageStr = aLocaleStr.copy( 0, nSepPos );
632cdf0e10cSrcweir aCountryStr = aLocaleStr.copy( nSepPos+1 );
633cdf0e10cSrcweir }
634cdf0e10cSrcweir else
635cdf0e10cSrcweir {
636cdf0e10cSrcweir aLanguageStr = aLocaleStr;
637cdf0e10cSrcweir }
638cdf0e10cSrcweir }
639cdf0e10cSrcweir }
640cdf0e10cSrcweir
~SfxHelp()641cdf0e10cSrcweir SfxHelp::~SfxHelp()
642cdf0e10cSrcweir {
643cdf0e10cSrcweir delete pImp;
644cdf0e10cSrcweir }
645cdf0e10cSrcweir
getDefaultModule_Impl()646cdf0e10cSrcweir ::rtl::OUString getDefaultModule_Impl()
647cdf0e10cSrcweir {
648cdf0e10cSrcweir rtl::OUString sDefaultModule;
649cdf0e10cSrcweir SvtModuleOptions aModOpt;
650cdf0e10cSrcweir if ( aModOpt.IsModuleInstalled( SvtModuleOptions::E_SWRITER ) )
651cdf0e10cSrcweir sDefaultModule = DEFINE_CONST_UNICODE("swriter");
652cdf0e10cSrcweir else if ( aModOpt.IsModuleInstalled( SvtModuleOptions::E_SCALC ) )
653cdf0e10cSrcweir sDefaultModule = DEFINE_CONST_UNICODE("scalc");
654cdf0e10cSrcweir else if ( aModOpt.IsModuleInstalled( SvtModuleOptions::E_SIMPRESS ) )
655cdf0e10cSrcweir sDefaultModule = DEFINE_CONST_UNICODE("simpress");
656cdf0e10cSrcweir else if ( aModOpt.IsModuleInstalled( SvtModuleOptions::E_SDRAW ) )
657cdf0e10cSrcweir sDefaultModule = DEFINE_CONST_UNICODE("sdraw");
658cdf0e10cSrcweir else if ( aModOpt.IsModuleInstalled( SvtModuleOptions::E_SMATH ) )
659cdf0e10cSrcweir sDefaultModule = DEFINE_CONST_UNICODE("smath");
660cdf0e10cSrcweir else if ( aModOpt.IsModuleInstalled( SvtModuleOptions::E_SCHART ) )
661cdf0e10cSrcweir sDefaultModule = DEFINE_CONST_UNICODE("schart");
662cdf0e10cSrcweir else if ( aModOpt.IsModuleInstalled( SvtModuleOptions::E_SBASIC ) )
663cdf0e10cSrcweir sDefaultModule = DEFINE_CONST_UNICODE("sbasic");
664cdf0e10cSrcweir else if ( aModOpt.IsModuleInstalled( SvtModuleOptions::E_SDATABASE ) )
665cdf0e10cSrcweir sDefaultModule = DEFINE_CONST_UNICODE("sdatabase");
666cdf0e10cSrcweir else
667cdf0e10cSrcweir {
668cdf0e10cSrcweir DBG_ERRORFILE( "getDefaultModule_Impl(): no module installed" );
669cdf0e10cSrcweir }
670cdf0e10cSrcweir return sDefaultModule;
671cdf0e10cSrcweir }
672cdf0e10cSrcweir
getCurrentModuleIdentifier_Impl()673cdf0e10cSrcweir ::rtl::OUString getCurrentModuleIdentifier_Impl()
674cdf0e10cSrcweir {
675cdf0e10cSrcweir ::rtl::OUString sIdentifier;
676cdf0e10cSrcweir Reference < XFrame > xCurrentFrame;
677cdf0e10cSrcweir Reference < XModuleManager > xModuleManager( ::comphelper::getProcessServiceFactory()->createInstance(
678cdf0e10cSrcweir DEFINE_CONST_UNICODE("com.sun.star.frame.ModuleManager") ), UNO_QUERY );
679cdf0e10cSrcweir Reference < XDesktop > xDesktop( ::comphelper::getProcessServiceFactory()->createInstance(
680cdf0e10cSrcweir DEFINE_CONST_UNICODE("com.sun.star.frame.Desktop") ), UNO_QUERY );
681cdf0e10cSrcweir if ( xDesktop.is() )
682cdf0e10cSrcweir xCurrentFrame = xDesktop->getCurrentFrame();
683cdf0e10cSrcweir
684cdf0e10cSrcweir if ( xCurrentFrame.is() && xModuleManager.is() )
685cdf0e10cSrcweir {
686cdf0e10cSrcweir try
687cdf0e10cSrcweir {
688cdf0e10cSrcweir sIdentifier = xModuleManager->identify( xCurrentFrame );
689cdf0e10cSrcweir }
690cdf0e10cSrcweir catch ( ::com::sun::star::frame::UnknownModuleException& )
691cdf0e10cSrcweir {
692cdf0e10cSrcweir DBG_WARNING( "SfxHelp::getCurrentModuleIdentifier_Impl(): unknown module (help in help?)" );
693cdf0e10cSrcweir }
694cdf0e10cSrcweir catch ( Exception& )
695cdf0e10cSrcweir {
696cdf0e10cSrcweir DBG_ERRORFILE( "SfxHelp::getCurrentModuleIdentifier_Impl(): exception of XModuleManager::identify()" );
697cdf0e10cSrcweir }
698cdf0e10cSrcweir }
699cdf0e10cSrcweir
700cdf0e10cSrcweir return sIdentifier;
701cdf0e10cSrcweir }
702cdf0e10cSrcweir
GetHelpModuleName_Impl()703cdf0e10cSrcweir String SfxHelp::GetHelpModuleName_Impl()
704cdf0e10cSrcweir {
705cdf0e10cSrcweir String sModuleName;
706cdf0e10cSrcweir rtl::OUString aFactoryShortName;
707cdf0e10cSrcweir rtl::OUString aModuleIdentifier = getCurrentModuleIdentifier_Impl();
708cdf0e10cSrcweir
709cdf0e10cSrcweir if ( aModuleIdentifier.getLength() > 0 )
710cdf0e10cSrcweir {
711cdf0e10cSrcweir try
712cdf0e10cSrcweir {
713cdf0e10cSrcweir Reference < XModuleManager > xModuleManager(
714cdf0e10cSrcweir ::comphelper::getProcessServiceFactory()->createInstance(
715cdf0e10cSrcweir DEFINE_CONST_UNICODE("com.sun.star.frame.ModuleManager") ), UNO_QUERY );
716cdf0e10cSrcweir Sequence< PropertyValue > lProps;
717cdf0e10cSrcweir Reference< ::com::sun::star::container::XNameAccess > xCont( xModuleManager, UNO_QUERY);
718cdf0e10cSrcweir if ( xCont.is() )
719cdf0e10cSrcweir xCont->getByName( aModuleIdentifier ) >>= lProps;
720cdf0e10cSrcweir for ( sal_Int32 i = 0; i < lProps.getLength(); ++i )
721cdf0e10cSrcweir {
722cdf0e10cSrcweir if ( lProps[i].Name.equalsAscii("ooSetupFactoryShortName") )
723cdf0e10cSrcweir {
724cdf0e10cSrcweir lProps[i].Value >>= aFactoryShortName;
725cdf0e10cSrcweir break;
726cdf0e10cSrcweir }
727cdf0e10cSrcweir }
728cdf0e10cSrcweir }
729cdf0e10cSrcweir catch ( Exception& )
730cdf0e10cSrcweir {
731cdf0e10cSrcweir DBG_ERRORFILE( "SfxHelp::GetHelpModuleName_Impl(): exception of XNameAccess::getByName()" );
732cdf0e10cSrcweir }
733cdf0e10cSrcweir }
734cdf0e10cSrcweir
735cdf0e10cSrcweir rtl::OUString sDefaultModule = getDefaultModule_Impl();
736cdf0e10cSrcweir if ( aFactoryShortName.getLength() > 0 )
737cdf0e10cSrcweir {
738cdf0e10cSrcweir // Map some module identifiers to their "real" help module string.
739cdf0e10cSrcweir if ( aFactoryShortName.equalsAscii( "chart2" ) )
740cdf0e10cSrcweir aFactoryShortName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "schart" ) );
741cdf0e10cSrcweir else if ( aFactoryShortName.equalsAscii( "BasicIDE" ) )
742cdf0e10cSrcweir aFactoryShortName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "sbasic" ) );
743cdf0e10cSrcweir else if ( aFactoryShortName.equalsAscii( "sweb" )
744cdf0e10cSrcweir || aFactoryShortName.equalsAscii( "sglobal" )
745cdf0e10cSrcweir || aFactoryShortName.equalsAscii( "swxform" ) )
746cdf0e10cSrcweir aFactoryShortName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "swriter" ) );
747cdf0e10cSrcweir else if ( aFactoryShortName.equalsAscii( "dbquery" )
748cdf0e10cSrcweir || aFactoryShortName.equalsAscii( "dbbrowser" )
749cdf0e10cSrcweir || aFactoryShortName.equalsAscii( "dbrelation" )
750cdf0e10cSrcweir || aFactoryShortName.equalsAscii( "dbtable" )
751cdf0e10cSrcweir || aFactoryShortName.equalsAscii( "dbapp" )
752cdf0e10cSrcweir || aFactoryShortName.equalsAscii( "dbreport" )
753cdf0e10cSrcweir || aFactoryShortName.equalsAscii( "swreport" )
754cdf0e10cSrcweir || aFactoryShortName.equalsAscii( "dbbrowser" )
755cdf0e10cSrcweir || aFactoryShortName.equalsAscii( "swform" ) )
756cdf0e10cSrcweir aFactoryShortName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "sdatabase" ) );
757cdf0e10cSrcweir else if ( aFactoryShortName.equalsAscii( "sbibliography" )
758cdf0e10cSrcweir || aFactoryShortName.equalsAscii( "StartModule" ) )
759cdf0e10cSrcweir aFactoryShortName = sDefaultModule;
760cdf0e10cSrcweir }
761cdf0e10cSrcweir else
762cdf0e10cSrcweir aFactoryShortName = sDefaultModule;
763cdf0e10cSrcweir
764cdf0e10cSrcweir sModuleName = String( aFactoryShortName );
765cdf0e10cSrcweir return sModuleName;
766cdf0e10cSrcweir }
767cdf0e10cSrcweir
CreateHelpURL_Impl(const String & aCommandURL,const String & rModuleName)768cdf0e10cSrcweir String SfxHelp::CreateHelpURL_Impl( const String& aCommandURL, const String& rModuleName )
769cdf0e10cSrcweir {
770cdf0e10cSrcweir // build up the help URL
771cdf0e10cSrcweir String aHelpURL;
772cdf0e10cSrcweir sal_Bool bHasAnchor = sal_False;
773cdf0e10cSrcweir String aAnchor;
774cdf0e10cSrcweir
775cdf0e10cSrcweir String aModuleName( rModuleName );
776cdf0e10cSrcweir if ( aModuleName.Len() == 0 )
777cdf0e10cSrcweir aModuleName = getDefaultModule_Impl();
778cdf0e10cSrcweir
779cdf0e10cSrcweir aHelpURL = String::CreateFromAscii("vnd.sun.star.help://");
780cdf0e10cSrcweir aHelpURL += aModuleName;
781cdf0e10cSrcweir
782cdf0e10cSrcweir if ( !aCommandURL.Len() )
783cdf0e10cSrcweir aHelpURL += String::CreateFromAscii("/start");
784cdf0e10cSrcweir else
785cdf0e10cSrcweir {
786cdf0e10cSrcweir aHelpURL += '/';
787cdf0e10cSrcweir aHelpURL += String( rtl::Uri::encode( aCommandURL,
788cdf0e10cSrcweir rtl_UriCharClassRelSegment,
789cdf0e10cSrcweir rtl_UriEncodeKeepEscapes,
790cdf0e10cSrcweir RTL_TEXTENCODING_UTF8 ));
791cdf0e10cSrcweir
792cdf0e10cSrcweir String aTempURL = aHelpURL;
793cdf0e10cSrcweir AppendConfigToken_Impl( aTempURL, sal_True );
794cdf0e10cSrcweir bHasAnchor = GetHelpAnchor_Impl( aTempURL, aAnchor );
795cdf0e10cSrcweir }
796cdf0e10cSrcweir
797cdf0e10cSrcweir AppendConfigToken_Impl( aHelpURL, sal_True );
798cdf0e10cSrcweir
799cdf0e10cSrcweir if ( bHasAnchor )
800cdf0e10cSrcweir {
801cdf0e10cSrcweir aHelpURL += '#';
802cdf0e10cSrcweir aHelpURL += aAnchor;
803cdf0e10cSrcweir }
804cdf0e10cSrcweir
805cdf0e10cSrcweir return aHelpURL;
806cdf0e10cSrcweir }
807cdf0e10cSrcweir
impl_createHelp(Reference<XFrame> & rHelpTask,Reference<XFrame> & rHelpContent)808cdf0e10cSrcweir SfxHelpWindow_Impl* impl_createHelp(Reference< XFrame >& rHelpTask ,
809cdf0e10cSrcweir Reference< XFrame >& rHelpContent)
810cdf0e10cSrcweir {
811cdf0e10cSrcweir Reference < XFrame > xDesktop( ::comphelper::getProcessServiceFactory()->createInstance(
812cdf0e10cSrcweir DEFINE_CONST_UNICODE("com.sun.star.frame.Desktop") ), UNO_QUERY );
813cdf0e10cSrcweir
814cdf0e10cSrcweir // otherwhise - create new help task
815cdf0e10cSrcweir Reference< XFrame > xHelpTask = xDesktop->findFrame(
816cdf0e10cSrcweir ::rtl::OUString(DEFINE_CONST_UNICODE("OFFICE_HELP_TASK")),
817cdf0e10cSrcweir FrameSearchFlag::TASKS | FrameSearchFlag::CREATE);
818cdf0e10cSrcweir if (!xHelpTask.is())
819cdf0e10cSrcweir return 0;
820cdf0e10cSrcweir
821cdf0e10cSrcweir // create all internal windows and sub frames ...
822cdf0e10cSrcweir Reference< ::com::sun::star::awt::XWindow > xParentWindow = xHelpTask->getContainerWindow();
823cdf0e10cSrcweir Window* pParentWindow = VCLUnoHelper::GetWindow( xParentWindow );
824cdf0e10cSrcweir SfxHelpWindow_Impl* pHelpWindow = new SfxHelpWindow_Impl( xHelpTask, pParentWindow, WB_DOCKBORDER );
825cdf0e10cSrcweir Reference< ::com::sun::star::awt::XWindow > xHelpWindow = VCLUnoHelper::GetInterface( pHelpWindow );
826cdf0e10cSrcweir
827cdf0e10cSrcweir Reference< XFrame > xHelpContent;
828cdf0e10cSrcweir if (xHelpTask->setComponent( xHelpWindow, Reference< XController >() ))
829cdf0e10cSrcweir {
830cdf0e10cSrcweir // Customize UI ...
831cdf0e10cSrcweir xHelpTask->setName( ::rtl::OUString(DEFINE_CONST_UNICODE("OFFICE_HELP_TASK")) );
832cdf0e10cSrcweir
833cdf0e10cSrcweir Reference< XPropertySet > xProps(xHelpTask, UNO_QUERY);
834cdf0e10cSrcweir if (xProps.is())
835cdf0e10cSrcweir xProps->setPropertyValue(
836cdf0e10cSrcweir DEFINE_CONST_UNICODE("Title"),
837cdf0e10cSrcweir makeAny(::rtl::OUString(String(SfxResId(STR_HELP_WINDOW_TITLE)))));
838cdf0e10cSrcweir
839cdf0e10cSrcweir pHelpWindow->setContainerWindow( xParentWindow );
840cdf0e10cSrcweir xParentWindow->setVisible(sal_True);
841cdf0e10cSrcweir xHelpWindow->setVisible(sal_True);
842cdf0e10cSrcweir
843cdf0e10cSrcweir // This sub frame is created internaly (if we called new SfxHelpWindow_Impl() ...)
844cdf0e10cSrcweir // It should exist :-)
845cdf0e10cSrcweir xHelpContent = xHelpTask->findFrame(::rtl::OUString(DEFINE_CONST_UNICODE("OFFICE_HELP")), FrameSearchFlag::CHILDREN);
846cdf0e10cSrcweir }
847cdf0e10cSrcweir
848cdf0e10cSrcweir if (!xHelpContent.is())
849cdf0e10cSrcweir delete pHelpWindow;
850cdf0e10cSrcweir
851cdf0e10cSrcweir xHelpContent->setName(::rtl::OUString(DEFINE_CONST_UNICODE("OFFICE_HELP")));
852cdf0e10cSrcweir
853cdf0e10cSrcweir rHelpTask = xHelpTask;
854cdf0e10cSrcweir rHelpContent = xHelpContent;
855cdf0e10cSrcweir return pHelpWindow;
856cdf0e10cSrcweir }
857cdf0e10cSrcweir
GetHelpText(const String & aCommandURL,const Window * pWindow)858cdf0e10cSrcweir XubString SfxHelp::GetHelpText( const String& aCommandURL, const Window* pWindow )
859cdf0e10cSrcweir {
860cdf0e10cSrcweir String sModuleName = GetHelpModuleName_Impl();
861cdf0e10cSrcweir String sHelpText = pImp->GetHelpText( aCommandURL, sModuleName );
862cdf0e10cSrcweir
863cdf0e10cSrcweir ByteString aNewHelpId;
864cdf0e10cSrcweir
865cdf0e10cSrcweir if ( pWindow && !sHelpText.Len() )
866cdf0e10cSrcweir {
867cdf0e10cSrcweir // no help text found -> try with parent help id.
868cdf0e10cSrcweir Window* pParent = pWindow->GetParent();
869cdf0e10cSrcweir while ( pParent )
870cdf0e10cSrcweir {
871cdf0e10cSrcweir aNewHelpId = pParent->GetHelpId();
872cdf0e10cSrcweir sHelpText = pImp->GetHelpText( String( aNewHelpId, RTL_TEXTENCODING_UTF8 ), sModuleName );
873cdf0e10cSrcweir if ( sHelpText.Len() > 0 )
874cdf0e10cSrcweir pParent = NULL;
875cdf0e10cSrcweir else
876cdf0e10cSrcweir pParent = pParent->GetParent();
877cdf0e10cSrcweir }
878cdf0e10cSrcweir
879cdf0e10cSrcweir if ( bIsDebug && !sHelpText.Len() )
880cdf0e10cSrcweir aNewHelpId.Erase();
881cdf0e10cSrcweir }
882cdf0e10cSrcweir
883cdf0e10cSrcweir // add some debug information?
884cdf0e10cSrcweir if ( bIsDebug )
885cdf0e10cSrcweir {
886cdf0e10cSrcweir sHelpText += DEFINE_CONST_UNICODE("\n-------------\n");
887cdf0e10cSrcweir sHelpText += String( sModuleName );
888cdf0e10cSrcweir sHelpText += DEFINE_CONST_UNICODE(": ");
889cdf0e10cSrcweir sHelpText += aCommandURL;
890cdf0e10cSrcweir if ( aNewHelpId.Len() )
891cdf0e10cSrcweir {
892cdf0e10cSrcweir sHelpText += DEFINE_CONST_UNICODE(" - ");
893cdf0e10cSrcweir sHelpText += String( aNewHelpId, RTL_TEXTENCODING_UTF8 );
894cdf0e10cSrcweir }
895cdf0e10cSrcweir }
896cdf0e10cSrcweir
897cdf0e10cSrcweir return sHelpText;
898cdf0e10cSrcweir }
899cdf0e10cSrcweir
SearchKeyword(const XubString & rKeyword)900cdf0e10cSrcweir sal_Bool SfxHelp::SearchKeyword( const XubString& rKeyword )
901cdf0e10cSrcweir {
902cdf0e10cSrcweir return Start_Impl( String(), NULL, rKeyword );
903cdf0e10cSrcweir }
904cdf0e10cSrcweir
Start(const String & rURL,const Window * pWindow)905cdf0e10cSrcweir sal_Bool SfxHelp::Start( const String& rURL, const Window* pWindow )
906cdf0e10cSrcweir {
907cdf0e10cSrcweir return Start_Impl( rURL, pWindow, String() );
908cdf0e10cSrcweir }
909cdf0e10cSrcweir
Start_Impl(const String & rURL,const Window * pWindow,const String & rKeyword)910cdf0e10cSrcweir sal_Bool SfxHelp::Start_Impl( const String& rURL, const Window* pWindow, const String& rKeyword )
911cdf0e10cSrcweir {
912cdf0e10cSrcweir // check if help is available
913cdf0e10cSrcweir String aHelpRootURL( DEFINE_CONST_OUSTRING("vnd.sun.star.help://") );
914cdf0e10cSrcweir AppendConfigToken_Impl( aHelpRootURL, sal_True );
915cdf0e10cSrcweir Sequence< ::rtl::OUString > aFactories = SfxContentHelper::GetResultSet( aHelpRootURL );
916cdf0e10cSrcweir if ( 0 == aFactories.getLength() )
917cdf0e10cSrcweir {
918cdf0e10cSrcweir // no factories -> no help -> error message and return
919cdf0e10cSrcweir NoHelpErrorBox aErrBox( const_cast< Window* >( pWindow ) );
920cdf0e10cSrcweir aErrBox.Execute();
921cdf0e10cSrcweir return sal_False;
922cdf0e10cSrcweir }
923cdf0e10cSrcweir
924cdf0e10cSrcweir /* rURL may be
925cdf0e10cSrcweir - a "real" URL
926cdf0e10cSrcweir - a HelpID (formerly a long, now a string)
927cdf0e10cSrcweir If rURL is a URL, CreateHelpURL should be called for this URL
928cdf0e10cSrcweir If rURL is an arbitrary string, the same should happen, but the URL should be tried out
929cdf0e10cSrcweir if it delivers real help content. In case only the Help Error Document is returned, the
930cdf0e10cSrcweir parent of the window for that help was called, is asked for its HelpID.
931cdf0e10cSrcweir For compatibility reasons this upward search is not implemented for "real" URLs.
932cdf0e10cSrcweir Help keyword search now is implemented as own method; in former versions it
933cdf0e10cSrcweir was done via Help::Start, but this implementation conflicted with the upward search.
934cdf0e10cSrcweir */
935cdf0e10cSrcweir String aHelpURL;
936cdf0e10cSrcweir INetURLObject aParser( rURL );
937cdf0e10cSrcweir INetProtocol nProtocol = aParser.GetProtocol();
938cdf0e10cSrcweir String aHelpModuleName( GetHelpModuleName_Impl() );
939cdf0e10cSrcweir switch ( nProtocol )
940cdf0e10cSrcweir {
941cdf0e10cSrcweir case INET_PROT_VND_SUN_STAR_HELP:
942cdf0e10cSrcweir // already a vnd.sun.star.help URL -> nothing to do
943cdf0e10cSrcweir aHelpURL = rURL;
944cdf0e10cSrcweir break;
945cdf0e10cSrcweir default:
946cdf0e10cSrcweir {
947cdf0e10cSrcweir // no URL, just a HelpID (maybe empty in case of keyword search)
948cdf0e10cSrcweir aHelpURL = CreateHelpURL_Impl( rURL, aHelpModuleName );
949cdf0e10cSrcweir if ( pWindow && SfxContentHelper::IsHelpErrorDocument( aHelpURL ) )
950cdf0e10cSrcweir {
951cdf0e10cSrcweir // no help found -> try with parent help id.
952cdf0e10cSrcweir Window* pParent = pWindow->GetParent();
953cdf0e10cSrcweir while ( pParent )
954cdf0e10cSrcweir {
955cdf0e10cSrcweir ByteString aHelpId = pParent->GetHelpId();
956cdf0e10cSrcweir aHelpURL = CreateHelpURL( String( aHelpId, RTL_TEXTENCODING_UTF8 ), aHelpModuleName );
957cdf0e10cSrcweir if ( !SfxContentHelper::IsHelpErrorDocument( aHelpURL ) )
958cdf0e10cSrcweir break;
959cdf0e10cSrcweir else
960cdf0e10cSrcweir {
961cdf0e10cSrcweir pParent = pParent->GetParent();
962cdf0e10cSrcweir if ( !pParent )
963cdf0e10cSrcweir // create help url of start page ( helpid == 0 -> start page)
964cdf0e10cSrcweir aHelpURL = CreateHelpURL( String(), aHelpModuleName );
965cdf0e10cSrcweir }
966cdf0e10cSrcweir }
967cdf0e10cSrcweir }
968cdf0e10cSrcweir break;
969cdf0e10cSrcweir }
970cdf0e10cSrcweir }
971cdf0e10cSrcweir
972cdf0e10cSrcweir Reference < XFrame > xDesktop( ::comphelper::getProcessServiceFactory()->createInstance(
973cdf0e10cSrcweir DEFINE_CONST_UNICODE("com.sun.star.frame.Desktop") ), UNO_QUERY );
974cdf0e10cSrcweir
975cdf0e10cSrcweir // check if help window is still open
976cdf0e10cSrcweir // If not, create a new one and return access directly to the internal sub frame showing the help content
977cdf0e10cSrcweir // search must be done here; search one desktop level could return an arbitraty frame
978cdf0e10cSrcweir Reference< XFrame > xHelp = xDesktop->findFrame(
979cdf0e10cSrcweir ::rtl::OUString(DEFINE_CONST_UNICODE("OFFICE_HELP_TASK")),
980cdf0e10cSrcweir FrameSearchFlag::CHILDREN);
981cdf0e10cSrcweir Reference< XFrame > xHelpContent = xDesktop->findFrame(
982cdf0e10cSrcweir ::rtl::OUString(DEFINE_CONST_UNICODE("OFFICE_HELP")),
983cdf0e10cSrcweir FrameSearchFlag::CHILDREN);
984cdf0e10cSrcweir
985cdf0e10cSrcweir SfxHelpWindow_Impl* pHelpWindow = 0;
986cdf0e10cSrcweir if (!xHelp.is())
987cdf0e10cSrcweir pHelpWindow = impl_createHelp(xHelp, xHelpContent);
988cdf0e10cSrcweir else
989cdf0e10cSrcweir pHelpWindow = (SfxHelpWindow_Impl*)VCLUnoHelper::GetWindow(xHelp->getComponentWindow());
990cdf0e10cSrcweir if (!xHelp.is() || !xHelpContent.is() || !pHelpWindow)
991cdf0e10cSrcweir return sal_False;
992cdf0e10cSrcweir
993cdf0e10cSrcweir #ifdef DBG_UTIL
994cdf0e10cSrcweir ByteString aTmp("SfxHelp: HelpId = ");
995cdf0e10cSrcweir aTmp += ByteString( aHelpURL, RTL_TEXTENCODING_UTF8 );
996cdf0e10cSrcweir DBG_TRACE( aTmp.GetBuffer() );
997cdf0e10cSrcweir #endif
998cdf0e10cSrcweir
999cdf0e10cSrcweir pHelpWindow->SetHelpURL( aHelpURL );
1000cdf0e10cSrcweir pHelpWindow->loadHelpContent(aHelpURL);
1001cdf0e10cSrcweir if ( rKeyword.Len() )
1002cdf0e10cSrcweir pHelpWindow->OpenKeyword( rKeyword );
1003cdf0e10cSrcweir
1004cdf0e10cSrcweir Reference < ::com::sun::star::awt::XTopWindow > xTopWindow( xHelp->getContainerWindow(), UNO_QUERY );
1005cdf0e10cSrcweir if ( xTopWindow.is() )
1006cdf0e10cSrcweir xTopWindow->toFront();
1007cdf0e10cSrcweir
1008cdf0e10cSrcweir return sal_True;
1009cdf0e10cSrcweir }
1010cdf0e10cSrcweir
CreateHelpURL(const String & aCommandURL,const String & rModuleName)1011cdf0e10cSrcweir String SfxHelp::CreateHelpURL( const String& aCommandURL, const String& rModuleName )
1012cdf0e10cSrcweir {
1013cdf0e10cSrcweir String aURL;
1014cdf0e10cSrcweir SfxHelp* pHelp = SAL_STATIC_CAST( SfxHelp*, Application::GetHelp() );
1015cdf0e10cSrcweir if ( pHelp )
1016cdf0e10cSrcweir aURL = pHelp->CreateHelpURL_Impl( aCommandURL, rModuleName );
1017cdf0e10cSrcweir return aURL;
1018cdf0e10cSrcweir }
1019cdf0e10cSrcweir
OpenHelpAgent(SfxFrame *,const rtl::OString & sHelpId)1020cdf0e10cSrcweir void SfxHelp::OpenHelpAgent( SfxFrame*, const rtl::OString& sHelpId )
1021cdf0e10cSrcweir {
1022cdf0e10cSrcweir SfxHelp* pHelp = SAL_STATIC_CAST( SfxHelp*, Application::GetHelp() );
1023cdf0e10cSrcweir if ( pHelp )
1024cdf0e10cSrcweir pHelp->OpenHelpAgent( sHelpId );
1025cdf0e10cSrcweir }
1026cdf0e10cSrcweir
OpenHelpAgent(const rtl::OString & sHelpId)1027cdf0e10cSrcweir void SfxHelp::OpenHelpAgent( const rtl::OString& sHelpId )
1028cdf0e10cSrcweir {
1029cdf0e10cSrcweir if ( SvtHelpOptions().IsHelpAgentAutoStartMode() )
1030cdf0e10cSrcweir {
1031cdf0e10cSrcweir SfxHelpOptions_Impl *pOpt = pImp->GetOptions();
1032cdf0e10cSrcweir if ( !pOpt->HasId( sHelpId ) )
1033cdf0e10cSrcweir return;
1034cdf0e10cSrcweir
1035cdf0e10cSrcweir try
1036cdf0e10cSrcweir {
1037cdf0e10cSrcweir URL aURL;
1038cdf0e10cSrcweir aURL.Complete = CreateHelpURL_Impl( String( ByteString(sHelpId), RTL_TEXTENCODING_UTF8 ), GetHelpModuleName_Impl() );
1039cdf0e10cSrcweir Reference < XURLTransformer > xTrans( ::comphelper::getProcessServiceFactory()->createInstance(
1040cdf0e10cSrcweir ::rtl::OUString::createFromAscii("com.sun.star.util.URLTransformer" ) ), UNO_QUERY );
1041cdf0e10cSrcweir xTrans->parseStrict(aURL);
1042cdf0e10cSrcweir
1043cdf0e10cSrcweir Reference < XFrame > xCurrentFrame;
1044cdf0e10cSrcweir Reference < XDesktop > xDesktop( ::comphelper::getProcessServiceFactory()->createInstance(
1045cdf0e10cSrcweir DEFINE_CONST_UNICODE("com.sun.star.frame.Desktop") ), UNO_QUERY );
1046cdf0e10cSrcweir if ( xDesktop.is() )
1047cdf0e10cSrcweir xCurrentFrame = xDesktop->getCurrentFrame();
1048cdf0e10cSrcweir
1049cdf0e10cSrcweir Reference< XDispatchProvider > xDispProv( xCurrentFrame, UNO_QUERY );
1050cdf0e10cSrcweir Reference< XDispatch > xHelpDispatch;
1051cdf0e10cSrcweir if ( xDispProv.is() )
1052cdf0e10cSrcweir xHelpDispatch = xDispProv->queryDispatch(
1053cdf0e10cSrcweir aURL, ::rtl::OUString::createFromAscii("_helpagent"),
1054cdf0e10cSrcweir FrameSearchFlag::PARENT | FrameSearchFlag::SELF );
1055cdf0e10cSrcweir
1056cdf0e10cSrcweir DBG_ASSERT( xHelpDispatch.is(), "OpenHelpAgent: could not get a dispatcher!" );
1057cdf0e10cSrcweir if ( xHelpDispatch.is() )
1058cdf0e10cSrcweir xHelpDispatch->dispatch( aURL, Sequence< PropertyValue >() );
1059cdf0e10cSrcweir }
1060cdf0e10cSrcweir catch( const Exception& )
1061cdf0e10cSrcweir {
1062cdf0e10cSrcweir DBG_ERRORFILE( "OpenHelpAgent: caught an exception while executing the dispatch!" );
1063cdf0e10cSrcweir }
1064cdf0e10cSrcweir }
1065cdf0e10cSrcweir }
1066cdf0e10cSrcweir
GetDefaultHelpModule()1067cdf0e10cSrcweir String SfxHelp::GetDefaultHelpModule()
1068cdf0e10cSrcweir {
1069cdf0e10cSrcweir return getDefaultModule_Impl();
1070cdf0e10cSrcweir }
1071cdf0e10cSrcweir
GetCurrentModuleIdentifier()1072cdf0e10cSrcweir ::rtl::OUString SfxHelp::GetCurrentModuleIdentifier()
1073cdf0e10cSrcweir {
1074cdf0e10cSrcweir return getCurrentModuleIdentifier_Impl();
1075cdf0e10cSrcweir }
1076cdf0e10cSrcweir
1077