update credits
[LibreOffice.git] / svx / source / svdraw / svdotxln.cxx
blob7a8f76383d0640ea9c8b124cc43cb357b9b866de
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
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
39 SdrTextObj* pSdrObj;
41 public:
42 ImpSdrObjTextLink( SdrTextObj* pObj1 )
43 : ::sfx2::SvBaseLink( ::sfx2::LINKUPDATE_ONCALL, FORMAT_FILE ),
44 pSdrObj( pObj1 )
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()
61 if (pSdrObj )
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();
68 SvBaseLink::Closed();
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;
78 if( pLinkManager )
80 ImpSdrObjTextLinkUserData* pData=pSdrObj->GetLinkUserData();
81 if( pData )
83 String aFile;
84 String aFilter;
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();
93 bForceReload = true;
97 if (pSdrObj )
98 pSdrObj->ReloadLinkedText( bForceReload );
100 return SUCCESS;
104 TYPEINIT1(ImpSdrObjTextLinkUserData,SdrObjUserData);
106 ImpSdrObjTextLinkUserData::ImpSdrObjTextLinkUserData(SdrTextObj* pObj1):
107 SdrObjUserData(SdrInventor,SDRUSERDATA_OBJTEXTLINK,0),
108 pObj(pObj1),
109 aFileDate0( DateTime::EMPTY ),
110 pLink(NULL),
111 eCharSet(RTL_TEXTENCODING_DONTKNOW)
115 ImpSdrObjTextLinkUserData::~ImpSdrObjTextLinkUserData()
117 delete pLink;
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;
127 pData->pLink=NULL;
128 return pData;
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();
138 if (pData!=NULL) {
139 ReleaseTextLink();
141 pData=new ImpSdrObjTextLinkUserData(this);
142 pData->aFileName=rFileName;
143 pData->aFilterName=rFilterName;
144 pData->eCharSet=eCharSet;
145 AppendUserData(pData);
146 ImpLinkAnmeldung();
149 void SdrTextObj::ReleaseTextLink()
151 ImpLinkAbmeldung();
152 sal_uInt16 nAnz=GetUserDataCount();
153 for (sal_uInt16 nNum=nAnz; nNum>0;) {
154 nNum--;
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();
165 bool bRet = true;
167 if( pData )
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;
181 aAny >>= aDateTime;
182 ::utl::typeConvert( aDateTime, aFileDT );
184 catch( ... )
186 bExists = false;
189 if( bExists )
191 if( bForceLoad )
192 bLoad = true;
193 else
194 bLoad = ( aFileDT > pData->aFileDate0 );
196 if( bLoad )
198 bRet = LoadText( pData->aFileName, pData->aFilterName, pData->eCharSet );
201 pData->aFileDate0 = aFileDT;
205 return bRet;
208 bool SdrTextObj::LoadText(const String& rFileName, const String& /*rFilterName*/, rtl_TextEncoding eCharSet)
210 INetURLObject aFileURL( rFileName );
211 bool bRet = false;
213 if( aFileURL.GetProtocol() == INET_PROT_NOT_VALID )
215 OUString aFileURLStr;
217 if( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( rFileName, aFileURLStr ) )
218 aFileURL = INetURLObject( aFileURLStr );
219 else
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 );
227 if( pIStm )
229 pIStm->SetStreamCharSet(GetSOLoadTextEncoding(eCharSet));
231 char cRTF[5];
232 cRTF[4] = 0;
233 pIStm->Read(cRTF, 5);
235 bool bRTF = cRTF[0] == '{' && cRTF[1] == '\\' && cRTF[2] == 'r' && cRTF[3] == 't' && cRTF[4] == 'f';
237 pIStm->Seek(0);
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 ) );
242 bRet = true;
245 delete pIStm;
248 return bRet;
251 ImpSdrObjTextLinkUserData* SdrTextObj::GetLinkUserData() const
253 ImpSdrObjTextLinkUserData* pData=NULL;
254 sal_uInt16 nAnz=GetUserDataCount();
255 for (sal_uInt16 nNum=nAnz; nNum>0 && pData==NULL;) {
256 nNum--;
257 pData=(ImpSdrObjTextLinkUserData*)GetUserData(nNum);
258 if (pData->GetInventor()!=SdrInventor || pData->GetId()!=SDRUSERDATA_OBJTEXTLINK) {
259 pData=NULL;
262 return pData;
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);
271 #ifdef __GNUC__
272 pLinkManager->InsertFileLink(*pData->pLink,OBJECT_CLIENT_FILE,pData->aFileName,
273 pData->aFilterName.Len() ?
274 &pData->aFilterName : (const String *)NULL,
275 (const String *)NULL);
276 #else
277 pLinkManager->InsertFileLink(*pData->pLink,OBJECT_CLIENT_FILE,pData->aFileName,
278 pData->aFilterName.Len() ? &pData->aFilterName : NULL,NULL);
279 #endif
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 );
291 pData->pLink=NULL;
295 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */