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_sw.hxx"
26
27
28 #include <hintids.hxx>
29 #include <vcl/svapp.hxx>
30 #include <vcl/wrkwin.hxx>
31
32 #include <toolkit/helper/vclunohelper.hxx>
33 #include <svtools/htmlkywd.hxx>
34 #include <svtools/htmltokn.h>
35 #include <svl/urihelper.hxx>
36 #include <sfx2/request.hxx>
37 #include <sfx2/docfile.hxx>
38 #include <sfx2/viewfrm.hxx>
39 #include <editeng/lrspitem.hxx>
40 #include <editeng/ulspitem.hxx>
41 #include <editeng/brshitem.hxx>
42 #include <editeng/colritem.hxx>
43 #include <editeng/fontitem.hxx>
44 #include <editeng/fhgtitem.hxx>
45 #include <editeng/wghtitem.hxx>
46 #include <editeng/postitem.hxx>
47 #include <editeng/udlnitem.hxx>
48 #include <editeng/crsditem.hxx>
49 #include <svx/svdouno.hxx>
50 #include <svx/fmglob.hxx>
51 #include <com/sun/star/form/ListSourceType.hpp>
52 #include <com/sun/star/form/FormButtonType.hpp>
53 #include <com/sun/star/form/FormSubmitEncoding.hpp>
54 #include <com/sun/star/form/FormSubmitMethod.hpp>
55 #include <com/sun/star/drawing/XDrawPageSupplier.hpp>
56 #include <com/sun/star/script/XEventAttacherManager.hpp>
57 #include <com/sun/star/text/WrapTextMode.hpp>
58 #include <com/sun/star/text/HoriOrientation.hpp>
59 #include <com/sun/star/text/VertOrientation.hpp>
60 #include <com/sun/star/text/TextContentAnchorType.hpp>
61 #include <com/sun/star/container/XIndexContainer.hpp>
62 #include <com/sun/star/drawing/XControlShape.hpp>
63 #include <com/sun/star/awt/XTextLayoutConstrains.hpp>
64 #include <com/sun/star/awt/XLayoutConstrains.hpp>
65 #include <com/sun/star/awt/XImageConsumer.hpp>
66 #include <com/sun/star/awt/ImageStatus.hpp>
67 #include <com/sun/star/form/XImageProducerSupplier.hpp>
68 #include <com/sun/star/form/XForm.hpp>
69 #include <doc.hxx>
70 #include <pam.hxx>
71 #include <swtable.hxx>
72 #include <fmtanchr.hxx>
73 #include <htmltbl.hxx>
74 #include <docsh.hxx>
75 #include <viewsh.hxx>
76 #include <unodraw.hxx>
77 #include <unotextrange.hxx>
78 #include "dcontact.hxx"
79
80 #include "swcss1.hxx"
81 #include "swhtml.hxx"
82 #include "htmlform.hxx"
83
84
85 using namespace ::com::sun::star;
86 using namespace ::com::sun::star::uno;
87 using namespace ::com::sun::star::lang;
88 using namespace ::com::sun::star::form;
89 using ::rtl::OUString;
90
91 const sal_uInt16 TABINDEX_MIN = 0;
92 const sal_uInt16 TABINDEX_MAX = 32767;
93
94 static HTMLOptionEnum __FAR_DATA aHTMLFormMethodTable[] =
95 {
96 { OOO_STRING_SVTOOLS_HTML_METHOD_get, FormSubmitMethod_GET },
97 { OOO_STRING_SVTOOLS_HTML_METHOD_post, FormSubmitMethod_POST },
98 { 0, 0 }
99 };
100
101 static HTMLOptionEnum __FAR_DATA aHTMLFormEncTypeTable[] =
102 {
103 { OOO_STRING_SVTOOLS_HTML_ET_url, FormSubmitEncoding_URL },
104 { OOO_STRING_SVTOOLS_HTML_ET_multipart, FormSubmitEncoding_MULTIPART },
105 { OOO_STRING_SVTOOLS_HTML_ET_text, FormSubmitEncoding_TEXT },
106 { 0, 0 }
107 };
108
109 enum HTMLWordWrapMode { HTML_WM_OFF, HTML_WM_HARD, HTML_WM_SOFT };
110
111 static HTMLOptionEnum __FAR_DATA aHTMLTextAreaWrapTable[] =
112 {
113 { OOO_STRING_SVTOOLS_HTML_WW_off, HTML_WM_OFF },
114 { OOO_STRING_SVTOOLS_HTML_WW_hard, HTML_WM_HARD },
115 { OOO_STRING_SVTOOLS_HTML_WW_soft, HTML_WM_SOFT },
116 { OOO_STRING_SVTOOLS_HTML_WW_physical,HTML_WM_HARD },
117 { OOO_STRING_SVTOOLS_HTML_WW_virtual, HTML_WM_SOFT },
118 { 0, 0 }
119 };
120
121 HTMLEventType __FAR_DATA aEventTypeTable[] =
122 {
123 HTML_ET_ONSUBMITFORM,
124 HTML_ET_ONRESETFORM,
125 HTML_ET_ONGETFOCUS,
126 HTML_ET_ONLOSEFOCUS,
127 HTML_ET_ONCLICK,
128 HTML_ET_ONCLICK_ITEM,
129 HTML_ET_ONCHANGE,
130 HTML_ET_ONSELECT,
131 HTML_ET_END
132 };
133
134 const sal_Char * __FAR_DATA aEventListenerTable[] =
135 {
136 "XSubmitListener",
137 "XResetListener",
138 "XFocusListener",
139 "XFocusListener",
140 "XApproveActionListener",
141 "XItemListener",
142 "XChangeListener",
143 ""
144 };
145
146 const sal_Char * __FAR_DATA aEventMethodTable[] =
147 {
148 "approveSubmit",
149 "approveReset",
150 "focusGained",
151 "focusLost",
152 "approveAction",
153 "itemStateChanged",
154 "changed",
155 ""
156 };
157
158 const sal_Char * __FAR_DATA aEventSDOptionTable[] =
159 {
160 OOO_STRING_SVTOOLS_HTML_O_SDonsubmit,
161 OOO_STRING_SVTOOLS_HTML_O_SDonreset,
162 OOO_STRING_SVTOOLS_HTML_O_SDonfocus,
163 OOO_STRING_SVTOOLS_HTML_O_SDonblur,
164 OOO_STRING_SVTOOLS_HTML_O_SDonclick,
165 OOO_STRING_SVTOOLS_HTML_O_SDonclick,
166 OOO_STRING_SVTOOLS_HTML_O_SDonchange,
167 0
168 };
169
170 const sal_Char * __FAR_DATA aEventOptionTable[] =
171 {
172 OOO_STRING_SVTOOLS_HTML_O_onsubmit,
173 OOO_STRING_SVTOOLS_HTML_O_onreset,
174 OOO_STRING_SVTOOLS_HTML_O_onfocus,
175 OOO_STRING_SVTOOLS_HTML_O_onblur,
176 OOO_STRING_SVTOOLS_HTML_O_onclick,
177 OOO_STRING_SVTOOLS_HTML_O_onclick,
178 OOO_STRING_SVTOOLS_HTML_O_onchange,
179 0
180 };
181
182 /* */
183
184 class SwHTMLForm_Impl
185 {
186 SwDocShell *pDocSh;
187
188 SvKeyValueIterator *pHeaderAttrs;
189
190 // gecachte Interfaces
191 uno::Reference< drawing::XDrawPage > xDrawPage;
192 uno::Reference< container::XIndexContainer > xForms;
193 uno::Reference< drawing::XShapes > xShapes;
194 uno::Reference< XMultiServiceFactory > xServiceFactory;
195
196 uno::Reference< script::XEventAttacherManager > xControlEventManager;
197 uno::Reference< script::XEventAttacherManager > xFormEventManager;
198
199 // Kontext-Informationen
200 uno::Reference< container::XIndexContainer > xFormComps;
201 uno::Reference< beans::XPropertySet > xFCompPropSet;
202 uno::Reference< drawing::XShape > xShape;
203
204 String sText;
205 SvStringsDtor aStringList;
206 SvStringsDtor aValueList;
207 SvUShorts aSelectedList;
208
209 public:
210
SwHTMLForm_Impl(SwDocShell * pDSh)211 SwHTMLForm_Impl( SwDocShell *pDSh ) :
212 pDocSh( pDSh ),
213 pHeaderAttrs( pDSh ? pDSh->GetHeaderAttributes() : 0 )
214 {
215 ASSERT( pDocSh, "Keine DocShell, keine Controls" );
216 }
217
218 const uno::Reference< XMultiServiceFactory >& GetServiceFactory();
219 const uno::Reference< drawing::XDrawPage >& GetDrawPage();
220 const uno::Reference< drawing::XShapes >& GetShapes();
221 const uno::Reference< script::XEventAttacherManager >& GetControlEventManager();
222 const uno::Reference< script::XEventAttacherManager >& GetFormEventManager();
223 const uno::Reference< container::XIndexContainer >& GetForms();
224
GetFormComps() const225 const uno::Reference< container::XIndexContainer >& GetFormComps() const
226 {
227 return xFormComps;
228 }
229
SetFormComps(const uno::Reference<container::XIndexContainer> & r)230 void SetFormComps( const uno::Reference< container::XIndexContainer >& r )
231 {
232 xFormComps = r;
233 }
234
ReleaseFormComps()235 void ReleaseFormComps() { xFormComps = 0; xControlEventManager = 0; }
236
GetFCompPropSet() const237 const uno::Reference< beans::XPropertySet >& GetFCompPropSet() const
238 {
239 return xFCompPropSet;
240 }
241
SetFCompPropSet(const uno::Reference<beans::XPropertySet> & r)242 void SetFCompPropSet( const uno::Reference< beans::XPropertySet >& r )
243 {
244 xFCompPropSet = r;
245 }
246
ReleaseFCompPropSet()247 void ReleaseFCompPropSet() { xFCompPropSet = 0; }
248
GetShape() const249 const uno::Reference< drawing::XShape >& GetShape() const { return xShape; }
SetShape(const uno::Reference<drawing::XShape> & r)250 void SetShape( const uno::Reference< drawing::XShape >& r ) { xShape = r; }
ReleaseShape()251 void ReleaseShape() { xShape = 0; }
252
GetText()253 String& GetText() { return sText; }
EraseText()254 void EraseText() { sText = aEmptyStr; }
255
GetStringList()256 SvStringsDtor& GetStringList() { return aStringList; }
EraseStringList()257 void EraseStringList()
258 {
259 aStringList.DeleteAndDestroy( 0, aStringList.Count() );
260 }
261
GetValueList()262 SvStringsDtor& GetValueList() { return aValueList; }
EraseValueList()263 void EraseValueList()
264 {
265 aValueList.DeleteAndDestroy( 0, aValueList.Count() );
266 }
267
GetSelectedList()268 SvUShorts& GetSelectedList() { return aSelectedList; }
EraseSelectedList()269 void EraseSelectedList()
270 {
271 aSelectedList.Remove( 0, aSelectedList.Count() );
272 }
273
GetHeaderAttrs() const274 SvKeyValueIterator *GetHeaderAttrs() const { return pHeaderAttrs; }
275 };
276
GetServiceFactory()277 const uno::Reference< XMultiServiceFactory >& SwHTMLForm_Impl::GetServiceFactory()
278 {
279 if( !xServiceFactory.is() && pDocSh )
280 {
281 xServiceFactory =
282 uno::Reference< XMultiServiceFactory >( pDocSh->GetBaseModel(),
283 UNO_QUERY );
284 ASSERT( xServiceFactory.is(),
285 "XServiceFactory nicht vom Model erhalten" );
286 }
287 return xServiceFactory;
288 }
289
290
GetDrawPage()291 const uno::Reference< drawing::XDrawPage >& SwHTMLForm_Impl::GetDrawPage()
292 {
293 if( !xDrawPage.is() && pDocSh )
294 {
295 uno::Reference< drawing::XDrawPageSupplier > xTxtDoc( pDocSh->GetBaseModel(),
296 UNO_QUERY );
297 ASSERT( xTxtDoc.is(),
298 "drawing::XDrawPageSupplier nicht vom XModel erhalten" );
299 xDrawPage = xTxtDoc->getDrawPage();
300 ASSERT( xDrawPage.is(), "drawing::XDrawPage nicht erhalten" );
301 }
302 return xDrawPage;
303 }
304
GetForms()305 const uno::Reference< container::XIndexContainer >& SwHTMLForm_Impl::GetForms()
306 {
307 if( !xForms.is() )
308 {
309 GetDrawPage();
310 if( xDrawPage.is() )
311 {
312 uno::Reference< XFormsSupplier > xFormsSupplier( xDrawPage, UNO_QUERY );
313 ASSERT( xFormsSupplier.is(),
314 "XFormsSupplier nicht vom drawing::XDrawPage erhalten" );
315
316 uno::Reference< container::XNameContainer > xNameCont =
317 xFormsSupplier->getForms();
318 xForms = uno::Reference< container::XIndexContainer >( xNameCont,
319 UNO_QUERY );
320
321 ASSERT( xForms.is(), "XForms nicht erhalten" );
322 }
323 }
324 return xForms;
325 }
326
327
GetShapes()328 const uno::Reference< drawing::XShapes > & SwHTMLForm_Impl::GetShapes()
329 {
330 if( !xShapes.is() )
331 {
332 GetDrawPage();
333 if( xDrawPage.is() )
334 {
335 xShapes = uno::Reference< drawing::XShapes >( xDrawPage, UNO_QUERY );
336 ASSERT( xShapes.is(),
337 "XShapes nicht vom drawing::XDrawPage erhalten" );
338 }
339 }
340 return xShapes;
341 }
342
343 const uno::Reference< script::XEventAttacherManager >&
GetControlEventManager()344 SwHTMLForm_Impl::GetControlEventManager()
345 {
346 if( !xControlEventManager.is() && xFormComps.is() )
347 {
348 xControlEventManager =
349 uno::Reference< script::XEventAttacherManager >( xFormComps, UNO_QUERY );
350 ASSERT( xControlEventManager.is(),
351 "uno::Reference< XEventAttacherManager > nicht von xFormComps erhalten" );
352 }
353
354 return xControlEventManager;
355 }
356
357 const uno::Reference< script::XEventAttacherManager >&
GetFormEventManager()358 SwHTMLForm_Impl::GetFormEventManager()
359 {
360 if( !xFormEventManager.is() )
361 {
362 GetForms();
363 if( xForms.is() )
364 {
365 xFormEventManager =
366 uno::Reference< script::XEventAttacherManager >( xForms, UNO_QUERY );
367 ASSERT( xFormEventManager.is(),
368 "uno::Reference< XEventAttacherManager > nicht von xForms erhalten" );
369 }
370 }
371
372 return xFormEventManager;
373 }
374
375 class SwHTMLImageWatcher :
376 public cppu::WeakImplHelper2< awt::XImageConsumer, XEventListener >
377 {
378 uno::Reference< drawing::XShape > xShape; // das control
379 uno::Reference< XImageProducerSupplier > xSrc;
380 uno::Reference< awt::XImageConsumer > xThis; // man selbst
381 sal_Bool bSetWidth;
382 sal_Bool bSetHeight;
383
384 void clear();
385
386 public:
387
388 SwHTMLImageWatcher( const uno::Reference< drawing::XShape > & rShape,
389 sal_Bool bWidth, sal_Bool bHeight );
390 ~SwHTMLImageWatcher();
391
392 // startProduction darf nicht im Konstruktor gerufen werden, weil
393 // wir und ggf. selbst zerstoeren ... Deshlab eine eigene Methode.
start()394 void start() { xSrc->getImageProducer()->startProduction(); }
395
396 // UNO Anbindung
397
398 // XImageConsumer
399 virtual void SAL_CALL init( sal_Int32 Width, sal_Int32 Height)
400 throw( uno::RuntimeException );
401 virtual void SAL_CALL setColorModel(
402 sal_Int16 BitCount, const uno::Sequence< sal_Int32 >& RGBAPal,
403 sal_Int32 RedMask, sal_Int32 GreenMask, sal_Int32 BlueMask,
404 sal_Int32 AlphaMask)
405 throw( uno::RuntimeException );
406 virtual void SAL_CALL setPixelsByBytes(
407 sal_Int32 X, sal_Int32 Y, sal_Int32 Width, sal_Int32 Height,
408 const uno::Sequence< sal_Int8 >& ProducerData,
409 sal_Int32 Offset, sal_Int32 Scansize)
410 throw( uno::RuntimeException );
411 virtual void SAL_CALL setPixelsByLongs(
412 sal_Int32 X, sal_Int32 Y, sal_Int32 Width, sal_Int32 Height,
413 const uno::Sequence< sal_Int32 >& ProducerData,
414 sal_Int32 Offset, sal_Int32 Scansize)
415 throw( uno::RuntimeException );
416 virtual void SAL_CALL complete(
417 sal_Int32 Status,
418 const uno::Reference< awt::XImageProducer > & Producer)
419 throw( uno::RuntimeException );
420
421 // XEventListener
422 virtual void SAL_CALL disposing( const EventObject& Source ) throw ( uno::RuntimeException);
423 };
424
SwHTMLImageWatcher(const uno::Reference<drawing::XShape> & rShape,sal_Bool bWidth,sal_Bool bHeight)425 SwHTMLImageWatcher::SwHTMLImageWatcher(
426 const uno::Reference< drawing::XShape >& rShape,
427 sal_Bool bWidth, sal_Bool bHeight ) :
428 xShape( rShape ),
429 bSetWidth( bWidth ), bSetHeight( bHeight )
430 {
431 // Die Quelle des Images merken
432 uno::Reference< drawing::XControlShape > xControlShape( xShape, UNO_QUERY );
433 uno::Reference< awt::XControlModel > xControlModel(
434 xControlShape->getControl() );
435 xSrc = uno::Reference< XImageProducerSupplier >( xControlModel, UNO_QUERY );
436 ASSERT( xSrc.is(), "Kein XImageProducerSupplier" );
437
438 // Als Event-Listener am Shape anmelden, damit wir es beim dispose
439 // loslassen ko�nnen ...
440 uno::Reference< XEventListener > xEvtLstnr = (XEventListener *)this;
441 uno::Reference< XComponent > xComp( xShape, UNO_QUERY );
442 xComp->addEventListener( xEvtLstnr );
443
444 // Zum Schluss halten wir noch eine Referenz auf uns selbst, damit
445 // wir am Leben bleiben ... (eigentlich sollte das nicht neotig sein,
446 // weil wir ja noch an diversen anderen Stellen angemeldet sind)
447 xThis = (awt::XImageConsumer *)this;
448
449 // und am ImageProducer anmelden, um die Groesse zu erehalten ...
450 xSrc->getImageProducer()->addConsumer( xThis );
451 }
452
~SwHTMLImageWatcher()453 SwHTMLImageWatcher::~SwHTMLImageWatcher()
454 {
455 }
456
clear()457 void SwHTMLImageWatcher::clear()
458 {
459 // Am Shape als Event-Listener abmelden
460 uno::Reference< XEventListener > xEvtLstnr = (XEventListener *)this;
461 uno::Reference< XComponent > xComp( xShape, UNO_QUERY );
462 xComp->removeEventListener( xEvtLstnr );
463
464 // Am ImageProducer abmelden
465 uno::Reference<awt::XImageProducer> xProd = xSrc->getImageProducer();
466 if( xProd.is() )
467 xProd->removeConsumer( xThis );
468 }
469
470 //------------------------------------------------------------------------------
471
init(sal_Int32 Width,sal_Int32 Height)472 void SwHTMLImageWatcher::init( sal_Int32 Width, sal_Int32 Height )
473 throw( uno::RuntimeException )
474 {
475 ASSERT( bSetWidth || bSetHeight,
476 "Breite oder Hoehe muss angepasst werden" );
477
478 // Wenn keine Breite oder Hoehe angegeben ist, ist das das init von
479 // der leeren Grafik, die angezeigt wird, bevor der Stream einer
480 // asynchron anzuzeigenden Grfik verfuegbar ist.
481 if( !Width && !Height )
482 return;
483
484 awt::Size aNewSz;
485 aNewSz.Width = Width;
486 aNewSz.Height = Height;
487 if( Application::GetDefaultDevice() )
488 {
489 Size aTmp(aNewSz.Width, aNewSz.Height);
490 aTmp = Application::GetDefaultDevice()
491 ->PixelToLogic( aTmp, MapMode( MAP_100TH_MM ) );
492 aNewSz.Width = aTmp.Width();
493 aNewSz.Height = aTmp.Height();
494 }
495
496 if( !bSetWidth || !bSetHeight )
497 {
498 awt::Size aSz( xShape->getSize() );
499 if( bSetWidth && aNewSz.Height )
500 {
501 aNewSz.Width *= aSz.Height;
502 aNewSz.Width /= aNewSz.Height;
503 aNewSz.Height = aSz.Height;
504 }
505 if( bSetHeight && aNewSz.Width )
506 {
507 aNewSz.Height *= aSz.Width;
508 aNewSz.Height /= aNewSz.Width;
509 aNewSz.Width = aSz.Width;
510 }
511 }
512 if( aNewSz.Width < MINFLY )
513 aNewSz.Width = MINFLY;
514 if( aNewSz.Height < MINFLY )
515 aNewSz.Height = MINFLY;
516
517 xShape->setSize( aNewSz );
518 if( bSetWidth )
519 {
520 // Wenn das Control in einer Tabelle verankert ist, muesen
521 // die Tabellen-Spalten neu berechnet werden
522
523 // Um an den SwXShape* zu gelangen, brauchen wir ein Interface,
524 // das auch vom SwXShape implementiert wird.
525
526 uno::Reference< beans::XPropertySet > xPropSet( xShape, UNO_QUERY );
527 uno::Reference< XUnoTunnel> xTunnel( xPropSet, UNO_QUERY );
528 SwXShape *pSwShape = xTunnel.is() ?
529 reinterpret_cast< SwXShape * >( sal::static_int_cast< sal_IntPtr>(
530 xTunnel->getSomething(SwXShape::getUnoTunnelId()) ))
531 : 0;
532
533 ASSERT( pSwShape, "Wo ist das SW-Shape?" );
534 if( pSwShape )
535 {
536 SwFrmFmt *pFrmFmt = pSwShape->GetFrmFmt();
537
538 const SwDoc *pDoc = pFrmFmt->GetDoc();
539 const SwPosition* pAPos = pFrmFmt->GetAnchor().GetCntntAnchor();
540 SwNode *pANd;
541 SwTableNode *pTblNd;
542 if( pAPos &&
543 0 != (pANd = & pAPos->nNode.GetNode()) &&
544 0 != (pTblNd = pANd->FindTableNode()) )
545 {
546 const sal_Bool bLastGrf = !pTblNd->GetTable().DecGrfsThatResize();
547 SwHTMLTableLayout *pLayout =
548 pTblNd->GetTable().GetHTMLTableLayout();
549 if( pLayout )
550 {
551 const sal_uInt16 nBrowseWidth =
552 pLayout->GetBrowseWidthByTable( *pDoc );
553
554 if ( nBrowseWidth )
555 {
556 pLayout->Resize( nBrowseWidth, sal_True, sal_True,
557 bLastGrf ? HTMLTABLE_RESIZE_NOW
558 : 500 );
559 }
560 }
561 }
562 }
563 }
564
565 // uns selbst abmelden und loeschen
566 clear();
567 uno::Reference< awt::XImageConsumer > xTmp = (awt::XImageConsumer*)this;
568 xThis = 0;
569 }
570
setColorModel(sal_Int16,const Sequence<sal_Int32> &,sal_Int32,sal_Int32,sal_Int32,sal_Int32)571 void SwHTMLImageWatcher::setColorModel(
572 sal_Int16, const Sequence< sal_Int32 >&, sal_Int32, sal_Int32,
573 sal_Int32, sal_Int32 )
574 throw( uno::RuntimeException )
575 {
576 }
577
setPixelsByBytes(sal_Int32,sal_Int32,sal_Int32,sal_Int32,const Sequence<sal_Int8> &,sal_Int32,sal_Int32)578 void SwHTMLImageWatcher::setPixelsByBytes(
579 sal_Int32, sal_Int32, sal_Int32, sal_Int32,
580 const Sequence< sal_Int8 >&, sal_Int32, sal_Int32 )
581 throw( uno::RuntimeException )
582 {
583 }
584
585
setPixelsByLongs(sal_Int32,sal_Int32,sal_Int32,sal_Int32,const Sequence<sal_Int32> &,sal_Int32,sal_Int32)586 void SwHTMLImageWatcher::setPixelsByLongs(
587 sal_Int32, sal_Int32, sal_Int32, sal_Int32,
588 const Sequence< sal_Int32 >&, sal_Int32, sal_Int32 )
589 throw( uno::RuntimeException )
590 {
591 }
592
593
complete(sal_Int32 Status,const uno::Reference<awt::XImageProducer> &)594 void SwHTMLImageWatcher::complete( sal_Int32 Status,
595 const uno::Reference< awt::XImageProducer >& )
596 throw( uno::RuntimeException )
597 {
598 if( awt::ImageStatus::IMAGESTATUS_ERROR == Status || awt::ImageStatus::IMAGESTATUS_ABORTED == Status )
599 {
600 // uns selbst abmelden und loeschen
601 clear();
602 uno::Reference< awt::XImageConsumer > xTmp = (awt::XImageConsumer*)this;
603 xThis = 0;
604 }
605 }
606
disposing(const lang::EventObject & evt)607 void SwHTMLImageWatcher::disposing(const lang::EventObject& evt) throw ( uno::RuntimeException)
608 {
609 uno::Reference< awt::XImageConsumer > xTmp;
610
611 // Wenn das Shape verschwindet soll muessen wir es loslassen
612 uno::Reference< drawing::XShape > xTmpShape;
613 if( evt.Source == xShape )
614 {
615 clear();
616 xTmp = (awt::XImageConsumer*)this;
617 xThis = 0;
618 }
619 }
620
DeleteFormImpl()621 void SwHTMLParser::DeleteFormImpl()
622 {
623 delete pFormImpl;
624 pFormImpl = 0;
625 }
626
lcl_html_setFixedFontProperty(const uno::Reference<beans::XPropertySet> & rPropSet)627 static void lcl_html_setFixedFontProperty(
628 const uno::Reference< beans::XPropertySet >& rPropSet )
629 {
630 Font aFixedFont( OutputDevice::GetDefaultFont(
631 DEFAULTFONT_FIXED, LANGUAGE_ENGLISH_US,
632 DEFAULTFONT_FLAGS_ONLYONE ) );
633 Any aTmp;
634 aTmp <<= OUString( aFixedFont.GetName() );
635 rPropSet->setPropertyValue( OUString::createFromAscii("FontName"), aTmp );
636
637 aTmp <<= OUString( aFixedFont.GetStyleName() );
638 rPropSet->setPropertyValue( OUString::createFromAscii("FontStyleName"),
639 aTmp );
640
641 aTmp <<= (sal_Int16) aFixedFont.GetFamily();
642 rPropSet->setPropertyValue( OUString::createFromAscii("FontFamily"), aTmp );
643
644 aTmp <<= (sal_Int16) aFixedFont.GetCharSet();
645 rPropSet->setPropertyValue( OUString::createFromAscii("FontCharset"),
646 aTmp );
647
648 aTmp <<= (sal_Int16) aFixedFont.GetPitch();
649 rPropSet->setPropertyValue( OUString::createFromAscii("FontPitch"), aTmp );
650
651 float fVal(10.);
652 aTmp.setValue( &fVal, ::getCppuType(&fVal ));
653 rPropSet->setPropertyValue( OUString::createFromAscii("FontHeight"), aTmp );
654 }
655
656 class SwHTMLFormPendingStackData_Impl: public SwPendingStackData
657 {
658 uno::Reference< drawing::XShape > xShape;
659 Size aTextSz;
660 sal_Bool bMinWidth;
661 sal_Bool bMinHeight;
662
663 public:
664
SwHTMLFormPendingStackData_Impl(const uno::Reference<drawing::XShape> & rShape,const Size & rTextSz,sal_Bool bMinW,sal_Bool bMinH)665 SwHTMLFormPendingStackData_Impl(
666 const uno::Reference< drawing::XShape > & rShape, const Size& rTextSz,
667 sal_Bool bMinW, sal_Bool bMinH ) :
668 xShape( rShape ),
669 aTextSz( rTextSz ),
670 bMinWidth( bMinW ),
671 bMinHeight( bMinH )
672 {}
673
GetShape() const674 const uno::Reference< drawing::XShape >& GetShape() const { return xShape; }
GetTextSize() const675 const Size& GetTextSize() const { return aTextSz; }
IsMinWidth() const676 sal_Bool IsMinWidth() const { return bMinWidth; }
IsMinHeight() const677 sal_Bool IsMinHeight() const { return bMinHeight; }
678 };
679
SetPendingControlSize(int nToken)680 void SwHTMLParser::SetPendingControlSize( int nToken )
681 {
682 ASSERT( pPendStack, "Wo ist der Pending Stack?" );
683 SwHTMLFormPendingStackData_Impl *pData =
684 (SwHTMLFormPendingStackData_Impl *)pPendStack->pData;
685
686 SwPendingStack* pTmp = pPendStack->pNext;
687 delete pPendStack;
688 pPendStack = pTmp;
689 ASSERT( !pPendStack, "Wo kommt der Pending-Stack her?" );
690
691 SetControlSize( pData->GetShape(), pData->GetTextSize(),
692 pData->IsMinWidth(), pData->IsMinHeight(),
693 nToken );
694 delete pData;
695 }
696
SetControlSize(const uno::Reference<drawing::XShape> & rShape,const Size & rTextSz,sal_Bool bMinWidth,sal_Bool bMinHeight,int nToken)697 void SwHTMLParser::SetControlSize( const uno::Reference< drawing::XShape >& rShape,
698 const Size& rTextSz,
699 sal_Bool bMinWidth,
700 sal_Bool bMinHeight,
701 int nToken )
702 {
703 nToken = 0;
704 if( !rTextSz.Width() && !rTextSz.Height() && !bMinWidth && !bMinHeight )
705 return;
706
707 // Um an den SwXShape* zu gelangen, brauchen wir ein Interface,
708 // das auch vom SwXShape implementiert wird.
709 uno::Reference< beans::XPropertySet > xPropSet( rShape, UNO_QUERY );
710
711 ViewShell *pVSh;
712 pDoc->GetEditShell( &pVSh );
713 if( !pVSh && !nEventId )
714 {
715 // If there is no view shell by now and the doc shell is an internal
716 // one, no view shell will be created. That for, we have to do that of
717 // our own. This happens if a linked section is inserted or refreshed.
718 SwDocShell *pDocSh = pDoc->GetDocShell();
719 if( pDocSh )
720 {
721 if ( pDocSh->GetMedium() )
722 {
723 // if there is no hidden property in the MediaDescriptor it should be removed after loading
724 SFX_ITEMSET_ARG( pDocSh->GetMedium()->GetItemSet(), pHiddenItem, SfxBoolItem, SID_HIDDEN, sal_False );
725 bRemoveHidden = ( pHiddenItem == NULL || !pHiddenItem->GetValue() );
726 }
727
728 pTempViewFrame = SfxViewFrame::LoadHiddenDocument( *pDocSh, 0 );
729 CallStartAction();
730 pDoc->GetEditShell( &pVSh );
731 }
732 }
733
734 uno::Reference< XUnoTunnel> xTunnel( xPropSet, UNO_QUERY );
735 SwXShape *pSwShape = xTunnel.is() ?
736 reinterpret_cast< SwXShape *>( sal::static_int_cast< sal_IntPtr >(
737 xTunnel->getSomething(SwXShape::getUnoTunnelId()) ))
738 : 0;
739
740 ASSERT( pSwShape, "Wo ist das SW-Shape?" );
741
742 // es muss ein Draw-Format sein
743 SwFrmFmt *pFrmFmt = pSwShape->GetFrmFmt();
744 ASSERT( RES_DRAWFRMFMT == pFrmFmt->Which(), "Kein DrawFrmFmt" );
745
746 // Schauen, ob es ein SdrObject dafuer gibt
747 const SdrObject *pObj = pFrmFmt->FindSdrObject();
748 ASSERT( pObj, "SdrObject nicht gefunden" );
749 ASSERT( FmFormInventor == pObj->GetObjInventor(), "falscher Inventor" );
750
751 const SdrView* pDrawView = pVSh ? pVSh->GetDrawView() : 0;
752
753 SdrUnoObj *pFormObj = PTR_CAST( SdrUnoObj, pObj );
754 uno::Reference< awt::XControl > xControl;
755 if ( pDrawView && pVSh->GetWin() )
756 xControl = pFormObj->GetUnoControl( *pDrawView, *pVSh->GetWin() );
757
758 awt::Size aSz( rShape->getSize() );
759 awt::Size aNewSz( 0, 0 );
760
761 // #i71248# ensure we got a XControl before apllying corrections
762 if(xControl.is())
763 {
764 if( bMinWidth || bMinHeight )
765 {
766 uno::Reference< awt::XLayoutConstrains > xLC( xControl, UNO_QUERY );
767 awt::Size aTmpSz( xLC->getPreferredSize() );
768 if( bMinWidth )
769 aNewSz.Width = aTmpSz.Width;
770 if( bMinHeight )
771 aNewSz.Height = aTmpSz.Height;
772 }
773 if( rTextSz.Width() || rTextSz.Height())
774 {
775 uno::Reference< awt::XTextLayoutConstrains > xLC( xControl, UNO_QUERY );
776 ASSERT( xLC.is(), "kein XTextLayoutConstrains" );
777 if( xLC.is() )
778 {
779 awt::Size aTmpSz( rTextSz.Width(), rTextSz.Height() );
780 if( -1 == rTextSz.Width() )
781 {
782 aTmpSz.Width = 0;
783 aTmpSz.Height = nSelectEntryCnt;
784 }
785 aTmpSz = xLC->getMinimumSize( static_cast< sal_Int16 >(aTmpSz.Width), static_cast< sal_Int16 >(aTmpSz.Height) );
786 if( rTextSz.Width() )
787 aNewSz.Width = aTmpSz.Width;
788 if( rTextSz.Height() )
789 aNewSz.Height = aTmpSz.Height;
790 }
791 }
792 }
793
794 if( Application::GetDefaultDevice() )
795 {
796 Size aTmpSz( aNewSz.Width, aNewSz.Height );
797 aTmpSz = Application::GetDefaultDevice()
798 ->PixelToLogic( aTmpSz, MapMode( MAP_100TH_MM ) );
799 aNewSz.Width = aTmpSz.Width();
800 aNewSz.Height = aTmpSz.Height();
801 }
802 if( aNewSz.Width )
803 {
804 if( aNewSz.Width < MINLAY )
805 aNewSz.Width = MINLAY;
806 aSz.Width = aNewSz.Width;
807 }
808 if( aNewSz.Height )
809 {
810 if( aNewSz.Height < MINLAY )
811 aNewSz.Height = MINLAY;
812 aSz.Height = aNewSz.Height;
813 }
814
815 rShape->setSize( aSz );
816 }
817
lcl_html_setEvents(const uno::Reference<script::XEventAttacherManager> & rEvtMn,sal_uInt32 nPos,const SvxMacroTableDtor & rMacroTbl,const SvStringsDtor & rUnoMacroTbl,const SvStringsDtor & rUnoMacroParamTbl,const String & rType)818 static void lcl_html_setEvents(
819 const uno::Reference< script::XEventAttacherManager > & rEvtMn,
820 sal_uInt32 nPos, const SvxMacroTableDtor& rMacroTbl,
821 const SvStringsDtor& rUnoMacroTbl,
822 const SvStringsDtor& rUnoMacroParamTbl,
823 const String& rType )
824 {
825 // Erstmal muss die Anzahl der Events ermittelt werden ...
826 sal_Int32 nEvents = 0;
827 sal_uInt16 i;
828
829 for( i = 0; HTML_ET_END != aEventTypeTable[i]; i++ )
830 {
831 const SvxMacro *pMacro = rMacroTbl.Get( aEventTypeTable[i] );
832 // Solange nicht alle Events implementiert sind, enthaelt die
833 // Tabelle auch Leerstrings!
834 if( pMacro && aEventListenerTable[i] )
835 nEvents++;
836 }
837 for( i=0; i< rUnoMacroTbl.Count(); i++ )
838 {
839 const String& rStr = *rUnoMacroTbl[i];
840 xub_StrLen nIndex = 0;
841 if( !rStr.GetToken( 0, '-', nIndex ).Len() || STRING_NOTFOUND == nIndex )
842 continue;
843 if( !rStr.GetToken( 0, '-', nIndex ).Len() || STRING_NOTFOUND == nIndex )
844 continue;
845 if( nIndex < rStr.Len() )
846 nEvents++;
847 }
848
849 if( 0==nEvents )
850 return;
851
852 Sequence<script::ScriptEventDescriptor> aDescs( nEvents );
853 script::ScriptEventDescriptor* pDescs = aDescs.getArray();
854 sal_Int32 nEvent = 0;
855
856 for( i=0; HTML_ET_END != aEventTypeTable[i]; i++ )
857 {
858 const SvxMacro *pMacro = rMacroTbl.Get( aEventTypeTable[i] );
859 if( pMacro && aEventListenerTable[i] )
860 {
861 script::ScriptEventDescriptor& rDesc = pDescs[nEvent++];
862 rDesc.ListenerType =
863 OUString::createFromAscii(aEventListenerTable[i]);
864 rDesc.EventMethod = OUString::createFromAscii(aEventMethodTable[i]);
865 rDesc.ScriptType = pMacro->GetLanguage();
866 rDesc.ScriptCode = pMacro->GetMacName();
867 }
868 }
869
870 for( i=0; i< rUnoMacroTbl.Count(); i++ )
871 {
872 const String& rStr = *rUnoMacroTbl[i];
873 xub_StrLen nIndex = 0;
874 String sListener( rStr.GetToken( 0, '-', nIndex ) );
875 if( !sListener.Len() || STRING_NOTFOUND == nIndex )
876 continue;
877
878 String sMethod( rStr.GetToken( 0, '-', nIndex ) );
879 if( !sMethod.Len() || STRING_NOTFOUND == nIndex )
880 continue;
881
882 String sCode( rStr.Copy( nIndex ) );
883 if( !sCode.Len() )
884 continue;
885
886 script::ScriptEventDescriptor& rDesc = pDescs[nEvent++];
887 rDesc.ListenerType = sListener;
888 rDesc.EventMethod = sMethod;
889 rDesc.ScriptType = rType;
890 rDesc.ScriptCode = sCode;
891 rDesc.AddListenerParam = OUString();
892
893 if( rUnoMacroParamTbl.Count() )
894 {
895 String sSearch( sListener );
896 sSearch += '-';
897 sSearch += sMethod;
898 sSearch += '-';
899 xub_StrLen nLen = sSearch.Len();
900 for( sal_uInt16 j=0; j < rUnoMacroParamTbl.Count(); j++ )
901 {
902 const String& rParam = *rUnoMacroParamTbl[j];
903 if( rParam.CompareTo( sSearch, nLen ) == COMPARE_EQUAL &&
904 rParam.Len() > nLen )
905 {
906 rDesc.AddListenerParam = rParam.Copy(nLen);
907 break;
908 }
909 }
910 }
911 }
912 rEvtMn->registerScriptEvents( nPos, aDescs );
913 }
914
lcl_html_getEvents(const String & rOption,const String & rValue,SvStringsDtor & rUnoMacroTbl,SvStringsDtor & rUnoMacroParamTbl)915 static void lcl_html_getEvents( const String& rOption, const String& rValue,
916 SvStringsDtor& rUnoMacroTbl,
917 SvStringsDtor& rUnoMacroParamTbl )
918 {
919 if( rOption.CompareIgnoreCaseToAscii( OOO_STRING_SVTOOLS_HTML_O_sdevent,
920 sizeof(OOO_STRING_SVTOOLS_HTML_O_sdevent)-1 ) == COMPARE_EQUAL )
921 {
922 String *pEvent = new String( rOption.Copy(sizeof(OOO_STRING_SVTOOLS_HTML_O_sdevent)-1) );
923 *pEvent += '-';
924 *pEvent += rValue;
925 rUnoMacroTbl.Insert( pEvent, rUnoMacroTbl.Count() );
926 }
927 else if( rOption.CompareIgnoreCaseToAscii( OOO_STRING_SVTOOLS_HTML_O_sdaddparam,
928 sizeof(OOO_STRING_SVTOOLS_HTML_O_sdaddparam)-1 ) == COMPARE_EQUAL )
929 {
930 String *pParam =
931 new String( rOption.Copy( sizeof(OOO_STRING_SVTOOLS_HTML_O_sdaddparam)-1 ) );
932 *pParam += '-';
933 *pParam += rValue;
934 rUnoMacroParamTbl.Insert( pParam, rUnoMacroParamTbl.Count() );
935 }
936 }
937
InsertControl(const uno::Reference<XFormComponent> & rFComp,const uno::Reference<beans::XPropertySet> & rFCompPropSet,const Size & rSize,sal_Int16 eVertOri,sal_Int16 eHoriOri,SfxItemSet & rCSS1ItemSet,SvxCSS1PropertyInfo & rCSS1PropInfo,const SvxMacroTableDtor & rMacroTbl,const SvStringsDtor & rUnoMacroTbl,const SvStringsDtor & rUnoMacroParamTbl,sal_Bool bSetFCompPropSet,sal_Bool bHidden)938 uno::Reference< drawing::XShape > SwHTMLParser::InsertControl(
939 const uno::Reference< XFormComponent > & rFComp,
940 const uno::Reference< beans::XPropertySet > & rFCompPropSet,
941 const Size& rSize, sal_Int16 eVertOri, sal_Int16 eHoriOri,
942 SfxItemSet& rCSS1ItemSet, SvxCSS1PropertyInfo& rCSS1PropInfo,
943 const SvxMacroTableDtor& rMacroTbl, const SvStringsDtor& rUnoMacroTbl,
944 const SvStringsDtor& rUnoMacroParamTbl, sal_Bool bSetFCompPropSet,
945 sal_Bool bHidden )
946 {
947 uno::Reference< drawing::XShape > xShape;
948
949 const uno::Reference< container::XIndexContainer > & rFormComps =
950 pFormImpl->GetFormComps();
951 Any aAny( &rFComp, ::getCppuType( (uno::Reference< XFormComponent>*)0 ) );
952 rFormComps->insertByIndex( rFormComps->getCount(), aAny );
953
954 if( !bHidden )
955 {
956 Any aTmp;
957 sal_uInt16 nLeftSpace = 0, nRightSpace = 0,
958 nUpperSpace = 0, nLowerSpace = 0;
959
960 const uno::Reference< XMultiServiceFactory > & rServiceFactory =
961 pFormImpl->GetServiceFactory();
962 if( !rServiceFactory.is() )
963 return xShape;
964
965 uno::Reference< XInterface > xCreate =
966 rServiceFactory ->createInstance(
967 OUString::createFromAscii("com.sun.star.drawing.ControlShape"));
968 if( !xCreate.is() )
969 return xShape;
970
971 xShape = uno::Reference< drawing::XShape >( xCreate, UNO_QUERY );
972
973 DBG_ASSERT( xShape.is(), "XShape nicht erhalten" );
974 awt::Size aTmpSz;
975 aTmpSz.Width = rSize.Width();
976 aTmpSz.Height = rSize.Height();
977 xShape->setSize( aTmpSz );
978
979 uno::Reference< beans::XPropertySet > xShapePropSet( xCreate, UNO_QUERY );
980
981 // linken/rechten Rand setzen
982 const SfxPoolItem *pItem;
983 if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_LR_SPACE, sal_True,
984 &pItem ) )
985 {
986 // Ggf. den Erstzeilen-Einzug noch plaetten
987 const SvxLRSpaceItem *pLRItem = (const SvxLRSpaceItem *)pItem;
988 SvxLRSpaceItem aLRItem( *pLRItem );
989 aLRItem.SetTxtFirstLineOfst( 0 );
990 if( rCSS1PropInfo.bLeftMargin )
991 {
992 nLeftSpace = static_cast< sal_uInt16 >(TWIP_TO_MM100( aLRItem.GetLeft() ));
993 rCSS1PropInfo.bLeftMargin = sal_False;
994 }
995 if( rCSS1PropInfo.bRightMargin )
996 {
997 nRightSpace = static_cast< sal_uInt16 >(TWIP_TO_MM100( aLRItem.GetRight() ));
998 rCSS1PropInfo.bRightMargin = sal_False;
999 }
1000 rCSS1ItemSet.ClearItem( RES_LR_SPACE );
1001 }
1002 if( nLeftSpace || nRightSpace )
1003 {
1004 Any aAny2;
1005 aAny2 <<= (sal_Int32)nLeftSpace;
1006 xShapePropSet->setPropertyValue(
1007 OUString::createFromAscii( "LeftMargin" ), aAny2 );
1008
1009 aAny2 <<= (sal_Int32)nRightSpace;
1010 xShapePropSet->setPropertyValue(
1011 OUString::createFromAscii( "RightMargin" ), aAny2 );
1012 }
1013
1014 // oberen/unteren Rand setzen
1015 if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_UL_SPACE, sal_True,
1016 &pItem ) )
1017 {
1018 // Ggf. den Erstzeilen-Einzug noch plaetten
1019 const SvxULSpaceItem *pULItem = (const SvxULSpaceItem *)pItem;
1020 if( rCSS1PropInfo.bTopMargin )
1021 {
1022 nUpperSpace = TWIP_TO_MM100_UNSIGNED( pULItem->GetUpper() );
1023 rCSS1PropInfo.bTopMargin = sal_False;
1024 }
1025 if( rCSS1PropInfo.bBottomMargin )
1026 {
1027 nLowerSpace = TWIP_TO_MM100_UNSIGNED( pULItem->GetLower() );
1028 rCSS1PropInfo.bBottomMargin = sal_False;
1029 }
1030
1031 rCSS1ItemSet.ClearItem( RES_UL_SPACE );
1032 }
1033 if( nUpperSpace || nLowerSpace )
1034 {
1035 uno::Any aAny2;
1036 aAny2 <<= (sal_Int32)nUpperSpace;
1037 xShapePropSet->setPropertyValue(
1038 OUString::createFromAscii( "TopMargin" ), aAny2 );
1039
1040 aAny2 <<= (sal_Int32)nLowerSpace;
1041 xShapePropSet->setPropertyValue(
1042 OUString::createFromAscii( "BottomMargin" ), aAny2 );
1043 }
1044
1045 uno::Reference< beans::XPropertySetInfo > xPropSetInfo =
1046 rFCompPropSet->getPropertySetInfo();
1047 OUString sPropName = OUString::createFromAscii( "BackgroundColor" );
1048 if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_BACKGROUND, sal_True,
1049 &pItem ) &&
1050 xPropSetInfo->hasPropertyByName( sPropName ) )
1051 {
1052 const Color &rColor = ((const SvxBrushItem *)pItem)->GetColor();
1053 /// OD 02.09.2002 #99657#
1054 /// copy color, if color is not "no fill"/"auto fill"
1055 if( rColor.GetColor() != COL_TRANSPARENT )
1056 {
1057 /// OD 02.09.2002 #99657#
1058 /// copy complete color with transparency
1059 aTmp <<= static_cast<sal_Int32>(rColor.GetColor());
1060 rFCompPropSet->setPropertyValue( sPropName, aTmp );
1061 }
1062
1063 }
1064
1065 sPropName = OUString::createFromAscii( "TextColor" );
1066 if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_CHRATR_COLOR, sal_True,
1067 &pItem ) &&
1068 xPropSetInfo->hasPropertyByName( sPropName ) )
1069 {
1070 aTmp <<= (sal_Int32)((const SvxColorItem *)pItem)->GetValue()
1071 .GetRGBColor();
1072 rFCompPropSet->setPropertyValue( sPropName, aTmp );
1073 }
1074
1075 sPropName = OUString::createFromAscii( "FontHeight" );
1076 if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_CHRATR_FONTSIZE,
1077 sal_True, &pItem ) &&
1078 xPropSetInfo->hasPropertyByName( sPropName ) )
1079 {
1080 float fVal = static_cast< float >(
1081 (((SvxFontHeightItem *)pItem)->GetHeight()) / 20.0 );
1082 aTmp.setValue( &fVal, ::getCppuType(&fVal));
1083 rFCompPropSet->setPropertyValue( sPropName, aTmp );
1084 }
1085
1086 if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_CHRATR_FONT, sal_True,
1087 &pItem ) )
1088 {
1089 const SvxFontItem *pFontItem = (SvxFontItem *)pItem;
1090 sPropName = OUString::createFromAscii( "FontName" );
1091 if( xPropSetInfo->hasPropertyByName( sPropName ) )
1092 {
1093 aTmp <<= OUString( pFontItem->GetFamilyName() );
1094 rFCompPropSet->setPropertyValue( sPropName, aTmp );
1095 }
1096 sPropName = OUString::createFromAscii( "FontStyleName" );
1097 if( xPropSetInfo->hasPropertyByName( sPropName ) )
1098 {
1099 aTmp <<= OUString( pFontItem->GetStyleName() );
1100 rFCompPropSet->setPropertyValue( sPropName, aTmp );
1101 }
1102 sPropName = OUString::createFromAscii( "FontFamily" );
1103 if( xPropSetInfo->hasPropertyByName( sPropName ) )
1104 {
1105 aTmp <<= (sal_Int16)pFontItem->GetFamily() ;
1106 rFCompPropSet->setPropertyValue( sPropName, aTmp );
1107 }
1108 sPropName = OUString::createFromAscii( "FontCharset" );
1109 if( xPropSetInfo->hasPropertyByName( sPropName ) )
1110 {
1111 aTmp <<= (sal_Int16)pFontItem->GetCharSet() ;
1112 rFCompPropSet->setPropertyValue( sPropName, aTmp );
1113 }
1114 sPropName = OUString::createFromAscii( "FontPitch" );
1115 if( xPropSetInfo->hasPropertyByName( sPropName ) )
1116 {
1117 aTmp <<= (sal_Int16)pFontItem->GetPitch() ;
1118 rFCompPropSet->setPropertyValue( sPropName, aTmp );
1119 }
1120 }
1121
1122 sPropName = OUString::createFromAscii( "FontWeight" );
1123 if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_CHRATR_WEIGHT,
1124 sal_True, &pItem ) &&
1125 xPropSetInfo->hasPropertyByName( sPropName ) )
1126 {
1127 float fVal = VCLUnoHelper::ConvertFontWeight(
1128 ((SvxWeightItem *)pItem)->GetWeight() );
1129 aTmp.setValue( &fVal, ::getCppuType(&fVal));
1130 rFCompPropSet->setPropertyValue( sPropName, aTmp );
1131 }
1132
1133 sPropName = OUString::createFromAscii( "FontSlant" );
1134 if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_CHRATR_POSTURE,
1135 sal_True, &pItem ) &&
1136 xPropSetInfo->hasPropertyByName( sPropName ) )
1137 {
1138 aTmp <<= (sal_Int16)((SvxPostureItem *)pItem)->GetPosture();
1139 rFCompPropSet->setPropertyValue( sPropName, aTmp );
1140 }
1141
1142 sPropName = OUString::createFromAscii( "FontUnderline" );
1143 if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_CHRATR_UNDERLINE,
1144 sal_True, &pItem ) &&
1145 xPropSetInfo->hasPropertyByName( sPropName ) )
1146 {
1147 aTmp <<= (sal_Int16)((SvxUnderlineItem *)pItem)->GetLineStyle();
1148 rFCompPropSet->setPropertyValue( sPropName, aTmp );
1149 }
1150
1151 sPropName = OUString::createFromAscii( "FontStrikeout" );
1152 if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_CHRATR_CROSSEDOUT,
1153 sal_True, &pItem ) &&
1154 xPropSetInfo->hasPropertyByName( sPropName ) )
1155 {
1156 aTmp <<= (sal_Int16)((SvxCrossedOutItem *)pItem)->GetStrikeout();
1157 rFCompPropSet->setPropertyValue( sPropName, aTmp );
1158 }
1159
1160 uno::Reference< text::XTextRange > xTxtRg;
1161 sal_Int16 nAnchorType = text::TextContentAnchorType_AS_CHARACTER;
1162 sal_Bool bSetPos = sal_False, bSetSurround = sal_False;
1163 sal_Int32 nXPos = 0, nYPos = 0;
1164 sal_Int16 nSurround = text::WrapTextMode_NONE;
1165 if( SVX_CSS1_POS_ABSOLUTE == rCSS1PropInfo.ePosition &&
1166 SVX_CSS1_LTYPE_TWIP == rCSS1PropInfo.eLeftType &&
1167 SVX_CSS1_LTYPE_TWIP == rCSS1PropInfo.eTopType )
1168 {
1169 const SwStartNode *pFlySttNd =
1170 pPam->GetPoint()->nNode.GetNode().FindFlyStartNode();
1171
1172 if( pFlySttNd )
1173 {
1174 nAnchorType = text::TextContentAnchorType_AT_FRAME;
1175 SwPaM aPaM( *pFlySttNd );
1176
1177 uno::Reference< text::XText > xDummyTxtRef; // unsauber, aber laut OS geht das ...
1178 xTxtRg = new SwXTextRange( aPaM, xDummyTxtRef );
1179 }
1180 else
1181 {
1182 nAnchorType = text::TextContentAnchorType_AT_PAGE;
1183 }
1184 nXPos = TWIP_TO_MM100( rCSS1PropInfo.nLeft ) + nLeftSpace;
1185 nYPos = TWIP_TO_MM100( rCSS1PropInfo.nTop ) + nUpperSpace;
1186 bSetPos = sal_True;
1187
1188 nSurround = text::WrapTextMode_THROUGHT;
1189 bSetSurround = sal_True;
1190 }
1191 else if( SVX_ADJUST_LEFT == rCSS1PropInfo.eFloat ||
1192 text::HoriOrientation::LEFT == eHoriOri )
1193 {
1194 nAnchorType = text::TextContentAnchorType_AT_PARAGRAPH;
1195 nXPos = nLeftSpace;
1196 nYPos = nUpperSpace;
1197 bSetPos = sal_True;
1198 nSurround = text::WrapTextMode_RIGHT;
1199 bSetSurround = sal_True;
1200 }
1201 else if( text::VertOrientation::NONE != eVertOri )
1202 {
1203 sal_Int16 nVertOri = text::VertOrientation::NONE;
1204 switch( eVertOri )
1205 {
1206 case text::VertOrientation::NONE:
1207 nVertOri = text::VertOrientation::NONE;
1208 break;
1209 case text::VertOrientation::TOP:
1210 nVertOri = text::VertOrientation::TOP;
1211 break;
1212 case text::VertOrientation::CENTER:
1213 nVertOri = text::VertOrientation::CENTER;
1214 break;
1215 case text::VertOrientation::BOTTOM:
1216 nVertOri = text::VertOrientation::BOTTOM;
1217 break;
1218 case text::VertOrientation::CHAR_TOP:
1219 nVertOri = text::VertOrientation::CHAR_TOP;
1220 break;
1221 case text::VertOrientation::CHAR_CENTER:
1222 nVertOri = text::VertOrientation::CHAR_CENTER;
1223 break;
1224 case text::VertOrientation::CHAR_BOTTOM:
1225 nVertOri = text::VertOrientation::CHAR_BOTTOM;
1226 break;
1227 case text::VertOrientation::LINE_TOP:
1228 nVertOri = text::VertOrientation::LINE_TOP;
1229 break;
1230 case text::VertOrientation::LINE_CENTER:
1231 nVertOri = text::VertOrientation::LINE_CENTER;
1232 break;
1233 case text::VertOrientation::LINE_BOTTOM:
1234 nVertOri = text::VertOrientation::LINE_BOTTOM;
1235 break;
1236 }
1237 aTmp <<= (sal_Int16)nVertOri ;
1238 xShapePropSet->setPropertyValue(
1239 OUString::createFromAscii( "VertOrient" ), aTmp );
1240 }
1241
1242 aTmp <<= (sal_Int16)nAnchorType ;
1243 xShapePropSet->setPropertyValue(
1244 OUString::createFromAscii( "AnchorType" ), aTmp );
1245
1246 if( text::TextContentAnchorType_AT_PAGE == nAnchorType )
1247 {
1248 aTmp <<= (sal_Int16) 1 ;
1249 xShapePropSet->setPropertyValue(
1250 OUString::createFromAscii( "AnchorPageNo" ), aTmp );
1251 }
1252 else
1253 {
1254 if( !xTxtRg.is() )
1255 {
1256 uno::Reference< text::XText > xDummyTxtRef; // unsauber, aber laut OS geht das ...
1257 xTxtRg = new SwXTextRange( *pPam, xDummyTxtRef );
1258 }
1259
1260 aTmp.setValue( &xTxtRg,
1261 ::getCppuType((uno::Reference< text::XTextRange>*)0));
1262 xShapePropSet->setPropertyValue(
1263 OUString::createFromAscii( "TextRange" ), aTmp );
1264 }
1265
1266 if( bSetPos )
1267 {
1268 aTmp <<= (sal_Int16)text::HoriOrientation::NONE;
1269 xShapePropSet->setPropertyValue(
1270 OUString::createFromAscii( "HoriOrient" ), aTmp );
1271 aTmp <<= (sal_Int32)nXPos ;
1272 xShapePropSet->setPropertyValue(
1273 OUString::createFromAscii( "HoriOrientPosition" ), aTmp );
1274
1275 aTmp <<= (sal_Int16)text::VertOrientation::NONE;
1276 xShapePropSet->setPropertyValue(
1277 OUString::createFromAscii( "VertOrient" ), aTmp );
1278 aTmp <<= (sal_Int32)nYPos ;
1279 xShapePropSet->setPropertyValue(
1280 OUString::createFromAscii( "VertOrientPosition" ), aTmp );
1281 }
1282 if( bSetSurround )
1283 {
1284 aTmp <<= (sal_Int16)nSurround ;
1285 xShapePropSet->setPropertyValue(
1286 OUString::createFromAscii( "Surround" ), aTmp );
1287 }
1288
1289 pFormImpl->GetShapes()->add(xShape);
1290
1291 // Das Control-Model am Control-Shape setzen
1292 uno::Reference< drawing::XControlShape > xControlShape( xShape, UNO_QUERY );
1293 uno::Reference< awt::XControlModel > xControlModel( rFComp, UNO_QUERY );
1294 xControlShape->setControl( xControlModel );
1295 }
1296
1297 // Da beim Einfuegen der Controls der Fokus gesetzt wird, werden
1298 // auch schon Fokus-Events verschickt. Damit die nicht evtl. schon
1299 // vorhendene JavaSCript-Eents rufen, werden die Events nachtraeglich
1300 // gesetzt.
1301 if( rMacroTbl.Count() || rUnoMacroTbl.Count() )
1302 {
1303 lcl_html_setEvents( pFormImpl->GetControlEventManager(),
1304 rFormComps->getCount() - 1,
1305 rMacroTbl, rUnoMacroTbl, rUnoMacroParamTbl,
1306 GetScriptTypeString(pFormImpl->GetHeaderAttrs()) );
1307 }
1308
1309 if( bSetFCompPropSet )
1310 {
1311 pFormImpl->SetFCompPropSet( rFCompPropSet );
1312 }
1313
1314 return xShape;
1315 }
1316
NewForm(sal_Bool bAppend)1317 void SwHTMLParser::NewForm( sal_Bool bAppend )
1318 {
1319 // Gibt es schon eine Form?
1320 if( pFormImpl && pFormImpl->GetFormComps().is() )
1321 return;
1322
1323 if( bAppend )
1324 {
1325 if( pPam->GetPoint()->nContent.GetIndex() )
1326 AppendTxtNode( AM_SPACE );
1327 else
1328 AddParSpace();
1329 }
1330
1331 if( !pFormImpl )
1332 pFormImpl = new SwHTMLForm_Impl( pDoc->GetDocShell() );
1333
1334 String aAction( sBaseURL );
1335 String sName, sTarget;
1336 sal_uInt16 nEncType = FormSubmitEncoding_URL;
1337 sal_uInt16 nMethod = FormSubmitMethod_GET;
1338 SvxMacroTableDtor aMacroTbl;
1339 SvStringsDtor aUnoMacroTbl;
1340 SvStringsDtor aUnoMacroParamTbl;
1341 SvKeyValueIterator *pHeaderAttrs = pFormImpl->GetHeaderAttrs();
1342 ScriptType eDfltScriptType = GetScriptType( pHeaderAttrs );
1343 const String& rDfltScriptType = GetScriptTypeString( pHeaderAttrs );
1344
1345 const HTMLOptions *pHTMLOptions = GetOptions();
1346 for( sal_uInt16 i = pHTMLOptions->Count(); i; )
1347 {
1348 const HTMLOption *pOption = (*pHTMLOptions)[--i];
1349 ScriptType eScriptType2 = eDfltScriptType;
1350 sal_uInt16 nEvent = 0;
1351 sal_Bool bSetEvent = sal_False;
1352
1353 switch( pOption->GetToken() )
1354 {
1355 case HTML_O_ACTION:
1356 aAction = pOption->GetString();
1357 break;
1358 case HTML_O_METHOD:
1359 nMethod = pOption->GetEnum( aHTMLFormMethodTable, nMethod );
1360 break;
1361 case HTML_O_ENCTYPE:
1362 nEncType = pOption->GetEnum( aHTMLFormEncTypeTable, nEncType );
1363 break;
1364 case HTML_O_TARGET:
1365 sTarget = pOption->GetString();
1366 break;
1367 case HTML_O_NAME:
1368 sName = pOption->GetString();
1369 break;
1370
1371 case HTML_O_SDONSUBMIT:
1372 eScriptType2 = STARBASIC;
1373 case HTML_O_ONSUBMIT:
1374 nEvent = HTML_ET_ONSUBMITFORM;
1375 bSetEvent = sal_True;
1376 break;
1377
1378 case HTML_O_SDONRESET:
1379 eScriptType2 = STARBASIC;
1380 case HTML_O_ONRESET:
1381 nEvent = HTML_ET_ONRESETFORM;
1382 bSetEvent = sal_True;
1383 break;
1384
1385 default:
1386 lcl_html_getEvents( pOption->GetTokenString(),
1387 pOption->GetString(),
1388 aUnoMacroTbl, aUnoMacroParamTbl );
1389 break;
1390 }
1391
1392 if( bSetEvent )
1393 {
1394 String sEvent( pOption->GetString() );
1395 if( sEvent.Len() )
1396 {
1397 sEvent.ConvertLineEnd();
1398 String aScriptType2;
1399 if( EXTENDED_STYPE==eScriptType2 )
1400 aScriptType2 = rDfltScriptType;
1401 aMacroTbl.Insert( nEvent, new SvxMacro( sEvent, aScriptType2,
1402 eScriptType2 ) );
1403 }
1404 }
1405 }
1406
1407 const uno::Reference< XMultiServiceFactory > & rSrvcMgr =
1408 pFormImpl->GetServiceFactory();
1409 if( !rSrvcMgr.is() )
1410 return;
1411
1412 uno::Reference< XInterface > xInt = rSrvcMgr->createInstance(
1413 OUString::createFromAscii( "com.sun.star.form.component.Form" ) );
1414 if( !xInt.is() )
1415 return;
1416
1417 uno::Reference< XForm > xForm( xInt, UNO_QUERY );
1418 DBG_ASSERT( xForm.is(), "keine Form?" );
1419
1420 uno::Reference< container::XIndexContainer > xFormComps( xForm, UNO_QUERY );
1421 pFormImpl->SetFormComps( xFormComps );
1422
1423 uno::Reference< beans::XPropertySet > xFormPropSet( xForm, UNO_QUERY );
1424
1425 Any aTmp;
1426 aTmp <<= OUString(sName);
1427 xFormPropSet->setPropertyValue( OUString::createFromAscii( "Name" ), aTmp );
1428
1429 if( aAction.Len() )
1430 {
1431 aAction = URIHelper::SmartRel2Abs(INetURLObject(sBaseURL), aAction, Link(), false);
1432 }
1433 else
1434 {
1435 // Bei leerer URL das Directory nehmen
1436 INetURLObject aURLObj( aPathToFile );
1437 aAction = aURLObj.GetPartBeforeLastName();
1438 }
1439 aTmp <<= OUString(aAction);
1440 xFormPropSet->setPropertyValue( OUString::createFromAscii( "TargetURL" ),
1441 aTmp );
1442
1443 FormSubmitMethod eMethod = (FormSubmitMethod)nMethod;
1444 aTmp.setValue( &eMethod, ::getCppuType((const FormSubmitMethod*)0) );
1445 xFormPropSet->setPropertyValue( OUString::createFromAscii( "SubmitMethod" ),
1446 aTmp );
1447
1448 FormSubmitEncoding eEncType = (FormSubmitEncoding)nEncType;
1449 aTmp.setValue( &eEncType, ::getCppuType((const FormSubmitEncoding*)0) );
1450 xFormPropSet->setPropertyValue(
1451 OUString::createFromAscii( "SubmitEncoding" ), aTmp );
1452
1453 if( sTarget.Len() )
1454 {
1455 aTmp <<= OUString(sTarget);
1456 xFormPropSet->setPropertyValue(
1457 OUString::createFromAscii( "TargetFrame" ), aTmp );
1458 }
1459
1460 const uno::Reference< container::XIndexContainer > & rForms =
1461 pFormImpl->GetForms();
1462 Any aAny( &xForm, ::getCppuType((uno::Reference< XForm>*)0) );
1463 rForms->insertByIndex( rForms->getCount(), aAny );
1464 if( aMacroTbl.Count() )
1465 lcl_html_setEvents( pFormImpl->GetFormEventManager(),
1466 rForms->getCount() - 1,
1467 aMacroTbl, aUnoMacroTbl, aUnoMacroParamTbl,
1468 rDfltScriptType );
1469 }
1470
EndForm(sal_Bool bAppend)1471 void SwHTMLParser::EndForm( sal_Bool bAppend )
1472 {
1473 if( pFormImpl && pFormImpl->GetFormComps().is() )
1474 {
1475 if( bAppend )
1476 {
1477 if( pPam->GetPoint()->nContent.GetIndex() )
1478 AppendTxtNode( AM_SPACE );
1479 else
1480 AddParSpace();
1481 }
1482
1483 pFormImpl->ReleaseFormComps();
1484 }
1485 }
1486
InsertInput()1487 void SwHTMLParser::InsertInput()
1488 {
1489 if( pPendStack )
1490 {
1491 SetPendingControlSize( HTML_INPUT );
1492 return;
1493 }
1494
1495 if( !pFormImpl || !pFormImpl->GetFormComps().is() )
1496 return;
1497
1498 String sImgSrc, aId, aClass, aStyle, sText;
1499 String sName;
1500 SvxMacroTableDtor aMacroTbl;
1501 SvStringsDtor aUnoMacroTbl;
1502 SvStringsDtor aUnoMacroParamTbl;
1503 sal_uInt16 nSize = 0;
1504 sal_Int16 nMaxLen = 0;
1505 sal_Int16 nChecked = STATE_NOCHECK;
1506 sal_Int32 nTabIndex = TABINDEX_MAX + 1;
1507 HTMLInputType eType = HTML_IT_TEXT;
1508 sal_Bool bDisabled = sal_False, bValue = sal_False;
1509 sal_Bool bSetGrfWidth = sal_False, bSetGrfHeight = sal_False;
1510 sal_Bool bHidden = sal_False;
1511 long nWidth=0, nHeight=0;
1512 sal_Int16 eVertOri = text::VertOrientation::TOP;
1513 sal_Int16 eHoriOri = text::HoriOrientation::NONE;
1514 SvKeyValueIterator *pHeaderAttrs = pFormImpl->GetHeaderAttrs();
1515 ScriptType eDfltScriptType = GetScriptType( pHeaderAttrs );
1516 const String& rDfltScriptType = GetScriptTypeString( pHeaderAttrs );
1517
1518 sal_uInt16 nKeepCRLFToken = HTML_O_VALUE;
1519 const HTMLOptions *pHTMLOptions = GetOptions( &nKeepCRLFToken );
1520 for( sal_uInt16 i = pHTMLOptions->Count(); i; )
1521 {
1522 const HTMLOption *pOption = (*pHTMLOptions)[--i];
1523 ScriptType eScriptType2 = eDfltScriptType;
1524 sal_uInt16 nEvent = 0;
1525 sal_Bool bSetEvent = sal_False;
1526
1527 switch( pOption->GetToken() )
1528 {
1529 case HTML_O_ID:
1530 aId = pOption->GetString();
1531 break;
1532 case HTML_O_STYLE:
1533 aStyle = pOption->GetString();
1534 break;
1535 case HTML_O_CLASS:
1536 aClass = pOption->GetString();
1537 break;
1538 case HTML_O_TYPE:
1539 eType = pOption->GetInputType();
1540 break;
1541 case HTML_O_NAME:
1542 sName = pOption->GetString();
1543 break;
1544 case HTML_O_VALUE:
1545 sText = pOption->GetString();
1546 bValue = sal_True;
1547 break;
1548 case HTML_O_CHECKED:
1549 nChecked = STATE_CHECK;
1550 break;
1551 case HTML_O_DISABLED:
1552 bDisabled = sal_True;
1553 break;
1554 case HTML_O_MAXLENGTH:
1555 nMaxLen = (sal_Int16)pOption->GetNumber();
1556 break;
1557 case HTML_O_SIZE:
1558 nSize = (sal_uInt16)pOption->GetNumber();
1559 break;
1560 case HTML_O_SRC:
1561 sImgSrc = pOption->GetString();
1562 break;
1563 case HTML_O_WIDTH:
1564 // erstmal nur als Pixelwerte merken!
1565 nWidth = pOption->GetNumber();
1566 break;
1567 case HTML_O_HEIGHT:
1568 // erstmal nur als Pixelwerte merken!
1569 nHeight = pOption->GetNumber();
1570 break;
1571 case HTML_O_ALIGN:
1572 eVertOri =
1573 pOption->GetEnum( aHTMLImgVAlignTable, eVertOri );
1574 eHoriOri =
1575 pOption->GetEnum( aHTMLImgHAlignTable, eHoriOri );
1576 break;
1577 case HTML_O_TABINDEX:
1578 // erstmal nur als Pixelwerte merken!
1579 nTabIndex = pOption->GetNumber();
1580 break;
1581
1582 case HTML_O_SDONFOCUS:
1583 eScriptType2 = STARBASIC;
1584 case HTML_O_ONFOCUS:
1585 nEvent = HTML_ET_ONGETFOCUS;
1586 bSetEvent = sal_True;
1587 break;
1588
1589 case HTML_O_SDONBLUR: // eigtl. nur EDIT
1590 eScriptType2 = STARBASIC;
1591 case HTML_O_ONBLUR:
1592 nEvent = HTML_ET_ONLOSEFOCUS;
1593 bSetEvent = sal_True;
1594 break;
1595
1596 case HTML_O_SDONCLICK:
1597 eScriptType2 = STARBASIC;
1598 case HTML_O_ONCLICK:
1599 nEvent = HTML_ET_ONCLICK;
1600 bSetEvent = sal_True;
1601 break;
1602
1603 case HTML_O_SDONCHANGE: // eigtl. nur EDIT
1604 eScriptType2 = STARBASIC;
1605 case HTML_O_ONCHANGE:
1606 nEvent = HTML_ET_ONCHANGE;
1607 bSetEvent = sal_True;
1608 break;
1609
1610 case HTML_O_SDONSELECT: // eigtl. nur EDIT
1611 eScriptType2 = STARBASIC;
1612 case HTML_O_ONSELECT:
1613 nEvent = HTML_ET_ONSELECT;
1614 bSetEvent = sal_True;
1615 break;
1616
1617 default:
1618 lcl_html_getEvents( pOption->GetTokenString(),
1619 pOption->GetString(),
1620 aUnoMacroTbl, aUnoMacroParamTbl );
1621 break;
1622 }
1623
1624 if( bSetEvent )
1625 {
1626 String sEvent( pOption->GetString() );
1627 if( sEvent.Len() )
1628 {
1629 sEvent.ConvertLineEnd();
1630 String aScriptType2;
1631 if( EXTENDED_STYPE==eScriptType2 )
1632 aScriptType2 = rDfltScriptType;
1633 aMacroTbl.Insert( nEvent, new SvxMacro( sEvent, aScriptType2,
1634 eScriptType2 ) );
1635 }
1636 }
1637 }
1638
1639 if( HTML_IT_IMAGE==eType )
1640 {
1641 // Image-Controls ohne Image-URL werden ignoriert (wie bei MS)
1642 if( !sImgSrc.Len() )
1643 return;
1644 }
1645 else
1646 {
1647 // ALIGN fuer alle Controls auszuwerten ist keine so gute Idee,
1648 // solange Absatz-gebundene Controls die Hoehe von Tabellen-Zellen
1649 // nicht beeinflussen
1650 // (#64110#, http://www.telekom.de/katalog-online/onlineshop.html)
1651 eVertOri = text::VertOrientation::TOP;
1652 eHoriOri = text::HoriOrientation::NONE;
1653 }
1654
1655 // Defaults entsprechen HTML_IT_TEXT
1656 const sal_Char *pType = "TextField";
1657 sal_Bool bKeepCRLFInValue = sal_False;
1658 switch( eType )
1659 {
1660 case HTML_IT_CHECKBOX:
1661 pType = "CheckBox";
1662 bKeepCRLFInValue = sal_True;
1663 break;
1664
1665 case HTML_IT_RADIO:
1666 pType = "RadioButton";
1667 bKeepCRLFInValue = sal_True;
1668 break;
1669
1670 case HTML_IT_PASSWORD:
1671 bKeepCRLFInValue = sal_True;
1672 break;
1673
1674 case HTML_IT_BUTTON:
1675 bKeepCRLFInValue = sal_True;
1676 case HTML_IT_SUBMIT:
1677 case HTML_IT_RESET:
1678 pType = "CommandButton";
1679 break;
1680
1681 case HTML_IT_IMAGE:
1682 pType = "ImageButton";
1683 break;
1684
1685 case HTML_IT_FILE:
1686 pType = "FileControl";
1687 break;
1688
1689 case HTML_IT_HIDDEN:
1690 pType = "HiddenControl";
1691 bKeepCRLFInValue = sal_True;
1692 break;
1693 default:
1694 ;
1695 }
1696
1697 // Fuer ein par Controls mussen CR/LF noch aus dem VALUE
1698 // geloescht werden.
1699 if( !bKeepCRLFInValue )
1700 {
1701 sText.EraseAllChars( _CR );
1702 sText.EraseAllChars( _LF );
1703 }
1704
1705 const uno::Reference< XMultiServiceFactory > & rServiceFactory =
1706 pFormImpl->GetServiceFactory();
1707 if( !rServiceFactory.is() )
1708 return;
1709
1710 String sServiceName(
1711 OUString::createFromAscii("com.sun.star.form.component.") );
1712 sServiceName.AppendAscii( pType );
1713 uno::Reference< XInterface > xInt =
1714 rServiceFactory->createInstance( sServiceName );
1715 if( !xInt.is() )
1716 return;
1717
1718 uno::Reference< XFormComponent > xFComp( xInt, UNO_QUERY );
1719 if( !xFComp.is() )
1720 return;
1721
1722 uno::Reference< beans::XPropertySet > xPropSet( xFComp, UNO_QUERY );
1723
1724 Any aTmp;
1725 aTmp <<= OUString(sName);
1726 xPropSet->setPropertyValue( OUString::createFromAscii( "Name" ), aTmp );
1727
1728 if( HTML_IT_HIDDEN != eType )
1729 {
1730 if( nTabIndex >= TABINDEX_MIN && nTabIndex <= TABINDEX_MAX )
1731 {
1732 aTmp <<= (sal_Int16) (sal_Int16)nTabIndex ;
1733 xPropSet->setPropertyValue( OUString::createFromAscii( "TabIndex" ), aTmp );
1734 }
1735
1736 if( bDisabled )
1737 {
1738 sal_Bool bFalse = sal_False;
1739 aTmp.setValue(&bFalse, ::getBooleanCppuType() );
1740 xPropSet->setPropertyValue( OUString::createFromAscii( "Enabled" ), aTmp );
1741 }
1742 }
1743
1744 aTmp <<= OUString(sText);
1745
1746 Size aSz( 0, 0 ); // defaults
1747 Size aTextSz( 0, 0 ); // Text-Size
1748 sal_Bool bMinWidth = sal_False, bMinHeight = sal_False;
1749 sal_Bool bUseSize = sal_False;
1750 switch( eType )
1751 {
1752 case HTML_IT_CHECKBOX:
1753 case HTML_IT_RADIO:
1754 {
1755 if( !bValue )
1756 aTmp <<= OUString::createFromAscii( OOO_STRING_SVTOOLS_HTML_on );
1757 xPropSet->setPropertyValue( OUString::createFromAscii( "RefValue" ),
1758 aTmp );
1759 aTmp <<= OUString();
1760 xPropSet->setPropertyValue( OUString::createFromAscii( "Label" ),
1761 aTmp );
1762 // #53559#: Beim RadioButton darf die DefaultChecked-Property
1763 // erst gesetzt werden, wenn das Control angelegt und ein
1764 // activateTabOrder gerufen wurde, weil es sonst noch zu der
1765 // vorhergehenden Gruppe gehoert.
1766 if( HTML_IT_CHECKBOX == eType )
1767 {
1768 aTmp <<= (sal_Int16) nChecked ;
1769 xPropSet->setPropertyValue(
1770 OUString::createFromAscii( "DefaultState" ), aTmp );
1771 }
1772
1773 SvxMacro *pMacro = aMacroTbl.Get( HTML_ET_ONCLICK );
1774 if( pMacro )
1775 {
1776 aMacroTbl.Remove( HTML_ET_ONCLICK );
1777 aMacroTbl.Insert( HTML_ET_ONCLICK_ITEM, pMacro );
1778 }
1779 // SIZE auszuwerten duerfte hier keinen Sinn machen???
1780 bMinWidth = bMinHeight = sal_True;
1781 }
1782 break;
1783
1784 case HTML_IT_IMAGE:
1785 {
1786 // SIZE = WIDTH
1787 aSz.Width() = nSize ? nSize : nWidth;
1788 aSz.Width() = nWidth;
1789 aSz.Height() = nHeight;
1790 if( (aSz.Width() || aSz.Height()) && Application::GetDefaultDevice() )
1791 {
1792 aSz = Application::GetDefaultDevice()
1793 ->PixelToLogic( aSz, MapMode( MAP_100TH_MM ) );
1794 }
1795 FormButtonType eButtonType = FormButtonType_SUBMIT;
1796 aTmp.setValue( &eButtonType,
1797 ::getCppuType((const FormButtonType*)0));
1798 xPropSet->setPropertyValue(
1799 OUString::createFromAscii( "ButtonType" ), aTmp );
1800
1801 aTmp <<= (sal_Int16) 0 ;
1802 xPropSet->setPropertyValue( OUString::createFromAscii( "Border" ),
1803 aTmp );
1804 }
1805 break;
1806
1807 case HTML_IT_BUTTON:
1808 case HTML_IT_SUBMIT:
1809 case HTML_IT_RESET:
1810 {
1811 FormButtonType eButtonType;
1812 switch( eType )
1813 {
1814 case HTML_IT_BUTTON:
1815 eButtonType = FormButtonType_PUSH;
1816 break;
1817 case HTML_IT_SUBMIT:
1818 eButtonType = FormButtonType_SUBMIT;
1819 if( !sText.Len() )
1820 sText.AssignAscii( OOO_STRING_SVTOOLS_HTML_IT_submit );
1821 break;
1822 case HTML_IT_RESET:
1823 eButtonType = FormButtonType_RESET;
1824 if( !sText.Len() )
1825 sText.AssignAscii( OOO_STRING_SVTOOLS_HTML_IT_reset );
1826 break;
1827 default:
1828 ;
1829 }
1830 aTmp <<= OUString(sText);
1831 xPropSet->setPropertyValue( OUString::createFromAscii( "Label" ),
1832 aTmp );
1833
1834 aTmp.setValue( &eButtonType,
1835 ::getCppuType((const FormButtonType*)0));
1836 xPropSet->setPropertyValue(
1837 OUString::createFromAscii( "ButtonType" ), aTmp );
1838
1839 bMinWidth = bMinHeight = sal_True;
1840 bUseSize = sal_True;
1841 }
1842 break;
1843
1844 case HTML_IT_PASSWORD:
1845 case HTML_IT_TEXT:
1846 case HTML_IT_FILE:
1847 if( HTML_IT_FILE != eType )
1848 {
1849 // Beim File-Control wird der VALUE aus Sicherheitsgruenden ignoriert.
1850 xPropSet->setPropertyValue(
1851 OUString::createFromAscii( "DefaultText" ), aTmp );
1852 if( nMaxLen != 0 )
1853 {
1854 aTmp <<= (sal_Int16) nMaxLen ;
1855 xPropSet->setPropertyValue(
1856 OUString::createFromAscii( "MaxTextLen" ), aTmp );
1857 }
1858 }
1859
1860 if( HTML_IT_PASSWORD == eType )
1861 {
1862 aTmp <<= (sal_Int16)'*' ;
1863 xPropSet->setPropertyValue( OUString::createFromAscii( "EchoChar" ),
1864 aTmp );
1865 }
1866
1867 lcl_html_setFixedFontProperty( xPropSet );
1868
1869 if( !nSize )
1870 nSize = 20;
1871 aTextSz.Width() = nSize;
1872 bMinHeight = sal_True;
1873 break;
1874
1875 case HTML_IT_HIDDEN:
1876 xPropSet->setPropertyValue( OUString::createFromAscii( "HiddenValue" ),
1877 aTmp );
1878 bHidden = sal_True;
1879 break;
1880 default:
1881 ;
1882 }
1883
1884 if( bUseSize && nSize>0 )
1885 {
1886 if( Application::GetDefaultDevice() )
1887 {
1888 Size aNewSz( nSize, 0 );
1889 aNewSz = Application::GetDefaultDevice()
1890 ->PixelToLogic( aNewSz, MapMode( MAP_100TH_MM ) );
1891 aSz.Width() = aNewSz.Width();
1892 ASSERT( !aTextSz.Width(), "Text-Breite ist gegeben" );
1893 bMinWidth = sal_False;
1894 }
1895 }
1896
1897 SfxItemSet aCSS1ItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
1898 SvxCSS1PropertyInfo aCSS1PropInfo;
1899 if( HasStyleOptions( aStyle, aId, aClass ) )
1900 {
1901 ParseStyleOptions( aStyle, aId, aClass, aCSS1ItemSet, aCSS1PropInfo );
1902 if( aId.Len() )
1903 InsertBookmark( aId );
1904 }
1905
1906 if( SVX_CSS1_LTYPE_TWIP== aCSS1PropInfo.eWidthType )
1907 {
1908 aSz.Width() = TWIP_TO_MM100( aCSS1PropInfo.nWidth );
1909 aTextSz.Width() = 0;
1910 bMinWidth = sal_False;
1911 }
1912 if( SVX_CSS1_LTYPE_TWIP== aCSS1PropInfo.eHeightType )
1913 {
1914 aSz.Height() = TWIP_TO_MM100( aCSS1PropInfo.nHeight );
1915 aTextSz.Height() = 0;
1916 bMinHeight = sal_False;
1917 }
1918
1919 // Beim Image-Button bei nicht gegebern Groesse einen sinnvollen Default
1920 // setzen
1921 if( HTML_IT_IMAGE== eType )
1922 {
1923 if( !aSz.Width() )
1924 {
1925 aSz.Width() = HTML_DFLT_IMG_WIDTH;
1926 bSetGrfWidth = sal_True;
1927 if( pTable != 0 )
1928 IncGrfsThatResizeTable();
1929 }
1930 if( !aSz.Height() )
1931 {
1932 aSz.Height() = HTML_DFLT_IMG_HEIGHT;
1933 bSetGrfHeight = sal_True;
1934 }
1935 }
1936 if( aSz.Width() < MINFLY )
1937 aSz.Width() = MINFLY;
1938 if( aSz.Height() < MINFLY )
1939 aSz.Height() = MINFLY;
1940
1941 uno::Reference< drawing::XShape > xShape = InsertControl(
1942 xFComp, xPropSet, aSz,
1943 eVertOri, eHoriOri,
1944 aCSS1ItemSet, aCSS1PropInfo,
1945 aMacroTbl, aUnoMacroTbl,
1946 aUnoMacroParamTbl, sal_False,
1947 bHidden );
1948 if( aTextSz.Width() || aTextSz.Height() || bMinWidth || bMinHeight )
1949 {
1950 ASSERT( !(bSetGrfWidth || bSetGrfHeight), "Grafikgroesse anpassen???" );
1951 SetControlSize( xShape, aTextSz, bMinWidth, bMinHeight, HTML_INPUT );
1952 }
1953
1954 if( HTML_IT_RADIO == eType )
1955 {
1956 aTmp <<= (sal_Int16) nChecked ;
1957 xPropSet->setPropertyValue( OUString::createFromAscii( "DefaultState" ), aTmp );
1958 }
1959
1960 if( HTML_IT_IMAGE == eType )
1961 {
1962 // Die URL erst nach dem Einfuegen setzen, weil sich der
1963 // Download der Grafik erst dann am XModel anmelden kann,
1964 // wenn das Control eingefuegt ist.
1965 aTmp <<= OUString( URIHelper::SmartRel2Abs(INetURLObject(sBaseURL), sImgSrc, Link(), false));
1966 xPropSet->setPropertyValue( OUString::createFromAscii( "ImageURL" ),
1967 aTmp );
1968 }
1969
1970 if( bSetGrfWidth || bSetGrfHeight )
1971 {
1972 SwHTMLImageWatcher* pWatcher =
1973 new SwHTMLImageWatcher( xShape, bSetGrfWidth, bSetGrfHeight );
1974 uno::Reference< awt::XImageConsumer > xCons = pWatcher;
1975 pWatcher->start();
1976 }
1977 }
1978
NewTextArea()1979 void SwHTMLParser::NewTextArea()
1980 {
1981 if( pPendStack )
1982 {
1983 SetPendingControlSize( HTML_TEXTAREA_ON );
1984 return;
1985 }
1986
1987 ASSERT( !bTextArea, "TextArea in TextArea???" );
1988 ASSERT( !pFormImpl || !pFormImpl->GetFCompPropSet().is(),
1989 "TextArea in Control???" );
1990
1991 if( !pFormImpl || !pFormImpl->GetFormComps().is() )
1992 {
1993 // Spezialbehandlung fuer TextArea auch untem im Parser beenden
1994 FinishTextArea();
1995 return;
1996 }
1997
1998 String aId, aClass, aStyle;
1999 String sName;
2000 sal_Int32 nTabIndex = TABINDEX_MAX + 1;
2001 SvxMacroTableDtor aMacroTbl;
2002 SvStringsDtor aUnoMacroTbl;
2003 SvStringsDtor aUnoMacroParamTbl;
2004 sal_uInt16 nRows = 0, nCols = 0;
2005 sal_uInt16 nWrap = HTML_WM_OFF;
2006 sal_Bool bDisabled = sal_False;
2007 SvKeyValueIterator *pHeaderAttrs = pFormImpl->GetHeaderAttrs();
2008 ScriptType eDfltScriptType = GetScriptType( pHeaderAttrs );
2009 const String& rDfltScriptType = GetScriptTypeString( pHeaderAttrs );
2010
2011 const HTMLOptions *pHTMLOptions = GetOptions();
2012 for( sal_uInt16 i = pHTMLOptions->Count(); i; )
2013 {
2014 const HTMLOption *pOption = (*pHTMLOptions)[--i];
2015 ScriptType eScriptType2 = eDfltScriptType;
2016 sal_uInt16 nEvent = 0;
2017 sal_Bool bSetEvent = sal_False;
2018
2019 switch( pOption->GetToken() )
2020 {
2021 case HTML_O_ID:
2022 aId = pOption->GetString();
2023 break;
2024 case HTML_O_STYLE:
2025 aStyle = pOption->GetString();
2026 break;
2027 case HTML_O_CLASS:
2028 aClass = pOption->GetString();
2029 break;
2030 case HTML_O_NAME:
2031 sName = pOption->GetString();
2032 break;
2033 case HTML_O_DISABLED:
2034 bDisabled = sal_True;
2035 break;
2036 case HTML_O_ROWS:
2037 nRows = (sal_uInt16)pOption->GetNumber();
2038 break;
2039 case HTML_O_COLS:
2040 nCols = (sal_uInt16)pOption->GetNumber();
2041 break;
2042 case HTML_O_WRAP:
2043 nWrap = pOption->GetEnum( aHTMLTextAreaWrapTable, nWrap );
2044 break;
2045
2046 case HTML_O_TABINDEX:
2047 nTabIndex = pOption->GetSNumber();
2048 break;
2049
2050 case HTML_O_SDONFOCUS:
2051 eScriptType2 = STARBASIC;
2052 case HTML_O_ONFOCUS:
2053 nEvent = HTML_ET_ONGETFOCUS;
2054 bSetEvent = sal_True;
2055 break;
2056
2057 case HTML_O_SDONBLUR:
2058 eScriptType2 = STARBASIC;
2059 case HTML_O_ONBLUR:
2060 nEvent = HTML_ET_ONLOSEFOCUS;
2061 bSetEvent = sal_True;
2062 break;
2063
2064 case HTML_O_SDONCLICK:
2065 eScriptType2 = STARBASIC;
2066 case HTML_O_ONCLICK:
2067 nEvent = HTML_ET_ONCLICK;
2068 bSetEvent = sal_True;
2069 break;
2070
2071 case HTML_O_SDONCHANGE:
2072 eScriptType2 = STARBASIC;
2073 case HTML_O_ONCHANGE:
2074 nEvent = HTML_ET_ONCHANGE;
2075 bSetEvent = sal_True;
2076 break;
2077
2078 case HTML_O_SDONSELECT:
2079 eScriptType2 = STARBASIC;
2080 case HTML_O_ONSELECT:
2081 nEvent = HTML_ET_ONSELECT;
2082 bSetEvent = sal_True;
2083 break;
2084
2085 default:
2086 lcl_html_getEvents( pOption->GetTokenString(),
2087 pOption->GetString(),
2088 aUnoMacroTbl, aUnoMacroParamTbl );
2089 break;
2090 }
2091
2092 if( bSetEvent )
2093 {
2094 String sEvent( pOption->GetString() );
2095 if( sEvent.Len() )
2096 {
2097 sEvent.ConvertLineEnd();
2098 if( EXTENDED_STYPE==eScriptType2 )
2099 aScriptType = rDfltScriptType;
2100 aMacroTbl.Insert( nEvent, new SvxMacro( sEvent, aScriptType,
2101 eScriptType2 ) );
2102 }
2103 }
2104 }
2105
2106
2107 const uno::Reference< lang::XMultiServiceFactory > & rSrvcMgr =
2108 pFormImpl->GetServiceFactory();
2109 if( !rSrvcMgr.is() )
2110 {
2111 FinishTextArea();
2112 return;
2113 }
2114 uno::Reference< uno::XInterface > xInt = rSrvcMgr->createInstance(
2115 OUString::createFromAscii( "com.sun.star.form.component.TextField" ) );
2116 if( !xInt.is() )
2117 {
2118 FinishTextArea();
2119 return;
2120 }
2121
2122 uno::Reference< XFormComponent > xFComp( xInt, UNO_QUERY );
2123 DBG_ASSERT( xFComp.is(), "keine FormComponent?" );
2124
2125 uno::Reference< beans::XPropertySet > xPropSet( xFComp, UNO_QUERY );
2126
2127 Any aTmp;
2128 aTmp <<= OUString(sName);
2129 xPropSet->setPropertyValue( OUString::createFromAscii( "Name" ), aTmp );
2130
2131 sal_Bool bTrue = sal_True;
2132 aTmp.setValue( &bTrue, ::getBooleanCppuType() );
2133 xPropSet->setPropertyValue( OUString::createFromAscii( "MultiLine" ),
2134 aTmp );
2135 xPropSet->setPropertyValue( OUString::createFromAscii( "VScroll" ), aTmp );
2136 if( HTML_WM_OFF == nWrap )
2137 xPropSet->setPropertyValue( OUString::createFromAscii( "HScroll" ),
2138 aTmp );
2139 if( HTML_WM_HARD == nWrap )
2140 xPropSet->setPropertyValue(
2141 OUString::createFromAscii( "HardLineBreaks" ), aTmp );
2142
2143 if( nTabIndex >= TABINDEX_MIN && nTabIndex <= TABINDEX_MAX )
2144 {
2145 aTmp <<= (sal_Int16)nTabIndex ;
2146 xPropSet->setPropertyValue( OUString::createFromAscii( "TabIndex" ),
2147 aTmp );
2148 }
2149
2150 lcl_html_setFixedFontProperty( xPropSet );
2151
2152 if( bDisabled )
2153 {
2154 sal_Bool bFalse = sal_False;
2155 aTmp.setValue( &bFalse, ::getBooleanCppuType() );
2156 xPropSet->setPropertyValue( OUString::createFromAscii( "Enabled" ),
2157 aTmp );
2158 }
2159
2160 ASSERT( !pFormImpl->GetText().Len(), "Text ist nicht leer!" );
2161
2162 if( !nCols )
2163 nCols = 20;
2164 if( !nRows )
2165 nRows = 1;
2166
2167 Size aTextSz( nCols, nRows );
2168
2169 SfxItemSet aCSS1ItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
2170 SvxCSS1PropertyInfo aCSS1PropInfo;
2171 if( HasStyleOptions( aStyle, aId, aClass ) )
2172 {
2173 ParseStyleOptions( aStyle, aId, aClass, aCSS1ItemSet, aCSS1PropInfo );
2174 if( aId.Len() )
2175 InsertBookmark( aId );
2176 }
2177
2178 Size aSz( MINFLY, MINFLY );
2179 if( SVX_CSS1_LTYPE_TWIP== aCSS1PropInfo.eWidthType )
2180 {
2181 aSz.Width() = TWIP_TO_MM100( aCSS1PropInfo.nWidth );
2182 aTextSz.Width() = 0;
2183 }
2184 if( SVX_CSS1_LTYPE_TWIP== aCSS1PropInfo.eHeightType )
2185 {
2186 aSz.Height() = TWIP_TO_MM100( aCSS1PropInfo.nHeight );
2187 aTextSz.Height() = 0;
2188 }
2189 if( aSz.Width() < MINFLY )
2190 aSz.Width() = MINFLY;
2191 if( aSz.Height() < MINFLY )
2192 aSz.Height() = MINFLY;
2193
2194 uno::Reference< drawing::XShape > xShape = InsertControl( xFComp, xPropSet, aSz,
2195 text::VertOrientation::TOP, text::HoriOrientation::NONE,
2196 aCSS1ItemSet, aCSS1PropInfo,
2197 aMacroTbl, aUnoMacroTbl,
2198 aUnoMacroParamTbl );
2199 if( aTextSz.Width() || aTextSz.Height() )
2200 SetControlSize( xShape, aTextSz, sal_False, sal_False,
2201 HTML_TEXTAREA_ON );
2202
2203 // einen neuen Kontext anlegen
2204 _HTMLAttrContext *pCntxt = new _HTMLAttrContext( HTML_TEXTAREA_ON );
2205
2206 // und PRE/Listing/XMP voruebergehend aussetzen
2207 SplitPREListingXMP( pCntxt );
2208 PushContext( pCntxt );
2209
2210 bTextArea = sal_True;
2211 bTAIgnoreNewPara = sal_True;
2212 }
2213
EndTextArea()2214 void SwHTMLParser::EndTextArea()
2215 {
2216 ASSERT( bTextArea, "keine TextArea oder falscher Typ" );
2217 ASSERT( pFormImpl && pFormImpl->GetFCompPropSet().is(),
2218 "TextArea fehlt" );
2219
2220 const uno::Reference< beans::XPropertySet > & rPropSet =
2221 pFormImpl->GetFCompPropSet();
2222
2223 Any aTmp;
2224 aTmp <<= OUString(pFormImpl->GetText());
2225 rPropSet->setPropertyValue( OUString::createFromAscii( "DefaultText" ),
2226 aTmp );
2227 pFormImpl->EraseText();
2228
2229 pFormImpl->ReleaseFCompPropSet();
2230
2231 // den Kontext holen
2232 _HTMLAttrContext *pCntxt = PopContext( HTML_TEXTAREA_ON );
2233 if( pCntxt )
2234 {
2235 // und ggf. die Attribute beenden
2236 EndContext( pCntxt );
2237 delete pCntxt;
2238 }
2239
2240 bTextArea = sal_False;
2241 }
2242
2243
InsertTextAreaText(sal_uInt16 nToken)2244 void SwHTMLParser::InsertTextAreaText( sal_uInt16 nToken )
2245 {
2246 ASSERT( bTextArea, "keine TextArea oder falscher Typ" );
2247 ASSERT( pFormImpl && pFormImpl->GetFCompPropSet().is(),
2248 "TextArea fehlt" );
2249
2250 String& rText = pFormImpl->GetText();
2251 switch( nToken)
2252 {
2253 case HTML_TEXTTOKEN:
2254 rText += aToken;
2255 break;
2256 case HTML_NEWPARA:
2257 if( !bTAIgnoreNewPara )
2258 rText += '\n'; // das ist hier richtig!!!
2259 break;
2260 default:
2261 rText += '<';
2262 rText += sSaveToken;
2263 if( aToken.Len() )
2264 {
2265 rText += ' ';
2266 rText += aToken;
2267 }
2268 rText += '>';
2269 }
2270
2271 bTAIgnoreNewPara = sal_False;
2272 }
2273
NewSelect()2274 void SwHTMLParser::NewSelect()
2275 {
2276 if( pPendStack )
2277 {
2278 SetPendingControlSize( HTML_SELECT_ON );
2279 return;
2280 }
2281
2282 ASSERT( !bSelect, "Select in Select???" );
2283 ASSERT( !pFormImpl || !pFormImpl->GetFCompPropSet().is(),
2284 "Select in Control???" );
2285
2286 if( !pFormImpl || !pFormImpl->GetFormComps().is() )
2287 return;
2288
2289 String aId, aClass, aStyle;
2290 String sName;
2291 sal_Int32 nTabIndex = TABINDEX_MAX + 1;
2292 SvxMacroTableDtor aMacroTbl;
2293 SvStringsDtor aUnoMacroTbl;
2294 SvStringsDtor aUnoMacroParamTbl;
2295 sal_Bool bMultiple = sal_False;
2296 sal_Bool bDisabled = sal_False;
2297 nSelectEntryCnt = 1;
2298 SvKeyValueIterator *pHeaderAttrs = pFormImpl->GetHeaderAttrs();
2299 ScriptType eDfltScriptType = GetScriptType( pHeaderAttrs );
2300 const String& rDfltScriptType = GetScriptTypeString( pHeaderAttrs );
2301
2302 const HTMLOptions *pHTMLOptions = GetOptions();
2303 for( sal_uInt16 i = pHTMLOptions->Count(); i; )
2304 {
2305 const HTMLOption *pOption = (*pHTMLOptions)[--i];
2306 ScriptType eScriptType2 = eDfltScriptType;
2307 sal_uInt16 nEvent = 0;
2308 sal_Bool bSetEvent = sal_False;
2309
2310 switch( pOption->GetToken() )
2311 {
2312 case HTML_O_ID:
2313 aId = pOption->GetString();
2314 break;
2315 case HTML_O_STYLE:
2316 aStyle = pOption->GetString();
2317 break;
2318 case HTML_O_CLASS:
2319 aClass = pOption->GetString();
2320 break;
2321 case HTML_O_NAME:
2322 sName = pOption->GetString();
2323 break;
2324 case HTML_O_MULTIPLE:
2325 bMultiple = sal_True;
2326 break;
2327 case HTML_O_DISABLED:
2328 bDisabled = sal_True;
2329 break;
2330 case HTML_O_SIZE:
2331 nSelectEntryCnt = (sal_uInt16)pOption->GetNumber();
2332 break;
2333
2334 case HTML_O_TABINDEX:
2335 nTabIndex = pOption->GetSNumber();
2336 break;
2337
2338 case HTML_O_SDONFOCUS:
2339 eScriptType2 = STARBASIC;
2340 case HTML_O_ONFOCUS:
2341 nEvent = HTML_ET_ONGETFOCUS;
2342 bSetEvent = sal_True;
2343 break;
2344
2345 case HTML_O_SDONBLUR:
2346 eScriptType2 = STARBASIC;
2347 case HTML_O_ONBLUR:
2348 nEvent = HTML_ET_ONLOSEFOCUS;
2349 bSetEvent = sal_True;
2350 break;
2351
2352 case HTML_O_SDONCLICK:
2353 eScriptType2 = STARBASIC;
2354 case HTML_O_ONCLICK:
2355 nEvent = HTML_ET_ONCLICK;
2356 bSetEvent = sal_True;
2357 break;
2358
2359 case HTML_O_SDONCHANGE:
2360 eScriptType2 = STARBASIC;
2361 case HTML_O_ONCHANGE:
2362 nEvent = HTML_ET_ONCHANGE;
2363 bSetEvent = sal_True;
2364 break;
2365
2366 default:
2367 lcl_html_getEvents( pOption->GetTokenString(),
2368 pOption->GetString(),
2369 aUnoMacroTbl, aUnoMacroParamTbl );
2370 break;
2371 }
2372
2373 if( bSetEvent )
2374 {
2375 String sEvent( pOption->GetString() );
2376 if( sEvent.Len() )
2377 {
2378 sEvent.ConvertLineEnd();
2379 if( EXTENDED_STYPE==eScriptType2 )
2380 aScriptType = rDfltScriptType;
2381 aMacroTbl.Insert( nEvent, new SvxMacro( sEvent, aScriptType,
2382 eScriptType2 ) );
2383 }
2384 }
2385 }
2386
2387 const uno::Reference< lang::XMultiServiceFactory > & rSrvcMgr =
2388 pFormImpl->GetServiceFactory();
2389 if( !rSrvcMgr.is() )
2390 {
2391 FinishTextArea();
2392 return;
2393 }
2394 uno::Reference< uno::XInterface > xInt = rSrvcMgr->createInstance(
2395 OUString::createFromAscii( "com.sun.star.form.component.ListBox" ) );
2396 if( !xInt.is() )
2397 {
2398 FinishTextArea();
2399 return;
2400 }
2401
2402 uno::Reference< XFormComponent > xFComp( xInt, UNO_QUERY );
2403 DBG_ASSERT(xFComp.is(), "keine FormComponent?");
2404
2405 uno::Reference< beans::XPropertySet > xPropSet( xFComp, UNO_QUERY );
2406
2407 Any aTmp;
2408 aTmp <<= OUString(sName);
2409 xPropSet->setPropertyValue( OUString::createFromAscii( "Name" ), aTmp );
2410
2411 if( nTabIndex >= TABINDEX_MIN && nTabIndex <= TABINDEX_MAX )
2412 {
2413 aTmp <<= (sal_Int16)nTabIndex ;
2414 xPropSet->setPropertyValue( OUString::createFromAscii( "TabIndex" ),
2415 aTmp );
2416 }
2417
2418 if( bDisabled )
2419 {
2420 sal_Bool bFalse = sal_False;
2421 aTmp.setValue( &bFalse, ::getBooleanCppuType() );
2422 xPropSet->setPropertyValue( OUString::createFromAscii( "Enabled" ),
2423 aTmp );
2424 }
2425
2426 Size aTextSz( 0, 0 );
2427 sal_Bool bMinWidth = sal_True, bMinHeight = sal_True;
2428 if( !bMultiple && 1==nSelectEntryCnt )
2429 {
2430 sal_Bool bTrue = sal_True;
2431 aTmp.setValue( &bTrue, ::getBooleanCppuType() );
2432 xPropSet->setPropertyValue( OUString::createFromAscii( "Dropdown" ),
2433 aTmp );
2434 }
2435 else
2436 {
2437 if( nSelectEntryCnt <= 1 ) // 4 Zeilen als default
2438 nSelectEntryCnt = 4;
2439
2440 if( bMultiple )
2441 {
2442 sal_Bool bTrue = sal_True;
2443 aTmp.setValue( &bTrue, ::getBooleanCppuType() );
2444 xPropSet->setPropertyValue(
2445 OUString::createFromAscii( "MultiSelection" ), aTmp );
2446 }
2447 aTextSz.Height() = nSelectEntryCnt;
2448 bMinHeight = sal_False;
2449 }
2450
2451 SfxItemSet aCSS1ItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
2452 SvxCSS1PropertyInfo aCSS1PropInfo;
2453 if( HasStyleOptions( aStyle, aId, aClass ) )
2454 {
2455 ParseStyleOptions( aStyle, aId, aClass, aCSS1ItemSet, aCSS1PropInfo );
2456 if( aId.Len() )
2457 InsertBookmark( aId );
2458 }
2459
2460 Size aSz( MINFLY, MINFLY );
2461 bFixSelectWidth = bFixSelectHeight = sal_True;
2462 if( SVX_CSS1_LTYPE_TWIP== aCSS1PropInfo.eWidthType )
2463 {
2464 aSz.Width() = TWIP_TO_MM100( aCSS1PropInfo.nWidth );
2465 bFixSelectWidth = sal_False;
2466 bMinWidth = sal_False;
2467 }
2468 if( SVX_CSS1_LTYPE_TWIP== aCSS1PropInfo.eHeightType )
2469 {
2470 aSz.Height() = TWIP_TO_MM100( aCSS1PropInfo.nHeight );
2471 aTextSz.Height() = sal_False;
2472 bMinHeight = sal_False;
2473 }
2474 if( aSz.Width() < MINFLY )
2475 aSz.Width() = MINFLY;
2476 if( aSz.Height() < MINFLY )
2477 aSz.Height() = MINFLY;
2478
2479 uno::Reference< drawing::XShape > xShape = InsertControl( xFComp, xPropSet, aSz,
2480 text::VertOrientation::TOP, text::HoriOrientation::NONE,
2481 aCSS1ItemSet, aCSS1PropInfo,
2482 aMacroTbl, aUnoMacroTbl,
2483 aUnoMacroParamTbl );
2484 if( bFixSelectWidth )
2485 pFormImpl->SetShape( xShape );
2486 if( aTextSz.Height() || bMinWidth || bMinHeight )
2487 SetControlSize( xShape, aTextSz, bMinWidth, bMinHeight,
2488 HTML_SELECT_ON );
2489
2490 // einen neuen Kontext anlegen
2491 _HTMLAttrContext *pCntxt = new _HTMLAttrContext( HTML_SELECT_ON );
2492
2493 // und PRE/Listing/XMP voruebergehend aussetzen
2494 SplitPREListingXMP( pCntxt );
2495 PushContext( pCntxt );
2496
2497 bSelect = sal_True;
2498 }
2499
EndSelect()2500 void SwHTMLParser::EndSelect()
2501 {
2502 if( pPendStack )
2503 {
2504 SetPendingControlSize( HTML_SELECT_OFF );
2505 return;
2506 }
2507
2508 ASSERT( bSelect, "keine Select" );
2509 ASSERT( pFormImpl && pFormImpl->GetFCompPropSet().is(),
2510 "kein Select-Control" );
2511
2512 const uno::Reference< beans::XPropertySet > & rPropSet =
2513 pFormImpl->GetFCompPropSet();
2514
2515 // die Groesse anpassen
2516 Size aNewSz( MINFLY, MINFLY );
2517
2518 sal_uInt16 nEntryCnt = pFormImpl->GetStringList().Count();
2519 if( nEntryCnt )
2520 {
2521 Sequence<OUString> aList( (sal_Int32)nEntryCnt );
2522 Sequence<OUString> aValueList( (sal_Int32)nEntryCnt );
2523 OUString *pStrings = aList.getArray();
2524 OUString *pValues = aValueList.getArray();
2525 sal_uInt16 i;
2526
2527 for( i = 0; i < nEntryCnt; i++ )
2528 {
2529 String sText( *pFormImpl->GetStringList()[i] );
2530 sText.EraseTrailingChars();
2531 pStrings[i] = sText;
2532
2533 sText = *pFormImpl->GetValueList()[i];
2534 pValues[i] = sText;
2535 }
2536
2537 Any aAny( &aList, ::getCppuType((uno::Sequence<OUString>*)0) );
2538
2539 rPropSet->setPropertyValue(
2540 OUString::createFromAscii( "StringItemList" ), aAny );
2541
2542 aAny <<= ListSourceType_VALUELIST;
2543 rPropSet->setPropertyValue(
2544 OUString::createFromAscii( "ListSourceType" ), aAny );
2545
2546 aAny.setValue( &aValueList, ::getCppuType((uno::Sequence<OUString>*)0) );
2547
2548 rPropSet->setPropertyValue( OUString::createFromAscii( "ListSource" ),
2549 aAny );
2550
2551 sal_uInt16 nSelCnt = pFormImpl->GetSelectedList().Count();
2552 if( !nSelCnt && 1 == nSelectEntryCnt && nEntryCnt )
2553 {
2554 // In einer DropDown-Listbox sollte immer ein Eintrag selektiert
2555 // sein.
2556 pFormImpl->GetSelectedList().Insert( (sal_uInt16)0, (sal_uInt16)0 );
2557 nSelCnt = 1;
2558 }
2559 Sequence<sal_Int16> aSelList( (sal_Int32)nSelCnt );
2560 sal_Int16 *pSels = aSelList.getArray();
2561 for( i=0; i<nSelCnt; i++ )
2562 {
2563 pSels[i] = (sal_Int16)pFormImpl->GetSelectedList()[i];
2564 }
2565 aAny.setValue( &aSelList,
2566 ::getCppuType((uno::Sequence<sal_Int16>*)0) );
2567
2568 rPropSet->setPropertyValue(
2569 OUString::createFromAscii( "DefaultSelection" ), aAny );
2570
2571 pFormImpl->EraseStringList();
2572 pFormImpl->EraseValueList();
2573 }
2574
2575 pFormImpl->EraseSelectedList();
2576
2577 if( bFixSelectWidth )
2578 {
2579 ASSERT( pFormImpl->GetShape().is(), "Kein Shape gemerkt" );
2580 Size aTextSz( -1, 0 );
2581 SetControlSize( pFormImpl->GetShape(), aTextSz, sal_False, sal_False,
2582 HTML_SELECT_OFF );
2583 }
2584
2585 pFormImpl->ReleaseFCompPropSet();
2586
2587 // den Kontext holen
2588 _HTMLAttrContext *pCntxt = PopContext( HTML_SELECT_ON );
2589 if( pCntxt )
2590 {
2591 // und ggf. die Attribute beenden
2592 EndContext( pCntxt );
2593 delete pCntxt;
2594 }
2595
2596 bSelect = sal_False;
2597 }
2598
InsertSelectOption()2599 void SwHTMLParser::InsertSelectOption()
2600 {
2601 ASSERT( bSelect, "keine Select" );
2602 ASSERT( pFormImpl && pFormImpl->GetFCompPropSet().is(),
2603 "kein Select-Control" );
2604
2605 bLBEntrySelected = sal_False;
2606 String aValue;
2607
2608 const HTMLOptions *pHTMLOptions = GetOptions();
2609 for( sal_uInt16 i = pHTMLOptions->Count(); i; )
2610 {
2611 HTMLOption *pOption = (*pHTMLOptions)[--i];
2612 switch( pOption->GetToken() )
2613 {
2614 case HTML_O_ID:
2615 // erstmal weglassen!!!
2616 break;
2617 case HTML_O_SELECTED:
2618 bLBEntrySelected = sal_True;
2619 break;
2620 case HTML_O_VALUE:
2621 aValue = pOption->GetString();
2622 if( !aValue.Len() )
2623 aValue.AssignAscii( "$$$empty$$$" );
2624 break;
2625 }
2626 }
2627
2628 sal_uInt16 nEntryCnt = pFormImpl->GetStringList().Count();
2629 pFormImpl->GetStringList().Insert( new String( aEmptyStr ), nEntryCnt );
2630 pFormImpl->GetValueList().Insert( new String( aValue ), nEntryCnt );
2631 if( bLBEntrySelected )
2632 pFormImpl->GetSelectedList().Insert( nEntryCnt,
2633 pFormImpl->GetSelectedList().Count() );
2634 }
2635
InsertSelectText()2636 void SwHTMLParser::InsertSelectText()
2637 {
2638 ASSERT( bSelect, "keine Select" );
2639 ASSERT( pFormImpl && pFormImpl->GetFCompPropSet().is(),
2640 "kein Select-Control" );
2641
2642 sal_uInt16 nEntryCnt = pFormImpl->GetStringList().Count();
2643 if( nEntryCnt )
2644 {
2645 String& rText = *pFormImpl->GetStringList()[nEntryCnt-1];
2646
2647 if( aToken.Len() && ' '==aToken.GetChar( 0 ) )
2648 {
2649 xub_StrLen nLen = rText.Len();
2650 if( !nLen || ' '==rText.GetChar( nLen-1 ))
2651 aToken.Erase( 0, 1 );
2652 }
2653 if( aToken.Len() )
2654 rText += aToken;
2655 }
2656 }
2657
2658