1*d119d52dSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*d119d52dSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*d119d52dSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*d119d52dSAndrew Rist * distributed with this work for additional information 6*d119d52dSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*d119d52dSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*d119d52dSAndrew Rist * "License"); you may not use this file except in compliance 9*d119d52dSAndrew Rist * with the License. You may obtain a copy of the License at 10*d119d52dSAndrew Rist * 11*d119d52dSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*d119d52dSAndrew Rist * 13*d119d52dSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*d119d52dSAndrew Rist * software distributed under the License is distributed on an 15*d119d52dSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*d119d52dSAndrew Rist * KIND, either express or implied. See the License for the 17*d119d52dSAndrew Rist * specific language governing permissions and limitations 18*d119d52dSAndrew Rist * under the License. 19*d119d52dSAndrew Rist * 20*d119d52dSAndrew Rist *************************************************************/ 21*d119d52dSAndrew Rist 22*d119d52dSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_sfx2.hxx" 26cdf0e10cSrcweir #include <vcl/wrkwin.hxx> 27cdf0e10cSrcweir #include <svl/rectitem.hxx> 28cdf0e10cSrcweir #include <svl/eitem.hxx> 29cdf0e10cSrcweir #include <svl/intitem.hxx> 30cdf0e10cSrcweir #include <basic/sbstar.hxx> 31cdf0e10cSrcweir #include <svl/stritem.hxx> 32cdf0e10cSrcweir #include <svl/svdde.hxx> 33cdf0e10cSrcweir #include <sfx2/lnkbase.hxx> 34cdf0e10cSrcweir #include <sfx2/linkmgr.hxx> 35cdf0e10cSrcweir 36cdf0e10cSrcweir #include <tools/urlobj.hxx> 37cdf0e10cSrcweir #include <tools/diagnose_ex.h> 38cdf0e10cSrcweir #include <unotools/pathoptions.hxx> 39cdf0e10cSrcweir #ifndef GCC 40cdf0e10cSrcweir #endif 41cdf0e10cSrcweir 42cdf0e10cSrcweir #include <sfx2/app.hxx> 43cdf0e10cSrcweir #include "appdata.hxx" 44cdf0e10cSrcweir #include <sfx2/objsh.hxx> 45cdf0e10cSrcweir #include <sfx2/viewfrm.hxx> 46cdf0e10cSrcweir #include <sfx2/viewfrm.hxx> 47cdf0e10cSrcweir #include <sfx2/dispatch.hxx> 48cdf0e10cSrcweir #include "sfxtypes.hxx" 49cdf0e10cSrcweir #include <sfx2/sfxsids.hrc> 50cdf0e10cSrcweir #include "helper.hxx" 51cdf0e10cSrcweir #include <sfx2/docfile.hxx> 52cdf0e10cSrcweir 53cdf0e10cSrcweir //======================================================================== 54cdf0e10cSrcweir 55cdf0e10cSrcweir String SfxDdeServiceName_Impl( const String& sIn ) 56cdf0e10cSrcweir { 57cdf0e10cSrcweir ByteString sTemp = U2S( sIn ); 58cdf0e10cSrcweir ByteString sReturn; 59cdf0e10cSrcweir 60cdf0e10cSrcweir for ( sal_uInt16 n = sTemp.Len(); n; --n ) 61cdf0e10cSrcweir if ( sTemp.Copy( n-1, 1 ).IsAlphaNumericAscii() ) 62cdf0e10cSrcweir sReturn += sTemp.GetChar(n-1); 63cdf0e10cSrcweir 64cdf0e10cSrcweir return S2U( sReturn ); 65cdf0e10cSrcweir } 66cdf0e10cSrcweir 67cdf0e10cSrcweir 68cdf0e10cSrcweir class ImplDdeService : public DdeService 69cdf0e10cSrcweir { 70cdf0e10cSrcweir public: 71cdf0e10cSrcweir ImplDdeService( const String& rNm ) 72cdf0e10cSrcweir : DdeService( rNm ) 73cdf0e10cSrcweir {} 74cdf0e10cSrcweir virtual sal_Bool MakeTopic( const String& ); 75cdf0e10cSrcweir 76cdf0e10cSrcweir virtual String Topics(); 77cdf0e10cSrcweir // virtual String Formats(); 78cdf0e10cSrcweir // virtual String SysItems(); 79cdf0e10cSrcweir // virtual String Status(); 80cdf0e10cSrcweir 81cdf0e10cSrcweir virtual sal_Bool SysTopicExecute( const String* pStr ); 82cdf0e10cSrcweir }; 83cdf0e10cSrcweir 84cdf0e10cSrcweir class SfxDdeTriggerTopic_Impl : public DdeTopic 85cdf0e10cSrcweir { 86cdf0e10cSrcweir public: 87cdf0e10cSrcweir SfxDdeTriggerTopic_Impl() 88cdf0e10cSrcweir : DdeTopic( DEFINE_CONST_UNICODE("TRIGGER") ) 89cdf0e10cSrcweir {} 90cdf0e10cSrcweir 91cdf0e10cSrcweir virtual sal_Bool Execute( const String* ); 92cdf0e10cSrcweir }; 93cdf0e10cSrcweir 94cdf0e10cSrcweir class SfxDdeDocTopic_Impl : public DdeTopic 95cdf0e10cSrcweir { 96cdf0e10cSrcweir public: 97cdf0e10cSrcweir SfxObjectShell* pSh; 98cdf0e10cSrcweir DdeData aData; 99cdf0e10cSrcweir ::com::sun::star::uno::Sequence< sal_Int8 > aSeq; 100cdf0e10cSrcweir 101cdf0e10cSrcweir SfxDdeDocTopic_Impl( SfxObjectShell* pShell ) 102cdf0e10cSrcweir : DdeTopic( pShell->GetTitle(SFX_TITLE_FULLNAME) ), pSh( pShell ) 103cdf0e10cSrcweir {} 104cdf0e10cSrcweir 105cdf0e10cSrcweir virtual DdeData* Get( sal_uIntPtr ); 106cdf0e10cSrcweir virtual sal_Bool Put( const DdeData* ); 107cdf0e10cSrcweir virtual sal_Bool Execute( const String* ); 108cdf0e10cSrcweir virtual sal_Bool StartAdviseLoop(); 109cdf0e10cSrcweir virtual sal_Bool MakeItem( const String& rItem ); 110cdf0e10cSrcweir 111cdf0e10cSrcweir // wird benoetigt? 112cdf0e10cSrcweir // virtual void Connect( long n ); 113cdf0e10cSrcweir // virtual void Disconnect( long n ); 114cdf0e10cSrcweir // virtual void StopAdviseLoop(); 115cdf0e10cSrcweir 116cdf0e10cSrcweir }; 117cdf0e10cSrcweir 118cdf0e10cSrcweir 119cdf0e10cSrcweir SV_DECL_PTRARR( SfxDdeDocTopics_Impl, SfxDdeDocTopic_Impl *, 4, 4 ) 120cdf0e10cSrcweir SV_IMPL_PTRARR( SfxDdeDocTopics_Impl, SfxDdeDocTopic_Impl *) 121cdf0e10cSrcweir 122cdf0e10cSrcweir //======================================================================== 123cdf0e10cSrcweir 124cdf0e10cSrcweir sal_Bool SfxAppEvent_Impl( ApplicationEvent &rAppEvent, 125cdf0e10cSrcweir const String &rCmd, const String &rEvent ) 126cdf0e10cSrcweir 127cdf0e10cSrcweir /* [Beschreibung] 128cdf0e10cSrcweir 129cdf0e10cSrcweir Pr"uft, ob 'rCmd' das Event 'rEvent' ist (ohne '(') und baut 130cdf0e10cSrcweir aus diesem dann ein <ApplicationEvent> zusammen, das per 131cdf0e10cSrcweir <Application::AppEvent()> ausgef"uhrt werden kann. Ist 'rCmd' das 132cdf0e10cSrcweir angegegeben Event 'rEvent', dann wird TRUE zur"uckgegeben, sonst FALSE. 133cdf0e10cSrcweir 134cdf0e10cSrcweir 135cdf0e10cSrcweir [Beispiel] 136cdf0e10cSrcweir 137cdf0e10cSrcweir rCmd = "Open(\"d:\doc\doc.sdw\")" 138cdf0e10cSrcweir rEvent = "Open" 139cdf0e10cSrcweir */ 140cdf0e10cSrcweir 141cdf0e10cSrcweir { 142cdf0e10cSrcweir String aEvent( rEvent ); 143cdf0e10cSrcweir aEvent += '('; 144cdf0e10cSrcweir if ( rCmd.CompareIgnoreCaseToAscii( aEvent, aEvent.Len() ) == COMPARE_EQUAL ) 145cdf0e10cSrcweir { 146cdf0e10cSrcweir String aData( rCmd ); 147cdf0e10cSrcweir aData.Erase( 0, aEvent.Len() ); 148cdf0e10cSrcweir if ( aData.Len() > 2 ) 149cdf0e10cSrcweir { 150cdf0e10cSrcweir // in das ApplicationEvent-Format wandeln 151cdf0e10cSrcweir aData.Erase( aData.Len()-1, 1 ); 152cdf0e10cSrcweir for ( sal_uInt16 n = 0; n < aData.Len(); ++n ) 153cdf0e10cSrcweir { 154cdf0e10cSrcweir if ( aData.GetChar(n) == 0x0022 ) // " = 22h 155cdf0e10cSrcweir for ( ; aData.GetChar(++n) != 0x0022 ; ) 156cdf0e10cSrcweir /* empty loop */ ; 157cdf0e10cSrcweir else if ( aData.GetChar(n) == 0x0020 ) // SPACE = 20h 158cdf0e10cSrcweir aData.SetChar(n, '\n'); 159cdf0e10cSrcweir } 160cdf0e10cSrcweir aData.EraseAllChars( 0x0022 ); 161cdf0e10cSrcweir ApplicationAddress aAddr; 162cdf0e10cSrcweir rAppEvent = ApplicationEvent( String(), aAddr, U2S(rEvent), aData ); 163cdf0e10cSrcweir return sal_True; 164cdf0e10cSrcweir } 165cdf0e10cSrcweir } 166cdf0e10cSrcweir 167cdf0e10cSrcweir return sal_False; 168cdf0e10cSrcweir } 169cdf0e10cSrcweir 170cdf0e10cSrcweir //------------------------------------------------------------------------- 171cdf0e10cSrcweir 172cdf0e10cSrcweir long SfxApplication::DdeExecute 173cdf0e10cSrcweir ( 174cdf0e10cSrcweir const String& rCmd // in unserer BASIC-Syntax formuliert 175cdf0e10cSrcweir ) 176cdf0e10cSrcweir 177cdf0e10cSrcweir /* [Beschreibung] 178cdf0e10cSrcweir 179cdf0e10cSrcweir Diese Methode kann vom Applikationsentwickler "uberladen werden, 180cdf0e10cSrcweir um an seine SfxApplication-Subklasse gerichtete DDE-Kommandos 181cdf0e10cSrcweir zu empfangen. 182cdf0e10cSrcweir 183cdf0e10cSrcweir Die Basisimplementierung versteht die API-Funktionalit"at der 184cdf0e10cSrcweir betreffenden SfxApplication-Subklasse in BASIC-Syntax. R"uckgabewerte 185cdf0e10cSrcweir k"onnen dabei leider nicht "ubertragen werden. 186cdf0e10cSrcweir */ 187cdf0e10cSrcweir 188cdf0e10cSrcweir { 189cdf0e10cSrcweir // Print oder Open-Event? 190cdf0e10cSrcweir ApplicationEvent aAppEvent; 191cdf0e10cSrcweir if ( SfxAppEvent_Impl( aAppEvent, rCmd, DEFINE_CONST_UNICODE("Print") ) || 192cdf0e10cSrcweir SfxAppEvent_Impl( aAppEvent, rCmd, DEFINE_CONST_UNICODE("Open") ) ) 193cdf0e10cSrcweir GetpApp()->AppEvent( aAppEvent ); 194cdf0e10cSrcweir else 195cdf0e10cSrcweir { 196cdf0e10cSrcweir // alle anderen per BASIC 197cdf0e10cSrcweir StarBASIC* pBasic = GetBasic(); 198cdf0e10cSrcweir ENSURE_OR_RETURN( pBasic, "where's my basic?", 0 ); 199cdf0e10cSrcweir SbxVariable* pRet = pBasic->Execute( rCmd ); 200cdf0e10cSrcweir if( !pRet ) 201cdf0e10cSrcweir { 202cdf0e10cSrcweir SbxBase::ResetError(); 203cdf0e10cSrcweir return 0; 204cdf0e10cSrcweir } 205cdf0e10cSrcweir } 206cdf0e10cSrcweir return 1; 207cdf0e10cSrcweir } 208cdf0e10cSrcweir 209cdf0e10cSrcweir //-------------------------------------------------------------------- 210cdf0e10cSrcweir 211cdf0e10cSrcweir long SfxApplication::DdeGetData 212cdf0e10cSrcweir ( 213cdf0e10cSrcweir const String&, // das anzusprechende Item 214cdf0e10cSrcweir const String&, // in: Format 215cdf0e10cSrcweir ::com::sun::star::uno::Any& // out: angeforderte Daten 216cdf0e10cSrcweir ) 217cdf0e10cSrcweir 218cdf0e10cSrcweir /* [Beschreibung] 219cdf0e10cSrcweir 220cdf0e10cSrcweir Diese Methode kann vom Applikationsentwickler "uberladen werden, 221cdf0e10cSrcweir um an seine SfxApplication-Subklasse gerichtete DDE-Daten-Anforderungen 222cdf0e10cSrcweir zu empfangen. 223cdf0e10cSrcweir 224cdf0e10cSrcweir Die Basisimplementierung liefert keine Daten und gibt 0 zur"uck. 225cdf0e10cSrcweir */ 226cdf0e10cSrcweir 227cdf0e10cSrcweir { 228cdf0e10cSrcweir return 0; 229cdf0e10cSrcweir } 230cdf0e10cSrcweir 231cdf0e10cSrcweir //-------------------------------------------------------------------- 232cdf0e10cSrcweir 233cdf0e10cSrcweir long SfxApplication::DdeSetData 234cdf0e10cSrcweir ( 235cdf0e10cSrcweir const String&, // das anzusprechende Item 236cdf0e10cSrcweir const String&, // in: Format 237cdf0e10cSrcweir const ::com::sun::star::uno::Any& // out: angeforderte Daten 238cdf0e10cSrcweir ) 239cdf0e10cSrcweir 240cdf0e10cSrcweir /* [Beschreibung] 241cdf0e10cSrcweir 242cdf0e10cSrcweir Diese Methode kann vom Applikationsentwickler "uberladen werden, 243cdf0e10cSrcweir um an seine SfxApplication-Subklasse gerichtete DDE-Daten 244cdf0e10cSrcweir zu empfangen. 245cdf0e10cSrcweir 246cdf0e10cSrcweir Die Basisimplementierung nimmt keine Daten entgegen und liefert 0 zur"uck. 247cdf0e10cSrcweir */ 248cdf0e10cSrcweir 249cdf0e10cSrcweir { 250cdf0e10cSrcweir return 0; 251cdf0e10cSrcweir } 252cdf0e10cSrcweir 253cdf0e10cSrcweir //-------------------------------------------------------------------- 254cdf0e10cSrcweir 255cdf0e10cSrcweir ::sfx2::SvLinkSource* SfxApplication::DdeCreateLinkSource 256cdf0e10cSrcweir ( 257cdf0e10cSrcweir const String& // das zu erzeugende Item 258cdf0e10cSrcweir ) 259cdf0e10cSrcweir 260cdf0e10cSrcweir /* [Beschreibung] 261cdf0e10cSrcweir 262cdf0e10cSrcweir Diese Methode kann vom Applikationsentwickler "uberladen werden, 263cdf0e10cSrcweir um an seiner SfxApplication-Subklasse einen DDE-Hotlink einzurichten 264cdf0e10cSrcweir 265cdf0e10cSrcweir Die Basisimplementierung erzeugt keinen und liefert 0 zur"uck. 266cdf0e10cSrcweir */ 267cdf0e10cSrcweir 268cdf0e10cSrcweir { 269cdf0e10cSrcweir return 0; 270cdf0e10cSrcweir } 271cdf0e10cSrcweir 272cdf0e10cSrcweir //======================================================================== 273cdf0e10cSrcweir 274cdf0e10cSrcweir long SfxObjectShell::DdeExecute 275cdf0e10cSrcweir ( 276cdf0e10cSrcweir const String& rCmd // in unserer BASIC-Syntax formuliert 277cdf0e10cSrcweir ) 278cdf0e10cSrcweir 279cdf0e10cSrcweir /* [Beschreibung] 280cdf0e10cSrcweir 281cdf0e10cSrcweir Diese Methode kann vom Applikationsentwickler "uberladen werden, 282cdf0e10cSrcweir um an seine SfxObjectShell-Subklasse gerichtete DDE-Kommandos 283cdf0e10cSrcweir zu empfangen. 284cdf0e10cSrcweir 285cdf0e10cSrcweir Die Basisimplementierung f"uhrt nichts aus und liefert 0 zur"uck. 286cdf0e10cSrcweir */ 287cdf0e10cSrcweir 288cdf0e10cSrcweir { 289cdf0e10cSrcweir StarBASIC* pBasic = GetBasic(); 290cdf0e10cSrcweir DBG_ASSERT( pBasic, "Wo ist mein Basic???" ) ; 291cdf0e10cSrcweir SbxVariable* pRet = pBasic->Execute( rCmd ); 292cdf0e10cSrcweir if( !pRet ) 293cdf0e10cSrcweir { 294cdf0e10cSrcweir SbxBase::ResetError(); 295cdf0e10cSrcweir return 0; 296cdf0e10cSrcweir } 297cdf0e10cSrcweir 298cdf0e10cSrcweir return 1; 299cdf0e10cSrcweir } 300cdf0e10cSrcweir 301cdf0e10cSrcweir //-------------------------------------------------------------------- 302cdf0e10cSrcweir 303cdf0e10cSrcweir long SfxObjectShell::DdeGetData 304cdf0e10cSrcweir ( 305cdf0e10cSrcweir const String&, // das anzusprechende Item 306cdf0e10cSrcweir const String&, // in: Format 307cdf0e10cSrcweir ::com::sun::star::uno::Any& // out: angeforderte Daten 308cdf0e10cSrcweir ) 309cdf0e10cSrcweir 310cdf0e10cSrcweir /* [Beschreibung] 311cdf0e10cSrcweir 312cdf0e10cSrcweir Diese Methode kann vom Applikationsentwickler "uberladen werden, 313cdf0e10cSrcweir um an seine SfxObjectShell-Subklasse gerichtete DDE-Daten-Anforderungen 314cdf0e10cSrcweir zu empfangen. 315cdf0e10cSrcweir 316cdf0e10cSrcweir Die Basisimplementierung liefert keine Daten und gibt 0 zur"uck. 317cdf0e10cSrcweir */ 318cdf0e10cSrcweir 319cdf0e10cSrcweir { 320cdf0e10cSrcweir return 0; 321cdf0e10cSrcweir } 322cdf0e10cSrcweir 323cdf0e10cSrcweir //-------------------------------------------------------------------- 324cdf0e10cSrcweir 325cdf0e10cSrcweir long SfxObjectShell::DdeSetData 326cdf0e10cSrcweir ( 327cdf0e10cSrcweir const String&, // das anzusprechende Item 328cdf0e10cSrcweir const String&, // in: Format 329cdf0e10cSrcweir const ::com::sun::star::uno::Any& // out: angeforderte Daten 330cdf0e10cSrcweir ) 331cdf0e10cSrcweir 332cdf0e10cSrcweir /* [Beschreibung] 333cdf0e10cSrcweir 334cdf0e10cSrcweir Diese Methode kann vom Applikationsentwickler "uberladen werden, 335cdf0e10cSrcweir um an seine SfxObjectShell-Subklasse gerichtete DDE-Daten 336cdf0e10cSrcweir zu empfangen. 337cdf0e10cSrcweir 338cdf0e10cSrcweir Die Basisimplementierung nimmt keine Daten entgegen und liefert 0 zur"uck. 339cdf0e10cSrcweir */ 340cdf0e10cSrcweir 341cdf0e10cSrcweir { 342cdf0e10cSrcweir return 0; 343cdf0e10cSrcweir } 344cdf0e10cSrcweir 345cdf0e10cSrcweir //-------------------------------------------------------------------- 346cdf0e10cSrcweir ::sfx2::SvLinkSource* SfxObjectShell::DdeCreateLinkSource 347cdf0e10cSrcweir ( 348cdf0e10cSrcweir const String& // das zu erzeugende Item 349cdf0e10cSrcweir ) 350cdf0e10cSrcweir 351cdf0e10cSrcweir /* [Beschreibung] 352cdf0e10cSrcweir 353cdf0e10cSrcweir Diese Methode kann vom Applikationsentwickler "uberladen werden, 354cdf0e10cSrcweir um an seiner SfxObjectShell-Subklasse einen DDE-Hotlink einzurichten 355cdf0e10cSrcweir 356cdf0e10cSrcweir Die Basisimplementierung erzeugt keinen und liefert 0 zur"uck. 357cdf0e10cSrcweir */ 358cdf0e10cSrcweir 359cdf0e10cSrcweir { 360cdf0e10cSrcweir return 0; 361cdf0e10cSrcweir } 362cdf0e10cSrcweir 363cdf0e10cSrcweir //======================================================================== 364cdf0e10cSrcweir 365cdf0e10cSrcweir long SfxViewFrame::DdeExecute 366cdf0e10cSrcweir ( 367cdf0e10cSrcweir const String& rCmd // in unserer BASIC-Syntax formuliert 368cdf0e10cSrcweir ) 369cdf0e10cSrcweir 370cdf0e10cSrcweir /* [Beschreibung] 371cdf0e10cSrcweir 372cdf0e10cSrcweir Diese Methode kann vom Applikationsentwickler "uberladen werden, 373cdf0e10cSrcweir um an seine SfxViewFrame-Subklasse gerichtete DDE-Kommandos 374cdf0e10cSrcweir zu empfangen. 375cdf0e10cSrcweir 376cdf0e10cSrcweir Die Basisimplementierung versteht die API-Funktionalit"at des 377cdf0e10cSrcweir betreffenden SfxViewFrame, der darin dargestellten SfxViewShell und 378cdf0e10cSrcweir der betreffenden SfxObjectShell-Subklasse in BASIC-Syntax. 379cdf0e10cSrcweir R"uckgabewerte k"onnen dabei leider nicht "ubertragen werden. 380cdf0e10cSrcweir */ 381cdf0e10cSrcweir 382cdf0e10cSrcweir { 383cdf0e10cSrcweir if ( GetObjectShell() ) 384cdf0e10cSrcweir return GetObjectShell()->DdeExecute( rCmd ); 385cdf0e10cSrcweir 386cdf0e10cSrcweir return 0; 387cdf0e10cSrcweir } 388cdf0e10cSrcweir 389cdf0e10cSrcweir //-------------------------------------------------------------------- 390cdf0e10cSrcweir 391cdf0e10cSrcweir long SfxViewFrame::DdeGetData 392cdf0e10cSrcweir ( 393cdf0e10cSrcweir const String&, // das anzusprechende Item 394cdf0e10cSrcweir const String&, // in: Format 395cdf0e10cSrcweir ::com::sun::star::uno::Any& // out: angeforderte Daten 396cdf0e10cSrcweir ) 397cdf0e10cSrcweir 398cdf0e10cSrcweir /* [Beschreibung] 399cdf0e10cSrcweir 400cdf0e10cSrcweir Diese Methode kann vom Applikationsentwickler "uberladen werden, 401cdf0e10cSrcweir um an seine SfxViewFrame-Subklasse gerichtete DDE-Daten-Anforderungen 402cdf0e10cSrcweir zu empfangen. 403cdf0e10cSrcweir 404cdf0e10cSrcweir Die Basisimplementierung liefert keine Daten und gibt 0 zur"uck. 405cdf0e10cSrcweir */ 406cdf0e10cSrcweir 407cdf0e10cSrcweir { 408cdf0e10cSrcweir return 0; 409cdf0e10cSrcweir } 410cdf0e10cSrcweir 411cdf0e10cSrcweir //-------------------------------------------------------------------- 412cdf0e10cSrcweir 413cdf0e10cSrcweir long SfxViewFrame::DdeSetData 414cdf0e10cSrcweir ( 415cdf0e10cSrcweir const String& , // das anzusprechende Item 416cdf0e10cSrcweir const String& , // in: Format 417cdf0e10cSrcweir const ::com::sun::star::uno::Any& // out: angeforderte Daten 418cdf0e10cSrcweir ) 419cdf0e10cSrcweir 420cdf0e10cSrcweir /* [Beschreibung] 421cdf0e10cSrcweir 422cdf0e10cSrcweir Diese Methode kann vom Applikationsentwickler "uberladen werden, 423cdf0e10cSrcweir um an seine SfxViewFrame-Subklasse gerichtete DDE-Daten 424cdf0e10cSrcweir zu empfangen. 425cdf0e10cSrcweir 426cdf0e10cSrcweir Die Basisimplementierung nimmt keine Daten entgegen und liefert 0 zur"uck. 427cdf0e10cSrcweir */ 428cdf0e10cSrcweir 429cdf0e10cSrcweir { 430cdf0e10cSrcweir return 0; 431cdf0e10cSrcweir } 432cdf0e10cSrcweir 433cdf0e10cSrcweir //-------------------------------------------------------------------- 434cdf0e10cSrcweir 435cdf0e10cSrcweir ::sfx2::SvLinkSource* SfxViewFrame::DdeCreateLinkSource 436cdf0e10cSrcweir ( 437cdf0e10cSrcweir const String& // das zu erzeugende Item 438cdf0e10cSrcweir ) 439cdf0e10cSrcweir 440cdf0e10cSrcweir /* [Beschreibung] 441cdf0e10cSrcweir 442cdf0e10cSrcweir Diese Methode kann vom Applikationsentwickler "uberladen werden, 443cdf0e10cSrcweir um an seiner SfxViewFrame-Subklasse einen DDE-Hotlink einzurichten 444cdf0e10cSrcweir 445cdf0e10cSrcweir Die Basisimplementierung erzeugt keinen und liefert 0 zur"uck. 446cdf0e10cSrcweir */ 447cdf0e10cSrcweir 448cdf0e10cSrcweir { 449cdf0e10cSrcweir return 0; 450cdf0e10cSrcweir } 451cdf0e10cSrcweir 452cdf0e10cSrcweir //======================================================================== 453cdf0e10cSrcweir 454cdf0e10cSrcweir sal_Bool SfxApplication::InitializeDde() 455cdf0e10cSrcweir { 456cdf0e10cSrcweir DBG_ASSERT( !pAppData_Impl->pDdeService, 457cdf0e10cSrcweir "Dde kann nicht mehrfach initialisiert werden" ); 458cdf0e10cSrcweir 459cdf0e10cSrcweir pAppData_Impl->pDdeService = new ImplDdeService( Application::GetAppName() ); 460cdf0e10cSrcweir int nError = pAppData_Impl->pDdeService->GetError(); 461cdf0e10cSrcweir if( !nError ) 462cdf0e10cSrcweir { 463cdf0e10cSrcweir pAppData_Impl->pDocTopics = new SfxDdeDocTopics_Impl; 464cdf0e10cSrcweir 465cdf0e10cSrcweir // wir wollen auf jedenfall RTF unterstuetzen! 466cdf0e10cSrcweir pAppData_Impl->pDdeService->AddFormat( FORMAT_RTF ); 467cdf0e10cSrcweir 468cdf0e10cSrcweir // Config-Pfad als Topic wegen Mehrfachstart 469cdf0e10cSrcweir INetURLObject aOfficeLockFile( SvtPathOptions().GetUserConfigPath() ); 470cdf0e10cSrcweir aOfficeLockFile.insertName( DEFINE_CONST_UNICODE( "soffice.lck" ) ); 471cdf0e10cSrcweir String aService( SfxDdeServiceName_Impl( 472cdf0e10cSrcweir aOfficeLockFile.GetMainURL(INetURLObject::DECODE_TO_IURI) ) ); 473cdf0e10cSrcweir aService.ToUpperAscii(); 474cdf0e10cSrcweir pAppData_Impl->pDdeService2 = new ImplDdeService( aService ); 475cdf0e10cSrcweir pAppData_Impl->pTriggerTopic = new SfxDdeTriggerTopic_Impl; 476cdf0e10cSrcweir pAppData_Impl->pDdeService2->AddTopic( *pAppData_Impl->pTriggerTopic ); 477cdf0e10cSrcweir } 478cdf0e10cSrcweir return !nError; 479cdf0e10cSrcweir } 480cdf0e10cSrcweir 481cdf0e10cSrcweir void SfxAppData_Impl::DeInitDDE() 482cdf0e10cSrcweir { 483cdf0e10cSrcweir DELETEZ( pTriggerTopic ); 484cdf0e10cSrcweir DELETEZ( pDdeService2 ); 485cdf0e10cSrcweir DELETEZ( pDocTopics ); 486cdf0e10cSrcweir DELETEZ( pDdeService ); 487cdf0e10cSrcweir } 488cdf0e10cSrcweir 489cdf0e10cSrcweir //-------------------------------------------------------------------- 490cdf0e10cSrcweir 491cdf0e10cSrcweir void SfxApplication::AddDdeTopic( SfxObjectShell* pSh ) 492cdf0e10cSrcweir { 493cdf0e10cSrcweir DBG_ASSERT( pAppData_Impl->pDocTopics, "es gibt gar keinen Dde-Service" ); 494cdf0e10cSrcweir //OV: Im Serverbetrieb ist DDE abgeklemmt! 495cdf0e10cSrcweir if( !pAppData_Impl->pDocTopics ) 496cdf0e10cSrcweir return; 497cdf0e10cSrcweir 498cdf0e10cSrcweir // doppeltes Eintragen verhindern 499cdf0e10cSrcweir String sShellNm; 500cdf0e10cSrcweir sal_Bool bFnd = sal_False; 501cdf0e10cSrcweir for( sal_uInt16 n = pAppData_Impl->pDocTopics->Count(); n; ) 502cdf0e10cSrcweir if( (*pAppData_Impl->pDocTopics)[ --n ]->pSh == pSh ) 503cdf0e10cSrcweir { 504cdf0e10cSrcweir // JP 18.03.96 - Bug 26470 505cdf0e10cSrcweir // falls das Document unbenannt wurde, ist trotzdem ein 506cdf0e10cSrcweir // neues Topics anzulegen! 507cdf0e10cSrcweir if( !bFnd ) 508cdf0e10cSrcweir { 509cdf0e10cSrcweir bFnd = sal_True; 510cdf0e10cSrcweir (sShellNm = pSh->GetTitle(SFX_TITLE_FULLNAME)).ToLowerAscii(); 511cdf0e10cSrcweir } 512cdf0e10cSrcweir String sNm( (*pAppData_Impl->pDocTopics)[ n ]->GetName() ); 513cdf0e10cSrcweir if( sShellNm == sNm.ToLowerAscii() ) 514cdf0e10cSrcweir return ; 515cdf0e10cSrcweir } 516cdf0e10cSrcweir 517cdf0e10cSrcweir const SfxDdeDocTopic_Impl* pTopic = new SfxDdeDocTopic_Impl( pSh ); 518cdf0e10cSrcweir pAppData_Impl->pDocTopics->Insert( pTopic, 519cdf0e10cSrcweir pAppData_Impl->pDocTopics->Count() ); 520cdf0e10cSrcweir pAppData_Impl->pDdeService->AddTopic( *pTopic ); 521cdf0e10cSrcweir } 522cdf0e10cSrcweir 523cdf0e10cSrcweir void SfxApplication::RemoveDdeTopic( SfxObjectShell* pSh ) 524cdf0e10cSrcweir { 525cdf0e10cSrcweir DBG_ASSERT( pAppData_Impl->pDocTopics, "es gibt gar keinen Dde-Service" ); 526cdf0e10cSrcweir //OV: Im Serverbetrieb ist DDE abgeklemmt! 527cdf0e10cSrcweir if( !pAppData_Impl->pDocTopics ) 528cdf0e10cSrcweir return; 529cdf0e10cSrcweir 530cdf0e10cSrcweir SfxDdeDocTopic_Impl* pTopic; 531cdf0e10cSrcweir for( sal_uInt16 n = pAppData_Impl->pDocTopics->Count(); n; ) 532cdf0e10cSrcweir if( ( pTopic = (*pAppData_Impl->pDocTopics)[ --n ])->pSh == pSh ) 533cdf0e10cSrcweir { 534cdf0e10cSrcweir pAppData_Impl->pDdeService->RemoveTopic( *pTopic ); 535cdf0e10cSrcweir pAppData_Impl->pDocTopics->DeleteAndDestroy( n ); 536cdf0e10cSrcweir } 537cdf0e10cSrcweir } 538cdf0e10cSrcweir 539cdf0e10cSrcweir const DdeService* SfxApplication::GetDdeService() const 540cdf0e10cSrcweir { 541cdf0e10cSrcweir return pAppData_Impl->pDdeService; 542cdf0e10cSrcweir } 543cdf0e10cSrcweir 544cdf0e10cSrcweir DdeService* SfxApplication::GetDdeService() 545cdf0e10cSrcweir { 546cdf0e10cSrcweir return pAppData_Impl->pDdeService; 547cdf0e10cSrcweir } 548cdf0e10cSrcweir 549cdf0e10cSrcweir //-------------------------------------------------------------------- 550cdf0e10cSrcweir 551cdf0e10cSrcweir sal_Bool ImplDdeService::MakeTopic( const String& rNm ) 552cdf0e10cSrcweir { 553cdf0e10cSrcweir // Workaround gegen Event nach unserem Main() unter OS/2 554cdf0e10cSrcweir // passierte wenn man beim Beenden aus dem OffMgr die App neu startet 555cdf0e10cSrcweir if ( !Application::IsInExecute() ) 556cdf0e10cSrcweir return sal_False; 557cdf0e10cSrcweir 558cdf0e10cSrcweir // das Topic rNm wird gesucht, haben wir es ? 559cdf0e10cSrcweir // erstmal nur ueber die ObjectShells laufen und die mit dem 560cdf0e10cSrcweir // Namen heraussuchen: 561cdf0e10cSrcweir sal_Bool bRet = sal_False; 562cdf0e10cSrcweir String sNm( rNm ); 563cdf0e10cSrcweir sNm.ToLowerAscii(); 564cdf0e10cSrcweir TypeId aType( TYPE(SfxObjectShell) ); 565cdf0e10cSrcweir SfxObjectShell* pShell = SfxObjectShell::GetFirst( &aType ); 566cdf0e10cSrcweir while( pShell ) 567cdf0e10cSrcweir { 568cdf0e10cSrcweir String sTmp( pShell->GetTitle(SFX_TITLE_FULLNAME) ); 569cdf0e10cSrcweir sTmp.ToLowerAscii(); 570cdf0e10cSrcweir if( sTmp == sNm ) // die wollen wir haben 571cdf0e10cSrcweir { 572cdf0e10cSrcweir SFX_APP()->AddDdeTopic( pShell ); 573cdf0e10cSrcweir bRet = sal_True; 574cdf0e10cSrcweir break; 575cdf0e10cSrcweir } 576cdf0e10cSrcweir pShell = SfxObjectShell::GetNext( *pShell, &aType ); 577cdf0e10cSrcweir } 578cdf0e10cSrcweir 579cdf0e10cSrcweir if( !bRet ) 580cdf0e10cSrcweir { 581cdf0e10cSrcweir INetURLObject aWorkPath( SvtPathOptions().GetWorkPath() ); 582cdf0e10cSrcweir INetURLObject aFile; 583cdf0e10cSrcweir if ( aWorkPath.GetNewAbsURL( rNm, &aFile ) && 584cdf0e10cSrcweir SfxContentHelper::IsDocument( aFile.GetMainURL( INetURLObject::NO_DECODE ) ) ) 585cdf0e10cSrcweir { 586cdf0e10cSrcweir // File vorhanden 587cdf0e10cSrcweir 588cdf0e10cSrcweir // dann versuche die Datei zu laden: 589cdf0e10cSrcweir SfxStringItem aName( SID_FILE_NAME, aFile.GetMainURL( INetURLObject::NO_DECODE ) ); 590cdf0e10cSrcweir SfxBoolItem aNewView(SID_OPEN_NEW_VIEW, sal_True); 591cdf0e10cSrcweir 592cdf0e10cSrcweir SfxBoolItem aSilent(SID_SILENT, sal_True); 593cdf0e10cSrcweir SfxDispatcher* pDispatcher = SFX_APP()->GetDispatcher_Impl(); 594cdf0e10cSrcweir const SfxPoolItem* pRet = pDispatcher->Execute( SID_OPENDOC, 595cdf0e10cSrcweir SFX_CALLMODE_SYNCHRON, 596cdf0e10cSrcweir &aName, &aNewView, 597cdf0e10cSrcweir &aSilent, 0L ); 598cdf0e10cSrcweir 599cdf0e10cSrcweir if( pRet && pRet->ISA( SfxViewFrameItem ) && 600cdf0e10cSrcweir ((SfxViewFrameItem*)pRet)->GetFrame() && 601cdf0e10cSrcweir 0 != ( pShell = ((SfxViewFrameItem*)pRet) 602cdf0e10cSrcweir ->GetFrame()->GetObjectShell() ) ) 603cdf0e10cSrcweir { 604cdf0e10cSrcweir SFX_APP()->AddDdeTopic( pShell ); 605cdf0e10cSrcweir bRet = sal_True; 606cdf0e10cSrcweir } 607cdf0e10cSrcweir } 608cdf0e10cSrcweir } 609cdf0e10cSrcweir return bRet; 610cdf0e10cSrcweir } 611cdf0e10cSrcweir 612cdf0e10cSrcweir String ImplDdeService::Topics() 613cdf0e10cSrcweir { 614cdf0e10cSrcweir String sRet; 615cdf0e10cSrcweir if( GetSysTopic() ) 616cdf0e10cSrcweir sRet += GetSysTopic()->GetName(); 617cdf0e10cSrcweir 618cdf0e10cSrcweir TypeId aType( TYPE(SfxObjectShell) ); 619cdf0e10cSrcweir SfxObjectShell* pShell = SfxObjectShell::GetFirst( &aType ); 620cdf0e10cSrcweir while( pShell ) 621cdf0e10cSrcweir { 622cdf0e10cSrcweir if( SfxViewFrame::GetFirst( pShell ) ) 623cdf0e10cSrcweir { 624cdf0e10cSrcweir if( sRet.Len() ) 625cdf0e10cSrcweir sRet += '\t'; 626cdf0e10cSrcweir sRet += pShell->GetTitle(SFX_TITLE_FULLNAME); 627cdf0e10cSrcweir } 628cdf0e10cSrcweir pShell = SfxObjectShell::GetNext( *pShell, &aType ); 629cdf0e10cSrcweir } 630cdf0e10cSrcweir if( sRet.Len() ) 631cdf0e10cSrcweir sRet += DEFINE_CONST_UNICODE("\r\n"); 632cdf0e10cSrcweir return sRet; 633cdf0e10cSrcweir } 634cdf0e10cSrcweir 635cdf0e10cSrcweir sal_Bool ImplDdeService::SysTopicExecute( const String* pStr ) 636cdf0e10cSrcweir { 637cdf0e10cSrcweir return (sal_Bool)SFX_APP()->DdeExecute( *pStr ); 638cdf0e10cSrcweir } 639cdf0e10cSrcweir 640cdf0e10cSrcweir //-------------------------------------------------------------------- 641cdf0e10cSrcweir 642cdf0e10cSrcweir sal_Bool SfxDdeTriggerTopic_Impl::Execute( const String* ) 643cdf0e10cSrcweir { 644cdf0e10cSrcweir return sal_True; 645cdf0e10cSrcweir } 646cdf0e10cSrcweir 647cdf0e10cSrcweir //-------------------------------------------------------------------- 648cdf0e10cSrcweir DdeData* SfxDdeDocTopic_Impl::Get( sal_uIntPtr nFormat ) 649cdf0e10cSrcweir { 650cdf0e10cSrcweir String sMimeType( SotExchange::GetFormatMimeType( nFormat )); 651cdf0e10cSrcweir ::com::sun::star::uno::Any aValue; 652cdf0e10cSrcweir long nRet = pSh->DdeGetData( GetCurItem(), sMimeType, aValue ); 653cdf0e10cSrcweir if( nRet && aValue.hasValue() && ( aValue >>= aSeq ) ) 654cdf0e10cSrcweir { 655cdf0e10cSrcweir aData = DdeData( aSeq.getConstArray(), aSeq.getLength(), nFormat ); 656cdf0e10cSrcweir return &aData; 657cdf0e10cSrcweir } 658cdf0e10cSrcweir aSeq.realloc( 0 ); 659cdf0e10cSrcweir return 0; 660cdf0e10cSrcweir } 661cdf0e10cSrcweir 662cdf0e10cSrcweir sal_Bool SfxDdeDocTopic_Impl::Put( const DdeData* pData ) 663cdf0e10cSrcweir { 664cdf0e10cSrcweir aSeq = ::com::sun::star::uno::Sequence< sal_Int8 >( 665cdf0e10cSrcweir (sal_Int8*)(const void*)*pData, (long)*pData ); 666cdf0e10cSrcweir sal_Bool bRet; 667cdf0e10cSrcweir if( aSeq.getLength() ) 668cdf0e10cSrcweir { 669cdf0e10cSrcweir ::com::sun::star::uno::Any aValue; 670cdf0e10cSrcweir aValue <<= aSeq; 671cdf0e10cSrcweir String sMimeType( SotExchange::GetFormatMimeType( pData->GetFormat() )); 672cdf0e10cSrcweir bRet = 0 != pSh->DdeSetData( GetCurItem(), sMimeType, aValue ); 673cdf0e10cSrcweir } 674cdf0e10cSrcweir else 675cdf0e10cSrcweir bRet = sal_False; 676cdf0e10cSrcweir return bRet; 677cdf0e10cSrcweir } 678cdf0e10cSrcweir 679cdf0e10cSrcweir sal_Bool SfxDdeDocTopic_Impl::Execute( const String* pStr ) 680cdf0e10cSrcweir { 681cdf0e10cSrcweir long nRet = pStr ? pSh->DdeExecute( *pStr ) : 0; 682cdf0e10cSrcweir return 0 != nRet; 683cdf0e10cSrcweir } 684cdf0e10cSrcweir 685cdf0e10cSrcweir sal_Bool SfxDdeDocTopic_Impl::MakeItem( const String& rItem ) 686cdf0e10cSrcweir { 687cdf0e10cSrcweir AddItem( DdeItem( rItem ) ); 688cdf0e10cSrcweir return sal_True; 689cdf0e10cSrcweir } 690cdf0e10cSrcweir 691cdf0e10cSrcweir sal_Bool SfxDdeDocTopic_Impl::StartAdviseLoop() 692cdf0e10cSrcweir { 693cdf0e10cSrcweir sal_Bool bRet = sal_False; 694cdf0e10cSrcweir ::sfx2::SvLinkSource* pNewObj = pSh->DdeCreateLinkSource( GetCurItem() ); 695cdf0e10cSrcweir if( pNewObj ) 696cdf0e10cSrcweir { 697cdf0e10cSrcweir // dann richten wir auch einen entsprechenden SvBaseLink ein 698cdf0e10cSrcweir String sNm, sTmp( Application::GetAppName() ); 699cdf0e10cSrcweir ::sfx2::MakeLnkName( sNm, &sTmp, pSh->GetTitle(SFX_TITLE_FULLNAME), GetCurItem() ); 700cdf0e10cSrcweir new ::sfx2::SvBaseLink( sNm, OBJECT_DDE_EXTERN, pNewObj ); 701cdf0e10cSrcweir bRet = sal_True; 702cdf0e10cSrcweir } 703cdf0e10cSrcweir return bRet; 704cdf0e10cSrcweir } 705cdf0e10cSrcweir 706