xref: /aoo4110/main/sfx2/source/appl/newhelp.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sfx2.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "newhelp.hxx"
28*b1cdbd2cSJim Jagielski #include <sfx2/sfxuno.hxx>
29*b1cdbd2cSJim Jagielski #include "sfx2/sfxresid.hxx"
30*b1cdbd2cSJim Jagielski #include "helpinterceptor.hxx"
31*b1cdbd2cSJim Jagielski #include "helper.hxx"
32*b1cdbd2cSJim Jagielski #include <sfx2/msgpool.hxx>
33*b1cdbd2cSJim Jagielski #include <sfx2/app.hxx>
34*b1cdbd2cSJim Jagielski #include "sfxtypes.hxx"
35*b1cdbd2cSJim Jagielski #include "panelist.hxx"
36*b1cdbd2cSJim Jagielski #include "sfx2/imgmgr.hxx"
37*b1cdbd2cSJim Jagielski #include "srchdlg.hxx"
38*b1cdbd2cSJim Jagielski #include "sfx2/sfxhelp.hxx"
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski #include "app.hrc"
41*b1cdbd2cSJim Jagielski #include "newhelp.hrc"
42*b1cdbd2cSJim Jagielski #include "helpid.hrc"
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski #include <hash_map>
45*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx>
46*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
47*b1cdbd2cSJim Jagielski #include <comphelper/configurationhelper.hxx>
48*b1cdbd2cSJim Jagielski #include <toolkit/helper/vclunohelper.hxx>
49*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XModifiable.hpp>
50*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XComponentLoader.hpp>
51*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XCloseable.hpp>
52*b1cdbd2cSJim Jagielski #include <com/sun/star/util/CloseVetoException.hpp>
53*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XComponent.hpp>
54*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/DisposedException.hpp>
55*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/PosSize.hpp>
56*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XWindow.hpp>
57*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/Property.hpp>
58*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyValue.hpp>
59*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySetInfo.hpp>
60*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XIndexAccess.hpp>
61*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XTitle.hpp>
62*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XLayoutManager.hpp>
63*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/DispatchResultState.hpp>
64*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XController.hpp>
65*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XDispatch.hpp>
66*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XDispatchProvider.hpp>
67*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XDispatchProviderInterception.hpp>
68*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XFrame.hpp>
69*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_TEXT_XBREAKITERATOR_HPP_
70*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/XBreakIterator.hpp>
71*b1cdbd2cSJim Jagielski #endif
72*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/WordType.hpp>
73*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XComponent.hpp>
74*b1cdbd2cSJim Jagielski #include <com/sun/star/style/XStyle.hpp>
75*b1cdbd2cSJim Jagielski #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
76*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XText.hpp>
77*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XTextCursor.hpp>
78*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XTextDocument.hpp>
79*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XTextRange.hpp>
80*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XTextViewCursor.hpp>
81*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XTextViewCursorSupplier.hpp>
82*b1cdbd2cSJim Jagielski #include <com/sun/star/ucb/CommandAbortedException.hpp>
83*b1cdbd2cSJim Jagielski #include <com/sun/star/util/URL.hpp>
84*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XSearchable.hpp>
85*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XSearchDescriptor.hpp>
86*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XURLTransformer.hpp>
87*b1cdbd2cSJim Jagielski #include <com/sun/star/view/XSelectionSupplier.hpp>
88*b1cdbd2cSJim Jagielski #include <com/sun/star/view/XViewSettingsSupplier.hpp>
89*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/XDockingAreaAcceptor.hpp>
90*b1cdbd2cSJim Jagielski #include <svtools/helpopt.hxx>
91*b1cdbd2cSJim Jagielski #include <unotools/historyoptions.hxx>
92*b1cdbd2cSJim Jagielski #include <svtools/menuoptions.hxx>
93*b1cdbd2cSJim Jagielski #include <unotools/pathoptions.hxx>
94*b1cdbd2cSJim Jagielski #include <unotools/viewoptions.hxx>
95*b1cdbd2cSJim Jagielski #include <svtools/svtdata.hxx>
96*b1cdbd2cSJim Jagielski #include <tools/urlobj.hxx>
97*b1cdbd2cSJim Jagielski #include <tools/cachestr.hxx>
98*b1cdbd2cSJim Jagielski #include <unotools/streamhelper.hxx>
99*b1cdbd2cSJim Jagielski #include <svtools/imagemgr.hxx>
100*b1cdbd2cSJim Jagielski #include <svtools/miscopt.hxx>
101*b1cdbd2cSJim Jagielski #include <svtools/imgdef.hxx>
102*b1cdbd2cSJim Jagielski #include <vcl/unohelp.hxx>
103*b1cdbd2cSJim Jagielski #include <vcl/i18nhelp.hxx>
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski #include <ucbhelper/content.hxx>
106*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
107*b1cdbd2cSJim Jagielski #include <vcl/waitobj.hxx>
108*b1cdbd2cSJim Jagielski #include <unotools/ucbhelper.hxx>
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski #include <sfx2/viewfrm.hxx>
111*b1cdbd2cSJim Jagielski #include <sfx2/objsh.hxx>
112*b1cdbd2cSJim Jagielski #include <sfx2/docfac.hxx>
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski using namespace ::ucbhelper;
115*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::ucb;
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
118*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans;
119*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container;
120*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::frame;
121*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::i18n;
122*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
123*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::style;
124*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::text;
125*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
126*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::util;
127*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::view;
128*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::ui;
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski using namespace ::comphelper;
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski extern void AppendConfigToken_Impl( String& rURL, sal_Bool bQuestionMark ); // sfxhelp.cxx
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski // defines ---------------------------------------------------------------
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski #define SPLITSET_ID			0
137*b1cdbd2cSJim Jagielski #define COLSET_ID			1
138*b1cdbd2cSJim Jagielski #define INDEXWIN_ID			2
139*b1cdbd2cSJim Jagielski #define TEXTWIN_ID			3
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski #define TOOLBOX_OFFSET		3
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski #define TBI_INDEX			1001
144*b1cdbd2cSJim Jagielski #define TBI_BACKWARD		1002
145*b1cdbd2cSJim Jagielski #define TBI_FORWARD			1003
146*b1cdbd2cSJim Jagielski #define TBI_START			1004
147*b1cdbd2cSJim Jagielski #define TBI_PRINT			1005
148*b1cdbd2cSJim Jagielski #define TBI_COPY			1006
149*b1cdbd2cSJim Jagielski #define TBI_BOOKMARKS		1007
150*b1cdbd2cSJim Jagielski #define TBI_SEARCHDIALOG	1008
151*b1cdbd2cSJim Jagielski #define TBI_SOURCEVIEW		1009
152*b1cdbd2cSJim Jagielski #define TBI_SELECTIONMODE   1010
153*b1cdbd2cSJim Jagielski #define TBI_ONSTARTUP		1011
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski #define CONFIGNAME_HELPWIN		DEFINE_CONST_UNICODE("OfficeHelp")
156*b1cdbd2cSJim Jagielski #define CONFIGNAME_INDEXWIN		DEFINE_CONST_UNICODE("OfficeHelpIndex")
157*b1cdbd2cSJim Jagielski #define CONFIGNAME_SEARCHPAGE	DEFINE_CONST_UNICODE("OfficeHelpSearch")
158*b1cdbd2cSJim Jagielski #define IMAGE_URL				DEFINE_CONST_UNICODE("private:factory/")
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski #define PROPERTY_KEYWORDLIST	DEFINE_CONST_OUSTRING("KeywordList")
161*b1cdbd2cSJim Jagielski #define PROPERTY_KEYWORDREF		DEFINE_CONST_OUSTRING("KeywordRef")
162*b1cdbd2cSJim Jagielski #define PROPERTY_ANCHORREF		DEFINE_CONST_OUSTRING("KeywordAnchorForRef")
163*b1cdbd2cSJim Jagielski #define PROPERTY_TITLEREF		DEFINE_CONST_OUSTRING("KeywordTitleForRef")
164*b1cdbd2cSJim Jagielski #define PROPERTY_TITLE			DEFINE_CONST_OUSTRING("Title")
165*b1cdbd2cSJim Jagielski #define HELP_URL				DEFINE_CONST_OUSTRING("vnd.sun.star.help://")
166*b1cdbd2cSJim Jagielski #define HELP_SEARCH_TAG			DEFINE_CONST_OUSTRING("/?Query=")
167*b1cdbd2cSJim Jagielski #define USERITEM_NAME           DEFINE_CONST_OUSTRING("UserItem")
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski #define PACKAGE_SETUP           DEFINE_CONST_OUSTRING("/org.openoffice.Setup")
170*b1cdbd2cSJim Jagielski #define PATH_OFFICE_FACTORIES   DEFINE_CONST_OUSTRING("Office/Factories/")
171*b1cdbd2cSJim Jagielski #define KEY_HELP_ON_OPEN        DEFINE_CONST_OUSTRING("ooSetupFactoryHelpOnOpen")
172*b1cdbd2cSJim Jagielski #define KEY_UI_NAME             DEFINE_CONST_OUSTRING("ooSetupFactoryUIName")
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski #define PARSE_URL( aURL ) \
175*b1cdbd2cSJim Jagielski     Reference < XURLTransformer > xTrans( ::comphelper::getProcessServiceFactory()->createInstance( \
176*b1cdbd2cSJim Jagielski             DEFINE_CONST_UNICODE("com.sun.star.util.URLTransformer" )), UNO_QUERY ); \
177*b1cdbd2cSJim Jagielski     xTrans->parseStrict( aURL )
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski //.........................................................................
180*b1cdbd2cSJim Jagielski namespace sfx2
181*b1cdbd2cSJim Jagielski {
182*b1cdbd2cSJim Jagielski //.........................................................................
183*b1cdbd2cSJim Jagielski 
HandleTaskPaneList(Window * pWindow,sal_Bool bAddToList)184*b1cdbd2cSJim Jagielski 	void HandleTaskPaneList( Window* pWindow, sal_Bool bAddToList )
185*b1cdbd2cSJim Jagielski 	{
186*b1cdbd2cSJim Jagielski 		Window* pParent = pWindow->GetParent();
187*b1cdbd2cSJim Jagielski 		DBG_ASSERT( pParent, "HandleTaskPaneList(): every window here should have a parent" );
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski 		SystemWindow* pSysWin = pParent->GetSystemWindow();
190*b1cdbd2cSJim Jagielski 		if( pSysWin )
191*b1cdbd2cSJim Jagielski 		{
192*b1cdbd2cSJim Jagielski 			TaskPaneList* pTaskPaneList = pSysWin->GetTaskPaneList();
193*b1cdbd2cSJim Jagielski 			if( pTaskPaneList )
194*b1cdbd2cSJim Jagielski 			{
195*b1cdbd2cSJim Jagielski 				if( bAddToList )
196*b1cdbd2cSJim Jagielski 					pTaskPaneList->AddWindow( pWindow );
197*b1cdbd2cSJim Jagielski 				else
198*b1cdbd2cSJim Jagielski 					pTaskPaneList->RemoveWindow( pWindow );
199*b1cdbd2cSJim Jagielski 			}
200*b1cdbd2cSJim Jagielski 		}
201*b1cdbd2cSJim Jagielski 	}
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski 	/** Prepare a search string for searching or selecting.
204*b1cdbd2cSJim Jagielski 		For searching every search word needs the postfix '*' and the delimiter ' ' if necessary.
205*b1cdbd2cSJim Jagielski 		For selecting the delimiter '|' is required to search with regular expressions.
206*b1cdbd2cSJim Jagielski 		Samples:
207*b1cdbd2cSJim Jagielski 		search string | output for searching | output for selecting
208*b1cdbd2cSJim Jagielski 		-----------------------------------------------------------
209*b1cdbd2cSJim Jagielski 		"text"        | "text*"              | "text"
210*b1cdbd2cSJim Jagielski 		"text*"       | "text*"              | "text"
211*b1cdbd2cSJim Jagielski 		"text menu"   | "text* menu*"        | "text|menu"
212*b1cdbd2cSJim Jagielski 	*/
PrepareSearchString(const String & rSearchString,Reference<XBreakIterator> xBreak,bool bForSearch)213*b1cdbd2cSJim Jagielski 	String PrepareSearchString( const String& rSearchString,
214*b1cdbd2cSJim Jagielski 								Reference< XBreakIterator > xBreak, bool bForSearch )
215*b1cdbd2cSJim Jagielski 	{
216*b1cdbd2cSJim Jagielski 		String sSearchStr;
217*b1cdbd2cSJim Jagielski 		sal_Int32 nStartPos = 0;
218*b1cdbd2cSJim Jagielski 		const Locale aLocale = Application::GetSettings().GetUILocale();
219*b1cdbd2cSJim Jagielski 		Boundary aBoundary = xBreak->getWordBoundary(
220*b1cdbd2cSJim Jagielski 			rSearchString, nStartPos, aLocale, WordType::ANYWORD_IGNOREWHITESPACES, sal_True );
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski 		while ( aBoundary.startPos != aBoundary.endPos )
223*b1cdbd2cSJim Jagielski 		{
224*b1cdbd2cSJim Jagielski 			nStartPos = aBoundary.endPos;
225*b1cdbd2cSJim Jagielski 			String sSearchToken( rSearchString.Copy(
226*b1cdbd2cSJim Jagielski 				(sal_uInt16)aBoundary.startPos, (sal_uInt16)aBoundary.endPos - (sal_uInt16)aBoundary.startPos ) );
227*b1cdbd2cSJim Jagielski             if ( sSearchToken.Len() > 0 && ( sSearchToken.Len() > 1 || sSearchToken.GetChar(0) != '.' ) )
228*b1cdbd2cSJim Jagielski             {
229*b1cdbd2cSJim Jagielski                 if ( bForSearch && sSearchToken.GetChar( sSearchToken.Len() - 1 ) != '*' )
230*b1cdbd2cSJim Jagielski                     sSearchToken += '*';
231*b1cdbd2cSJim Jagielski 
232*b1cdbd2cSJim Jagielski                 if ( sSearchToken.Len() > 1 ||
233*b1cdbd2cSJim Jagielski                      ( sSearchToken.Len() > 0 && sSearchToken.GetChar( 0 ) != '*' ) )
234*b1cdbd2cSJim Jagielski                 {
235*b1cdbd2cSJim Jagielski                     if ( sSearchStr.Len() > 0 )
236*b1cdbd2cSJim Jagielski                     {
237*b1cdbd2cSJim Jagielski                         if ( bForSearch )
238*b1cdbd2cSJim Jagielski                             sSearchStr += ' ';
239*b1cdbd2cSJim Jagielski                         else
240*b1cdbd2cSJim Jagielski                             sSearchStr += '|';
241*b1cdbd2cSJim Jagielski                     }
242*b1cdbd2cSJim Jagielski                     sSearchStr += sSearchToken;
243*b1cdbd2cSJim Jagielski                 }
244*b1cdbd2cSJim Jagielski             }
245*b1cdbd2cSJim Jagielski 			aBoundary = xBreak->nextWord( rSearchString, nStartPos,
246*b1cdbd2cSJim Jagielski 										  aLocale, WordType::ANYWORD_IGNOREWHITESPACES );
247*b1cdbd2cSJim Jagielski 		}
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski 		return sSearchStr;
250*b1cdbd2cSJim Jagielski 	}
251*b1cdbd2cSJim Jagielski //.........................................................................
252*b1cdbd2cSJim Jagielski // namespace sfx2
253*b1cdbd2cSJim Jagielski }
254*b1cdbd2cSJim Jagielski //.........................................................................
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski // struct IndexEntry_Impl ------------------------------------------------
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski struct IndexEntry_Impl
259*b1cdbd2cSJim Jagielski {
260*b1cdbd2cSJim Jagielski 	sal_Bool		m_bSubEntry;
261*b1cdbd2cSJim Jagielski 	String			m_aURL;
262*b1cdbd2cSJim Jagielski 
IndexEntry_ImplIndexEntry_Impl263*b1cdbd2cSJim Jagielski 	IndexEntry_Impl( const String& rURL, sal_Bool bSubEntry ) :
264*b1cdbd2cSJim Jagielski 		m_bSubEntry( bSubEntry ), m_aURL( rURL ) {}
265*b1cdbd2cSJim Jagielski };
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski #define NEW_ENTRY( url, bool ) \
268*b1cdbd2cSJim Jagielski 	(void*)(sal_uIntPtr)( new IndexEntry_Impl( url, bool ) )
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski // struct ContentEntry_Impl ----------------------------------------------
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski struct ContentEntry_Impl
273*b1cdbd2cSJim Jagielski {
274*b1cdbd2cSJim Jagielski 	String		aURL;
275*b1cdbd2cSJim Jagielski 	sal_Bool	bIsFolder;
276*b1cdbd2cSJim Jagielski 
ContentEntry_ImplContentEntry_Impl277*b1cdbd2cSJim Jagielski 	ContentEntry_Impl( const String& rURL, sal_Bool bFolder ) :
278*b1cdbd2cSJim Jagielski 		aURL( rURL ), bIsFolder( bFolder ) {}
279*b1cdbd2cSJim Jagielski };
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski // ContentListBox_Impl ---------------------------------------------------
282*b1cdbd2cSJim Jagielski 
ContentListBox_Impl(Window * pParent,const ResId & rResId)283*b1cdbd2cSJim Jagielski ContentListBox_Impl::ContentListBox_Impl( Window* pParent, const ResId& rResId ) :
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski 	SvTreeListBox( pParent, rResId ),
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski 	aOpenBookImage		( SfxResId( IMG_HELP_CONTENT_BOOK_OPEN ) ),
288*b1cdbd2cSJim Jagielski 	aClosedBookImage	( SfxResId( IMG_HELP_CONTENT_BOOK_CLOSED ) ),
289*b1cdbd2cSJim Jagielski 	aDocumentImage		( SfxResId( IMG_HELP_CONTENT_DOC ) )
290*b1cdbd2cSJim Jagielski 
291*b1cdbd2cSJim Jagielski {
292*b1cdbd2cSJim Jagielski     if ( GetSettings().GetStyleSettings().GetHighContrastMode() )
293*b1cdbd2cSJim Jagielski     {
294*b1cdbd2cSJim Jagielski         aOpenBookImage = Image( SfxResId( IMG_HELP_CONTENT_BOOK_OPEN_HC ) );
295*b1cdbd2cSJim Jagielski         aClosedBookImage = Image( SfxResId( IMG_HELP_CONTENT_BOOK_CLOSED_HC ) );
296*b1cdbd2cSJim Jagielski         aDocumentImage = Image( SfxResId( IMG_HELP_CONTENT_DOC_HC ) );
297*b1cdbd2cSJim Jagielski     }
298*b1cdbd2cSJim Jagielski 
299*b1cdbd2cSJim Jagielski 	SetStyle( GetStyle() | WB_HIDESELECTION | WB_HSCROLL );
300*b1cdbd2cSJim Jagielski 
301*b1cdbd2cSJim Jagielski 	SetEntryHeight( 16 );
302*b1cdbd2cSJim Jagielski 	SetSelectionMode( SINGLE_SELECTION );
303*b1cdbd2cSJim Jagielski 	SetSpaceBetweenEntries( 2 );
304*b1cdbd2cSJim Jagielski 	SetNodeBitmaps( aClosedBookImage, aOpenBookImage );
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski 	SetSublistOpenWithReturn();
307*b1cdbd2cSJim Jagielski 	SetSublistOpenWithLeftRight();
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski 	InitRoot();
310*b1cdbd2cSJim Jagielski }
311*b1cdbd2cSJim Jagielski 
312*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
313*b1cdbd2cSJim Jagielski 
~ContentListBox_Impl()314*b1cdbd2cSJim Jagielski ContentListBox_Impl::~ContentListBox_Impl()
315*b1cdbd2cSJim Jagielski {
316*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos = 0;
317*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = GetEntry( nPos++ );
318*b1cdbd2cSJim Jagielski 	while ( pEntry )
319*b1cdbd2cSJim Jagielski 	{
320*b1cdbd2cSJim Jagielski 		::rtl::OUString aTemp( GetEntryText( pEntry ) );
321*b1cdbd2cSJim Jagielski 		ClearChildren( pEntry );
322*b1cdbd2cSJim Jagielski 		delete (ContentEntry_Impl*)pEntry->GetUserData();
323*b1cdbd2cSJim Jagielski 		pEntry = GetEntry( nPos++ );
324*b1cdbd2cSJim Jagielski 	}
325*b1cdbd2cSJim Jagielski }
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
328*b1cdbd2cSJim Jagielski 
InitRoot()329*b1cdbd2cSJim Jagielski void ContentListBox_Impl::InitRoot()
330*b1cdbd2cSJim Jagielski {
331*b1cdbd2cSJim Jagielski 	String aHelpTreeviewURL( DEFINE_CONST_UNICODE("vnd.sun.star.hier://com.sun.star.help.TreeView/") );
332*b1cdbd2cSJim Jagielski 	::com::sun::star::uno::Sequence< ::rtl::OUString > aList =
333*b1cdbd2cSJim Jagielski 		SfxContentHelper::GetHelpTreeViewContents( aHelpTreeviewURL );
334*b1cdbd2cSJim Jagielski 
335*b1cdbd2cSJim Jagielski 	const ::rtl::OUString* pEntries  = aList.getConstArray();
336*b1cdbd2cSJim Jagielski 	sal_uInt32 i, nCount = aList.getLength();
337*b1cdbd2cSJim Jagielski 	for ( i = 0; i < nCount; ++i )
338*b1cdbd2cSJim Jagielski 	{
339*b1cdbd2cSJim Jagielski 		String aRow( pEntries[i] );
340*b1cdbd2cSJim Jagielski 		String aTitle, aURL;
341*b1cdbd2cSJim Jagielski 		xub_StrLen nIdx = 0;
342*b1cdbd2cSJim Jagielski 		aTitle = aRow.GetToken( 0, '\t', nIdx );
343*b1cdbd2cSJim Jagielski 		aURL = aRow.GetToken( 0, '\t', nIdx );
344*b1cdbd2cSJim Jagielski 		sal_Unicode cFolder = aRow.GetToken( 0, '\t', nIdx ).GetChar(0);
345*b1cdbd2cSJim Jagielski 		sal_Bool bIsFolder = ( '1' == cFolder );
346*b1cdbd2cSJim Jagielski 		SvLBoxEntry* pEntry = InsertEntry( aTitle, aOpenBookImage, aClosedBookImage, NULL, sal_True );
347*b1cdbd2cSJim Jagielski 		if ( bIsFolder )
348*b1cdbd2cSJim Jagielski 			pEntry->SetUserData( new ContentEntry_Impl( aURL, sal_True ) );
349*b1cdbd2cSJim Jagielski 	}
350*b1cdbd2cSJim Jagielski }
351*b1cdbd2cSJim Jagielski 
352*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
353*b1cdbd2cSJim Jagielski 
ClearChildren(SvLBoxEntry * pParent)354*b1cdbd2cSJim Jagielski void ContentListBox_Impl::ClearChildren( SvLBoxEntry* pParent )
355*b1cdbd2cSJim Jagielski {
356*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = FirstChild( pParent );
357*b1cdbd2cSJim Jagielski 	while ( pEntry )
358*b1cdbd2cSJim Jagielski 	{
359*b1cdbd2cSJim Jagielski 		::rtl::OUString aTemp( GetEntryText( pEntry ) );
360*b1cdbd2cSJim Jagielski 		ClearChildren( pEntry );
361*b1cdbd2cSJim Jagielski 		delete (ContentEntry_Impl*)pEntry->GetUserData();
362*b1cdbd2cSJim Jagielski 		pEntry = NextSibling( pEntry );
363*b1cdbd2cSJim Jagielski 	}
364*b1cdbd2cSJim Jagielski }
365*b1cdbd2cSJim Jagielski 
366*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
367*b1cdbd2cSJim Jagielski 
RequestingChilds(SvLBoxEntry * pParent)368*b1cdbd2cSJim Jagielski void ContentListBox_Impl::RequestingChilds( SvLBoxEntry* pParent )
369*b1cdbd2cSJim Jagielski {
370*b1cdbd2cSJim Jagielski 	try
371*b1cdbd2cSJim Jagielski 	{
372*b1cdbd2cSJim Jagielski 		if ( !pParent->HasChilds() )
373*b1cdbd2cSJim Jagielski 		{
374*b1cdbd2cSJim Jagielski 			if ( pParent->GetUserData() )
375*b1cdbd2cSJim Jagielski 			{
376*b1cdbd2cSJim Jagielski 				String aTmpURL( ( (ContentEntry_Impl*)pParent->GetUserData()  )->aURL );
377*b1cdbd2cSJim Jagielski 				::com::sun::star::uno::Sequence< ::rtl::OUString > aList =
378*b1cdbd2cSJim Jagielski 					SfxContentHelper::GetHelpTreeViewContents( aTmpURL );
379*b1cdbd2cSJim Jagielski 
380*b1cdbd2cSJim Jagielski 				const ::rtl::OUString* pEntries  = aList.getConstArray();
381*b1cdbd2cSJim Jagielski 				sal_uInt32 i, nCount = aList.getLength();
382*b1cdbd2cSJim Jagielski 				for ( i = 0; i < nCount; ++i )
383*b1cdbd2cSJim Jagielski 				{
384*b1cdbd2cSJim Jagielski 					String aRow( pEntries[i] );
385*b1cdbd2cSJim Jagielski 					String aTitle, aURL;
386*b1cdbd2cSJim Jagielski 					xub_StrLen nIdx = 0;
387*b1cdbd2cSJim Jagielski 					aTitle = aRow.GetToken( 0, '\t', nIdx );
388*b1cdbd2cSJim Jagielski 					aURL = aRow.GetToken( 0, '\t', nIdx );
389*b1cdbd2cSJim Jagielski 					sal_Unicode cFolder = aRow.GetToken( 0, '\t', nIdx ).GetChar(0);
390*b1cdbd2cSJim Jagielski 					sal_Bool bIsFolder = ( '1' == cFolder );
391*b1cdbd2cSJim Jagielski 					SvLBoxEntry* pEntry = NULL;
392*b1cdbd2cSJim Jagielski 					if ( bIsFolder )
393*b1cdbd2cSJim Jagielski 					{
394*b1cdbd2cSJim Jagielski                         pEntry = InsertEntry( aTitle, aOpenBookImage, aClosedBookImage, pParent, sal_True );
395*b1cdbd2cSJim Jagielski 						pEntry->SetUserData( new ContentEntry_Impl( aURL, sal_True ) );
396*b1cdbd2cSJim Jagielski 					}
397*b1cdbd2cSJim Jagielski 					else
398*b1cdbd2cSJim Jagielski 					{
399*b1cdbd2cSJim Jagielski 						pEntry = InsertEntry( aTitle, aDocumentImage, aDocumentImage, pParent );
400*b1cdbd2cSJim Jagielski                     	Any aAny( ::utl::UCBContentHelper::GetProperty( aURL, String(RTL_CONSTASCII_USTRINGPARAM("TargetURL" ) ) ) );
401*b1cdbd2cSJim Jagielski 						rtl::OUString aTargetURL;
402*b1cdbd2cSJim Jagielski 						if ( aAny >>=  aTargetURL )
403*b1cdbd2cSJim Jagielski 							pEntry->SetUserData( new ContentEntry_Impl( aTargetURL, sal_False ) );
404*b1cdbd2cSJim Jagielski 					}
405*b1cdbd2cSJim Jagielski 				}
406*b1cdbd2cSJim Jagielski 			}
407*b1cdbd2cSJim Jagielski 		}
408*b1cdbd2cSJim Jagielski 	}
409*b1cdbd2cSJim Jagielski 	catch( Exception& )
410*b1cdbd2cSJim Jagielski 	{
411*b1cdbd2cSJim Jagielski 		DBG_ERROR( "ContentListBox_Impl::RequestingChilds(): unexpected exception" );
412*b1cdbd2cSJim Jagielski 	}
413*b1cdbd2cSJim Jagielski }
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
416*b1cdbd2cSJim Jagielski 
Notify(NotifyEvent & rNEvt)417*b1cdbd2cSJim Jagielski long ContentListBox_Impl::Notify( NotifyEvent& rNEvt )
418*b1cdbd2cSJim Jagielski {
419*b1cdbd2cSJim Jagielski 	sal_Bool bHandled = sal_False;
420*b1cdbd2cSJim Jagielski 	if ( rNEvt.GetType() == EVENT_KEYINPUT &&
421*b1cdbd2cSJim Jagielski 		 KEY_RETURN == rNEvt.GetKeyEvent()->GetKeyCode().GetCode() )
422*b1cdbd2cSJim Jagielski 	{
423*b1cdbd2cSJim Jagielski 		GetDoubleClickHdl().Call( NULL );
424*b1cdbd2cSJim Jagielski 		bHandled = sal_True;
425*b1cdbd2cSJim Jagielski 	}
426*b1cdbd2cSJim Jagielski 
427*b1cdbd2cSJim Jagielski 	return bHandled ? 1 : SvTreeListBox::Notify( rNEvt );
428*b1cdbd2cSJim Jagielski }
429*b1cdbd2cSJim Jagielski 
430*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
431*b1cdbd2cSJim Jagielski 
GetSelectEntry() const432*b1cdbd2cSJim Jagielski String ContentListBox_Impl::GetSelectEntry() const
433*b1cdbd2cSJim Jagielski {
434*b1cdbd2cSJim Jagielski 	String aRet;
435*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = FirstSelected();
436*b1cdbd2cSJim Jagielski 	if ( pEntry && !( (ContentEntry_Impl*)pEntry->GetUserData()  )->bIsFolder )
437*b1cdbd2cSJim Jagielski 		aRet = ( (ContentEntry_Impl*)pEntry->GetUserData() )->aURL;
438*b1cdbd2cSJim Jagielski 	return aRet;
439*b1cdbd2cSJim Jagielski }
440*b1cdbd2cSJim Jagielski 
441*b1cdbd2cSJim Jagielski // class HelpTabPage_Impl ------------------------------------------------
442*b1cdbd2cSJim Jagielski 
HelpTabPage_Impl(Window * pParent,SfxHelpIndexWindow_Impl * _pIdxWin,const ResId & rResId)443*b1cdbd2cSJim Jagielski HelpTabPage_Impl::HelpTabPage_Impl(
444*b1cdbd2cSJim Jagielski 	Window* pParent, SfxHelpIndexWindow_Impl* _pIdxWin, const ResId& rResId ) :
445*b1cdbd2cSJim Jagielski 
446*b1cdbd2cSJim Jagielski 	TabPage( pParent, rResId ),
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski 	m_pIdxWin( _pIdxWin )
449*b1cdbd2cSJim Jagielski 
450*b1cdbd2cSJim Jagielski {
451*b1cdbd2cSJim Jagielski }
452*b1cdbd2cSJim Jagielski 
453*b1cdbd2cSJim Jagielski // class ContentTabPage_Impl ---------------------------------------------
454*b1cdbd2cSJim Jagielski 
ContentTabPage_Impl(Window * pParent,SfxHelpIndexWindow_Impl * _pIdxWin)455*b1cdbd2cSJim Jagielski ContentTabPage_Impl::ContentTabPage_Impl( Window* pParent, SfxHelpIndexWindow_Impl* _pIdxWin ) :
456*b1cdbd2cSJim Jagielski 
457*b1cdbd2cSJim Jagielski 	HelpTabPage_Impl( pParent, _pIdxWin, SfxResId( TP_HELP_CONTENT ) ),
458*b1cdbd2cSJim Jagielski 
459*b1cdbd2cSJim Jagielski 	aContentBox( this, SfxResId( LB_CONTENTS ) )
460*b1cdbd2cSJim Jagielski 
461*b1cdbd2cSJim Jagielski {
462*b1cdbd2cSJim Jagielski 	FreeResource();
463*b1cdbd2cSJim Jagielski 
464*b1cdbd2cSJim Jagielski 	aContentBox.Show();
465*b1cdbd2cSJim Jagielski }
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
468*b1cdbd2cSJim Jagielski 
Resize()469*b1cdbd2cSJim Jagielski void ContentTabPage_Impl::Resize()
470*b1cdbd2cSJim Jagielski {
471*b1cdbd2cSJim Jagielski 	Size aSize = GetOutputSizePixel();
472*b1cdbd2cSJim Jagielski 	aSize.Width() -= 8;
473*b1cdbd2cSJim Jagielski 	aSize.Height() -= 8;
474*b1cdbd2cSJim Jagielski 	aContentBox.SetPosSizePixel( Point( 4, 4 ), aSize );
475*b1cdbd2cSJim Jagielski }
476*b1cdbd2cSJim Jagielski 
477*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
478*b1cdbd2cSJim Jagielski 
ActivatePage()479*b1cdbd2cSJim Jagielski void ContentTabPage_Impl::ActivatePage()
480*b1cdbd2cSJim Jagielski {
481*b1cdbd2cSJim Jagielski     if ( !m_pIdxWin->WasCursorLeftOrRight() )
482*b1cdbd2cSJim Jagielski         SetFocusOnBox();
483*b1cdbd2cSJim Jagielski }
484*b1cdbd2cSJim Jagielski 
485*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
486*b1cdbd2cSJim Jagielski 
GetLastFocusControl()487*b1cdbd2cSJim Jagielski Control* ContentTabPage_Impl::GetLastFocusControl()
488*b1cdbd2cSJim Jagielski {
489*b1cdbd2cSJim Jagielski 	return &aContentBox;
490*b1cdbd2cSJim Jagielski }
491*b1cdbd2cSJim Jagielski 
492*b1cdbd2cSJim Jagielski // class IndexBox_Impl ---------------------------------------------------
493*b1cdbd2cSJim Jagielski 
IndexBox_Impl(Window * pParent,const ResId & rResId)494*b1cdbd2cSJim Jagielski IndexBox_Impl::IndexBox_Impl( Window* pParent, const ResId& rResId ) :
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski 	ComboBox( pParent, rResId )
497*b1cdbd2cSJim Jagielski 
498*b1cdbd2cSJim Jagielski {
499*b1cdbd2cSJim Jagielski 	EnableAutocomplete( sal_True );
500*b1cdbd2cSJim Jagielski     EnableUserDraw( sal_True );
501*b1cdbd2cSJim Jagielski }
502*b1cdbd2cSJim Jagielski 
503*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
504*b1cdbd2cSJim Jagielski 
UserDraw(const UserDrawEvent & rUDEvt)505*b1cdbd2cSJim Jagielski void IndexBox_Impl::UserDraw( const UserDrawEvent& rUDEvt )
506*b1cdbd2cSJim Jagielski {
507*b1cdbd2cSJim Jagielski 	IndexEntry_Impl* pEntry = (IndexEntry_Impl*)(sal_uIntPtr)GetEntryData( rUDEvt.GetItemId() );
508*b1cdbd2cSJim Jagielski 	if ( pEntry && pEntry->m_bSubEntry )
509*b1cdbd2cSJim Jagielski 	{
510*b1cdbd2cSJim Jagielski 		// indent sub entries
511*b1cdbd2cSJim Jagielski 		Point aPos( rUDEvt.GetRect().TopLeft() );
512*b1cdbd2cSJim Jagielski 		aPos.X() += 8;
513*b1cdbd2cSJim Jagielski 		aPos.Y() += ( rUDEvt.GetRect().GetHeight() - rUDEvt.GetDevice()->GetTextHeight() ) / 2;
514*b1cdbd2cSJim Jagielski 		String aEntry( GetEntry( rUDEvt.GetItemId() ) );
515*b1cdbd2cSJim Jagielski 		sal_uInt16 nPos = aEntry.Search( ';' );
516*b1cdbd2cSJim Jagielski 		rUDEvt.GetDevice()->DrawText( aPos, ( nPos != STRING_NOTFOUND ) ? aEntry.Copy( nPos + 1 ) : aEntry );
517*b1cdbd2cSJim Jagielski 	}
518*b1cdbd2cSJim Jagielski 	else
519*b1cdbd2cSJim Jagielski 		DrawEntry( rUDEvt, sal_False, sal_True, sal_True );
520*b1cdbd2cSJim Jagielski }
521*b1cdbd2cSJim Jagielski 
522*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
523*b1cdbd2cSJim Jagielski 
Notify(NotifyEvent & rNEvt)524*b1cdbd2cSJim Jagielski long IndexBox_Impl::Notify( NotifyEvent& rNEvt )
525*b1cdbd2cSJim Jagielski {
526*b1cdbd2cSJim Jagielski 	sal_Bool bHandled = sal_False;
527*b1cdbd2cSJim Jagielski 	if ( rNEvt.GetType() == EVENT_KEYINPUT &&
528*b1cdbd2cSJim Jagielski 		 KEY_RETURN == rNEvt.GetKeyEvent()->GetKeyCode().GetCode() )
529*b1cdbd2cSJim Jagielski 	{
530*b1cdbd2cSJim Jagielski 		GetDoubleClickHdl().Call( NULL );
531*b1cdbd2cSJim Jagielski 		bHandled = sal_True;
532*b1cdbd2cSJim Jagielski 	}
533*b1cdbd2cSJim Jagielski 
534*b1cdbd2cSJim Jagielski 	return bHandled ? 1 : ComboBox::Notify( rNEvt );
535*b1cdbd2cSJim Jagielski }
536*b1cdbd2cSJim Jagielski 
537*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
538*b1cdbd2cSJim Jagielski 
SelectExecutableEntry()539*b1cdbd2cSJim Jagielski void IndexBox_Impl::SelectExecutableEntry()
540*b1cdbd2cSJim Jagielski {
541*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos = GetEntryPos( GetText() );
542*b1cdbd2cSJim Jagielski 	if ( nPos != COMBOBOX_ENTRY_NOTFOUND )
543*b1cdbd2cSJim Jagielski 	{
544*b1cdbd2cSJim Jagielski 		sal_uInt16 nOldPos = nPos;
545*b1cdbd2cSJim Jagielski 		String aEntryText;
546*b1cdbd2cSJim Jagielski 		IndexEntry_Impl* pEntry = (IndexEntry_Impl*)(sal_uIntPtr)GetEntryData( nPos );
547*b1cdbd2cSJim Jagielski 		sal_uInt16 nCount = GetEntryCount();
548*b1cdbd2cSJim Jagielski 		while ( nPos < nCount && ( !pEntry || pEntry->m_aURL.Len() == 0 ) )
549*b1cdbd2cSJim Jagielski 		{
550*b1cdbd2cSJim Jagielski 			pEntry = (IndexEntry_Impl*)(sal_uIntPtr)GetEntryData( ++nPos );
551*b1cdbd2cSJim Jagielski 			aEntryText = GetEntry( nPos );
552*b1cdbd2cSJim Jagielski 		}
553*b1cdbd2cSJim Jagielski 
554*b1cdbd2cSJim Jagielski 		if ( nOldPos != nPos )
555*b1cdbd2cSJim Jagielski 			SetText( aEntryText );
556*b1cdbd2cSJim Jagielski 	}
557*b1cdbd2cSJim Jagielski }
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski // class IndexTabPage_Impl -----------------------------------------------
560*b1cdbd2cSJim Jagielski 
IndexTabPage_Impl(Window * pParent,SfxHelpIndexWindow_Impl * _pIdxWin)561*b1cdbd2cSJim Jagielski IndexTabPage_Impl::IndexTabPage_Impl( Window* pParent, SfxHelpIndexWindow_Impl* _pIdxWin ) :
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski 	HelpTabPage_Impl( pParent, _pIdxWin, SfxResId( TP_HELP_INDEX ) ),
564*b1cdbd2cSJim Jagielski 
565*b1cdbd2cSJim Jagielski 	aExpressionFT	( this, SfxResId( FT_EXPRESSION ) ),
566*b1cdbd2cSJim Jagielski 	aIndexCB		( this, SfxResId( CB_INDEX ) ),
567*b1cdbd2cSJim Jagielski 	aOpenBtn		( this, SfxResId( PB_OPEN_INDEX ) ),
568*b1cdbd2cSJim Jagielski 
569*b1cdbd2cSJim Jagielski     bIsActivated    ( sal_False )
570*b1cdbd2cSJim Jagielski 
571*b1cdbd2cSJim Jagielski {
572*b1cdbd2cSJim Jagielski 	FreeResource();
573*b1cdbd2cSJim Jagielski 
574*b1cdbd2cSJim Jagielski 	aOpenBtn.SetClickHdl( LINK( this, IndexTabPage_Impl, OpenHdl ) );
575*b1cdbd2cSJim Jagielski 	Link aTimeoutLink = LINK( this, IndexTabPage_Impl, TimeoutHdl );
576*b1cdbd2cSJim Jagielski 	aFactoryTimer.SetTimeoutHdl( aTimeoutLink );
577*b1cdbd2cSJim Jagielski 	aFactoryTimer.SetTimeout( 300 );
578*b1cdbd2cSJim Jagielski 	aKeywordTimer.SetTimeoutHdl( aTimeoutLink );
579*b1cdbd2cSJim Jagielski 	aFactoryTimer.SetTimeout( 300 );
580*b1cdbd2cSJim Jagielski 
581*b1cdbd2cSJim Jagielski 	nMinWidth = aOpenBtn.GetSizePixel().Width();
582*b1cdbd2cSJim Jagielski }
583*b1cdbd2cSJim Jagielski 
584*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
585*b1cdbd2cSJim Jagielski 
~IndexTabPage_Impl()586*b1cdbd2cSJim Jagielski IndexTabPage_Impl::~IndexTabPage_Impl()
587*b1cdbd2cSJim Jagielski {
588*b1cdbd2cSJim Jagielski 	ClearIndex();
589*b1cdbd2cSJim Jagielski }
590*b1cdbd2cSJim Jagielski 
591*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
592*b1cdbd2cSJim Jagielski 
593*b1cdbd2cSJim Jagielski namespace sfx2 {
594*b1cdbd2cSJim Jagielski 
595*b1cdbd2cSJim Jagielski 	struct equalOUString
596*b1cdbd2cSJim Jagielski 	{
operator ()sfx2::equalOUString597*b1cdbd2cSJim Jagielski 		bool operator()( const ::rtl::OUString& rKey1, const ::rtl::OUString& rKey2 ) const
598*b1cdbd2cSJim Jagielski 		{
599*b1cdbd2cSJim Jagielski 			return !!( rKey1 == rKey2 );
600*b1cdbd2cSJim Jagielski 		}
601*b1cdbd2cSJim Jagielski 	};
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski 
604*b1cdbd2cSJim Jagielski 	struct hashOUString
605*b1cdbd2cSJim Jagielski 	{
operator ()sfx2::hashOUString606*b1cdbd2cSJim Jagielski 		size_t operator()( const ::rtl::OUString& rName ) const
607*b1cdbd2cSJim Jagielski 		{
608*b1cdbd2cSJim Jagielski 			return rName.hashCode();
609*b1cdbd2cSJim Jagielski 		}
610*b1cdbd2cSJim Jagielski 	};
611*b1cdbd2cSJim Jagielski 
612*b1cdbd2cSJim Jagielski 	typedef ::std::hash_map< ::rtl::OUString, int, hashOUString, equalOUString > KeywordInfo;
613*b1cdbd2cSJim Jagielski }
614*b1cdbd2cSJim Jagielski 
615*b1cdbd2cSJim Jagielski #define UNIFY_AND_INSERT_TOKEN( aToken )															\
616*b1cdbd2cSJim Jagielski     it =																							\
617*b1cdbd2cSJim Jagielski     aInfo.insert( sfx2::KeywordInfo::value_type( aToken, 0 ) ).first;								\
618*b1cdbd2cSJim Jagielski     if ( ( tmp = it->second++ ) != 0 )																\
619*b1cdbd2cSJim Jagielski        nPos = aIndexCB.InsertEntry( aToken + rtl::OUString( append, tmp ) );						\
620*b1cdbd2cSJim Jagielski     else																							\
621*b1cdbd2cSJim Jagielski        nPos = aIndexCB.InsertEntry( aToken )
622*b1cdbd2cSJim Jagielski 
623*b1cdbd2cSJim Jagielski #define INSERT_DATA( j )																			\
624*b1cdbd2cSJim Jagielski 	if ( aAnchorList[j].getLength() > 0 )															\
625*b1cdbd2cSJim Jagielski 	{																								\
626*b1cdbd2cSJim Jagielski 		aData.append( aRefList[j] ).append( sal_Unicode('#') ).append( aAnchorList[j] );			\
627*b1cdbd2cSJim Jagielski 		aIndexCB.SetEntryData( nPos, NEW_ENTRY( aData.makeStringAndClear(), insert ) );				\
628*b1cdbd2cSJim Jagielski 	}																								\
629*b1cdbd2cSJim Jagielski 	else																							\
630*b1cdbd2cSJim Jagielski 		aIndexCB.SetEntryData( nPos, NEW_ENTRY( aRefList[j], insert ) );
631*b1cdbd2cSJim Jagielski 
632*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
633*b1cdbd2cSJim Jagielski 
InitializeIndex()634*b1cdbd2cSJim Jagielski void IndexTabPage_Impl::InitializeIndex()
635*b1cdbd2cSJim Jagielski {
636*b1cdbd2cSJim Jagielski 	WaitObject( this );
637*b1cdbd2cSJim Jagielski 
638*b1cdbd2cSJim Jagielski 	// By now more than 256 equal entries are not allowed
639*b1cdbd2cSJim Jagielski 	sal_Unicode append[256];
640*b1cdbd2cSJim Jagielski 	for( int k = 0; k < 256; ++k )
641*b1cdbd2cSJim Jagielski 		append[k] = sal_Unicode( ' ' );
642*b1cdbd2cSJim Jagielski 
643*b1cdbd2cSJim Jagielski 	sfx2::KeywordInfo aInfo;
644*b1cdbd2cSJim Jagielski 	aIndexCB.SetUpdateMode( sal_False );
645*b1cdbd2cSJim Jagielski 
646*b1cdbd2cSJim Jagielski 	try
647*b1cdbd2cSJim Jagielski 	{
648*b1cdbd2cSJim Jagielski 		::rtl::OUString aURL = HELP_URL;
649*b1cdbd2cSJim Jagielski 		aURL += ::rtl::OUString( sFactory );
650*b1cdbd2cSJim Jagielski 
651*b1cdbd2cSJim Jagielski 		String aTemp = aURL;
652*b1cdbd2cSJim Jagielski 		AppendConfigToken_Impl( aTemp, sal_True );
653*b1cdbd2cSJim Jagielski 		aURL = aTemp;
654*b1cdbd2cSJim Jagielski 
655*b1cdbd2cSJim Jagielski 		Content aCnt( aURL, Reference< ::com::sun::star::ucb::XCommandEnvironment > () );
656*b1cdbd2cSJim Jagielski 		::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > xInfo = aCnt.getProperties();
657*b1cdbd2cSJim Jagielski 		if ( xInfo->hasPropertyByName( PROPERTY_ANCHORREF ) )
658*b1cdbd2cSJim Jagielski 		{
659*b1cdbd2cSJim Jagielski 			::com::sun::star::uno::Sequence< ::rtl::OUString > aPropSeq( 4 );
660*b1cdbd2cSJim Jagielski 			aPropSeq[0] = PROPERTY_KEYWORDLIST;
661*b1cdbd2cSJim Jagielski 			aPropSeq[1] = PROPERTY_KEYWORDREF;
662*b1cdbd2cSJim Jagielski 			aPropSeq[2] = PROPERTY_ANCHORREF;
663*b1cdbd2cSJim Jagielski 			aPropSeq[3] = PROPERTY_TITLEREF;
664*b1cdbd2cSJim Jagielski 
665*b1cdbd2cSJim Jagielski 			// abi: use one possibly remote call only
666*b1cdbd2cSJim Jagielski 			::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > aAnySeq =
667*b1cdbd2cSJim Jagielski 				  aCnt.getPropertyValues( aPropSeq );
668*b1cdbd2cSJim Jagielski 
669*b1cdbd2cSJim Jagielski 			::com::sun::star::uno::Sequence< ::rtl::OUString > aKeywordList;
670*b1cdbd2cSJim Jagielski 			::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::rtl::OUString > > aKeywordRefList;
671*b1cdbd2cSJim Jagielski 			::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::rtl::OUString > > aAnchorRefList;
672*b1cdbd2cSJim Jagielski 			::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::rtl::OUString > > aTitleRefList;
673*b1cdbd2cSJim Jagielski 
674*b1cdbd2cSJim Jagielski 			if ( ( aAnySeq[0] >>= aKeywordList ) && ( aAnySeq[1] >>= aKeywordRefList ) &&
675*b1cdbd2cSJim Jagielski 				 ( aAnySeq[2] >>= aAnchorRefList ) && ( aAnySeq[3] >>= aTitleRefList ) )
676*b1cdbd2cSJim Jagielski 			{
677*b1cdbd2cSJim Jagielski 				sal_Bool insert;
678*b1cdbd2cSJim Jagielski 				sal_uInt16 nPos;
679*b1cdbd2cSJim Jagielski 				int ndx,tmp;
680*b1cdbd2cSJim Jagielski 				::rtl::OUString aIndex, aTempString;
681*b1cdbd2cSJim Jagielski 				::rtl::OUStringBuffer aData( 128 );            // Capacity of up to 128 characters
682*b1cdbd2cSJim Jagielski 				sfx2::KeywordInfo::iterator it;
683*b1cdbd2cSJim Jagielski 
684*b1cdbd2cSJim Jagielski 				for ( int i = 0; i < aKeywordList.getLength(); ++i )
685*b1cdbd2cSJim Jagielski 				{
686*b1cdbd2cSJim Jagielski 					// abi: Do not copy, but use references
687*b1cdbd2cSJim Jagielski 					const ::rtl::OUString& aKeywordPair = aKeywordList[i];
688*b1cdbd2cSJim Jagielski 					DBG_ASSERT( aKeywordPair.getLength() > 0, "invalid help index" );
689*b1cdbd2cSJim Jagielski 					const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aRefList = aKeywordRefList[i];
690*b1cdbd2cSJim Jagielski 					const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aAnchorList = aAnchorRefList[i];
691*b1cdbd2cSJim Jagielski 					const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aTitleList = aTitleRefList[i];
692*b1cdbd2cSJim Jagielski 
693*b1cdbd2cSJim Jagielski 					DBG_ASSERT( aRefList.getLength() == aAnchorList.getLength(),"reference list and title list of different length" );
694*b1cdbd2cSJim Jagielski 
695*b1cdbd2cSJim Jagielski 					insert = ( ( ndx = aKeywordPair.indexOf( sal_Unicode( ';' ) ) ) == -1 ? sal_False : sal_True );
696*b1cdbd2cSJim Jagielski 
697*b1cdbd2cSJim Jagielski 					if ( insert )
698*b1cdbd2cSJim Jagielski 					{
699*b1cdbd2cSJim Jagielski 						aTempString = aKeywordPair.copy( 0, ndx );
700*b1cdbd2cSJim Jagielski 						if ( aIndex != aTempString )
701*b1cdbd2cSJim Jagielski 						{
702*b1cdbd2cSJim Jagielski 							aIndex = aTempString;
703*b1cdbd2cSJim Jagielski 							UNIFY_AND_INSERT_TOKEN( aTempString );
704*b1cdbd2cSJim Jagielski 						}
705*b1cdbd2cSJim Jagielski 					}
706*b1cdbd2cSJim Jagielski 					else
707*b1cdbd2cSJim Jagielski 						aIndex = ::rtl::OUString();
708*b1cdbd2cSJim Jagielski 
709*b1cdbd2cSJim Jagielski 					// Assume the token is trimed
710*b1cdbd2cSJim Jagielski 					UNIFY_AND_INSERT_TOKEN( aKeywordPair );
711*b1cdbd2cSJim Jagielski 
712*b1cdbd2cSJim Jagielski 					sal_uInt32 nRefListLen = aRefList.getLength();
713*b1cdbd2cSJim Jagielski 
714*b1cdbd2cSJim Jagielski 					DBG_ASSERT( aAnchorList.getLength(), "*IndexTabPage_Impl::InitializeIndex(): AnchorList is empty!" );			\
715*b1cdbd2cSJim Jagielski 					DBG_ASSERT( nRefListLen, "*IndexTabPage_Impl::InitializeIndex(): RefList is empty!" );			\
716*b1cdbd2cSJim Jagielski 
717*b1cdbd2cSJim Jagielski 					if ( aAnchorList.getLength() && nRefListLen )
718*b1cdbd2cSJim Jagielski 					{
719*b1cdbd2cSJim Jagielski 						INSERT_DATA( 0 );
720*b1cdbd2cSJim Jagielski 					}
721*b1cdbd2cSJim Jagielski 
722*b1cdbd2cSJim Jagielski 					for ( sal_uInt32 j = 1; j < nRefListLen ; ++j )
723*b1cdbd2cSJim Jagielski 					{
724*b1cdbd2cSJim Jagielski 						aData
725*b1cdbd2cSJim Jagielski 							.append( aKeywordPair )
726*b1cdbd2cSJim Jagielski 							.append( sal_Unicode(' ') )
727*b1cdbd2cSJim Jagielski 							.append( sal_Unicode('-') )
728*b1cdbd2cSJim Jagielski 							.append( sal_Unicode(' ') )
729*b1cdbd2cSJim Jagielski 							.append( aTitleList[j] );
730*b1cdbd2cSJim Jagielski 
731*b1cdbd2cSJim Jagielski 						aTempString = aData.makeStringAndClear();
732*b1cdbd2cSJim Jagielski 						UNIFY_AND_INSERT_TOKEN( aTempString );
733*b1cdbd2cSJim Jagielski 						INSERT_DATA( j );
734*b1cdbd2cSJim Jagielski 					}
735*b1cdbd2cSJim Jagielski 				}
736*b1cdbd2cSJim Jagielski 			}
737*b1cdbd2cSJim Jagielski 		}
738*b1cdbd2cSJim Jagielski 	}
739*b1cdbd2cSJim Jagielski 	catch( Exception& )
740*b1cdbd2cSJim Jagielski 	{
741*b1cdbd2cSJim Jagielski 		DBG_ERROR( "IndexTabPage_Impl::InitializeIndex(): unexpected exception" );
742*b1cdbd2cSJim Jagielski 	}
743*b1cdbd2cSJim Jagielski 
744*b1cdbd2cSJim Jagielski 	aIndexCB.SetUpdateMode( sal_True );
745*b1cdbd2cSJim Jagielski 
746*b1cdbd2cSJim Jagielski 	if ( sKeyword.Len() > 0 )
747*b1cdbd2cSJim Jagielski 		aKeywordLink.Call( this );
748*b1cdbd2cSJim Jagielski }
749*b1cdbd2cSJim Jagielski 
750*b1cdbd2cSJim Jagielski #undef INSERT_DATA
751*b1cdbd2cSJim Jagielski #undef UNIFY_AND_INSERT_TOKEN
752*b1cdbd2cSJim Jagielski 
753*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
754*b1cdbd2cSJim Jagielski 
ClearIndex()755*b1cdbd2cSJim Jagielski void IndexTabPage_Impl::ClearIndex()
756*b1cdbd2cSJim Jagielski {
757*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = aIndexCB.GetEntryCount();
758*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 i = 0; i < nCount; ++i )
759*b1cdbd2cSJim Jagielski 		delete (IndexEntry_Impl*)(sal_uIntPtr)aIndexCB.GetEntryData(i);
760*b1cdbd2cSJim Jagielski 	aIndexCB.Clear();
761*b1cdbd2cSJim Jagielski }
762*b1cdbd2cSJim Jagielski 
763*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
764*b1cdbd2cSJim Jagielski 
IMPL_LINK(IndexTabPage_Impl,OpenHdl,PushButton *,EMPTYARG)765*b1cdbd2cSJim Jagielski IMPL_LINK( IndexTabPage_Impl, OpenHdl, PushButton*, EMPTYARG )
766*b1cdbd2cSJim Jagielski {
767*b1cdbd2cSJim Jagielski 	aIndexCB.GetDoubleClickHdl().Call( &aIndexCB );
768*b1cdbd2cSJim Jagielski 	return 0;
769*b1cdbd2cSJim Jagielski }
770*b1cdbd2cSJim Jagielski 
771*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
772*b1cdbd2cSJim Jagielski 
IMPL_LINK(IndexTabPage_Impl,TimeoutHdl,Timer *,pTimer)773*b1cdbd2cSJim Jagielski IMPL_LINK( IndexTabPage_Impl, TimeoutHdl, Timer*, pTimer )
774*b1cdbd2cSJim Jagielski {
775*b1cdbd2cSJim Jagielski 	if ( &aFactoryTimer == pTimer )
776*b1cdbd2cSJim Jagielski 		InitializeIndex();
777*b1cdbd2cSJim Jagielski 	else if ( &aKeywordTimer == pTimer && sKeyword.Len() > 0 )
778*b1cdbd2cSJim Jagielski 		aKeywordLink.Call( this );
779*b1cdbd2cSJim Jagielski 	return 0;
780*b1cdbd2cSJim Jagielski }
781*b1cdbd2cSJim Jagielski 
782*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
783*b1cdbd2cSJim Jagielski 
Resize()784*b1cdbd2cSJim Jagielski void IndexTabPage_Impl::Resize()
785*b1cdbd2cSJim Jagielski {
786*b1cdbd2cSJim Jagielski 	Size aSize = GetSizePixel();
787*b1cdbd2cSJim Jagielski 	if ( aSize.Width() < nMinWidth )
788*b1cdbd2cSJim Jagielski 		aSize.Width() = nMinWidth;
789*b1cdbd2cSJim Jagielski 	Point aPnt = aExpressionFT.GetPosPixel();
790*b1cdbd2cSJim Jagielski 	Size aNewSize = aExpressionFT.GetSizePixel();
791*b1cdbd2cSJim Jagielski 	aNewSize.Width() = aSize.Width() - ( aPnt.X() * 2 );
792*b1cdbd2cSJim Jagielski 	aExpressionFT.SetSizePixel( aNewSize );
793*b1cdbd2cSJim Jagielski 
794*b1cdbd2cSJim Jagielski 	Size a6Size = LogicToPixel( Size( 6, 6 ), MAP_APPFONT );
795*b1cdbd2cSJim Jagielski 	Size aBtnSize = aOpenBtn.GetSizePixel();
796*b1cdbd2cSJim Jagielski 
797*b1cdbd2cSJim Jagielski 	aPnt = aIndexCB.GetPosPixel();
798*b1cdbd2cSJim Jagielski 	aNewSize = aIndexCB.GetSizePixel();
799*b1cdbd2cSJim Jagielski 	aNewSize.Width() = aSize.Width() - ( aPnt.X() * 2 );
800*b1cdbd2cSJim Jagielski 	aNewSize.Height() = aSize.Height() - aPnt.Y();
801*b1cdbd2cSJim Jagielski 	aNewSize.Height() -= ( aBtnSize.Height() + ( a6Size.Height() * 3 / 2 ) );
802*b1cdbd2cSJim Jagielski 	aIndexCB.SetSizePixel( aNewSize );
803*b1cdbd2cSJim Jagielski 
804*b1cdbd2cSJim Jagielski 	aPnt.X() += ( aNewSize.Width() - aBtnSize.Width() );
805*b1cdbd2cSJim Jagielski 	aPnt.Y() += aNewSize.Height() + ( a6Size.Height() / 2 );
806*b1cdbd2cSJim Jagielski 	long nMinX = aIndexCB.GetPosPixel().X();
807*b1cdbd2cSJim Jagielski 	if ( aPnt.X() < nMinX )
808*b1cdbd2cSJim Jagielski 		aPnt.X() = nMinX;
809*b1cdbd2cSJim Jagielski 	aOpenBtn.SetPosPixel( aPnt );
810*b1cdbd2cSJim Jagielski }
811*b1cdbd2cSJim Jagielski 
812*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
813*b1cdbd2cSJim Jagielski 
ActivatePage()814*b1cdbd2cSJim Jagielski void IndexTabPage_Impl::ActivatePage()
815*b1cdbd2cSJim Jagielski {
816*b1cdbd2cSJim Jagielski 	if ( !bIsActivated )
817*b1cdbd2cSJim Jagielski 	{
818*b1cdbd2cSJim Jagielski 		bIsActivated = sal_True;
819*b1cdbd2cSJim Jagielski 		aFactoryTimer.Start();
820*b1cdbd2cSJim Jagielski 	}
821*b1cdbd2cSJim Jagielski 
822*b1cdbd2cSJim Jagielski 	if ( !m_pIdxWin->WasCursorLeftOrRight() )
823*b1cdbd2cSJim Jagielski 		SetFocusOnBox();
824*b1cdbd2cSJim Jagielski }
825*b1cdbd2cSJim Jagielski 
826*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
827*b1cdbd2cSJim Jagielski 
GetLastFocusControl()828*b1cdbd2cSJim Jagielski Control* IndexTabPage_Impl::GetLastFocusControl()
829*b1cdbd2cSJim Jagielski {
830*b1cdbd2cSJim Jagielski 	return &aOpenBtn;
831*b1cdbd2cSJim Jagielski }
832*b1cdbd2cSJim Jagielski 
833*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
834*b1cdbd2cSJim Jagielski 
SetDoubleClickHdl(const Link & rLink)835*b1cdbd2cSJim Jagielski void IndexTabPage_Impl::SetDoubleClickHdl( const Link& rLink )
836*b1cdbd2cSJim Jagielski {
837*b1cdbd2cSJim Jagielski 	aIndexCB.SetDoubleClickHdl( rLink );
838*b1cdbd2cSJim Jagielski }
839*b1cdbd2cSJim Jagielski 
840*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
841*b1cdbd2cSJim Jagielski 
SetFactory(const String & rFactory)842*b1cdbd2cSJim Jagielski void IndexTabPage_Impl::SetFactory( const String& rFactory )
843*b1cdbd2cSJim Jagielski {
844*b1cdbd2cSJim Jagielski     String sNewFactory( rFactory );
845*b1cdbd2cSJim Jagielski     DBG_ASSERT( sNewFactory.Len() > 0, "empty factory" );
846*b1cdbd2cSJim Jagielski     bool bValid = m_pIdxWin->IsValidFactory( rFactory );
847*b1cdbd2cSJim Jagielski 
848*b1cdbd2cSJim Jagielski     if ( sFactory.Len() == 0 && !bValid )
849*b1cdbd2cSJim Jagielski     {
850*b1cdbd2cSJim Jagielski         sNewFactory = SfxHelp::GetDefaultHelpModule();
851*b1cdbd2cSJim Jagielski         bValid = true;
852*b1cdbd2cSJim Jagielski     }
853*b1cdbd2cSJim Jagielski 
854*b1cdbd2cSJim Jagielski     if ( sNewFactory != sFactory && bValid )
855*b1cdbd2cSJim Jagielski     {
856*b1cdbd2cSJim Jagielski         sFactory = sNewFactory;
857*b1cdbd2cSJim Jagielski         ClearIndex();
858*b1cdbd2cSJim Jagielski         if ( bIsActivated )
859*b1cdbd2cSJim Jagielski             aFactoryTimer.Start();
860*b1cdbd2cSJim Jagielski     }
861*b1cdbd2cSJim Jagielski }
862*b1cdbd2cSJim Jagielski 
863*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
864*b1cdbd2cSJim Jagielski 
GetSelectEntry() const865*b1cdbd2cSJim Jagielski String IndexTabPage_Impl::GetSelectEntry() const
866*b1cdbd2cSJim Jagielski {
867*b1cdbd2cSJim Jagielski 	String aRet;
868*b1cdbd2cSJim Jagielski 	IndexEntry_Impl* pEntry = (IndexEntry_Impl*)(sal_uIntPtr)aIndexCB.GetEntryData( aIndexCB.GetEntryPos( aIndexCB.GetText() ) );
869*b1cdbd2cSJim Jagielski 	if ( pEntry )
870*b1cdbd2cSJim Jagielski 		aRet = pEntry->m_aURL;
871*b1cdbd2cSJim Jagielski 	return aRet;
872*b1cdbd2cSJim Jagielski }
873*b1cdbd2cSJim Jagielski 
874*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
875*b1cdbd2cSJim Jagielski 
SetKeyword(const String & rKeyword)876*b1cdbd2cSJim Jagielski void IndexTabPage_Impl::SetKeyword( const String& rKeyword )
877*b1cdbd2cSJim Jagielski {
878*b1cdbd2cSJim Jagielski 	sKeyword = rKeyword;
879*b1cdbd2cSJim Jagielski 
880*b1cdbd2cSJim Jagielski 	if ( aIndexCB.GetEntryCount() > 0 )
881*b1cdbd2cSJim Jagielski 		aKeywordTimer.Start();
882*b1cdbd2cSJim Jagielski 	else if ( !bIsActivated )
883*b1cdbd2cSJim Jagielski 		aFactoryTimer.Start();
884*b1cdbd2cSJim Jagielski }
885*b1cdbd2cSJim Jagielski 
886*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
887*b1cdbd2cSJim Jagielski 
HasKeyword() const888*b1cdbd2cSJim Jagielski sal_Bool IndexTabPage_Impl::HasKeyword() const
889*b1cdbd2cSJim Jagielski {
890*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_False;
891*b1cdbd2cSJim Jagielski 	if ( sKeyword.Len() > 0 )
892*b1cdbd2cSJim Jagielski 	{
893*b1cdbd2cSJim Jagielski 		sal_uInt16 nPos = aIndexCB.GetEntryPos( sKeyword );
894*b1cdbd2cSJim Jagielski 		bRet = ( nPos != LISTBOX_ENTRY_NOTFOUND );
895*b1cdbd2cSJim Jagielski 	}
896*b1cdbd2cSJim Jagielski 
897*b1cdbd2cSJim Jagielski 	return bRet;
898*b1cdbd2cSJim Jagielski }
899*b1cdbd2cSJim Jagielski 
900*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
901*b1cdbd2cSJim Jagielski //added by BerryJia for fixing Bug98251, 2002-12-11
HasKeywordIgnoreCase()902*b1cdbd2cSJim Jagielski sal_Bool IndexTabPage_Impl::HasKeywordIgnoreCase()
903*b1cdbd2cSJim Jagielski {
904*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_False;
905*b1cdbd2cSJim Jagielski 	if ( sKeyword.Len() > 0 )
906*b1cdbd2cSJim Jagielski 	{
907*b1cdbd2cSJim Jagielski 		sal_uInt16 nEntries = aIndexCB.GetEntryCount();
908*b1cdbd2cSJim Jagielski 		String sIndexItem;
909*b1cdbd2cSJim Jagielski 		const vcl::I18nHelper& rI18nHelper = GetSettings().GetLocaleI18nHelper();
910*b1cdbd2cSJim Jagielski 		for ( sal_uInt16 n = 0; n < nEntries; n++)
911*b1cdbd2cSJim Jagielski 		{
912*b1cdbd2cSJim Jagielski 			sIndexItem = aIndexCB.GetEntry( n );
913*b1cdbd2cSJim Jagielski 			if (rI18nHelper.MatchString( sIndexItem, sKeyword ))
914*b1cdbd2cSJim Jagielski 			{
915*b1cdbd2cSJim Jagielski 				sKeyword = sIndexItem;
916*b1cdbd2cSJim Jagielski 				bRet = sal_True;
917*b1cdbd2cSJim Jagielski 			}
918*b1cdbd2cSJim Jagielski 		}
919*b1cdbd2cSJim Jagielski 	}
920*b1cdbd2cSJim Jagielski 
921*b1cdbd2cSJim Jagielski 	return bRet;
922*b1cdbd2cSJim Jagielski }
923*b1cdbd2cSJim Jagielski 
924*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
925*b1cdbd2cSJim Jagielski 
OpenKeyword()926*b1cdbd2cSJim Jagielski void IndexTabPage_Impl::OpenKeyword()
927*b1cdbd2cSJim Jagielski {
928*b1cdbd2cSJim Jagielski 	if ( sKeyword.Len() > 0 )
929*b1cdbd2cSJim Jagielski 	{
930*b1cdbd2cSJim Jagielski 		aIndexCB.SetText( sKeyword );
931*b1cdbd2cSJim Jagielski 		aIndexCB.GetDoubleClickHdl().Call( NULL );
932*b1cdbd2cSJim Jagielski 		sKeyword.Erase();
933*b1cdbd2cSJim Jagielski 	}
934*b1cdbd2cSJim Jagielski }
935*b1cdbd2cSJim Jagielski 
936*b1cdbd2cSJim Jagielski // class SearchBox_Impl --------------------------------------------------
937*b1cdbd2cSJim Jagielski 
PreNotify(NotifyEvent & rNEvt)938*b1cdbd2cSJim Jagielski long SearchBox_Impl::PreNotify( NotifyEvent& rNEvt )
939*b1cdbd2cSJim Jagielski {
940*b1cdbd2cSJim Jagielski 	sal_Bool bHandled = sal_False;
941*b1cdbd2cSJim Jagielski 	if ( !IsInDropDown() &&
942*b1cdbd2cSJim Jagielski 		 rNEvt.GetWindow() == GetSubEdit() &&
943*b1cdbd2cSJim Jagielski 		 rNEvt.GetType() == EVENT_KEYINPUT &&
944*b1cdbd2cSJim Jagielski 		 KEY_RETURN == rNEvt.GetKeyEvent()->GetKeyCode().GetCode() )
945*b1cdbd2cSJim Jagielski 	{
946*b1cdbd2cSJim Jagielski 		aSearchLink.Call( NULL );
947*b1cdbd2cSJim Jagielski 		bHandled = sal_True;
948*b1cdbd2cSJim Jagielski 	}
949*b1cdbd2cSJim Jagielski 	return bHandled ? 1 : ComboBox::PreNotify( rNEvt );
950*b1cdbd2cSJim Jagielski }
951*b1cdbd2cSJim Jagielski 
952*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
953*b1cdbd2cSJim Jagielski 
Select()954*b1cdbd2cSJim Jagielski void SearchBox_Impl::Select()
955*b1cdbd2cSJim Jagielski {
956*b1cdbd2cSJim Jagielski 	if ( !IsTravelSelect() )
957*b1cdbd2cSJim Jagielski 		aSearchLink.Call( NULL );
958*b1cdbd2cSJim Jagielski }
959*b1cdbd2cSJim Jagielski 
960*b1cdbd2cSJim Jagielski // class SearchResultsBox_Impl -------------------------------------------
961*b1cdbd2cSJim Jagielski 
Notify(NotifyEvent & rNEvt)962*b1cdbd2cSJim Jagielski long SearchResultsBox_Impl::Notify( NotifyEvent& rNEvt )
963*b1cdbd2cSJim Jagielski {
964*b1cdbd2cSJim Jagielski 	sal_Bool bHandled = sal_False;
965*b1cdbd2cSJim Jagielski 	if ( rNEvt.GetType() == EVENT_KEYINPUT &&
966*b1cdbd2cSJim Jagielski 		 KEY_RETURN == rNEvt.GetKeyEvent()->GetKeyCode().GetCode() )
967*b1cdbd2cSJim Jagielski 	{
968*b1cdbd2cSJim Jagielski 		GetDoubleClickHdl().Call( NULL );
969*b1cdbd2cSJim Jagielski 		bHandled = sal_True;
970*b1cdbd2cSJim Jagielski 	}
971*b1cdbd2cSJim Jagielski 
972*b1cdbd2cSJim Jagielski 	return bHandled ? 1 : ListBox::Notify( rNEvt );
973*b1cdbd2cSJim Jagielski }
974*b1cdbd2cSJim Jagielski 
975*b1cdbd2cSJim Jagielski // class SearchTabPage_Impl ----------------------------------------------
976*b1cdbd2cSJim Jagielski 
SearchTabPage_Impl(Window * pParent,SfxHelpIndexWindow_Impl * _pIdxWin)977*b1cdbd2cSJim Jagielski SearchTabPage_Impl::SearchTabPage_Impl( Window* pParent, SfxHelpIndexWindow_Impl* _pIdxWin ) :
978*b1cdbd2cSJim Jagielski 
979*b1cdbd2cSJim Jagielski 	HelpTabPage_Impl( pParent, _pIdxWin, SfxResId( TP_HELP_SEARCH ) ),
980*b1cdbd2cSJim Jagielski 
981*b1cdbd2cSJim Jagielski 	aSearchFT		( this, SfxResId( FT_SEARCH ) ),
982*b1cdbd2cSJim Jagielski 	aSearchED		( this, SfxResId( ED_SEARCH ) ),
983*b1cdbd2cSJim Jagielski 	aSearchBtn		( this, SfxResId( PB_SEARCH ) ),
984*b1cdbd2cSJim Jagielski 	aFullWordsCB	( this, SfxResId( CB_FULLWORDS ) ),
985*b1cdbd2cSJim Jagielski 	aScopeCB		( this, SfxResId( CB_SCOPE ) ),
986*b1cdbd2cSJim Jagielski 	aResultsLB		( this, SfxResId( LB_RESULT ) ),
987*b1cdbd2cSJim Jagielski 	aOpenBtn		( this, SfxResId( PB_OPEN_SEARCH ) ),
988*b1cdbd2cSJim Jagielski 	xBreakIterator	( vcl::unohelper::CreateBreakIterator() )
989*b1cdbd2cSJim Jagielski 
990*b1cdbd2cSJim Jagielski {
991*b1cdbd2cSJim Jagielski 	FreeResource();
992*b1cdbd2cSJim Jagielski 
993*b1cdbd2cSJim Jagielski 	Link aLink = LINK( this, SearchTabPage_Impl, SearchHdl );
994*b1cdbd2cSJim Jagielski 	aSearchED.SetSearchLink( aLink );
995*b1cdbd2cSJim Jagielski 	aSearchBtn.SetClickHdl( aLink );
996*b1cdbd2cSJim Jagielski 	aSearchED.SetModifyHdl( LINK( this, SearchTabPage_Impl, ModifyHdl ) );
997*b1cdbd2cSJim Jagielski 	aOpenBtn.SetClickHdl( LINK( this, SearchTabPage_Impl, OpenHdl ) );
998*b1cdbd2cSJim Jagielski 
999*b1cdbd2cSJim Jagielski 	aMinSize = GetSizePixel();
1000*b1cdbd2cSJim Jagielski 
1001*b1cdbd2cSJim Jagielski 	SvtViewOptions aViewOpt( E_TABPAGE, CONFIGNAME_SEARCHPAGE );
1002*b1cdbd2cSJim Jagielski 	if ( aViewOpt.Exists() )
1003*b1cdbd2cSJim Jagielski 	{
1004*b1cdbd2cSJim Jagielski 		String aUserData;
1005*b1cdbd2cSJim Jagielski         Any aUserItem = aViewOpt.GetUserItem( USERITEM_NAME );
1006*b1cdbd2cSJim Jagielski 		::rtl::OUString aTemp;
1007*b1cdbd2cSJim Jagielski 		if ( aUserItem >>= aTemp )
1008*b1cdbd2cSJim Jagielski 		{
1009*b1cdbd2cSJim Jagielski 			aUserData = String( aTemp );
1010*b1cdbd2cSJim Jagielski 			sal_Bool bChecked = ( 1 == aUserData.GetToken(0).ToInt32() ) ? sal_True : sal_False;
1011*b1cdbd2cSJim Jagielski 			aFullWordsCB.Check( bChecked );
1012*b1cdbd2cSJim Jagielski 			bChecked = ( 1 == aUserData.GetToken(1).ToInt32() ) ? sal_True : sal_False;
1013*b1cdbd2cSJim Jagielski 			aScopeCB.Check( bChecked );
1014*b1cdbd2cSJim Jagielski 
1015*b1cdbd2cSJim Jagielski 			for ( sal_uInt16 i = 2; i < aUserData.GetTokenCount(); ++i )
1016*b1cdbd2cSJim Jagielski 			{
1017*b1cdbd2cSJim Jagielski 				String aToken = aUserData.GetToken(i);
1018*b1cdbd2cSJim Jagielski 				aSearchED.InsertEntry( INetURLObject::decode(
1019*b1cdbd2cSJim Jagielski 					aToken, '%', INetURLObject::DECODE_WITH_CHARSET ) );
1020*b1cdbd2cSJim Jagielski 			}
1021*b1cdbd2cSJim Jagielski 		}
1022*b1cdbd2cSJim Jagielski 	}
1023*b1cdbd2cSJim Jagielski 
1024*b1cdbd2cSJim Jagielski 	ModifyHdl( &aSearchED );
1025*b1cdbd2cSJim Jagielski }
1026*b1cdbd2cSJim Jagielski 
1027*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1028*b1cdbd2cSJim Jagielski 
~SearchTabPage_Impl()1029*b1cdbd2cSJim Jagielski SearchTabPage_Impl::~SearchTabPage_Impl()
1030*b1cdbd2cSJim Jagielski {
1031*b1cdbd2cSJim Jagielski 	SvtViewOptions aViewOpt( E_TABPAGE, CONFIGNAME_SEARCHPAGE );
1032*b1cdbd2cSJim Jagielski 	sal_Int32 nChecked = aFullWordsCB.IsChecked() ? 1 : 0;
1033*b1cdbd2cSJim Jagielski 	String aUserData = String::CreateFromInt32( nChecked );
1034*b1cdbd2cSJim Jagielski 	aUserData += ';';
1035*b1cdbd2cSJim Jagielski 	nChecked = aScopeCB.IsChecked() ? 1 : 0;
1036*b1cdbd2cSJim Jagielski 	aUserData += String::CreateFromInt32( nChecked );
1037*b1cdbd2cSJim Jagielski 	aUserData += ';';
1038*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = Min( aSearchED.GetEntryCount(), (sal_uInt16)10 );  // save only 10 entries
1039*b1cdbd2cSJim Jagielski 
1040*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 i = 0; i < nCount; ++i )
1041*b1cdbd2cSJim Jagielski 	{
1042*b1cdbd2cSJim Jagielski 		rtl::OUString aText = aSearchED.GetEntry(i);
1043*b1cdbd2cSJim Jagielski 		aUserData += String(INetURLObject::encode(
1044*b1cdbd2cSJim Jagielski 			aText, INetURLObject::PART_UNO_PARAM_VALUE, '%',
1045*b1cdbd2cSJim Jagielski 			INetURLObject::ENCODE_ALL ));
1046*b1cdbd2cSJim Jagielski 		aUserData += ';';
1047*b1cdbd2cSJim Jagielski 	}
1048*b1cdbd2cSJim Jagielski 
1049*b1cdbd2cSJim Jagielski 	aUserData.EraseTrailingChars(';');
1050*b1cdbd2cSJim Jagielski 	Any aUserItem = makeAny( ::rtl::OUString( aUserData ) );
1051*b1cdbd2cSJim Jagielski     aViewOpt.SetUserItem( USERITEM_NAME, aUserItem );
1052*b1cdbd2cSJim Jagielski }
1053*b1cdbd2cSJim Jagielski 
1054*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1055*b1cdbd2cSJim Jagielski 
ClearSearchResults()1056*b1cdbd2cSJim Jagielski void SearchTabPage_Impl::ClearSearchResults()
1057*b1cdbd2cSJim Jagielski {
1058*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = aResultsLB.GetEntryCount();
1059*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 i = 0; i < nCount; ++i )
1060*b1cdbd2cSJim Jagielski 		delete (String*)(sal_uIntPtr)aResultsLB.GetEntryData(i);
1061*b1cdbd2cSJim Jagielski 	aResultsLB.Clear();
1062*b1cdbd2cSJim Jagielski 	aResultsLB.Update();
1063*b1cdbd2cSJim Jagielski }
1064*b1cdbd2cSJim Jagielski 
1065*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1066*b1cdbd2cSJim Jagielski 
RememberSearchText(const String & rSearchText)1067*b1cdbd2cSJim Jagielski void SearchTabPage_Impl::RememberSearchText( const String& rSearchText )
1068*b1cdbd2cSJim Jagielski {
1069*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 i = 0; i < aSearchED.GetEntryCount(); ++i )
1070*b1cdbd2cSJim Jagielski 	{
1071*b1cdbd2cSJim Jagielski 		if ( rSearchText == aSearchED.GetEntry(i) )
1072*b1cdbd2cSJim Jagielski 		{
1073*b1cdbd2cSJim Jagielski 			aSearchED.RemoveEntry(i);
1074*b1cdbd2cSJim Jagielski 			break;
1075*b1cdbd2cSJim Jagielski 		}
1076*b1cdbd2cSJim Jagielski 	}
1077*b1cdbd2cSJim Jagielski 
1078*b1cdbd2cSJim Jagielski 	aSearchED.InsertEntry( rSearchText, 0 );
1079*b1cdbd2cSJim Jagielski }
1080*b1cdbd2cSJim Jagielski 
1081*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1082*b1cdbd2cSJim Jagielski 
IMPL_LINK(SearchTabPage_Impl,SearchHdl,PushButton *,EMPTYARG)1083*b1cdbd2cSJim Jagielski IMPL_LINK( SearchTabPage_Impl, SearchHdl, PushButton*, EMPTYARG )
1084*b1cdbd2cSJim Jagielski {
1085*b1cdbd2cSJim Jagielski 	String aSearchText = TRIM( aSearchED.GetText() );
1086*b1cdbd2cSJim Jagielski 	if ( aSearchText.Len() > 0 )
1087*b1cdbd2cSJim Jagielski 	{
1088*b1cdbd2cSJim Jagielski 		EnterWait();
1089*b1cdbd2cSJim Jagielski 		ClearSearchResults();
1090*b1cdbd2cSJim Jagielski 		RememberSearchText( aSearchText );
1091*b1cdbd2cSJim Jagielski 		String aSearchURL = HELP_URL;
1092*b1cdbd2cSJim Jagielski 		aSearchURL += aFactory;
1093*b1cdbd2cSJim Jagielski 		aSearchURL += String( HELP_SEARCH_TAG );
1094*b1cdbd2cSJim Jagielski 		if ( !aFullWordsCB.IsChecked() )
1095*b1cdbd2cSJim Jagielski 			aSearchText = sfx2::PrepareSearchString( aSearchText, xBreakIterator, true );
1096*b1cdbd2cSJim Jagielski 		aSearchURL += aSearchText;
1097*b1cdbd2cSJim Jagielski 		AppendConfigToken_Impl( aSearchURL, sal_False );
1098*b1cdbd2cSJim Jagielski 		if ( aScopeCB.IsChecked() )
1099*b1cdbd2cSJim Jagielski 			aSearchURL += DEFINE_CONST_UNICODE("&Scope=Heading");
1100*b1cdbd2cSJim Jagielski 		Sequence< ::rtl::OUString > aFactories = SfxContentHelper::GetResultSet( aSearchURL );
1101*b1cdbd2cSJim Jagielski 		const ::rtl::OUString* pFacs  = aFactories.getConstArray();
1102*b1cdbd2cSJim Jagielski 		sal_uInt32 i, nCount = aFactories.getLength();
1103*b1cdbd2cSJim Jagielski 		for ( i = 0; i < nCount; ++i )
1104*b1cdbd2cSJim Jagielski 		{
1105*b1cdbd2cSJim Jagielski 			String aRow( pFacs[i] );
1106*b1cdbd2cSJim Jagielski 			String aTitle, aType;
1107*b1cdbd2cSJim Jagielski 			xub_StrLen nIdx = 0;
1108*b1cdbd2cSJim Jagielski 			aTitle = aRow.GetToken( 0, '\t', nIdx );
1109*b1cdbd2cSJim Jagielski 			aType = aRow.GetToken( 0, '\t', nIdx );
1110*b1cdbd2cSJim Jagielski 			String* pURL = new String( aRow.GetToken( 0, '\t', nIdx ) );
1111*b1cdbd2cSJim Jagielski 			sal_uInt16 nPos = aResultsLB.InsertEntry( aTitle );
1112*b1cdbd2cSJim Jagielski 			aResultsLB.SetEntryData( nPos, (void*)(sal_uIntPtr)pURL );
1113*b1cdbd2cSJim Jagielski 		}
1114*b1cdbd2cSJim Jagielski 		LeaveWait();
1115*b1cdbd2cSJim Jagielski 
1116*b1cdbd2cSJim Jagielski 		if ( !nCount )
1117*b1cdbd2cSJim Jagielski 		{
1118*b1cdbd2cSJim Jagielski 			InfoBox aBox( this, SfxResId( RID_INFO_NOSEARCHRESULTS ) );
1119*b1cdbd2cSJim Jagielski 			aBox.SetText( String( SfxResId( STR_HELP_WINDOW_TITLE ) ) );
1120*b1cdbd2cSJim Jagielski 			aBox.Execute();
1121*b1cdbd2cSJim Jagielski 		}
1122*b1cdbd2cSJim Jagielski 	}
1123*b1cdbd2cSJim Jagielski 	return 0;
1124*b1cdbd2cSJim Jagielski }
1125*b1cdbd2cSJim Jagielski 
1126*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1127*b1cdbd2cSJim Jagielski 
IMPL_LINK(SearchTabPage_Impl,OpenHdl,PushButton *,EMPTYARG)1128*b1cdbd2cSJim Jagielski IMPL_LINK( SearchTabPage_Impl, OpenHdl, PushButton*, EMPTYARG )
1129*b1cdbd2cSJim Jagielski {
1130*b1cdbd2cSJim Jagielski 	aResultsLB.GetDoubleClickHdl().Call( &aResultsLB );
1131*b1cdbd2cSJim Jagielski 	return 0;
1132*b1cdbd2cSJim Jagielski }
1133*b1cdbd2cSJim Jagielski 
1134*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1135*b1cdbd2cSJim Jagielski 
IMPL_LINK(SearchTabPage_Impl,ModifyHdl,Edit *,EMPTYARG)1136*b1cdbd2cSJim Jagielski IMPL_LINK( SearchTabPage_Impl, ModifyHdl, Edit*, EMPTYARG )
1137*b1cdbd2cSJim Jagielski {
1138*b1cdbd2cSJim Jagielski 	String aSearchText = TRIM( aSearchED.GetText() );
1139*b1cdbd2cSJim Jagielski 	aSearchBtn.Enable( aSearchText.Len() > 0 );
1140*b1cdbd2cSJim Jagielski 	return 0;
1141*b1cdbd2cSJim Jagielski }
1142*b1cdbd2cSJim Jagielski 
1143*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1144*b1cdbd2cSJim Jagielski 
Resize()1145*b1cdbd2cSJim Jagielski void SearchTabPage_Impl::Resize()
1146*b1cdbd2cSJim Jagielski {
1147*b1cdbd2cSJim Jagielski 	Size a6Size = LogicToPixel( Size( 6, 6 ), MAP_APPFONT );
1148*b1cdbd2cSJim Jagielski 	Size aSize = GetSizePixel();
1149*b1cdbd2cSJim Jagielski 	if ( aSize.Width() < aMinSize.Width() )
1150*b1cdbd2cSJim Jagielski 		aSize.Width() = aMinSize.Width();
1151*b1cdbd2cSJim Jagielski 	Point aPnt = aSearchFT.GetPosPixel();
1152*b1cdbd2cSJim Jagielski 	Size aNewSize = aSearchFT.GetSizePixel();
1153*b1cdbd2cSJim Jagielski 	aNewSize.Width() = aSize.Width() - ( aPnt.X() * 2 );
1154*b1cdbd2cSJim Jagielski 	aSearchFT.SetSizePixel( aNewSize );
1155*b1cdbd2cSJim Jagielski     aNewSize.Height() = aResultsLB.GetSizePixel().Height();
1156*b1cdbd2cSJim Jagielski     aResultsLB.SetSizePixel( aNewSize );
1157*b1cdbd2cSJim Jagielski     aNewSize.Height() = aFullWordsCB.GetSizePixel().Height();
1158*b1cdbd2cSJim Jagielski     aFullWordsCB.SetSizePixel( aNewSize );
1159*b1cdbd2cSJim Jagielski     aScopeCB.SetSizePixel( aNewSize );
1160*b1cdbd2cSJim Jagielski     aNewSize = aSearchED.GetSizePixel();
1161*b1cdbd2cSJim Jagielski 	aNewSize.Width() = aSize.Width() - ( aPnt.X() * 2 ) -
1162*b1cdbd2cSJim Jagielski 					   ( aSearchBtn.GetSizePixel().Width() + ( aPnt.X() / 2 ) );
1163*b1cdbd2cSJim Jagielski 	aSearchED.SetSizePixel( aNewSize );
1164*b1cdbd2cSJim Jagielski 	Point aNewPnt = aSearchBtn.GetPosPixel();
1165*b1cdbd2cSJim Jagielski 	aNewPnt.X() = aPnt.X() + aNewSize.Width() + ( aPnt.X() / 2 );
1166*b1cdbd2cSJim Jagielski 	aSearchBtn.SetPosPixel( aNewPnt );
1167*b1cdbd2cSJim Jagielski 
1168*b1cdbd2cSJim Jagielski 	if ( aSize.Height() > aMinSize.Height() )
1169*b1cdbd2cSJim Jagielski 	{
1170*b1cdbd2cSJim Jagielski 		long n3Height = a6Size.Height() / 2;
1171*b1cdbd2cSJim Jagielski 		Size aBtnSize = aOpenBtn.GetSizePixel();
1172*b1cdbd2cSJim Jagielski 		long nExtraHeight = aBtnSize.Height() + n3Height;
1173*b1cdbd2cSJim Jagielski 
1174*b1cdbd2cSJim Jagielski 		aPnt = aResultsLB.GetPosPixel();
1175*b1cdbd2cSJim Jagielski 		aNewSize = aResultsLB.GetSizePixel();
1176*b1cdbd2cSJim Jagielski 		aNewSize.Height() = aSize.Height() - aPnt.Y();
1177*b1cdbd2cSJim Jagielski 		aNewSize.Height() -= ( nExtraHeight + ( a6Size.Height() * 3 / 2 ) );
1178*b1cdbd2cSJim Jagielski 		aResultsLB.SetSizePixel( aNewSize );
1179*b1cdbd2cSJim Jagielski 
1180*b1cdbd2cSJim Jagielski 		aPnt.X() += ( aNewSize.Width() - aBtnSize.Width() );
1181*b1cdbd2cSJim Jagielski 		aPnt.Y() += aNewSize.Height() + a6Size.Height();
1182*b1cdbd2cSJim Jagielski 		aOpenBtn.SetPosPixel( aPnt );
1183*b1cdbd2cSJim Jagielski 	}
1184*b1cdbd2cSJim Jagielski }
1185*b1cdbd2cSJim Jagielski 
1186*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1187*b1cdbd2cSJim Jagielski 
ActivatePage()1188*b1cdbd2cSJim Jagielski void SearchTabPage_Impl::ActivatePage()
1189*b1cdbd2cSJim Jagielski {
1190*b1cdbd2cSJim Jagielski 	if ( !m_pIdxWin->WasCursorLeftOrRight() )
1191*b1cdbd2cSJim Jagielski 		aSearchED.GrabFocus();
1192*b1cdbd2cSJim Jagielski }
1193*b1cdbd2cSJim Jagielski 
1194*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1195*b1cdbd2cSJim Jagielski 
GetLastFocusControl()1196*b1cdbd2cSJim Jagielski Control* SearchTabPage_Impl::GetLastFocusControl()
1197*b1cdbd2cSJim Jagielski {
1198*b1cdbd2cSJim Jagielski 	return &aOpenBtn;
1199*b1cdbd2cSJim Jagielski }
1200*b1cdbd2cSJim Jagielski 
1201*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1202*b1cdbd2cSJim Jagielski 
SetDoubleClickHdl(const Link & rLink)1203*b1cdbd2cSJim Jagielski void SearchTabPage_Impl::SetDoubleClickHdl( const Link& rLink )
1204*b1cdbd2cSJim Jagielski {
1205*b1cdbd2cSJim Jagielski 	aResultsLB.SetDoubleClickHdl( rLink );
1206*b1cdbd2cSJim Jagielski }
1207*b1cdbd2cSJim Jagielski 
1208*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1209*b1cdbd2cSJim Jagielski 
GetSelectEntry() const1210*b1cdbd2cSJim Jagielski String SearchTabPage_Impl::GetSelectEntry() const
1211*b1cdbd2cSJim Jagielski {
1212*b1cdbd2cSJim Jagielski 	String aRet;
1213*b1cdbd2cSJim Jagielski 	String* pData = (String*)(sal_uIntPtr)aResultsLB.GetEntryData( aResultsLB.GetSelectEntryPos() );
1214*b1cdbd2cSJim Jagielski 	if ( pData )
1215*b1cdbd2cSJim Jagielski 		aRet = String( *pData );
1216*b1cdbd2cSJim Jagielski 	return aRet;
1217*b1cdbd2cSJim Jagielski }
1218*b1cdbd2cSJim Jagielski 
1219*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1220*b1cdbd2cSJim Jagielski 
ClearPage()1221*b1cdbd2cSJim Jagielski void SearchTabPage_Impl::ClearPage()
1222*b1cdbd2cSJim Jagielski {
1223*b1cdbd2cSJim Jagielski 	ClearSearchResults();
1224*b1cdbd2cSJim Jagielski 	aSearchED.SetText( String() );
1225*b1cdbd2cSJim Jagielski }
1226*b1cdbd2cSJim Jagielski 
1227*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1228*b1cdbd2cSJim Jagielski 
OpenKeyword(const String & rKeyword)1229*b1cdbd2cSJim Jagielski sal_Bool SearchTabPage_Impl::OpenKeyword( const String& rKeyword )
1230*b1cdbd2cSJim Jagielski {
1231*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_False;
1232*b1cdbd2cSJim Jagielski 	aSearchED.SetText( rKeyword );
1233*b1cdbd2cSJim Jagielski 	SearchHdl( NULL );
1234*b1cdbd2cSJim Jagielski 	if ( aResultsLB.GetEntryCount() > 0 )
1235*b1cdbd2cSJim Jagielski 	{
1236*b1cdbd2cSJim Jagielski 		// found keyword -> open it
1237*b1cdbd2cSJim Jagielski 		aResultsLB.SelectEntryPos(0);
1238*b1cdbd2cSJim Jagielski 		OpenHdl( NULL );
1239*b1cdbd2cSJim Jagielski 		bRet = sal_True;
1240*b1cdbd2cSJim Jagielski 	}
1241*b1cdbd2cSJim Jagielski 
1242*b1cdbd2cSJim Jagielski 	return bRet;
1243*b1cdbd2cSJim Jagielski }
1244*b1cdbd2cSJim Jagielski 
1245*b1cdbd2cSJim Jagielski // class BookmarksTabPage_Impl -------------------------------------------
1246*b1cdbd2cSJim Jagielski 
GetBookmarkEntry_Impl(Sequence<PropertyValue> & aBookmarkEntry,::rtl::OUString & rTitle,::rtl::OUString & rURL)1247*b1cdbd2cSJim Jagielski void GetBookmarkEntry_Impl
1248*b1cdbd2cSJim Jagielski (
1249*b1cdbd2cSJim Jagielski 	Sequence< PropertyValue >& aBookmarkEntry,
1250*b1cdbd2cSJim Jagielski 	::rtl::OUString& rTitle,
1251*b1cdbd2cSJim Jagielski 	::rtl::OUString& rURL
1252*b1cdbd2cSJim Jagielski )
1253*b1cdbd2cSJim Jagielski {
1254*b1cdbd2cSJim Jagielski 	for ( int i = 0; i < aBookmarkEntry.getLength(); i++ )
1255*b1cdbd2cSJim Jagielski 	{
1256*b1cdbd2cSJim Jagielski 		PropertyValue aValue = aBookmarkEntry[i];
1257*b1cdbd2cSJim Jagielski 		if ( aValue.Name == HISTORY_PROPERTYNAME_URL )
1258*b1cdbd2cSJim Jagielski 			aValue.Value >>= rURL;
1259*b1cdbd2cSJim Jagielski 		else if ( aValue.Name == HISTORY_PROPERTYNAME_TITLE )
1260*b1cdbd2cSJim Jagielski 			aValue.Value >>= rTitle;
1261*b1cdbd2cSJim Jagielski 	}
1262*b1cdbd2cSJim Jagielski }
1263*b1cdbd2cSJim Jagielski 
1264*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1265*b1cdbd2cSJim Jagielski 
BookmarksBox_Impl(Window * pParent,const ResId & rResId)1266*b1cdbd2cSJim Jagielski BookmarksBox_Impl::BookmarksBox_Impl( Window* pParent, const ResId& rResId ) :
1267*b1cdbd2cSJim Jagielski 
1268*b1cdbd2cSJim Jagielski 	ListBox( pParent, rResId )
1269*b1cdbd2cSJim Jagielski 
1270*b1cdbd2cSJim Jagielski {
1271*b1cdbd2cSJim Jagielski }
1272*b1cdbd2cSJim Jagielski 
1273*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1274*b1cdbd2cSJim Jagielski 
~BookmarksBox_Impl()1275*b1cdbd2cSJim Jagielski BookmarksBox_Impl::~BookmarksBox_Impl()
1276*b1cdbd2cSJim Jagielski {
1277*b1cdbd2cSJim Jagielski 	// save bookmarks to configuration
1278*b1cdbd2cSJim Jagielski 	SvtHistoryOptions aHistOpt;
1279*b1cdbd2cSJim Jagielski 	aHistOpt.Clear( eHELPBOOKMARKS );
1280*b1cdbd2cSJim Jagielski 	rtl::OUString sEmpty;
1281*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = GetEntryCount();
1282*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 i = 0; i < nCount; ++i )
1283*b1cdbd2cSJim Jagielski 	{
1284*b1cdbd2cSJim Jagielski 		String aTitle = GetEntry(i);
1285*b1cdbd2cSJim Jagielski 		String* pURL = (String*)(sal_uIntPtr)GetEntryData(i);
1286*b1cdbd2cSJim Jagielski 		aHistOpt.AppendItem( eHELPBOOKMARKS, rtl::OUString( *pURL ), sEmpty, rtl::OUString( aTitle ), sEmpty );
1287*b1cdbd2cSJim Jagielski 		delete pURL;
1288*b1cdbd2cSJim Jagielski 	}
1289*b1cdbd2cSJim Jagielski }
1290*b1cdbd2cSJim Jagielski 
1291*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1292*b1cdbd2cSJim Jagielski 
DoAction(sal_uInt16 nAction)1293*b1cdbd2cSJim Jagielski void BookmarksBox_Impl::DoAction( sal_uInt16 nAction )
1294*b1cdbd2cSJim Jagielski {
1295*b1cdbd2cSJim Jagielski 	switch ( nAction )
1296*b1cdbd2cSJim Jagielski 	{
1297*b1cdbd2cSJim Jagielski 		case MID_OPEN :
1298*b1cdbd2cSJim Jagielski 			GetDoubleClickHdl().Call( NULL );
1299*b1cdbd2cSJim Jagielski 			break;
1300*b1cdbd2cSJim Jagielski 
1301*b1cdbd2cSJim Jagielski 		case MID_RENAME :
1302*b1cdbd2cSJim Jagielski 	   	{
1303*b1cdbd2cSJim Jagielski 			sal_uInt16 nPos = GetSelectEntryPos();
1304*b1cdbd2cSJim Jagielski 			if ( nPos != LISTBOX_ENTRY_NOTFOUND )
1305*b1cdbd2cSJim Jagielski 			{
1306*b1cdbd2cSJim Jagielski 				SfxAddHelpBookmarkDialog_Impl aDlg( this, sal_True );
1307*b1cdbd2cSJim Jagielski 				aDlg.SetTitle( GetEntry( nPos ) );
1308*b1cdbd2cSJim Jagielski 				if ( aDlg.Execute() == RET_OK )
1309*b1cdbd2cSJim Jagielski 				{
1310*b1cdbd2cSJim Jagielski 					String* pURL = (String*)(sal_uIntPtr)GetEntryData( nPos );
1311*b1cdbd2cSJim Jagielski 					RemoveEntry( nPos );
1312*b1cdbd2cSJim Jagielski 					rtl::OUString aImageURL = IMAGE_URL;
1313*b1cdbd2cSJim Jagielski 					aImageURL += INetURLObject( *pURL ).GetHost();
1314*b1cdbd2cSJim Jagielski 					nPos = InsertEntry( aDlg.GetTitle(), SvFileInformationManager::GetImage( aImageURL ) );
1315*b1cdbd2cSJim Jagielski 					SetEntryData( nPos, (void*)(sal_uIntPtr)( new String( *pURL ) ) );
1316*b1cdbd2cSJim Jagielski 					SelectEntryPos( nPos );
1317*b1cdbd2cSJim Jagielski 					delete pURL;
1318*b1cdbd2cSJim Jagielski 				}
1319*b1cdbd2cSJim Jagielski 			}
1320*b1cdbd2cSJim Jagielski 			break;
1321*b1cdbd2cSJim Jagielski 		}
1322*b1cdbd2cSJim Jagielski 
1323*b1cdbd2cSJim Jagielski 		case MID_DELETE :
1324*b1cdbd2cSJim Jagielski 		{
1325*b1cdbd2cSJim Jagielski 			sal_uInt16 nPos = GetSelectEntryPos();
1326*b1cdbd2cSJim Jagielski 			if ( nPos != LISTBOX_ENTRY_NOTFOUND )
1327*b1cdbd2cSJim Jagielski 			{
1328*b1cdbd2cSJim Jagielski 				RemoveEntry( nPos );
1329*b1cdbd2cSJim Jagielski 				sal_uInt16 nCount = GetEntryCount();
1330*b1cdbd2cSJim Jagielski 				if ( nCount )
1331*b1cdbd2cSJim Jagielski 				{
1332*b1cdbd2cSJim Jagielski 					if ( nPos >= nCount )
1333*b1cdbd2cSJim Jagielski 						nPos = nCount - 1;
1334*b1cdbd2cSJim Jagielski 					SelectEntryPos( nPos );
1335*b1cdbd2cSJim Jagielski 				}
1336*b1cdbd2cSJim Jagielski 			}
1337*b1cdbd2cSJim Jagielski 			break;
1338*b1cdbd2cSJim Jagielski 		}
1339*b1cdbd2cSJim Jagielski 	}
1340*b1cdbd2cSJim Jagielski }
1341*b1cdbd2cSJim Jagielski 
1342*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1343*b1cdbd2cSJim Jagielski 
Notify(NotifyEvent & rNEvt)1344*b1cdbd2cSJim Jagielski long BookmarksBox_Impl::Notify( NotifyEvent& rNEvt )
1345*b1cdbd2cSJim Jagielski {
1346*b1cdbd2cSJim Jagielski 	long nRet = 0;
1347*b1cdbd2cSJim Jagielski 	sal_uInt16 nType = rNEvt.GetType();
1348*b1cdbd2cSJim Jagielski 	if ( EVENT_KEYINPUT == nType )
1349*b1cdbd2cSJim Jagielski 	{
1350*b1cdbd2cSJim Jagielski 		sal_uInt16 nCode = rNEvt.GetKeyEvent()->GetKeyCode().GetCode();
1351*b1cdbd2cSJim Jagielski 		if ( KEY_DELETE == nCode && GetEntryCount() > 0 )
1352*b1cdbd2cSJim Jagielski 		{
1353*b1cdbd2cSJim Jagielski 			DoAction( MID_DELETE );
1354*b1cdbd2cSJim Jagielski 			nRet = 1;
1355*b1cdbd2cSJim Jagielski 		}
1356*b1cdbd2cSJim Jagielski 		else if ( KEY_RETURN == nCode )
1357*b1cdbd2cSJim Jagielski 		{
1358*b1cdbd2cSJim Jagielski 			GetDoubleClickHdl().Call( NULL );
1359*b1cdbd2cSJim Jagielski 			nRet = 1;
1360*b1cdbd2cSJim Jagielski 		}
1361*b1cdbd2cSJim Jagielski 	}
1362*b1cdbd2cSJim Jagielski 	else if ( EVENT_COMMAND == nType )
1363*b1cdbd2cSJim Jagielski 	{
1364*b1cdbd2cSJim Jagielski 		const CommandEvent* pCEvt = rNEvt.GetCommandEvent();
1365*b1cdbd2cSJim Jagielski 		if ( pCEvt->GetCommand() == COMMAND_CONTEXTMENU )
1366*b1cdbd2cSJim Jagielski 		{
1367*b1cdbd2cSJim Jagielski 			PopupMenu aMenu( SfxResId( MENU_HELP_BOOKMARKS ) );
1368*b1cdbd2cSJim Jagielski             sal_uInt16 nId = aMenu.Execute( this, pCEvt->GetMousePosPixel() );
1369*b1cdbd2cSJim Jagielski 			if ( nId != MENU_ITEM_NOTFOUND )
1370*b1cdbd2cSJim Jagielski 				DoAction( nId );
1371*b1cdbd2cSJim Jagielski 			nRet = 1;
1372*b1cdbd2cSJim Jagielski 		}
1373*b1cdbd2cSJim Jagielski 	}
1374*b1cdbd2cSJim Jagielski 
1375*b1cdbd2cSJim Jagielski 	return nRet ? nRet : ListBox::Notify( rNEvt );
1376*b1cdbd2cSJim Jagielski }
1377*b1cdbd2cSJim Jagielski 
1378*b1cdbd2cSJim Jagielski // class BookmarksTabPage_Impl -------------------------------------------
1379*b1cdbd2cSJim Jagielski 
BookmarksTabPage_Impl(Window * pParent,SfxHelpIndexWindow_Impl * _pIdxWin)1380*b1cdbd2cSJim Jagielski BookmarksTabPage_Impl::BookmarksTabPage_Impl( Window* pParent, SfxHelpIndexWindow_Impl* _pIdxWin ) :
1381*b1cdbd2cSJim Jagielski 
1382*b1cdbd2cSJim Jagielski 	HelpTabPage_Impl( pParent, _pIdxWin, SfxResId( TP_HELP_BOOKMARKS ) ),
1383*b1cdbd2cSJim Jagielski 
1384*b1cdbd2cSJim Jagielski 	aBookmarksFT	( this, SfxResId( FT_BOOKMARKS ) ),
1385*b1cdbd2cSJim Jagielski 	aBookmarksBox	( this, SfxResId( LB_BOOKMARKS ) ),
1386*b1cdbd2cSJim Jagielski 	aBookmarksPB	( this, SfxResId( PB_BOOKMARKS ) )
1387*b1cdbd2cSJim Jagielski 
1388*b1cdbd2cSJim Jagielski {
1389*b1cdbd2cSJim Jagielski 	FreeResource();
1390*b1cdbd2cSJim Jagielski 
1391*b1cdbd2cSJim Jagielski 	nMinWidth = aBookmarksPB.GetSizePixel().Width();
1392*b1cdbd2cSJim Jagielski 
1393*b1cdbd2cSJim Jagielski 	aBookmarksPB.SetClickHdl( LINK( this, BookmarksTabPage_Impl, OpenHdl ) );
1394*b1cdbd2cSJim Jagielski 
1395*b1cdbd2cSJim Jagielski 	// load bookmarks from configuration
1396*b1cdbd2cSJim Jagielski 	Sequence< Sequence< PropertyValue > > aBookmarkSeq;
1397*b1cdbd2cSJim Jagielski 	aBookmarkSeq = SvtHistoryOptions().GetList( eHELPBOOKMARKS );
1398*b1cdbd2cSJim Jagielski 
1399*b1cdbd2cSJim Jagielski 	::rtl::OUString aTitle;
1400*b1cdbd2cSJim Jagielski 	::rtl::OUString aURL;
1401*b1cdbd2cSJim Jagielski 
1402*b1cdbd2cSJim Jagielski 	sal_uInt32 i, nCount = aBookmarkSeq.getLength();
1403*b1cdbd2cSJim Jagielski 	for ( i = 0; i < nCount; ++i )
1404*b1cdbd2cSJim Jagielski 	{
1405*b1cdbd2cSJim Jagielski 		GetBookmarkEntry_Impl( aBookmarkSeq[i], aTitle, aURL );
1406*b1cdbd2cSJim Jagielski 		AddBookmarks( aTitle, aURL );
1407*b1cdbd2cSJim Jagielski 	}
1408*b1cdbd2cSJim Jagielski }
1409*b1cdbd2cSJim Jagielski 
1410*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1411*b1cdbd2cSJim Jagielski 
IMPL_LINK(BookmarksTabPage_Impl,OpenHdl,PushButton *,EMPTYARG)1412*b1cdbd2cSJim Jagielski IMPL_LINK( BookmarksTabPage_Impl, OpenHdl, PushButton*, EMPTYARG )
1413*b1cdbd2cSJim Jagielski {
1414*b1cdbd2cSJim Jagielski 	aBookmarksBox.GetDoubleClickHdl().Call( &aBookmarksBox );
1415*b1cdbd2cSJim Jagielski 	return 0;
1416*b1cdbd2cSJim Jagielski }
1417*b1cdbd2cSJim Jagielski 
1418*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1419*b1cdbd2cSJim Jagielski 
Resize()1420*b1cdbd2cSJim Jagielski void BookmarksTabPage_Impl::Resize()
1421*b1cdbd2cSJim Jagielski {
1422*b1cdbd2cSJim Jagielski 	Size aSize = GetSizePixel();
1423*b1cdbd2cSJim Jagielski 	if ( aSize.Width() < nMinWidth )
1424*b1cdbd2cSJim Jagielski 		aSize.Width() = nMinWidth;
1425*b1cdbd2cSJim Jagielski 	Point aPnt = aBookmarksFT.GetPosPixel();
1426*b1cdbd2cSJim Jagielski 	Size aNewSize = aBookmarksFT.GetSizePixel();
1427*b1cdbd2cSJim Jagielski 	aNewSize.Width() = aSize.Width() - ( aPnt.X() * 2 );
1428*b1cdbd2cSJim Jagielski 	aBookmarksFT.SetSizePixel( aNewSize );
1429*b1cdbd2cSJim Jagielski 
1430*b1cdbd2cSJim Jagielski 	Size a6Size = LogicToPixel( Size( 6, 6 ), MAP_APPFONT );
1431*b1cdbd2cSJim Jagielski 	Size aBtnSize = aBookmarksPB.GetSizePixel();
1432*b1cdbd2cSJim Jagielski 
1433*b1cdbd2cSJim Jagielski 	aPnt = aBookmarksBox.GetPosPixel();
1434*b1cdbd2cSJim Jagielski 	aNewSize = aBookmarksBox.GetSizePixel();
1435*b1cdbd2cSJim Jagielski 	aNewSize.Width() = aSize.Width() - ( aPnt.X() * 2 );
1436*b1cdbd2cSJim Jagielski 	aNewSize.Height() = aSize.Height() - aPnt.Y();
1437*b1cdbd2cSJim Jagielski 	aNewSize.Height() -= ( aBtnSize.Height() + ( a6Size.Height() * 3 / 2 ) );
1438*b1cdbd2cSJim Jagielski 	aBookmarksBox.SetSizePixel( aNewSize );
1439*b1cdbd2cSJim Jagielski 
1440*b1cdbd2cSJim Jagielski 	aPnt.X() += ( aNewSize.Width() - aBtnSize.Width() );
1441*b1cdbd2cSJim Jagielski 	aPnt.Y() += aNewSize.Height() + ( a6Size.Height() / 2 );
1442*b1cdbd2cSJim Jagielski 	long nMinX = aBookmarksBox.GetPosPixel().X();
1443*b1cdbd2cSJim Jagielski 	if ( aPnt.X() < nMinX )
1444*b1cdbd2cSJim Jagielski 		aPnt.X() = nMinX;
1445*b1cdbd2cSJim Jagielski 	aBookmarksPB.SetPosPixel( aPnt );
1446*b1cdbd2cSJim Jagielski }
1447*b1cdbd2cSJim Jagielski 
1448*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1449*b1cdbd2cSJim Jagielski 
ActivatePage()1450*b1cdbd2cSJim Jagielski void BookmarksTabPage_Impl::ActivatePage()
1451*b1cdbd2cSJim Jagielski {
1452*b1cdbd2cSJim Jagielski 	if ( !m_pIdxWin->WasCursorLeftOrRight() )
1453*b1cdbd2cSJim Jagielski 		SetFocusOnBox();
1454*b1cdbd2cSJim Jagielski }
1455*b1cdbd2cSJim Jagielski 
1456*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1457*b1cdbd2cSJim Jagielski 
GetLastFocusControl()1458*b1cdbd2cSJim Jagielski Control* BookmarksTabPage_Impl::GetLastFocusControl()
1459*b1cdbd2cSJim Jagielski {
1460*b1cdbd2cSJim Jagielski 	return &aBookmarksPB;
1461*b1cdbd2cSJim Jagielski }
1462*b1cdbd2cSJim Jagielski 
1463*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1464*b1cdbd2cSJim Jagielski 
SetDoubleClickHdl(const Link & rLink)1465*b1cdbd2cSJim Jagielski void BookmarksTabPage_Impl::SetDoubleClickHdl( const Link& rLink )
1466*b1cdbd2cSJim Jagielski {
1467*b1cdbd2cSJim Jagielski 	aBookmarksBox.SetDoubleClickHdl( rLink );
1468*b1cdbd2cSJim Jagielski }
1469*b1cdbd2cSJim Jagielski 
1470*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1471*b1cdbd2cSJim Jagielski 
GetSelectEntry() const1472*b1cdbd2cSJim Jagielski String BookmarksTabPage_Impl::GetSelectEntry() const
1473*b1cdbd2cSJim Jagielski {
1474*b1cdbd2cSJim Jagielski 	String aRet;
1475*b1cdbd2cSJim Jagielski 	String* pData = (String*)(sal_uIntPtr)aBookmarksBox.GetEntryData( aBookmarksBox.GetSelectEntryPos() );
1476*b1cdbd2cSJim Jagielski 	if ( pData )
1477*b1cdbd2cSJim Jagielski 		aRet = String( *pData );
1478*b1cdbd2cSJim Jagielski 	return aRet;
1479*b1cdbd2cSJim Jagielski }
1480*b1cdbd2cSJim Jagielski 
1481*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1482*b1cdbd2cSJim Jagielski 
AddBookmarks(const String & rTitle,const String & rURL)1483*b1cdbd2cSJim Jagielski void BookmarksTabPage_Impl::AddBookmarks( const String& rTitle, const String& rURL )
1484*b1cdbd2cSJim Jagielski {
1485*b1cdbd2cSJim Jagielski 	rtl::OUString aImageURL = IMAGE_URL;
1486*b1cdbd2cSJim Jagielski 	aImageURL += INetURLObject( rURL ).GetHost();
1487*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos = aBookmarksBox.InsertEntry( rTitle, SvFileInformationManager::GetImage( aImageURL ) );
1488*b1cdbd2cSJim Jagielski 	aBookmarksBox.SetEntryData( nPos, (void*)(sal_uIntPtr)( new String( rURL ) ) );
1489*b1cdbd2cSJim Jagielski }
1490*b1cdbd2cSJim Jagielski 
1491*b1cdbd2cSJim Jagielski // class SfxHelpIndexWindow_Impl -----------------------------------------
1492*b1cdbd2cSJim Jagielski 
splitHelpURL(const::rtl::OUString & sHelpURL,::rtl::OUString & sFactory,::rtl::OUString & sContent,::rtl::OUString & sAnchor)1493*b1cdbd2cSJim Jagielski sal_Bool SfxHelpWindow_Impl::splitHelpURL(const ::rtl::OUString& sHelpURL,
1494*b1cdbd2cSJim Jagielski                                                 ::rtl::OUString& sFactory,
1495*b1cdbd2cSJim Jagielski                                                 ::rtl::OUString& sContent,
1496*b1cdbd2cSJim Jagielski                                                 ::rtl::OUString& sAnchor )
1497*b1cdbd2cSJim Jagielski {
1498*b1cdbd2cSJim Jagielski     Reference < XURLTransformer > xParser( ::comphelper::getProcessServiceFactory()->createInstance(
1499*b1cdbd2cSJim Jagielski             DEFINE_CONST_UNICODE("com.sun.star.util.URLTransformer" )), UNO_QUERY_THROW );
1500*b1cdbd2cSJim Jagielski 
1501*b1cdbd2cSJim Jagielski     URL aURL;
1502*b1cdbd2cSJim Jagielski     aURL.Complete = sHelpURL;
1503*b1cdbd2cSJim Jagielski     sal_Bool bResult = xParser->parseStrict(aURL);
1504*b1cdbd2cSJim Jagielski 
1505*b1cdbd2cSJim Jagielski     sFactory = aURL.Server;
1506*b1cdbd2cSJim Jagielski     sContent = aURL.Path.copy(1); // strip "/"!
1507*b1cdbd2cSJim Jagielski     sAnchor  = aURL.Mark;
1508*b1cdbd2cSJim Jagielski 
1509*b1cdbd2cSJim Jagielski     return bResult;
1510*b1cdbd2cSJim Jagielski }
1511*b1cdbd2cSJim Jagielski 
buildHelpURL(const::rtl::OUString & sFactory,const::rtl::OUString & sContent,const::rtl::OUString & sAnchor,sal_Bool bUseQuestionMark)1512*b1cdbd2cSJim Jagielski ::rtl::OUString SfxHelpWindow_Impl::buildHelpURL(const ::rtl::OUString& sFactory        ,
1513*b1cdbd2cSJim Jagielski                                                  const ::rtl::OUString& sContent        ,
1514*b1cdbd2cSJim Jagielski                                                  const ::rtl::OUString& sAnchor         ,
1515*b1cdbd2cSJim Jagielski                                                        sal_Bool         bUseQuestionMark)
1516*b1cdbd2cSJim Jagielski {
1517*b1cdbd2cSJim Jagielski     ::rtl::OUStringBuffer sHelpURL(256);
1518*b1cdbd2cSJim Jagielski     sHelpURL.append(HELP_URL);
1519*b1cdbd2cSJim Jagielski     sHelpURL.append(sFactory);
1520*b1cdbd2cSJim Jagielski     sHelpURL.append(sContent);
1521*b1cdbd2cSJim Jagielski     String sURL = String(sHelpURL.makeStringAndClear());
1522*b1cdbd2cSJim Jagielski     AppendConfigToken_Impl(sURL, bUseQuestionMark);
1523*b1cdbd2cSJim Jagielski     if (sAnchor.getLength())
1524*b1cdbd2cSJim Jagielski         sURL += String(sAnchor);
1525*b1cdbd2cSJim Jagielski     return ::rtl::OUString(sURL);
1526*b1cdbd2cSJim Jagielski }
1527*b1cdbd2cSJim Jagielski 
loadHelpContent(const::rtl::OUString & sHelpURL,sal_Bool bAddToHistory)1528*b1cdbd2cSJim Jagielski void SfxHelpWindow_Impl::loadHelpContent(const ::rtl::OUString& sHelpURL, sal_Bool bAddToHistory)
1529*b1cdbd2cSJim Jagielski {
1530*b1cdbd2cSJim Jagielski     Reference< XComponentLoader > xLoader(getTextFrame(), UNO_QUERY);
1531*b1cdbd2cSJim Jagielski     if (!xLoader.is())
1532*b1cdbd2cSJim Jagielski         return;
1533*b1cdbd2cSJim Jagielski 
1534*b1cdbd2cSJim Jagielski     // --> PB 2007-03-12 #134037#
1535*b1cdbd2cSJim Jagielski     // If a print job runs do not open a new page
1536*b1cdbd2cSJim Jagielski     Reference< XFrame >      xTextFrame      = pTextWin->getFrame();
1537*b1cdbd2cSJim Jagielski     Reference< XController > xTextController ;
1538*b1cdbd2cSJim Jagielski     if (xTextFrame.is())
1539*b1cdbd2cSJim Jagielski         xTextController = xTextFrame->getController ();
1540*b1cdbd2cSJim Jagielski     if ( xTextController.is() && !xTextController->suspend( sal_True ) )
1541*b1cdbd2cSJim Jagielski     {
1542*b1cdbd2cSJim Jagielski         xTextController->suspend( sal_False );
1543*b1cdbd2cSJim Jagielski         return;
1544*b1cdbd2cSJim Jagielski     }
1545*b1cdbd2cSJim Jagielski     // <--
1546*b1cdbd2cSJim Jagielski 
1547*b1cdbd2cSJim Jagielski 	// save url to history
1548*b1cdbd2cSJim Jagielski     if (bAddToHistory)
1549*b1cdbd2cSJim Jagielski 	    pHelpInterceptor->addURL(sHelpURL);
1550*b1cdbd2cSJim Jagielski 
1551*b1cdbd2cSJim Jagielski     if ( !IsWait() )
1552*b1cdbd2cSJim Jagielski         EnterWait();
1553*b1cdbd2cSJim Jagielski     sal_Bool bSuccess = sal_False;
1554*b1cdbd2cSJim Jagielski // TODO implement locale fallback ... see below    while(sal_True)
1555*b1cdbd2cSJim Jagielski     {
1556*b1cdbd2cSJim Jagielski         try
1557*b1cdbd2cSJim Jagielski         {
1558*b1cdbd2cSJim Jagielski             Reference< XComponent > xContent = xLoader->loadComponentFromURL(sHelpURL, DEFINE_CONST_UNICODE("_self"), 0, Sequence< PropertyValue >());
1559*b1cdbd2cSJim Jagielski             if (xContent.is())
1560*b1cdbd2cSJim Jagielski             {
1561*b1cdbd2cSJim Jagielski                 bSuccess = sal_True;
1562*b1cdbd2cSJim Jagielski //                break;
1563*b1cdbd2cSJim Jagielski             }
1564*b1cdbd2cSJim Jagielski         }
1565*b1cdbd2cSJim Jagielski         catch(const RuntimeException&)
1566*b1cdbd2cSJim Jagielski             { throw; }
1567*b1cdbd2cSJim Jagielski         catch(const Exception&)
1568*b1cdbd2cSJim Jagielski             { /*break;*/ }
1569*b1cdbd2cSJim Jagielski 
1570*b1cdbd2cSJim Jagielski         /* TODO try next locale ...
1571*b1cdbd2cSJim Jagielski                 no further locale available? => break loop and show error page
1572*b1cdbd2cSJim Jagielski         */
1573*b1cdbd2cSJim Jagielski     }
1574*b1cdbd2cSJim Jagielski     openDone(sHelpURL, bSuccess);
1575*b1cdbd2cSJim Jagielski     if ( IsWait() )
1576*b1cdbd2cSJim Jagielski         LeaveWait();
1577*b1cdbd2cSJim Jagielski }
1578*b1cdbd2cSJim Jagielski 
SfxHelpIndexWindow_Impl(SfxHelpWindow_Impl * _pParent)1579*b1cdbd2cSJim Jagielski SfxHelpIndexWindow_Impl::SfxHelpIndexWindow_Impl( SfxHelpWindow_Impl* _pParent ) :
1580*b1cdbd2cSJim Jagielski 
1581*b1cdbd2cSJim Jagielski 	Window( _pParent, SfxResId( WIN_HELPINDEX ) ),
1582*b1cdbd2cSJim Jagielski 
1583*b1cdbd2cSJim Jagielski 	aActiveLB			( this, SfxResId( LB_ACTIVE ) ),
1584*b1cdbd2cSJim Jagielski 	aActiveLine			( this, SfxResId( FL_ACTIVE ) ),
1585*b1cdbd2cSJim Jagielski 	aTabCtrl			( this, SfxResId( TC_INDEX ) ),
1586*b1cdbd2cSJim Jagielski 
1587*b1cdbd2cSJim Jagielski 	aIndexKeywordLink	( LINK( this, SfxHelpIndexWindow_Impl, KeywordHdl ) ),
1588*b1cdbd2cSJim Jagielski 	pParentWin			( _pParent ),
1589*b1cdbd2cSJim Jagielski 
1590*b1cdbd2cSJim Jagielski 	pCPage				( NULL ),
1591*b1cdbd2cSJim Jagielski 	pIPage				( NULL ),
1592*b1cdbd2cSJim Jagielski 	pSPage				( NULL ),
1593*b1cdbd2cSJim Jagielski     pBPage              ( NULL ),
1594*b1cdbd2cSJim Jagielski 
1595*b1cdbd2cSJim Jagielski     bWasCursorLeftOrRight( false ),
1596*b1cdbd2cSJim Jagielski     bIsInitDone          ( false )
1597*b1cdbd2cSJim Jagielski 
1598*b1cdbd2cSJim Jagielski {
1599*b1cdbd2cSJim Jagielski 	FreeResource();
1600*b1cdbd2cSJim Jagielski 
1601*b1cdbd2cSJim Jagielski 	sfx2::AddToTaskPaneList( this );
1602*b1cdbd2cSJim Jagielski 
1603*b1cdbd2cSJim Jagielski 	aTabCtrl.SetActivatePageHdl( LINK( this, SfxHelpIndexWindow_Impl, ActivatePageHdl ) );
1604*b1cdbd2cSJim Jagielski 	aTabCtrl.Show();
1605*b1cdbd2cSJim Jagielski 
1606*b1cdbd2cSJim Jagielski 	sal_Int32 nPageId = HELP_INDEX_PAGE_INDEX;
1607*b1cdbd2cSJim Jagielski 	SvtViewOptions aViewOpt( E_TABDIALOG, CONFIGNAME_INDEXWIN );
1608*b1cdbd2cSJim Jagielski 	if ( aViewOpt.Exists() )
1609*b1cdbd2cSJim Jagielski 		nPageId = aViewOpt.GetPageID();
1610*b1cdbd2cSJim Jagielski 	aTabCtrl.SetCurPageId( (sal_uInt16)nPageId );
1611*b1cdbd2cSJim Jagielski 	ActivatePageHdl( &aTabCtrl );
1612*b1cdbd2cSJim Jagielski 	aActiveLB.SetSelectHdl( LINK( this, SfxHelpIndexWindow_Impl, SelectHdl ) );
1613*b1cdbd2cSJim Jagielski 	nMinWidth = ( aActiveLB.GetSizePixel().Width() / 2 );
1614*b1cdbd2cSJim Jagielski 
1615*b1cdbd2cSJim Jagielski 	aTimer.SetTimeoutHdl( LINK( this, SfxHelpIndexWindow_Impl, InitHdl ) );
1616*b1cdbd2cSJim Jagielski 	aTimer.SetTimeout( 200 );
1617*b1cdbd2cSJim Jagielski 	aTimer.Start();
1618*b1cdbd2cSJim Jagielski }
1619*b1cdbd2cSJim Jagielski 
1620*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1621*b1cdbd2cSJim Jagielski 
~SfxHelpIndexWindow_Impl()1622*b1cdbd2cSJim Jagielski SfxHelpIndexWindow_Impl::~SfxHelpIndexWindow_Impl()
1623*b1cdbd2cSJim Jagielski {
1624*b1cdbd2cSJim Jagielski 	sfx2::RemoveFromTaskPaneList( this );
1625*b1cdbd2cSJim Jagielski 
1626*b1cdbd2cSJim Jagielski 	DELETEZ( pCPage );
1627*b1cdbd2cSJim Jagielski 	DELETEZ( pIPage );
1628*b1cdbd2cSJim Jagielski 	DELETEZ( pSPage );
1629*b1cdbd2cSJim Jagielski 	DELETEZ( pBPage );
1630*b1cdbd2cSJim Jagielski 
1631*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 i = 0; i < aActiveLB.GetEntryCount(); ++i )
1632*b1cdbd2cSJim Jagielski 		delete (String*)(sal_uIntPtr)aActiveLB.GetEntryData(i);
1633*b1cdbd2cSJim Jagielski 
1634*b1cdbd2cSJim Jagielski 	SvtViewOptions aViewOpt( E_TABDIALOG, CONFIGNAME_INDEXWIN );
1635*b1cdbd2cSJim Jagielski 	aViewOpt.SetPageID( (sal_Int32)aTabCtrl.GetCurPageId() );
1636*b1cdbd2cSJim Jagielski }
1637*b1cdbd2cSJim Jagielski 
1638*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1639*b1cdbd2cSJim Jagielski 
Initialize()1640*b1cdbd2cSJim Jagielski void SfxHelpIndexWindow_Impl::Initialize()
1641*b1cdbd2cSJim Jagielski {
1642*b1cdbd2cSJim Jagielski 	String aHelpURL = HELP_URL;
1643*b1cdbd2cSJim Jagielski 	AppendConfigToken_Impl( aHelpURL, sal_True );
1644*b1cdbd2cSJim Jagielski 	Sequence< ::rtl::OUString > aFactories = SfxContentHelper::GetResultSet( aHelpURL );
1645*b1cdbd2cSJim Jagielski 	const ::rtl::OUString* pFacs  = aFactories.getConstArray();
1646*b1cdbd2cSJim Jagielski 	sal_uInt32 i, nCount = aFactories.getLength();
1647*b1cdbd2cSJim Jagielski 	for ( i = 0; i < nCount; ++i )
1648*b1cdbd2cSJim Jagielski 	{
1649*b1cdbd2cSJim Jagielski 		String aRow( pFacs[i] );
1650*b1cdbd2cSJim Jagielski 		String aTitle, aType, aURL;
1651*b1cdbd2cSJim Jagielski 		xub_StrLen nIdx = 0;
1652*b1cdbd2cSJim Jagielski 		aTitle = aRow.GetToken( 0, '\t', nIdx );
1653*b1cdbd2cSJim Jagielski 		aType = aRow.GetToken( 0, '\t', nIdx );
1654*b1cdbd2cSJim Jagielski 		aURL = aRow.GetToken( 0, '\t', nIdx );
1655*b1cdbd2cSJim Jagielski 		String* pFactory = new String( INetURLObject( aURL ).GetHost() );
1656*b1cdbd2cSJim Jagielski 		sal_uInt16 nPos = aActiveLB.InsertEntry( aTitle );
1657*b1cdbd2cSJim Jagielski 		aActiveLB.SetEntryData( nPos, (void*)(sal_uIntPtr)pFactory );
1658*b1cdbd2cSJim Jagielski 	}
1659*b1cdbd2cSJim Jagielski 
1660*b1cdbd2cSJim Jagielski 	aActiveLB.SetDropDownLineCount( (sal_uInt16)nCount );
1661*b1cdbd2cSJim Jagielski 	if ( aActiveLB.GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND )
1662*b1cdbd2cSJim Jagielski 		SetActiveFactory();
1663*b1cdbd2cSJim Jagielski }
1664*b1cdbd2cSJim Jagielski 
1665*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1666*b1cdbd2cSJim Jagielski 
SetActiveFactory()1667*b1cdbd2cSJim Jagielski void SfxHelpIndexWindow_Impl::SetActiveFactory()
1668*b1cdbd2cSJim Jagielski {
1669*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pIPage, "index page not initialized" );
1670*b1cdbd2cSJim Jagielski     if ( !bIsInitDone && !aActiveLB.GetEntryCount() )
1671*b1cdbd2cSJim Jagielski     {
1672*b1cdbd2cSJim Jagielski         aTimer.Stop();
1673*b1cdbd2cSJim Jagielski         InitHdl( NULL );
1674*b1cdbd2cSJim Jagielski     }
1675*b1cdbd2cSJim Jagielski 
1676*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 i = 0; i < aActiveLB.GetEntryCount(); ++i )
1677*b1cdbd2cSJim Jagielski 	{
1678*b1cdbd2cSJim Jagielski 		String* pFactory = (String*)(sal_uIntPtr)aActiveLB.GetEntryData(i);
1679*b1cdbd2cSJim Jagielski 		pFactory->ToLowerAscii();
1680*b1cdbd2cSJim Jagielski 		if ( *pFactory == pIPage->GetFactory() )
1681*b1cdbd2cSJim Jagielski 		{
1682*b1cdbd2cSJim Jagielski 			if ( aActiveLB.GetSelectEntryPos() != i )
1683*b1cdbd2cSJim Jagielski 			{
1684*b1cdbd2cSJim Jagielski 				aActiveLB.SelectEntryPos(i);
1685*b1cdbd2cSJim Jagielski 				aSelectFactoryLink.Call( NULL );
1686*b1cdbd2cSJim Jagielski 			}
1687*b1cdbd2cSJim Jagielski 			break;
1688*b1cdbd2cSJim Jagielski 		}
1689*b1cdbd2cSJim Jagielski 	}
1690*b1cdbd2cSJim Jagielski }
1691*b1cdbd2cSJim Jagielski 
1692*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1693*b1cdbd2cSJim Jagielski 
GetCurrentPage(sal_uInt16 & rCurId)1694*b1cdbd2cSJim Jagielski HelpTabPage_Impl* SfxHelpIndexWindow_Impl::GetCurrentPage( sal_uInt16& rCurId )
1695*b1cdbd2cSJim Jagielski {
1696*b1cdbd2cSJim Jagielski 	rCurId = aTabCtrl.GetCurPageId();
1697*b1cdbd2cSJim Jagielski 	HelpTabPage_Impl* pPage = NULL;
1698*b1cdbd2cSJim Jagielski 
1699*b1cdbd2cSJim Jagielski 	switch ( rCurId )
1700*b1cdbd2cSJim Jagielski 	{
1701*b1cdbd2cSJim Jagielski 		case HELP_INDEX_PAGE_CONTENTS:
1702*b1cdbd2cSJim Jagielski 		{
1703*b1cdbd2cSJim Jagielski 			pPage = GetContentPage();
1704*b1cdbd2cSJim Jagielski 			break;
1705*b1cdbd2cSJim Jagielski 		}
1706*b1cdbd2cSJim Jagielski 
1707*b1cdbd2cSJim Jagielski 		case HELP_INDEX_PAGE_INDEX:
1708*b1cdbd2cSJim Jagielski 		{
1709*b1cdbd2cSJim Jagielski 			pPage = GetIndexPage();
1710*b1cdbd2cSJim Jagielski 			break;
1711*b1cdbd2cSJim Jagielski 		}
1712*b1cdbd2cSJim Jagielski 
1713*b1cdbd2cSJim Jagielski 		case HELP_INDEX_PAGE_SEARCH:
1714*b1cdbd2cSJim Jagielski 		{
1715*b1cdbd2cSJim Jagielski 			pPage = GetSearchPage();
1716*b1cdbd2cSJim Jagielski 			break;
1717*b1cdbd2cSJim Jagielski 		}
1718*b1cdbd2cSJim Jagielski 
1719*b1cdbd2cSJim Jagielski 		case HELP_INDEX_PAGE_BOOKMARKS:
1720*b1cdbd2cSJim Jagielski 		{
1721*b1cdbd2cSJim Jagielski 			pPage = GetBookmarksPage();
1722*b1cdbd2cSJim Jagielski 			break;
1723*b1cdbd2cSJim Jagielski 		}
1724*b1cdbd2cSJim Jagielski 	}
1725*b1cdbd2cSJim Jagielski 
1726*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pPage, "SfxHelpIndexWindow_Impl::GetCurrentPage(): no current page" );
1727*b1cdbd2cSJim Jagielski 	return pPage;
1728*b1cdbd2cSJim Jagielski }
1729*b1cdbd2cSJim Jagielski 
1730*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1731*b1cdbd2cSJim Jagielski 
IMPL_LINK(SfxHelpIndexWindow_Impl,ActivatePageHdl,TabControl *,pTabCtrl)1732*b1cdbd2cSJim Jagielski IMPL_LINK( SfxHelpIndexWindow_Impl, ActivatePageHdl, TabControl *, pTabCtrl )
1733*b1cdbd2cSJim Jagielski {
1734*b1cdbd2cSJim Jagielski 	sal_uInt16 nId = 0;
1735*b1cdbd2cSJim Jagielski 	TabPage* pPage = GetCurrentPage( nId );
1736*b1cdbd2cSJim Jagielski 	pTabCtrl->SetTabPage( nId, pPage );
1737*b1cdbd2cSJim Jagielski 	return 0;
1738*b1cdbd2cSJim Jagielski }
1739*b1cdbd2cSJim Jagielski 
1740*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1741*b1cdbd2cSJim Jagielski 
IMPL_LINK(SfxHelpIndexWindow_Impl,SelectHdl,ListBox *,EMPTYARG)1742*b1cdbd2cSJim Jagielski IMPL_LINK( SfxHelpIndexWindow_Impl, SelectHdl, ListBox *, EMPTYARG )
1743*b1cdbd2cSJim Jagielski {
1744*b1cdbd2cSJim Jagielski 	aTimer.Start();
1745*b1cdbd2cSJim Jagielski 
1746*b1cdbd2cSJim Jagielski 	return 0;
1747*b1cdbd2cSJim Jagielski }
1748*b1cdbd2cSJim Jagielski 
1749*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1750*b1cdbd2cSJim Jagielski 
IMPL_LINK(SfxHelpIndexWindow_Impl,InitHdl,Timer *,EMPTYARG)1751*b1cdbd2cSJim Jagielski IMPL_LINK( SfxHelpIndexWindow_Impl, InitHdl, Timer *, EMPTYARG )
1752*b1cdbd2cSJim Jagielski {
1753*b1cdbd2cSJim Jagielski     bIsInitDone = true;
1754*b1cdbd2cSJim Jagielski 	Initialize();
1755*b1cdbd2cSJim Jagielski 
1756*b1cdbd2cSJim Jagielski 	// now use the timer for selection
1757*b1cdbd2cSJim Jagielski 	aTimer.SetTimeoutHdl( LINK( this, SfxHelpIndexWindow_Impl, SelectFactoryHdl ) );
1758*b1cdbd2cSJim Jagielski 	aTimer.SetTimeout( 1000 );
1759*b1cdbd2cSJim Jagielski 
1760*b1cdbd2cSJim Jagielski 	return 0;
1761*b1cdbd2cSJim Jagielski }
1762*b1cdbd2cSJim Jagielski 
1763*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1764*b1cdbd2cSJim Jagielski 
IMPL_LINK(SfxHelpIndexWindow_Impl,SelectFactoryHdl,Timer *,EMPTYARG)1765*b1cdbd2cSJim Jagielski IMPL_LINK( SfxHelpIndexWindow_Impl, SelectFactoryHdl, Timer *, EMPTYARG )
1766*b1cdbd2cSJim Jagielski {
1767*b1cdbd2cSJim Jagielski 	String* pFactory = (String*)(sal_uIntPtr)aActiveLB.GetEntryData( aActiveLB.GetSelectEntryPos() );
1768*b1cdbd2cSJim Jagielski 	if ( pFactory )
1769*b1cdbd2cSJim Jagielski 	{
1770*b1cdbd2cSJim Jagielski 		String aFactory( *pFactory );
1771*b1cdbd2cSJim Jagielski 		aFactory.ToLowerAscii();
1772*b1cdbd2cSJim Jagielski 		SetFactory( aFactory, sal_False );
1773*b1cdbd2cSJim Jagielski 		aSelectFactoryLink.Call( this );
1774*b1cdbd2cSJim Jagielski 	}
1775*b1cdbd2cSJim Jagielski 
1776*b1cdbd2cSJim Jagielski 	return 0;
1777*b1cdbd2cSJim Jagielski }
1778*b1cdbd2cSJim Jagielski 
1779*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1780*b1cdbd2cSJim Jagielski 
IMPL_LINK(SfxHelpIndexWindow_Impl,KeywordHdl,IndexTabPage_Impl *,EMPTYARG)1781*b1cdbd2cSJim Jagielski IMPL_LINK( SfxHelpIndexWindow_Impl, KeywordHdl, IndexTabPage_Impl *, EMPTYARG )
1782*b1cdbd2cSJim Jagielski {
1783*b1cdbd2cSJim Jagielski 	// keyword found on index?
1784*b1cdbd2cSJim Jagielski 	sal_Bool bIndex = pIPage->HasKeyword();
1785*b1cdbd2cSJim Jagielski 	//The following two lines are added by BerryJia for fixing Bug98251, 2002-12-11
1786*b1cdbd2cSJim Jagielski 	if( !bIndex)
1787*b1cdbd2cSJim Jagielski 		bIndex = pIPage->HasKeywordIgnoreCase();
1788*b1cdbd2cSJim Jagielski 	// then set index or search page as current.
1789*b1cdbd2cSJim Jagielski 	sal_uInt16 nPageId = ( bIndex ) ? HELP_INDEX_PAGE_INDEX :  HELP_INDEX_PAGE_SEARCH;
1790*b1cdbd2cSJim Jagielski 	if ( nPageId != aTabCtrl.GetCurPageId() )
1791*b1cdbd2cSJim Jagielski 	{
1792*b1cdbd2cSJim Jagielski 		aTabCtrl.SetCurPageId( nPageId );
1793*b1cdbd2cSJim Jagielski 		ActivatePageHdl( &aTabCtrl );
1794*b1cdbd2cSJim Jagielski 	}
1795*b1cdbd2cSJim Jagielski 
1796*b1cdbd2cSJim Jagielski 	// at last we open the keyword
1797*b1cdbd2cSJim Jagielski 	if ( bIndex )
1798*b1cdbd2cSJim Jagielski 		pIPage->OpenKeyword();
1799*b1cdbd2cSJim Jagielski 	else if ( !pSPage->OpenKeyword( sKeyword ) )
1800*b1cdbd2cSJim Jagielski 		pParentWin->ShowStartPage();
1801*b1cdbd2cSJim Jagielski 
1802*b1cdbd2cSJim Jagielski 	return 0;
1803*b1cdbd2cSJim Jagielski }
1804*b1cdbd2cSJim Jagielski 
1805*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1806*b1cdbd2cSJim Jagielski 
Resize()1807*b1cdbd2cSJim Jagielski void SfxHelpIndexWindow_Impl::Resize()
1808*b1cdbd2cSJim Jagielski {
1809*b1cdbd2cSJim Jagielski 	Size aSize = GetOutputSizePixel();
1810*b1cdbd2cSJim Jagielski 	if ( aSize.Width() < nMinWidth )
1811*b1cdbd2cSJim Jagielski 		aSize.Width() = nMinWidth;
1812*b1cdbd2cSJim Jagielski 
1813*b1cdbd2cSJim Jagielski 	Point aPnt = aActiveLB.GetPosPixel();
1814*b1cdbd2cSJim Jagielski 	Size aNewSize = aActiveLB.GetSizePixel();
1815*b1cdbd2cSJim Jagielski 	aNewSize.Width() = aSize.Width() - ( aPnt.X() * 2 );
1816*b1cdbd2cSJim Jagielski 	aActiveLB.SetSizePixel( aNewSize );
1817*b1cdbd2cSJim Jagielski 	aPnt = aActiveLine.GetPosPixel();
1818*b1cdbd2cSJim Jagielski 	aNewSize = aActiveLine.GetSizePixel();
1819*b1cdbd2cSJim Jagielski 	aNewSize.Width() = aSize.Width() - ( aPnt.X() * 2 );
1820*b1cdbd2cSJim Jagielski 	aActiveLine.SetSizePixel( aNewSize );
1821*b1cdbd2cSJim Jagielski 	aPnt = aTabCtrl.GetPosPixel();
1822*b1cdbd2cSJim Jagielski 	aNewSize = aSize;
1823*b1cdbd2cSJim Jagielski 	aSize.Width() -= aPnt.X();
1824*b1cdbd2cSJim Jagielski 	aSize.Height() -= aPnt.Y();
1825*b1cdbd2cSJim Jagielski 	aTabCtrl.SetSizePixel( aSize );
1826*b1cdbd2cSJim Jagielski }
1827*b1cdbd2cSJim Jagielski 
1828*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1829*b1cdbd2cSJim Jagielski 
PreNotify(NotifyEvent & rNEvt)1830*b1cdbd2cSJim Jagielski long SfxHelpIndexWindow_Impl::PreNotify( NotifyEvent& rNEvt )
1831*b1cdbd2cSJim Jagielski {
1832*b1cdbd2cSJim Jagielski 	long nDone = 0;
1833*b1cdbd2cSJim Jagielski 	sal_uInt16 nType = rNEvt.GetType();
1834*b1cdbd2cSJim Jagielski 	if ( EVENT_KEYINPUT == nType && rNEvt.GetKeyEvent() )
1835*b1cdbd2cSJim Jagielski 	{
1836*b1cdbd2cSJim Jagielski 	 	const KeyCode& rKeyCode = rNEvt.GetKeyEvent()->GetKeyCode();
1837*b1cdbd2cSJim Jagielski 		sal_uInt16 nCode = rKeyCode.GetCode();
1838*b1cdbd2cSJim Jagielski 
1839*b1cdbd2cSJim Jagielski 		if (  KEY_TAB == nCode )
1840*b1cdbd2cSJim Jagielski 		{
1841*b1cdbd2cSJim Jagielski 			// don't exit index pane with <TAB>
1842*b1cdbd2cSJim Jagielski 			sal_uInt16 nPageId = 0;
1843*b1cdbd2cSJim Jagielski 			HelpTabPage_Impl* pCurPage = GetCurrentPage( nPageId );
1844*b1cdbd2cSJim Jagielski 			Control* pControl = pCurPage->GetLastFocusControl();
1845*b1cdbd2cSJim Jagielski 			sal_Bool bShift = rKeyCode.IsShift();
1846*b1cdbd2cSJim Jagielski 			sal_Bool bCtrl = rKeyCode.IsMod1();
1847*b1cdbd2cSJim Jagielski 			if ( !bCtrl && bShift && aActiveLB.HasChildPathFocus() )
1848*b1cdbd2cSJim Jagielski 			{
1849*b1cdbd2cSJim Jagielski 				pControl->GrabFocus();
1850*b1cdbd2cSJim Jagielski 				nDone = 1;
1851*b1cdbd2cSJim Jagielski 			}
1852*b1cdbd2cSJim Jagielski 			else if ( !bCtrl && !bShift && pControl->HasChildPathFocus() )
1853*b1cdbd2cSJim Jagielski 			{
1854*b1cdbd2cSJim Jagielski 				aActiveLB.GrabFocus();
1855*b1cdbd2cSJim Jagielski 				nDone = 1;
1856*b1cdbd2cSJim Jagielski 			}
1857*b1cdbd2cSJim Jagielski 			else if ( bCtrl )
1858*b1cdbd2cSJim Jagielski 			{
1859*b1cdbd2cSJim Jagielski 				// <STRG><TAB> moves through the pages
1860*b1cdbd2cSJim Jagielski 				if ( nPageId < HELP_INDEX_PAGE_LAST )
1861*b1cdbd2cSJim Jagielski 					nPageId++;
1862*b1cdbd2cSJim Jagielski 				else
1863*b1cdbd2cSJim Jagielski 					nPageId = HELP_INDEX_PAGE_FIRST;
1864*b1cdbd2cSJim Jagielski 				aTabCtrl.SetCurPageId( (sal_uInt16)nPageId );
1865*b1cdbd2cSJim Jagielski 				ActivatePageHdl( &aTabCtrl );
1866*b1cdbd2cSJim Jagielski 				nDone = 1;
1867*b1cdbd2cSJim Jagielski 			}
1868*b1cdbd2cSJim Jagielski  		}
1869*b1cdbd2cSJim Jagielski 		else if ( aTabCtrl.HasFocus() && ( KEY_LEFT == nCode || KEY_RIGHT == nCode ) )
1870*b1cdbd2cSJim Jagielski 		{
1871*b1cdbd2cSJim Jagielski 			bWasCursorLeftOrRight = true;
1872*b1cdbd2cSJim Jagielski 		}
1873*b1cdbd2cSJim Jagielski 	}
1874*b1cdbd2cSJim Jagielski 
1875*b1cdbd2cSJim Jagielski 	return nDone ? nDone : Window::PreNotify( rNEvt );
1876*b1cdbd2cSJim Jagielski }
1877*b1cdbd2cSJim Jagielski 
1878*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1879*b1cdbd2cSJim Jagielski 
DataChanged(const DataChangedEvent & rDCEvt)1880*b1cdbd2cSJim Jagielski void SfxHelpIndexWindow_Impl::DataChanged( const DataChangedEvent& rDCEvt )
1881*b1cdbd2cSJim Jagielski {
1882*b1cdbd2cSJim Jagielski 	Window::DataChanged( rDCEvt );
1883*b1cdbd2cSJim Jagielski 
1884*b1cdbd2cSJim Jagielski 	if ( ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS )	||
1885*b1cdbd2cSJim Jagielski 		   ( rDCEvt.GetType() == DATACHANGED_DISPLAY ) ) &&
1886*b1cdbd2cSJim Jagielski 		 ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
1887*b1cdbd2cSJim Jagielski 	{
1888*b1cdbd2cSJim Jagielski 		SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetFaceColor() ) );
1889*b1cdbd2cSJim Jagielski 	}
1890*b1cdbd2cSJim Jagielski }
1891*b1cdbd2cSJim Jagielski 
1892*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1893*b1cdbd2cSJim Jagielski 
SetDoubleClickHdl(const Link & rLink)1894*b1cdbd2cSJim Jagielski void SfxHelpIndexWindow_Impl::SetDoubleClickHdl( const Link& rLink )
1895*b1cdbd2cSJim Jagielski {
1896*b1cdbd2cSJim Jagielski 	aPageDoubleClickLink = rLink;
1897*b1cdbd2cSJim Jagielski 	if ( pCPage )
1898*b1cdbd2cSJim Jagielski 		pCPage->SetOpenHdl( aPageDoubleClickLink );
1899*b1cdbd2cSJim Jagielski 	if ( pIPage )
1900*b1cdbd2cSJim Jagielski 		pIPage->SetDoubleClickHdl( aPageDoubleClickLink );
1901*b1cdbd2cSJim Jagielski 	if ( pSPage )
1902*b1cdbd2cSJim Jagielski 		pSPage->SetDoubleClickHdl( aPageDoubleClickLink );
1903*b1cdbd2cSJim Jagielski 	if ( pBPage )
1904*b1cdbd2cSJim Jagielski 		pBPage->SetDoubleClickHdl( aPageDoubleClickLink );
1905*b1cdbd2cSJim Jagielski }
1906*b1cdbd2cSJim Jagielski 
1907*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1908*b1cdbd2cSJim Jagielski 
SetFactory(const String & rFactory,sal_Bool bActive)1909*b1cdbd2cSJim Jagielski void SfxHelpIndexWindow_Impl::SetFactory( const String& rFactory, sal_Bool bActive )
1910*b1cdbd2cSJim Jagielski {
1911*b1cdbd2cSJim Jagielski 	if ( rFactory.Len() > 0 )
1912*b1cdbd2cSJim Jagielski 	{
1913*b1cdbd2cSJim Jagielski 		GetIndexPage()->SetFactory( rFactory );
1914*b1cdbd2cSJim Jagielski         // the index page did a check if rFactory is valid,
1915*b1cdbd2cSJim Jagielski         // so the index page always returns a valid factory
1916*b1cdbd2cSJim Jagielski         GetSearchPage()->SetFactory( GetIndexPage()->GetFactory() );
1917*b1cdbd2cSJim Jagielski 		if ( bActive )
1918*b1cdbd2cSJim Jagielski 			SetActiveFactory();
1919*b1cdbd2cSJim Jagielski 	}
1920*b1cdbd2cSJim Jagielski }
1921*b1cdbd2cSJim Jagielski 
1922*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1923*b1cdbd2cSJim Jagielski 
GetSelectEntry() const1924*b1cdbd2cSJim Jagielski String SfxHelpIndexWindow_Impl::GetSelectEntry() const
1925*b1cdbd2cSJim Jagielski {
1926*b1cdbd2cSJim Jagielski 	String sRet;
1927*b1cdbd2cSJim Jagielski 
1928*b1cdbd2cSJim Jagielski 	switch ( aTabCtrl.GetCurPageId() )
1929*b1cdbd2cSJim Jagielski 	{
1930*b1cdbd2cSJim Jagielski 		case HELP_INDEX_PAGE_CONTENTS:
1931*b1cdbd2cSJim Jagielski 			sRet = pCPage->GetSelectEntry();
1932*b1cdbd2cSJim Jagielski 			break;
1933*b1cdbd2cSJim Jagielski 
1934*b1cdbd2cSJim Jagielski 		case HELP_INDEX_PAGE_INDEX:
1935*b1cdbd2cSJim Jagielski 			sRet = pIPage->GetSelectEntry();
1936*b1cdbd2cSJim Jagielski 			break;
1937*b1cdbd2cSJim Jagielski 
1938*b1cdbd2cSJim Jagielski 		case HELP_INDEX_PAGE_SEARCH:
1939*b1cdbd2cSJim Jagielski 			sRet = pSPage->GetSelectEntry();
1940*b1cdbd2cSJim Jagielski 			break;
1941*b1cdbd2cSJim Jagielski 
1942*b1cdbd2cSJim Jagielski 		case HELP_INDEX_PAGE_BOOKMARKS:
1943*b1cdbd2cSJim Jagielski 			sRet = pBPage->GetSelectEntry();
1944*b1cdbd2cSJim Jagielski 			break;
1945*b1cdbd2cSJim Jagielski 	}
1946*b1cdbd2cSJim Jagielski 
1947*b1cdbd2cSJim Jagielski 	return sRet;
1948*b1cdbd2cSJim Jagielski }
1949*b1cdbd2cSJim Jagielski 
1950*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1951*b1cdbd2cSJim Jagielski 
AddBookmarks(const String & rTitle,const String & rURL)1952*b1cdbd2cSJim Jagielski void SfxHelpIndexWindow_Impl::AddBookmarks( const String& rTitle, const String& rURL )
1953*b1cdbd2cSJim Jagielski {
1954*b1cdbd2cSJim Jagielski 	GetBookmarksPage()->AddBookmarks( rTitle, rURL );
1955*b1cdbd2cSJim Jagielski }
1956*b1cdbd2cSJim Jagielski 
1957*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1958*b1cdbd2cSJim Jagielski 
IsValidFactory(const String & _rFactory)1959*b1cdbd2cSJim Jagielski bool SfxHelpIndexWindow_Impl::IsValidFactory( const String& _rFactory )
1960*b1cdbd2cSJim Jagielski {
1961*b1cdbd2cSJim Jagielski     bool bValid = false;
1962*b1cdbd2cSJim Jagielski     for ( sal_uInt16 i = 0; i < aActiveLB.GetEntryCount(); ++i )
1963*b1cdbd2cSJim Jagielski     {
1964*b1cdbd2cSJim Jagielski         String* pFactory = (String*)(sal_uIntPtr)aActiveLB.GetEntryData(i);
1965*b1cdbd2cSJim Jagielski         if ( *pFactory == _rFactory )
1966*b1cdbd2cSJim Jagielski         {
1967*b1cdbd2cSJim Jagielski             bValid = true;
1968*b1cdbd2cSJim Jagielski             break;
1969*b1cdbd2cSJim Jagielski         }
1970*b1cdbd2cSJim Jagielski     }
1971*b1cdbd2cSJim Jagielski     return bValid;
1972*b1cdbd2cSJim Jagielski }
1973*b1cdbd2cSJim Jagielski 
1974*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1975*b1cdbd2cSJim Jagielski 
ClearSearchPage()1976*b1cdbd2cSJim Jagielski void SfxHelpIndexWindow_Impl::ClearSearchPage()
1977*b1cdbd2cSJim Jagielski {
1978*b1cdbd2cSJim Jagielski 	if ( pSPage )
1979*b1cdbd2cSJim Jagielski 		pSPage->ClearPage();
1980*b1cdbd2cSJim Jagielski }
1981*b1cdbd2cSJim Jagielski 
1982*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1983*b1cdbd2cSJim Jagielski 
GrabFocusBack()1984*b1cdbd2cSJim Jagielski void SfxHelpIndexWindow_Impl::GrabFocusBack()
1985*b1cdbd2cSJim Jagielski {
1986*b1cdbd2cSJim Jagielski 	if ( aTabCtrl.GetCurPageId() == HELP_INDEX_PAGE_CONTENTS && pCPage )
1987*b1cdbd2cSJim Jagielski 		pCPage->SetFocusOnBox();
1988*b1cdbd2cSJim Jagielski 	else if ( aTabCtrl.GetCurPageId() == HELP_INDEX_PAGE_INDEX && pIPage )
1989*b1cdbd2cSJim Jagielski 		pIPage->SetFocusOnBox();
1990*b1cdbd2cSJim Jagielski 	else if ( aTabCtrl.GetCurPageId() == HELP_INDEX_PAGE_SEARCH && pSPage )
1991*b1cdbd2cSJim Jagielski 		pSPage->SetFocusOnBox();
1992*b1cdbd2cSJim Jagielski 	else if ( aTabCtrl.GetCurPageId() == HELP_INDEX_PAGE_BOOKMARKS && pBPage )
1993*b1cdbd2cSJim Jagielski 		pBPage->SetFocusOnBox();
1994*b1cdbd2cSJim Jagielski }
1995*b1cdbd2cSJim Jagielski 
1996*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1997*b1cdbd2cSJim Jagielski 
HasFocusOnEdit() const1998*b1cdbd2cSJim Jagielski sal_Bool SfxHelpIndexWindow_Impl::HasFocusOnEdit() const
1999*b1cdbd2cSJim Jagielski {
2000*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_False;
2001*b1cdbd2cSJim Jagielski 	if ( aTabCtrl.GetCurPageId() == HELP_INDEX_PAGE_INDEX && pIPage )
2002*b1cdbd2cSJim Jagielski 		bRet = pIPage->HasFocusOnEdit();
2003*b1cdbd2cSJim Jagielski 	else if ( aTabCtrl.GetCurPageId() == HELP_INDEX_PAGE_SEARCH && pSPage )
2004*b1cdbd2cSJim Jagielski 		bRet = pSPage->HasFocusOnEdit();
2005*b1cdbd2cSJim Jagielski 	return bRet;
2006*b1cdbd2cSJim Jagielski }
2007*b1cdbd2cSJim Jagielski 
2008*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2009*b1cdbd2cSJim Jagielski 
GetSearchText() const2010*b1cdbd2cSJim Jagielski String SfxHelpIndexWindow_Impl::GetSearchText() const
2011*b1cdbd2cSJim Jagielski {
2012*b1cdbd2cSJim Jagielski 	String sRet;
2013*b1cdbd2cSJim Jagielski 	if ( aTabCtrl.GetCurPageId() == HELP_INDEX_PAGE_SEARCH && pSPage )
2014*b1cdbd2cSJim Jagielski 		sRet = pSPage->GetSearchText();
2015*b1cdbd2cSJim Jagielski 	return sRet;
2016*b1cdbd2cSJim Jagielski }
2017*b1cdbd2cSJim Jagielski 
2018*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2019*b1cdbd2cSJim Jagielski 
IsFullWordSearch() const2020*b1cdbd2cSJim Jagielski sal_Bool SfxHelpIndexWindow_Impl::IsFullWordSearch() const
2021*b1cdbd2cSJim Jagielski {
2022*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_False;
2023*b1cdbd2cSJim Jagielski 	if ( aTabCtrl.GetCurPageId() == HELP_INDEX_PAGE_SEARCH && pSPage )
2024*b1cdbd2cSJim Jagielski 		bRet = pSPage->IsFullWordSearch();
2025*b1cdbd2cSJim Jagielski 	return bRet;
2026*b1cdbd2cSJim Jagielski }
2027*b1cdbd2cSJim Jagielski 
2028*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2029*b1cdbd2cSJim Jagielski 
OpenKeyword(const String & rKeyword)2030*b1cdbd2cSJim Jagielski void SfxHelpIndexWindow_Impl::OpenKeyword( const String& rKeyword )
2031*b1cdbd2cSJim Jagielski {
2032*b1cdbd2cSJim Jagielski 	sKeyword = rKeyword;
2033*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pIPage, "invalid index page" );
2034*b1cdbd2cSJim Jagielski 	pIPage->SetKeyword( sKeyword );
2035*b1cdbd2cSJim Jagielski }
2036*b1cdbd2cSJim Jagielski 
2037*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2038*b1cdbd2cSJim Jagielski 
SelectExecutableEntry()2039*b1cdbd2cSJim Jagielski void SfxHelpIndexWindow_Impl::SelectExecutableEntry()
2040*b1cdbd2cSJim Jagielski {
2041*b1cdbd2cSJim Jagielski 	if ( aTabCtrl.GetCurPageId() == HELP_INDEX_PAGE_INDEX && pIPage )
2042*b1cdbd2cSJim Jagielski 		pIPage->SelectExecutableEntry();
2043*b1cdbd2cSJim Jagielski }
2044*b1cdbd2cSJim Jagielski 
2045*b1cdbd2cSJim Jagielski // class TextWin_Impl ----------------------------------------------------
2046*b1cdbd2cSJim Jagielski 
TextWin_Impl(Window * p)2047*b1cdbd2cSJim Jagielski TextWin_Impl::TextWin_Impl( Window* p ) : DockingWindow( p, 0 )
2048*b1cdbd2cSJim Jagielski {
2049*b1cdbd2cSJim Jagielski }
2050*b1cdbd2cSJim Jagielski 
~TextWin_Impl()2051*b1cdbd2cSJim Jagielski TextWin_Impl::~TextWin_Impl()
2052*b1cdbd2cSJim Jagielski {
2053*b1cdbd2cSJim Jagielski }
2054*b1cdbd2cSJim Jagielski 
Notify(NotifyEvent & rNEvt)2055*b1cdbd2cSJim Jagielski long TextWin_Impl::Notify( NotifyEvent& rNEvt )
2056*b1cdbd2cSJim Jagielski {
2057*b1cdbd2cSJim Jagielski 	if( ( rNEvt.GetType() == EVENT_KEYINPUT ) && rNEvt.GetKeyEvent()->GetKeyCode().GetCode() == KEY_TAB )
2058*b1cdbd2cSJim Jagielski 		return GetParent()->Notify( rNEvt );
2059*b1cdbd2cSJim Jagielski 	else
2060*b1cdbd2cSJim Jagielski 		return DockingWindow::Notify( rNEvt );
2061*b1cdbd2cSJim Jagielski }
2062*b1cdbd2cSJim Jagielski 
2063*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2064*b1cdbd2cSJim Jagielski // remove docking area acceptor from layoutmanager, so it will not layout anything further .-)
lcl_disableLayoutOfFrame(const Reference<XFrame> & xFrame)2065*b1cdbd2cSJim Jagielski void lcl_disableLayoutOfFrame(const Reference< XFrame >& xFrame)
2066*b1cdbd2cSJim Jagielski {
2067*b1cdbd2cSJim Jagielski     static const ::rtl::OUString PROP_LAYOUT_MANAGER(DEFINE_CONST_UNICODE("LayoutManager"));
2068*b1cdbd2cSJim Jagielski 
2069*b1cdbd2cSJim Jagielski     Reference< XPropertySet > xPropSet(xFrame, UNO_QUERY_THROW);
2070*b1cdbd2cSJim Jagielski     xPropSet->setPropertyValue(PROP_LAYOUT_MANAGER, makeAny(Reference< XLayoutManager >()));
2071*b1cdbd2cSJim Jagielski }
2072*b1cdbd2cSJim Jagielski 
2073*b1cdbd2cSJim Jagielski // class SfxHelpTextWindow_Impl ------------------------------------------
2074*b1cdbd2cSJim Jagielski 
SfxHelpTextWindow_Impl(SfxHelpWindow_Impl * pParent)2075*b1cdbd2cSJim Jagielski SfxHelpTextWindow_Impl::SfxHelpTextWindow_Impl( SfxHelpWindow_Impl* pParent ) :
2076*b1cdbd2cSJim Jagielski 
2077*b1cdbd2cSJim Jagielski 	Window( pParent, WB_CLIPCHILDREN | WB_TABSTOP | WB_DIALOGCONTROL ),
2078*b1cdbd2cSJim Jagielski 
2079*b1cdbd2cSJim Jagielski 	aToolBox			( this, 0 ),
2080*b1cdbd2cSJim Jagielski     aOnStartupCB        ( this, SfxResId( RID_HELP_ONSTARTUP_BOX ) ),
2081*b1cdbd2cSJim Jagielski 	aIndexOnImage		( SfxResId( IMG_HELP_TOOLBOX_INDEX_ON ) ),
2082*b1cdbd2cSJim Jagielski     aIndexOffImage  	( SfxResId( IMG_HELP_TOOLBOX_INDEX_OFF ) ),
2083*b1cdbd2cSJim Jagielski 	aIndexOnText		( SfxResId( STR_HELP_BUTTON_INDEX_ON ) ),
2084*b1cdbd2cSJim Jagielski 	aIndexOffText		( SfxResId( STR_HELP_BUTTON_INDEX_OFF ) ),
2085*b1cdbd2cSJim Jagielski     aOnStartupText      ( SfxResId( RID_HELP_ONSTARTUP_TEXT ) ),
2086*b1cdbd2cSJim Jagielski 	pHelpWin			( pParent ),
2087*b1cdbd2cSJim Jagielski 	pTextWin			( new TextWin_Impl( this ) ),
2088*b1cdbd2cSJim Jagielski     pSrchDlg            ( NULL ),
2089*b1cdbd2cSJim Jagielski 	nMinPos				( 0 ),
2090*b1cdbd2cSJim Jagielski 	bIsDebug			( sal_False ),
2091*b1cdbd2cSJim Jagielski 	bIsIndexOn			( sal_False ),
2092*b1cdbd2cSJim Jagielski 	bIsInClose			( sal_False ),
2093*b1cdbd2cSJim Jagielski     bIsFullWordSearch   ( sal_False )
2094*b1cdbd2cSJim Jagielski 
2095*b1cdbd2cSJim Jagielski {
2096*b1cdbd2cSJim Jagielski 	sfx2::AddToTaskPaneList( &aToolBox );
2097*b1cdbd2cSJim Jagielski 
2098*b1cdbd2cSJim Jagielski     xFrame = Reference < XFrame > ( ::comphelper::getProcessServiceFactory()->createInstance(
2099*b1cdbd2cSJim Jagielski 		DEFINE_CONST_UNICODE("com.sun.star.frame.Frame") ), UNO_QUERY );
2100*b1cdbd2cSJim Jagielski     xFrame->initialize( VCLUnoHelper::GetInterface ( pTextWin ) );
2101*b1cdbd2cSJim Jagielski     xFrame->setName( DEFINE_CONST_UNICODE("OFFICE_HELP") );
2102*b1cdbd2cSJim Jagielski     lcl_disableLayoutOfFrame(xFrame);
2103*b1cdbd2cSJim Jagielski 
2104*b1cdbd2cSJim Jagielski 	aToolBox.SetHelpId( HID_HELP_TOOLBOX );
2105*b1cdbd2cSJim Jagielski 
2106*b1cdbd2cSJim Jagielski 	aToolBox.InsertItem( TBI_INDEX, aIndexOffText );
2107*b1cdbd2cSJim Jagielski 	aToolBox.SetHelpId( TBI_INDEX, HID_HELP_TOOLBOXITEM_INDEX );
2108*b1cdbd2cSJim Jagielski 	aToolBox.InsertSeparator();
2109*b1cdbd2cSJim Jagielski 	aToolBox.InsertItem( TBI_BACKWARD, String( SfxResId( STR_HELP_BUTTON_PREV ) ) );
2110*b1cdbd2cSJim Jagielski 	aToolBox.SetHelpId( TBI_BACKWARD, HID_HELP_TOOLBOXITEM_BACKWARD );
2111*b1cdbd2cSJim Jagielski 	aToolBox.InsertItem( TBI_FORWARD, String( SfxResId( STR_HELP_BUTTON_NEXT ) ) );
2112*b1cdbd2cSJim Jagielski 	aToolBox.SetHelpId( TBI_FORWARD, HID_HELP_TOOLBOXITEM_FORWARD );
2113*b1cdbd2cSJim Jagielski 	aToolBox.InsertItem( TBI_START, String( SfxResId( STR_HELP_BUTTON_START ) ) );
2114*b1cdbd2cSJim Jagielski 	aToolBox.SetHelpId( TBI_START, HID_HELP_TOOLBOXITEM_START );
2115*b1cdbd2cSJim Jagielski 	aToolBox.InsertSeparator();
2116*b1cdbd2cSJim Jagielski 	aToolBox.InsertItem( TBI_PRINT, String( SfxResId( STR_HELP_BUTTON_PRINT ) ) );
2117*b1cdbd2cSJim Jagielski 	aToolBox.SetHelpId( TBI_PRINT, HID_HELP_TOOLBOXITEM_PRINT );
2118*b1cdbd2cSJim Jagielski 	aToolBox.InsertItem( TBI_BOOKMARKS, String( SfxResId( STR_HELP_BUTTON_ADDBOOKMARK ) ) );
2119*b1cdbd2cSJim Jagielski 	aToolBox.SetHelpId( TBI_BOOKMARKS, HID_HELP_TOOLBOXITEM_BOOKMARKS );
2120*b1cdbd2cSJim Jagielski 	aToolBox.InsertItem( TBI_SEARCHDIALOG, String( SfxResId( STR_HELP_BUTTON_SEARCHDIALOG ) ) );
2121*b1cdbd2cSJim Jagielski 	aToolBox.SetHelpId( TBI_SEARCHDIALOG, HID_HELP_TOOLBOXITEM_SEARCHDIALOG );
2122*b1cdbd2cSJim Jagielski 
2123*b1cdbd2cSJim Jagielski     InitToolBoxImages();
2124*b1cdbd2cSJim Jagielski 	aToolBox.Show();
2125*b1cdbd2cSJim Jagielski 	InitOnStartupBox( false );
2126*b1cdbd2cSJim Jagielski 	aOnStartupCB.SetClickHdl( LINK( this, SfxHelpTextWindow_Impl, CheckHdl ) );
2127*b1cdbd2cSJim Jagielski 
2128*b1cdbd2cSJim Jagielski 	aSelectTimer.SetTimeoutHdl( LINK( this, SfxHelpTextWindow_Impl, SelectHdl ) );
2129*b1cdbd2cSJim Jagielski 	aSelectTimer.SetTimeout( 1000 );
2130*b1cdbd2cSJim Jagielski 
2131*b1cdbd2cSJim Jagielski 	char* pEnv = getenv( "help_debug" );
2132*b1cdbd2cSJim Jagielski 	if ( pEnv )
2133*b1cdbd2cSJim Jagielski 		bIsDebug = sal_True;
2134*b1cdbd2cSJim Jagielski 
2135*b1cdbd2cSJim Jagielski 	SvtMiscOptions().AddListenerLink( LINK( this, SfxHelpTextWindow_Impl, NotifyHdl ) );
2136*b1cdbd2cSJim Jagielski 
2137*b1cdbd2cSJim Jagielski 	if ( !aOnStartupCB.GetHelpId().getLength() )
2138*b1cdbd2cSJim Jagielski 		aOnStartupCB.SetHelpId( HID_HELP_ONSTARTUP_BOX );
2139*b1cdbd2cSJim Jagielski }
2140*b1cdbd2cSJim Jagielski 
2141*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2142*b1cdbd2cSJim Jagielski 
~SfxHelpTextWindow_Impl()2143*b1cdbd2cSJim Jagielski SfxHelpTextWindow_Impl::~SfxHelpTextWindow_Impl()
2144*b1cdbd2cSJim Jagielski {
2145*b1cdbd2cSJim Jagielski 	sfx2::RemoveFromTaskPaneList( &aToolBox );
2146*b1cdbd2cSJim Jagielski 
2147*b1cdbd2cSJim Jagielski 	bIsInClose = sal_True;
2148*b1cdbd2cSJim Jagielski 	SvtMiscOptions().RemoveListenerLink( LINK( this, SfxHelpTextWindow_Impl, NotifyHdl ) );
2149*b1cdbd2cSJim Jagielski 	delete pSrchDlg;
2150*b1cdbd2cSJim Jagielski }
2151*b1cdbd2cSJim Jagielski 
2152*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2153*b1cdbd2cSJim Jagielski 
HasSelection() const2154*b1cdbd2cSJim Jagielski sal_Bool SfxHelpTextWindow_Impl::HasSelection() const
2155*b1cdbd2cSJim Jagielski {
2156*b1cdbd2cSJim Jagielski 	// is there any selection in the text and not only a cursor?
2157*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_False;
2158*b1cdbd2cSJim Jagielski 	Reference < XTextRange > xRange = getCursor();
2159*b1cdbd2cSJim Jagielski 	if ( xRange.is() )
2160*b1cdbd2cSJim Jagielski 	{
2161*b1cdbd2cSJim Jagielski 		Reference < XText > xText = xRange->getText();
2162*b1cdbd2cSJim Jagielski 		Reference < XTextCursor > xCursor = xText->createTextCursorByRange( xRange );
2163*b1cdbd2cSJim Jagielski 		bRet = !xCursor->isCollapsed();
2164*b1cdbd2cSJim Jagielski 	}
2165*b1cdbd2cSJim Jagielski 
2166*b1cdbd2cSJim Jagielski 	return bRet;
2167*b1cdbd2cSJim Jagielski }
2168*b1cdbd2cSJim Jagielski 
2169*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2170*b1cdbd2cSJim Jagielski 
InitToolBoxImages()2171*b1cdbd2cSJim Jagielski void SfxHelpTextWindow_Impl::InitToolBoxImages()
2172*b1cdbd2cSJim Jagielski {
2173*b1cdbd2cSJim Jagielski 	sal_Bool bLarge = SvtMiscOptions().AreCurrentSymbolsLarge();
2174*b1cdbd2cSJim Jagielski 	sal_Bool bHiContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
2175*b1cdbd2cSJim Jagielski 
2176*b1cdbd2cSJim Jagielski 	aIndexOnImage = Image( SfxResId(
2177*b1cdbd2cSJim Jagielski 		bLarge ? bHiContrast ? IMG_HELP_TOOLBOX_HCL_INDEX_ON : IMG_HELP_TOOLBOX_L_INDEX_ON
2178*b1cdbd2cSJim Jagielski 			   : bHiContrast ? IMG_HELP_TOOLBOX_HC_INDEX_ON : IMG_HELP_TOOLBOX_INDEX_ON ) );
2179*b1cdbd2cSJim Jagielski 	aIndexOffImage = Image( SfxResId(
2180*b1cdbd2cSJim Jagielski 		bLarge ? bHiContrast ? IMG_HELP_TOOLBOX_HCL_INDEX_OFF : IMG_HELP_TOOLBOX_L_INDEX_OFF
2181*b1cdbd2cSJim Jagielski 			   : bHiContrast ? IMG_HELP_TOOLBOX_HC_INDEX_OFF : IMG_HELP_TOOLBOX_INDEX_OFF ) );
2182*b1cdbd2cSJim Jagielski 	aToolBox.SetItemImage( TBI_INDEX, bIsIndexOn ? aIndexOffImage : aIndexOnImage );
2183*b1cdbd2cSJim Jagielski 
2184*b1cdbd2cSJim Jagielski 	aToolBox.SetItemImage( TBI_BACKWARD, Image( SfxResId(
2185*b1cdbd2cSJim Jagielski 		bLarge ? bHiContrast ? IMG_HELP_TOOLBOX_HCL_PREV : IMG_HELP_TOOLBOX_L_PREV
2186*b1cdbd2cSJim Jagielski 			   : bHiContrast ? IMG_HELP_TOOLBOX_HC_PREV : IMG_HELP_TOOLBOX_PREV ) ) );
2187*b1cdbd2cSJim Jagielski 	aToolBox.SetItemImage( TBI_FORWARD, Image( SfxResId(
2188*b1cdbd2cSJim Jagielski 		bLarge ? bHiContrast ? IMG_HELP_TOOLBOX_HCL_NEXT : IMG_HELP_TOOLBOX_L_NEXT
2189*b1cdbd2cSJim Jagielski 			   : bHiContrast ? IMG_HELP_TOOLBOX_HC_NEXT : IMG_HELP_TOOLBOX_NEXT ) ) );
2190*b1cdbd2cSJim Jagielski 	aToolBox.SetItemImage( TBI_START, Image( SfxResId(
2191*b1cdbd2cSJim Jagielski 		bLarge ? bHiContrast ? IMG_HELP_TOOLBOX_HCL_START : IMG_HELP_TOOLBOX_L_START
2192*b1cdbd2cSJim Jagielski 			   : bHiContrast ? IMG_HELP_TOOLBOX_HC_START : IMG_HELP_TOOLBOX_START ) ) );
2193*b1cdbd2cSJim Jagielski 	aToolBox.SetItemImage( TBI_PRINT, Image( SfxResId(
2194*b1cdbd2cSJim Jagielski 		bLarge ? bHiContrast ? IMG_HELP_TOOLBOX_HCL_PRINT : IMG_HELP_TOOLBOX_L_PRINT
2195*b1cdbd2cSJim Jagielski 			   : bHiContrast ? IMG_HELP_TOOLBOX_HC_PRINT : IMG_HELP_TOOLBOX_PRINT ) ) );
2196*b1cdbd2cSJim Jagielski 	aToolBox.SetItemImage( TBI_BOOKMARKS, Image( SfxResId(
2197*b1cdbd2cSJim Jagielski 		bLarge ? bHiContrast ? IMG_HELP_TOOLBOX_HCL_BOOKMARKS : IMG_HELP_TOOLBOX_L_BOOKMARKS
2198*b1cdbd2cSJim Jagielski 			   : bHiContrast ? IMG_HELP_TOOLBOX_HC_BOOKMARKS : IMG_HELP_TOOLBOX_BOOKMARKS ) ) );
2199*b1cdbd2cSJim Jagielski 	aToolBox.SetItemImage( TBI_SEARCHDIALOG, Image( SfxResId(
2200*b1cdbd2cSJim Jagielski 		bLarge ? bHiContrast ? IMG_HELP_TOOLBOX_HCL_SEARCHDIALOG : IMG_HELP_TOOLBOX_L_SEARCHDIALOG
2201*b1cdbd2cSJim Jagielski 			   : bHiContrast ? IMG_HELP_TOOLBOX_HC_SEARCHDIALOG : IMG_HELP_TOOLBOX_SEARCHDIALOG ) ) );
2202*b1cdbd2cSJim Jagielski 
2203*b1cdbd2cSJim Jagielski 	Size aSize = aToolBox.CalcWindowSizePixel();
2204*b1cdbd2cSJim Jagielski 	aSize.Height() += TOOLBOX_OFFSET;
2205*b1cdbd2cSJim Jagielski 	aToolBox.SetPosSizePixel( Point( 0, TOOLBOX_OFFSET ), aSize );
2206*b1cdbd2cSJim Jagielski 
2207*b1cdbd2cSJim Jagielski 	SvtMiscOptions aMiscOptions;
2208*b1cdbd2cSJim Jagielski 	if ( aMiscOptions.GetToolboxStyle() != aToolBox.GetOutStyle() )
2209*b1cdbd2cSJim Jagielski 		aToolBox.SetOutStyle( aMiscOptions.GetToolboxStyle() );
2210*b1cdbd2cSJim Jagielski }
2211*b1cdbd2cSJim Jagielski 
2212*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2213*b1cdbd2cSJim Jagielski 
InitOnStartupBox(bool bOnlyText)2214*b1cdbd2cSJim Jagielski void SfxHelpTextWindow_Impl::InitOnStartupBox( bool bOnlyText )
2215*b1cdbd2cSJim Jagielski {
2216*b1cdbd2cSJim Jagielski     sCurrentFactory = SfxHelp::GetCurrentModuleIdentifier();
2217*b1cdbd2cSJim Jagielski 
2218*b1cdbd2cSJim Jagielski     Reference< XMultiServiceFactory > xMultiServiceFac = ::comphelper::getProcessServiceFactory();
2219*b1cdbd2cSJim Jagielski     Reference< XInterface > xConfig;
2220*b1cdbd2cSJim Jagielski     ::rtl::OUString sPath( PATH_OFFICE_FACTORIES );
2221*b1cdbd2cSJim Jagielski     sPath += sCurrentFactory;
2222*b1cdbd2cSJim Jagielski     ::rtl::OUString sKey( KEY_HELP_ON_OPEN );
2223*b1cdbd2cSJim Jagielski 
2224*b1cdbd2cSJim Jagielski     // Attention: This check boy knows two states:
2225*b1cdbd2cSJim Jagielski     // 1) Reading of the config key fails with an exception or by getting an empty Any (!) => check box must be hidden
2226*b1cdbd2cSJim Jagielski     // 2) We read sal_True/sal_False => check box must be shown and enabled/disabled
2227*b1cdbd2cSJim Jagielski 
2228*b1cdbd2cSJim Jagielski     bool bHideBox = true;
2229*b1cdbd2cSJim Jagielski     sal_Bool bHelpAtStartup = sal_False;
2230*b1cdbd2cSJim Jagielski     try
2231*b1cdbd2cSJim Jagielski     {
2232*b1cdbd2cSJim Jagielski         xConfiguration = ConfigurationHelper::openConfig(
2233*b1cdbd2cSJim Jagielski             xMultiServiceFac, PACKAGE_SETUP, ConfigurationHelper::E_STANDARD );
2234*b1cdbd2cSJim Jagielski         if ( xConfiguration.is() )
2235*b1cdbd2cSJim Jagielski         {
2236*b1cdbd2cSJim Jagielski             Any aAny = ConfigurationHelper::readRelativeKey( xConfiguration, sPath, sKey );
2237*b1cdbd2cSJim Jagielski             if (aAny >>= bHelpAtStartup)
2238*b1cdbd2cSJim Jagielski                 bHideBox = false;
2239*b1cdbd2cSJim Jagielski         }
2240*b1cdbd2cSJim Jagielski     }
2241*b1cdbd2cSJim Jagielski     catch( Exception& )
2242*b1cdbd2cSJim Jagielski     {
2243*b1cdbd2cSJim Jagielski         bHideBox = true;
2244*b1cdbd2cSJim Jagielski     }
2245*b1cdbd2cSJim Jagielski 
2246*b1cdbd2cSJim Jagielski     if ( bHideBox )
2247*b1cdbd2cSJim Jagielski 		aOnStartupCB.Hide();
2248*b1cdbd2cSJim Jagielski 	else
2249*b1cdbd2cSJim Jagielski 	{
2250*b1cdbd2cSJim Jagielski 		// detect module name
2251*b1cdbd2cSJim Jagielski 		String sModuleName;
2252*b1cdbd2cSJim Jagielski 
2253*b1cdbd2cSJim Jagielski         if ( xConfiguration.is() )
2254*b1cdbd2cSJim Jagielski         {
2255*b1cdbd2cSJim Jagielski             ::rtl::OUString sTemp;
2256*b1cdbd2cSJim Jagielski             sKey = KEY_UI_NAME;
2257*b1cdbd2cSJim Jagielski             try
2258*b1cdbd2cSJim Jagielski             {
2259*b1cdbd2cSJim Jagielski                 Any aAny = ConfigurationHelper::readRelativeKey( xConfiguration, sPath, sKey );
2260*b1cdbd2cSJim Jagielski                 aAny >>= sTemp;
2261*b1cdbd2cSJim Jagielski             }
2262*b1cdbd2cSJim Jagielski             catch( Exception& )
2263*b1cdbd2cSJim Jagielski             {
2264*b1cdbd2cSJim Jagielski                 DBG_ERRORFILE( "SfxHelpTextWindow_Impl::InitOnStartupBox(): unexpected exception" );
2265*b1cdbd2cSJim Jagielski             }
2266*b1cdbd2cSJim Jagielski             sModuleName = String( sTemp );
2267*b1cdbd2cSJim Jagielski         }
2268*b1cdbd2cSJim Jagielski 
2269*b1cdbd2cSJim Jagielski         if ( sModuleName.Len() > 0 )
2270*b1cdbd2cSJim Jagielski 		{
2271*b1cdbd2cSJim Jagielski 			// set module name in checkbox text
2272*b1cdbd2cSJim Jagielski 			String sText( aOnStartupText );
2273*b1cdbd2cSJim Jagielski 			sText.SearchAndReplace( String::CreateFromAscii( "%MODULENAME" ), sModuleName );
2274*b1cdbd2cSJim Jagielski 			aOnStartupCB.SetText( sText );
2275*b1cdbd2cSJim Jagielski 			// and show it
2276*b1cdbd2cSJim Jagielski 			aOnStartupCB.Show();
2277*b1cdbd2cSJim Jagielski 			// set check state
2278*b1cdbd2cSJim Jagielski             aOnStartupCB.Check( bHelpAtStartup );
2279*b1cdbd2cSJim Jagielski 			aOnStartupCB.SaveValue();
2280*b1cdbd2cSJim Jagielski 
2281*b1cdbd2cSJim Jagielski 			// calculate and set optimal width of the onstartup checkbox
2282*b1cdbd2cSJim Jagielski 			String sCBText( DEFINE_CONST_UNICODE( "XXX" ) );
2283*b1cdbd2cSJim Jagielski 			sCBText += aOnStartupCB.GetText();
2284*b1cdbd2cSJim Jagielski 		    long nTextWidth = aOnStartupCB.GetTextWidth( sCBText );
2285*b1cdbd2cSJim Jagielski 			Size aSize = aOnStartupCB.GetSizePixel();
2286*b1cdbd2cSJim Jagielski 			aSize.Width() = nTextWidth;
2287*b1cdbd2cSJim Jagielski 			aOnStartupCB.SetSizePixel( aSize );
2288*b1cdbd2cSJim Jagielski 			SetOnStartupBoxPosition();
2289*b1cdbd2cSJim Jagielski 		}
2290*b1cdbd2cSJim Jagielski 
2291*b1cdbd2cSJim Jagielski 		if ( !bOnlyText )
2292*b1cdbd2cSJim Jagielski 		{
2293*b1cdbd2cSJim Jagielski 			// set position of the checkbox
2294*b1cdbd2cSJim Jagielski 			Size a3Size = LogicToPixel( Size( 3, 3 ), MAP_APPFONT );
2295*b1cdbd2cSJim Jagielski 			Size aTBSize = aToolBox.GetSizePixel();
2296*b1cdbd2cSJim Jagielski 			Size aCBSize = aOnStartupCB.GetSizePixel();
2297*b1cdbd2cSJim Jagielski 			Point aPnt = aToolBox.GetPosPixel();
2298*b1cdbd2cSJim Jagielski 			aPnt.X() += aTBSize.Width() + a3Size.Width();
2299*b1cdbd2cSJim Jagielski 			aPnt.Y() += ( ( aTBSize.Height() - aCBSize.Height() ) / 2 );
2300*b1cdbd2cSJim Jagielski 			aOnStartupCB.SetPosPixel( aPnt );
2301*b1cdbd2cSJim Jagielski 			nMinPos = aPnt.X();
2302*b1cdbd2cSJim Jagielski 		}
2303*b1cdbd2cSJim Jagielski 	}
2304*b1cdbd2cSJim Jagielski }
2305*b1cdbd2cSJim Jagielski 
2306*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2307*b1cdbd2cSJim Jagielski 
SetOnStartupBoxPosition()2308*b1cdbd2cSJim Jagielski void SfxHelpTextWindow_Impl::SetOnStartupBoxPosition()
2309*b1cdbd2cSJim Jagielski {
2310*b1cdbd2cSJim Jagielski 	long nX = Max( GetOutputSizePixel().Width() - aOnStartupCB.GetSizePixel().Width(), nMinPos );
2311*b1cdbd2cSJim Jagielski 	Point aPos = aOnStartupCB.GetPosPixel();
2312*b1cdbd2cSJim Jagielski 	aPos.X() = nX;
2313*b1cdbd2cSJim Jagielski 	aOnStartupCB.SetPosPixel( aPos );
2314*b1cdbd2cSJim Jagielski }
2315*b1cdbd2cSJim Jagielski 
2316*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2317*b1cdbd2cSJim Jagielski 
GetBreakIterator()2318*b1cdbd2cSJim Jagielski Reference< XBreakIterator > SfxHelpTextWindow_Impl::GetBreakIterator()
2319*b1cdbd2cSJim Jagielski {
2320*b1cdbd2cSJim Jagielski 	if ( !xBreakIterator.is() )
2321*b1cdbd2cSJim Jagielski 		xBreakIterator = vcl::unohelper::CreateBreakIterator();
2322*b1cdbd2cSJim Jagielski     DBG_ASSERT( xBreakIterator.is(), "Could not create BreakIterator" );
2323*b1cdbd2cSJim Jagielski 	return xBreakIterator;
2324*b1cdbd2cSJim Jagielski }
2325*b1cdbd2cSJim Jagielski 
2326*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2327*b1cdbd2cSJim Jagielski 
getCursor() const2328*b1cdbd2cSJim Jagielski Reference< XTextRange > SfxHelpTextWindow_Impl::getCursor() const
2329*b1cdbd2cSJim Jagielski {
2330*b1cdbd2cSJim Jagielski 	// return the current cursor
2331*b1cdbd2cSJim Jagielski 	Reference< XTextRange > xCursor;
2332*b1cdbd2cSJim Jagielski 
2333*b1cdbd2cSJim Jagielski 	try
2334*b1cdbd2cSJim Jagielski 	{
2335*b1cdbd2cSJim Jagielski 		Reference < XSelectionSupplier > xSelSup( xFrame->getController(), UNO_QUERY );
2336*b1cdbd2cSJim Jagielski 		if ( xSelSup.is() )
2337*b1cdbd2cSJim Jagielski 		{
2338*b1cdbd2cSJim Jagielski 			Any aAny = xSelSup->getSelection();
2339*b1cdbd2cSJim Jagielski 			Reference < XIndexAccess > xSelection;
2340*b1cdbd2cSJim Jagielski 			if ( aAny >>= xSelection )
2341*b1cdbd2cSJim Jagielski 			{
2342*b1cdbd2cSJim Jagielski 				if ( xSelection->getCount() == 1 )
2343*b1cdbd2cSJim Jagielski 				{
2344*b1cdbd2cSJim Jagielski 					aAny = xSelection->getByIndex(0);
2345*b1cdbd2cSJim Jagielski 					aAny >>= xCursor;
2346*b1cdbd2cSJim Jagielski 				}
2347*b1cdbd2cSJim Jagielski 			}
2348*b1cdbd2cSJim Jagielski 		}
2349*b1cdbd2cSJim Jagielski 	}
2350*b1cdbd2cSJim Jagielski 	catch( Exception& )
2351*b1cdbd2cSJim Jagielski 	{
2352*b1cdbd2cSJim Jagielski 		DBG_ERROR( "SfxHelpTextWindow_Impl::getCursor(): unexpected exception" );
2353*b1cdbd2cSJim Jagielski 	}
2354*b1cdbd2cSJim Jagielski 
2355*b1cdbd2cSJim Jagielski 	return xCursor;
2356*b1cdbd2cSJim Jagielski }
2357*b1cdbd2cSJim Jagielski 
2358*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2359*b1cdbd2cSJim Jagielski 
isHandledKey(const KeyCode & _rKeyCode)2360*b1cdbd2cSJim Jagielski bool SfxHelpTextWindow_Impl::isHandledKey( const KeyCode& _rKeyCode )
2361*b1cdbd2cSJim Jagielski {
2362*b1cdbd2cSJim Jagielski 	bool bRet = false;
2363*b1cdbd2cSJim Jagielski 	sal_uInt16 nCode = _rKeyCode.GetCode();
2364*b1cdbd2cSJim Jagielski 
2365*b1cdbd2cSJim Jagielski 	// the keys <STRG><A> (select all), <STRG><C> (copy),
2366*b1cdbd2cSJim Jagielski 	//			<STRG><F> (find), <STRG><P> (print) and <STRG><W> (close window)
2367*b1cdbd2cSJim Jagielski 	// were handled in help
2368*b1cdbd2cSJim Jagielski 	if ( _rKeyCode.IsMod1() &&
2369*b1cdbd2cSJim Jagielski 		 ( KEY_A == nCode || KEY_C == nCode || KEY_F == nCode || KEY_P == nCode || KEY_W == nCode ) )
2370*b1cdbd2cSJim Jagielski 	{
2371*b1cdbd2cSJim Jagielski 		if ( KEY_F == nCode )
2372*b1cdbd2cSJim Jagielski 			DoSearch();
2373*b1cdbd2cSJim Jagielski 		else
2374*b1cdbd2cSJim Jagielski 			bRet = true;
2375*b1cdbd2cSJim Jagielski 	}
2376*b1cdbd2cSJim Jagielski 
2377*b1cdbd2cSJim Jagielski 	return bRet;
2378*b1cdbd2cSJim Jagielski }
2379*b1cdbd2cSJim Jagielski 
2380*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2381*b1cdbd2cSJim Jagielski 
IMPL_LINK(SfxHelpTextWindow_Impl,SelectHdl,Timer *,EMPTYARG)2382*b1cdbd2cSJim Jagielski IMPL_LINK( SfxHelpTextWindow_Impl, SelectHdl, Timer*, EMPTYARG )
2383*b1cdbd2cSJim Jagielski {
2384*b1cdbd2cSJim Jagielski 	try
2385*b1cdbd2cSJim Jagielski 	{
2386*b1cdbd2cSJim Jagielski 		// select the words, which are equal to the search text of the search page
2387*b1cdbd2cSJim Jagielski 		Reference < XController > xController = xFrame->getController();
2388*b1cdbd2cSJim Jagielski 		if ( xController.is() )
2389*b1cdbd2cSJim Jagielski 		{
2390*b1cdbd2cSJim Jagielski 			// get document
2391*b1cdbd2cSJim Jagielski 			Reference < XSearchable > xSearchable( xController->getModel(), UNO_QUERY );
2392*b1cdbd2cSJim Jagielski 			if ( xSearchable.is() )
2393*b1cdbd2cSJim Jagielski 			{
2394*b1cdbd2cSJim Jagielski 				// create descriptor, set string and find all words
2395*b1cdbd2cSJim Jagielski 				Reference < XSearchDescriptor > xSrchDesc = xSearchable->createSearchDescriptor();
2396*b1cdbd2cSJim Jagielski 				Reference < XPropertySet > xPropSet( xSrchDesc, UNO_QUERY );
2397*b1cdbd2cSJim Jagielski 				xPropSet->setPropertyValue( DEFINE_CONST_OUSTRING("SearchRegularExpression"),
2398*b1cdbd2cSJim Jagielski 											makeAny( sal_Bool( sal_True ) ) );
2399*b1cdbd2cSJim Jagielski 				if ( bIsFullWordSearch )
2400*b1cdbd2cSJim Jagielski 					xPropSet->setPropertyValue( DEFINE_CONST_OUSTRING("SearchWords"),
2401*b1cdbd2cSJim Jagielski 												makeAny( sal_Bool( sal_True ) ) );
2402*b1cdbd2cSJim Jagielski 
2403*b1cdbd2cSJim Jagielski 				String sSearchString = sfx2::PrepareSearchString( aSearchText, GetBreakIterator(), false );
2404*b1cdbd2cSJim Jagielski 				xSrchDesc->setSearchString( sSearchString );
2405*b1cdbd2cSJim Jagielski 				Reference< XIndexAccess > xSelection = xSearchable->findAll( xSrchDesc );
2406*b1cdbd2cSJim Jagielski 
2407*b1cdbd2cSJim Jagielski 				// then select all found words
2408*b1cdbd2cSJim Jagielski 				Reference < XSelectionSupplier > xSelectionSup( xController, UNO_QUERY );
2409*b1cdbd2cSJim Jagielski 				if ( xSelectionSup.is() )
2410*b1cdbd2cSJim Jagielski 				{
2411*b1cdbd2cSJim Jagielski 			    	Any aAny;
2412*b1cdbd2cSJim Jagielski 					aAny <<= xSelection;
2413*b1cdbd2cSJim Jagielski 					xSelectionSup->select( aAny );
2414*b1cdbd2cSJim Jagielski 				}
2415*b1cdbd2cSJim Jagielski 			}
2416*b1cdbd2cSJim Jagielski 		}
2417*b1cdbd2cSJim Jagielski 	}
2418*b1cdbd2cSJim Jagielski 	catch( Exception& )
2419*b1cdbd2cSJim Jagielski 	{
2420*b1cdbd2cSJim Jagielski 		DBG_ERROR( "SfxHelpTextWindow_Impl::SelectHdl(): unexpected exception" );
2421*b1cdbd2cSJim Jagielski 	}
2422*b1cdbd2cSJim Jagielski 
2423*b1cdbd2cSJim Jagielski 	return 1;
2424*b1cdbd2cSJim Jagielski }
2425*b1cdbd2cSJim Jagielski 
2426*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2427*b1cdbd2cSJim Jagielski 
IMPL_LINK(SfxHelpTextWindow_Impl,NotifyHdl,SvtMiscOptions *,pOptions)2428*b1cdbd2cSJim Jagielski IMPL_LINK( SfxHelpTextWindow_Impl, NotifyHdl, SvtMiscOptions*, pOptions )
2429*b1cdbd2cSJim Jagielski {
2430*b1cdbd2cSJim Jagielski     (void)pOptions; // unused variable
2431*b1cdbd2cSJim Jagielski     InitToolBoxImages();
2432*b1cdbd2cSJim Jagielski 	Resize();
2433*b1cdbd2cSJim Jagielski 	aToolBox.Invalidate();
2434*b1cdbd2cSJim Jagielski 	return 0;
2435*b1cdbd2cSJim Jagielski }
2436*b1cdbd2cSJim Jagielski 
2437*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2438*b1cdbd2cSJim Jagielski 
IMPL_LINK(SfxHelpTextWindow_Impl,FindHdl,sfx2::SearchDialog *,pDlg)2439*b1cdbd2cSJim Jagielski IMPL_LINK( SfxHelpTextWindow_Impl, FindHdl, sfx2::SearchDialog*, pDlg )
2440*b1cdbd2cSJim Jagielski {
2441*b1cdbd2cSJim Jagielski 	bool bWrapAround = ( NULL == pDlg );
2442*b1cdbd2cSJim Jagielski 	if ( bWrapAround )
2443*b1cdbd2cSJim Jagielski 		pDlg = pSrchDlg;
2444*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pDlg, "invalid search dialog" );
2445*b1cdbd2cSJim Jagielski 	String sSearchText = pDlg->GetSearchText();
2446*b1cdbd2cSJim Jagielski 	try
2447*b1cdbd2cSJim Jagielski 	{
2448*b1cdbd2cSJim Jagielski 		// select the words, which are equal to the search text of the search page
2449*b1cdbd2cSJim Jagielski 		Reference < XController > xController = xFrame->getController();
2450*b1cdbd2cSJim Jagielski 		if ( xController.is() )
2451*b1cdbd2cSJim Jagielski 		{
2452*b1cdbd2cSJim Jagielski 			// get document
2453*b1cdbd2cSJim Jagielski 			Reference < XSearchable > xSearchable( xController->getModel(), UNO_QUERY );
2454*b1cdbd2cSJim Jagielski 			if ( xSearchable.is() )
2455*b1cdbd2cSJim Jagielski 			{
2456*b1cdbd2cSJim Jagielski 				// create descriptor, set string and find all words
2457*b1cdbd2cSJim Jagielski 				Reference < XSearchDescriptor > xSrchDesc = xSearchable->createSearchDescriptor();
2458*b1cdbd2cSJim Jagielski 				Reference < XPropertySet > xPropSet( xSrchDesc, UNO_QUERY );
2459*b1cdbd2cSJim Jagielski 				xPropSet->setPropertyValue( DEFINE_CONST_OUSTRING("SearchWords"), makeAny( sal_Bool( pDlg->IsOnlyWholeWords() != false ) ) );
2460*b1cdbd2cSJim Jagielski 				xPropSet->setPropertyValue( DEFINE_CONST_OUSTRING("SearchCaseSensitive"), makeAny( sal_Bool( pDlg->IsMarchCase() != false ) ) );
2461*b1cdbd2cSJim Jagielski 				xPropSet->setPropertyValue( DEFINE_CONST_OUSTRING("SearchBackwards"), makeAny( sal_Bool( pDlg->IsSearchBackwards() != false ) ) );
2462*b1cdbd2cSJim Jagielski 				xSrchDesc->setSearchString( sSearchText );
2463*b1cdbd2cSJim Jagielski 				Reference< XInterface > xSelection;
2464*b1cdbd2cSJim Jagielski 				Reference< XTextRange > xCursor = getCursor();
2465*b1cdbd2cSJim Jagielski 
2466*b1cdbd2cSJim Jagielski 				if ( xCursor.is() )
2467*b1cdbd2cSJim Jagielski 				{
2468*b1cdbd2cSJim Jagielski 					if ( pDlg->IsSearchBackwards() )
2469*b1cdbd2cSJim Jagielski 						xCursor = xCursor->getStart();
2470*b1cdbd2cSJim Jagielski 					xSelection = xSearchable->findNext( xCursor, xSrchDesc );
2471*b1cdbd2cSJim Jagielski 				}
2472*b1cdbd2cSJim Jagielski 				else
2473*b1cdbd2cSJim Jagielski 					xSelection = xSearchable->findFirst( xSrchDesc );
2474*b1cdbd2cSJim Jagielski 
2475*b1cdbd2cSJim Jagielski 				// then select the found word
2476*b1cdbd2cSJim Jagielski 				if ( xSelection.is() )
2477*b1cdbd2cSJim Jagielski 				{
2478*b1cdbd2cSJim Jagielski 					Reference < XSelectionSupplier > xSelectionSup( xController, UNO_QUERY );
2479*b1cdbd2cSJim Jagielski 					if ( xSelectionSup.is() )
2480*b1cdbd2cSJim Jagielski 					{
2481*b1cdbd2cSJim Jagielski 				    	Any aAny;
2482*b1cdbd2cSJim Jagielski 						aAny <<= xSelection;
2483*b1cdbd2cSJim Jagielski 						xSelectionSup->select( aAny );
2484*b1cdbd2cSJim Jagielski 					}
2485*b1cdbd2cSJim Jagielski 				}
2486*b1cdbd2cSJim Jagielski 				else if ( pDlg->IsWrapAround() && !bWrapAround )
2487*b1cdbd2cSJim Jagielski 				{
2488*b1cdbd2cSJim Jagielski 			        Reference < text::XTextViewCursorSupplier > xCrsrSupp( xController, uno::UNO_QUERY );
2489*b1cdbd2cSJim Jagielski 					Reference < text::XTextViewCursor > xTVCrsr( xCrsrSupp->getViewCursor(), uno::UNO_QUERY );
2490*b1cdbd2cSJim Jagielski 			        if ( xTVCrsr.is() )
2491*b1cdbd2cSJim Jagielski 					{
2492*b1cdbd2cSJim Jagielski 						Reference < text::XTextDocument > xDoc( xController->getModel(), uno::UNO_QUERY );
2493*b1cdbd2cSJim Jagielski 						Reference < text::XText > xText = xDoc->getText();
2494*b1cdbd2cSJim Jagielski 						if ( xText.is() )
2495*b1cdbd2cSJim Jagielski 						{
2496*b1cdbd2cSJim Jagielski 							if ( pDlg->IsSearchBackwards() )
2497*b1cdbd2cSJim Jagielski 								xTVCrsr->gotoRange( xText->getEnd(), sal_False );
2498*b1cdbd2cSJim Jagielski 							else
2499*b1cdbd2cSJim Jagielski 								xTVCrsr->gotoRange( xText->getStart(), sal_False );
2500*b1cdbd2cSJim Jagielski 							FindHdl( NULL );
2501*b1cdbd2cSJim Jagielski 						}
2502*b1cdbd2cSJim Jagielski 					}
2503*b1cdbd2cSJim Jagielski 				}
2504*b1cdbd2cSJim Jagielski 				else
2505*b1cdbd2cSJim Jagielski 				{
2506*b1cdbd2cSJim Jagielski 					DBG_ASSERT( pSrchDlg, "no search dialog" );
2507*b1cdbd2cSJim Jagielski 					InfoBox aBox( pSrchDlg, SfxResId( RID_INFO_NOSEARCHTEXTFOUND ) );
2508*b1cdbd2cSJim Jagielski 					aBox.Execute();
2509*b1cdbd2cSJim Jagielski 					pSrchDlg->SetFocusOnEdit();
2510*b1cdbd2cSJim Jagielski 				}
2511*b1cdbd2cSJim Jagielski 			}
2512*b1cdbd2cSJim Jagielski 		}
2513*b1cdbd2cSJim Jagielski 	}
2514*b1cdbd2cSJim Jagielski 	catch( Exception& )
2515*b1cdbd2cSJim Jagielski 	{
2516*b1cdbd2cSJim Jagielski 		DBG_ERROR( "SfxHelpTextWindow_Impl::SelectHdl(): unexpected exception" );
2517*b1cdbd2cSJim Jagielski 	}
2518*b1cdbd2cSJim Jagielski 
2519*b1cdbd2cSJim Jagielski 	return 0;
2520*b1cdbd2cSJim Jagielski }
2521*b1cdbd2cSJim Jagielski 
2522*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2523*b1cdbd2cSJim Jagielski 
IMPL_LINK(SfxHelpTextWindow_Impl,CloseHdl,sfx2::SearchDialog *,pDlg)2524*b1cdbd2cSJim Jagielski IMPL_LINK( SfxHelpTextWindow_Impl, CloseHdl, sfx2::SearchDialog*, pDlg )
2525*b1cdbd2cSJim Jagielski {
2526*b1cdbd2cSJim Jagielski     if ( pDlg )
2527*b1cdbd2cSJim Jagielski         delete pSrchDlg;
2528*b1cdbd2cSJim Jagielski 	pSrchDlg = NULL;
2529*b1cdbd2cSJim Jagielski 	return 0;
2530*b1cdbd2cSJim Jagielski }
2531*b1cdbd2cSJim Jagielski 
2532*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2533*b1cdbd2cSJim Jagielski 
IMPL_LINK(SfxHelpTextWindow_Impl,CheckHdl,CheckBox *,pBox)2534*b1cdbd2cSJim Jagielski IMPL_LINK( SfxHelpTextWindow_Impl, CheckHdl, CheckBox*, pBox )
2535*b1cdbd2cSJim Jagielski {
2536*b1cdbd2cSJim Jagielski     if ( xConfiguration.is() )
2537*b1cdbd2cSJim Jagielski     {
2538*b1cdbd2cSJim Jagielski         sal_Bool bChecked = pBox->IsChecked();
2539*b1cdbd2cSJim Jagielski         ::rtl::OUString sPath( PATH_OFFICE_FACTORIES );
2540*b1cdbd2cSJim Jagielski         sPath += sCurrentFactory;
2541*b1cdbd2cSJim Jagielski         try
2542*b1cdbd2cSJim Jagielski         {
2543*b1cdbd2cSJim Jagielski             ConfigurationHelper::writeRelativeKey(
2544*b1cdbd2cSJim Jagielski                 xConfiguration, sPath, KEY_HELP_ON_OPEN, makeAny( bChecked ) );
2545*b1cdbd2cSJim Jagielski             ConfigurationHelper::flush( xConfiguration );
2546*b1cdbd2cSJim Jagielski         }
2547*b1cdbd2cSJim Jagielski         catch( Exception& )
2548*b1cdbd2cSJim Jagielski         {
2549*b1cdbd2cSJim Jagielski             DBG_ERRORFILE( "SfxHelpTextWindow_Impl::CheckHdl(): unexpected exception" );
2550*b1cdbd2cSJim Jagielski         }
2551*b1cdbd2cSJim Jagielski     }
2552*b1cdbd2cSJim Jagielski 
2553*b1cdbd2cSJim Jagielski     return 0;
2554*b1cdbd2cSJim Jagielski }
2555*b1cdbd2cSJim Jagielski 
2556*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2557*b1cdbd2cSJim Jagielski 
Resize()2558*b1cdbd2cSJim Jagielski void SfxHelpTextWindow_Impl::Resize()
2559*b1cdbd2cSJim Jagielski {
2560*b1cdbd2cSJim Jagielski 	Size aSize = GetOutputSizePixel();
2561*b1cdbd2cSJim Jagielski 	long nToolBoxHeight = aToolBox.GetSizePixel().Height() + TOOLBOX_OFFSET;
2562*b1cdbd2cSJim Jagielski 	aSize.Height() -= nToolBoxHeight;
2563*b1cdbd2cSJim Jagielski 	pTextWin->SetPosSizePixel( Point( 0, nToolBoxHeight  ), aSize );
2564*b1cdbd2cSJim Jagielski 	SetOnStartupBoxPosition();
2565*b1cdbd2cSJim Jagielski }
2566*b1cdbd2cSJim Jagielski 
2567*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2568*b1cdbd2cSJim Jagielski 
PreNotify(NotifyEvent & rNEvt)2569*b1cdbd2cSJim Jagielski long SfxHelpTextWindow_Impl::PreNotify( NotifyEvent& rNEvt )
2570*b1cdbd2cSJim Jagielski {
2571*b1cdbd2cSJim Jagielski 	long nDone = 0;
2572*b1cdbd2cSJim Jagielski 	sal_uInt16 nType = rNEvt.GetType();
2573*b1cdbd2cSJim Jagielski 	if ( EVENT_COMMAND == nType && rNEvt.GetCommandEvent() )
2574*b1cdbd2cSJim Jagielski 	{
2575*b1cdbd2cSJim Jagielski 		const CommandEvent* pCmdEvt = rNEvt.GetCommandEvent();
2576*b1cdbd2cSJim Jagielski 		Window* pCmdWin = rNEvt.GetWindow();
2577*b1cdbd2cSJim Jagielski 
2578*b1cdbd2cSJim Jagielski 		if ( pCmdEvt->GetCommand() == COMMAND_CONTEXTMENU && pCmdWin != this && pCmdWin != &aToolBox )
2579*b1cdbd2cSJim Jagielski 		{
2580*b1cdbd2cSJim Jagielski 			sal_Bool bHiContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
2581*b1cdbd2cSJim Jagielski 			Point aPos;
2582*b1cdbd2cSJim Jagielski 			if ( pCmdEvt->IsMouseEvent() )
2583*b1cdbd2cSJim Jagielski 				aPos = pCmdEvt->GetMousePosPixel();
2584*b1cdbd2cSJim Jagielski 			else
2585*b1cdbd2cSJim Jagielski 				aPos = Point( pTextWin->GetPosPixel().X() + 20, 20 );
2586*b1cdbd2cSJim Jagielski 			aPos.Y() += pTextWin->GetPosPixel().Y();
2587*b1cdbd2cSJim Jagielski 			PopupMenu aMenu;
2588*b1cdbd2cSJim Jagielski 			if ( bIsIndexOn )
2589*b1cdbd2cSJim Jagielski 				aMenu.InsertItem( TBI_INDEX, aIndexOffText, Image( SfxResId(
2590*b1cdbd2cSJim Jagielski 					bHiContrast ? IMG_HELP_TOOLBOX_HC_INDEX_OFF : IMG_HELP_TOOLBOX_INDEX_OFF ) ) );
2591*b1cdbd2cSJim Jagielski 			else
2592*b1cdbd2cSJim Jagielski 				aMenu.InsertItem( TBI_INDEX, aIndexOnText, Image( SfxResId(
2593*b1cdbd2cSJim Jagielski 					bHiContrast ? IMG_HELP_TOOLBOX_HC_INDEX_ON : IMG_HELP_TOOLBOX_INDEX_ON ) ) );
2594*b1cdbd2cSJim Jagielski 			aMenu.SetHelpId( TBI_INDEX, HID_HELP_TOOLBOXITEM_INDEX );
2595*b1cdbd2cSJim Jagielski 			aMenu.InsertSeparator();
2596*b1cdbd2cSJim Jagielski 			aMenu.InsertItem( TBI_BACKWARD, String( SfxResId( STR_HELP_BUTTON_PREV ) ),
2597*b1cdbd2cSJim Jagielski 				Image( SfxResId( bHiContrast ? IMG_HELP_TOOLBOX_HC_PREV : IMG_HELP_TOOLBOX_PREV ) ) );
2598*b1cdbd2cSJim Jagielski 			aMenu.SetHelpId( TBI_BACKWARD, HID_HELP_TOOLBOXITEM_BACKWARD );
2599*b1cdbd2cSJim Jagielski 			aMenu.EnableItem( TBI_BACKWARD, pHelpWin->HasHistoryPredecessor() );
2600*b1cdbd2cSJim Jagielski 			aMenu.InsertItem( TBI_FORWARD, String( SfxResId( STR_HELP_BUTTON_NEXT ) ),
2601*b1cdbd2cSJim Jagielski 				Image( SfxResId( bHiContrast ? IMG_HELP_TOOLBOX_HC_NEXT : IMG_HELP_TOOLBOX_NEXT ) ) );
2602*b1cdbd2cSJim Jagielski 			aMenu.SetHelpId( TBI_FORWARD, HID_HELP_TOOLBOXITEM_FORWARD );
2603*b1cdbd2cSJim Jagielski 			aMenu.EnableItem( TBI_FORWARD, pHelpWin->HasHistorySuccessor() );
2604*b1cdbd2cSJim Jagielski 			aMenu.InsertItem( TBI_START, String( SfxResId( STR_HELP_BUTTON_START ) ),
2605*b1cdbd2cSJim Jagielski 				Image( SfxResId( bHiContrast ? IMG_HELP_TOOLBOX_HC_START : IMG_HELP_TOOLBOX_START ) ) );
2606*b1cdbd2cSJim Jagielski 			aMenu.SetHelpId( TBI_START, HID_HELP_TOOLBOXITEM_START );
2607*b1cdbd2cSJim Jagielski 			aMenu.InsertSeparator();
2608*b1cdbd2cSJim Jagielski 			aMenu.InsertItem( TBI_PRINT, String( SfxResId( STR_HELP_BUTTON_PRINT ) ),
2609*b1cdbd2cSJim Jagielski 				Image( SfxResId( bHiContrast ? IMG_HELP_TOOLBOX_HC_PRINT : IMG_HELP_TOOLBOX_PRINT ) ) );
2610*b1cdbd2cSJim Jagielski 			aMenu.SetHelpId( TBI_PRINT, HID_HELP_TOOLBOXITEM_PRINT );
2611*b1cdbd2cSJim Jagielski 			aMenu.InsertItem( TBI_BOOKMARKS, String( SfxResId( STR_HELP_BUTTON_ADDBOOKMARK ) ),
2612*b1cdbd2cSJim Jagielski 				Image( SfxResId( bHiContrast ? IMG_HELP_TOOLBOX_HC_BOOKMARKS : IMG_HELP_TOOLBOX_BOOKMARKS ) ) );
2613*b1cdbd2cSJim Jagielski 			aMenu.SetHelpId( TBI_BOOKMARKS, HID_HELP_TOOLBOXITEM_BOOKMARKS );
2614*b1cdbd2cSJim Jagielski 			aMenu.InsertItem( TBI_SEARCHDIALOG, String( SfxResId( STR_HELP_BUTTON_SEARCHDIALOG ) ),
2615*b1cdbd2cSJim Jagielski 				Image( SfxResId( bHiContrast ? IMG_HELP_TOOLBOX_HC_SEARCHDIALOG : IMG_HELP_TOOLBOX_SEARCHDIALOG ) ) );
2616*b1cdbd2cSJim Jagielski 			aMenu.SetHelpId( TBI_SEARCHDIALOG, HID_HELP_TOOLBOXITEM_SEARCHDIALOG );
2617*b1cdbd2cSJim Jagielski 			aMenu.InsertSeparator();
2618*b1cdbd2cSJim Jagielski             aMenu.InsertItem( TBI_SELECTIONMODE, String( SfxResId( STR_HELP_MENU_TEXT_SELECTION_MODE ) ) );
2619*b1cdbd2cSJim Jagielski             aMenu.SetHelpId( TBI_SELECTIONMODE, HID_HELP_TEXT_SELECTION_MODE );
2620*b1cdbd2cSJim Jagielski             Reference < XDispatchProvider > xProv( xFrame, UNO_QUERY );
2621*b1cdbd2cSJim Jagielski             URL aURL;
2622*b1cdbd2cSJim Jagielski             aURL.Complete = DEFINE_CONST_UNICODE(".uno:SelectTextMode");
2623*b1cdbd2cSJim Jagielski 			PARSE_URL( aURL );
2624*b1cdbd2cSJim Jagielski 			Reference < XDispatch > xDisp = xProv.is() ?
2625*b1cdbd2cSJim Jagielski                     xProv->queryDispatch( aURL, rtl::OUString(), 0 ) : Reference < XDispatch >();
2626*b1cdbd2cSJim Jagielski             if(xDisp.is())
2627*b1cdbd2cSJim Jagielski             {
2628*b1cdbd2cSJim Jagielski                 HelpStatusListener_Impl* pStateListener;
2629*b1cdbd2cSJim Jagielski                 Reference<XStatusListener>xStateListener = pStateListener =
2630*b1cdbd2cSJim Jagielski                                         new HelpStatusListener_Impl(xDisp, aURL );
2631*b1cdbd2cSJim Jagielski                 FeatureStateEvent rEvent = pStateListener->GetStateEvent();
2632*b1cdbd2cSJim Jagielski 				sal_Bool bCheck = sal_False;
2633*b1cdbd2cSJim Jagielski                 rEvent.State >>= bCheck;
2634*b1cdbd2cSJim Jagielski                 aMenu.CheckItem(TBI_SELECTIONMODE, bCheck);
2635*b1cdbd2cSJim Jagielski             }
2636*b1cdbd2cSJim Jagielski             aMenu.InsertSeparator();
2637*b1cdbd2cSJim Jagielski             aMenu.InsertItem( TBI_COPY, String( SfxResId( STR_HELP_MENU_TEXT_COPY ) ),
2638*b1cdbd2cSJim Jagielski 				Image( SfxResId( bHiContrast ? IMG_HELP_TOOLBOX_HC_COPY : IMG_HELP_TOOLBOX_COPY ) ) );
2639*b1cdbd2cSJim Jagielski 			aMenu.SetHelpId( TBI_COPY, ".uno:Copy" );
2640*b1cdbd2cSJim Jagielski 			aMenu.EnableItem( TBI_COPY, HasSelection() );
2641*b1cdbd2cSJim Jagielski 
2642*b1cdbd2cSJim Jagielski 			if ( bIsDebug )
2643*b1cdbd2cSJim Jagielski 			{
2644*b1cdbd2cSJim Jagielski 				aMenu.InsertSeparator();
2645*b1cdbd2cSJim Jagielski 				aMenu.InsertItem( TBI_SOURCEVIEW, String( SfxResId( STR_HELP_BUTTON_SOURCEVIEW ) ) );
2646*b1cdbd2cSJim Jagielski 			}
2647*b1cdbd2cSJim Jagielski 
2648*b1cdbd2cSJim Jagielski 			if( SvtMenuOptions().IsEntryHidingEnabled() == sal_False )
2649*b1cdbd2cSJim Jagielski 				aMenu.SetMenuFlags( aMenu.GetMenuFlags() | MENU_FLAG_HIDEDISABLEDENTRIES );
2650*b1cdbd2cSJim Jagielski 
2651*b1cdbd2cSJim Jagielski 			sal_uInt16 nId = aMenu.Execute( this, aPos );
2652*b1cdbd2cSJim Jagielski 			pHelpWin->DoAction( nId );
2653*b1cdbd2cSJim Jagielski 			nDone = 1;
2654*b1cdbd2cSJim Jagielski 		}
2655*b1cdbd2cSJim Jagielski 	}
2656*b1cdbd2cSJim Jagielski 	else if ( EVENT_KEYINPUT == nType && rNEvt.GetKeyEvent() )
2657*b1cdbd2cSJim Jagielski 	{
2658*b1cdbd2cSJim Jagielski 	 	const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
2659*b1cdbd2cSJim Jagielski 	 	const KeyCode& rKeyCode = pKEvt->GetKeyCode();
2660*b1cdbd2cSJim Jagielski 		sal_uInt16 nKeyGroup = rKeyCode.GetGroup();
2661*b1cdbd2cSJim Jagielski 		sal_uInt16 nKey = rKeyCode.GetCode();
2662*b1cdbd2cSJim Jagielski 		if ( KEYGROUP_ALPHA == nKeyGroup &&  !isHandledKey( rKeyCode ) )
2663*b1cdbd2cSJim Jagielski 		{
2664*b1cdbd2cSJim Jagielski 			// do nothing disables the writer accelerators
2665*b1cdbd2cSJim Jagielski 			nDone = 1;
2666*b1cdbd2cSJim Jagielski  		}
2667*b1cdbd2cSJim Jagielski 		else if ( rKeyCode.IsMod1() && ( KEY_F4 == nKey || KEY_W == nKey ) )
2668*b1cdbd2cSJim Jagielski 		{
2669*b1cdbd2cSJim Jagielski 			// <STRG><F4> or <STRG><W> -> close top frame
2670*b1cdbd2cSJim Jagielski 			pHelpWin->CloseWindow();
2671*b1cdbd2cSJim Jagielski 			nDone = 1;
2672*b1cdbd2cSJim Jagielski 		}
2673*b1cdbd2cSJim Jagielski         else if ( KEY_TAB == nKey && aOnStartupCB.HasChildPathFocus() )
2674*b1cdbd2cSJim Jagielski 		{
2675*b1cdbd2cSJim Jagielski 			aToolBox.GrabFocus();
2676*b1cdbd2cSJim Jagielski 			nDone = 1;
2677*b1cdbd2cSJim Jagielski 		}
2678*b1cdbd2cSJim Jagielski 	}
2679*b1cdbd2cSJim Jagielski 
2680*b1cdbd2cSJim Jagielski 	return nDone ? nDone : Window::PreNotify( rNEvt );
2681*b1cdbd2cSJim Jagielski }
2682*b1cdbd2cSJim Jagielski 
2683*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2684*b1cdbd2cSJim Jagielski 
GetFocus()2685*b1cdbd2cSJim Jagielski void SfxHelpTextWindow_Impl::GetFocus()
2686*b1cdbd2cSJim Jagielski {
2687*b1cdbd2cSJim Jagielski 	if ( !bIsInClose )
2688*b1cdbd2cSJim Jagielski 	{
2689*b1cdbd2cSJim Jagielski 		try
2690*b1cdbd2cSJim Jagielski 		{
2691*b1cdbd2cSJim Jagielski 			if( xFrame.is() )
2692*b1cdbd2cSJim Jagielski 			{
2693*b1cdbd2cSJim Jagielski 				Reference< ::com::sun::star::awt::XWindow >	xWindow = xFrame->getComponentWindow();
2694*b1cdbd2cSJim Jagielski 				if( xWindow.is() )
2695*b1cdbd2cSJim Jagielski 					xWindow->setFocus();
2696*b1cdbd2cSJim Jagielski 			}
2697*b1cdbd2cSJim Jagielski 		}
2698*b1cdbd2cSJim Jagielski 		catch( Exception& )
2699*b1cdbd2cSJim Jagielski 		{
2700*b1cdbd2cSJim Jagielski 			DBG_ERRORFILE( "SfxHelpTextWindow_Impl::GetFocus(): unexpected exception" );
2701*b1cdbd2cSJim Jagielski 		}
2702*b1cdbd2cSJim Jagielski 	}
2703*b1cdbd2cSJim Jagielski }
2704*b1cdbd2cSJim Jagielski 
2705*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2706*b1cdbd2cSJim Jagielski 
DataChanged(const DataChangedEvent & rDCEvt)2707*b1cdbd2cSJim Jagielski void SfxHelpTextWindow_Impl::DataChanged( const DataChangedEvent& rDCEvt )
2708*b1cdbd2cSJim Jagielski {
2709*b1cdbd2cSJim Jagielski 	Window::DataChanged( rDCEvt );
2710*b1cdbd2cSJim Jagielski 
2711*b1cdbd2cSJim Jagielski 	if ( ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS )	||
2712*b1cdbd2cSJim Jagielski 		   ( rDCEvt.GetType() == DATACHANGED_DISPLAY ) ) &&
2713*b1cdbd2cSJim Jagielski 		 ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
2714*b1cdbd2cSJim Jagielski 	{
2715*b1cdbd2cSJim Jagielski 		SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetFaceColor() ) );
2716*b1cdbd2cSJim Jagielski 		InitToolBoxImages();
2717*b1cdbd2cSJim Jagielski 	}
2718*b1cdbd2cSJim Jagielski }
2719*b1cdbd2cSJim Jagielski 
2720*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2721*b1cdbd2cSJim Jagielski 
ToggleIndex(sal_Bool bOn)2722*b1cdbd2cSJim Jagielski void SfxHelpTextWindow_Impl::ToggleIndex( sal_Bool bOn )
2723*b1cdbd2cSJim Jagielski {
2724*b1cdbd2cSJim Jagielski 	bIsIndexOn = bOn;
2725*b1cdbd2cSJim Jagielski 	if ( bIsIndexOn )
2726*b1cdbd2cSJim Jagielski 	{
2727*b1cdbd2cSJim Jagielski 		aToolBox.SetItemImage( TBI_INDEX, aIndexOffImage );
2728*b1cdbd2cSJim Jagielski 		aToolBox.SetItemText( TBI_INDEX, aIndexOffText );
2729*b1cdbd2cSJim Jagielski 	}
2730*b1cdbd2cSJim Jagielski 	else
2731*b1cdbd2cSJim Jagielski 	{
2732*b1cdbd2cSJim Jagielski 		aToolBox.SetItemImage( TBI_INDEX, aIndexOnImage );
2733*b1cdbd2cSJim Jagielski 		aToolBox.SetItemText( TBI_INDEX, aIndexOnText );
2734*b1cdbd2cSJim Jagielski 	}
2735*b1cdbd2cSJim Jagielski }
2736*b1cdbd2cSJim Jagielski 
2737*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2738*b1cdbd2cSJim Jagielski 
SelectSearchText(const String & rSearchText,sal_Bool _bIsFullWordSearch)2739*b1cdbd2cSJim Jagielski void SfxHelpTextWindow_Impl::SelectSearchText( const String& rSearchText, sal_Bool _bIsFullWordSearch )
2740*b1cdbd2cSJim Jagielski {
2741*b1cdbd2cSJim Jagielski 	aSearchText = rSearchText;
2742*b1cdbd2cSJim Jagielski 	bIsFullWordSearch = _bIsFullWordSearch;
2743*b1cdbd2cSJim Jagielski 	aSelectTimer.Start();
2744*b1cdbd2cSJim Jagielski }
2745*b1cdbd2cSJim Jagielski 
2746*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2747*b1cdbd2cSJim Jagielski 
SetPageStyleHeaderOff() const2748*b1cdbd2cSJim Jagielski void SfxHelpTextWindow_Impl::SetPageStyleHeaderOff() const
2749*b1cdbd2cSJim Jagielski {
2750*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
2751*b1cdbd2cSJim Jagielski 	sal_Bool bSetOff = sal_False;
2752*b1cdbd2cSJim Jagielski #endif
2753*b1cdbd2cSJim Jagielski 	// set off the pagestyle header to prevent print output of the help URL
2754*b1cdbd2cSJim Jagielski 	try
2755*b1cdbd2cSJim Jagielski 	{
2756*b1cdbd2cSJim Jagielski 		Reference < XController > xController = xFrame->getController();
2757*b1cdbd2cSJim Jagielski 		Reference < XSelectionSupplier > xSelSup( xController, UNO_QUERY );
2758*b1cdbd2cSJim Jagielski 		if ( xSelSup.is() )
2759*b1cdbd2cSJim Jagielski 		{
2760*b1cdbd2cSJim Jagielski 			Reference < XIndexAccess > xSelection;
2761*b1cdbd2cSJim Jagielski 			if ( xSelSup->getSelection() >>= xSelection )
2762*b1cdbd2cSJim Jagielski 			{
2763*b1cdbd2cSJim Jagielski 				Reference < XTextRange > xRange;
2764*b1cdbd2cSJim Jagielski 				if ( xSelection->getByIndex(0) >>= xRange )
2765*b1cdbd2cSJim Jagielski 				{
2766*b1cdbd2cSJim Jagielski 					Reference < XText > xText = xRange->getText();
2767*b1cdbd2cSJim Jagielski 					Reference < XPropertySet > xProps( xText->createTextCursorByRange( xRange ), UNO_QUERY );
2768*b1cdbd2cSJim Jagielski 					::rtl::OUString sStyleName;
2769*b1cdbd2cSJim Jagielski 					if ( xProps->getPropertyValue( DEFINE_CONST_OUSTRING("PageStyleName") ) >>= sStyleName )
2770*b1cdbd2cSJim Jagielski 					{
2771*b1cdbd2cSJim Jagielski 						Reference < XStyleFamiliesSupplier > xStyles( xController->getModel(), UNO_QUERY );
2772*b1cdbd2cSJim Jagielski 						Reference < XNameContainer > xContainer;
2773*b1cdbd2cSJim Jagielski 						if ( xStyles->getStyleFamilies()->getByName( DEFINE_CONST_OUSTRING("PageStyles") )
2774*b1cdbd2cSJim Jagielski 							 >>= xContainer )
2775*b1cdbd2cSJim Jagielski 						{
2776*b1cdbd2cSJim Jagielski 							Reference < XStyle > xStyle;
2777*b1cdbd2cSJim Jagielski 							if ( xContainer->getByName( sStyleName ) >>= xStyle )
2778*b1cdbd2cSJim Jagielski 							{
2779*b1cdbd2cSJim Jagielski 								Reference < XPropertySet > xPropSet( xStyle, UNO_QUERY );
2780*b1cdbd2cSJim Jagielski 								xPropSet->setPropertyValue( DEFINE_CONST_OUSTRING("HeaderIsOn"),
2781*b1cdbd2cSJim Jagielski 															makeAny( sal_Bool( sal_False ) ) );
2782*b1cdbd2cSJim Jagielski 
2783*b1cdbd2cSJim Jagielski                                 Reference< XModifiable > xReset(xStyles, UNO_QUERY);
2784*b1cdbd2cSJim Jagielski                                 xReset->setModified(sal_False);
2785*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
2786*b1cdbd2cSJim Jagielski 								bSetOff = sal_True;
2787*b1cdbd2cSJim Jagielski #endif
2788*b1cdbd2cSJim Jagielski 							}
2789*b1cdbd2cSJim Jagielski 						}
2790*b1cdbd2cSJim Jagielski 					}
2791*b1cdbd2cSJim Jagielski 				}
2792*b1cdbd2cSJim Jagielski 			}
2793*b1cdbd2cSJim Jagielski 		}
2794*b1cdbd2cSJim Jagielski 	}
2795*b1cdbd2cSJim Jagielski 	catch( Exception& )
2796*b1cdbd2cSJim Jagielski 	{
2797*b1cdbd2cSJim Jagielski 		DBG_ERRORFILE( "SfxHelpTextWindow_Impl::SetPageStyleHeaderOff(): unexpected exception" );
2798*b1cdbd2cSJim Jagielski 	}
2799*b1cdbd2cSJim Jagielski 
2800*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
2801*b1cdbd2cSJim Jagielski 	if ( !bSetOff )
2802*b1cdbd2cSJim Jagielski 	{
2803*b1cdbd2cSJim Jagielski 		DBG_ERRORFILE( "SfxHelpTextWindow_Impl::SetPageStyleHeaderOff(): set off failed" );
2804*b1cdbd2cSJim Jagielski 	}
2805*b1cdbd2cSJim Jagielski #endif
2806*b1cdbd2cSJim Jagielski }
2807*b1cdbd2cSJim Jagielski 
2808*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2809*b1cdbd2cSJim Jagielski 
CloseFrame()2810*b1cdbd2cSJim Jagielski void SfxHelpTextWindow_Impl::CloseFrame()
2811*b1cdbd2cSJim Jagielski {
2812*b1cdbd2cSJim Jagielski 	bIsInClose = sal_True;
2813*b1cdbd2cSJim Jagielski     try
2814*b1cdbd2cSJim Jagielski     {
2815*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseable > xCloseable  ( xFrame, ::com::sun::star::uno::UNO_QUERY );
2816*b1cdbd2cSJim Jagielski         if (xCloseable.is())
2817*b1cdbd2cSJim Jagielski             xCloseable->close(sal_True);
2818*b1cdbd2cSJim Jagielski     }
2819*b1cdbd2cSJim Jagielski     catch( ::com::sun::star::util::CloseVetoException& )
2820*b1cdbd2cSJim Jagielski     {
2821*b1cdbd2cSJim Jagielski     }
2822*b1cdbd2cSJim Jagielski }
2823*b1cdbd2cSJim Jagielski 
2824*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2825*b1cdbd2cSJim Jagielski 
DoSearch()2826*b1cdbd2cSJim Jagielski void SfxHelpTextWindow_Impl::DoSearch()
2827*b1cdbd2cSJim Jagielski {
2828*b1cdbd2cSJim Jagielski 	if ( !pSrchDlg )
2829*b1cdbd2cSJim Jagielski 	{
2830*b1cdbd2cSJim Jagielski 		// create the search dialog
2831*b1cdbd2cSJim Jagielski 		pSrchDlg = new sfx2::SearchDialog( pTextWin, DEFINE_CONST_UNICODE("HelpSearchDialog") );
2832*b1cdbd2cSJim Jagielski 		// set handler
2833*b1cdbd2cSJim Jagielski 		pSrchDlg->SetFindHdl( LINK( this, SfxHelpTextWindow_Impl, FindHdl ) );
2834*b1cdbd2cSJim Jagielski 		pSrchDlg->SetCloseHdl( LINK( this, SfxHelpTextWindow_Impl, CloseHdl ) );
2835*b1cdbd2cSJim Jagielski 		// get selected text of the help page to set it as the search text
2836*b1cdbd2cSJim Jagielski 		Reference< XTextRange > xCursor = getCursor();
2837*b1cdbd2cSJim Jagielski 		if ( xCursor.is() )
2838*b1cdbd2cSJim Jagielski 		{
2839*b1cdbd2cSJim Jagielski 			String sText = xCursor->getString();
2840*b1cdbd2cSJim Jagielski 			if ( sText.Len() > 0 )
2841*b1cdbd2cSJim Jagielski 				pSrchDlg->SetSearchText( sText );
2842*b1cdbd2cSJim Jagielski 		}
2843*b1cdbd2cSJim Jagielski 		pSrchDlg->Show();
2844*b1cdbd2cSJim Jagielski 	}
2845*b1cdbd2cSJim Jagielski }
2846*b1cdbd2cSJim Jagielski 
2847*b1cdbd2cSJim Jagielski // class SfxHelpWindow_Impl ----------------------------------------------
2848*b1cdbd2cSJim Jagielski 
Resize()2849*b1cdbd2cSJim Jagielski void SfxHelpWindow_Impl::Resize()
2850*b1cdbd2cSJim Jagielski {
2851*b1cdbd2cSJim Jagielski 	SplitWindow::Resize();
2852*b1cdbd2cSJim Jagielski 	InitSizes();
2853*b1cdbd2cSJim Jagielski }
2854*b1cdbd2cSJim Jagielski 
2855*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2856*b1cdbd2cSJim Jagielski 
Split()2857*b1cdbd2cSJim Jagielski void SfxHelpWindow_Impl::Split()
2858*b1cdbd2cSJim Jagielski {
2859*b1cdbd2cSJim Jagielski 	static long	nMinSplitSize = 5;
2860*b1cdbd2cSJim Jagielski 	static long nMaxSplitSize = 99 - nMinSplitSize;
2861*b1cdbd2cSJim Jagielski 
2862*b1cdbd2cSJim Jagielski 	SplitWindow::Split();
2863*b1cdbd2cSJim Jagielski 
2864*b1cdbd2cSJim Jagielski 	nIndexSize = GetItemSize( INDEXWIN_ID );
2865*b1cdbd2cSJim Jagielski 	nTextSize = GetItemSize( TEXTWIN_ID );
2866*b1cdbd2cSJim Jagielski 
2867*b1cdbd2cSJim Jagielski 	sal_Bool		bMod = sal_False;
2868*b1cdbd2cSJim Jagielski 	if( nIndexSize < nMinSplitSize )
2869*b1cdbd2cSJim Jagielski 	{
2870*b1cdbd2cSJim Jagielski 		nIndexSize = nMinSplitSize;
2871*b1cdbd2cSJim Jagielski 		nTextSize = nMaxSplitSize;
2872*b1cdbd2cSJim Jagielski 
2873*b1cdbd2cSJim Jagielski 		bMod = sal_True;
2874*b1cdbd2cSJim Jagielski 	}
2875*b1cdbd2cSJim Jagielski 	else if( nTextSize < nMinSplitSize )
2876*b1cdbd2cSJim Jagielski 	{
2877*b1cdbd2cSJim Jagielski 		nTextSize = nMinSplitSize;
2878*b1cdbd2cSJim Jagielski 		nIndexSize = nMaxSplitSize;
2879*b1cdbd2cSJim Jagielski 
2880*b1cdbd2cSJim Jagielski 		bMod = sal_True;
2881*b1cdbd2cSJim Jagielski 	}
2882*b1cdbd2cSJim Jagielski 	else
2883*b1cdbd2cSJim Jagielski 		bMod = sal_False;
2884*b1cdbd2cSJim Jagielski 
2885*b1cdbd2cSJim Jagielski 	if( bMod )
2886*b1cdbd2cSJim Jagielski 	{
2887*b1cdbd2cSJim Jagielski 		SetItemSize( INDEXWIN_ID, nIndexSize );
2888*b1cdbd2cSJim Jagielski 		SetItemSize( TEXTWIN_ID, nTextSize );
2889*b1cdbd2cSJim Jagielski 	}
2890*b1cdbd2cSJim Jagielski 
2891*b1cdbd2cSJim Jagielski 	InitSizes();
2892*b1cdbd2cSJim Jagielski }
2893*b1cdbd2cSJim Jagielski 
2894*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2895*b1cdbd2cSJim Jagielski 
GetFocus()2896*b1cdbd2cSJim Jagielski void SfxHelpWindow_Impl::GetFocus()
2897*b1cdbd2cSJim Jagielski {
2898*b1cdbd2cSJim Jagielski 	pTextWin->GrabFocus();
2899*b1cdbd2cSJim Jagielski }
2900*b1cdbd2cSJim Jagielski 
2901*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2902*b1cdbd2cSJim Jagielski 
MakeLayout()2903*b1cdbd2cSJim Jagielski void SfxHelpWindow_Impl::MakeLayout()
2904*b1cdbd2cSJim Jagielski {
2905*b1cdbd2cSJim Jagielski 	if ( nHeight > 0 && xWindow.is() )
2906*b1cdbd2cSJim Jagielski 	{
2907*b1cdbd2cSJim Jagielski        	Window* pScreenWin = VCLUnoHelper::GetWindow( xWindow );
2908*b1cdbd2cSJim Jagielski 
2909*b1cdbd2cSJim Jagielski         /* #i55528#
2910*b1cdbd2cSJim Jagielski             Hide() / Show() will produce starnge effects.
2911*b1cdbd2cSJim Jagielski             The returned size (used later to be written back into the configuration)
2912*b1cdbd2cSJim Jagielski             isnt the right after a resize during the window is hidden.
2913*b1cdbd2cSJim Jagielski             If this resize is done if the window is visible evyrthing works as aspected.
2914*b1cdbd2cSJim Jagielski             Some VCL-patches could not solve this problem so I've established the
2915*b1cdbd2cSJim Jagielski             workaround: resize the help window if it's visible .-)
2916*b1cdbd2cSJim Jagielski         */
2917*b1cdbd2cSJim Jagielski //      pScreenWin->Hide();
2918*b1cdbd2cSJim Jagielski 
2919*b1cdbd2cSJim Jagielski 		::com::sun::star::awt::Rectangle aRect = xWindow->getPosSize();
2920*b1cdbd2cSJim Jagielski 		sal_Int32 nOldWidth = bIndex ? nCollapseWidth : nExpandWidth;
2921*b1cdbd2cSJim Jagielski 		sal_Int32 nWidth = bIndex ? nExpandWidth : nCollapseWidth;
2922*b1cdbd2cSJim Jagielski     	xWindow->setPosSize( aRect.X, aRect.Y, nWidth, nHeight, ::com::sun::star::awt::PosSize::SIZE );
2923*b1cdbd2cSJim Jagielski 
2924*b1cdbd2cSJim Jagielski 		if ( aRect.Width > 0 && aRect.Height > 0 )
2925*b1cdbd2cSJim Jagielski 		{
2926*b1cdbd2cSJim Jagielski 			Rectangle aScreenRect = pScreenWin->GetClientWindowExtentsRelative( NULL );
2927*b1cdbd2cSJim Jagielski     		Point aNewPos = aScreenRect.TopLeft();
2928*b1cdbd2cSJim Jagielski 			sal_Int32 nDiffWidth = nOldWidth - nWidth;
2929*b1cdbd2cSJim Jagielski 			aNewPos.X() += nDiffWidth;
2930*b1cdbd2cSJim Jagielski 			pScreenWin->SetPosPixel( aNewPos );
2931*b1cdbd2cSJim Jagielski 		}
2932*b1cdbd2cSJim Jagielski 		else if ( aWinPos.X() > 0 && aWinPos.Y() > 0 )
2933*b1cdbd2cSJim Jagielski 			pScreenWin->SetPosPixel( aWinPos );
2934*b1cdbd2cSJim Jagielski 
2935*b1cdbd2cSJim Jagielski //      pScreenWin->Show();
2936*b1cdbd2cSJim Jagielski 	}
2937*b1cdbd2cSJim Jagielski 
2938*b1cdbd2cSJim Jagielski 	Clear();
2939*b1cdbd2cSJim Jagielski 
2940*b1cdbd2cSJim Jagielski 	if ( bIndex )
2941*b1cdbd2cSJim Jagielski 	{
2942*b1cdbd2cSJim Jagielski 		pIndexWin->Show();
2943*b1cdbd2cSJim Jagielski 		InsertItem( COLSET_ID, 100, SPLITWINDOW_APPEND, SPLITSET_ID, SWIB_PERCENTSIZE | SWIB_COLSET );
2944*b1cdbd2cSJim Jagielski 		InsertItem( INDEXWIN_ID, pIndexWin, nIndexSize, SPLITWINDOW_APPEND, COLSET_ID, SWIB_PERCENTSIZE );
2945*b1cdbd2cSJim Jagielski 		InsertItem( TEXTWIN_ID, pTextWin, nTextSize, SPLITWINDOW_APPEND, COLSET_ID, SWIB_PERCENTSIZE );
2946*b1cdbd2cSJim Jagielski 	}
2947*b1cdbd2cSJim Jagielski 	else
2948*b1cdbd2cSJim Jagielski 	{
2949*b1cdbd2cSJim Jagielski 		pIndexWin->Hide();
2950*b1cdbd2cSJim Jagielski 		InsertItem( COLSET_ID, 100, SPLITWINDOW_APPEND, SPLITSET_ID, SWIB_PERCENTSIZE | SWIB_COLSET );
2951*b1cdbd2cSJim Jagielski 		InsertItem( TEXTWIN_ID, pTextWin, 100, SPLITWINDOW_APPEND, 1, SWIB_PERCENTSIZE );
2952*b1cdbd2cSJim Jagielski 	}
2953*b1cdbd2cSJim Jagielski }
2954*b1cdbd2cSJim Jagielski 
2955*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2956*b1cdbd2cSJim Jagielski 
InitSizes()2957*b1cdbd2cSJim Jagielski void SfxHelpWindow_Impl::InitSizes()
2958*b1cdbd2cSJim Jagielski {
2959*b1cdbd2cSJim Jagielski 	if ( xWindow.is() )
2960*b1cdbd2cSJim Jagielski 	{
2961*b1cdbd2cSJim Jagielski 		::com::sun::star::awt::Rectangle aRect = xWindow->getPosSize();
2962*b1cdbd2cSJim Jagielski 		nHeight = aRect.Height;
2963*b1cdbd2cSJim Jagielski 
2964*b1cdbd2cSJim Jagielski 		if ( bIndex )
2965*b1cdbd2cSJim Jagielski 		{
2966*b1cdbd2cSJim Jagielski 			nExpandWidth = aRect.Width;
2967*b1cdbd2cSJim Jagielski 			nCollapseWidth = nExpandWidth * nTextSize / 100;
2968*b1cdbd2cSJim Jagielski 		}
2969*b1cdbd2cSJim Jagielski 		else
2970*b1cdbd2cSJim Jagielski 		{
2971*b1cdbd2cSJim Jagielski 			nCollapseWidth = aRect.Width;
2972*b1cdbd2cSJim Jagielski 			nExpandWidth = nCollapseWidth * 100 / nTextSize;
2973*b1cdbd2cSJim Jagielski 		}
2974*b1cdbd2cSJim Jagielski 	}
2975*b1cdbd2cSJim Jagielski }
2976*b1cdbd2cSJim Jagielski 
2977*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2978*b1cdbd2cSJim Jagielski 
LoadConfig()2979*b1cdbd2cSJim Jagielski void SfxHelpWindow_Impl::LoadConfig()
2980*b1cdbd2cSJim Jagielski {
2981*b1cdbd2cSJim Jagielski  	SvtViewOptions aViewOpt( E_WINDOW, CONFIGNAME_HELPWIN );
2982*b1cdbd2cSJim Jagielski 	if ( aViewOpt.Exists() )
2983*b1cdbd2cSJim Jagielski 	{
2984*b1cdbd2cSJim Jagielski 		bIndex = aViewOpt.IsVisible();
2985*b1cdbd2cSJim Jagielski 		String aUserData;
2986*b1cdbd2cSJim Jagielski         Any aUserItem = aViewOpt.GetUserItem( USERITEM_NAME );
2987*b1cdbd2cSJim Jagielski 		rtl::OUString aTemp;
2988*b1cdbd2cSJim Jagielski 		if ( aUserItem >>= aTemp )
2989*b1cdbd2cSJim Jagielski 		{
2990*b1cdbd2cSJim Jagielski 			aUserData = String( aTemp );
2991*b1cdbd2cSJim Jagielski 			DBG_ASSERT( aUserData.GetTokenCount() == 6, "invalid user data" );
2992*b1cdbd2cSJim Jagielski 			sal_uInt16 nIdx = 0;
2993*b1cdbd2cSJim Jagielski 			nIndexSize = aUserData.GetToken( 0, ';', nIdx ).ToInt32();
2994*b1cdbd2cSJim Jagielski 			nTextSize = aUserData.GetToken( 0, ';', nIdx ).ToInt32();
2995*b1cdbd2cSJim Jagielski 			sal_Int32 nWidth = aUserData.GetToken( 0, ';', nIdx ).ToInt32();
2996*b1cdbd2cSJim Jagielski 			nHeight = aUserData.GetToken( 0, ';', nIdx ).ToInt32();
2997*b1cdbd2cSJim Jagielski 			aWinPos.X() = aUserData.GetToken( 0, ';', nIdx ).ToInt32();
2998*b1cdbd2cSJim Jagielski 			aWinPos.Y() = aUserData.GetToken( 0, ';', nIdx ).ToInt32();
2999*b1cdbd2cSJim Jagielski 			if ( bIndex )
3000*b1cdbd2cSJim Jagielski 			{
3001*b1cdbd2cSJim Jagielski 				nExpandWidth = nWidth;
3002*b1cdbd2cSJim Jagielski 				nCollapseWidth = nExpandWidth * nTextSize / 100;
3003*b1cdbd2cSJim Jagielski 			}
3004*b1cdbd2cSJim Jagielski 			else
3005*b1cdbd2cSJim Jagielski 			{
3006*b1cdbd2cSJim Jagielski 				nCollapseWidth = nWidth;
3007*b1cdbd2cSJim Jagielski 				nExpandWidth = nCollapseWidth * 100 / nTextSize;
3008*b1cdbd2cSJim Jagielski 			}
3009*b1cdbd2cSJim Jagielski 		}
3010*b1cdbd2cSJim Jagielski 
3011*b1cdbd2cSJim Jagielski 		pTextWin->ToggleIndex( bIndex );
3012*b1cdbd2cSJim Jagielski 	}
3013*b1cdbd2cSJim Jagielski }
3014*b1cdbd2cSJim Jagielski 
3015*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3016*b1cdbd2cSJim Jagielski 
SaveConfig()3017*b1cdbd2cSJim Jagielski void SfxHelpWindow_Impl::SaveConfig()
3018*b1cdbd2cSJim Jagielski {
3019*b1cdbd2cSJim Jagielski 	SvtViewOptions aViewOpt( E_WINDOW, CONFIGNAME_HELPWIN );
3020*b1cdbd2cSJim Jagielski 	sal_Int32 nW = 0, nH = 0;
3021*b1cdbd2cSJim Jagielski 
3022*b1cdbd2cSJim Jagielski 	if ( xWindow.is() )
3023*b1cdbd2cSJim Jagielski 	{
3024*b1cdbd2cSJim Jagielski 		::com::sun::star::awt::Rectangle aRect = xWindow->getPosSize();
3025*b1cdbd2cSJim Jagielski 		nW = aRect.Width;
3026*b1cdbd2cSJim Jagielski 		nH = aRect.Height;
3027*b1cdbd2cSJim Jagielski 	}
3028*b1cdbd2cSJim Jagielski 
3029*b1cdbd2cSJim Jagielski 	aViewOpt.SetVisible( bIndex );
3030*b1cdbd2cSJim Jagielski 	String aUserData = String::CreateFromInt32( nIndexSize );
3031*b1cdbd2cSJim Jagielski 	aUserData += ';';
3032*b1cdbd2cSJim Jagielski 	aUserData += String::CreateFromInt32( nTextSize );
3033*b1cdbd2cSJim Jagielski 	aUserData += ';';
3034*b1cdbd2cSJim Jagielski 	aUserData += String::CreateFromInt32( nW );
3035*b1cdbd2cSJim Jagielski 	aUserData += ';';
3036*b1cdbd2cSJim Jagielski 	aUserData += String::CreateFromInt32( nH );
3037*b1cdbd2cSJim Jagielski 
3038*b1cdbd2cSJim Jagielski    	Window* pScreenWin = VCLUnoHelper::GetWindow( xWindow );
3039*b1cdbd2cSJim Jagielski 	aWinPos = pScreenWin->GetWindowExtentsRelative( NULL ).TopLeft();
3040*b1cdbd2cSJim Jagielski 	aUserData += ';';
3041*b1cdbd2cSJim Jagielski 	aUserData += String::CreateFromInt32( aWinPos.X() );
3042*b1cdbd2cSJim Jagielski 	aUserData += ';';
3043*b1cdbd2cSJim Jagielski 	aUserData += String::CreateFromInt32( aWinPos.Y() );
3044*b1cdbd2cSJim Jagielski 
3045*b1cdbd2cSJim Jagielski     aViewOpt.SetUserItem( USERITEM_NAME, makeAny( rtl::OUString( aUserData ) ) );
3046*b1cdbd2cSJim Jagielski }
3047*b1cdbd2cSJim Jagielski 
3048*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3049*b1cdbd2cSJim Jagielski 
ShowStartPage()3050*b1cdbd2cSJim Jagielski void SfxHelpWindow_Impl::ShowStartPage()
3051*b1cdbd2cSJim Jagielski {
3052*b1cdbd2cSJim Jagielski     ::rtl::OUString sHelpURL = SfxHelpWindow_Impl::buildHelpURL(pIndexWin->GetFactory(),
3053*b1cdbd2cSJim Jagielski                                                                 DEFINE_CONST_UNICODE("/start"),
3054*b1cdbd2cSJim Jagielski                                                                 ::rtl::OUString(),
3055*b1cdbd2cSJim Jagielski                                                                 sal_True);
3056*b1cdbd2cSJim Jagielski     loadHelpContent(sHelpURL);
3057*b1cdbd2cSJim Jagielski }
3058*b1cdbd2cSJim Jagielski 
3059*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3060*b1cdbd2cSJim Jagielski 
IMPL_LINK(SfxHelpWindow_Impl,SelectHdl,ToolBox *,pToolBox)3061*b1cdbd2cSJim Jagielski IMPL_LINK( SfxHelpWindow_Impl, SelectHdl, ToolBox* , pToolBox )
3062*b1cdbd2cSJim Jagielski {
3063*b1cdbd2cSJim Jagielski 	if ( pToolBox )
3064*b1cdbd2cSJim Jagielski 	{
3065*b1cdbd2cSJim Jagielski 		bGrabFocusToToolBox = pToolBox->HasChildPathFocus();
3066*b1cdbd2cSJim Jagielski 		DoAction( pToolBox->GetCurItemId() );
3067*b1cdbd2cSJim Jagielski 	}
3068*b1cdbd2cSJim Jagielski 
3069*b1cdbd2cSJim Jagielski 	return 1;
3070*b1cdbd2cSJim Jagielski }
3071*b1cdbd2cSJim Jagielski 
3072*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
3073*b1cdbd2cSJim Jagielski 
IMPL_LINK(SfxHelpWindow_Impl,OpenHdl,SfxHelpIndexWindow_Impl *,EMPTYARG)3074*b1cdbd2cSJim Jagielski IMPL_LINK( SfxHelpWindow_Impl, OpenHdl, SfxHelpIndexWindow_Impl* , EMPTYARG )
3075*b1cdbd2cSJim Jagielski {
3076*b1cdbd2cSJim Jagielski 	pIndexWin->SelectExecutableEntry();
3077*b1cdbd2cSJim Jagielski 	String aEntry = pIndexWin->GetSelectEntry();
3078*b1cdbd2cSJim Jagielski 
3079*b1cdbd2cSJim Jagielski 	if ( aEntry.Len() < 1 )
3080*b1cdbd2cSJim Jagielski         return 0;
3081*b1cdbd2cSJim Jagielski 
3082*b1cdbd2cSJim Jagielski     ::rtl::OUString sHelpURL;
3083*b1cdbd2cSJim Jagielski 
3084*b1cdbd2cSJim Jagielski // 	INetURLObject aObj(aEntry);
3085*b1cdbd2cSJim Jagielski //  sal_Bool bComplete = ( aObj.GetProtocol() == INET_PROT_VND_SUN_STAR_HELP );
3086*b1cdbd2cSJim Jagielski 
3087*b1cdbd2cSJim Jagielski     sal_Bool bComplete = rtl::OUString(aEntry).toAsciiLowerCase().match(rtl::OUString::createFromAscii("vnd.sun.star.help"),0);
3088*b1cdbd2cSJim Jagielski 
3089*b1cdbd2cSJim Jagielski 	if (bComplete)
3090*b1cdbd2cSJim Jagielski         sHelpURL = ::rtl::OUString(aEntry);
3091*b1cdbd2cSJim Jagielski     else
3092*b1cdbd2cSJim Jagielski 	{
3093*b1cdbd2cSJim Jagielski 		String aId;
3094*b1cdbd2cSJim Jagielski         String aAnchor = String('#');
3095*b1cdbd2cSJim Jagielski 		if ( aEntry.GetTokenCount( '#' ) == 2 )
3096*b1cdbd2cSJim Jagielski 		{
3097*b1cdbd2cSJim Jagielski 			aId = aEntry.GetToken( 0, '#' );
3098*b1cdbd2cSJim Jagielski 			aAnchor += aEntry.GetToken( 1, '#' );
3099*b1cdbd2cSJim Jagielski 		}
3100*b1cdbd2cSJim Jagielski 		else
3101*b1cdbd2cSJim Jagielski 			aId = aEntry;
3102*b1cdbd2cSJim Jagielski 
3103*b1cdbd2cSJim Jagielski 		aEntry  = '/';
3104*b1cdbd2cSJim Jagielski 		aEntry += aId;
3105*b1cdbd2cSJim Jagielski 
3106*b1cdbd2cSJim Jagielski         sHelpURL = SfxHelpWindow_Impl::buildHelpURL(pIndexWin->GetFactory(),
3107*b1cdbd2cSJim Jagielski                                                     aEntry,
3108*b1cdbd2cSJim Jagielski                                                     aAnchor,
3109*b1cdbd2cSJim Jagielski                                                     sal_True);
3110*b1cdbd2cSJim Jagielski 	}
3111*b1cdbd2cSJim Jagielski 
3112*b1cdbd2cSJim Jagielski     loadHelpContent(sHelpURL);
3113*b1cdbd2cSJim Jagielski 
3114*b1cdbd2cSJim Jagielski 	return 0;
3115*b1cdbd2cSJim Jagielski }
3116*b1cdbd2cSJim Jagielski 
3117*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
3118*b1cdbd2cSJim Jagielski 
IMPL_LINK(SfxHelpWindow_Impl,SelectFactoryHdl,SfxHelpIndexWindow_Impl *,pWin)3119*b1cdbd2cSJim Jagielski IMPL_LINK( SfxHelpWindow_Impl, SelectFactoryHdl, SfxHelpIndexWindow_Impl* , pWin )
3120*b1cdbd2cSJim Jagielski {
3121*b1cdbd2cSJim Jagielski     if ( sTitle.Len() == 0 )
3122*b1cdbd2cSJim Jagielski         sTitle = GetParent()->GetText();
3123*b1cdbd2cSJim Jagielski 
3124*b1cdbd2cSJim Jagielski 	String aNewTitle = sTitle;
3125*b1cdbd2cSJim Jagielski 	aNewTitle += DEFINE_CONST_UNICODE(" - ");
3126*b1cdbd2cSJim Jagielski 	aNewTitle += pIndexWin->GetActiveFactoryTitle();
3127*b1cdbd2cSJim Jagielski 
3128*b1cdbd2cSJim Jagielski     Reference< XTitle > xTitle(xFrame, UNO_QUERY);
3129*b1cdbd2cSJim Jagielski     if (xTitle.is ())
3130*b1cdbd2cSJim Jagielski         xTitle->setTitle (aNewTitle);
3131*b1cdbd2cSJim Jagielski 
3132*b1cdbd2cSJim Jagielski 	if ( pWin )
3133*b1cdbd2cSJim Jagielski 		ShowStartPage();
3134*b1cdbd2cSJim Jagielski 	pIndexWin->ClearSearchPage();
3135*b1cdbd2cSJim Jagielski 
3136*b1cdbd2cSJim Jagielski 	return 0;
3137*b1cdbd2cSJim Jagielski }
3138*b1cdbd2cSJim Jagielski 
3139*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3140*b1cdbd2cSJim Jagielski 
IMPL_LINK(SfxHelpWindow_Impl,ChangeHdl,HelpListener_Impl *,pListener)3141*b1cdbd2cSJim Jagielski IMPL_LINK( SfxHelpWindow_Impl, ChangeHdl, HelpListener_Impl*, pListener )
3142*b1cdbd2cSJim Jagielski {
3143*b1cdbd2cSJim Jagielski 	SetFactory( pListener->GetFactory() );
3144*b1cdbd2cSJim Jagielski 	return 0;
3145*b1cdbd2cSJim Jagielski }
3146*b1cdbd2cSJim Jagielski 
3147*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3148*b1cdbd2cSJim Jagielski 
openDone(const::rtl::OUString & sURL,sal_Bool bSuccess)3149*b1cdbd2cSJim Jagielski void SfxHelpWindow_Impl::openDone(const ::rtl::OUString& sURL    ,
3150*b1cdbd2cSJim Jagielski                                         sal_Bool         bSuccess)
3151*b1cdbd2cSJim Jagielski {
3152*b1cdbd2cSJim Jagielski 	INetURLObject aObj( sURL );
3153*b1cdbd2cSJim Jagielski 	if ( aObj.GetProtocol() == INET_PROT_VND_SUN_STAR_HELP )
3154*b1cdbd2cSJim Jagielski 		SetFactory( aObj.GetHost() );
3155*b1cdbd2cSJim Jagielski 	if ( IsWait() )
3156*b1cdbd2cSJim Jagielski 		LeaveWait();
3157*b1cdbd2cSJim Jagielski 	if ( bGrabFocusToToolBox )
3158*b1cdbd2cSJim Jagielski 	{
3159*b1cdbd2cSJim Jagielski 		pTextWin->GetToolBox().GrabFocus();
3160*b1cdbd2cSJim Jagielski 		bGrabFocusToToolBox = sal_False;
3161*b1cdbd2cSJim Jagielski 	}
3162*b1cdbd2cSJim Jagielski 	else
3163*b1cdbd2cSJim Jagielski 		pIndexWin->GrabFocusBack();
3164*b1cdbd2cSJim Jagielski 	if ( bSuccess )
3165*b1cdbd2cSJim Jagielski 	{
3166*b1cdbd2cSJim Jagielski 		// set some view settings: "prevent help tips" and "helpid == 68245"
3167*b1cdbd2cSJim Jagielski 		try
3168*b1cdbd2cSJim Jagielski 		{
3169*b1cdbd2cSJim Jagielski 			Reference < XController > xController = pTextWin->getFrame()->getController();
3170*b1cdbd2cSJim Jagielski 			if ( xController.is() )
3171*b1cdbd2cSJim Jagielski 			{
3172*b1cdbd2cSJim Jagielski 				Reference < XViewSettingsSupplier > xSettings( xController, UNO_QUERY );
3173*b1cdbd2cSJim Jagielski 				Reference < XPropertySet > xViewProps = xSettings->getViewSettings();
3174*b1cdbd2cSJim Jagielski                 Reference< XPropertySetInfo > xInfo = xViewProps->getPropertySetInfo();
3175*b1cdbd2cSJim Jagielski 				Any aBoolAny = makeAny( sal_Bool( sal_True ) );
3176*b1cdbd2cSJim Jagielski 				xViewProps->setPropertyValue( DEFINE_CONST_OUSTRING("ShowContentTips"), makeAny( sal_Bool( sal_False ) ) );
3177*b1cdbd2cSJim Jagielski 				xViewProps->setPropertyValue( DEFINE_CONST_OUSTRING("ShowGraphics"), aBoolAny );
3178*b1cdbd2cSJim Jagielski 				xViewProps->setPropertyValue( DEFINE_CONST_OUSTRING("ShowTables"), aBoolAny );
3179*b1cdbd2cSJim Jagielski                 xViewProps->setPropertyValue( DEFINE_CONST_OUSTRING("HelpURL"), makeAny( DEFINE_CONST_OUSTRING("HID:SFX2_HID_HELP_ONHELP") ) );
3180*b1cdbd2cSJim Jagielski                 ::rtl::OUString sProperty( DEFINE_CONST_OUSTRING("IsExecuteHyperlinks") );
3181*b1cdbd2cSJim Jagielski                 if ( xInfo->hasPropertyByName( sProperty ) )
3182*b1cdbd2cSJim Jagielski                     xViewProps->setPropertyValue( sProperty, aBoolAny );
3183*b1cdbd2cSJim Jagielski                 xController->restoreViewData(pHelpInterceptor->GetViewData());
3184*b1cdbd2cSJim Jagielski 			}
3185*b1cdbd2cSJim Jagielski 		}
3186*b1cdbd2cSJim Jagielski 		catch( Exception& )
3187*b1cdbd2cSJim Jagielski 		{
3188*b1cdbd2cSJim Jagielski 			DBG_ERROR( "SfxHelpWindow_Impl::OpenDoneHdl(): unexpected exception" );
3189*b1cdbd2cSJim Jagielski 		}
3190*b1cdbd2cSJim Jagielski 
3191*b1cdbd2cSJim Jagielski 		// When the SearchPage opens the help doc, then select all words, which are equal to its text
3192*b1cdbd2cSJim Jagielski 		String sSearchText = TRIM( pIndexWin->GetSearchText() );
3193*b1cdbd2cSJim Jagielski 		if ( sSearchText.Len() > 0 )
3194*b1cdbd2cSJim Jagielski 			pTextWin->SelectSearchText( sSearchText, pIndexWin->IsFullWordSearch() );
3195*b1cdbd2cSJim Jagielski 
3196*b1cdbd2cSJim Jagielski 		// no page style header -> this prevents a print output of the URL
3197*b1cdbd2cSJim Jagielski 		pTextWin->SetPageStyleHeaderOff();
3198*b1cdbd2cSJim Jagielski 	}
3199*b1cdbd2cSJim Jagielski }
3200*b1cdbd2cSJim Jagielski 
3201*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3202*b1cdbd2cSJim Jagielski 
SfxHelpWindow_Impl(const::com::sun::star::uno::Reference<::com::sun::star::frame::XFrame> & rFrame,Window * pParent,WinBits)3203*b1cdbd2cSJim Jagielski SfxHelpWindow_Impl::SfxHelpWindow_Impl(
3204*b1cdbd2cSJim Jagielski 	const ::com::sun::star::uno::Reference < ::com::sun::star::frame::XFrame >& rFrame,
3205*b1cdbd2cSJim Jagielski 	Window* pParent, WinBits ) :
3206*b1cdbd2cSJim Jagielski 
3207*b1cdbd2cSJim Jagielski 	SplitWindow( pParent, WB_3DLOOK | WB_NOSPLITDRAW ),
3208*b1cdbd2cSJim Jagielski 
3209*b1cdbd2cSJim Jagielski 	xFrame				( rFrame ),
3210*b1cdbd2cSJim Jagielski 	pIndexWin			( NULL ),
3211*b1cdbd2cSJim Jagielski 	pTextWin	   		( NULL ),
3212*b1cdbd2cSJim Jagielski 	pHelpInterceptor	( new HelpInterceptor_Impl() ),
3213*b1cdbd2cSJim Jagielski 	pHelpListener		( new HelpListener_Impl( pHelpInterceptor ) ),
3214*b1cdbd2cSJim Jagielski 	nExpandWidth		( 0 ),
3215*b1cdbd2cSJim Jagielski 	nCollapseWidth		( 0 ),
3216*b1cdbd2cSJim Jagielski 	nHeight				( 0 ),
3217*b1cdbd2cSJim Jagielski 	nIndexSize			( 40 ),
3218*b1cdbd2cSJim Jagielski 	nTextSize			( 60 ),
3219*b1cdbd2cSJim Jagielski 	bIndex				( sal_True ),
3220*b1cdbd2cSJim Jagielski 	bGrabFocusToToolBox	( sal_False ),
3221*b1cdbd2cSJim Jagielski 	aWinPos				( 0, 0 ),
3222*b1cdbd2cSJim Jagielski 	sTitle				( pParent->GetText() )
3223*b1cdbd2cSJim Jagielski {
3224*b1cdbd2cSJim Jagielski 	SetHelpId( HID_HELP_WINDOW );
3225*b1cdbd2cSJim Jagielski 	SetStyle( GetStyle() | WB_DIALOGCONTROL );
3226*b1cdbd2cSJim Jagielski 
3227*b1cdbd2cSJim Jagielski 	pHelpInterceptor->InitWaiter( this );
3228*b1cdbd2cSJim Jagielski 	pIndexWin = new SfxHelpIndexWindow_Impl( this );
3229*b1cdbd2cSJim Jagielski 	pIndexWin->SetDoubleClickHdl( LINK( this, SfxHelpWindow_Impl, OpenHdl ) );
3230*b1cdbd2cSJim Jagielski 	pIndexWin->SetSelectFactoryHdl( LINK( this, SfxHelpWindow_Impl, SelectFactoryHdl ) );
3231*b1cdbd2cSJim Jagielski 	pIndexWin->Show();
3232*b1cdbd2cSJim Jagielski 	pTextWin = new SfxHelpTextWindow_Impl( this );
3233*b1cdbd2cSJim Jagielski     Reference < XFramesSupplier > xSup( rFrame, UNO_QUERY );
3234*b1cdbd2cSJim Jagielski     Reference < XFrames > xFrames = xSup->getFrames();
3235*b1cdbd2cSJim Jagielski     xFrames->append( pTextWin->getFrame() );
3236*b1cdbd2cSJim Jagielski 	pTextWin->SetSelectHdl( LINK( this, SfxHelpWindow_Impl, SelectHdl ) );
3237*b1cdbd2cSJim Jagielski 	pTextWin->Show();
3238*b1cdbd2cSJim Jagielski 	pHelpInterceptor->setInterception( pTextWin->getFrame() );
3239*b1cdbd2cSJim Jagielski 	pHelpListener->SetChangeHdl( LINK( this, SfxHelpWindow_Impl, ChangeHdl ) );
3240*b1cdbd2cSJim Jagielski 	LoadConfig();
3241*b1cdbd2cSJim Jagielski }
3242*b1cdbd2cSJim Jagielski 
3243*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3244*b1cdbd2cSJim Jagielski 
~SfxHelpWindow_Impl()3245*b1cdbd2cSJim Jagielski SfxHelpWindow_Impl::~SfxHelpWindow_Impl()
3246*b1cdbd2cSJim Jagielski {
3247*b1cdbd2cSJim Jagielski 	SaveConfig();
3248*b1cdbd2cSJim Jagielski 	Window*	pDel = pIndexWin;
3249*b1cdbd2cSJim Jagielski 	pIndexWin = NULL;
3250*b1cdbd2cSJim Jagielski 	delete pDel;
3251*b1cdbd2cSJim Jagielski 
3252*b1cdbd2cSJim Jagielski 	pTextWin->CloseFrame();
3253*b1cdbd2cSJim Jagielski 	delete pTextWin;
3254*b1cdbd2cSJim Jagielski }
3255*b1cdbd2cSJim Jagielski 
3256*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3257*b1cdbd2cSJim Jagielski 
PreNotify(NotifyEvent & rNEvt)3258*b1cdbd2cSJim Jagielski long SfxHelpWindow_Impl::PreNotify( NotifyEvent& rNEvt )
3259*b1cdbd2cSJim Jagielski {
3260*b1cdbd2cSJim Jagielski 	sal_Bool bHandled = sal_False;
3261*b1cdbd2cSJim Jagielski 	if ( rNEvt.GetType() == EVENT_KEYINPUT )
3262*b1cdbd2cSJim Jagielski 	{
3263*b1cdbd2cSJim Jagielski 		// Backward == <ALT><LEFT> or <BACKSPACE> Forward == <ALT><RIGHT>
3264*b1cdbd2cSJim Jagielski 	 	const KeyCode& rKeyCode = rNEvt.GetKeyEvent()->GetKeyCode();
3265*b1cdbd2cSJim Jagielski 		sal_uInt16 nKey = rKeyCode.GetCode();
3266*b1cdbd2cSJim Jagielski 		if ( ( rKeyCode.IsMod2() && ( KEY_LEFT == nKey || KEY_RIGHT == nKey ) ) ||
3267*b1cdbd2cSJim Jagielski 			 ( !rKeyCode.GetModifier() && KEY_BACKSPACE == nKey && !pIndexWin->HasFocusOnEdit() ) )
3268*b1cdbd2cSJim Jagielski 		{
3269*b1cdbd2cSJim Jagielski 			DoAction( rKeyCode.GetCode() == KEY_RIGHT ? TBI_FORWARD : TBI_BACKWARD );
3270*b1cdbd2cSJim Jagielski 			bHandled = sal_True;
3271*b1cdbd2cSJim Jagielski 		}
3272*b1cdbd2cSJim Jagielski 		else if ( rKeyCode.IsMod1() && ( KEY_F4 == nKey || KEY_W == nKey ) )
3273*b1cdbd2cSJim Jagielski 		{
3274*b1cdbd2cSJim Jagielski 			// <STRG><F4> or <STRG><W> -> close top frame
3275*b1cdbd2cSJim Jagielski 			CloseWindow();
3276*b1cdbd2cSJim Jagielski 			bHandled = sal_True;
3277*b1cdbd2cSJim Jagielski 		}
3278*b1cdbd2cSJim Jagielski 	}
3279*b1cdbd2cSJim Jagielski 	return bHandled ? 1 : Window::PreNotify( rNEvt );
3280*b1cdbd2cSJim Jagielski }
3281*b1cdbd2cSJim Jagielski 
3282*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3283*b1cdbd2cSJim Jagielski 
setContainerWindow(Reference<::com::sun::star::awt::XWindow> xWin)3284*b1cdbd2cSJim Jagielski void SfxHelpWindow_Impl::setContainerWindow( Reference < ::com::sun::star::awt::XWindow > xWin )
3285*b1cdbd2cSJim Jagielski {
3286*b1cdbd2cSJim Jagielski 	xWindow = xWin;
3287*b1cdbd2cSJim Jagielski 	MakeLayout();
3288*b1cdbd2cSJim Jagielski }
3289*b1cdbd2cSJim Jagielski 
3290*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3291*b1cdbd2cSJim Jagielski 
SetFactory(const String & rFactory)3292*b1cdbd2cSJim Jagielski void SfxHelpWindow_Impl::SetFactory( const String& rFactory )
3293*b1cdbd2cSJim Jagielski {
3294*b1cdbd2cSJim Jagielski 	pIndexWin->SetFactory( rFactory, sal_True );
3295*b1cdbd2cSJim Jagielski }
3296*b1cdbd2cSJim Jagielski 
3297*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3298*b1cdbd2cSJim Jagielski 
SetHelpURL(const String & rURL)3299*b1cdbd2cSJim Jagielski void SfxHelpWindow_Impl::SetHelpURL( const String& rURL )
3300*b1cdbd2cSJim Jagielski {
3301*b1cdbd2cSJim Jagielski 	INetURLObject aObj( rURL );
3302*b1cdbd2cSJim Jagielski 	if ( aObj.GetProtocol() == INET_PROT_VND_SUN_STAR_HELP )
3303*b1cdbd2cSJim Jagielski 		SetFactory( aObj.GetHost() );
3304*b1cdbd2cSJim Jagielski }
3305*b1cdbd2cSJim Jagielski 
3306*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3307*b1cdbd2cSJim Jagielski 
DoAction(sal_uInt16 nActionId)3308*b1cdbd2cSJim Jagielski void SfxHelpWindow_Impl::DoAction( sal_uInt16 nActionId )
3309*b1cdbd2cSJim Jagielski {
3310*b1cdbd2cSJim Jagielski 	switch ( nActionId )
3311*b1cdbd2cSJim Jagielski 	{
3312*b1cdbd2cSJim Jagielski 		case TBI_INDEX :
3313*b1cdbd2cSJim Jagielski 		{
3314*b1cdbd2cSJim Jagielski 			bIndex = !bIndex;
3315*b1cdbd2cSJim Jagielski 			MakeLayout();
3316*b1cdbd2cSJim Jagielski 			pTextWin->ToggleIndex( bIndex );
3317*b1cdbd2cSJim Jagielski 			break;
3318*b1cdbd2cSJim Jagielski 		}
3319*b1cdbd2cSJim Jagielski 
3320*b1cdbd2cSJim Jagielski 		case TBI_START :
3321*b1cdbd2cSJim Jagielski 		{
3322*b1cdbd2cSJim Jagielski 			ShowStartPage();
3323*b1cdbd2cSJim Jagielski 			break;
3324*b1cdbd2cSJim Jagielski 		}
3325*b1cdbd2cSJim Jagielski 
3326*b1cdbd2cSJim Jagielski 		case TBI_BACKWARD :
3327*b1cdbd2cSJim Jagielski 		case TBI_FORWARD :
3328*b1cdbd2cSJim Jagielski 		{
3329*b1cdbd2cSJim Jagielski 			URL aURL;
3330*b1cdbd2cSJim Jagielski 	        aURL.Complete = DEFINE_CONST_UNICODE(".uno:Backward");
3331*b1cdbd2cSJim Jagielski 			if ( TBI_FORWARD == nActionId )
3332*b1cdbd2cSJim Jagielski 		        aURL.Complete = DEFINE_CONST_UNICODE(".uno:Forward");
3333*b1cdbd2cSJim Jagielski 			PARSE_URL( aURL );
3334*b1cdbd2cSJim Jagielski 			pHelpInterceptor->dispatch( aURL, Sequence < PropertyValue >() );
3335*b1cdbd2cSJim Jagielski 			break;
3336*b1cdbd2cSJim Jagielski 		}
3337*b1cdbd2cSJim Jagielski 
3338*b1cdbd2cSJim Jagielski 		case TBI_SEARCHDIALOG :
3339*b1cdbd2cSJim Jagielski 		{
3340*b1cdbd2cSJim Jagielski 			pTextWin->DoSearch();
3341*b1cdbd2cSJim Jagielski 			break;
3342*b1cdbd2cSJim Jagielski 		}
3343*b1cdbd2cSJim Jagielski 
3344*b1cdbd2cSJim Jagielski 		case TBI_PRINT :
3345*b1cdbd2cSJim Jagielski 		case TBI_SOURCEVIEW :
3346*b1cdbd2cSJim Jagielski 		case TBI_COPY :
3347*b1cdbd2cSJim Jagielski         case TBI_SELECTIONMODE:
3348*b1cdbd2cSJim Jagielski 		{
3349*b1cdbd2cSJim Jagielski 			Reference < XDispatchProvider > xProv( pTextWin->getFrame(), UNO_QUERY );
3350*b1cdbd2cSJim Jagielski 			if ( xProv.is() )
3351*b1cdbd2cSJim Jagielski 			{
3352*b1cdbd2cSJim Jagielski 				URL aURL;
3353*b1cdbd2cSJim Jagielski 				if ( TBI_PRINT == nActionId )
3354*b1cdbd2cSJim Jagielski 		        	aURL.Complete = DEFINE_CONST_UNICODE(".uno:Print");
3355*b1cdbd2cSJim Jagielski 				else if ( TBI_SOURCEVIEW == nActionId )
3356*b1cdbd2cSJim Jagielski 		        	aURL.Complete = DEFINE_CONST_UNICODE(".uno:SourceView");
3357*b1cdbd2cSJim Jagielski 				else if ( TBI_COPY == nActionId )
3358*b1cdbd2cSJim Jagielski 		        	aURL.Complete = DEFINE_CONST_UNICODE(".uno:Copy");
3359*b1cdbd2cSJim Jagielski                 else if ( TBI_SELECTIONMODE == nActionId )
3360*b1cdbd2cSJim Jagielski                     aURL.Complete = DEFINE_CONST_UNICODE(".uno:SelectTextMode");
3361*b1cdbd2cSJim Jagielski                 else
3362*b1cdbd2cSJim Jagielski 		        	aURL.Complete = DEFINE_CONST_UNICODE(".uno:SearchDialog");
3363*b1cdbd2cSJim Jagielski 				PARSE_URL( aURL );
3364*b1cdbd2cSJim Jagielski             	Reference < XDispatch > xDisp = xProv->queryDispatch( aURL, String(), 0 );
3365*b1cdbd2cSJim Jagielski             	if ( xDisp.is() )
3366*b1cdbd2cSJim Jagielski                 	xDisp->dispatch( aURL, Sequence < PropertyValue >() );
3367*b1cdbd2cSJim Jagielski 			}
3368*b1cdbd2cSJim Jagielski 			break;
3369*b1cdbd2cSJim Jagielski 		}
3370*b1cdbd2cSJim Jagielski 
3371*b1cdbd2cSJim Jagielski 		case TBI_BOOKMARKS :
3372*b1cdbd2cSJim Jagielski 		{
3373*b1cdbd2cSJim Jagielski 			String aURL = pHelpInterceptor->GetCurrentURL();
3374*b1cdbd2cSJim Jagielski 			if ( aURL.Len() > 0 )
3375*b1cdbd2cSJim Jagielski 			{
3376*b1cdbd2cSJim Jagielski 				try
3377*b1cdbd2cSJim Jagielski 				{
3378*b1cdbd2cSJim Jagielski 					Content aCnt( aURL, Reference< ::com::sun::star::ucb::XCommandEnvironment > () );
3379*b1cdbd2cSJim Jagielski 					::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > xInfo = aCnt.getProperties();
3380*b1cdbd2cSJim Jagielski 					if ( xInfo->hasPropertyByName( PROPERTY_TITLE ) )
3381*b1cdbd2cSJim Jagielski 					{
3382*b1cdbd2cSJim Jagielski 						::com::sun::star::uno::Any aAny = aCnt.getPropertyValue( PROPERTY_TITLE );
3383*b1cdbd2cSJim Jagielski 						rtl::OUString aValue;
3384*b1cdbd2cSJim Jagielski 						if ( aAny >>= aValue )
3385*b1cdbd2cSJim Jagielski 						{
3386*b1cdbd2cSJim Jagielski 							String aTitle( aValue );
3387*b1cdbd2cSJim Jagielski 							SfxAddHelpBookmarkDialog_Impl aDlg( this, sal_False );
3388*b1cdbd2cSJim Jagielski 							aDlg.SetTitle( aTitle );
3389*b1cdbd2cSJim Jagielski 							if ( aDlg.Execute() == RET_OK )
3390*b1cdbd2cSJim Jagielski 							{
3391*b1cdbd2cSJim Jagielski 								aTitle = aDlg.GetTitle();
3392*b1cdbd2cSJim Jagielski 								pIndexWin->AddBookmarks( aTitle, aURL );
3393*b1cdbd2cSJim Jagielski 							}
3394*b1cdbd2cSJim Jagielski 						}
3395*b1cdbd2cSJim Jagielski 					}
3396*b1cdbd2cSJim Jagielski 				}
3397*b1cdbd2cSJim Jagielski 				catch( Exception& )
3398*b1cdbd2cSJim Jagielski 				{
3399*b1cdbd2cSJim Jagielski 					DBG_ERROR( "SfxHelpWindow_Impl::DoAction(): unexpected exception" );
3400*b1cdbd2cSJim Jagielski 				}
3401*b1cdbd2cSJim Jagielski 			}
3402*b1cdbd2cSJim Jagielski 			break;
3403*b1cdbd2cSJim Jagielski 		}
3404*b1cdbd2cSJim Jagielski 	}
3405*b1cdbd2cSJim Jagielski }
3406*b1cdbd2cSJim Jagielski 
3407*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3408*b1cdbd2cSJim Jagielski 
CloseWindow()3409*b1cdbd2cSJim Jagielski void SfxHelpWindow_Impl::CloseWindow()
3410*b1cdbd2cSJim Jagielski {
3411*b1cdbd2cSJim Jagielski 	try
3412*b1cdbd2cSJim Jagielski 	{
3413*b1cdbd2cSJim Jagielski 		// search for top frame
3414*b1cdbd2cSJim Jagielski 		Reference< XFramesSupplier > xCreator = getTextFrame()->getCreator();
3415*b1cdbd2cSJim Jagielski 		while ( xCreator.is() && !xCreator->isTop() )
3416*b1cdbd2cSJim Jagielski 		{
3417*b1cdbd2cSJim Jagielski 		    xCreator = xCreator->getCreator();
3418*b1cdbd2cSJim Jagielski 		}
3419*b1cdbd2cSJim Jagielski 
3420*b1cdbd2cSJim Jagielski 		// when found, close it
3421*b1cdbd2cSJim Jagielski 		if ( xCreator.is() && xCreator->isTop() )
3422*b1cdbd2cSJim Jagielski 		{
3423*b1cdbd2cSJim Jagielski 			Reference < XCloseable > xCloser( xCreator, UNO_QUERY );
3424*b1cdbd2cSJim Jagielski 			if ( xCloser.is() )
3425*b1cdbd2cSJim Jagielski 				xCloser->close( sal_False );
3426*b1cdbd2cSJim Jagielski 		}
3427*b1cdbd2cSJim Jagielski 	}
3428*b1cdbd2cSJim Jagielski 	catch( Exception& )
3429*b1cdbd2cSJim Jagielski 	{
3430*b1cdbd2cSJim Jagielski 		DBG_ERRORFILE( "SfxHelpWindow_Impl::CloseWindow(): caught an exception" );
3431*b1cdbd2cSJim Jagielski 	}
3432*b1cdbd2cSJim Jagielski }
3433*b1cdbd2cSJim Jagielski 
3434*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3435*b1cdbd2cSJim Jagielski 
UpdateToolbox()3436*b1cdbd2cSJim Jagielski void SfxHelpWindow_Impl::UpdateToolbox()
3437*b1cdbd2cSJim Jagielski {
3438*b1cdbd2cSJim Jagielski 	pTextWin->GetToolBox().EnableItem( TBI_BACKWARD, pHelpInterceptor->HasHistoryPred() );
3439*b1cdbd2cSJim Jagielski 	pTextWin->GetToolBox().EnableItem( TBI_FORWARD, pHelpInterceptor->HasHistorySucc() );
3440*b1cdbd2cSJim Jagielski }
3441*b1cdbd2cSJim Jagielski 
3442*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3443*b1cdbd2cSJim Jagielski 
HasHistoryPredecessor() const3444*b1cdbd2cSJim Jagielski sal_Bool SfxHelpWindow_Impl::HasHistoryPredecessor() const
3445*b1cdbd2cSJim Jagielski {
3446*b1cdbd2cSJim Jagielski 	return pHelpInterceptor->HasHistoryPred();
3447*b1cdbd2cSJim Jagielski }
3448*b1cdbd2cSJim Jagielski 
3449*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3450*b1cdbd2cSJim Jagielski 
HasHistorySuccessor() const3451*b1cdbd2cSJim Jagielski sal_Bool SfxHelpWindow_Impl::HasHistorySuccessor() const
3452*b1cdbd2cSJim Jagielski {
3453*b1cdbd2cSJim Jagielski 	return pHelpInterceptor->HasHistorySucc();
3454*b1cdbd2cSJim Jagielski }
3455*b1cdbd2cSJim Jagielski 
3456*b1cdbd2cSJim Jagielski // class SfxAddHelpBookmarkDialog_Impl -----------------------------------
3457*b1cdbd2cSJim Jagielski 
SfxAddHelpBookmarkDialog_Impl(Window * pParent,sal_Bool bRename)3458*b1cdbd2cSJim Jagielski SfxAddHelpBookmarkDialog_Impl::SfxAddHelpBookmarkDialog_Impl( Window* pParent, sal_Bool bRename ) :
3459*b1cdbd2cSJim Jagielski 
3460*b1cdbd2cSJim Jagielski 	ModalDialog( pParent, SfxResId( DLG_HELP_ADDBOOKMARK ) ),
3461*b1cdbd2cSJim Jagielski 
3462*b1cdbd2cSJim Jagielski 	aTitleFT	( this, SfxResId( FT_BOOKMARK_TITLE ) ),
3463*b1cdbd2cSJim Jagielski 	aTitleED	( this, SfxResId( ED_BOOKMARK_TITLE ) ),
3464*b1cdbd2cSJim Jagielski 	aOKBtn		( this, SfxResId( PB_BOOKMARK_OK ) ),
3465*b1cdbd2cSJim Jagielski 	aEscBtn		( this, SfxResId( PB_BOOKMARK_CANCEL ) ),
3466*b1cdbd2cSJim Jagielski 	aHelpBtn	( this, SfxResId( PB_BOOKMARK_HELP ) )
3467*b1cdbd2cSJim Jagielski 
3468*b1cdbd2cSJim Jagielski {
3469*b1cdbd2cSJim Jagielski 	if ( bRename )
3470*b1cdbd2cSJim Jagielski 		SetText( String( SfxResId( STR_BOOKMARK_RENAME ) ) );
3471*b1cdbd2cSJim Jagielski 
3472*b1cdbd2cSJim Jagielski 	FreeResource();
3473*b1cdbd2cSJim Jagielski }
3474*b1cdbd2cSJim Jagielski 
3475*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3476*b1cdbd2cSJim Jagielski 
~SfxAddHelpBookmarkDialog_Impl()3477*b1cdbd2cSJim Jagielski SfxAddHelpBookmarkDialog_Impl::~SfxAddHelpBookmarkDialog_Impl()
3478*b1cdbd2cSJim Jagielski {
3479*b1cdbd2cSJim Jagielski }
3480*b1cdbd2cSJim Jagielski 
3481*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3482*b1cdbd2cSJim Jagielski 
SetTitle(const String & rTitle)3483*b1cdbd2cSJim Jagielski void SfxAddHelpBookmarkDialog_Impl::SetTitle( const String& rTitle )
3484*b1cdbd2cSJim Jagielski {
3485*b1cdbd2cSJim Jagielski 	aTitleED.SetText( rTitle );
3486*b1cdbd2cSJim Jagielski 	aTitleED.SetSelection( Selection( 0, rTitle.Len() ) );
3487*b1cdbd2cSJim Jagielski }
3488*b1cdbd2cSJim Jagielski 
3489