diff options
Diffstat (limited to 'svx/source/cui/cfgutil.cxx')
-rw-r--r-- | svx/source/cui/cfgutil.cxx | 1801 |
1 files changed, 0 insertions, 1801 deletions
diff --git a/svx/source/cui/cfgutil.cxx b/svx/source/cui/cfgutil.cxx deleted file mode 100644 index 9df95d970d..0000000000 --- a/svx/source/cui/cfgutil.cxx +++ /dev/null @@ -1,1801 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: cfg.cxx,v $ - * $Revision: 1.65 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svx.hxx" - -#include "cfgutil.hxx" - -#include <com/sun/star/beans/XPropertySet.hpp> -#include <com/sun/star/frame/XDispatchInformationProvider.hpp> -#include <com/sun/star/uno/RuntimeException.hpp> -#include <com/sun/star/script/provider/XScriptProviderSupplier.hpp> -#include <com/sun/star/script/provider/XScriptProvider.hpp> -#include <com/sun/star/script/browse/XBrowseNode.hpp> -#include <com/sun/star/script/browse/BrowseNodeTypes.hpp> - -#include <com/sun/star/script/browse/XBrowseNodeFactory.hpp> -#include <com/sun/star/script/browse/BrowseNodeFactoryViewTypes.hpp> -#include <com/sun/star/frame/XModuleManager.hpp> -#include <com/sun/star/frame/XDesktop.hpp> -#include <com/sun/star/container/XEnumerationAccess.hpp> -#include <com/sun/star/container/XEnumeration.hpp> -#include <com/sun/star/document/XDocumentInfoSupplier.hpp> -#include <com/sun/star/document/XScriptInvocationContext.hpp> -#include <com/sun/star/style/XStyleFamiliesSupplier.hpp> - -#include "acccfg.hrc" -#include "helpid.hrc" -#include <basic/sbx.hxx> -#include <basic/basicmanagerrepository.hxx> -#include <basic/sbstar.hxx> -#include <basic/sbxmeth.hxx> -#include <basic/sbmod.hxx> -#include <basic/basmgr.hxx> -#include <tools/urlobj.hxx> -#include "svx/dialogs.hrc" -#include <sfx2/app.hxx> -#include <sfx2/macrconf.hxx> -#include <sfx2/minfitem.hxx> -#include <unotools/processfactory.hxx> -#include <comphelper/documentinfo.hxx> -#include <svtools/imagemgr.hxx> -#include <rtl/ustrbuf.hxx> -#include <comphelper/sequenceashashmap.hxx> -#include <unotools/configmgr.hxx> -#include "svx/dialmgr.hxx" -#include <svtools/stritem.hxx> - -#define _SVSTDARR_STRINGSDTOR -#include <svtools/svstdarr.hxx> - -using namespace ::com::sun::star; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::script; -using namespace ::com::sun::star::frame; -using namespace ::com::sun::star::document; -namespace css = ::com::sun::star; - -static ::rtl::OUString SERVICE_UICATEGORYDESCRIPTION = ::rtl::OUString::createFromAscii("com.sun.star.ui.UICategoryDescription" ); -static ::rtl::OUString SERVICE_UICMDDESCRIPTION = ::rtl::OUString::createFromAscii("com.sun.star.frame.UICommandDescription"); - -SfxStylesInfo_Impl::SfxStylesInfo_Impl() -{} - -void SfxStylesInfo_Impl::setModel(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& xModel) -{ - m_xDoc = xModel; -} - -static ::rtl::OUString FAMILY_CHARACTERSTYLE = ::rtl::OUString::createFromAscii("CharacterStyles"); -static ::rtl::OUString FAMILY_PARAGRAPHSTYLE = ::rtl::OUString::createFromAscii("ParagraphStyles"); -static ::rtl::OUString FAMILY_FRAMESTYLE = ::rtl::OUString::createFromAscii("FrameStyles" ); -static ::rtl::OUString FAMILY_PAGESTYLE = ::rtl::OUString::createFromAscii("PageStyles" ); -static ::rtl::OUString FAMILY_NUMBERINGSTYLE = ::rtl::OUString::createFromAscii("NumberingStyles"); - -static ::rtl::OUString CMDURL_SPART = ::rtl::OUString::createFromAscii(".uno:StyleApply?Style:string="); -static ::rtl::OUString CMDURL_FPART2 = ::rtl::OUString::createFromAscii("&FamilyName:string="); - -static ::rtl::OUString CMDURL_STYLEPROT_ONLY = ::rtl::OUString::createFromAscii(".uno:StyleApply?"); -static ::rtl::OUString CMDURL_SPART_ONLY = ::rtl::OUString::createFromAscii("Style:string="); -static ::rtl::OUString CMDURL_FPART_ONLY = ::rtl::OUString::createFromAscii("FamilyName:string="); - -static ::rtl::OUString STYLEPROP_UINAME = ::rtl::OUString::createFromAscii("DisplayName"); - -::rtl::OUString SfxStylesInfo_Impl::generateCommand(const ::rtl::OUString& sFamily, const ::rtl::OUString& sStyle) -{ - ::rtl::OUStringBuffer sCommand(1024); - sCommand.append(CMDURL_SPART ); - sCommand.append(sStyle ); - sCommand.append(CMDURL_FPART2); - sCommand.append(sFamily ); - return sCommand.makeStringAndClear(); -} - -sal_Bool SfxStylesInfo_Impl::parseStyleCommand(SfxStyleInfo_Impl& aStyle) -{ - static sal_Int32 LEN_STYLEPROT = CMDURL_STYLEPROT_ONLY.getLength(); - static sal_Int32 LEN_SPART = CMDURL_SPART_ONLY.getLength(); - static sal_Int32 LEN_FPART = CMDURL_FPART_ONLY.getLength(); - - if (aStyle.sCommand.indexOf(CMDURL_STYLEPROT_ONLY, 0) != 0) - return sal_False; - - aStyle.sFamily = ::rtl::OUString(); - aStyle.sStyle = ::rtl::OUString(); - - sal_Int32 nCmdLen = aStyle.sCommand.getLength(); - ::rtl::OUString sCmdArgs = aStyle.sCommand.copy(LEN_STYLEPROT, nCmdLen-LEN_STYLEPROT); - sal_Int32 i = sCmdArgs.indexOf('&'); - if (i<0) - return sal_False; - - ::rtl::OUString sArg = sCmdArgs.copy(0, i); - if (sArg.indexOf(CMDURL_SPART_ONLY) == 0) - aStyle.sStyle = sArg.copy(LEN_SPART, sArg.getLength()-LEN_SPART); - else - if (sArg.indexOf(CMDURL_FPART_ONLY) == 0) - aStyle.sFamily = sArg.copy(LEN_FPART, sArg.getLength()-LEN_FPART); - - sArg = sCmdArgs.copy(i+1, sCmdArgs.getLength()-i-1); - if (sArg.indexOf(CMDURL_SPART_ONLY) == 0) - aStyle.sStyle = sArg.copy(LEN_SPART, sArg.getLength()-LEN_SPART); - else - if (sArg.indexOf(CMDURL_FPART_ONLY) == 0) - aStyle.sFamily = sArg.copy(LEN_FPART, sArg.getLength()-LEN_FPART); - - if (aStyle.sFamily.getLength() && aStyle.sStyle.getLength()) - return sal_True; - - return sal_False; -} - -void SfxStylesInfo_Impl::getLabel4Style(SfxStyleInfo_Impl& aStyle) -{ - try - { - css::uno::Reference< css::style::XStyleFamiliesSupplier > xModel(m_xDoc, css::uno::UNO_QUERY); - - css::uno::Reference< css::container::XNameAccess > xFamilies; - if (xModel.is()) - xFamilies = xModel->getStyleFamilies(); - - css::uno::Reference< css::container::XNameAccess > xStyleSet; - if (xFamilies.is()) - xFamilies->getByName(aStyle.sFamily) >>= xStyleSet; - - css::uno::Reference< css::beans::XPropertySet > xStyle; - if (xStyleSet.is()) - xStyleSet->getByName(aStyle.sStyle) >>= xStyle; - - aStyle.sLabel = ::rtl::OUString(); - if (xStyle.is()) - xStyle->getPropertyValue(STYLEPROP_UINAME) >>= aStyle.sLabel; - } - catch(const css::uno::RuntimeException& exRun) - { throw exRun; } - catch(const css::uno::Exception&) - { aStyle.sLabel = ::rtl::OUString(); } - - if (!aStyle.sLabel.getLength()) - { - aStyle.sLabel = aStyle.sCommand; - /* - #if OSL_DEBUG_LEVEL > 1 - ::rtl::OUStringBuffer sMsg(256); - sMsg.appendAscii("There is no UIName for the style command \""); - sMsg.append (aStyle.sCommand ); - sMsg.appendAscii("\". The UI will be invalid then ..." ); - OSL_ENSURE(sal_False, ::rtl::OUStringToOString(sMsg.makeStringAndClear(), RTL_TEXTENCODING_UTF8).getStr()); - #endif - */ - } -} - -::std::vector< SfxStyleInfo_Impl > SfxStylesInfo_Impl::getStyleFamilies() -{ - // Its an optional interface! - css::uno::Reference< css::style::XStyleFamiliesSupplier > xModel(m_xDoc, css::uno::UNO_QUERY); - if (!xModel.is()) - return ::std::vector< SfxStyleInfo_Impl >(); - - css::uno::Reference< css::container::XNameAccess > xCont = xModel->getStyleFamilies(); - css::uno::Sequence< ::rtl::OUString > lFamilyNames = xCont->getElementNames(); - ::std::vector< SfxStyleInfo_Impl > lFamilies; - sal_Int32 c = lFamilyNames.getLength(); - sal_Int32 i = 0; - for(i=0; i<c; ++i) - { - SfxStyleInfo_Impl aFamilyInfo; - aFamilyInfo.sFamily = lFamilyNames[i]; - - try - { - css::uno::Reference< css::beans::XPropertySet > xFamilyInfo; - xCont->getByName(aFamilyInfo.sFamily) >>= xFamilyInfo; - if (!xFamilyInfo.is()) - { - // TODO_AS currently there is no support for an UIName property .. use internal family name instead - aFamilyInfo.sLabel = aFamilyInfo.sFamily; - } - else - xFamilyInfo->getPropertyValue(STYLEPROP_UINAME) >>= aFamilyInfo.sLabel; - } - catch(const css::uno::RuntimeException& exRun) - { throw exRun; } - catch(const css::uno::Exception&) - { return ::std::vector< SfxStyleInfo_Impl >(); } - - lFamilies.push_back(aFamilyInfo); - } - - return lFamilies; -} - -::std::vector< SfxStyleInfo_Impl > SfxStylesInfo_Impl::getStyles(const ::rtl::OUString& sFamily) -{ - static ::rtl::OUString PROP_UINAME = ::rtl::OUString::createFromAscii("DisplayName"); - - css::uno::Sequence< ::rtl::OUString > lStyleNames; - css::uno::Reference< css::style::XStyleFamiliesSupplier > xModel(m_xDoc, css::uno::UNO_QUERY_THROW); - css::uno::Reference< css::container::XNameAccess > xFamilies = xModel->getStyleFamilies(); - css::uno::Reference< css::container::XNameAccess > xStyleSet; - try - { - xFamilies->getByName(sFamily) >>= xStyleSet; - lStyleNames = xStyleSet->getElementNames(); - } - catch(const css::uno::RuntimeException& exRun) - { throw exRun; } - catch(const css::uno::Exception&) - { return ::std::vector< SfxStyleInfo_Impl >(); } - - ::std::vector< SfxStyleInfo_Impl > lStyles; - sal_Int32 c = lStyleNames.getLength(); - sal_Int32 i = 0; - for (i=0; i<c; ++i) - { - SfxStyleInfo_Impl aStyleInfo; - aStyleInfo.sFamily = sFamily; - aStyleInfo.sStyle = lStyleNames[i]; - aStyleInfo.sCommand = SfxStylesInfo_Impl::generateCommand(aStyleInfo.sFamily, aStyleInfo.sStyle); - - try - { - css::uno::Reference< css::beans::XPropertySet > xStyle; - xStyleSet->getByName(aStyleInfo.sStyle) >>= xStyle; - if (!xStyle.is()) - continue; - xStyle->getPropertyValue(PROP_UINAME) >>= aStyleInfo.sLabel; - } - catch(const css::uno::RuntimeException& exRun) - { throw exRun; } - catch(const css::uno::Exception&) - { continue; } - - lStyles.push_back(aStyleInfo); - } - return lStyles; -} -SV_IMPL_PTRARR(SfxGroupInfoArr_Impl, SfxGroupInfoPtr); -SfxConfigFunctionListBox_Impl::SfxConfigFunctionListBox_Impl( Window* pParent, const ResId& rResId) - : SvTreeListBox( pParent, rResId ) - , pCurEntry( 0 ) - , pStylesInfo( 0 ) -{ - SetWindowBits( GetStyle() | WB_CLIPCHILDREN | WB_HSCROLL | WB_SORT ); - GetModel()->SetSortMode( SortAscending ); - - // Timer f"ur die BallonHelp - aTimer.SetTimeout( 200 ); - aTimer.SetTimeoutHdl( - LINK( this, SfxConfigFunctionListBox_Impl, TimerHdl ) ); -} - -SfxConfigFunctionListBox_Impl::~SfxConfigFunctionListBox_Impl() -{ - ClearAll(); -} - -void SfxConfigFunctionListBox_Impl::MouseMove( const MouseEvent& ) -{ - /* --> PB 2004-12-01 #i37000# - no own help text needed any longer - Point aMousePos = rMEvt.GetPosPixel(); - pCurEntry = GetCurEntry(); - - if ( pCurEntry && GetEntry( aMousePos ) == pCurEntry ) - aTimer.Start(); - else - { - Help::ShowBalloon( this, aMousePos, String() ); - aTimer.Stop(); - } - */ -} - - -IMPL_LINK( SfxConfigFunctionListBox_Impl, TimerHdl, Timer*, pTimer) -/* Beschreibung - Timer-Handler f"ur die Einblendung eines Hilfetextes. Wenn nach Ablauf des Timers - der Mauszeiger immer noch auf dem aktuell selektierten Eintrag steht, wird der - Helptext des Entries als Balloon-Help eingeblendet. -*/ -{ - (void)pTimer; // unused - /* --> PB 2004-12-01 #i37000# - no own help text needed any longer - aTimer.Stop(); - Point aMousePos = GetPointerPosPixel(); - SvLBoxEntry *pEntry = GetCurEntry(); - if ( pEntry && GetEntry( aMousePos ) == pEntry && pCurEntry == pEntry ) - { - String sHelpText = GetHelpText( pEntry ); - Help::ShowBalloon( this, OutputToScreenPixel( aMousePos ), sHelpText ); - } - */ - return 0L; -} - -void SfxConfigFunctionListBox_Impl::ClearAll() -/* Beschreibung - L"oscht alle Eintr"age in der FunctionListBox, alle UserDaten und alle evtl. - vorhandenen MacroInfos. -*/ -{ - USHORT nCount = aArr.Count(); - for ( USHORT i=0; i<nCount; i++ ) - { - SfxGroupInfo_Impl *pData = aArr[i]; - - if ( pData->nKind == SFX_CFGFUNCTION_MACRO || - pData->nKind == SFX_CFGFUNCTION_SCRIPT ) - { - SfxMacroInfo *pInfo = (SfxMacroInfo*) pData->pObject; - SFX_APP()->GetMacroConfig()->ReleaseSlotId( pInfo->GetSlotId() ); - delete pInfo; - } - - if ( pData->nKind == SFX_CFGGROUP_SCRIPTCONTAINER - || pData->nKind == SFX_CFGGROUP_DOCBASICMGR - ) - { - XInterface* xi = static_cast<XInterface *>(pData->pObject); - if (xi != NULL) - { - xi->release(); - } - } - - delete pData; - } - - aArr.Remove( 0, nCount ); - Clear(); -} - -SvLBoxEntry* SfxConfigFunctionListBox_Impl::GetEntry_Impl( const String& rName ) -/* Beschreibung - Ermittelt den SvLBoxEntry zu einem "ubergebenen String. Das setzt voraus, da\s - die Namen eindeutig sind. -*/ -{ - SvLBoxEntry *pEntry = First(); - while ( pEntry ) - { - if ( GetEntryText( pEntry ) == rName ) - return pEntry; - pEntry = Next( pEntry ); - } - - return NULL; -} - -SvLBoxEntry* SfxConfigFunctionListBox_Impl::GetEntry_Impl( USHORT nId ) -/* Beschreibung - Ermittelt den SvLBoxEntry zu einer "ubergebenen Id. -*/ -{ - SvLBoxEntry *pEntry = First(); - while ( pEntry ) - { - SfxGroupInfo_Impl *pData = (SfxGroupInfo_Impl*) pEntry->GetUserData(); - if ( pData && pData->nOrd == nId ) - return pEntry; - pEntry = Next( pEntry ); - } - - return NULL; -} - -SfxMacroInfo* SfxConfigFunctionListBox_Impl::GetMacroInfo() -/* Beschreibung - Gibt die MacroInfo des selektierten Entry zur"uck ( sofern vorhanden ). -*/ -{ - SvLBoxEntry *pEntry = FirstSelected(); - if ( pEntry ) - { - SfxGroupInfo_Impl *pData = (SfxGroupInfo_Impl*) pEntry->GetUserData(); - if ( pData && ( pData->nKind == SFX_CFGFUNCTION_MACRO || - pData->nKind == SFX_CFGFUNCTION_SCRIPT ) ) - return (SfxMacroInfo*) pData->pObject; - } - - return 0; -} - -String SfxConfigFunctionListBox_Impl::GetCurCommand() -{ - SvLBoxEntry *pEntry = FirstSelected(); - if (!pEntry) - return String(); - SfxGroupInfo_Impl *pData = (SfxGroupInfo_Impl*) pEntry->GetUserData(); - if (!pData) - return String(); - return pData->sCommand; -} - -String SfxConfigFunctionListBox_Impl::GetCurLabel() -{ - SvLBoxEntry *pEntry = FirstSelected(); - if (!pEntry) - return String(); - SfxGroupInfo_Impl *pData = (SfxGroupInfo_Impl*) pEntry->GetUserData(); - if (!pData) - return String(); - if (pData->sLabel.Len()) - return pData->sLabel; - return pData->sCommand; -} - -USHORT SfxConfigFunctionListBox_Impl::GetId( SvLBoxEntry *pEntry ) -/* Beschreibung - Gibt die Ordnungsnummer ( SlotId oder Macro-Nummer ) des Eintrags zur"uck. -*/ -{ - SfxGroupInfo_Impl *pData = pEntry ? - (SfxGroupInfo_Impl*) pEntry->GetUserData() : 0; - if ( pData ) - return pData->nOrd; - return 0; -} - -/* -String SfxConfigFunctionListBox_Impl::GetHelpText( SvLBoxEntry *pEntry ) -{ - // Information zum selektierten Entry aus den Userdaten holen - SfxGroupInfo_Impl *pInfo = pEntry ? (SfxGroupInfo_Impl*) pEntry->GetUserData(): 0; - if ( pInfo ) - { - switch ( pInfo->nKind ) - { - case SFX_CFGGROUP_FUNCTION : - case SFX_CFGFUNCTION_SLOT : - { - // Eintrag ist eine Funktion, Hilfe aus der Office-Hilfe - USHORT nId = pInfo->nOrd; - String aText = Application::GetHelp()->GetHelpText( nId, this ); - - if ( !aText.Len() ) - aText = SFX_SLOTPOOL().GetSlotHelpText_Impl( nId ); - return aText; - } - - case SFX_CFGGROUP_SCRIPTCONTAINER : - case SFX_CFGFUNCTION_SCRIPT : - case SFX_CFGGROUP_BASICMGR : - case SFX_CFGGROUP_DOCBASICMGR : - case SFX_CFGGROUP_BASICLIB : - case SFX_CFGGROUP_BASICMOD : - case SFX_CFGFUNCTION_MACRO : - { - // Eintrag ist ein Macro, Hilfe aus der MacroInfo - SfxMacroInfo *pMacInfo = (SfxMacroInfo*) pInfo->pObject; - return pMacInfo->GetHelpText(); - } - - case SFX_CFGGROUP_STYLES : - return String(); - } - } - - return String(); -}*/ - -void SfxConfigFunctionListBox_Impl::FunctionSelected() -/* Beschreibung - Setzt die Balloonhelp zur"uck, da diese immer den Helptext des selektierten - Entry anzeigen soll. -*/ -{ - /* --> PB 2004-12-01 #i37000# - no own help text needed any longer - Help::ShowBalloon( this, Point(), String() ); - */ -} - -void SfxConfigFunctionListBox_Impl::SetStylesInfo(SfxStylesInfo_Impl* pStyles) -{ - pStylesInfo = pStyles; -} - -struct SvxConfigGroupBoxResource_Impl : public Resource -{ - Image m_hdImage; - Image m_hdImage_hc; - Image m_libImage; - Image m_libImage_hc; - Image m_macImage; - Image m_macImage_hc; - Image m_docImage; - Image m_docImage_hc; - ::rtl::OUString m_sMyMacros; - ::rtl::OUString m_sProdMacros; - String m_sMacros; - String m_sDlgMacros; - String m_aHumanAppName; - String m_aStrGroupStyles; - String m_aScriptType; - Image m_collapsedImage; - Image m_collapsedImage_hc; - Image m_expandedImage; - Image m_expandedImage_hc; - - SvxConfigGroupBoxResource_Impl(); -}; - -SvxConfigGroupBoxResource_Impl::SvxConfigGroupBoxResource_Impl() : - Resource(SVX_RES(RID_SVXPAGE_CONFIGGROUPBOX)), - m_hdImage(SVX_RES(IMG_HARDDISK)), - m_hdImage_hc(SVX_RES(IMG_HARDDISK_HC)), - m_libImage(SVX_RES(IMG_LIB)), - m_libImage_hc(SVX_RES(IMG_LIB_HC)), - m_macImage(SVX_RES(IMG_MACRO)), - m_macImage_hc(SVX_RES(IMG_MACRO_HC)), - m_docImage(SVX_RES(IMG_DOC)), - m_docImage_hc(SVX_RES(IMG_DOC_HC)), - m_sMyMacros(String(SVX_RES(STR_MYMACROS))), - m_sProdMacros(String(SVX_RES(STR_PRODMACROS))), - m_sMacros(String(SVX_RES(STR_BASICMACROS))), - m_sDlgMacros(String(SVX_RES(STR_DLG_MACROS))), - m_aHumanAppName(String(SVX_RES(STR_HUMAN_APPNAME))), - m_aStrGroupStyles(String(SVX_RES(STR_GROUP_STYLES))), - m_aScriptType(String(SVX_RES(STR_BASICNAME))), - m_collapsedImage(SVX_RES(BMP_COLLAPSED)), - m_collapsedImage_hc(SVX_RES(BMP_COLLAPSED_HC)), - m_expandedImage(SVX_RES(BMP_EXPANDED)), - m_expandedImage_hc(SVX_RES(BMP_EXPANDED_HC)) -{ - FreeResource(); -} - -SfxConfigGroupListBox_Impl::SfxConfigGroupListBox_Impl( - Window* pParent, const ResId& rResId, ULONG nConfigMode ) - : SvTreeListBox( pParent, rResId ) - , pImp(new SvxConfigGroupBoxResource_Impl()), pFunctionListBox(0), nMode( nConfigMode ), bShowSF( FALSE ), bShowBasic( TRUE ), pStylesInfo(0) -{ - SetWindowBits( GetStyle() | WB_CLIPCHILDREN | WB_HSCROLL | WB_HASBUTTONS | WB_HASLINES | WB_HASLINESATROOT | WB_HASBUTTONSATROOT ); - SetNodeBitmaps( pImp->m_collapsedImage, pImp->m_expandedImage, BMP_COLOR_NORMAL ); - SetNodeBitmaps( pImp->m_collapsedImage_hc, pImp->m_expandedImage_hc, BMP_COLOR_HIGHCONTRAST ); - - // Check configuration to see whether only Basic macros, - // only Scripting Framework scripts, or both should be listed - Any value; - sal_Bool tmp = false; - - value = ::utl::ConfigManager::GetConfigManager()->GetLocalProperty( - ::rtl::OUString::createFromAscii( - "Office.Scripting/ScriptDisplaySettings/ShowBasic" ) ); - - value >>= tmp; - - if (tmp == sal_True) { - bShowBasic = TRUE; - } - else { - bShowBasic = FALSE; - } - - value = ::utl::ConfigManager::GetConfigManager()->GetLocalProperty( - ::rtl::OUString::createFromAscii( - "Office.Scripting/ScriptDisplaySettings/ShowSF" ) ); - - value >>= tmp; - - if (tmp == sal_True) { - bShowSF = TRUE; - } - else { - bShowSF = FALSE; - } -} - - -SfxConfigGroupListBox_Impl::~SfxConfigGroupListBox_Impl() -{ - ClearAll(); -} - -void SfxConfigGroupListBox_Impl::ClearAll() -{ - USHORT nCount = aArr.Count(); - for ( USHORT i=0; i<nCount; i++ ) - { - SfxGroupInfo_Impl *pData = aArr[i]; - if ( pData->nKind == SFX_CFGGROUP_SCRIPTCONTAINER - || pData->nKind == SFX_CFGGROUP_DOCBASICMGR - ) - { - XInterface* xi = static_cast<XInterface *>(pData->pObject); - if (xi != NULL) - { - xi->release(); - } - } - delete pData; - } - - aArr.Remove( 0, nCount ); - Clear(); -} - -void SfxConfigGroupListBox_Impl::SetScriptType( const String& rScriptType ) -{ - pImp->m_aScriptType = rScriptType; - ULONG nPos=0; - SvLBoxEntry *pEntry = (SvLBoxEntry*) GetModel()->GetEntryAtAbsPos( nPos++ ); - while ( pEntry ) - { - SfxGroupInfo_Impl *pInfo = (SfxGroupInfo_Impl*) pEntry->GetUserData(); - if ( pInfo->nKind == SFX_CFGGROUP_BASICLIB && ( IsExpanded( pEntry ) || pInfo->bWasOpened ) ) - { - Collapse( pEntry ); - SvLBoxEntry *pChild = FirstChild( pEntry ); - while (pChild) - { - GetModel()->Remove( pChild ); - pChild = FirstChild( pEntry ); - } - - Expand( pEntry ); - } - - pEntry = (SvLBoxEntry*) GetModel()->GetEntryAtAbsPos( nPos++ ); - } -} - -void SfxConfigGroupListBox_Impl::SetStylesInfo(SfxStylesInfo_Impl* pStyles) -{ - pStylesInfo = pStyles; -} - -String SfxConfigGroupListBox_Impl::GetGroup() -/* Beschreibung - Gibt den Namen der selektierten Funktionsgruppe bzw. des selektierten - Basics zur"uck. -*/ -{ - SvLBoxEntry *pEntry = FirstSelected(); - while ( pEntry ) - { - SfxGroupInfo_Impl *pInfo = (SfxGroupInfo_Impl*) pEntry->GetUserData(); - if ( pInfo->nKind == SFX_CFGGROUP_FUNCTION ) - return GetEntryText( pEntry ); - - if ( pInfo->nKind == SFX_CFGGROUP_BASICMGR ) - { - BasicManager *pMgr = (BasicManager*) pInfo->pObject; - return pMgr->GetName(); - } - - if ( pInfo->nKind == SFX_CFGGROUP_DOCBASICMGR ) - { - Reference< XModel > xDoc( static_cast< XModel* >( pInfo->pObject ) ); - return ::comphelper::DocumentInfo::getDocumentTitle( xDoc ); - } - - pEntry = GetParent( pEntry ); - } - - return String(); -} - -//----------------------------------------------- -BasicManager* SfxConfigGroupListBox_Impl::GetBasicManager( const SvLBoxEntry& _rEntry ) -{ - BasicManager* pBasMgr = NULL; - - SfxGroupInfo_Impl* pInfo = (SfxGroupInfo_Impl*) _rEntry.GetUserData(); - switch ( pInfo->nKind ) - { - case SFX_CFGGROUP_BASICMGR : - pBasMgr = (BasicManager*) pInfo->pObject; - break; - case SFX_CFGGROUP_DOCBASICMGR : - { - Reference< XModel > xDoc( static_cast< XModel* >( pInfo->pObject ) ); - pBasMgr = ::basic::BasicManagerRepository::getDocumentBasicManager( xDoc ); - } - break; - } - return pBasMgr; -} - -//----------------------------------------------- -void SfxConfigGroupListBox_Impl::InitModule() -{ - try - { - css::uno::Reference< css::frame::XDispatchInformationProvider > xProvider(m_xFrame, css::uno::UNO_QUERY_THROW); - css::uno::Sequence< sal_Int16 > lGroups = xProvider->getSupportedCommandGroups(); - sal_Int32 c1 = lGroups.getLength(); - sal_Int32 i1 = 0; - - for (i1=0; i1<c1; ++i1) - { - sal_Int16& rGroupID = lGroups[i1]; - ::rtl::OUString sGroupID = ::rtl::OUString::valueOf((sal_Int32)rGroupID); - ::rtl::OUString sGroupName ; - - try - { - m_xModuleCategoryInfo->getByName(sGroupID) >>= sGroupName; - if (!sGroupName.getLength()) - continue; - } - catch(const css::container::NoSuchElementException&) - { continue; } - - SvLBoxEntry* pEntry = InsertEntry(sGroupName, NULL); - SfxGroupInfo_Impl* pInfo = new SfxGroupInfo_Impl(SFX_CFGGROUP_FUNCTION, rGroupID); - pEntry->SetUserData(pInfo); - } - } - catch(const css::uno::RuntimeException& exRun) - { throw exRun; } - catch(const css::uno::Exception&) - {} -} - -//----------------------------------------------- -void SfxConfigGroupListBox_Impl::InitBasic() -{ -} - -//----------------------------------------------- -void SfxConfigGroupListBox_Impl::InitStyles() -{ -} - -//----------------------------------------------- -namespace -{ - //........................................... - /** examines a component whether it supports XEmbeddedScripts, or provides access to such a - component by implementing XScriptInvocationContext. - @return - the model which supports the embedded scripts, or <NULL/> if it cannot find such a - model - */ - static Reference< XModel > lcl_getDocumentWithScripts_throw( const Reference< XInterface >& _rxComponent ) - { - Reference< XEmbeddedScripts > xScripts( _rxComponent, UNO_QUERY ); - if ( !xScripts.is() ) - { - Reference< XScriptInvocationContext > xContext( _rxComponent, UNO_QUERY ); - if ( xContext.is() ) - xScripts.set( xContext->getScriptContainer(), UNO_QUERY ); - } - - return Reference< XModel >( xScripts, UNO_QUERY ); - } - - //........................................... - static Reference< XModel > lcl_getScriptableDocument_nothrow( const Reference< XFrame >& _rxFrame ) - { - Reference< XModel > xDocument; - - // examine our associated frame - try - { - OSL_ENSURE( _rxFrame.is(), "lcl_getScriptableDocument_nothrow: you need to pass a frame to this dialog/tab page!" ); - if ( _rxFrame.is() ) - { - // first try the model in the frame - Reference< XController > xController( _rxFrame->getController(), UNO_SET_THROW ); - xDocument = lcl_getDocumentWithScripts_throw( xController->getModel() ); - - if ( !xDocument.is() ) - { - // if there is no suitable document in the frame, try the controller - xDocument = lcl_getDocumentWithScripts_throw( _rxFrame->getController() ); - } - } - } - catch( const Exception& ) - { - //DBG_UNHANDLED_EXCEPTION(); - } - - return xDocument; - } -} - -//----------------------------------------------- -void SfxConfigGroupListBox_Impl::Init(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR , - const css::uno::Reference< css::frame::XFrame >& xFrame , - const ::rtl::OUString& sModuleLongName) -{ - SetUpdateMode(FALSE); - ClearAll(); // Remove all old entries from treelist box - - m_xFrame = xFrame; - if ( xSMGR.is()) - { - m_xSMGR = xSMGR; - m_sModuleLongName = sModuleLongName; - - m_xGlobalCategoryInfo = css::uno::Reference< css::container::XNameAccess >(m_xSMGR->createInstance(SERVICE_UICATEGORYDESCRIPTION), css::uno::UNO_QUERY_THROW); - m_xModuleCategoryInfo = css::uno::Reference< css::container::XNameAccess >(m_xGlobalCategoryInfo->getByName(m_sModuleLongName) , css::uno::UNO_QUERY_THROW); - m_xUICmdDescription = css::uno::Reference< css::container::XNameAccess >(m_xSMGR->createInstance(SERVICE_UICMDDESCRIPTION) , css::uno::UNO_QUERY_THROW); - - InitModule(); - InitBasic(); - InitStyles(); - } - - /* - - // Verwendet wird der aktuelle Slotpool - if ( nMode ) - { - pSlotPool = pPool ? pPool : &SFX_SLOTPOOL(); - for ( USHORT i=1; i<pSlotPool->GetGroupCount(); i++ ) - { - // Gruppe anw"ahlen ( Gruppe 0 ist intern ) - String aName = pSlotPool->SeekGroup( i ); - const SfxSlot *pSfxSlot = pSlotPool->FirstSlot(); - if ( pSfxSlot ) - { - // Check if all entries are not useable. Don't - // insert a group without any useable function. - sal_Bool bActiveEntries = sal_False; - while ( pSfxSlot ) - { - USHORT nId = pSfxSlot->GetSlotId(); - if ( pSfxSlot->GetMode() & nMode ) - { - bActiveEntries = sal_True; - break; - } - - pSfxSlot = pSlotPool->NextSlot(); - } - - if ( bActiveEntries ) - { - // Wenn Gruppe nicht leer - SvLBoxEntry *pEntry = InsertEntry( aName, NULL ); - SfxGroupInfo_Impl *pInfo = new SfxGroupInfo_Impl( SFX_CFGGROUP_FUNCTION, i ); - aArr.Insert( pInfo, aArr.Count() ); - pEntry->SetUserData( pInfo ); - } - } - } - } -*/ - SfxApplication *pSfxApp = SFX_APP(); - if ( bShowBasic ) - { - // Basics einsammeln - pSfxApp->EnterBasicCall(); - String aMacroName(' '); - aMacroName += pImp->m_sDlgMacros; - - // Zuerst AppBasic - BasicManager *pAppBasicMgr = pSfxApp->GetBasicManager(); - BOOL bInsert = TRUE; - /* - if ( pArr ) - { - bInsert = FALSE; - for ( USHORT n=0; n<pArr->Count(); n++ ) - { - if ( *(*pArr)[n] == pSfxApp->GetName() ) - { - bInsert = TRUE; - break; - } - } - } - */ - - if ( bInsert ) - { - pAppBasicMgr->SetName( pSfxApp->GetName() ); - if ( pAppBasicMgr->GetLibCount() ) - { - // Nur einf"ugen, wenn Bibliotheken vorhanden - String aAppBasTitle( pImp->m_aHumanAppName ); - aAppBasTitle += aMacroName; - SvLBoxEntry *pEntry = InsertEntry( aAppBasTitle, 0 ); - SfxGroupInfo_Impl *pInfo = new SfxGroupInfo_Impl( SFX_CFGGROUP_BASICMGR, 0, pAppBasicMgr ); - // aArr.Insert( pInfo, aArr.Count() ); - pEntry->SetUserData( pInfo ); - pEntry->EnableChildsOnDemand( TRUE ); - // Expand( pEntry ); - } - } - - Reference< XModel > xDoc( lcl_getScriptableDocument_nothrow( m_xFrame ) ); - if ( xDoc.is() ) - { - BasicManager* pBasicMgr = ::basic::BasicManagerRepository::getDocumentBasicManager( xDoc ); - if ( pBasicMgr != pAppBasicMgr && pBasicMgr->GetLibCount() ) - { - String sDocTitle( ::comphelper::DocumentInfo::getDocumentTitle( xDoc ) ); - pBasicMgr->SetName( sDocTitle ); - - // Nur einf"ugen, wenn eigenes Basic mit Bibliotheken - SvLBoxEntry *pEntry = InsertEntry( sDocTitle.Append( aMacroName ), NULL ); - xDoc->acquire(); - SfxGroupInfo_Impl *pInfo = - new SfxGroupInfo_Impl( SFX_CFGGROUP_DOCBASICMGR, 0, xDoc.get() ); - pEntry->SetUserData( pInfo ); - pEntry->EnableChildsOnDemand( TRUE ); - } - } - - pSfxApp->LeaveBasicCall(); - } - - OSL_TRACE("** ** About to initialise SF Scripts"); - if ( bShowSF ) - { - OSL_TRACE("** ** bShowSF"); - // Add Scripting Framework entries - Reference< browse::XBrowseNode > rootNode; - Reference< XComponentContext > xCtx; - try - { - Reference < beans::XPropertySet > xProps( - ::comphelper::getProcessServiceFactory(), UNO_QUERY_THROW ); - xCtx.set( xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ))), UNO_QUERY_THROW ); - Reference< browse::XBrowseNodeFactory > xFac( xCtx->getValueByName( - ::rtl::OUString::createFromAscii( "/singletons/com.sun.star.script.browse.theBrowseNodeFactory") ), UNO_QUERY_THROW ); - rootNode.set( xFac->createView( browse::BrowseNodeFactoryViewTypes::MACROSELECTOR ) ); - //rootNode.set( xFac->createView( browse::BrowseNodeFactoryViewTypes::MACROORGANIZER ) ); - } - catch( Exception& e ) - { - OSL_TRACE(" Caught some exception whilst retrieving browse nodes from factory... Exception: %s", - ::rtl::OUStringToOString( e.Message , RTL_TEXTENCODING_ASCII_US ).pData->buffer ); - // TODO exception handling - } - - - if ( rootNode.is() ) - { - if ( nMode ) - { - //We call acquire on the XBrowseNode so that it does not - //get autodestructed and become invalid when accessed later. - rootNode->acquire(); - - SfxGroupInfo_Impl *pInfo = - new SfxGroupInfo_Impl( SFX_CFGGROUP_SCRIPTCONTAINER, 0, - static_cast<void *>(rootNode.get())); - - String aTitle(pImp->m_sDlgMacros); - SvLBoxEntry *pNewEntry = InsertEntry( aTitle, NULL ); - pNewEntry->SetUserData( pInfo ); - pNewEntry->EnableChildsOnDemand( TRUE ); - aArr.Insert( pInfo, aArr.Count() ); - } - else - { - //We are only showing scripts not slot APIs so skip - //Root node and show location nodes - try { - if ( rootNode->hasChildNodes() ) - { - Sequence< Reference< browse::XBrowseNode > > children = - rootNode->getChildNodes(); - BOOL bIsRootNode = FALSE; - - ::rtl::OUString user = ::rtl::OUString::createFromAscii("user"); - ::rtl::OUString share = ::rtl::OUString::createFromAscii("share"); - if ( rootNode->getName().equals(::rtl::OUString::createFromAscii("Root") )) - { - bIsRootNode = TRUE; - } - - //To mimic current starbasic behaviour we - //need to make sure that only the current document - //is displayed in the config tree. Tests below - //set the bDisplay flag to FALSE if the current - //node is a first level child of the Root and is NOT - //either the current document, user or share - ::rtl::OUString currentDocTitle; - Reference< XModel > xDocument( lcl_getScriptableDocument_nothrow( m_xFrame ) ); - if ( xDocument.is() ) - { - currentDocTitle = ::comphelper::DocumentInfo::getDocumentTitle( xDocument ); - } - - for ( sal_Int32 n = 0; n < children.getLength(); n++ ) - { - Reference< browse::XBrowseNode >& theChild = children[n]; - BOOL bDisplay = TRUE; - ::rtl::OUString uiName = theChild->getName(); - if ( bIsRootNode ) - { - if ( ! ((theChild->getName().equals( user ) || theChild->getName().equals( share ) || - theChild->getName().equals( currentDocTitle ) ) ) ) - { - bDisplay=FALSE; - } - else - { - if ( uiName.equals( user ) ) - { - uiName = pImp->m_sMyMacros; - } - else if ( uiName.equals( share ) ) - { - uiName = pImp->m_sProdMacros; - } - } - } - if (children[n]->getType() != browse::BrowseNodeTypes::SCRIPT && bDisplay ) - { - -// We call acquire on the XBrowseNode so that it does not -// get autodestructed and become invalid when accessed later. - theChild->acquire(); - - SfxGroupInfo_Impl* pInfo = - new SfxGroupInfo_Impl(SFX_CFGGROUP_SCRIPTCONTAINER, - 0, static_cast<void *>( theChild.get())); - - Image aImage = GetImage( theChild, xCtx, bIsRootNode,BMP_COLOR_NORMAL ); - SvLBoxEntry* pNewEntry = - InsertEntry( uiName, NULL); - SetExpandedEntryBmp(pNewEntry, aImage, BMP_COLOR_NORMAL); - SetCollapsedEntryBmp(pNewEntry, aImage, BMP_COLOR_NORMAL); - aImage = GetImage( theChild, xCtx, bIsRootNode,BMP_COLOR_HIGHCONTRAST ); - SetExpandedEntryBmp(pNewEntry, aImage, BMP_COLOR_HIGHCONTRAST); - SetCollapsedEntryBmp(pNewEntry, aImage, BMP_COLOR_HIGHCONTRAST); - - pNewEntry->SetUserData( pInfo ); - aArr.Insert( pInfo, aArr.Count() ); - - if ( children[n]->hasChildNodes() ) - { - Sequence< Reference< browse::XBrowseNode > > grandchildren = - children[n]->getChildNodes(); - - for ( sal_Int32 m = 0; m < grandchildren.getLength(); m++ ) - { - if ( grandchildren[m]->getType() == browse::BrowseNodeTypes::CONTAINER ) - { - pNewEntry->EnableChildsOnDemand( TRUE ); - m = grandchildren.getLength(); - } - } - } - } - } - } - } - catch (RuntimeException&) { - // do nothing, the entry will not be displayed in the UI - } - } - } - } - - // add styles - if ( m_xSMGR.is() ) - { - String sStyle( pImp->m_aStrGroupStyles ); - SvLBoxEntry *pEntry = InsertEntry( sStyle, 0 ); - SfxGroupInfo_Impl *pInfo = new SfxGroupInfo_Impl( SFX_CFGGROUP_STYLES, 0, 0 ); // TODO last parameter should contain user data - aArr.Insert( pInfo, aArr.Count() ); - pEntry->SetUserData( pInfo ); - pEntry->EnableChildsOnDemand( TRUE ); - } - -/* { - String sSymbols( String::CreateFromAscii("Symbols") ); - SvLBoxEntry *pEntry = InsertEntry( sSymbols, 0 ); - SfxGroupInfo_Impl *pInfo = new SfxGroupInfo_Impl( SFX_CFGGROUP_SPECIALCHARACTERS, 0, 0 ); // TODO last parameter should contain user data - aArr.Insert( pInfo, aArr.Count() ); - pEntry->SetUserData( pInfo ); - } */ - - MakeVisible( GetEntry( 0,0 ) ); - SetUpdateMode( TRUE ); -} -Image SfxConfigGroupListBox_Impl::GetImage( Reference< browse::XBrowseNode > node, Reference< XComponentContext > xCtx, bool bIsRootNode, bool bHighContrast ) -{ - Image aImage; - if ( bIsRootNode ) - { - ::rtl::OUString user = ::rtl::OUString::createFromAscii("user"); - ::rtl::OUString share = ::rtl::OUString::createFromAscii("share"); - if (node->getName().equals( user ) || node->getName().equals(share ) ) - { - if( bHighContrast == BMP_COLOR_NORMAL ) - aImage = pImp->m_hdImage; - else - aImage = pImp->m_hdImage_hc; - } - else - { - ::rtl::OUString factoryURL; - ::rtl::OUString nodeName = node->getName(); - Reference<XInterface> xDocumentModel = getDocumentModel(xCtx, nodeName ); - if ( xDocumentModel.is() ) - { - Reference< ::com::sun::star::frame::XModuleManager > - xModuleManager( - xCtx->getServiceManager() - ->createInstanceWithContext( - ::rtl::OUString::createFromAscii("" // xxx todo - "com.sun.star.frame.ModuleManager"), - xCtx ), - UNO_QUERY_THROW ); - Reference<container::XNameAccess> xModuleConfig( - xModuleManager, UNO_QUERY_THROW ); - // get the long name of the document: - ::rtl::OUString appModule( xModuleManager->identify( - xDocumentModel ) ); - Sequence<beans::PropertyValue> moduleDescr; - Any aAny = xModuleConfig->getByName(appModule); - if( sal_True != ( aAny >>= moduleDescr ) ) - { - throw RuntimeException(::rtl::OUString::createFromAscii("SFTreeListBox::Init: failed to get PropertyValue"), Reference< XInterface >()); - } - beans::PropertyValue const * pmoduleDescr = - moduleDescr.getConstArray(); - for ( sal_Int32 pos = moduleDescr.getLength(); pos--; ) - { - if (pmoduleDescr[ pos ].Name.equalsAsciiL( - RTL_CONSTASCII_STRINGPARAM( - "ooSetupFactoryEmptyDocumentURL") )) - { - pmoduleDescr[ pos ].Value >>= factoryURL; - OSL_TRACE("factory url for doc images is %s", - ::rtl::OUStringToOString( factoryURL , RTL_TEXTENCODING_ASCII_US ).pData->buffer ); - break; - } - } - } - if( factoryURL.getLength() > 0 ) - { - if( bHighContrast == BMP_COLOR_NORMAL ) - aImage = SvFileInformationManager::GetFileImage( - INetURLObject(factoryURL), false, - BMP_COLOR_NORMAL ); - else - aImage = SvFileInformationManager::GetFileImage( - INetURLObject(factoryURL), false, - BMP_COLOR_HIGHCONTRAST ); - } - else - { - if( bHighContrast == BMP_COLOR_NORMAL ) - aImage = pImp->m_docImage; - else - aImage = pImp->m_docImage_hc; - } - } - } - else - { - if( node->getType() == browse::BrowseNodeTypes::SCRIPT ) - { - if( bHighContrast == BMP_COLOR_NORMAL ) - aImage = pImp->m_macImage; - else - aImage = pImp->m_macImage_hc; - } - else - { - if( bHighContrast == BMP_COLOR_NORMAL ) - aImage = pImp->m_libImage; - else - aImage = pImp->m_libImage_hc; - } - } - return aImage; -} - -Reference< XInterface > -SfxConfigGroupListBox_Impl::getDocumentModel( Reference< XComponentContext >& xCtx, ::rtl::OUString& docName ) -{ - Reference< XInterface > xModel; - Reference< lang::XMultiComponentFactory > mcf = - xCtx->getServiceManager(); - Reference< frame::XDesktop > desktop ( - mcf->createInstanceWithContext( - ::rtl::OUString::createFromAscii("com.sun.star.frame.Desktop"), xCtx ), - UNO_QUERY ); - - Reference< container::XEnumerationAccess > componentsAccess = - desktop->getComponents(); - Reference< container::XEnumeration > components = - componentsAccess->createEnumeration(); - while (components->hasMoreElements()) - { - Reference< frame::XModel > model( - components->nextElement(), UNO_QUERY ); - if ( model.is() ) - { - ::rtl::OUString sTdocUrl = - ::comphelper::DocumentInfo::getDocumentTitle( model ); - if( sTdocUrl.equals( docName ) ) - { - xModel = model; - break; - } - } - } - return xModel; -} - -::rtl::OUString SfxConfigGroupListBox_Impl::parseLocationName( const ::rtl::OUString& location ) -{ - // strip out the last leaf of location name - // e.g. file://dir1/dir2/Blah.sxw - > Blah.sxw - ::rtl::OUString temp = location; - sal_Int32 lastSlashIndex = temp.lastIndexOf( ::rtl::OUString::createFromAscii( "/" ) ); - - if ( ( lastSlashIndex + 1 ) < temp.getLength() ) - { - temp = temp.copy( lastSlashIndex + 1 ); - } - // maybe we should throw here!!! - else - { - OSL_TRACE("Something wrong with name, perhaps we should throw an exception"); - } - return temp; -} - -//----------------------------------------------- -::rtl::OUString SfxConfigGroupListBox_Impl::MapCommand2UIName(const ::rtl::OUString& sCommand) -{ - ::rtl::OUString sUIName; - try - { - css::uno::Reference< css::container::XNameAccess > xModuleConf; - m_xUICmdDescription->getByName(m_sModuleLongName) >>= xModuleConf; - if (xModuleConf.is()) - { - ::comphelper::SequenceAsHashMap lProps(xModuleConf->getByName(sCommand)); - sUIName = lProps.getUnpackedValueOrDefault(::rtl::OUString::createFromAscii("Name"), ::rtl::OUString()); - } - } - catch(const css::uno::RuntimeException& exRun) - { throw exRun; } - catch(css::uno::Exception&) - { sUIName = ::rtl::OUString(); } - - // fallback for missing UINames !? - if (!sUIName.getLength()) - { - sUIName = sCommand; - /* - #if OSL_DEBUG_LEVEL > 1 - ::rtl::OUStringBuffer sMsg(256); - sMsg.appendAscii("There is no UIName for the internal command \""); - sMsg.append (sCommand ); - sMsg.appendAscii("\". The UI will be invalid then ..." ); - OSL_ENSURE(sal_False, ::rtl::OUStringToOString(sMsg.makeStringAndClear(), RTL_TEXTENCODING_UTF8).getStr()); - #endif - */ - } - - return sUIName; -} - -//----------------------------------------------- -void SfxConfigGroupListBox_Impl::GroupSelected() -/* Beschreibung - Eine Funktionsgruppe oder eine Basicmodul wurde selektiert. Alle Funktionen bzw. - Macros werden in der Functionlistbox anzeigt. -*/ -{ - SvLBoxEntry *pEntry = FirstSelected(); - SfxGroupInfo_Impl *pInfo = (SfxGroupInfo_Impl*) pEntry->GetUserData(); - pFunctionListBox->SetUpdateMode(FALSE); - pFunctionListBox->ClearAll(); - if ( pInfo->nKind != SFX_CFGGROUP_FUNCTION && - pInfo->nKind != SFX_CFGGROUP_BASICMOD && - pInfo->nKind != SFX_CFGGROUP_SCRIPTCONTAINER && - pInfo->nKind != SFX_CFGGROUP_STYLES ) - { - pFunctionListBox->SetUpdateMode(TRUE); - return; - } - - switch ( pInfo->nKind ) - { - case SFX_CFGGROUP_FUNCTION : - { - USHORT nGroup = pInfo->nOrd; - css::uno::Reference< css::frame::XDispatchInformationProvider > xProvider (m_xFrame, css::uno::UNO_QUERY_THROW); - css::uno::Sequence< css::frame::DispatchInformation > lCommands = xProvider->getConfigurableDispatchInformation(nGroup); - sal_Int32 c = lCommands.getLength(); - sal_Int32 i = 0; - - for (i=0; i<c; ++i) - { - const css::frame::DispatchInformation& rInfo = lCommands[i]; - ::rtl::OUString sUIName = MapCommand2UIName(rInfo.Command); - SvLBoxEntry* pFuncEntry = pFunctionListBox->InsertEntry(sUIName, NULL); - SfxGroupInfo_Impl* pGrpInfo = new SfxGroupInfo_Impl(SFX_CFGFUNCTION_SLOT, 0); - pGrpInfo->sCommand = rInfo.Command; - pGrpInfo->sLabel = sUIName; - pFuncEntry->SetUserData(pGrpInfo); - } - - break; - } - - case SFX_CFGGROUP_BASICMOD : - { - SvLBoxEntry *pLibEntry = GetParent( pEntry ); - SfxGroupInfo_Impl *pLibInfo = - (SfxGroupInfo_Impl*) pLibEntry->GetUserData(); - SvLBoxEntry *pBasEntry = GetParent( pLibEntry ); - SfxGroupInfo_Impl *pBasInfo = - (SfxGroupInfo_Impl*) pBasEntry->GetUserData(); - - StarBASIC *pLib = (StarBASIC*) pLibInfo->pObject; - Reference< XModel > xDoc; - if ( pBasInfo->nKind == SFX_CFGGROUP_DOCBASICMGR ) - xDoc = static_cast< XModel* >( pBasInfo->pObject ); - - SbModule *pMod = (SbModule*) pInfo->pObject; - for ( USHORT nMeth=0; nMeth < pMod->GetMethods()->Count(); nMeth++ ) - { - SbxMethod *pMeth = (SbxMethod*)pMod->GetMethods()->Get(nMeth); - SfxMacroInfoPtr pInf = new SfxMacroInfo( !xDoc.is(), - pLib->GetName(), - pMod->GetName(), - pMeth->GetName()); - if ( pMeth->GetInfo() ) - pInf->SetHelpText( pMeth->GetInfo()->GetComment() ); - USHORT nId = SFX_APP()->GetMacroConfig()->GetSlotId( pInf ); - if ( !nId ) - break; // Kein Slot mehr frei - - SvLBoxEntry* pFuncEntry = - pFunctionListBox->InsertEntry( pMeth->GetName(), NULL ); - SfxGroupInfo_Impl *pGrpInfo = - new SfxGroupInfo_Impl( SFX_CFGFUNCTION_MACRO, nId, pInf ); - pFunctionListBox->aArr.Insert( pGrpInfo, pFunctionListBox->aArr.Count() ); - pFuncEntry->SetUserData( pGrpInfo ); - } - - break; - } - - case SFX_CFGGROUP_SCRIPTCONTAINER: - { - if ( !GetChildCount( pEntry ) ) - { - Reference< browse::XBrowseNode > rootNode( - reinterpret_cast< browse::XBrowseNode* >( pInfo->pObject ) ) ; - - try { - if ( rootNode->hasChildNodes() ) - { - Sequence< Reference< browse::XBrowseNode > > children = - rootNode->getChildNodes(); - - for ( sal_Int32 n = 0; n < children.getLength(); n++ ) - { - if (children[n]->getType() == browse::BrowseNodeTypes::SCRIPT) - { - ::rtl::OUString uri; - - Reference < beans::XPropertySet >xPropSet( children[n], UNO_QUERY ); - if (!xPropSet.is()) - { - continue; - } - - Any value = - xPropSet->getPropertyValue( String::CreateFromAscii( "URI" ) ); - value >>= uri; - - SfxMacroInfo* aInfo = new SfxMacroInfo( (String)uri ); - aInfo->SetHelpText( uri ); - SFX_APP()->GetMacroConfig()->GetSlotId( aInfo ); - - SfxGroupInfo_Impl* pGrpInfo = - new SfxGroupInfo_Impl(SFX_CFGFUNCTION_SCRIPT, - aInfo->GetSlotId(), aInfo); - - Image aImage = GetImage( children[n], Reference< XComponentContext >(), sal_False, BMP_COLOR_NORMAL ); - SvLBoxEntry* pNewEntry = - pFunctionListBox->InsertEntry( children[n]->getName(), NULL ); - pFunctionListBox->SetExpandedEntryBmp(pNewEntry, aImage, BMP_COLOR_NORMAL); - pFunctionListBox->SetCollapsedEntryBmp(pNewEntry, aImage, BMP_COLOR_NORMAL); - aImage = GetImage( children[n], Reference< XComponentContext >(), sal_False, BMP_COLOR_HIGHCONTRAST ); - pFunctionListBox->SetExpandedEntryBmp(pNewEntry, aImage, BMP_COLOR_HIGHCONTRAST); - pFunctionListBox->SetCollapsedEntryBmp(pNewEntry, aImage, BMP_COLOR_HIGHCONTRAST); - - pGrpInfo->sCommand = uri; - pGrpInfo->sLabel = children[n]->getName(); - pNewEntry->SetUserData( pGrpInfo ); - - pFunctionListBox->aArr.Insert( - pGrpInfo, pFunctionListBox->aArr.Count() ); - - } - } - } - } - catch (RuntimeException&) { - // do nothing, the entry will not be displayed in the UI - } - } - break; - } - - case SFX_CFGGROUP_STYLES : - { - SfxStyleInfo_Impl* pFamily = (SfxStyleInfo_Impl*)(pInfo->pObject); - if (pFamily) - { - const ::std::vector< SfxStyleInfo_Impl > lStyles = pStylesInfo->getStyles(pFamily->sFamily); - ::std::vector< SfxStyleInfo_Impl >::const_iterator pIt; - for ( pIt = lStyles.begin(); - pIt != lStyles.end() ; - ++pIt ) - { - SfxStyleInfo_Impl* pStyle = new SfxStyleInfo_Impl(*pIt); - SvLBoxEntry* pFuncEntry = pFunctionListBox->InsertEntry( pStyle->sLabel, NULL ); - SfxGroupInfo_Impl *pGrpInfo = new SfxGroupInfo_Impl( SFX_CFGGROUP_STYLES, 0, pStyle ); - pFunctionListBox->aArr.Insert( pGrpInfo, pFunctionListBox->aArr.Count() ); - pGrpInfo->sCommand = pStyle->sCommand; - pGrpInfo->sLabel = pStyle->sLabel; - pFuncEntry->SetUserData( pGrpInfo ); - } - } - break; - } - - default: - return; - } - - if ( pFunctionListBox->GetEntryCount() ) - pFunctionListBox->Select( pFunctionListBox->GetEntry( 0, 0 ) ); - - pFunctionListBox->SetUpdateMode(TRUE); -} - -BOOL SfxConfigGroupListBox_Impl::Expand( SvLBoxEntry* pParent ) -{ - BOOL bRet = SvTreeListBox::Expand( pParent ); - if ( bRet ) - { - // Wieviele Entries k"onnen angezeigt werden ? - ULONG nEntries = GetOutputSizePixel().Height() / GetEntryHeight(); - - // Wieviele Kinder sollen angezeigt werden ? - ULONG nChildCount = GetVisibleChildCount( pParent ); - - // Passen alle Kinder und der parent gleichzeitig in die View ? - if ( nChildCount+1 > nEntries ) - { - // Wenn nicht, wenigstens parent ganz nach oben schieben - MakeVisible( pParent, TRUE ); - } - else - { - // An welcher relativen ViewPosition steht der aufzuklappende parent - SvLBoxEntry *pEntry = GetFirstEntryInView(); - ULONG nParentPos = 0; - while ( pEntry && pEntry != pParent ) - { - nParentPos++; - pEntry = GetNextEntryInView( pEntry ); - } - - // Ist unter dem parent noch genug Platz f"ur alle Kinder ? - if ( nParentPos + nChildCount + 1 > nEntries ) - ScrollOutputArea( (short)( nEntries - ( nParentPos + nChildCount + 1 ) ) ); - } - } - - return bRet; -} - -void SfxConfigGroupListBox_Impl::RequestingChilds( SvLBoxEntry *pEntry ) -/* Beschreibung - Ein Basic oder eine Bibliothek werden ge"offnet -*/ -{ - SfxGroupInfo_Impl *pInfo = (SfxGroupInfo_Impl*) pEntry->GetUserData(); - pInfo->bWasOpened = TRUE; - switch ( pInfo->nKind ) - { - case SFX_CFGGROUP_BASICMGR : - case SFX_CFGGROUP_DOCBASICMGR : - { - if ( !GetChildCount( pEntry ) ) - { - // Erstmaliges "Offnen - BasicManager* pMgr( GetBasicManager( *pEntry ) ); - - SvLBoxEntry *pLibEntry = 0; - for ( USHORT nLib=0; nLib<pMgr->GetLibCount(); nLib++) - { - StarBASIC* pLib = pMgr->GetLib( nLib ); - pLibEntry = InsertEntry( pMgr->GetLibName( nLib ), pEntry ); - SfxGroupInfo_Impl *pGrpInfo = new SfxGroupInfo_Impl( SFX_CFGGROUP_BASICLIB, nLib, pLib ); - aArr.Insert( pGrpInfo, aArr.Count() ); - pLibEntry->SetUserData( pGrpInfo ); - pLibEntry->EnableChildsOnDemand( TRUE ); - } - } - - break; - } - - case SFX_CFGGROUP_BASICLIB : - { - if ( !GetChildCount( pEntry ) ) - { - // Erstmaliges "Offnen - StarBASIC *pLib = (StarBASIC*) pInfo->pObject; - if ( !pLib ) - { - // Lib mu\s nachgeladen werden - SvLBoxEntry *pParent = GetParent( pEntry ); - BasicManager *pMgr( GetBasicManager( *pParent ) ); - - if ( pMgr->LoadLib( pInfo->nOrd ) ) - pInfo->pObject = pLib = pMgr->GetLib( pInfo->nOrd ); - else - break; - } - - SvLBoxEntry *pModEntry = 0; - for ( USHORT nMod=0; nMod<pLib->GetModules()->Count(); nMod++ ) - { - SbModule* pMod = (SbModule*)pLib->GetModules()->Get( nMod ); - - BOOL bIsStarScript = FALSE; //pMod->ISA( SbJScriptModule ); - BOOL bWantsStarScript = pImp->m_aScriptType.EqualsAscii("StarScript"); - if ( bIsStarScript != bWantsStarScript ) - continue; - pModEntry = InsertEntry( pMod->GetName(), pEntry ); - SfxGroupInfo_Impl *pGrpInfo = new SfxGroupInfo_Impl( SFX_CFGGROUP_BASICMOD, 0, pMod ); - aArr.Insert( pGrpInfo, aArr.Count() ); - pModEntry->SetUserData( pGrpInfo ); - } - } - - break; - } - - case SFX_CFGGROUP_SCRIPTCONTAINER: - { - if ( !GetChildCount( pEntry ) ) - { - Reference< browse::XBrowseNode > rootNode( - reinterpret_cast< browse::XBrowseNode* >( pInfo->pObject ) ) ; - - try { - if ( rootNode->hasChildNodes() ) - { - Sequence< Reference< browse::XBrowseNode > > children = - rootNode->getChildNodes(); - BOOL bIsRootNode = FALSE; - - ::rtl::OUString user = ::rtl::OUString::createFromAscii("user"); - ::rtl::OUString share = ::rtl::OUString::createFromAscii("share"); - if ( rootNode->getName().equals(::rtl::OUString::createFromAscii("Root") )) - { - bIsRootNode = TRUE; - } - - /* To mimic current starbasic behaviour we - need to make sure that only the current document - is displayed in the config tree. Tests below - set the bDisplay flag to FALSE if the current - node is a first level child of the Root and is NOT - either the current document, user or share */ - ::rtl::OUString currentDocTitle; - Reference< XModel > xDocument( lcl_getScriptableDocument_nothrow( m_xFrame ) ); - if ( xDocument.is() ) - { - currentDocTitle = ::comphelper::DocumentInfo::getDocumentTitle( xDocument ); - } - - sal_Int32 nLen = children.getLength(); - for ( sal_Int32 n = 0; n < nLen; n++ ) - { - Reference< browse::XBrowseNode >& theChild = children[n]; - ::rtl::OUString aName( theChild->getName() ); - BOOL bDisplay = TRUE; - if ( bIsRootNode ) - { - if ( !( (aName.equals(user) || aName.equals(share) || aName.equals(currentDocTitle) ) ) ) - bDisplay=FALSE; - } - if ( children[n].is() && children[n]->getType() != browse::BrowseNodeTypes::SCRIPT && bDisplay ) - { - - /* - We call acquire on the XBrowseNode so that it does not - get autodestructed and become invalid when accessed later. - */ - theChild->acquire(); - - SfxGroupInfo_Impl* pGrpInfo = - new SfxGroupInfo_Impl(SFX_CFGGROUP_SCRIPTCONTAINER, - 0, static_cast<void *>( theChild.get())); - - Image aImage = GetImage( theChild, Reference< XComponentContext >(), sal_False, BMP_COLOR_NORMAL ); - SvLBoxEntry* pNewEntry = - InsertEntry( theChild->getName(), pEntry ); - SetExpandedEntryBmp(pNewEntry, aImage, BMP_COLOR_NORMAL); - SetCollapsedEntryBmp(pNewEntry, aImage, BMP_COLOR_NORMAL); - aImage = GetImage( theChild, Reference< XComponentContext >(), sal_False, BMP_COLOR_HIGHCONTRAST ); - SetExpandedEntryBmp(pNewEntry, aImage, BMP_COLOR_HIGHCONTRAST); - SetCollapsedEntryBmp(pNewEntry, aImage, BMP_COLOR_HIGHCONTRAST); - - pNewEntry->SetUserData( pGrpInfo ); - aArr.Insert( pGrpInfo, aArr.Count() ); - - if ( children[n]->hasChildNodes() ) - { - Sequence< Reference< browse::XBrowseNode > > grandchildren = - children[n]->getChildNodes(); - - for ( sal_Int32 m = 0; m < grandchildren.getLength(); m++ ) - { - if ( grandchildren[m]->getType() == browse::BrowseNodeTypes::CONTAINER ) - { - pNewEntry->EnableChildsOnDemand( TRUE ); - m = grandchildren.getLength(); - } - } - } - } - } - } - } - catch (RuntimeException&) { - // do nothing, the entry will not be displayed in the UI - } - } - break; - } - - case SFX_CFGGROUP_STYLES: - { - if ( !GetChildCount( pEntry ) ) - { - const ::std::vector< SfxStyleInfo_Impl > lStyleFamilies = pStylesInfo->getStyleFamilies(); - ::std::vector< SfxStyleInfo_Impl >::const_iterator pIt; - for ( pIt = lStyleFamilies.begin(); - pIt != lStyleFamilies.end() ; - ++pIt ) - { - SfxStyleInfo_Impl* pFamily = new SfxStyleInfo_Impl(*pIt); - SvLBoxEntry* pStyleEntry = InsertEntry( pFamily->sLabel, pEntry ); - SfxGroupInfo_Impl *pGrpInfo = new SfxGroupInfo_Impl( SFX_CFGGROUP_STYLES, 0, pFamily ); - aArr.Insert( pGrpInfo, aArr.Count() ); - pStyleEntry->SetUserData( pGrpInfo ); - pStyleEntry->EnableChildsOnDemand( FALSE ); - } - } - break; - } - - default: - DBG_ERROR( "Falscher Gruppentyp!" ); - break; - } -} - -void SfxConfigGroupListBox_Impl::AddAndSelect( const SfxStringItem* , const SfxStringItem* ) -{ - /* - if ( pText ) - { - Select( GetEntry( GetEntryCount()-1) ); - SvLBoxEntry* pFuncEntry = pFunctionListBox->InsertEntry( pText->GetValue(), NULL ); - SfxGroupInfo_Impl *pGrpInfo = new SfxGroupInfo_Impl( SFX_CFGGROUP_SPECIALCHARACTERS, 0, 0 ); - String aCommand = String::CreateFromAscii(".uno:InsertSymbol?Symbols:string="); - aCommand += pText->GetValue(); - pFunctionListBox->aArr.Insert( pGrpInfo, pFunctionListBox->aArr.Count() ); - pGrpInfo->sCommand = aCommand; - pGrpInfo->sLabel = String::CreateFromAscii("Symbols: "); - pGrpInfo->sLabel += pText->GetValue(); - pFuncEntry->SetUserData( pGrpInfo ); - } - */ -} - -void SfxConfigGroupListBox_Impl::SelectMacro( const SfxMacroInfoItem *pItem ) -{ - SelectMacro( pItem->GetBasicManager()->GetName(), - pItem->GetQualifiedName() ); -} - -void SfxConfigGroupListBox_Impl::SelectMacro( const String& rBasic, - const String& rMacro ) -{ - String aBasicName( rBasic ); - aBasicName += ' '; - aBasicName += pImp->m_sMacros; - String aLib, aModule, aMethod; - USHORT nCount = rMacro.GetTokenCount('.'); - aMethod = rMacro.GetToken( nCount-1, '.' ); - if ( nCount > 2 ) - { - aLib = rMacro.GetToken( 0, '.' ); - aModule = rMacro.GetToken( nCount-2, '.' ); - } - - SvLBoxEntry *pEntry = FirstChild(0); - while ( pEntry ) - { - String aEntryBas = GetEntryText( pEntry ); - if ( aEntryBas == aBasicName ) - { - Expand( pEntry ); - SvLBoxEntry *pLib = FirstChild( pEntry ); - while ( pLib ) - { - String aEntryLib = GetEntryText( pLib ); - if ( aEntryLib == aLib ) - { - Expand( pLib ); - SvLBoxEntry *pMod = FirstChild( pLib ); - while ( pMod ) - { - String aEntryMod = GetEntryText( pMod ); - if ( aEntryMod == aModule ) - { - Expand( pMod ); - MakeVisible( pMod ); - Select( pMod ); - SvLBoxEntry *pMethod = pFunctionListBox->First(); - while ( pMethod ) - { - String aEntryMethod = GetEntryText( pMethod ); - if ( aEntryMethod == aMethod ) - { - pFunctionListBox->Select( pMethod ); - pFunctionListBox->MakeVisible( pMethod ); - return; - } - pMethod = pFunctionListBox->Next( pMethod ); - } - } - pMod = NextSibling( pMod ); - } - } - pLib = NextSibling( pLib ); - } - } - pEntry = NextSibling( pEntry ); - } -} |