blob: 92867dcb3f229b2effe105f3a1b11f94b984e379 [file] [log] [blame]
/**************************************************************
*
* 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_cui.hxx"
#include <linkdlg.hxx>
#include <vcl/svapp.hxx>
#include "helpid.hrc"
#include <tools/urlobj.hxx>
#include <svtools/svmedit.hxx>
#include <svtools/filedlg.hxx>
#include <vcl/dialog.hxx>
#include <vcl/button.hxx>
#include <vcl/fixed.hxx>
#include <vcl/group.hxx>
#include <vcl/lstbox.hxx>
#include <vcl/msgbox.hxx>
#include <vcl/timer.hxx>
#include <svtools/svtabbx.hxx>
#include <svuidlg.hrc>
#include <sfx2/linkmgr.hxx>
#include <sfx2/linksrc.hxx>
#include <svtools/soerr.hxx>
#include <sfx2/lnkbase.hxx>
#include <sfx2/objsh.hxx>
#include <dialmgr.hxx>
#define _SVSTDARR_USHORTS
#include <svl/svstdarr.hxx>
#define MAX_FILENAME 18
#define MAX_LINKNAME 18
#define MAX_TYPENAME 15
#define MAX_UPDATENAME 10
#define FILEOBJECT ( OBJECT_CLIENT_FILE & ~OBJECT_CLIENT_SO )
using namespace sfx2;
SV_DECL_IMPL_REF_LIST(SvBaseLink,SvBaseLink*)
// Achtung im Code wird dieses Array direkt (0, 1, ...) indiziert
static long nTabs[] =
{ 4, // Number of Tabs
0, 77, 144, 209
};
SvBaseLinksDlg::SvBaseLinksDlg( Window * pParent, LinkManager* pMgr, sal_Bool bHtml )
: ModalDialog( pParent, CUI_RES( MD_UPDATE_BASELINKS ) ),
aFtFiles( this, CUI_RES( FT_FILES ) ),
aFtLinks( this, CUI_RES( FT_LINKS ) ),
aFtType( this, CUI_RES( FT_TYPE ) ),
aFtStatus( this, CUI_RES( FT_STATUS ) ),
aTbLinks( this, CUI_RES(TB_LINKS ) ),
aFtFiles2( this, CUI_RES( FT_FILES2 ) ),
aFtFullFileName( this, CUI_RES( FT_FULL_FILE_NAME ) ),
aFtSource2( this, CUI_RES( FT_SOURCE2 ) ),
aFtFullSourceName( this, CUI_RES( FT_FULL_SOURCE_NAME ) ),
aFtType2( this, CUI_RES( FT_TYPE2 ) ),
aFtFullTypeName( this, CUI_RES( FT_FULL_TYPE_NAME ) ),
aFtUpdate( this, CUI_RES( FT_UPDATE ) ),
aRbAutomatic( this, CUI_RES( RB_AUTOMATIC ) ),
aRbManual( this, CUI_RES( RB_MANUAL ) ),
aCancelButton1( this, CUI_RES( 1 ) ),
aHelpButton1( this, CUI_RES( 1 ) ),
aPbUpdateNow( this, CUI_RES( PB_UPDATE_NOW ) ),
aPbOpenSource( this, CUI_RES( PB_OPEN_SOURCE ) ),
aPbChangeSource( this, CUI_RES( PB_CHANGE_SOURCE ) ),
aPbBreakLink( this, CUI_RES( PB_BREAK_LINK ) ),
aStrAutolink( CUI_RES( STR_AUTOLINK ) ),
aStrManuallink( CUI_RES( STR_MANUALLINK ) ),
aStrBrokenlink( CUI_RES( STR_BROKENLINK ) ),
aStrGraphiclink( CUI_RES( STR_GRAPHICLINK ) ),
aStrButtonclose( CUI_RES( STR_BUTTONCLOSE ) ),
aStrCloselinkmsg( CUI_RES( STR_CLOSELINKMSG ) ),
aStrCloselinkmsgMulti( CUI_RES( STR_CLOSELINKMSG_MULTI ) ),
aStrWaitinglink( CUI_RES( STR_WAITINGLINK ) ),
pLinkMgr( NULL ),
bHtmlMode(bHtml)
{
FreeResource();
aTbLinks.SetHelpId(HID_LINKDLG_TABLB);
aTbLinks.SetSelectionMode( MULTIPLE_SELECTION );
aTbLinks.SetTabs( &nTabs[0], MAP_APPFONT );
aTbLinks.Resize(); // OS: Hack fuer richtige Selektion
//JP 24.02.99: UpdateTimer fuer DDE-/Grf-Links, auf die gewarted wird
aUpdateTimer.SetTimeoutHdl( LINK( this, SvBaseLinksDlg, UpdateWaitingHdl ) );
aUpdateTimer.SetTimeout( 1000 );
// Set the ZOrder, and accessible name to the dialog's title
aTbLinks.SetZOrder(0, WINDOW_ZORDER_FIRST);
aTbLinks.SetAccessibleName(this->GetText());
aTbLinks.SetAccessibleRelationLabeledBy(&aFtFiles);
OpenSource().Hide();
Links().SetSelectHdl( LINK( this, SvBaseLinksDlg, LinksSelectHdl ) );
Links().SetDoubleClickHdl( LINK( this, SvBaseLinksDlg, LinksDoubleClickHdl ) );
Automatic().SetClickHdl( LINK( this, SvBaseLinksDlg, AutomaticClickHdl ) );
Manual().SetClickHdl( LINK( this, SvBaseLinksDlg, ManualClickHdl ) );
UpdateNow().SetClickHdl( LINK( this, SvBaseLinksDlg, UpdateNowClickHdl ) );
// OpenSource().SetClickHdl( LINK( this, SvBaseLinksDlg, OpenSourceClickHdl ) );
ChangeSource().SetClickHdl( LINK( this, SvBaseLinksDlg, ChangeSourceClickHdl ) );
if(!bHtmlMode)
BreakLink().SetClickHdl( LINK( this, SvBaseLinksDlg, BreakLinkClickHdl ) );
else
BreakLink().Hide();
SetManager( pMgr );
}
SvBaseLinksDlg::~SvBaseLinksDlg()
{
}
/*************************************************************************
|* SvBaseLinksDlg::Handler()
|*
|* Beschreibung
|* Ersterstellung MM 14.06.94
|* Letzte Aenderung JP 30.05.95
*************************************************************************/
IMPL_LINK( SvBaseLinksDlg, LinksSelectHdl, SvTabListBox *, pSvTabListBox )
{
sal_uInt16 nSelectionCount = pSvTabListBox ?
(sal_uInt16)pSvTabListBox->GetSelectionCount() : 0;
if(nSelectionCount > 1)
{
//bei Mehrfachselektion ggf. alte Eintraege deselektieren
SvLBoxEntry* pEntry = 0;
SvBaseLink* pLink = 0;
pEntry = pSvTabListBox->GetHdlEntry();
pLink = (SvBaseLink*)pEntry->GetUserData();
sal_uInt16 nObjectType = pLink->GetObjType();
if((OBJECT_CLIENT_FILE & nObjectType) != OBJECT_CLIENT_FILE)
{
pSvTabListBox->SelectAll(sal_False);
pSvTabListBox->Select(pEntry);
nSelectionCount = 1;
}
else
{
for( sal_uInt16 i = 0; i < nSelectionCount; i++)
{
pEntry = i == 0 ? pSvTabListBox->FirstSelected() :
pSvTabListBox->NextSelected(pEntry);
DBG_ASSERT(pEntry, "Wo ist der Entry?");
pLink = (SvBaseLink*)pEntry->GetUserData();
DBG_ASSERT(pLink, "Wo ist der Link?");
if( (OBJECT_CLIENT_FILE & pLink->GetObjType()) != OBJECT_CLIENT_FILE )
pSvTabListBox->Select( pEntry, sal_False );
}
}
UpdateNow().Enable();
Automatic().Disable();
Manual().Check();
Manual().Disable();
}
else
{
sal_uInt16 nPos;
SvBaseLink* pLink = GetSelEntry( &nPos );
if( !pLink )
return 0;
UpdateNow().Enable();
String sType, sLink;
String *pLinkNm = &sLink, *pFilter = 0;
if( FILEOBJECT & pLink->GetObjType() )
{
Automatic().Disable();
Manual().Check();
Manual().Disable();
if( OBJECT_CLIENT_GRF == pLink->GetObjType() )
pLinkNm = 0, pFilter = &sLink;
}
else
{
Automatic().Enable();
Manual().Enable();
if( LINKUPDATE_ALWAYS == pLink->GetUpdateMode() )
Automatic().Check();
else
Manual().Check();
}
String aFileName;
pLinkMgr->GetDisplayNames( pLink, &sType, &aFileName, pLinkNm, pFilter );
aFileName = INetURLObject::decode(aFileName, INET_HEX_ESCAPE, INetURLObject::DECODE_UNAMBIGUOUS);
FileName().SetText( aFileName );
SourceName().SetText( sLink );
TypeName().SetText( sType );
}
return 0;
}
IMPL_LINK_INLINE_START( SvBaseLinksDlg, LinksDoubleClickHdl, SvTabListBox *, pSvTabListBox )
{
(void)pSvTabListBox;
ChangeSourceClickHdl( 0 );
return 0;
}
IMPL_LINK_INLINE_END( SvBaseLinksDlg, LinksDoubleClickHdl, SvTabListBox *, pSvTabListBox )
IMPL_LINK_INLINE_START( SvBaseLinksDlg, AutomaticClickHdl, RadioButton *, pRadioButton )
{
(void)pRadioButton;
sal_uInt16 nPos;
SvBaseLink* pLink = GetSelEntry( &nPos );
if( pLink && !( FILEOBJECT & pLink->GetObjType() ) &&
LINKUPDATE_ALWAYS != pLink->GetUpdateMode() )
SetType( *pLink, nPos, LINKUPDATE_ALWAYS );
return 0;
}
IMPL_LINK_INLINE_END( SvBaseLinksDlg, AutomaticClickHdl, RadioButton *, pRadioButton )
IMPL_LINK_INLINE_START( SvBaseLinksDlg, ManualClickHdl, RadioButton *, pRadioButton )
{
(void)pRadioButton;
sal_uInt16 nPos;
SvBaseLink* pLink = GetSelEntry( &nPos );
if( pLink && !( FILEOBJECT & pLink->GetObjType() ) &&
LINKUPDATE_ONCALL != pLink->GetUpdateMode())
SetType( *pLink, nPos, LINKUPDATE_ONCALL );
return 0;
}
IMPL_LINK_INLINE_END( SvBaseLinksDlg, ManualClickHdl, RadioButton *, pRadioButton )
IMPL_LINK( SvBaseLinksDlg, UpdateNowClickHdl, PushButton *, EMPTYARG )
{
SvTabListBox& rListBox = Links();
sal_uInt16 nSelCnt = (sal_uInt16)rListBox.GetSelectionCount();
if( 255 < nSelCnt )
nSelCnt = 255;
std::vector< SvBaseLink* > aLnkArr;
std::vector< sal_uInt16 > aPosArr;
SvLBoxEntry* pE = rListBox.FirstSelected();
while( pE )
{
sal_uInt16 nFndPos = (sal_uInt16)rListBox.GetModel()->GetAbsPos( pE );
if( LISTBOX_ENTRY_NOTFOUND != nFndPos )
{
aLnkArr.push_back( static_cast< SvBaseLink* >( pE->GetUserData() ) );
aPosArr.push_back( nFndPos );
}
pE = rListBox.NextSelected( pE );
}
if( !aLnkArr.empty() )
{
for( sal_uInt16 n = 0; n < aLnkArr.size(); ++n )
{
SvBaseLinkRef xLink = aLnkArr[ n ];
// suche erstmal im Array nach dem Eintrag
for( sal_uInt16 i = 0; i < pLinkMgr->GetLinks().Count(); ++i )
if( &xLink == *pLinkMgr->GetLinks()[ i ] )
{
xLink->SetUseCache( sal_False );
SetType( *xLink, aPosArr[ n ], xLink->GetUpdateMode() );
xLink->SetUseCache( sal_True );
break;
}
}
// falls jemand der Meinung ist, seine Links auszutauschen (SD)
LinkManager* pNewMgr = pLinkMgr;
pLinkMgr = 0;
SetManager( pNewMgr );
if( 0 == (pE = rListBox.GetEntry( aPosArr[ 0 ] )) ||
pE->GetUserData() != aLnkArr[ 0 ] )
{
// suche mal den Link
pE = rListBox.First();
while( pE )
{
if( pE->GetUserData() == aLnkArr[ 0 ] )
break;
pE = rListBox.Next( pE );
}
if( !pE )
pE = rListBox.FirstSelected();
}
if( pE )
{
SvLBoxEntry* pSelEntry = rListBox.FirstSelected();
if( pE != pSelEntry )
rListBox.Select( pSelEntry, sal_False );
rListBox.Select( pE );
rListBox.MakeVisible( pE );
}
}
return 0;
}
/*
IMPL_LINK_INLINE_START( SvBaseLinksDlg, OpenSourceClickHdl, PushButton *, pPushButton )
{
DBG_ASSERT( !this, "Open noch nicht impl." );
return 0;
}
IMPL_LINK_INLINE_END( SvBaseLinksDlg, OpenSourceClickHdl, PushButton *, pPushButton )
*/
IMPL_LINK( SvBaseLinksDlg, ChangeSourceClickHdl, PushButton *, pPushButton )
{
(void)pPushButton;
sal_uInt16 nSelectionCount = (sal_uInt16)Links().GetSelectionCount();
if(nSelectionCount > 1)
{
PathDialog aPathDlg( this );
String sType, sFile, sLinkName;
String sFilter;
SvLBoxEntry* pEntry = Links().FirstSelected();
SvBaseLink* pLink = (SvBaseLink*)pEntry->GetUserData();
pLinkMgr->GetDisplayNames( pLink, &sType, &sFile, 0, 0 );
INetURLObject aUrl(sFile);
if(aUrl.GetProtocol() == INET_PROT_FILE)
{
rtl::OUString sOldPath(aUrl.PathToFileName());
sal_Int32 nLen = aUrl.GetName().getLength();
sOldPath = sOldPath.copy(0, sOldPath.getLength() - nLen);
aPathDlg.SetPath(sOldPath);
}
if(aPathDlg.Execute() == RET_OK)
{
String aPath = aPathDlg.GetPath();
for( sal_uInt16 i = 0; i < nSelectionCount; i++)
{
pEntry = i==0 ?
Links().FirstSelected() :
Links().NextSelected( pEntry );
DBG_ASSERT(pEntry,"Wo ist der Entry");
pLink = (SvBaseLink*)pEntry->GetUserData();
DBG_ASSERT(pLink,"Wo ist der Link");
pLinkMgr->GetDisplayNames( pLink, &sType, &sFile, &sLinkName, &sFilter );
INetURLObject aUrl_(sFile);
INetURLObject aUrl2(aPath, INET_PROT_FILE);
aUrl2.insertName( aUrl_.getName() );
String sNewLinkName;
MakeLnkName( sNewLinkName, 0 ,
aUrl2.GetMainURL(INetURLObject::DECODE_TO_IURI), sLinkName, &sFilter);
pLink->SetLinkSourceName( sNewLinkName );
pLink->Update();
}
if( pLinkMgr->GetPersist() )
pLinkMgr->GetPersist()->SetModified();
LinkManager* pNewMgr = pLinkMgr;
pLinkMgr = 0;
SetManager( pNewMgr );
}
}
else
{
sal_uInt16 nPos;
SvBaseLink* pLink = GetSelEntry( &nPos );
if ( pLink && (pLink->GetLinkSourceName().Len() != 0) )
pLink->Edit( this, LINK( this, SvBaseLinksDlg, EndEditHdl ) );
}
return 0;
}
IMPL_LINK( SvBaseLinksDlg, BreakLinkClickHdl, PushButton *, pPushButton )
{
(void)pPushButton;
sal_Bool bModified = sal_False;
if(Links().GetSelectionCount() <= 1)
{
sal_uInt16 nPos;
SvBaseLinkRef xLink = GetSelEntry( &nPos );
if( !xLink.Is() )
return 0;
QueryBox aBox( this, WB_YES_NO | WB_DEF_YES, Closelinkmsg() );
if( RET_YES == aBox.Execute() )
{
Links().GetModel()->Remove( Links().GetEntry( nPos ) );
// falls Object noch vorhanden, dann das schliessen
sal_Bool bNewLnkMgr = OBJECT_CLIENT_FILE == xLink->GetObjType();
// dem Link sagen, das er aufgeloest wird!
xLink->Closed();
// falls einer vergessen hat sich auszutragen
if( xLink.Is() )
pLinkMgr->Remove( &xLink );
if( bNewLnkMgr )
{
LinkManager* pNewMgr = pLinkMgr;
pLinkMgr = 0;
SetManager( pNewMgr );
SvLBoxEntry* pEntry = Links().GetEntry( nPos ? --nPos : 0 );
if( pEntry )
Links().SetCurEntry( pEntry );
}
bModified = sal_True;
}
}
else
{
QueryBox aBox( this, WB_YES_NO | WB_DEF_YES, CloselinkmsgMulti() );
if( RET_YES == aBox.Execute() )
{
SvBaseLinkMemberList aLinkList;
SvLBoxEntry* pEntry = Links().FirstSelected();
while ( pEntry )
{
void * pUD = pEntry->GetUserData();
if( pUD )
aLinkList.Append( (SvBaseLink*)pUD );
pEntry = Links().NextSelected(pEntry);
}
Links().RemoveSelection();
for( sal_uLong i = 0; i < aLinkList.Count(); i++ )
{
SvBaseLinkRef xLink = aLinkList.GetObject( i );
// dem Link sagen, das er aufgeloest wird!
xLink->Closed();
// falls einer vergessen hat sich auszutragen
pLinkMgr->Remove( &xLink );
bModified = sal_True;
}
//Danach alle selektierten Eintraege entfernen
}
}
if(bModified)
{
if( !Links().GetEntryCount() )
{
// Der letzte macht das Licht aus
Automatic().Disable();
Manual().Disable();
UpdateNow().Disable();
// OpenSource().Disable();
ChangeSource().Disable();
BreakLink().Disable();
String aEmpty;
SourceName().SetText( aEmpty );
TypeName().SetText( aEmpty );
}
if( pLinkMgr->GetPersist() )
pLinkMgr->GetPersist()->SetModified();
}
return 0;
}
IMPL_LINK( SvBaseLinksDlg, UpdateWaitingHdl, Timer*, pTimer )
{
(void)pTimer;
// for( SvLBoxEntry* pBox = Links().First(); pBox;
// pBox = Links().Next( pBox ))
Links().SetUpdateMode(sal_False);
for( sal_uLong nPos = Links().GetEntryCount(); nPos; )
{
SvLBoxEntry* pBox = Links().GetEntry( --nPos );
SvBaseLinkRef xLink( (SvBaseLink*)pBox->GetUserData() );
if( xLink.Is() )
{
String sCur( ImplGetStateStr( *xLink ) ),
sOld( Links().GetEntryText( pBox, 3 ) );
if( sCur != sOld )
Links().SetEntryText( sCur, pBox, 3 );
}
}
Links().SetUpdateMode(sal_True);
return 0;
}
IMPL_LINK( SvBaseLinksDlg, EndEditHdl, sfx2::SvBaseLink*, _pLink )
{
sal_uInt16 nPos;
GetSelEntry( &nPos );
if( _pLink && _pLink->WasLastEditOK() )
{
// JP 09.01.98:
// StarImpress/Draw tauschen die LinkObjecte selbst aus!
// also suche den Link im Manager, wenn der nicht mehr existiert,
// dann setze fuelle die Liste komplett neu. Ansonsten braucht
// nur der editierte Linkt aktualisiert werden.
sal_Bool bLinkFnd = sal_False;
for( sal_uInt16 n = pLinkMgr->GetLinks().Count(); n; )
if( _pLink == &(*pLinkMgr->GetLinks()[ --n ]) )
{
bLinkFnd = sal_True;
break;
}
if( bLinkFnd )
{
Links().SetUpdateMode(sal_False);
Links().GetModel()->Remove( Links().GetEntry( nPos ) );
SvLBoxEntry* pToUnselect = Links().FirstSelected();
InsertEntry( *_pLink, nPos, sal_True );
if(pToUnselect)
Links().Select(pToUnselect, sal_False);
Links().SetUpdateMode(sal_True);
}
else
{
LinkManager* pNewMgr = pLinkMgr;
pLinkMgr = 0;
SetManager( pNewMgr );
}
if( pLinkMgr->GetPersist() )
pLinkMgr->GetPersist()->SetModified();
}
return 0;
}
String SvBaseLinksDlg::ImplGetStateStr( const SvBaseLink& rLnk )
{
String sRet;
if( !rLnk.GetObj() )
sRet = Brokenlink();
else if( rLnk.GetObj()->IsPending() )
{
sRet = Waitinglink();
StartUpdateTimer();
}
else if( LINKUPDATE_ALWAYS == rLnk.GetUpdateMode() )
sRet = Autolink();
else
sRet = Manuallink();
return sRet;
}
void SvBaseLinksDlg::SetManager( LinkManager* pNewMgr )
{
if( pLinkMgr == pNewMgr )
return;
if( pNewMgr )
// Update muss vor Clear gestoppt werden
Links().SetUpdateMode( sal_False );
Links().Clear();
pLinkMgr = pNewMgr;
if( pLinkMgr )
{
SvBaseLinks& rLnks = (SvBaseLinks&)pLinkMgr->GetLinks();
for( sal_uInt16 n = 0; n < rLnks.Count(); ++n )
{
SvBaseLinkRef* pLinkRef = rLnks[ n ];
if( !pLinkRef->Is() )
{
rLnks.Remove( n, 1 );
--n;
continue;
}
if( (*pLinkRef)->IsVisible() )
InsertEntry( **pLinkRef );
}
if( rLnks.Count() )
{
SvLBoxEntry* pEntry = Links().GetEntry( 0 );
Links().SetCurEntry( pEntry );
Links().Select( pEntry );
LinksSelectHdl( 0 );
}
Links().SetUpdateMode( sal_True );
Links().Invalidate();
}
}
void SvBaseLinksDlg::InsertEntry( const SvBaseLink& rLink, sal_uInt16 nPos, sal_Bool bSelect )
{
String aEntry, sFileNm, sLinkNm, sTypeNm, sFilter;
pLinkMgr->GetDisplayNames( (SvBaseLink*)&rLink, &sTypeNm, &sFileNm, &sLinkNm, &sFilter );
// GetTab(0) gibt die Position der von der TabListBox automatisch eingefuegten
// Bitmap. Die Breite der ersten Textspalte ergibt sich deshalb aus Tab(2)-Tab(1)
long nWidthPixel = Links().GetLogicTab( 2 ) - Links().GetLogicTab( 1 );
nWidthPixel -= SV_TAB_BORDER;
XubString aTxt = Links().GetEllipsisString( sFileNm, nWidthPixel, TEXT_DRAW_PATHELLIPSIS );
INetURLObject aPath( sFileNm, INET_PROT_FILE );
String aFileName = aPath.getName();
aFileName = INetURLObject::decode(aFileName, INET_HEX_ESCAPE, INetURLObject::DECODE_UNAMBIGUOUS);
if( aFileName.Len() > aTxt.Len() )
aTxt = aFileName;
else if( aTxt.Search( aFileName, aTxt.Len() - aFileName.Len() ) == STRING_NOTFOUND )
// filename not in string
aTxt = aFileName;
aEntry = aTxt;
aEntry += '\t';
if( OBJECT_CLIENT_GRF == rLink.GetObjType() )
aEntry += sFilter;
else
aEntry += sLinkNm;
aEntry += '\t';
aEntry += sTypeNm;
aEntry += '\t';
aEntry += ImplGetStateStr( rLink );
SvLBoxEntry * pE = Links().InsertEntryToColumn( aEntry, nPos );
pE->SetUserData( (void*)&rLink );
if(bSelect)
Links().Select(pE);
}
SvBaseLink* SvBaseLinksDlg::GetSelEntry( sal_uInt16* pPos )
{
SvLBoxEntry* pE = Links().FirstSelected();
sal_uInt16 nPos;
if( pE && LISTBOX_ENTRY_NOTFOUND !=
( nPos = (sal_uInt16)Links().GetModel()->GetAbsPos( pE ) ) )
{
DBG_ASSERT( pE, "wo kommt der leere Eintrag her?" );
if( pPos )
*pPos = nPos;
return (SvBaseLink*)pE->GetUserData();
}
return 0;
}
void SvBaseLinksDlg::SetType( SvBaseLink& rLink,
sal_uInt16 nSelPos,
sal_uInt16 nType )
{
rLink.SetUpdateMode( nType );
rLink.Update();
SvLBoxEntry* pBox = Links().GetEntry( nSelPos );
Links().SetEntryText( ImplGetStateStr( rLink ), pBox, 3 );
if( pLinkMgr->GetPersist() )
pLinkMgr->GetPersist()->SetModified();
}
void SvBaseLinksDlg::SetActLink( SvBaseLink * pLink )
{
if( pLinkMgr )
{
const SvBaseLinks& rLnks = pLinkMgr->GetLinks();
sal_uInt16 nSelect = 0;
for( sal_uInt16 n = 0; n < rLnks.Count(); ++n )
{
SvBaseLinkRef* pLinkRef = rLnks[ n ];
// #109573# only visible links have been inserted into the TreeListBox,
// invisible ones have to be skipped here
if( (*pLinkRef)->IsVisible() )
{
if( pLink == *pLinkRef )
{
Links().Select( Links().GetEntry( nSelect ) );
LinksSelectHdl( 0 );
return ;
}
nSelect++;
}
}
}
}