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