Update ooo320-m1
[ooovba.git] / svx / source / svdraw / svdotxln.cxx
blob4a6484c230eade333f300d12ba406dc8dac99b23
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: svdotxln.cxx,v $
10 * $Revision: 1.18 $
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>
46 #ifndef SVX_LIGHT
47 #ifndef _LNKBASE_HXX //autogen
48 #include <sfx2/lnkbase.hxx>
49 #endif
50 #endif
51 #include <linkmgr.hxx>
52 #include <tools/urlobj.hxx>
54 #include <svtools/urihelper.hxx>
56 // #90477#
57 #include <tools/tenccvt.hxx>
59 #ifndef SVX_LIGHT
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
79 SdrTextObj* pSdrObj;
81 public:
82 ImpSdrObjTextLink( SdrTextObj* pObj1 )
83 : ::sfx2::SvBaseLink( ::sfx2::LINKUPDATE_ONCALL, FORMAT_FILE ),
84 pSdrObj( pObj1 )
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()
101 if (pSdrObj )
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;
118 if( pLinkManager )
120 ImpSdrObjTextLinkUserData* pData=pSdrObj->GetLinkUserData();
121 if( pData )
123 String aFile;
124 String aFilter;
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();
133 bForceReload = TRUE;
137 if (pSdrObj )
138 pSdrObj->ReloadLinkedText( bForceReload );
140 #endif // SVX_LIGHT
142 ////////////////////////////////////////////////////////////////////////////////////////////////////
144 // @@ @@ @@ @@ @@ @@ @@ @@ @@@@@ @@@@@@ @@@@@ @@@@@ @@@@ @@@@@@ @@@@
145 // @@ @@ @@@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
146 // @@ @@ @@@@@@ @@@@ @@ @@ @@@@ @@@@@ @@@@@ @@ @@ @@@@@@ @@ @@@@@@
147 // @@ @@ @@ @@@ @@@@@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
148 // @@@@@ @@ @@ @@ @@ @@ @@@@ @@@@@ @@@@@@ @@ @@ @@@@@ @@ @@ @@ @@ @@
150 ////////////////////////////////////////////////////////////////////////////////////////////////////
152 TYPEINIT1(ImpSdrObjTextLinkUserData,SdrObjUserData);
154 ImpSdrObjTextLinkUserData::ImpSdrObjTextLinkUserData(SdrTextObj* pObj1):
155 SdrObjUserData(SdrInventor,SDRUSERDATA_OBJTEXTLINK,0),
156 pObj(pObj1),
157 pLink(NULL),
158 eCharSet(RTL_TEXTENCODING_DONTKNOW)
162 ImpSdrObjTextLinkUserData::~ImpSdrObjTextLinkUserData()
164 #ifndef SVX_LIGHT
165 delete pLink;
166 #endif
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;
176 pData->pLink=NULL;
177 return pData;
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();
198 if (pData!=NULL) {
199 ReleaseTextLink();
201 pData=new ImpSdrObjTextLinkUserData(this);
202 pData->aFileName=rFileName;
203 pData->aFilterName=rFilterName;
204 pData->eCharSet=eCharSet;
205 InsertUserData(pData);
206 ImpLinkAnmeldung();
209 void SdrTextObj::ReleaseTextLink()
211 ImpLinkAbmeldung();
212 USHORT nAnz=GetUserDataCount();
213 for (USHORT nNum=nAnz; nNum>0;) {
214 nNum--;
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;
227 if( pData )
229 ::ucbhelper::ContentBroker* pBroker = ::ucbhelper::ContentBroker::get();
230 DateTime aFileDT;
231 BOOL bExists = FALSE, bLoad = FALSE;
233 if( pBroker )
235 bExists = TRUE;
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;
246 aAny >>= aDateTime;
247 ::utl::typeConvert( aDateTime, aFileDT );
249 catch( ... )
251 bExists = FALSE;
255 if( bExists )
257 if( bForceLoad )
258 bLoad = TRUE;
259 else
260 bLoad = ( aFileDT > pData->aFileDate0 );
262 if( bLoad )
264 bRet = LoadText( pData->aFileName, pData->aFilterName, pData->eCharSet );
267 pData->aFileDate0 = aFileDT;
271 return bRet;
274 FASTBOOL SdrTextObj::LoadText(const String& rFileName, const String& /*rFilterName*/, rtl_TextEncoding eCharSet)
276 INetURLObject aFileURL( rFileName );
277 BOOL bRet = FALSE;
279 if( aFileURL.GetProtocol() == INET_PROT_NOT_VALID )
281 String aFileURLStr;
283 if( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( rFileName, aFileURLStr ) )
284 aFileURL = INetURLObject( aFileURLStr );
285 else
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 );
293 if( pIStm )
295 // #90477# pIStm->SetStreamCharSet( eCharSet );
296 pIStm->SetStreamCharSet(GetSOLoadTextEncoding(eCharSet, (sal_uInt16)pIStm->GetVersion()));
298 char cRTF[5];
299 cRTF[4] = 0;
300 pIStm->Read(cRTF, 5);
302 BOOL bRTF = cRTF[0] == '{' && cRTF[1] == '\\' && cRTF[2] == 'r' && cRTF[3] == 't' && cRTF[4] == 'f';
304 pIStm->Seek(0);
306 if( !pIStm->GetError() )
308 SetText( *pIStm, aFileURL.GetMainURL( INetURLObject::NO_DECODE ), sal::static_int_cast< USHORT >( bRTF ? EE_FORMAT_RTF : EE_FORMAT_TEXT ) );
309 bRet = TRUE;
312 delete pIStm;
315 return bRet;
318 ImpSdrObjTextLinkUserData* SdrTextObj::GetLinkUserData() const
320 ImpSdrObjTextLinkUserData* pData=NULL;
321 USHORT nAnz=GetUserDataCount();
322 for (USHORT nNum=nAnz; nNum>0 && pData==NULL;) {
323 nNum--;
324 pData=(ImpSdrObjTextLinkUserData*)GetUserData(nNum);
325 if (pData->GetInventor()!=SdrInventor || pData->GetId()!=SDRUSERDATA_OBJTEXTLINK) {
326 pData=NULL;
329 return pData;
332 void SdrTextObj::ImpLinkAnmeldung()
334 #ifndef SVX_LIGHT
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);
339 #ifdef GCC
340 pLinkManager->InsertFileLink(*pData->pLink,OBJECT_CLIENT_FILE,pData->aFileName,
341 pData->aFilterName.Len() ?
342 &pData->aFilterName : (const String *)NULL,
343 (const String *)NULL);
344 #else
345 pLinkManager->InsertFileLink(*pData->pLink,OBJECT_CLIENT_FILE,pData->aFileName,
346 pData->aFilterName.Len() ? &pData->aFilterName : NULL,NULL);
347 #endif
348 pData->pLink->Connect();
350 #endif // SVX_LIGHT
353 void SdrTextObj::ImpLinkAbmeldung()
355 #ifndef SVX_LIGHT
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 );
361 pData->pLink=NULL;
363 #endif // SVX_LIGHT