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