xref: /trunk/main/sfx2/source/appl/sfxhelp.cxx (revision 15e1fb6f8be2dab068d70089d19ab118cd5fa46f)
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
10cdf0e10cSrcweir  *
11d119d52dSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
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.
19cdf0e10cSrcweir  *
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                         {
27724c56ab9SHerbert 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 
81415289133Smseidel     // otherwise - 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 
84306fea5ebSmseidel         // This sub frame is created internally (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())
8491e508968SPedro Giffuni     {
850cdf0e10cSrcweir         delete pHelpWindow;
8511e508968SPedro Giffuni         return NULL;
8521e508968SPedro Giffuni         }
853cdf0e10cSrcweir 
854cdf0e10cSrcweir     xHelpContent->setName(::rtl::OUString(DEFINE_CONST_UNICODE("OFFICE_HELP")));
855cdf0e10cSrcweir 
856cdf0e10cSrcweir     rHelpTask    = xHelpTask;
857cdf0e10cSrcweir     rHelpContent = xHelpContent;
858cdf0e10cSrcweir     return pHelpWindow;
859cdf0e10cSrcweir }
860cdf0e10cSrcweir 
GetHelpText(const String & aCommandURL,const Window * pWindow)861cdf0e10cSrcweir XubString SfxHelp::GetHelpText( const String& aCommandURL, const Window* pWindow )
862cdf0e10cSrcweir {
863cdf0e10cSrcweir     String sModuleName = GetHelpModuleName_Impl();
864cdf0e10cSrcweir     String sHelpText = pImp->GetHelpText( aCommandURL, sModuleName );
865cdf0e10cSrcweir 
866cdf0e10cSrcweir     ByteString aNewHelpId;
867cdf0e10cSrcweir 
868cdf0e10cSrcweir     if ( pWindow && !sHelpText.Len() )
869cdf0e10cSrcweir     {
870cdf0e10cSrcweir         // no help text found -> try with parent help id.
871cdf0e10cSrcweir         Window* pParent = pWindow->GetParent();
872cdf0e10cSrcweir         while ( pParent )
873cdf0e10cSrcweir         {
874cdf0e10cSrcweir             aNewHelpId = pParent->GetHelpId();
875cdf0e10cSrcweir             sHelpText = pImp->GetHelpText( String( aNewHelpId, RTL_TEXTENCODING_UTF8 ), sModuleName );
876cdf0e10cSrcweir             if ( sHelpText.Len() > 0 )
877cdf0e10cSrcweir                 pParent = NULL;
878cdf0e10cSrcweir             else
879cdf0e10cSrcweir                 pParent = pParent->GetParent();
880cdf0e10cSrcweir         }
881cdf0e10cSrcweir 
882cdf0e10cSrcweir         if ( bIsDebug && !sHelpText.Len() )
883cdf0e10cSrcweir             aNewHelpId.Erase();
884cdf0e10cSrcweir     }
885cdf0e10cSrcweir 
886cdf0e10cSrcweir     // add some debug information?
887cdf0e10cSrcweir     if ( bIsDebug )
888cdf0e10cSrcweir     {
889*15e1fb6fSmseidel         sHelpText += DEFINE_CONST_UNICODE("\n_____________\n");
890cdf0e10cSrcweir         sHelpText += String( sModuleName );
891cdf0e10cSrcweir         sHelpText += DEFINE_CONST_UNICODE(": ");
892cdf0e10cSrcweir         sHelpText += aCommandURL;
893cdf0e10cSrcweir         if ( aNewHelpId.Len() )
894cdf0e10cSrcweir         {
895cdf0e10cSrcweir             sHelpText += DEFINE_CONST_UNICODE(" - ");
896cdf0e10cSrcweir             sHelpText += String( aNewHelpId, RTL_TEXTENCODING_UTF8 );
897cdf0e10cSrcweir         }
898cdf0e10cSrcweir     }
899cdf0e10cSrcweir 
900cdf0e10cSrcweir     return sHelpText;
901cdf0e10cSrcweir }
902cdf0e10cSrcweir 
SearchKeyword(const XubString & rKeyword)903cdf0e10cSrcweir sal_Bool SfxHelp::SearchKeyword( const XubString& rKeyword )
904cdf0e10cSrcweir {
905cdf0e10cSrcweir     return Start_Impl( String(), NULL, rKeyword );
906cdf0e10cSrcweir }
907cdf0e10cSrcweir 
Start(const String & rURL,const Window * pWindow)908cdf0e10cSrcweir sal_Bool SfxHelp::Start( const String& rURL, const Window* pWindow )
909cdf0e10cSrcweir {
910cdf0e10cSrcweir     return Start_Impl( rURL, pWindow, String() );
911cdf0e10cSrcweir }
912cdf0e10cSrcweir 
Start_Impl(const String & rURL,const Window * pWindow,const String & rKeyword)913cdf0e10cSrcweir sal_Bool SfxHelp::Start_Impl( const String& rURL, const Window* pWindow, const String& rKeyword )
914cdf0e10cSrcweir {
915cdf0e10cSrcweir     // check if help is available
916cdf0e10cSrcweir     String aHelpRootURL( DEFINE_CONST_OUSTRING("vnd.sun.star.help://") );
917cdf0e10cSrcweir     AppendConfigToken_Impl( aHelpRootURL, sal_True );
918cdf0e10cSrcweir     Sequence< ::rtl::OUString > aFactories = SfxContentHelper::GetResultSet( aHelpRootURL );
919cdf0e10cSrcweir     if ( 0 == aFactories.getLength() )
920cdf0e10cSrcweir     {
921cdf0e10cSrcweir         // no factories -> no help -> error message and return
922cdf0e10cSrcweir         NoHelpErrorBox aErrBox( const_cast< Window* >( pWindow ) );
923cdf0e10cSrcweir         aErrBox.Execute();
924cdf0e10cSrcweir         return sal_False;
925cdf0e10cSrcweir     }
926cdf0e10cSrcweir 
927cdf0e10cSrcweir     /* rURL may be
928cdf0e10cSrcweir         - a "real" URL
929cdf0e10cSrcweir         - a HelpID (formerly a long, now a string)
930cdf0e10cSrcweir        If rURL is a URL, CreateHelpURL should be called for this URL
931cdf0e10cSrcweir        If rURL is an arbitrary string, the same should happen, but the URL should be tried out
932cdf0e10cSrcweir        if it delivers real help content. In case only the Help Error Document is returned, the
933cdf0e10cSrcweir        parent of the window for that help was called, is asked for its HelpID.
934cdf0e10cSrcweir        For compatibility reasons this upward search is not implemented for "real" URLs.
935cdf0e10cSrcweir        Help keyword search now is implemented as own method; in former versions it
936cdf0e10cSrcweir        was done via Help::Start, but this implementation conflicted with the upward search.
937cdf0e10cSrcweir     */
938cdf0e10cSrcweir     String aHelpURL;
939cdf0e10cSrcweir     INetURLObject aParser( rURL );
940cdf0e10cSrcweir     INetProtocol nProtocol = aParser.GetProtocol();
941cdf0e10cSrcweir     String aHelpModuleName( GetHelpModuleName_Impl() );
942cdf0e10cSrcweir     switch ( nProtocol )
943cdf0e10cSrcweir     {
944cdf0e10cSrcweir         case INET_PROT_VND_SUN_STAR_HELP:
945cdf0e10cSrcweir             // already a vnd.sun.star.help URL -> nothing to do
946cdf0e10cSrcweir             aHelpURL = rURL;
947cdf0e10cSrcweir             break;
948cdf0e10cSrcweir         default:
949cdf0e10cSrcweir         {
950cdf0e10cSrcweir             // no URL, just a HelpID (maybe empty in case of keyword search)
951cdf0e10cSrcweir             aHelpURL = CreateHelpURL_Impl( rURL, aHelpModuleName );
952cdf0e10cSrcweir             if ( pWindow && SfxContentHelper::IsHelpErrorDocument( aHelpURL ) )
953cdf0e10cSrcweir             {
954cdf0e10cSrcweir                 // no help found -> try with parent help id.
955cdf0e10cSrcweir                 Window* pParent = pWindow->GetParent();
956cdf0e10cSrcweir                 while ( pParent )
957cdf0e10cSrcweir                 {
958cdf0e10cSrcweir                     ByteString aHelpId = pParent->GetHelpId();
959cdf0e10cSrcweir                     aHelpURL = CreateHelpURL( String( aHelpId, RTL_TEXTENCODING_UTF8 ), aHelpModuleName );
960cdf0e10cSrcweir                     if ( !SfxContentHelper::IsHelpErrorDocument( aHelpURL ) )
961cdf0e10cSrcweir                         break;
962cdf0e10cSrcweir                     else
963cdf0e10cSrcweir                     {
964cdf0e10cSrcweir                         pParent = pParent->GetParent();
965cdf0e10cSrcweir                         if ( !pParent )
966cdf0e10cSrcweir                             // create help url of start page ( helpid == 0 -> start page)
967cdf0e10cSrcweir                             aHelpURL = CreateHelpURL( String(), aHelpModuleName );
968cdf0e10cSrcweir                     }
969cdf0e10cSrcweir                 }
970cdf0e10cSrcweir             }
971cdf0e10cSrcweir             break;
972cdf0e10cSrcweir         }
973cdf0e10cSrcweir     }
974cdf0e10cSrcweir 
975cdf0e10cSrcweir     Reference < XFrame > xDesktop( ::comphelper::getProcessServiceFactory()->createInstance(
976cdf0e10cSrcweir         DEFINE_CONST_UNICODE("com.sun.star.frame.Desktop") ), UNO_QUERY );
977cdf0e10cSrcweir 
978cdf0e10cSrcweir     // check if help window is still open
979cdf0e10cSrcweir     // If not, create a new one and return access directly to the internal sub frame showing the help content
980*15e1fb6fSmseidel     // search must be done here; search one desktop level could return an arbitrary frame
981cdf0e10cSrcweir     Reference< XFrame > xHelp = xDesktop->findFrame(
982cdf0e10cSrcweir         ::rtl::OUString(DEFINE_CONST_UNICODE("OFFICE_HELP_TASK")),
983cdf0e10cSrcweir         FrameSearchFlag::CHILDREN);
984cdf0e10cSrcweir     Reference< XFrame > xHelpContent = xDesktop->findFrame(
985cdf0e10cSrcweir         ::rtl::OUString(DEFINE_CONST_UNICODE("OFFICE_HELP")),
986cdf0e10cSrcweir         FrameSearchFlag::CHILDREN);
987cdf0e10cSrcweir 
988cdf0e10cSrcweir     SfxHelpWindow_Impl* pHelpWindow = 0;
989cdf0e10cSrcweir     if (!xHelp.is())
990cdf0e10cSrcweir         pHelpWindow = impl_createHelp(xHelp, xHelpContent);
991cdf0e10cSrcweir     else
992cdf0e10cSrcweir         pHelpWindow = (SfxHelpWindow_Impl*)VCLUnoHelper::GetWindow(xHelp->getComponentWindow());
993cdf0e10cSrcweir     if (!xHelp.is() || !xHelpContent.is() || !pHelpWindow)
994cdf0e10cSrcweir         return sal_False;
995cdf0e10cSrcweir 
996cdf0e10cSrcweir #ifdef DBG_UTIL
997cdf0e10cSrcweir     ByteString aTmp("SfxHelp: HelpId = ");
998cdf0e10cSrcweir     aTmp += ByteString( aHelpURL, RTL_TEXTENCODING_UTF8 );
999cdf0e10cSrcweir     DBG_TRACE( aTmp.GetBuffer() );
1000cdf0e10cSrcweir #endif
1001cdf0e10cSrcweir 
1002cdf0e10cSrcweir     pHelpWindow->SetHelpURL( aHelpURL );
1003cdf0e10cSrcweir     pHelpWindow->loadHelpContent(aHelpURL);
1004cdf0e10cSrcweir     if ( rKeyword.Len() )
1005cdf0e10cSrcweir         pHelpWindow->OpenKeyword( rKeyword );
1006cdf0e10cSrcweir 
1007cdf0e10cSrcweir     Reference < ::com::sun::star::awt::XTopWindow > xTopWindow( xHelp->getContainerWindow(), UNO_QUERY );
1008cdf0e10cSrcweir     if ( xTopWindow.is() )
1009cdf0e10cSrcweir         xTopWindow->toFront();
1010cdf0e10cSrcweir 
1011cdf0e10cSrcweir     return sal_True;
1012cdf0e10cSrcweir }
1013cdf0e10cSrcweir 
CreateHelpURL(const String & aCommandURL,const String & rModuleName)1014cdf0e10cSrcweir String SfxHelp::CreateHelpURL( const String& aCommandURL, const String& rModuleName )
1015cdf0e10cSrcweir {
1016cdf0e10cSrcweir     String aURL;
1017cdf0e10cSrcweir     SfxHelp* pHelp = SAL_STATIC_CAST( SfxHelp*, Application::GetHelp() );
1018cdf0e10cSrcweir     if ( pHelp )
1019cdf0e10cSrcweir         aURL = pHelp->CreateHelpURL_Impl( aCommandURL, rModuleName );
1020cdf0e10cSrcweir     return aURL;
1021cdf0e10cSrcweir }
1022cdf0e10cSrcweir 
OpenHelpAgent(SfxFrame *,const rtl::OString & sHelpId)1023cdf0e10cSrcweir void SfxHelp::OpenHelpAgent( SfxFrame*, const rtl::OString& sHelpId )
1024cdf0e10cSrcweir {
1025cdf0e10cSrcweir     SfxHelp* pHelp = SAL_STATIC_CAST( SfxHelp*, Application::GetHelp() );
1026cdf0e10cSrcweir     if ( pHelp )
1027cdf0e10cSrcweir         pHelp->OpenHelpAgent( sHelpId );
1028cdf0e10cSrcweir }
1029cdf0e10cSrcweir 
OpenHelpAgent(const rtl::OString & sHelpId)1030cdf0e10cSrcweir void SfxHelp::OpenHelpAgent( const rtl::OString& sHelpId )
1031cdf0e10cSrcweir {
1032cdf0e10cSrcweir     if ( SvtHelpOptions().IsHelpAgentAutoStartMode() )
1033cdf0e10cSrcweir     {
1034cdf0e10cSrcweir             SfxHelpOptions_Impl *pOpt = pImp->GetOptions();
1035cdf0e10cSrcweir             if ( !pOpt->HasId( sHelpId ) )
1036cdf0e10cSrcweir                 return;
1037cdf0e10cSrcweir 
1038cdf0e10cSrcweir             try
1039cdf0e10cSrcweir             {
1040cdf0e10cSrcweir                 URL aURL;
1041cdf0e10cSrcweir                 aURL.Complete = CreateHelpURL_Impl( String( ByteString(sHelpId), RTL_TEXTENCODING_UTF8 ), GetHelpModuleName_Impl() );
1042cdf0e10cSrcweir                 Reference < XURLTransformer > xTrans( ::comphelper::getProcessServiceFactory()->createInstance(
1043cdf0e10cSrcweir                     ::rtl::OUString::createFromAscii("com.sun.star.util.URLTransformer" ) ), UNO_QUERY );
1044cdf0e10cSrcweir                 xTrans->parseStrict(aURL);
1045cdf0e10cSrcweir 
1046cdf0e10cSrcweir                 Reference < XFrame > xCurrentFrame;
1047cdf0e10cSrcweir                 Reference < XDesktop > xDesktop( ::comphelper::getProcessServiceFactory()->createInstance(
1048cdf0e10cSrcweir                     DEFINE_CONST_UNICODE("com.sun.star.frame.Desktop") ), UNO_QUERY );
1049cdf0e10cSrcweir                 if ( xDesktop.is() )
1050cdf0e10cSrcweir                     xCurrentFrame = xDesktop->getCurrentFrame();
1051cdf0e10cSrcweir 
1052cdf0e10cSrcweir                 Reference< XDispatchProvider > xDispProv( xCurrentFrame, UNO_QUERY );
1053cdf0e10cSrcweir                 Reference< XDispatch > xHelpDispatch;
1054cdf0e10cSrcweir                 if ( xDispProv.is() )
1055cdf0e10cSrcweir                     xHelpDispatch = xDispProv->queryDispatch(
1056cdf0e10cSrcweir                         aURL, ::rtl::OUString::createFromAscii("_helpagent"),
1057cdf0e10cSrcweir                         FrameSearchFlag::PARENT | FrameSearchFlag::SELF );
1058cdf0e10cSrcweir 
1059cdf0e10cSrcweir                 DBG_ASSERT( xHelpDispatch.is(), "OpenHelpAgent: could not get a dispatcher!" );
1060cdf0e10cSrcweir                 if ( xHelpDispatch.is() )
1061cdf0e10cSrcweir                     xHelpDispatch->dispatch( aURL, Sequence< PropertyValue >() );
1062cdf0e10cSrcweir             }
1063cdf0e10cSrcweir             catch( const Exception& )
1064cdf0e10cSrcweir             {
1065cdf0e10cSrcweir                 DBG_ERRORFILE( "OpenHelpAgent: caught an exception while executing the dispatch!" );
1066cdf0e10cSrcweir             }
1067cdf0e10cSrcweir     }
1068cdf0e10cSrcweir }
1069cdf0e10cSrcweir 
GetDefaultHelpModule()1070cdf0e10cSrcweir String SfxHelp::GetDefaultHelpModule()
1071cdf0e10cSrcweir {
1072cdf0e10cSrcweir     return getDefaultModule_Impl();
1073cdf0e10cSrcweir }
1074cdf0e10cSrcweir 
GetCurrentModuleIdentifier()1075cdf0e10cSrcweir ::rtl::OUString SfxHelp::GetCurrentModuleIdentifier()
1076cdf0e10cSrcweir {
1077cdf0e10cSrcweir     return getCurrentModuleIdentifier_Impl();
1078cdf0e10cSrcweir }
1079