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