xref: /AOO41X/main/sw/source/filter/ww1/w1sprm.cxx (revision efeef26f81c84063fb0a91bde3856d4a51172d90)
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 #include <hintids.hxx>
28 #include <tools/solar.h>
29 #include <editeng/paperinf.hxx>
30 #include <editeng/lrspitem.hxx>
31 #include <editeng/adjitem.hxx>
32 #include <editeng/spltitem.hxx>
33 #include <editeng/keepitem.hxx>
34 #include <editeng/boxitem.hxx>
35 #include <editeng/shaditem.hxx>
36 #include <editeng/ulspitem.hxx>
37 #include <editeng/lspcitem.hxx>
38 #include <editeng/tstpitem.hxx>
39 #include <fmtclds.hxx>
40 #include <fmtfsize.hxx>
41 #include <pam.hxx>
42 #include <ndtxt.hxx>
43 #include <charatr.hxx>
44 #include <frmatr.hxx>
45 #include <doc.hxx>
46 #include <errhdl.hxx>
47 #include <fltini.hxx>
48 #include <docufld.hxx>
49 #include <pagedesc.hxx>
50 #include <flddat.hxx>
51 #include <reffld.hxx>
52 #include <expfld.hxx>
53 #include <w1par.hxx>
54 #include <mdiexp.hxx>
55 #include <swerror.h>
56 #include <statstr.hrc>
57 
58 using namespace ::com::sun::star;
59 
60 /////////////////////////////////////////////////////////////// Ww1Sprm
Stop(Ww1Shell & rOut,Ww1Manager & rMan)61 void Ww1Sprm::Stop( Ww1Shell& rOut, Ww1Manager& rMan)
62 {
63     if(IsUsed())
64 //      for(sal_uInt16 i=0;i<Count();i++)
65         for(short i=Count()-1;i>=0;i--){    // rueckwaerts
66             sal_uInt8 nId;
67             sal_uInt16 nSize;
68             sal_uInt8* pSprm;
69             Fill(i, nId, nSize, pSprm);
70             GetTab(nId).Stop(rOut, nId, pSprm, nSize, rMan);
71         }
72 }
73 
Start(Ww1Shell & rOut,Ww1Manager & rMan,sal_uInt16 i)74 void Ww1Sprm::Start(
75     Ww1Shell& rOut, Ww1Manager& rMan, sal_uInt16 i)
76 {
77     sal_uInt8 nId;
78     sal_uInt16 nSize;
79     sal_uInt8* pSprm;
80     Fill(i, nId, nSize, pSprm);
81     GetTab(nId).Start(rOut, nId, pSprm, nSize, rMan);
82 }
83 
Start(Ww1Shell & rOut,Ww1Manager & rMan)84 void Ww1Sprm::Start(
85     Ww1Shell& rOut, Ww1Manager& rMan)
86 {
87     if(IsUsed())
88         for(sal_uInt16 i=0;i<Count();i++)
89             Start(rOut, rMan, i);
90 }
91 
92 //////////////////////////////////////////////////////////// SingleSprm
Start(Ww1Shell &,sal_uInt8,sal_uInt8 *,sal_uInt16,Ww1Manager &)93 void Ww1SingleSprm::Start(
94     Ww1Shell&, sal_uInt8 /*nId*/, sal_uInt8*, sal_uInt16, Ww1Manager&)
95 {
96 }
97 
Stop(Ww1Shell &,sal_uInt8,sal_uInt8 *,sal_uInt16,Ww1Manager &)98 void Ww1SingleSprm::Stop(
99     Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&)
100 {
101 //  ASSERT(sal_False, "Unknown Sprm");
102 }
103 
104 ////////////////////////////////////////////////////////////////// STOP
105 //
106 // folgende defines werden genutzt zur implementierung der
107 // Stop()-Member der SingleSprm-klassen, da diese im normalfalle
108 // lediglich EndItem(s) in die shell stellen.
109 //
110 #define STOP1(Class, Code) \
111     void Class::Stop( \
112      Ww1Shell& rOut, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&) { \
113         rOut.EndItem(Code); }
114 #define STOP2(Class, Code1, Code2) \
115     void Class::Stop( \
116      Ww1Shell& rOut, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&) { \
117         rOut.EndItem(Code1).EndItem(Code2); }
118 
119 /////////////////////////////////////////////////////// SingleSprmXxxxx
120 //
121 // hier beginnt die auswertung der eigentlichen sprms. jeder sprmtyp
122 // hat eine eigene klasse, die die virtualen methoden start und stop
123 // implementiert. die klassen stehen in der sprm-tab, die statischer
124 // member von Ww1Sprm ist. taucht ein sprm im dokument auf, werden die
125 // virtualen methoden bei beginn und ende der formatierung gerufen.
126 //
Start(Ww1Shell & rOut,sal_uInt8,sal_uInt8 * pSprm,sal_uInt16,Ww1Manager &)127 void Ww1SingleSprmPDxaLeft::Start(
128     Ww1Shell& rOut, sal_uInt8, sal_uInt8* pSprm, sal_uInt16, Ww1Manager&)
129 {
130     SvxLRSpaceItem aLR((SvxLRSpaceItem&)rOut.GetAttr(RES_LR_SPACE));
131     short nPara = SVBT16ToShort(pSprm);
132     if(nPara < 0)
133         nPara = 0;
134     if(aLR.GetTxtFirstLineOfst() < -nPara)
135         aLR.SetTxtFirstLineOfst(-nPara); // sonst weigert sich SetTxtLeft()
136     aLR.SetTxtLeft(nPara);
137     rOut << aLR;
138 }
139 
Start(Ww1Shell & rOut,sal_uInt8,sal_uInt8 * pSprm,sal_uInt16,Ww1Manager &)140 void Ww1SingleSprmPDxaRight::Start(
141     Ww1Shell& rOut, sal_uInt8, sal_uInt8* pSprm, sal_uInt16, Ww1Manager&)
142 {
143     SvxLRSpaceItem aLR((SvxLRSpaceItem&)rOut.GetAttr(RES_LR_SPACE));
144     short nPara = SVBT16ToShort(pSprm);
145     if(nPara < 0)
146         nPara = 0;
147     aLR.SetRight(nPara);
148     rOut << aLR;
149 }
150 
Start(Ww1Shell & rOut,sal_uInt8,sal_uInt8 * pSprm,sal_uInt16,Ww1Manager &)151 void Ww1SingleSprmPDxaLeft1::Start(
152     Ww1Shell& rOut, sal_uInt8, sal_uInt8* pSprm, sal_uInt16, Ww1Manager&)
153 {
154     SvxLRSpaceItem aLR((SvxLRSpaceItem&)rOut.GetAttr(RES_LR_SPACE));
155     short nPara = SVBT16ToShort(pSprm);
156     if(-nPara >(short)aLR.GetTxtLeft())
157         nPara = -(short)aLR.GetTxtLeft();
158     aLR.SetTxtFirstLineOfst(nPara);
159     rOut << aLR;
160 }
161 
STOP1(Ww1SingleSprmPDxa,RES_LR_SPACE)162 STOP1(Ww1SingleSprmPDxa, RES_LR_SPACE)
163 
164 void Ww1SingleSprmPJc::Start(
165     Ww1Shell& rOut, sal_uInt8, sal_uInt8* pSprm, sal_uInt16, Ww1Manager&)
166 {
167     static SvxAdjust __READONLY_DATA aAdj[] = {
168         SVX_ADJUST_LEFT,
169         SVX_ADJUST_CENTER,
170         SVX_ADJUST_RIGHT,
171         SVX_ADJUST_BLOCK };
172     sal_uInt8 nPara = SVBT8ToByte(pSprm);
173     nPara %=(sizeof(aAdj)/sizeof(*aAdj));
174     rOut << SvxAdjustItem(aAdj[nPara], RES_PARATR_ADJUST);
175 }
176 
STOP1(Ww1SingleSprmPJc,RES_PARATR_ADJUST)177 STOP1(Ww1SingleSprmPJc, RES_PARATR_ADJUST)
178 
179 void Ww1SingleSprmPFKeep::Start(
180     Ww1Shell& rOut, sal_uInt8, sal_uInt8* pSprm, sal_uInt16, Ww1Manager&)
181 {
182     rOut << SvxFmtSplitItem((SVBT8ToByte(pSprm) & 1) == 0, RES_PARATR_SPLIT);
183 }
184 
STOP1(Ww1SingleSprmPFKeep,RES_PARATR_SPLIT)185 STOP1(Ww1SingleSprmPFKeep, RES_PARATR_SPLIT)
186 
187 void Ww1SingleSprmPFKeepFollow::Start(
188     Ww1Shell& rOut, sal_uInt8, sal_uInt8* pSprm, sal_uInt16, Ww1Manager&)
189 {
190     rOut << SvxFmtKeepItem((SVBT8ToByte(pSprm) & 1) != 0, RES_KEEP);
191 }
192 
STOP1(Ww1SingleSprmPFKeepFollow,RES_KEEP)193 STOP1(Ww1SingleSprmPFKeepFollow, RES_KEEP)
194 
195 void Ww1SingleSprmPPageBreakBefore::Start(
196     Ww1Shell& rOut, sal_uInt8, sal_uInt8* pSprm, sal_uInt16, Ww1Manager&)
197 {
198     rOut << SvxFmtBreakItem(SVBT8ToByte(pSprm) & 1?
199      SVX_BREAK_PAGE_BEFORE:SVX_BREAK_NONE, RES_BREAK );
200 }
201 
STOP1(Ww1SingleSprmPPageBreakBefore,RES_BREAK)202 STOP1(Ww1SingleSprmPPageBreakBefore, RES_BREAK)
203 
204 SvxBorderLine* Ww1SingleSprmPBrc::SetBorder(SvxBorderLine* pLine, W1_BRC10* pBrc)
205 {
206     sal_uInt16 nCode;
207     if(pBrc->dxpLine2WidthGet() == 0)
208     {
209         switch(pBrc->dxpLine1WidthGet())
210         {
211         default: ASSERT(sal_False, "unknown linewidth");
212         case 0: return 0;                           // keine Linie
213         case 1: nCode = DEF_LINE_WIDTH_0; break;
214         case 2: nCode = DEF_LINE_WIDTH_1; break;
215         case 3: nCode = DEF_LINE_WIDTH_2; break;
216         case 4: nCode = DEF_LINE_WIDTH_3; break;
217         case 5: nCode = DEF_LINE_WIDTH_4; break;
218         }
219         pLine->SetOutWidth(nCode);
220         pLine->SetInWidth(0);
221     }
222     else
223     {
224         switch(pBrc->dxpLine1WidthGet())
225         {
226         default: ASSERT(sal_False, "unknown linewidth");
227         case 1: nCode = DEF_DOUBLE_LINE0_IN; break;
228         }
229         pLine->SetOutWidth(nCode);
230         switch(pBrc->dxpLine2WidthGet())
231         {
232         default: ASSERT(sal_False, "unknown linewidth");
233         case 1: nCode = DEF_DOUBLE_LINE0_OUT; break;
234         }
235         pLine->SetInWidth(nCode);
236     }
237     switch(pBrc->dxpLine1WidthGet())
238     {
239     default: ASSERT(sal_False, "unknown space");
240     case 0: nCode = DEF_DOUBLE_LINE0_DIST; break;
241     case 1: nCode = DEF_DOUBLE_LINE1_DIST; break;
242     case 2: nCode = DEF_DOUBLE_LINE2_DIST; break;
243     case 3: nCode = DEF_DOUBLE_LINE3_DIST; break;
244     }
245     pLine->SetDistance(nCode);
246     return pLine;
247 }
248 
Start(Ww1Shell & rOut,sal_uInt8,W1_BRC10 * pBrc,sal_uInt16 nSize,Ww1Manager &,SvxBoxItem & aBox)249 void Ww1SingleSprmPBrc::Start(
250     Ww1Shell& rOut, sal_uInt8,
251     W1_BRC10* pBrc,
252     sal_uInt16
253 #ifdef DBG_UTIL
254     nSize
255 #endif
256     ,
257     Ww1Manager& /*rMan*/,
258     SvxBoxItem& aBox)
259 {
260     ASSERT(sizeof(W1_BRC10) == nSize, "sizemissmatch");
261     if(pBrc->dxpSpaceGet())
262         aBox.SetDistance(10 + 20 * pBrc->dxpSpaceGet());
263             //??? Warum 10+... ????
264 
265     if( rOut.IsInFly() )
266         rOut.SetFlyFrmAttr( aBox );
267     else
268         rOut << aBox;
269 
270     if(pBrc->fShadowGet())
271     {
272         Color aBlack(COL_BLACK); // schwarzer...
273         SvxShadowItem aS(RES_SHADOW,(const Color*)&aBlack, 32,
274                          SVX_SHADOW_BOTTOMRIGHT); // 1.6 tw breit
275         if( rOut.IsInFly() )
276             rOut.SetFlyFrmAttr( aS );
277         else
278             rOut << aS;
279     }
280 }
281 
282 STOP2(Ww1SingleSprmPBrc, RES_BOX, RES_SHADOW)
283 
284 static sal_uInt16 __READONLY_DATA nBrcTrans[BRC_ANZ] =
285      { BOX_LINE_TOP, BOX_LINE_LEFT, BOX_LINE_BOTTOM, BOX_LINE_RIGHT };
286 
Start(Ww1Shell & rOut,sal_uInt8 nId,sal_uInt8 * pSprm,sal_uInt16 nSize,Ww1Manager & rMan)287 void Ww1SingleSprmPBrc10::Start(
288     Ww1Shell& rOut, sal_uInt8 nId, sal_uInt8* pSprm, sal_uInt16 nSize, Ww1Manager& rMan)
289 {
290 
291     W1_BRC10* pBrc =(W1_BRC10*)pSprm;
292     const SfxPoolItem &rItem = ( ( rOut.IsInFly() ) ?
293                      rOut.GetFlyFrmAttr(RES_BOX) :rOut.GetAttr(RES_BOX));
294     const SvxBoxItem &rBoxItem = (const SvxBoxItem&)rItem;
295     SvxBoxItem aBox( rBoxItem );
296 //  rOut >> aBox;
297     SvxBorderLine aLine;
298     aBox.SetLine(SetBorder(&aLine, pBrc), nBrcTrans[nLine] );
299     Ww1SingleSprmPBrc::Start(rOut, nId, pBrc, nSize, rMan, aBox);
300 }
301 
STOP1(Ww1SingleSprmParaSpace,RES_UL_SPACE)302 STOP1(Ww1SingleSprmParaSpace, RES_UL_SPACE)
303 
304 void Ww1SingleSprmPDyaBefore::Start(
305     Ww1Shell& rOut, sal_uInt8 /*nId*/, sal_uInt8* pSprm, sal_uInt16 /*nSize*/, Ww1Manager& /*rMan*/)
306 {
307     short nPara = SVBT16ToShort(pSprm);
308     if(nPara < 0)
309         nPara = -nPara;
310     SvxULSpaceItem aUL((SvxULSpaceItem&)rOut.GetAttr(RES_UL_SPACE));
311     aUL.SetUpper(nPara);
312     rOut << aUL;
313 }
314 
Start(Ww1Shell & rOut,sal_uInt8,sal_uInt8 * pSprm,sal_uInt16,Ww1Manager &)315 void Ww1SingleSprmPDyaAfter::Start(
316     Ww1Shell& rOut, sal_uInt8 /*nId*/, sal_uInt8* pSprm, sal_uInt16 /*nSize*/, Ww1Manager& /*rMan*/)
317 {
318     short nPara = SVBT16ToShort(pSprm);
319     if(nPara < 0)
320         nPara = -nPara;
321     SvxULSpaceItem aUL((SvxULSpaceItem&)rOut.GetAttr(RES_UL_SPACE));
322     aUL.SetLower(nPara);
323     rOut << aUL;
324 }
325 
STOP1(Ww1SingleSprmPDyaLine,RES_PARATR_LINESPACING)326 STOP1(Ww1SingleSprmPDyaLine, RES_PARATR_LINESPACING)
327 
328 void Ww1SingleSprmPDyaLine::Start(
329     Ww1Shell& rOut, sal_uInt8 /*nId*/, sal_uInt8* pSprm, sal_uInt16 /*nSize*/, Ww1Manager& /*rMan*/)
330 {
331     short nSpace = SVBT16ToShort(pSprm);
332     if(nSpace < 0)
333         nSpace = -nSpace;
334     SvxLineSpacingItem aLSpc( LINE_SPACE_DEFAULT_HEIGHT, RES_PARATR_LINESPACING );
335     if(sal_True)
336     {// MultilineSpace(proportional)
337         long n = nSpace * 100 / 240;    // W1: 240 = 100%, SW: 100 = 100%
338         if(n>200)
339             n = 200; // SW_UI-Maximum
340         aLSpc.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
341         aLSpc.SetPropLineSpace((sal_uInt8)n);
342     }
343     else
344     {// Fixed / Minimum
345         aLSpc.SetLineHeight((sal_uInt16)nSpace);
346         aLSpc.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
347     }
348     rOut << aLSpc;
349 }
350 
Start(Ww1Shell & rOut,sal_uInt8,sal_uInt8 * pSprm,sal_uInt16,Ww1Manager &)351 void Ww1SingleSprmPChgTabsPapx::Start(
352     Ww1Shell& rOut, sal_uInt8 /*nId*/, sal_uInt8* pSprm, sal_uInt16 /*nSize*/, Ww1Manager& /*rMan*/)
353 {
354 #if OSL_DEBUG_LEVEL > 1
355 //  rOut << 'T';
356 #endif
357     short nLeftPMgn = 0;    // Koordinaten etwa gleich ??
358 //  ( pAktColl ) ? pCollA[nAktColl].nLeftParaMgn
359 //                                 : nLeftParaMgn;      // Absatz L-Space
360 
361     short i;
362     sal_uInt8 nDel = pSprm[1];
363     sal_uInt8* pDel = pSprm + 2;                        // Del - Array
364     sal_uInt8 nIns = pSprm[nDel*2+2];
365     sal_uInt8* pIns = pSprm + 2*nDel + 3;           // Ins - Array
366     W1_TBD* pTyp = (W1_TBD*)(pSprm + 2*nDel + 2*nIns + 3);// Typ - Array
367 
368     SvxTabStopItem aAttr( (SvxTabStopItem&)rOut.GetNodeOrStyAttr( RES_PARATR_TABSTOP ));
369 
370     SvxTabStop aTabStop;
371 
372     for( i=0; i<nDel; i++ ){
373         sal_uInt16 nPos = aAttr.GetPos( SVBT16ToShort( pDel + i*2 ) - nLeftPMgn );
374         if( nPos != SVX_TAB_NOTFOUND )
375             aAttr.Remove( nPos, 1 );
376     }
377 
378     for( i=0; i<nIns; i++ ){
379         short nPos = SVBT16ToShort( pIns + i*2 ) - nLeftPMgn;
380         if( nPos < 0 )
381             continue;
382         aTabStop.GetTabPos() = nPos;
383         switch( pTyp[i].jcGet() ){
384         case 0: aTabStop.GetAdjustment() = SVX_TAB_ADJUST_LEFT; break;
385         case 1: aTabStop.GetAdjustment() = SVX_TAB_ADJUST_CENTER; break;
386         case 2: aTabStop.GetAdjustment() = SVX_TAB_ADJUST_RIGHT; break;
387         case 3: aTabStop.GetAdjustment() = SVX_TAB_ADJUST_DECIMAL; break;
388         case 4: continue;                   // ignoriere Bar
389         }
390 
391         switch( pTyp[i].tlcGet() ){
392         case 0: aTabStop.GetFill() = ' '; break;
393         case 1: aTabStop.GetFill() = '.'; break;
394         case 2: aTabStop.GetFill() = '-'; break;
395         case 3:
396         case 4: aTabStop.GetFill() = '_'; break;
397         }
398 
399         sal_uInt16 nPos2 = aAttr.GetPos( nPos );
400         if( nPos2 != SVX_TAB_NOTFOUND )
401             aAttr.Remove( nPos2, 1 );       // sonst weigert sich das Insert()
402 
403         aAttr.Insert( aTabStop );
404     }
405     rOut << aAttr;
406 }
407 
STOP1(Ww1SingleSprmPChgTabsPapx,RES_PARATR_TABSTOP)408 STOP1(Ww1SingleSprmPChgTabsPapx, RES_PARATR_TABSTOP)
409 
410 void Ww1SingleSprmSGprfIhdt::Start(
411     Ww1Shell& /*rOut*/, sal_uInt8 /*nId*/, sal_uInt8* pSprm, sal_uInt16 /*nSize*/, Ww1Manager& rMan)
412 {
413     rMan.GetSep().SetGrpfIhdt(SVBT8ToByte(pSprm));
414 }
415 
Start(Ww1Shell & rOut,sal_uInt8,sal_uInt8 * pSprm,sal_uInt16,Ww1Manager &)416 void Ww1SingleSprmSColumns::Start(
417     Ww1Shell& rOut, sal_uInt8 /*nId*/, sal_uInt8* pSprm, sal_uInt16 /*nSize*/, Ww1Manager& /*rMan*/)
418 {
419     short nColSpace = 708; // default 1,25 cm
420     short nNettoWidth = -1; //~ mdt: dxaLeft/Right missing...
421     short nCols = SVBT16ToShort(pSprm);
422     nCols++;
423     if (nCols < 2)
424         return;
425     SwFmtCol aCol;
426     aCol.Init(nCols, nColSpace, nNettoWidth);
427     rOut.GetPageDesc().GetMaster().SetFmtAttr(aCol);
428 }
429 
Start(Ww1Shell &,sal_uInt8,sal_uInt8 *,sal_uInt16,Ww1Manager & rMan)430 void Ww1SingleSprmPTtp::Start(
431     Ww1Shell& /*rOut*/, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager& rMan)
432 {
433     rMan.SetInTtp( sal_True );      // Besonderheit: wird bei InTable::Stop und
434                                 // nicht bei InTtp::Stop zurueckgesetzt,
435                                 // da Auswertung in InTable
436 }
437 
Stop(Ww1Shell & rOut,sal_uInt8,sal_uInt8 *,sal_uInt16,Ww1Manager & rMan)438 void Ww1SingleSprmPTtp::Stop(
439     Ww1Shell& rOut, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager& rMan)
440 {
441     if (rOut.IsInTable() && rMan.HasInTable())
442         rOut.NextTableRow();
443 }
444 
Start(Ww1Shell &,sal_uInt8,sal_uInt8 *,sal_uInt16,Ww1Manager &)445 void Ww1SingleSprmPFInTable::Start(
446     Ww1Shell& /*rOut*/, sal_uInt8, sal_uInt8*, sal_uInt16,
447     Ww1Manager& /*rMan*/)
448 {
449 }
450 
Stop(Ww1Shell & rOut,sal_uInt8,sal_uInt8 *,sal_uInt16,Ww1Manager & rMan)451 void Ww1SingleSprmPFInTable::Stop(
452     Ww1Shell&
453 #ifdef DBG_UTIL
454     rOut
455 #endif
456     ,
457     sal_uInt8, sal_uInt8*, sal_uInt16,
458     Ww1Manager& rMan)
459 {
460     ASSERT(rOut.IsInTable(), "");
461     rMan.SetInTtp( sal_False );
462 }
463 
Start(Ww1Shell & rOut,sal_uInt8,sal_uInt8 * pSprm,sal_uInt16,Ww1Manager &)464 void Ww1SingleSprmTDxaGapHalf::Start(
465     Ww1Shell& rOut, sal_uInt8 /*nId*/, sal_uInt8* pSprm, sal_uInt16 /*nSize*/, Ww1Manager& /*rMan*/)
466 {
467     short nSpace = SVBT16ToShort(pSprm);
468     rOut.SetCellSpace(nSpace);
469 }
470 
Start(Ww1Shell & rOut,sal_uInt8,sal_uInt8 * pSprm,sal_uInt16 nSize,Ww1Manager &)471 void Ww1SingleSprmTDefTable10::Start(
472     Ww1Shell& rOut, sal_uInt8 /*nId*/, sal_uInt8* pSprm, sal_uInt16 nSize, Ww1Manager& /*rMan*/)
473 {
474     sal_uInt16 i;
475     sal_uInt8 *p = pSprm + 2;   // LaengenWord ueberlesen
476     sal_uInt8 nCount = *p;
477     p++;
478     nSize -= 3;
479 // Es fehlt noch:
480 // - GapHalf
481 // - eventuelle Ausduennung der Zellenumrandungen
482 
483     if( nCount < 1 || nCount > 32 || nSize < ( nCount + 1 ) * 2  )
484         return;
485 
486 // Erstmal die Zellenpositionen einlesen
487     short nPos = SVBT16ToShort( p );    // signed, kann auch neg. sein !!!
488 
489 //  if( !rOut.IsTableWidthSet() ){      // Muss Tabellenbreite und -Ausrichtung
490                                         // noch gesetzt werden ?
491     {
492         short nWholeWidth = SVBT16ToShort( p + 2 * nCount ) - nPos;
493         rOut.SetTableWidth( (sal_uInt16)nWholeWidth );  // Tabellenbreite setzen
494 
495 // Pos der Tabelle setzen
496         long nMidTab = nPos + nWholeWidth / 2;      // TabellenMitte
497         const SwFrmFmt &rFmt = rOut.GetPageDesc().GetMaster();
498         const SvxLRSpaceItem& rLR = rFmt.GetLRSpace();
499         long nRight = rFmt.GetFrmSize().GetWidth()
500                       - rLR.GetLeft() - rLR.GetRight();
501 
502         sal_Int16 eOri = text::HoriOrientation::LEFT;
503         if( nPos > MINLAY ){                        // per Zuppeln positioniert
504             if ( nMidTab <= nRight / 3 )            // 1/3 der Seite
505                 eOri = text::HoriOrientation::LEFT;
506             else if ( nMidTab <= 2 * nRight / 3 )   // 2/3 der Seite
507                 eOri = text::HoriOrientation::CENTER;
508             else
509                 eOri = text::HoriOrientation::RIGHT;
510         }
511         rOut.SetTableOrient( eOri );
512     }
513 
514     sal_uInt8* pEndPos = p+2;
515     sal_uInt8* pTc0 = ( nSize >= nCount * 10 ) ? pEndPos + 2 * nCount : 0;
516     sal_uInt16 nCellsDeleted = 0;       // fuer gemergte Zellen
517 
518     for( i = 0; i < nCount; i++ ){
519 // Info sammeln
520         W1_TC* pTc = (W1_TC*)pTc0;
521         sal_Bool bMerged = (pTc) ? pTc->fMergedGet() : sal_False;
522 
523 // Zellenbreiten setzen
524         sal_uInt16 nPos1 = SVBT16ToShort( pEndPos );
525         if( !bMerged )
526             rOut.SetCellWidth( nPos1 - nPos, i - nCellsDeleted );
527                                         // Zellenbreite setzen
528                                         // Wechselwirkung mit GapHalf fehlt noch
529                                         // ( GapHalf wird noch ignoriert )
530         pEndPos+=2;
531         nPos = nPos1;
532 
533         if( pTc0 ){                     // gibts TCs ueberhaupt ?
534             W1_TC* pTc2 = (W1_TC*)pTc0;
535             sal_Bool bMerged2 = pTc2->fMergedGet();
536 //          ASSERT( !bMerged2, "Gemergte Tabellenzellen noch nicht vollstaendig implementiert" );
537             if( !bMerged2 ){
538 // und nun die Umrandungen
539                 SvxBoxItem aBox( (SvxBoxItem&)rOut.GetCellAttr( RES_BOX ));
540                 SvxBorderLine aLine;
541                 W1_BRC10* pBrc = pTc2->rgbrcGet();
542                 for( sal_uInt16 j=0; j<4; j++ ){
543                     aBox.SetLine(Ww1SingleSprmPBrc::SetBorder(&aLine, pBrc),
544                                  nBrcTrans[j]);
545                     pBrc++;
546                 }
547                 rOut.SetCellBorder( aBox, i - nCellsDeleted );
548             }else{
549 // gemergte Zellen entfernen
550                 rOut.DeleteCell( i - nCellsDeleted );
551                 nCellsDeleted++;
552             }
553             pTc0+=sizeof(W1_TC);    // 10
554         }
555     }
556 }
557 
558 
Start(Ww1Shell & rOut,sal_uInt8,sal_uInt8 * pSprm,sal_uInt16,Ww1Manager &)559 void Ww1SingleSprmTDyaRowHeight::Start(
560     Ww1Shell& rOut, sal_uInt8 /*nId*/, sal_uInt8* pSprm, sal_uInt16 /*nSize*/, Ww1Manager& /*rMan*/)
561 {
562     short nSpace = SVBT16ToShort(pSprm);
563     rOut.SetCellHeight(nSpace);
564 }
565 
566 // Fastsave-Attribute brauche ich als Dymmys nicht
567 
Start(Ww1Shell & rOut,sal_uInt8,sal_uInt8 * pSprm,sal_uInt16,Ww1Manager & rMan)568 void Ww1SingleSprmPpc::Start(
569     Ww1Shell& rOut, sal_uInt8 /*nId*/, sal_uInt8* pSprm, sal_uInt16 /*nSize*/, Ww1Manager& rMan)
570 {
571     sal_uInt8 nPpc = SVBT8ToByte(pSprm);
572 
573     if (rOut.IsInTable())                       // Flys in Tabellen kann PMW
574         return;                                 // nicht
575 
576     RndStdIds eAnchor;          // Bindung
577     sal_Int16 eHRel;        // Seite oder Seitenrand
578     sal_Int16 eVRel;        // Seite oder Seitenrand
579 
580     switch ( ( nPpc & 0x30 ) >> 4 ){        // Y - Bindung bestimmt Sw-Bindung
581     case 0: eAnchor = FLY_AT_PARA;          // Vert Margin
582             eVRel = text::RelOrientation::PRINT_AREA;
583 //          if( nYPos < 0 )
584 //              nYPos = 0;                  // koennen wir nicht
585             break;
586 /*  case 1:*/                               // Vert. Seite
587     default:eAnchor = FLY_AT_PAGE;          // Vert Page oder unknown
588             eVRel = text::RelOrientation::FRAME;
589             break;                          // 2=Vert. Paragraph, 3=Use Default
590     }
591 
592     switch ( ( nPpc & 0xc0 ) >> 6 ){        // X - Bindung -> Koordinatentransformation
593     case 0:                                 // Hor. Spalte
594     case 1:                                 // Hor. Absatz
595             eHRel = text::RelOrientation::PRINT_AREA;
596 //          nXPos += nPgLeft;               // in Seiten-Koordinaten umrechnen
597             break;
598 /*  case 2:*/                               // Hor. Seite
599     default:
600             eHRel = text::RelOrientation::FRAME;
601             break;
602     }
603 
604     if( !rOut.IsInFly() && rMan.IsInStyle() ){
605         rOut.BeginFly( eAnchor );           // Starte StyleFly
606     }else{
607         rOut.SetFlyAnchor( eAnchor );       // Setze Anker
608     }
609 }
610 
Start(Ww1Shell & rOut,sal_uInt8,sal_uInt8 * pSprm,sal_uInt16,Ww1Manager & rMan)611 void Ww1SingleSprmPDxaAbs::Start(
612     Ww1Shell& rOut, sal_uInt8 /*nId*/, sal_uInt8* pSprm, sal_uInt16 /*nSize*/, Ww1Manager& rMan)
613 {
614     short nXPos = SVBT16ToShort(pSprm);
615 
616     if( rMan.IsInStyle() && !rOut.IsInFly() ){
617         rOut.BeginFly();                    // Fly ohne PPc-Attribut
618     }
619 
620     sal_Int16 eHRel = text::RelOrientation::FRAME;
621     sal_Int16 eHAlign = text::HoriOrientation::NONE;
622 
623     switch( nXPos ){                        // besondere X-Positionen ?
624     case 0:
625     case -12: eHAlign = text::HoriOrientation::NONE; nXPos = 0; break;   // Mogel: innen -> links
626                             // eigentich text::HoriOrientation::LEFT, aber dann verrueckt
627                             // ein Abstand nach aussen den Fly
628     case -4:  eHAlign = text::HoriOrientation::CENTER; nXPos = 0; break; // zentriert
629     case -8:                                           // rechts
630     case -16: eHAlign = text::HoriOrientation::RIGHT; nXPos = 0; break;  // Mogel: aussen -> rechts
631 //  default:  nXPos += (short)nIniFlyDx; break; // Korrekturen per Ini-Datei
632     }
633     rOut.SetFlyXPos( nXPos, eHRel, eHAlign );
634 }
635 
Start(Ww1Shell & rOut,sal_uInt8,sal_uInt8 * pSprm,sal_uInt16,Ww1Manager &)636 void Ww1SingleSprmPDyaAbs::Start(
637     Ww1Shell& rOut, sal_uInt8 /*nId*/, sal_uInt8* pSprm, sal_uInt16 /*nSize*/, Ww1Manager& /*rMan*/)
638 {
639     short nYPos = SVBT16ToShort(pSprm);
640     sal_Int16 eVRel = text::RelOrientation::FRAME;
641     sal_Int16 eVAlign = text::VertOrientation::NONE;
642 
643     switch( nYPos ){                            // besondere Y-Positionen ?
644     case -4:  eVAlign = text::VertOrientation::TOP; nYPos = 0; break; // oben
645     case -8:  eVAlign = text::VertOrientation::CENTER; nYPos = 0; break;  // zentriert
646     case -12: eVAlign = text::VertOrientation::BOTTOM; nYPos = 0; break;  // unten
647 //  default:  nYPos += (short)nIniFlyDy; break; // Korrekturen per Ini-Datei
648     }
649     rOut.SetFlyYPos( nYPos, eVRel, eVAlign );
650 }
651 
Start(Ww1Shell & rOut,sal_uInt8,sal_uInt8 * pSprm,sal_uInt16,Ww1Manager &)652 void Ww1SingleSprmPDxaWidth::Start(
653     Ww1Shell& rOut, sal_uInt8 /*nId*/, sal_uInt8* pSprm, sal_uInt16 /*nSize*/, Ww1Manager& /*rMan*/)
654 {
655     short nDxaWidth = SVBT16ToShort(pSprm);
656     rOut.SetFlyFrmAttr( SwFmtFrmSize( ATT_VAR_SIZE, nDxaWidth, MINFLY ) );
657 }
658 
Start(Ww1Shell & rOut,sal_uInt8,sal_uInt8 * pSprm,sal_uInt16,Ww1Manager &)659 void Ww1SingleSprmPFromText::Start(
660     Ww1Shell& rOut, sal_uInt8 /*nId*/, sal_uInt8* pSprm, sal_uInt16 /*nSize*/, Ww1Manager& /*rMan*/)
661 {
662     if( rOut.IsInFly() ){   // Kommt auch ausserhalb eines Flys vor, hat
663                             // dann aber offensichtlich nichts zu bedeuten.
664                             // Einen impliziten Fly-Anfang bedeutet es
665                             // definitiv nicht
666         short nFromText = SVBT16ToShort(pSprm);
667 
668         SvxLRSpaceItem aLR( RES_LR_SPACE );
669         aLR.SetTxtLeft( nFromText );
670         aLR.SetRight( nFromText );
671         rOut.SetFlyFrmAttr( aLR );
672 
673         rOut.SetFlyFrmAttr( SvxULSpaceItem( nFromText, nFromText, RES_UL_SPACE ) );
674     }
675 }
676 
677 #undef STOP1
678 #undef STOP2
679 
680 
681