1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: svdotxln.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_svx.hxx"
34 #include <unotools/ucbstreamhelper.hxx>
35 #include <unotools/localfilehelper.hxx>
37 #include <ucbhelper/content.hxx>
38 #include <ucbhelper/contentbroker.hxx>
39 #include <unotools/datetime.hxx>
41 #include <svx/svdotext.hxx>
42 #include "svditext.hxx"
43 #include <svx/svdmodel.hxx>
44 #include <svx/editdata.hxx>
47 #ifndef _LNKBASE_HXX //autogen
48 #include <sfx2/lnkbase.hxx>
51 #include <linkmgr.hxx>
52 #include <tools/urlobj.hxx>
54 #include <svtools/urihelper.hxx>
57 #include <tools/tenccvt.hxx>
60 ////////////////////////////////////////////////////////////////////////////////////////////////////
62 // @@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@ @@ @@ @@@@@@ @@ @@ @@ @@ @@ @@
63 // @@ @@ @@ @@ @@ @@ @@ @@@@ @@ @@ @@ @@@ @@ @@ @@
64 // @@ @@ @@@@@ @@ @@ @@@@@ @@ @@ @@ @@ @@@@@@ @@@@
65 // @@ @@ @@ @@ @@ @@ @@ @@ @@@@ @@ @@ @@ @@ @@@ @@ @@
66 // @@@@ @@@@@ @@@@ @@ @@@@@@ @@ @@ @@ @@@@@ @@ @@ @@ @@ @@
68 // ImpSdrObjTextLink zur Verbindung von SdrTextObj und LinkManager
70 // Einem solchen Link merke ich mir als SdrObjUserData am Objekt. Im Gegensatz
71 // zum Grafik-Link werden die ObjektDaten jedoch kopiert (fuer Paint, etc.).
72 // Die Information ob das Objekt ein Link ist besteht genau darin, dass dem
73 // Objekt ein entsprechender UserData-Record angehaengt ist oder nicht.
75 ////////////////////////////////////////////////////////////////////////////////////////////////////
77 class ImpSdrObjTextLink
: public ::sfx2::SvBaseLink
82 ImpSdrObjTextLink( SdrTextObj
* pObj1
)
83 : ::sfx2::SvBaseLink( ::sfx2::LINKUPDATE_ONCALL
, FORMAT_FILE
),
86 virtual ~ImpSdrObjTextLink();
88 virtual void Closed();
89 virtual void DataChanged( const String
& rMimeType
,
90 const ::com::sun::star::uno::Any
& rValue
);
92 BOOL
Connect() { return 0 != SvBaseLink::GetRealObject(); }
95 ImpSdrObjTextLink::~ImpSdrObjTextLink()
99 void ImpSdrObjTextLink::Closed()
103 // pLink des Objekts auf NULL setzen, da die Link-Instanz ja gerade destruiert wird.
104 ImpSdrObjTextLinkUserData
* pData
=pSdrObj
->GetLinkUserData();
105 if (pData
!=NULL
) pData
->pLink
=NULL
;
106 pSdrObj
->ReleaseTextLink();
108 SvBaseLink::Closed();
112 void ImpSdrObjTextLink::DataChanged( const String
& /*rMimeType*/,
113 const ::com::sun::star::uno::Any
& /*rValue */)
115 FASTBOOL bForceReload
=FALSE
;
116 SdrModel
* pModel
= pSdrObj
? pSdrObj
->GetModel() : 0;
117 SvxLinkManager
* pLinkManager
= pModel
? pModel
->GetLinkManager() : 0;
120 ImpSdrObjTextLinkUserData
* pData
=pSdrObj
->GetLinkUserData();
125 pLinkManager
->GetDisplayNames( this, 0,&aFile
, 0, &aFilter
);
127 if( !pData
->aFileName
.Equals( aFile
) ||
128 !pData
->aFilterName
.Equals( aFilter
))
130 pData
->aFileName
= aFile
;
131 pData
->aFilterName
= aFilter
;
132 pSdrObj
->SetChanged();
138 pSdrObj
->ReloadLinkedText( bForceReload
);
142 ////////////////////////////////////////////////////////////////////////////////////////////////////
144 // @@ @@ @@ @@ @@ @@ @@ @@ @@@@@ @@@@@@ @@@@@ @@@@@ @@@@ @@@@@@ @@@@
145 // @@ @@ @@@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
146 // @@ @@ @@@@@@ @@@@ @@ @@ @@@@ @@@@@ @@@@@ @@ @@ @@@@@@ @@ @@@@@@
147 // @@ @@ @@ @@@ @@@@@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
148 // @@@@@ @@ @@ @@ @@ @@ @@@@ @@@@@ @@@@@@ @@ @@ @@@@@ @@ @@ @@ @@ @@
150 ////////////////////////////////////////////////////////////////////////////////////////////////////
152 TYPEINIT1(ImpSdrObjTextLinkUserData
,SdrObjUserData
);
154 ImpSdrObjTextLinkUserData::ImpSdrObjTextLinkUserData(SdrTextObj
* pObj1
):
155 SdrObjUserData(SdrInventor
,SDRUSERDATA_OBJTEXTLINK
,0),
158 eCharSet(RTL_TEXTENCODING_DONTKNOW
)
162 ImpSdrObjTextLinkUserData::~ImpSdrObjTextLinkUserData()
169 SdrObjUserData
* ImpSdrObjTextLinkUserData::Clone(SdrObject
* pObj1
) const
171 ImpSdrObjTextLinkUserData
* pData
=new ImpSdrObjTextLinkUserData((SdrTextObj
*)pObj1
);
172 pData
->aFileName
=aFileName
;
173 pData
->aFilterName
=aFilterName
;
174 pData
->aFileDate0
=aFileDate0
;
175 pData
->eCharSet
=eCharSet
;
180 ////////////////////////////////////////////////////////////////////////////////////////////////////
182 // @@@@@@ @@@@@ @@ @@ @@@@@@ @@@@ @@@@@ @@@@@@
183 // @@ @@ @@@ @@@ @@ @@ @@ @@ @@ @@
184 // @@ @@ @@@@@ @@ @@ @@ @@ @@ @@
185 // @@ @@@@ @@@ @@ @@ @@ @@@@@ @@
186 // @@ @@ @@@@@ @@ @@ @@ @@ @@ @@
187 // @@ @@ @@@ @@@ @@ @@ @@ @@ @@ @@ @@
188 // @@ @@@@@ @@ @@ @@ @@@@ @@@@@ @@@@
190 ////////////////////////////////////////////////////////////////////////////////////////////////////
192 void SdrTextObj::SetTextLink(const String
& rFileName
, const String
& rFilterName
, rtl_TextEncoding eCharSet
)
194 if(eCharSet
== RTL_TEXTENCODING_DONTKNOW
)
195 eCharSet
= gsl_getSystemTextEncoding();
197 ImpSdrObjTextLinkUserData
* pData
=GetLinkUserData();
201 pData
=new ImpSdrObjTextLinkUserData(this);
202 pData
->aFileName
=rFileName
;
203 pData
->aFilterName
=rFilterName
;
204 pData
->eCharSet
=eCharSet
;
205 InsertUserData(pData
);
209 void SdrTextObj::ReleaseTextLink()
212 USHORT nAnz
=GetUserDataCount();
213 for (USHORT nNum
=nAnz
; nNum
>0;) {
215 SdrObjUserData
* pData
=GetUserData(nNum
);
216 if (pData
->GetInventor()==SdrInventor
&& pData
->GetId()==SDRUSERDATA_OBJTEXTLINK
) {
217 DeleteUserData(nNum
);
222 FASTBOOL
SdrTextObj::ReloadLinkedText( FASTBOOL bForceLoad
)
224 ImpSdrObjTextLinkUserData
* pData
= GetLinkUserData();
225 FASTBOOL bRet
= TRUE
;
229 ::ucbhelper::ContentBroker
* pBroker
= ::ucbhelper::ContentBroker::get();
231 BOOL bExists
= FALSE
, bLoad
= FALSE
;
239 INetURLObject
aURL( pData
->aFileName
);
240 DBG_ASSERT( aURL
.GetProtocol() != INET_PROT_NOT_VALID
, "invalid URL" );
242 ::ucbhelper::Content
aCnt( aURL
.GetMainURL( INetURLObject::NO_DECODE
), ::com::sun::star::uno::Reference
< ::com::sun::star::ucb::XCommandEnvironment
>() );
243 ::com::sun::star::uno::Any
aAny( aCnt
.getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DateModified" ) ) ) );
244 ::com::sun::star::util::DateTime aDateTime
;
247 ::utl::typeConvert( aDateTime
, aFileDT
);
260 bLoad
= ( aFileDT
> pData
->aFileDate0
);
264 bRet
= LoadText( pData
->aFileName
, pData
->aFilterName
, pData
->eCharSet
);
267 pData
->aFileDate0
= aFileDT
;
274 FASTBOOL
SdrTextObj::LoadText(const String
& rFileName
, const String
& /*rFilterName*/, rtl_TextEncoding eCharSet
)
276 INetURLObject
aFileURL( rFileName
);
279 if( aFileURL
.GetProtocol() == INET_PROT_NOT_VALID
)
283 if( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( rFileName
, aFileURLStr
) )
284 aFileURL
= INetURLObject( aFileURLStr
);
286 aFileURL
.SetSmartURL( rFileName
);
289 DBG_ASSERT( aFileURL
.GetProtocol() != INET_PROT_NOT_VALID
, "invalid URL" );
291 SvStream
* pIStm
= ::utl::UcbStreamHelper::CreateStream( aFileURL
.GetMainURL( INetURLObject::NO_DECODE
), STREAM_READ
);
295 // #90477# pIStm->SetStreamCharSet( eCharSet );
296 pIStm
->SetStreamCharSet(GetSOLoadTextEncoding(eCharSet
, (sal_uInt16
)pIStm
->GetVersion()));
300 pIStm
->Read(cRTF
, 5);
302 BOOL bRTF
= cRTF
[0] == '{' && cRTF
[1] == '\\' && cRTF
[2] == 'r' && cRTF
[3] == 't' && cRTF
[4] == 'f';
306 if( !pIStm
->GetError() )
308 SetText( *pIStm
, aFileURL
.GetMainURL( INetURLObject::NO_DECODE
), sal::static_int_cast
< USHORT
>( bRTF
? EE_FORMAT_RTF
: EE_FORMAT_TEXT
) );
318 ImpSdrObjTextLinkUserData
* SdrTextObj::GetLinkUserData() const
320 ImpSdrObjTextLinkUserData
* pData
=NULL
;
321 USHORT nAnz
=GetUserDataCount();
322 for (USHORT nNum
=nAnz
; nNum
>0 && pData
==NULL
;) {
324 pData
=(ImpSdrObjTextLinkUserData
*)GetUserData(nNum
);
325 if (pData
->GetInventor()!=SdrInventor
|| pData
->GetId()!=SDRUSERDATA_OBJTEXTLINK
) {
332 void SdrTextObj::ImpLinkAnmeldung()
335 ImpSdrObjTextLinkUserData
* pData
=GetLinkUserData();
336 SvxLinkManager
* pLinkManager
=pModel
!=NULL
? pModel
->GetLinkManager() : NULL
;
337 if (pLinkManager
!=NULL
&& pData
!=NULL
&& pData
->pLink
==NULL
) { // Nicht 2x Anmelden
338 pData
->pLink
=new ImpSdrObjTextLink(this);
340 pLinkManager
->InsertFileLink(*pData
->pLink
,OBJECT_CLIENT_FILE
,pData
->aFileName
,
341 pData
->aFilterName
.Len() ?
342 &pData
->aFilterName
: (const String
*)NULL
,
343 (const String
*)NULL
);
345 pLinkManager
->InsertFileLink(*pData
->pLink
,OBJECT_CLIENT_FILE
,pData
->aFileName
,
346 pData
->aFilterName
.Len() ? &pData
->aFilterName
: NULL
,NULL
);
348 pData
->pLink
->Connect();
353 void SdrTextObj::ImpLinkAbmeldung()
356 ImpSdrObjTextLinkUserData
* pData
=GetLinkUserData();
357 SvxLinkManager
* pLinkManager
=pModel
!=NULL
? pModel
->GetLinkManager() : NULL
;
358 if (pLinkManager
!=NULL
&& pData
!=NULL
&& pData
->pLink
!=NULL
) { // Nicht 2x Abmelden
359 // Bei Remove wird *pLink implizit deleted
360 pLinkManager
->Remove( pData
->pLink
);