| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_sfx2.hxx" |
| |
| #include "newhelp.hxx" |
| #include <sfx2/sfxuno.hxx> |
| #include "sfx2/sfxresid.hxx" |
| #include "helpinterceptor.hxx" |
| #include "helper.hxx" |
| #include <sfx2/msgpool.hxx> |
| #include <sfx2/app.hxx> |
| #include "sfxtypes.hxx" |
| #include "panelist.hxx" |
| #include "sfx2/imgmgr.hxx" |
| #include "srchdlg.hxx" |
| #include "sfx2/sfxhelp.hxx" |
| |
| #include "app.hrc" |
| #include "newhelp.hrc" |
| #include "helpid.hrc" |
| |
| #include <hash_map> |
| #include <rtl/ustrbuf.hxx> |
| #include <comphelper/processfactory.hxx> |
| #include <comphelper/configurationhelper.hxx> |
| #include <toolkit/helper/vclunohelper.hxx> |
| #include <com/sun/star/util/XModifiable.hpp> |
| #include <com/sun/star/frame/XComponentLoader.hpp> |
| #include <com/sun/star/util/XCloseable.hpp> |
| #include <com/sun/star/util/CloseVetoException.hpp> |
| #include <com/sun/star/lang/XComponent.hpp> |
| #include <com/sun/star/lang/DisposedException.hpp> |
| #include <com/sun/star/awt/PosSize.hpp> |
| #include <com/sun/star/awt/XWindow.hpp> |
| #include <com/sun/star/beans/Property.hpp> |
| #include <com/sun/star/beans/PropertyValue.hpp> |
| #include <com/sun/star/beans/XPropertySetInfo.hpp> |
| #include <com/sun/star/container/XIndexAccess.hpp> |
| #include <com/sun/star/frame/XTitle.hpp> |
| #include <com/sun/star/frame/XLayoutManager.hpp> |
| #include <com/sun/star/frame/DispatchResultState.hpp> |
| #include <com/sun/star/frame/XController.hpp> |
| #include <com/sun/star/frame/XDispatch.hpp> |
| #include <com/sun/star/frame/XDispatchProvider.hpp> |
| #include <com/sun/star/frame/XDispatchProviderInterception.hpp> |
| #include <com/sun/star/frame/XFrame.hpp> |
| #ifndef _COM_SUN_STAR_TEXT_XBREAKITERATOR_HPP_ |
| #include <com/sun/star/i18n/XBreakIterator.hpp> |
| #endif |
| #include <com/sun/star/i18n/WordType.hpp> |
| #include <com/sun/star/lang/XComponent.hpp> |
| #include <com/sun/star/style/XStyle.hpp> |
| #include <com/sun/star/style/XStyleFamiliesSupplier.hpp> |
| #include <com/sun/star/text/XText.hpp> |
| #include <com/sun/star/text/XTextCursor.hpp> |
| #include <com/sun/star/text/XTextDocument.hpp> |
| #include <com/sun/star/text/XTextRange.hpp> |
| #include <com/sun/star/text/XTextViewCursor.hpp> |
| #include <com/sun/star/text/XTextViewCursorSupplier.hpp> |
| #include <com/sun/star/ucb/CommandAbortedException.hpp> |
| #include <com/sun/star/util/URL.hpp> |
| #include <com/sun/star/util/XSearchable.hpp> |
| #include <com/sun/star/util/XSearchDescriptor.hpp> |
| #include <com/sun/star/util/XURLTransformer.hpp> |
| #include <com/sun/star/view/XSelectionSupplier.hpp> |
| #include <com/sun/star/view/XViewSettingsSupplier.hpp> |
| #include <com/sun/star/ui/XDockingAreaAcceptor.hpp> |
| #include <svtools/helpopt.hxx> |
| #include <unotools/historyoptions.hxx> |
| #include <svtools/menuoptions.hxx> |
| #include <unotools/pathoptions.hxx> |
| #include <unotools/viewoptions.hxx> |
| #include <svtools/svtdata.hxx> |
| #include <tools/urlobj.hxx> |
| #include <tools/cachestr.hxx> |
| #include <unotools/streamhelper.hxx> |
| #include <svtools/imagemgr.hxx> |
| #include <svtools/miscopt.hxx> |
| #include <svtools/imgdef.hxx> |
| #include <vcl/unohelp.hxx> |
| #include <vcl/i18nhelp.hxx> |
| |
| #include <ucbhelper/content.hxx> |
| #include <vcl/msgbox.hxx> |
| #include <vcl/waitobj.hxx> |
| #include <unotools/ucbhelper.hxx> |
| |
| #include <sfx2/viewfrm.hxx> |
| #include <sfx2/objsh.hxx> |
| #include <sfx2/docfac.hxx> |
| |
| using namespace ::ucbhelper; |
| using namespace ::com::sun::star::ucb; |
| |
| using namespace ::com::sun::star; |
| using namespace ::com::sun::star::beans; |
| using namespace ::com::sun::star::container; |
| using namespace ::com::sun::star::frame; |
| using namespace ::com::sun::star::i18n; |
| using namespace ::com::sun::star::lang; |
| using namespace ::com::sun::star::style; |
| using namespace ::com::sun::star::text; |
| using namespace ::com::sun::star::uno; |
| using namespace ::com::sun::star::util; |
| using namespace ::com::sun::star::view; |
| using namespace ::com::sun::star::ui; |
| |
| using namespace ::comphelper; |
| |
| extern void AppendConfigToken_Impl( String& rURL, sal_Bool bQuestionMark ); // sfxhelp.cxx |
| |
| // defines --------------------------------------------------------------- |
| |
| #define SPLITSET_ID 0 |
| #define COLSET_ID 1 |
| #define INDEXWIN_ID 2 |
| #define TEXTWIN_ID 3 |
| |
| #define TOOLBOX_OFFSET 3 |
| |
| #define TBI_INDEX 1001 |
| #define TBI_BACKWARD 1002 |
| #define TBI_FORWARD 1003 |
| #define TBI_START 1004 |
| #define TBI_PRINT 1005 |
| #define TBI_COPY 1006 |
| #define TBI_BOOKMARKS 1007 |
| #define TBI_SEARCHDIALOG 1008 |
| #define TBI_SOURCEVIEW 1009 |
| #define TBI_SELECTIONMODE 1010 |
| #define TBI_ONSTARTUP 1011 |
| |
| #define CONFIGNAME_HELPWIN DEFINE_CONST_UNICODE("OfficeHelp") |
| #define CONFIGNAME_INDEXWIN DEFINE_CONST_UNICODE("OfficeHelpIndex") |
| #define CONFIGNAME_SEARCHPAGE DEFINE_CONST_UNICODE("OfficeHelpSearch") |
| #define IMAGE_URL DEFINE_CONST_UNICODE("private:factory/") |
| |
| #define PROPERTY_KEYWORDLIST DEFINE_CONST_OUSTRING("KeywordList") |
| #define PROPERTY_KEYWORDREF DEFINE_CONST_OUSTRING("KeywordRef") |
| #define PROPERTY_ANCHORREF DEFINE_CONST_OUSTRING("KeywordAnchorForRef") |
| #define PROPERTY_TITLEREF DEFINE_CONST_OUSTRING("KeywordTitleForRef") |
| #define PROPERTY_TITLE DEFINE_CONST_OUSTRING("Title") |
| #define HELP_URL DEFINE_CONST_OUSTRING("vnd.sun.star.help://") |
| #define HELP_SEARCH_TAG DEFINE_CONST_OUSTRING("/?Query=") |
| #define USERITEM_NAME DEFINE_CONST_OUSTRING("UserItem") |
| |
| #define PACKAGE_SETUP DEFINE_CONST_OUSTRING("/org.openoffice.Setup") |
| #define PATH_OFFICE_FACTORIES DEFINE_CONST_OUSTRING("Office/Factories/") |
| #define KEY_HELP_ON_OPEN DEFINE_CONST_OUSTRING("ooSetupFactoryHelpOnOpen") |
| #define KEY_UI_NAME DEFINE_CONST_OUSTRING("ooSetupFactoryUIName") |
| |
| #define PARSE_URL( aURL ) \ |
| Reference < XURLTransformer > xTrans( ::comphelper::getProcessServiceFactory()->createInstance( \ |
| DEFINE_CONST_UNICODE("com.sun.star.util.URLTransformer" )), UNO_QUERY ); \ |
| xTrans->parseStrict( aURL ) |
| |
| //......................................................................... |
| namespace sfx2 |
| { |
| //......................................................................... |
| |
| void HandleTaskPaneList( Window* pWindow, sal_Bool bAddToList ) |
| { |
| Window* pParent = pWindow->GetParent(); |
| DBG_ASSERT( pParent, "HandleTaskPaneList(): every window here should have a parent" ); |
| |
| SystemWindow* pSysWin = pParent->GetSystemWindow(); |
| if( pSysWin ) |
| { |
| TaskPaneList* pTaskPaneList = pSysWin->GetTaskPaneList(); |
| if( pTaskPaneList ) |
| { |
| if( bAddToList ) |
| pTaskPaneList->AddWindow( pWindow ); |
| else |
| pTaskPaneList->RemoveWindow( pWindow ); |
| } |
| } |
| } |
| |
| /** Prepare a search string for searching or selecting. |
| For searching every search word needs the postfix '*' and the delimiter ' ' if necessary. |
| For selecting the delimiter '|' is required to search with regular expressions. |
| Samples: |
| search string | output for searching | output for selecting |
| ----------------------------------------------------------- |
| "text" | "text*" | "text" |
| "text*" | "text*" | "text" |
| "text menu" | "text* menu*" | "text|menu" |
| */ |
| String PrepareSearchString( const String& rSearchString, |
| Reference< XBreakIterator > xBreak, bool bForSearch ) |
| { |
| String sSearchStr; |
| sal_Int32 nStartPos = 0; |
| const Locale aLocale = Application::GetSettings().GetUILocale(); |
| Boundary aBoundary = xBreak->getWordBoundary( |
| rSearchString, nStartPos, aLocale, WordType::ANYWORD_IGNOREWHITESPACES, sal_True ); |
| |
| while ( aBoundary.startPos != aBoundary.endPos ) |
| { |
| nStartPos = aBoundary.endPos; |
| String sSearchToken( rSearchString.Copy( |
| (sal_uInt16)aBoundary.startPos, (sal_uInt16)aBoundary.endPos - (sal_uInt16)aBoundary.startPos ) ); |
| if ( sSearchToken.Len() > 0 && ( sSearchToken.Len() > 1 || sSearchToken.GetChar(0) != '.' ) ) |
| { |
| if ( bForSearch && sSearchToken.GetChar( sSearchToken.Len() - 1 ) != '*' ) |
| sSearchToken += '*'; |
| |
| if ( sSearchToken.Len() > 1 || |
| ( sSearchToken.Len() > 0 && sSearchToken.GetChar( 0 ) != '*' ) ) |
| { |
| if ( sSearchStr.Len() > 0 ) |
| { |
| if ( bForSearch ) |
| sSearchStr += ' '; |
| else |
| sSearchStr += '|'; |
| } |
| sSearchStr += sSearchToken; |
| } |
| } |
| aBoundary = xBreak->nextWord( rSearchString, nStartPos, |
| aLocale, WordType::ANYWORD_IGNOREWHITESPACES ); |
| } |
| |
| return sSearchStr; |
| } |
| //......................................................................... |
| // namespace sfx2 |
| } |
| //......................................................................... |
| |
| // struct IndexEntry_Impl ------------------------------------------------ |
| |
| struct IndexEntry_Impl |
| { |
| sal_Bool m_bSubEntry; |
| String m_aURL; |
| |
| IndexEntry_Impl( const String& rURL, sal_Bool bSubEntry ) : |
| m_bSubEntry( bSubEntry ), m_aURL( rURL ) {} |
| }; |
| |
| #define NEW_ENTRY( url, bool ) \ |
| (void*)(sal_uIntPtr)( new IndexEntry_Impl( url, bool ) ) |
| |
| // struct ContentEntry_Impl ---------------------------------------------- |
| |
| struct ContentEntry_Impl |
| { |
| String aURL; |
| sal_Bool bIsFolder; |
| |
| ContentEntry_Impl( const String& rURL, sal_Bool bFolder ) : |
| aURL( rURL ), bIsFolder( bFolder ) {} |
| }; |
| |
| // ContentListBox_Impl --------------------------------------------------- |
| |
| ContentListBox_Impl::ContentListBox_Impl( Window* pParent, const ResId& rResId ) : |
| |
| SvTreeListBox( pParent, rResId ), |
| |
| aOpenBookImage ( SfxResId( IMG_HELP_CONTENT_BOOK_OPEN ) ), |
| aClosedBookImage ( SfxResId( IMG_HELP_CONTENT_BOOK_CLOSED ) ), |
| aDocumentImage ( SfxResId( IMG_HELP_CONTENT_DOC ) ) |
| |
| { |
| if ( GetSettings().GetStyleSettings().GetHighContrastMode() ) |
| { |
| aOpenBookImage = Image( SfxResId( IMG_HELP_CONTENT_BOOK_OPEN_HC ) ); |
| aClosedBookImage = Image( SfxResId( IMG_HELP_CONTENT_BOOK_CLOSED_HC ) ); |
| aDocumentImage = Image( SfxResId( IMG_HELP_CONTENT_DOC_HC ) ); |
| } |
| |
| SetStyle( GetStyle() | WB_HIDESELECTION | WB_HSCROLL ); |
| |
| SetEntryHeight( 16 ); |
| SetSelectionMode( SINGLE_SELECTION ); |
| SetSpaceBetweenEntries( 2 ); |
| SetNodeBitmaps( aClosedBookImage, aOpenBookImage ); |
| |
| SetSublistOpenWithReturn(); |
| SetSublistOpenWithLeftRight(); |
| |
| InitRoot(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| ContentListBox_Impl::~ContentListBox_Impl() |
| { |
| sal_uInt16 nPos = 0; |
| SvLBoxEntry* pEntry = GetEntry( nPos++ ); |
| while ( pEntry ) |
| { |
| ::rtl::OUString aTemp( GetEntryText( pEntry ) ); |
| ClearChildren( pEntry ); |
| delete (ContentEntry_Impl*)pEntry->GetUserData(); |
| pEntry = GetEntry( nPos++ ); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void ContentListBox_Impl::InitRoot() |
| { |
| String aHelpTreeviewURL( DEFINE_CONST_UNICODE("vnd.sun.star.hier://com.sun.star.help.TreeView/") ); |
| ::com::sun::star::uno::Sequence< ::rtl::OUString > aList = |
| SfxContentHelper::GetHelpTreeViewContents( aHelpTreeviewURL ); |
| |
| const ::rtl::OUString* pEntries = aList.getConstArray(); |
| sal_uInt32 i, nCount = aList.getLength(); |
| for ( i = 0; i < nCount; ++i ) |
| { |
| String aRow( pEntries[i] ); |
| String aTitle, aURL; |
| xub_StrLen nIdx = 0; |
| aTitle = aRow.GetToken( 0, '\t', nIdx ); |
| aURL = aRow.GetToken( 0, '\t', nIdx ); |
| sal_Unicode cFolder = aRow.GetToken( 0, '\t', nIdx ).GetChar(0); |
| sal_Bool bIsFolder = ( '1' == cFolder ); |
| SvLBoxEntry* pEntry = InsertEntry( aTitle, aOpenBookImage, aClosedBookImage, NULL, sal_True ); |
| if ( bIsFolder ) |
| pEntry->SetUserData( new ContentEntry_Impl( aURL, sal_True ) ); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void ContentListBox_Impl::ClearChildren( SvLBoxEntry* pParent ) |
| { |
| SvLBoxEntry* pEntry = FirstChild( pParent ); |
| while ( pEntry ) |
| { |
| ::rtl::OUString aTemp( GetEntryText( pEntry ) ); |
| ClearChildren( pEntry ); |
| delete (ContentEntry_Impl*)pEntry->GetUserData(); |
| pEntry = NextSibling( pEntry ); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void ContentListBox_Impl::RequestingChilds( SvLBoxEntry* pParent ) |
| { |
| try |
| { |
| if ( !pParent->HasChilds() ) |
| { |
| if ( pParent->GetUserData() ) |
| { |
| String aTmpURL( ( (ContentEntry_Impl*)pParent->GetUserData() )->aURL ); |
| ::com::sun::star::uno::Sequence< ::rtl::OUString > aList = |
| SfxContentHelper::GetHelpTreeViewContents( aTmpURL ); |
| |
| const ::rtl::OUString* pEntries = aList.getConstArray(); |
| sal_uInt32 i, nCount = aList.getLength(); |
| for ( i = 0; i < nCount; ++i ) |
| { |
| String aRow( pEntries[i] ); |
| String aTitle, aURL; |
| xub_StrLen nIdx = 0; |
| aTitle = aRow.GetToken( 0, '\t', nIdx ); |
| aURL = aRow.GetToken( 0, '\t', nIdx ); |
| sal_Unicode cFolder = aRow.GetToken( 0, '\t', nIdx ).GetChar(0); |
| sal_Bool bIsFolder = ( '1' == cFolder ); |
| SvLBoxEntry* pEntry = NULL; |
| if ( bIsFolder ) |
| { |
| pEntry = InsertEntry( aTitle, aOpenBookImage, aClosedBookImage, pParent, sal_True ); |
| pEntry->SetUserData( new ContentEntry_Impl( aURL, sal_True ) ); |
| } |
| else |
| { |
| pEntry = InsertEntry( aTitle, aDocumentImage, aDocumentImage, pParent ); |
| Any aAny( ::utl::UCBContentHelper::GetProperty( aURL, String(RTL_CONSTASCII_USTRINGPARAM("TargetURL" ) ) ) ); |
| rtl::OUString aTargetURL; |
| if ( aAny >>= aTargetURL ) |
| pEntry->SetUserData( new ContentEntry_Impl( aTargetURL, sal_False ) ); |
| } |
| } |
| } |
| } |
| } |
| catch( Exception& ) |
| { |
| DBG_ERROR( "ContentListBox_Impl::RequestingChilds(): unexpected exception" ); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| long ContentListBox_Impl::Notify( NotifyEvent& rNEvt ) |
| { |
| sal_Bool bHandled = sal_False; |
| if ( rNEvt.GetType() == EVENT_KEYINPUT && |
| KEY_RETURN == rNEvt.GetKeyEvent()->GetKeyCode().GetCode() ) |
| { |
| GetDoubleClickHdl().Call( NULL ); |
| bHandled = sal_True; |
| } |
| |
| return bHandled ? 1 : SvTreeListBox::Notify( rNEvt ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| String ContentListBox_Impl::GetSelectEntry() const |
| { |
| String aRet; |
| SvLBoxEntry* pEntry = FirstSelected(); |
| if ( pEntry && !( (ContentEntry_Impl*)pEntry->GetUserData() )->bIsFolder ) |
| aRet = ( (ContentEntry_Impl*)pEntry->GetUserData() )->aURL; |
| return aRet; |
| } |
| |
| // class HelpTabPage_Impl ------------------------------------------------ |
| |
| HelpTabPage_Impl::HelpTabPage_Impl( |
| Window* pParent, SfxHelpIndexWindow_Impl* _pIdxWin, const ResId& rResId ) : |
| |
| TabPage( pParent, rResId ), |
| |
| m_pIdxWin( _pIdxWin ) |
| |
| { |
| } |
| |
| // class ContentTabPage_Impl --------------------------------------------- |
| |
| ContentTabPage_Impl::ContentTabPage_Impl( Window* pParent, SfxHelpIndexWindow_Impl* _pIdxWin ) : |
| |
| HelpTabPage_Impl( pParent, _pIdxWin, SfxResId( TP_HELP_CONTENT ) ), |
| |
| aContentBox( this, SfxResId( LB_CONTENTS ) ) |
| |
| { |
| FreeResource(); |
| |
| aContentBox.Show(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void ContentTabPage_Impl::Resize() |
| { |
| Size aSize = GetOutputSizePixel(); |
| aSize.Width() -= 8; |
| aSize.Height() -= 8; |
| aContentBox.SetPosSizePixel( Point( 4, 4 ), aSize ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void ContentTabPage_Impl::ActivatePage() |
| { |
| if ( !m_pIdxWin->WasCursorLeftOrRight() ) |
| SetFocusOnBox(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| Control* ContentTabPage_Impl::GetLastFocusControl() |
| { |
| return &aContentBox; |
| } |
| |
| // class IndexBox_Impl --------------------------------------------------- |
| |
| IndexBox_Impl::IndexBox_Impl( Window* pParent, const ResId& rResId ) : |
| |
| ComboBox( pParent, rResId ) |
| |
| { |
| EnableAutocomplete( sal_True ); |
| EnableUserDraw( sal_True ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void IndexBox_Impl::UserDraw( const UserDrawEvent& rUDEvt ) |
| { |
| IndexEntry_Impl* pEntry = (IndexEntry_Impl*)(sal_uIntPtr)GetEntryData( rUDEvt.GetItemId() ); |
| if ( pEntry && pEntry->m_bSubEntry ) |
| { |
| // indent sub entries |
| Point aPos( rUDEvt.GetRect().TopLeft() ); |
| aPos.X() += 8; |
| aPos.Y() += ( rUDEvt.GetRect().GetHeight() - rUDEvt.GetDevice()->GetTextHeight() ) / 2; |
| String aEntry( GetEntry( rUDEvt.GetItemId() ) ); |
| sal_uInt16 nPos = aEntry.Search( ';' ); |
| rUDEvt.GetDevice()->DrawText( aPos, ( nPos != STRING_NOTFOUND ) ? aEntry.Copy( nPos + 1 ) : aEntry ); |
| } |
| else |
| DrawEntry( rUDEvt, sal_False, sal_True, sal_True ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| long IndexBox_Impl::Notify( NotifyEvent& rNEvt ) |
| { |
| sal_Bool bHandled = sal_False; |
| if ( rNEvt.GetType() == EVENT_KEYINPUT && |
| KEY_RETURN == rNEvt.GetKeyEvent()->GetKeyCode().GetCode() ) |
| { |
| GetDoubleClickHdl().Call( NULL ); |
| bHandled = sal_True; |
| } |
| |
| return bHandled ? 1 : ComboBox::Notify( rNEvt ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void IndexBox_Impl::SelectExecutableEntry() |
| { |
| sal_uInt16 nPos = GetEntryPos( GetText() ); |
| if ( nPos != COMBOBOX_ENTRY_NOTFOUND ) |
| { |
| sal_uInt16 nOldPos = nPos; |
| String aEntryText; |
| IndexEntry_Impl* pEntry = (IndexEntry_Impl*)(sal_uIntPtr)GetEntryData( nPos ); |
| sal_uInt16 nCount = GetEntryCount(); |
| while ( nPos < nCount && ( !pEntry || pEntry->m_aURL.Len() == 0 ) ) |
| { |
| pEntry = (IndexEntry_Impl*)(sal_uIntPtr)GetEntryData( ++nPos ); |
| aEntryText = GetEntry( nPos ); |
| } |
| |
| if ( nOldPos != nPos ) |
| SetText( aEntryText ); |
| } |
| } |
| |
| // class IndexTabPage_Impl ----------------------------------------------- |
| |
| IndexTabPage_Impl::IndexTabPage_Impl( Window* pParent, SfxHelpIndexWindow_Impl* _pIdxWin ) : |
| |
| HelpTabPage_Impl( pParent, _pIdxWin, SfxResId( TP_HELP_INDEX ) ), |
| |
| aExpressionFT ( this, SfxResId( FT_EXPRESSION ) ), |
| aIndexCB ( this, SfxResId( CB_INDEX ) ), |
| aOpenBtn ( this, SfxResId( PB_OPEN_INDEX ) ), |
| |
| bIsActivated ( sal_False ) |
| |
| { |
| FreeResource(); |
| |
| aOpenBtn.SetClickHdl( LINK( this, IndexTabPage_Impl, OpenHdl ) ); |
| Link aTimeoutLink = LINK( this, IndexTabPage_Impl, TimeoutHdl ); |
| aFactoryTimer.SetTimeoutHdl( aTimeoutLink ); |
| aFactoryTimer.SetTimeout( 300 ); |
| aKeywordTimer.SetTimeoutHdl( aTimeoutLink ); |
| aFactoryTimer.SetTimeout( 300 ); |
| |
| nMinWidth = aOpenBtn.GetSizePixel().Width(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IndexTabPage_Impl::~IndexTabPage_Impl() |
| { |
| ClearIndex(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| namespace sfx2 { |
| |
| struct equalOUString |
| { |
| bool operator()( const ::rtl::OUString& rKey1, const ::rtl::OUString& rKey2 ) const |
| { |
| return !!( rKey1 == rKey2 ); |
| } |
| }; |
| |
| |
| struct hashOUString |
| { |
| size_t operator()( const ::rtl::OUString& rName ) const |
| { |
| return rName.hashCode(); |
| } |
| }; |
| |
| typedef ::std::hash_map< ::rtl::OUString, int, hashOUString, equalOUString > KeywordInfo; |
| } |
| |
| #define UNIFY_AND_INSERT_TOKEN( aToken ) \ |
| it = \ |
| aInfo.insert( sfx2::KeywordInfo::value_type( aToken, 0 ) ).first; \ |
| if ( ( tmp = it->second++ ) != 0 ) \ |
| nPos = aIndexCB.InsertEntry( aToken + rtl::OUString( append, tmp ) ); \ |
| else \ |
| nPos = aIndexCB.InsertEntry( aToken ) |
| |
| #define INSERT_DATA( j ) \ |
| if ( aAnchorList[j].getLength() > 0 ) \ |
| { \ |
| aData.append( aRefList[j] ).append( sal_Unicode('#') ).append( aAnchorList[j] ); \ |
| aIndexCB.SetEntryData( nPos, NEW_ENTRY( aData.makeStringAndClear(), insert ) ); \ |
| } \ |
| else \ |
| aIndexCB.SetEntryData( nPos, NEW_ENTRY( aRefList[j], insert ) ); |
| |
| // ----------------------------------------------------------------------- |
| |
| void IndexTabPage_Impl::InitializeIndex() |
| { |
| WaitObject( this ); |
| |
| // By now more than 256 equal entries are not allowed |
| sal_Unicode append[256]; |
| for( int k = 0; k < 256; ++k ) |
| append[k] = sal_Unicode( ' ' ); |
| |
| sfx2::KeywordInfo aInfo; |
| aIndexCB.SetUpdateMode( sal_False ); |
| |
| try |
| { |
| ::rtl::OUString aURL = HELP_URL; |
| aURL += ::rtl::OUString( sFactory ); |
| |
| String aTemp = aURL; |
| AppendConfigToken_Impl( aTemp, sal_True ); |
| aURL = aTemp; |
| |
| Content aCnt( aURL, Reference< ::com::sun::star::ucb::XCommandEnvironment > () ); |
| ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > xInfo = aCnt.getProperties(); |
| if ( xInfo->hasPropertyByName( PROPERTY_ANCHORREF ) ) |
| { |
| ::com::sun::star::uno::Sequence< ::rtl::OUString > aPropSeq( 4 ); |
| aPropSeq[0] = PROPERTY_KEYWORDLIST; |
| aPropSeq[1] = PROPERTY_KEYWORDREF; |
| aPropSeq[2] = PROPERTY_ANCHORREF; |
| aPropSeq[3] = PROPERTY_TITLEREF; |
| |
| // abi: use one possibly remote call only |
| ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > aAnySeq = |
| aCnt.getPropertyValues( aPropSeq ); |
| |
| ::com::sun::star::uno::Sequence< ::rtl::OUString > aKeywordList; |
| ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::rtl::OUString > > aKeywordRefList; |
| ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::rtl::OUString > > aAnchorRefList; |
| ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::rtl::OUString > > aTitleRefList; |
| |
| if ( ( aAnySeq[0] >>= aKeywordList ) && ( aAnySeq[1] >>= aKeywordRefList ) && |
| ( aAnySeq[2] >>= aAnchorRefList ) && ( aAnySeq[3] >>= aTitleRefList ) ) |
| { |
| sal_Bool insert; |
| sal_uInt16 nPos; |
| int ndx,tmp; |
| ::rtl::OUString aIndex, aTempString; |
| ::rtl::OUStringBuffer aData( 128 ); // Capacity of up to 128 characters |
| sfx2::KeywordInfo::iterator it; |
| |
| for ( int i = 0; i < aKeywordList.getLength(); ++i ) |
| { |
| // abi: Do not copy, but use references |
| const ::rtl::OUString& aKeywordPair = aKeywordList[i]; |
| DBG_ASSERT( aKeywordPair.getLength() > 0, "invalid help index" ); |
| const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aRefList = aKeywordRefList[i]; |
| const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aAnchorList = aAnchorRefList[i]; |
| const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aTitleList = aTitleRefList[i]; |
| |
| DBG_ASSERT( aRefList.getLength() == aAnchorList.getLength(),"reference list and title list of different length" ); |
| |
| insert = ( ( ndx = aKeywordPair.indexOf( sal_Unicode( ';' ) ) ) == -1 ? sal_False : sal_True ); |
| |
| if ( insert ) |
| { |
| aTempString = aKeywordPair.copy( 0, ndx ); |
| if ( aIndex != aTempString ) |
| { |
| aIndex = aTempString; |
| UNIFY_AND_INSERT_TOKEN( aTempString ); |
| } |
| } |
| else |
| aIndex = ::rtl::OUString(); |
| |
| // Assume the token is trimed |
| UNIFY_AND_INSERT_TOKEN( aKeywordPair ); |
| |
| sal_uInt32 nRefListLen = aRefList.getLength(); |
| |
| DBG_ASSERT( aAnchorList.getLength(), "*IndexTabPage_Impl::InitializeIndex(): AnchorList is empty!" ); \ |
| DBG_ASSERT( nRefListLen, "*IndexTabPage_Impl::InitializeIndex(): RefList is empty!" ); \ |
| |
| if ( aAnchorList.getLength() && nRefListLen ) |
| { |
| INSERT_DATA( 0 ); |
| } |
| |
| for ( sal_uInt32 j = 1; j < nRefListLen ; ++j ) |
| { |
| aData |
| .append( aKeywordPair ) |
| .append( sal_Unicode(' ') ) |
| .append( sal_Unicode('-') ) |
| .append( sal_Unicode(' ') ) |
| .append( aTitleList[j] ); |
| |
| aTempString = aData.makeStringAndClear(); |
| UNIFY_AND_INSERT_TOKEN( aTempString ); |
| INSERT_DATA( j ); |
| } |
| } |
| } |
| } |
| } |
| catch( Exception& ) |
| { |
| DBG_ERROR( "IndexTabPage_Impl::InitializeIndex(): unexpected exception" ); |
| } |
| |
| aIndexCB.SetUpdateMode( sal_True ); |
| |
| if ( sKeyword.Len() > 0 ) |
| aKeywordLink.Call( this ); |
| } |
| |
| #undef INSERT_DATA |
| #undef UNIFY_AND_INSERT_TOKEN |
| |
| // ----------------------------------------------------------------------- |
| |
| void IndexTabPage_Impl::ClearIndex() |
| { |
| sal_uInt16 nCount = aIndexCB.GetEntryCount(); |
| for ( sal_uInt16 i = 0; i < nCount; ++i ) |
| delete (IndexEntry_Impl*)(sal_uIntPtr)aIndexCB.GetEntryData(i); |
| aIndexCB.Clear(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( IndexTabPage_Impl, OpenHdl, PushButton*, EMPTYARG ) |
| { |
| aIndexCB.GetDoubleClickHdl().Call( &aIndexCB ); |
| return 0; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( IndexTabPage_Impl, TimeoutHdl, Timer*, pTimer ) |
| { |
| if ( &aFactoryTimer == pTimer ) |
| InitializeIndex(); |
| else if ( &aKeywordTimer == pTimer && sKeyword.Len() > 0 ) |
| aKeywordLink.Call( this ); |
| return 0; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void IndexTabPage_Impl::Resize() |
| { |
| Size aSize = GetSizePixel(); |
| if ( aSize.Width() < nMinWidth ) |
| aSize.Width() = nMinWidth; |
| Point aPnt = aExpressionFT.GetPosPixel(); |
| Size aNewSize = aExpressionFT.GetSizePixel(); |
| aNewSize.Width() = aSize.Width() - ( aPnt.X() * 2 ); |
| aExpressionFT.SetSizePixel( aNewSize ); |
| |
| Size a6Size = LogicToPixel( Size( 6, 6 ), MAP_APPFONT ); |
| Size aBtnSize = aOpenBtn.GetSizePixel(); |
| |
| aPnt = aIndexCB.GetPosPixel(); |
| aNewSize = aIndexCB.GetSizePixel(); |
| aNewSize.Width() = aSize.Width() - ( aPnt.X() * 2 ); |
| aNewSize.Height() = aSize.Height() - aPnt.Y(); |
| aNewSize.Height() -= ( aBtnSize.Height() + ( a6Size.Height() * 3 / 2 ) ); |
| aIndexCB.SetSizePixel( aNewSize ); |
| |
| aPnt.X() += ( aNewSize.Width() - aBtnSize.Width() ); |
| aPnt.Y() += aNewSize.Height() + ( a6Size.Height() / 2 ); |
| long nMinX = aIndexCB.GetPosPixel().X(); |
| if ( aPnt.X() < nMinX ) |
| aPnt.X() = nMinX; |
| aOpenBtn.SetPosPixel( aPnt ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void IndexTabPage_Impl::ActivatePage() |
| { |
| if ( !bIsActivated ) |
| { |
| bIsActivated = sal_True; |
| aFactoryTimer.Start(); |
| } |
| |
| if ( !m_pIdxWin->WasCursorLeftOrRight() ) |
| SetFocusOnBox(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| Control* IndexTabPage_Impl::GetLastFocusControl() |
| { |
| return &aOpenBtn; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void IndexTabPage_Impl::SetDoubleClickHdl( const Link& rLink ) |
| { |
| aIndexCB.SetDoubleClickHdl( rLink ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void IndexTabPage_Impl::SetFactory( const String& rFactory ) |
| { |
| String sNewFactory( rFactory ); |
| DBG_ASSERT( sNewFactory.Len() > 0, "empty factory" ); |
| bool bValid = m_pIdxWin->IsValidFactory( rFactory ); |
| |
| if ( sFactory.Len() == 0 && !bValid ) |
| { |
| sNewFactory = SfxHelp::GetDefaultHelpModule(); |
| bValid = true; |
| } |
| |
| if ( sNewFactory != sFactory && bValid ) |
| { |
| sFactory = sNewFactory; |
| ClearIndex(); |
| if ( bIsActivated ) |
| aFactoryTimer.Start(); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| String IndexTabPage_Impl::GetSelectEntry() const |
| { |
| String aRet; |
| IndexEntry_Impl* pEntry = (IndexEntry_Impl*)(sal_uIntPtr)aIndexCB.GetEntryData( aIndexCB.GetEntryPos( aIndexCB.GetText() ) ); |
| if ( pEntry ) |
| aRet = pEntry->m_aURL; |
| return aRet; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void IndexTabPage_Impl::SetKeyword( const String& rKeyword ) |
| { |
| sKeyword = rKeyword; |
| |
| if ( aIndexCB.GetEntryCount() > 0 ) |
| aKeywordTimer.Start(); |
| else if ( !bIsActivated ) |
| aFactoryTimer.Start(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| sal_Bool IndexTabPage_Impl::HasKeyword() const |
| { |
| sal_Bool bRet = sal_False; |
| if ( sKeyword.Len() > 0 ) |
| { |
| sal_uInt16 nPos = aIndexCB.GetEntryPos( sKeyword ); |
| bRet = ( nPos != LISTBOX_ENTRY_NOTFOUND ); |
| } |
| |
| return bRet; |
| } |
| |
| // ----------------------------------------------------------------------- |
| //added by BerryJia for fixing Bug98251, 2002-12-11 |
| sal_Bool IndexTabPage_Impl::HasKeywordIgnoreCase() |
| { |
| sal_Bool bRet = sal_False; |
| if ( sKeyword.Len() > 0 ) |
| { |
| sal_uInt16 nEntries = aIndexCB.GetEntryCount(); |
| String sIndexItem; |
| const vcl::I18nHelper& rI18nHelper = GetSettings().GetLocaleI18nHelper(); |
| for ( sal_uInt16 n = 0; n < nEntries; n++) |
| { |
| sIndexItem = aIndexCB.GetEntry( n ); |
| if (rI18nHelper.MatchString( sIndexItem, sKeyword )) |
| { |
| sKeyword = sIndexItem; |
| bRet = sal_True; |
| } |
| } |
| } |
| |
| return bRet; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void IndexTabPage_Impl::OpenKeyword() |
| { |
| if ( sKeyword.Len() > 0 ) |
| { |
| aIndexCB.SetText( sKeyword ); |
| aIndexCB.GetDoubleClickHdl().Call( NULL ); |
| sKeyword.Erase(); |
| } |
| } |
| |
| // class SearchBox_Impl -------------------------------------------------- |
| |
| long SearchBox_Impl::PreNotify( NotifyEvent& rNEvt ) |
| { |
| sal_Bool bHandled = sal_False; |
| if ( !IsInDropDown() && |
| rNEvt.GetWindow() == GetSubEdit() && |
| rNEvt.GetType() == EVENT_KEYINPUT && |
| KEY_RETURN == rNEvt.GetKeyEvent()->GetKeyCode().GetCode() ) |
| { |
| aSearchLink.Call( NULL ); |
| bHandled = sal_True; |
| } |
| return bHandled ? 1 : ComboBox::PreNotify( rNEvt ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SearchBox_Impl::Select() |
| { |
| if ( !IsTravelSelect() ) |
| aSearchLink.Call( NULL ); |
| } |
| |
| // class SearchResultsBox_Impl ------------------------------------------- |
| |
| long SearchResultsBox_Impl::Notify( NotifyEvent& rNEvt ) |
| { |
| sal_Bool bHandled = sal_False; |
| if ( rNEvt.GetType() == EVENT_KEYINPUT && |
| KEY_RETURN == rNEvt.GetKeyEvent()->GetKeyCode().GetCode() ) |
| { |
| GetDoubleClickHdl().Call( NULL ); |
| bHandled = sal_True; |
| } |
| |
| return bHandled ? 1 : ListBox::Notify( rNEvt ); |
| } |
| |
| // class SearchTabPage_Impl ---------------------------------------------- |
| |
| SearchTabPage_Impl::SearchTabPage_Impl( Window* pParent, SfxHelpIndexWindow_Impl* _pIdxWin ) : |
| |
| HelpTabPage_Impl( pParent, _pIdxWin, SfxResId( TP_HELP_SEARCH ) ), |
| |
| aSearchFT ( this, SfxResId( FT_SEARCH ) ), |
| aSearchED ( this, SfxResId( ED_SEARCH ) ), |
| aSearchBtn ( this, SfxResId( PB_SEARCH ) ), |
| aFullWordsCB ( this, SfxResId( CB_FULLWORDS ) ), |
| aScopeCB ( this, SfxResId( CB_SCOPE ) ), |
| aResultsLB ( this, SfxResId( LB_RESULT ) ), |
| aOpenBtn ( this, SfxResId( PB_OPEN_SEARCH ) ), |
| xBreakIterator ( vcl::unohelper::CreateBreakIterator() ) |
| |
| { |
| FreeResource(); |
| |
| Link aLink = LINK( this, SearchTabPage_Impl, SearchHdl ); |
| aSearchED.SetSearchLink( aLink ); |
| aSearchBtn.SetClickHdl( aLink ); |
| aSearchED.SetModifyHdl( LINK( this, SearchTabPage_Impl, ModifyHdl ) ); |
| aOpenBtn.SetClickHdl( LINK( this, SearchTabPage_Impl, OpenHdl ) ); |
| |
| aMinSize = GetSizePixel(); |
| |
| SvtViewOptions aViewOpt( E_TABPAGE, CONFIGNAME_SEARCHPAGE ); |
| if ( aViewOpt.Exists() ) |
| { |
| String aUserData; |
| Any aUserItem = aViewOpt.GetUserItem( USERITEM_NAME ); |
| ::rtl::OUString aTemp; |
| if ( aUserItem >>= aTemp ) |
| { |
| aUserData = String( aTemp ); |
| sal_Bool bChecked = ( 1 == aUserData.GetToken(0).ToInt32() ) ? sal_True : sal_False; |
| aFullWordsCB.Check( bChecked ); |
| bChecked = ( 1 == aUserData.GetToken(1).ToInt32() ) ? sal_True : sal_False; |
| aScopeCB.Check( bChecked ); |
| |
| for ( sal_uInt16 i = 2; i < aUserData.GetTokenCount(); ++i ) |
| { |
| String aToken = aUserData.GetToken(i); |
| aSearchED.InsertEntry( INetURLObject::decode( |
| aToken, '%', INetURLObject::DECODE_WITH_CHARSET ) ); |
| } |
| } |
| } |
| |
| ModifyHdl( &aSearchED ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| SearchTabPage_Impl::~SearchTabPage_Impl() |
| { |
| SvtViewOptions aViewOpt( E_TABPAGE, CONFIGNAME_SEARCHPAGE ); |
| sal_Int32 nChecked = aFullWordsCB.IsChecked() ? 1 : 0; |
| String aUserData = String::CreateFromInt32( nChecked ); |
| aUserData += ';'; |
| nChecked = aScopeCB.IsChecked() ? 1 : 0; |
| aUserData += String::CreateFromInt32( nChecked ); |
| aUserData += ';'; |
| sal_uInt16 nCount = Min( aSearchED.GetEntryCount(), (sal_uInt16)10 ); // save only 10 entries |
| |
| for ( sal_uInt16 i = 0; i < nCount; ++i ) |
| { |
| rtl::OUString aText = aSearchED.GetEntry(i); |
| aUserData += String(INetURLObject::encode( |
| aText, INetURLObject::PART_UNO_PARAM_VALUE, '%', |
| INetURLObject::ENCODE_ALL )); |
| aUserData += ';'; |
| } |
| |
| aUserData.EraseTrailingChars(';'); |
| Any aUserItem = makeAny( ::rtl::OUString( aUserData ) ); |
| aViewOpt.SetUserItem( USERITEM_NAME, aUserItem ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SearchTabPage_Impl::ClearSearchResults() |
| { |
| sal_uInt16 nCount = aResultsLB.GetEntryCount(); |
| for ( sal_uInt16 i = 0; i < nCount; ++i ) |
| delete (String*)(sal_uIntPtr)aResultsLB.GetEntryData(i); |
| aResultsLB.Clear(); |
| aResultsLB.Update(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SearchTabPage_Impl::RememberSearchText( const String& rSearchText ) |
| { |
| for ( sal_uInt16 i = 0; i < aSearchED.GetEntryCount(); ++i ) |
| { |
| if ( rSearchText == aSearchED.GetEntry(i) ) |
| { |
| aSearchED.RemoveEntry(i); |
| break; |
| } |
| } |
| |
| aSearchED.InsertEntry( rSearchText, 0 ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( SearchTabPage_Impl, SearchHdl, PushButton*, EMPTYARG ) |
| { |
| String aSearchText = TRIM( aSearchED.GetText() ); |
| if ( aSearchText.Len() > 0 ) |
| { |
| EnterWait(); |
| ClearSearchResults(); |
| RememberSearchText( aSearchText ); |
| String aSearchURL = HELP_URL; |
| aSearchURL += aFactory; |
| aSearchURL += String( HELP_SEARCH_TAG ); |
| if ( !aFullWordsCB.IsChecked() ) |
| aSearchText = sfx2::PrepareSearchString( aSearchText, xBreakIterator, true ); |
| aSearchURL += aSearchText; |
| AppendConfigToken_Impl( aSearchURL, sal_False ); |
| if ( aScopeCB.IsChecked() ) |
| aSearchURL += DEFINE_CONST_UNICODE("&Scope=Heading"); |
| Sequence< ::rtl::OUString > aFactories = SfxContentHelper::GetResultSet( aSearchURL ); |
| const ::rtl::OUString* pFacs = aFactories.getConstArray(); |
| sal_uInt32 i, nCount = aFactories.getLength(); |
| for ( i = 0; i < nCount; ++i ) |
| { |
| String aRow( pFacs[i] ); |
| String aTitle, aType; |
| xub_StrLen nIdx = 0; |
| aTitle = aRow.GetToken( 0, '\t', nIdx ); |
| aType = aRow.GetToken( 0, '\t', nIdx ); |
| String* pURL = new String( aRow.GetToken( 0, '\t', nIdx ) ); |
| sal_uInt16 nPos = aResultsLB.InsertEntry( aTitle ); |
| aResultsLB.SetEntryData( nPos, (void*)(sal_uIntPtr)pURL ); |
| } |
| LeaveWait(); |
| |
| if ( !nCount ) |
| { |
| InfoBox aBox( this, SfxResId( RID_INFO_NOSEARCHRESULTS ) ); |
| aBox.SetText( String( SfxResId( STR_HELP_WINDOW_TITLE ) ) ); |
| aBox.Execute(); |
| } |
| } |
| return 0; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( SearchTabPage_Impl, OpenHdl, PushButton*, EMPTYARG ) |
| { |
| aResultsLB.GetDoubleClickHdl().Call( &aResultsLB ); |
| return 0; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( SearchTabPage_Impl, ModifyHdl, Edit*, EMPTYARG ) |
| { |
| String aSearchText = TRIM( aSearchED.GetText() ); |
| aSearchBtn.Enable( aSearchText.Len() > 0 ); |
| return 0; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SearchTabPage_Impl::Resize() |
| { |
| Size a6Size = LogicToPixel( Size( 6, 6 ), MAP_APPFONT ); |
| Size aSize = GetSizePixel(); |
| if ( aSize.Width() < aMinSize.Width() ) |
| aSize.Width() = aMinSize.Width(); |
| Point aPnt = aSearchFT.GetPosPixel(); |
| Size aNewSize = aSearchFT.GetSizePixel(); |
| aNewSize.Width() = aSize.Width() - ( aPnt.X() * 2 ); |
| aSearchFT.SetSizePixel( aNewSize ); |
| aNewSize.Height() = aResultsLB.GetSizePixel().Height(); |
| aResultsLB.SetSizePixel( aNewSize ); |
| aNewSize.Height() = aFullWordsCB.GetSizePixel().Height(); |
| aFullWordsCB.SetSizePixel( aNewSize ); |
| aScopeCB.SetSizePixel( aNewSize ); |
| aNewSize = aSearchED.GetSizePixel(); |
| aNewSize.Width() = aSize.Width() - ( aPnt.X() * 2 ) - |
| ( aSearchBtn.GetSizePixel().Width() + ( aPnt.X() / 2 ) ); |
| aSearchED.SetSizePixel( aNewSize ); |
| Point aNewPnt = aSearchBtn.GetPosPixel(); |
| aNewPnt.X() = aPnt.X() + aNewSize.Width() + ( aPnt.X() / 2 ); |
| aSearchBtn.SetPosPixel( aNewPnt ); |
| |
| if ( aSize.Height() > aMinSize.Height() ) |
| { |
| long n3Height = a6Size.Height() / 2; |
| Size aBtnSize = aOpenBtn.GetSizePixel(); |
| long nExtraHeight = aBtnSize.Height() + n3Height; |
| |
| aPnt = aResultsLB.GetPosPixel(); |
| aNewSize = aResultsLB.GetSizePixel(); |
| aNewSize.Height() = aSize.Height() - aPnt.Y(); |
| aNewSize.Height() -= ( nExtraHeight + ( a6Size.Height() * 3 / 2 ) ); |
| aResultsLB.SetSizePixel( aNewSize ); |
| |
| aPnt.X() += ( aNewSize.Width() - aBtnSize.Width() ); |
| aPnt.Y() += aNewSize.Height() + a6Size.Height(); |
| aOpenBtn.SetPosPixel( aPnt ); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SearchTabPage_Impl::ActivatePage() |
| { |
| if ( !m_pIdxWin->WasCursorLeftOrRight() ) |
| aSearchED.GrabFocus(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| Control* SearchTabPage_Impl::GetLastFocusControl() |
| { |
| return &aOpenBtn; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SearchTabPage_Impl::SetDoubleClickHdl( const Link& rLink ) |
| { |
| aResultsLB.SetDoubleClickHdl( rLink ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| String SearchTabPage_Impl::GetSelectEntry() const |
| { |
| String aRet; |
| String* pData = (String*)(sal_uIntPtr)aResultsLB.GetEntryData( aResultsLB.GetSelectEntryPos() ); |
| if ( pData ) |
| aRet = String( *pData ); |
| return aRet; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SearchTabPage_Impl::ClearPage() |
| { |
| ClearSearchResults(); |
| aSearchED.SetText( String() ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| sal_Bool SearchTabPage_Impl::OpenKeyword( const String& rKeyword ) |
| { |
| sal_Bool bRet = sal_False; |
| aSearchED.SetText( rKeyword ); |
| SearchHdl( NULL ); |
| if ( aResultsLB.GetEntryCount() > 0 ) |
| { |
| // found keyword -> open it |
| aResultsLB.SelectEntryPos(0); |
| OpenHdl( NULL ); |
| bRet = sal_True; |
| } |
| |
| return bRet; |
| } |
| |
| // class BookmarksTabPage_Impl ------------------------------------------- |
| |
| void GetBookmarkEntry_Impl |
| ( |
| Sequence< PropertyValue >& aBookmarkEntry, |
| ::rtl::OUString& rTitle, |
| ::rtl::OUString& rURL |
| ) |
| { |
| for ( int i = 0; i < aBookmarkEntry.getLength(); i++ ) |
| { |
| PropertyValue aValue = aBookmarkEntry[i]; |
| if ( aValue.Name == HISTORY_PROPERTYNAME_URL ) |
| aValue.Value >>= rURL; |
| else if ( aValue.Name == HISTORY_PROPERTYNAME_TITLE ) |
| aValue.Value >>= rTitle; |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| BookmarksBox_Impl::BookmarksBox_Impl( Window* pParent, const ResId& rResId ) : |
| |
| ListBox( pParent, rResId ) |
| |
| { |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| BookmarksBox_Impl::~BookmarksBox_Impl() |
| { |
| // save bookmarks to configuration |
| SvtHistoryOptions aHistOpt; |
| aHistOpt.Clear( eHELPBOOKMARKS ); |
| rtl::OUString sEmpty; |
| sal_uInt16 nCount = GetEntryCount(); |
| for ( sal_uInt16 i = 0; i < nCount; ++i ) |
| { |
| String aTitle = GetEntry(i); |
| String* pURL = (String*)(sal_uIntPtr)GetEntryData(i); |
| aHistOpt.AppendItem( eHELPBOOKMARKS, rtl::OUString( *pURL ), sEmpty, rtl::OUString( aTitle ), sEmpty ); |
| delete pURL; |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void BookmarksBox_Impl::DoAction( sal_uInt16 nAction ) |
| { |
| switch ( nAction ) |
| { |
| case MID_OPEN : |
| GetDoubleClickHdl().Call( NULL ); |
| break; |
| |
| case MID_RENAME : |
| { |
| sal_uInt16 nPos = GetSelectEntryPos(); |
| if ( nPos != LISTBOX_ENTRY_NOTFOUND ) |
| { |
| SfxAddHelpBookmarkDialog_Impl aDlg( this, sal_True ); |
| aDlg.SetTitle( GetEntry( nPos ) ); |
| if ( aDlg.Execute() == RET_OK ) |
| { |
| String* pURL = (String*)(sal_uIntPtr)GetEntryData( nPos ); |
| RemoveEntry( nPos ); |
| rtl::OUString aImageURL = IMAGE_URL; |
| aImageURL += INetURLObject( *pURL ).GetHost(); |
| nPos = InsertEntry( aDlg.GetTitle(), SvFileInformationManager::GetImage( aImageURL ) ); |
| SetEntryData( nPos, (void*)(sal_uIntPtr)( new String( *pURL ) ) ); |
| SelectEntryPos( nPos ); |
| delete pURL; |
| } |
| } |
| break; |
| } |
| |
| case MID_DELETE : |
| { |
| sal_uInt16 nPos = GetSelectEntryPos(); |
| if ( nPos != LISTBOX_ENTRY_NOTFOUND ) |
| { |
| RemoveEntry( nPos ); |
| sal_uInt16 nCount = GetEntryCount(); |
| if ( nCount ) |
| { |
| if ( nPos >= nCount ) |
| nPos = nCount - 1; |
| SelectEntryPos( nPos ); |
| } |
| } |
| break; |
| } |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| long BookmarksBox_Impl::Notify( NotifyEvent& rNEvt ) |
| { |
| long nRet = 0; |
| sal_uInt16 nType = rNEvt.GetType(); |
| if ( EVENT_KEYINPUT == nType ) |
| { |
| sal_uInt16 nCode = rNEvt.GetKeyEvent()->GetKeyCode().GetCode(); |
| if ( KEY_DELETE == nCode && GetEntryCount() > 0 ) |
| { |
| DoAction( MID_DELETE ); |
| nRet = 1; |
| } |
| else if ( KEY_RETURN == nCode ) |
| { |
| GetDoubleClickHdl().Call( NULL ); |
| nRet = 1; |
| } |
| } |
| else if ( EVENT_COMMAND == nType ) |
| { |
| const CommandEvent* pCEvt = rNEvt.GetCommandEvent(); |
| if ( pCEvt->GetCommand() == COMMAND_CONTEXTMENU ) |
| { |
| PopupMenu aMenu( SfxResId( MENU_HELP_BOOKMARKS ) ); |
| sal_uInt16 nId = aMenu.Execute( this, pCEvt->GetMousePosPixel() ); |
| if ( nId != MENU_ITEM_NOTFOUND ) |
| DoAction( nId ); |
| nRet = 1; |
| } |
| } |
| |
| return nRet ? nRet : ListBox::Notify( rNEvt ); |
| } |
| |
| // class BookmarksTabPage_Impl ------------------------------------------- |
| |
| BookmarksTabPage_Impl::BookmarksTabPage_Impl( Window* pParent, SfxHelpIndexWindow_Impl* _pIdxWin ) : |
| |
| HelpTabPage_Impl( pParent, _pIdxWin, SfxResId( TP_HELP_BOOKMARKS ) ), |
| |
| aBookmarksFT ( this, SfxResId( FT_BOOKMARKS ) ), |
| aBookmarksBox ( this, SfxResId( LB_BOOKMARKS ) ), |
| aBookmarksPB ( this, SfxResId( PB_BOOKMARKS ) ) |
| |
| { |
| FreeResource(); |
| |
| nMinWidth = aBookmarksPB.GetSizePixel().Width(); |
| |
| aBookmarksPB.SetClickHdl( LINK( this, BookmarksTabPage_Impl, OpenHdl ) ); |
| |
| // load bookmarks from configuration |
| Sequence< Sequence< PropertyValue > > aBookmarkSeq; |
| aBookmarkSeq = SvtHistoryOptions().GetList( eHELPBOOKMARKS ); |
| |
| ::rtl::OUString aTitle; |
| ::rtl::OUString aURL; |
| |
| sal_uInt32 i, nCount = aBookmarkSeq.getLength(); |
| for ( i = 0; i < nCount; ++i ) |
| { |
| GetBookmarkEntry_Impl( aBookmarkSeq[i], aTitle, aURL ); |
| AddBookmarks( aTitle, aURL ); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( BookmarksTabPage_Impl, OpenHdl, PushButton*, EMPTYARG ) |
| { |
| aBookmarksBox.GetDoubleClickHdl().Call( &aBookmarksBox ); |
| return 0; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void BookmarksTabPage_Impl::Resize() |
| { |
| Size aSize = GetSizePixel(); |
| if ( aSize.Width() < nMinWidth ) |
| aSize.Width() = nMinWidth; |
| Point aPnt = aBookmarksFT.GetPosPixel(); |
| Size aNewSize = aBookmarksFT.GetSizePixel(); |
| aNewSize.Width() = aSize.Width() - ( aPnt.X() * 2 ); |
| aBookmarksFT.SetSizePixel( aNewSize ); |
| |
| Size a6Size = LogicToPixel( Size( 6, 6 ), MAP_APPFONT ); |
| Size aBtnSize = aBookmarksPB.GetSizePixel(); |
| |
| aPnt = aBookmarksBox.GetPosPixel(); |
| aNewSize = aBookmarksBox.GetSizePixel(); |
| aNewSize.Width() = aSize.Width() - ( aPnt.X() * 2 ); |
| aNewSize.Height() = aSize.Height() - aPnt.Y(); |
| aNewSize.Height() -= ( aBtnSize.Height() + ( a6Size.Height() * 3 / 2 ) ); |
| aBookmarksBox.SetSizePixel( aNewSize ); |
| |
| aPnt.X() += ( aNewSize.Width() - aBtnSize.Width() ); |
| aPnt.Y() += aNewSize.Height() + ( a6Size.Height() / 2 ); |
| long nMinX = aBookmarksBox.GetPosPixel().X(); |
| if ( aPnt.X() < nMinX ) |
| aPnt.X() = nMinX; |
| aBookmarksPB.SetPosPixel( aPnt ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void BookmarksTabPage_Impl::ActivatePage() |
| { |
| if ( !m_pIdxWin->WasCursorLeftOrRight() ) |
| SetFocusOnBox(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| Control* BookmarksTabPage_Impl::GetLastFocusControl() |
| { |
| return &aBookmarksPB; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void BookmarksTabPage_Impl::SetDoubleClickHdl( const Link& rLink ) |
| { |
| aBookmarksBox.SetDoubleClickHdl( rLink ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| String BookmarksTabPage_Impl::GetSelectEntry() const |
| { |
| String aRet; |
| String* pData = (String*)(sal_uIntPtr)aBookmarksBox.GetEntryData( aBookmarksBox.GetSelectEntryPos() ); |
| if ( pData ) |
| aRet = String( *pData ); |
| return aRet; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void BookmarksTabPage_Impl::AddBookmarks( const String& rTitle, const String& rURL ) |
| { |
| rtl::OUString aImageURL = IMAGE_URL; |
| aImageURL += INetURLObject( rURL ).GetHost(); |
| sal_uInt16 nPos = aBookmarksBox.InsertEntry( rTitle, SvFileInformationManager::GetImage( aImageURL ) ); |
| aBookmarksBox.SetEntryData( nPos, (void*)(sal_uIntPtr)( new String( rURL ) ) ); |
| } |
| |
| // class SfxHelpIndexWindow_Impl ----------------------------------------- |
| |
| sal_Bool SfxHelpWindow_Impl::splitHelpURL(const ::rtl::OUString& sHelpURL, |
| ::rtl::OUString& sFactory, |
| ::rtl::OUString& sContent, |
| ::rtl::OUString& sAnchor ) |
| { |
| Reference < XURLTransformer > xParser( ::comphelper::getProcessServiceFactory()->createInstance( |
| DEFINE_CONST_UNICODE("com.sun.star.util.URLTransformer" )), UNO_QUERY_THROW ); |
| |
| URL aURL; |
| aURL.Complete = sHelpURL; |
| sal_Bool bResult = xParser->parseStrict(aURL); |
| |
| sFactory = aURL.Server; |
| sContent = aURL.Path.copy(1); // strip "/"! |
| sAnchor = aURL.Mark; |
| |
| return bResult; |
| } |
| |
| ::rtl::OUString SfxHelpWindow_Impl::buildHelpURL(const ::rtl::OUString& sFactory , |
| const ::rtl::OUString& sContent , |
| const ::rtl::OUString& sAnchor , |
| sal_Bool bUseQuestionMark) |
| { |
| ::rtl::OUStringBuffer sHelpURL(256); |
| sHelpURL.append(HELP_URL); |
| sHelpURL.append(sFactory); |
| sHelpURL.append(sContent); |
| String sURL = String(sHelpURL.makeStringAndClear()); |
| AppendConfigToken_Impl(sURL, bUseQuestionMark); |
| if (sAnchor.getLength()) |
| sURL += String(sAnchor); |
| return ::rtl::OUString(sURL); |
| } |
| |
| void SfxHelpWindow_Impl::loadHelpContent(const ::rtl::OUString& sHelpURL, sal_Bool bAddToHistory) |
| { |
| Reference< XComponentLoader > xLoader(getTextFrame(), UNO_QUERY); |
| if (!xLoader.is()) |
| return; |
| |
| // --> PB 2007-03-12 #134037# |
| // If a print job runs do not open a new page |
| Reference< XFrame > xTextFrame = pTextWin->getFrame(); |
| Reference< XController > xTextController ; |
| if (xTextFrame.is()) |
| xTextController = xTextFrame->getController (); |
| if ( xTextController.is() && !xTextController->suspend( sal_True ) ) |
| { |
| xTextController->suspend( sal_False ); |
| return; |
| } |
| // <-- |
| |
| // save url to history |
| if (bAddToHistory) |
| pHelpInterceptor->addURL(sHelpURL); |
| |
| if ( !IsWait() ) |
| EnterWait(); |
| sal_Bool bSuccess = sal_False; |
| // TODO implement locale fallback ... see below while(sal_True) |
| { |
| try |
| { |
| Reference< XComponent > xContent = xLoader->loadComponentFromURL(sHelpURL, DEFINE_CONST_UNICODE("_self"), 0, Sequence< PropertyValue >()); |
| if (xContent.is()) |
| { |
| bSuccess = sal_True; |
| // break; |
| } |
| } |
| catch(const RuntimeException&) |
| { throw; } |
| catch(const Exception&) |
| { /*break;*/ } |
| |
| /* TODO try next locale ... |
| no further locale available? => break loop and show error page |
| */ |
| } |
| openDone(sHelpURL, bSuccess); |
| if ( IsWait() ) |
| LeaveWait(); |
| } |
| |
| SfxHelpIndexWindow_Impl::SfxHelpIndexWindow_Impl( SfxHelpWindow_Impl* _pParent ) : |
| |
| Window( _pParent, SfxResId( WIN_HELPINDEX ) ), |
| |
| aActiveLB ( this, SfxResId( LB_ACTIVE ) ), |
| aActiveLine ( this, SfxResId( FL_ACTIVE ) ), |
| aTabCtrl ( this, SfxResId( TC_INDEX ) ), |
| |
| aIndexKeywordLink ( LINK( this, SfxHelpIndexWindow_Impl, KeywordHdl ) ), |
| pParentWin ( _pParent ), |
| |
| pCPage ( NULL ), |
| pIPage ( NULL ), |
| pSPage ( NULL ), |
| pBPage ( NULL ), |
| |
| bWasCursorLeftOrRight( false ), |
| bIsInitDone ( false ) |
| |
| { |
| FreeResource(); |
| |
| sfx2::AddToTaskPaneList( this ); |
| |
| aTabCtrl.SetActivatePageHdl( LINK( this, SfxHelpIndexWindow_Impl, ActivatePageHdl ) ); |
| aTabCtrl.Show(); |
| |
| sal_Int32 nPageId = HELP_INDEX_PAGE_INDEX; |
| SvtViewOptions aViewOpt( E_TABDIALOG, CONFIGNAME_INDEXWIN ); |
| if ( aViewOpt.Exists() ) |
| nPageId = aViewOpt.GetPageID(); |
| aTabCtrl.SetCurPageId( (sal_uInt16)nPageId ); |
| ActivatePageHdl( &aTabCtrl ); |
| aActiveLB.SetSelectHdl( LINK( this, SfxHelpIndexWindow_Impl, SelectHdl ) ); |
| nMinWidth = ( aActiveLB.GetSizePixel().Width() / 2 ); |
| |
| aTimer.SetTimeoutHdl( LINK( this, SfxHelpIndexWindow_Impl, InitHdl ) ); |
| aTimer.SetTimeout( 200 ); |
| aTimer.Start(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| SfxHelpIndexWindow_Impl::~SfxHelpIndexWindow_Impl() |
| { |
| sfx2::RemoveFromTaskPaneList( this ); |
| |
| DELETEZ( pCPage ); |
| DELETEZ( pIPage ); |
| DELETEZ( pSPage ); |
| DELETEZ( pBPage ); |
| |
| for ( sal_uInt16 i = 0; i < aActiveLB.GetEntryCount(); ++i ) |
| delete (String*)(sal_uIntPtr)aActiveLB.GetEntryData(i); |
| |
| SvtViewOptions aViewOpt( E_TABDIALOG, CONFIGNAME_INDEXWIN ); |
| aViewOpt.SetPageID( (sal_Int32)aTabCtrl.GetCurPageId() ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpIndexWindow_Impl::Initialize() |
| { |
| String aHelpURL = HELP_URL; |
| AppendConfigToken_Impl( aHelpURL, sal_True ); |
| Sequence< ::rtl::OUString > aFactories = SfxContentHelper::GetResultSet( aHelpURL ); |
| const ::rtl::OUString* pFacs = aFactories.getConstArray(); |
| sal_uInt32 i, nCount = aFactories.getLength(); |
| for ( i = 0; i < nCount; ++i ) |
| { |
| String aRow( pFacs[i] ); |
| String aTitle, aType, aURL; |
| xub_StrLen nIdx = 0; |
| aTitle = aRow.GetToken( 0, '\t', nIdx ); |
| aType = aRow.GetToken( 0, '\t', nIdx ); |
| aURL = aRow.GetToken( 0, '\t', nIdx ); |
| String* pFactory = new String( INetURLObject( aURL ).GetHost() ); |
| sal_uInt16 nPos = aActiveLB.InsertEntry( aTitle ); |
| aActiveLB.SetEntryData( nPos, (void*)(sal_uIntPtr)pFactory ); |
| } |
| |
| aActiveLB.SetDropDownLineCount( (sal_uInt16)nCount ); |
| if ( aActiveLB.GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND ) |
| SetActiveFactory(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpIndexWindow_Impl::SetActiveFactory() |
| { |
| DBG_ASSERT( pIPage, "index page not initialized" ); |
| if ( !bIsInitDone && !aActiveLB.GetEntryCount() ) |
| { |
| aTimer.Stop(); |
| InitHdl( NULL ); |
| } |
| |
| for ( sal_uInt16 i = 0; i < aActiveLB.GetEntryCount(); ++i ) |
| { |
| String* pFactory = (String*)(sal_uIntPtr)aActiveLB.GetEntryData(i); |
| pFactory->ToLowerAscii(); |
| if ( *pFactory == pIPage->GetFactory() ) |
| { |
| if ( aActiveLB.GetSelectEntryPos() != i ) |
| { |
| aActiveLB.SelectEntryPos(i); |
| aSelectFactoryLink.Call( NULL ); |
| } |
| break; |
| } |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| HelpTabPage_Impl* SfxHelpIndexWindow_Impl::GetCurrentPage( sal_uInt16& rCurId ) |
| { |
| rCurId = aTabCtrl.GetCurPageId(); |
| HelpTabPage_Impl* pPage = NULL; |
| |
| switch ( rCurId ) |
| { |
| case HELP_INDEX_PAGE_CONTENTS: |
| { |
| pPage = GetContentPage(); |
| break; |
| } |
| |
| case HELP_INDEX_PAGE_INDEX: |
| { |
| pPage = GetIndexPage(); |
| break; |
| } |
| |
| case HELP_INDEX_PAGE_SEARCH: |
| { |
| pPage = GetSearchPage(); |
| break; |
| } |
| |
| case HELP_INDEX_PAGE_BOOKMARKS: |
| { |
| pPage = GetBookmarksPage(); |
| break; |
| } |
| } |
| |
| DBG_ASSERT( pPage, "SfxHelpIndexWindow_Impl::GetCurrentPage(): no current page" ); |
| return pPage; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( SfxHelpIndexWindow_Impl, ActivatePageHdl, TabControl *, pTabCtrl ) |
| { |
| sal_uInt16 nId = 0; |
| TabPage* pPage = GetCurrentPage( nId ); |
| pTabCtrl->SetTabPage( nId, pPage ); |
| return 0; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( SfxHelpIndexWindow_Impl, SelectHdl, ListBox *, EMPTYARG ) |
| { |
| aTimer.Start(); |
| |
| return 0; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( SfxHelpIndexWindow_Impl, InitHdl, Timer *, EMPTYARG ) |
| { |
| bIsInitDone = true; |
| Initialize(); |
| |
| // now use the timer for selection |
| aTimer.SetTimeoutHdl( LINK( this, SfxHelpIndexWindow_Impl, SelectFactoryHdl ) ); |
| aTimer.SetTimeout( 1000 ); |
| |
| return 0; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( SfxHelpIndexWindow_Impl, SelectFactoryHdl, Timer *, EMPTYARG ) |
| { |
| String* pFactory = (String*)(sal_uIntPtr)aActiveLB.GetEntryData( aActiveLB.GetSelectEntryPos() ); |
| if ( pFactory ) |
| { |
| String aFactory( *pFactory ); |
| aFactory.ToLowerAscii(); |
| SetFactory( aFactory, sal_False ); |
| aSelectFactoryLink.Call( this ); |
| } |
| |
| return 0; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( SfxHelpIndexWindow_Impl, KeywordHdl, IndexTabPage_Impl *, EMPTYARG ) |
| { |
| // keyword found on index? |
| sal_Bool bIndex = pIPage->HasKeyword(); |
| //The following two lines are added by BerryJia for fixing Bug98251, 2002-12-11 |
| if( !bIndex) |
| bIndex = pIPage->HasKeywordIgnoreCase(); |
| // then set index or search page as current. |
| sal_uInt16 nPageId = ( bIndex ) ? HELP_INDEX_PAGE_INDEX : HELP_INDEX_PAGE_SEARCH; |
| if ( nPageId != aTabCtrl.GetCurPageId() ) |
| { |
| aTabCtrl.SetCurPageId( nPageId ); |
| ActivatePageHdl( &aTabCtrl ); |
| } |
| |
| // at last we open the keyword |
| if ( bIndex ) |
| pIPage->OpenKeyword(); |
| else if ( !pSPage->OpenKeyword( sKeyword ) ) |
| pParentWin->ShowStartPage(); |
| |
| return 0; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpIndexWindow_Impl::Resize() |
| { |
| Size aSize = GetOutputSizePixel(); |
| if ( aSize.Width() < nMinWidth ) |
| aSize.Width() = nMinWidth; |
| |
| Point aPnt = aActiveLB.GetPosPixel(); |
| Size aNewSize = aActiveLB.GetSizePixel(); |
| aNewSize.Width() = aSize.Width() - ( aPnt.X() * 2 ); |
| aActiveLB.SetSizePixel( aNewSize ); |
| aPnt = aActiveLine.GetPosPixel(); |
| aNewSize = aActiveLine.GetSizePixel(); |
| aNewSize.Width() = aSize.Width() - ( aPnt.X() * 2 ); |
| aActiveLine.SetSizePixel( aNewSize ); |
| aPnt = aTabCtrl.GetPosPixel(); |
| aNewSize = aSize; |
| aSize.Width() -= aPnt.X(); |
| aSize.Height() -= aPnt.Y(); |
| aTabCtrl.SetSizePixel( aSize ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| long SfxHelpIndexWindow_Impl::PreNotify( NotifyEvent& rNEvt ) |
| { |
| long nDone = 0; |
| sal_uInt16 nType = rNEvt.GetType(); |
| if ( EVENT_KEYINPUT == nType && rNEvt.GetKeyEvent() ) |
| { |
| const KeyCode& rKeyCode = rNEvt.GetKeyEvent()->GetKeyCode(); |
| sal_uInt16 nCode = rKeyCode.GetCode(); |
| |
| if ( KEY_TAB == nCode ) |
| { |
| // don't exit index pane with <TAB> |
| sal_uInt16 nPageId = 0; |
| HelpTabPage_Impl* pCurPage = GetCurrentPage( nPageId ); |
| Control* pControl = pCurPage->GetLastFocusControl(); |
| sal_Bool bShift = rKeyCode.IsShift(); |
| sal_Bool bCtrl = rKeyCode.IsMod1(); |
| if ( !bCtrl && bShift && aActiveLB.HasChildPathFocus() ) |
| { |
| pControl->GrabFocus(); |
| nDone = 1; |
| } |
| else if ( !bCtrl && !bShift && pControl->HasChildPathFocus() ) |
| { |
| aActiveLB.GrabFocus(); |
| nDone = 1; |
| } |
| else if ( bCtrl ) |
| { |
| // <STRG><TAB> moves through the pages |
| if ( nPageId < HELP_INDEX_PAGE_LAST ) |
| nPageId++; |
| else |
| nPageId = HELP_INDEX_PAGE_FIRST; |
| aTabCtrl.SetCurPageId( (sal_uInt16)nPageId ); |
| ActivatePageHdl( &aTabCtrl ); |
| nDone = 1; |
| } |
| } |
| else if ( aTabCtrl.HasFocus() && ( KEY_LEFT == nCode || KEY_RIGHT == nCode ) ) |
| { |
| bWasCursorLeftOrRight = true; |
| } |
| } |
| |
| return nDone ? nDone : Window::PreNotify( rNEvt ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpIndexWindow_Impl::DataChanged( const DataChangedEvent& rDCEvt ) |
| { |
| Window::DataChanged( rDCEvt ); |
| |
| if ( ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) || |
| ( rDCEvt.GetType() == DATACHANGED_DISPLAY ) ) && |
| ( rDCEvt.GetFlags() & SETTINGS_STYLE ) ) |
| { |
| SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetFaceColor() ) ); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpIndexWindow_Impl::SetDoubleClickHdl( const Link& rLink ) |
| { |
| aPageDoubleClickLink = rLink; |
| if ( pCPage ) |
| pCPage->SetOpenHdl( aPageDoubleClickLink ); |
| if ( pIPage ) |
| pIPage->SetDoubleClickHdl( aPageDoubleClickLink ); |
| if ( pSPage ) |
| pSPage->SetDoubleClickHdl( aPageDoubleClickLink ); |
| if ( pBPage ) |
| pBPage->SetDoubleClickHdl( aPageDoubleClickLink ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpIndexWindow_Impl::SetFactory( const String& rFactory, sal_Bool bActive ) |
| { |
| if ( rFactory.Len() > 0 ) |
| { |
| GetIndexPage()->SetFactory( rFactory ); |
| // the index page did a check if rFactory is valid, |
| // so the index page always returns a valid factory |
| GetSearchPage()->SetFactory( GetIndexPage()->GetFactory() ); |
| if ( bActive ) |
| SetActiveFactory(); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| String SfxHelpIndexWindow_Impl::GetSelectEntry() const |
| { |
| String sRet; |
| |
| switch ( aTabCtrl.GetCurPageId() ) |
| { |
| case HELP_INDEX_PAGE_CONTENTS: |
| sRet = pCPage->GetSelectEntry(); |
| break; |
| |
| case HELP_INDEX_PAGE_INDEX: |
| sRet = pIPage->GetSelectEntry(); |
| break; |
| |
| case HELP_INDEX_PAGE_SEARCH: |
| sRet = pSPage->GetSelectEntry(); |
| break; |
| |
| case HELP_INDEX_PAGE_BOOKMARKS: |
| sRet = pBPage->GetSelectEntry(); |
| break; |
| } |
| |
| return sRet; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpIndexWindow_Impl::AddBookmarks( const String& rTitle, const String& rURL ) |
| { |
| GetBookmarksPage()->AddBookmarks( rTitle, rURL ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| bool SfxHelpIndexWindow_Impl::IsValidFactory( const String& _rFactory ) |
| { |
| bool bValid = false; |
| for ( sal_uInt16 i = 0; i < aActiveLB.GetEntryCount(); ++i ) |
| { |
| String* pFactory = (String*)(sal_uIntPtr)aActiveLB.GetEntryData(i); |
| if ( *pFactory == _rFactory ) |
| { |
| bValid = true; |
| break; |
| } |
| } |
| return bValid; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpIndexWindow_Impl::ClearSearchPage() |
| { |
| if ( pSPage ) |
| pSPage->ClearPage(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpIndexWindow_Impl::GrabFocusBack() |
| { |
| if ( aTabCtrl.GetCurPageId() == HELP_INDEX_PAGE_CONTENTS && pCPage ) |
| pCPage->SetFocusOnBox(); |
| else if ( aTabCtrl.GetCurPageId() == HELP_INDEX_PAGE_INDEX && pIPage ) |
| pIPage->SetFocusOnBox(); |
| else if ( aTabCtrl.GetCurPageId() == HELP_INDEX_PAGE_SEARCH && pSPage ) |
| pSPage->SetFocusOnBox(); |
| else if ( aTabCtrl.GetCurPageId() == HELP_INDEX_PAGE_BOOKMARKS && pBPage ) |
| pBPage->SetFocusOnBox(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| sal_Bool SfxHelpIndexWindow_Impl::HasFocusOnEdit() const |
| { |
| sal_Bool bRet = sal_False; |
| if ( aTabCtrl.GetCurPageId() == HELP_INDEX_PAGE_INDEX && pIPage ) |
| bRet = pIPage->HasFocusOnEdit(); |
| else if ( aTabCtrl.GetCurPageId() == HELP_INDEX_PAGE_SEARCH && pSPage ) |
| bRet = pSPage->HasFocusOnEdit(); |
| return bRet; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| String SfxHelpIndexWindow_Impl::GetSearchText() const |
| { |
| String sRet; |
| if ( aTabCtrl.GetCurPageId() == HELP_INDEX_PAGE_SEARCH && pSPage ) |
| sRet = pSPage->GetSearchText(); |
| return sRet; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| sal_Bool SfxHelpIndexWindow_Impl::IsFullWordSearch() const |
| { |
| sal_Bool bRet = sal_False; |
| if ( aTabCtrl.GetCurPageId() == HELP_INDEX_PAGE_SEARCH && pSPage ) |
| bRet = pSPage->IsFullWordSearch(); |
| return bRet; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpIndexWindow_Impl::OpenKeyword( const String& rKeyword ) |
| { |
| sKeyword = rKeyword; |
| DBG_ASSERT( pIPage, "invalid index page" ); |
| pIPage->SetKeyword( sKeyword ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpIndexWindow_Impl::SelectExecutableEntry() |
| { |
| if ( aTabCtrl.GetCurPageId() == HELP_INDEX_PAGE_INDEX && pIPage ) |
| pIPage->SelectExecutableEntry(); |
| } |
| |
| // class TextWin_Impl ---------------------------------------------------- |
| |
| TextWin_Impl::TextWin_Impl( Window* p ) : DockingWindow( p, 0 ) |
| { |
| } |
| |
| TextWin_Impl::~TextWin_Impl() |
| { |
| } |
| |
| long TextWin_Impl::Notify( NotifyEvent& rNEvt ) |
| { |
| if( ( rNEvt.GetType() == EVENT_KEYINPUT ) && rNEvt.GetKeyEvent()->GetKeyCode().GetCode() == KEY_TAB ) |
| return GetParent()->Notify( rNEvt ); |
| else |
| return DockingWindow::Notify( rNEvt ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| // remove docking area acceptor from layoutmanager, so it will not layout anything further .-) |
| void lcl_disableLayoutOfFrame(const Reference< XFrame >& xFrame) |
| { |
| static const ::rtl::OUString PROP_LAYOUT_MANAGER(DEFINE_CONST_UNICODE("LayoutManager")); |
| |
| Reference< XPropertySet > xPropSet(xFrame, UNO_QUERY_THROW); |
| xPropSet->setPropertyValue(PROP_LAYOUT_MANAGER, makeAny(Reference< XLayoutManager >())); |
| } |
| |
| // class SfxHelpTextWindow_Impl ------------------------------------------ |
| |
| SfxHelpTextWindow_Impl::SfxHelpTextWindow_Impl( SfxHelpWindow_Impl* pParent ) : |
| |
| Window( pParent, WB_CLIPCHILDREN | WB_TABSTOP | WB_DIALOGCONTROL ), |
| |
| aToolBox ( this, 0 ), |
| aOnStartupCB ( this, SfxResId( RID_HELP_ONSTARTUP_BOX ) ), |
| aIndexOnImage ( SfxResId( IMG_HELP_TOOLBOX_INDEX_ON ) ), |
| aIndexOffImage ( SfxResId( IMG_HELP_TOOLBOX_INDEX_OFF ) ), |
| aIndexOnText ( SfxResId( STR_HELP_BUTTON_INDEX_ON ) ), |
| aIndexOffText ( SfxResId( STR_HELP_BUTTON_INDEX_OFF ) ), |
| aOnStartupText ( SfxResId( RID_HELP_ONSTARTUP_TEXT ) ), |
| pHelpWin ( pParent ), |
| pTextWin ( new TextWin_Impl( this ) ), |
| pSrchDlg ( NULL ), |
| nMinPos ( 0 ), |
| bIsDebug ( sal_False ), |
| bIsIndexOn ( sal_False ), |
| bIsInClose ( sal_False ), |
| bIsFullWordSearch ( sal_False ) |
| |
| { |
| sfx2::AddToTaskPaneList( &aToolBox ); |
| |
| xFrame = Reference < XFrame > ( ::comphelper::getProcessServiceFactory()->createInstance( |
| DEFINE_CONST_UNICODE("com.sun.star.frame.Frame") ), UNO_QUERY ); |
| xFrame->initialize( VCLUnoHelper::GetInterface ( pTextWin ) ); |
| xFrame->setName( DEFINE_CONST_UNICODE("OFFICE_HELP") ); |
| lcl_disableLayoutOfFrame(xFrame); |
| |
| aToolBox.SetHelpId( HID_HELP_TOOLBOX ); |
| |
| aToolBox.InsertItem( TBI_INDEX, aIndexOffText ); |
| aToolBox.SetHelpId( TBI_INDEX, HID_HELP_TOOLBOXITEM_INDEX ); |
| aToolBox.InsertSeparator(); |
| aToolBox.InsertItem( TBI_BACKWARD, String( SfxResId( STR_HELP_BUTTON_PREV ) ) ); |
| aToolBox.SetHelpId( TBI_BACKWARD, HID_HELP_TOOLBOXITEM_BACKWARD ); |
| aToolBox.InsertItem( TBI_FORWARD, String( SfxResId( STR_HELP_BUTTON_NEXT ) ) ); |
| aToolBox.SetHelpId( TBI_FORWARD, HID_HELP_TOOLBOXITEM_FORWARD ); |
| aToolBox.InsertItem( TBI_START, String( SfxResId( STR_HELP_BUTTON_START ) ) ); |
| aToolBox.SetHelpId( TBI_START, HID_HELP_TOOLBOXITEM_START ); |
| aToolBox.InsertSeparator(); |
| aToolBox.InsertItem( TBI_PRINT, String( SfxResId( STR_HELP_BUTTON_PRINT ) ) ); |
| aToolBox.SetHelpId( TBI_PRINT, HID_HELP_TOOLBOXITEM_PRINT ); |
| aToolBox.InsertItem( TBI_BOOKMARKS, String( SfxResId( STR_HELP_BUTTON_ADDBOOKMARK ) ) ); |
| aToolBox.SetHelpId( TBI_BOOKMARKS, HID_HELP_TOOLBOXITEM_BOOKMARKS ); |
| aToolBox.InsertItem( TBI_SEARCHDIALOG, String( SfxResId( STR_HELP_BUTTON_SEARCHDIALOG ) ) ); |
| aToolBox.SetHelpId( TBI_SEARCHDIALOG, HID_HELP_TOOLBOXITEM_SEARCHDIALOG ); |
| |
| InitToolBoxImages(); |
| aToolBox.Show(); |
| InitOnStartupBox( false ); |
| aOnStartupCB.SetClickHdl( LINK( this, SfxHelpTextWindow_Impl, CheckHdl ) ); |
| |
| aSelectTimer.SetTimeoutHdl( LINK( this, SfxHelpTextWindow_Impl, SelectHdl ) ); |
| aSelectTimer.SetTimeout( 1000 ); |
| |
| char* pEnv = getenv( "help_debug" ); |
| if ( pEnv ) |
| bIsDebug = sal_True; |
| |
| SvtMiscOptions().AddListenerLink( LINK( this, SfxHelpTextWindow_Impl, NotifyHdl ) ); |
| |
| if ( !aOnStartupCB.GetHelpId().getLength() ) |
| aOnStartupCB.SetHelpId( HID_HELP_ONSTARTUP_BOX ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| SfxHelpTextWindow_Impl::~SfxHelpTextWindow_Impl() |
| { |
| sfx2::RemoveFromTaskPaneList( &aToolBox ); |
| |
| bIsInClose = sal_True; |
| SvtMiscOptions().RemoveListenerLink( LINK( this, SfxHelpTextWindow_Impl, NotifyHdl ) ); |
| delete pSrchDlg; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| sal_Bool SfxHelpTextWindow_Impl::HasSelection() const |
| { |
| // is there any selection in the text and not only a cursor? |
| sal_Bool bRet = sal_False; |
| Reference < XTextRange > xRange = getCursor(); |
| if ( xRange.is() ) |
| { |
| Reference < XText > xText = xRange->getText(); |
| Reference < XTextCursor > xCursor = xText->createTextCursorByRange( xRange ); |
| bRet = !xCursor->isCollapsed(); |
| } |
| |
| return bRet; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpTextWindow_Impl::InitToolBoxImages() |
| { |
| sal_Bool bLarge = SvtMiscOptions().AreCurrentSymbolsLarge(); |
| sal_Bool bHiContrast = GetSettings().GetStyleSettings().GetHighContrastMode(); |
| |
| aIndexOnImage = Image( SfxResId( |
| bLarge ? bHiContrast ? IMG_HELP_TOOLBOX_HCL_INDEX_ON : IMG_HELP_TOOLBOX_L_INDEX_ON |
| : bHiContrast ? IMG_HELP_TOOLBOX_HC_INDEX_ON : IMG_HELP_TOOLBOX_INDEX_ON ) ); |
| aIndexOffImage = Image( SfxResId( |
| bLarge ? bHiContrast ? IMG_HELP_TOOLBOX_HCL_INDEX_OFF : IMG_HELP_TOOLBOX_L_INDEX_OFF |
| : bHiContrast ? IMG_HELP_TOOLBOX_HC_INDEX_OFF : IMG_HELP_TOOLBOX_INDEX_OFF ) ); |
| aToolBox.SetItemImage( TBI_INDEX, bIsIndexOn ? aIndexOffImage : aIndexOnImage ); |
| |
| aToolBox.SetItemImage( TBI_BACKWARD, Image( SfxResId( |
| bLarge ? bHiContrast ? IMG_HELP_TOOLBOX_HCL_PREV : IMG_HELP_TOOLBOX_L_PREV |
| : bHiContrast ? IMG_HELP_TOOLBOX_HC_PREV : IMG_HELP_TOOLBOX_PREV ) ) ); |
| aToolBox.SetItemImage( TBI_FORWARD, Image( SfxResId( |
| bLarge ? bHiContrast ? IMG_HELP_TOOLBOX_HCL_NEXT : IMG_HELP_TOOLBOX_L_NEXT |
| : bHiContrast ? IMG_HELP_TOOLBOX_HC_NEXT : IMG_HELP_TOOLBOX_NEXT ) ) ); |
| aToolBox.SetItemImage( TBI_START, Image( SfxResId( |
| bLarge ? bHiContrast ? IMG_HELP_TOOLBOX_HCL_START : IMG_HELP_TOOLBOX_L_START |
| : bHiContrast ? IMG_HELP_TOOLBOX_HC_START : IMG_HELP_TOOLBOX_START ) ) ); |
| aToolBox.SetItemImage( TBI_PRINT, Image( SfxResId( |
| bLarge ? bHiContrast ? IMG_HELP_TOOLBOX_HCL_PRINT : IMG_HELP_TOOLBOX_L_PRINT |
| : bHiContrast ? IMG_HELP_TOOLBOX_HC_PRINT : IMG_HELP_TOOLBOX_PRINT ) ) ); |
| aToolBox.SetItemImage( TBI_BOOKMARKS, Image( SfxResId( |
| bLarge ? bHiContrast ? IMG_HELP_TOOLBOX_HCL_BOOKMARKS : IMG_HELP_TOOLBOX_L_BOOKMARKS |
| : bHiContrast ? IMG_HELP_TOOLBOX_HC_BOOKMARKS : IMG_HELP_TOOLBOX_BOOKMARKS ) ) ); |
| aToolBox.SetItemImage( TBI_SEARCHDIALOG, Image( SfxResId( |
| bLarge ? bHiContrast ? IMG_HELP_TOOLBOX_HCL_SEARCHDIALOG : IMG_HELP_TOOLBOX_L_SEARCHDIALOG |
| : bHiContrast ? IMG_HELP_TOOLBOX_HC_SEARCHDIALOG : IMG_HELP_TOOLBOX_SEARCHDIALOG ) ) ); |
| |
| Size aSize = aToolBox.CalcWindowSizePixel(); |
| aSize.Height() += TOOLBOX_OFFSET; |
| aToolBox.SetPosSizePixel( Point( 0, TOOLBOX_OFFSET ), aSize ); |
| |
| SvtMiscOptions aMiscOptions; |
| if ( aMiscOptions.GetToolboxStyle() != aToolBox.GetOutStyle() ) |
| aToolBox.SetOutStyle( aMiscOptions.GetToolboxStyle() ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpTextWindow_Impl::InitOnStartupBox( bool bOnlyText ) |
| { |
| sCurrentFactory = SfxHelp::GetCurrentModuleIdentifier(); |
| |
| Reference< XMultiServiceFactory > xMultiServiceFac = ::comphelper::getProcessServiceFactory(); |
| Reference< XInterface > xConfig; |
| ::rtl::OUString sPath( PATH_OFFICE_FACTORIES ); |
| sPath += sCurrentFactory; |
| ::rtl::OUString sKey( KEY_HELP_ON_OPEN ); |
| |
| // Attention: This check boy knows two states: |
| // 1) Reading of the config key fails with an exception or by getting an empty Any (!) => check box must be hidden |
| // 2) We read sal_True/sal_False => check box must be shown and enabled/disabled |
| |
| bool bHideBox = true; |
| sal_Bool bHelpAtStartup = sal_False; |
| try |
| { |
| xConfiguration = ConfigurationHelper::openConfig( |
| xMultiServiceFac, PACKAGE_SETUP, ConfigurationHelper::E_STANDARD ); |
| if ( xConfiguration.is() ) |
| { |
| Any aAny = ConfigurationHelper::readRelativeKey( xConfiguration, sPath, sKey ); |
| if (aAny >>= bHelpAtStartup) |
| bHideBox = false; |
| } |
| } |
| catch( Exception& ) |
| { |
| bHideBox = true; |
| } |
| |
| if ( bHideBox ) |
| aOnStartupCB.Hide(); |
| else |
| { |
| // detect module name |
| String sModuleName; |
| |
| if ( xConfiguration.is() ) |
| { |
| ::rtl::OUString sTemp; |
| sKey = KEY_UI_NAME; |
| try |
| { |
| Any aAny = ConfigurationHelper::readRelativeKey( xConfiguration, sPath, sKey ); |
| aAny >>= sTemp; |
| } |
| catch( Exception& ) |
| { |
| DBG_ERRORFILE( "SfxHelpTextWindow_Impl::InitOnStartupBox(): unexpected exception" ); |
| } |
| sModuleName = String( sTemp ); |
| } |
| |
| if ( sModuleName.Len() > 0 ) |
| { |
| // set module name in checkbox text |
| String sText( aOnStartupText ); |
| sText.SearchAndReplace( String::CreateFromAscii( "%MODULENAME" ), sModuleName ); |
| aOnStartupCB.SetText( sText ); |
| // and show it |
| aOnStartupCB.Show(); |
| // set check state |
| aOnStartupCB.Check( bHelpAtStartup ); |
| aOnStartupCB.SaveValue(); |
| |
| // calculate and set optimal width of the onstartup checkbox |
| String sCBText( DEFINE_CONST_UNICODE( "XXX" ) ); |
| sCBText += aOnStartupCB.GetText(); |
| long nTextWidth = aOnStartupCB.GetTextWidth( sCBText ); |
| Size aSize = aOnStartupCB.GetSizePixel(); |
| aSize.Width() = nTextWidth; |
| aOnStartupCB.SetSizePixel( aSize ); |
| SetOnStartupBoxPosition(); |
| } |
| |
| if ( !bOnlyText ) |
| { |
| // set position of the checkbox |
| Size a3Size = LogicToPixel( Size( 3, 3 ), MAP_APPFONT ); |
| Size aTBSize = aToolBox.GetSizePixel(); |
| Size aCBSize = aOnStartupCB.GetSizePixel(); |
| Point aPnt = aToolBox.GetPosPixel(); |
| aPnt.X() += aTBSize.Width() + a3Size.Width(); |
| aPnt.Y() += ( ( aTBSize.Height() - aCBSize.Height() ) / 2 ); |
| aOnStartupCB.SetPosPixel( aPnt ); |
| nMinPos = aPnt.X(); |
| } |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpTextWindow_Impl::SetOnStartupBoxPosition() |
| { |
| long nX = Max( GetOutputSizePixel().Width() - aOnStartupCB.GetSizePixel().Width(), nMinPos ); |
| Point aPos = aOnStartupCB.GetPosPixel(); |
| aPos.X() = nX; |
| aOnStartupCB.SetPosPixel( aPos ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| Reference< XBreakIterator > SfxHelpTextWindow_Impl::GetBreakIterator() |
| { |
| if ( !xBreakIterator.is() ) |
| xBreakIterator = vcl::unohelper::CreateBreakIterator(); |
| DBG_ASSERT( xBreakIterator.is(), "Could not create BreakIterator" ); |
| return xBreakIterator; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| Reference< XTextRange > SfxHelpTextWindow_Impl::getCursor() const |
| { |
| // return the current cursor |
| Reference< XTextRange > xCursor; |
| |
| try |
| { |
| Reference < XSelectionSupplier > xSelSup( xFrame->getController(), UNO_QUERY ); |
| if ( xSelSup.is() ) |
| { |
| Any aAny = xSelSup->getSelection(); |
| Reference < XIndexAccess > xSelection; |
| if ( aAny >>= xSelection ) |
| { |
| if ( xSelection->getCount() == 1 ) |
| { |
| aAny = xSelection->getByIndex(0); |
| aAny >>= xCursor; |
| } |
| } |
| } |
| } |
| catch( Exception& ) |
| { |
| DBG_ERROR( "SfxHelpTextWindow_Impl::getCursor(): unexpected exception" ); |
| } |
| |
| return xCursor; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| bool SfxHelpTextWindow_Impl::isHandledKey( const KeyCode& _rKeyCode ) |
| { |
| bool bRet = false; |
| sal_uInt16 nCode = _rKeyCode.GetCode(); |
| |
| // the keys <STRG><A> (select all), <STRG><C> (copy), |
| // <STRG><F> (find), <STRG><P> (print) and <STRG><W> (close window) |
| // were handled in help |
| if ( _rKeyCode.IsMod1() && |
| ( KEY_A == nCode || KEY_C == nCode || KEY_F == nCode || KEY_P == nCode || KEY_W == nCode ) ) |
| { |
| if ( KEY_F == nCode ) |
| DoSearch(); |
| else |
| bRet = true; |
| } |
| |
| return bRet; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( SfxHelpTextWindow_Impl, SelectHdl, Timer*, EMPTYARG ) |
| { |
| try |
| { |
| // select the words, which are equal to the search text of the search page |
| Reference < XController > xController = xFrame->getController(); |
| if ( xController.is() ) |
| { |
| // get document |
| Reference < XSearchable > xSearchable( xController->getModel(), UNO_QUERY ); |
| if ( xSearchable.is() ) |
| { |
| // create descriptor, set string and find all words |
| Reference < XSearchDescriptor > xSrchDesc = xSearchable->createSearchDescriptor(); |
| Reference < XPropertySet > xPropSet( xSrchDesc, UNO_QUERY ); |
| xPropSet->setPropertyValue( DEFINE_CONST_OUSTRING("SearchRegularExpression"), |
| makeAny( sal_Bool( sal_True ) ) ); |
| if ( bIsFullWordSearch ) |
| xPropSet->setPropertyValue( DEFINE_CONST_OUSTRING("SearchWords"), |
| makeAny( sal_Bool( sal_True ) ) ); |
| |
| String sSearchString = sfx2::PrepareSearchString( aSearchText, GetBreakIterator(), false ); |
| xSrchDesc->setSearchString( sSearchString ); |
| Reference< XIndexAccess > xSelection = xSearchable->findAll( xSrchDesc ); |
| |
| // then select all found words |
| Reference < XSelectionSupplier > xSelectionSup( xController, UNO_QUERY ); |
| if ( xSelectionSup.is() ) |
| { |
| Any aAny; |
| aAny <<= xSelection; |
| xSelectionSup->select( aAny ); |
| } |
| } |
| } |
| } |
| catch( Exception& ) |
| { |
| DBG_ERROR( "SfxHelpTextWindow_Impl::SelectHdl(): unexpected exception" ); |
| } |
| |
| return 1; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( SfxHelpTextWindow_Impl, NotifyHdl, SvtMiscOptions*, pOptions ) |
| { |
| (void)pOptions; // unused variable |
| InitToolBoxImages(); |
| Resize(); |
| aToolBox.Invalidate(); |
| return 0; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( SfxHelpTextWindow_Impl, FindHdl, sfx2::SearchDialog*, pDlg ) |
| { |
| bool bWrapAround = ( NULL == pDlg ); |
| if ( bWrapAround ) |
| pDlg = pSrchDlg; |
| DBG_ASSERT( pDlg, "invalid search dialog" ); |
| String sSearchText = pDlg->GetSearchText(); |
| try |
| { |
| // select the words, which are equal to the search text of the search page |
| Reference < XController > xController = xFrame->getController(); |
| if ( xController.is() ) |
| { |
| // get document |
| Reference < XSearchable > xSearchable( xController->getModel(), UNO_QUERY ); |
| if ( xSearchable.is() ) |
| { |
| // create descriptor, set string and find all words |
| Reference < XSearchDescriptor > xSrchDesc = xSearchable->createSearchDescriptor(); |
| Reference < XPropertySet > xPropSet( xSrchDesc, UNO_QUERY ); |
| xPropSet->setPropertyValue( DEFINE_CONST_OUSTRING("SearchWords"), makeAny( sal_Bool( pDlg->IsOnlyWholeWords() != false ) ) ); |
| xPropSet->setPropertyValue( DEFINE_CONST_OUSTRING("SearchCaseSensitive"), makeAny( sal_Bool( pDlg->IsMarchCase() != false ) ) ); |
| xPropSet->setPropertyValue( DEFINE_CONST_OUSTRING("SearchBackwards"), makeAny( sal_Bool( pDlg->IsSearchBackwards() != false ) ) ); |
| xSrchDesc->setSearchString( sSearchText ); |
| Reference< XInterface > xSelection; |
| Reference< XTextRange > xCursor = getCursor(); |
| |
| if ( xCursor.is() ) |
| { |
| if ( pDlg->IsSearchBackwards() ) |
| xCursor = xCursor->getStart(); |
| xSelection = xSearchable->findNext( xCursor, xSrchDesc ); |
| } |
| else |
| xSelection = xSearchable->findFirst( xSrchDesc ); |
| |
| // then select the found word |
| if ( xSelection.is() ) |
| { |
| Reference < XSelectionSupplier > xSelectionSup( xController, UNO_QUERY ); |
| if ( xSelectionSup.is() ) |
| { |
| Any aAny; |
| aAny <<= xSelection; |
| xSelectionSup->select( aAny ); |
| } |
| } |
| else if ( pDlg->IsWrapAround() && !bWrapAround ) |
| { |
| Reference < text::XTextViewCursorSupplier > xCrsrSupp( xController, uno::UNO_QUERY ); |
| Reference < text::XTextViewCursor > xTVCrsr( xCrsrSupp->getViewCursor(), uno::UNO_QUERY ); |
| if ( xTVCrsr.is() ) |
| { |
| Reference < text::XTextDocument > xDoc( xController->getModel(), uno::UNO_QUERY ); |
| Reference < text::XText > xText = xDoc->getText(); |
| if ( xText.is() ) |
| { |
| if ( pDlg->IsSearchBackwards() ) |
| xTVCrsr->gotoRange( xText->getEnd(), sal_False ); |
| else |
| xTVCrsr->gotoRange( xText->getStart(), sal_False ); |
| FindHdl( NULL ); |
| } |
| } |
| } |
| else |
| { |
| DBG_ASSERT( pSrchDlg, "no search dialog" ); |
| InfoBox aBox( pSrchDlg, SfxResId( RID_INFO_NOSEARCHTEXTFOUND ) ); |
| aBox.Execute(); |
| pSrchDlg->SetFocusOnEdit(); |
| } |
| } |
| } |
| } |
| catch( Exception& ) |
| { |
| DBG_ERROR( "SfxHelpTextWindow_Impl::SelectHdl(): unexpected exception" ); |
| } |
| |
| return 0; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( SfxHelpTextWindow_Impl, CloseHdl, sfx2::SearchDialog*, pDlg ) |
| { |
| if ( pDlg ) |
| delete pSrchDlg; |
| pSrchDlg = NULL; |
| return 0; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( SfxHelpTextWindow_Impl, CheckHdl, CheckBox*, pBox ) |
| { |
| if ( xConfiguration.is() ) |
| { |
| sal_Bool bChecked = pBox->IsChecked(); |
| ::rtl::OUString sPath( PATH_OFFICE_FACTORIES ); |
| sPath += sCurrentFactory; |
| try |
| { |
| ConfigurationHelper::writeRelativeKey( |
| xConfiguration, sPath, KEY_HELP_ON_OPEN, makeAny( bChecked ) ); |
| ConfigurationHelper::flush( xConfiguration ); |
| } |
| catch( Exception& ) |
| { |
| DBG_ERRORFILE( "SfxHelpTextWindow_Impl::CheckHdl(): unexpected exception" ); |
| } |
| } |
| |
| return 0; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpTextWindow_Impl::Resize() |
| { |
| Size aSize = GetOutputSizePixel(); |
| long nToolBoxHeight = aToolBox.GetSizePixel().Height() + TOOLBOX_OFFSET; |
| aSize.Height() -= nToolBoxHeight; |
| pTextWin->SetPosSizePixel( Point( 0, nToolBoxHeight ), aSize ); |
| SetOnStartupBoxPosition(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| long SfxHelpTextWindow_Impl::PreNotify( NotifyEvent& rNEvt ) |
| { |
| long nDone = 0; |
| sal_uInt16 nType = rNEvt.GetType(); |
| if ( EVENT_COMMAND == nType && rNEvt.GetCommandEvent() ) |
| { |
| const CommandEvent* pCmdEvt = rNEvt.GetCommandEvent(); |
| Window* pCmdWin = rNEvt.GetWindow(); |
| |
| if ( pCmdEvt->GetCommand() == COMMAND_CONTEXTMENU && pCmdWin != this && pCmdWin != &aToolBox ) |
| { |
| sal_Bool bHiContrast = GetSettings().GetStyleSettings().GetHighContrastMode(); |
| Point aPos; |
| if ( pCmdEvt->IsMouseEvent() ) |
| aPos = pCmdEvt->GetMousePosPixel(); |
| else |
| aPos = Point( pTextWin->GetPosPixel().X() + 20, 20 ); |
| aPos.Y() += pTextWin->GetPosPixel().Y(); |
| PopupMenu aMenu; |
| if ( bIsIndexOn ) |
| aMenu.InsertItem( TBI_INDEX, aIndexOffText, Image( SfxResId( |
| bHiContrast ? IMG_HELP_TOOLBOX_HC_INDEX_OFF : IMG_HELP_TOOLBOX_INDEX_OFF ) ) ); |
| else |
| aMenu.InsertItem( TBI_INDEX, aIndexOnText, Image( SfxResId( |
| bHiContrast ? IMG_HELP_TOOLBOX_HC_INDEX_ON : IMG_HELP_TOOLBOX_INDEX_ON ) ) ); |
| aMenu.SetHelpId( TBI_INDEX, HID_HELP_TOOLBOXITEM_INDEX ); |
| aMenu.InsertSeparator(); |
| aMenu.InsertItem( TBI_BACKWARD, String( SfxResId( STR_HELP_BUTTON_PREV ) ), |
| Image( SfxResId( bHiContrast ? IMG_HELP_TOOLBOX_HC_PREV : IMG_HELP_TOOLBOX_PREV ) ) ); |
| aMenu.SetHelpId( TBI_BACKWARD, HID_HELP_TOOLBOXITEM_BACKWARD ); |
| aMenu.EnableItem( TBI_BACKWARD, pHelpWin->HasHistoryPredecessor() ); |
| aMenu.InsertItem( TBI_FORWARD, String( SfxResId( STR_HELP_BUTTON_NEXT ) ), |
| Image( SfxResId( bHiContrast ? IMG_HELP_TOOLBOX_HC_NEXT : IMG_HELP_TOOLBOX_NEXT ) ) ); |
| aMenu.SetHelpId( TBI_FORWARD, HID_HELP_TOOLBOXITEM_FORWARD ); |
| aMenu.EnableItem( TBI_FORWARD, pHelpWin->HasHistorySuccessor() ); |
| aMenu.InsertItem( TBI_START, String( SfxResId( STR_HELP_BUTTON_START ) ), |
| Image( SfxResId( bHiContrast ? IMG_HELP_TOOLBOX_HC_START : IMG_HELP_TOOLBOX_START ) ) ); |
| aMenu.SetHelpId( TBI_START, HID_HELP_TOOLBOXITEM_START ); |
| aMenu.InsertSeparator(); |
| aMenu.InsertItem( TBI_PRINT, String( SfxResId( STR_HELP_BUTTON_PRINT ) ), |
| Image( SfxResId( bHiContrast ? IMG_HELP_TOOLBOX_HC_PRINT : IMG_HELP_TOOLBOX_PRINT ) ) ); |
| aMenu.SetHelpId( TBI_PRINT, HID_HELP_TOOLBOXITEM_PRINT ); |
| aMenu.InsertItem( TBI_BOOKMARKS, String( SfxResId( STR_HELP_BUTTON_ADDBOOKMARK ) ), |
| Image( SfxResId( bHiContrast ? IMG_HELP_TOOLBOX_HC_BOOKMARKS : IMG_HELP_TOOLBOX_BOOKMARKS ) ) ); |
| aMenu.SetHelpId( TBI_BOOKMARKS, HID_HELP_TOOLBOXITEM_BOOKMARKS ); |
| aMenu.InsertItem( TBI_SEARCHDIALOG, String( SfxResId( STR_HELP_BUTTON_SEARCHDIALOG ) ), |
| Image( SfxResId( bHiContrast ? IMG_HELP_TOOLBOX_HC_SEARCHDIALOG : IMG_HELP_TOOLBOX_SEARCHDIALOG ) ) ); |
| aMenu.SetHelpId( TBI_SEARCHDIALOG, HID_HELP_TOOLBOXITEM_SEARCHDIALOG ); |
| aMenu.InsertSeparator(); |
| aMenu.InsertItem( TBI_SELECTIONMODE, String( SfxResId( STR_HELP_MENU_TEXT_SELECTION_MODE ) ) ); |
| aMenu.SetHelpId( TBI_SELECTIONMODE, HID_HELP_TEXT_SELECTION_MODE ); |
| Reference < XDispatchProvider > xProv( xFrame, UNO_QUERY ); |
| URL aURL; |
| aURL.Complete = DEFINE_CONST_UNICODE(".uno:SelectTextMode"); |
| PARSE_URL( aURL ); |
| Reference < XDispatch > xDisp = xProv.is() ? |
| xProv->queryDispatch( aURL, rtl::OUString(), 0 ) : Reference < XDispatch >(); |
| if(xDisp.is()) |
| { |
| HelpStatusListener_Impl* pStateListener; |
| Reference<XStatusListener>xStateListener = pStateListener = |
| new HelpStatusListener_Impl(xDisp, aURL ); |
| FeatureStateEvent rEvent = pStateListener->GetStateEvent(); |
| sal_Bool bCheck = sal_False; |
| rEvent.State >>= bCheck; |
| aMenu.CheckItem(TBI_SELECTIONMODE, bCheck); |
| } |
| aMenu.InsertSeparator(); |
| aMenu.InsertItem( TBI_COPY, String( SfxResId( STR_HELP_MENU_TEXT_COPY ) ), |
| Image( SfxResId( bHiContrast ? IMG_HELP_TOOLBOX_HC_COPY : IMG_HELP_TOOLBOX_COPY ) ) ); |
| aMenu.SetHelpId( TBI_COPY, ".uno:Copy" ); |
| aMenu.EnableItem( TBI_COPY, HasSelection() ); |
| |
| if ( bIsDebug ) |
| { |
| aMenu.InsertSeparator(); |
| aMenu.InsertItem( TBI_SOURCEVIEW, String( SfxResId( STR_HELP_BUTTON_SOURCEVIEW ) ) ); |
| } |
| |
| if( SvtMenuOptions().IsEntryHidingEnabled() == sal_False ) |
| aMenu.SetMenuFlags( aMenu.GetMenuFlags() | MENU_FLAG_HIDEDISABLEDENTRIES ); |
| |
| sal_uInt16 nId = aMenu.Execute( this, aPos ); |
| pHelpWin->DoAction( nId ); |
| nDone = 1; |
| } |
| } |
| else if ( EVENT_KEYINPUT == nType && rNEvt.GetKeyEvent() ) |
| { |
| const KeyEvent* pKEvt = rNEvt.GetKeyEvent(); |
| const KeyCode& rKeyCode = pKEvt->GetKeyCode(); |
| sal_uInt16 nKeyGroup = rKeyCode.GetGroup(); |
| sal_uInt16 nKey = rKeyCode.GetCode(); |
| if ( KEYGROUP_ALPHA == nKeyGroup && !isHandledKey( rKeyCode ) ) |
| { |
| // do nothing disables the writer accelerators |
| nDone = 1; |
| } |
| else if ( rKeyCode.IsMod1() && ( KEY_F4 == nKey || KEY_W == nKey ) ) |
| { |
| // <STRG><F4> or <STRG><W> -> close top frame |
| pHelpWin->CloseWindow(); |
| nDone = 1; |
| } |
| else if ( KEY_TAB == nKey && aOnStartupCB.HasChildPathFocus() ) |
| { |
| aToolBox.GrabFocus(); |
| nDone = 1; |
| } |
| } |
| |
| return nDone ? nDone : Window::PreNotify( rNEvt ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpTextWindow_Impl::GetFocus() |
| { |
| if ( !bIsInClose ) |
| { |
| try |
| { |
| if( xFrame.is() ) |
| { |
| Reference< ::com::sun::star::awt::XWindow > xWindow = xFrame->getComponentWindow(); |
| if( xWindow.is() ) |
| xWindow->setFocus(); |
| } |
| } |
| catch( Exception& ) |
| { |
| DBG_ERRORFILE( "SfxHelpTextWindow_Impl::GetFocus(): unexpected exception" ); |
| } |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpTextWindow_Impl::DataChanged( const DataChangedEvent& rDCEvt ) |
| { |
| Window::DataChanged( rDCEvt ); |
| |
| if ( ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) || |
| ( rDCEvt.GetType() == DATACHANGED_DISPLAY ) ) && |
| ( rDCEvt.GetFlags() & SETTINGS_STYLE ) ) |
| { |
| SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetFaceColor() ) ); |
| InitToolBoxImages(); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpTextWindow_Impl::ToggleIndex( sal_Bool bOn ) |
| { |
| bIsIndexOn = bOn; |
| if ( bIsIndexOn ) |
| { |
| aToolBox.SetItemImage( TBI_INDEX, aIndexOffImage ); |
| aToolBox.SetItemText( TBI_INDEX, aIndexOffText ); |
| } |
| else |
| { |
| aToolBox.SetItemImage( TBI_INDEX, aIndexOnImage ); |
| aToolBox.SetItemText( TBI_INDEX, aIndexOnText ); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpTextWindow_Impl::SelectSearchText( const String& rSearchText, sal_Bool _bIsFullWordSearch ) |
| { |
| aSearchText = rSearchText; |
| bIsFullWordSearch = _bIsFullWordSearch; |
| aSelectTimer.Start(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpTextWindow_Impl::SetPageStyleHeaderOff() const |
| { |
| #ifdef DBG_UTIL |
| sal_Bool bSetOff = sal_False; |
| #endif |
| // set off the pagestyle header to prevent print output of the help URL |
| try |
| { |
| Reference < XController > xController = xFrame->getController(); |
| Reference < XSelectionSupplier > xSelSup( xController, UNO_QUERY ); |
| if ( xSelSup.is() ) |
| { |
| Reference < XIndexAccess > xSelection; |
| if ( xSelSup->getSelection() >>= xSelection ) |
| { |
| Reference < XTextRange > xRange; |
| if ( xSelection->getByIndex(0) >>= xRange ) |
| { |
| Reference < XText > xText = xRange->getText(); |
| Reference < XPropertySet > xProps( xText->createTextCursorByRange( xRange ), UNO_QUERY ); |
| ::rtl::OUString sStyleName; |
| if ( xProps->getPropertyValue( DEFINE_CONST_OUSTRING("PageStyleName") ) >>= sStyleName ) |
| { |
| Reference < XStyleFamiliesSupplier > xStyles( xController->getModel(), UNO_QUERY ); |
| Reference < XNameContainer > xContainer; |
| if ( xStyles->getStyleFamilies()->getByName( DEFINE_CONST_OUSTRING("PageStyles") ) |
| >>= xContainer ) |
| { |
| Reference < XStyle > xStyle; |
| if ( xContainer->getByName( sStyleName ) >>= xStyle ) |
| { |
| Reference < XPropertySet > xPropSet( xStyle, UNO_QUERY ); |
| xPropSet->setPropertyValue( DEFINE_CONST_OUSTRING("HeaderIsOn"), |
| makeAny( sal_Bool( sal_False ) ) ); |
| |
| Reference< XModifiable > xReset(xStyles, UNO_QUERY); |
| xReset->setModified(sal_False); |
| #ifdef DBG_UTIL |
| bSetOff = sal_True; |
| #endif |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| catch( Exception& ) |
| { |
| DBG_ERRORFILE( "SfxHelpTextWindow_Impl::SetPageStyleHeaderOff(): unexpected exception" ); |
| } |
| |
| #ifdef DBG_UTIL |
| if ( !bSetOff ) |
| { |
| DBG_ERRORFILE( "SfxHelpTextWindow_Impl::SetPageStyleHeaderOff(): set off failed" ); |
| } |
| #endif |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpTextWindow_Impl::CloseFrame() |
| { |
| bIsInClose = sal_True; |
| try |
| { |
| ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseable > xCloseable ( xFrame, ::com::sun::star::uno::UNO_QUERY ); |
| if (xCloseable.is()) |
| xCloseable->close(sal_True); |
| } |
| catch( ::com::sun::star::util::CloseVetoException& ) |
| { |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpTextWindow_Impl::DoSearch() |
| { |
| if ( !pSrchDlg ) |
| { |
| // create the search dialog |
| pSrchDlg = new sfx2::SearchDialog( pTextWin, DEFINE_CONST_UNICODE("HelpSearchDialog") ); |
| // set handler |
| pSrchDlg->SetFindHdl( LINK( this, SfxHelpTextWindow_Impl, FindHdl ) ); |
| pSrchDlg->SetCloseHdl( LINK( this, SfxHelpTextWindow_Impl, CloseHdl ) ); |
| // get selected text of the help page to set it as the search text |
| Reference< XTextRange > xCursor = getCursor(); |
| if ( xCursor.is() ) |
| { |
| String sText = xCursor->getString(); |
| if ( sText.Len() > 0 ) |
| pSrchDlg->SetSearchText( sText ); |
| } |
| pSrchDlg->Show(); |
| } |
| } |
| |
| // class SfxHelpWindow_Impl ---------------------------------------------- |
| |
| void SfxHelpWindow_Impl::Resize() |
| { |
| SplitWindow::Resize(); |
| InitSizes(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpWindow_Impl::Split() |
| { |
| static long nMinSplitSize = 5; |
| static long nMaxSplitSize = 99 - nMinSplitSize; |
| |
| SplitWindow::Split(); |
| |
| nIndexSize = GetItemSize( INDEXWIN_ID ); |
| nTextSize = GetItemSize( TEXTWIN_ID ); |
| |
| sal_Bool bMod = sal_False; |
| if( nIndexSize < nMinSplitSize ) |
| { |
| nIndexSize = nMinSplitSize; |
| nTextSize = nMaxSplitSize; |
| |
| bMod = sal_True; |
| } |
| else if( nTextSize < nMinSplitSize ) |
| { |
| nTextSize = nMinSplitSize; |
| nIndexSize = nMaxSplitSize; |
| |
| bMod = sal_True; |
| } |
| else |
| bMod = sal_False; |
| |
| if( bMod ) |
| { |
| SetItemSize( INDEXWIN_ID, nIndexSize ); |
| SetItemSize( TEXTWIN_ID, nTextSize ); |
| } |
| |
| InitSizes(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpWindow_Impl::GetFocus() |
| { |
| pTextWin->GrabFocus(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpWindow_Impl::MakeLayout() |
| { |
| if ( nHeight > 0 && xWindow.is() ) |
| { |
| Window* pScreenWin = VCLUnoHelper::GetWindow( xWindow ); |
| |
| /* #i55528# |
| Hide() / Show() will produce starnge effects. |
| The returned size (used later to be written back into the configuration) |
| isnt the right after a resize during the window is hidden. |
| If this resize is done if the window is visible evyrthing works as aspected. |
| Some VCL-patches could not solve this problem so I've established the |
| workaround: resize the help window if it's visible .-) |
| */ |
| // pScreenWin->Hide(); |
| |
| ::com::sun::star::awt::Rectangle aRect = xWindow->getPosSize(); |
| sal_Int32 nOldWidth = bIndex ? nCollapseWidth : nExpandWidth; |
| sal_Int32 nWidth = bIndex ? nExpandWidth : nCollapseWidth; |
| xWindow->setPosSize( aRect.X, aRect.Y, nWidth, nHeight, ::com::sun::star::awt::PosSize::SIZE ); |
| |
| if ( aRect.Width > 0 && aRect.Height > 0 ) |
| { |
| Rectangle aScreenRect = pScreenWin->GetClientWindowExtentsRelative( NULL ); |
| Point aNewPos = aScreenRect.TopLeft(); |
| sal_Int32 nDiffWidth = nOldWidth - nWidth; |
| aNewPos.X() += nDiffWidth; |
| pScreenWin->SetPosPixel( aNewPos ); |
| } |
| else if ( aWinPos.X() > 0 && aWinPos.Y() > 0 ) |
| pScreenWin->SetPosPixel( aWinPos ); |
| |
| // pScreenWin->Show(); |
| } |
| |
| Clear(); |
| |
| if ( bIndex ) |
| { |
| pIndexWin->Show(); |
| InsertItem( COLSET_ID, 100, SPLITWINDOW_APPEND, SPLITSET_ID, SWIB_PERCENTSIZE | SWIB_COLSET ); |
| InsertItem( INDEXWIN_ID, pIndexWin, nIndexSize, SPLITWINDOW_APPEND, COLSET_ID, SWIB_PERCENTSIZE ); |
| InsertItem( TEXTWIN_ID, pTextWin, nTextSize, SPLITWINDOW_APPEND, COLSET_ID, SWIB_PERCENTSIZE ); |
| } |
| else |
| { |
| pIndexWin->Hide(); |
| InsertItem( COLSET_ID, 100, SPLITWINDOW_APPEND, SPLITSET_ID, SWIB_PERCENTSIZE | SWIB_COLSET ); |
| InsertItem( TEXTWIN_ID, pTextWin, 100, SPLITWINDOW_APPEND, 1, SWIB_PERCENTSIZE ); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpWindow_Impl::InitSizes() |
| { |
| if ( xWindow.is() ) |
| { |
| ::com::sun::star::awt::Rectangle aRect = xWindow->getPosSize(); |
| nHeight = aRect.Height; |
| |
| if ( bIndex ) |
| { |
| nExpandWidth = aRect.Width; |
| nCollapseWidth = nExpandWidth * nTextSize / 100; |
| } |
| else |
| { |
| nCollapseWidth = aRect.Width; |
| nExpandWidth = nCollapseWidth * 100 / nTextSize; |
| } |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpWindow_Impl::LoadConfig() |
| { |
| SvtViewOptions aViewOpt( E_WINDOW, CONFIGNAME_HELPWIN ); |
| if ( aViewOpt.Exists() ) |
| { |
| bIndex = aViewOpt.IsVisible(); |
| String aUserData; |
| Any aUserItem = aViewOpt.GetUserItem( USERITEM_NAME ); |
| rtl::OUString aTemp; |
| if ( aUserItem >>= aTemp ) |
| { |
| aUserData = String( aTemp ); |
| DBG_ASSERT( aUserData.GetTokenCount() == 6, "invalid user data" ); |
| sal_uInt16 nIdx = 0; |
| nIndexSize = aUserData.GetToken( 0, ';', nIdx ).ToInt32(); |
| nTextSize = aUserData.GetToken( 0, ';', nIdx ).ToInt32(); |
| sal_Int32 nWidth = aUserData.GetToken( 0, ';', nIdx ).ToInt32(); |
| nHeight = aUserData.GetToken( 0, ';', nIdx ).ToInt32(); |
| aWinPos.X() = aUserData.GetToken( 0, ';', nIdx ).ToInt32(); |
| aWinPos.Y() = aUserData.GetToken( 0, ';', nIdx ).ToInt32(); |
| if ( bIndex ) |
| { |
| nExpandWidth = nWidth; |
| nCollapseWidth = nExpandWidth * nTextSize / 100; |
| } |
| else |
| { |
| nCollapseWidth = nWidth; |
| nExpandWidth = nCollapseWidth * 100 / nTextSize; |
| } |
| } |
| |
| pTextWin->ToggleIndex( bIndex ); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpWindow_Impl::SaveConfig() |
| { |
| SvtViewOptions aViewOpt( E_WINDOW, CONFIGNAME_HELPWIN ); |
| sal_Int32 nW = 0, nH = 0; |
| |
| if ( xWindow.is() ) |
| { |
| ::com::sun::star::awt::Rectangle aRect = xWindow->getPosSize(); |
| nW = aRect.Width; |
| nH = aRect.Height; |
| } |
| |
| aViewOpt.SetVisible( bIndex ); |
| String aUserData = String::CreateFromInt32( nIndexSize ); |
| aUserData += ';'; |
| aUserData += String::CreateFromInt32( nTextSize ); |
| aUserData += ';'; |
| aUserData += String::CreateFromInt32( nW ); |
| aUserData += ';'; |
| aUserData += String::CreateFromInt32( nH ); |
| |
| Window* pScreenWin = VCLUnoHelper::GetWindow( xWindow ); |
| aWinPos = pScreenWin->GetWindowExtentsRelative( NULL ).TopLeft(); |
| aUserData += ';'; |
| aUserData += String::CreateFromInt32( aWinPos.X() ); |
| aUserData += ';'; |
| aUserData += String::CreateFromInt32( aWinPos.Y() ); |
| |
| aViewOpt.SetUserItem( USERITEM_NAME, makeAny( rtl::OUString( aUserData ) ) ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpWindow_Impl::ShowStartPage() |
| { |
| ::rtl::OUString sHelpURL = SfxHelpWindow_Impl::buildHelpURL(pIndexWin->GetFactory(), |
| DEFINE_CONST_UNICODE("/start"), |
| ::rtl::OUString(), |
| sal_True); |
| loadHelpContent(sHelpURL); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( SfxHelpWindow_Impl, SelectHdl, ToolBox* , pToolBox ) |
| { |
| if ( pToolBox ) |
| { |
| bGrabFocusToToolBox = pToolBox->HasChildPathFocus(); |
| DoAction( pToolBox->GetCurItemId() ); |
| } |
| |
| return 1; |
| } |
| |
| //------------------------------------------------------------------------- |
| |
| IMPL_LINK( SfxHelpWindow_Impl, OpenHdl, SfxHelpIndexWindow_Impl* , EMPTYARG ) |
| { |
| pIndexWin->SelectExecutableEntry(); |
| String aEntry = pIndexWin->GetSelectEntry(); |
| |
| if ( aEntry.Len() < 1 ) |
| return 0; |
| |
| ::rtl::OUString sHelpURL; |
| |
| // INetURLObject aObj(aEntry); |
| // sal_Bool bComplete = ( aObj.GetProtocol() == INET_PROT_VND_SUN_STAR_HELP ); |
| |
| sal_Bool bComplete = rtl::OUString(aEntry).toAsciiLowerCase().match(rtl::OUString::createFromAscii("vnd.sun.star.help"),0); |
| |
| if (bComplete) |
| sHelpURL = ::rtl::OUString(aEntry); |
| else |
| { |
| String aId; |
| String aAnchor = String('#'); |
| if ( aEntry.GetTokenCount( '#' ) == 2 ) |
| { |
| aId = aEntry.GetToken( 0, '#' ); |
| aAnchor += aEntry.GetToken( 1, '#' ); |
| } |
| else |
| aId = aEntry; |
| |
| aEntry = '/'; |
| aEntry += aId; |
| |
| sHelpURL = SfxHelpWindow_Impl::buildHelpURL(pIndexWin->GetFactory(), |
| aEntry, |
| aAnchor, |
| sal_True); |
| } |
| |
| loadHelpContent(sHelpURL); |
| |
| return 0; |
| } |
| |
| //------------------------------------------------------------------------- |
| |
| IMPL_LINK( SfxHelpWindow_Impl, SelectFactoryHdl, SfxHelpIndexWindow_Impl* , pWin ) |
| { |
| if ( sTitle.Len() == 0 ) |
| sTitle = GetParent()->GetText(); |
| |
| String aNewTitle = sTitle; |
| aNewTitle += DEFINE_CONST_UNICODE(" - "); |
| aNewTitle += pIndexWin->GetActiveFactoryTitle(); |
| |
| Reference< XTitle > xTitle(xFrame, UNO_QUERY); |
| if (xTitle.is ()) |
| xTitle->setTitle (aNewTitle); |
| |
| if ( pWin ) |
| ShowStartPage(); |
| pIndexWin->ClearSearchPage(); |
| |
| return 0; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( SfxHelpWindow_Impl, ChangeHdl, HelpListener_Impl*, pListener ) |
| { |
| SetFactory( pListener->GetFactory() ); |
| return 0; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpWindow_Impl::openDone(const ::rtl::OUString& sURL , |
| sal_Bool bSuccess) |
| { |
| INetURLObject aObj( sURL ); |
| if ( aObj.GetProtocol() == INET_PROT_VND_SUN_STAR_HELP ) |
| SetFactory( aObj.GetHost() ); |
| if ( IsWait() ) |
| LeaveWait(); |
| if ( bGrabFocusToToolBox ) |
| { |
| pTextWin->GetToolBox().GrabFocus(); |
| bGrabFocusToToolBox = sal_False; |
| } |
| else |
| pIndexWin->GrabFocusBack(); |
| if ( bSuccess ) |
| { |
| // set some view settings: "prevent help tips" and "helpid == 68245" |
| try |
| { |
| Reference < XController > xController = pTextWin->getFrame()->getController(); |
| if ( xController.is() ) |
| { |
| Reference < XViewSettingsSupplier > xSettings( xController, UNO_QUERY ); |
| Reference < XPropertySet > xViewProps = xSettings->getViewSettings(); |
| Reference< XPropertySetInfo > xInfo = xViewProps->getPropertySetInfo(); |
| Any aBoolAny = makeAny( sal_Bool( sal_True ) ); |
| xViewProps->setPropertyValue( DEFINE_CONST_OUSTRING("ShowContentTips"), makeAny( sal_Bool( sal_False ) ) ); |
| xViewProps->setPropertyValue( DEFINE_CONST_OUSTRING("ShowGraphics"), aBoolAny ); |
| xViewProps->setPropertyValue( DEFINE_CONST_OUSTRING("ShowTables"), aBoolAny ); |
| xViewProps->setPropertyValue( DEFINE_CONST_OUSTRING("HelpURL"), makeAny( DEFINE_CONST_OUSTRING("HID:SFX2_HID_HELP_ONHELP") ) ); |
| ::rtl::OUString sProperty( DEFINE_CONST_OUSTRING("IsExecuteHyperlinks") ); |
| if ( xInfo->hasPropertyByName( sProperty ) ) |
| xViewProps->setPropertyValue( sProperty, aBoolAny ); |
| xController->restoreViewData(pHelpInterceptor->GetViewData()); |
| } |
| } |
| catch( Exception& ) |
| { |
| DBG_ERROR( "SfxHelpWindow_Impl::OpenDoneHdl(): unexpected exception" ); |
| } |
| |
| // When the SearchPage opens the help doc, then select all words, which are equal to its text |
| String sSearchText = TRIM( pIndexWin->GetSearchText() ); |
| if ( sSearchText.Len() > 0 ) |
| pTextWin->SelectSearchText( sSearchText, pIndexWin->IsFullWordSearch() ); |
| |
| // no page style header -> this prevents a print output of the URL |
| pTextWin->SetPageStyleHeaderOff(); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| SfxHelpWindow_Impl::SfxHelpWindow_Impl( |
| const ::com::sun::star::uno::Reference < ::com::sun::star::frame::XFrame >& rFrame, |
| Window* pParent, WinBits ) : |
| |
| SplitWindow( pParent, WB_3DLOOK | WB_NOSPLITDRAW ), |
| |
| xFrame ( rFrame ), |
| pIndexWin ( NULL ), |
| pTextWin ( NULL ), |
| pHelpInterceptor ( new HelpInterceptor_Impl() ), |
| pHelpListener ( new HelpListener_Impl( pHelpInterceptor ) ), |
| nExpandWidth ( 0 ), |
| nCollapseWidth ( 0 ), |
| nHeight ( 0 ), |
| nIndexSize ( 40 ), |
| nTextSize ( 60 ), |
| bIndex ( sal_True ), |
| bGrabFocusToToolBox ( sal_False ), |
| aWinPos ( 0, 0 ), |
| sTitle ( pParent->GetText() ) |
| { |
| SetHelpId( HID_HELP_WINDOW ); |
| SetStyle( GetStyle() | WB_DIALOGCONTROL ); |
| |
| pHelpInterceptor->InitWaiter( this ); |
| pIndexWin = new SfxHelpIndexWindow_Impl( this ); |
| pIndexWin->SetDoubleClickHdl( LINK( this, SfxHelpWindow_Impl, OpenHdl ) ); |
| pIndexWin->SetSelectFactoryHdl( LINK( this, SfxHelpWindow_Impl, SelectFactoryHdl ) ); |
| pIndexWin->Show(); |
| pTextWin = new SfxHelpTextWindow_Impl( this ); |
| Reference < XFramesSupplier > xSup( rFrame, UNO_QUERY ); |
| Reference < XFrames > xFrames = xSup->getFrames(); |
| xFrames->append( pTextWin->getFrame() ); |
| pTextWin->SetSelectHdl( LINK( this, SfxHelpWindow_Impl, SelectHdl ) ); |
| pTextWin->Show(); |
| pHelpInterceptor->setInterception( pTextWin->getFrame() ); |
| pHelpListener->SetChangeHdl( LINK( this, SfxHelpWindow_Impl, ChangeHdl ) ); |
| LoadConfig(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| SfxHelpWindow_Impl::~SfxHelpWindow_Impl() |
| { |
| SaveConfig(); |
| Window* pDel = pIndexWin; |
| pIndexWin = NULL; |
| delete pDel; |
| |
| pTextWin->CloseFrame(); |
| delete pTextWin; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| long SfxHelpWindow_Impl::PreNotify( NotifyEvent& rNEvt ) |
| { |
| sal_Bool bHandled = sal_False; |
| if ( rNEvt.GetType() == EVENT_KEYINPUT ) |
| { |
| // Backward == <ALT><LEFT> or <BACKSPACE> Forward == <ALT><RIGHT> |
| const KeyCode& rKeyCode = rNEvt.GetKeyEvent()->GetKeyCode(); |
| sal_uInt16 nKey = rKeyCode.GetCode(); |
| if ( ( rKeyCode.IsMod2() && ( KEY_LEFT == nKey || KEY_RIGHT == nKey ) ) || |
| ( !rKeyCode.GetModifier() && KEY_BACKSPACE == nKey && !pIndexWin->HasFocusOnEdit() ) ) |
| { |
| DoAction( rKeyCode.GetCode() == KEY_RIGHT ? TBI_FORWARD : TBI_BACKWARD ); |
| bHandled = sal_True; |
| } |
| else if ( rKeyCode.IsMod1() && ( KEY_F4 == nKey || KEY_W == nKey ) ) |
| { |
| // <STRG><F4> or <STRG><W> -> close top frame |
| CloseWindow(); |
| bHandled = sal_True; |
| } |
| } |
| return bHandled ? 1 : Window::PreNotify( rNEvt ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpWindow_Impl::setContainerWindow( Reference < ::com::sun::star::awt::XWindow > xWin ) |
| { |
| xWindow = xWin; |
| MakeLayout(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpWindow_Impl::SetFactory( const String& rFactory ) |
| { |
| pIndexWin->SetFactory( rFactory, sal_True ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpWindow_Impl::SetHelpURL( const String& rURL ) |
| { |
| INetURLObject aObj( rURL ); |
| if ( aObj.GetProtocol() == INET_PROT_VND_SUN_STAR_HELP ) |
| SetFactory( aObj.GetHost() ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpWindow_Impl::DoAction( sal_uInt16 nActionId ) |
| { |
| switch ( nActionId ) |
| { |
| case TBI_INDEX : |
| { |
| bIndex = !bIndex; |
| MakeLayout(); |
| pTextWin->ToggleIndex( bIndex ); |
| break; |
| } |
| |
| case TBI_START : |
| { |
| ShowStartPage(); |
| break; |
| } |
| |
| case TBI_BACKWARD : |
| case TBI_FORWARD : |
| { |
| URL aURL; |
| aURL.Complete = DEFINE_CONST_UNICODE(".uno:Backward"); |
| if ( TBI_FORWARD == nActionId ) |
| aURL.Complete = DEFINE_CONST_UNICODE(".uno:Forward"); |
| PARSE_URL( aURL ); |
| pHelpInterceptor->dispatch( aURL, Sequence < PropertyValue >() ); |
| break; |
| } |
| |
| case TBI_SEARCHDIALOG : |
| { |
| pTextWin->DoSearch(); |
| break; |
| } |
| |
| case TBI_PRINT : |
| case TBI_SOURCEVIEW : |
| case TBI_COPY : |
| case TBI_SELECTIONMODE: |
| { |
| Reference < XDispatchProvider > xProv( pTextWin->getFrame(), UNO_QUERY ); |
| if ( xProv.is() ) |
| { |
| URL aURL; |
| if ( TBI_PRINT == nActionId ) |
| aURL.Complete = DEFINE_CONST_UNICODE(".uno:Print"); |
| else if ( TBI_SOURCEVIEW == nActionId ) |
| aURL.Complete = DEFINE_CONST_UNICODE(".uno:SourceView"); |
| else if ( TBI_COPY == nActionId ) |
| aURL.Complete = DEFINE_CONST_UNICODE(".uno:Copy"); |
| else if ( TBI_SELECTIONMODE == nActionId ) |
| aURL.Complete = DEFINE_CONST_UNICODE(".uno:SelectTextMode"); |
| else |
| aURL.Complete = DEFINE_CONST_UNICODE(".uno:SearchDialog"); |
| PARSE_URL( aURL ); |
| Reference < XDispatch > xDisp = xProv->queryDispatch( aURL, String(), 0 ); |
| if ( xDisp.is() ) |
| xDisp->dispatch( aURL, Sequence < PropertyValue >() ); |
| } |
| break; |
| } |
| |
| case TBI_BOOKMARKS : |
| { |
| String aURL = pHelpInterceptor->GetCurrentURL(); |
| if ( aURL.Len() > 0 ) |
| { |
| try |
| { |
| Content aCnt( aURL, Reference< ::com::sun::star::ucb::XCommandEnvironment > () ); |
| ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > xInfo = aCnt.getProperties(); |
| if ( xInfo->hasPropertyByName( PROPERTY_TITLE ) ) |
| { |
| ::com::sun::star::uno::Any aAny = aCnt.getPropertyValue( PROPERTY_TITLE ); |
| rtl::OUString aValue; |
| if ( aAny >>= aValue ) |
| { |
| String aTitle( aValue ); |
| SfxAddHelpBookmarkDialog_Impl aDlg( this, sal_False ); |
| aDlg.SetTitle( aTitle ); |
| if ( aDlg.Execute() == RET_OK ) |
| { |
| aTitle = aDlg.GetTitle(); |
| pIndexWin->AddBookmarks( aTitle, aURL ); |
| } |
| } |
| } |
| } |
| catch( Exception& ) |
| { |
| DBG_ERROR( "SfxHelpWindow_Impl::DoAction(): unexpected exception" ); |
| } |
| } |
| break; |
| } |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpWindow_Impl::CloseWindow() |
| { |
| try |
| { |
| // search for top frame |
| Reference< XFramesSupplier > xCreator = getTextFrame()->getCreator(); |
| while ( xCreator.is() && !xCreator->isTop() ) |
| { |
| xCreator = xCreator->getCreator(); |
| } |
| |
| // when found, close it |
| if ( xCreator.is() && xCreator->isTop() ) |
| { |
| Reference < XCloseable > xCloser( xCreator, UNO_QUERY ); |
| if ( xCloser.is() ) |
| xCloser->close( sal_False ); |
| } |
| } |
| catch( Exception& ) |
| { |
| DBG_ERRORFILE( "SfxHelpWindow_Impl::CloseWindow(): caught an exception" ); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxHelpWindow_Impl::UpdateToolbox() |
| { |
| pTextWin->GetToolBox().EnableItem( TBI_BACKWARD, pHelpInterceptor->HasHistoryPred() ); |
| pTextWin->GetToolBox().EnableItem( TBI_FORWARD, pHelpInterceptor->HasHistorySucc() ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| sal_Bool SfxHelpWindow_Impl::HasHistoryPredecessor() const |
| { |
| return pHelpInterceptor->HasHistoryPred(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| sal_Bool SfxHelpWindow_Impl::HasHistorySuccessor() const |
| { |
| return pHelpInterceptor->HasHistorySucc(); |
| } |
| |
| // class SfxAddHelpBookmarkDialog_Impl ----------------------------------- |
| |
| SfxAddHelpBookmarkDialog_Impl::SfxAddHelpBookmarkDialog_Impl( Window* pParent, sal_Bool bRename ) : |
| |
| ModalDialog( pParent, SfxResId( DLG_HELP_ADDBOOKMARK ) ), |
| |
| aTitleFT ( this, SfxResId( FT_BOOKMARK_TITLE ) ), |
| aTitleED ( this, SfxResId( ED_BOOKMARK_TITLE ) ), |
| aOKBtn ( this, SfxResId( PB_BOOKMARK_OK ) ), |
| aEscBtn ( this, SfxResId( PB_BOOKMARK_CANCEL ) ), |
| aHelpBtn ( this, SfxResId( PB_BOOKMARK_HELP ) ) |
| |
| { |
| if ( bRename ) |
| SetText( String( SfxResId( STR_BOOKMARK_RENAME ) ) ); |
| |
| FreeResource(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| SfxAddHelpBookmarkDialog_Impl::~SfxAddHelpBookmarkDialog_Impl() |
| { |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SfxAddHelpBookmarkDialog_Impl::SetTitle( const String& rTitle ) |
| { |
| aTitleED.SetText( rTitle ); |
| aTitleED.SetSelection( Selection( 0, rTitle.Len() ) ); |
| } |
| |