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