Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <editeng/unolingu.hxx>
21 : #include <vcl/svapp.hxx>
22 : #include <unotools/pathoptions.hxx>
23 : #include <svtools/ctrltool.hxx>
24 : #include <sfx2/printer.hxx>
25 : #include <sfx2/objsh.hxx>
26 : #include <sfx2/viewsh.hxx>
27 : #include <sfx2/bindings.hxx>
28 : #include <sfx2/viewfrm.hxx>
29 : #include <vcl/msgbox.hxx>
30 : #include <svx/dialmgr.hxx>
31 : #include <svx/dialogs.hrc>
32 : #include <svtools/unitconv.hxx>
33 : #include <svl/languageoptions.hxx>
34 : #include <svx/xtable.hxx>
35 : #include "chardlg.hxx"
36 : #include "editeng/fontitem.hxx"
37 : #include <editeng/postitem.hxx>
38 : #include <editeng/udlnitem.hxx>
39 : #include <editeng/crossedoutitem.hxx>
40 : #include <editeng/contouritem.hxx>
41 : #include <editeng/langitem.hxx>
42 : #include <editeng/wghtitem.hxx>
43 : #include <editeng/fhgtitem.hxx>
44 : #include <editeng/shdditem.hxx>
45 : #include <editeng/escapementitem.hxx>
46 : #include <editeng/prszitem.hxx>
47 : #include <editeng/wrlmitem.hxx>
48 : #include <editeng/cmapitem.hxx>
49 : #include <editeng/kernitem.hxx>
50 : #include <editeng/blinkitem.hxx>
51 : #include "editeng/flstitem.hxx"
52 : #include <editeng/autokernitem.hxx>
53 : #include <editeng/brushitem.hxx>
54 : #include <editeng/colritem.hxx>
55 : #include "svx/drawitem.hxx"
56 : #include "svx/dlgutil.hxx"
57 : #include <dialmgr.hxx>
58 : #include <sfx2/htmlmode.hxx>
59 : #include "cuicharmap.hxx"
60 : #include "chardlg.h"
61 : #include <editeng/emphasismarkitem.hxx>
62 : #include <editeng/charreliefitem.hxx>
63 : #include <editeng/twolinesitem.hxx>
64 : #include <editeng/charhiddenitem.hxx>
65 : #include <svl/stritem.hxx>
66 : #include <editeng/charscaleitem.hxx>
67 : #include <editeng/charrotateitem.hxx>
68 : #include <svx/svxdlg.hxx>
69 : #include <cuires.hrc>
70 : #include <svl/intitem.hxx>
71 : #include <sfx2/request.hxx>
72 : #include "svx/flagsdef.hxx"
73 : #include <boost/scoped_ptr.hpp>
74 :
75 : using namespace ::com::sun::star;
76 :
77 : // define ----------------------------------------------------------------
78 :
79 : #define ISITEMSET rSet.GetItemState(nWhich)>=SfxItemState::DEFAULT
80 :
81 : #define CLEARTITEM rSet.InvalidateItem(nWhich)
82 :
83 : #define LW_NORMAL 0
84 : #define LW_EXPANDED 1
85 : #define LW_CONDENSED 2
86 :
87 : // static ----------------------------------------------------------------
88 :
89 : static const sal_uInt16 pNameRanges[] =
90 : {
91 : SID_ATTR_CHAR_FONT,
92 : SID_ATTR_CHAR_WEIGHT,
93 : SID_ATTR_CHAR_FONTHEIGHT,
94 : SID_ATTR_CHAR_FONTHEIGHT,
95 : SID_ATTR_CHAR_COLOR,
96 : SID_ATTR_CHAR_COLOR,
97 : SID_ATTR_CHAR_LANGUAGE,
98 : SID_ATTR_CHAR_LANGUAGE,
99 : SID_ATTR_CHAR_CJK_FONT,
100 : SID_ATTR_CHAR_CJK_WEIGHT,
101 : SID_ATTR_CHAR_CTL_FONT,
102 : SID_ATTR_CHAR_CTL_WEIGHT,
103 : 0
104 : };
105 :
106 : static const sal_uInt16 pEffectsRanges[] =
107 : {
108 : SID_ATTR_CHAR_SHADOWED,
109 : SID_ATTR_CHAR_UNDERLINE,
110 : SID_ATTR_CHAR_COLOR,
111 : SID_ATTR_CHAR_COLOR,
112 : SID_ATTR_CHAR_CASEMAP,
113 : SID_ATTR_CHAR_CASEMAP,
114 : SID_ATTR_FLASH,
115 : SID_ATTR_FLASH,
116 : SID_ATTR_CHAR_EMPHASISMARK,
117 : SID_ATTR_CHAR_EMPHASISMARK,
118 : SID_ATTR_CHAR_RELIEF,
119 : SID_ATTR_CHAR_RELIEF,
120 : SID_ATTR_CHAR_HIDDEN,
121 : SID_ATTR_CHAR_HIDDEN,
122 : SID_ATTR_CHAR_OVERLINE,
123 : SID_ATTR_CHAR_OVERLINE,
124 : 0
125 : };
126 :
127 : static const sal_uInt16 pPositionRanges[] =
128 : {
129 : SID_ATTR_CHAR_KERNING,
130 : SID_ATTR_CHAR_KERNING,
131 : SID_ATTR_CHAR_ESCAPEMENT,
132 : SID_ATTR_CHAR_ESCAPEMENT,
133 : SID_ATTR_CHAR_AUTOKERN,
134 : SID_ATTR_CHAR_AUTOKERN,
135 : SID_ATTR_CHAR_ROTATED,
136 : SID_ATTR_CHAR_SCALEWIDTH,
137 : SID_ATTR_CHAR_WIDTH_FIT_TO_LINE,
138 : SID_ATTR_CHAR_WIDTH_FIT_TO_LINE,
139 : 0
140 : };
141 :
142 : static const sal_uInt16 pTwoLinesRanges[] =
143 : {
144 : SID_ATTR_CHAR_TWO_LINES,
145 : SID_ATTR_CHAR_TWO_LINES,
146 : 0
147 : };
148 :
149 : // C-Funktion ------------------------------------------------------------
150 :
151 0 : inline bool StateToAttr( TriState aState )
152 : {
153 0 : return ( TRISTATE_TRUE == aState );
154 : }
155 :
156 : // class SvxCharBasePage -------------------------------------------------
157 :
158 0 : inline SvxFont& SvxCharBasePage::GetPreviewFont()
159 : {
160 0 : return m_pPreviewWin->GetFont();
161 : }
162 :
163 :
164 :
165 0 : inline SvxFont& SvxCharBasePage::GetPreviewCJKFont()
166 : {
167 0 : return m_pPreviewWin->GetCJKFont();
168 : }
169 :
170 :
171 0 : inline SvxFont& SvxCharBasePage::GetPreviewCTLFont()
172 : {
173 0 : return m_pPreviewWin->GetCTLFont();
174 : }
175 :
176 :
177 :
178 0 : SvxCharBasePage::SvxCharBasePage(vcl::Window* pParent, const OString& rID, const OUString& rUIXMLDescription, const SfxItemSet& rItemset)
179 : : SfxTabPage( pParent, rID, rUIXMLDescription, &rItemset )
180 : , m_pPreviewWin(NULL)
181 0 : , m_bPreviewBackgroundToCharacter( false )
182 : {
183 0 : }
184 :
185 :
186 :
187 0 : SvxCharBasePage::~SvxCharBasePage()
188 : {
189 0 : }
190 :
191 :
192 :
193 0 : void SvxCharBasePage::ActivatePage( const SfxItemSet& rSet )
194 : {
195 0 : m_pPreviewWin->SetFromItemSet( rSet, m_bPreviewBackgroundToCharacter );
196 0 : }
197 :
198 :
199 :
200 :
201 0 : void SvxCharBasePage::SetPrevFontWidthScale( const SfxItemSet& rSet )
202 : {
203 0 : sal_uInt16 nWhich = GetWhich( SID_ATTR_CHAR_SCALEWIDTH );
204 0 : if( ISITEMSET )
205 : {
206 0 : const SvxCharScaleWidthItem &rItem = static_cast<const SvxCharScaleWidthItem&>( rSet.Get( nWhich ) );
207 0 : m_pPreviewWin->SetFontWidthScale( rItem.GetValue() );
208 : }
209 0 : }
210 :
211 :
212 : namespace
213 : {
214 :
215 0 : void setPrevFontEscapement(SvxFont& _rFont,sal_uInt8 nProp, sal_uInt8 nEscProp, short nEsc )
216 : {
217 0 : _rFont.SetPropr( nProp );
218 0 : _rFont.SetProprRel( nEscProp );
219 0 : _rFont.SetEscapement( nEsc );
220 0 : }
221 :
222 :
223 : }
224 :
225 :
226 0 : void SvxCharBasePage::SetPrevFontEscapement( sal_uInt8 nProp, sal_uInt8 nEscProp, short nEsc )
227 : {
228 0 : setPrevFontEscapement(GetPreviewFont(),nProp,nEscProp,nEsc);
229 0 : setPrevFontEscapement(GetPreviewCJKFont(),nProp,nEscProp,nEsc);
230 0 : setPrevFontEscapement(GetPreviewCTLFont(),nProp,nEscProp,nEsc);
231 0 : m_pPreviewWin->Invalidate();
232 0 : }
233 :
234 : // SvxCharNamePage_Impl --------------------------------------------------
235 :
236 : struct SvxCharNamePage_Impl
237 : {
238 : Timer m_aUpdateTimer;
239 : OUString m_aNoStyleText;
240 : const FontList* m_pFontList;
241 : sal_Int32 m_nExtraEntryPos;
242 : bool m_bMustDelete;
243 : bool m_bInSearchMode;
244 :
245 0 : SvxCharNamePage_Impl() :
246 :
247 : m_pFontList ( NULL ),
248 : m_nExtraEntryPos( COMBOBOX_ENTRY_NOTFOUND ),
249 : m_bMustDelete ( false ),
250 0 : m_bInSearchMode ( false )
251 :
252 : {
253 0 : m_aUpdateTimer.SetTimeout( 350 );
254 0 : }
255 :
256 0 : ~SvxCharNamePage_Impl()
257 0 : {
258 0 : if ( m_bMustDelete )
259 0 : delete m_pFontList;
260 0 : }
261 : };
262 :
263 : // class SvxCharNamePage -------------------------------------------------
264 :
265 0 : SvxCharNamePage::SvxCharNamePage( vcl::Window* pParent, const SfxItemSet& rInSet )
266 : : SvxCharBasePage(pParent, "CharNamePage", "cui/ui/charnamepage.ui", rInSet)
267 0 : , m_pImpl(new SvxCharNamePage_Impl)
268 : {
269 0 : m_pImpl->m_aNoStyleText = CUI_RES( RID_SVXSTR_CHARNAME_NOSTYLE );
270 :
271 0 : SvtLanguageOptions aLanguageOptions;
272 0 : bool bShowCJK = aLanguageOptions.IsCJKFontEnabled();
273 0 : bool bShowCTL = aLanguageOptions.IsCTLFontEnabled();
274 0 : bool bShowNonWestern = bShowCJK || bShowCTL;
275 :
276 0 : if (bShowNonWestern)
277 : {
278 0 : get(m_pWestFrame, "western");
279 0 : get(m_pWestFontNameFT, "westfontnameft-cjk");
280 0 : get(m_pWestFontNameLB, "westfontnamelb-cjk");
281 0 : get(m_pWestFontStyleFT, "weststyleft-cjk");
282 0 : get(m_pWestFontStyleLB, "weststylelb-cjk");
283 0 : get(m_pWestFontSizeFT, "westsizeft-cjk");
284 0 : get(m_pWestFontSizeLB, "westsizelb-cjk");
285 :
286 0 : get(m_pWestFontLanguageFT, "westlangft-cjk");
287 0 : get(m_pWestFontLanguageLB, "westlanglb-cjk");
288 0 : get(m_pWestFontTypeFT, "westfontinfo-cjk");
289 : }
290 : else
291 : {
292 0 : get(m_pWestFrame, "simple");
293 0 : get(m_pWestFontNameFT, "westfontnameft-nocjk");
294 0 : get(m_pWestFontNameLB, "westfontnamelb-nocjk");
295 0 : get(m_pWestFontStyleFT, "weststyleft-nocjk");
296 0 : get(m_pWestFontStyleLB, "weststylelb-nocjk");
297 0 : get(m_pWestFontSizeFT, "westsizeft-nocjk");
298 0 : get(m_pWestFontSizeLB, "westsizelb-nocjk");
299 :
300 0 : get(m_pWestFontLanguageFT, "westlangft-nocjk");
301 0 : get(m_pWestFontLanguageLB, "westlanglb-nocjk");
302 0 : get(m_pWestFontTypeFT, "westfontinfo-nocjk");
303 : }
304 :
305 0 : get(m_pEastFrame, "asian");
306 0 : get(m_pEastFontNameFT, "eastfontnameft");
307 0 : get(m_pEastFontNameLB, "eastfontnamelb");
308 0 : get(m_pEastFontStyleFT, "eaststyleft");
309 0 : get(m_pEastFontStyleLB, "eaststylelb");
310 0 : get(m_pEastFontSizeFT, "eastsizeft");
311 0 : get(m_pEastFontSizeLB, "eastsizelb");
312 0 : get(m_pEastFontLanguageFT, "eastlangft");
313 0 : get(m_pEastFontLanguageLB, "eastlanglb");
314 0 : get(m_pEastFontTypeFT, "eastfontinfo");
315 :
316 0 : get(m_pCTLFrame, "ctl");
317 0 : get(m_pCTLFontNameFT, "ctlfontnameft");
318 0 : get(m_pCTLFontNameLB, "ctlfontnamelb");
319 0 : get(m_pCTLFontStyleFT, "ctlstyleft");
320 0 : get(m_pCTLFontStyleLB, "ctlstylelb");
321 0 : get(m_pCTLFontSizeFT, "ctlsizeft");
322 0 : get(m_pCTLFontSizeLB, "ctlsizelb");
323 0 : get(m_pCTLFontLanguageFT, "ctllangft");
324 0 : get(m_pCTLFontLanguageLB, "ctllanglb");
325 0 : get(m_pCTLFontTypeFT, "ctlfontinfo");
326 :
327 : //In MacOSX the standard dialogs name font-name, font-style as
328 : //Family, Typeface
329 : //In GNOME the standard dialogs name font-name, font-style as
330 : //Family, Style
331 : //In Windows the standard dialogs name font-name, font-style as
332 : //Font, Style
333 : #ifdef WNT
334 : OUString sFontFamilyString(CUI_RES(RID_SVXSTR_CHARNAME_FONT));
335 : #else
336 0 : OUString sFontFamilyString(CUI_RES(RID_SVXSTR_CHARNAME_FAMILY));
337 : #endif
338 0 : m_pWestFontNameFT->SetText(sFontFamilyString);
339 0 : m_pEastFontNameFT->SetText(sFontFamilyString);
340 0 : m_pCTLFontNameFT->SetText(sFontFamilyString);
341 :
342 : #ifdef MACOSX
343 : OUString sFontStyleString(CUI_RES(RID_SVXSTR_CHARNAME_TYPEFACE));
344 : #else
345 0 : OUString sFontStyleString(CUI_RES(RID_SVXSTR_CHARNAME_STYLE));
346 : #endif
347 0 : m_pWestFontStyleFT->SetText(sFontStyleString);
348 0 : m_pEastFontStyleFT->SetText(sFontStyleString);
349 0 : m_pCTLFontStyleFT->SetText(sFontStyleString);
350 :
351 0 : m_pWestFrame->Show(true);
352 0 : m_pEastFrame->Show(bShowCJK);
353 0 : m_pCTLFrame->Show(bShowCTL);
354 :
355 0 : get(m_pPreviewWin, "preview");
356 :
357 0 : m_pWestFontLanguageLB->SetLanguageList(LANG_LIST_WESTERN, true, false, true);
358 0 : m_pEastFontLanguageLB->SetLanguageList(LANG_LIST_CJK, true, false, true);
359 0 : m_pCTLFontLanguageLB->SetLanguageList(LANG_LIST_CTL, true, false, true);
360 :
361 0 : if (!bShowNonWestern)
362 : {
363 : //10 lines
364 0 : sal_Int32 nHeight = m_pWestFontSizeLB->CalcWindowSizePixel(10);
365 0 : m_pWestFontNameLB->set_height_request(nHeight);
366 0 : m_pWestFontStyleLB->set_height_request(nHeight);
367 0 : m_pWestFontSizeLB->set_height_request(nHeight);
368 : }
369 :
370 0 : Initialize();
371 0 : }
372 :
373 :
374 :
375 0 : SvxCharNamePage::~SvxCharNamePage()
376 : {
377 0 : delete m_pImpl;
378 0 : }
379 :
380 :
381 :
382 0 : void SvxCharNamePage::Initialize()
383 : {
384 : // to handle the changes of the other pages
385 0 : SetExchangeSupport();
386 :
387 0 : Link aLink = LINK( this, SvxCharNamePage, FontModifyHdl_Impl );
388 0 : m_pWestFontNameLB->SetModifyHdl( aLink );
389 0 : m_pWestFontStyleLB->SetModifyHdl( aLink );
390 0 : m_pWestFontSizeLB->SetModifyHdl( aLink );
391 0 : m_pWestFontLanguageLB->SetSelectHdl( aLink );
392 0 : m_pEastFontNameLB->SetModifyHdl( aLink );
393 0 : m_pEastFontStyleLB->SetModifyHdl( aLink );
394 0 : m_pEastFontSizeLB->SetModifyHdl( aLink );
395 0 : m_pEastFontLanguageLB->SetSelectHdl( aLink );
396 0 : m_pCTLFontNameLB->SetModifyHdl( aLink );
397 0 : m_pCTLFontStyleLB->SetModifyHdl( aLink );
398 0 : m_pCTLFontSizeLB->SetModifyHdl( aLink );
399 0 : m_pCTLFontLanguageLB->SetSelectHdl( aLink );
400 :
401 0 : m_pImpl->m_aUpdateTimer.SetTimeoutHdl( LINK( this, SvxCharNamePage, UpdateHdl_Impl ) );
402 0 : }
403 :
404 :
405 :
406 0 : const FontList* SvxCharNamePage::GetFontList() const
407 : {
408 0 : if ( !m_pImpl->m_pFontList )
409 : {
410 0 : SfxObjectShell* pDocSh = SfxObjectShell::Current();
411 : const SfxPoolItem* pItem;
412 :
413 : /* #110771# SvxFontListItem::GetFontList can return NULL */
414 0 : if ( pDocSh )
415 : {
416 0 : pItem = pDocSh->GetItem( SID_ATTR_CHAR_FONTLIST );
417 0 : if ( pItem != NULL )
418 : {
419 : DBG_ASSERT(NULL != static_cast<const SvxFontListItem*>(pItem)->GetFontList(),
420 : "Where is the font list?");
421 0 : m_pImpl->m_pFontList = static_cast<const SvxFontListItem*>(pItem )->GetFontList()->Clone();
422 0 : m_pImpl->m_bMustDelete = true;
423 : }
424 : }
425 0 : if(!m_pImpl->m_pFontList)
426 : {
427 : m_pImpl->m_pFontList =
428 0 : new FontList( Application::GetDefaultDevice() );
429 0 : m_pImpl->m_bMustDelete = true;
430 : }
431 : }
432 :
433 0 : return m_pImpl->m_pFontList;
434 : }
435 :
436 :
437 : namespace
438 : {
439 0 : vcl::FontInfo calcFontInfo( SvxFont& _rFont,
440 : SvxCharNamePage* _pPage,
441 : const FontNameBox* _pFontNameLB,
442 : const FontStyleBox* _pFontStyleLB,
443 : const FontSizeBox* _pFontSizeLB,
444 : const SvxLanguageBoxBase* _pLanguageLB,
445 : const FontList* _pFontList,
446 : sal_uInt16 _nFontWhich,
447 : sal_uInt16 _nFontHeightWhich)
448 : {
449 0 : Size aSize = _rFont.GetSize();
450 0 : aSize.Width() = 0;
451 0 : vcl::FontInfo aFontInfo;
452 0 : OUString sFontName(_pFontNameLB->GetText());
453 0 : bool bFontAvailable = _pFontList->IsAvailable( sFontName );
454 0 : if (bFontAvailable || _pFontNameLB->IsValueChangedFromSaved())
455 0 : aFontInfo = _pFontList->Get( sFontName, _pFontStyleLB->GetText() );
456 : else
457 : {
458 : //get the font from itemset
459 0 : SfxItemState eState = _pPage->GetItemSet().GetItemState( _nFontWhich );
460 0 : if ( eState >= SfxItemState::DEFAULT )
461 : {
462 0 : const SvxFontItem* pFontItem = static_cast<const SvxFontItem*>(&( _pPage->GetItemSet().Get( _nFontWhich ) ));
463 0 : aFontInfo.SetName(pFontItem->GetFamilyName());
464 0 : aFontInfo.SetStyleName(pFontItem->GetStyleName());
465 0 : aFontInfo.SetFamily(pFontItem->GetFamily());
466 0 : aFontInfo.SetPitch(pFontItem->GetPitch());
467 0 : aFontInfo.SetCharSet(pFontItem->GetCharSet());
468 : }
469 : }
470 0 : if ( _pFontSizeLB->IsRelative() )
471 : {
472 : DBG_ASSERT( _pPage->GetItemSet().GetParent(), "No parent set" );
473 0 : const SvxFontHeightItem& rOldItem = static_cast<const SvxFontHeightItem&>(_pPage->GetItemSet().GetParent()->Get( _nFontHeightWhich ));
474 :
475 : // old value, scaled
476 : long nHeight;
477 0 : if ( _pFontSizeLB->IsPtRelative() )
478 0 : nHeight = rOldItem.GetHeight() + PointToTwips( static_cast<long>(_pFontSizeLB->GetValue() / 10) );
479 : else
480 0 : nHeight = static_cast<long>(rOldItem.GetHeight() * _pFontSizeLB->GetValue() / 100);
481 :
482 : // conversion twips for the example-window
483 0 : aSize.Height() =
484 0 : ItemToControl( nHeight, _pPage->GetItemSet().GetPool()->GetMetric( _nFontHeightWhich ), SFX_FUNIT_TWIP );
485 : }
486 0 : else if ( !_pFontSizeLB->GetText().isEmpty() )
487 0 : aSize.Height() = PointToTwips( static_cast<long>(_pFontSizeLB->GetValue() / 10) );
488 : else
489 0 : aSize.Height() = 200; // default 10pt
490 0 : aFontInfo.SetSize( aSize );
491 :
492 0 : _rFont.SetLanguage(_pLanguageLB->GetSelectLanguage());
493 :
494 0 : _rFont.SetFamily( aFontInfo.GetFamily() );
495 0 : _rFont.SetName( aFontInfo.GetName() );
496 0 : _rFont.SetStyleName( aFontInfo.GetStyleName() );
497 0 : _rFont.SetPitch( aFontInfo.GetPitch() );
498 0 : _rFont.SetCharSet( aFontInfo.GetCharSet() );
499 0 : _rFont.SetWeight( aFontInfo.GetWeight() );
500 0 : _rFont.SetItalic( aFontInfo.GetItalic() );
501 0 : _rFont.SetSize( aFontInfo.GetSize() );
502 :
503 0 : return aFontInfo;
504 : }
505 : }
506 :
507 :
508 :
509 0 : void SvxCharNamePage::UpdatePreview_Impl()
510 : {
511 0 : SvxFont& rFont = GetPreviewFont();
512 0 : SvxFont& rCJKFont = GetPreviewCJKFont();
513 0 : SvxFont& rCTLFont = GetPreviewCTLFont();
514 : // Size
515 0 : Size aSize = rFont.GetSize();
516 0 : aSize.Width() = 0;
517 0 : Size aCJKSize = rCJKFont.GetSize();
518 0 : aCJKSize.Width() = 0;
519 0 : Size aCTLSize = rCTLFont.GetSize();
520 0 : aCTLSize.Width() = 0;
521 : // Font
522 0 : const FontList* pFontList = GetFontList();
523 :
524 : vcl::FontInfo aWestFontInfo = calcFontInfo(rFont, this, m_pWestFontNameLB,
525 : m_pWestFontStyleLB, m_pWestFontSizeLB, m_pWestFontLanguageLB,
526 0 : pFontList, GetWhich(SID_ATTR_CHAR_FONT),
527 0 : GetWhich(SID_ATTR_CHAR_FONTHEIGHT));
528 0 : m_pWestFontTypeFT->SetText(pFontList->GetFontMapText(aWestFontInfo));
529 :
530 : vcl::FontInfo aEastFontInfo = calcFontInfo(rCJKFont, this, m_pEastFontNameLB,
531 : m_pEastFontStyleLB, m_pEastFontSizeLB, m_pEastFontLanguageLB,
532 0 : pFontList, GetWhich(SID_ATTR_CHAR_CJK_FONT),
533 0 : GetWhich(SID_ATTR_CHAR_CJK_FONTHEIGHT));
534 0 : m_pEastFontTypeFT->SetText(pFontList->GetFontMapText(aEastFontInfo));
535 :
536 : vcl::FontInfo aCTLFontInfo = calcFontInfo(rCTLFont,
537 : this, m_pCTLFontNameLB, m_pCTLFontStyleLB, m_pCTLFontSizeLB,
538 0 : m_pCTLFontLanguageLB, pFontList, GetWhich(SID_ATTR_CHAR_CTL_FONT),
539 0 : GetWhich(SID_ATTR_CHAR_CTL_FONTHEIGHT));
540 0 : m_pCTLFontTypeFT->SetText(pFontList->GetFontMapText(aCTLFontInfo));
541 :
542 0 : m_pPreviewWin->Invalidate();
543 0 : }
544 :
545 :
546 :
547 0 : void SvxCharNamePage::FillStyleBox_Impl( const FontNameBox* pNameBox )
548 : {
549 0 : const FontList* pFontList = GetFontList();
550 : DBG_ASSERT( pFontList, "no fontlist" );
551 :
552 0 : FontStyleBox* pStyleBox = NULL;
553 :
554 0 : if ( m_pWestFontNameLB == pNameBox )
555 0 : pStyleBox = m_pWestFontStyleLB;
556 0 : else if ( m_pEastFontNameLB == pNameBox )
557 0 : pStyleBox = m_pEastFontStyleLB;
558 0 : else if ( m_pCTLFontNameLB == pNameBox )
559 0 : pStyleBox = m_pCTLFontStyleLB;
560 : else
561 : {
562 : SAL_WARN( "cui.tabpages", "invalid font name box" );
563 0 : return;
564 : }
565 :
566 0 : pStyleBox->Fill( pNameBox->GetText(), pFontList );
567 :
568 0 : if ( m_pImpl->m_bInSearchMode )
569 : {
570 : // additional entries for the search:
571 : // "not bold" and "not italic"
572 0 : OUString aEntry = m_pImpl->m_aNoStyleText;
573 0 : const sal_Char sS[] = "%1";
574 0 : aEntry = aEntry.replaceFirst( sS, pFontList->GetBoldStr() );
575 0 : m_pImpl->m_nExtraEntryPos = pStyleBox->InsertEntry( aEntry );
576 0 : aEntry = m_pImpl->m_aNoStyleText;
577 0 : aEntry = aEntry.replaceFirst( sS, pFontList->GetItalicStr() );
578 0 : pStyleBox->InsertEntry( aEntry );
579 : }
580 : }
581 :
582 :
583 :
584 0 : void SvxCharNamePage::FillSizeBox_Impl( const FontNameBox* pNameBox )
585 : {
586 0 : const FontList* pFontList = GetFontList();
587 : DBG_ASSERT( pFontList, "no fontlist" );
588 :
589 0 : FontStyleBox* pStyleBox = NULL;
590 0 : FontSizeBox* pSizeBox = NULL;
591 :
592 0 : if ( m_pWestFontNameLB == pNameBox )
593 : {
594 0 : pStyleBox = m_pWestFontStyleLB;
595 0 : pSizeBox = m_pWestFontSizeLB;
596 : }
597 0 : else if ( m_pEastFontNameLB == pNameBox )
598 : {
599 0 : pStyleBox = m_pEastFontStyleLB;
600 0 : pSizeBox = m_pEastFontSizeLB;
601 : }
602 0 : else if ( m_pCTLFontNameLB == pNameBox )
603 : {
604 0 : pStyleBox = m_pCTLFontStyleLB;
605 0 : pSizeBox = m_pCTLFontSizeLB;
606 : }
607 : else
608 : {
609 : SAL_WARN( "cui.tabpages", "invalid font name box" );
610 0 : return;
611 : }
612 :
613 0 : vcl::FontInfo _aFontInfo( pFontList->Get( pNameBox->GetText(), pStyleBox->GetText() ) );
614 0 : pSizeBox->Fill( &_aFontInfo, pFontList );
615 : }
616 :
617 :
618 :
619 0 : void SvxCharNamePage::Reset_Impl( const SfxItemSet& rSet, LanguageGroup eLangGrp )
620 : {
621 0 : FontNameBox* pNameBox = NULL;
622 0 : FixedText* pStyleLabel = NULL;
623 0 : FontStyleBox* pStyleBox = NULL;
624 0 : FixedText* pSizeLabel = NULL;
625 0 : FontSizeBox* pSizeBox = NULL;
626 0 : FixedText* pLangFT = NULL;
627 0 : SvxLanguageBoxBase* pLangBox = NULL;
628 0 : sal_uInt16 nWhich = 0;
629 :
630 0 : switch ( eLangGrp )
631 : {
632 : case Western :
633 0 : pNameBox = m_pWestFontNameLB;
634 0 : pStyleLabel = m_pWestFontStyleFT;
635 0 : pStyleBox = m_pWestFontStyleLB;
636 0 : pSizeLabel = m_pWestFontSizeFT;
637 0 : pSizeBox = m_pWestFontSizeLB;
638 0 : pLangFT = m_pWestFontLanguageFT;
639 0 : pLangBox = m_pWestFontLanguageLB;
640 0 : nWhich = GetWhich( SID_ATTR_CHAR_FONT );
641 0 : break;
642 :
643 : case Asian :
644 0 : pNameBox = m_pEastFontNameLB;
645 0 : pStyleLabel = m_pEastFontStyleFT;
646 0 : pStyleBox = m_pEastFontStyleLB;
647 0 : pSizeLabel = m_pEastFontSizeFT;
648 0 : pSizeBox = m_pEastFontSizeLB;
649 0 : pLangFT = m_pEastFontLanguageFT;
650 0 : pLangBox = m_pEastFontLanguageLB;
651 0 : nWhich = GetWhich( SID_ATTR_CHAR_CJK_FONT );
652 0 : break;
653 :
654 : case Ctl :
655 0 : pNameBox = m_pCTLFontNameLB;
656 0 : pStyleLabel = m_pCTLFontStyleFT;
657 0 : pStyleBox = m_pCTLFontStyleLB;
658 0 : pSizeLabel = m_pCTLFontSizeFT;
659 0 : pSizeBox = m_pCTLFontSizeLB;
660 0 : pLangFT = m_pCTLFontLanguageFT;
661 0 : pLangBox = m_pCTLFontLanguageLB;
662 0 : nWhich = GetWhich( SID_ATTR_CHAR_CTL_FONT );
663 0 : break;
664 : }
665 :
666 0 : const FontList* pFontList = GetFontList();
667 0 : pNameBox->Fill( pFontList );
668 :
669 0 : const SvxFontItem* pFontItem = NULL;
670 0 : SfxItemState eState = rSet.GetItemState( nWhich );
671 :
672 0 : if ( eState >= SfxItemState::DEFAULT )
673 : {
674 0 : pFontItem = static_cast<const SvxFontItem*>(&( rSet.Get( nWhich ) ));
675 0 : pNameBox->SetText( pFontItem->GetFamilyName() );
676 : }
677 : else
678 : {
679 0 : pNameBox->SetText( OUString() );
680 : }
681 :
682 0 : FillStyleBox_Impl( pNameBox );
683 :
684 0 : bool bStyle = false;
685 0 : bool bStyleAvailable = true;
686 0 : FontItalic eItalic = ITALIC_NONE;
687 0 : FontWeight eWeight = WEIGHT_NORMAL;
688 0 : switch ( eLangGrp )
689 : {
690 0 : case Western : nWhich = GetWhich( SID_ATTR_CHAR_POSTURE ); break;
691 0 : case Asian : nWhich = GetWhich( SID_ATTR_CHAR_CJK_POSTURE ); break;
692 0 : case Ctl : nWhich = GetWhich( SID_ATTR_CHAR_CTL_POSTURE ); break;
693 : }
694 0 : eState = rSet.GetItemState( nWhich );
695 :
696 0 : if ( eState >= SfxItemState::DEFAULT )
697 : {
698 0 : const SvxPostureItem& rItem = static_cast<const SvxPostureItem&>(rSet.Get( nWhich ));
699 0 : eItalic = (FontItalic)rItem.GetValue();
700 0 : bStyle = true;
701 : }
702 0 : bStyleAvailable = bStyleAvailable && (eState >= SfxItemState::DONTCARE);
703 :
704 0 : switch ( eLangGrp )
705 : {
706 0 : case Western : nWhich = GetWhich( SID_ATTR_CHAR_WEIGHT ); break;
707 0 : case Asian : nWhich = GetWhich( SID_ATTR_CHAR_CJK_WEIGHT ); break;
708 0 : case Ctl : nWhich = GetWhich( SID_ATTR_CHAR_CTL_WEIGHT ); break;
709 : }
710 0 : eState = rSet.GetItemState( nWhich );
711 :
712 0 : if ( eState >= SfxItemState::DEFAULT )
713 : {
714 0 : const SvxWeightItem& rItem = static_cast<const SvxWeightItem&>(rSet.Get( nWhich ));
715 0 : eWeight = (FontWeight)rItem.GetValue();
716 : }
717 : else
718 0 : bStyle = false;
719 0 : bStyleAvailable = bStyleAvailable && (eState >= SfxItemState::DONTCARE);
720 :
721 : // currently chosen font
722 0 : if ( bStyle && pFontItem )
723 : {
724 0 : vcl::FontInfo aInfo = pFontList->Get( pFontItem->GetFamilyName(), eWeight, eItalic );
725 0 : pStyleBox->SetText( pFontList->GetStyleName( aInfo ) );
726 : }
727 0 : else if ( !m_pImpl->m_bInSearchMode || !bStyle )
728 : {
729 0 : pStyleBox->SetText( OUString() );
730 : }
731 0 : else if ( bStyle )
732 : {
733 0 : vcl::FontInfo aInfo = pFontList->Get( OUString(), eWeight, eItalic );
734 0 : pStyleBox->SetText( pFontList->GetStyleName( aInfo ) );
735 : }
736 0 : if (!bStyleAvailable)
737 : {
738 0 : pStyleBox->Disable( );
739 0 : pStyleLabel->Disable( );
740 : }
741 :
742 0 : FillSizeBox_Impl( pNameBox );
743 0 : switch ( eLangGrp )
744 : {
745 0 : case Western : nWhich = GetWhich( SID_ATTR_CHAR_FONTHEIGHT ); break;
746 0 : case Asian : nWhich = GetWhich( SID_ATTR_CHAR_CJK_FONTHEIGHT ); break;
747 0 : case Ctl : nWhich = GetWhich( SID_ATTR_CHAR_CTL_FONTHEIGHT ); break;
748 : }
749 0 : eState = rSet.GetItemState( nWhich );
750 :
751 0 : if ( pSizeBox->IsRelativeMode() )
752 : {
753 0 : SfxMapUnit eUnit = rSet.GetPool()->GetMetric( nWhich );
754 0 : const SvxFontHeightItem& rItem = static_cast<const SvxFontHeightItem&>(rSet.Get( nWhich ));
755 :
756 0 : if( rItem.GetProp() != 100 || SFX_MAPUNIT_RELATIVE != rItem.GetPropUnit() )
757 : {
758 0 : bool bPtRel = SFX_MAPUNIT_POINT == rItem.GetPropUnit();
759 0 : pSizeBox->SetPtRelative( bPtRel );
760 0 : pSizeBox->SetValue( bPtRel ? ((short)rItem.GetProp()) * 10 : rItem.GetProp() );
761 : }
762 : else
763 : {
764 0 : pSizeBox->SetRelative();
765 0 : pSizeBox->SetValue( (long)CalcToPoint( rItem.GetHeight(), eUnit, 10 ) );
766 : }
767 : }
768 0 : else if ( eState >= SfxItemState::DEFAULT )
769 : {
770 0 : SfxMapUnit eUnit = rSet.GetPool()->GetMetric( nWhich );
771 0 : const SvxFontHeightItem& rItem = static_cast<const SvxFontHeightItem&>(rSet.Get( nWhich ));
772 0 : pSizeBox->SetValue( (long)CalcToPoint( rItem.GetHeight(), eUnit, 10 ) );
773 : }
774 : else
775 : {
776 0 : pSizeBox->SetText( OUString() );
777 0 : if ( eState <= SfxItemState::READONLY )
778 : {
779 0 : pSizeBox->Disable( );
780 0 : pSizeLabel->Disable( );
781 : }
782 : }
783 :
784 0 : switch ( eLangGrp )
785 : {
786 0 : case Western : nWhich = GetWhich( SID_ATTR_CHAR_LANGUAGE ); break;
787 0 : case Asian : nWhich = GetWhich( SID_ATTR_CHAR_CJK_LANGUAGE ); break;
788 0 : case Ctl : nWhich = GetWhich( SID_ATTR_CHAR_CTL_LANGUAGE ); break;
789 : }
790 0 : pLangBox->SetNoSelectionLBB();
791 0 : eState = rSet.GetItemState( nWhich );
792 :
793 0 : switch ( eState )
794 : {
795 : case SfxItemState::UNKNOWN:
796 0 : pLangFT->Hide();
797 0 : pLangBox->HideLBB();
798 0 : break;
799 :
800 : case SfxItemState::DISABLED:
801 : case SfxItemState::READONLY:
802 0 : pLangFT->Disable();
803 0 : pLangBox->DisableLBB();
804 0 : break;
805 :
806 : case SfxItemState::DEFAULT:
807 : case SfxItemState::SET:
808 : {
809 0 : const SvxLanguageItem& rItem = static_cast<const SvxLanguageItem&>(rSet.Get( nWhich ));
810 0 : LanguageType eLangType = (LanguageType)rItem.GetValue();
811 : DBG_ASSERT( eLangType != LANGUAGE_SYSTEM, "LANGUAGE_SYSTEM not allowed" );
812 0 : if ( eLangType != LANGUAGE_DONTKNOW )
813 0 : pLangBox->SelectLanguage( eLangType );
814 0 : break;
815 : }
816 : case SfxItemState::DONTCARE:
817 0 : break;
818 : }
819 :
820 : OUString sMapText(pFontList->GetFontMapText(
821 0 : pFontList->Get(pNameBox->GetText(), pStyleBox->GetText())));
822 :
823 0 : switch (eLangGrp)
824 : {
825 : case Western:
826 0 : m_pWestFontTypeFT->SetText(sMapText);
827 0 : break;
828 : case Asian:
829 0 : m_pEastFontTypeFT->SetText(sMapText);
830 0 : break;
831 : case Ctl:
832 0 : m_pCTLFontTypeFT->SetText(sMapText);
833 0 : break;
834 : }
835 :
836 : // save these settings
837 0 : pNameBox->SaveValue();
838 0 : pStyleBox->SaveValue();
839 0 : pSizeBox->SaveValue();
840 0 : pLangBox->SaveValueLBB();
841 0 : }
842 :
843 :
844 :
845 0 : bool SvxCharNamePage::FillItemSet_Impl( SfxItemSet& rSet, LanguageGroup eLangGrp )
846 : {
847 0 : bool bModified = false;
848 :
849 0 : FontNameBox* pNameBox = NULL;
850 0 : FontStyleBox* pStyleBox = NULL;
851 0 : FontSizeBox* pSizeBox = NULL;
852 0 : SvxLanguageBoxBase* pLangBox = NULL;
853 0 : sal_uInt16 nWhich = 0;
854 0 : sal_uInt16 nSlot = 0;
855 :
856 0 : switch ( eLangGrp )
857 : {
858 : case Western :
859 0 : pNameBox = m_pWestFontNameLB;
860 0 : pStyleBox = m_pWestFontStyleLB;
861 0 : pSizeBox = m_pWestFontSizeLB;
862 0 : pLangBox = m_pWestFontLanguageLB;
863 0 : nSlot = SID_ATTR_CHAR_FONT;
864 0 : break;
865 :
866 : case Asian :
867 0 : pNameBox = m_pEastFontNameLB;
868 0 : pStyleBox = m_pEastFontStyleLB;
869 0 : pSizeBox = m_pEastFontSizeLB;
870 0 : pLangBox = m_pEastFontLanguageLB;
871 0 : nSlot = SID_ATTR_CHAR_CJK_FONT;
872 0 : break;
873 :
874 : case Ctl :
875 0 : pNameBox = m_pCTLFontNameLB;
876 0 : pStyleBox = m_pCTLFontStyleLB;
877 0 : pSizeBox = m_pCTLFontSizeLB;
878 0 : pLangBox = m_pCTLFontLanguageLB;
879 0 : nSlot = SID_ATTR_CHAR_CTL_FONT;
880 0 : break;
881 : }
882 :
883 0 : nWhich = GetWhich( nSlot );
884 0 : const SfxPoolItem* pItem = NULL;
885 0 : const SfxItemSet& rOldSet = GetItemSet();
886 0 : const SfxPoolItem* pOld = NULL;
887 :
888 0 : const SfxItemSet* pExampleSet = GetTabDialog() ? GetTabDialog()->GetExampleSet() : NULL;
889 :
890 0 : bool bChanged = true;
891 0 : const OUString& rFontName = pNameBox->GetText();
892 0 : const FontList* pFontList = GetFontList();
893 0 : OUString aStyleBoxText =pStyleBox->GetText();
894 0 : sal_Int32 nEntryPos = pStyleBox->GetEntryPos( aStyleBoxText );
895 0 : if ( nEntryPos >= m_pImpl->m_nExtraEntryPos )
896 0 : aStyleBoxText = "";
897 0 : vcl::FontInfo aInfo( pFontList->Get( rFontName, aStyleBoxText ) );
898 0 : SvxFontItem aFontItem( aInfo.GetFamily(), aInfo.GetName(), aInfo.GetStyleName(),
899 0 : aInfo.GetPitch(), aInfo.GetCharSet(), nWhich );
900 0 : pOld = GetOldItem( rSet, nSlot );
901 :
902 0 : if ( pOld )
903 : {
904 0 : const SvxFontItem& rItem = *static_cast<const SvxFontItem*>(pOld);
905 :
906 0 : if ( rItem.GetFamilyName() == aFontItem.GetFamilyName() )
907 0 : bChanged = false;
908 : }
909 :
910 0 : if ( !bChanged )
911 0 : bChanged = pNameBox->GetSavedValue().isEmpty();
912 :
913 0 : if ( !bChanged && pExampleSet &&
914 0 : pExampleSet->GetItemState( nWhich, false, &pItem ) == SfxItemState::SET &&
915 0 : static_cast<const SvxFontItem*>(pItem)->GetFamilyName() != aFontItem.GetFamilyName() )
916 0 : bChanged = true;
917 :
918 0 : if ( bChanged && !rFontName.isEmpty() )
919 : {
920 0 : rSet.Put( aFontItem );
921 0 : bModified = true;
922 : }
923 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
924 0 : rSet.ClearItem( nWhich );
925 :
926 :
927 0 : bChanged = true;
928 0 : switch ( eLangGrp )
929 : {
930 0 : case Western : nSlot = SID_ATTR_CHAR_WEIGHT; break;
931 0 : case Asian : nSlot = SID_ATTR_CHAR_CJK_WEIGHT; break;
932 0 : case Ctl : nSlot = SID_ATTR_CHAR_CTL_WEIGHT; break;
933 : }
934 0 : nWhich = GetWhich( nSlot );
935 0 : FontWeight eWeight = aInfo.GetWeight();
936 0 : if ( nEntryPos >= m_pImpl->m_nExtraEntryPos )
937 0 : eWeight = WEIGHT_NORMAL;
938 0 : SvxWeightItem aWeightItem( eWeight, nWhich );
939 0 : pOld = GetOldItem( rSet, nSlot );
940 :
941 0 : if ( pOld )
942 : {
943 0 : const SvxWeightItem& rItem = *static_cast<const SvxWeightItem*>(pOld);
944 :
945 0 : if ( rItem.GetValue() == aWeightItem.GetValue() )
946 0 : bChanged = false;
947 : }
948 :
949 0 : if ( !bChanged )
950 : {
951 0 : bChanged = pStyleBox->GetSavedValue().isEmpty();
952 :
953 0 : if ( m_pImpl->m_bInSearchMode && bChanged &&
954 0 : aInfo.GetWeight() == WEIGHT_NORMAL && aInfo.GetItalic() != ITALIC_NONE )
955 0 : bChanged = true;
956 : }
957 :
958 0 : if ( !bChanged && pExampleSet &&
959 0 : pExampleSet->GetItemState( nWhich, false, &pItem ) == SfxItemState::SET &&
960 0 : static_cast<const SvxWeightItem*>(pItem)->GetValue() != aWeightItem.GetValue() )
961 0 : bChanged = true;
962 :
963 0 : if ( nEntryPos >= m_pImpl->m_nExtraEntryPos )
964 0 : bChanged = ( nEntryPos == m_pImpl->m_nExtraEntryPos );
965 :
966 0 : OUString aText( pStyleBox->GetText() ); // Tristate, then text empty
967 :
968 0 : if ( bChanged && !aText.isEmpty() )
969 : {
970 0 : rSet.Put( aWeightItem );
971 0 : bModified = true;
972 : }
973 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
974 0 : CLEARTITEM;
975 :
976 0 : bChanged = true;
977 0 : switch ( eLangGrp )
978 : {
979 0 : case Western : nSlot = SID_ATTR_CHAR_POSTURE; break;
980 0 : case Asian : nSlot = SID_ATTR_CHAR_CJK_POSTURE; break;
981 0 : case Ctl : nSlot = SID_ATTR_CHAR_CTL_POSTURE; break;
982 : }
983 0 : nWhich = GetWhich( nSlot );
984 0 : FontItalic eItalic = aInfo.GetItalic();
985 0 : if ( nEntryPos >= m_pImpl->m_nExtraEntryPos )
986 0 : eItalic = ITALIC_NONE;
987 0 : SvxPostureItem aPostureItem( eItalic, nWhich );
988 0 : pOld = GetOldItem( rSet, nSlot );
989 :
990 0 : if ( pOld )
991 : {
992 0 : const SvxPostureItem& rItem = *static_cast<const SvxPostureItem*>(pOld);
993 :
994 0 : if ( rItem.GetValue() == aPostureItem.GetValue() )
995 0 : bChanged = false;
996 : }
997 :
998 0 : if ( !bChanged )
999 : {
1000 0 : bChanged = pStyleBox->GetSavedValue().isEmpty();
1001 :
1002 0 : if ( m_pImpl->m_bInSearchMode && bChanged &&
1003 0 : aInfo.GetItalic() == ITALIC_NONE && aInfo.GetWeight() != WEIGHT_NORMAL )
1004 0 : bChanged = false;
1005 : }
1006 :
1007 0 : if ( !bChanged && pExampleSet &&
1008 0 : pExampleSet->GetItemState( nWhich, false, &pItem ) == SfxItemState::SET &&
1009 0 : static_cast<const SvxPostureItem*>(pItem)->GetValue() != aPostureItem.GetValue() )
1010 0 : bChanged = true;
1011 :
1012 0 : if ( nEntryPos >= m_pImpl->m_nExtraEntryPos )
1013 0 : bChanged = ( nEntryPos == ( m_pImpl->m_nExtraEntryPos + 1 ) );
1014 :
1015 0 : if ( bChanged && !aText.isEmpty() )
1016 : {
1017 0 : rSet.Put( aPostureItem );
1018 0 : bModified = true;
1019 : }
1020 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
1021 0 : CLEARTITEM;
1022 :
1023 : // FontSize
1024 0 : long nSize = static_cast<long>(pSizeBox->GetValue());
1025 :
1026 0 : if ( pSizeBox->GetText().isEmpty() ) // GetValue() returns the min-value
1027 0 : nSize = 0;
1028 0 : long nSavedSize = pSizeBox->GetSavedValue().toInt32();
1029 0 : bool bRel = true;
1030 :
1031 0 : if ( !pSizeBox->IsRelative() )
1032 : {
1033 0 : nSavedSize *= 10;
1034 0 : bRel = false;
1035 : }
1036 :
1037 0 : switch ( eLangGrp )
1038 : {
1039 0 : case Western : nSlot = SID_ATTR_CHAR_FONTHEIGHT; break;
1040 0 : case Asian : nSlot = SID_ATTR_CHAR_CJK_FONTHEIGHT; break;
1041 0 : case Ctl : nSlot = SID_ATTR_CHAR_CTL_FONTHEIGHT; break;
1042 : }
1043 0 : nWhich = GetWhich( nSlot );
1044 0 : const SvxFontHeightItem* pOldHeight = static_cast<const SvxFontHeightItem*>(GetOldItem( rSet, nSlot ));
1045 0 : bChanged = ( nSize != nSavedSize );
1046 :
1047 0 : if ( !bChanged && pExampleSet &&
1048 0 : pExampleSet->GetItemState( nWhich, false, &pItem ) == SfxItemState::SET )
1049 : {
1050 0 : float fSize = (float)nSize / 10;
1051 0 : long nVal = CalcToUnit( fSize, rSet.GetPool()->GetMetric( nWhich ) );
1052 0 : if ( static_cast<const SvxFontHeightItem*>(pItem)->GetHeight() != (sal_uInt32)nVal )
1053 0 : bChanged = true;
1054 : }
1055 :
1056 0 : if ( bChanged || !pOldHeight ||
1057 0 : bRel != ( SFX_MAPUNIT_RELATIVE != pOldHeight->GetPropUnit() || 100 != pOldHeight->GetProp() ) )
1058 : {
1059 0 : SfxMapUnit eUnit = rSet.GetPool()->GetMetric( nWhich );
1060 0 : if ( pSizeBox->IsRelative() )
1061 : {
1062 : DBG_ASSERT( GetItemSet().GetParent(), "No parent set" );
1063 : const SvxFontHeightItem& rOldItem =
1064 0 : static_cast<const SvxFontHeightItem&>(GetItemSet().GetParent()->Get( nWhich ));
1065 :
1066 0 : SvxFontHeightItem aHeight( 240, 100, nWhich );
1067 0 : if ( pSizeBox->IsPtRelative() )
1068 0 : aHeight.SetHeight( rOldItem.GetHeight(), (sal_uInt16)( nSize / 10 ), SFX_MAPUNIT_POINT, eUnit );
1069 : else
1070 0 : aHeight.SetHeight( rOldItem.GetHeight(), (sal_uInt16)nSize, SFX_MAPUNIT_RELATIVE );
1071 0 : rSet.Put( aHeight );
1072 : }
1073 : else
1074 : {
1075 0 : float fSize = (float)nSize / 10;
1076 0 : rSet.Put( SvxFontHeightItem( CalcToUnit( fSize, eUnit ), 100, nWhich ) );
1077 : }
1078 0 : bModified = true;
1079 : }
1080 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
1081 0 : CLEARTITEM;
1082 :
1083 0 : bChanged = true;
1084 0 : switch ( eLangGrp )
1085 : {
1086 0 : case Western : nSlot = SID_ATTR_CHAR_LANGUAGE; break;
1087 0 : case Asian : nSlot = SID_ATTR_CHAR_CJK_LANGUAGE; break;
1088 0 : case Ctl : nSlot = SID_ATTR_CHAR_CTL_LANGUAGE; break;
1089 : }
1090 0 : nWhich = GetWhich( nSlot );
1091 0 : pOld = GetOldItem( rSet, nSlot );
1092 :
1093 : // For language list boxes acting as ComboBox, check for, add and select an
1094 : // edited entry.
1095 0 : SvxLanguageComboBox* pLangComboBox = dynamic_cast<SvxLanguageComboBox*>(pLangBox);
1096 0 : if (pLangComboBox)
1097 : {
1098 0 : switch (pLangComboBox->GetEditedAndValid())
1099 : {
1100 : case SvxLanguageComboBox::EDITED_NO:
1101 : ; // nothing to do
1102 0 : break;
1103 : case SvxLanguageComboBox::EDITED_VALID:
1104 : {
1105 0 : const sal_Int32 nPos = pLangComboBox->SaveEditedAsEntry();
1106 0 : if (nPos != COMBOBOX_ENTRY_NOTFOUND)
1107 0 : pLangComboBox->SelectEntryPos( nPos);
1108 : }
1109 0 : break;
1110 : case SvxLanguageComboBox::EDITED_INVALID:
1111 0 : pLangComboBox->SelectEntryPos( pLangComboBox->GetSavedValueLBB());
1112 0 : break;
1113 : }
1114 : }
1115 :
1116 0 : sal_Int32 nLangPos = pLangBox->GetSelectEntryPosLBB();
1117 0 : LanguageType eLangType = (LanguageType)reinterpret_cast<sal_uLong>(pLangBox->GetEntryDataLBB( nLangPos ));
1118 :
1119 0 : if ( pOld )
1120 : {
1121 0 : const SvxLanguageItem& rItem = *static_cast<const SvxLanguageItem*>(pOld);
1122 :
1123 0 : if ( nLangPos == LISTBOX_ENTRY_NOTFOUND || eLangType == (LanguageType)rItem.GetValue() )
1124 0 : bChanged = false;
1125 : }
1126 :
1127 0 : if ( !bChanged )
1128 0 : bChanged = ( pLangBox->GetSavedValueLBB() == LISTBOX_ENTRY_NOTFOUND );
1129 :
1130 0 : if ( bChanged && nLangPos != LISTBOX_ENTRY_NOTFOUND )
1131 : {
1132 0 : rSet.Put( SvxLanguageItem( eLangType, nWhich ) );
1133 0 : bModified = true;
1134 : }
1135 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
1136 0 : CLEARTITEM;
1137 :
1138 0 : return bModified;
1139 : }
1140 :
1141 :
1142 :
1143 0 : IMPL_LINK_NOARG(SvxCharNamePage, UpdateHdl_Impl)
1144 : {
1145 0 : UpdatePreview_Impl();
1146 0 : return 0;
1147 : }
1148 :
1149 :
1150 :
1151 0 : IMPL_LINK( SvxCharNamePage, FontModifyHdl_Impl, void*, pNameBox )
1152 : {
1153 0 : m_pImpl->m_aUpdateTimer.Start();
1154 :
1155 0 : if ( m_pWestFontNameLB == pNameBox || m_pEastFontNameLB == pNameBox || m_pCTLFontNameLB == pNameBox )
1156 : {
1157 0 : FillStyleBox_Impl( (FontNameBox*)pNameBox );
1158 0 : FillSizeBox_Impl( (FontNameBox*)pNameBox );
1159 : }
1160 0 : return 0;
1161 : }
1162 :
1163 :
1164 :
1165 0 : void SvxCharNamePage::ActivatePage( const SfxItemSet& rSet )
1166 : {
1167 0 : SvxCharBasePage::ActivatePage( rSet );
1168 :
1169 0 : UpdatePreview_Impl(); // instead of asynchronous calling in ctor
1170 0 : }
1171 :
1172 :
1173 :
1174 0 : int SvxCharNamePage::DeactivatePage( SfxItemSet* _pSet )
1175 : {
1176 0 : if ( _pSet )
1177 0 : FillItemSet( _pSet );
1178 0 : return LEAVE_PAGE;
1179 : }
1180 :
1181 :
1182 :
1183 0 : SfxTabPage* SvxCharNamePage::Create( vcl::Window* pParent, const SfxItemSet* rSet )
1184 : {
1185 0 : return new SvxCharNamePage( pParent, *rSet );
1186 : }
1187 :
1188 :
1189 :
1190 0 : const sal_uInt16* SvxCharNamePage::GetRanges()
1191 : {
1192 0 : return pNameRanges;
1193 : }
1194 :
1195 :
1196 :
1197 0 : void SvxCharNamePage::Reset( const SfxItemSet* rSet )
1198 : {
1199 0 : Reset_Impl( *rSet, Western );
1200 0 : Reset_Impl( *rSet, Asian );
1201 0 : Reset_Impl( *rSet, Ctl );
1202 :
1203 0 : SetPrevFontWidthScale( *rSet );
1204 0 : UpdatePreview_Impl();
1205 0 : }
1206 :
1207 :
1208 :
1209 0 : bool SvxCharNamePage::FillItemSet( SfxItemSet* rSet )
1210 : {
1211 0 : bool bModified = FillItemSet_Impl( *rSet, Western );
1212 0 : bModified |= FillItemSet_Impl( *rSet, Asian );
1213 0 : bModified |= FillItemSet_Impl( *rSet, Ctl );
1214 0 : return bModified;
1215 : }
1216 :
1217 :
1218 :
1219 0 : void SvxCharNamePage::SetFontList( const SvxFontListItem& rItem )
1220 : {
1221 0 : if ( m_pImpl->m_bMustDelete )
1222 : {
1223 0 : delete m_pImpl->m_pFontList;
1224 : }
1225 0 : m_pImpl->m_pFontList = rItem.GetFontList()->Clone();
1226 0 : m_pImpl->m_bMustDelete = true;
1227 0 : }
1228 :
1229 :
1230 : namespace
1231 : {
1232 0 : void enableRelativeMode( SvxCharNamePage* _pPage, FontSizeBox* _pFontSizeLB, sal_uInt16 _nHeightWhich )
1233 : {
1234 0 : _pFontSizeLB->EnableRelativeMode( 5, 995, 5 ); // min 5%, max 995%, step 5
1235 :
1236 : const SvxFontHeightItem& rHeightItem =
1237 0 : static_cast<const SvxFontHeightItem&>(_pPage->GetItemSet().GetParent()->Get( _nHeightWhich ));
1238 0 : SfxMapUnit eUnit = _pPage->GetItemSet().GetPool()->GetMetric( _nHeightWhich );
1239 : short nCurHeight =
1240 0 : static_cast< short >( CalcToPoint( rHeightItem.GetHeight(), eUnit, 1 ) * 10 );
1241 :
1242 : // based on the current height:
1243 : // - negative until minimum of 2 pt
1244 : // - positive until maximum of 999 pt
1245 0 : _pFontSizeLB->EnablePtRelativeMode( sal::static_int_cast< short >(-(nCurHeight - 20)), (9999 - nCurHeight), 10 );
1246 0 : }
1247 : }
1248 :
1249 :
1250 0 : void SvxCharNamePage::EnableRelativeMode()
1251 : {
1252 : DBG_ASSERT( GetItemSet().GetParent(), "RelativeMode, but no ParentSet!" );
1253 0 : enableRelativeMode(this,m_pWestFontSizeLB,GetWhich( SID_ATTR_CHAR_FONTHEIGHT ));
1254 0 : enableRelativeMode(this,m_pEastFontSizeLB,GetWhich( SID_ATTR_CHAR_CJK_FONTHEIGHT ));
1255 0 : enableRelativeMode(this,m_pCTLFontSizeLB,GetWhich( SID_ATTR_CHAR_CTL_FONTHEIGHT ));
1256 0 : }
1257 :
1258 :
1259 :
1260 0 : void SvxCharNamePage::EnableSearchMode()
1261 : {
1262 0 : m_pImpl->m_bInSearchMode = true;
1263 0 : }
1264 :
1265 0 : void SvxCharNamePage::DisableControls( sal_uInt16 nDisable )
1266 : {
1267 0 : if ( DISABLE_LANGUAGE & nDisable )
1268 : {
1269 0 : if ( m_pWestFontLanguageFT ) m_pWestFontLanguageFT->Disable();
1270 0 : if ( m_pWestFontLanguageLB ) m_pWestFontLanguageLB->Disable();
1271 0 : if ( m_pEastFontLanguageFT ) m_pEastFontLanguageFT->Disable();
1272 0 : if ( m_pEastFontLanguageLB ) m_pEastFontLanguageLB->Disable();
1273 0 : if ( m_pCTLFontLanguageFT ) m_pCTLFontLanguageFT->Disable();
1274 0 : if ( m_pCTLFontLanguageLB ) m_pCTLFontLanguageLB->Disable();
1275 : }
1276 :
1277 0 : if ( DISABLE_HIDE_LANGUAGE & nDisable )
1278 : {
1279 0 : if ( m_pWestFontLanguageFT ) m_pWestFontLanguageFT->Hide();
1280 0 : if ( m_pWestFontLanguageLB ) m_pWestFontLanguageLB->Hide();
1281 0 : if ( m_pEastFontLanguageFT ) m_pEastFontLanguageFT->Hide();
1282 0 : if ( m_pEastFontLanguageLB ) m_pEastFontLanguageLB->Hide();
1283 0 : if ( m_pCTLFontLanguageFT ) m_pCTLFontLanguageFT->Hide();
1284 0 : if ( m_pCTLFontLanguageLB ) m_pCTLFontLanguageLB->Hide();
1285 : }
1286 0 : }
1287 :
1288 :
1289 0 : void SvxCharNamePage::SetPreviewBackgroundToCharacter()
1290 : {
1291 0 : m_bPreviewBackgroundToCharacter = true;
1292 0 : }
1293 :
1294 :
1295 0 : void SvxCharNamePage::PageCreated(const SfxAllItemSet& aSet)
1296 : {
1297 0 : SFX_ITEMSET_ARG (&aSet,pFontListItem,SvxFontListItem,SID_ATTR_CHAR_FONTLIST,false);
1298 0 : SFX_ITEMSET_ARG (&aSet,pFlagItem,SfxUInt32Item,SID_FLAG_TYPE,false);
1299 0 : SFX_ITEMSET_ARG (&aSet,pDisalbeItem,SfxUInt16Item,SID_DISABLE_CTL,false);
1300 0 : if (pFontListItem)
1301 0 : SetFontList(*pFontListItem);
1302 :
1303 0 : if (pFlagItem)
1304 : {
1305 0 : sal_uInt32 nFlags=pFlagItem->GetValue();
1306 0 : if ( ( nFlags & SVX_RELATIVE_MODE ) == SVX_RELATIVE_MODE )
1307 0 : EnableRelativeMode();
1308 0 : if ( ( nFlags & SVX_PREVIEW_CHARACTER ) == SVX_PREVIEW_CHARACTER )
1309 0 : SetPreviewBackgroundToCharacter();
1310 : }
1311 0 : if (pDisalbeItem)
1312 0 : DisableControls(pDisalbeItem->GetValue());
1313 0 : }
1314 : // class SvxCharEffectsPage ----------------------------------------------
1315 :
1316 0 : SvxCharEffectsPage::SvxCharEffectsPage( vcl::Window* pParent, const SfxItemSet& rInSet )
1317 : : SvxCharBasePage(pParent, "EffectsPage", "cui/ui/effectspage.ui", rInSet)
1318 0 : , m_aTransparentColorName(CUI_RES(RID_SVXSTR_CHARNAME_TRANSPARENT))
1319 : {
1320 0 : get(m_pFontColorFT, "fontcolorft");
1321 0 : get(m_pFontColorLB, "fontcolorlb");
1322 0 : get(m_pEffectsFT, "effectsft");
1323 0 : get(m_pEffectsLB, "effectslb");
1324 0 : get(m_pReliefFT, "reliefft");
1325 0 : get(m_pReliefLB, "relieflb");
1326 0 : get(m_pOutlineBtn, "outlinecb");
1327 0 : get(m_pShadowBtn, "shadowcb");
1328 0 : get(m_pBlinkingBtn, "blinkingcb");
1329 0 : get(m_pHiddenBtn, "hiddencb");
1330 0 : get(m_pOverlineLB, "overlinelb");
1331 0 : get(m_pOverlineColorFT, "overlinecolorft");
1332 0 : get(m_pOverlineColorLB, "overlinecolorlb");
1333 0 : get(m_pStrikeoutLB, "strikeoutlb");
1334 0 : get(m_pUnderlineLB, "underlinelb");
1335 0 : get(m_pUnderlineColorFT, "underlinecolorft");
1336 0 : get(m_pUnderlineColorLB, "underlinecolorlb");
1337 0 : get(m_pIndividualWordsBtn, "individualwordscb");
1338 0 : get(m_pEmphasisFT, "emphasisft");
1339 0 : get(m_pEmphasisLB, "emphasislb");
1340 0 : get(m_pPositionFT, "positionft");
1341 0 : get(m_pPositionLB, "positionlb");
1342 :
1343 0 : get(m_pPreviewWin, "preview");
1344 0 : Initialize();
1345 0 : }
1346 :
1347 :
1348 :
1349 0 : void SvxCharEffectsPage::Initialize()
1350 : {
1351 : // to handle the changes of the other pages
1352 0 : SetExchangeSupport();
1353 :
1354 : // HTML-Mode
1355 : const SfxPoolItem* pItem;
1356 : SfxObjectShell* pShell;
1357 0 : if ( SfxItemState::SET == GetItemSet().GetItemState( SID_HTML_MODE, false, &pItem ) ||
1358 0 : ( NULL != ( pShell = SfxObjectShell::Current() ) &&
1359 0 : NULL != ( pItem = pShell->GetItem( SID_HTML_MODE ) ) ) )
1360 : {
1361 0 : m_nHtmlMode = static_cast<const SfxUInt16Item*>(pItem)->GetValue();
1362 0 : if ( ( m_nHtmlMode & HTMLMODE_ON ) == HTMLMODE_ON )
1363 : {
1364 : //!!! hide some controls please
1365 : }
1366 : }
1367 :
1368 : // fill the color box
1369 0 : SfxObjectShell* pDocSh = SfxObjectShell::Current();
1370 : DBG_ASSERT( pDocSh, "DocShell not found!" );
1371 0 : XColorListRef pColorTable;
1372 :
1373 0 : if ( pDocSh )
1374 : {
1375 0 : pItem = pDocSh->GetItem( SID_COLOR_TABLE );
1376 0 : if ( pItem != NULL )
1377 0 : pColorTable = static_cast<const SvxColorListItem*>(pItem)->GetColorList();
1378 : }
1379 :
1380 0 : if ( !pColorTable.is() )
1381 0 : pColorTable = XColorList::CreateStdColorList();
1382 :
1383 0 : m_pUnderlineColorLB->SetUpdateMode( false );
1384 0 : m_pOverlineColorLB->SetUpdateMode( false );
1385 0 : m_pFontColorLB->SetUpdateMode( false );
1386 :
1387 : {
1388 0 : SfxPoolItem* pDummy = NULL;
1389 0 : SfxViewFrame* pFrame = SfxViewFrame::GetFirst( pDocSh );
1390 0 : if ( !pFrame ||
1391 0 : SfxItemState::DEFAULT > pFrame->GetBindings().QueryState( SID_ATTR_AUTO_COLOR_INVALID, pDummy ) )
1392 : {
1393 0 : m_pUnderlineColorLB->InsertAutomaticEntryColor( Color( COL_AUTO ) );
1394 0 : m_pOverlineColorLB->InsertAutomaticEntryColor( Color( COL_AUTO ) );
1395 0 : m_pFontColorLB->InsertAutomaticEntryColor( Color( COL_AUTO ) );
1396 : }
1397 0 : delete pDummy;
1398 : }
1399 0 : for ( long i = 0; i < pColorTable->Count(); i++ )
1400 : {
1401 0 : XColorEntry* pEntry = pColorTable->GetColor(i);
1402 0 : m_pUnderlineColorLB->InsertEntry( pEntry->GetColor(), pEntry->GetName() );
1403 0 : m_pOverlineColorLB->InsertEntry( pEntry->GetColor(), pEntry->GetName() );
1404 0 : m_pFontColorLB->InsertEntry( pEntry->GetColor(), pEntry->GetName() );
1405 : }
1406 :
1407 0 : m_pUnderlineColorLB->SetUpdateMode( true );
1408 0 : m_pOverlineColorLB->SetUpdateMode( true );
1409 0 : m_pFontColorLB->SetUpdateMode( true );
1410 0 : m_pFontColorLB->SetSelectHdl( LINK( this, SvxCharEffectsPage, ColorBoxSelectHdl_Impl ) );
1411 :
1412 : // handler
1413 0 : Link aLink = LINK( this, SvxCharEffectsPage, SelectHdl_Impl );
1414 0 : m_pUnderlineLB->SetSelectHdl( aLink );
1415 0 : m_pUnderlineColorLB->SetSelectHdl( aLink );
1416 0 : m_pOverlineLB->SetSelectHdl( aLink );
1417 0 : m_pOverlineColorLB->SetSelectHdl( aLink );
1418 0 : m_pStrikeoutLB->SetSelectHdl( aLink );
1419 0 : m_pEmphasisLB->SetSelectHdl( aLink );
1420 0 : m_pPositionLB->SetSelectHdl( aLink );
1421 0 : m_pEffectsLB->SetSelectHdl( aLink );
1422 0 : m_pReliefLB->SetSelectHdl( aLink );
1423 :
1424 0 : m_pUnderlineLB->SelectEntryPos( 0 );
1425 0 : m_pUnderlineColorLB->SelectEntryPos( 0 );
1426 0 : m_pOverlineLB->SelectEntryPos( 0 );
1427 0 : m_pOverlineColorLB->SelectEntryPos( 0 );
1428 0 : m_pStrikeoutLB->SelectEntryPos( 0 );
1429 0 : m_pEmphasisLB->SelectEntryPos( 0 );
1430 0 : m_pPositionLB->SelectEntryPos( 0 );
1431 0 : SelectHdl_Impl( NULL );
1432 0 : SelectHdl_Impl( m_pEmphasisLB );
1433 :
1434 0 : m_pEffectsLB->SelectEntryPos( 0 );
1435 :
1436 0 : m_pIndividualWordsBtn->SetClickHdl( LINK( this, SvxCharEffectsPage, CbClickHdl_Impl ) );
1437 0 : aLink = LINK( this, SvxCharEffectsPage, TristClickHdl_Impl );
1438 0 : m_pOutlineBtn->SetClickHdl( aLink );
1439 0 : m_pShadowBtn->SetClickHdl( aLink );
1440 :
1441 0 : if ( !SvtLanguageOptions().IsAsianTypographyEnabled() )
1442 : {
1443 0 : m_pEmphasisFT->Hide();
1444 0 : m_pEmphasisLB->Hide();
1445 0 : m_pPositionFT->Hide();
1446 0 : m_pPositionLB->Hide();
1447 0 : }
1448 0 : }
1449 :
1450 0 : SvxCharEffectsPage::~SvxCharEffectsPage()
1451 : {
1452 0 : }
1453 :
1454 :
1455 :
1456 0 : void SvxCharEffectsPage::UpdatePreview_Impl()
1457 : {
1458 0 : SvxFont& rFont = GetPreviewFont();
1459 0 : SvxFont& rCJKFont = GetPreviewCJKFont();
1460 0 : SvxFont& rCTLFont = GetPreviewCTLFont();
1461 :
1462 0 : sal_Int32 nPos = m_pUnderlineLB->GetSelectEntryPos();
1463 0 : FontUnderline eUnderline = (FontUnderline)reinterpret_cast<sal_uLong>(m_pUnderlineLB->GetEntryData( nPos ));
1464 0 : nPos = m_pOverlineLB->GetSelectEntryPos();
1465 0 : FontUnderline eOverline = (FontUnderline)reinterpret_cast<sal_uLong>(m_pOverlineLB->GetEntryData( nPos ));
1466 0 : nPos = m_pStrikeoutLB->GetSelectEntryPos();
1467 0 : FontStrikeout eStrikeout = (FontStrikeout)reinterpret_cast<sal_uLong>(m_pStrikeoutLB->GetEntryData( nPos ));
1468 0 : rFont.SetUnderline( eUnderline );
1469 0 : rCJKFont.SetUnderline( eUnderline );
1470 0 : rCTLFont.SetUnderline( eUnderline );
1471 0 : m_pPreviewWin->SetTextLineColor( m_pUnderlineColorLB->GetSelectEntryColor() );
1472 0 : rFont.SetOverline( eOverline );
1473 0 : rCJKFont.SetOverline( eOverline );
1474 0 : rCTLFont.SetOverline( eOverline );
1475 0 : m_pPreviewWin->SetOverlineColor( m_pOverlineColorLB->GetSelectEntryColor() );
1476 0 : rFont.SetStrikeout( eStrikeout );
1477 0 : rCJKFont.SetStrikeout( eStrikeout );
1478 0 : rCTLFont.SetStrikeout( eStrikeout );
1479 :
1480 0 : nPos = m_pPositionLB->GetSelectEntryPos();
1481 0 : bool bUnder = ( CHRDLG_POSITION_UNDER == reinterpret_cast<sal_uLong>(m_pPositionLB->GetEntryData( nPos )) );
1482 0 : FontEmphasisMark eMark = (FontEmphasisMark)m_pEmphasisLB->GetSelectEntryPos();
1483 0 : eMark |= bUnder ? EMPHASISMARK_POS_BELOW : EMPHASISMARK_POS_ABOVE;
1484 0 : rFont.SetEmphasisMark( eMark );
1485 0 : rCJKFont.SetEmphasisMark( eMark );
1486 0 : rCTLFont.SetEmphasisMark( eMark );
1487 :
1488 0 : sal_Int32 nRelief = m_pReliefLB->GetSelectEntryPos();
1489 0 : if(LISTBOX_ENTRY_NOTFOUND != nRelief)
1490 : {
1491 0 : rFont.SetRelief( (FontRelief)nRelief );
1492 0 : rCJKFont.SetRelief( (FontRelief)nRelief );
1493 0 : rCTLFont.SetRelief( (FontRelief)nRelief );
1494 : }
1495 :
1496 0 : rFont.SetOutline( StateToAttr( m_pOutlineBtn->GetState() ) );
1497 0 : rCJKFont.SetOutline( rFont.IsOutline() );
1498 0 : rCTLFont.SetOutline( rFont.IsOutline() );
1499 :
1500 0 : rFont.SetShadow( StateToAttr( m_pShadowBtn->GetState() ) );
1501 0 : rCJKFont.SetShadow( rFont.IsShadow() );
1502 0 : rCTLFont.SetShadow( rFont.IsShadow() );
1503 :
1504 0 : sal_Int32 nCapsPos = m_pEffectsLB->GetSelectEntryPos();
1505 0 : if ( nCapsPos != LISTBOX_ENTRY_NOTFOUND )
1506 : {
1507 0 : rFont.SetCaseMap( (SvxCaseMap)nCapsPos );
1508 0 : rCJKFont.SetCaseMap( (SvxCaseMap)nCapsPos );
1509 : // #i78474# small caps do not exist in CTL fonts
1510 0 : rCTLFont.SetCaseMap( static_cast<SvxCaseMap>( nCapsPos == SVX_CASEMAP_KAPITAELCHEN ? SVX_CASEMAP_NOT_MAPPED : (SvxCaseMap)nCapsPos) );
1511 : }
1512 :
1513 0 : bool bWordLine = m_pIndividualWordsBtn->IsChecked();
1514 0 : rFont.SetWordLineMode( bWordLine );
1515 0 : rCJKFont.SetWordLineMode( bWordLine );
1516 0 : rCTLFont.SetWordLineMode( bWordLine );
1517 :
1518 0 : m_pPreviewWin->Invalidate();
1519 0 : }
1520 :
1521 :
1522 :
1523 0 : void SvxCharEffectsPage::SetCaseMap_Impl( SvxCaseMap eCaseMap )
1524 : {
1525 0 : if ( SVX_CASEMAP_END > eCaseMap )
1526 : m_pEffectsLB->SelectEntryPos(
1527 0 : sal::static_int_cast< sal_Int32 >( eCaseMap ) );
1528 : else
1529 : {
1530 0 : m_pEffectsLB->SetNoSelection();
1531 0 : eCaseMap = SVX_CASEMAP_NOT_MAPPED;
1532 : }
1533 :
1534 0 : UpdatePreview_Impl();
1535 0 : }
1536 :
1537 :
1538 :
1539 0 : void SvxCharEffectsPage::ResetColor_Impl( const SfxItemSet& rSet )
1540 : {
1541 0 : sal_uInt16 nWhich = GetWhich( SID_ATTR_CHAR_COLOR );
1542 0 : SfxItemState eState = rSet.GetItemState( nWhich );
1543 :
1544 0 : switch ( eState )
1545 : {
1546 : case SfxItemState::UNKNOWN:
1547 0 : m_pFontColorFT->Hide();
1548 0 : m_pFontColorLB->Hide();
1549 0 : break;
1550 :
1551 : case SfxItemState::DISABLED:
1552 : case SfxItemState::READONLY:
1553 0 : m_pFontColorFT->Disable();
1554 0 : m_pFontColorLB->Disable();
1555 0 : break;
1556 :
1557 : case SfxItemState::DONTCARE:
1558 0 : m_pFontColorLB->SetNoSelection();
1559 0 : break;
1560 :
1561 : case SfxItemState::DEFAULT:
1562 : case SfxItemState::SET:
1563 : {
1564 0 : SvxFont& rFont = GetPreviewFont();
1565 0 : SvxFont& rCJKFont = GetPreviewCJKFont();
1566 0 : SvxFont& rCTLFont = GetPreviewCTLFont();
1567 :
1568 0 : const SvxColorItem& rItem = static_cast<const SvxColorItem&>(rSet.Get( nWhich ));
1569 0 : Color aColor = rItem.GetValue();
1570 0 : rFont.SetColor( aColor.GetColor() == COL_AUTO ? Color(COL_BLACK) : aColor );
1571 0 : rCJKFont.SetColor( aColor.GetColor() == COL_AUTO ? Color(COL_BLACK) : aColor );
1572 0 : rCTLFont.SetColor( aColor.GetColor() == COL_AUTO ? Color(COL_BLACK) : aColor );
1573 :
1574 0 : m_pPreviewWin->Invalidate();
1575 0 : sal_Int32 nSelPos = m_pFontColorLB->GetEntryPos( aColor );
1576 0 : if ( nSelPos == LISTBOX_ENTRY_NOTFOUND && aColor == Color( COL_TRANSPARENT ) )
1577 0 : nSelPos = m_pFontColorLB->GetEntryPos( m_aTransparentColorName );
1578 :
1579 0 : if ( LISTBOX_ENTRY_NOTFOUND != nSelPos )
1580 0 : m_pFontColorLB->SelectEntryPos( nSelPos );
1581 : else
1582 : {
1583 0 : nSelPos = m_pFontColorLB->GetEntryPos( aColor );
1584 0 : if ( LISTBOX_ENTRY_NOTFOUND != nSelPos )
1585 0 : m_pFontColorLB->SelectEntryPos( nSelPos );
1586 : else
1587 : m_pFontColorLB->SelectEntryPos(
1588 0 : m_pFontColorLB->InsertEntry( aColor, OUString( SVX_RES( RID_SVXSTR_COLOR_USER ) ) ) );
1589 : }
1590 0 : break;
1591 : }
1592 : }
1593 0 : }
1594 :
1595 :
1596 :
1597 0 : bool SvxCharEffectsPage::FillItemSetColor_Impl( SfxItemSet& rSet )
1598 : {
1599 0 : sal_uInt16 nWhich = GetWhich( SID_ATTR_CHAR_COLOR );
1600 0 : const SvxColorItem* pOld = static_cast<const SvxColorItem*>(GetOldItem( rSet, SID_ATTR_CHAR_COLOR ));
1601 0 : const SvxColorItem* pItem = NULL;
1602 0 : bool bChanged = true;
1603 0 : const SfxItemSet* pExampleSet = GetTabDialog() ? GetTabDialog()->GetExampleSet() : NULL;
1604 0 : const SfxItemSet& rOldSet = GetItemSet();
1605 :
1606 0 : Color aSelectedColor;
1607 0 : if ( m_pFontColorLB->GetSelectEntry() == m_aTransparentColorName )
1608 0 : aSelectedColor = Color( COL_TRANSPARENT );
1609 : else
1610 0 : aSelectedColor = m_pFontColorLB->GetSelectEntryColor();
1611 :
1612 0 : if ( pOld && pOld->GetValue() == aSelectedColor )
1613 0 : bChanged = false;
1614 :
1615 0 : if ( !bChanged )
1616 0 : bChanged = ( m_pFontColorLB->GetSavedValue() == LISTBOX_ENTRY_NOTFOUND );
1617 :
1618 0 : if ( !bChanged && pExampleSet &&
1619 0 : pExampleSet->GetItemState( nWhich, false, (const SfxPoolItem**)&pItem ) == SfxItemState::SET &&
1620 0 : ( (SvxColorItem*)pItem )->GetValue() != aSelectedColor )
1621 0 : bChanged = true;
1622 :
1623 0 : bool bModified = false;
1624 :
1625 0 : if ( bChanged && m_pFontColorLB->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND )
1626 : {
1627 0 : rSet.Put( SvxColorItem( aSelectedColor, nWhich ) );
1628 0 : bModified = true;
1629 : }
1630 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
1631 0 : CLEARTITEM;
1632 :
1633 0 : return bModified;
1634 : }
1635 :
1636 :
1637 :
1638 0 : IMPL_LINK( SvxCharEffectsPage, SelectHdl_Impl, ListBox*, pBox )
1639 : {
1640 0 : if ( m_pEmphasisLB == pBox )
1641 : {
1642 0 : sal_Int32 nEPos = m_pEmphasisLB->GetSelectEntryPos();
1643 0 : bool bEnable = ( nEPos > 0 && nEPos != LISTBOX_ENTRY_NOTFOUND );
1644 0 : m_pPositionFT->Enable( bEnable );
1645 0 : m_pPositionLB->Enable( bEnable );
1646 : }
1647 0 : else if( m_pReliefLB == pBox)
1648 : {
1649 0 : bool bEnable = ( pBox->GetSelectEntryPos() == 0 );
1650 0 : m_pOutlineBtn->Enable( bEnable );
1651 0 : m_pShadowBtn->Enable( bEnable );
1652 : }
1653 0 : else if ( m_pPositionLB != pBox )
1654 : {
1655 0 : sal_Int32 nUPos = m_pUnderlineLB->GetSelectEntryPos(),
1656 0 : nOPos = m_pOverlineLB->GetSelectEntryPos(),
1657 0 : nSPos = m_pStrikeoutLB->GetSelectEntryPos();
1658 0 : bool bUEnable = ( nUPos > 0 && nUPos != LISTBOX_ENTRY_NOTFOUND );
1659 0 : bool bOEnable = ( nOPos > 0 && nOPos != LISTBOX_ENTRY_NOTFOUND );
1660 0 : m_pUnderlineColorFT->Enable( bUEnable );
1661 0 : m_pUnderlineColorLB->Enable( bUEnable );
1662 0 : m_pOverlineColorFT->Enable( bOEnable );
1663 0 : m_pOverlineColorLB->Enable( bOEnable );
1664 0 : m_pIndividualWordsBtn->Enable( bUEnable || bOEnable || ( nSPos > 0 && nSPos != LISTBOX_ENTRY_NOTFOUND ) );
1665 : }
1666 0 : UpdatePreview_Impl();
1667 0 : return 0;
1668 : }
1669 :
1670 :
1671 :
1672 0 : IMPL_LINK_NOARG(SvxCharEffectsPage, UpdatePreview_Impl)
1673 : {
1674 0 : bool bEnable = ( ( m_pUnderlineLB->GetSelectEntryPos() > 0 ) ||
1675 0 : ( m_pOverlineLB->GetSelectEntryPos() > 0 ) ||
1676 0 : ( m_pStrikeoutLB->GetSelectEntryPos() > 0 ) );
1677 0 : m_pIndividualWordsBtn->Enable( bEnable );
1678 :
1679 0 : UpdatePreview_Impl();
1680 0 : return 0;
1681 : }
1682 :
1683 :
1684 :
1685 0 : IMPL_LINK_NOARG(SvxCharEffectsPage, CbClickHdl_Impl)
1686 : {
1687 0 : UpdatePreview_Impl();
1688 0 : return 0;
1689 : }
1690 :
1691 :
1692 :
1693 0 : IMPL_LINK_NOARG(SvxCharEffectsPage, TristClickHdl_Impl)
1694 : {
1695 0 : UpdatePreview_Impl();
1696 0 : return 0;
1697 : }
1698 :
1699 :
1700 :
1701 0 : IMPL_LINK( SvxCharEffectsPage, ColorBoxSelectHdl_Impl, ColorListBox*, pBox )
1702 : {
1703 0 : SvxFont& rFont = GetPreviewFont();
1704 0 : SvxFont& rCJKFont = GetPreviewCJKFont();
1705 0 : SvxFont& rCTLFont = GetPreviewCTLFont();
1706 :
1707 0 : Color aSelectedColor;
1708 0 : if ( pBox->GetSelectEntry() == m_aTransparentColorName )
1709 0 : aSelectedColor = Color( COL_TRANSPARENT );
1710 : else
1711 0 : aSelectedColor = pBox->GetSelectEntryColor();
1712 0 : rFont.SetColor( aSelectedColor.GetColor() == COL_AUTO ? Color(COL_BLACK) : aSelectedColor );
1713 0 : rCJKFont.SetColor( aSelectedColor.GetColor() == COL_AUTO ? Color(COL_BLACK) : aSelectedColor );
1714 0 : rCTLFont.SetColor( aSelectedColor.GetColor() == COL_AUTO ? Color(COL_BLACK) : aSelectedColor );
1715 :
1716 0 : m_pPreviewWin->Invalidate();
1717 0 : return 0;
1718 : }
1719 :
1720 :
1721 0 : int SvxCharEffectsPage::DeactivatePage( SfxItemSet* _pSet )
1722 : {
1723 0 : if ( _pSet )
1724 0 : FillItemSet( _pSet );
1725 0 : return LEAVE_PAGE;
1726 : }
1727 :
1728 :
1729 :
1730 0 : SfxTabPage* SvxCharEffectsPage::Create( vcl::Window* pParent, const SfxItemSet* rSet )
1731 : {
1732 0 : return new SvxCharEffectsPage( pParent, *rSet );
1733 : }
1734 :
1735 :
1736 :
1737 0 : const sal_uInt16* SvxCharEffectsPage::GetRanges()
1738 : {
1739 0 : return pEffectsRanges;
1740 : }
1741 :
1742 :
1743 :
1744 0 : void SvxCharEffectsPage::Reset( const SfxItemSet* rSet )
1745 : {
1746 0 : SvxFont& rFont = GetPreviewFont();
1747 0 : SvxFont& rCJKFont = GetPreviewCJKFont();
1748 0 : SvxFont& rCTLFont = GetPreviewCTLFont();
1749 :
1750 0 : bool bEnable = false;
1751 :
1752 : // Underline
1753 0 : sal_uInt16 nWhich = GetWhich( SID_ATTR_CHAR_UNDERLINE );
1754 0 : rFont.SetUnderline( UNDERLINE_NONE );
1755 0 : rCJKFont.SetUnderline( UNDERLINE_NONE );
1756 0 : rCTLFont.SetUnderline( UNDERLINE_NONE );
1757 :
1758 0 : m_pUnderlineLB->SelectEntryPos( 0 );
1759 0 : SfxItemState eState = rSet->GetItemState( nWhich );
1760 :
1761 0 : if ( eState >= SfxItemState::DONTCARE )
1762 : {
1763 0 : if ( eState == SfxItemState::DONTCARE )
1764 0 : m_pUnderlineLB->SetNoSelection();
1765 : else
1766 : {
1767 0 : const SvxUnderlineItem& rItem = static_cast<const SvxUnderlineItem&>(rSet->Get( nWhich ));
1768 0 : FontUnderline eUnderline = (FontUnderline)rItem.GetValue();
1769 0 : rFont.SetUnderline( eUnderline );
1770 0 : rCJKFont.SetUnderline( eUnderline );
1771 0 : rCTLFont.SetUnderline( eUnderline );
1772 :
1773 0 : if ( eUnderline != UNDERLINE_NONE )
1774 : {
1775 0 : for ( sal_Int32 i = 0; i < m_pUnderlineLB->GetEntryCount(); ++i )
1776 : {
1777 0 : if ( (FontUnderline)reinterpret_cast<sal_uLong>(m_pUnderlineLB->GetEntryData(i)) == eUnderline )
1778 : {
1779 0 : m_pUnderlineLB->SelectEntryPos(i);
1780 0 : bEnable = true;
1781 0 : break;
1782 : }
1783 : }
1784 :
1785 0 : Color aColor = rItem.GetColor();
1786 0 : sal_Int32 nPos = m_pUnderlineColorLB->GetEntryPos( aColor );
1787 :
1788 0 : if ( LISTBOX_ENTRY_NOTFOUND != nPos )
1789 0 : m_pUnderlineColorLB->SelectEntryPos( nPos );
1790 : else
1791 : {
1792 0 : nPos = m_pUnderlineColorLB->GetEntryPos( aColor );
1793 0 : if ( LISTBOX_ENTRY_NOTFOUND != nPos )
1794 0 : m_pUnderlineColorLB->SelectEntryPos( nPos );
1795 : else
1796 : m_pUnderlineColorLB->SelectEntryPos(
1797 : m_pUnderlineColorLB->InsertEntry( aColor,
1798 0 : OUString( SVX_RES( RID_SVXSTR_COLOR_USER ) ) ) );
1799 : }
1800 : }
1801 : else
1802 : {
1803 0 : m_pUnderlineColorLB->SelectEntry( Color( COL_AUTO ));
1804 0 : m_pUnderlineColorLB->Disable();
1805 : }
1806 : }
1807 : }
1808 :
1809 : // Overline
1810 0 : nWhich = GetWhich( SID_ATTR_CHAR_OVERLINE );
1811 0 : rFont.SetOverline( UNDERLINE_NONE );
1812 0 : rCJKFont.SetOverline( UNDERLINE_NONE );
1813 0 : rCTLFont.SetOverline( UNDERLINE_NONE );
1814 :
1815 0 : m_pOverlineLB->SelectEntryPos( 0 );
1816 0 : eState = rSet->GetItemState( nWhich );
1817 :
1818 0 : if ( eState >= SfxItemState::DONTCARE )
1819 : {
1820 0 : if ( eState == SfxItemState::DONTCARE )
1821 0 : m_pOverlineLB->SetNoSelection();
1822 : else
1823 : {
1824 0 : const SvxOverlineItem& rItem = static_cast<const SvxOverlineItem&>(rSet->Get( nWhich ));
1825 0 : FontUnderline eOverline = (FontUnderline)rItem.GetValue();
1826 0 : rFont.SetOverline( eOverline );
1827 0 : rCJKFont.SetOverline( eOverline );
1828 0 : rCTLFont.SetOverline( eOverline );
1829 :
1830 0 : if ( eOverline != UNDERLINE_NONE )
1831 : {
1832 0 : for ( sal_Int32 i = 0; i < m_pOverlineLB->GetEntryCount(); ++i )
1833 : {
1834 0 : if ( (FontUnderline)reinterpret_cast<sal_uLong>(m_pOverlineLB->GetEntryData(i)) == eOverline )
1835 : {
1836 0 : m_pOverlineLB->SelectEntryPos(i);
1837 0 : bEnable = true;
1838 0 : break;
1839 : }
1840 : }
1841 :
1842 0 : Color aColor = rItem.GetColor();
1843 0 : sal_Int32 nPos = m_pOverlineColorLB->GetEntryPos( aColor );
1844 :
1845 0 : if ( LISTBOX_ENTRY_NOTFOUND != nPos )
1846 0 : m_pOverlineColorLB->SelectEntryPos( nPos );
1847 : else
1848 : {
1849 0 : nPos = m_pOverlineColorLB->GetEntryPos( aColor );
1850 0 : if ( LISTBOX_ENTRY_NOTFOUND != nPos )
1851 0 : m_pOverlineColorLB->SelectEntryPos( nPos );
1852 : else
1853 : m_pOverlineColorLB->SelectEntryPos(
1854 : m_pOverlineColorLB->InsertEntry( aColor,
1855 0 : OUString( SVX_RES( RID_SVXSTR_COLOR_USER ) ) ) );
1856 : }
1857 : }
1858 : else
1859 : {
1860 0 : m_pOverlineColorLB->SelectEntry( Color( COL_AUTO ));
1861 0 : m_pOverlineColorLB->Disable();
1862 : }
1863 : }
1864 : }
1865 :
1866 : // Strikeout
1867 0 : nWhich = GetWhich( SID_ATTR_CHAR_STRIKEOUT );
1868 0 : rFont.SetStrikeout( STRIKEOUT_NONE );
1869 0 : rCJKFont.SetStrikeout( STRIKEOUT_NONE );
1870 0 : rCTLFont.SetStrikeout( STRIKEOUT_NONE );
1871 :
1872 0 : m_pStrikeoutLB->SelectEntryPos( 0 );
1873 0 : eState = rSet->GetItemState( nWhich );
1874 :
1875 0 : if ( eState >= SfxItemState::DONTCARE )
1876 : {
1877 0 : if ( eState == SfxItemState::DONTCARE )
1878 0 : m_pStrikeoutLB->SetNoSelection();
1879 : else
1880 : {
1881 0 : const SvxCrossedOutItem& rItem = static_cast<const SvxCrossedOutItem&>(rSet->Get( nWhich ));
1882 0 : FontStrikeout eStrikeout = (FontStrikeout)rItem.GetValue();
1883 0 : rFont.SetStrikeout( eStrikeout );
1884 0 : rCJKFont.SetStrikeout( eStrikeout );
1885 0 : rCTLFont.SetStrikeout( eStrikeout );
1886 :
1887 0 : if ( eStrikeout != STRIKEOUT_NONE )
1888 : {
1889 0 : for ( sal_Int32 i = 0; i < m_pStrikeoutLB->GetEntryCount(); ++i )
1890 : {
1891 0 : if ( (FontStrikeout)reinterpret_cast<sal_uLong>(m_pStrikeoutLB->GetEntryData(i)) == eStrikeout )
1892 : {
1893 0 : m_pStrikeoutLB->SelectEntryPos(i);
1894 0 : bEnable = true;
1895 0 : break;
1896 : }
1897 : }
1898 : }
1899 : }
1900 : }
1901 :
1902 : // WordLineMode
1903 0 : nWhich = GetWhich( SID_ATTR_CHAR_WORDLINEMODE );
1904 0 : switch ( eState )
1905 : {
1906 : case SfxItemState::UNKNOWN:
1907 0 : m_pIndividualWordsBtn->Hide();
1908 0 : break;
1909 :
1910 : case SfxItemState::DISABLED:
1911 : case SfxItemState::READONLY:
1912 0 : m_pIndividualWordsBtn->Disable();
1913 0 : break;
1914 :
1915 : case SfxItemState::DONTCARE:
1916 0 : m_pIndividualWordsBtn->SetState( TRISTATE_INDET );
1917 0 : break;
1918 :
1919 : case SfxItemState::DEFAULT:
1920 : case SfxItemState::SET:
1921 : {
1922 0 : const SvxWordLineModeItem& rItem = static_cast<const SvxWordLineModeItem&>(rSet->Get( nWhich ));
1923 0 : rFont.SetWordLineMode( rItem.GetValue() );
1924 0 : rCJKFont.SetWordLineMode( rItem.GetValue() );
1925 0 : rCTLFont.SetWordLineMode( rItem.GetValue() );
1926 :
1927 0 : m_pIndividualWordsBtn->Check( rItem.GetValue() );
1928 0 : m_pIndividualWordsBtn->Enable( bEnable );
1929 0 : break;
1930 : }
1931 : }
1932 :
1933 : // Emphasis
1934 0 : nWhich = GetWhich( SID_ATTR_CHAR_EMPHASISMARK );
1935 0 : eState = rSet->GetItemState( nWhich );
1936 :
1937 0 : if ( eState >= SfxItemState::DEFAULT )
1938 : {
1939 0 : const SvxEmphasisMarkItem& rItem = static_cast<const SvxEmphasisMarkItem&>(rSet->Get( nWhich ));
1940 0 : FontEmphasisMark eMark = rItem.GetEmphasisMark();
1941 0 : rFont.SetEmphasisMark( eMark );
1942 0 : rCJKFont.SetEmphasisMark( eMark );
1943 0 : rCTLFont.SetEmphasisMark( eMark );
1944 :
1945 0 : m_pEmphasisLB->SelectEntryPos( (sal_Int32)( eMark & EMPHASISMARK_STYLE ) );
1946 0 : eMark &= ~EMPHASISMARK_STYLE;
1947 : sal_uLong nEntryData = ( eMark == EMPHASISMARK_POS_ABOVE )
1948 : ? CHRDLG_POSITION_OVER
1949 0 : : ( eMark == EMPHASISMARK_POS_BELOW ) ? CHRDLG_POSITION_UNDER : 0;
1950 :
1951 0 : for ( sal_Int32 i = 0; i < m_pPositionLB->GetEntryCount(); i++ )
1952 : {
1953 0 : if ( nEntryData == reinterpret_cast<sal_uLong>(m_pPositionLB->GetEntryData(i)) )
1954 : {
1955 0 : m_pPositionLB->SelectEntryPos(i);
1956 0 : break;
1957 : }
1958 : }
1959 : }
1960 0 : else if ( eState == SfxItemState::DONTCARE )
1961 0 : m_pEmphasisLB->SetNoSelection( );
1962 0 : else if ( eState == SfxItemState::UNKNOWN )
1963 : {
1964 0 : m_pEmphasisFT->Hide();
1965 0 : m_pEmphasisLB->Hide();
1966 : }
1967 : else // SfxItemState::DISABLED or SfxItemState::READONLY
1968 : {
1969 0 : m_pEmphasisFT->Disable();
1970 0 : m_pEmphasisLB->Disable();
1971 : }
1972 :
1973 : // the select handler for the underline/overline/strikeout list boxes
1974 : // SelectHdl_Impl( NULL );
1975 : DBG_ASSERT(m_pUnderlineLB->GetSelectHdl() == m_pOverlineLB->GetSelectHdl(),
1976 : "SvxCharEffectsPage::Reset: inconsistence (1)!");
1977 : DBG_ASSERT(m_pUnderlineLB->GetSelectHdl() == m_pStrikeoutLB->GetSelectHdl(),
1978 : "SvxCharEffectsPage::Reset: inconsistence (1)!");
1979 0 : m_pUnderlineLB->GetSelectHdl().Call(NULL);
1980 : // don't call SelectHdl_Impl directly!
1981 : // in DisableControls, we may have re-reouted the select handler
1982 :
1983 : // the select handler for the emphasis listbox
1984 : // SelectHdl_Impl( m_pEmphasisLB );
1985 : DBG_ASSERT(m_pEmphasisLB->GetSelectHdl() == LINK(this, SvxCharEffectsPage, SelectHdl_Impl),
1986 : "SvxCharEffectsPage::Reset: inconsistence (2)!");
1987 0 : m_pEmphasisLB->GetSelectHdl().Call( m_pEmphasisLB );
1988 : // this is for consistency only. Here it would be allowed to call SelectHdl_Impl directly ...
1989 :
1990 : // Effects
1991 0 : SvxCaseMap eCaseMap = SVX_CASEMAP_END;
1992 0 : nWhich = GetWhich( SID_ATTR_CHAR_CASEMAP );
1993 0 : eState = rSet->GetItemState( nWhich );
1994 0 : switch ( eState )
1995 : {
1996 : case SfxItemState::UNKNOWN:
1997 0 : m_pEffectsFT->Hide();
1998 0 : m_pEffectsLB->Hide();
1999 0 : break;
2000 :
2001 : case SfxItemState::DISABLED:
2002 : case SfxItemState::READONLY:
2003 0 : m_pEffectsFT->Disable();
2004 0 : m_pEffectsLB->Disable();
2005 0 : break;
2006 :
2007 : case SfxItemState::DONTCARE:
2008 0 : m_pEffectsLB->SetNoSelection();
2009 0 : break;
2010 :
2011 : case SfxItemState::DEFAULT:
2012 : case SfxItemState::SET:
2013 : {
2014 0 : const SvxCaseMapItem& rItem = static_cast<const SvxCaseMapItem&>(rSet->Get( nWhich ));
2015 0 : eCaseMap = (SvxCaseMap)rItem.GetValue();
2016 0 : break;
2017 : }
2018 : }
2019 0 : SetCaseMap_Impl( eCaseMap );
2020 :
2021 : //Relief
2022 0 : nWhich = GetWhich(SID_ATTR_CHAR_RELIEF);
2023 0 : eState = rSet->GetItemState( nWhich );
2024 0 : switch ( eState )
2025 : {
2026 : case SfxItemState::UNKNOWN:
2027 0 : m_pReliefFT->Hide();
2028 0 : m_pReliefLB->Hide();
2029 0 : break;
2030 :
2031 : case SfxItemState::DISABLED:
2032 : case SfxItemState::READONLY:
2033 0 : m_pReliefFT->Disable();
2034 0 : m_pReliefLB->Disable();
2035 0 : break;
2036 :
2037 : case SfxItemState::DONTCARE:
2038 0 : m_pReliefLB->SetNoSelection();
2039 0 : break;
2040 :
2041 : case SfxItemState::DEFAULT:
2042 : case SfxItemState::SET:
2043 : {
2044 0 : const SvxCharReliefItem& rItem = static_cast<const SvxCharReliefItem&>(rSet->Get( nWhich ));
2045 0 : m_pReliefLB->SelectEntryPos(rItem.GetValue());
2046 0 : SelectHdl_Impl(m_pReliefLB);
2047 0 : break;
2048 : }
2049 : }
2050 :
2051 : // Outline
2052 0 : nWhich = GetWhich( SID_ATTR_CHAR_CONTOUR );
2053 0 : eState = rSet->GetItemState( nWhich );
2054 0 : switch ( eState )
2055 : {
2056 : case SfxItemState::UNKNOWN:
2057 0 : m_pOutlineBtn->Hide();
2058 0 : break;
2059 :
2060 : case SfxItemState::DISABLED:
2061 : case SfxItemState::READONLY:
2062 0 : m_pOutlineBtn->Disable();
2063 0 : break;
2064 :
2065 : case SfxItemState::DONTCARE:
2066 0 : m_pOutlineBtn->SetState( TRISTATE_INDET );
2067 0 : break;
2068 :
2069 : case SfxItemState::DEFAULT:
2070 : case SfxItemState::SET:
2071 : {
2072 0 : const SvxContourItem& rItem = static_cast<const SvxContourItem&>(rSet->Get( nWhich ));
2073 0 : m_pOutlineBtn->SetState( (TriState)rItem.GetValue() );
2074 0 : m_pOutlineBtn->EnableTriState( false );
2075 0 : break;
2076 : }
2077 : }
2078 :
2079 : // Shadow
2080 0 : nWhich = GetWhich( SID_ATTR_CHAR_SHADOWED );
2081 0 : eState = rSet->GetItemState( nWhich );
2082 :
2083 0 : switch ( eState )
2084 : {
2085 : case SfxItemState::UNKNOWN:
2086 0 : m_pShadowBtn->Hide();
2087 0 : break;
2088 :
2089 : case SfxItemState::DISABLED:
2090 : case SfxItemState::READONLY:
2091 0 : m_pShadowBtn->Disable();
2092 0 : break;
2093 :
2094 : case SfxItemState::DONTCARE:
2095 0 : m_pShadowBtn->SetState( TRISTATE_INDET );
2096 0 : break;
2097 :
2098 : case SfxItemState::DEFAULT:
2099 : case SfxItemState::SET:
2100 : {
2101 0 : const SvxShadowedItem& rItem = static_cast<const SvxShadowedItem&>(rSet->Get( nWhich ));
2102 0 : m_pShadowBtn->SetState( (TriState)rItem.GetValue() );
2103 0 : m_pShadowBtn->EnableTriState( false );
2104 0 : break;
2105 : }
2106 : }
2107 :
2108 : // Blinking
2109 0 : nWhich = GetWhich( SID_ATTR_FLASH );
2110 0 : eState = rSet->GetItemState( nWhich );
2111 :
2112 0 : switch ( eState )
2113 : {
2114 : case SfxItemState::UNKNOWN:
2115 0 : m_pBlinkingBtn->Hide();
2116 0 : break;
2117 :
2118 : case SfxItemState::DISABLED:
2119 : case SfxItemState::READONLY:
2120 0 : m_pBlinkingBtn->Disable();
2121 0 : break;
2122 :
2123 : case SfxItemState::DONTCARE:
2124 0 : m_pBlinkingBtn->SetState( TRISTATE_INDET );
2125 0 : break;
2126 :
2127 : case SfxItemState::DEFAULT:
2128 : case SfxItemState::SET:
2129 : {
2130 0 : const SvxBlinkItem& rItem = static_cast<const SvxBlinkItem&>(rSet->Get( nWhich ));
2131 0 : m_pBlinkingBtn->SetState( (TriState)rItem.GetValue() );
2132 0 : m_pBlinkingBtn->EnableTriState( false );
2133 0 : break;
2134 : }
2135 : }
2136 : // Hidden
2137 0 : nWhich = GetWhich( SID_ATTR_CHAR_HIDDEN );
2138 0 : eState = rSet->GetItemState( nWhich );
2139 :
2140 0 : switch ( eState )
2141 : {
2142 : case SfxItemState::UNKNOWN:
2143 0 : m_pHiddenBtn->Hide();
2144 0 : break;
2145 :
2146 : case SfxItemState::DISABLED:
2147 : case SfxItemState::READONLY:
2148 0 : m_pHiddenBtn->Disable();
2149 0 : break;
2150 :
2151 : case SfxItemState::DONTCARE:
2152 0 : m_pHiddenBtn->SetState( TRISTATE_INDET );
2153 0 : break;
2154 :
2155 : case SfxItemState::DEFAULT:
2156 : case SfxItemState::SET:
2157 : {
2158 0 : const SvxCharHiddenItem& rItem = static_cast<const SvxCharHiddenItem&>(rSet->Get( nWhich ));
2159 0 : m_pHiddenBtn->SetState( (TriState)rItem.GetValue() );
2160 0 : m_pHiddenBtn->EnableTriState( false );
2161 0 : break;
2162 : }
2163 : }
2164 :
2165 0 : SetPrevFontWidthScale( *rSet );
2166 0 : ResetColor_Impl( *rSet );
2167 :
2168 : // preview update
2169 0 : m_pPreviewWin->Invalidate();
2170 :
2171 : // save this settings
2172 0 : m_pUnderlineLB->SaveValue();
2173 0 : m_pUnderlineColorLB->SaveValue();
2174 0 : m_pOverlineLB->SaveValue();
2175 0 : m_pOverlineColorLB->SaveValue();
2176 0 : m_pStrikeoutLB->SaveValue();
2177 0 : m_pIndividualWordsBtn->SaveValue();
2178 0 : m_pEmphasisLB->SaveValue();
2179 0 : m_pPositionLB->SaveValue();
2180 0 : m_pEffectsLB->SaveValue();
2181 0 : m_pReliefLB->SaveValue();
2182 0 : m_pOutlineBtn->SaveValue();
2183 0 : m_pShadowBtn->SaveValue();
2184 0 : m_pBlinkingBtn->SaveValue();
2185 0 : m_pHiddenBtn->SaveValue();
2186 0 : m_pFontColorLB->SaveValue();
2187 0 : }
2188 :
2189 :
2190 :
2191 0 : bool SvxCharEffectsPage::FillItemSet( SfxItemSet* rSet )
2192 : {
2193 0 : const SfxPoolItem* pOld = 0;
2194 0 : const SfxItemSet& rOldSet = GetItemSet();
2195 0 : bool bModified = false;
2196 0 : bool bChanged = true;
2197 :
2198 : // Underline
2199 0 : sal_uInt16 nWhich = GetWhich( SID_ATTR_CHAR_UNDERLINE );
2200 0 : pOld = GetOldItem( *rSet, SID_ATTR_CHAR_UNDERLINE );
2201 0 : sal_Int32 nPos = m_pUnderlineLB->GetSelectEntryPos();
2202 0 : FontUnderline eUnder = (FontUnderline)reinterpret_cast<sal_uLong>(m_pUnderlineLB->GetEntryData( nPos ));
2203 :
2204 0 : if ( pOld )
2205 : {
2206 : //! if there are different underline styles in the selection the
2207 : //! item-state in the 'rOldSet' will be invalid. In this case
2208 : //! changing the underline style will be allowed if a style is
2209 : //! selected in the listbox.
2210 0 : bool bAllowChg = LISTBOX_ENTRY_NOTFOUND != nPos &&
2211 0 : SfxItemState::DEFAULT > rOldSet.GetItemState( nWhich, true );
2212 :
2213 0 : const SvxUnderlineItem& rItem = *static_cast<const SvxUnderlineItem*>(pOld);
2214 0 : if ( (FontUnderline)rItem.GetValue() == eUnder &&
2215 0 : ( UNDERLINE_NONE == eUnder || rItem.GetColor() == m_pUnderlineColorLB->GetSelectEntryColor() ) &&
2216 0 : ! bAllowChg )
2217 0 : bChanged = false;
2218 : }
2219 :
2220 0 : if ( bChanged )
2221 : {
2222 0 : SvxUnderlineItem aNewItem( eUnder, nWhich );
2223 0 : aNewItem.SetColor( m_pUnderlineColorLB->GetSelectEntryColor() );
2224 0 : rSet->Put( aNewItem );
2225 0 : bModified = true;
2226 : }
2227 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
2228 0 : rSet->InvalidateItem(nWhich);
2229 :
2230 0 : bChanged = true;
2231 :
2232 : // Overline
2233 0 : nWhich = GetWhich( SID_ATTR_CHAR_OVERLINE );
2234 0 : pOld = GetOldItem( *rSet, SID_ATTR_CHAR_OVERLINE );
2235 0 : nPos = m_pOverlineLB->GetSelectEntryPos();
2236 0 : FontUnderline eOver = (FontUnderline)reinterpret_cast<sal_uLong>(m_pOverlineLB->GetEntryData( nPos ));
2237 :
2238 0 : if ( pOld )
2239 : {
2240 : //! if there are different underline styles in the selection the
2241 : //! item-state in the 'rOldSet' will be invalid. In this case
2242 : //! changing the underline style will be allowed if a style is
2243 : //! selected in the listbox.
2244 0 : bool bAllowChg = LISTBOX_ENTRY_NOTFOUND != nPos &&
2245 0 : SfxItemState::DEFAULT > rOldSet.GetItemState( nWhich, true );
2246 :
2247 0 : const SvxOverlineItem& rItem = *static_cast<const SvxOverlineItem*>(pOld);
2248 0 : if ( (FontUnderline)rItem.GetValue() == eOver &&
2249 0 : ( UNDERLINE_NONE == eOver || rItem.GetColor() == m_pOverlineColorLB->GetSelectEntryColor() ) &&
2250 0 : ! bAllowChg )
2251 0 : bChanged = false;
2252 : }
2253 :
2254 0 : if ( bChanged )
2255 : {
2256 0 : SvxOverlineItem aNewItem( eOver, nWhich );
2257 0 : aNewItem.SetColor( m_pOverlineColorLB->GetSelectEntryColor() );
2258 0 : rSet->Put( aNewItem );
2259 0 : bModified = true;
2260 : }
2261 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
2262 0 : rSet->InvalidateItem(nWhich);
2263 :
2264 0 : bChanged = true;
2265 :
2266 : // Strikeout
2267 0 : nWhich = GetWhich( SID_ATTR_CHAR_STRIKEOUT );
2268 0 : pOld = GetOldItem( *rSet, SID_ATTR_CHAR_STRIKEOUT );
2269 0 : nPos = m_pStrikeoutLB->GetSelectEntryPos();
2270 0 : FontStrikeout eStrike = (FontStrikeout)reinterpret_cast<sal_uLong>(m_pStrikeoutLB->GetEntryData( nPos ));
2271 :
2272 0 : if ( pOld )
2273 : {
2274 : //! if there are different strikeout styles in the selection the
2275 : //! item-state in the 'rOldSet' will be invalid. In this case
2276 : //! changing the strikeout style will be allowed if a style is
2277 : //! selected in the listbox.
2278 0 : bool bAllowChg = LISTBOX_ENTRY_NOTFOUND != nPos &&
2279 0 : SfxItemState::DEFAULT > rOldSet.GetItemState( nWhich, true );
2280 :
2281 0 : const SvxCrossedOutItem& rItem = *static_cast<const SvxCrossedOutItem*>(pOld);
2282 0 : if ( !m_pStrikeoutLB->IsEnabled()
2283 0 : || ((FontStrikeout)rItem.GetValue() == eStrike && !bAllowChg) )
2284 0 : bChanged = false;
2285 : }
2286 :
2287 0 : if ( bChanged )
2288 : {
2289 0 : rSet->Put( SvxCrossedOutItem( eStrike, nWhich ) );
2290 0 : bModified = true;
2291 : }
2292 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
2293 0 : rSet->InvalidateItem(nWhich);
2294 :
2295 0 : bChanged = true;
2296 :
2297 : // Individual words
2298 0 : nWhich = GetWhich( SID_ATTR_CHAR_WORDLINEMODE );
2299 0 : pOld = GetOldItem( *rSet, SID_ATTR_CHAR_WORDLINEMODE );
2300 :
2301 0 : if ( pOld )
2302 : {
2303 0 : const SvxWordLineModeItem& rItem = *static_cast<const SvxWordLineModeItem*>(pOld);
2304 0 : if ( rItem.GetValue() == (bool) m_pIndividualWordsBtn->IsChecked() )
2305 0 : bChanged = false;
2306 : }
2307 :
2308 0 : if ( rOldSet.GetItemState( nWhich ) == SfxItemState::DONTCARE &&
2309 0 : ! m_pIndividualWordsBtn->IsValueChangedFromSaved() )
2310 0 : bChanged = false;
2311 :
2312 0 : if ( bChanged )
2313 : {
2314 0 : rSet->Put( SvxWordLineModeItem( m_pIndividualWordsBtn->IsChecked(), nWhich ) );
2315 0 : bModified = true;
2316 : }
2317 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
2318 0 : rSet->InvalidateItem(nWhich);
2319 :
2320 0 : bChanged = true;
2321 :
2322 : // Emphasis
2323 0 : nWhich = GetWhich( SID_ATTR_CHAR_EMPHASISMARK );
2324 0 : pOld = GetOldItem( *rSet, SID_ATTR_CHAR_EMPHASISMARK );
2325 0 : sal_Int32 nMarkPos = m_pEmphasisLB->GetSelectEntryPos();
2326 0 : sal_Int32 nPosPos = m_pPositionLB->GetSelectEntryPos();
2327 0 : FontEmphasisMark eMark = (FontEmphasisMark)nMarkPos;
2328 0 : if ( m_pPositionLB->IsEnabled() )
2329 : {
2330 0 : eMark |= ( CHRDLG_POSITION_UNDER == reinterpret_cast<sal_uLong>(m_pPositionLB->GetEntryData( nPosPos )) )
2331 0 : ? EMPHASISMARK_POS_BELOW : EMPHASISMARK_POS_ABOVE;
2332 : }
2333 :
2334 0 : if ( pOld )
2335 : {
2336 0 : if( rOldSet.GetItemState( nWhich ) != SfxItemState::DONTCARE )
2337 : {
2338 0 : const SvxEmphasisMarkItem& rItem = *static_cast<const SvxEmphasisMarkItem*>(pOld);
2339 0 : if ( rItem.GetEmphasisMark() == eMark )
2340 0 : bChanged = false;
2341 : }
2342 : }
2343 :
2344 0 : if ( rOldSet.GetItemState( nWhich ) == SfxItemState::DONTCARE &&
2345 0 : m_pEmphasisLB->GetSavedValue() == nMarkPos && m_pPositionLB->GetSavedValue() == nPosPos )
2346 0 : bChanged = false;
2347 :
2348 0 : if ( bChanged )
2349 : {
2350 0 : rSet->Put( SvxEmphasisMarkItem( eMark, nWhich ) );
2351 0 : bModified = true;
2352 : }
2353 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
2354 0 : rSet->InvalidateItem(nWhich);
2355 :
2356 0 : bChanged = true;
2357 :
2358 : // Effects
2359 0 : nWhich = GetWhich( SID_ATTR_CHAR_CASEMAP );
2360 0 : pOld = GetOldItem( *rSet, SID_ATTR_CHAR_CASEMAP );
2361 0 : SvxCaseMap eCaseMap = SVX_CASEMAP_NOT_MAPPED;
2362 0 : bool bChecked = false;
2363 0 : sal_Int32 nCapsPos = m_pEffectsLB->GetSelectEntryPos();
2364 0 : if ( nCapsPos != LISTBOX_ENTRY_NOTFOUND )
2365 : {
2366 0 : eCaseMap = (SvxCaseMap)nCapsPos;
2367 0 : bChecked = true;
2368 : }
2369 :
2370 0 : if ( pOld )
2371 : {
2372 : //! if there are different effect styles in the selection the
2373 : //! item-state in the 'rOldSet' will be invalid. In this case
2374 : //! changing the effect style will be allowed if a style is
2375 : //! selected in the listbox.
2376 0 : bool bAllowChg = LISTBOX_ENTRY_NOTFOUND != nPos &&
2377 0 : SfxItemState::DEFAULT > rOldSet.GetItemState( nWhich, true );
2378 :
2379 0 : const SvxCaseMapItem& rItem = *static_cast<const SvxCaseMapItem*>(pOld);
2380 0 : if ( (SvxCaseMap)rItem.GetValue() == eCaseMap && !bAllowChg )
2381 0 : bChanged = false;
2382 : }
2383 :
2384 0 : if ( bChanged && bChecked )
2385 : {
2386 0 : rSet->Put( SvxCaseMapItem( eCaseMap, nWhich ) );
2387 0 : bModified = true;
2388 : }
2389 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
2390 0 : rSet->InvalidateItem(nWhich);
2391 :
2392 0 : bChanged = true;
2393 :
2394 : //Relief
2395 0 : nWhich = GetWhich(SID_ATTR_CHAR_RELIEF);
2396 0 : if(m_pReliefLB->IsValueChangedFromSaved())
2397 : {
2398 0 : m_pReliefLB->SaveValue();
2399 0 : SvxCharReliefItem aRelief((FontRelief)m_pReliefLB->GetSelectEntryPos(), nWhich);
2400 0 : rSet->Put(aRelief);
2401 : }
2402 :
2403 : // Outline
2404 0 : const SfxItemSet* pExampleSet = GetTabDialog() ? GetTabDialog()->GetExampleSet() : NULL;
2405 0 : nWhich = GetWhich( SID_ATTR_CHAR_CONTOUR );
2406 0 : pOld = GetOldItem( *rSet, SID_ATTR_CHAR_CONTOUR );
2407 0 : TriState eState = m_pOutlineBtn->GetState();
2408 : const SfxPoolItem* pItem;
2409 :
2410 0 : if ( pOld )
2411 : {
2412 0 : const SvxContourItem& rItem = *static_cast<const SvxContourItem*>(pOld);
2413 0 : if ( rItem.GetValue() == StateToAttr( eState ) && m_pOutlineBtn->GetSavedValue() == eState )
2414 0 : bChanged = false;
2415 : }
2416 :
2417 0 : if ( !bChanged && pExampleSet && pExampleSet->GetItemState( nWhich, false, &pItem ) == SfxItemState::SET &&
2418 0 : !StateToAttr( eState ) && static_cast<const SvxContourItem*>(pItem)->GetValue() )
2419 0 : bChanged = true;
2420 :
2421 0 : if ( bChanged && eState != TRISTATE_INDET )
2422 : {
2423 0 : rSet->Put( SvxContourItem( StateToAttr( eState ), nWhich ) );
2424 0 : bModified = true;
2425 : }
2426 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
2427 0 : rSet->InvalidateItem(nWhich);
2428 :
2429 0 : bChanged = true;
2430 :
2431 : // Shadow
2432 0 : nWhich = GetWhich( SID_ATTR_CHAR_SHADOWED );
2433 0 : pOld = GetOldItem( *rSet, SID_ATTR_CHAR_SHADOWED );
2434 0 : eState = m_pShadowBtn->GetState();
2435 :
2436 0 : if ( pOld )
2437 : {
2438 0 : const SvxShadowedItem& rItem = *static_cast<const SvxShadowedItem*>(pOld);
2439 0 : if ( rItem.GetValue() == StateToAttr( eState ) && m_pShadowBtn->GetSavedValue() == eState )
2440 0 : bChanged = false;
2441 : }
2442 :
2443 0 : if ( !bChanged && pExampleSet && pExampleSet->GetItemState( nWhich, false, &pItem ) == SfxItemState::SET &&
2444 0 : !StateToAttr( eState ) && static_cast<const SvxShadowedItem*>(pItem)->GetValue() )
2445 0 : bChanged = true;
2446 :
2447 0 : if ( bChanged && eState != TRISTATE_INDET )
2448 : {
2449 0 : rSet->Put( SvxShadowedItem( StateToAttr( eState ), nWhich ) );
2450 0 : bModified = true;
2451 : }
2452 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
2453 0 : rSet->InvalidateItem(nWhich);
2454 :
2455 0 : bChanged = true;
2456 :
2457 : // Blinking
2458 0 : nWhich = GetWhich( SID_ATTR_FLASH );
2459 0 : pOld = GetOldItem( *rSet, SID_ATTR_FLASH );
2460 0 : eState = m_pBlinkingBtn->GetState();
2461 :
2462 0 : if ( pOld )
2463 : {
2464 0 : const SvxBlinkItem& rItem = *static_cast<const SvxBlinkItem*>(pOld);
2465 0 : if ( rItem.GetValue() == StateToAttr( eState ) && m_pBlinkingBtn->GetSavedValue() == eState )
2466 0 : bChanged = false;
2467 : }
2468 :
2469 0 : if ( !bChanged && pExampleSet && pExampleSet->GetItemState( nWhich, false, &pItem ) == SfxItemState::SET &&
2470 0 : !StateToAttr( eState ) && static_cast<const SvxBlinkItem*>(pItem)->GetValue() )
2471 0 : bChanged = true;
2472 :
2473 0 : if ( bChanged && eState != TRISTATE_INDET )
2474 : {
2475 0 : rSet->Put( SvxBlinkItem( StateToAttr( eState ), nWhich ) );
2476 0 : bModified = true;
2477 : }
2478 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
2479 0 : rSet->InvalidateItem(nWhich);
2480 :
2481 : // Hidden
2482 0 : nWhich = GetWhich( SID_ATTR_CHAR_HIDDEN );
2483 0 : pOld = GetOldItem( *rSet, SID_ATTR_CHAR_HIDDEN );
2484 0 : eState = m_pHiddenBtn->GetState();
2485 0 : bChanged = true;
2486 :
2487 0 : if ( pOld )
2488 : {
2489 0 : const SvxCharHiddenItem& rItem = *static_cast<const SvxCharHiddenItem*>(pOld);
2490 0 : if ( rItem.GetValue() == StateToAttr( eState ) && m_pHiddenBtn->GetSavedValue() == eState )
2491 0 : bChanged = false;
2492 : }
2493 :
2494 0 : if ( !bChanged && pExampleSet && pExampleSet->GetItemState( nWhich, false, &pItem ) == SfxItemState::SET &&
2495 0 : !StateToAttr( eState ) && static_cast<const SvxCharHiddenItem*>(pItem)->GetValue() )
2496 0 : bChanged = true;
2497 :
2498 0 : if ( bChanged && eState != TRISTATE_INDET )
2499 : {
2500 0 : rSet->Put( SvxCharHiddenItem( StateToAttr( eState ), nWhich ) );
2501 0 : bModified = true;
2502 : }
2503 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
2504 0 : rSet->InvalidateItem(nWhich);
2505 :
2506 0 : bModified |= FillItemSetColor_Impl( *rSet );
2507 :
2508 0 : return bModified;
2509 : }
2510 :
2511 0 : void SvxCharEffectsPage::DisableControls( sal_uInt16 nDisable )
2512 : {
2513 0 : if ( ( DISABLE_CASEMAP & nDisable ) == DISABLE_CASEMAP )
2514 : {
2515 0 : m_pEffectsFT->Disable();
2516 0 : m_pEffectsLB->Disable();
2517 : }
2518 :
2519 0 : if ( ( DISABLE_WORDLINE & nDisable ) == DISABLE_WORDLINE )
2520 0 : m_pIndividualWordsBtn->Disable();
2521 :
2522 0 : if ( ( DISABLE_BLINK & nDisable ) == DISABLE_BLINK )
2523 0 : m_pBlinkingBtn->Disable();
2524 :
2525 0 : if ( ( DISABLE_UNDERLINE_COLOR & nDisable ) == DISABLE_UNDERLINE_COLOR )
2526 : {
2527 : // disable the controls
2528 0 : m_pUnderlineColorFT->Disable( );
2529 0 : m_pUnderlineColorLB->Disable( );
2530 : // and reroute the selection handler of the controls which normally would affect the color box dis-/enabling
2531 0 : m_pUnderlineLB->SetSelectHdl(LINK(this, SvxCharEffectsPage, UpdatePreview_Impl));
2532 0 : m_pStrikeoutLB->SetSelectHdl(LINK(this, SvxCharEffectsPage, UpdatePreview_Impl));
2533 : }
2534 0 : }
2535 :
2536 0 : void SvxCharEffectsPage::EnableFlash()
2537 : {
2538 0 : m_pBlinkingBtn->Show();
2539 0 : }
2540 :
2541 :
2542 0 : void SvxCharEffectsPage::SetPreviewBackgroundToCharacter()
2543 : {
2544 0 : m_bPreviewBackgroundToCharacter = true;
2545 0 : }
2546 :
2547 :
2548 0 : void SvxCharEffectsPage::PageCreated(const SfxAllItemSet& aSet)
2549 : {
2550 0 : SFX_ITEMSET_ARG (&aSet,pDisableCtlItem,SfxUInt16Item,SID_DISABLE_CTL,false);
2551 0 : SFX_ITEMSET_ARG (&aSet,pFlagItem,SfxUInt32Item,SID_FLAG_TYPE,false);
2552 0 : if (pDisableCtlItem)
2553 0 : DisableControls(pDisableCtlItem->GetValue());
2554 :
2555 0 : if (pFlagItem)
2556 : {
2557 0 : sal_uInt32 nFlags=pFlagItem->GetValue();
2558 0 : if ( ( nFlags & SVX_ENABLE_FLASH ) == SVX_ENABLE_FLASH )
2559 0 : EnableFlash();
2560 0 : if ( ( nFlags & SVX_PREVIEW_CHARACTER ) == SVX_PREVIEW_CHARACTER )
2561 0 : SetPreviewBackgroundToCharacter();
2562 : }
2563 0 : }
2564 :
2565 : // class SvxCharPositionPage ---------------------------------------------
2566 :
2567 0 : SvxCharPositionPage::SvxCharPositionPage( vcl::Window* pParent, const SfxItemSet& rInSet )
2568 : : SvxCharBasePage(pParent, "PositionPage", "cui/ui/positionpage.ui", rInSet)
2569 : , m_nSuperEsc((short)DFLT_ESC_SUPER)
2570 : , m_nSubEsc((short)DFLT_ESC_SUB)
2571 : , m_nScaleWidthItemSetVal(100)
2572 : , m_nScaleWidthInitialVal(100)
2573 : , m_nSuperProp((sal_uInt8)DFLT_ESC_PROP)
2574 0 : , m_nSubProp((sal_uInt8)DFLT_ESC_PROP)
2575 : {
2576 0 : get(m_pHighPosBtn, "superscript");
2577 0 : get(m_pNormalPosBtn, "normal");
2578 0 : get(m_pLowPosBtn, "subscript");
2579 0 : get(m_pHighLowFT, "raiselower");
2580 0 : get(m_pHighLowMF, "raiselowersb");
2581 0 : get(m_pHighLowRB, "automatic");
2582 0 : get(m_pFontSizeFT, "relativefontsize");
2583 0 : get(m_pFontSizeMF, "fontsizesb");
2584 0 : get(m_pRotationContainer, "rotationcontainer");
2585 0 : get(m_pScalingFT, "rotate");
2586 0 : get(m_pScalingAndRotationFT, "rotateandscale");
2587 0 : get(m_p0degRB, "0deg");
2588 0 : get(m_p90degRB, "90deg");
2589 0 : get(m_p270degRB, "270deg");
2590 0 : get(m_pFitToLineCB, "fittoline");
2591 0 : get(m_pScaleWidthMF, "scalewidthsb");
2592 0 : get(m_pKerningLB, "kerninglb");
2593 0 : get(m_pKerningFT, "kerningft");
2594 0 : get(m_pKerningMF, "kerningsb");
2595 0 : get(m_pPairKerningBtn, "pairkerning");
2596 :
2597 0 : get(m_pPreviewWin, "preview");
2598 :
2599 0 : Initialize();
2600 0 : }
2601 :
2602 :
2603 :
2604 0 : void SvxCharPositionPage::Initialize()
2605 : {
2606 : // to handle the changes of the other pages
2607 0 : SetExchangeSupport();
2608 :
2609 0 : GetPreviewFont().SetSize( Size( 0, 240 ) );
2610 0 : GetPreviewCJKFont().SetSize( Size( 0, 240 ) );
2611 0 : GetPreviewCTLFont().SetSize( Size( 0, 240 ) );
2612 :
2613 0 : m_pNormalPosBtn->Check();
2614 0 : PositionHdl_Impl( m_pNormalPosBtn );
2615 0 : m_pKerningLB->SelectEntryPos( 0 );
2616 0 : KerningSelectHdl_Impl( NULL );
2617 :
2618 0 : Link aLink = LINK( this, SvxCharPositionPage, PositionHdl_Impl );
2619 0 : m_pHighPosBtn->SetClickHdl( aLink );
2620 0 : m_pNormalPosBtn->SetClickHdl( aLink );
2621 0 : m_pLowPosBtn->SetClickHdl( aLink );
2622 :
2623 0 : aLink = LINK( this, SvxCharPositionPage, RotationHdl_Impl );
2624 0 : m_p0degRB->SetClickHdl( aLink );
2625 0 : m_p90degRB->SetClickHdl( aLink );
2626 0 : m_p270degRB->SetClickHdl( aLink );
2627 :
2628 0 : aLink = LINK( this, SvxCharPositionPage, FontModifyHdl_Impl );
2629 0 : m_pHighLowMF->SetModifyHdl( aLink );
2630 0 : m_pFontSizeMF->SetModifyHdl( aLink );
2631 :
2632 0 : aLink = LINK( this, SvxCharPositionPage, LoseFocusHdl_Impl );
2633 0 : m_pHighLowMF->SetLoseFocusHdl( aLink );
2634 0 : m_pFontSizeMF->SetLoseFocusHdl( aLink );
2635 :
2636 0 : m_pHighLowRB->SetClickHdl( LINK( this, SvxCharPositionPage, AutoPositionHdl_Impl ) );
2637 0 : m_pFitToLineCB->SetClickHdl( LINK( this, SvxCharPositionPage, FitToLineHdl_Impl ) );
2638 0 : m_pKerningLB->SetSelectHdl( LINK( this, SvxCharPositionPage, KerningSelectHdl_Impl ) );
2639 0 : m_pKerningMF->SetModifyHdl( LINK( this, SvxCharPositionPage, KerningModifyHdl_Impl ) );
2640 0 : m_pPairKerningBtn->SetClickHdl( LINK( this, SvxCharPositionPage, PairKerningHdl_Impl ) );
2641 0 : m_pScaleWidthMF->SetModifyHdl( LINK( this, SvxCharPositionPage, ScaleWidthModifyHdl_Impl ) );
2642 0 : }
2643 :
2644 0 : SvxCharPositionPage::~SvxCharPositionPage()
2645 : {
2646 0 : }
2647 :
2648 :
2649 :
2650 0 : void SvxCharPositionPage::UpdatePreview_Impl( sal_uInt8 nProp, sal_uInt8 nEscProp, short nEsc )
2651 : {
2652 0 : SetPrevFontEscapement( nProp, nEscProp, nEsc );
2653 0 : }
2654 :
2655 :
2656 :
2657 0 : void SvxCharPositionPage::SetEscapement_Impl( sal_uInt16 nEsc )
2658 : {
2659 0 : SvxEscapementItem aEscItm( (SvxEscapement)nEsc, SID_ATTR_CHAR_ESCAPEMENT );
2660 :
2661 0 : if ( SVX_ESCAPEMENT_SUPERSCRIPT == nEsc )
2662 : {
2663 0 : aEscItm.GetEsc() = m_nSuperEsc;
2664 0 : aEscItm.GetProp() = m_nSuperProp;
2665 : }
2666 0 : else if ( SVX_ESCAPEMENT_SUBSCRIPT == nEsc )
2667 : {
2668 0 : aEscItm.GetEsc() = m_nSubEsc;
2669 0 : aEscItm.GetProp() = m_nSubProp;
2670 : }
2671 :
2672 0 : short nFac = aEscItm.GetEsc() < 0 ? -1 : 1;
2673 :
2674 0 : m_pHighLowMF->SetValue( aEscItm.GetEsc() * nFac );
2675 0 : m_pFontSizeMF->SetValue( aEscItm.GetProp() );
2676 :
2677 0 : if ( SVX_ESCAPEMENT_OFF == nEsc )
2678 : {
2679 0 : m_pHighLowFT->Disable();
2680 0 : m_pHighLowMF->Disable();
2681 0 : m_pFontSizeFT->Disable();
2682 0 : m_pFontSizeMF->Disable();
2683 0 : m_pHighLowRB->Disable();
2684 : }
2685 : else
2686 : {
2687 0 : m_pFontSizeFT->Enable();
2688 0 : m_pFontSizeMF->Enable();
2689 0 : m_pHighLowRB->Enable();
2690 :
2691 0 : if ( !m_pHighLowRB->IsChecked() )
2692 : {
2693 0 : m_pHighLowFT->Enable();
2694 0 : m_pHighLowMF->Enable();
2695 : }
2696 : else
2697 0 : AutoPositionHdl_Impl( m_pHighLowRB );
2698 : }
2699 :
2700 0 : UpdatePreview_Impl( 100, aEscItm.GetProp(), aEscItm.GetEsc() );
2701 0 : }
2702 :
2703 :
2704 :
2705 0 : IMPL_LINK( SvxCharPositionPage, PositionHdl_Impl, RadioButton*, pBtn )
2706 : {
2707 0 : sal_uInt16 nEsc = SVX_ESCAPEMENT_OFF; // also when pBtn == NULL
2708 :
2709 0 : if ( m_pHighPosBtn == pBtn )
2710 0 : nEsc = SVX_ESCAPEMENT_SUPERSCRIPT;
2711 0 : else if ( m_pLowPosBtn == pBtn )
2712 0 : nEsc = SVX_ESCAPEMENT_SUBSCRIPT;
2713 :
2714 0 : SetEscapement_Impl( nEsc );
2715 0 : return 0;
2716 : }
2717 :
2718 :
2719 :
2720 0 : IMPL_LINK( SvxCharPositionPage, RotationHdl_Impl, RadioButton*, pBtn )
2721 : {
2722 0 : bool bEnable = false;
2723 0 : if (m_p90degRB == pBtn || m_p270degRB == pBtn)
2724 0 : bEnable = true;
2725 : else
2726 : OSL_ENSURE( m_p0degRB == pBtn, "unexpected button" );
2727 0 : m_pFitToLineCB->Enable( bEnable );
2728 0 : return 0;
2729 : }
2730 :
2731 :
2732 :
2733 0 : IMPL_LINK_NOARG(SvxCharPositionPage, FontModifyHdl_Impl)
2734 : {
2735 0 : sal_uInt8 nEscProp = (sal_uInt8)m_pFontSizeMF->GetValue();
2736 0 : short nEsc = (short)m_pHighLowMF->GetValue();
2737 0 : nEsc *= m_pLowPosBtn->IsChecked() ? -1 : 1;
2738 0 : UpdatePreview_Impl( 100, nEscProp, nEsc );
2739 0 : return 0;
2740 : }
2741 :
2742 :
2743 :
2744 0 : IMPL_LINK( SvxCharPositionPage, AutoPositionHdl_Impl, CheckBox*, pBox )
2745 : {
2746 0 : if ( pBox->IsChecked() )
2747 : {
2748 0 : m_pHighLowFT->Disable();
2749 0 : m_pHighLowMF->Disable();
2750 : }
2751 : else
2752 0 : PositionHdl_Impl( m_pHighPosBtn->IsChecked() ? m_pHighPosBtn
2753 0 : : m_pLowPosBtn->IsChecked() ? m_pLowPosBtn
2754 0 : : m_pNormalPosBtn );
2755 0 : return 0;
2756 : }
2757 :
2758 :
2759 :
2760 0 : IMPL_LINK( SvxCharPositionPage, FitToLineHdl_Impl, CheckBox*, pBox )
2761 : {
2762 0 : if (m_pFitToLineCB == pBox)
2763 : {
2764 0 : sal_uInt16 nVal = m_nScaleWidthInitialVal;
2765 0 : if (m_pFitToLineCB->IsChecked())
2766 0 : nVal = m_nScaleWidthItemSetVal;
2767 0 : m_pScaleWidthMF->SetValue( nVal );
2768 :
2769 0 : m_pPreviewWin->SetFontWidthScale( nVal );
2770 : }
2771 0 : return 0;
2772 : }
2773 :
2774 :
2775 :
2776 0 : IMPL_LINK_NOARG(SvxCharPositionPage, KerningSelectHdl_Impl)
2777 : {
2778 0 : if ( m_pKerningLB->GetSelectEntryPos() > LW_NORMAL )
2779 : {
2780 0 : m_pKerningFT->Enable();
2781 0 : m_pKerningMF->Enable();
2782 :
2783 0 : if ( m_pKerningLB->GetSelectEntryPos() == LW_CONDENSED )
2784 : {
2785 : // Condensed -> max value == 1/6 of the current font height
2786 0 : SvxFont& rFont = GetPreviewFont();
2787 0 : long nMax = rFont.GetSize().Height() / 6;
2788 0 : m_pKerningMF->SetMax( m_pKerningMF->Normalize( nMax ), FUNIT_TWIP );
2789 0 : m_pKerningMF->SetLast( m_pKerningMF->GetMax( m_pKerningMF->GetUnit() ) );
2790 : }
2791 : else
2792 : {
2793 0 : m_pKerningMF->SetMax( 9999 );
2794 0 : m_pKerningMF->SetLast( 9999 );
2795 : }
2796 : }
2797 : else
2798 : {
2799 0 : m_pKerningMF->SetValue( 0 );
2800 0 : m_pKerningFT->Disable();
2801 0 : m_pKerningMF->Disable();
2802 : }
2803 :
2804 0 : KerningModifyHdl_Impl( NULL );
2805 :
2806 0 : return 0;
2807 : }
2808 :
2809 :
2810 :
2811 0 : IMPL_LINK_NOARG(SvxCharPositionPage, KerningModifyHdl_Impl)
2812 : {
2813 0 : long nVal = static_cast<long>(m_pKerningMF->GetValue());
2814 0 : nVal = LogicToLogic( nVal, MAP_POINT, MAP_TWIP );
2815 0 : long nKern = (short)m_pKerningMF->Denormalize( nVal );
2816 :
2817 : // Condensed? -> then negative
2818 0 : if ( m_pKerningLB->GetSelectEntryPos() == LW_CONDENSED )
2819 0 : nKern *= -1;
2820 :
2821 0 : SvxFont& rFont = GetPreviewFont();
2822 0 : SvxFont& rCJKFont = GetPreviewCJKFont();
2823 0 : SvxFont& rCTLFont = GetPreviewCTLFont();
2824 :
2825 0 : rFont.SetFixKerning( (short)nKern );
2826 0 : rCJKFont.SetFixKerning( (short)nKern );
2827 0 : rCTLFont.SetFixKerning( (short)nKern );
2828 0 : m_pPreviewWin->Invalidate();
2829 0 : return 0;
2830 : }
2831 :
2832 :
2833 :
2834 0 : IMPL_LINK_NOARG(SvxCharPositionPage, PairKerningHdl_Impl)
2835 : {
2836 0 : return 0;
2837 : }
2838 :
2839 :
2840 :
2841 0 : IMPL_LINK( SvxCharPositionPage, LoseFocusHdl_Impl, MetricField*, pField )
2842 : {
2843 : #ifdef DBG_UTIL
2844 : bool bHigh = m_pHighPosBtn->IsChecked();
2845 : #endif
2846 0 : bool bLow = m_pLowPosBtn->IsChecked();
2847 : DBG_ASSERT( bHigh || bLow, "normal position is not valid" );
2848 :
2849 0 : if ( m_pHighLowMF == pField )
2850 : {
2851 0 : if ( bLow )
2852 0 : m_nSubEsc = (short)m_pHighLowMF->GetValue() * -1;
2853 : else
2854 0 : m_nSuperEsc = (short)m_pHighLowMF->GetValue();
2855 : }
2856 0 : else if ( m_pFontSizeMF == pField )
2857 : {
2858 0 : if ( bLow )
2859 0 : m_nSubProp = (sal_uInt8)m_pFontSizeMF->GetValue();
2860 : else
2861 0 : m_nSuperProp = (sal_uInt8)m_pFontSizeMF->GetValue();
2862 : }
2863 0 : return 0;
2864 : }
2865 :
2866 :
2867 :
2868 0 : IMPL_LINK_NOARG(SvxCharPositionPage, ScaleWidthModifyHdl_Impl)
2869 : {
2870 0 : m_pPreviewWin->SetFontWidthScale( sal_uInt16( m_pScaleWidthMF->GetValue() ) );
2871 :
2872 0 : return 0;
2873 : }
2874 :
2875 0 : void SvxCharPositionPage::ActivatePage( const SfxItemSet& rSet )
2876 : {
2877 : //update the preview
2878 0 : SvxCharBasePage::ActivatePage( rSet );
2879 :
2880 : //the only thing that has to be checked is the max. allowed value for the
2881 : //condense edit field
2882 0 : if ( m_pKerningLB->GetSelectEntryPos() == LW_CONDENSED )
2883 : {
2884 : // Condensed -> max value == 1/6 of the current font height
2885 0 : SvxFont& rFont = GetPreviewFont();
2886 0 : long nMax = rFont.GetSize().Height() / 6;
2887 0 : long nKern = (short)m_pKerningMF->Denormalize( LogicToLogic( static_cast<long>(m_pKerningMF->GetValue()), MAP_POINT, MAP_TWIP ) );
2888 0 : m_pKerningMF->SetMax( m_pKerningMF->Normalize( nKern > nMax ? nKern : nMax ), FUNIT_TWIP );
2889 0 : m_pKerningMF->SetLast( m_pKerningMF->GetMax( m_pKerningMF->GetUnit() ) );
2890 : }
2891 0 : }
2892 :
2893 :
2894 :
2895 0 : int SvxCharPositionPage::DeactivatePage( SfxItemSet* _pSet )
2896 : {
2897 0 : if ( _pSet )
2898 0 : FillItemSet( _pSet );
2899 0 : return LEAVE_PAGE;
2900 : }
2901 :
2902 :
2903 :
2904 0 : SfxTabPage* SvxCharPositionPage::Create( vcl::Window* pParent, const SfxItemSet* rSet )
2905 : {
2906 0 : return new SvxCharPositionPage( pParent, *rSet );
2907 : }
2908 :
2909 :
2910 :
2911 0 : const sal_uInt16* SvxCharPositionPage::GetRanges()
2912 : {
2913 0 : return pPositionRanges;
2914 : }
2915 :
2916 :
2917 0 : void SvxCharPositionPage::Reset( const SfxItemSet* rSet )
2918 : {
2919 0 : OUString sUser = GetUserData();
2920 :
2921 0 : if ( !sUser.isEmpty() )
2922 : {
2923 0 : m_nSuperEsc = (short)sUser.getToken( 0, ';' ).toInt32();
2924 0 : m_nSubEsc = (short)sUser.getToken( 1, ';' ).toInt32();
2925 0 : m_nSuperProp = (sal_uInt8)sUser.getToken( 2, ';' ).toInt32();
2926 0 : m_nSubProp = (sal_uInt8)sUser.getToken( 3, ';' ).toInt32();
2927 :
2928 : //fdo#75307 validate all the entries and discard all of them if any are
2929 : //out of range
2930 0 : bool bValid = true;
2931 0 : if (m_nSuperEsc < m_pHighLowMF->GetMin() || m_nSuperEsc > m_pHighLowMF->GetMax())
2932 0 : bValid = false;
2933 0 : if (m_nSubEsc*-1 < m_pHighLowMF->GetMin() || m_nSubEsc*-1 > m_pHighLowMF->GetMax())
2934 0 : bValid = false;
2935 0 : if (m_nSuperProp < m_pFontSizeMF->GetMin() || m_nSuperProp > m_pFontSizeMF->GetMax())
2936 0 : bValid = false;
2937 0 : if (m_nSubProp < m_pFontSizeMF->GetMin() || m_nSubProp > m_pFontSizeMF->GetMax())
2938 0 : bValid = false;
2939 :
2940 0 : if (!bValid)
2941 : {
2942 0 : m_nSuperEsc = DFLT_ESC_SUPER;
2943 0 : m_nSubEsc = DFLT_ESC_SUB;
2944 0 : m_nSuperProp = DFLT_ESC_PROP;
2945 0 : m_nSubProp = DFLT_ESC_PROP;
2946 : }
2947 : }
2948 :
2949 0 : short nEsc = 0;
2950 0 : sal_uInt8 nEscProp = 100;
2951 0 : sal_uInt8 nProp = 100;
2952 :
2953 0 : m_pHighLowFT->Disable();
2954 0 : m_pHighLowMF->Disable();
2955 0 : m_pFontSizeFT->Disable();
2956 0 : m_pFontSizeMF->Disable();
2957 :
2958 0 : SvxFont& rFont = GetPreviewFont();
2959 0 : SvxFont& rCJKFont = GetPreviewCJKFont();
2960 0 : SvxFont& rCTLFont = GetPreviewCTLFont();
2961 0 : sal_uInt16 nWhich = GetWhich( SID_ATTR_CHAR_ESCAPEMENT );
2962 :
2963 0 : if ( rSet->GetItemState( nWhich ) >= SfxItemState::DEFAULT )
2964 : {
2965 0 : const SvxEscapementItem& rItem = static_cast<const SvxEscapementItem&>(rSet->Get( nWhich ));
2966 0 : nEsc = rItem.GetEsc();
2967 0 : nEscProp = rItem.GetProp();
2968 :
2969 0 : if ( nEsc != 0 )
2970 : {
2971 0 : m_pHighLowFT->Enable();
2972 0 : m_pHighLowMF->Enable();
2973 0 : m_pFontSizeFT->Enable();
2974 0 : m_pFontSizeMF->Enable();
2975 :
2976 : short nFac;
2977 0 : bool bAutomatic(false);
2978 :
2979 0 : if ( nEsc > 0 )
2980 : {
2981 0 : nFac = 1;
2982 0 : m_pHighPosBtn->Check( true );
2983 0 : if ( nEsc == DFLT_ESC_AUTO_SUPER )
2984 : {
2985 0 : nEsc = DFLT_ESC_SUPER;
2986 0 : bAutomatic = true;
2987 : }
2988 : }
2989 : else
2990 : {
2991 0 : nFac = -1;
2992 0 : m_pLowPosBtn->Check( true );
2993 0 : if ( nEsc == DFLT_ESC_AUTO_SUB )
2994 : {
2995 0 : nEsc = DFLT_ESC_SUB;
2996 0 : bAutomatic = true;
2997 : }
2998 : }
2999 0 : if (!m_pHighLowRB->IsEnabled())
3000 : {
3001 0 : m_pHighLowRB->Enable();
3002 : }
3003 0 : m_pHighLowRB->Check(bAutomatic);
3004 :
3005 0 : if ( m_pHighLowRB->IsChecked() )
3006 : {
3007 0 : m_pHighLowFT->Disable();
3008 0 : m_pHighLowMF->Disable();
3009 : }
3010 0 : m_pHighLowMF->SetValue( m_pHighLowMF->Normalize( nFac * nEsc ) );
3011 : }
3012 : else
3013 : {
3014 0 : m_pNormalPosBtn->Check( true );
3015 0 : m_pHighLowRB->Check( true );
3016 0 : PositionHdl_Impl( NULL );
3017 : }
3018 : //the height has to be set after the handler is called to keep the value also if the escapement is zero
3019 0 : m_pFontSizeMF->SetValue( m_pFontSizeMF->Normalize( nEscProp ) );
3020 : }
3021 : else
3022 : {
3023 0 : m_pHighPosBtn->Check( false );
3024 0 : m_pNormalPosBtn->Check( false );
3025 0 : m_pLowPosBtn->Check( false );
3026 : }
3027 :
3028 : // set BspFont
3029 0 : SetPrevFontEscapement( nProp, nEscProp, nEsc );
3030 :
3031 : // Kerning
3032 0 : nWhich = GetWhich( SID_ATTR_CHAR_KERNING );
3033 :
3034 0 : if ( rSet->GetItemState( nWhich ) >= SfxItemState::DEFAULT )
3035 : {
3036 0 : const SvxKerningItem& rItem = static_cast<const SvxKerningItem&>(rSet->Get( nWhich ));
3037 0 : SfxMapUnit eUnit = rSet->GetPool()->GetMetric( nWhich );
3038 0 : MapUnit eOrgUnit = (MapUnit)eUnit;
3039 0 : MapUnit ePntUnit( MAP_POINT );
3040 0 : long nBig = static_cast<long>(m_pKerningMF->Normalize( static_cast<long>(rItem.GetValue()) ));
3041 0 : long nKerning = LogicToLogic( nBig, eOrgUnit, ePntUnit );
3042 :
3043 : // set Kerning at the Font, convert into Twips before
3044 0 : long nKern = LogicToLogic( rItem.GetValue(), (MapUnit)eUnit, MAP_TWIP );
3045 0 : rFont.SetFixKerning( (short)nKern );
3046 0 : rCJKFont.SetFixKerning( (short)nKern );
3047 0 : rCTLFont.SetFixKerning( (short)nKern );
3048 :
3049 0 : if ( nKerning > 0 )
3050 : {
3051 0 : m_pKerningLB->SelectEntryPos( LW_EXPANDED );
3052 : }
3053 0 : else if ( nKerning < 0 )
3054 : {
3055 0 : m_pKerningLB->SelectEntryPos( LW_CONDENSED );
3056 0 : nKerning = -nKerning;
3057 : }
3058 : else
3059 : {
3060 0 : nKerning = 0;
3061 0 : m_pKerningLB->SelectEntryPos( LW_NORMAL );
3062 : }
3063 : //enable/disable and set min/max of the Edit
3064 0 : KerningSelectHdl_Impl(m_pKerningLB);
3065 : //the attribute value must be displayed also if it's above the maximum allowed value
3066 0 : long nVal = static_cast<long>(m_pKerningMF->GetMax());
3067 0 : if(nVal < nKerning)
3068 0 : m_pKerningMF->SetMax( nKerning );
3069 0 : m_pKerningMF->SetValue( nKerning );
3070 : }
3071 : else
3072 0 : m_pKerningMF->SetText( OUString() );
3073 :
3074 : // Pair kerning
3075 0 : nWhich = GetWhich( SID_ATTR_CHAR_AUTOKERN );
3076 :
3077 0 : if ( rSet->GetItemState( nWhich ) >= SfxItemState::DEFAULT )
3078 : {
3079 0 : const SvxAutoKernItem& rItem = static_cast<const SvxAutoKernItem&>(rSet->Get( nWhich ));
3080 0 : m_pPairKerningBtn->Check( rItem.GetValue() );
3081 : }
3082 : else
3083 0 : m_pPairKerningBtn->Check( false );
3084 :
3085 : // Scale Width
3086 0 : nWhich = GetWhich( SID_ATTR_CHAR_SCALEWIDTH );
3087 0 : if ( rSet->GetItemState( nWhich ) >= SfxItemState::DEFAULT )
3088 : {
3089 0 : const SvxCharScaleWidthItem& rItem = static_cast<const SvxCharScaleWidthItem&>( rSet->Get( nWhich ) );
3090 0 : m_nScaleWidthInitialVal = rItem.GetValue();
3091 0 : m_pScaleWidthMF->SetValue( m_nScaleWidthInitialVal );
3092 : }
3093 : else
3094 0 : m_pScaleWidthMF->SetValue( 100 );
3095 :
3096 0 : nWhich = GetWhich( SID_ATTR_CHAR_WIDTH_FIT_TO_LINE );
3097 0 : if ( rSet->GetItemState( nWhich ) >= SfxItemState::DEFAULT )
3098 0 : m_nScaleWidthItemSetVal = static_cast<const SfxUInt16Item&>( rSet->Get( nWhich )).GetValue();
3099 :
3100 : // Rotation
3101 0 : nWhich = GetWhich( SID_ATTR_CHAR_ROTATED );
3102 0 : SfxItemState eState = rSet->GetItemState( nWhich );
3103 0 : if( SfxItemState::UNKNOWN == eState )
3104 : {
3105 0 : m_pRotationContainer->Hide();
3106 0 : m_pScalingAndRotationFT->Hide();
3107 0 : m_pScalingFT->Show();
3108 : }
3109 : else
3110 : {
3111 0 : m_pRotationContainer->Show();
3112 0 : m_pScalingAndRotationFT->Show();
3113 0 : m_pScalingFT->Hide();
3114 :
3115 0 : Link aOldLink( m_pFitToLineCB->GetClickHdl() );
3116 0 : m_pFitToLineCB->SetClickHdl( Link() );
3117 0 : if( eState >= SfxItemState::DEFAULT )
3118 : {
3119 : const SvxCharRotateItem& rItem =
3120 0 : static_cast<const SvxCharRotateItem&>( rSet->Get( nWhich ));
3121 0 : if (rItem.IsBottomToTop())
3122 0 : m_p90degRB->Check( true );
3123 0 : else if (rItem.IsTopToBotton())
3124 0 : m_p270degRB->Check( true );
3125 : else
3126 : {
3127 : DBG_ASSERT( 0 == rItem.GetValue(), "incorrect value" );
3128 0 : m_p0degRB->Check( true );
3129 : }
3130 0 : m_pFitToLineCB->Check( rItem.IsFitToLine() );
3131 : }
3132 : else
3133 : {
3134 0 : if( eState == SfxItemState::DONTCARE )
3135 : {
3136 0 : m_p0degRB->Check( false );
3137 0 : m_p90degRB->Check( false );
3138 0 : m_p270degRB->Check( false );
3139 : }
3140 : else
3141 0 : m_p0degRB->Check( true );
3142 :
3143 0 : m_pFitToLineCB->Check( false );
3144 : }
3145 0 : m_pFitToLineCB->SetClickHdl( aOldLink );
3146 0 : m_pFitToLineCB->Enable( !m_p0degRB->IsChecked() );
3147 :
3148 : // is this value set?
3149 0 : if( SfxItemState::UNKNOWN == rSet->GetItemState( GetWhich(
3150 0 : SID_ATTR_CHAR_WIDTH_FIT_TO_LINE ) ))
3151 0 : m_pFitToLineCB->Hide();
3152 : }
3153 :
3154 0 : m_pHighPosBtn->SaveValue();
3155 0 : m_pNormalPosBtn->SaveValue();
3156 0 : m_pLowPosBtn->SaveValue();
3157 0 : m_p0degRB->SaveValue();
3158 0 : m_p90degRB->SaveValue();
3159 0 : m_p270degRB->SaveValue();
3160 0 : m_pFitToLineCB->SaveValue();
3161 0 : m_pScaleWidthMF->SaveValue();
3162 0 : m_pKerningLB->SaveValue();
3163 0 : m_pKerningMF->SaveValue();
3164 0 : m_pPairKerningBtn->SaveValue();
3165 0 : }
3166 :
3167 :
3168 :
3169 0 : bool SvxCharPositionPage::FillItemSet( SfxItemSet* rSet )
3170 : {
3171 : // Position (high, normal or low)
3172 0 : const SfxItemSet& rOldSet = GetItemSet();
3173 0 : bool bModified = false, bChanged = true;
3174 0 : sal_uInt16 nWhich = GetWhich( SID_ATTR_CHAR_ESCAPEMENT );
3175 0 : const SfxPoolItem* pOld = GetOldItem( *rSet, SID_ATTR_CHAR_ESCAPEMENT );
3176 0 : const bool bHigh = m_pHighPosBtn->IsChecked();
3177 : short nEsc;
3178 : sal_uInt8 nEscProp;
3179 :
3180 0 : if ( bHigh || m_pLowPosBtn->IsChecked() )
3181 : {
3182 0 : if ( m_pHighLowRB->IsChecked() )
3183 0 : nEsc = bHigh ? DFLT_ESC_AUTO_SUPER : DFLT_ESC_AUTO_SUB;
3184 : else
3185 : {
3186 0 : nEsc = (short)m_pHighLowMF->Denormalize( m_pHighLowMF->GetValue() );
3187 0 : nEsc *= (bHigh ? 1 : -1);
3188 : }
3189 0 : nEscProp = (sal_uInt8)m_pFontSizeMF->Denormalize( m_pFontSizeMF->GetValue() );
3190 : }
3191 : else
3192 : {
3193 0 : nEsc = 0;
3194 0 : nEscProp = 100;
3195 : }
3196 :
3197 0 : if ( pOld )
3198 : {
3199 0 : const SvxEscapementItem& rItem = *static_cast<const SvxEscapementItem*>(pOld);
3200 0 : if ( rItem.GetEsc() == nEsc && rItem.GetProp() == nEscProp )
3201 0 : bChanged = false;
3202 : }
3203 :
3204 0 : if ( !bChanged && !m_pHighPosBtn->GetSavedValue() &&
3205 0 : !m_pNormalPosBtn->GetSavedValue() && !m_pLowPosBtn->GetSavedValue() )
3206 0 : bChanged = true;
3207 :
3208 0 : if ( bChanged &&
3209 0 : ( m_pHighPosBtn->IsChecked() || m_pNormalPosBtn->IsChecked() || m_pLowPosBtn->IsChecked() ) )
3210 : {
3211 0 : rSet->Put( SvxEscapementItem( nEsc, nEscProp, nWhich ) );
3212 0 : bModified = true;
3213 : }
3214 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
3215 0 : rSet->InvalidateItem(nWhich);
3216 :
3217 0 : bChanged = true;
3218 :
3219 : // Kerning
3220 0 : nWhich = GetWhich( SID_ATTR_CHAR_KERNING );
3221 0 : pOld = GetOldItem( *rSet, SID_ATTR_CHAR_KERNING );
3222 0 : sal_Int32 nPos = m_pKerningLB->GetSelectEntryPos();
3223 0 : short nKerning = 0;
3224 0 : SfxMapUnit eUnit = rSet->GetPool()->GetMetric( nWhich );
3225 :
3226 0 : if ( nPos == LW_EXPANDED || nPos == LW_CONDENSED )
3227 : {
3228 0 : long nTmp = static_cast<long>(m_pKerningMF->GetValue());
3229 0 : long nVal = LogicToLogic( nTmp, MAP_POINT, (MapUnit)eUnit );
3230 0 : nKerning = (short)m_pKerningMF->Denormalize( nVal );
3231 :
3232 0 : if ( nPos == LW_CONDENSED )
3233 0 : nKerning *= - 1;
3234 : }
3235 :
3236 0 : if ( pOld )
3237 : {
3238 0 : const SvxKerningItem& rItem = *static_cast<const SvxKerningItem*>(pOld);
3239 0 : if ( rItem.GetValue() == nKerning )
3240 0 : bChanged = false;
3241 : }
3242 :
3243 0 : if ( !bChanged &&
3244 0 : ( m_pKerningLB->GetSavedValue() == LISTBOX_ENTRY_NOTFOUND ||
3245 0 : ( m_pKerningMF->GetSavedValue().isEmpty() && m_pKerningMF->IsEnabled() ) ) )
3246 0 : bChanged = true;
3247 :
3248 0 : if ( bChanged && nPos != LISTBOX_ENTRY_NOTFOUND )
3249 : {
3250 0 : rSet->Put( SvxKerningItem( nKerning, nWhich ) );
3251 0 : bModified = true;
3252 : }
3253 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
3254 0 : rSet->InvalidateItem(nWhich);
3255 :
3256 0 : bChanged = true;
3257 :
3258 : // Pair-Kerning
3259 0 : nWhich = GetWhich( SID_ATTR_CHAR_AUTOKERN );
3260 :
3261 0 : if ( m_pPairKerningBtn->IsValueChangedFromSaved() )
3262 : {
3263 0 : rSet->Put( SvxAutoKernItem( m_pPairKerningBtn->IsChecked(), nWhich ) );
3264 0 : bModified = true;
3265 : }
3266 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
3267 0 : rSet->InvalidateItem(nWhich);
3268 :
3269 : // Scale Width
3270 0 : nWhich = GetWhich( SID_ATTR_CHAR_SCALEWIDTH );
3271 0 : if ( m_pScaleWidthMF->IsValueChangedFromSaved() )
3272 : {
3273 0 : rSet->Put( SvxCharScaleWidthItem( (sal_uInt16)m_pScaleWidthMF->GetValue(), nWhich ) );
3274 0 : bModified = true;
3275 : }
3276 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
3277 0 : rSet->InvalidateItem(nWhich);
3278 :
3279 : // Rotation
3280 0 : nWhich = GetWhich( SID_ATTR_CHAR_ROTATED );
3281 0 : if ( m_p0degRB->IsValueChangedFromSaved() ||
3282 0 : m_p90degRB->IsValueChangedFromSaved() ||
3283 0 : m_p270degRB->IsValueChangedFromSaved() ||
3284 0 : m_pFitToLineCB->IsValueChangedFromSaved() )
3285 : {
3286 0 : SvxCharRotateItem aItem( 0, m_pFitToLineCB->IsChecked(), nWhich );
3287 0 : if (m_p90degRB->IsChecked())
3288 0 : aItem.SetBottomToTop();
3289 0 : else if (m_p270degRB->IsChecked())
3290 0 : aItem.SetTopToBotton();
3291 0 : rSet->Put( aItem );
3292 0 : bModified = true;
3293 : }
3294 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
3295 0 : rSet->InvalidateItem(nWhich);
3296 :
3297 0 : return bModified;
3298 : }
3299 :
3300 :
3301 :
3302 0 : void SvxCharPositionPage::FillUserData()
3303 : {
3304 0 : const OUString cTok( ";" );
3305 :
3306 0 : OUString sUser = OUString::number( m_nSuperEsc ) + cTok +
3307 0 : OUString::number( m_nSubEsc ) + cTok +
3308 0 : OUString::number( m_nSuperProp ) + cTok +
3309 0 : OUString::number( m_nSubProp );
3310 0 : SetUserData( sUser );
3311 0 : }
3312 :
3313 :
3314 0 : void SvxCharPositionPage::SetPreviewBackgroundToCharacter()
3315 : {
3316 0 : m_bPreviewBackgroundToCharacter = true;
3317 0 : }
3318 :
3319 0 : void SvxCharPositionPage::PageCreated(const SfxAllItemSet& aSet)
3320 : {
3321 0 : SFX_ITEMSET_ARG (&aSet,pFlagItem,SfxUInt32Item,SID_FLAG_TYPE,false);
3322 0 : if (pFlagItem)
3323 : {
3324 0 : sal_uInt32 nFlags=pFlagItem->GetValue();
3325 0 : if ( ( nFlags & SVX_PREVIEW_CHARACTER ) == SVX_PREVIEW_CHARACTER )
3326 0 : SetPreviewBackgroundToCharacter();
3327 : }
3328 0 : }
3329 : // class SvxCharTwoLinesPage ------------------------------------------------
3330 :
3331 0 : SvxCharTwoLinesPage::SvxCharTwoLinesPage(vcl::Window* pParent, const SfxItemSet& rInSet)
3332 : : SvxCharBasePage(pParent, "TwoLinesPage", "cui/ui/twolinespage.ui", rInSet)
3333 : , m_nStartBracketPosition( 0 )
3334 0 : , m_nEndBracketPosition( 0 )
3335 : {
3336 0 : get(m_pTwoLinesBtn, "twolines");
3337 0 : get(m_pEnclosingFrame, "enclosing");
3338 0 : get(m_pStartBracketLB, "startbracket");
3339 0 : get(m_pEndBracketLB, "endbracket");
3340 :
3341 0 : get(m_pPreviewWin, "preview");
3342 :
3343 0 : Initialize();
3344 0 : }
3345 :
3346 0 : SvxCharTwoLinesPage::~SvxCharTwoLinesPage()
3347 : {
3348 0 : }
3349 :
3350 :
3351 :
3352 0 : void SvxCharTwoLinesPage::Initialize()
3353 : {
3354 0 : m_pTwoLinesBtn->Check( false );
3355 0 : TwoLinesHdl_Impl( NULL );
3356 :
3357 0 : m_pTwoLinesBtn->SetClickHdl( LINK( this, SvxCharTwoLinesPage, TwoLinesHdl_Impl ) );
3358 :
3359 0 : Link aLink = LINK( this, SvxCharTwoLinesPage, CharacterMapHdl_Impl );
3360 0 : m_pStartBracketLB->SetSelectHdl( aLink );
3361 0 : m_pEndBracketLB->SetSelectHdl( aLink );
3362 :
3363 0 : SvxFont& rFont = GetPreviewFont();
3364 0 : SvxFont& rCJKFont = GetPreviewCJKFont();
3365 0 : SvxFont& rCTLFont = GetPreviewCTLFont();
3366 0 : rFont.SetSize( Size( 0, 220 ) );
3367 0 : rCJKFont.SetSize( Size( 0, 220 ) );
3368 0 : rCTLFont.SetSize( Size( 0, 220 ) );
3369 0 : }
3370 :
3371 :
3372 :
3373 0 : void SvxCharTwoLinesPage::SelectCharacter( ListBox* pBox )
3374 : {
3375 0 : bool bStart = pBox == m_pStartBracketLB;
3376 0 : boost::scoped_ptr<SvxCharacterMap> aDlg(new SvxCharacterMap( this ));
3377 0 : aDlg->DisableFontSelection();
3378 :
3379 0 : if ( aDlg->Execute() == RET_OK )
3380 : {
3381 0 : sal_Unicode cChar = (sal_Unicode) aDlg->GetChar();
3382 0 : SetBracket( cChar, bStart );
3383 : }
3384 : else
3385 : {
3386 0 : pBox->SelectEntryPos( bStart ? m_nStartBracketPosition : m_nEndBracketPosition );
3387 0 : }
3388 0 : }
3389 :
3390 :
3391 :
3392 0 : void SvxCharTwoLinesPage::SetBracket( sal_Unicode cBracket, bool bStart )
3393 : {
3394 0 : sal_Int32 nEntryPos = 0;
3395 0 : ListBox* pBox = bStart ? m_pStartBracketLB : m_pEndBracketLB;
3396 0 : if ( 0 == cBracket )
3397 0 : pBox->SelectEntryPos(0);
3398 : else
3399 : {
3400 0 : bool bFound = false;
3401 0 : for ( sal_Int32 i = 1; i < pBox->GetEntryCount(); ++i )
3402 : {
3403 0 : if ( reinterpret_cast<sal_uLong>(pBox->GetEntryData(i)) != CHRDLG_ENCLOSE_SPECIAL_CHAR )
3404 : {
3405 0 : const sal_Unicode cChar = pBox->GetEntry(i)[0];
3406 0 : if ( cChar == cBracket )
3407 : {
3408 0 : pBox->SelectEntryPos(i);
3409 0 : nEntryPos = i;
3410 0 : bFound = true;
3411 0 : break;
3412 : }
3413 : }
3414 : }
3415 :
3416 0 : if ( !bFound )
3417 : {
3418 0 : nEntryPos = pBox->InsertEntry( OUString(cBracket) );
3419 0 : pBox->SelectEntryPos( nEntryPos );
3420 : }
3421 : }
3422 0 : if( bStart )
3423 0 : m_nStartBracketPosition = nEntryPos;
3424 : else
3425 0 : m_nEndBracketPosition = nEntryPos;
3426 0 : }
3427 :
3428 :
3429 :
3430 0 : IMPL_LINK_NOARG(SvxCharTwoLinesPage, TwoLinesHdl_Impl)
3431 : {
3432 0 : bool bChecked = m_pTwoLinesBtn->IsChecked();
3433 0 : m_pEnclosingFrame->Enable( bChecked );
3434 :
3435 0 : UpdatePreview_Impl();
3436 0 : return 0;
3437 : }
3438 :
3439 :
3440 :
3441 0 : IMPL_LINK( SvxCharTwoLinesPage, CharacterMapHdl_Impl, ListBox*, pBox )
3442 : {
3443 0 : sal_Int32 nPos = pBox->GetSelectEntryPos();
3444 0 : if ( CHRDLG_ENCLOSE_SPECIAL_CHAR == reinterpret_cast<sal_uLong>(pBox->GetEntryData( nPos )) )
3445 0 : SelectCharacter( pBox );
3446 : else
3447 : {
3448 0 : bool bStart = pBox == m_pStartBracketLB;
3449 0 : if( bStart )
3450 0 : m_nStartBracketPosition = nPos;
3451 : else
3452 0 : m_nEndBracketPosition = nPos;
3453 : }
3454 0 : UpdatePreview_Impl();
3455 0 : return 0;
3456 : }
3457 :
3458 :
3459 :
3460 0 : void SvxCharTwoLinesPage::ActivatePage( const SfxItemSet& rSet )
3461 : {
3462 0 : SvxCharBasePage::ActivatePage( rSet );
3463 0 : }
3464 :
3465 :
3466 :
3467 0 : int SvxCharTwoLinesPage::DeactivatePage( SfxItemSet* _pSet )
3468 : {
3469 0 : if ( _pSet )
3470 0 : FillItemSet( _pSet );
3471 0 : return LEAVE_PAGE;
3472 : }
3473 :
3474 :
3475 :
3476 0 : SfxTabPage* SvxCharTwoLinesPage::Create( vcl::Window* pParent, const SfxItemSet* rSet )
3477 : {
3478 0 : return new SvxCharTwoLinesPage( pParent, *rSet );
3479 : }
3480 :
3481 :
3482 :
3483 0 : const sal_uInt16* SvxCharTwoLinesPage::GetRanges()
3484 : {
3485 0 : return pTwoLinesRanges;
3486 : }
3487 :
3488 :
3489 :
3490 0 : void SvxCharTwoLinesPage::Reset( const SfxItemSet* rSet )
3491 : {
3492 0 : m_pTwoLinesBtn->Check( false );
3493 0 : sal_uInt16 nWhich = GetWhich( SID_ATTR_CHAR_TWO_LINES );
3494 0 : SfxItemState eState = rSet->GetItemState( nWhich );
3495 :
3496 0 : if ( eState >= SfxItemState::DONTCARE )
3497 : {
3498 0 : const SvxTwoLinesItem& rItem = static_cast<const SvxTwoLinesItem&>(rSet->Get( nWhich ));
3499 0 : m_pTwoLinesBtn->Check( rItem.GetValue() );
3500 :
3501 0 : if ( rItem.GetValue() )
3502 : {
3503 0 : SetBracket( rItem.GetStartBracket(), true );
3504 0 : SetBracket( rItem.GetEndBracket(), false );
3505 : }
3506 : }
3507 0 : TwoLinesHdl_Impl( NULL );
3508 :
3509 0 : SetPrevFontWidthScale( *rSet );
3510 0 : }
3511 :
3512 :
3513 :
3514 0 : bool SvxCharTwoLinesPage::FillItemSet( SfxItemSet* rSet )
3515 : {
3516 0 : const SfxItemSet& rOldSet = GetItemSet();
3517 0 : bool bModified = false, bChanged = true;
3518 0 : sal_uInt16 nWhich = GetWhich( SID_ATTR_CHAR_TWO_LINES );
3519 0 : const SfxPoolItem* pOld = GetOldItem( *rSet, SID_ATTR_CHAR_TWO_LINES );
3520 0 : bool bOn = m_pTwoLinesBtn->IsChecked();
3521 0 : sal_Unicode cStart = ( bOn && m_pStartBracketLB->GetSelectEntryPos() > 0 )
3522 0 : ? m_pStartBracketLB->GetSelectEntry()[0] : 0;
3523 0 : sal_Unicode cEnd = ( bOn && m_pEndBracketLB->GetSelectEntryPos() > 0 )
3524 0 : ? m_pEndBracketLB->GetSelectEntry()[0] : 0;
3525 :
3526 0 : if ( pOld )
3527 : {
3528 0 : const SvxTwoLinesItem& rItem = *static_cast<const SvxTwoLinesItem*>(pOld);
3529 0 : if ( rItem.GetValue() == bOn &&
3530 0 : ( !bOn || ( rItem.GetStartBracket() == cStart && rItem.GetEndBracket() == cEnd ) ) )
3531 0 : bChanged = false;
3532 : }
3533 :
3534 0 : if ( bChanged )
3535 : {
3536 0 : rSet->Put( SvxTwoLinesItem( bOn, cStart, cEnd, nWhich ) );
3537 0 : bModified = true;
3538 : }
3539 0 : else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
3540 0 : rSet->InvalidateItem(nWhich);
3541 :
3542 0 : return bModified;
3543 : }
3544 :
3545 0 : void SvxCharTwoLinesPage::UpdatePreview_Impl()
3546 : {
3547 0 : sal_Unicode cStart = m_pStartBracketLB->GetSelectEntryPos() > 0
3548 0 : ? m_pStartBracketLB->GetSelectEntry()[0] : 0;
3549 0 : sal_Unicode cEnd = m_pEndBracketLB->GetSelectEntryPos() > 0
3550 0 : ? m_pEndBracketLB->GetSelectEntry()[0] : 0;
3551 0 : m_pPreviewWin->SetBrackets(cStart, cEnd);
3552 0 : m_pPreviewWin->SetTwoLines(m_pTwoLinesBtn->IsChecked());
3553 0 : m_pPreviewWin->Invalidate();
3554 0 : }
3555 :
3556 0 : void SvxCharTwoLinesPage::SetPreviewBackgroundToCharacter()
3557 : {
3558 0 : m_bPreviewBackgroundToCharacter = true;
3559 0 : }
3560 :
3561 :
3562 0 : void SvxCharTwoLinesPage::PageCreated(const SfxAllItemSet& aSet)
3563 : {
3564 0 : SFX_ITEMSET_ARG (&aSet,pFlagItem,SfxUInt32Item,SID_FLAG_TYPE,false);
3565 0 : if (pFlagItem)
3566 : {
3567 0 : sal_uInt32 nFlags=pFlagItem->GetValue();
3568 0 : if ( ( nFlags & SVX_PREVIEW_CHARACTER ) == SVX_PREVIEW_CHARACTER )
3569 0 : SetPreviewBackgroundToCharacter();
3570 : }
3571 0 : }
3572 :
3573 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|