1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include "sal/config.h"
22 #include <comphelper/processfactory.hxx>
23 #include <unotools/ucbstreamhelper.hxx>
24 #include <unotools/localfilehelper.hxx>
25 #include <ucbhelper/content.hxx>
26 #include <unotools/datetime.hxx>
27 #include <svx/svdotext.hxx>
28 #include <svx/svdmodel.hxx>
29 #include <editeng/editdata.hxx>
30 #include <sfx2/lnkbase.hxx>
31 #include <sfx2/linkmgr.hxx>
32 #include <tools/urlobj.hxx>
33 #include <svl/urihelper.hxx>
34 #include <tools/tenccvt.hxx>
37 class ImpSdrObjTextLink
: public ::sfx2::SvBaseLink
42 ImpSdrObjTextLink( SdrTextObj
* pObj1
)
43 : ::sfx2::SvBaseLink( ::sfx2::LINKUPDATE_ONCALL
, FORMAT_FILE
),
46 virtual ~ImpSdrObjTextLink();
48 virtual void Closed();
49 virtual ::sfx2::SvBaseLink::UpdateResult
DataChanged(
50 const String
& rMimeType
, const ::com::sun::star::uno::Any
& rValue
);
52 bool Connect() { return 0 != SvBaseLink::GetRealObject(); }
55 ImpSdrObjTextLink::~ImpSdrObjTextLink()
59 void ImpSdrObjTextLink::Closed()
63 // set pLink of the object to NULL, because we are destroying the link instance now
64 ImpSdrObjTextLinkUserData
* pData
=pSdrObj
->GetLinkUserData();
65 if (pData
!=NULL
) pData
->pLink
=NULL
;
66 pSdrObj
->ReleaseTextLink();
72 ::sfx2::SvBaseLink::UpdateResult
ImpSdrObjTextLink::DataChanged(
73 const String
& /*rMimeType*/, const ::com::sun::star::uno::Any
& /*rValue */)
75 bool bForceReload
= false;
76 SdrModel
* pModel
= pSdrObj
? pSdrObj
->GetModel() : 0;
77 sfx2::LinkManager
* pLinkManager
= pModel
? pModel
->GetLinkManager() : 0;
80 ImpSdrObjTextLinkUserData
* pData
=pSdrObj
->GetLinkUserData();
85 pLinkManager
->GetDisplayNames( this, 0,&aFile
, 0, &aFilter
);
87 if( !pData
->aFileName
.Equals( aFile
) ||
88 !pData
->aFilterName
.Equals( aFilter
))
90 pData
->aFileName
= aFile
;
91 pData
->aFilterName
= aFilter
;
92 pSdrObj
->SetChanged();
98 pSdrObj
->ReloadLinkedText( bForceReload
);
104 TYPEINIT1(ImpSdrObjTextLinkUserData
,SdrObjUserData
);
106 ImpSdrObjTextLinkUserData::ImpSdrObjTextLinkUserData(SdrTextObj
* pObj1
):
107 SdrObjUserData(SdrInventor
,SDRUSERDATA_OBJTEXTLINK
,0),
109 aFileDate0( DateTime::EMPTY
),
111 eCharSet(RTL_TEXTENCODING_DONTKNOW
)
115 ImpSdrObjTextLinkUserData::~ImpSdrObjTextLinkUserData()
120 SdrObjUserData
* ImpSdrObjTextLinkUserData::Clone(SdrObject
* pObj1
) const
122 ImpSdrObjTextLinkUserData
* pData
=new ImpSdrObjTextLinkUserData((SdrTextObj
*)pObj1
);
123 pData
->aFileName
=aFileName
;
124 pData
->aFilterName
=aFilterName
;
125 pData
->aFileDate0
=aFileDate0
;
126 pData
->eCharSet
=eCharSet
;
132 void SdrTextObj::SetTextLink(const String
& rFileName
, const String
& rFilterName
, rtl_TextEncoding eCharSet
)
134 if(eCharSet
== RTL_TEXTENCODING_DONTKNOW
)
135 eCharSet
= osl_getThreadTextEncoding();
137 ImpSdrObjTextLinkUserData
* pData
=GetLinkUserData();
141 pData
=new ImpSdrObjTextLinkUserData(this);
142 pData
->aFileName
=rFileName
;
143 pData
->aFilterName
=rFilterName
;
144 pData
->eCharSet
=eCharSet
;
145 AppendUserData(pData
);
149 void SdrTextObj::ReleaseTextLink()
152 sal_uInt16 nAnz
=GetUserDataCount();
153 for (sal_uInt16 nNum
=nAnz
; nNum
>0;) {
155 SdrObjUserData
* pData
=GetUserData(nNum
);
156 if (pData
->GetInventor()==SdrInventor
&& pData
->GetId()==SDRUSERDATA_OBJTEXTLINK
) {
157 DeleteUserData(nNum
);
162 bool SdrTextObj::ReloadLinkedText( bool bForceLoad
)
164 ImpSdrObjTextLinkUserData
* pData
= GetLinkUserData();
169 DateTime
aFileDT( DateTime::EMPTY
);
170 bool bExists
= true, bLoad
= false;
174 INetURLObject
aURL( pData
->aFileName
);
175 DBG_ASSERT( aURL
.GetProtocol() != INET_PROT_NOT_VALID
, "invalid URL" );
177 ::ucbhelper::Content
aCnt( aURL
.GetMainURL( INetURLObject::NO_DECODE
), ::com::sun::star::uno::Reference
< ::com::sun::star::ucb::XCommandEnvironment
>(), comphelper::getProcessComponentContext() );
178 ::com::sun::star::uno::Any
aAny( aCnt
.getPropertyValue( OUString( "DateModified" ) ) );
179 ::com::sun::star::util::DateTime aDateTime
;
182 ::utl::typeConvert( aDateTime
, aFileDT
);
194 bLoad
= ( aFileDT
> pData
->aFileDate0
);
198 bRet
= LoadText( pData
->aFileName
, pData
->aFilterName
, pData
->eCharSet
);
201 pData
->aFileDate0
= aFileDT
;
208 bool SdrTextObj::LoadText(const String
& rFileName
, const String
& /*rFilterName*/, rtl_TextEncoding eCharSet
)
210 INetURLObject
aFileURL( rFileName
);
213 if( aFileURL
.GetProtocol() == INET_PROT_NOT_VALID
)
215 OUString aFileURLStr
;
217 if( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( rFileName
, aFileURLStr
) )
218 aFileURL
= INetURLObject( aFileURLStr
);
220 aFileURL
.SetSmartURL( rFileName
);
223 DBG_ASSERT( aFileURL
.GetProtocol() != INET_PROT_NOT_VALID
, "invalid URL" );
225 SvStream
* pIStm
= ::utl::UcbStreamHelper::CreateStream( aFileURL
.GetMainURL( INetURLObject::NO_DECODE
), STREAM_READ
);
229 pIStm
->SetStreamCharSet(GetSOLoadTextEncoding(eCharSet
));
233 pIStm
->Read(cRTF
, 5);
235 bool bRTF
= cRTF
[0] == '{' && cRTF
[1] == '\\' && cRTF
[2] == 'r' && cRTF
[3] == 't' && cRTF
[4] == 'f';
239 if( !pIStm
->GetError() )
241 SetText( *pIStm
, aFileURL
.GetMainURL( INetURLObject::NO_DECODE
), sal::static_int_cast
< sal_uInt16
>( bRTF
? EE_FORMAT_RTF
: EE_FORMAT_TEXT
) );
251 ImpSdrObjTextLinkUserData
* SdrTextObj::GetLinkUserData() const
253 ImpSdrObjTextLinkUserData
* pData
=NULL
;
254 sal_uInt16 nAnz
=GetUserDataCount();
255 for (sal_uInt16 nNum
=nAnz
; nNum
>0 && pData
==NULL
;) {
257 pData
=(ImpSdrObjTextLinkUserData
*)GetUserData(nNum
);
258 if (pData
->GetInventor()!=SdrInventor
|| pData
->GetId()!=SDRUSERDATA_OBJTEXTLINK
) {
265 void SdrTextObj::ImpLinkAnmeldung()
267 ImpSdrObjTextLinkUserData
* pData
=GetLinkUserData();
268 sfx2::LinkManager
* pLinkManager
=pModel
!=NULL
? pModel
->GetLinkManager() : NULL
;
269 if (pLinkManager
!=NULL
&& pData
!=NULL
&& pData
->pLink
==NULL
) { // don't register twice
270 pData
->pLink
=new ImpSdrObjTextLink(this);
272 pLinkManager
->InsertFileLink(*pData
->pLink
,OBJECT_CLIENT_FILE
,pData
->aFileName
,
273 pData
->aFilterName
.Len() ?
274 &pData
->aFilterName
: (const String
*)NULL
,
275 (const String
*)NULL
);
277 pLinkManager
->InsertFileLink(*pData
->pLink
,OBJECT_CLIENT_FILE
,pData
->aFileName
,
278 pData
->aFilterName
.Len() ? &pData
->aFilterName
: NULL
,NULL
);
280 pData
->pLink
->Connect();
284 void SdrTextObj::ImpLinkAbmeldung()
286 ImpSdrObjTextLinkUserData
* pData
=GetLinkUserData();
287 sfx2::LinkManager
* pLinkManager
=pModel
!=NULL
? pModel
->GetLinkManager() : NULL
;
288 if (pLinkManager
!=NULL
&& pData
!=NULL
&& pData
->pLink
!=NULL
) { // don't register twice
289 // when doing Remove, *pLink is deleted implicitly
290 pLinkManager
->Remove( pData
->pLink
);
295 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */