xref: /AOO41X/main/basic/source/runtime/stdobj1.cxx (revision e1f63238eb022c8a12b30d46a012444ff20e0951)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_basic.hxx"
26 #include <vcl/wrkwin.hxx>
27 #include <vcl/svapp.hxx>
28 #include <svtools/transfer.hxx>
29 #include "runtime.hxx"
30 #include <basic/sbstdobj.hxx>
31 
32 #define ATTR_IMP_TYPE           1
33 #define ATTR_IMP_WIDTH          2
34 #define ATTR_IMP_HEIGHT         3
35 #define ATTR_IMP_BOLD           4
36 #define ATTR_IMP_ITALIC         5
37 #define ATTR_IMP_STRIKETHROUGH  6
38 #define ATTR_IMP_UNDERLINE      7
39 #define ATTR_IMP_WEIGHT         8
40 #define ATTR_IMP_SIZE           9
41 #define ATTR_IMP_NAME           10
42 
43 #define METH_CLEAR              20
44 #define METH_GETDATA            21
45 #define METH_GETFORMAT          22
46 #define METH_GETTEXT            23
47 #define METH_SETDATA            24
48 #define METH_SETTEXT            25
49 
50 //------------------------------------------------------------------------------
SbStdFactory()51 SbStdFactory::SbStdFactory()
52 {
53 }
54 
CreateObject(const String & rClassName)55 SbxObject* SbStdFactory::CreateObject( const String& rClassName )
56 {
57     if( rClassName.EqualsIgnoreCaseAscii( String( RTL_CONSTASCII_USTRINGPARAM("Picture") ) ) )
58         return new SbStdPicture;
59     else
60         if( rClassName.EqualsIgnoreCaseAscii( String( RTL_CONSTASCII_USTRINGPARAM("Font") ) ) )
61         return new SbStdFont;
62     else
63         return NULL;
64 }
65 
66 //------------------------------------------------------------------------------
67 
68 
69 
PropType(SbxVariable * pVar,SbxArray *,sal_Bool bWrite)70 void SbStdPicture::PropType( SbxVariable* pVar, SbxArray*, sal_Bool bWrite )
71 {
72     if( bWrite )
73     {
74         StarBASIC::Error( SbERR_PROP_READONLY );
75         return;
76     }
77 
78     GraphicType eType = aGraphic.GetType();
79     sal_Int16 nType = 0;
80 
81     if( eType == GRAPHIC_BITMAP )
82         nType = 1;
83     else
84     if( eType != GRAPHIC_NONE )
85         nType = 2;
86 
87     pVar->PutInteger( nType );
88 }
89 
90 
PropWidth(SbxVariable * pVar,SbxArray *,sal_Bool bWrite)91 void SbStdPicture::PropWidth( SbxVariable* pVar, SbxArray*, sal_Bool bWrite )
92 {
93     if( bWrite )
94     {
95         StarBASIC::Error( SbERR_PROP_READONLY );
96         return;
97     }
98 
99     Size aSize = aGraphic.GetPrefSize();
100     aSize = GetpApp()->GetAppWindow()->LogicToPixel( aSize, aGraphic.GetPrefMapMode() );
101     aSize = GetpApp()->GetAppWindow()->PixelToLogic( aSize, MapMode( MAP_TWIP ) );
102 
103     pVar->PutInteger( (sal_Int16)aSize.Width() );
104 }
105 
PropHeight(SbxVariable * pVar,SbxArray *,sal_Bool bWrite)106 void SbStdPicture::PropHeight( SbxVariable* pVar, SbxArray*, sal_Bool bWrite )
107 {
108     if( bWrite )
109     {
110         StarBASIC::Error( SbERR_PROP_READONLY );
111         return;
112     }
113 
114     Size aSize = aGraphic.GetPrefSize();
115     aSize = GetpApp()->GetAppWindow()->LogicToPixel( aSize, aGraphic.GetPrefMapMode() );
116     aSize = GetpApp()->GetAppWindow()->PixelToLogic( aSize, MapMode( MAP_TWIP ) );
117 
118     pVar->PutInteger( (sal_Int16)aSize.Height() );
119 }
120 
121 
122 TYPEINIT1( SbStdPicture, SbxObject );
123 
SbStdPicture()124 SbStdPicture::SbStdPicture() :
125     SbxObject( String( RTL_CONSTASCII_USTRINGPARAM("Picture") ) )
126 {
127     // Properties
128     SbxVariable* p = Make( String( RTL_CONSTASCII_USTRINGPARAM("Type") ), SbxCLASS_PROPERTY, SbxVARIANT );
129     p->SetFlags( SBX_READ | SBX_DONTSTORE );
130     p->SetUserData( ATTR_IMP_TYPE );
131     p = Make( String( RTL_CONSTASCII_USTRINGPARAM("Width") ), SbxCLASS_PROPERTY, SbxVARIANT );
132     p->SetFlags( SBX_READ | SBX_DONTSTORE );
133     p->SetUserData( ATTR_IMP_WIDTH );
134     p = Make( String( RTL_CONSTASCII_USTRINGPARAM("Height") ), SbxCLASS_PROPERTY, SbxVARIANT );
135     p->SetFlags( SBX_READ | SBX_DONTSTORE );
136     p->SetUserData( ATTR_IMP_HEIGHT );
137 }
138 
~SbStdPicture()139 SbStdPicture::~SbStdPicture()
140 {
141 }
142 
143 
Find(const String & rName,SbxClassType t)144 SbxVariable* SbStdPicture::Find( const String& rName, SbxClassType t )
145 {
146     // Bereits eingetragen?
147     return SbxObject::Find( rName, t );
148 }
149 
150 
151 
SFX_NOTIFY(SfxBroadcaster & rBC,const TypeId & rBCType,const SfxHint & rHint,const TypeId & rHintType)152 void SbStdPicture::SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId& rBCType,
153                                const SfxHint& rHint, const TypeId& rHintType )
154 
155 {
156     const SbxHint* pHint = PTR_CAST( SbxHint, &rHint );
157 
158     if( pHint )
159     {
160         if( pHint->GetId() == SBX_HINT_INFOWANTED )
161         {
162             SbxObject::SFX_NOTIFY( rBC, rBCType, rHint, rHintType );
163             return;
164         }
165 
166         SbxVariable* pVar   = pHint->GetVar();
167         SbxArray*    pPar_  = pVar->GetParameters();
168         sal_uInt16       nWhich = (sal_uInt16)pVar->GetUserData();
169         sal_Bool         bWrite = pHint->GetId() == SBX_HINT_DATACHANGED;
170 
171         // Propteries
172         switch( nWhich )
173         {
174             case ATTR_IMP_TYPE:     PropType( pVar, pPar_, bWrite ); return;
175             case ATTR_IMP_WIDTH:    PropWidth( pVar, pPar_, bWrite ); return;
176             case ATTR_IMP_HEIGHT:   PropHeight( pVar, pPar_, bWrite ); return;
177         }
178 
179         SbxObject::SFX_NOTIFY( rBC, rBCType, rHint, rHintType );
180     }
181 }
182 
183 //-----------------------------------------------------------------------------
184 
PropBold(SbxVariable * pVar,SbxArray *,sal_Bool bWrite)185 void SbStdFont::PropBold( SbxVariable* pVar, SbxArray*, sal_Bool bWrite )
186 {
187     if( bWrite )
188         SetBold( pVar->GetBool() );
189     else
190         pVar->PutBool( IsBold() );
191 }
192 
PropItalic(SbxVariable * pVar,SbxArray *,sal_Bool bWrite)193 void SbStdFont::PropItalic( SbxVariable* pVar, SbxArray*, sal_Bool bWrite )
194 {
195     if( bWrite )
196         SetItalic( pVar->GetBool() );
197     else
198         pVar->PutBool( IsItalic() );
199 }
200 
PropStrikeThrough(SbxVariable * pVar,SbxArray *,sal_Bool bWrite)201 void SbStdFont::PropStrikeThrough( SbxVariable* pVar, SbxArray*, sal_Bool bWrite )
202 {
203     if( bWrite )
204         SetStrikeThrough( pVar->GetBool() );
205     else
206         pVar->PutBool( IsStrikeThrough() );
207 }
208 
PropUnderline(SbxVariable * pVar,SbxArray *,sal_Bool bWrite)209 void SbStdFont::PropUnderline( SbxVariable* pVar, SbxArray*, sal_Bool bWrite )
210 {
211     if( bWrite )
212         SetUnderline( pVar->GetBool() );
213     else
214         pVar->PutBool( IsUnderline() );
215 }
216 
PropSize(SbxVariable * pVar,SbxArray *,sal_Bool bWrite)217 void SbStdFont::PropSize( SbxVariable* pVar, SbxArray*, sal_Bool bWrite )
218 {
219     if( bWrite )
220         SetSize( (sal_uInt16)pVar->GetInteger() );
221     else
222         pVar->PutInteger( (sal_Int16)GetSize() );
223 }
224 
PropName(SbxVariable * pVar,SbxArray *,sal_Bool bWrite)225 void SbStdFont::PropName( SbxVariable* pVar, SbxArray*, sal_Bool bWrite )
226 {
227     if( bWrite )
228         SetFontName( pVar->GetString() );
229     else
230         pVar->PutString( GetFontName() );
231 }
232 
233 
234 TYPEINIT1( SbStdFont, SbxObject );
235 
SbStdFont()236 SbStdFont::SbStdFont() :
237     SbxObject( String( RTL_CONSTASCII_USTRINGPARAM("Font") ) )
238 {
239     // Properties
240     SbxVariable* p = Make( String( RTL_CONSTASCII_USTRINGPARAM("Bold") ), SbxCLASS_PROPERTY, SbxVARIANT );
241     p->SetFlags( SBX_READWRITE | SBX_DONTSTORE );
242     p->SetUserData( ATTR_IMP_BOLD );
243     p = Make( String( RTL_CONSTASCII_USTRINGPARAM("Italic") ), SbxCLASS_PROPERTY, SbxVARIANT );
244     p->SetFlags( SBX_READWRITE | SBX_DONTSTORE );
245     p->SetUserData( ATTR_IMP_ITALIC );
246     p = Make( String( RTL_CONSTASCII_USTRINGPARAM("StrikeThrough") ), SbxCLASS_PROPERTY, SbxVARIANT );
247     p->SetFlags( SBX_READWRITE | SBX_DONTSTORE );
248     p->SetUserData( ATTR_IMP_STRIKETHROUGH );
249     p = Make( String( RTL_CONSTASCII_USTRINGPARAM("Underline") ), SbxCLASS_PROPERTY, SbxVARIANT );
250     p->SetFlags( SBX_READWRITE | SBX_DONTSTORE );
251     p->SetUserData( ATTR_IMP_UNDERLINE );
252     p = Make( String( RTL_CONSTASCII_USTRINGPARAM("Size") ), SbxCLASS_PROPERTY, SbxVARIANT );
253     p->SetFlags( SBX_READWRITE | SBX_DONTSTORE );
254     p->SetUserData( ATTR_IMP_SIZE );
255 
256     // Name Property selbst verarbeiten
257     p = Find( String( RTL_CONSTASCII_USTRINGPARAM("Name") ), SbxCLASS_PROPERTY );
258     DBG_ASSERT( p, "Keine Name Property" );
259     p->SetUserData( ATTR_IMP_NAME );
260 }
261 
~SbStdFont()262 SbStdFont::~SbStdFont()
263 {
264 }
265 
266 
Find(const String & rName,SbxClassType t)267 SbxVariable* SbStdFont::Find( const String& rName, SbxClassType t )
268 {
269     // Bereits eingetragen?
270     return SbxObject::Find( rName, t );
271 }
272 
273 
274 
SFX_NOTIFY(SfxBroadcaster & rBC,const TypeId & rBCType,const SfxHint & rHint,const TypeId & rHintType)275 void SbStdFont::SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId& rBCType,
276                             const SfxHint& rHint, const TypeId& rHintType )
277 {
278     const SbxHint* pHint = PTR_CAST( SbxHint, &rHint );
279 
280     if( pHint )
281     {
282         if( pHint->GetId() == SBX_HINT_INFOWANTED )
283         {
284             SbxObject::SFX_NOTIFY( rBC, rBCType, rHint, rHintType );
285             return;
286         }
287 
288         SbxVariable* pVar   = pHint->GetVar();
289         SbxArray*    pPar_  = pVar->GetParameters();
290         sal_uInt16       nWhich = (sal_uInt16)pVar->GetUserData();
291         sal_Bool         bWrite = pHint->GetId() == SBX_HINT_DATACHANGED;
292 
293         // Propteries
294         switch( nWhich )
295         {
296             case ATTR_IMP_BOLD:         PropBold( pVar, pPar_, bWrite ); return;
297             case ATTR_IMP_ITALIC:       PropItalic( pVar, pPar_, bWrite ); return;
298             case ATTR_IMP_STRIKETHROUGH:PropStrikeThrough( pVar, pPar_, bWrite ); return;
299             case ATTR_IMP_UNDERLINE:    PropUnderline( pVar, pPar_, bWrite ); return;
300             case ATTR_IMP_SIZE:         PropSize( pVar, pPar_, bWrite ); return;
301             case ATTR_IMP_NAME:         PropName( pVar, pPar_, bWrite ); return;
302         }
303 
304         SbxObject::SFX_NOTIFY( rBC, rBCType, rHint, rHintType );
305     }
306 }
307 
308 
309 //-----------------------------------------------------------------------------
310 
311 /*
312 class TransferableHelperImpl : public TransferableHelper
313 {
314     SotFormatStringId   mFormat;
315     String              mString;
316     Graphic             mGraphic;
317 
318     virtual void        AddSupportedFormats();
319     virtual sal_Bool    GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor );
320 
321 public:
322     TransferableHelperImpl( void ) { mFormat = 0; }
323     TransferableHelperImpl( const String& rStr )
324         mFormat( FORMAT_STRING ), mString( rStr ) {}
325     TransferableHelperImpl( const Graphic& rGraphic );
326         mFormat( FORMAT_BITMAP ), mGraphic( rGraphic ) {}
327 
328 };
329 
330 void TransferableHelperImpl::AddSupportedFormats()
331 {
332 }
333 
334 sal_Bool TransferableHelperImpl::GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor )
335 {
336     sal_uInt32 nFormat = SotExchange::GetFormat( rFlavor );
337     if( nFormat == FORMAT_STRING )
338     {
339     }
340     else if( nFormat == FORMAT_BITMAP ||
341              nFormat == FORMAT_GDIMETAFILE )
342     {
343     }
344 }
345 */
346 
MethClear(SbxVariable *,SbxArray * pPar_,sal_Bool)347 void SbStdClipboard::MethClear( SbxVariable*, SbxArray* pPar_, sal_Bool )
348 {
349     if( pPar_ && (pPar_->Count() > 1) )
350     {
351         StarBASIC::Error( SbERR_BAD_NUMBER_OF_ARGS );
352         return;
353     }
354 
355     //Clipboard::Clear();
356 }
357 
MethGetData(SbxVariable * pVar,SbxArray * pPar_,sal_Bool)358 void SbStdClipboard::MethGetData( SbxVariable* pVar, SbxArray* pPar_, sal_Bool )
359 {
360     (void)pVar;
361 
362     if( !pPar_ || (pPar_->Count() != 2) )
363     {
364         StarBASIC::Error( SbERR_BAD_NUMBER_OF_ARGS );
365         return;
366     }
367 
368     sal_uInt16 nFormat = pPar_->Get(1)->GetInteger();
369     if( !nFormat  || nFormat > 3 )
370     {
371         StarBASIC::Error( SbERR_BAD_ARGUMENT );
372         return;
373     }
374 
375     /*
376     if( nFormat == FORMAT_STRING )
377         pVar->PutString( Clipboard::PasteString() );
378     else
379     if( (nFormat == FORMAT_BITMAP) ||
380         (nFormat == FORMAT_GDIMETAFILE ) )
381     {
382         SbxObjectRef xPic = new SbStdPicture;
383         Graphic aGraph;
384         aGraph.Paste();
385         ((SbStdPicture*)(SbxObject*)xPic)->SetGraphic( aGraph );
386         pVar->PutObject( xPic );
387     }
388     */
389 }
390 
MethGetFormat(SbxVariable * pVar,SbxArray * pPar_,sal_Bool)391 void SbStdClipboard::MethGetFormat( SbxVariable* pVar, SbxArray* pPar_, sal_Bool )
392 {
393     if( !pPar_ || (pPar_->Count() != 2) )
394     {
395         StarBASIC::Error( SbERR_BAD_NUMBER_OF_ARGS );
396         return;
397     }
398 
399     sal_uInt16 nFormat = pPar_->Get(1)->GetInteger();
400     if( !nFormat  || nFormat > 3 )
401     {
402         StarBASIC::Error( SbERR_BAD_ARGUMENT );
403         return;
404     }
405 
406     pVar->PutBool( sal_False );
407     //pVar->PutBool( Clipboard::HasFormat( nFormat ) );
408 }
409 
MethGetText(SbxVariable * pVar,SbxArray * pPar_,sal_Bool)410 void SbStdClipboard::MethGetText( SbxVariable* pVar, SbxArray* pPar_, sal_Bool )
411 {
412     if( pPar_ && (pPar_->Count() > 1) )
413     {
414         StarBASIC::Error( SbERR_BAD_NUMBER_OF_ARGS );
415         return;
416     }
417 
418     pVar->PutString( String() );
419     //pVar->PutString( Clipboard::PasteString() );
420 }
421 
MethSetData(SbxVariable * pVar,SbxArray * pPar_,sal_Bool)422 void SbStdClipboard::MethSetData( SbxVariable* pVar, SbxArray* pPar_, sal_Bool )
423 {
424     (void)pVar;
425 
426     if( !pPar_ || (pPar_->Count() != 3) )
427     {
428         StarBASIC::Error( SbERR_BAD_NUMBER_OF_ARGS );
429         return;
430     }
431 
432     sal_uInt16 nFormat = pPar_->Get(2)->GetInteger();
433     if( !nFormat  || nFormat > 3 )
434     {
435         StarBASIC::Error( SbERR_BAD_ARGUMENT );
436         return;
437     }
438 
439     /*
440     if( nFormat == FORMAT_STRING )
441     {
442         Clipboard::CopyString( pPar_->Get(1)->GetString() );
443     }
444     else
445     if( (nFormat == FORMAT_BITMAP) ||
446         (nFormat == FORMAT_GDIMETAFILE) )
447     {
448         SbxObject* pObj = (SbxObject*)pPar_->Get(1)->GetObject();
449 
450         if( pObj && pObj->IsA( TYPE( SbStdPicture ) ) )
451             ((SbStdPicture*)(SbxObject*)pObj)->GetGraphic().Copy();
452     }
453     */
454 }
455 
MethSetText(SbxVariable * pVar,SbxArray * pPar_,sal_Bool)456 void SbStdClipboard::MethSetText( SbxVariable* pVar, SbxArray* pPar_, sal_Bool )
457 {
458     (void)pVar;
459 
460     if( !pPar_ || (pPar_->Count() != 2) )
461     {
462         StarBASIC::Error( SbERR_BAD_NUMBER_OF_ARGS );
463         return;
464     }
465 
466     // Clipboard::CopyString( pPar_->Get(1)->GetString() );
467 }
468 
469 
470 TYPEINIT1( SbStdClipboard, SbxObject );
471 
SbStdClipboard()472 SbStdClipboard::SbStdClipboard() :
473     SbxObject( String( RTL_CONSTASCII_USTRINGPARAM("Clipboard") ) )
474 {
475     // Name Property selbst verarbeiten
476     SbxVariable* p = Find( String( RTL_CONSTASCII_USTRINGPARAM("Name") ), SbxCLASS_PROPERTY );
477     DBG_ASSERT( p, "Keine Name Property" );
478     p->SetUserData( ATTR_IMP_NAME );
479 
480     //Methoden registrieren
481     p = Make( String( RTL_CONSTASCII_USTRINGPARAM("Clear") ), SbxCLASS_METHOD, SbxEMPTY );
482     p->SetFlag( SBX_DONTSTORE );
483     p->SetUserData( METH_CLEAR );
484     p = Make( String( RTL_CONSTASCII_USTRINGPARAM("GetData") ), SbxCLASS_METHOD, SbxEMPTY );
485     p->SetFlag( SBX_DONTSTORE );
486     p->SetUserData( METH_GETDATA );
487     p = Make( String( RTL_CONSTASCII_USTRINGPARAM("GetFormat") ), SbxCLASS_METHOD, SbxEMPTY );
488     p->SetFlag( SBX_DONTSTORE );
489     p->SetUserData( METH_GETFORMAT );
490     p = Make( String( RTL_CONSTASCII_USTRINGPARAM("GetText") ), SbxCLASS_METHOD, SbxEMPTY );
491     p->SetFlag( SBX_DONTSTORE );
492     p->SetUserData( METH_GETTEXT );
493     p = Make( String( RTL_CONSTASCII_USTRINGPARAM("SetData") ), SbxCLASS_METHOD, SbxEMPTY );
494     p->SetFlag( SBX_DONTSTORE );
495     p->SetUserData( METH_SETDATA );
496     p = Make( String( RTL_CONSTASCII_USTRINGPARAM("SetText") ), SbxCLASS_METHOD, SbxEMPTY );
497     p->SetFlag( SBX_DONTSTORE );
498     p->SetUserData( METH_SETTEXT );
499 }
500 
~SbStdClipboard()501 SbStdClipboard::~SbStdClipboard()
502 {
503 }
504 
505 
Find(const String & rName,SbxClassType t)506 SbxVariable* SbStdClipboard::Find( const String& rName, SbxClassType t )
507 {
508     // Bereits eingetragen?
509     return SbxObject::Find( rName, t );
510 }
511 
512 
513 
SFX_NOTIFY(SfxBroadcaster & rBC,const TypeId & rBCType,const SfxHint & rHint,const TypeId & rHintType)514 void SbStdClipboard::SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId& rBCType,
515                                  const SfxHint& rHint, const TypeId& rHintType )
516 {
517     const SbxHint* pHint = PTR_CAST( SbxHint, &rHint );
518 
519     if( pHint )
520     {
521         if( pHint->GetId() == SBX_HINT_INFOWANTED )
522         {
523             SbxObject::SFX_NOTIFY( rBC, rBCType, rHint, rHintType );
524             return;
525         }
526 
527         SbxVariable* pVar   = pHint->GetVar();
528         SbxArray*    pPar_  = pVar->GetParameters();
529         sal_uInt16       nWhich = (sal_uInt16)pVar->GetUserData();
530         sal_Bool         bWrite = pHint->GetId() == SBX_HINT_DATACHANGED;
531 
532         // Methods
533         switch( nWhich )
534         {
535             case METH_CLEAR:            MethClear( pVar, pPar_, bWrite ); return;
536             case METH_GETDATA:          MethGetData( pVar, pPar_, bWrite ); return;
537             case METH_GETFORMAT:        MethGetFormat( pVar, pPar_, bWrite ); return;
538             case METH_GETTEXT:          MethGetText( pVar, pPar_, bWrite ); return;
539             case METH_SETDATA:          MethSetData( pVar, pPar_, bWrite ); return;
540             case METH_SETTEXT:          MethSetText( pVar, pPar_, bWrite ); return;
541         }
542 
543         SbxObject::SFX_NOTIFY( rBC, rBCType, rHint, rHintType );
544     }
545 }
546 
547 
548