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