build fix
[LibreOffice.git] / sw / source / filter / html / swhtml.hxx
blob53111f6ef36d03853281b53c6d2bc3b593bdcf9b
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
19 #ifndef INCLUDED_SW_SOURCE_FILTER_HTML_SWHTML_HXX
20 #define INCLUDED_SW_SOURCE_FILTER_HTML_SWHTML_HXX
22 #include <config_features.h>
24 #include <sfx2/sfxhtml.hxx>
25 #include <svl/macitem.hxx>
26 #include <editeng/svxenum.hxx>
27 #include <fmtornt.hxx>
28 #include <com/sun/star/drawing/XShape.hpp>
29 #include <com/sun/star/form/XFormComponent.hpp>
31 #include "calbck.hxx"
33 #include <memory>
34 #include <vector>
35 #include <deque>
37 class SfxMedium;
38 class SfxViewFrame;
39 class SdrObject;
40 class SvxMacroTableDtor;
41 class SwDoc;
42 class SwPaM;
43 class SwViewShell;
44 class SwStartNode;
45 class SwFormatColl;
46 class SwField;
47 class SwHTMLForm_Impl;
48 class SwApplet_Impl;
49 struct SwHTMLFootEndNote_Impl;
50 class HTMLTableCnts;
51 struct SwPendingStack;
52 class SvxCSS1PropertyInfo;
53 struct ImplSVEvent;
55 #define HTML_PARSPACE (MM50)
56 #define HTML_CJK_PARSPACE (MM50/2)
57 #define HTML_CTL_PARSPACE (MM50/2)
59 #define HTML_DFLT_IMG_WIDTH (MM50*4)
60 #define HTML_DFLT_IMG_HEIGHT (MM50*2)
62 // ein par Sachen, die man oefter mal braucht
63 extern HTMLOptionEnum aHTMLPAlignTable[];
64 extern HTMLOptionEnum aHTMLImgHAlignTable[];
65 extern HTMLOptionEnum aHTMLImgVAlignTable[];
67 // der Attribut Stack:
69 class HTMLAttr;
70 typedef std::deque<HTMLAttr *> HTMLAttrs;
72 class HTMLAttr
74 friend class SwHTMLParser;
75 friend class CellSaveStruct;
77 SwNodeIndex nSttPara, nEndPara;
78 sal_Int32 nSttContent, nEndContent;
79 bool bInsAtStart : 1;
80 bool bLikePara : 1; // Attribut ueber dem gesamten Absatz setzen
81 bool bValid : 1; // ist das Attribut gueltig?
83 SfxPoolItem* pItem;
84 HTMLAttr *pNext; // noch zu schliessene Attrs mit unterschiedl. Werten
85 HTMLAttr *pPrev; // bereits geschlossene aber noch nicht gesetze Attrs
86 HTMLAttr **ppHead; // der Listenkopf
88 HTMLAttr( const SwPosition& rPos, const SfxPoolItem& rItem,
89 HTMLAttr **pHd=nullptr );
91 HTMLAttr( const HTMLAttr &rAttr, const SwNodeIndex &rEndPara,
92 sal_Int32 nEndCnt, HTMLAttr **pHd );
94 public:
96 ~HTMLAttr();
98 HTMLAttr *Clone( const SwNodeIndex& rEndPara, sal_Int32 nEndCnt ) const;
99 void Reset( const SwNodeIndex& rSttPara, sal_Int32 nSttCnt,
100 HTMLAttr **pHd );
101 inline void SetStart( const SwPosition& rPos );
103 sal_uInt32 GetSttParaIdx() const { return nSttPara.GetIndex(); }
104 sal_uInt32 GetEndParaIdx() const { return nEndPara.GetIndex(); }
106 const SwNodeIndex& GetSttPara() const { return nSttPara; }
107 const SwNodeIndex& GetEndPara() const { return nEndPara; }
109 sal_Int32 GetSttCnt() const { return nSttContent; }
110 sal_Int32 GetEndCnt() const { return nEndContent; }
112 bool IsLikePara() const { return bLikePara; }
113 void SetLikePara() { bLikePara = true; }
115 SfxPoolItem& GetItem() { return *pItem; }
116 const SfxPoolItem& GetItem() const { return *pItem; }
118 HTMLAttr *GetNext() const { return pNext; }
119 void InsertNext( HTMLAttr *pNxt ) { pNext = pNxt; }
121 HTMLAttr *GetPrev() const { return pPrev; }
122 void InsertPrev( HTMLAttr *pPrv );
123 void ClearPrev() { pPrev = nullptr; }
125 void SetHead( HTMLAttr **ppHd ) { ppHead = ppHd; }
127 // Beim Setzen von Attributen aus Vorlagen kann es passieren,
128 // dass Attribute doch nicht mehr gesetzt werden sollen. Die zu loeschen
129 // waere sehr aufwendig, da man nicht so genau weiss, wo sie eingekettet
130 // sind. Sie werden deshalb einfach invalidiert und erst beim naechsten
131 // SetAttr_() geloescht.
132 void Invalidate() { bValid = false; }
135 // Tabelle der Attribute: Hier ist die Reihenfolge wichtig: Die Attribute
136 // vorne in der Tabelle werden in EndAllAttrs auch zuerst gesetzt.
137 struct HTMLAttrTable
139 HTMLAttr
140 *pKeep, // Frame-Attribute
141 *pBox,
142 *pBrush,
143 *pBreak,
144 *pPageDesc,
146 *pLRSpace, // Absatz-Attribute
147 *pULSpace,
148 *pLineSpacing,
149 *pAdjust,
150 *pDropCap,
151 *pSplit,
152 *pWidows,
153 *pOrphans,
154 *pDirection,
156 *pCharFormats, // Text-Attribute
157 *pINetFormat,
159 *pBold, // Zeichen-Attribute
160 *pBoldCJK,
161 *pBoldCTL,
162 *pItalic,
163 *pItalicCJK,
164 *pItalicCTL,
165 *pStrike,
166 *pUnderline,
167 *pBlink,
168 *pFont,
169 *pFontCJK,
170 *pFontCTL,
171 *pFontHeight,
172 *pFontHeightCJK,
173 *pFontHeightCTL,
174 *pFontColor,
175 *pEscapement,
176 *pCaseMap,
177 *pKerning, // (nur fuer SPACER)
178 *pCharBrush, // Zeichen-Hintergrund
179 *pLanguage,
180 *pLanguageCJK,
181 *pLanguageCTL,
182 *pCharBox
186 class HTMLAttrContext_SaveDoc;
188 enum SwHTMLAppendMode {
189 AM_NORMAL, // keine Absatz-Abstand-Behandlung
190 AM_NOSPACE, // Abstand hart auf 0cm setzen
191 AM_SPACE, // Abstand hart auf 0.5cm setzen
192 AM_SOFTNOSPACE, // Abstand nicht setzen aber 0cm merken
193 AM_NONE // gar kein Append
196 class HTMLAttrContext
198 HTMLAttrs aAttrs; // die in dem Kontext gestarteten Attribute
200 OUString aClass; // die Klasse des Kontexts
202 HTMLAttrContext_SaveDoc *pSaveDocContext;
203 SfxItemSet *pFrameItemSet;
205 sal_uInt16 nToken; // das Token, zu dem der Kontext gehoehrt
207 sal_uInt16 nTextFormatColl; // eine in dem Kontext begonnene Vorlage oder 0
209 sal_uInt16 nLeftMargin; // ein veraenderter linker Rand
210 sal_uInt16 nRightMargin; // ein veraenderter rechter Rand
211 sal_uInt16 nFirstLineIndent; // ein veraenderter Erstzeilen-Einzug
213 sal_uInt16 nUpperSpace;
214 sal_uInt16 nLowerSpace;
216 SwHTMLAppendMode eAppend;
218 bool bLRSpaceChanged : 1;// linker/rechtr Rand, Einzug veraendert?
219 bool bULSpaceChanged : 1;// oberer/unterer Rand veraendert?
220 bool bDfltTextFormatColl : 1;// nTextFormatColl ist nur ein default
221 bool bSpansSection : 1; // Der Kontext spannt eine SwSection auf
222 bool bPopStack : 1; // Oberhalb liegende Stack-Elemente entf.
223 bool bFinishPREListingXMP : 1;
224 bool bRestartPRE : 1;
225 bool bRestartXMP : 1;
226 bool bRestartListing : 1;
228 public:
229 void ClearSaveDocContext();
231 HTMLAttrContext( sal_uInt16 nTokn, sal_uInt16 nPoolId, const OUString& rClass,
232 bool bDfltColl=false ) :
233 aClass( rClass ),
234 pSaveDocContext( nullptr ),
235 pFrameItemSet( nullptr ),
236 nToken( nTokn ),
237 nTextFormatColl( nPoolId ),
238 nLeftMargin( 0 ),
239 nRightMargin( 0 ),
240 nFirstLineIndent( 0 ),
241 nUpperSpace( 0 ),
242 nLowerSpace( 0 ),
243 eAppend( AM_NONE ),
244 bLRSpaceChanged( false ),
245 bULSpaceChanged( false ),
246 bDfltTextFormatColl( bDfltColl ),
247 bSpansSection( false ),
248 bPopStack( false ),
249 bFinishPREListingXMP( false ),
250 bRestartPRE( false ),
251 bRestartXMP( false ),
252 bRestartListing( false )
255 explicit HTMLAttrContext( sal_uInt16 nTokn ) :
256 pSaveDocContext( nullptr ),
257 pFrameItemSet( nullptr ),
258 nToken( nTokn ),
259 nTextFormatColl( 0 ),
260 nLeftMargin( 0 ),
261 nRightMargin( 0 ),
262 nFirstLineIndent( 0 ),
263 nUpperSpace( 0 ),
264 nLowerSpace( 0 ),
265 eAppend( AM_NONE ),
266 bLRSpaceChanged( false ),
267 bULSpaceChanged( false ),
268 bDfltTextFormatColl( false ),
269 bSpansSection( false ),
270 bPopStack( false ),
271 bFinishPREListingXMP( false ),
272 bRestartPRE( false ),
273 bRestartXMP( false ),
274 bRestartListing( false )
277 ~HTMLAttrContext() { ClearSaveDocContext(); delete pFrameItemSet; }
279 sal_uInt16 GetToken() const { return nToken; }
281 sal_uInt16 GetTextFormatColl() const { return bDfltTextFormatColl ? 0 : nTextFormatColl; }
282 sal_uInt16 GetDfltTextFormatColl() const { return bDfltTextFormatColl ? nTextFormatColl : 0; }
284 const OUString& GetClass() const { return aClass; }
286 inline void SetMargins( sal_uInt16 nLeft, sal_uInt16 nRight, short nIndent );
288 inline bool IsLRSpaceChanged() const { return bLRSpaceChanged; }
289 inline void GetMargins( sal_uInt16& nLeft, sal_uInt16& nRight,
290 short &nIndent ) const;
292 inline void SetULSpace( sal_uInt16 nUpper, sal_uInt16 nLower );
293 inline bool IsULSpaceChanged() const { return bULSpaceChanged; }
294 inline void GetULSpace( sal_uInt16& rUpper, sal_uInt16& rLower ) const;
296 bool HasAttrs() const { return !aAttrs.empty(); }
297 const HTMLAttrs& GetAttrs() const { return aAttrs; }
298 HTMLAttrs& GetAttrs() { return aAttrs; }
300 void SetSpansSection( bool bSet ) { bSpansSection = bSet; }
301 bool GetSpansSection() const { return bSpansSection; }
303 void SetPopStack( bool bSet ) { bPopStack = bSet; }
304 bool GetPopStack() const { return bPopStack; }
306 bool HasSaveDocContext() const { return pSaveDocContext!=nullptr; }
307 HTMLAttrContext_SaveDoc *GetSaveDocContext( bool bCreate=false );
309 const SfxItemSet *GetFrameItemSet() const { return pFrameItemSet; }
310 SfxItemSet *GetFrameItemSet( SwDoc *pCreateDoc );
312 void SetFinishPREListingXMP( bool bSet ) { bFinishPREListingXMP = bSet; }
313 bool IsFinishPREListingXMP() const { return bFinishPREListingXMP; }
315 void SetRestartPRE( bool bSet ) { bRestartPRE = bSet; }
316 bool IsRestartPRE() const { return bRestartPRE; }
318 void SetRestartXMP( bool bSet ) { bRestartXMP = bSet; }
319 bool IsRestartXMP() const { return bRestartXMP; }
321 void SetRestartListing( bool bSet ) { bRestartListing = bSet; }
322 bool IsRestartListing() const { return bRestartListing; }
324 void SetAppendMode( SwHTMLAppendMode eMode ) { eAppend = eMode; }
325 SwHTMLAppendMode GetAppendMode() const { return eAppend; }
328 typedef std::vector<HTMLAttrContext *> HTMLAttrContexts;
330 class HTMLTable;
331 class SwCSS1Parser;
332 class SwHTMLNumRuleInfo;
334 typedef std::vector<std::unique_ptr<ImageMap>> ImageMaps;
336 enum class HtmlContextFlags {
337 ProtectStack = 0x0001,
338 StripPara = 0x0002,
339 KeepNumrule = 0x0004,
340 HeaderDist = 0x0008,
341 FooterDist = 0x0010,
342 KeepAttrs = 0x0020,
343 MultiColMask = StripPara | KeepNumrule | KeepAttrs // for headers, footers or footnotes
345 namespace o3tl
347 template<> struct typed_flags<HtmlContextFlags> : is_typed_flags<HtmlContextFlags, 0x03f> {};
350 enum class HtmlFrameFormatFlags {
351 Box = 0x0001,
352 Background = 0x0002,
353 Padding = 0x0004,
354 Direction = 0x0008,
356 namespace o3tl
358 template<> struct typed_flags<HtmlFrameFormatFlags> : is_typed_flags<HtmlFrameFormatFlags, 0x0f> {};
361 class SwHTMLParser : public SfxHTMLParser, public SwClient
363 friend class SectionSaveStruct;
364 friend class CellSaveStruct;
365 friend class CaptionSaveStruct;
367 OUString m_aPathToFile;
368 OUString m_sBaseURL;
369 OUString m_aBasicLib;
370 OUString m_aBasicModule;
371 OUString m_aScriptSource; // Inhalt des aktuellen Script-Blocks
372 OUString m_aScriptType; // Type des gelesenen Scripts (StarBasic/VB/JAVA)
373 OUString m_aScriptURL; // URL eines Scripts
374 OUString m_aStyleSource; // Inhalt des aktuellen Style-Sheets
375 OUString m_aContents; // Text des akteullen Marquee, Feldes etc.
376 OUString m_sTitle;
377 OUString m_aUnknownToken; // ein gestartetes unbekanntes Token
378 OUString m_aBulletGrfs[MAXLEVEL];
379 OUString m_sJmpMark;
381 std::vector<sal_uInt16> m_aBaseFontStack; // Stack fuer <BASEFONT>
382 // Bit 0-2: Fontgroesse (1-7)
383 std::vector<sal_uInt16> m_aFontStack; // Stack fuer <FONT>, <BIG>, <SMALL>
384 // Bit 0-2: Fontgroesse (1-7)
385 // Bit 15: Fontfarbe wurde gesetzt
387 HTMLAttrs m_aSetAttrTab;// "geschlossene", noch nicht gesetzte Attr.
388 HTMLAttrs m_aParaAttrs; // vorlauefige Absatz-Attribute
389 HTMLAttrTable m_aAttrTab; // "offene" Attribute
390 HTMLAttrContexts m_aContexts;// der aktuelle Attribut/Token-Kontext
391 std::vector<SwFrameFormat *> m_aMoveFlyFrames;// Fly-Frames, the anchor is moved
392 std::deque<sal_Int32> m_aMoveFlyCnts;// and the Content-Positions
394 SwApplet_Impl *m_pAppletImpl; // das aktuelle Applet
396 SwCSS1Parser *m_pCSS1Parser; // der Style-Sheet-Parser
397 SwHTMLNumRuleInfo *m_pNumRuleInfo;
398 SwPendingStack *m_pPendStack;
400 SwDoc *m_pDoc;
401 SwPaM *m_pPam; // SwPosition duerfte doch reichen, oder ??
402 SwViewShell *m_pActionViewShell; // SwViewShell, an der das StartAction
403 // gerufen wurde.
404 SwNodeIndex *m_pSttNdIdx;
406 HTMLTable *m_pTable; // die aktuelle "auesserste" Tabelle
407 SwHTMLForm_Impl *m_pFormImpl;// die aktuelle Form
408 SdrObject *m_pMarquee; // aktuelles Marquee
409 SwField *m_pField; // aktuelles Feld
410 ImageMap *m_pImageMap; // aktuelle Image-Map
411 ImageMaps *m_pImageMaps; ///< all Image-Maps that have been read
412 SwHTMLFootEndNote_Impl *m_pFootEndNoteImpl;
414 Size m_aHTMLPageSize; // die Seitengroesse der HTML-Vorlage
416 sal_uInt32 m_aFontHeights[7]; // die Font-Hoehen 1-7
417 sal_uInt32 m_nScriptStartLineNr; // Zeilennummer eines Script-Blocks
418 ImplSVEvent * m_nEventId;
420 sal_uInt16 m_nBaseFontStMin;
421 sal_uInt16 m_nFontStMin;
422 sal_uInt16 m_nDefListDeep;
423 sal_uInt16 m_nFontStHeadStart; // Elemente im Font-Stack bei <Hn>
424 sal_uInt16 m_nSBModuleCnt; // Zaehler fuer Basic-Module
425 sal_uInt16 m_nMissingImgMaps; // Wie viele Image-Maps fehlen noch?
426 size_t m_nParaCnt;
427 size_t m_nContextStMin; // Untergrenze fuer PopContext
428 size_t m_nContextStAttrMin; // Untergrenze fuer Attributierung
429 sal_uInt16 m_nSelectEntryCnt; // Number of entries in the actual listbox
430 sal_uInt16 m_nOpenParaToken; // ein geoeffnetes Absatz-Element
432 enum JumpToMarks { JUMPTO_NONE, JUMPTO_MARK, JUMPTO_TABLE, JUMPTO_FRAME,
433 JUMPTO_REGION, JUMPTO_GRAPHIC } m_eJumpTo;
435 #ifdef DBG_UTIL
436 sal_uInt16 m_nContinue; // depth of Continue calls
437 #endif
439 SvxAdjust m_eParaAdjust; // Ausrichtung des aktuellen Absatz
440 HTMLScriptLanguage m_eScriptLang; // die aktuelle Script-Language
442 bool m_bOldIsHTMLMode : 1; // War's mal ein HTML-Dokument?
444 bool m_bDocInitalized : 1; // Dokument bzw. Shell wurden initialisiert
445 // Flag um doppeltes init durch Rekursion
446 // zu verhindern.
447 bool m_bViewCreated : 1; // die View wurde schon erzeugt (asynchron)
448 bool m_bSetModEnabled : 1;
450 bool m_bInFloatingFrame : 1; // Wir sind in einen Floating Frame
451 bool m_bInField : 1;
452 bool m_bKeepUnknown : 1; // unbekannte/nicht unterstuetze Tokens beh.
453 // 8
454 bool m_bCallNextToken : 1; // In Tabellen: NextToken in jedem Fall rufen
455 bool m_bIgnoreRawData : 1; // Inhalt eines Scripts/Styles ignorieren.
456 bool m_bLBEntrySelected : 1; // Ist der aktuelle Listbox-Eintrag selekt.
457 bool m_bTAIgnoreNewPara : 1; // naechstes LF in TextArea ignorieren?
458 bool m_bFixMarqueeWidth : 1; // Groesse einer Laufschrift anpassen?
460 bool m_bUpperSpace : 1; // obererer Absatz-Abstand wird benoetigt
461 bool m_bNoParSpace : 1;
462 // 16
464 bool m_bInNoEmbed : 1; // Wir sind in einem NOEMBED-Bereich
466 bool m_bInTitle : 1; // Wir sind im Titel
468 bool m_bChkJumpMark : 1; // springe ggfs. zu einem vorgegebenem Mark
469 bool m_bUpdateDocStat : 1;
470 bool m_bFixSelectWidth : 1; // Breite eines Selects neu setzen?
471 bool m_bFixSelectHeight : 1; // Breite eines Selects neu setzen?
472 bool m_bTextArea : 1;
473 // 24
474 bool m_bSelect : 1;
475 bool m_bInFootEndNoteAnchor : 1;
476 bool m_bInFootEndNoteSymbol : 1;
477 bool m_bIgnoreHTMLComments : 1;
478 bool m_bRemoveHidden : 1; // the filter implementation might set the hidden flag
480 bool m_isInTableStructure;
482 /// the names corresponding to the DOCINFO field subtypes INFO[1-4]
483 OUString m_InfoNames[4];
485 SfxViewFrame* m_pTempViewFrame;
487 void DeleteFormImpl();
489 void DocumentDetected();
490 void Show();
491 void ShowStatline();
492 SwViewShell *CallStartAction( SwViewShell *pVSh = nullptr, bool bChkPtr = true );
493 SwViewShell *CallEndAction( bool bChkAction = false, bool bChkPtr = true );
494 SwViewShell *CheckActionViewShell();
496 DECL_LINK( AsyncCallback, void*, void );
498 // Attribute am Dok setzen
499 void SetAttr_( bool bChkEnd, bool bBeforeTable, HTMLAttrs *pPostIts );
500 inline void SetAttr( bool bChkEnd = true, bool bBeforeTable = false,
501 HTMLAttrs *pPostIts = nullptr )
503 if( !m_aSetAttrTab.empty() || !m_aMoveFlyFrames.empty() )
504 SetAttr_( bChkEnd, bBeforeTable, pPostIts );
507 HTMLAttr **GetAttrTabEntry( sal_uInt16 nWhich );
509 // Einen neuen Textknoten an PaM-Position anlegen
510 bool AppendTextNode( SwHTMLAppendMode eMode=AM_NORMAL, bool bUpdateNum=true );
511 void AddParSpace();
513 // Ein Attribut beginnen/beenden
514 // ppDepAttr gibt einen Attribut-Tabellen-Eintrag an, dessen Attribute
515 // gesetzt sein muessen, bevor das Attribut beendet werden darf
516 void NewAttr( HTMLAttr **ppAttr, const SfxPoolItem& rItem );
517 bool EndAttr( HTMLAttr *pAttr, bool bChkEmpty=true );
518 void DeleteAttr( HTMLAttr* pAttr );
520 void EndContextAttrs( HTMLAttrContext *pContext );
521 void SaveAttrTab( HTMLAttrTable& rNewAttrTab );
522 void SplitAttrTab( const SwPosition& rNewPos );
523 void SplitAttrTab( HTMLAttrTable& rNewAttrTab, bool bMoveEndBack );
524 void RestoreAttrTab( HTMLAttrTable& rNewAttrTab );
525 void InsertAttr( const SfxPoolItem& rItem, bool bInsAtStart );
526 void InsertAttrs( HTMLAttrs& rAttrs );
528 bool DoPositioning( SfxItemSet &rItemSet,
529 SvxCSS1PropertyInfo &rPropInfo,
530 HTMLAttrContext *pContext );
531 bool CreateContainer( const OUString& rClass, SfxItemSet &rItemSet,
532 SvxCSS1PropertyInfo &rPropInfo,
533 HTMLAttrContext *pContext );
534 bool EndSection( bool bLFStripped=false );
536 void InsertAttrs( SfxItemSet &rItemSet, SvxCSS1PropertyInfo &rPropInfo,
537 HTMLAttrContext *pContext, bool bCharLvl=false );
538 void InsertAttr( HTMLAttr **ppAttr, const SfxPoolItem & rItem,
539 HTMLAttrContext *pCntxt );
540 void SplitPREListingXMP( HTMLAttrContext *pCntxt );
541 void FixHeaderFooterDistance( bool bHeader, const SwPosition *pOldPos );
543 void EndContext( HTMLAttrContext *pContext );
544 void ClearContext( HTMLAttrContext *pContext );
546 const SwFormatColl *GetCurrFormatColl() const;
548 SwTwips GetCurrentBrowseWidth();
550 SwHTMLNumRuleInfo& GetNumInfo() { return *m_pNumRuleInfo; }
551 // add parameter <bCountedInList>
552 void SetNodeNum( sal_uInt8 nLevel );
554 // Verwalten von Absatz-Vorlagen
556 // die Vorlagen auf dem Stack bzw. deren Attribute setzen
557 void SetTextCollAttrs( HTMLAttrContext *pContext = nullptr );
559 void InsertParaAttrs( const SfxItemSet& rItemSet );
561 // Verwalten des Attribut-Kontexts
563 // aktuellen Kontext merken
564 inline void PushContext( HTMLAttrContext *pCntxt );
566 // den obersten/spezifizierten Kontext holen, aber nicht ausserhalb
567 // des Kontexts mit Token nLimit suchen. Wenn bRemove gesetzt ist,
568 // wird er entfernt
569 HTMLAttrContext *PopContext( sal_uInt16 nToken=0 );
571 bool GetMarginsFromContext( sal_uInt16 &nLeft, sal_uInt16 &nRight, short& nIndent,
572 bool bIgnoreCurrent=false ) const;
573 void GetMarginsFromContextWithNumBul( sal_uInt16 &nLeft, sal_uInt16 &nRight,
574 short& nIndent ) const;
575 void GetULSpaceFromContext( sal_uInt16 &rUpper, sal_uInt16 &rLower ) const;
577 void MovePageDescAttrs( SwNode *pSrcNd, sal_uLong nDestIdx, bool bFormatBreak );
579 // Behandlung von Tags auf Absatz-Ebene
581 // <P> und <H1> bis <H6>
582 void NewPara();
583 void EndPara( bool bReal = false );
584 void NewHeading( int nToken );
585 void EndHeading();
587 // <ADDRESS>, <BLOCKQUOTE> und <PRE>
588 void NewTextFormatColl( int nToken, sal_uInt16 nPoolId );
589 void EndTextFormatColl( int nToken );
591 // <DIV> und <CENTER>
592 void NewDivision( int nToken );
593 void EndDivision( int nToken );
595 // Fly-Frames einfuegen/verlassen
596 void InsertFlyFrame( const SfxItemSet& rItemSet, HTMLAttrContext *pCntxt,
597 const OUString& rId );
599 void SaveDocContext( HTMLAttrContext *pCntxt, HtmlContextFlags nFlags,
600 const SwPosition *pNewPos );
601 void RestoreDocContext( HTMLAttrContext *pCntxt );
603 // alle durch <DIV> aufgespannten Bereiche verlassen
604 bool EndSections( bool bLFStripped );
606 // <MULTICOL>
607 void NewMultiCol( sal_uInt16 columnsFromCss=0 );
609 // <MARQUEE>
610 void NewMarquee( HTMLTable *pCurTable=nullptr );
611 void EndMarquee();
612 void InsertMarqueeText();
614 // Behandluung von Listen
616 // Numerierungs <OL> und Aufzaehlungs-Listen <UL> mit <LI>
617 void NewNumBulList( int nToken );
618 void EndNumBulList( int nToken=0 );
619 void NewNumBulListItem( int nToken );
620 void EndNumBulListItem( int nToken, bool bSetColl,
621 bool bLastPara=false );
623 // Definitions-Listen <DL> mit <DD>, <DT>
624 void NewDefList();
625 void EndDefList();
626 void NewDefListItem( int nToken );
627 void EndDefListItem( int nToken=0, bool bLastPara=false );
629 // Behandlung von Tags auf Zeichen-Ebene
631 // Tags wie <B>, <I> etc behandeln, die ein bestimmtes Attribut
632 // an und ausschalten, oder die wie SPAN nur Attribute aus Styles holen
633 void NewStdAttr( int nToken );
634 void NewStdAttr( int nToken,
635 HTMLAttr **ppAttr, const SfxPoolItem & rItem,
636 HTMLAttr **ppAttr2=nullptr, const SfxPoolItem *pItem2=nullptr,
637 HTMLAttr **ppAttr3=nullptr, const SfxPoolItem *pItem3=nullptr );
638 void EndTag( int nToken );
640 // Font-Attribute behandeln
641 void NewBasefontAttr(); // fuer <BASEFONT>
642 void EndBasefontAttr();
643 void NewFontAttr( int nToken ); // fuer <FONT>, <BIG> und <SMALL>
644 void EndFontAttr( int nToken );
646 // Tags, die durch Zeichenvorlagen realisiert werden
647 void NewCharFormat( int nToken );
649 // <SDFIELD>
650 public:
651 static sal_uInt16 GetNumType( const OUString& rStr, sal_uInt16 eDfltType );
652 private:
653 void NewField();
654 void EndField();
655 void InsertFieldText();
657 // <SPACER>
658 void InsertSpacer();
660 // Einfuegen von Grafiken, Plugins und Applets
662 // Image-Maps suchen und mit Grafik-Nodes verbinden
663 ImageMap *FindImageMap( const OUString& rURL ) const;
664 void ConnectImageMaps();
666 // Verankerung eines Fly-Frames bestimmen und entsprechende Attribute
667 // in den Attrset setzen (htmlgrin.cxx)
668 void SetAnchorAndAdjustment( sal_Int16 eVertOri,
669 sal_Int16 eHoriOri,
670 const SfxItemSet &rItemSet,
671 const SvxCSS1PropertyInfo &rPropInfo,
672 SfxItemSet& rFrameSet );
673 void SetAnchorAndAdjustment( sal_Int16 eVertOri,
674 sal_Int16 eHoriOri,
675 SfxItemSet& rFrameSet,
676 bool bDontAppend=false );
677 void SetAnchorAndAdjustment( const SfxItemSet &rItemSet,
678 const SvxCSS1PropertyInfo &rPropInfo,
679 SfxItemSet &rFrameItemSet );
681 static void SetFrameFormatAttrs( SfxItemSet &rItemSet, SvxCSS1PropertyInfo &rPropInfo,
682 HtmlFrameFormatFlags nFlags, SfxItemSet &rFrameItemSet );
684 // Frames anlegen und Auto-gebundene Rahmen registrieren
685 void RegisterFlyFrame( SwFrameFormat *pFlyFrame );
687 // Die Groesse des Fly-Frames an die Vorgaben und Gegebenheiten anpassen
688 // (nicht fuer Grafiken, deshalb htmlplug.cxx)
689 static void SetFixSize( const Size& rPixSize, const Size& rTwipDfltSize,
690 bool bPrcWidth, bool bPrcHeight,
691 SfxItemSet &rItemSet, SvxCSS1PropertyInfo &rPropInfo,
692 SfxItemSet& rFlyItemSet );
693 static void SetVarSize( SfxItemSet &rItemSet, SvxCSS1PropertyInfo &rPropInfo,
694 SfxItemSet& rFlyItemSet, SwTwips nDfltWidth=MINLAY,
695 sal_uInt8 nDltPrcWidth=0 );
696 static void SetSpace( const Size& rPixSpace, SfxItemSet &rItemSet,
697 SvxCSS1PropertyInfo &rPropInfo, SfxItemSet& rFlyItemSet );
699 sal_uInt16 IncGrfsThatResizeTable();
701 void GetDefaultScriptType( ScriptType& rType,
702 OUString& rTypeStr ) const;
704 // die eigentlichen Einfuege-Methoden fuer <IMG>, <EMBED> und <APPLET>
705 // und <PARAM>
706 void InsertImage(); // htmlgrin.cxx
707 void InsertEmbed(); // htmlplug.cxx
709 #if HAVE_FEATURE_JAVA
710 void NewObject(); // htmlplug.cxx
711 #endif
712 void EndObject(); // CommandLine mit Applet verkn. (htmlplug.cxx)
713 #if HAVE_FEATURE_JAVA
714 void InsertApplet(); // htmlplug.cxx
715 #endif
716 void EndApplet(); // CommandLine mit Applet verkn. (htmlplug.cxx)
717 void InsertParam(); // htmlplug.cxx
719 void InsertFloatingFrame();
721 // <BODY>-Tag auswerten: Hintergrund-Grafiken und -Farben setzen (htmlgrin.cxx)
722 void InsertBodyOptions();
724 // Einfuegen von Links und Bookmarks (htmlgrin.cxx)
726 // <A>-Tag auswerten: einen Link bzw. eine Bookmark einfuegen
727 void NewAnchor();
728 void EndAnchor();
730 // eine Bookmark einfuegen
731 void InsertBookmark( const OUString& rName );
733 void InsertCommentText( const sal_Char *pTag );
734 void InsertComment( const OUString& rName, const sal_Char *pTag = nullptr );
736 // sind im aktuellen Absatz Bookmarks vorhanden?
737 bool HasCurrentParaBookmarks( bool bIgnoreStack=false ) const;
739 // Einfuegen von Script/Basic-Elementen
741 // das zueletzt gelsene Basic-Modul parsen (htmlbas.cxx)
742 void NewScript();
743 void EndScript();
745 void AddScriptSource();
747 // ein Event in die SFX-Konfiguation eintragen (htmlbas.cxx)
748 void InsertBasicDocEvent( const OUString& aEventName, const OUString& rName,
749 ScriptType eScrType, const OUString& rScrType );
751 // Inserting styles
753 // <STYLE>
754 void NewStyle();
755 void EndStyle();
757 static inline bool HasStyleOptions( const OUString &rStyle, const OUString &rId,
758 const OUString &rClass, const OUString *pLang=nullptr,
759 const OUString *pDir=nullptr );
760 bool ParseStyleOptions( const OUString &rStyle, const OUString &rId,
761 const OUString &rClass, SfxItemSet &rItemSet,
762 SvxCSS1PropertyInfo &rPropInfo,
763 const OUString *pLang=nullptr, const OUString *pDir=nullptr );
765 // Inserting Controls and Forms (htmlform.cxx)
767 // Insert draw object into document
768 void InsertDrawObject( SdrObject* pNewDrawObj, const Size& rSpace,
769 sal_Int16 eVertOri,
770 sal_Int16 eHoriOri,
771 SfxItemSet& rCSS1ItemSet,
772 SvxCSS1PropertyInfo& rCSS1PropInfo );
773 css::uno::Reference< css::drawing::XShape > InsertControl(
774 const css::uno::Reference< css::form::XFormComponent > & rFormComp,
775 const css::uno::Reference< css::beans::XPropertySet > & rFCompPropSet,
776 const Size& rSize,
777 sal_Int16 eVertOri,
778 sal_Int16 eHoriOri,
779 SfxItemSet& rCSS1ItemSet,
780 SvxCSS1PropertyInfo& rCSS1PropInfo,
781 const SvxMacroTableDtor& rMacroTable,
782 const std::vector<OUString>& rUnoMacroTable,
783 const std::vector<OUString>& rUnoMacroParamTable,
784 bool bSetPropSet = true,
785 bool bHidden = false );
786 void SetControlSize( const css::uno::Reference< css::drawing::XShape > & rShape, const Size& rTextSz,
787 bool bMinWidth, bool bMinHeight );
789 public:
790 static void ResizeDrawObject( SdrObject* pObj, SwTwips nWidth );
791 private:
792 static void RegisterDrawObjectToTable( HTMLTable *pCurTable, SdrObject* pObj,
793 sal_uInt8 nWidth );
795 void NewForm( bool bAppend=true );
796 void EndForm( bool bAppend=true );
798 // Insert methods for <INPUT>, <TEXTAREA> und <SELECT>
799 void InsertInput();
801 void NewTextArea();
802 void InsertTextAreaText( sal_uInt16 nToken );
803 void EndTextArea();
805 void NewSelect();
806 void InsertSelectOption();
807 void InsertSelectText();
808 void EndSelect();
810 // Inserting tables (htmltab.cxx)
811 public:
813 // Insert box content after the given node
814 const SwStartNode *InsertTableSection( const SwStartNode *pPrevStNd );
816 // Insert box content at the end of the table containing the PaM
817 // and move the PaM into the cell
818 const SwStartNode *InsertTableSection( sal_uInt16 nPoolId );
820 // Insert methods for various table tags
821 HTMLTableCnts *InsertTableContents( bool bHead );
823 private:
824 // Create a section for the temporary storage of the table caption
825 SwStartNode *InsertTempTableCaptionSection();
827 void BuildTableCell( HTMLTable *pTable, bool bReadOptions, bool bHead );
828 void BuildTableRow( HTMLTable *pTable, bool bReadOptions,
829 SvxAdjust eGrpAdjust, sal_Int16 eVertOri );
830 void BuildTableSection( HTMLTable *pTable, bool bReadOptions, bool bHead );
831 void BuildTableColGroup( HTMLTable *pTable, bool bReadOptions );
832 void BuildTableCaption( HTMLTable *pTable );
833 HTMLTable *BuildTable( SvxAdjust eCellAdjust,
834 bool bIsParentHead = false,
835 bool bHasParentSection=true,
836 bool bHasToFlow = false );
838 // misc ...
840 void ParseMoreMetaOptions();
842 bool FileDownload( const OUString& rURL, OUString& rStr );
843 void InsertLink();
845 void InsertIDOption();
846 void InsertLineBreak();
847 void InsertHorzRule();
849 void FillEndNoteInfo( const OUString& rContent );
850 void FillFootNoteInfo( const OUString& rContent );
851 void InsertFootEndNote( const OUString& rName, bool bEndNote, bool bFixed );
852 void FinishFootEndNote();
853 void InsertFootEndNoteText();
854 SwNodeIndex *GetFootEndNoteSection( const OUString& rName );
855 void DeleteFootEndNoteImpl();
857 sal_Int32 StripTrailingLF();
859 // Remove empty paragraph at the PaM position
860 void StripTrailingPara();
862 // Are there fly frames in the current paragraph?
863 bool HasCurrentParaFlys( bool bNoSurroundOnly = false,
864 bool bSurroundOnly = false ) const;
866 public: // used in tables
868 // Create brush item (with new) or 0
869 SvxBrushItem* CreateBrushItem( const Color *pColor,
870 const OUString &rImageURL,
871 const OUString &rStyle,
872 const OUString &rId,
873 const OUString &rClass );
875 protected:
876 // Executed for each token recognized by CallParser
877 virtual void NextToken( int nToken ) override;
878 virtual ~SwHTMLParser() override;
880 // If the document is removed, remove the parser as well
881 virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ) override;
883 virtual void AddMetaUserDefined( OUString const & i_rMetaName ) override;
885 public:
887 SwHTMLParser( SwDoc* pD, SwPaM & rCursor, SvStream& rIn,
888 const OUString& rFileName,
889 const OUString& rBaseURL,
890 bool bReadNewDoc,
891 SfxMedium* pMed = nullptr, bool bReadUTF8 = false,
892 bool bIgnoreHTMLComments = false );
894 virtual SvParserState CallParser() override;
896 static sal_uInt16 ToTwips( sal_uInt16 nPixel );
898 // for reading asynchronously from SvStream
899 virtual void Continue( int nToken ) override;
901 virtual bool ParseMetaOptions( const css::uno::Reference<css::document::XDocumentProperties>&,
902 SvKeyValueIterator* ) override;
905 struct SwPendingStackData
907 virtual ~SwPendingStackData() {}
910 struct SwPendingStack
912 int nToken;
913 SwPendingStackData* pData;
914 SwPendingStack* pNext;
916 SwPendingStack( int nTkn, SwPendingStack* pNxt )
917 : nToken( nTkn ), pData( nullptr ), pNext( pNxt )
921 inline void HTMLAttr::SetStart( const SwPosition& rPos )
923 nSttPara = rPos.nNode;
924 nSttContent = rPos.nContent.GetIndex();
925 nEndPara = nSttPara;
926 nEndContent = nSttContent;
929 inline void HTMLAttrContext::SetMargins( sal_uInt16 nLeft, sal_uInt16 nRight,
930 short nIndent )
932 nLeftMargin = nLeft;
933 nRightMargin = nRight;
934 nFirstLineIndent = nIndent;
935 bLRSpaceChanged = true;
938 inline void HTMLAttrContext::GetMargins( sal_uInt16& nLeft,
939 sal_uInt16& nRight,
940 short& nIndent ) const
942 if( bLRSpaceChanged )
944 nLeft = nLeftMargin;
945 nRight = nRightMargin;
946 nIndent = nFirstLineIndent;
950 inline void HTMLAttrContext::SetULSpace( sal_uInt16 nUpper, sal_uInt16 nLower )
952 nUpperSpace = nUpper;
953 nLowerSpace = nLower;
954 bULSpaceChanged = true;
957 inline void HTMLAttrContext::GetULSpace( sal_uInt16& rUpper,
958 sal_uInt16& rLower ) const
960 if( bULSpaceChanged )
962 rUpper = nUpperSpace;
963 rLower = nLowerSpace;
967 inline bool SwHTMLParser::HasStyleOptions( const OUString &rStyle,
968 const OUString &rId,
969 const OUString &rClass,
970 const OUString *pLang,
971 const OUString *pDir )
973 return !rStyle.isEmpty() || !rId.isEmpty() || !rClass.isEmpty() ||
974 (pLang && !pLang->isEmpty()) || (pDir && !pDir->isEmpty());
977 inline void SwHTMLParser::PushContext( HTMLAttrContext *pCntxt )
979 m_aContexts.push_back( pCntxt );
982 #endif
984 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */