xref: /aoo4110/main/sw/source/core/text/atrstck.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sw.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include <errhdl.hxx>   // ASSERT
29*b1cdbd2cSJim Jagielski #include <atrhndl.hxx>
30*b1cdbd2cSJim Jagielski #include <svl/itemiter.hxx>
31*b1cdbd2cSJim Jagielski #include <vcl/outdev.hxx>
32*b1cdbd2cSJim Jagielski #include <editeng/cmapitem.hxx>
33*b1cdbd2cSJim Jagielski #include <editeng/colritem.hxx>
34*b1cdbd2cSJim Jagielski #include <editeng/cntritem.hxx>
35*b1cdbd2cSJim Jagielski #include <editeng/crsditem.hxx>
36*b1cdbd2cSJim Jagielski #include <editeng/escpitem.hxx>
37*b1cdbd2cSJim Jagielski #include <editeng/fontitem.hxx>
38*b1cdbd2cSJim Jagielski #include <editeng/fhgtitem.hxx>
39*b1cdbd2cSJim Jagielski #include <editeng/kernitem.hxx>
40*b1cdbd2cSJim Jagielski #include <editeng/charreliefitem.hxx>
41*b1cdbd2cSJim Jagielski #include <editeng/langitem.hxx>
42*b1cdbd2cSJim Jagielski #include <editeng/postitem.hxx>
43*b1cdbd2cSJim Jagielski #include <editeng/shdditem.hxx>
44*b1cdbd2cSJim Jagielski #include <editeng/udlnitem.hxx>
45*b1cdbd2cSJim Jagielski #include <editeng/wghtitem.hxx>
46*b1cdbd2cSJim Jagielski #include <editeng/wrlmitem.hxx>
47*b1cdbd2cSJim Jagielski #include <editeng/akrnitem.hxx>
48*b1cdbd2cSJim Jagielski #include <editeng/blnkitem.hxx>
49*b1cdbd2cSJim Jagielski #include <editeng/charrotateitem.hxx>
50*b1cdbd2cSJim Jagielski #include <editeng/emphitem.hxx>
51*b1cdbd2cSJim Jagielski #include <editeng/charscaleitem.hxx>
52*b1cdbd2cSJim Jagielski #include <editeng/twolinesitem.hxx>
53*b1cdbd2cSJim Jagielski #include <editeng/charhiddenitem.hxx>
54*b1cdbd2cSJim Jagielski #include <viewopt.hxx>
55*b1cdbd2cSJim Jagielski #include <charfmt.hxx>
56*b1cdbd2cSJim Jagielski #include <fchrfmt.hxx>
57*b1cdbd2cSJim Jagielski #include <fmtautofmt.hxx>
58*b1cdbd2cSJim Jagielski #include <editeng/brshitem.hxx>
59*b1cdbd2cSJim Jagielski #include <fmtinfmt.hxx>
60*b1cdbd2cSJim Jagielski #include <txtinet.hxx>
61*b1cdbd2cSJim Jagielski #include <IDocumentSettingAccess.hxx>
62*b1cdbd2cSJim Jagielski #include <viewsh.hxx>   // ViewShell
63*b1cdbd2cSJim Jagielski #include <viewopt.hxx>  // SwViewOptions
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski #define STACK_INCREMENT 4
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski /*************************************************************************
68*b1cdbd2cSJim Jagielski  *                      Attribute to Stack Mapping
69*b1cdbd2cSJim Jagielski  *
70*b1cdbd2cSJim Jagielski  * Attributes applied to a text are pushed on different stacks. For each
71*b1cdbd2cSJim Jagielski  * stack, the top most attribute on the stack is valid. Because some
72*b1cdbd2cSJim Jagielski  * kinds of attributes have to be pushed to the same stacks we map their
73*b1cdbd2cSJim Jagielski  * ids to stack ids
74*b1cdbd2cSJim Jagielski  * Attention: The first NUM_DEFAULT_VALUES ( defined in swfntcch.hxx == 35 )
75*b1cdbd2cSJim Jagielski  * are stored in the defaultitem-cache, if you add one, you have to increase
76*b1cdbd2cSJim Jagielski  * NUM_DEFAULT_VALUES.
77*b1cdbd2cSJim Jagielski  * Also adjust NUM_ATTRIBUTE_STACKS in atrhndl.hxx.
78*b1cdbd2cSJim Jagielski  *************************************************************************/
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski const sal_uInt8 StackPos[ static_cast<sal_uInt16>(RES_TXTATR_WITHEND_END) -
81*b1cdbd2cSJim Jagielski                      static_cast<sal_uInt16>(RES_CHRATR_BEGIN) + 1 ] =
82*b1cdbd2cSJim Jagielski {
83*b1cdbd2cSJim Jagielski      0, //                                       //  0
84*b1cdbd2cSJim Jagielski      1, // RES_CHRATR_CASEMAP = RES_CHRATR_BEGIN //  1
85*b1cdbd2cSJim Jagielski      0, // RES_CHRATR_CHARSETCOLOR,              //  2
86*b1cdbd2cSJim Jagielski      2, // RES_CHRATR_COLOR,                     //  3
87*b1cdbd2cSJim Jagielski      3, // RES_CHRATR_CONTOUR,                   //  4
88*b1cdbd2cSJim Jagielski      4, // RES_CHRATR_CROSSEDOUT,                //  5
89*b1cdbd2cSJim Jagielski      5, // RES_CHRATR_ESCAPEMENT,                //  6
90*b1cdbd2cSJim Jagielski      6, // RES_CHRATR_FONT,                      //  7
91*b1cdbd2cSJim Jagielski      7, // RES_CHRATR_FONTSIZE,                  //  8
92*b1cdbd2cSJim Jagielski      8, // RES_CHRATR_KERNING,                   //  9
93*b1cdbd2cSJim Jagielski      9, // RES_CHRATR_LANGUAGE,                  // 10
94*b1cdbd2cSJim Jagielski     10, // RES_CHRATR_POSTURE,                   // 11
95*b1cdbd2cSJim Jagielski      0, // RES_CHRATR_PROPORTIONALFONTSIZE,      // 12
96*b1cdbd2cSJim Jagielski     11, // RES_CHRATR_SHADOWED,                  // 13
97*b1cdbd2cSJim Jagielski     12, // RES_CHRATR_UNDERLINE,                 // 14
98*b1cdbd2cSJim Jagielski     13, // RES_CHRATR_WEIGHT,                    // 15
99*b1cdbd2cSJim Jagielski     14, // RES_CHRATR_WORDLINEMODE,              // 16
100*b1cdbd2cSJim Jagielski     15, // RES_CHRATR_AUTOKERN,                  // 17
101*b1cdbd2cSJim Jagielski     16, // RES_CHRATR_BLINK,                     // 18
102*b1cdbd2cSJim Jagielski     17, // RES_CHRATR_NOHYPHEN,                  // 19
103*b1cdbd2cSJim Jagielski      0, // RES_CHRATR_NOLINEBREAK,               // 20
104*b1cdbd2cSJim Jagielski     18, // RES_CHRATR_BACKGROUND,                // 21
105*b1cdbd2cSJim Jagielski     19, // RES_CHRATR_CJK_FONT,                  // 22
106*b1cdbd2cSJim Jagielski     20, // RES_CHRATR_CJK_FONTSIZE,              // 23
107*b1cdbd2cSJim Jagielski     21, // RES_CHRATR_CJK_LANGUAGE,              // 24
108*b1cdbd2cSJim Jagielski     22, // RES_CHRATR_CJK_POSTURE,               // 25
109*b1cdbd2cSJim Jagielski     23, // RES_CHRATR_CJK_WEIGHT,                // 26
110*b1cdbd2cSJim Jagielski     24, // RES_CHRATR_CTL_FONT,                  // 27
111*b1cdbd2cSJim Jagielski     25, // RES_CHRATR_CTL_FONTSIZE,              // 28
112*b1cdbd2cSJim Jagielski     26, // RES_CHRATR_CTL_LANGUAGE,              // 29
113*b1cdbd2cSJim Jagielski     27, // RES_CHRATR_CTL_POSTURE,               // 30
114*b1cdbd2cSJim Jagielski     28, // RES_CHRATR_CTL_WEIGHT,                // 31
115*b1cdbd2cSJim Jagielski     29, // RES_CHRATR_ROTATE,                    // 32
116*b1cdbd2cSJim Jagielski     30, // RES_CHRATR_EMPHASIS_MARK,             // 33
117*b1cdbd2cSJim Jagielski     31, // RES_CHRATR_TWO_LINES,                 // 34
118*b1cdbd2cSJim Jagielski     32, // RES_CHRATR_SCALEW,                    // 35
119*b1cdbd2cSJim Jagielski     33, // RES_CHRATR_RELIEF,                    // 36
120*b1cdbd2cSJim Jagielski     34, // RES_CHRATR_HIDDEN,                    // 37
121*b1cdbd2cSJim Jagielski     35, // RES_CHRATR_OVERLINE,                  // 38
122*b1cdbd2cSJim Jagielski      0, // RES_CHRATR_DUMMY1,                    // 39
123*b1cdbd2cSJim Jagielski      0, // RES_CHRATR_DUMMY2,                    // 40
124*b1cdbd2cSJim Jagielski 	 0, // RES_CHRATR_BIDIRTL                    // 41
125*b1cdbd2cSJim Jagielski 	 0, // RES_CHRATR_IDCTHINT                   // 42
126*b1cdbd2cSJim Jagielski     36, // RES_TXTATR_REFMARK,                   // 43
127*b1cdbd2cSJim Jagielski     37, // RES_TXTATR_TOXMARK,                   // 44
128*b1cdbd2cSJim Jagielski     38, // RES_TXTATR_META,                      // 45
129*b1cdbd2cSJim Jagielski     38, // RES_TXTATR_METAFIELD,                 // 46
130*b1cdbd2cSJim Jagielski      0, // RES_TXTATR_AUTOFMT,                   // 47
131*b1cdbd2cSJim Jagielski      0, // RES_TXTATR_INETFMT                    // 48
132*b1cdbd2cSJim Jagielski      0, // RES_TXTATR_CHARFMT,                   // 49
133*b1cdbd2cSJim Jagielski     39, // RES_TXTATR_CJK_RUBY,                  // 50
134*b1cdbd2cSJim Jagielski      0, // RES_TXTATR_UNKNOWN_CONTAINER,         // 51
135*b1cdbd2cSJim Jagielski     40, // RES_TXTATR_INPUTFIELD                 // 52
136*b1cdbd2cSJim Jagielski };
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski /*************************************************************************
139*b1cdbd2cSJim Jagielski  *                      CharFmt::GetItem
140*b1cdbd2cSJim Jagielski  * returns the item set associated with an character/inet/auto style
141*b1cdbd2cSJim Jagielski  *************************************************************************/
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski namespace CharFmt
144*b1cdbd2cSJim Jagielski {
145*b1cdbd2cSJim Jagielski 
GetItemSet(const SfxPoolItem & rAttr)146*b1cdbd2cSJim Jagielski const SfxItemSet* GetItemSet( const SfxPoolItem& rAttr )
147*b1cdbd2cSJim Jagielski {
148*b1cdbd2cSJim Jagielski     const SfxItemSet* pSet = 0;
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski     if ( RES_TXTATR_AUTOFMT == rAttr.Which() )
151*b1cdbd2cSJim Jagielski     {
152*b1cdbd2cSJim Jagielski         pSet = static_cast<const SwFmtAutoFmt&>(rAttr).GetStyleHandle().get();
153*b1cdbd2cSJim Jagielski     }
154*b1cdbd2cSJim Jagielski     else
155*b1cdbd2cSJim Jagielski     {
156*b1cdbd2cSJim Jagielski         // aus der Vorlage die Attribute holen:
157*b1cdbd2cSJim Jagielski         SwCharFmt* pFmt = RES_TXTATR_INETFMT == rAttr.Which() ?
158*b1cdbd2cSJim Jagielski                         ((SwFmtINetFmt&)rAttr).GetTxtINetFmt()->GetCharFmt() :
159*b1cdbd2cSJim Jagielski                         ((SwFmtCharFmt&)rAttr).GetCharFmt();
160*b1cdbd2cSJim Jagielski         if( pFmt )
161*b1cdbd2cSJim Jagielski         {
162*b1cdbd2cSJim Jagielski             pSet = &pFmt->GetAttrSet();
163*b1cdbd2cSJim Jagielski         }
164*b1cdbd2cSJim Jagielski     }
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski     return pSet;
167*b1cdbd2cSJim Jagielski }
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski /*************************************************************************
170*b1cdbd2cSJim Jagielski  *                      CharFmt::GetItem
171*b1cdbd2cSJim Jagielski  * extracts pool item of type nWhich from rAttr
172*b1cdbd2cSJim Jagielski  *************************************************************************/
173*b1cdbd2cSJim Jagielski 
GetItem(const SwTxtAttr & rAttr,sal_uInt16 nWhich)174*b1cdbd2cSJim Jagielski const SfxPoolItem* GetItem( const SwTxtAttr& rAttr, sal_uInt16 nWhich )
175*b1cdbd2cSJim Jagielski {
176*b1cdbd2cSJim Jagielski     if ( RES_TXTATR_INETFMT == rAttr.Which() ||
177*b1cdbd2cSJim Jagielski          RES_TXTATR_CHARFMT == rAttr.Which() ||
178*b1cdbd2cSJim Jagielski          RES_TXTATR_AUTOFMT == rAttr.Which() )
179*b1cdbd2cSJim Jagielski     {
180*b1cdbd2cSJim Jagielski         const SfxItemSet* pSet = CharFmt::GetItemSet( rAttr.GetAttr() );
181*b1cdbd2cSJim Jagielski         if ( !pSet ) return 0;
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski        bool bInParent = RES_TXTATR_AUTOFMT != rAttr.Which();
184*b1cdbd2cSJim Jagielski        const SfxPoolItem* pItem;
185*b1cdbd2cSJim Jagielski        sal_Bool bRet = SFX_ITEM_SET == pSet->GetItemState( nWhich, bInParent, &pItem );
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski        return bRet ? pItem : 0;
188*b1cdbd2cSJim Jagielski     }
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski     return ( nWhich == rAttr.Which() ) ? &rAttr.GetAttr() : 0;
191*b1cdbd2cSJim Jagielski }
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski /*************************************************************************
194*b1cdbd2cSJim Jagielski  *                      CharFmt::IsItemIncluded
195*b1cdbd2cSJim Jagielski  * checks if item is included in character/inet/auto style
196*b1cdbd2cSJim Jagielski  *************************************************************************/
197*b1cdbd2cSJim Jagielski 
IsItemIncluded(const sal_uInt16 nWhich,const SwTxtAttr * pAttr)198*b1cdbd2cSJim Jagielski sal_Bool IsItemIncluded( const sal_uInt16 nWhich, const SwTxtAttr *pAttr )
199*b1cdbd2cSJim Jagielski {
200*b1cdbd2cSJim Jagielski     sal_Bool bRet = sal_False;
201*b1cdbd2cSJim Jagielski 
202*b1cdbd2cSJim Jagielski     const SfxItemSet* pItemSet = CharFmt::GetItemSet( pAttr->GetAttr() );
203*b1cdbd2cSJim Jagielski     if ( pItemSet )
204*b1cdbd2cSJim Jagielski         bRet = SFX_ITEM_SET == pItemSet->GetItemState( nWhich, sal_True );
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski     return bRet;
207*b1cdbd2cSJim Jagielski }
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski }
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski /*************************************************************************
212*b1cdbd2cSJim Jagielski  *                      lcl_ChgHyperLinkColor
213*b1cdbd2cSJim Jagielski  * The color of hyperlinks is taken from the associated character attribute,
214*b1cdbd2cSJim Jagielski  * depending on its 'visited' state. There are actually two cases, which
215*b1cdbd2cSJim Jagielski  * should override the colors from the character attribute:
216*b1cdbd2cSJim Jagielski  * 1. We never take the 'visited' color during printing/pdf export/preview
217*b1cdbd2cSJim Jagielski  * 2. The user has choosen to override these colors in the view options
218*b1cdbd2cSJim Jagielski  *************************************************************************/
219*b1cdbd2cSJim Jagielski 
lcl_ChgHyperLinkColor(const SwTxtAttr & rAttr,const SfxPoolItem & rItem,const ViewShell * pShell,Color * pColor)220*b1cdbd2cSJim Jagielski bool lcl_ChgHyperLinkColor( const SwTxtAttr& rAttr,
221*b1cdbd2cSJim Jagielski                             const SfxPoolItem& rItem,
222*b1cdbd2cSJim Jagielski                             const ViewShell* pShell,
223*b1cdbd2cSJim Jagielski                             Color* pColor )
224*b1cdbd2cSJim Jagielski {
225*b1cdbd2cSJim Jagielski     if ( !pShell ||
226*b1cdbd2cSJim Jagielski          RES_TXTATR_INETFMT != rAttr.Which() ||
227*b1cdbd2cSJim Jagielski          RES_CHRATR_COLOR != rItem.Which() )
228*b1cdbd2cSJim Jagielski         return false;
229*b1cdbd2cSJim Jagielski 
230*b1cdbd2cSJim Jagielski     // --> FME 2004-09-13 #i15455#
231*b1cdbd2cSJim Jagielski     // 1. case:
232*b1cdbd2cSJim Jagielski     // We do not want to show visited links:
233*b1cdbd2cSJim Jagielski     // (printing, pdf export, page preview)
234*b1cdbd2cSJim Jagielski     //
235*b1cdbd2cSJim Jagielski     if ( pShell->GetOut()->GetOutDevType() == OUTDEV_PRINTER ||
236*b1cdbd2cSJim Jagielski          pShell->GetViewOptions()->IsPDFExport() ||
237*b1cdbd2cSJim Jagielski          pShell->GetViewOptions()->IsPagePreview() )
238*b1cdbd2cSJim Jagielski     {
239*b1cdbd2cSJim Jagielski         if ( ((SwTxtINetFmt&)rAttr).IsVisited() )
240*b1cdbd2cSJim Jagielski         {
241*b1cdbd2cSJim Jagielski             if ( pColor )
242*b1cdbd2cSJim Jagielski             {
243*b1cdbd2cSJim Jagielski                 // take color from character format 'unvisited link'
244*b1cdbd2cSJim Jagielski                 SwTxtINetFmt& rInetAttr( const_cast<SwTxtINetFmt&>(
245*b1cdbd2cSJim Jagielski                     static_cast<const SwTxtINetFmt&>(rAttr)) );
246*b1cdbd2cSJim Jagielski                 rInetAttr.SetVisited( false );
247*b1cdbd2cSJim Jagielski                 const SwCharFmt* pTmpFmt = ((SwTxtINetFmt&)rAttr).GetCharFmt();
248*b1cdbd2cSJim Jagielski                 const SfxPoolItem* pItem;
249*b1cdbd2cSJim Jagielski                 pTmpFmt->GetItemState( RES_CHRATR_COLOR, sal_True, &pItem );
250*b1cdbd2cSJim Jagielski                 *pColor = ((SvxColorItem*)pItem)->GetValue();
251*b1cdbd2cSJim Jagielski                 rInetAttr.SetVisited( true );
252*b1cdbd2cSJim Jagielski             }
253*b1cdbd2cSJim Jagielski             return true;
254*b1cdbd2cSJim Jagielski         }
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski         return false;
257*b1cdbd2cSJim Jagielski     }
258*b1cdbd2cSJim Jagielski     // <--
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski     //
261*b1cdbd2cSJim Jagielski     // 2. case:
262*b1cdbd2cSJim Jagielski     // We do not want to apply the color set in the hyperlink
263*b1cdbd2cSJim Jagielski     // attribute, instead we take the colors from the view options:
264*b1cdbd2cSJim Jagielski     //
265*b1cdbd2cSJim Jagielski     if ( pShell->GetWin() &&
266*b1cdbd2cSJim Jagielski         (
267*b1cdbd2cSJim Jagielski           (((SwTxtINetFmt&)rAttr).IsVisited() && SwViewOption::IsVisitedLinks()) ||
268*b1cdbd2cSJim Jagielski           (!((SwTxtINetFmt&)rAttr).IsVisited() && SwViewOption::IsLinks())
269*b1cdbd2cSJim Jagielski         )
270*b1cdbd2cSJim Jagielski        )
271*b1cdbd2cSJim Jagielski     {
272*b1cdbd2cSJim Jagielski         if ( pColor )
273*b1cdbd2cSJim Jagielski         {
274*b1cdbd2cSJim Jagielski             if ( ((SwTxtINetFmt&)rAttr).IsVisited() )
275*b1cdbd2cSJim Jagielski             {
276*b1cdbd2cSJim Jagielski                 // take color from view option 'visited link color'
277*b1cdbd2cSJim Jagielski                 *pColor = SwViewOption::GetVisitedLinksColor();
278*b1cdbd2cSJim Jagielski             }
279*b1cdbd2cSJim Jagielski             else
280*b1cdbd2cSJim Jagielski             {
281*b1cdbd2cSJim Jagielski                 // take color from view option 'unvisited link color'
282*b1cdbd2cSJim Jagielski                 *pColor = SwViewOption::GetLinksColor();
283*b1cdbd2cSJim Jagielski             }
284*b1cdbd2cSJim Jagielski         }
285*b1cdbd2cSJim Jagielski         return true;
286*b1cdbd2cSJim Jagielski     }
287*b1cdbd2cSJim Jagielski 
288*b1cdbd2cSJim Jagielski     return false;
289*b1cdbd2cSJim Jagielski }
290*b1cdbd2cSJim Jagielski 
291*b1cdbd2cSJim Jagielski /*************************************************************************
292*b1cdbd2cSJim Jagielski  *                      SwAttrHandler::SwAttrStack::SwAttrStack()
293*b1cdbd2cSJim Jagielski  *************************************************************************/
294*b1cdbd2cSJim Jagielski 
SwAttrStack()295*b1cdbd2cSJim Jagielski inline SwAttrHandler::SwAttrStack::SwAttrStack()
296*b1cdbd2cSJim Jagielski     : nCount( 0 ), nSize( INITIAL_NUM_ATTR )
297*b1cdbd2cSJim Jagielski {
298*b1cdbd2cSJim Jagielski     pArray = pInitialArray;
299*b1cdbd2cSJim Jagielski }
300*b1cdbd2cSJim Jagielski 
301*b1cdbd2cSJim Jagielski /*************************************************************************
302*b1cdbd2cSJim Jagielski  *                      SwAttrHandler::SwAttrStack::Insert()
303*b1cdbd2cSJim Jagielski  *************************************************************************/
304*b1cdbd2cSJim Jagielski 
Insert(const SwTxtAttr & rAttr,const sal_uInt16 nPos)305*b1cdbd2cSJim Jagielski void SwAttrHandler::SwAttrStack::Insert( const SwTxtAttr& rAttr, const sal_uInt16 nPos )
306*b1cdbd2cSJim Jagielski {
307*b1cdbd2cSJim Jagielski     // do we still have enough space?
308*b1cdbd2cSJim Jagielski     if ( nCount >= nSize )
309*b1cdbd2cSJim Jagielski     {
310*b1cdbd2cSJim Jagielski          // we are still in our initial array
311*b1cdbd2cSJim Jagielski         if ( INITIAL_NUM_ATTR == nSize )
312*b1cdbd2cSJim Jagielski         {
313*b1cdbd2cSJim Jagielski             nSize += STACK_INCREMENT;
314*b1cdbd2cSJim Jagielski             pArray = new SwTxtAttr*[ nSize ];
315*b1cdbd2cSJim Jagielski             // copy from pInitArray to new Array
316*b1cdbd2cSJim Jagielski             memcpy( pArray, pInitialArray,
317*b1cdbd2cSJim Jagielski                     INITIAL_NUM_ATTR * sizeof(SwTxtAttr*)
318*b1cdbd2cSJim Jagielski                     );
319*b1cdbd2cSJim Jagielski         }
320*b1cdbd2cSJim Jagielski         // we are in new memory
321*b1cdbd2cSJim Jagielski         else
322*b1cdbd2cSJim Jagielski         {
323*b1cdbd2cSJim Jagielski             nSize += STACK_INCREMENT;
324*b1cdbd2cSJim Jagielski             SwTxtAttr** pTmpArray = new SwTxtAttr*[ nSize ];
325*b1cdbd2cSJim Jagielski             // copy from pArray to new Array
326*b1cdbd2cSJim Jagielski             memcpy( pTmpArray, pArray, nCount * sizeof(SwTxtAttr*) );
327*b1cdbd2cSJim Jagielski             // free old array
328*b1cdbd2cSJim Jagielski             delete [] pArray;
329*b1cdbd2cSJim Jagielski             pArray = pTmpArray;
330*b1cdbd2cSJim Jagielski         }
331*b1cdbd2cSJim Jagielski     }
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski     ASSERT( nPos <= nCount, "wrong position for insert operation");
334*b1cdbd2cSJim Jagielski 
335*b1cdbd2cSJim Jagielski     if ( nPos < nCount )
336*b1cdbd2cSJim Jagielski         memmove( pArray + nPos + 1, pArray + nPos,
337*b1cdbd2cSJim Jagielski                 ( nCount - nPos ) * sizeof(SwTxtAttr*)
338*b1cdbd2cSJim Jagielski                 );
339*b1cdbd2cSJim Jagielski     pArray[ nPos ] = (SwTxtAttr*)&rAttr;
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski     nCount++;
342*b1cdbd2cSJim Jagielski }
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski /*************************************************************************
345*b1cdbd2cSJim Jagielski  *                      SwAttrHandler::SwAttrStack::Remove()
346*b1cdbd2cSJim Jagielski  *************************************************************************/
347*b1cdbd2cSJim Jagielski 
Remove(const SwTxtAttr & rAttr)348*b1cdbd2cSJim Jagielski void SwAttrHandler::SwAttrStack::Remove( const SwTxtAttr& rAttr )
349*b1cdbd2cSJim Jagielski {
350*b1cdbd2cSJim Jagielski     sal_uInt16 nPos = Pos( rAttr );
351*b1cdbd2cSJim Jagielski     if ( nPos < nCount )
352*b1cdbd2cSJim Jagielski     {
353*b1cdbd2cSJim Jagielski         memmove( pArray + nPos, pArray + nPos + 1,
354*b1cdbd2cSJim Jagielski                 ( nCount - 1 - nPos ) * sizeof(SwTxtAttr*)
355*b1cdbd2cSJim Jagielski                 );
356*b1cdbd2cSJim Jagielski         nCount--;
357*b1cdbd2cSJim Jagielski     }
358*b1cdbd2cSJim Jagielski }
359*b1cdbd2cSJim Jagielski 
360*b1cdbd2cSJim Jagielski /*************************************************************************
361*b1cdbd2cSJim Jagielski  *                      SwAttrHandler::SwAttrStack::Top()
362*b1cdbd2cSJim Jagielski  *************************************************************************/
363*b1cdbd2cSJim Jagielski 
Top() const364*b1cdbd2cSJim Jagielski const SwTxtAttr* SwAttrHandler::SwAttrStack::Top() const
365*b1cdbd2cSJim Jagielski {
366*b1cdbd2cSJim Jagielski     return nCount ? pArray[ nCount - 1 ] : 0;
367*b1cdbd2cSJim Jagielski }
368*b1cdbd2cSJim Jagielski 
369*b1cdbd2cSJim Jagielski /*************************************************************************
370*b1cdbd2cSJim Jagielski  *                      SwAttrHandler::SwAttrStack::Pos()
371*b1cdbd2cSJim Jagielski  *************************************************************************/
372*b1cdbd2cSJim Jagielski 
Pos(const SwTxtAttr & rAttr) const373*b1cdbd2cSJim Jagielski sal_uInt16 SwAttrHandler::SwAttrStack::Pos( const SwTxtAttr& rAttr ) const
374*b1cdbd2cSJim Jagielski {
375*b1cdbd2cSJim Jagielski     if ( ! nCount )
376*b1cdbd2cSJim Jagielski         // empty stack
377*b1cdbd2cSJim Jagielski         return USHRT_MAX;
378*b1cdbd2cSJim Jagielski 
379*b1cdbd2cSJim Jagielski     for ( sal_uInt16 nIdx = nCount; nIdx > 0; )
380*b1cdbd2cSJim Jagielski     {
381*b1cdbd2cSJim Jagielski         if ( &rAttr == pArray[ --nIdx ] )
382*b1cdbd2cSJim Jagielski             return nIdx;
383*b1cdbd2cSJim Jagielski     }
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski     // element not found
386*b1cdbd2cSJim Jagielski     return USHRT_MAX;
387*b1cdbd2cSJim Jagielski }
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski /*************************************************************************
390*b1cdbd2cSJim Jagielski  *                      SwAttrHandler::SwAttrHandler()
391*b1cdbd2cSJim Jagielski  *************************************************************************/
392*b1cdbd2cSJim Jagielski 
SwAttrHandler()393*b1cdbd2cSJim Jagielski SwAttrHandler::SwAttrHandler() : mpShell( 0 ), pFnt( 0 ), bVertLayout( sal_False )
394*b1cdbd2cSJim Jagielski 
395*b1cdbd2cSJim Jagielski {
396*b1cdbd2cSJim Jagielski     memset( pDefaultArray, 0, NUM_DEFAULT_VALUES * sizeof(SfxPoolItem*) );
397*b1cdbd2cSJim Jagielski }
398*b1cdbd2cSJim Jagielski 
~SwAttrHandler()399*b1cdbd2cSJim Jagielski SwAttrHandler::~SwAttrHandler()
400*b1cdbd2cSJim Jagielski {
401*b1cdbd2cSJim Jagielski     delete pFnt;
402*b1cdbd2cSJim Jagielski }
403*b1cdbd2cSJim Jagielski 
404*b1cdbd2cSJim Jagielski /*************************************************************************
405*b1cdbd2cSJim Jagielski  *                      SwAttrHandler::Init()
406*b1cdbd2cSJim Jagielski  *************************************************************************/
407*b1cdbd2cSJim Jagielski 
Init(const SwAttrSet & rAttrSet,const IDocumentSettingAccess & rIDocumentSettingAcces,const ViewShell * pSh)408*b1cdbd2cSJim Jagielski void SwAttrHandler::Init( const SwAttrSet& rAttrSet,
409*b1cdbd2cSJim Jagielski                           const IDocumentSettingAccess& rIDocumentSettingAcces,
410*b1cdbd2cSJim Jagielski                           const ViewShell* pSh )
411*b1cdbd2cSJim Jagielski {
412*b1cdbd2cSJim Jagielski     mpIDocumentSettingAccess = &rIDocumentSettingAcces;
413*b1cdbd2cSJim Jagielski     mpShell = pSh;
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski     for ( sal_uInt16 i = RES_CHRATR_BEGIN; i < RES_CHRATR_END; i++ )
416*b1cdbd2cSJim Jagielski         pDefaultArray[ StackPos[ i ] ] = &rAttrSet.Get( i, sal_True );
417*b1cdbd2cSJim Jagielski }
418*b1cdbd2cSJim Jagielski 
Init(const SfxPoolItem ** pPoolItem,const SwAttrSet * pAS,const IDocumentSettingAccess & rIDocumentSettingAcces,const ViewShell * pSh,SwFont & rFnt,sal_Bool bVL)419*b1cdbd2cSJim Jagielski void SwAttrHandler::Init( const SfxPoolItem** pPoolItem, const SwAttrSet* pAS,
420*b1cdbd2cSJim Jagielski                           const IDocumentSettingAccess& rIDocumentSettingAcces,
421*b1cdbd2cSJim Jagielski                           const ViewShell* pSh,
422*b1cdbd2cSJim Jagielski                           SwFont& rFnt, sal_Bool bVL )
423*b1cdbd2cSJim Jagielski {
424*b1cdbd2cSJim Jagielski     // initialize default array
425*b1cdbd2cSJim Jagielski     memcpy( pDefaultArray, pPoolItem,
426*b1cdbd2cSJim Jagielski             NUM_DEFAULT_VALUES * sizeof(SfxPoolItem*) );
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski     mpIDocumentSettingAccess = &rIDocumentSettingAcces;
429*b1cdbd2cSJim Jagielski     mpShell = pSh;
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski     // do we have to apply additional paragraph attributes?
432*b1cdbd2cSJim Jagielski     bVertLayout = bVL;
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski     if ( pAS && pAS->Count() )
435*b1cdbd2cSJim Jagielski     {
436*b1cdbd2cSJim Jagielski         SfxItemIter aIter( *pAS );
437*b1cdbd2cSJim Jagielski         sal_uInt16 nWhich;
438*b1cdbd2cSJim Jagielski         const SfxPoolItem* pItem = aIter.GetCurItem();
439*b1cdbd2cSJim Jagielski         while( sal_True )
440*b1cdbd2cSJim Jagielski         {
441*b1cdbd2cSJim Jagielski             nWhich = pItem->Which();
442*b1cdbd2cSJim Jagielski             if (isCHRATR(nWhich))
443*b1cdbd2cSJim Jagielski             {
444*b1cdbd2cSJim Jagielski                 pDefaultArray[ StackPos[ nWhich ] ] = pItem;
445*b1cdbd2cSJim Jagielski                 FontChg( *pItem, rFnt, sal_True );
446*b1cdbd2cSJim Jagielski             }
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski             if( aIter.IsAtEnd() )
449*b1cdbd2cSJim Jagielski                 break;
450*b1cdbd2cSJim Jagielski 
451*b1cdbd2cSJim Jagielski             pItem = aIter.NextItem();
452*b1cdbd2cSJim Jagielski         }
453*b1cdbd2cSJim Jagielski     }
454*b1cdbd2cSJim Jagielski 
455*b1cdbd2cSJim Jagielski     // It is possible, that Init is called more than once, e.g., in a
456*b1cdbd2cSJim Jagielski     // SwTxtFrm::FormatOnceMore situation.
457*b1cdbd2cSJim Jagielski     delete pFnt;
458*b1cdbd2cSJim Jagielski     pFnt = new SwFont( rFnt );
459*b1cdbd2cSJim Jagielski }
460*b1cdbd2cSJim Jagielski 
Reset()461*b1cdbd2cSJim Jagielski void SwAttrHandler::Reset( )
462*b1cdbd2cSJim Jagielski {
463*b1cdbd2cSJim Jagielski     for ( sal_uInt16 i = 0; i < NUM_ATTRIBUTE_STACKS; i++ )
464*b1cdbd2cSJim Jagielski         aAttrStack[ i ].Reset();
465*b1cdbd2cSJim Jagielski }
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski /*************************************************************************
468*b1cdbd2cSJim Jagielski  *                      SwAttrHandler::PushAndChg()
469*b1cdbd2cSJim Jagielski  *************************************************************************/
470*b1cdbd2cSJim Jagielski 
PushAndChg(const SwTxtAttr & rAttr,SwFont & rFnt)471*b1cdbd2cSJim Jagielski void SwAttrHandler::PushAndChg( const SwTxtAttr& rAttr, SwFont& rFnt )
472*b1cdbd2cSJim Jagielski {
473*b1cdbd2cSJim Jagielski     // these special attributes in fact represent a collection of attributes
474*b1cdbd2cSJim Jagielski     // they have to be pushed to each stack they belong to
475*b1cdbd2cSJim Jagielski     if ( RES_TXTATR_INETFMT == rAttr.Which() ||
476*b1cdbd2cSJim Jagielski          RES_TXTATR_CHARFMT == rAttr.Which() ||
477*b1cdbd2cSJim Jagielski          RES_TXTATR_AUTOFMT == rAttr.Which() )
478*b1cdbd2cSJim Jagielski     {
479*b1cdbd2cSJim Jagielski         const SfxItemSet* pSet = CharFmt::GetItemSet( rAttr.GetAttr() );
480*b1cdbd2cSJim Jagielski         if ( !pSet ) return;
481*b1cdbd2cSJim Jagielski 
482*b1cdbd2cSJim Jagielski         for ( sal_uInt16 i = RES_CHRATR_BEGIN; i < RES_CHRATR_END; i++)
483*b1cdbd2cSJim Jagielski         {
484*b1cdbd2cSJim Jagielski             const SfxPoolItem* pItem;
485*b1cdbd2cSJim Jagielski             sal_Bool bRet = SFX_ITEM_SET == pSet->GetItemState( i, rAttr.Which() != RES_TXTATR_AUTOFMT, &pItem );
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski             if ( bRet )
488*b1cdbd2cSJim Jagielski             {
489*b1cdbd2cSJim Jagielski                 // we push rAttr onto the appropriate stack
490*b1cdbd2cSJim Jagielski                 if ( Push( rAttr, *pItem ) )
491*b1cdbd2cSJim Jagielski                 {
492*b1cdbd2cSJim Jagielski                     // we let pItem change rFnt
493*b1cdbd2cSJim Jagielski                     Color aColor;
494*b1cdbd2cSJim Jagielski                     if ( lcl_ChgHyperLinkColor( rAttr, *pItem, mpShell, &aColor ) )
495*b1cdbd2cSJim Jagielski                     {
496*b1cdbd2cSJim Jagielski                         SvxColorItem aItemNext( aColor, RES_CHRATR_COLOR );
497*b1cdbd2cSJim Jagielski                         FontChg( aItemNext, rFnt, sal_True );
498*b1cdbd2cSJim Jagielski                     }
499*b1cdbd2cSJim Jagielski                     else
500*b1cdbd2cSJim Jagielski                         FontChg( *pItem, rFnt, sal_True );
501*b1cdbd2cSJim Jagielski                 }
502*b1cdbd2cSJim Jagielski             }
503*b1cdbd2cSJim Jagielski         }
504*b1cdbd2cSJim Jagielski     }
505*b1cdbd2cSJim Jagielski     // this is the usual case, we have a basic attribute, push it onto the
506*b1cdbd2cSJim Jagielski     // stack and change the font
507*b1cdbd2cSJim Jagielski     else
508*b1cdbd2cSJim Jagielski     {
509*b1cdbd2cSJim Jagielski         if ( Push( rAttr, rAttr.GetAttr() ) )
510*b1cdbd2cSJim Jagielski             // we let pItem change rFnt
511*b1cdbd2cSJim Jagielski             FontChg( rAttr.GetAttr(), rFnt, sal_True );
512*b1cdbd2cSJim Jagielski     }
513*b1cdbd2cSJim Jagielski }
514*b1cdbd2cSJim Jagielski 
515*b1cdbd2cSJim Jagielski /*************************************************************************
516*b1cdbd2cSJim Jagielski  *                      SwAttrHandler::Push()
517*b1cdbd2cSJim Jagielski  *************************************************************************/
518*b1cdbd2cSJim Jagielski 
Push(const SwTxtAttr & rAttr,const SfxPoolItem & rItem)519*b1cdbd2cSJim Jagielski sal_Bool SwAttrHandler::Push( const SwTxtAttr& rAttr, const SfxPoolItem& rItem )
520*b1cdbd2cSJim Jagielski {
521*b1cdbd2cSJim Jagielski     ASSERT( rItem.Which() < RES_TXTATR_WITHEND_END,
522*b1cdbd2cSJim Jagielski             "I do not want this attribute, nWhich >= RES_TXTATR_WITHEND_END" );
523*b1cdbd2cSJim Jagielski 
524*b1cdbd2cSJim Jagielski     // robust
525*b1cdbd2cSJim Jagielski     if ( RES_TXTATR_WITHEND_END <= rItem.Which() )
526*b1cdbd2cSJim Jagielski         return sal_False;
527*b1cdbd2cSJim Jagielski 
528*b1cdbd2cSJim Jagielski     const sal_uInt16 nStack = StackPos[ rItem.Which() ];
529*b1cdbd2cSJim Jagielski 
530*b1cdbd2cSJim Jagielski     // attributes originating from redlining have highest priority
531*b1cdbd2cSJim Jagielski     // second priority are hyperlink attributes, which have a color replacement
532*b1cdbd2cSJim Jagielski     const SwTxtAttr* pTopAttr = aAttrStack[ nStack ].Top();
533*b1cdbd2cSJim Jagielski     if ( !pTopAttr
534*b1cdbd2cSJim Jagielski          || rAttr.IsPriorityAttr()
535*b1cdbd2cSJim Jagielski          || ( !pTopAttr->IsPriorityAttr()
536*b1cdbd2cSJim Jagielski               && !lcl_ChgHyperLinkColor( *pTopAttr, rItem, mpShell, 0 ) ) )
537*b1cdbd2cSJim Jagielski     {
538*b1cdbd2cSJim Jagielski         aAttrStack[ nStack ].Push( rAttr );
539*b1cdbd2cSJim Jagielski         return sal_True;
540*b1cdbd2cSJim Jagielski     }
541*b1cdbd2cSJim Jagielski 
542*b1cdbd2cSJim Jagielski     const sal_uInt16 nPos = aAttrStack[ nStack ].Count();
543*b1cdbd2cSJim Jagielski     ASSERT( nPos, "empty stack?" );
544*b1cdbd2cSJim Jagielski     aAttrStack[ nStack ].Insert( rAttr, nPos - 1 );
545*b1cdbd2cSJim Jagielski     return sal_False;
546*b1cdbd2cSJim Jagielski }
547*b1cdbd2cSJim Jagielski 
548*b1cdbd2cSJim Jagielski /*************************************************************************
549*b1cdbd2cSJim Jagielski  *                      SwAttrHandler::PopAndChg()
550*b1cdbd2cSJim Jagielski  *************************************************************************/
551*b1cdbd2cSJim Jagielski 
PopAndChg(const SwTxtAttr & rAttr,SwFont & rFnt)552*b1cdbd2cSJim Jagielski void SwAttrHandler::PopAndChg( const SwTxtAttr& rAttr, SwFont& rFnt )
553*b1cdbd2cSJim Jagielski {
554*b1cdbd2cSJim Jagielski     if ( RES_TXTATR_WITHEND_END <= rAttr.Which() )
555*b1cdbd2cSJim Jagielski         return; // robust
556*b1cdbd2cSJim Jagielski 
557*b1cdbd2cSJim Jagielski     // these special attributes in fact represent a collection of attributes
558*b1cdbd2cSJim Jagielski     // they have to be removed from each stack they belong to
559*b1cdbd2cSJim Jagielski     if ( RES_TXTATR_INETFMT == rAttr.Which() ||
560*b1cdbd2cSJim Jagielski          RES_TXTATR_CHARFMT == rAttr.Which() ||
561*b1cdbd2cSJim Jagielski          RES_TXTATR_AUTOFMT == rAttr.Which() )
562*b1cdbd2cSJim Jagielski     {
563*b1cdbd2cSJim Jagielski         const SfxItemSet* pSet = CharFmt::GetItemSet( rAttr.GetAttr() );
564*b1cdbd2cSJim Jagielski         if ( !pSet ) return;
565*b1cdbd2cSJim Jagielski 
566*b1cdbd2cSJim Jagielski         for ( sal_uInt16 i = RES_CHRATR_BEGIN; i < RES_CHRATR_END; i++)
567*b1cdbd2cSJim Jagielski         {
568*b1cdbd2cSJim Jagielski             const SfxPoolItem* pItem;
569*b1cdbd2cSJim Jagielski             sal_Bool bRet = SFX_ITEM_SET == pSet->GetItemState( i, RES_TXTATR_AUTOFMT != rAttr.Which(), &pItem );
570*b1cdbd2cSJim Jagielski             if ( bRet )
571*b1cdbd2cSJim Jagielski             {
572*b1cdbd2cSJim Jagielski                 // we remove rAttr from the appropriate stack
573*b1cdbd2cSJim Jagielski                 sal_uInt16 nStackPos = StackPos[ i ];
574*b1cdbd2cSJim Jagielski                 aAttrStack[ nStackPos ].Remove( rAttr );
575*b1cdbd2cSJim Jagielski                 // reset font according to attribute on top of stack
576*b1cdbd2cSJim Jagielski                 // or default value
577*b1cdbd2cSJim Jagielski                 ActivateTop( rFnt, i );
578*b1cdbd2cSJim Jagielski             }
579*b1cdbd2cSJim Jagielski         }
580*b1cdbd2cSJim Jagielski     }
581*b1cdbd2cSJim Jagielski     // this is the usual case, we have a basic attribute, remove it from the
582*b1cdbd2cSJim Jagielski     // stack and reset the font
583*b1cdbd2cSJim Jagielski     else
584*b1cdbd2cSJim Jagielski     {
585*b1cdbd2cSJim Jagielski         aAttrStack[ StackPos[ rAttr.Which() ] ].Remove( rAttr );
586*b1cdbd2cSJim Jagielski         // reset font according to attribute on top of stack
587*b1cdbd2cSJim Jagielski         // or default value
588*b1cdbd2cSJim Jagielski         ActivateTop( rFnt, rAttr.Which() );
589*b1cdbd2cSJim Jagielski     }
590*b1cdbd2cSJim Jagielski }
591*b1cdbd2cSJim Jagielski 
592*b1cdbd2cSJim Jagielski /*************************************************************************
593*b1cdbd2cSJim Jagielski  *                      SwAttrHandler::Pop()
594*b1cdbd2cSJim Jagielski  *
595*b1cdbd2cSJim Jagielski  * only used during redlining
596*b1cdbd2cSJim Jagielski  *************************************************************************/
597*b1cdbd2cSJim Jagielski 
Pop(const SwTxtAttr & rAttr)598*b1cdbd2cSJim Jagielski void SwAttrHandler::Pop( const SwTxtAttr& rAttr )
599*b1cdbd2cSJim Jagielski {
600*b1cdbd2cSJim Jagielski     ASSERT( rAttr.Which() < RES_TXTATR_WITHEND_END,
601*b1cdbd2cSJim Jagielski             "I do not have this attribute, nWhich >= RES_TXTATR_WITHEND_END" );
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski     if ( rAttr.Which() < RES_TXTATR_WITHEND_END )
604*b1cdbd2cSJim Jagielski     {
605*b1cdbd2cSJim Jagielski         aAttrStack[ StackPos[ rAttr.Which() ] ].Remove( rAttr );
606*b1cdbd2cSJim Jagielski     }
607*b1cdbd2cSJim Jagielski }
608*b1cdbd2cSJim Jagielski 
609*b1cdbd2cSJim Jagielski /*************************************************************************
610*b1cdbd2cSJim Jagielski  *                      SwAttrHandler::ActivateTop()
611*b1cdbd2cSJim Jagielski  *************************************************************************/
ActivateTop(SwFont & rFnt,const sal_uInt16 nAttr)612*b1cdbd2cSJim Jagielski void SwAttrHandler::ActivateTop( SwFont& rFnt, const sal_uInt16 nAttr )
613*b1cdbd2cSJim Jagielski {
614*b1cdbd2cSJim Jagielski     ASSERT( nAttr < RES_TXTATR_WITHEND_END,
615*b1cdbd2cSJim Jagielski             "I cannot activate this attribute, nWhich >= RES_TXTATR_WITHEND_END" );
616*b1cdbd2cSJim Jagielski 
617*b1cdbd2cSJim Jagielski     const sal_uInt16 nStackPos = StackPos[ nAttr ];
618*b1cdbd2cSJim Jagielski     const SwTxtAttr* pTopAt = aAttrStack[ nStackPos ].Top();
619*b1cdbd2cSJim Jagielski     if ( pTopAt )
620*b1cdbd2cSJim Jagielski     {
621*b1cdbd2cSJim Jagielski         // check if top attribute is collection of attributes
622*b1cdbd2cSJim Jagielski         if ( RES_TXTATR_INETFMT == pTopAt->Which() ||
623*b1cdbd2cSJim Jagielski              RES_TXTATR_CHARFMT == pTopAt->Which() ||
624*b1cdbd2cSJim Jagielski              RES_TXTATR_AUTOFMT == pTopAt->Which() )
625*b1cdbd2cSJim Jagielski         {
626*b1cdbd2cSJim Jagielski             const SfxItemSet* pSet = CharFmt::GetItemSet( pTopAt->GetAttr() );
627*b1cdbd2cSJim Jagielski             const SfxPoolItem* pItemNext;
628*b1cdbd2cSJim Jagielski             pSet->GetItemState( nAttr, RES_TXTATR_AUTOFMT != pTopAt->Which(), &pItemNext );
629*b1cdbd2cSJim Jagielski 
630*b1cdbd2cSJim Jagielski             Color aColor;
631*b1cdbd2cSJim Jagielski             if ( lcl_ChgHyperLinkColor( *pTopAt, *pItemNext, mpShell, &aColor ) )
632*b1cdbd2cSJim Jagielski             {
633*b1cdbd2cSJim Jagielski                 SvxColorItem aItemNext( aColor, RES_CHRATR_COLOR );
634*b1cdbd2cSJim Jagielski                 FontChg( aItemNext, rFnt, sal_False );
635*b1cdbd2cSJim Jagielski             }
636*b1cdbd2cSJim Jagielski             else
637*b1cdbd2cSJim Jagielski                 FontChg( *pItemNext, rFnt, sal_False );
638*b1cdbd2cSJim Jagielski         }
639*b1cdbd2cSJim Jagielski         else
640*b1cdbd2cSJim Jagielski             FontChg( pTopAt->GetAttr(), rFnt, sal_False );
641*b1cdbd2cSJim Jagielski     }
642*b1cdbd2cSJim Jagielski 
643*b1cdbd2cSJim Jagielski     // default value has to be set, we only have default values for char attribs
644*b1cdbd2cSJim Jagielski     else if ( nStackPos < NUM_DEFAULT_VALUES )
645*b1cdbd2cSJim Jagielski         FontChg( *pDefaultArray[ nStackPos ], rFnt, sal_False );
646*b1cdbd2cSJim Jagielski     else if ( RES_TXTATR_REFMARK == nAttr )
647*b1cdbd2cSJim Jagielski         rFnt.GetRef()--;
648*b1cdbd2cSJim Jagielski     else if ( RES_TXTATR_TOXMARK == nAttr )
649*b1cdbd2cSJim Jagielski         rFnt.GetTox()--;
650*b1cdbd2cSJim Jagielski     else if ( (RES_TXTATR_META == nAttr) || (RES_TXTATR_METAFIELD == nAttr) )
651*b1cdbd2cSJim Jagielski     {
652*b1cdbd2cSJim Jagielski         rFnt.GetMeta()--;
653*b1cdbd2cSJim Jagielski     }
654*b1cdbd2cSJim Jagielski     else if ( RES_TXTATR_CJK_RUBY == nAttr )
655*b1cdbd2cSJim Jagielski     {
656*b1cdbd2cSJim Jagielski         // ruby stack has no more attributes
657*b1cdbd2cSJim Jagielski         // check, if an rotation attribute has to be applied
658*b1cdbd2cSJim Jagielski         sal_uInt16 nTwoLineStack = StackPos[ RES_CHRATR_TWO_LINES ];
659*b1cdbd2cSJim Jagielski         sal_Bool bTwoLineAct = sal_False;
660*b1cdbd2cSJim Jagielski         const SfxPoolItem* pTwoLineItem = 0;
661*b1cdbd2cSJim Jagielski         const SwTxtAttr* pTwoLineAttr = aAttrStack[ nTwoLineStack ].Top();
662*b1cdbd2cSJim Jagielski 
663*b1cdbd2cSJim Jagielski         if ( pTwoLineAttr )
664*b1cdbd2cSJim Jagielski         {
665*b1cdbd2cSJim Jagielski              pTwoLineItem = CharFmt::GetItem( *pTwoLineAttr, RES_CHRATR_TWO_LINES );
666*b1cdbd2cSJim Jagielski              bTwoLineAct = ((SvxTwoLinesItem*)pTwoLineItem)->GetValue();
667*b1cdbd2cSJim Jagielski         }
668*b1cdbd2cSJim Jagielski         else
669*b1cdbd2cSJim Jagielski             bTwoLineAct =
670*b1cdbd2cSJim Jagielski                 ((SvxTwoLinesItem*)pDefaultArray[ nTwoLineStack ])->GetValue();
671*b1cdbd2cSJim Jagielski 
672*b1cdbd2cSJim Jagielski         if ( bTwoLineAct )
673*b1cdbd2cSJim Jagielski             return;
674*b1cdbd2cSJim Jagielski 
675*b1cdbd2cSJim Jagielski         // eventually, an rotate attribute has to be activated
676*b1cdbd2cSJim Jagielski         sal_uInt16 nRotateStack = StackPos[ RES_CHRATR_ROTATE ];
677*b1cdbd2cSJim Jagielski         const SfxPoolItem* pRotateItem = 0;
678*b1cdbd2cSJim Jagielski         const SwTxtAttr* pRotateAttr = aAttrStack[ nRotateStack ].Top();
679*b1cdbd2cSJim Jagielski 
680*b1cdbd2cSJim Jagielski         if ( pRotateAttr )
681*b1cdbd2cSJim Jagielski         {
682*b1cdbd2cSJim Jagielski             pRotateItem = CharFmt::GetItem( *pRotateAttr, RES_CHRATR_ROTATE );
683*b1cdbd2cSJim Jagielski             rFnt.SetVertical( ((SvxCharRotateItem*)pRotateItem)->GetValue(),
684*b1cdbd2cSJim Jagielski                                bVertLayout );
685*b1cdbd2cSJim Jagielski         }
686*b1cdbd2cSJim Jagielski         else
687*b1cdbd2cSJim Jagielski             rFnt.SetVertical(
688*b1cdbd2cSJim Jagielski                 ((SvxCharRotateItem*)pDefaultArray[ nRotateStack ])->GetValue(),
689*b1cdbd2cSJim Jagielski                  bVertLayout
690*b1cdbd2cSJim Jagielski             );
691*b1cdbd2cSJim Jagielski     }
692*b1cdbd2cSJim Jagielski     else if ( RES_TXTATR_INPUTFIELD == nAttr )
693*b1cdbd2cSJim Jagielski         rFnt.GetInputField()--;
694*b1cdbd2cSJim Jagielski }
695*b1cdbd2cSJim Jagielski 
696*b1cdbd2cSJim Jagielski /*************************************************************************
697*b1cdbd2cSJim Jagielski  *                      Font Changing Function
698*b1cdbd2cSJim Jagielski  *
699*b1cdbd2cSJim Jagielski  * When popping an attribute from the stack, the top mose remaining
700*b1cdbd2cSJim Jagielski  * attribute in the stack becomes valid. The following function change
701*b1cdbd2cSJim Jagielski  * a font depending on the stack id.
702*b1cdbd2cSJim Jagielski  *************************************************************************/
703*b1cdbd2cSJim Jagielski 
FontChg(const SfxPoolItem & rItem,SwFont & rFnt,sal_Bool bPush)704*b1cdbd2cSJim Jagielski void SwAttrHandler::FontChg(const SfxPoolItem& rItem, SwFont& rFnt, sal_Bool bPush )
705*b1cdbd2cSJim Jagielski {
706*b1cdbd2cSJim Jagielski     switch ( rItem.Which() )
707*b1cdbd2cSJim Jagielski     {
708*b1cdbd2cSJim Jagielski         case RES_CHRATR_CASEMAP :
709*b1cdbd2cSJim Jagielski             rFnt.SetCaseMap( ((SvxCaseMapItem&)rItem).GetCaseMap() );
710*b1cdbd2cSJim Jagielski             break;
711*b1cdbd2cSJim Jagielski         case RES_CHRATR_COLOR :
712*b1cdbd2cSJim Jagielski             rFnt.SetColor( ((SvxColorItem&)rItem).GetValue() );
713*b1cdbd2cSJim Jagielski             break;
714*b1cdbd2cSJim Jagielski         case RES_CHRATR_CONTOUR :
715*b1cdbd2cSJim Jagielski             rFnt.SetOutline( ((SvxContourItem&)rItem).GetValue() );
716*b1cdbd2cSJim Jagielski             break;
717*b1cdbd2cSJim Jagielski         case RES_CHRATR_CROSSEDOUT :
718*b1cdbd2cSJim Jagielski             rFnt.SetStrikeout( ((SvxCrossedOutItem&)rItem).GetStrikeout() );
719*b1cdbd2cSJim Jagielski             break;
720*b1cdbd2cSJim Jagielski         case RES_CHRATR_ESCAPEMENT :
721*b1cdbd2cSJim Jagielski             rFnt.SetEscapement( ((SvxEscapementItem&)rItem).GetEsc() );
722*b1cdbd2cSJim Jagielski             rFnt.SetProportion( ((SvxEscapementItem&)rItem).GetProp() );
723*b1cdbd2cSJim Jagielski             break;
724*b1cdbd2cSJim Jagielski         case RES_CHRATR_FONT :
725*b1cdbd2cSJim Jagielski             rFnt.SetName( ((SvxFontItem&)rItem).GetFamilyName(), SW_LATIN );
726*b1cdbd2cSJim Jagielski             rFnt.SetStyleName( ((SvxFontItem&)rItem).GetStyleName(), SW_LATIN );
727*b1cdbd2cSJim Jagielski             rFnt.SetFamily( ((SvxFontItem&)rItem).GetFamily(), SW_LATIN );
728*b1cdbd2cSJim Jagielski             rFnt.SetPitch( ((SvxFontItem&)rItem).GetPitch(), SW_LATIN );
729*b1cdbd2cSJim Jagielski             rFnt.SetCharSet( ((SvxFontItem&)rItem).GetCharSet(), SW_LATIN );
730*b1cdbd2cSJim Jagielski             break;
731*b1cdbd2cSJim Jagielski         case RES_CHRATR_FONTSIZE :
732*b1cdbd2cSJim Jagielski             rFnt.SetSize(Size(0,((SvxFontHeightItem&)rItem).GetHeight() ), SW_LATIN );
733*b1cdbd2cSJim Jagielski             break;
734*b1cdbd2cSJim Jagielski         case RES_CHRATR_KERNING :
735*b1cdbd2cSJim Jagielski             rFnt.SetFixKerning( ((SvxKerningItem&)rItem).GetValue() );
736*b1cdbd2cSJim Jagielski             break;
737*b1cdbd2cSJim Jagielski         case RES_CHRATR_LANGUAGE :
738*b1cdbd2cSJim Jagielski             rFnt.SetLanguage( ((SvxLanguageItem&)rItem).GetLanguage(), SW_LATIN );
739*b1cdbd2cSJim Jagielski             break;
740*b1cdbd2cSJim Jagielski         case RES_CHRATR_POSTURE :
741*b1cdbd2cSJim Jagielski             rFnt.SetItalic( ((SvxPostureItem&)rItem).GetPosture(), SW_LATIN );
742*b1cdbd2cSJim Jagielski             break;
743*b1cdbd2cSJim Jagielski         case RES_CHRATR_SHADOWED :
744*b1cdbd2cSJim Jagielski             rFnt.SetShadow( ((SvxShadowedItem&)rItem).GetValue() );
745*b1cdbd2cSJim Jagielski             break;
746*b1cdbd2cSJim Jagielski         case RES_CHRATR_UNDERLINE :
747*b1cdbd2cSJim Jagielski         {
748*b1cdbd2cSJim Jagielski             const sal_uInt16 nStackPos = StackPos[ RES_CHRATR_HIDDEN ];
749*b1cdbd2cSJim Jagielski             const SwTxtAttr* pTopAt = aAttrStack[ nStackPos ].Top();
750*b1cdbd2cSJim Jagielski 
751*b1cdbd2cSJim Jagielski             const SfxPoolItem* pTmpItem = pTopAt ?
752*b1cdbd2cSJim Jagielski                                           CharFmt::GetItem( *pTopAt, RES_CHRATR_HIDDEN ) :
753*b1cdbd2cSJim Jagielski                                           pDefaultArray[ nStackPos ];
754*b1cdbd2cSJim Jagielski 
755*b1cdbd2cSJim Jagielski             if( (mpShell && !mpShell->GetWin()) ||
756*b1cdbd2cSJim Jagielski                 (pTmpItem && !static_cast<const SvxCharHiddenItem*>(pTmpItem)->GetValue()) )
757*b1cdbd2cSJim Jagielski             {
758*b1cdbd2cSJim Jagielski                 rFnt.SetUnderline( ((SvxUnderlineItem&)rItem).GetLineStyle() );
759*b1cdbd2cSJim Jagielski                 rFnt.SetUnderColor( ((SvxUnderlineItem&)rItem).GetColor() );
760*b1cdbd2cSJim Jagielski             }
761*b1cdbd2cSJim Jagielski             break;
762*b1cdbd2cSJim Jagielski         }
763*b1cdbd2cSJim Jagielski         case RES_CHRATR_OVERLINE :
764*b1cdbd2cSJim Jagielski             rFnt.SetOverline( ((SvxOverlineItem&)rItem).GetLineStyle() );
765*b1cdbd2cSJim Jagielski             rFnt.SetOverColor( ((SvxOverlineItem&)rItem).GetColor() );
766*b1cdbd2cSJim Jagielski             break;
767*b1cdbd2cSJim Jagielski         case RES_CHRATR_WEIGHT :
768*b1cdbd2cSJim Jagielski             rFnt.SetWeight( ((SvxWeightItem&)rItem).GetWeight(), SW_LATIN );
769*b1cdbd2cSJim Jagielski             break;
770*b1cdbd2cSJim Jagielski         case RES_CHRATR_WORDLINEMODE :
771*b1cdbd2cSJim Jagielski             rFnt.SetWordLineMode( ((SvxWordLineModeItem&)rItem).GetValue() );
772*b1cdbd2cSJim Jagielski             break;
773*b1cdbd2cSJim Jagielski         case RES_CHRATR_AUTOKERN :
774*b1cdbd2cSJim Jagielski             if( ((SvxAutoKernItem&)rItem).GetValue() )
775*b1cdbd2cSJim Jagielski             {
776*b1cdbd2cSJim Jagielski                 rFnt.SetAutoKern( ( !mpIDocumentSettingAccess ||
777*b1cdbd2cSJim Jagielski                                     !mpIDocumentSettingAccess->get(IDocumentSettingAccess::KERN_ASIAN_PUNCTUATION) ) ?
778*b1cdbd2cSJim Jagielski                                      KERNING_FONTSPECIFIC :
779*b1cdbd2cSJim Jagielski                                      KERNING_ASIAN );
780*b1cdbd2cSJim Jagielski             }
781*b1cdbd2cSJim Jagielski 			else
782*b1cdbd2cSJim Jagielski                 rFnt.SetAutoKern( 0 );
783*b1cdbd2cSJim Jagielski             break;
784*b1cdbd2cSJim Jagielski         case RES_CHRATR_BLINK :
785*b1cdbd2cSJim Jagielski             rFnt.SetBlink( ((SvxBlinkItem&)rItem).GetValue() );
786*b1cdbd2cSJim Jagielski             break;
787*b1cdbd2cSJim Jagielski         case RES_CHRATR_BACKGROUND :
788*b1cdbd2cSJim Jagielski             rFnt.SetBackColor(new Color( ((SvxBrushItem&)rItem).GetColor() ) );
789*b1cdbd2cSJim Jagielski             break;
790*b1cdbd2cSJim Jagielski         case RES_CHRATR_CJK_FONT :
791*b1cdbd2cSJim Jagielski             rFnt.SetName( ((SvxFontItem&)rItem).GetFamilyName(), SW_CJK );
792*b1cdbd2cSJim Jagielski             rFnt.SetStyleName( ((SvxFontItem&)rItem).GetStyleName(), SW_CJK );
793*b1cdbd2cSJim Jagielski             rFnt.SetFamily( ((SvxFontItem&)rItem).GetFamily(), SW_CJK );
794*b1cdbd2cSJim Jagielski             rFnt.SetPitch( ((SvxFontItem&)rItem).GetPitch(), SW_CJK );
795*b1cdbd2cSJim Jagielski             rFnt.SetCharSet( ((SvxFontItem&)rItem).GetCharSet(), SW_CJK );
796*b1cdbd2cSJim Jagielski             break;
797*b1cdbd2cSJim Jagielski         case RES_CHRATR_CJK_FONTSIZE :
798*b1cdbd2cSJim Jagielski             rFnt.SetSize(Size( 0, ((SvxFontHeightItem&)rItem).GetHeight()), SW_CJK);
799*b1cdbd2cSJim Jagielski             break;
800*b1cdbd2cSJim Jagielski         case RES_CHRATR_CJK_LANGUAGE :
801*b1cdbd2cSJim Jagielski             rFnt.SetLanguage( ((SvxLanguageItem&)rItem).GetLanguage(), SW_CJK );
802*b1cdbd2cSJim Jagielski             break;
803*b1cdbd2cSJim Jagielski         case RES_CHRATR_CJK_POSTURE :
804*b1cdbd2cSJim Jagielski             rFnt.SetItalic( ((SvxPostureItem&)rItem).GetPosture(), SW_CJK );
805*b1cdbd2cSJim Jagielski             break;
806*b1cdbd2cSJim Jagielski         case RES_CHRATR_CJK_WEIGHT :
807*b1cdbd2cSJim Jagielski             rFnt.SetWeight( ((SvxWeightItem&)rItem).GetWeight(), SW_CJK );
808*b1cdbd2cSJim Jagielski             break;
809*b1cdbd2cSJim Jagielski         case RES_CHRATR_CTL_FONT :
810*b1cdbd2cSJim Jagielski             rFnt.SetName( ((SvxFontItem&)rItem).GetFamilyName(), SW_CTL );
811*b1cdbd2cSJim Jagielski             rFnt.SetStyleName( ((SvxFontItem&)rItem).GetStyleName(), SW_CTL );
812*b1cdbd2cSJim Jagielski             rFnt.SetFamily( ((SvxFontItem&)rItem).GetFamily(), SW_CTL );
813*b1cdbd2cSJim Jagielski             rFnt.SetPitch( ((SvxFontItem&)rItem).GetPitch(), SW_CTL );
814*b1cdbd2cSJim Jagielski             rFnt.SetCharSet( ((SvxFontItem&)rItem).GetCharSet(), SW_CTL );
815*b1cdbd2cSJim Jagielski             break;
816*b1cdbd2cSJim Jagielski         case RES_CHRATR_CTL_FONTSIZE :
817*b1cdbd2cSJim Jagielski             rFnt.SetSize(Size(0, ((SvxFontHeightItem&)rItem).GetHeight() ), SW_CTL);
818*b1cdbd2cSJim Jagielski             break;
819*b1cdbd2cSJim Jagielski         case RES_CHRATR_CTL_LANGUAGE :
820*b1cdbd2cSJim Jagielski             rFnt.SetLanguage( ((SvxLanguageItem&)rItem).GetLanguage(), SW_CTL );
821*b1cdbd2cSJim Jagielski             break;
822*b1cdbd2cSJim Jagielski         case RES_CHRATR_CTL_POSTURE :
823*b1cdbd2cSJim Jagielski             rFnt.SetItalic( ((SvxPostureItem&)rItem).GetPosture(), SW_CTL );
824*b1cdbd2cSJim Jagielski             break;
825*b1cdbd2cSJim Jagielski         case RES_CHRATR_CTL_WEIGHT :
826*b1cdbd2cSJim Jagielski             rFnt.SetWeight( ((SvxWeightItem&)rItem).GetWeight(), SW_CTL );
827*b1cdbd2cSJim Jagielski             break;
828*b1cdbd2cSJim Jagielski         case RES_CHRATR_EMPHASIS_MARK :
829*b1cdbd2cSJim Jagielski             rFnt.SetEmphasisMark(
830*b1cdbd2cSJim Jagielski                      ((SvxEmphasisMarkItem&)rItem).GetEmphasisMark()
831*b1cdbd2cSJim Jagielski                      );
832*b1cdbd2cSJim Jagielski             break;
833*b1cdbd2cSJim Jagielski         case RES_CHRATR_SCALEW :
834*b1cdbd2cSJim Jagielski             rFnt.SetPropWidth( ((SvxCharScaleWidthItem&)rItem).GetValue() );
835*b1cdbd2cSJim Jagielski             break;
836*b1cdbd2cSJim Jagielski         case RES_CHRATR_RELIEF :
837*b1cdbd2cSJim Jagielski             rFnt.SetRelief( (FontRelief)((SvxCharReliefItem&)rItem).GetValue() );
838*b1cdbd2cSJim Jagielski             break;
839*b1cdbd2cSJim Jagielski         case RES_CHRATR_HIDDEN :
840*b1cdbd2cSJim Jagielski             if( mpShell && mpShell->GetWin())
841*b1cdbd2cSJim Jagielski             {
842*b1cdbd2cSJim Jagielski                 if ( ((SvxCharHiddenItem&)rItem).GetValue() )
843*b1cdbd2cSJim Jagielski                     rFnt.SetUnderline( UNDERLINE_DOTTED );
844*b1cdbd2cSJim Jagielski                 else
845*b1cdbd2cSJim Jagielski                     ActivateTop( rFnt, RES_CHRATR_UNDERLINE );
846*b1cdbd2cSJim Jagielski             }
847*b1cdbd2cSJim Jagielski             break;
848*b1cdbd2cSJim Jagielski         case RES_CHRATR_ROTATE :
849*b1cdbd2cSJim Jagielski         {
850*b1cdbd2cSJim Jagielski             // rotate attribute is applied, when:
851*b1cdbd2cSJim Jagielski             // 1. ruby stack is empty and
852*b1cdbd2cSJim Jagielski             // 2. top of two line stack ( or default attribute )is an
853*b1cdbd2cSJim Jagielski             //    deactivated two line attribute
854*b1cdbd2cSJim Jagielski             const bool bRuby =
855*b1cdbd2cSJim Jagielski                 0 != aAttrStack[ StackPos[ RES_TXTATR_CJK_RUBY ] ].Count();
856*b1cdbd2cSJim Jagielski 
857*b1cdbd2cSJim Jagielski             if ( bRuby )
858*b1cdbd2cSJim Jagielski                 break;
859*b1cdbd2cSJim Jagielski 
860*b1cdbd2cSJim Jagielski             sal_uInt16 nTwoLineStack = StackPos[ RES_CHRATR_TWO_LINES ];
861*b1cdbd2cSJim Jagielski             sal_Bool bTwoLineAct = sal_False;
862*b1cdbd2cSJim Jagielski             const SfxPoolItem* pTwoLineItem = 0;
863*b1cdbd2cSJim Jagielski             const SwTxtAttr* pTwoLineAttr = aAttrStack[ nTwoLineStack ].Top();
864*b1cdbd2cSJim Jagielski 
865*b1cdbd2cSJim Jagielski             if ( pTwoLineAttr )
866*b1cdbd2cSJim Jagielski             {
867*b1cdbd2cSJim Jagielski                 pTwoLineItem = CharFmt::GetItem( *pTwoLineAttr, RES_CHRATR_TWO_LINES );
868*b1cdbd2cSJim Jagielski                 bTwoLineAct = ((SvxTwoLinesItem*)pTwoLineItem)->GetValue();
869*b1cdbd2cSJim Jagielski             }
870*b1cdbd2cSJim Jagielski             else
871*b1cdbd2cSJim Jagielski                 bTwoLineAct =
872*b1cdbd2cSJim Jagielski                     ((SvxTwoLinesItem*)pDefaultArray[ nTwoLineStack ])->GetValue();
873*b1cdbd2cSJim Jagielski 
874*b1cdbd2cSJim Jagielski             if ( !bTwoLineAct )
875*b1cdbd2cSJim Jagielski                 rFnt.SetVertical( ((SvxCharRotateItem&)rItem).GetValue(),
876*b1cdbd2cSJim Jagielski                                    bVertLayout );
877*b1cdbd2cSJim Jagielski 
878*b1cdbd2cSJim Jagielski             break;
879*b1cdbd2cSJim Jagielski         }
880*b1cdbd2cSJim Jagielski         case RES_CHRATR_TWO_LINES :
881*b1cdbd2cSJim Jagielski         {
882*b1cdbd2cSJim Jagielski             sal_Bool bRuby = 0 !=
883*b1cdbd2cSJim Jagielski                     aAttrStack[ StackPos[ RES_TXTATR_CJK_RUBY ] ].Count();
884*b1cdbd2cSJim Jagielski             sal_Bool bTwoLineAct = sal_False;
885*b1cdbd2cSJim Jagielski 
886*b1cdbd2cSJim Jagielski             // two line is activated, if
887*b1cdbd2cSJim Jagielski             // 1. no ruby attribute is set and
888*b1cdbd2cSJim Jagielski             // 2. attribute is active
889*b1cdbd2cSJim Jagielski             bTwoLineAct = ((SvxTwoLinesItem&)rItem).GetValue();
890*b1cdbd2cSJim Jagielski 
891*b1cdbd2cSJim Jagielski             if ( !bRuby && bTwoLineAct )
892*b1cdbd2cSJim Jagielski             {
893*b1cdbd2cSJim Jagielski                 rFnt.SetVertical( 0, bVertLayout );
894*b1cdbd2cSJim Jagielski                 break;
895*b1cdbd2cSJim Jagielski             }
896*b1cdbd2cSJim Jagielski 
897*b1cdbd2cSJim Jagielski             // a deactivating two line attribute is on top of stack,
898*b1cdbd2cSJim Jagielski             // check if rotate attribute has to be enabled
899*b1cdbd2cSJim Jagielski             if ( bRuby )
900*b1cdbd2cSJim Jagielski                 break;
901*b1cdbd2cSJim Jagielski 
902*b1cdbd2cSJim Jagielski             sal_uInt16 nRotateStack = StackPos[ RES_CHRATR_ROTATE ];
903*b1cdbd2cSJim Jagielski             const SfxPoolItem* pRotateItem = 0;
904*b1cdbd2cSJim Jagielski             const SwTxtAttr* pRotateAttr = aAttrStack[ nRotateStack ].Top();
905*b1cdbd2cSJim Jagielski 
906*b1cdbd2cSJim Jagielski             if ( pRotateAttr )
907*b1cdbd2cSJim Jagielski             {
908*b1cdbd2cSJim Jagielski                 pRotateItem = CharFmt::GetItem( *pRotateAttr, RES_CHRATR_ROTATE );
909*b1cdbd2cSJim Jagielski                 rFnt.SetVertical( ((SvxCharRotateItem*)pRotateItem)->GetValue(),
910*b1cdbd2cSJim Jagielski                                    bVertLayout );
911*b1cdbd2cSJim Jagielski             }
912*b1cdbd2cSJim Jagielski             else
913*b1cdbd2cSJim Jagielski                 rFnt.SetVertical(
914*b1cdbd2cSJim Jagielski                     ((SvxCharRotateItem*)pDefaultArray[ nRotateStack ])->GetValue(),
915*b1cdbd2cSJim Jagielski                      bVertLayout
916*b1cdbd2cSJim Jagielski                 );
917*b1cdbd2cSJim Jagielski             break;
918*b1cdbd2cSJim Jagielski         }
919*b1cdbd2cSJim Jagielski         case RES_TXTATR_CJK_RUBY :
920*b1cdbd2cSJim Jagielski             rFnt.SetVertical( 0, bVertLayout );
921*b1cdbd2cSJim Jagielski             break;
922*b1cdbd2cSJim Jagielski         case RES_TXTATR_REFMARK :
923*b1cdbd2cSJim Jagielski             if ( bPush )
924*b1cdbd2cSJim Jagielski                 rFnt.GetRef()++;
925*b1cdbd2cSJim Jagielski             else
926*b1cdbd2cSJim Jagielski                 rFnt.GetRef()--;
927*b1cdbd2cSJim Jagielski             break;
928*b1cdbd2cSJim Jagielski         case RES_TXTATR_TOXMARK :
929*b1cdbd2cSJim Jagielski             if ( bPush )
930*b1cdbd2cSJim Jagielski                 rFnt.GetTox()++;
931*b1cdbd2cSJim Jagielski             else
932*b1cdbd2cSJim Jagielski                 rFnt.GetTox()--;
933*b1cdbd2cSJim Jagielski             break;
934*b1cdbd2cSJim Jagielski         case RES_TXTATR_META:
935*b1cdbd2cSJim Jagielski         case RES_TXTATR_METAFIELD:
936*b1cdbd2cSJim Jagielski             if ( bPush )
937*b1cdbd2cSJim Jagielski                 rFnt.GetMeta()++;
938*b1cdbd2cSJim Jagielski             else
939*b1cdbd2cSJim Jagielski                 rFnt.GetMeta()--;
940*b1cdbd2cSJim Jagielski             break;
941*b1cdbd2cSJim Jagielski         case RES_TXTATR_INPUTFIELD :
942*b1cdbd2cSJim Jagielski             if ( bPush )
943*b1cdbd2cSJim Jagielski                 rFnt.GetInputField()++;
944*b1cdbd2cSJim Jagielski             else
945*b1cdbd2cSJim Jagielski                 rFnt.GetInputField()--;
946*b1cdbd2cSJim Jagielski             break;
947*b1cdbd2cSJim Jagielski     }
948*b1cdbd2cSJim Jagielski }
949*b1cdbd2cSJim Jagielski 
950*b1cdbd2cSJim Jagielski // Takes the default font and calculated the ascent and height
GetDefaultAscentAndHeight(ViewShell * pShell,OutputDevice & rOut,sal_uInt16 & nAscent,sal_uInt16 & nHeight) const951*b1cdbd2cSJim Jagielski void SwAttrHandler::GetDefaultAscentAndHeight( ViewShell* pShell, OutputDevice& rOut,
952*b1cdbd2cSJim Jagielski                                                sal_uInt16& nAscent, sal_uInt16& nHeight ) const
953*b1cdbd2cSJim Jagielski {
954*b1cdbd2cSJim Jagielski     ASSERT( pFnt, "No font available for GetDefaultAscentAndHeight" )
955*b1cdbd2cSJim Jagielski 
956*b1cdbd2cSJim Jagielski     if ( pFnt )
957*b1cdbd2cSJim Jagielski     {
958*b1cdbd2cSJim Jagielski         SwFont aFont( *pFnt );
959*b1cdbd2cSJim Jagielski         nHeight = aFont.GetHeight( pShell, rOut );
960*b1cdbd2cSJim Jagielski         nAscent = aFont.GetAscent( pShell, rOut );
961*b1cdbd2cSJim Jagielski     }
962*b1cdbd2cSJim Jagielski }
963*b1cdbd2cSJim Jagielski 
964