xref: /AOO41X/main/cui/source/tabpages/chardlg.cxx (revision 3ce09a58b0d6873449cda31e55c66dba2dbc8f7f)
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_cui.hxx"
26 
27 // include ---------------------------------------------------------------
28 #include <editeng/unolingu.hxx>
29 #include <vcl/svapp.hxx>
30 #include <unotools/pathoptions.hxx>
31 #include <svtools/ctrltool.hxx>
32 #include <svl/sfontitm.hxx>
33 #include <sfx2/printer.hxx>
34 #include <sfx2/objsh.hxx>
35 #include <sfx2/viewsh.hxx>
36 #include <sfx2/bindings.hxx>
37 #include <sfx2/viewfrm.hxx>
38 #include <vcl/msgbox.hxx>
39 #include <svx/dialmgr.hxx>
40 #include <svx/dialogs.hrc>
41 #include <svtools/unitconv.hxx>
42 
43 #define _SVX_CHARDLG_CXX
44 #include <svl/languageoptions.hxx>
45 
46 #include <cuires.hrc>
47 #include "chardlg.hrc"
48 
49 #include <svx/xtable.hxx>       // XColorList
50 #include "chardlg.hxx"
51 #include "editeng/fontitem.hxx"
52 #include <editeng/postitem.hxx>
53 #include <editeng/udlnitem.hxx>
54 #include <editeng/crsditem.hxx>
55 #include <editeng/cntritem.hxx>
56 #include <editeng/langitem.hxx>
57 #include <editeng/wghtitem.hxx>
58 #include <editeng/fhgtitem.hxx>
59 #include <editeng/shdditem.hxx>
60 #include <editeng/escpitem.hxx>
61 #include <editeng/prszitem.hxx>
62 #include <editeng/wrlmitem.hxx>
63 #include <editeng/cmapitem.hxx>
64 #include <editeng/kernitem.hxx>
65 #include <editeng/blnkitem.hxx>
66 #include "editeng/flstitem.hxx"
67 #include <editeng/akrnitem.hxx>
68 #include <editeng/brshitem.hxx>
69 #include <editeng/colritem.hxx>
70 #include "svx/drawitem.hxx"
71 #include "svx/dlgutil.hxx"
72 #include <dialmgr.hxx>
73 #include "svx/htmlmode.hxx"
74 #include "cuicharmap.hxx"
75 #include "chardlg.h"
76 #include <editeng/emphitem.hxx>
77 #include <editeng/charreliefitem.hxx>
78 #include <editeng/twolinesitem.hxx>
79 #include <editeng/charhiddenitem.hxx>
80 #include <svl/stritem.hxx>
81 #include <editeng/charscaleitem.hxx>
82 #include <editeng/charrotateitem.hxx>
83 #include <svx/svxdlg.hxx> //CHINA001
84 #include <cuires.hrc> //CHINA001
85 #include <svl/intitem.hxx> //CHINA001
86 #include <sfx2/request.hxx> //CHINA001
87 #include "svx/flagsdef.hxx" //CHINA001
88 
89 using namespace ::com::sun::star;
90 
91 // define ----------------------------------------------------------------
92 
93 #define ISITEMSET   rSet.GetItemState(nWhich)>=SFX_ITEM_DEFAULT
94 
95 #define CLEARTITEM  rSet.InvalidateItem(nWhich)
96 
97 #define LW_NORMAL   0
98 #define LW_GESPERRT 1
99 #define LW_SCHMAL   2
100 
101 // static ----------------------------------------------------------------
102 
103 static sal_uInt16 pNameRanges[] =
104 {
105     SID_ATTR_CHAR_FONT,
106     SID_ATTR_CHAR_WEIGHT,
107     SID_ATTR_CHAR_FONTHEIGHT,
108     SID_ATTR_CHAR_FONTHEIGHT,
109     SID_ATTR_CHAR_COLOR,
110     SID_ATTR_CHAR_COLOR,
111     SID_ATTR_CHAR_LANGUAGE,
112     SID_ATTR_CHAR_LANGUAGE,
113     SID_ATTR_CHAR_CJK_FONT,
114     SID_ATTR_CHAR_CJK_WEIGHT,
115     SID_ATTR_CHAR_CTL_FONT,
116     SID_ATTR_CHAR_CTL_WEIGHT,
117     0
118 };
119 
120 static sal_uInt16 pEffectsRanges[] =
121 {
122     SID_ATTR_CHAR_SHADOWED,
123     SID_ATTR_CHAR_UNDERLINE,
124     SID_ATTR_CHAR_COLOR,
125     SID_ATTR_CHAR_COLOR,
126     SID_ATTR_CHAR_CASEMAP,
127     SID_ATTR_CHAR_CASEMAP,
128     SID_ATTR_FLASH,
129     SID_ATTR_FLASH,
130     SID_ATTR_CHAR_EMPHASISMARK,
131     SID_ATTR_CHAR_EMPHASISMARK,
132     SID_ATTR_CHAR_RELIEF,
133     SID_ATTR_CHAR_RELIEF,
134     SID_ATTR_CHAR_HIDDEN,
135     SID_ATTR_CHAR_HIDDEN,
136     SID_ATTR_CHAR_OVERLINE,
137     SID_ATTR_CHAR_OVERLINE,
138     0
139 };
140 
141 static sal_uInt16 pPositionRanges[] =
142 {
143     SID_ATTR_CHAR_KERNING,
144     SID_ATTR_CHAR_KERNING,
145     SID_ATTR_CHAR_ESCAPEMENT,
146     SID_ATTR_CHAR_ESCAPEMENT,
147     SID_ATTR_CHAR_AUTOKERN,
148     SID_ATTR_CHAR_AUTOKERN,
149     SID_ATTR_CHAR_ROTATED,
150     SID_ATTR_CHAR_SCALEWIDTH,
151     SID_ATTR_CHAR_WIDTH_FIT_TO_LINE,
152     SID_ATTR_CHAR_WIDTH_FIT_TO_LINE,
153     0
154 };
155 
156 static sal_uInt16 pTwoLinesRanges[] =
157 {
158     SID_ATTR_CHAR_TWO_LINES,
159     SID_ATTR_CHAR_TWO_LINES,
160     0
161 };
162 
163 // C-Funktion ------------------------------------------------------------
164 
StateToAttr(TriState aState)165 inline sal_Bool StateToAttr( TriState aState )
166 {
167     return ( STATE_CHECK == aState );
168 }
169 
170 // class SvxCharBasePage -------------------------------------------------
171 
GetPreviewFont()172 inline SvxFont& SvxCharBasePage::GetPreviewFont()
173 {
174     return m_aPreviewWin.GetFont();
175 }
176 
177 // -----------------------------------------------------------------------
178 
GetPreviewCJKFont()179 inline SvxFont& SvxCharBasePage::GetPreviewCJKFont()
180 {
181     return m_aPreviewWin.GetCJKFont();
182 }
183 // -----------------------------------------------------------------------
184 
GetPreviewCTLFont()185 inline SvxFont& SvxCharBasePage::GetPreviewCTLFont()
186 {
187     return m_aPreviewWin.GetCTLFont();
188 }
189 
190 // -----------------------------------------------------------------------
191 
SvxCharBasePage(Window * pParent,const ResId & rResId,const SfxItemSet & rItemset,sal_uInt16 nResIdPrewievWin,sal_uInt16 nResIdFontTypeFT)192 SvxCharBasePage::SvxCharBasePage( Window* pParent, const ResId& rResId, const SfxItemSet& rItemset,
193                                  sal_uInt16 nResIdPrewievWin, sal_uInt16 nResIdFontTypeFT ):
194     SfxTabPage( pParent, rResId, rItemset ),
195     m_aPreviewWin( this, ResId( nResIdPrewievWin, *rResId.GetResMgr() ) ),
196     m_aFontTypeFT( this, ResId( nResIdFontTypeFT, *rResId.GetResMgr() ) ),
197     m_bPreviewBackgroundToCharacter( sal_False )
198 {
199 }
200 
201 // -----------------------------------------------------------------------
202 
~SvxCharBasePage()203 SvxCharBasePage::~SvxCharBasePage()
204 {
205 }
206 
207 // -----------------------------------------------------------------------
208 
209 //void SvxCharBasePage::SetPrevFontAttributes( const SfxItemSet& rSet )
ActivatePage(const SfxItemSet & rSet)210 void SvxCharBasePage::ActivatePage( const SfxItemSet& rSet )
211 {
212     SvxFont&        rFont = GetPreviewFont();
213     SvxFont&        rCJKFont = GetPreviewCJKFont();
214     SvxFont&        rCTLFont = GetPreviewCTLFont();
215     sal_uInt16          nWhich;
216 
217     nWhich = GetWhich( SID_CHAR_DLG_PREVIEW_STRING );
218     if( ISITEMSET )
219     {
220         const SfxStringItem& rItem = ( SfxStringItem& ) rSet.Get( nWhich );
221         ::rtl::OUString aString = rItem.GetValue();
222         if( aString.getLength() != 0 )
223             m_aPreviewWin.SetPreviewText( aString );
224         else
225             m_aPreviewWin.SetFontNameAsPreviewText();
226     }
227 
228     // Underline
229     FontUnderline eUnderline;
230     nWhich = GetWhich( SID_ATTR_CHAR_UNDERLINE );
231     if( ISITEMSET )
232     {
233         const SvxUnderlineItem& rItem = ( SvxUnderlineItem& ) rSet.Get( nWhich );
234         eUnderline = ( FontUnderline ) rItem.GetValue();
235         m_aPreviewWin.SetTextLineColor( rItem.GetColor() );
236     }
237     else
238         eUnderline = UNDERLINE_NONE;
239 
240     rFont.SetUnderline( eUnderline );
241     rCJKFont.SetUnderline( eUnderline );
242     rCTLFont.SetUnderline( eUnderline );
243 
244     // Overline
245     FontUnderline eOverline;
246     nWhich = GetWhich( SID_ATTR_CHAR_OVERLINE );
247     if( ISITEMSET )
248     {
249         const SvxOverlineItem& rItem = ( SvxOverlineItem& ) rSet.Get( nWhich );
250         eOverline = ( FontUnderline ) rItem.GetValue();
251         m_aPreviewWin.SetOverlineColor( rItem.GetColor() );
252     }
253     else
254         eOverline = UNDERLINE_NONE;
255 
256     rFont.SetOverline( eOverline );
257     rCJKFont.SetOverline( eOverline );
258     rCTLFont.SetOverline( eOverline );
259 
260     //  Strikeout
261     FontStrikeout eStrikeout;
262     nWhich = GetWhich( SID_ATTR_CHAR_STRIKEOUT );
263     if( ISITEMSET )
264     {
265         const SvxCrossedOutItem& rItem = ( SvxCrossedOutItem& ) rSet.Get( nWhich );
266         eStrikeout = ( FontStrikeout ) rItem.GetValue();
267     }
268     else
269         eStrikeout = STRIKEOUT_NONE;
270 
271     rFont.SetStrikeout( eStrikeout );
272     rCJKFont.SetStrikeout( eStrikeout );
273     rCTLFont.SetStrikeout( eStrikeout );
274 
275     // WordLineMode
276     nWhich = GetWhich( SID_ATTR_CHAR_WORDLINEMODE );
277     if( ISITEMSET )
278     {
279         const SvxWordLineModeItem& rItem = ( SvxWordLineModeItem& ) rSet.Get( nWhich );
280         rFont.SetWordLineMode( rItem.GetValue() );
281         rCJKFont.SetWordLineMode( rItem.GetValue() );
282         rCTLFont.SetWordLineMode( rItem.GetValue() );
283     }
284 
285     // Emphasis
286     nWhich = GetWhich( SID_ATTR_CHAR_EMPHASISMARK );
287     if( ISITEMSET )
288     {
289         const SvxEmphasisMarkItem& rItem = ( SvxEmphasisMarkItem& ) rSet.Get( nWhich );
290         FontEmphasisMark eMark = rItem.GetEmphasisMark();
291         rFont.SetEmphasisMark( eMark );
292         rCJKFont.SetEmphasisMark( eMark );
293         rCTLFont.SetEmphasisMark( eMark );
294     }
295 
296     // Relief
297     nWhich = GetWhich( SID_ATTR_CHAR_RELIEF );
298     if( ISITEMSET )
299     {
300         const SvxCharReliefItem& rItem = ( SvxCharReliefItem& ) rSet.Get( nWhich );
301         FontRelief eFontRelief = ( FontRelief ) rItem.GetValue();
302         rFont.SetRelief( eFontRelief );
303         rCJKFont.SetRelief( eFontRelief );
304         rCTLFont.SetRelief( eFontRelief );
305     }
306 
307     // Effects
308     nWhich = GetWhich( SID_ATTR_CHAR_CASEMAP );
309     if( ISITEMSET )
310     {
311         const SvxCaseMapItem& rItem = ( SvxCaseMapItem& ) rSet.Get( nWhich );
312         SvxCaseMap eCaseMap = ( SvxCaseMap ) rItem.GetValue();
313         rFont.SetCaseMap( eCaseMap );
314         rCJKFont.SetCaseMap( eCaseMap );
315         // #i78474# small caps do not exist in CTL fonts
316         rCTLFont.SetCaseMap( eCaseMap == SVX_CASEMAP_KAPITAELCHEN ? SVX_CASEMAP_NOT_MAPPED : eCaseMap );
317     }
318 
319     // Outline
320     nWhich = GetWhich( SID_ATTR_CHAR_CONTOUR );
321     if( ISITEMSET )
322     {
323         const SvxContourItem& rItem = ( SvxContourItem& ) rSet.Get( nWhich );
324         sal_Bool bOutline = rItem.GetValue();
325         rFont.SetOutline( bOutline );
326         rCJKFont.SetOutline( bOutline );
327         rCTLFont.SetOutline( bOutline );
328     }
329 
330     // Shadow
331     nWhich = GetWhich( SID_ATTR_CHAR_SHADOWED );
332     if( ISITEMSET )
333     {
334         const SvxShadowedItem& rItem = ( SvxShadowedItem& ) rSet.Get( nWhich );
335         sal_Bool bShadow = rItem.GetValue();
336         rFont.SetShadow( bShadow );
337         rCJKFont.SetShadow( bShadow );
338         rCTLFont.SetShadow( bShadow );
339     }
340 
341     // Background
342     sal_Bool bTransparent;
343     nWhich = GetWhich( m_bPreviewBackgroundToCharacter ? SID_ATTR_BRUSH : SID_ATTR_BRUSH_CHAR );
344     if( ISITEMSET )
345     {
346          const SvxBrushItem& rBrush = ( SvxBrushItem& ) rSet.Get( nWhich );
347          const Color& rColor = rBrush.GetColor();
348          bTransparent = rColor.GetTransparency() > 0;
349          rFont.SetFillColor( rColor );
350          rCJKFont.SetFillColor( rColor );
351          rCTLFont.SetFillColor( rColor );
352     }
353     else
354         bTransparent = sal_True;
355 
356     rFont.SetTransparent( bTransparent );
357     rCJKFont.SetTransparent( bTransparent );
358     rCTLFont.SetTransparent( bTransparent );
359 
360     Color aBackCol( COL_TRANSPARENT );
361     if( !m_bPreviewBackgroundToCharacter )
362     {
363         nWhich = GetWhich( SID_ATTR_BRUSH );
364         if( ISITEMSET )
365         {
366             const SvxBrushItem& rBrush = ( SvxBrushItem& ) rSet.Get( nWhich );
367             if( GPOS_NONE == rBrush.GetGraphicPos() )
368                 aBackCol = rBrush.GetColor();
369         }
370     }
371     m_aPreviewWin.SetBackColor( aBackCol );
372 
373     // Font
374     SetPrevFont( rSet, SID_ATTR_CHAR_FONT, rFont );
375     SetPrevFont( rSet, SID_ATTR_CHAR_CJK_FONT, rCJKFont );
376     SetPrevFont( rSet, SID_ATTR_CHAR_CTL_FONT, rCTLFont );
377 
378     // Style
379     SetPrevFontStyle( rSet, SID_ATTR_CHAR_POSTURE, SID_ATTR_CHAR_WEIGHT, rFont );
380     SetPrevFontStyle( rSet, SID_ATTR_CHAR_CJK_POSTURE, SID_ATTR_CHAR_CJK_WEIGHT, rCJKFont );
381     SetPrevFontStyle( rSet, SID_ATTR_CHAR_CTL_POSTURE, SID_ATTR_CHAR_CTL_WEIGHT, rCTLFont );
382 
383     // Size
384     SetPrevFontSize( rSet, SID_ATTR_CHAR_FONTHEIGHT, rFont );
385     SetPrevFontSize( rSet, SID_ATTR_CHAR_CJK_FONTHEIGHT, rCJKFont );
386     SetPrevFontSize( rSet, SID_ATTR_CHAR_CTL_FONTHEIGHT, rCTLFont );
387 
388     // Color
389     nWhich = GetWhich( SID_ATTR_CHAR_COLOR );
390     if( ISITEMSET )
391     {
392         const SvxColorItem& rItem = ( SvxColorItem& ) rSet.Get( nWhich );
393         Color aCol( rItem.GetValue() );
394         rFont.SetColor( aCol );
395         rCJKFont.SetColor( aCol );
396         rCTLFont.SetColor( aCol );
397 
398         m_aPreviewWin.AutoCorrectFontColor();   // handle color COL_AUTO
399     }
400 
401     // Kerning
402     nWhich = GetWhich( SID_ATTR_CHAR_KERNING );
403     if( ISITEMSET )
404     {
405         const SvxKerningItem& rItem = ( SvxKerningItem& ) rSet.Get( nWhich );
406         short nKern = ( short )
407                         LogicToLogic( rItem.GetValue(), ( MapUnit ) rSet.GetPool()->GetMetric( nWhich ), MAP_TWIP );
408         rFont.SetFixKerning( nKern );
409         rCJKFont.SetFixKerning( nKern );
410         rCTLFont.SetFixKerning( nKern );
411     }
412 
413     // Escapement
414     nWhich = GetWhich( SID_ATTR_CHAR_ESCAPEMENT );
415     const sal_uInt8 nProp = 100;
416     short nEsc;
417     sal_uInt8 nEscProp;
418     if( ISITEMSET )
419     {
420         const SvxEscapementItem& rItem = ( SvxEscapementItem& ) rSet.Get( nWhich );
421         nEsc = rItem.GetEsc();
422         nEscProp = rItem.GetProp();
423 
424         if( nEsc == DFLT_ESC_AUTO_SUPER )
425             nEsc = DFLT_ESC_SUPER;
426         else if( nEsc == DFLT_ESC_AUTO_SUB )
427             nEsc = DFLT_ESC_SUB;
428     }
429     else
430     {
431         nEsc  = 0;
432         nEscProp = 100;
433     }
434 
435     SetPrevFontEscapement( nProp, nEscProp, nEsc );
436 
437     // Font width scale
438     SetPrevFontWidthScale( rSet );
439 
440     m_aPreviewWin.Invalidate();
441 }
442 
443 // -----------------------------------------------------------------------
444 
SetPrevFontSize(const SfxItemSet & rSet,sal_uInt16 nSlot,SvxFont & rFont)445 void SvxCharBasePage::SetPrevFontSize( const SfxItemSet& rSet, sal_uInt16 nSlot, SvxFont& rFont )
446 {
447     sal_uInt16 nWhich = GetWhich( nSlot );
448     long nH;
449     if( rSet.GetItemState( nWhich ) >= SFX_ITEM_SET )
450     {
451         nH = LogicToLogic(  ( ( SvxFontHeightItem& ) rSet.Get( nWhich ) ).GetHeight(),
452                             ( MapUnit ) rSet.GetPool()->GetMetric( nWhich ),
453                             MAP_TWIP );
454     }
455     else
456         nH = 240;   // as default 12pt
457 
458     rFont.SetSize( Size( 0, nH ) );
459 }
460 
461 // -----------------------------------------------------------------------
462 
SetPrevFont(const SfxItemSet & rSet,sal_uInt16 nSlot,SvxFont & rFont)463 void SvxCharBasePage::SetPrevFont( const SfxItemSet& rSet, sal_uInt16 nSlot, SvxFont& rFont )
464 {
465     sal_uInt16 nWhich = GetWhich( nSlot );
466     if( ISITEMSET )
467     {
468         const SvxFontItem& rFontItem = ( SvxFontItem& ) rSet.Get( nWhich );
469         rFont.SetFamily( rFontItem.GetFamily() );
470         rFont.SetName( rFontItem.GetFamilyName() );
471         rFont.SetPitch( rFontItem.GetPitch() );
472         rFont.SetCharSet( rFontItem.GetCharSet() );
473         rFont.SetStyleName( rFontItem.GetStyleName() );
474     }
475 }
476 
477 // -----------------------------------------------------------------------
478 
SetPrevFontStyle(const SfxItemSet & rSet,sal_uInt16 nPosture,sal_uInt16 nWeight,SvxFont & rFont)479 void SvxCharBasePage::SetPrevFontStyle( const SfxItemSet& rSet, sal_uInt16 nPosture, sal_uInt16 nWeight, SvxFont& rFont )
480 {
481     sal_uInt16 nWhich = GetWhich( nPosture );
482     if( ISITEMSET )
483     {
484         const SvxPostureItem& rItem = ( SvxPostureItem& ) rSet.Get( nWhich );
485         rFont.SetItalic( ( FontItalic ) rItem.GetValue() != ITALIC_NONE ? ITALIC_NORMAL : ITALIC_NONE );
486     }
487 
488     nWhich = GetWhich( nWeight );
489     if( ISITEMSET )
490     {
491         SvxWeightItem& rItem = ( SvxWeightItem& ) rSet.Get( nWhich );
492         rFont.SetWeight( ( FontWeight ) rItem.GetValue() != WEIGHT_NORMAL ? WEIGHT_BOLD : WEIGHT_NORMAL );
493     }
494 }
495 
496 // -----------------------------------------------------------------------
497 
SetPrevFontWidthScale(const SfxItemSet & rSet)498 void SvxCharBasePage::SetPrevFontWidthScale( const SfxItemSet& rSet )
499 {
500     sal_uInt16  nWhich = GetWhich( SID_ATTR_CHAR_SCALEWIDTH );
501     if( ISITEMSET )
502     {
503         const SvxCharScaleWidthItem&    rItem = ( SvxCharScaleWidthItem& ) rSet.Get( nWhich );
504 
505         m_aPreviewWin.SetFontWidthScale( rItem.GetValue() );
506     }
507 }
508 
509 // -----------------------------------------------------------------------
510 namespace
511 {
512     // -----------------------------------------------------------------------
setPrevFontEscapement(SvxFont & _rFont,sal_uInt8 nProp,sal_uInt8 nEscProp,short nEsc)513     void setPrevFontEscapement(SvxFont& _rFont,sal_uInt8 nProp, sal_uInt8 nEscProp, short nEsc )
514     {
515         _rFont.SetPropr( nProp );
516         _rFont.SetProprRel( nEscProp );
517         _rFont.SetEscapement( nEsc );
518     }
519     // -----------------------------------------------------------------------
520     // -----------------------------------------------------------------------
521 }
522 // -----------------------------------------------------------------------
523 
SetPrevFontEscapement(sal_uInt8 nProp,sal_uInt8 nEscProp,short nEsc)524 void SvxCharBasePage::SetPrevFontEscapement( sal_uInt8 nProp, sal_uInt8 nEscProp, short nEsc )
525 {
526     setPrevFontEscapement(GetPreviewFont(),nProp,nEscProp,nEsc);
527     setPrevFontEscapement(GetPreviewCJKFont(),nProp,nEscProp,nEsc);
528     setPrevFontEscapement(GetPreviewCTLFont(),nProp,nEscProp,nEsc);
529     m_aPreviewWin.Invalidate();
530 }
531 
532 // SvxCharNamePage_Impl --------------------------------------------------
533 
534 struct SvxCharNamePage_Impl
535 {
536     Timer           m_aUpdateTimer;
537     String          m_aNoStyleText;
538     String          m_aTransparentText;
539     const FontList* m_pFontList;
540     sal_uInt16          m_nExtraEntryPos;
541     sal_Bool            m_bMustDelete;
542     sal_Bool            m_bInSearchMode;
543 
SvxCharNamePage_ImplSvxCharNamePage_Impl544     SvxCharNamePage_Impl() :
545 
546         m_pFontList     ( NULL ),
547         m_nExtraEntryPos( LISTBOX_ENTRY_NOTFOUND ),
548         m_bMustDelete   ( sal_False ),
549         m_bInSearchMode ( sal_False )
550 
551     {
552         m_aUpdateTimer.SetTimeout( 350 );
553     }
554 
~SvxCharNamePage_ImplSvxCharNamePage_Impl555     ~SvxCharNamePage_Impl()
556     {
557         if ( m_bMustDelete )
558             delete m_pFontList;
559     }
560 };
561 
562 // class SvxCharNamePage -------------------------------------------------
563 
SvxCharNamePage(Window * pParent,const SfxItemSet & rInSet)564 SvxCharNamePage::SvxCharNamePage( Window* pParent, const SfxItemSet& rInSet ) :
565 
566     SvxCharBasePage( pParent, CUI_RES( RID_SVXPAGE_CHAR_NAME ), rInSet, WIN_CHAR_PREVIEW, FT_CHAR_FONTTYPE ),
567     m_pImpl                 ( new SvxCharNamePage_Impl )
568 {
569     m_pImpl->m_aNoStyleText = String( CUI_RES( STR_CHARNAME_NOSTYLE ) );
570     m_pImpl->m_aTransparentText = String( CUI_RES( STR_CHARNAME_TRANSPARENT ) );
571 
572     SvtLanguageOptions aLanguageOptions;
573     sal_Bool bCJK = ( aLanguageOptions.IsCJKFontEnabled() || aLanguageOptions.IsCTLFontEnabled() );
574 
575     m_pWestLine         = new FixedLine( this, CUI_RES( FL_WEST ) );
576     m_pWestFontNameFT   = new FixedText( this, CUI_RES( bCJK ? FT_WEST_NAME : FT_WEST_NAME_NOCJK ) );
577     m_pWestFontNameLB   = new FontNameBox( this, CUI_RES( bCJK ? LB_WEST_NAME : LB_WEST_NAME_NOCJK ) );
578     m_pWestFontStyleFT  = new FixedText( this, CUI_RES( bCJK ? FT_WEST_STYLE : FT_WEST_STYLE_NOCJK ) );
579     m_pWestFontStyleLB  = new FontStyleBox( this, CUI_RES( bCJK ? LB_WEST_STYLE : LB_WEST_STYLE_NOCJK ) );
580     m_pWestFontSizeFT   = new FixedText( this, CUI_RES( bCJK ? FT_WEST_SIZE : FT_WEST_SIZE_NOCJK ) );
581     m_pWestFontSizeLB   = new FontSizeBox( this, CUI_RES( bCJK ? LB_WEST_SIZE : LB_WEST_SIZE_NOCJK ) );
582 
583     if( !bCJK )
584     {
585         m_pColorFL  = new FixedLine( this, CUI_RES( FL_COLOR2 ) );
586         m_pColorFT  = new FixedText( this, CUI_RES( FT_COLOR2 ) );
587         m_pColorLB  = new ColorListBox( this, CUI_RES( LB_COLOR2 ) );
588     }
589 
590     m_pWestFontLanguageFT   = new FixedText( this, CUI_RES( bCJK ? FT_WEST_LANG : FT_WEST_LANG_NOCJK ) );
591     m_pWestFontLanguageLB   = new SvxLanguageBox( this, CUI_RES( bCJK ? LB_WEST_LANG : LB_WEST_LANG_NOCJK ) );
592 
593     m_pEastLine             = new FixedLine( this, CUI_RES( FL_EAST ) );
594     m_pEastFontNameFT       = new FixedText( this, CUI_RES( FT_EAST_NAME ) );
595     m_pEastFontNameLB       = new FontNameBox( this, CUI_RES( LB_EAST_NAME ) );
596     m_pEastFontStyleFT      = new FixedText( this, CUI_RES( FT_EAST_STYLE ) );
597     m_pEastFontStyleLB      = new FontStyleBox( this, CUI_RES( LB_EAST_STYLE ) );
598     m_pEastFontSizeFT       = new FixedText( this, CUI_RES( FT_EAST_SIZE ) );
599     m_pEastFontSizeLB       = new FontSizeBox( this, CUI_RES( LB_EAST_SIZE ) );
600     m_pEastFontLanguageFT   = new FixedText( this, CUI_RES( FT_EAST_LANG ) );
601     m_pEastFontLanguageLB   = new SvxLanguageBox( this, CUI_RES( LB_EAST_LANG ) );
602 
603     m_pCTLLine              = new FixedLine( this, CUI_RES( FL_CTL ) );
604     m_pCTLFontNameFT        = new FixedText( this, CUI_RES( FT_CTL_NAME ) );
605     m_pCTLFontNameLB        = new FontNameBox( this, CUI_RES( LB_CTL_NAME ) );
606     m_pCTLFontStyleFT       = new FixedText( this, CUI_RES( FT_CTL_STYLE ) );
607     m_pCTLFontStyleLB       = new FontStyleBox( this, CUI_RES( LB_CTL_STYLE ) );
608     m_pCTLFontSizeFT        = new FixedText( this, CUI_RES( FT_CTL_SIZE ) );
609     m_pCTLFontSizeLB        = new FontSizeBox( this, CUI_RES( LB_CTL_SIZE ) );
610     m_pCTLFontLanguageFT    = new FixedText( this, CUI_RES( FT_CTL_LANG ) );
611     m_pCTLFontLanguageLB    = new SvxLanguageBox( this, CUI_RES( LB_CTL_LANG ) );
612 
613     if( bCJK )
614     {
615         m_pColorFL  = new FixedLine( this, CUI_RES( FL_COLOR2 ) );
616         m_pColorFT  = new FixedText( this, CUI_RES( FT_COLOR2 ) );
617         m_pColorLB  = new ColorListBox( this, CUI_RES( LB_COLOR2 ) );
618     }
619 
620     m_pWestLine             ->Show( bCJK );
621     m_pColorFL              ->Show( bCJK );
622 
623     bCJK = aLanguageOptions.IsCJKFontEnabled();
624     m_pEastLine             ->Show( bCJK );
625     m_pEastFontNameFT       ->Show( bCJK );
626     m_pEastFontNameLB       ->Show( bCJK );
627     m_pEastFontStyleFT      ->Show( bCJK );
628     m_pEastFontStyleLB      ->Show( bCJK );
629     m_pEastFontSizeFT       ->Show( bCJK );
630     m_pEastFontSizeLB       ->Show( bCJK );
631     m_pEastFontLanguageFT   ->Show( bCJK );
632     m_pEastFontLanguageLB   ->Show( bCJK );
633 
634     sal_Bool bShowCTL = aLanguageOptions.IsCTLFontEnabled();
635     if ( bShowCTL && !bCJK )
636     {
637         // move CTL controls to the places of the CJK controls, if these controls aren't visible
638         m_pCTLLine             ->SetPosPixel( m_pEastLine->GetPosPixel() );
639         m_pCTLFontNameFT       ->SetPosPixel( m_pEastFontNameFT->GetPosPixel() );
640         m_pCTLFontNameLB       ->SetPosPixel( m_pEastFontNameLB->GetPosPixel() );
641         m_pCTLFontStyleFT      ->SetPosPixel( m_pEastFontStyleFT->GetPosPixel() );
642         m_pCTLFontStyleLB      ->SetPosPixel( m_pEastFontStyleLB->GetPosPixel() );
643         m_pCTLFontSizeFT       ->SetPosPixel( m_pEastFontSizeFT->GetPosPixel() );
644         m_pCTLFontSizeLB       ->SetPosPixel( m_pEastFontSizeLB->GetPosPixel() );
645         m_pCTLFontLanguageFT   ->SetPosPixel( m_pEastFontLanguageFT->GetPosPixel() );
646         m_pCTLFontLanguageLB   ->SetPosPixel( m_pEastFontLanguageLB->GetPosPixel() );
647     }
648     m_pCTLLine             ->Show( bShowCTL );
649     m_pCTLFontNameFT       ->Show( bShowCTL );
650     m_pCTLFontNameLB       ->Show( bShowCTL );
651     m_pCTLFontStyleFT      ->Show( bShowCTL );
652     m_pCTLFontStyleLB      ->Show( bShowCTL );
653     m_pCTLFontSizeFT       ->Show( bShowCTL );
654     m_pCTLFontSizeLB       ->Show( bShowCTL );
655     m_pCTLFontLanguageFT   ->Show( bShowCTL );
656     m_pCTLFontLanguageLB   ->Show( bShowCTL );
657 
658     FreeResource();
659 
660     m_pWestFontLanguageLB->SetLanguageList( LANG_LIST_WESTERN,  sal_True, sal_False, sal_True );
661     m_pEastFontLanguageLB->SetLanguageList( LANG_LIST_CJK,      sal_True, sal_False, sal_True );
662     m_pCTLFontLanguageLB->SetLanguageList( LANG_LIST_CTL,       sal_True, sal_False, sal_True );
663 
664     Initialize();
665 }
666 
667 // -----------------------------------------------------------------------
668 
~SvxCharNamePage()669 SvxCharNamePage::~SvxCharNamePage()
670 {
671     delete m_pImpl;
672 
673     delete m_pWestLine;
674     delete m_pWestFontNameFT;
675     delete m_pWestFontNameLB;
676     delete m_pWestFontStyleFT;
677     delete m_pWestFontStyleLB;
678     delete m_pWestFontSizeFT;
679     delete m_pWestFontSizeLB;
680     delete m_pWestFontLanguageFT;
681     delete m_pWestFontLanguageLB;
682 
683     delete m_pEastLine;
684     delete m_pEastFontNameFT;
685     delete m_pEastFontNameLB;
686     delete m_pEastFontStyleFT;
687     delete m_pEastFontStyleLB;
688     delete m_pEastFontSizeFT;
689     delete m_pEastFontSizeLB;
690     delete m_pEastFontLanguageFT;
691     delete m_pEastFontLanguageLB;
692 
693     delete m_pCTLLine;
694     delete m_pCTLFontNameFT;
695     delete m_pCTLFontNameLB;
696     delete m_pCTLFontStyleFT;
697     delete m_pCTLFontStyleLB;
698     delete m_pCTLFontSizeFT;
699     delete m_pCTLFontSizeLB;
700     delete m_pCTLFontLanguageFT;
701     delete m_pCTLFontLanguageLB;
702 
703     delete m_pColorFL;
704     delete m_pColorFT;
705     delete m_pColorLB;
706 }
707 
708 // -----------------------------------------------------------------------
709 
Initialize()710 void SvxCharNamePage::Initialize()
711 {
712     // to handle the changes of the other pages
713     SetExchangeSupport();
714 
715     // fill the color box
716     SfxObjectShell* pDocSh = SfxObjectShell::Current();
717     //DBG_ASSERT( pDocSh, "DocShell not found!" );
718     XColorListSharedPtr aColorTable;
719     const SfxPoolItem* pItem = NULL;
720 
721     if ( pDocSh )
722     {
723         pItem = pDocSh->GetItem( SID_COLOR_TABLE );
724         if ( pItem != NULL )
725             aColorTable = static_cast< const SvxColorTableItem* >(pItem)->GetColorTable();
726     }
727 
728     if ( !aColorTable.get() )
729     {
730         aColorTable = XPropertyListFactory::CreateSharedXColorList(SvtPathOptions().GetPalettePath());
731     }
732 
733     m_pColorLB->SetUpdateMode( sal_False );
734 
735     {
736         SfxPoolItem* pDummy;
737         SfxViewFrame* pFrame = SfxViewFrame::GetFirst( pDocSh );
738         if( !pFrame || SFX_ITEM_DEFAULT > pFrame->GetBindings().QueryState(
739                                     SID_ATTR_AUTO_COLOR_INVALID, pDummy ))
740             m_pColorLB->InsertEntry( Color( COL_AUTO ),
741                                     SVX_RESSTR( RID_SVXSTR_AUTOMATIC ));
742     }
743 
744     for ( long i = 0; i < aColorTable->Count(); i++ )
745     {
746         XColorEntry* pEntry = aColorTable->GetColor(i);
747         m_pColorLB->InsertEntry( pEntry->GetColor(), pEntry->GetName() );
748     }
749 
750     m_pColorLB->SetUpdateMode( sal_True );
751     m_pColorLB->SetSelectHdl( LINK( this, SvxCharNamePage, ColorBoxSelectHdl_Impl ) );
752 
753     Link aLink = LINK( this, SvxCharNamePage, FontModifyHdl_Impl );
754     m_pWestFontNameLB->SetModifyHdl( aLink );
755     m_pWestFontStyleLB->SetModifyHdl( aLink );
756     m_pWestFontSizeLB->SetModifyHdl( aLink );
757     m_pEastFontNameLB->SetModifyHdl( aLink );
758     m_pEastFontStyleLB->SetModifyHdl( aLink );
759     m_pEastFontSizeLB->SetModifyHdl( aLink );
760     m_pCTLFontNameLB->SetModifyHdl( aLink );
761     m_pCTLFontStyleLB->SetModifyHdl( aLink );
762     m_pCTLFontSizeLB->SetModifyHdl( aLink );
763 
764     m_pImpl->m_aUpdateTimer.SetTimeoutHdl( LINK( this, SvxCharNamePage, UpdateHdl_Impl ) );
765 
766     m_pColorFL->Hide();
767     m_pColorFT->Hide();
768     m_pColorLB->Hide();
769 }
770 
771 // -----------------------------------------------------------------------
772 
GetFontList() const773 const FontList* SvxCharNamePage::GetFontList() const
774 {
775     if ( !m_pImpl->m_pFontList )
776     {
777         SfxObjectShell* pDocSh = SfxObjectShell::Current();
778         const SfxPoolItem* pItem;
779 
780         /* #110771# SvxFontListItem::GetFontList can return NULL */
781         if ( pDocSh )
782         {
783             pItem = pDocSh->GetItem( SID_ATTR_CHAR_FONTLIST );
784             if ( pItem != NULL )
785             {
786                 DBG_ASSERT(NULL != ( (SvxFontListItem*)pItem )->GetFontList(),
787                            "Where is the font list?");
788                     m_pImpl->m_pFontList =  static_cast<const SvxFontListItem*>(pItem )->GetFontList()->Clone();
789                 m_pImpl->m_bMustDelete = sal_True;
790             }
791         }
792         if(!m_pImpl->m_pFontList)
793         {
794             m_pImpl->m_pFontList =
795                 new FontList( Application::GetDefaultDevice() );
796             m_pImpl->m_bMustDelete = sal_True;
797         }
798     }
799 
800     return m_pImpl->m_pFontList;
801 }
802 
803 // -----------------------------------------------------------------------------
804 namespace
805 {
calcFontInfo(SvxFont & _rFont,SvxCharNamePage * _pPage,const FontNameBox * _pFontNameLB,const FontStyleBox * _pFontStyleLB,const FontSizeBox * _pFontSizeLB,const FontList * _pFontList,sal_uInt16 _nFontWhich,sal_uInt16 _nFontHeightWhich)806     FontInfo calcFontInfo(  SvxFont& _rFont,
807                     SvxCharNamePage* _pPage,
808                     const FontNameBox* _pFontNameLB,
809                     const FontStyleBox* _pFontStyleLB,
810                     const FontSizeBox* _pFontSizeLB,
811                     const FontList* _pFontList,
812                     sal_uInt16 _nFontWhich,
813                     sal_uInt16 _nFontHeightWhich)
814     {
815         Size aSize = _rFont.GetSize();
816         aSize.Width() = 0;
817         FontInfo aFontInfo;
818         String sFontName(_pFontNameLB->GetText());
819         sal_Bool bFontAvailable = _pFontList->IsAvailable( sFontName );
820         if(bFontAvailable  || _pFontNameLB->GetSavedValue() != sFontName)
821             aFontInfo = _pFontList->Get( sFontName, _pFontStyleLB->GetText() );
822         else
823         {
824             //get the font from itemset
825             SfxItemState eState = _pPage->GetItemSet().GetItemState( _nFontWhich );
826             if ( eState >= SFX_ITEM_DEFAULT )
827             {
828                 const SvxFontItem* pFontItem = (const SvxFontItem*)&( _pPage->GetItemSet().Get( _nFontWhich ) );
829                 aFontInfo.SetName(pFontItem->GetFamilyName());
830                 aFontInfo.SetStyleName(pFontItem->GetStyleName());
831                 aFontInfo.SetFamily(pFontItem->GetFamily());
832                 aFontInfo.SetPitch(pFontItem->GetPitch());
833                 aFontInfo.SetCharSet(pFontItem->GetCharSet());
834             }
835         }
836         if ( _pFontSizeLB->IsRelative() )
837         {
838             DBG_ASSERT( _pPage->GetItemSet().GetParent(), "No parent set" );
839             const SvxFontHeightItem& rOldItem = (SvxFontHeightItem&)_pPage->GetItemSet().GetParent()->Get( _nFontHeightWhich );
840 
841             // alter Wert, skaliert
842             long nHeight;
843             if ( _pFontSizeLB->IsPtRelative() )
844                 nHeight = rOldItem.GetHeight() + PointToTwips( static_cast<long>(_pFontSizeLB->GetValue() / 10) );
845             else
846                 nHeight = static_cast<long>(rOldItem.GetHeight() * _pFontSizeLB->GetValue() / 100);
847 
848             // Umrechnung in twips fuer das Beispiel-Window
849             aSize.Height() =
850                 ItemToControl( nHeight, _pPage->GetItemSet().GetPool()->GetMetric( _nFontHeightWhich ), SFX_FUNIT_TWIP );
851         }
852         else if ( _pFontSizeLB->GetText().Len() )
853             aSize.Height() = PointToTwips( static_cast<long>(_pFontSizeLB->GetValue() / 10) );
854         else
855             aSize.Height() = 200;   // default 10pt
856         aFontInfo.SetSize( aSize );
857 
858         _rFont.SetFamily( aFontInfo.GetFamily() );
859         _rFont.SetName( aFontInfo.GetName() );
860         _rFont.SetStyleName( aFontInfo.GetStyleName() );
861         _rFont.SetPitch( aFontInfo.GetPitch() );
862         _rFont.SetCharSet( aFontInfo.GetCharSet() );
863         _rFont.SetWeight( aFontInfo.GetWeight() );
864         _rFont.SetItalic( aFontInfo.GetItalic() );
865         _rFont.SetSize( aFontInfo.GetSize() );
866 
867         return aFontInfo;
868     }
869 }
870 
871 // -----------------------------------------------------------------------
872 
UpdatePreview_Impl()873 void SvxCharNamePage::UpdatePreview_Impl()
874 {
875     SvxFont& rFont = GetPreviewFont();
876     SvxFont& rCJKFont = GetPreviewCJKFont();
877     SvxFont& rCTLFont = GetPreviewCTLFont();
878     // Size
879     Size aSize = rFont.GetSize();
880     aSize.Width() = 0;
881     Size aCJKSize = rCJKFont.GetSize();
882     aCJKSize.Width() = 0;
883     Size aCTLSize = rCTLFont.GetSize();
884     aCTLSize.Width() = 0;
885     // Font
886     const FontList* pFontList = GetFontList();
887     FontInfo aFontInfo =
888         calcFontInfo(rFont,this,m_pWestFontNameLB,m_pWestFontStyleLB,m_pWestFontSizeLB,pFontList,GetWhich( SID_ATTR_CHAR_FONT ),GetWhich( SID_ATTR_CHAR_FONTHEIGHT ));
889 
890     calcFontInfo(rCJKFont,this,m_pEastFontNameLB,m_pEastFontStyleLB,m_pEastFontSizeLB,pFontList,GetWhich( SID_ATTR_CHAR_CJK_FONT ),GetWhich( SID_ATTR_CHAR_CJK_FONTHEIGHT ));
891 
892     calcFontInfo(rCTLFont,this,m_pCTLFontNameLB,m_pCTLFontStyleLB,m_pCTLFontSizeLB,pFontList,GetWhich( SID_ATTR_CHAR_CTL_FONT ),GetWhich( SID_ATTR_CHAR_CTL_FONTHEIGHT ));
893 
894     m_aPreviewWin.Invalidate();
895     m_aFontTypeFT.SetText( pFontList->GetFontMapText( aFontInfo ) );
896 }
897 
898 // -----------------------------------------------------------------------
899 
FillStyleBox_Impl(const FontNameBox * pNameBox)900 void SvxCharNamePage::FillStyleBox_Impl( const FontNameBox* pNameBox )
901 {
902     const FontList* pFontList = GetFontList();
903     DBG_ASSERT( pFontList, "no fontlist" );
904 
905     FontStyleBox* pStyleBox = NULL;
906 
907     if ( m_pWestFontNameLB == pNameBox )
908         pStyleBox = m_pWestFontStyleLB;
909     else if ( m_pEastFontNameLB == pNameBox )
910         pStyleBox = m_pEastFontStyleLB;
911     else if ( m_pCTLFontNameLB == pNameBox )
912         pStyleBox = m_pCTLFontStyleLB;
913     else
914     {
915         DBG_ERRORFILE( "invalid font name box" );
916     }
917 
918     pStyleBox->Fill( pNameBox->GetText(), pFontList );
919 
920     if ( m_pImpl->m_bInSearchMode )
921     {
922         // Bei der Suche zus"atzliche Eintr"age:
923         // "Nicht Fett" und "Nicht Kursiv"
924         String aEntry = m_pImpl->m_aNoStyleText;
925         const sal_Char sS[] = "%1";
926         aEntry.SearchAndReplaceAscii( sS, pFontList->GetBoldStr() );
927         m_pImpl->m_nExtraEntryPos = pStyleBox->InsertEntry( aEntry );
928         aEntry = m_pImpl->m_aNoStyleText;
929         aEntry.SearchAndReplaceAscii( sS, pFontList->GetItalicStr() );
930         pStyleBox->InsertEntry( aEntry );
931     }
932 }
933 
934 // -----------------------------------------------------------------------
935 
FillSizeBox_Impl(const FontNameBox * pNameBox)936 void SvxCharNamePage::FillSizeBox_Impl( const FontNameBox* pNameBox )
937 {
938     const FontList* pFontList = GetFontList();
939     DBG_ASSERT( pFontList, "no fontlist" );
940 
941     FontStyleBox* pStyleBox = NULL;
942     FontSizeBox* pSizeBox = NULL;
943 
944     if ( m_pWestFontNameLB == pNameBox )
945     {
946         pStyleBox = m_pWestFontStyleLB;
947         pSizeBox = m_pWestFontSizeLB;
948     }
949     else if ( m_pEastFontNameLB == pNameBox )
950     {
951         pStyleBox = m_pEastFontStyleLB;
952         pSizeBox = m_pEastFontSizeLB;
953     }
954     else if ( m_pCTLFontNameLB == pNameBox )
955     {
956         pStyleBox = m_pCTLFontStyleLB;
957         pSizeBox = m_pCTLFontSizeLB;
958     }
959     else
960     {
961         DBG_ERRORFILE( "invalid font name box" );
962     }
963 
964     FontInfo _aFontInfo( pFontList->Get( pNameBox->GetText(), pStyleBox->GetText() ) );
965     pSizeBox->Fill( &_aFontInfo, pFontList );
966 }
967 
968 // -----------------------------------------------------------------------
969 
Reset_Impl(const SfxItemSet & rSet,LanguageGroup eLangGrp)970 void SvxCharNamePage::Reset_Impl( const SfxItemSet& rSet, LanguageGroup eLangGrp )
971 {
972     FixedText* pNameLabel = NULL;
973     FontNameBox* pNameBox = NULL;
974     FixedText* pStyleLabel = NULL;
975     FontStyleBox* pStyleBox = NULL;
976     FixedText* pSizeLabel = NULL;
977     FontSizeBox* pSizeBox = NULL;
978     FixedText* pLangFT = NULL;
979     SvxLanguageBox* pLangBox = NULL;
980     sal_uInt16 nWhich = 0;
981 
982     switch ( eLangGrp )
983     {
984         case Western :
985             pNameLabel = m_pWestFontNameFT;
986             pNameBox = m_pWestFontNameLB;
987             pStyleLabel = m_pWestFontStyleFT;
988             pStyleBox = m_pWestFontStyleLB;
989             pSizeLabel = m_pWestFontSizeFT;
990             pSizeBox = m_pWestFontSizeLB;
991             pLangFT = m_pWestFontLanguageFT;
992             pLangBox = m_pWestFontLanguageLB;
993             nWhich = GetWhich( SID_ATTR_CHAR_FONT );
994             break;
995 
996         case Asian :
997             pNameLabel = m_pEastFontNameFT;
998             pNameBox = m_pEastFontNameLB;
999             pStyleLabel = m_pEastFontStyleFT;
1000             pStyleBox = m_pEastFontStyleLB;
1001             pSizeLabel = m_pEastFontSizeFT;
1002             pSizeBox = m_pEastFontSizeLB;
1003             pLangFT = m_pEastFontLanguageFT;
1004             pLangBox = m_pEastFontLanguageLB;
1005             nWhich = GetWhich( SID_ATTR_CHAR_CJK_FONT );
1006             break;
1007 
1008         case Ctl :
1009             pNameLabel = m_pCTLFontNameFT;
1010             pNameBox = m_pCTLFontNameLB;
1011             pStyleLabel = m_pCTLFontStyleFT;
1012             pStyleBox = m_pCTLFontStyleLB;
1013             pSizeLabel = m_pCTLFontSizeFT;
1014             pSizeBox = m_pCTLFontSizeLB;
1015             pLangFT = m_pCTLFontLanguageFT;
1016             pLangBox = m_pCTLFontLanguageLB;
1017             nWhich = GetWhich( SID_ATTR_CHAR_CTL_FONT );
1018             break;
1019     }
1020 
1021     // die FontListBox fuellen
1022     const FontList* pFontList = GetFontList();
1023     pNameBox->Fill( pFontList );
1024 
1025     // Font ermitteln
1026     const SvxFontItem* pFontItem = NULL;
1027     SfxItemState eState = rSet.GetItemState( nWhich );
1028 
1029     if ( eState >= SFX_ITEM_DEFAULT )
1030     {
1031         pFontItem = (const SvxFontItem*)&( rSet.Get( nWhich ) );
1032         pNameBox->SetText( pFontItem->GetFamilyName() );
1033     }
1034     else
1035     {
1036         pNameBox->SetText( String() );
1037     }
1038 
1039     FillStyleBox_Impl( pNameBox );
1040 
1041     FASTBOOL bStyle = sal_False;
1042     FASTBOOL bStyleAvailable = sal_True;
1043     FontItalic eItalic = ITALIC_NONE;
1044     FontWeight eWeight = WEIGHT_NORMAL;
1045     switch ( eLangGrp )
1046     {
1047         case Western : nWhich = GetWhich( SID_ATTR_CHAR_POSTURE ); break;
1048         case Asian : nWhich = GetWhich( SID_ATTR_CHAR_CJK_POSTURE ); break;
1049         case Ctl : nWhich = GetWhich( SID_ATTR_CHAR_CTL_POSTURE ); break;
1050     }
1051     eState = rSet.GetItemState( nWhich );
1052 
1053     if ( eState >= SFX_ITEM_DEFAULT )
1054     {
1055         const SvxPostureItem& rItem = (SvxPostureItem&)rSet.Get( nWhich );
1056         eItalic = (FontItalic)rItem.GetValue();
1057         bStyle = sal_True;
1058     }
1059     bStyleAvailable = bStyleAvailable && (eState >= SFX_ITEM_DONTCARE);
1060 
1061     switch ( eLangGrp )
1062     {
1063         case Western : nWhich = GetWhich( SID_ATTR_CHAR_WEIGHT ); break;
1064         case Asian : nWhich = GetWhich( SID_ATTR_CHAR_CJK_WEIGHT ); break;
1065         case Ctl : nWhich = GetWhich( SID_ATTR_CHAR_CTL_WEIGHT ); break;
1066     }
1067     eState = rSet.GetItemState( nWhich );
1068 
1069     if ( eState >= SFX_ITEM_DEFAULT )
1070     {
1071         SvxWeightItem& rItem = (SvxWeightItem&)rSet.Get( nWhich );
1072         eWeight = (FontWeight)rItem.GetValue();
1073     }
1074     else
1075         bStyle = sal_False;
1076     bStyleAvailable = bStyleAvailable && (eState >= SFX_ITEM_DONTCARE);
1077 
1078     // Aktuell eingestellter Font
1079     if ( bStyle && pFontItem )
1080     {
1081         FontInfo aInfo = pFontList->Get( pFontItem->GetFamilyName(), eWeight, eItalic );
1082         pStyleBox->SetText( pFontList->GetStyleName( aInfo ) );
1083     }
1084     else if ( !m_pImpl->m_bInSearchMode || !bStyle )
1085     {
1086         pStyleBox->SetText( String() );
1087     }
1088     else if ( bStyle )
1089     {
1090         FontInfo aInfo = pFontList->Get( String(), eWeight, eItalic );
1091         pStyleBox->SetText( pFontList->GetStyleName( aInfo ) );
1092     }
1093     if (!bStyleAvailable)
1094     {
1095         pStyleBox->Disable( );
1096         pStyleLabel->Disable( );
1097     }
1098 
1099     // SizeBox fuellen
1100     FillSizeBox_Impl( pNameBox );
1101     switch ( eLangGrp )
1102     {
1103         case Western : nWhich = GetWhich( SID_ATTR_CHAR_FONTHEIGHT ); break;
1104         case Asian : nWhich = GetWhich( SID_ATTR_CHAR_CJK_FONTHEIGHT ); break;
1105         case Ctl : nWhich = GetWhich( SID_ATTR_CHAR_CTL_FONTHEIGHT ); break;
1106     }
1107     eState = rSet.GetItemState( nWhich );
1108 
1109     if ( pSizeBox->IsRelativeMode() )
1110     {
1111         SfxMapUnit eUnit = rSet.GetPool()->GetMetric( nWhich );
1112         const SvxFontHeightItem& rItem = (SvxFontHeightItem&)rSet.Get( nWhich );
1113 
1114         if( rItem.GetProp() != 100 || SFX_MAPUNIT_RELATIVE != rItem.GetPropUnit() )
1115         {
1116             sal_Bool bPtRel = SFX_MAPUNIT_POINT == rItem.GetPropUnit();
1117             pSizeBox->SetPtRelative( bPtRel );
1118             pSizeBox->SetValue( bPtRel ? ((short)rItem.GetProp()) * 10 : rItem.GetProp() );
1119         }
1120         else
1121         {
1122             pSizeBox->SetRelative();
1123             pSizeBox->SetValue( (long)CalcToPoint( rItem.GetHeight(), eUnit, 10 ) );
1124         }
1125     }
1126     else if ( eState >= SFX_ITEM_DEFAULT )
1127     {
1128         SfxMapUnit eUnit = rSet.GetPool()->GetMetric( nWhich );
1129         const SvxFontHeightItem& rItem = (SvxFontHeightItem&)rSet.Get( nWhich );
1130         pSizeBox->SetValue( (long)CalcToPoint( rItem.GetHeight(), eUnit, 10 ) );
1131     }
1132     else
1133     {
1134         pSizeBox->SetText( String() );
1135         if ( eState <= SFX_ITEM_READONLY )
1136         {
1137             pSizeBox->Disable( );
1138             pSizeLabel->Disable( );
1139         }
1140     }
1141 
1142     switch ( eLangGrp )
1143     {
1144         case Western : nWhich = GetWhich( SID_ATTR_CHAR_LANGUAGE ); break;
1145         case Asian : nWhich = GetWhich( SID_ATTR_CHAR_CJK_LANGUAGE ); break;
1146         case Ctl : nWhich = GetWhich( SID_ATTR_CHAR_CTL_LANGUAGE ); break;
1147     }
1148     pLangBox->SetNoSelection();
1149     eState = rSet.GetItemState( nWhich );
1150 
1151     switch ( eState )
1152     {
1153         case SFX_ITEM_UNKNOWN:
1154             pLangFT->Hide();
1155             pLangBox->Hide();
1156             break;
1157 
1158         case SFX_ITEM_DISABLED:
1159         case SFX_ITEM_READONLY:
1160             pLangFT->Disable();
1161             pLangBox->Disable();
1162             break;
1163 
1164         case SFX_ITEM_DEFAULT:
1165         case SFX_ITEM_SET:
1166         {
1167             const SvxLanguageItem& rItem = (SvxLanguageItem&)rSet.Get( nWhich );
1168             LanguageType eLangType = (LanguageType)rItem.GetValue();
1169             DBG_ASSERT( eLangType != LANGUAGE_SYSTEM, "LANGUAGE_SYSTEM not allowed" );
1170             if ( eLangType != LANGUAGE_DONTKNOW )
1171                 pLangBox->SelectLanguage( eLangType );
1172             break;
1173         }
1174     }
1175 
1176     if ( Western == eLangGrp )
1177         m_aFontTypeFT.SetText( pFontList->GetFontMapText(
1178             pFontList->Get( pNameBox->GetText(), pStyleBox->GetText() ) ) );
1179 
1180     // save these settings
1181     pNameBox->SaveValue();
1182     pStyleBox->SaveValue();
1183     pSizeBox->SaveValue();
1184     pLangBox->SaveValue();
1185 }
1186 
1187 // -----------------------------------------------------------------------
1188 
FillItemSet_Impl(SfxItemSet & rSet,LanguageGroup eLangGrp)1189 sal_Bool SvxCharNamePage::FillItemSet_Impl( SfxItemSet& rSet, LanguageGroup eLangGrp )
1190 {
1191     sal_Bool bModified = sal_False;
1192 
1193     FontNameBox* pNameBox = NULL;
1194     FontStyleBox* pStyleBox = NULL;
1195     FontSizeBox* pSizeBox = NULL;
1196     SvxLanguageBox* pLangBox = NULL;
1197     sal_uInt16 nWhich = 0;
1198     sal_uInt16 nSlot = 0;
1199 
1200     switch ( eLangGrp )
1201     {
1202         case Western :
1203             pNameBox = m_pWestFontNameLB;
1204             pStyleBox = m_pWestFontStyleLB;
1205             pSizeBox = m_pWestFontSizeLB;
1206             pLangBox = m_pWestFontLanguageLB;
1207             nSlot = SID_ATTR_CHAR_FONT;
1208             break;
1209 
1210         case Asian :
1211             pNameBox = m_pEastFontNameLB;
1212             pStyleBox = m_pEastFontStyleLB;
1213             pSizeBox = m_pEastFontSizeLB;
1214             pLangBox = m_pEastFontLanguageLB;
1215             nSlot = SID_ATTR_CHAR_CJK_FONT;
1216             break;
1217 
1218         case Ctl :
1219             pNameBox = m_pCTLFontNameLB;
1220             pStyleBox = m_pCTLFontStyleLB;
1221             pSizeBox = m_pCTLFontSizeLB;
1222             pLangBox = m_pCTLFontLanguageLB;
1223             nSlot = SID_ATTR_CHAR_CTL_FONT;
1224             break;
1225     }
1226 
1227     nWhich = GetWhich( nSlot );
1228     const SfxPoolItem* pItem = NULL;
1229     const SfxItemSet& rOldSet = GetItemSet();
1230     const SfxPoolItem* pOld = NULL;
1231 
1232     const SfxItemSet* pExampleSet = GetTabDialog() ? GetTabDialog()->GetExampleSet() : NULL;
1233 
1234     FASTBOOL bChanged = sal_True;
1235     const String& rFontName  = pNameBox->GetText();
1236     const FontList* pFontList = GetFontList();
1237     String aStyleBoxText =pStyleBox->GetText();
1238     sal_uInt16 nEntryPos = pStyleBox->GetEntryPos( aStyleBoxText );
1239     if ( nEntryPos >= m_pImpl->m_nExtraEntryPos )
1240         aStyleBoxText.Erase();
1241     FontInfo aInfo( pFontList->Get( rFontName, aStyleBoxText ) );
1242     SvxFontItem aFontItem( aInfo.GetFamily(), aInfo.GetName(), aInfo.GetStyleName(),
1243                            aInfo.GetPitch(), aInfo.GetCharSet(), nWhich );
1244     pOld = GetOldItem( rSet, nSlot );
1245 
1246     if ( pOld )
1247     {
1248         const SvxFontItem& rItem = *( (const SvxFontItem*)pOld );
1249 
1250         if ( rItem.GetFamilyName() == aFontItem.GetFamilyName() )
1251             bChanged = sal_False;
1252     }
1253 
1254     if ( !bChanged )
1255         bChanged = !pNameBox->GetSavedValue().Len();
1256 
1257     if ( !bChanged && pExampleSet &&
1258          pExampleSet->GetItemState( nWhich, sal_False, &pItem ) == SFX_ITEM_SET &&
1259          ( (SvxFontItem*)pItem )->GetFamilyName() != aFontItem.GetFamilyName() )
1260         bChanged = sal_True;
1261 
1262     if ( bChanged && rFontName.Len() )
1263     {
1264         rSet.Put( aFontItem );
1265         bModified |= sal_True;
1266     }
1267     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
1268         rSet.ClearItem( nWhich );
1269 
1270 
1271     bChanged = sal_True;
1272     switch ( eLangGrp )
1273     {
1274         case Western : nSlot = SID_ATTR_CHAR_WEIGHT; break;
1275         case Asian : nSlot = SID_ATTR_CHAR_CJK_WEIGHT; break;
1276         case Ctl : nSlot = SID_ATTR_CHAR_CTL_WEIGHT; break;
1277     }
1278     nWhich = GetWhich( nSlot );
1279     FontWeight eWeight = aInfo.GetWeight();
1280     if ( nEntryPos >= m_pImpl->m_nExtraEntryPos )
1281         eWeight = WEIGHT_NORMAL;
1282     SvxWeightItem aWeightItem( eWeight, nWhich );
1283     pOld = GetOldItem( rSet, nSlot );
1284 
1285     if ( pOld )
1286     {
1287         const SvxWeightItem& rItem = *( (const SvxWeightItem*)pOld );
1288 
1289         if ( rItem.GetValue() == aWeightItem.GetValue() )
1290             bChanged = sal_False;
1291     }
1292 
1293     if ( !bChanged )
1294     {
1295         bChanged = !pStyleBox->GetSavedValue().Len();
1296 
1297         if ( m_pImpl->m_bInSearchMode && bChanged &&
1298              aInfo.GetWeight() == WEIGHT_NORMAL && aInfo.GetItalic() != ITALIC_NONE )
1299             bChanged = sal_False;
1300     }
1301 
1302     if ( !bChanged && pExampleSet &&
1303          pExampleSet->GetItemState( nWhich, sal_False, &pItem ) == SFX_ITEM_SET &&
1304          ( (SvxWeightItem*)pItem )->GetValue() != aWeightItem.GetValue() )
1305         bChanged = sal_True;
1306 
1307     if ( nEntryPos >= m_pImpl->m_nExtraEntryPos )
1308         bChanged = ( nEntryPos == m_pImpl->m_nExtraEntryPos );
1309 
1310     String aText( pStyleBox->GetText() ); // Tristate, dann Text leer
1311 
1312     if ( bChanged && aText.Len() )
1313     {
1314         rSet.Put( aWeightItem );
1315         bModified |= sal_True;
1316     }
1317     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
1318         CLEARTITEM;
1319 
1320     bChanged = sal_True;
1321     switch ( eLangGrp )
1322     {
1323         case Western : nSlot = SID_ATTR_CHAR_POSTURE; break;
1324         case Asian : nSlot = SID_ATTR_CHAR_CJK_POSTURE; break;
1325         case Ctl : nSlot = SID_ATTR_CHAR_CTL_POSTURE; break;
1326     }
1327     nWhich = GetWhich( nSlot );
1328     FontItalic eItalic = aInfo.GetItalic();
1329     if ( nEntryPos >= m_pImpl->m_nExtraEntryPos )
1330         eItalic = ITALIC_NONE;
1331     SvxPostureItem aPostureItem( eItalic, nWhich );
1332     pOld = GetOldItem( rSet, nSlot );
1333 
1334     if ( pOld )
1335     {
1336         const SvxPostureItem& rItem = *( (const SvxPostureItem*)pOld );
1337 
1338         if ( rItem.GetValue() == aPostureItem.GetValue() )
1339             bChanged = sal_False;
1340     }
1341 
1342     if ( !bChanged )
1343     {
1344         bChanged = !pStyleBox->GetSavedValue().Len();
1345 
1346         if ( m_pImpl->m_bInSearchMode && bChanged &&
1347              aInfo.GetItalic() == ITALIC_NONE && aInfo.GetWeight() != WEIGHT_NORMAL )
1348             bChanged = sal_False;
1349     }
1350 
1351     if ( !bChanged && pExampleSet &&
1352          pExampleSet->GetItemState( nWhich, sal_False, &pItem ) == SFX_ITEM_SET &&
1353          ( (SvxPostureItem*)pItem )->GetValue() != aPostureItem.GetValue() )
1354         bChanged = sal_True;
1355 
1356     if ( nEntryPos >= m_pImpl->m_nExtraEntryPos )
1357         bChanged = ( nEntryPos == ( m_pImpl->m_nExtraEntryPos + 1 ) );
1358 
1359     if ( bChanged && aText.Len() )
1360     {
1361         rSet.Put( aPostureItem );
1362         bModified |= sal_True;
1363     }
1364     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
1365         CLEARTITEM;
1366 
1367     // FontSize
1368     long nSize = static_cast<long>(pSizeBox->GetValue());
1369 
1370     if ( !pSizeBox->GetText().Len() )   // GetValue() gibt dann Min-Wert zurueck
1371         nSize = 0;
1372     long nSavedSize = pSizeBox->GetSavedValue().ToInt32();
1373     FASTBOOL bRel = sal_True;
1374 
1375     if ( !pSizeBox->IsRelative() )
1376     {
1377         nSavedSize *= 10;
1378         bRel = sal_False;
1379     }
1380 
1381     switch ( eLangGrp )
1382     {
1383         case Western : nSlot = SID_ATTR_CHAR_FONTHEIGHT; break;
1384         case Asian : nSlot = SID_ATTR_CHAR_CJK_FONTHEIGHT; break;
1385         case Ctl : nSlot = SID_ATTR_CHAR_CTL_FONTHEIGHT; break;
1386     }
1387     nWhich = GetWhich( nSlot );
1388     const SvxFontHeightItem* pOldHeight = (const SvxFontHeightItem*)GetOldItem( rSet, nSlot );
1389     bChanged = ( nSize != nSavedSize );
1390 
1391     if ( !bChanged && pExampleSet &&
1392          pExampleSet->GetItemState( nWhich, sal_False, &pItem ) == SFX_ITEM_SET )
1393     {
1394         float fSize = (float)nSize / 10;
1395         long nVal = CalcToUnit( fSize, rSet.GetPool()->GetMetric( nWhich ) );
1396         if ( ( (SvxFontHeightItem*)pItem )->GetHeight() != (sal_uInt32)nVal )
1397             bChanged = sal_True;
1398     }
1399 
1400     if ( bChanged || !pOldHeight ||
1401          bRel != ( SFX_MAPUNIT_RELATIVE != pOldHeight->GetPropUnit() || 100 != pOldHeight->GetProp() ) )
1402     {
1403         SfxMapUnit eUnit = rSet.GetPool()->GetMetric( nWhich );
1404         if ( pSizeBox->IsRelative() )
1405         {
1406             DBG_ASSERT( GetItemSet().GetParent(), "No parent set" );
1407             const SvxFontHeightItem& rOldItem =
1408                 (const SvxFontHeightItem&)GetItemSet().GetParent()->Get( nWhich );
1409 
1410             SvxFontHeightItem aHeight( 240, 100, nWhich );
1411             if ( pSizeBox->IsPtRelative() )
1412                 aHeight.SetHeight( rOldItem.GetHeight(), (sal_uInt16)( nSize / 10 ), SFX_MAPUNIT_POINT, eUnit );
1413             else
1414                 aHeight.SetHeight( rOldItem.GetHeight(), (sal_uInt16)nSize, SFX_MAPUNIT_RELATIVE );
1415             rSet.Put( aHeight );
1416         }
1417         else
1418         {
1419             float fSize = (float)nSize / 10;
1420             rSet.Put( SvxFontHeightItem( CalcToUnit( fSize, eUnit ), 100, nWhich ) );
1421         }
1422         bModified |= sal_True;
1423     }
1424     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
1425         CLEARTITEM;
1426 
1427     bChanged = sal_True;
1428     switch ( eLangGrp )
1429     {
1430         case Western : nSlot = SID_ATTR_CHAR_LANGUAGE; break;
1431         case Asian : nSlot = SID_ATTR_CHAR_CJK_LANGUAGE; break;
1432         case Ctl : nSlot = SID_ATTR_CHAR_CTL_LANGUAGE; break;
1433     }
1434     nWhich = GetWhich( nSlot );
1435     pOld = GetOldItem( rSet, nSlot );
1436     sal_uInt16 nLangPos = pLangBox->GetSelectEntryPos();
1437     LanguageType eLangType = (LanguageType)(sal_uLong)pLangBox->GetEntryData( nLangPos );
1438 
1439     if ( pOld )
1440     {
1441         const SvxLanguageItem& rItem = *( (const SvxLanguageItem*)pOld );
1442 
1443         if ( nLangPos == LISTBOX_ENTRY_NOTFOUND || eLangType == (LanguageType)rItem.GetValue() )
1444             bChanged = sal_False;
1445     }
1446 
1447     if ( !bChanged )
1448         bChanged = ( pLangBox->GetSavedValue() == LISTBOX_ENTRY_NOTFOUND );
1449 
1450     if ( bChanged && nLangPos != LISTBOX_ENTRY_NOTFOUND )
1451     {
1452         rSet.Put( SvxLanguageItem( eLangType, nWhich ) );
1453         bModified |= sal_True;
1454     }
1455     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
1456         CLEARTITEM;
1457 
1458     return bModified;
1459 }
1460 
1461 // -----------------------------------------------------------------------
1462 
ResetColor_Impl(const SfxItemSet & rSet)1463 void SvxCharNamePage::ResetColor_Impl( const SfxItemSet& rSet )
1464 {
1465     sal_uInt16 nWhich = GetWhich( SID_ATTR_CHAR_COLOR );
1466     SfxItemState eState = rSet.GetItemState( nWhich );
1467 
1468     switch ( eState )
1469     {
1470         case SFX_ITEM_UNKNOWN:
1471             m_pColorLB->Hide();
1472             break;
1473 
1474         case SFX_ITEM_DISABLED:
1475         case SFX_ITEM_READONLY:
1476             m_pColorLB->Disable();
1477             break;
1478 
1479         case SFX_ITEM_DONTCARE:
1480             m_pColorLB->SetNoSelection();
1481             break;
1482 
1483         case SFX_ITEM_DEFAULT:
1484         case SFX_ITEM_SET:
1485         {
1486             SvxFont& rFont = GetPreviewFont();
1487             SvxFont& rCJKFont = GetPreviewCJKFont();
1488             SvxFont& rCTLFont = GetPreviewCTLFont();
1489             const SvxColorItem& rItem = (SvxColorItem&)rSet.Get( nWhich );
1490             Color aColor = rItem.GetValue();
1491             rFont.SetColor( aColor.GetColor() == COL_AUTO ? Color(COL_BLACK) : aColor );
1492             rCJKFont.SetColor( aColor.GetColor() == COL_AUTO ? Color(COL_BLACK) : aColor );
1493             rCTLFont.SetColor( aColor.GetColor() == COL_AUTO ? Color(COL_BLACK) : aColor );
1494             m_aPreviewWin.Invalidate();
1495             sal_uInt16 nSelPos = m_pColorLB->GetEntryPos( aColor );
1496             if ( nSelPos == LISTBOX_ENTRY_NOTFOUND && aColor == Color( COL_TRANSPARENT ) )
1497                 nSelPos = m_pColorLB->GetEntryPos( m_pImpl->m_aTransparentText );
1498 
1499             if ( LISTBOX_ENTRY_NOTFOUND != nSelPos )
1500                 m_pColorLB->SelectEntryPos( nSelPos );
1501             else
1502             {
1503                 nSelPos = m_pColorLB->GetEntryPos( aColor );
1504                 if ( LISTBOX_ENTRY_NOTFOUND != nSelPos )
1505                     m_pColorLB->SelectEntryPos( nSelPos );
1506                 else
1507                     m_pColorLB->SelectEntryPos(
1508                         m_pColorLB->InsertEntry( aColor, String( SVX_RES( RID_SVXSTR_COLOR_USER ) ) ) );
1509             }
1510             break;
1511         }
1512     }
1513 }
1514 
1515 // -----------------------------------------------------------------------
1516 
IMPL_LINK(SvxCharNamePage,UpdateHdl_Impl,Timer *,EMPTYARG)1517 IMPL_LINK( SvxCharNamePage, UpdateHdl_Impl, Timer*, EMPTYARG )
1518 {
1519     UpdatePreview_Impl();
1520     return 0;
1521 }
1522 
1523 // -----------------------------------------------------------------------
1524 
IMPL_LINK(SvxCharNamePage,FontModifyHdl_Impl,void *,pNameBox)1525 IMPL_LINK( SvxCharNamePage, FontModifyHdl_Impl, void*, pNameBox )
1526 {
1527     m_pImpl->m_aUpdateTimer.Start();
1528 
1529     if ( m_pWestFontNameLB == pNameBox || m_pEastFontNameLB == pNameBox || m_pCTLFontNameLB == pNameBox )
1530     {
1531         FillStyleBox_Impl( (FontNameBox*)pNameBox );
1532         FillSizeBox_Impl( (FontNameBox*)pNameBox );
1533     }
1534     return 0;
1535 }
1536 
1537 // -----------------------------------------------------------------------
1538 
IMPL_LINK(SvxCharNamePage,ColorBoxSelectHdl_Impl,ColorListBox *,pBox)1539 IMPL_LINK( SvxCharNamePage, ColorBoxSelectHdl_Impl, ColorListBox*, pBox )
1540 {
1541     SvxFont& rFont = GetPreviewFont();
1542     SvxFont& rCJKFont = GetPreviewCJKFont();
1543     SvxFont& rCTLFont = GetPreviewCTLFont();
1544     Color aSelectedColor;
1545     if ( pBox->GetSelectEntry() == m_pImpl->m_aTransparentText )
1546         aSelectedColor = Color( COL_TRANSPARENT );
1547     else
1548         aSelectedColor = pBox->GetSelectEntryColor();
1549     rFont.SetColor( aSelectedColor.GetColor() == COL_AUTO ? Color(COL_BLACK) : aSelectedColor );
1550     rCJKFont.SetColor( aSelectedColor.GetColor() == COL_AUTO ? Color(COL_BLACK) : aSelectedColor );
1551     rCTLFont.SetColor( aSelectedColor.GetColor() == COL_AUTO ? Color(COL_BLACK) : aSelectedColor );
1552     m_aPreviewWin.Invalidate();
1553     return 0;
1554 }
1555 
1556 // -----------------------------------------------------------------------
1557 
ActivatePage(const SfxItemSet & rSet)1558 void SvxCharNamePage::ActivatePage( const SfxItemSet& rSet )
1559 {
1560     SvxCharBasePage::ActivatePage( rSet );
1561 
1562     UpdatePreview_Impl();       // instead of asynchronous calling in ctor
1563 }
1564 
1565 // -----------------------------------------------------------------------
1566 
DeactivatePage(SfxItemSet * _pSet)1567 int SvxCharNamePage::DeactivatePage( SfxItemSet* _pSet )
1568 {
1569     if ( _pSet )
1570         FillItemSet( *_pSet );
1571     return LEAVE_PAGE;
1572 }
1573 
1574 // -----------------------------------------------------------------------
1575 
Create(Window * pParent,const SfxItemSet & rSet)1576 SfxTabPage* SvxCharNamePage::Create( Window* pParent, const SfxItemSet& rSet )
1577 {
1578     return new SvxCharNamePage( pParent, rSet );
1579 }
1580 
1581 // -----------------------------------------------------------------------
1582 
GetRanges()1583 sal_uInt16* SvxCharNamePage::GetRanges()
1584 {
1585     return pNameRanges;
1586 }
1587 
1588 // -----------------------------------------------------------------------
1589 
Reset(const SfxItemSet & rSet)1590 void SvxCharNamePage::Reset( const SfxItemSet& rSet )
1591 {
1592     Reset_Impl( rSet, Western );
1593     Reset_Impl( rSet, Asian );
1594     Reset_Impl( rSet, Ctl );
1595     ResetColor_Impl( rSet );
1596     m_pColorLB->SaveValue();
1597 
1598     SetPrevFontWidthScale( rSet );
1599     UpdatePreview_Impl();
1600 }
1601 
1602 // -----------------------------------------------------------------------
1603 
FillItemSet(SfxItemSet & rSet)1604 sal_Bool SvxCharNamePage::FillItemSet( SfxItemSet& rSet )
1605 {
1606     sal_Bool bModified = FillItemSet_Impl( rSet, Western );
1607     bModified |= FillItemSet_Impl( rSet, Asian );
1608     bModified |= FillItemSet_Impl( rSet, Ctl );
1609     return bModified;
1610 }
1611 
1612 // -----------------------------------------------------------------------
1613 
SetFontList(const SvxFontListItem & rItem)1614 void SvxCharNamePage::SetFontList( const SvxFontListItem& rItem )
1615 {
1616     if ( m_pImpl->m_bMustDelete )
1617     {
1618         delete m_pImpl->m_pFontList;
1619     }
1620     m_pImpl->m_pFontList = rItem.GetFontList()->Clone();
1621     m_pImpl->m_bMustDelete = sal_True;
1622 }
1623 
1624 // -----------------------------------------------------------------------
1625 namespace
1626 {
enableRelativeMode(SvxCharNamePage * _pPage,FontSizeBox * _pFontSizeLB,sal_uInt16 _nHeightWhich)1627     void enableRelativeMode( SvxCharNamePage* _pPage, FontSizeBox* _pFontSizeLB, sal_uInt16 _nHeightWhich )
1628     {
1629         _pFontSizeLB->EnableRelativeMode( 5, 995, 5 ); // min 5%, max 995%, step 5
1630 
1631         const SvxFontHeightItem& rHeightItem =
1632             (SvxFontHeightItem&)_pPage->GetItemSet().GetParent()->Get( _nHeightWhich );
1633         SfxMapUnit eUnit = _pPage->GetItemSet().GetPool()->GetMetric( _nHeightWhich );
1634         short nCurHeight =
1635             static_cast< short >( CalcToPoint( rHeightItem.GetHeight(), eUnit, 1 ) * 10 );
1636 
1637         // ausgehend von der akt. Hoehe:
1638         //      - negativ bis minimal 2 pt
1639         //      - positiv bis maximal 999 pt
1640         _pFontSizeLB->EnablePtRelativeMode( sal::static_int_cast< short >(-(nCurHeight - 20)), (9999 - nCurHeight), 10 );
1641     }
1642 }
1643 // -----------------------------------------------------------------------------
1644 
EnableRelativeMode()1645 void SvxCharNamePage::EnableRelativeMode()
1646 {
1647     DBG_ASSERT( GetItemSet().GetParent(), "RelativeMode, but no ParentSet!" );
1648     enableRelativeMode(this,m_pWestFontSizeLB,GetWhich( SID_ATTR_CHAR_FONTHEIGHT ));
1649     enableRelativeMode(this,m_pEastFontSizeLB,GetWhich( SID_ATTR_CHAR_CJK_FONTHEIGHT ));
1650     enableRelativeMode(this,m_pCTLFontSizeLB,GetWhich( SID_ATTR_CHAR_CTL_FONTHEIGHT ));
1651 }
1652 
1653 // -----------------------------------------------------------------------
1654 
EnableSearchMode()1655 void SvxCharNamePage::EnableSearchMode()
1656 {
1657     m_pImpl->m_bInSearchMode = sal_True;
1658 }
1659 // -----------------------------------------------------------------------
DisableControls(sal_uInt16 nDisable)1660 void SvxCharNamePage::DisableControls( sal_uInt16 nDisable )
1661 {
1662     if ( DISABLE_LANGUAGE & nDisable )
1663     {
1664         if ( m_pWestFontLanguageFT ) m_pWestFontLanguageFT->Disable();
1665         if ( m_pWestFontLanguageLB ) m_pWestFontLanguageLB->Disable();
1666         if ( m_pEastFontLanguageFT ) m_pEastFontLanguageFT->Disable();
1667         if ( m_pEastFontLanguageLB ) m_pEastFontLanguageLB->Disable();
1668         if ( m_pCTLFontLanguageFT ) m_pCTLFontLanguageFT->Disable();
1669         if ( m_pCTLFontLanguageLB ) m_pCTLFontLanguageLB->Disable();
1670     }
1671 
1672     if ( DISABLE_HIDE_LANGUAGE & nDisable )
1673     {
1674         if ( m_pWestFontLanguageFT ) m_pWestFontLanguageFT->Hide();
1675         if ( m_pWestFontLanguageLB ) m_pWestFontLanguageLB->Hide();
1676         if ( m_pEastFontLanguageFT ) m_pEastFontLanguageFT->Hide();
1677         if ( m_pEastFontLanguageLB ) m_pEastFontLanguageLB->Hide();
1678         if ( m_pCTLFontLanguageFT ) m_pCTLFontLanguageFT->Hide();
1679         if ( m_pCTLFontLanguageLB ) m_pCTLFontLanguageLB->Hide();
1680     }
1681 }
1682 
1683 // -----------------------------------------------------------------------
SetPreviewBackgroundToCharacter()1684 void SvxCharNamePage::SetPreviewBackgroundToCharacter()
1685 {
1686     m_bPreviewBackgroundToCharacter = sal_True;
1687 }
1688 
1689 // -----------------------------------------------------------------------
PageCreated(SfxAllItemSet aSet)1690 void SvxCharNamePage::PageCreated (SfxAllItemSet aSet) //add CHINA001
1691 {
1692     SFX_ITEMSET_ARG (&aSet,pFontListItem,SvxFontListItem,SID_ATTR_CHAR_FONTLIST,sal_False);
1693     SFX_ITEMSET_ARG (&aSet,pFlagItem,SfxUInt32Item,SID_FLAG_TYPE,sal_False);
1694     SFX_ITEMSET_ARG (&aSet,pDisalbeItem,SfxUInt16Item,SID_DISABLE_CTL,sal_False);
1695     if (pFontListItem)
1696         SetFontList(*pFontListItem);
1697         //CHINA001 SetFontList(pFontListItem->GetFontList());
1698 
1699     if (pFlagItem)
1700     {
1701         sal_uInt32 nFlags=pFlagItem->GetValue();
1702         if ( ( nFlags & SVX_RELATIVE_MODE ) == SVX_RELATIVE_MODE )
1703             EnableRelativeMode();
1704         if ( ( nFlags & SVX_PREVIEW_CHARACTER ) == SVX_PREVIEW_CHARACTER )
1705             SetPreviewBackgroundToCharacter();
1706     }
1707     if (pDisalbeItem)
1708         DisableControls(pDisalbeItem->GetValue());
1709 }
1710 // class SvxCharEffectsPage ----------------------------------------------
1711 
SvxCharEffectsPage(Window * pParent,const SfxItemSet & rInSet)1712 SvxCharEffectsPage::SvxCharEffectsPage( Window* pParent, const SfxItemSet& rInSet ) :
1713 
1714     SvxCharBasePage( pParent, CUI_RES( RID_SVXPAGE_CHAR_EFFECTS ), rInSet, WIN_EFFECTS_PREVIEW, FT_EFFECTS_FONTTYPE ),
1715 
1716     m_aFontColorFT          ( this, CUI_RES( FT_FONTCOLOR ) ),
1717     m_aFontColorLB          ( this, CUI_RES( LB_FONTCOLOR ) ),
1718 
1719     m_aEffectsFT            ( this, CUI_RES( FT_EFFECTS ) ),
1720     m_aEffectsLB            ( this, 0 ),
1721 
1722     m_aEffects2LB           ( this, CUI_RES( LB_EFFECTS2 ) ),
1723 
1724     m_aReliefFT             ( this, CUI_RES( FT_RELIEF ) ),
1725     m_aReliefLB             ( this, CUI_RES( LB_RELIEF ) ),
1726 
1727     m_aOutlineBtn           ( this, CUI_RES( CB_OUTLINE ) ),
1728     m_aShadowBtn            ( this, CUI_RES( CB_SHADOW ) ),
1729     m_aBlinkingBtn          ( this, CUI_RES( CB_BLINKING ) ),
1730     m_aHiddenBtn            ( this, CUI_RES( CB_CHARHIDDEN ) ),
1731 
1732     m_aVerticalLine         ( this, CUI_RES( FL_EFFECTS_VERTICAL ) ),
1733 
1734     m_aOverlineFT           ( this, CUI_RES( FT_OVERLINE ) ),
1735     m_aOverlineLB           ( this, CUI_RES( LB_OVERLINE ) ),
1736     m_aOverlineColorFT      ( this, CUI_RES( FT_OVERLINE_COLOR ) ),
1737     m_aOverlineColorLB      ( this, CUI_RES( LB_OVERLINE_COLOR ) ),
1738     m_aStrikeoutFT          ( this, CUI_RES( FT_STRIKEOUT ) ),
1739     m_aStrikeoutLB          ( this, CUI_RES( LB_STRIKEOUT ) ),
1740     m_aUnderlineFT          ( this, CUI_RES( FT_UNDERLINE ) ),
1741     m_aUnderlineLB          ( this, CUI_RES( LB_UNDERLINE ) ),
1742     m_aUnderlineColorFT     ( this, CUI_RES( FT_UNDERLINE_COLOR ) ),
1743     m_aUnderlineColorLB     ( this, CUI_RES( LB_UNDERLINE_COLOR ) ),
1744     m_aIndividualWordsBtn   ( this, CUI_RES( CB_INDIVIDUALWORDS ) ),
1745 
1746     m_aAsianLine            ( this, CUI_RES( FL_EFFECTS_ASIAN ) ),
1747 
1748     m_aEmphasisFT           ( this, CUI_RES( FT_EMPHASIS ) ),
1749     m_aEmphasisLB           ( this, CUI_RES( LB_EMPHASIS ) ),
1750     m_aPositionFT           ( this, CUI_RES( FT_POSITION ) ),
1751     m_aPositionLB           ( this, CUI_RES( LB_POSITION ) ),
1752 
1753     m_aTransparentColorName ( CUI_RES( STR_CHARNAME_TRANSPARENT ) )
1754 
1755 {
1756     m_aEffectsLB.Hide();
1757     FreeResource();
1758     Initialize();
1759 }
1760 
1761 // -----------------------------------------------------------------------
1762 
Initialize()1763 void SvxCharEffectsPage::Initialize()
1764 {
1765     // to handle the changes of the other pages
1766     SetExchangeSupport();
1767 
1768     // HTML-Mode
1769     const SfxPoolItem* pItem;
1770     SfxObjectShell* pShell;
1771     if ( SFX_ITEM_SET == GetItemSet().GetItemState( SID_HTML_MODE, sal_False, &pItem ) ||
1772          ( NULL != ( pShell = SfxObjectShell::Current() ) &&
1773            NULL != ( pItem = pShell->GetItem( SID_HTML_MODE ) ) ) )
1774     {
1775         m_nHtmlMode = ( (const SfxUInt16Item*)pItem )->GetValue();
1776         if ( ( m_nHtmlMode & HTMLMODE_ON ) == HTMLMODE_ON )
1777         {
1778             //!!! hide some controls please
1779         }
1780     }
1781 
1782     // fill the color box
1783     SfxObjectShell* pDocSh = SfxObjectShell::Current();
1784     DBG_ASSERT( pDocSh, "DocShell not found!" );
1785     XColorListSharedPtr aColorTable;
1786 
1787     if ( pDocSh )
1788     {
1789         pItem = pDocSh->GetItem( SID_COLOR_TABLE );
1790         if ( pItem != NULL )
1791             aColorTable = static_cast< const SvxColorTableItem* >(pItem)->GetColorTable();
1792     }
1793 
1794     if ( !aColorTable.get() )
1795     {
1796         aColorTable = XPropertyListFactory::CreateSharedXColorList(SvtPathOptions().GetPalettePath());
1797     }
1798 
1799     m_aUnderlineColorLB.SetUpdateMode( sal_False );
1800     m_aOverlineColorLB.SetUpdateMode( sal_False );
1801     m_aFontColorLB.SetUpdateMode( sal_False );
1802 
1803     {
1804         SfxPoolItem* pDummy;
1805         SfxViewFrame* pFrame = SfxViewFrame::GetFirst( pDocSh );
1806         if ( !pFrame ||
1807              SFX_ITEM_DEFAULT > pFrame->GetBindings().QueryState( SID_ATTR_AUTO_COLOR_INVALID, pDummy ) )
1808         {
1809             m_aUnderlineColorLB.InsertAutomaticEntry();
1810             m_aOverlineColorLB.InsertAutomaticEntry();
1811             m_aFontColorLB.InsertAutomaticEntry();
1812         }
1813     }
1814     for ( long i = 0; i < aColorTable->Count(); i++ )
1815     {
1816         XColorEntry* pEntry = aColorTable->GetColor(i);
1817         m_aUnderlineColorLB.InsertEntry( pEntry->GetColor(), pEntry->GetName() );
1818         m_aOverlineColorLB.InsertEntry( pEntry->GetColor(), pEntry->GetName() );
1819         m_aFontColorLB.InsertEntry( pEntry->GetColor(), pEntry->GetName() );
1820     }
1821 
1822     m_aUnderlineColorLB.SetUpdateMode( sal_True );
1823     m_aOverlineColorLB.SetUpdateMode( sal_True );
1824     m_aFontColorLB.SetUpdateMode( sal_True );
1825     m_aFontColorLB.SetSelectHdl( LINK( this, SvxCharEffectsPage, ColorBoxSelectHdl_Impl ) );
1826 
1827     // handler
1828     Link aLink = LINK( this, SvxCharEffectsPage, SelectHdl_Impl );
1829     m_aUnderlineLB.SetSelectHdl( aLink );
1830     m_aUnderlineColorLB.SetSelectHdl( aLink );
1831     m_aOverlineLB.SetSelectHdl( aLink );
1832     m_aOverlineColorLB.SetSelectHdl( aLink );
1833     m_aStrikeoutLB.SetSelectHdl( aLink );
1834     m_aEmphasisLB.SetSelectHdl( aLink );
1835     m_aPositionLB.SetSelectHdl( aLink );
1836     m_aEffects2LB.SetSelectHdl( aLink );
1837     m_aReliefLB.SetSelectHdl( aLink );
1838 
1839     m_aUnderlineLB.SelectEntryPos( 0 );
1840     m_aUnderlineColorLB.SelectEntryPos( 0 );
1841     m_aOverlineLB.SelectEntryPos( 0 );
1842     m_aOverlineColorLB.SelectEntryPos( 0 );
1843     m_aStrikeoutLB.SelectEntryPos( 0 );
1844     m_aEmphasisLB.SelectEntryPos( 0 );
1845     m_aPositionLB.SelectEntryPos( 0 );
1846     SelectHdl_Impl( NULL );
1847     SelectHdl_Impl( &m_aEmphasisLB );
1848 
1849     m_aEffects2LB.SelectEntryPos( 0 );
1850 
1851     m_aIndividualWordsBtn.SetClickHdl( LINK( this, SvxCharEffectsPage, CbClickHdl_Impl ) );
1852     aLink = LINK( this, SvxCharEffectsPage, TristClickHdl_Impl );
1853     m_aOutlineBtn.SetClickHdl( aLink );
1854     m_aShadowBtn.SetClickHdl( aLink );
1855 
1856     if ( !SvtLanguageOptions().IsAsianTypographyEnabled() )
1857     {
1858         m_aAsianLine.Hide();
1859         m_aEmphasisFT.Hide();
1860         m_aEmphasisLB.Hide();
1861         m_aPositionFT.Hide();
1862         m_aPositionLB.Hide();
1863     }
1864 }
1865 // -----------------------------------------------------------------------
1866 
UpdatePreview_Impl()1867 void SvxCharEffectsPage::UpdatePreview_Impl()
1868 {
1869     SvxFont& rFont = GetPreviewFont();
1870     SvxFont& rCJKFont = GetPreviewCJKFont();
1871     SvxFont& rCTLFont = GetPreviewCTLFont();
1872 
1873     sal_uInt16 nPos = m_aUnderlineLB.GetSelectEntryPos();
1874     FontUnderline eUnderline = (FontUnderline)(sal_uLong)m_aUnderlineLB.GetEntryData( nPos );
1875     nPos = m_aOverlineLB.GetSelectEntryPos();
1876     FontUnderline eOverline = (FontUnderline)(sal_uLong)m_aOverlineLB.GetEntryData( nPos );
1877     nPos = m_aStrikeoutLB.GetSelectEntryPos();
1878     FontStrikeout eStrikeout = (FontStrikeout)(sal_uLong)m_aStrikeoutLB.GetEntryData( nPos );
1879     rFont.SetUnderline( eUnderline );
1880     rCJKFont.SetUnderline( eUnderline );
1881     rCTLFont.SetUnderline( eUnderline );
1882     m_aPreviewWin.SetTextLineColor( m_aUnderlineColorLB.GetSelectEntryColor() );
1883     rFont.SetOverline( eOverline );
1884     rCJKFont.SetOverline( eOverline );
1885     rCTLFont.SetOverline( eOverline );
1886     m_aPreviewWin.SetOverlineColor( m_aOverlineColorLB.GetSelectEntryColor() );
1887     rFont.SetStrikeout( eStrikeout );
1888     rCJKFont.SetStrikeout( eStrikeout );
1889     rCTLFont.SetStrikeout( eStrikeout );
1890 
1891     nPos = m_aPositionLB.GetSelectEntryPos();
1892     sal_Bool bUnder = ( CHRDLG_POSITION_UNDER == (sal_uLong)m_aPositionLB.GetEntryData( nPos ) );
1893     FontEmphasisMark eMark = (FontEmphasisMark)m_aEmphasisLB.GetSelectEntryPos();
1894     eMark |= bUnder ? EMPHASISMARK_POS_BELOW : EMPHASISMARK_POS_ABOVE;
1895     rFont.SetEmphasisMark( eMark );
1896     rCJKFont.SetEmphasisMark( eMark );
1897     rCTLFont.SetEmphasisMark( eMark );
1898 
1899     sal_uInt16 nRelief = m_aReliefLB.GetSelectEntryPos();
1900     if(LISTBOX_ENTRY_NOTFOUND != nRelief)
1901     {
1902         rFont.SetRelief( (FontRelief)nRelief );
1903         rCJKFont.SetRelief( (FontRelief)nRelief );
1904         rCTLFont.SetRelief( (FontRelief)nRelief );
1905     }
1906 
1907     rFont.SetOutline( StateToAttr( m_aOutlineBtn.GetState() ) );
1908     rCJKFont.SetOutline( rFont.IsOutline() );
1909     rCTLFont.SetOutline( rFont.IsOutline() );
1910 
1911     rFont.SetShadow( StateToAttr( m_aShadowBtn.GetState() ) );
1912     rCJKFont.SetShadow( rFont.IsShadow() );
1913     rCTLFont.SetShadow( rFont.IsShadow() );
1914 
1915     sal_uInt16 nCapsPos = m_aEffects2LB.GetSelectEntryPos();
1916     if ( nCapsPos != LISTBOX_ENTRY_NOTFOUND )
1917     {
1918         rFont.SetCaseMap( (SvxCaseMap)nCapsPos );
1919         rCJKFont.SetCaseMap( (SvxCaseMap)nCapsPos );
1920         // #i78474# small caps do not exist in CTL fonts
1921         rCTLFont.SetCaseMap( static_cast<SvxCaseMap>( nCapsPos == SVX_CASEMAP_KAPITAELCHEN ? SVX_CASEMAP_NOT_MAPPED : (SvxCaseMap)nCapsPos) );
1922     }
1923 
1924     sal_Bool bWordLine = m_aIndividualWordsBtn.IsChecked();
1925     rFont.SetWordLineMode( bWordLine );
1926     rCJKFont.SetWordLineMode( bWordLine );
1927     rCTLFont.SetWordLineMode( bWordLine );
1928 
1929     m_aPreviewWin.Invalidate();
1930 }
1931 
1932 // -----------------------------------------------------------------------
1933 
SetCaseMap_Impl(SvxCaseMap eCaseMap)1934 void SvxCharEffectsPage::SetCaseMap_Impl( SvxCaseMap eCaseMap )
1935 {
1936     if ( SVX_CASEMAP_END > eCaseMap )
1937         m_aEffects2LB.SelectEntryPos(
1938             sal::static_int_cast< sal_uInt16 >( eCaseMap ) );
1939     else
1940     {
1941         m_aEffects2LB.SetNoSelection();
1942         eCaseMap = SVX_CASEMAP_NOT_MAPPED;
1943     }
1944 
1945     UpdatePreview_Impl();
1946 }
1947 
1948 // -----------------------------------------------------------------------
1949 
ResetColor_Impl(const SfxItemSet & rSet)1950 void SvxCharEffectsPage::ResetColor_Impl( const SfxItemSet& rSet )
1951 {
1952     sal_uInt16 nWhich = GetWhich( SID_ATTR_CHAR_COLOR );
1953     SfxItemState eState = rSet.GetItemState( nWhich );
1954 
1955     switch ( eState )
1956     {
1957         case SFX_ITEM_UNKNOWN:
1958             m_aFontColorFT.Hide();
1959             m_aFontColorLB.Hide();
1960             break;
1961 
1962         case SFX_ITEM_DISABLED:
1963         case SFX_ITEM_READONLY:
1964             m_aFontColorFT.Disable();
1965             m_aFontColorLB.Disable();
1966             break;
1967 
1968         case SFX_ITEM_DONTCARE:
1969             m_aFontColorLB.SetNoSelection();
1970             break;
1971 
1972         case SFX_ITEM_DEFAULT:
1973         case SFX_ITEM_SET:
1974         {
1975             SvxFont& rFont = GetPreviewFont();
1976             SvxFont& rCJKFont = GetPreviewCJKFont();
1977             SvxFont& rCTLFont = GetPreviewCTLFont();
1978 
1979             const SvxColorItem& rItem = (SvxColorItem&)rSet.Get( nWhich );
1980             Color aColor = rItem.GetValue();
1981             rFont.SetColor( aColor.GetColor() == COL_AUTO ? Color(COL_BLACK) : aColor );
1982             rCJKFont.SetColor( aColor.GetColor() == COL_AUTO ? Color(COL_BLACK) : aColor );
1983             rCTLFont.SetColor( aColor.GetColor() == COL_AUTO ? Color(COL_BLACK) : aColor );
1984 
1985             m_aPreviewWin.Invalidate();
1986             sal_uInt16 nSelPos = m_aFontColorLB.GetEntryPos( aColor );
1987             if ( nSelPos == LISTBOX_ENTRY_NOTFOUND && aColor == Color( COL_TRANSPARENT ) )
1988                 nSelPos = m_aFontColorLB.GetEntryPos( m_aTransparentColorName );
1989 
1990             if ( LISTBOX_ENTRY_NOTFOUND != nSelPos )
1991                 m_aFontColorLB.SelectEntryPos( nSelPos );
1992             else
1993             {
1994                 nSelPos = m_aFontColorLB.GetEntryPos( aColor );
1995                 if ( LISTBOX_ENTRY_NOTFOUND != nSelPos )
1996                     m_aFontColorLB.SelectEntryPos( nSelPos );
1997                 else
1998                     m_aFontColorLB.SelectEntryPos(
1999                         m_aFontColorLB.InsertEntry( aColor, String( SVX_RES( RID_SVXSTR_COLOR_USER ) ) ) );
2000             }
2001             break;
2002         }
2003     }
2004 }
2005 
2006 // -----------------------------------------------------------------------
2007 
FillItemSetColor_Impl(SfxItemSet & rSet)2008 sal_Bool SvxCharEffectsPage::FillItemSetColor_Impl( SfxItemSet& rSet )
2009 {
2010     sal_uInt16 nWhich = GetWhich( SID_ATTR_CHAR_COLOR );
2011     const SvxColorItem* pOld = (const SvxColorItem*)GetOldItem( rSet, SID_ATTR_CHAR_COLOR );
2012     const SvxColorItem* pItem = NULL;
2013     sal_Bool bChanged = sal_True;
2014     const SfxItemSet* pExampleSet = GetTabDialog() ? GetTabDialog()->GetExampleSet() : NULL;
2015     const SfxItemSet& rOldSet = GetItemSet();
2016 
2017     Color aSelectedColor;
2018     if ( m_aFontColorLB.GetSelectEntry() == m_aTransparentColorName )
2019         aSelectedColor = Color( COL_TRANSPARENT );
2020     else
2021         aSelectedColor = m_aFontColorLB.GetSelectEntryColor();
2022 
2023     if ( pOld && pOld->GetValue() == aSelectedColor )
2024         bChanged = sal_False;
2025 
2026     if ( !bChanged )
2027         bChanged = ( m_aFontColorLB.GetSavedValue() == LISTBOX_ENTRY_NOTFOUND );
2028 
2029     if ( !bChanged && pExampleSet &&
2030          pExampleSet->GetItemState( nWhich, sal_False, (const SfxPoolItem**)&pItem ) == SFX_ITEM_SET &&
2031          ( (SvxColorItem*)pItem )->GetValue() != aSelectedColor )
2032         bChanged = sal_True;
2033 
2034     sal_Bool bModified = sal_False;
2035 
2036     if ( bChanged && m_aFontColorLB.GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND )
2037     {
2038         rSet.Put( SvxColorItem( aSelectedColor, nWhich ) );
2039         bModified = sal_True;
2040     }
2041     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
2042         CLEARTITEM;
2043 
2044     return bModified;
2045 }
2046 
2047 // -----------------------------------------------------------------------
2048 
IMPL_LINK(SvxCharEffectsPage,SelectHdl_Impl,ListBox *,pBox)2049 IMPL_LINK( SvxCharEffectsPage, SelectHdl_Impl, ListBox*, pBox )
2050 {
2051     if ( &m_aEmphasisLB == pBox )
2052     {
2053         sal_uInt16 nEPos = m_aEmphasisLB.GetSelectEntryPos();
2054         sal_Bool bEnable = ( nEPos > 0 && nEPos != LISTBOX_ENTRY_NOTFOUND );
2055         m_aPositionFT.Enable( bEnable );
2056         m_aPositionLB.Enable( bEnable );
2057     }
2058     else if( &m_aReliefLB == pBox)
2059     {
2060         sal_Bool bEnable = ( pBox->GetSelectEntryPos() == 0 );
2061         m_aOutlineBtn.Enable( bEnable );
2062         m_aShadowBtn.Enable( bEnable );
2063     }
2064     else if ( &m_aPositionLB != pBox )
2065     {
2066         sal_uInt16 nUPos = m_aUnderlineLB.GetSelectEntryPos(),
2067                nOPos = m_aOverlineLB.GetSelectEntryPos(),
2068                nSPos = m_aStrikeoutLB.GetSelectEntryPos();
2069         sal_Bool bUEnable = ( nUPos > 0 && nUPos != LISTBOX_ENTRY_NOTFOUND );
2070         sal_Bool bOEnable = ( nOPos > 0 && nOPos != LISTBOX_ENTRY_NOTFOUND );
2071         m_aUnderlineColorFT.Enable( bUEnable );
2072         m_aUnderlineColorLB.Enable( bUEnable );
2073         m_aOverlineColorFT.Enable( bOEnable );
2074         m_aOverlineColorLB.Enable( bOEnable );
2075         m_aIndividualWordsBtn.Enable( bUEnable || bOEnable || ( nSPos > 0 && nSPos != LISTBOX_ENTRY_NOTFOUND ) );
2076     }
2077     UpdatePreview_Impl();
2078     return 0;
2079 }
2080 
2081 // -----------------------------------------------------------------------
2082 
IMPL_LINK(SvxCharEffectsPage,UpdatePreview_Impl,ListBox *,EMPTYARG)2083 IMPL_LINK( SvxCharEffectsPage, UpdatePreview_Impl, ListBox*, EMPTYARG )
2084 {
2085     bool bEnable = ( ( m_aUnderlineLB.GetSelectEntryPos() > 0 ) ||
2086                      ( m_aOverlineLB.GetSelectEntryPos()  > 0 ) ||
2087                      ( m_aStrikeoutLB.GetSelectEntryPos() > 0 ) );
2088     m_aIndividualWordsBtn.Enable( bEnable );
2089 
2090     UpdatePreview_Impl();
2091     return 0;
2092 }
2093 
2094 // -----------------------------------------------------------------------
2095 
IMPL_LINK(SvxCharEffectsPage,CbClickHdl_Impl,CheckBox *,EMPTYARG)2096 IMPL_LINK( SvxCharEffectsPage, CbClickHdl_Impl, CheckBox*, EMPTYARG )
2097 {
2098     UpdatePreview_Impl();
2099     return 0;
2100 }
2101 
2102 // -----------------------------------------------------------------------
2103 
IMPL_LINK(SvxCharEffectsPage,TristClickHdl_Impl,TriStateBox *,EMPTYARG)2104 IMPL_LINK( SvxCharEffectsPage, TristClickHdl_Impl, TriStateBox*, EMPTYARG )
2105 {
2106     UpdatePreview_Impl();
2107     return 0;
2108 }
2109 
2110 // -----------------------------------------------------------------------
2111 
IMPL_LINK(SvxCharEffectsPage,ColorBoxSelectHdl_Impl,ColorListBox *,pBox)2112 IMPL_LINK( SvxCharEffectsPage, ColorBoxSelectHdl_Impl, ColorListBox*, pBox )
2113 {
2114     SvxFont& rFont = GetPreviewFont();
2115     SvxFont& rCJKFont = GetPreviewCJKFont();
2116     SvxFont& rCTLFont = GetPreviewCTLFont();
2117 
2118     Color aSelectedColor;
2119     if ( pBox->GetSelectEntry() == m_aTransparentColorName )
2120         aSelectedColor = Color( COL_TRANSPARENT );
2121     else
2122         aSelectedColor = pBox->GetSelectEntryColor();
2123     rFont.SetColor( aSelectedColor.GetColor() == COL_AUTO ? Color(COL_BLACK) : aSelectedColor );
2124     rCJKFont.SetColor( aSelectedColor.GetColor() == COL_AUTO ? Color(COL_BLACK) : aSelectedColor );
2125     rCTLFont.SetColor( aSelectedColor.GetColor() == COL_AUTO ? Color(COL_BLACK) : aSelectedColor );
2126 
2127     m_aPreviewWin.Invalidate();
2128     return 0;
2129 }
2130 // -----------------------------------------------------------------------
2131 
DeactivatePage(SfxItemSet * _pSet)2132 int SvxCharEffectsPage::DeactivatePage( SfxItemSet* _pSet )
2133 {
2134     if ( _pSet )
2135         FillItemSet( *_pSet );
2136     return LEAVE_PAGE;
2137 }
2138 
2139 // -----------------------------------------------------------------------
2140 
Create(Window * pParent,const SfxItemSet & rSet)2141 SfxTabPage* SvxCharEffectsPage::Create( Window* pParent, const SfxItemSet& rSet )
2142 {
2143     return new SvxCharEffectsPage( pParent, rSet );
2144 }
2145 
2146 // -----------------------------------------------------------------------
2147 
GetRanges()2148 sal_uInt16* SvxCharEffectsPage::GetRanges()
2149 {
2150     return pEffectsRanges;
2151 }
2152 
2153 // -----------------------------------------------------------------------
2154 
Reset(const SfxItemSet & rSet)2155 void SvxCharEffectsPage::Reset( const SfxItemSet& rSet )
2156 {
2157     SvxFont& rFont = GetPreviewFont();
2158     SvxFont& rCJKFont = GetPreviewCJKFont();
2159     SvxFont& rCTLFont = GetPreviewCTLFont();
2160 
2161     sal_Bool bEnable = sal_False;
2162 
2163     // Underline
2164     sal_uInt16 nWhich = GetWhich( SID_ATTR_CHAR_UNDERLINE );
2165     rFont.SetUnderline( UNDERLINE_NONE );
2166     rCJKFont.SetUnderline( UNDERLINE_NONE );
2167     rCTLFont.SetUnderline( UNDERLINE_NONE );
2168 
2169     m_aUnderlineLB.SelectEntryPos( 0 );
2170     SfxItemState eState = rSet.GetItemState( nWhich );
2171 
2172     if ( eState >= SFX_ITEM_DONTCARE )
2173     {
2174         if ( eState == SFX_ITEM_DONTCARE )
2175             m_aUnderlineLB.SetNoSelection();
2176         else
2177         {
2178             const SvxUnderlineItem& rItem = (SvxUnderlineItem&)rSet.Get( nWhich );
2179             FontUnderline eUnderline = (FontUnderline)rItem.GetValue();
2180             rFont.SetUnderline( eUnderline );
2181             rCJKFont.SetUnderline( eUnderline );
2182             rCTLFont.SetUnderline( eUnderline );
2183 
2184             if ( eUnderline != UNDERLINE_NONE )
2185             {
2186                 for ( sal_uInt16 i = 0; i < m_aUnderlineLB.GetEntryCount(); ++i )
2187                 {
2188                     if ( (FontUnderline)(sal_uLong)m_aUnderlineLB.GetEntryData(i) == eUnderline )
2189                     {
2190                         m_aUnderlineLB.SelectEntryPos(i);
2191                         bEnable |= sal_True;
2192                         break;
2193                     }
2194                 }
2195 
2196                 Color aColor = rItem.GetColor();
2197                 sal_uInt16 nPos = m_aUnderlineColorLB.GetEntryPos( aColor );
2198 
2199                 if ( LISTBOX_ENTRY_NOTFOUND != nPos )
2200                     m_aUnderlineColorLB.SelectEntryPos( nPos );
2201                 else
2202                 {
2203                     nPos = m_aUnderlineColorLB.GetEntryPos( aColor );
2204                     if ( LISTBOX_ENTRY_NOTFOUND != nPos )
2205                         m_aUnderlineColorLB.SelectEntryPos( nPos );
2206                     else
2207                         m_aUnderlineColorLB.SelectEntryPos(
2208                             m_aUnderlineColorLB.InsertEntry( aColor,
2209                                 String( SVX_RES( RID_SVXSTR_COLOR_USER ) ) ) );
2210                 }
2211             }
2212             else
2213             {
2214                 m_aUnderlineColorLB.SelectEntry( Color( COL_AUTO ));
2215                 m_aUnderlineColorLB.Disable();
2216             }
2217         }
2218     }
2219 
2220     // Overline
2221     nWhich = GetWhich( SID_ATTR_CHAR_OVERLINE );
2222     rFont.SetOverline( UNDERLINE_NONE );
2223     rCJKFont.SetOverline( UNDERLINE_NONE );
2224     rCTLFont.SetOverline( UNDERLINE_NONE );
2225 
2226     m_aOverlineLB.SelectEntryPos( 0 );
2227     eState = rSet.GetItemState( nWhich );
2228 
2229     if ( eState >= SFX_ITEM_DONTCARE )
2230     {
2231         if ( eState == SFX_ITEM_DONTCARE )
2232             m_aOverlineLB.SetNoSelection();
2233         else
2234         {
2235             const SvxOverlineItem& rItem = (SvxOverlineItem&)rSet.Get( nWhich );
2236             FontUnderline eOverline = (FontUnderline)rItem.GetValue();
2237             rFont.SetOverline( eOverline );
2238             rCJKFont.SetOverline( eOverline );
2239             rCTLFont.SetOverline( eOverline );
2240 
2241             if ( eOverline != UNDERLINE_NONE )
2242             {
2243                 for ( sal_uInt16 i = 0; i < m_aOverlineLB.GetEntryCount(); ++i )
2244                 {
2245                     if ( (FontUnderline)(sal_uLong)m_aOverlineLB.GetEntryData(i) == eOverline )
2246                     {
2247                         m_aOverlineLB.SelectEntryPos(i);
2248                         bEnable |= sal_True;
2249                         break;
2250                     }
2251                 }
2252 
2253                 Color aColor = rItem.GetColor();
2254                 sal_uInt16 nPos = m_aOverlineColorLB.GetEntryPos( aColor );
2255 
2256                 if ( LISTBOX_ENTRY_NOTFOUND != nPos )
2257                     m_aOverlineColorLB.SelectEntryPos( nPos );
2258                 else
2259                 {
2260                     nPos = m_aOverlineColorLB.GetEntryPos( aColor );
2261                     if ( LISTBOX_ENTRY_NOTFOUND != nPos )
2262                         m_aOverlineColorLB.SelectEntryPos( nPos );
2263                     else
2264                         m_aOverlineColorLB.SelectEntryPos(
2265                             m_aOverlineColorLB.InsertEntry( aColor,
2266                                 String( SVX_RES( RID_SVXSTR_COLOR_USER ) ) ) );
2267                 }
2268             }
2269             else
2270             {
2271                 m_aOverlineColorLB.SelectEntry( Color( COL_AUTO ));
2272                 m_aOverlineColorLB.Disable();
2273             }
2274         }
2275     }
2276 
2277     //  Strikeout
2278     nWhich = GetWhich( SID_ATTR_CHAR_STRIKEOUT );
2279     rFont.SetStrikeout( STRIKEOUT_NONE );
2280     rCJKFont.SetStrikeout( STRIKEOUT_NONE );
2281     rCTLFont.SetStrikeout( STRIKEOUT_NONE );
2282 
2283     m_aStrikeoutLB.SelectEntryPos( 0 );
2284     eState = rSet.GetItemState( nWhich );
2285 
2286     if ( eState >= SFX_ITEM_DONTCARE )
2287     {
2288         if ( eState == SFX_ITEM_DONTCARE )
2289             m_aStrikeoutLB.SetNoSelection();
2290         else
2291         {
2292             const SvxCrossedOutItem& rItem = (SvxCrossedOutItem&)rSet.Get( nWhich );
2293             FontStrikeout eStrikeout = (FontStrikeout)rItem.GetValue();
2294             rFont.SetStrikeout( eStrikeout );
2295             rCJKFont.SetStrikeout( eStrikeout );
2296             rCTLFont.SetStrikeout( eStrikeout );
2297 
2298             if ( eStrikeout != STRIKEOUT_NONE )
2299             {
2300                 for ( sal_uInt16 i = 0; i < m_aStrikeoutLB.GetEntryCount(); ++i )
2301                 {
2302                     if ( (FontStrikeout)(sal_uLong)m_aStrikeoutLB.GetEntryData(i) == eStrikeout )
2303                     {
2304                         m_aStrikeoutLB.SelectEntryPos(i);
2305                         bEnable |= sal_True;
2306                         break;
2307                     }
2308                 }
2309             }
2310         }
2311     }
2312 
2313     // WordLineMode
2314     nWhich = GetWhich( SID_ATTR_CHAR_WORDLINEMODE );
2315     switch ( eState )
2316     {
2317         case SFX_ITEM_UNKNOWN:
2318             m_aIndividualWordsBtn.Hide();
2319             break;
2320 
2321         case SFX_ITEM_DISABLED:
2322         case SFX_ITEM_READONLY:
2323             m_aIndividualWordsBtn.Disable();
2324             break;
2325 
2326         case SFX_ITEM_DONTCARE:
2327             m_aIndividualWordsBtn.SetState( STATE_DONTKNOW );
2328             break;
2329 
2330         case SFX_ITEM_DEFAULT:
2331         case SFX_ITEM_SET:
2332         {
2333             const SvxWordLineModeItem& rItem = (SvxWordLineModeItem&)rSet.Get( nWhich );
2334             rFont.SetWordLineMode( rItem.GetValue() );
2335             rCJKFont.SetWordLineMode( rItem.GetValue() );
2336             rCTLFont.SetWordLineMode( rItem.GetValue() );
2337 
2338             m_aIndividualWordsBtn.Check( rItem.GetValue() );
2339             m_aIndividualWordsBtn.Enable( bEnable );
2340             break;
2341         }
2342     }
2343 
2344     // Emphasis
2345     nWhich = GetWhich( SID_ATTR_CHAR_EMPHASISMARK );
2346     eState = rSet.GetItemState( nWhich );
2347 
2348     if ( eState >= SFX_ITEM_DEFAULT )
2349     {
2350         const SvxEmphasisMarkItem& rItem = (SvxEmphasisMarkItem&)rSet.Get( nWhich );
2351         FontEmphasisMark eMark = rItem.GetEmphasisMark();
2352         rFont.SetEmphasisMark( eMark );
2353         rCJKFont.SetEmphasisMark( eMark );
2354         rCTLFont.SetEmphasisMark( eMark );
2355 
2356         m_aEmphasisLB.SelectEntryPos( (sal_uInt16)( eMark & EMPHASISMARK_STYLE ) );
2357         eMark &= ~EMPHASISMARK_STYLE;
2358         sal_uLong nEntryData = ( eMark == EMPHASISMARK_POS_ABOVE )
2359             ? CHRDLG_POSITION_OVER
2360             : ( eMark == EMPHASISMARK_POS_BELOW ) ? CHRDLG_POSITION_UNDER : 0;
2361 
2362         for ( sal_uInt16 i = 0; i < m_aPositionLB.GetEntryCount(); i++ )
2363         {
2364             if ( nEntryData == (sal_uLong)m_aPositionLB.GetEntryData(i) )
2365             {
2366                 m_aPositionLB.SelectEntryPos(i);
2367                 break;
2368             }
2369         }
2370     }
2371     else if ( eState == SFX_ITEM_DONTCARE )
2372         m_aEmphasisLB.SetNoSelection( );
2373     else if ( eState == SFX_ITEM_UNKNOWN )
2374     {
2375         m_aEmphasisFT.Hide();
2376         m_aEmphasisLB.Hide();
2377     }
2378     else // SFX_ITEM_DISABLED or SFX_ITEM_READONLY
2379     {
2380         m_aEmphasisFT.Disable();
2381         m_aEmphasisLB.Disable();
2382     }
2383 
2384     // the select handler for the underline/overline/strikeout list boxes
2385 //  SelectHdl_Impl( NULL );
2386     DBG_ASSERT(m_aUnderlineLB.GetSelectHdl() == m_aOverlineLB.GetSelectHdl(),
2387         "SvxCharEffectsPage::Reset: inconsistence (1)!");
2388     DBG_ASSERT(m_aUnderlineLB.GetSelectHdl() == m_aStrikeoutLB.GetSelectHdl(),
2389         "SvxCharEffectsPage::Reset: inconsistence (1)!");
2390     m_aUnderlineLB.GetSelectHdl().Call(NULL);
2391         // don't call SelectHdl_Impl directly!
2392         // in DisableControls, we may have re-reouted the select handler
2393         // 30.05.2001 - 86262 - frank.schoenheit@germany.sun.com
2394 
2395     // the select handler for the emphasis listbox
2396 //  SelectHdl_Impl( &m_aEmphasisLB );
2397     DBG_ASSERT(m_aEmphasisLB.GetSelectHdl() == LINK(this, SvxCharEffectsPage, SelectHdl_Impl),
2398         "SvxCharEffectsPage::Reset: inconsistence (2)!");
2399     m_aEmphasisLB.GetSelectHdl().Call( &m_aEmphasisLB );
2400         // this is for consistency only. Here it would be allowed to call SelectHdl_Impl directly ...
2401 
2402     // Effects
2403     SvxCaseMap eCaseMap = SVX_CASEMAP_END;
2404     nWhich = GetWhich( SID_ATTR_CHAR_CASEMAP );
2405     eState = rSet.GetItemState( nWhich );
2406     switch ( eState )
2407     {
2408         case SFX_ITEM_UNKNOWN:
2409             m_aEffectsFT.Hide();
2410             m_aEffects2LB.Hide();
2411             break;
2412 
2413         case SFX_ITEM_DISABLED:
2414         case SFX_ITEM_READONLY:
2415             m_aEffectsFT.Disable();
2416             m_aEffects2LB.Disable();
2417             break;
2418 
2419         case SFX_ITEM_DONTCARE:
2420             m_aEffects2LB.SetNoSelection();
2421             break;
2422 
2423         case SFX_ITEM_DEFAULT:
2424         case SFX_ITEM_SET:
2425         {
2426             const SvxCaseMapItem& rItem = (const SvxCaseMapItem&)rSet.Get( nWhich );
2427             eCaseMap = (SvxCaseMap)rItem.GetValue();
2428             break;
2429         }
2430     }
2431     SetCaseMap_Impl( eCaseMap );
2432 
2433     //Relief
2434     nWhich = GetWhich(SID_ATTR_CHAR_RELIEF);
2435     eState = rSet.GetItemState( nWhich );
2436     switch ( eState )
2437     {
2438         case SFX_ITEM_UNKNOWN:
2439             m_aReliefFT.Hide();
2440             m_aReliefLB.Hide();
2441             break;
2442 
2443         case SFX_ITEM_DISABLED:
2444         case SFX_ITEM_READONLY:
2445             m_aReliefFT.Disable();
2446             m_aReliefLB.Disable();
2447             break;
2448 
2449         case SFX_ITEM_DONTCARE:
2450             m_aReliefLB.SetNoSelection();
2451             break;
2452 
2453         case SFX_ITEM_DEFAULT:
2454         case SFX_ITEM_SET:
2455         {
2456             const SvxCharReliefItem& rItem = (const SvxCharReliefItem&)rSet.Get( nWhich );
2457             m_aReliefLB.SelectEntryPos(rItem.GetValue());
2458             SelectHdl_Impl(&m_aReliefLB);
2459             break;
2460         }
2461     }
2462 
2463     // Outline
2464     nWhich = GetWhich( SID_ATTR_CHAR_CONTOUR );
2465     eState = rSet.GetItemState( nWhich );
2466     switch ( eState )
2467     {
2468         case SFX_ITEM_UNKNOWN:
2469             m_aOutlineBtn.Hide();
2470             break;
2471 
2472         case SFX_ITEM_DISABLED:
2473         case SFX_ITEM_READONLY:
2474             m_aOutlineBtn.Disable();
2475             break;
2476 
2477         case SFX_ITEM_DONTCARE:
2478             m_aOutlineBtn.SetState( STATE_DONTKNOW );
2479             break;
2480 
2481         case SFX_ITEM_DEFAULT:
2482         case SFX_ITEM_SET:
2483         {
2484             const SvxContourItem& rItem = (SvxContourItem&)rSet.Get( nWhich );
2485             m_aOutlineBtn.SetState( (TriState)rItem.GetValue() );
2486             m_aOutlineBtn.EnableTriState( sal_False );
2487             break;
2488         }
2489     }
2490 
2491     // Shadow
2492     nWhich = GetWhich( SID_ATTR_CHAR_SHADOWED );
2493     eState = rSet.GetItemState( nWhich );
2494 
2495     switch ( eState )
2496     {
2497         case SFX_ITEM_UNKNOWN:
2498             m_aShadowBtn.Hide();
2499             break;
2500 
2501         case SFX_ITEM_DISABLED:
2502         case SFX_ITEM_READONLY:
2503             m_aShadowBtn.Disable();
2504             break;
2505 
2506         case SFX_ITEM_DONTCARE:
2507             m_aShadowBtn.SetState( STATE_DONTKNOW );
2508             break;
2509 
2510         case SFX_ITEM_DEFAULT:
2511         case SFX_ITEM_SET:
2512         {
2513             const SvxShadowedItem& rItem = (SvxShadowedItem&)rSet.Get( nWhich );
2514             m_aShadowBtn.SetState( (TriState)rItem.GetValue() );
2515             m_aShadowBtn.EnableTriState( sal_False );
2516             break;
2517         }
2518     }
2519 
2520     // Blinking
2521     nWhich = GetWhich( SID_ATTR_FLASH );
2522     eState = rSet.GetItemState( nWhich );
2523 
2524     switch ( eState )
2525     {
2526         case SFX_ITEM_UNKNOWN:
2527             m_aBlinkingBtn.Hide();
2528             break;
2529 
2530         case SFX_ITEM_DISABLED:
2531         case SFX_ITEM_READONLY:
2532             m_aBlinkingBtn.Disable();
2533             break;
2534 
2535         case SFX_ITEM_DONTCARE:
2536             m_aBlinkingBtn.SetState( STATE_DONTKNOW );
2537             break;
2538 
2539         case SFX_ITEM_DEFAULT:
2540         case SFX_ITEM_SET:
2541         {
2542             const SvxBlinkItem& rItem = (SvxBlinkItem&)rSet.Get( nWhich );
2543             m_aBlinkingBtn.SetState( (TriState)rItem.GetValue() );
2544             m_aBlinkingBtn.EnableTriState( sal_False );
2545             break;
2546         }
2547     }
2548     // Hidden
2549     nWhich = GetWhich( SID_ATTR_CHAR_HIDDEN );
2550     eState = rSet.GetItemState( nWhich );
2551 
2552     switch ( eState )
2553     {
2554         case SFX_ITEM_UNKNOWN:
2555             m_aHiddenBtn.Hide();
2556             break;
2557 
2558         case SFX_ITEM_DISABLED:
2559         case SFX_ITEM_READONLY:
2560             m_aHiddenBtn.Disable();
2561             break;
2562 
2563         case SFX_ITEM_DONTCARE:
2564             m_aHiddenBtn.SetState( STATE_DONTKNOW );
2565             break;
2566 
2567         case SFX_ITEM_DEFAULT:
2568         case SFX_ITEM_SET:
2569         {
2570             const SvxCharHiddenItem& rItem = (SvxCharHiddenItem&)rSet.Get( nWhich );
2571             m_aHiddenBtn.SetState( (TriState)rItem.GetValue() );
2572             m_aHiddenBtn.EnableTriState( sal_False );
2573             break;
2574         }
2575     }
2576 
2577     SetPrevFontWidthScale( rSet );
2578     ResetColor_Impl( rSet );
2579 
2580     // preview update
2581     m_aPreviewWin.Invalidate();
2582 
2583     // save this settings
2584     m_aUnderlineLB.SaveValue();
2585     m_aUnderlineColorLB.SaveValue();
2586     m_aOverlineLB.SaveValue();
2587     m_aOverlineColorLB.SaveValue();
2588     m_aStrikeoutLB.SaveValue();
2589     m_aIndividualWordsBtn.SaveValue();
2590     m_aEmphasisLB.SaveValue();
2591     m_aPositionLB.SaveValue();
2592     m_aEffects2LB.SaveValue();
2593     m_aReliefLB.SaveValue();
2594     m_aOutlineBtn.SaveValue();
2595     m_aShadowBtn.SaveValue();
2596     m_aBlinkingBtn.SaveValue();
2597     m_aHiddenBtn.SaveValue();
2598     m_aFontColorLB.SaveValue();
2599 }
2600 
2601 // -----------------------------------------------------------------------
2602 
FillItemSet(SfxItemSet & rSet)2603 sal_Bool SvxCharEffectsPage::FillItemSet( SfxItemSet& rSet )
2604 {
2605     const SfxPoolItem* pOld = 0;
2606     const SfxItemSet& rOldSet = GetItemSet();
2607     sal_Bool bModified = sal_False;
2608     FASTBOOL bChanged = sal_True;
2609 
2610     // Underline
2611     sal_uInt16 nWhich = GetWhich( SID_ATTR_CHAR_UNDERLINE );
2612     pOld = GetOldItem( rSet, SID_ATTR_CHAR_UNDERLINE );
2613     sal_uInt16 nPos = m_aUnderlineLB.GetSelectEntryPos();
2614     FontUnderline eUnder = (FontUnderline)(sal_uLong)m_aUnderlineLB.GetEntryData( nPos );
2615 
2616     if ( pOld )
2617     {
2618         //! if there are different underline styles in the selection the
2619         //! item-state in the 'rOldSet' will be invalid. In this case
2620         //! changing the underline style will be allowed if a style is
2621         //! selected in the listbox.
2622         sal_Bool bAllowChg = LISTBOX_ENTRY_NOTFOUND != nPos  &&
2623                          SFX_ITEM_DEFAULT > rOldSet.GetItemState( nWhich, sal_True );
2624 
2625         const SvxUnderlineItem& rItem = *( (const SvxUnderlineItem*)pOld );
2626         if ( (FontUnderline)rItem.GetValue() == eUnder &&
2627              ( UNDERLINE_NONE == eUnder || rItem.GetColor() == m_aUnderlineColorLB.GetSelectEntryColor() ) &&
2628              ! bAllowChg )
2629             bChanged = sal_False;
2630     }
2631 
2632     if ( bChanged )
2633     {
2634         SvxUnderlineItem aNewItem( eUnder, nWhich );
2635         aNewItem.SetColor( m_aUnderlineColorLB.GetSelectEntryColor() );
2636         rSet.Put( aNewItem );
2637         bModified |= sal_True;
2638     }
2639     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
2640         CLEARTITEM;
2641 
2642     bChanged = sal_True;
2643 
2644     // Overline
2645     nWhich = GetWhich( SID_ATTR_CHAR_OVERLINE );
2646     pOld = GetOldItem( rSet, SID_ATTR_CHAR_OVERLINE );
2647     nPos = m_aOverlineLB.GetSelectEntryPos();
2648     FontUnderline eOver = (FontUnderline)(sal_uLong)m_aOverlineLB.GetEntryData( nPos );
2649 
2650     if ( pOld )
2651     {
2652         //! if there are different underline styles in the selection the
2653         //! item-state in the 'rOldSet' will be invalid. In this case
2654         //! changing the underline style will be allowed if a style is
2655         //! selected in the listbox.
2656         sal_Bool bAllowChg = LISTBOX_ENTRY_NOTFOUND != nPos  &&
2657                          SFX_ITEM_DEFAULT > rOldSet.GetItemState( nWhich, sal_True );
2658 
2659         const SvxOverlineItem& rItem = *( (const SvxOverlineItem*)pOld );
2660         if ( (FontUnderline)rItem.GetValue() == eOver &&
2661              ( UNDERLINE_NONE == eOver || rItem.GetColor() == m_aOverlineColorLB.GetSelectEntryColor() ) &&
2662              ! bAllowChg )
2663             bChanged = sal_False;
2664     }
2665 
2666     if ( bChanged )
2667     {
2668         SvxOverlineItem aNewItem( eOver, nWhich );
2669         aNewItem.SetColor( m_aOverlineColorLB.GetSelectEntryColor() );
2670         rSet.Put( aNewItem );
2671         bModified |= sal_True;
2672     }
2673     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
2674         CLEARTITEM;
2675 
2676     bChanged = sal_True;
2677 
2678     // Strikeout
2679     nWhich = GetWhich( SID_ATTR_CHAR_STRIKEOUT );
2680     pOld = GetOldItem( rSet, SID_ATTR_CHAR_STRIKEOUT );
2681     nPos = m_aStrikeoutLB.GetSelectEntryPos();
2682     FontStrikeout eStrike = (FontStrikeout)(sal_uLong)m_aStrikeoutLB.GetEntryData( nPos );
2683 
2684     if ( pOld )
2685     {
2686         //! if there are different strikeout styles in the selection the
2687         //! item-state in the 'rOldSet' will be invalid. In this case
2688         //! changing the strikeout style will be allowed if a style is
2689         //! selected in the listbox.
2690         sal_Bool bAllowChg = LISTBOX_ENTRY_NOTFOUND != nPos  &&
2691                          SFX_ITEM_DEFAULT > rOldSet.GetItemState( nWhich, sal_True );
2692 
2693         const SvxCrossedOutItem& rItem = *( (const SvxCrossedOutItem*)pOld );
2694         if ( !m_aStrikeoutLB.IsEnabled()
2695             || ((FontStrikeout)rItem.GetValue() == eStrike  && !bAllowChg) )
2696             bChanged = sal_False;
2697     }
2698 
2699     if ( bChanged )
2700     {
2701         rSet.Put( SvxCrossedOutItem( eStrike, nWhich ) );
2702         bModified |= sal_True;
2703     }
2704     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
2705         CLEARTITEM;
2706 
2707     bChanged = sal_True;
2708 
2709     // Individual words
2710     nWhich = GetWhich( SID_ATTR_CHAR_WORDLINEMODE );
2711     pOld = GetOldItem( rSet, SID_ATTR_CHAR_WORDLINEMODE );
2712 
2713     if ( pOld )
2714     {
2715         const SvxWordLineModeItem& rItem = *( (const SvxWordLineModeItem*)pOld );
2716         if ( rItem.GetValue() == m_aIndividualWordsBtn.IsChecked() )
2717             bChanged = sal_False;
2718     }
2719 
2720     if ( rOldSet.GetItemState( nWhich ) == SFX_ITEM_DONTCARE &&
2721          m_aIndividualWordsBtn.IsChecked() == m_aIndividualWordsBtn.GetSavedValue() )
2722         bChanged = sal_False;
2723 
2724     if ( bChanged )
2725     {
2726         rSet.Put( SvxWordLineModeItem( m_aIndividualWordsBtn.IsChecked(), nWhich ) );
2727         bModified |= sal_True;
2728     }
2729     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
2730         CLEARTITEM;
2731 
2732     bChanged = sal_True;
2733 
2734     // Emphasis
2735     nWhich = GetWhich( SID_ATTR_CHAR_EMPHASISMARK );
2736     pOld = GetOldItem( rSet, SID_ATTR_CHAR_EMPHASISMARK );
2737     sal_uInt16 nMarkPos = m_aEmphasisLB.GetSelectEntryPos();
2738     sal_uInt16 nPosPos = m_aPositionLB.GetSelectEntryPos();
2739     FontEmphasisMark eMark = (FontEmphasisMark)nMarkPos;
2740     if ( m_aPositionLB.IsEnabled() )
2741     {
2742         eMark |= ( CHRDLG_POSITION_UNDER == (sal_uLong)m_aPositionLB.GetEntryData( nPosPos ) )
2743             ? EMPHASISMARK_POS_BELOW : EMPHASISMARK_POS_ABOVE;
2744     }
2745 
2746     if ( pOld )
2747     {
2748         if( rOldSet.GetItemState( nWhich ) != SFX_ITEM_DONTCARE )
2749         {
2750             const SvxEmphasisMarkItem& rItem = *( (const SvxEmphasisMarkItem*)pOld );
2751             if ( rItem.GetEmphasisMark() == eMark )
2752                 bChanged = sal_False;
2753         }
2754     }
2755 
2756     if ( rOldSet.GetItemState( nWhich ) == SFX_ITEM_DONTCARE &&
2757          m_aEmphasisLB.GetSavedValue() == nMarkPos && m_aPositionLB.GetSavedValue() == nPosPos )
2758         bChanged = sal_False;
2759 
2760     if ( bChanged )
2761     {
2762         rSet.Put( SvxEmphasisMarkItem( eMark, nWhich ) );
2763         bModified |= sal_True;
2764     }
2765     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
2766         CLEARTITEM;
2767 
2768     bChanged = sal_True;
2769 
2770     // Effects
2771     nWhich = GetWhich( SID_ATTR_CHAR_CASEMAP );
2772     pOld = GetOldItem( rSet, SID_ATTR_CHAR_CASEMAP );
2773     SvxCaseMap eCaseMap = SVX_CASEMAP_NOT_MAPPED;
2774     FASTBOOL bChecked = sal_False;
2775     sal_uInt16 nCapsPos = m_aEffects2LB.GetSelectEntryPos();
2776     if ( nCapsPos != LISTBOX_ENTRY_NOTFOUND )
2777     {
2778         eCaseMap = (SvxCaseMap)nCapsPos;
2779         bChecked = sal_True;
2780     }
2781 
2782     if ( pOld )
2783     {
2784         //! if there are different effect styles in the selection the
2785         //! item-state in the 'rOldSet' will be invalid. In this case
2786         //! changing the effect style will be allowed if a style is
2787         //! selected in the listbox.
2788         sal_Bool bAllowChg = LISTBOX_ENTRY_NOTFOUND != nPos  &&
2789                          SFX_ITEM_DEFAULT > rOldSet.GetItemState( nWhich, sal_True );
2790 
2791         const SvxCaseMapItem& rItem = *( (const SvxCaseMapItem*)pOld );
2792         if ( (SvxCaseMap)rItem.GetValue() == eCaseMap  &&  !bAllowChg )
2793             bChanged = sal_False;
2794     }
2795 
2796     if ( bChanged && bChecked )
2797     {
2798         rSet.Put( SvxCaseMapItem( eCaseMap, nWhich ) );
2799         bModified |= sal_True;
2800     }
2801     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
2802         CLEARTITEM;
2803 
2804     bChanged = sal_True;
2805 
2806     //Relief
2807     nWhich = GetWhich(SID_ATTR_CHAR_RELIEF);
2808     if(m_aReliefLB.GetSelectEntryPos() != m_aReliefLB.GetSavedValue())
2809     {
2810         m_aReliefLB.SaveValue();
2811         SvxCharReliefItem aRelief((FontRelief)m_aReliefLB.GetSelectEntryPos(), nWhich);
2812         rSet.Put(aRelief);
2813     }
2814 
2815     // Outline
2816     const SfxItemSet* pExampleSet = GetTabDialog() ? GetTabDialog()->GetExampleSet() : NULL;
2817     nWhich = GetWhich( SID_ATTR_CHAR_CONTOUR );
2818     pOld = GetOldItem( rSet, SID_ATTR_CHAR_CONTOUR );
2819     TriState eState = m_aOutlineBtn.GetState();
2820     const SfxPoolItem* pItem;
2821 
2822     if ( pOld )
2823     {
2824         const SvxContourItem& rItem = *( (const SvxContourItem*)pOld );
2825         if ( rItem.GetValue() == StateToAttr( eState ) && m_aOutlineBtn.GetSavedValue() == eState )
2826             bChanged = sal_False;
2827     }
2828 
2829     if ( !bChanged && pExampleSet && pExampleSet->GetItemState( nWhich, sal_False, &pItem ) == SFX_ITEM_SET &&
2830          !StateToAttr( eState ) && ( (SvxContourItem*)pItem )->GetValue() )
2831         bChanged = sal_True;
2832 
2833     if ( bChanged && eState != STATE_DONTKNOW )
2834     {
2835         rSet.Put( SvxContourItem( StateToAttr( eState ), nWhich ) );
2836         bModified |= sal_True;
2837     }
2838     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
2839         CLEARTITEM;
2840 
2841     bChanged = sal_True;
2842 
2843     // Shadow
2844     nWhich = GetWhich( SID_ATTR_CHAR_SHADOWED );
2845     pOld = GetOldItem( rSet, SID_ATTR_CHAR_SHADOWED );
2846     eState = m_aShadowBtn.GetState();
2847 
2848     if ( pOld )
2849     {
2850         const SvxShadowedItem& rItem = *( (const SvxShadowedItem*)pOld );
2851         if ( rItem.GetValue() == StateToAttr( eState ) && m_aShadowBtn.GetSavedValue() == eState )
2852             bChanged = sal_False;
2853     }
2854 
2855     if ( !bChanged && pExampleSet && pExampleSet->GetItemState( nWhich, sal_False, &pItem ) == SFX_ITEM_SET &&
2856          !StateToAttr( eState ) && ( (SvxShadowedItem*)pItem )->GetValue() )
2857         bChanged = sal_True;
2858 
2859     if ( bChanged && eState != STATE_DONTKNOW )
2860     {
2861         rSet.Put( SvxShadowedItem( StateToAttr( eState ), nWhich ) );
2862         bModified = sal_True;
2863     }
2864     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
2865         CLEARTITEM;
2866 
2867     bChanged = sal_True;
2868 
2869     // Blinking
2870     nWhich = GetWhich( SID_ATTR_FLASH );
2871     pOld = GetOldItem( rSet, SID_ATTR_FLASH );
2872     eState = m_aBlinkingBtn.GetState();
2873 
2874     if ( pOld )
2875     {
2876         const SvxBlinkItem& rItem = *( (const SvxBlinkItem*)pOld );
2877         if ( rItem.GetValue() == StateToAttr( eState ) && m_aBlinkingBtn.GetSavedValue() == eState )
2878             bChanged = sal_False;
2879     }
2880 
2881     if ( !bChanged && pExampleSet && pExampleSet->GetItemState( nWhich, sal_False, &pItem ) == SFX_ITEM_SET &&
2882          !StateToAttr( eState ) && ( (SvxBlinkItem*)pItem )->GetValue() )
2883         bChanged = sal_True;
2884 
2885     if ( bChanged && eState != STATE_DONTKNOW )
2886     {
2887         rSet.Put( SvxBlinkItem( StateToAttr( eState ), nWhich ) );
2888         bModified = sal_True;
2889     }
2890     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
2891         CLEARTITEM;
2892 
2893     // Hidden
2894     nWhich = GetWhich( SID_ATTR_CHAR_HIDDEN );
2895     pOld = GetOldItem( rSet, SID_ATTR_CHAR_HIDDEN );
2896     eState = m_aHiddenBtn.GetState();
2897     bChanged = sal_True;
2898 
2899     if ( pOld )
2900     {
2901         const SvxCharHiddenItem& rItem = *( (const SvxCharHiddenItem*)pOld );
2902         if ( rItem.GetValue() == StateToAttr( eState ) && m_aHiddenBtn.GetSavedValue() == eState )
2903             bChanged = sal_False;
2904     }
2905 
2906     if ( !bChanged && pExampleSet && pExampleSet->GetItemState( nWhich, sal_False, &pItem ) == SFX_ITEM_SET &&
2907          !StateToAttr( eState ) && ( (SvxCharHiddenItem*)pItem )->GetValue() )
2908         bChanged = sal_True;
2909 
2910     if ( bChanged && eState != STATE_DONTKNOW )
2911     {
2912         rSet.Put( SvxCharHiddenItem( StateToAttr( eState ), nWhich ) );
2913         bModified = sal_True;
2914     }
2915     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
2916         CLEARTITEM;
2917 
2918     bModified |= FillItemSetColor_Impl( rSet );
2919 
2920     return bModified;
2921 }
2922 
DisableControls(sal_uInt16 nDisable)2923 void SvxCharEffectsPage::DisableControls( sal_uInt16 nDisable )
2924 {
2925     if ( ( DISABLE_CASEMAP & nDisable ) == DISABLE_CASEMAP )
2926     {
2927         m_aEffectsFT.Disable();
2928         m_aEffects2LB.Disable();
2929     }
2930 
2931     if ( ( DISABLE_WORDLINE & nDisable ) == DISABLE_WORDLINE )
2932         m_aIndividualWordsBtn.Disable();
2933 
2934     if ( ( DISABLE_BLINK & nDisable ) == DISABLE_BLINK )
2935         m_aBlinkingBtn.Disable();
2936 
2937     if ( ( DISABLE_UNDERLINE_COLOR & nDisable ) == DISABLE_UNDERLINE_COLOR )
2938     {
2939         // disable the controls
2940         m_aUnderlineColorFT.Disable( );
2941         m_aUnderlineColorLB.Disable( );
2942         // and reroute the selection handler of the controls which normally would affect the color box dis-/enabling
2943         m_aUnderlineLB.SetSelectHdl(LINK(this, SvxCharEffectsPage, UpdatePreview_Impl));
2944         m_aStrikeoutLB.SetSelectHdl(LINK(this, SvxCharEffectsPage, UpdatePreview_Impl));
2945     }
2946 }
2947 
EnableFlash()2948 void SvxCharEffectsPage::EnableFlash()
2949 {
2950     if ( !( ( m_nHtmlMode & HTMLMODE_ON ) && !( m_nHtmlMode & HTMLMODE_BLINK ) ) )
2951         m_aBlinkingBtn.Show();
2952 }
2953 
2954 // -----------------------------------------------------------------------
SetPreviewBackgroundToCharacter()2955 void SvxCharEffectsPage::SetPreviewBackgroundToCharacter()
2956 {
2957     m_bPreviewBackgroundToCharacter = sal_True;
2958 }
2959 
2960 // -----------------------------------------------------------------------
PageCreated(SfxAllItemSet aSet)2961 void SvxCharEffectsPage::PageCreated (SfxAllItemSet aSet) //add CHINA001
2962 {
2963     SFX_ITEMSET_ARG (&aSet,pDisableCtlItem,SfxUInt16Item,SID_DISABLE_CTL,sal_False);
2964     SFX_ITEMSET_ARG (&aSet,pFlagItem,SfxUInt32Item,SID_FLAG_TYPE,sal_False);
2965     if (pDisableCtlItem)
2966         DisableControls(pDisableCtlItem->GetValue());
2967 
2968     if (pFlagItem)
2969     {
2970         sal_uInt32 nFlags=pFlagItem->GetValue();
2971         if ( ( nFlags & SVX_ENABLE_FLASH ) == SVX_ENABLE_FLASH )
2972             EnableFlash();
2973         if ( ( nFlags & SVX_PREVIEW_CHARACTER ) == SVX_PREVIEW_CHARACTER )
2974             SetPreviewBackgroundToCharacter();
2975     }
2976 }
2977 
2978 // class SvxCharPositionPage ---------------------------------------------
2979 
SvxCharPositionPage(Window * pParent,const SfxItemSet & rInSet)2980 SvxCharPositionPage::SvxCharPositionPage( Window* pParent, const SfxItemSet& rInSet ) :
2981 
2982     SvxCharBasePage( pParent, CUI_RES( RID_SVXPAGE_CHAR_POSITION ), rInSet, WIN_POS_PREVIEW, FT_POS_FONTTYPE ),
2983 
2984     m_aPositionLine     ( this, CUI_RES( FL_POSITION ) ),
2985     m_aHighPosBtn       ( this, CUI_RES( RB_HIGHPOS ) ),
2986     m_aNormalPosBtn     ( this, CUI_RES( RB_NORMALPOS ) ),
2987     m_aLowPosBtn        ( this, CUI_RES( RB_LOWPOS ) ),
2988     m_aHighLowFT        ( this, CUI_RES( FT_HIGHLOW ) ),
2989     m_aHighLowEdit      ( this, CUI_RES( ED_HIGHLOW ) ),
2990     m_aHighLowRB        ( this, CUI_RES( CB_HIGHLOW ) ),
2991     m_aFontSizeFT       ( this, CUI_RES( FT_FONTSIZE ) ),
2992     m_aFontSizeEdit     ( this, CUI_RES( ED_FONTSIZE ) ),
2993     m_aRotationScalingFL( this, CUI_RES( FL_ROTATION_SCALING ) ),
2994     m_aScalingFL        ( this, CUI_RES( FL_SCALING ) ),
2995     m_a0degRB           ( this, CUI_RES( RB_0_DEG ) ),
2996     m_a90degRB          ( this, CUI_RES( RB_90_DEG ) ),
2997     m_a270degRB         ( this, CUI_RES( RB_270_DEG ) ),
2998     m_aFitToLineCB      ( this, CUI_RES( CB_FIT_TO_LINE ) ),
2999     m_aScaleWidthFT     ( this, CUI_RES( FT_SCALE_WIDTH ) ),
3000     m_aScaleWidthMF     ( this, CUI_RES( MF_SCALE_WIDTH ) ),
3001 
3002     m_aKerningLine      ( this, CUI_RES( FL_KERNING2 ) ),
3003     m_aKerningLB        ( this, CUI_RES( LB_KERNING2 ) ),
3004     m_aKerningFT        ( this, CUI_RES( FT_KERNING2 ) ),
3005     m_aKerningEdit      ( this, CUI_RES( ED_KERNING2 ) ),
3006     m_aPairKerningBtn   ( this, CUI_RES( CB_PAIRKERNING ) ),
3007 
3008     m_nSuperEsc         ( (short)DFLT_ESC_SUPER ),
3009     m_nSubEsc           ( (short)DFLT_ESC_SUB ),
3010     m_nScaleWidthItemSetVal ( 100 ),
3011     m_nScaleWidthInitialVal ( 100 ),
3012     m_nSuperProp        ( (sal_uInt8)DFLT_ESC_PROP ),
3013     m_nSubProp          ( (sal_uInt8)DFLT_ESC_PROP )
3014 {
3015     FreeResource();
3016     Initialize();
3017 }
3018 
3019 // -----------------------------------------------------------------------
3020 
Initialize()3021 void SvxCharPositionPage::Initialize()
3022 {
3023     // to handle the changes of the other pages
3024     SetExchangeSupport();
3025 
3026     GetPreviewFont().SetSize( Size( 0, 240 ) );
3027     GetPreviewCJKFont().SetSize( Size( 0, 240 ) );
3028     GetPreviewCTLFont().SetSize( Size( 0, 240 ) );
3029 
3030     m_aNormalPosBtn.Check();
3031     PositionHdl_Impl( &m_aNormalPosBtn );
3032     m_aKerningLB.SelectEntryPos( 0 );
3033     KerningSelectHdl_Impl( NULL );
3034 
3035     Link aLink = LINK( this, SvxCharPositionPage, PositionHdl_Impl );
3036     m_aHighPosBtn.SetClickHdl( aLink );
3037     m_aNormalPosBtn.SetClickHdl( aLink );
3038     m_aLowPosBtn.SetClickHdl( aLink );
3039 
3040     aLink = LINK( this, SvxCharPositionPage, RotationHdl_Impl );
3041     m_a0degRB  .SetClickHdl( aLink );
3042     m_a90degRB .SetClickHdl( aLink );
3043     m_a270degRB.SetClickHdl( aLink );
3044 
3045     aLink = LINK( this, SvxCharPositionPage, FontModifyHdl_Impl );
3046     m_aHighLowEdit.SetModifyHdl( aLink );
3047     m_aFontSizeEdit.SetModifyHdl( aLink );
3048 
3049     aLink = LINK( this, SvxCharPositionPage, LoseFocusHdl_Impl );
3050     m_aHighLowEdit.SetLoseFocusHdl( aLink );
3051     m_aFontSizeEdit.SetLoseFocusHdl( aLink );
3052 
3053     m_aHighLowRB.SetClickHdl( LINK( this, SvxCharPositionPage, AutoPositionHdl_Impl ) );
3054     m_aFitToLineCB.SetClickHdl( LINK( this, SvxCharPositionPage, FitToLineHdl_Impl ) );
3055     m_aKerningLB.SetSelectHdl( LINK( this, SvxCharPositionPage, KerningSelectHdl_Impl ) );
3056     m_aKerningEdit.SetModifyHdl( LINK( this, SvxCharPositionPage, KerningModifyHdl_Impl ) );
3057     m_aPairKerningBtn.SetClickHdl( LINK( this, SvxCharPositionPage, PairKerningHdl_Impl ) );
3058     m_aScaleWidthMF.SetModifyHdl( LINK( this, SvxCharPositionPage, ScaleWidthModifyHdl_Impl ) );
3059 }
3060 
3061 // -----------------------------------------------------------------------
3062 
UpdatePreview_Impl(sal_uInt8 nProp,sal_uInt8 nEscProp,short nEsc)3063 void SvxCharPositionPage::UpdatePreview_Impl( sal_uInt8 nProp, sal_uInt8 nEscProp, short nEsc )
3064 {
3065     SetPrevFontEscapement( nProp, nEscProp, nEsc );
3066 }
3067 
3068 // -----------------------------------------------------------------------
3069 
SetEscapement_Impl(sal_uInt16 nEsc)3070 void SvxCharPositionPage::SetEscapement_Impl( sal_uInt16 nEsc )
3071 {
3072     SvxEscapementItem aEscItm( (SvxEscapement)nEsc, SID_ATTR_CHAR_ESCAPEMENT );
3073 
3074     if ( SVX_ESCAPEMENT_SUPERSCRIPT == nEsc )
3075     {
3076         aEscItm.GetEsc() = m_nSuperEsc;
3077         aEscItm.GetProp() = m_nSuperProp;
3078     }
3079     else if ( SVX_ESCAPEMENT_SUBSCRIPT == nEsc )
3080     {
3081         aEscItm.GetEsc() = m_nSubEsc;
3082         aEscItm.GetProp() = m_nSubProp;
3083     }
3084 
3085     short nFac = aEscItm.GetEsc() < 0 ? -1 : 1;
3086 
3087     m_aHighLowEdit.SetValue( aEscItm.GetEsc() * nFac );
3088     m_aFontSizeEdit.SetValue( aEscItm.GetProp() );
3089 
3090     if ( SVX_ESCAPEMENT_OFF == nEsc )
3091     {
3092         m_aHighLowFT.Disable();
3093         m_aHighLowEdit.Disable();
3094         m_aFontSizeFT.Disable();
3095         m_aFontSizeEdit.Disable();
3096         m_aHighLowRB.Disable();
3097     }
3098     else
3099     {
3100         m_aFontSizeFT.Enable();
3101         m_aFontSizeEdit.Enable();
3102         m_aHighLowRB.Enable();
3103 
3104         if ( !m_aHighLowRB.IsChecked() )
3105         {
3106             m_aHighLowFT.Enable();
3107             m_aHighLowEdit.Enable();
3108         }
3109         else
3110             AutoPositionHdl_Impl( &m_aHighLowRB );
3111     }
3112 
3113     UpdatePreview_Impl( 100, aEscItm.GetProp(), aEscItm.GetEsc() );
3114 }
3115 
3116 // -----------------------------------------------------------------------
3117 
IMPL_LINK(SvxCharPositionPage,PositionHdl_Impl,RadioButton *,pBtn)3118 IMPL_LINK( SvxCharPositionPage, PositionHdl_Impl, RadioButton*, pBtn )
3119 {
3120     sal_uInt16 nEsc = SVX_ESCAPEMENT_OFF;   // also when pBtn == NULL
3121 
3122     if ( &m_aHighPosBtn == pBtn )
3123         nEsc = SVX_ESCAPEMENT_SUPERSCRIPT;
3124     else if ( &m_aLowPosBtn == pBtn )
3125         nEsc = SVX_ESCAPEMENT_SUBSCRIPT;
3126 
3127     SetEscapement_Impl( nEsc );
3128     return 0;
3129 }
3130 
3131 // -----------------------------------------------------------------------
3132 
IMPL_LINK(SvxCharPositionPage,RotationHdl_Impl,RadioButton *,pBtn)3133 IMPL_LINK( SvxCharPositionPage, RotationHdl_Impl, RadioButton*, pBtn )
3134 {
3135     sal_Bool bEnable = sal_False;
3136     if (&m_a90degRB == pBtn  ||  &m_a270degRB == pBtn)
3137         bEnable = sal_True;
3138     else
3139         OSL_ENSURE( &m_a0degRB == pBtn, "unexpected button" );
3140     m_aFitToLineCB.Enable( bEnable );
3141     return 0;
3142 }
3143 
3144 // -----------------------------------------------------------------------
3145 
IMPL_LINK(SvxCharPositionPage,FontModifyHdl_Impl,MetricField *,EMPTYARG)3146 IMPL_LINK( SvxCharPositionPage, FontModifyHdl_Impl, MetricField*, EMPTYARG )
3147 {
3148     sal_uInt8 nEscProp = (sal_uInt8)m_aFontSizeEdit.GetValue();
3149     short nEsc  = (short)m_aHighLowEdit.GetValue();
3150     nEsc *= m_aLowPosBtn.IsChecked() ? -1 : 1;
3151     UpdatePreview_Impl( 100, nEscProp, nEsc );
3152     return 0;
3153 }
3154 
3155 // -----------------------------------------------------------------------
3156 
IMPL_LINK(SvxCharPositionPage,AutoPositionHdl_Impl,CheckBox *,pBox)3157 IMPL_LINK( SvxCharPositionPage, AutoPositionHdl_Impl, CheckBox*, pBox )
3158 {
3159     if ( pBox->IsChecked() )
3160     {
3161         m_aHighLowFT.Disable();
3162         m_aHighLowEdit.Disable();
3163     }
3164     else
3165         PositionHdl_Impl( m_aHighPosBtn.IsChecked() ? &m_aHighPosBtn
3166                                                       : m_aLowPosBtn.IsChecked() ? &m_aLowPosBtn
3167                                                                                  : &m_aNormalPosBtn );
3168     return 0;
3169 }
3170 
3171 // -----------------------------------------------------------------------
3172 
IMPL_LINK(SvxCharPositionPage,FitToLineHdl_Impl,CheckBox *,pBox)3173 IMPL_LINK( SvxCharPositionPage, FitToLineHdl_Impl, CheckBox*, pBox )
3174 {
3175     if ( &m_aFitToLineCB == pBox)
3176     {
3177         sal_uInt16 nVal = m_nScaleWidthInitialVal;
3178         if (m_aFitToLineCB.IsChecked())
3179             nVal = m_nScaleWidthItemSetVal;
3180         m_aScaleWidthMF.SetValue( nVal );
3181 
3182         m_aPreviewWin.SetFontWidthScale( nVal );
3183     }
3184     return 0;
3185 }
3186 
3187 // -----------------------------------------------------------------------
3188 
IMPL_LINK(SvxCharPositionPage,KerningSelectHdl_Impl,ListBox *,EMPTYARG)3189 IMPL_LINK( SvxCharPositionPage, KerningSelectHdl_Impl, ListBox*, EMPTYARG )
3190 {
3191     if ( m_aKerningLB.GetSelectEntryPos() > 0 )
3192     {
3193         m_aKerningFT.Enable();
3194         m_aKerningEdit.Enable();
3195 
3196         if ( m_aKerningLB.GetSelectEntryPos() == 2 )
3197         {
3198             // Condensed -> max value == 1/6 of the current font height
3199             SvxFont& rFont = GetPreviewFont();
3200             long nMax = rFont.GetSize().Height() / 6;
3201             m_aKerningEdit.SetMax( m_aKerningEdit.Normalize( nMax ), FUNIT_TWIP );
3202             m_aKerningEdit.SetLast( m_aKerningEdit.GetMax( m_aKerningEdit.GetUnit() ) );
3203         }
3204         else
3205         {
3206             m_aKerningEdit.SetMax( 9999 );
3207             m_aKerningEdit.SetLast( 9999 );
3208         }
3209     }
3210     else
3211     {
3212         m_aKerningEdit.SetValue( 0 );
3213         m_aKerningFT.Disable();
3214         m_aKerningEdit.Disable();
3215     }
3216 
3217     KerningModifyHdl_Impl( NULL );
3218 
3219     return 0;
3220 }
3221 
3222 // -----------------------------------------------------------------------
3223 
IMPL_LINK(SvxCharPositionPage,KerningModifyHdl_Impl,MetricField *,EMPTYARG)3224 IMPL_LINK( SvxCharPositionPage, KerningModifyHdl_Impl, MetricField*, EMPTYARG )
3225 {
3226     long nVal = static_cast<long>(m_aKerningEdit.GetValue());
3227     nVal = LogicToLogic( nVal, MAP_POINT, MAP_TWIP );
3228     long nKern = (short)m_aKerningEdit.Denormalize( nVal );
3229 
3230     // Condensed? -> then negative
3231     if ( m_aKerningLB.GetSelectEntryPos() == 2 )
3232         nKern *= -1;
3233 
3234     SvxFont& rFont = GetPreviewFont();
3235     SvxFont& rCJKFont = GetPreviewCJKFont();
3236     SvxFont& rCTLFont = GetPreviewCTLFont();
3237 
3238     rFont.SetFixKerning( (short)nKern );
3239     rCJKFont.SetFixKerning( (short)nKern );
3240     rCTLFont.SetFixKerning( (short)nKern );
3241     m_aPreviewWin.Invalidate();
3242     return 0;
3243 }
3244 
3245 // -----------------------------------------------------------------------
3246 
IMPL_LINK(SvxCharPositionPage,PairKerningHdl_Impl,CheckBox *,EMPTYARG)3247 IMPL_LINK( SvxCharPositionPage, PairKerningHdl_Impl, CheckBox*, EMPTYARG )
3248 {
3249     return 0;
3250 }
3251 
3252 // -----------------------------------------------------------------------
3253 
IMPL_LINK(SvxCharPositionPage,LoseFocusHdl_Impl,MetricField *,pField)3254 IMPL_LINK( SvxCharPositionPage, LoseFocusHdl_Impl, MetricField*, pField )
3255 {
3256 #ifdef DBG_UTIL
3257     sal_Bool bHigh = m_aHighPosBtn.IsChecked();
3258 #endif
3259     sal_Bool bLow = m_aLowPosBtn.IsChecked();
3260     DBG_ASSERT( bHigh || bLow, "normal position is not valid" );
3261 
3262     if ( &m_aHighLowEdit == pField )
3263     {
3264         if ( bLow )
3265             m_nSubEsc = (short)m_aHighLowEdit.GetValue() * -1;
3266         else
3267             m_nSuperEsc = (short)m_aHighLowEdit.GetValue();
3268     }
3269     else if ( &m_aFontSizeEdit == pField )
3270     {
3271         if ( bLow )
3272             m_nSubProp = (sal_uInt8)m_aFontSizeEdit.GetValue();
3273         else
3274             m_nSuperProp = (sal_uInt8)m_aFontSizeEdit.GetValue();
3275     }
3276     return 0;
3277 }
3278 
3279 // -----------------------------------------------------------------------
3280 
IMPL_LINK(SvxCharPositionPage,ScaleWidthModifyHdl_Impl,MetricField *,EMPTYARG)3281 IMPL_LINK( SvxCharPositionPage, ScaleWidthModifyHdl_Impl, MetricField*, EMPTYARG )
3282 {
3283     m_aPreviewWin.SetFontWidthScale( sal_uInt16( m_aScaleWidthMF.GetValue() ) );
3284 
3285     return 0;
3286 }
3287 
3288 /* -----------------28.08.2003 12:12-----------------
3289 
3290  --------------------------------------------------*/
ActivatePage(const SfxItemSet & rSet)3291 void  SvxCharPositionPage::ActivatePage( const SfxItemSet& rSet )
3292 {
3293     //update the preview
3294     SvxCharBasePage::ActivatePage( rSet );
3295 
3296     //the only thing that has to be checked is the max. allowed value for the
3297     //condense edit field
3298     if ( m_aKerningLB.GetSelectEntryPos() == 2 )
3299     {
3300         // Condensed -> max value == 1/6 of the current font height
3301         SvxFont& rFont = GetPreviewFont();
3302         long nMax = rFont.GetSize().Height() / 6;
3303         long nKern = (short)m_aKerningEdit.Denormalize( LogicToLogic( static_cast<long>(m_aKerningEdit.GetValue()), MAP_POINT, MAP_TWIP ) );
3304         m_aKerningEdit.SetMax( m_aKerningEdit.Normalize( nKern > nMax ? nKern : nMax ), FUNIT_TWIP );
3305         m_aKerningEdit.SetLast( m_aKerningEdit.GetMax( m_aKerningEdit.GetUnit() ) );
3306     }
3307 }
3308 
3309 // -----------------------------------------------------------------------
3310 
DeactivatePage(SfxItemSet * _pSet)3311 int SvxCharPositionPage::DeactivatePage( SfxItemSet* _pSet )
3312 {
3313     if ( _pSet )
3314         FillItemSet( *_pSet );
3315     return LEAVE_PAGE;
3316 }
3317 
3318 // -----------------------------------------------------------------------
3319 
Create(Window * pParent,const SfxItemSet & rSet)3320 SfxTabPage* SvxCharPositionPage::Create( Window* pParent, const SfxItemSet& rSet )
3321 {
3322     return new SvxCharPositionPage( pParent, rSet );
3323 }
3324 
3325 // -----------------------------------------------------------------------
3326 
GetRanges()3327 sal_uInt16* SvxCharPositionPage::GetRanges()
3328 {
3329     return pPositionRanges;
3330 }
3331 
3332 // -----------------------------------------------------------------------
Reset(const SfxItemSet & rSet)3333 void SvxCharPositionPage::Reset( const SfxItemSet& rSet )
3334 {
3335     String sUser = GetUserData();
3336 
3337     if ( sUser.Len() )
3338     {
3339         m_nSuperEsc = (short)sUser.GetToken( 0 ).ToInt32();
3340         m_nSubEsc = (short)sUser.GetToken( 1 ).ToInt32();
3341         m_nSuperProp = (sal_uInt8)sUser.GetToken( 2 ).ToInt32();
3342         m_nSubProp = (sal_uInt8)sUser.GetToken( 3 ).ToInt32();
3343     }
3344 
3345     short nEsc = 0;
3346     sal_uInt8 nEscProp = 100;
3347     sal_uInt8 nProp = 100;
3348 
3349     m_aHighLowFT.Disable();
3350     m_aHighLowEdit.Disable();
3351     m_aFontSizeFT.Disable();
3352     m_aFontSizeEdit.Disable();
3353 
3354     SvxFont& rFont = GetPreviewFont();
3355     SvxFont& rCJKFont = GetPreviewCJKFont();
3356     SvxFont& rCTLFont = GetPreviewCTLFont();
3357     sal_uInt16 nWhich = GetWhich( SID_ATTR_CHAR_ESCAPEMENT );
3358 
3359     if ( rSet.GetItemState( nWhich ) >= SFX_ITEM_DEFAULT )
3360     {
3361         const SvxEscapementItem& rItem = (SvxEscapementItem&)rSet.Get( nWhich );
3362         nEsc = rItem.GetEsc();
3363         nEscProp = rItem.GetProp();
3364 
3365         if ( nEsc != 0 )
3366         {
3367             m_aHighLowFT.Enable();
3368             m_aHighLowEdit.Enable();
3369             m_aFontSizeFT.Enable();
3370             m_aFontSizeEdit.Enable();
3371 
3372             short nFac;
3373             sal_Bool bAutomatic(sal_False);
3374 
3375             if ( nEsc > 0 )
3376             {
3377                 nFac = 1;
3378                 m_aHighPosBtn.Check( sal_True );
3379                 if ( nEsc == DFLT_ESC_AUTO_SUPER )
3380                 {
3381                     nEsc = DFLT_ESC_SUPER;
3382                     bAutomatic = sal_True;
3383                 }
3384             }
3385             else
3386             {
3387                 nFac = -1;
3388                 m_aLowPosBtn.Check( sal_True );
3389                 if ( nEsc == DFLT_ESC_AUTO_SUB )
3390                 {
3391                     nEsc = DFLT_ESC_SUB;
3392                     bAutomatic = sal_True;
3393                 }
3394             }
3395             if (!m_aHighLowRB.IsEnabled())
3396             {
3397                 m_aHighLowRB.Enable();
3398             }
3399             m_aHighLowRB.Check(bAutomatic);
3400 
3401             if ( m_aHighLowRB.IsChecked() )
3402             {
3403                 m_aHighLowFT.Disable();
3404                 m_aHighLowEdit.Disable();
3405             }
3406             m_aHighLowEdit.SetValue( m_aHighLowEdit.Normalize( nFac * nEsc ) );
3407         }
3408         else
3409         {
3410             m_aNormalPosBtn.Check( sal_True );
3411             m_aHighLowRB.Check( sal_True );
3412             PositionHdl_Impl( NULL );
3413         }
3414         //the height has to be set after the handler is called to keep the value also if the escapement is zero
3415         m_aFontSizeEdit.SetValue( m_aFontSizeEdit.Normalize( nEscProp ) );
3416     }
3417     else
3418     {
3419         m_aHighPosBtn.Check( sal_False );
3420         m_aNormalPosBtn.Check( sal_False );
3421         m_aLowPosBtn.Check( sal_False );
3422     }
3423 
3424     // BspFont setzen
3425     SetPrevFontEscapement( nProp, nEscProp, nEsc );
3426 
3427     // Kerning
3428     nWhich = GetWhich( SID_ATTR_CHAR_KERNING );
3429 
3430     if ( rSet.GetItemState( nWhich ) >= SFX_ITEM_DEFAULT )
3431     {
3432         const SvxKerningItem& rItem = (SvxKerningItem&)rSet.Get( nWhich );
3433         SfxMapUnit eUnit = rSet.GetPool()->GetMetric( nWhich );
3434         MapUnit eOrgUnit = (MapUnit)eUnit;
3435         MapUnit ePntUnit( MAP_POINT );
3436         long nBig = static_cast<long>(m_aKerningEdit.Normalize( static_cast<long>(rItem.GetValue()) ));
3437         long nKerning = LogicToLogic( nBig, eOrgUnit, ePntUnit );
3438 
3439         // Kerning am Font setzen, vorher in Twips umrechnen
3440         long nKern = LogicToLogic( rItem.GetValue(), (MapUnit)eUnit, MAP_TWIP );
3441         rFont.SetFixKerning( (short)nKern );
3442         rCJKFont.SetFixKerning( (short)nKern );
3443         rCTLFont.SetFixKerning( (short)nKern );
3444 
3445         if ( nKerning > 0 )
3446         {
3447             m_aKerningLB.SelectEntryPos( LW_GESPERRT );
3448         }
3449         else if ( nKerning < 0 )
3450         {
3451             m_aKerningLB.SelectEntryPos( LW_SCHMAL );
3452             nKerning = -nKerning;
3453         }
3454         else
3455         {
3456             nKerning = 0;
3457             m_aKerningLB.SelectEntryPos( LW_NORMAL );
3458         }
3459         //enable/disable and set min/max of the Edit
3460         KerningSelectHdl_Impl(&m_aKerningLB);
3461         //the attribute value must be displayed also if it's above the maximum allowed value
3462         long nVal = static_cast<long>(m_aKerningEdit.GetMax());
3463         if(nVal < nKerning)
3464             m_aKerningEdit.SetMax( nKerning );
3465         m_aKerningEdit.SetValue( nKerning );
3466     }
3467     else
3468         m_aKerningEdit.SetText( String() );
3469 
3470     // Pair kerning
3471     nWhich = GetWhich( SID_ATTR_CHAR_AUTOKERN );
3472 
3473     if ( rSet.GetItemState( nWhich ) >= SFX_ITEM_DEFAULT )
3474     {
3475         const SvxAutoKernItem& rItem = (SvxAutoKernItem&)rSet.Get( nWhich );
3476         m_aPairKerningBtn.Check( rItem.GetValue() );
3477     }
3478     else
3479         m_aPairKerningBtn.Check( sal_False );
3480 
3481     // Scale Width
3482     nWhich = GetWhich( SID_ATTR_CHAR_SCALEWIDTH );
3483     if ( rSet.GetItemState( nWhich ) >= SFX_ITEM_DEFAULT )
3484     {
3485         const SvxCharScaleWidthItem& rItem = ( SvxCharScaleWidthItem& ) rSet.Get( nWhich );
3486         m_nScaleWidthInitialVal = rItem.GetValue();
3487         m_aScaleWidthMF.SetValue( m_nScaleWidthInitialVal );
3488     }
3489     else
3490         m_aScaleWidthMF.SetValue( 100 );
3491 
3492     nWhich = GetWhich( SID_ATTR_CHAR_WIDTH_FIT_TO_LINE );
3493     if ( rSet.GetItemState( nWhich ) >= SFX_ITEM_DEFAULT )
3494         m_nScaleWidthItemSetVal = ((SfxUInt16Item&) rSet.Get( nWhich )).GetValue();
3495 
3496     // Rotation
3497     nWhich = GetWhich( SID_ATTR_CHAR_ROTATED );
3498     SfxItemState eState = rSet.GetItemState( nWhich );
3499     if( SFX_ITEM_UNKNOWN == eState )
3500     {
3501         m_aRotationScalingFL.Hide();
3502         m_aScalingFL.Show();
3503         m_a0degRB.Hide();
3504         m_a90degRB.Hide();
3505         m_a270degRB.Hide();
3506         m_aFitToLineCB.Hide();
3507         m_aFitToLineCB .Hide();
3508 
3509 
3510         // move the following controls upwards
3511         Window* aCntrlArr[] = {
3512             &m_aScaleWidthFT, &m_aScaleWidthMF, &m_aKerningLine,
3513             &m_aKerningLB, &m_aKerningFT, &m_aKerningEdit, &m_aPairKerningBtn,
3514             0 };
3515 
3516         long nDiff = m_aScaleWidthMF.GetPosPixel().Y() -
3517                         m_a0degRB.GetPosPixel().Y();
3518 
3519         for( Window** ppW = aCntrlArr; *ppW; ++ppW )
3520         {
3521             Point aPnt( (*ppW)->GetPosPixel() );
3522             aPnt.Y() -= nDiff;
3523             (*ppW)->SetPosPixel( aPnt );
3524         }
3525     }
3526     else
3527     {
3528         m_aScalingFL.Hide();
3529 
3530         Link aOldLink( m_aFitToLineCB.GetClickHdl() );
3531         m_aFitToLineCB.SetClickHdl( Link() );
3532         if( eState >= SFX_ITEM_DEFAULT )
3533         {
3534             const SvxCharRotateItem& rItem =
3535                     (SvxCharRotateItem&) rSet.Get( nWhich );
3536             if (rItem.IsBottomToTop())
3537                 m_a90degRB.Check( sal_True );
3538             else if (rItem.IsTopToBotton())
3539                 m_a270degRB.Check( sal_True );
3540             else
3541             {
3542                 DBG_ASSERT( 0 == rItem.GetValue(), "incorrect value" );
3543                 m_a0degRB.Check( sal_True );
3544             }
3545             m_aFitToLineCB.Check( rItem.IsFitToLine() );
3546         }
3547         else
3548         {
3549             if( eState == SFX_ITEM_DONTCARE )
3550             {
3551                 m_a0degRB.Check( sal_False );
3552                 m_a90degRB.Check( sal_False );
3553                 m_a270degRB.Check( sal_False );
3554             }
3555             else
3556                 m_a0degRB.Check( sal_True );
3557 
3558             m_aFitToLineCB.Check( sal_False );
3559         }
3560         m_aFitToLineCB.SetClickHdl( aOldLink );
3561         m_aFitToLineCB.Enable( !m_a0degRB.IsChecked() );
3562 
3563         // is this value set?
3564         if( SFX_ITEM_UNKNOWN == rSet.GetItemState( GetWhich(
3565                                         SID_ATTR_CHAR_WIDTH_FIT_TO_LINE ) ))
3566             m_aFitToLineCB.Hide();
3567     }
3568 
3569     m_aHighPosBtn.SaveValue();
3570     m_aNormalPosBtn.SaveValue();
3571     m_aLowPosBtn.SaveValue();
3572     m_a0degRB.SaveValue();
3573     m_a90degRB.SaveValue();
3574     m_a270degRB.SaveValue();
3575     m_aFitToLineCB.SaveValue();
3576     m_aScaleWidthMF.SaveValue();
3577     m_aKerningLB.SaveValue();
3578     m_aKerningEdit.SaveValue();
3579     m_aPairKerningBtn.SaveValue();
3580 }
3581 
3582 // -----------------------------------------------------------------------
3583 
FillItemSet(SfxItemSet & rSet)3584 sal_Bool SvxCharPositionPage::FillItemSet( SfxItemSet& rSet )
3585 {
3586     //  Position (hoch, normal oder tief)
3587     const SfxItemSet& rOldSet = GetItemSet();
3588     sal_Bool bModified = sal_False, bChanged = sal_True;
3589     sal_uInt16 nWhich = GetWhich( SID_ATTR_CHAR_ESCAPEMENT );
3590     const SfxPoolItem* pOld = GetOldItem( rSet, SID_ATTR_CHAR_ESCAPEMENT );
3591     const FASTBOOL bHigh = m_aHighPosBtn.IsChecked();
3592     short nEsc;
3593     sal_uInt8  nEscProp;
3594 
3595     if ( bHigh || m_aLowPosBtn.IsChecked() )
3596     {
3597         if ( m_aHighLowRB.IsChecked() )
3598             nEsc = bHigh ? DFLT_ESC_AUTO_SUPER : DFLT_ESC_AUTO_SUB;
3599         else
3600         {
3601             nEsc = (short)m_aHighLowEdit.Denormalize( m_aHighLowEdit.GetValue() );
3602             nEsc *= bHigh ? 1 : -1;
3603         }
3604         nEscProp = (sal_uInt8)m_aFontSizeEdit.Denormalize( m_aFontSizeEdit.GetValue() );
3605     }
3606     else
3607     {
3608         nEsc  = 0;
3609         nEscProp = 100;
3610     }
3611 
3612     if ( pOld )
3613     {
3614         const SvxEscapementItem& rItem = *( (const SvxEscapementItem*)pOld );
3615         if ( rItem.GetEsc() == nEsc && rItem.GetProp() == nEscProp  )
3616             bChanged = sal_False;
3617     }
3618 
3619     if ( !bChanged && !m_aHighPosBtn.GetSavedValue() &&
3620          !m_aNormalPosBtn.GetSavedValue() && !m_aLowPosBtn.GetSavedValue() )
3621         bChanged = sal_True;
3622 
3623     if ( bChanged &&
3624          ( m_aHighPosBtn.IsChecked() || m_aNormalPosBtn.IsChecked() || m_aLowPosBtn.IsChecked() ) )
3625     {
3626         rSet.Put( SvxEscapementItem( nEsc, nEscProp, nWhich ) );
3627         bModified = sal_True;
3628     }
3629     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
3630         CLEARTITEM;
3631 
3632     bChanged = sal_True;
3633 
3634     // Kerning
3635     nWhich = GetWhich( SID_ATTR_CHAR_KERNING );
3636     pOld = GetOldItem( rSet, SID_ATTR_CHAR_KERNING );
3637     sal_uInt16 nPos = m_aKerningLB.GetSelectEntryPos();
3638     short nKerning = 0;
3639     SfxMapUnit eUnit = rSet.GetPool()->GetMetric( nWhich );
3640 
3641     if ( nPos == LW_GESPERRT || nPos == LW_SCHMAL )
3642     {
3643         long nTmp = static_cast<long>(m_aKerningEdit.GetValue());
3644         long nVal = LogicToLogic( nTmp, MAP_POINT, (MapUnit)eUnit );
3645         nKerning = (short)m_aKerningEdit.Denormalize( nVal );
3646 
3647         if ( nPos == LW_SCHMAL )
3648             nKerning *= - 1;
3649     }
3650 
3651     if ( pOld )
3652     {
3653         const SvxKerningItem& rItem = *( (const SvxKerningItem*)pOld );
3654         if ( rItem.GetValue() == nKerning )
3655             bChanged = sal_False;
3656     }
3657 
3658     if ( !bChanged &&
3659          ( m_aKerningLB.GetSavedValue() == LISTBOX_ENTRY_NOTFOUND ||
3660            ( !m_aKerningEdit.GetSavedValue().Len() && m_aKerningEdit.IsEnabled() ) ) )
3661         bChanged = sal_True;
3662 
3663     if ( bChanged && nPos != LISTBOX_ENTRY_NOTFOUND )
3664     {
3665         rSet.Put( SvxKerningItem( nKerning, nWhich ) );
3666         bModified |= sal_True;
3667     }
3668     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
3669         CLEARTITEM;
3670 
3671     bChanged = sal_True;
3672 
3673     // Pair-Kerning
3674     nWhich = GetWhich( SID_ATTR_CHAR_AUTOKERN );
3675 
3676     if ( m_aPairKerningBtn.IsChecked() != m_aPairKerningBtn.GetSavedValue() )
3677     {
3678         rSet.Put( SvxAutoKernItem( m_aPairKerningBtn.IsChecked(), nWhich ) );
3679         bModified |= sal_True;
3680     }
3681     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
3682         CLEARTITEM;
3683 
3684     // Scale Width
3685     nWhich = GetWhich( SID_ATTR_CHAR_SCALEWIDTH );
3686     if ( m_aScaleWidthMF.GetText() != m_aScaleWidthMF.GetSavedValue() )
3687     {
3688         rSet.Put( SvxCharScaleWidthItem( (sal_uInt16)m_aScaleWidthMF.GetValue(), nWhich ) );
3689         bModified |= sal_True;
3690     }
3691     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
3692         CLEARTITEM;
3693 
3694     // Rotation
3695     nWhich = GetWhich( SID_ATTR_CHAR_ROTATED );
3696     if ( m_a0degRB     .IsChecked() != m_a0degRB     .GetSavedValue()  ||
3697          m_a90degRB    .IsChecked() != m_a90degRB    .GetSavedValue()  ||
3698          m_a270degRB   .IsChecked() != m_a270degRB   .GetSavedValue()  ||
3699          m_aFitToLineCB.IsChecked() != m_aFitToLineCB.GetSavedValue() )
3700     {
3701         SvxCharRotateItem aItem( 0, m_aFitToLineCB.IsChecked(), nWhich );
3702         if (m_a90degRB.IsChecked())
3703             aItem.SetBottomToTop();
3704         else if (m_a270degRB.IsChecked())
3705             aItem.SetTopToBotton();
3706         rSet.Put( aItem );
3707         bModified |= sal_True;
3708     }
3709     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
3710         CLEARTITEM;
3711 
3712     return bModified;
3713 }
3714 
3715 // -----------------------------------------------------------------------
3716 
FillUserData()3717 void SvxCharPositionPage::FillUserData()
3718 {
3719     const sal_Unicode cTok = ';';
3720 
3721     String sUser( UniString::CreateFromInt32( m_nSuperEsc ) );
3722     sUser.Append( cTok );
3723     sUser.Append( UniString::CreateFromInt32( m_nSubEsc ) );
3724     sUser.Append( cTok );
3725     sUser.Append( UniString::CreateFromInt32( m_nSuperProp ) );
3726     sUser.Append( cTok );
3727     sUser.Append( UniString::CreateFromInt32( m_nSubProp ) );
3728     SetUserData( sUser );
3729 }
3730 
3731 // -----------------------------------------------------------------------
SetPreviewBackgroundToCharacter()3732 void SvxCharPositionPage::SetPreviewBackgroundToCharacter()
3733 {
3734     m_bPreviewBackgroundToCharacter = sal_True;
3735 }
3736 // -----------------------------------------------------------------------
PageCreated(SfxAllItemSet aSet)3737 void SvxCharPositionPage::PageCreated (SfxAllItemSet aSet) //add CHINA001
3738 {
3739     SFX_ITEMSET_ARG (&aSet,pFlagItem,SfxUInt32Item,SID_FLAG_TYPE,sal_False);
3740     if (pFlagItem)
3741     {
3742         sal_uInt32 nFlags=pFlagItem->GetValue();
3743         if ( ( nFlags & SVX_PREVIEW_CHARACTER ) == SVX_PREVIEW_CHARACTER )
3744             SetPreviewBackgroundToCharacter();
3745     }
3746 }
3747 // class SvxCharTwoLinesPage ------------------------------------------------
3748 
SvxCharTwoLinesPage(Window * pParent,const SfxItemSet & rInSet)3749 SvxCharTwoLinesPage::SvxCharTwoLinesPage( Window* pParent, const SfxItemSet& rInSet ) :
3750 
3751     SvxCharBasePage( pParent, CUI_RES( RID_SVXPAGE_CHAR_TWOLINES ), rInSet, WIN_TWOLINES_PREVIEW, FT_TWOLINES_FONTTYPE ),
3752 
3753     m_aSwitchOnLine     ( this, CUI_RES( FL_SWITCHON ) ),
3754     m_aTwoLinesBtn      ( this, CUI_RES( CB_TWOLINES ) ),
3755 
3756     m_aEncloseLine      ( this, CUI_RES( FL_ENCLOSE ) ),
3757     m_aStartBracketFT   ( this, CUI_RES( FT_STARTBRACKET ) ),
3758     m_aStartBracketLB   ( this, CUI_RES( ED_STARTBRACKET ) ),
3759     m_aEndBracketFT     ( this, CUI_RES( FT_ENDBRACKET ) ),
3760     m_aEndBracketLB     ( this, CUI_RES( ED_ENDBRACKET ) ),
3761     m_nStartBracketPosition( 0 ),
3762     m_nEndBracketPosition( 0 )
3763 {
3764     FreeResource();
3765     Initialize();
3766 }
3767 
3768 // -----------------------------------------------------------------------
3769 
Initialize()3770 void SvxCharTwoLinesPage::Initialize()
3771 {
3772     Size aSize = m_aStartBracketLB.GetSizePixel();
3773     aSize.Height() = m_aStartBracketLB.CalcSize( 1, 6 ).Height();
3774     m_aStartBracketLB.SetSizePixel( aSize );
3775     aSize = m_aEndBracketLB.GetSizePixel();
3776     aSize.Height() = m_aEndBracketLB.CalcSize( 1, 6 ).Height();
3777     m_aEndBracketLB.SetSizePixel( aSize );
3778 
3779     m_aTwoLinesBtn.Check( sal_False );
3780     TwoLinesHdl_Impl( NULL );
3781 
3782     m_aTwoLinesBtn.SetClickHdl( LINK( this, SvxCharTwoLinesPage, TwoLinesHdl_Impl ) );
3783 
3784     Link aLink = LINK( this, SvxCharTwoLinesPage, CharacterMapHdl_Impl );
3785     m_aStartBracketLB.SetSelectHdl( aLink );
3786     m_aEndBracketLB.SetSelectHdl( aLink );
3787 
3788     SvxFont& rFont = GetPreviewFont();
3789     SvxFont& rCJKFont = GetPreviewCJKFont();
3790     SvxFont& rCTLFont = GetPreviewCTLFont();
3791     rFont.SetSize( Size( 0, 220 ) );
3792     rCJKFont.SetSize( Size( 0, 220 ) );
3793     rCTLFont.SetSize( Size( 0, 220 ) );
3794 }
3795 
3796 // -----------------------------------------------------------------------
3797 
SelectCharacter(ListBox * pBox)3798 void SvxCharTwoLinesPage::SelectCharacter( ListBox* pBox )
3799 {
3800     //CHINA001 SvxCharacterMap aDlg( this );
3801     bool bStart = pBox == &m_aStartBracketLB;
3802     //SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
3803     //if(pFact)
3804     {
3805         //AbstractSvxCharacterMap* aDlg = pFact->CreateSvxCharacterMap( this,  RID_SVXDLG_CHARMAP );
3806         SvxCharacterMap* aDlg = new SvxCharacterMap( this );
3807         aDlg->DisableFontSelection();//CHINA001 aDlg.DisableFontSelection();
3808 
3809         if ( aDlg->Execute() == RET_OK )//CHINA001 ( aDlg.Execute() == RET_OK )
3810         {
3811             sal_Unicode cChar = (sal_Unicode) aDlg->GetChar();//CHINA001 aDlg.GetChar();
3812             SetBracket( cChar, bStart );
3813         }
3814         else
3815         {
3816             pBox->SelectEntryPos( bStart ? m_nStartBracketPosition : m_nEndBracketPosition );
3817         }
3818         delete aDlg; //add CHINA001
3819     }
3820 }
3821 
3822 // -----------------------------------------------------------------------
3823 
SetBracket(sal_Unicode cBracket,sal_Bool bStart)3824 void SvxCharTwoLinesPage::SetBracket( sal_Unicode cBracket, sal_Bool bStart )
3825 {
3826     sal_uInt16 nEntryPos = 0;
3827     ListBox* pBox = bStart ? &m_aStartBracketLB : &m_aEndBracketLB;
3828     if ( 0 == cBracket )
3829         pBox->SelectEntryPos(0);
3830     else
3831     {
3832         FASTBOOL bFound = sal_False;
3833         for ( sal_uInt16 i = 1; i < pBox->GetEntryCount(); ++i )
3834         {
3835             if ( (sal_uLong)pBox->GetEntryData(i) != CHRDLG_ENCLOSE_SPECIAL_CHAR )
3836             {
3837                 const sal_Unicode cChar = pBox->GetEntry(i).GetChar(0);
3838                 if ( cChar == cBracket )
3839                 {
3840                     pBox->SelectEntryPos(i);
3841                     nEntryPos = i;
3842                     bFound = sal_True;
3843                     break;
3844                 }
3845             }
3846         }
3847 
3848         if ( !bFound )
3849         {
3850             nEntryPos = pBox->InsertEntry( String( cBracket ) );
3851             pBox->SelectEntryPos( nEntryPos );
3852         }
3853     }
3854     if( bStart )
3855         m_nStartBracketPosition = nEntryPos;
3856     else
3857         m_nEndBracketPosition = nEntryPos;
3858 }
3859 
3860 // -----------------------------------------------------------------------
3861 
IMPL_LINK(SvxCharTwoLinesPage,TwoLinesHdl_Impl,CheckBox *,EMPTYARG)3862 IMPL_LINK( SvxCharTwoLinesPage, TwoLinesHdl_Impl, CheckBox*, EMPTYARG )
3863 {
3864     sal_Bool bChecked = m_aTwoLinesBtn.IsChecked();
3865     m_aStartBracketFT.Enable( bChecked );
3866     m_aStartBracketLB.Enable( bChecked );
3867     m_aEndBracketFT.Enable( bChecked );
3868     m_aEndBracketLB.Enable( bChecked );
3869 
3870     UpdatePreview_Impl();
3871     return 0;
3872 }
3873 
3874 // -----------------------------------------------------------------------
3875 
IMPL_LINK(SvxCharTwoLinesPage,CharacterMapHdl_Impl,ListBox *,pBox)3876 IMPL_LINK( SvxCharTwoLinesPage, CharacterMapHdl_Impl, ListBox*, pBox )
3877 {
3878     sal_uInt16 nPos = pBox->GetSelectEntryPos();
3879     if ( CHRDLG_ENCLOSE_SPECIAL_CHAR == (sal_uLong)pBox->GetEntryData( nPos ) )
3880         SelectCharacter( pBox );
3881     else
3882     {
3883         bool bStart = pBox == &m_aStartBracketLB;
3884         if( bStart )
3885             m_nStartBracketPosition = nPos;
3886         else
3887             m_nEndBracketPosition = nPos;
3888     }
3889     UpdatePreview_Impl();
3890     return 0;
3891 }
3892 
3893 // -----------------------------------------------------------------------
3894 
ActivatePage(const SfxItemSet & rSet)3895 void SvxCharTwoLinesPage::ActivatePage( const SfxItemSet& rSet )
3896 {
3897     SvxCharBasePage::ActivatePage( rSet );
3898 }
3899 
3900 // -----------------------------------------------------------------------
3901 
DeactivatePage(SfxItemSet * _pSet)3902 int SvxCharTwoLinesPage::DeactivatePage( SfxItemSet* _pSet )
3903 {
3904     if ( _pSet )
3905         FillItemSet( *_pSet );
3906     return LEAVE_PAGE;
3907 }
3908 
3909 // -----------------------------------------------------------------------
3910 
Create(Window * pParent,const SfxItemSet & rSet)3911 SfxTabPage* SvxCharTwoLinesPage::Create( Window* pParent, const SfxItemSet& rSet )
3912 {
3913     return new SvxCharTwoLinesPage( pParent, rSet );
3914 }
3915 
3916 // -----------------------------------------------------------------------
3917 
GetRanges()3918 sal_uInt16* SvxCharTwoLinesPage::GetRanges()
3919 {
3920     return pTwoLinesRanges;
3921 }
3922 
3923 // -----------------------------------------------------------------------
3924 
Reset(const SfxItemSet & rSet)3925 void SvxCharTwoLinesPage::Reset( const SfxItemSet& rSet )
3926 {
3927     m_aTwoLinesBtn.Check( sal_False );
3928     sal_uInt16 nWhich = GetWhich( SID_ATTR_CHAR_TWO_LINES );
3929     SfxItemState eState = rSet.GetItemState( nWhich );
3930 
3931     if ( eState >= SFX_ITEM_DONTCARE )
3932     {
3933         const SvxTwoLinesItem& rItem = (SvxTwoLinesItem&)rSet.Get( nWhich );
3934         m_aTwoLinesBtn.Check( rItem.GetValue() );
3935 
3936         if ( rItem.GetValue() )
3937         {
3938             SetBracket( rItem.GetStartBracket(), sal_True );
3939             SetBracket( rItem.GetEndBracket(), sal_False );
3940         }
3941     }
3942     TwoLinesHdl_Impl( NULL );
3943 
3944     SetPrevFontWidthScale( rSet );
3945 }
3946 
3947 // -----------------------------------------------------------------------
3948 
FillItemSet(SfxItemSet & rSet)3949 sal_Bool SvxCharTwoLinesPage::FillItemSet( SfxItemSet& rSet )
3950 {
3951     const SfxItemSet& rOldSet = GetItemSet();
3952     sal_Bool bModified = sal_False, bChanged = sal_True;
3953     sal_uInt16 nWhich = GetWhich( SID_ATTR_CHAR_TWO_LINES );
3954     const SfxPoolItem* pOld = GetOldItem( rSet, SID_ATTR_CHAR_TWO_LINES );
3955     sal_Bool bOn = m_aTwoLinesBtn.IsChecked();
3956     sal_Unicode cStart = ( bOn && m_aStartBracketLB.GetSelectEntryPos() > 0 )
3957         ? m_aStartBracketLB.GetSelectEntry().GetChar(0) : 0;
3958     sal_Unicode cEnd = ( bOn && m_aEndBracketLB.GetSelectEntryPos() > 0 )
3959         ? m_aEndBracketLB.GetSelectEntry().GetChar(0) : 0;
3960 
3961     if ( pOld )
3962     {
3963         const SvxTwoLinesItem& rItem = *( (const SvxTwoLinesItem*)pOld );
3964         if ( rItem.GetValue() ==  bOn &&
3965              ( !bOn || ( rItem.GetStartBracket() == cStart && rItem.GetEndBracket() == cEnd ) ) )
3966             bChanged = sal_False;
3967     }
3968 
3969     if ( bChanged )
3970     {
3971         rSet.Put( SvxTwoLinesItem( bOn, cStart, cEnd, nWhich ) );
3972         bModified |= sal_True;
3973     }
3974     else if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nWhich, sal_False ) )
3975         CLEARTITEM;
3976 
3977     return bModified;
3978 }
3979 /* -----------------------------04.12.00 09:48--------------------------------
3980 
3981  ---------------------------------------------------------------------------*/
UpdatePreview_Impl()3982 void    SvxCharTwoLinesPage::UpdatePreview_Impl()
3983 {
3984     sal_Unicode cStart = m_aStartBracketLB.GetSelectEntryPos() > 0
3985         ? m_aStartBracketLB.GetSelectEntry().GetChar(0) : 0;
3986     sal_Unicode cEnd = m_aEndBracketLB.GetSelectEntryPos() > 0
3987         ? m_aEndBracketLB.GetSelectEntry().GetChar(0) : 0;
3988     m_aPreviewWin.SetBrackets(cStart, cEnd);
3989     m_aPreviewWin.SetTwoLines(m_aTwoLinesBtn.IsChecked());
3990     m_aPreviewWin.Invalidate();
3991 }
3992 // -----------------------------------------------------------------------
SetPreviewBackgroundToCharacter()3993 void SvxCharTwoLinesPage::SetPreviewBackgroundToCharacter()
3994 {
3995     m_bPreviewBackgroundToCharacter = sal_True;
3996 }
3997 
3998 // -----------------------------------------------------------------------
PageCreated(SfxAllItemSet aSet)3999 void SvxCharTwoLinesPage::PageCreated (SfxAllItemSet aSet) //add CHINA001
4000 {
4001     SFX_ITEMSET_ARG (&aSet,pFlagItem,SfxUInt32Item,SID_FLAG_TYPE,sal_False);
4002     if (pFlagItem)
4003     {
4004         sal_uInt32 nFlags=pFlagItem->GetValue();
4005         if ( ( nFlags & SVX_PREVIEW_CHARACTER ) == SVX_PREVIEW_CHARACTER )
4006             SetPreviewBackgroundToCharacter();
4007     }
4008 }
4009