xref: /aoo41x/main/sfx2/source/appl/sfxhelp.cxx (revision 24c56ab9)
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