diff options
Diffstat (limited to 'svx/source/cui/optpath.cxx')
-rw-r--r-- | svx/source/cui/optpath.cxx | 847 |
1 files changed, 847 insertions, 0 deletions
diff --git a/svx/source/cui/optpath.cxx b/svx/source/cui/optpath.cxx new file mode 100644 index 0000000000..54695490fa --- /dev/null +++ b/svx/source/cui/optpath.cxx @@ -0,0 +1,847 @@ +/************************************************************************* + * + * 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: optpath.cxx,v $ + * $Revision: 1.25 $ + * + * 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" + +#ifdef SVX_DLLIMPLEMENTATION +#undef SVX_DLLIMPLEMENTATION +#endif + +// include --------------------------------------------------------------- + +#include <svx/svxdlg.hxx> //CHINA001 +#include <tools/shl.hxx> +#include <vcl/msgbox.hxx> +#include <sfx2/filedlghelper.hxx> +#include <svtools/pickerhelper.hxx> +#include <svtools/aeitem.hxx> +#include <svtools/svtabbx.hxx> +#include <svtools/filedlg.hxx> +#include <tools/config.hxx> +#include <tools/urlobj.hxx> +#include <vcl/svapp.hxx> +#include <svtools/defaultoptions.hxx> +#include <unotools/localfilehelper.hxx> +#include <svtools/pathoptions.hxx> +#include <svtools/moduleoptions.hxx> + +#define _SVX_OPTPATH_CXX + +#include "optpath.hxx" +#include <svx/dialmgr.hxx> +//CHINA001 #include "multipat.hxx" +#include "optpath.hrc" +#include <svx/dialogs.hrc> +#include "helpid.hrc" +#include <comphelper/processfactory.hxx> +#include <com/sun/star/uno/Exception.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/beans/PropertyAttribute.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp> +#include <com/sun/star/ui/dialogs/XAsynchronousExecutableDialog.hpp> +#include "optHeaderTabListbox.hxx" +#include <readonlyimage.hxx> +#include <vcl/help.hxx> + +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::ui::dialogs; +using namespace ::com::sun::star::uno; +using namespace svx; + +// define ---------------------------------------------------------------- + +#define TAB_WIDTH1 80 +#define TAB_WIDTH_MIN 10 +#define TAB_WIDTH2 1000 +#define ITEMID_TYPE 1 +#define ITEMID_PATH 2 + +#define POSTFIX_INTERNAL String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "_internal" ) ) +#define POSTFIX_USER String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "_user" ) ) +#define POSTFIX_WRITABLE String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "_writable" ) ) +#define POSTFIX_READONLY String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "_readonly" ) ) +#define VAR_ONE String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "%1" ) ) + +// struct OptPath_Impl --------------------------------------------------- + +struct OptPath_Impl +{ + SvtDefaultOptions m_aDefOpt; + Image m_aLockImage; + Image m_aLockImageHC; + String m_sMultiPathDlg; + Reference< XPropertySet > m_xPathSettings; + + OptPath_Impl(const ResId& rLockRes, const ResId& rLockResHC) : + m_aLockImage(rLockRes), + m_aLockImageHC(rLockResHC){} +}; + +// struct PathUserData_Impl ---------------------------------------------- + +struct PathUserData_Impl +{ + USHORT nRealId; + SfxItemState eState; + String sUserPath; + String sWritablePath; + + PathUserData_Impl( USHORT nId ) : + nRealId( nId ), eState( SFX_ITEM_UNKNOWN ) {} +}; + +struct Handle2CfgNameMapping_Impl +{ + USHORT m_nHandle; + const char* m_pCfgName; +}; + +static Handle2CfgNameMapping_Impl __READONLY_DATA Hdl2CfgMap_Impl[] = +{ + { SvtPathOptions::PATH_AUTOCORRECT, "AutoCorrect" }, + { SvtPathOptions::PATH_AUTOTEXT, "AutoText" }, + { SvtPathOptions::PATH_BACKUP, "Backup" }, + { SvtPathOptions::PATH_GALLERY, "Gallery" }, + { SvtPathOptions::PATH_GRAPHIC, "Graphic" }, + { SvtPathOptions::PATH_TEMP, "Temp" }, + { SvtPathOptions::PATH_TEMPLATE, "Template" }, + { SvtPathOptions::PATH_WORK, "Work" }, +#if OSL_DEBUG_LEVEL > 1 + { SvtPathOptions::PATH_LINGUISTIC, "Linguistic" }, + { SvtPathOptions::PATH_DICTIONARY, "Dictionary" }, +#endif + { USHRT_MAX, NULL } +}; + +static String getCfgName_Impl( USHORT _nHandle ) +{ + String sCfgName; + USHORT nIndex = 0; + while ( Hdl2CfgMap_Impl[ nIndex ].m_nHandle != USHRT_MAX ) + { + if ( Hdl2CfgMap_Impl[ nIndex ].m_nHandle == _nHandle ) + { + // config name found + sCfgName = String::CreateFromAscii( Hdl2CfgMap_Impl[ nIndex ].m_pCfgName ); + break; + } + ++nIndex; + } + + return sCfgName; +} + +#define MULTIPATH_DELIMITER ';' + +String Convert_Impl( const String& rValue ) +{ + char cDelim = MULTIPATH_DELIMITER; + USHORT nCount = rValue.GetTokenCount( cDelim ); + String aReturn; + for ( USHORT i=0; i<nCount ; ++i ) + { + String aValue = rValue.GetToken( i, cDelim ); + INetURLObject aObj( aValue ); + if ( aObj.GetProtocol() == INET_PROT_FILE ) + aReturn += String(aObj.PathToFileName()); + else if ( ::utl::LocalFileHelper::IsFileContent( aValue ) ) + aReturn += String(aObj.GetURLPath( INetURLObject::DECODE_WITH_CHARSET )); + if ( i+1 < nCount) + aReturn += MULTIPATH_DELIMITER; + } + + return aReturn; +} + +// class SvxControlFocusHelper --------------------------------------------- + +long SvxControlFocusHelper::Notify( NotifyEvent& rNEvt ) +{ + long nRet = Control::Notify( rNEvt ); + + if ( m_pFocusCtrl && rNEvt.GetWindow() != m_pFocusCtrl && rNEvt.GetType() == EVENT_GETFOCUS ) + m_pFocusCtrl->GrabFocus(); + return nRet; +} + +// functions ------------------------------------------------------------- + +BOOL IsMultiPath_Impl( const USHORT nIndex ) +{ +#if OSL_DEBUG_LEVEL > 1 + return ( SvtPathOptions::PATH_AUTOCORRECT == nIndex || + SvtPathOptions::PATH_AUTOTEXT == nIndex || + SvtPathOptions::PATH_BASIC == nIndex || + SvtPathOptions::PATH_GALLERY == nIndex || + SvtPathOptions::PATH_TEMPLATE == nIndex ); +#else + return ( SvtPathOptions::PATH_AUTOCORRECT == nIndex || + SvtPathOptions::PATH_AUTOTEXT == nIndex || + SvtPathOptions::PATH_BASIC == nIndex || + SvtPathOptions::PATH_GALLERY == nIndex || + SvtPathOptions::PATH_TEMPLATE == nIndex || + SvtPathOptions::PATH_LINGUISTIC == nIndex || + SvtPathOptions::PATH_DICTIONARY == nIndex ); +#endif +} + +// class SvxPathTabPage -------------------------------------------------- + +SvxPathTabPage::SvxPathTabPage( Window* pParent, const SfxItemSet& rSet ) : + + SfxTabPage( pParent, SVX_RES( RID_SFXPAGE_PATH ), rSet ), + + aTypeText ( this, SVX_RES( FT_TYPE ) ), + aPathText ( this, SVX_RES( FT_PATH ) ), + aPathCtrl ( this, SVX_RES( LB_PATH ) ), + aStandardBtn ( this, SVX_RES( BTN_STANDARD ) ), + aPathBtn ( this, SVX_RES( BTN_PATH ) ), + aStdBox ( this, SVX_RES( GB_STD ) ), + + pHeaderBar ( NULL ), + pPathBox ( NULL ), + pImpl ( new OptPath_Impl( SVX_RES(IMG_LOCK), SVX_RES(IMG_LOCK_HC) ) ), + xDialogListener ( new ::svt::DialogClosedListener() ) + +{ + pImpl->m_sMultiPathDlg = String( SVX_RES( STR_MULTIPATHDLG ) ); + aStandardBtn.SetClickHdl( LINK( this, SvxPathTabPage, StandardHdl_Impl ) ); + Link aLink = LINK( this, SvxPathTabPage, PathHdl_Impl ); + aPathBtn.SetClickHdl( aLink ); + Size aBoxSize = aPathCtrl.GetOutputSizePixel(); + pHeaderBar = new HeaderBar( &aPathCtrl, WB_BUTTONSTYLE | WB_BOTTOMBORDER ); + pHeaderBar->SetPosSizePixel( Point( 0, 0 ), Size( aBoxSize.Width(), 16 ) ); + pHeaderBar->SetSelectHdl( LINK( this, SvxPathTabPage, HeaderSelect_Impl ) ); + pHeaderBar->SetEndDragHdl( LINK( this, SvxPathTabPage, HeaderEndDrag_Impl ) ); + Size aSz; + aSz.Width() = TAB_WIDTH1; + pHeaderBar->InsertItem( ITEMID_TYPE, aTypeText.GetText(), + LogicToPixel( aSz, MapMode( MAP_APPFONT ) ).Width(), + HIB_LEFT | HIB_VCENTER | HIB_CLICKABLE | HIB_UPARROW ); + aSz.Width() = TAB_WIDTH2; + pHeaderBar->InsertItem( ITEMID_PATH, aPathText.GetText(), + LogicToPixel( aSz, MapMode( MAP_APPFONT ) ).Width(), + HIB_LEFT | HIB_VCENTER ); + + static long nTabs[] = {3, 0, TAB_WIDTH1, TAB_WIDTH1 + TAB_WIDTH2 }; + Size aHeadSize = pHeaderBar->GetSizePixel(); + + WinBits nBits = WB_SORT | WB_HSCROLL | WB_CLIPCHILDREN | WB_TABSTOP; + pPathBox = new OptHeaderTabListBox( &aPathCtrl, nBits ); + aPathCtrl.SetFocusControl( pPathBox ); + pPathBox->SetWindowBits( nBits ); + pPathBox->SetDoubleClickHdl( aLink ); + pPathBox->SetSelectHdl( LINK( this, SvxPathTabPage, PathSelect_Impl ) ); + pPathBox->SetSelectionMode( MULTIPLE_SELECTION ); + pPathBox->SetPosSizePixel( Point( 0, aHeadSize.Height() ), + Size( aBoxSize.Width(), aBoxSize.Height() - aHeadSize.Height() ) ); + pPathBox->SetTabs( &nTabs[0], MAP_APPFONT ); + pPathBox->InitHeaderBar( pHeaderBar ); + pPathBox->SetHighlightRange(); + pPathBox->SetHelpId( HID_OPTPATH_CTL_PATH ); + pHeaderBar->SetHelpId( HID_OPTPATH_HEADERBAR ); + pPathBox->Show(); + pHeaderBar->Show(); + + FreeResource(); + + xDialogListener->SetDialogClosedLink( LINK( this, SvxPathTabPage, DialogClosedHdl ) ); +} + +// ----------------------------------------------------------------------- + +SvxPathTabPage::~SvxPathTabPage() +{ + // #110603# do not grab focus to a destroyed window !!! + aPathCtrl.SetFocusControl( NULL ); + + pHeaderBar->Hide(); + for ( USHORT i = 0; i < pPathBox->GetEntryCount(); ++i ) + delete (PathUserData_Impl*)pPathBox->GetEntry(i)->GetUserData(); + delete pPathBox; + delete pHeaderBar; + delete pImpl; +} + +// ----------------------------------------------------------------------- + +SfxTabPage* SvxPathTabPage::Create( Window* pParent, + const SfxItemSet& rAttrSet ) +{ + return ( new SvxPathTabPage( pParent, rAttrSet ) ); +} + +// ----------------------------------------------------------------------- + +BOOL SvxPathTabPage::FillItemSet( SfxItemSet& ) +{ + SvtPathOptions aPathOpt; + for ( USHORT i = 0; i < pPathBox->GetEntryCount(); ++i ) + { + PathUserData_Impl* pPathImpl = (PathUserData_Impl*)pPathBox->GetEntry(i)->GetUserData(); + USHORT nRealId = pPathImpl->nRealId; + if ( pPathImpl->eState == SFX_ITEM_SET ) + SetPathList( nRealId, pPathImpl->sUserPath, pPathImpl->sWritablePath ); + } + return TRUE; +} + +// ----------------------------------------------------------------------- + +void SvxPathTabPage::Reset( const SfxItemSet& ) +{ + pPathBox->Clear(); + SvtPathOptions aPathOpt; //! deprecated + + for( USHORT i = 0; i <= (USHORT)SvtPathOptions::PATH_WORK; ++i ) + { + // only writer uses autotext + if ( i == SvtPathOptions::PATH_AUTOTEXT + && !SvtModuleOptions().IsModuleInstalled( SvtModuleOptions::E_SWRITER ) ) + continue; + + switch (i) + { + case SvtPathOptions::PATH_AUTOCORRECT: + case SvtPathOptions::PATH_AUTOTEXT: + case SvtPathOptions::PATH_BACKUP: + case SvtPathOptions::PATH_GALLERY: + case SvtPathOptions::PATH_GRAPHIC: + case SvtPathOptions::PATH_TEMP: + case SvtPathOptions::PATH_TEMPLATE: +#if OSL_DEBUG_LEVEL > 1 + case SvtPathOptions::PATH_LINGUISTIC: + case SvtPathOptions::PATH_DICTIONARY: +#endif + case SvtPathOptions::PATH_WORK: + { + String aStr( SVX_RES( RID_SVXSTR_PATH_NAME_START + i ) ); + String sInternal, sUser, sWritable; + sal_Bool bReadOnly = sal_False; + GetPathList( i, sInternal, sUser, sWritable, bReadOnly ); + String sTmpPath = sUser; + if ( sTmpPath.Len() > 0 && sWritable.Len() > 0 ) + sTmpPath += MULTIPATH_DELIMITER; + sTmpPath += sWritable; + String aValue( sTmpPath ); + aStr += '\t'; + aStr += Convert_Impl( aValue ); + SvLBoxEntry* pEntry = pPathBox->InsertEntry( aStr ); + if ( bReadOnly ) + { + pPathBox->SetCollapsedEntryBmp( pEntry, pImpl->m_aLockImage, BMP_COLOR_NORMAL ); + pPathBox->SetCollapsedEntryBmp( pEntry, pImpl->m_aLockImageHC, BMP_COLOR_HIGHCONTRAST ); + } + PathUserData_Impl* pPathImpl = new PathUserData_Impl(i); + pPathImpl->sUserPath = sUser; + pPathImpl->sWritablePath = sWritable; + pEntry->SetUserData( pPathImpl ); + } + } + } + + String aUserData = GetUserData(); + if ( aUserData.Len() ) + { + // Spaltenbreite restaurieren + pHeaderBar->SetItemSize( ITEMID_TYPE, aUserData.GetToken(0).ToInt32() ); + HeaderEndDrag_Impl( NULL ); + // Sortierrichtung restaurieren + BOOL bUp = (BOOL)(USHORT)aUserData.GetToken(1).ToInt32(); + HeaderBarItemBits nBits = pHeaderBar->GetItemBits(ITEMID_TYPE); + + if ( bUp ) + { + nBits &= ~HIB_UPARROW; + nBits |= HIB_DOWNARROW; + } + else + { + nBits &= ~HIB_DOWNARROW; + nBits |= HIB_UPARROW; + } + pHeaderBar->SetItemBits( ITEMID_TYPE, nBits ); + HeaderSelect_Impl( NULL ); + } + PathSelect_Impl( NULL ); +} + +// ----------------------------------------------------------------------- + +void SvxPathTabPage::FillUserData() +{ + String aUserData = String::CreateFromInt32( pHeaderBar->GetItemSize( ITEMID_TYPE ) ); + aUserData += ';'; + HeaderBarItemBits nBits = pHeaderBar->GetItemBits( ITEMID_TYPE ); + BOOL bUp = ( ( nBits & HIB_UPARROW ) == HIB_UPARROW ); + aUserData += bUp ? '1' : '0'; + SetUserData( aUserData ); +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( SvxPathTabPage, PathSelect_Impl, OptHeaderTabListBox *, EMPTYARG ) + +/* [Beschreibung] + +*/ + +{ + USHORT nSelCount = 0; + SvLBoxEntry* pEntry = pPathBox->FirstSelected(); + + //the entry image indicates whether the path is write protected + Image aEntryImage; + if(pEntry) + aEntryImage = pPathBox->GetCollapsedEntryBmp( pEntry ); + BOOL bEnable = !aEntryImage; + while ( pEntry && ( nSelCount < 2 ) ) + { + nSelCount++; + pEntry = pPathBox->NextSelected( pEntry ); + } + + aPathBtn.Enable( 1 == nSelCount && bEnable); + aStandardBtn.Enable( nSelCount > 0 && bEnable); + return 0; +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( SvxPathTabPage, StandardHdl_Impl, PushButton *, EMPTYARG ) +{ + SvLBoxEntry* pEntry = pPathBox->FirstSelected(); + while ( pEntry ) + { + PathUserData_Impl* pPathImpl = (PathUserData_Impl*)pEntry->GetUserData(); + String aOldPath = pImpl->m_aDefOpt.GetDefaultPath( pPathImpl->nRealId ); + + if ( aOldPath.Len() ) + { + String sInternal, sUser, sWritable, sTemp; + sal_Bool bReadOnly = sal_False; + GetPathList( pPathImpl->nRealId, sInternal, sUser, sWritable, bReadOnly ); + + USHORT i; + USHORT nOldCount = aOldPath.GetTokenCount( MULTIPATH_DELIMITER ); + USHORT nIntCount = sInternal.GetTokenCount( MULTIPATH_DELIMITER ); + for ( i = 0; i < nOldCount; ++i ) + { + bool bFound = false; + String sOnePath = aOldPath.GetToken( i, MULTIPATH_DELIMITER ); + for ( USHORT j = 0; !bFound && j < nIntCount; ++j ) + { + if ( sInternal.GetToken( i, MULTIPATH_DELIMITER ) == sOnePath ) + bFound = true; + } + if ( !bFound ) + { + if ( sTemp.Len() > 0 ) + sTemp += MULTIPATH_DELIMITER; + sTemp += sOnePath; + } + } + + String sUserPath, sWritablePath; + nOldCount = sTemp.GetTokenCount( MULTIPATH_DELIMITER ); + for ( i = 0; nOldCount > 0 && i < nOldCount - 1; ++i ) + { + if ( sUserPath.Len() > 0 ) + sUserPath += MULTIPATH_DELIMITER; + sUserPath += sTemp.GetToken( i, MULTIPATH_DELIMITER ); + } + sWritablePath = sTemp.GetToken( nOldCount - 1, MULTIPATH_DELIMITER ); + + pPathBox->SetEntryText( Convert_Impl( sTemp ), pEntry, 1 ); + pPathImpl->eState = SFX_ITEM_SET; + pPathImpl->sUserPath = sUserPath; + pPathImpl->sWritablePath = sWritablePath; + } + pEntry = pPathBox->NextSelected( pEntry ); + } + return 0; +} + +// ----------------------------------------------------------------------- + +void SvxPathTabPage::ChangeCurrentEntry( const String& _rFolder ) +{ + SvLBoxEntry* pEntry = pPathBox->GetCurEntry(); + if ( !pEntry ) + { + DBG_ERRORFILE( "SvxPathTabPage::ChangeCurrentEntry(): no entry" ); + return; + } + + String sInternal, sUser, sWritable; + PathUserData_Impl* pPathImpl = (PathUserData_Impl*)pEntry->GetUserData(); + sal_Bool bReadOnly = sal_False; + GetPathList( pPathImpl->nRealId, sInternal, sUser, sWritable, bReadOnly ); + sUser = pPathImpl->sUserPath; + sWritable = pPathImpl->sWritablePath; + USHORT nPos = pPathImpl->nRealId; + + // old path is an URL? + INetURLObject aObj( sWritable ); + FASTBOOL bURL = ( aObj.GetProtocol() != INET_PROT_NOT_VALID ); + rtl::OUString aPathStr( _rFolder ); + INetURLObject aNewObj( aPathStr ); + aNewObj.removeFinalSlash(); + + // then the new path also an URL else system path + String sNewPathStr = bURL ? aPathStr : aNewObj.getFSysPath( INetURLObject::FSYS_DETECT ); + + FASTBOOL bChanged = +#ifdef UNX +// Unix is case sensitive + ( sNewPathStr != sWritable ); +#else + ( sNewPathStr.CompareIgnoreCaseToAscii( sWritable ) != COMPARE_EQUAL ); +#endif + + if ( bChanged ) + { + pPathBox->SetEntryText( Convert_Impl( sNewPathStr ), pEntry, 1 ); + nPos = (USHORT)pPathBox->GetModel()->GetAbsPos( pEntry ); + pPathImpl = (PathUserData_Impl*)pPathBox->GetEntry(nPos)->GetUserData(); + pPathImpl->eState = SFX_ITEM_SET; + pPathImpl->sWritablePath = sNewPathStr; + } +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( SvxPathTabPage, PathHdl_Impl, PushButton *, EMPTYARG ) +{ + SvLBoxEntry* pEntry = pPathBox->GetCurEntry(); + USHORT nPos = ( pEntry != NULL ) ? ( (PathUserData_Impl*)pEntry->GetUserData() )->nRealId : 0; + String sInternal, sUser, sWritable; + if ( pEntry ) + { + PathUserData_Impl* pPathImpl = (PathUserData_Impl*)pEntry->GetUserData(); + sal_Bool bReadOnly = sal_False; + GetPathList( pPathImpl->nRealId, sInternal, sUser, sWritable, bReadOnly ); + sUser = pPathImpl->sUserPath; + sWritable = pPathImpl->sWritablePath; + } + + if(pEntry && !(!((OptHeaderTabListBox*)pPathBox)->GetCollapsedEntryBmp(pEntry))) + return 0; + + if ( IsMultiPath_Impl( nPos ) ) + { + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + if ( pFact ) + { + AbstractSvxMultiPathDialog* pMultiDlg = + pFact->CreateSvxMultiPathDialog( this, RID_SVXDLG_MULTIPATH ); + DBG_ASSERT( pMultiDlg, "Dialogdiet fail!" ); + pMultiDlg->EnableRadioButtonMode(); + + String sPath( sUser ); + if ( sPath.Len() > 0 ) + sPath += MULTIPATH_DELIMITER; + sPath += sWritable; + pMultiDlg->SetPath( sPath ); + + String sPathName = pPathBox->GetEntryText( pEntry, 0 ); + String sNewTitle( pImpl->m_sMultiPathDlg ); + sNewTitle.SearchAndReplace( VAR_ONE, sPathName ); + pMultiDlg->SetTitle( sNewTitle ); + + if ( pMultiDlg->Execute() == RET_OK && pEntry ) + { + sUser.Erase(); + sWritable.Erase(); + String sFullPath; + String sNewPath = pMultiDlg->GetPath(); + char cDelim = MULTIPATH_DELIMITER; + USHORT nCount = sNewPath.GetTokenCount( cDelim ); + if ( nCount > 0 ) + { + USHORT i = 0; + for ( ; i < nCount - 1; ++i ) + { + if ( sUser.Len() > 0 ) + sUser += cDelim; + sUser += sNewPath.GetToken( i, cDelim ); + } + if ( sFullPath.Len() > 0 ) + sFullPath += cDelim; + sFullPath += sUser; + sWritable += sNewPath.GetToken( i, cDelim ); + if ( sFullPath.Len() > 0 ) + sFullPath += cDelim; + sFullPath += sWritable; + } + + pPathBox->SetEntryText( Convert_Impl( sFullPath ), pEntry, 1 ); + // save modified flag + PathUserData_Impl* pPathImpl = (PathUserData_Impl*)pEntry->GetUserData(); + pPathImpl->eState = SFX_ITEM_SET; + pPathImpl->sUserPath = sUser; + pPathImpl->sWritablePath = sWritable; + } + delete pMultiDlg; + } + } + else if ( pEntry ) + { + try + { + rtl::OUString aService( RTL_CONSTASCII_USTRINGPARAM( FOLDER_PICKER_SERVICE_NAME ) ); + Reference < XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() ); + xFolderPicker = ::com::sun::star::uno::Reference< XFolderPicker >( + xFactory->createInstance( aService ), UNO_QUERY ); + +// svt::SetDialogHelpId( xFolderPicker, HID_OPTIONS_PATHS_SELECTFOLDER ); + + INetURLObject aURL( sWritable, INET_PROT_FILE ); + xFolderPicker->setDisplayDirectory( aURL.GetMainURL( INetURLObject::NO_DECODE ) ); + + Reference< XAsynchronousExecutableDialog > xAsyncDlg( xFolderPicker, UNO_QUERY ); + if ( xAsyncDlg.is() ) + xAsyncDlg->startExecuteModal( xDialogListener.get() ); + else + { + short nRet = xFolderPicker->execute(); + if ( ExecutableDialogResults::OK != nRet ) + return 0; + + String sFolder( xFolderPicker->getDirectory() ); + ChangeCurrentEntry( sFolder ); + } + } + catch( Exception& ) + { + DBG_ERRORFILE( "SvxPathTabPage::PathHdl_Impl: exception from folder picker" ); + } + } + return 0; +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( SvxPathTabPage, HeaderSelect_Impl, HeaderBar*, pBar ) +{ + if ( pBar && pBar->GetCurItemId() != ITEMID_TYPE ) + return 0; + + HeaderBarItemBits nBits = pHeaderBar->GetItemBits(ITEMID_TYPE); + BOOL bUp = ( ( nBits & HIB_UPARROW ) == HIB_UPARROW ); + SvSortMode eMode = SortAscending; + + if ( bUp ) + { + nBits &= ~HIB_UPARROW; + nBits |= HIB_DOWNARROW; + eMode = SortDescending; + } + else + { + nBits &= ~HIB_DOWNARROW; + nBits |= HIB_UPARROW; + } + pHeaderBar->SetItemBits( ITEMID_TYPE, nBits ); + SvTreeList* pModel = pPathBox->GetModel(); + pModel->SetSortMode( eMode ); + pModel->Resort(); + return 1; +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( SvxPathTabPage, HeaderEndDrag_Impl, HeaderBar*, pBar ) +{ + if ( pBar && !pBar->GetCurItemId() ) + return 0; + + if ( !pHeaderBar->IsItemMode() ) + { + Size aSz; + USHORT nTabs = pHeaderBar->GetItemCount(); + long nTmpSz = 0; + long nWidth = pHeaderBar->GetItemSize(ITEMID_TYPE); + long nBarWidth = pHeaderBar->GetSizePixel().Width(); + + if(nWidth < TAB_WIDTH_MIN) + pHeaderBar->SetItemSize( ITEMID_TYPE, TAB_WIDTH_MIN); + else if ( ( nBarWidth - nWidth ) < TAB_WIDTH_MIN ) + pHeaderBar->SetItemSize( ITEMID_TYPE, nBarWidth - TAB_WIDTH_MIN ); + + for ( USHORT i = 1; i <= nTabs; ++i ) + { + long _nWidth = pHeaderBar->GetItemSize(i); + aSz.Width() = _nWidth + nTmpSz; + nTmpSz += _nWidth; + pPathBox->SetTab( i, PixelToLogic( aSz, MapMode(MAP_APPFONT) ).Width(), MAP_APPFONT ); + } + } + return 1; +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( SvxPathTabPage, DialogClosedHdl, DialogClosedEvent*, pEvt ) +{ + if ( RET_OK == pEvt->DialogResult ) + { + DBG_ASSERT( xFolderPicker.is() == sal_True, "SvxPathTabPage::DialogClosedHdl(): no folder picker" ); + + String sURL = String( xFolderPicker->getDirectory() ); + ChangeCurrentEntry( sURL ); + } + return 0L; +} + +// ----------------------------------------------------------------------- + +void SvxPathTabPage::GetPathList( + USHORT _nPathHandle, String& _rInternalPath, + String& _rUserPath, String& _rWritablePath, sal_Bool& _rReadOnly ) +{ + String sCfgName = getCfgName_Impl( _nPathHandle ); + + // load PathSettings service if necessary + if ( !pImpl->m_xPathSettings.is() ) + { + Reference< XMultiServiceFactory > xSMgr = comphelper::getProcessServiceFactory(); + pImpl->m_xPathSettings = Reference< XPropertySet >( xSMgr->createInstance( + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( + "com.sun.star.util.PathSettings") ) ), UNO_QUERY ); + } + + try + { + if ( pImpl->m_xPathSettings.is() ) + { + // load internal paths + String sProp( sCfgName ); + sProp = sCfgName; + sProp += POSTFIX_INTERNAL; + Any aAny = pImpl->m_xPathSettings->getPropertyValue( sProp ); + Sequence< ::rtl::OUString > aPathSeq; + if ( aAny >>= aPathSeq ) + { + long i, nCount = aPathSeq.getLength(); + const ::rtl::OUString* pPaths = aPathSeq.getConstArray(); + + for ( i = 0; i < nCount; ++i ) + { + if ( _rInternalPath.Len() > 0 ) + _rInternalPath += ';'; + _rInternalPath += String( pPaths[i] ); + } + } + // load user paths + sProp = sCfgName; + sProp += POSTFIX_USER; + aAny = pImpl->m_xPathSettings->getPropertyValue( sProp ); + if ( aAny >>= aPathSeq ) + { + long i, nCount = aPathSeq.getLength(); + const ::rtl::OUString* pPaths = aPathSeq.getConstArray(); + + for ( i = 0; i < nCount; ++i ) + { + if ( _rUserPath.Len() > 0 ) + _rUserPath += ';'; + _rUserPath += String( pPaths[i] ); + } + } + // then the writable path + sProp = sCfgName; + sProp += POSTFIX_WRITABLE; + aAny = pImpl->m_xPathSettings->getPropertyValue( sProp ); + ::rtl::OUString sWritablePath; + if ( aAny >>= sWritablePath ) + _rWritablePath = String( sWritablePath ); + + // and the readonly flag + sProp = sCfgName; + Reference< XPropertySetInfo > xInfo = pImpl->m_xPathSettings->getPropertySetInfo(); + Property aProp = xInfo->getPropertyByName( sProp ); + _rReadOnly = ( ( aProp.Attributes & PropertyAttribute::READONLY ) == PropertyAttribute::READONLY ); + } + } + catch( const Exception& ) + { + OSL_ENSURE( sal_False, "SvxPathTabPage::GetPathList(): caught an exception!" ); + } +} + +// ----------------------------------------------------------------------- + +void SvxPathTabPage::SetPathList( + USHORT _nPathHandle, const String& _rUserPath, const String& _rWritablePath ) +{ + String sCfgName = getCfgName_Impl( _nPathHandle ); + + // load PathSettings service if necessary + if ( !pImpl->m_xPathSettings.is() ) + { + Reference< XMultiServiceFactory > xSMgr = comphelper::getProcessServiceFactory(); + pImpl->m_xPathSettings = Reference< XPropertySet >( xSMgr->createInstance( + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( + "com.sun.star.util.PathSettings") ) ), UNO_QUERY ); + } + + try + { + if ( pImpl->m_xPathSettings.is() ) + { + // save user paths + char cDelim = MULTIPATH_DELIMITER; + USHORT nCount = _rUserPath.GetTokenCount( cDelim ); + Sequence< ::rtl::OUString > aPathSeq( nCount ); + ::rtl::OUString* pArray = aPathSeq.getArray(); + for ( USHORT i = 0; i < nCount; ++i ) + pArray[i] = ::rtl::OUString( _rUserPath.GetToken( i, cDelim ) ); + String sProp( sCfgName ); + sProp += POSTFIX_USER; + Any aValue = makeAny( aPathSeq ); + pImpl->m_xPathSettings->setPropertyValue( sProp, aValue ); + + // then the writable path + aValue = makeAny( ::rtl::OUString( _rWritablePath ) ); + sProp = sCfgName; + sProp += POSTFIX_WRITABLE; + pImpl->m_xPathSettings->setPropertyValue( sProp, aValue ); + } + } + catch( const Exception& ) + { + OSL_ENSURE( sal_False, "SvxPathTabPage::SetPathList(): caught an exception!" ); + } +} + |