1d119d52dSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3d119d52dSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4d119d52dSAndrew Rist * or more contributor license agreements. See the NOTICE file
5d119d52dSAndrew Rist * distributed with this work for additional information
6d119d52dSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7d119d52dSAndrew Rist * to you under the Apache License, Version 2.0 (the
8d119d52dSAndrew Rist * "License"); you may not use this file except in compliance
9d119d52dSAndrew Rist * with the License. You may obtain a copy of the License at
10d119d52dSAndrew Rist *
11d119d52dSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12d119d52dSAndrew Rist *
13d119d52dSAndrew Rist * Unless required by applicable law or agreed to in writing,
14d119d52dSAndrew Rist * software distributed under the License is distributed on an
15d119d52dSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16d119d52dSAndrew Rist * KIND, either express or implied. See the License for the
17d119d52dSAndrew Rist * specific language governing permissions and limitations
18d119d52dSAndrew Rist * under the License.
19d119d52dSAndrew Rist *
20d119d52dSAndrew Rist *************************************************************/
21d119d52dSAndrew Rist
22d119d52dSAndrew 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
SfxDdeServiceName_Impl(const String & sIn)55cdf0e10cSrcweir String SfxDdeServiceName_Impl( const String& sIn )
56cdf0e10cSrcweir {
57*24c56ab9SHerbert Dürr ByteString sTemp( sIn, RTL_TEXTENCODING_UTF8 );
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
64*24c56ab9SHerbert Dürr return String( sReturn, RTL_TEXTENCODING_UTF8 );
65cdf0e10cSrcweir }
66cdf0e10cSrcweir
67cdf0e10cSrcweir
68cdf0e10cSrcweir class ImplDdeService : public DdeService
69cdf0e10cSrcweir {
70cdf0e10cSrcweir public:
ImplDdeService(const String & rNm)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:
SfxDdeTriggerTopic_Impl()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
SfxDdeDocTopic_Impl(SfxObjectShell * pShell)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 )
SV_IMPL_PTRARR(SfxDdeDocTopics_Impl,SfxDdeDocTopic_Impl *)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;
162*24c56ab9SHerbert Dürr rAppEvent = ApplicationEvent( String(), aAddr, ByteString( rEvent, RTL_TEXTENCODING_UTF8), aData );
163cdf0e10cSrcweir return sal_True;
164cdf0e10cSrcweir }
165cdf0e10cSrcweir }
166cdf0e10cSrcweir
167cdf0e10cSrcweir return sal_False;
168cdf0e10cSrcweir }
169cdf0e10cSrcweir
170cdf0e10cSrcweir //-------------------------------------------------------------------------
171cdf0e10cSrcweir
DdeExecute(const String & rCmd)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
DdeGetData(const String &,const String &,::com::sun::star::uno::Any &)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
DdeSetData(const String &,const String &,const::com::sun::star::uno::Any &)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
DdeCreateLinkSource(const String &)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
DdeExecute(const String & rCmd)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
DdeGetData(const String &,const String &,::com::sun::star::uno::Any &)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
DdeSetData(const String &,const String &,const::com::sun::star::uno::Any &)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 //--------------------------------------------------------------------
DdeCreateLinkSource(const String &)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
DdeExecute(const String & rCmd)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
DdeGetData(const String &,const String &,::com::sun::star::uno::Any &)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
DdeSetData(const String &,const String &,const::com::sun::star::uno::Any &)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
DdeCreateLinkSource(const String &)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
InitializeDde()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
DeInitDDE()481cdf0e10cSrcweir void SfxAppData_Impl::DeInitDDE()
482cdf0e10cSrcweir {
483cdf0e10cSrcweir DELETEZ( pTriggerTopic );
484cdf0e10cSrcweir DELETEZ( pDdeService2 );
485cdf0e10cSrcweir DELETEZ( pDocTopics );
486cdf0e10cSrcweir DELETEZ( pDdeService );
487cdf0e10cSrcweir }
488cdf0e10cSrcweir
489cdf0e10cSrcweir //--------------------------------------------------------------------
490cdf0e10cSrcweir
AddDdeTopic(SfxObjectShell * pSh)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
RemoveDdeTopic(SfxObjectShell * pSh)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
GetDdeService() const539cdf0e10cSrcweir const DdeService* SfxApplication::GetDdeService() const
540cdf0e10cSrcweir {
541cdf0e10cSrcweir return pAppData_Impl->pDdeService;
542cdf0e10cSrcweir }
543cdf0e10cSrcweir
GetDdeService()544cdf0e10cSrcweir DdeService* SfxApplication::GetDdeService()
545cdf0e10cSrcweir {
546cdf0e10cSrcweir return pAppData_Impl->pDdeService;
547cdf0e10cSrcweir }
548cdf0e10cSrcweir
549cdf0e10cSrcweir //--------------------------------------------------------------------
550cdf0e10cSrcweir
MakeTopic(const String & rNm)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
Topics()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
SysTopicExecute(const String * pStr)635cdf0e10cSrcweir sal_Bool ImplDdeService::SysTopicExecute( const String* pStr )
636cdf0e10cSrcweir {
637cdf0e10cSrcweir return (sal_Bool)SFX_APP()->DdeExecute( *pStr );
638cdf0e10cSrcweir }
639cdf0e10cSrcweir
640cdf0e10cSrcweir //--------------------------------------------------------------------
641cdf0e10cSrcweir
Execute(const String *)642cdf0e10cSrcweir sal_Bool SfxDdeTriggerTopic_Impl::Execute( const String* )
643cdf0e10cSrcweir {
644cdf0e10cSrcweir return sal_True;
645cdf0e10cSrcweir }
646cdf0e10cSrcweir
647cdf0e10cSrcweir //--------------------------------------------------------------------
Get(sal_uIntPtr nFormat)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
Put(const DdeData * pData)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
Execute(const String * pStr)679cdf0e10cSrcweir sal_Bool SfxDdeDocTopic_Impl::Execute( const String* pStr )
680cdf0e10cSrcweir {
681cdf0e10cSrcweir long nRet = pStr ? pSh->DdeExecute( *pStr ) : 0;
682cdf0e10cSrcweir return 0 != nRet;
683cdf0e10cSrcweir }
684cdf0e10cSrcweir
MakeItem(const String & rItem)685cdf0e10cSrcweir sal_Bool SfxDdeDocTopic_Impl::MakeItem( const String& rItem )
686cdf0e10cSrcweir {
687cdf0e10cSrcweir AddItem( DdeItem( rItem ) );
688cdf0e10cSrcweir return sal_True;
689cdf0e10cSrcweir }
690cdf0e10cSrcweir
StartAdviseLoop()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