1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_starmath.hxx" 26 27 28 #define SMDLL 1 29 #include "tools/rcid.h" 30 #include <svl/eitem.hxx> 31 #include <svl/intitem.hxx> 32 #include <svl/stritem.hxx> 33 #include <sfx2/app.hxx> 34 #include <vcl/msgbox.hxx> 35 #include <svtools/ctrltool.hxx> 36 #include <sfx2/printer.hxx> 37 #include <vcl/sound.hxx> 38 #include <vcl/sndstyle.hxx> 39 #include <vcl/waitobj.hxx> 40 #include <vcl/settings.hxx> 41 #include <vcl/wall.hxx> 42 #include <sfx2/dispatch.hxx> 43 #include <sfx2/sfx.hrc> 44 #include <tools/string.hxx> 45 #include <tools/debug.hxx> 46 #include <svx/ucsubset.hxx> 47 48 49 #include "dialog.hxx" 50 #include "starmath.hrc" 51 #include "config.hxx" 52 #include "dialog.hrc" 53 #include "smmod.hxx" 54 #include "symbol.hxx" 55 #include "view.hxx" 56 #include "document.hxx" 57 #include "unomodel.hxx" 58 59 60 using ::rtl::OUString; 61 62 //////////////////////////////////////// 63 // 64 // Da der FontStyle besser ueber die Attribute gesetzt/abgefragt wird als ueber 65 // den StyleName bauen wir uns hier unsere eigene Uebersetzung 66 // Attribute <-> StyleName 67 // 68 69 class SmFontStyles 70 { 71 String aNormal; 72 String aBold; 73 String aItalic; 74 String aBoldItalic; 75 String aEmpty; 76 77 public: 78 SmFontStyles(); 79 80 sal_uInt16 GetCount() const { return 4; } 81 const String & GetStyleName( const Font &rFont ) const; 82 const String & GetStyleName( sal_uInt16 nIdx ) const; 83 }; 84 85 86 SmFontStyles::SmFontStyles() : 87 aNormal ( ResId( RID_FONTREGULAR, *SM_MOD()->GetResMgr() ) ), 88 aBold ( ResId( RID_FONTBOLD, *SM_MOD()->GetResMgr() ) ), 89 aItalic ( ResId( RID_FONTITALIC, *SM_MOD()->GetResMgr() ) ) 90 { 91 // SM_MOD()->GetResMgr().FreeResource(); 92 93 aBoldItalic = aBold; 94 aBoldItalic.AppendAscii( ", " ); 95 aBoldItalic += aItalic; 96 } 97 98 99 const String & SmFontStyles::GetStyleName( const Font &rFont ) const 100 { 101 //! compare also SmSpecialNode::Prepare 102 sal_Bool bBold = IsBold( rFont ), 103 bItalic = IsItalic( rFont ); 104 105 if (bBold && bItalic) 106 return aBoldItalic; 107 else if (bItalic) 108 return aItalic; 109 else if (bBold) 110 return aBold; 111 else 112 return aNormal; 113 } 114 115 116 const String & SmFontStyles::GetStyleName( sal_uInt16 nIdx ) const 117 { 118 // 0 = "normal", 1 = "italic", 119 // 2 = "bold", 3 = "bold italic" 120 121 #if OSL_DEBUG_LEVEL > 1 122 DBG_ASSERT( nIdx < GetCount(), "index out of range" ); 123 #endif 124 switch (nIdx) 125 { 126 case 0 : return aNormal; 127 case 1 : return aItalic; 128 case 2 : return aBold; 129 case 3 : return aBoldItalic; 130 } 131 return aEmpty; 132 } 133 134 135 const SmFontStyles & GetFontStyles() 136 { 137 static const SmFontStyles aImpl; 138 return aImpl; 139 } 140 141 ///////////////////////////////////////////////////////////////// 142 143 void SetFontStyle(const XubString &rStyleName, Font &rFont) 144 { 145 // finden des Index passend zum StyleName fuer den leeren StyleName wird 146 // 0 (nicht bold nicht italic) angenommen. 147 sal_uInt16 nIndex = 0; 148 if (rStyleName.Len()) 149 { 150 sal_uInt16 i; 151 const SmFontStyles &rStyles = GetFontStyles(); 152 for (i = 0; i < rStyles.GetCount(); i++) 153 if (rStyleName.CompareTo( rStyles.GetStyleName(i) ) == COMPARE_EQUAL) 154 break; 155 #if OSL_DEBUG_LEVEL > 1 156 DBG_ASSERT(i < rStyles.GetCount(), "style-name unknown"); 157 #endif 158 nIndex = i; 159 } 160 161 rFont.SetItalic((nIndex & 0x1) ? ITALIC_NORMAL : ITALIC_NONE); 162 rFont.SetWeight((nIndex & 0x2) ? WEIGHT_BOLD : WEIGHT_NORMAL); 163 } 164 165 166 /**************************************************************************/ 167 168 IMPL_LINK_INLINE_START( SmPrintOptionsTabPage, SizeButtonClickHdl, Button *, EMPTYARG/*pButton*/ ) 169 { 170 aZoom.Enable(aSizeZoomed.IsChecked()); 171 return 0; 172 } 173 IMPL_LINK_INLINE_END( SmPrintOptionsTabPage, SizeButtonClickHdl, Button *, pButton ) 174 175 176 SmPrintOptionsTabPage::SmPrintOptionsTabPage(Window *pParent, const SfxItemSet &rOptions) 177 : SfxTabPage(pParent, SmResId(RID_PRINTOPTIONPAGE), rOptions), 178 aFixedLine1 (this, SmResId( FL_PRINTOPTIONS )), 179 aTitle (this, SmResId( CB_TITLEROW )), 180 aText (this, SmResId( CB_EQUATION_TEXT )), 181 aFrame (this, SmResId( CB_FRAME )), 182 aFixedLine2 (this, SmResId( FL_PRINT_FORMAT )), 183 aSizeNormal (this, SmResId( RB_ORIGINAL_SIZE )), 184 aSizeScaled (this, SmResId( RB_FIT_TO_PAGE )), 185 aSizeZoomed (this, SmResId( RB_ZOOM )), 186 aZoom (this, SmResId( MF_ZOOM )), 187 aFixedLine3 (this, SmResId( FL_MISC_OPTIONS )), 188 aNoRightSpaces (this, SmResId( CB_IGNORE_SPACING )), 189 aSaveOnlyUsedSymbols (this, SmResId( CB_SAVE_ONLY_USED_SYMBOLS )) 190 { 191 FreeResource(); 192 193 aSizeNormal.SetClickHdl(LINK(this, SmPrintOptionsTabPage, SizeButtonClickHdl)); 194 aSizeScaled.SetClickHdl(LINK(this, SmPrintOptionsTabPage, SizeButtonClickHdl)); 195 aSizeZoomed.SetClickHdl(LINK(this, SmPrintOptionsTabPage, SizeButtonClickHdl)); 196 197 Reset(rOptions); 198 } 199 200 201 sal_Bool SmPrintOptionsTabPage::FillItemSet(SfxItemSet& rSet) 202 { 203 sal_uInt16 nPrintSize; 204 if (aSizeNormal.IsChecked()) 205 nPrintSize = PRINT_SIZE_NORMAL; 206 else if (aSizeScaled.IsChecked()) 207 nPrintSize = PRINT_SIZE_SCALED; 208 else 209 nPrintSize = PRINT_SIZE_ZOOMED; 210 211 rSet.Put(SfxUInt16Item(GetWhich(SID_PRINTSIZE), (sal_uInt16) nPrintSize)); 212 rSet.Put(SfxUInt16Item(GetWhich(SID_PRINTZOOM), (sal_uInt16) aZoom.GetValue())); 213 rSet.Put(SfxBoolItem(GetWhich(SID_PRINTTITLE), aTitle.IsChecked())); 214 rSet.Put(SfxBoolItem(GetWhich(SID_PRINTTEXT), aText.IsChecked())); 215 rSet.Put(SfxBoolItem(GetWhich(SID_PRINTFRAME), aFrame.IsChecked())); 216 rSet.Put(SfxBoolItem(GetWhich(SID_NO_RIGHT_SPACES), aNoRightSpaces.IsChecked())); 217 rSet.Put(SfxBoolItem(GetWhich(SID_SAVE_ONLY_USED_SYMBOLS), aSaveOnlyUsedSymbols.IsChecked())); 218 219 return sal_True; 220 } 221 222 223 void SmPrintOptionsTabPage::Reset(const SfxItemSet& rSet) 224 { 225 SmPrintSize ePrintSize = (SmPrintSize)((const SfxUInt16Item &)rSet.Get(GetWhich(SID_PRINTSIZE))).GetValue(); 226 227 aSizeNormal.Check(ePrintSize == PRINT_SIZE_NORMAL); 228 aSizeScaled.Check(ePrintSize == PRINT_SIZE_SCALED); 229 aSizeZoomed.Check(ePrintSize == PRINT_SIZE_ZOOMED); 230 231 aZoom.Enable(aSizeZoomed.IsChecked()); 232 233 aZoom.SetValue(((const SfxUInt16Item &)rSet.Get(GetWhich(SID_PRINTZOOM))).GetValue()); 234 235 aTitle.Check(((const SfxBoolItem &)rSet.Get(GetWhich(SID_PRINTTITLE))).GetValue()); 236 aText.Check(((const SfxBoolItem &)rSet.Get(GetWhich(SID_PRINTTEXT))).GetValue()); 237 aFrame.Check(((const SfxBoolItem &)rSet.Get(GetWhich(SID_PRINTFRAME))).GetValue()); 238 aNoRightSpaces.Check(((const SfxBoolItem &)rSet.Get(GetWhich(SID_NO_RIGHT_SPACES))).GetValue()); 239 aSaveOnlyUsedSymbols.Check(((const SfxBoolItem &)rSet.Get(GetWhich(SID_SAVE_ONLY_USED_SYMBOLS))).GetValue()); 240 } 241 242 243 SfxTabPage* SmPrintOptionsTabPage::Create(Window* pWindow, const SfxItemSet& rSet) 244 { 245 return (new SmPrintOptionsTabPage(pWindow, rSet)); 246 } 247 248 /**************************************************************************/ 249 250 251 void SmShowFont::Paint(const Rectangle& rRect ) 252 { 253 Control::Paint( rRect ); 254 255 XubString Text (GetFont().GetName()); 256 Size TextSize(GetTextWidth(Text), GetTextHeight()); 257 258 DrawText(Point((GetOutputSize().Width() - TextSize.Width()) / 2, 259 (GetOutputSize().Height() - TextSize.Height()) / 2), Text); 260 } 261 262 263 void SmShowFont::SetFont(const Font& rFont) 264 { 265 Color aTxtColor( GetTextColor() ); 266 Font aFont (rFont); 267 268 Invalidate(); 269 aFont.SetSize(Size(0, 24)); 270 aFont.SetAlign(ALIGN_TOP); 271 Control::SetFont(aFont); 272 273 // keep old text color (new font may have different color) 274 SetTextColor( aTxtColor ); 275 } 276 277 278 IMPL_LINK_INLINE_START( SmFontDialog, FontSelectHdl, ComboBox *, pComboBox ) 279 { 280 Face.SetName(pComboBox->GetText()); 281 aShowFont.SetFont(Face); 282 return 0; 283 } 284 IMPL_LINK_INLINE_END( SmFontDialog, FontSelectHdl, ComboBox *, pComboBox ) 285 286 287 IMPL_LINK( SmFontDialog, FontModifyHdl, ComboBox *, pComboBox ) 288 { 289 // if font is available in list then use it 290 sal_uInt16 nPos = pComboBox->GetEntryPos( pComboBox->GetText() ); 291 if (COMBOBOX_ENTRY_NOTFOUND != nPos) 292 { 293 FontSelectHdl( pComboBox ); 294 } 295 return 0; 296 } 297 298 299 IMPL_LINK( SmFontDialog, AttrChangeHdl, CheckBox *, EMPTYARG /*pCheckBox*/ ) 300 { 301 if (aBoldCheckBox.IsChecked()) 302 Face.SetWeight(FontWeight(WEIGHT_BOLD)); 303 else 304 Face.SetWeight(FontWeight(WEIGHT_NORMAL)); 305 306 if (aItalicCheckBox.IsChecked()) 307 Face.SetItalic(ITALIC_NORMAL); 308 else 309 Face.SetItalic(ITALIC_NONE); 310 311 aShowFont.SetFont(Face); 312 return 0; 313 } 314 315 316 void SmFontDialog::SetFont(const Font &rFont) 317 { 318 Face = rFont; 319 320 aFontBox.SetText( Face.GetName() ); 321 aBoldCheckBox.Check( IsBold( Face ) ); 322 aItalicCheckBox.Check( IsItalic( Face ) ); 323 324 aShowFont.SetFont(Face); 325 } 326 327 328 SmFontDialog::SmFontDialog(Window * pParent, 329 OutputDevice *pFntListDevice, sal_Bool bHideCheckboxes, sal_Bool bFreeRes) 330 : ModalDialog(pParent,SmResId(RID_FONTDIALOG)), 331 aFixedText1 (this, SmResId(1)), 332 aFontBox (this, SmResId(1)), 333 aBoldCheckBox (this, SmResId(1)), 334 aItalicCheckBox (this, SmResId(2)), 335 aOKButton1 (this, SmResId(1)), 336 aCancelButton1 (this, SmResId(1)), 337 aShowFont (this, SmResId(1)), 338 aFixedText2 (this, SmResId(2)) 339 { 340 if (bFreeRes) 341 FreeResource(); 342 343 { 344 WaitObject( this ); 345 346 FontList aFontList( pFntListDevice ); 347 348 sal_uInt16 nCount = aFontList.GetFontNameCount(); 349 for (sal_uInt16 i = 0; i < nCount; i++) 350 aFontBox.InsertEntry( aFontList.GetFontName(i).GetName() ); 351 352 Face.SetSize(Size(0, 24)); 353 Face.SetWeight(WEIGHT_NORMAL); 354 Face.SetItalic(ITALIC_NONE); 355 Face.SetFamily(FAMILY_DONTKNOW); 356 Face.SetPitch(PITCH_DONTKNOW); 357 Face.SetCharSet(RTL_TEXTENCODING_DONTKNOW); 358 Face.SetTransparent(sal_True); 359 360 InitColor_Impl(); 361 362 // preview like controls should have a 2D look 363 aShowFont.SetBorderStyle( WINDOW_BORDER_MONO ); 364 } 365 366 aFontBox.SetSelectHdl(LINK(this, SmFontDialog, FontSelectHdl)); 367 aFontBox.SetModifyHdl(LINK(this, SmFontDialog, FontModifyHdl)); 368 aBoldCheckBox.SetClickHdl(LINK(this, SmFontDialog, AttrChangeHdl)); 369 aItalicCheckBox.SetClickHdl(LINK(this, SmFontDialog, AttrChangeHdl)); 370 371 if (bHideCheckboxes) 372 { 373 aBoldCheckBox.Check( sal_False ); 374 aBoldCheckBox.Enable( sal_False ); 375 aBoldCheckBox.Show( sal_False ); 376 aItalicCheckBox.Check( sal_False ); 377 aItalicCheckBox.Enable( sal_False ); 378 aItalicCheckBox.Show( sal_False ); 379 aFixedText2.Show( sal_False ); 380 381 Size aSize( aFontBox.GetSizePixel() ); 382 long nComboBoxBottom = aFontBox.GetPosPixel().Y() + aFontBox.GetSizePixel().Height(); 383 long nCheckBoxBottom = aItalicCheckBox.GetPosPixel().Y() + aItalicCheckBox.GetSizePixel().Height(); 384 aSize.Height() += nCheckBoxBottom - nComboBoxBottom; 385 aFontBox.SetSizePixel( aSize ); 386 } 387 } 388 389 void SmFontDialog::InitColor_Impl() 390 { 391 #if OSL_DEBUG_LEVEL > 1 392 Color aBC( GetDisplayBackground().GetColor() ); 393 #endif 394 ColorData nBgCol = COL_WHITE, 395 nTxtCol = COL_BLACK; 396 const StyleSettings &rS = GetSettings().GetStyleSettings(); 397 if (rS.GetHighContrastMode()) 398 { 399 nBgCol = rS.GetFieldColor().GetColor(); 400 nTxtCol = rS.GetFieldTextColor().GetColor(); 401 } 402 403 Color aTmpColor( nBgCol ); 404 Wallpaper aWall( aTmpColor ); 405 Color aTxtColor( nTxtCol ); 406 aShowFont.SetBackground( aWall ); 407 aShowFont.SetTextColor( aTxtColor ); 408 } 409 410 411 void SmFontDialog::DataChanged( const DataChangedEvent& rDCEvt ) 412 { 413 if ( rDCEvt.GetType() == DATACHANGED_SETTINGS && 414 (rDCEvt.GetFlags() & SETTINGS_STYLE) ) 415 InitColor_Impl(); 416 417 ModalDialog::DataChanged( rDCEvt ); 418 } 419 420 /**************************************************************************/ 421 422 423 IMPL_LINK( SmFontSizeDialog, DefaultButtonClickHdl, Button *, EMPTYARG /*pButton*/ ) 424 { 425 QueryBox *pQueryBox = new QueryBox(this, SmResId(RID_DEFAULTSAVEQUERY)); 426 427 if (pQueryBox->Execute() == RET_YES) 428 { 429 SmModule *pp = SM_MOD(); 430 SmFormat aFmt( pp->GetConfig()->GetStandardFormat() ); 431 WriteTo( aFmt ); 432 pp->GetConfig()->SetStandardFormat( aFmt ); 433 } 434 435 delete pQueryBox; 436 return 0; 437 } 438 439 440 SmFontSizeDialog::SmFontSizeDialog(Window * pParent, sal_Bool bFreeRes) 441 : ModalDialog(pParent, SmResId(RID_FONTSIZEDIALOG)), 442 aFixedText1(this, SmResId(1)), 443 aBaseSize(this, SmResId(1)), 444 aFixedText4(this, SmResId(4)), 445 aTextSize(this, SmResId(4)), 446 aFixedText5(this, SmResId(5)), 447 aIndexSize(this, SmResId(5)), 448 aFixedText6(this, SmResId(6)), 449 aFunctionSize(this, SmResId(6)), 450 aFixedText7(this, SmResId(7)), 451 aOperatorSize(this, SmResId(7)), 452 aFixedText8(this, SmResId(8)), 453 aBorderSize(this, SmResId(8)), 454 aFixedLine1(this, SmResId(1)), 455 aOKButton1(this, SmResId(1)), 456 aCancelButton1(this, SmResId(1)), 457 aDefaultButton(this, SmResId(1)) 458 { 459 if (bFreeRes) 460 FreeResource(); 461 462 aDefaultButton.SetClickHdl(LINK(this, SmFontSizeDialog, DefaultButtonClickHdl)); 463 } 464 465 466 void SmFontSizeDialog::ReadFrom(const SmFormat &rFormat) 467 { 468 //! aufpassen: richtig runden! 469 aBaseSize.SetValue( SmRoundFraction( 470 Sm100th_mmToPts( rFormat.GetBaseSize().Height() ) ) ); 471 472 aTextSize .SetValue( rFormat.GetRelSize(SIZ_TEXT) ); 473 aIndexSize .SetValue( rFormat.GetRelSize(SIZ_INDEX) ); 474 aFunctionSize.SetValue( rFormat.GetRelSize(SIZ_FUNCTION) ); 475 aOperatorSize.SetValue( rFormat.GetRelSize(SIZ_OPERATOR) ); 476 aBorderSize .SetValue( rFormat.GetRelSize(SIZ_LIMITS) ); 477 } 478 479 480 void SmFontSizeDialog::WriteTo(SmFormat &rFormat) const 481 { 482 rFormat.SetBaseSize( Size(0, SmPtsTo100th_mm( static_cast< long >(aBaseSize.GetValue()))) ); 483 484 rFormat.SetRelSize(SIZ_TEXT, (sal_uInt16) aTextSize .GetValue()); 485 rFormat.SetRelSize(SIZ_INDEX, (sal_uInt16) aIndexSize .GetValue()); 486 rFormat.SetRelSize(SIZ_FUNCTION, (sal_uInt16) aFunctionSize.GetValue()); 487 rFormat.SetRelSize(SIZ_OPERATOR, (sal_uInt16) aOperatorSize.GetValue()); 488 rFormat.SetRelSize(SIZ_LIMITS, (sal_uInt16) aBorderSize .GetValue()); 489 490 const Size aTmp (rFormat.GetBaseSize()); 491 for (sal_uInt16 i = FNT_BEGIN; i <= FNT_END; i++) 492 rFormat.SetFontSize(i, aTmp); 493 494 rFormat.RequestApplyChanges(); 495 } 496 497 498 /**************************************************************************/ 499 500 501 IMPL_LINK( SmFontTypeDialog, MenuSelectHdl, Menu *, pMenu ) 502 { 503 SmFontPickListBox *pActiveListBox; 504 505 sal_Bool bHideCheckboxes = sal_False; 506 switch (pMenu->GetCurItemId()) 507 { 508 case 1: pActiveListBox = &aVariableFont; break; 509 case 2: pActiveListBox = &aFunctionFont; break; 510 case 3: pActiveListBox = &aNumberFont; break; 511 case 4: pActiveListBox = &aTextFont; break; 512 case 5: pActiveListBox = &aSerifFont; bHideCheckboxes = sal_True; break; 513 case 6: pActiveListBox = &aSansFont; bHideCheckboxes = sal_True; break; 514 case 7: pActiveListBox = &aFixedFont; bHideCheckboxes = sal_True; break; 515 default:pActiveListBox = NULL; 516 } 517 518 if (pActiveListBox) 519 { 520 SmFontDialog *pFontDialog = new SmFontDialog(this, pFontListDev, bHideCheckboxes); 521 522 pActiveListBox->WriteTo(*pFontDialog); 523 if (pFontDialog->Execute() == RET_OK) 524 pActiveListBox->ReadFrom(*pFontDialog); 525 delete pFontDialog; 526 } 527 return 0; 528 } 529 530 531 IMPL_LINK_INLINE_START( SmFontTypeDialog, DefaultButtonClickHdl, Button *, EMPTYARG /*pButton*/ ) 532 { 533 QueryBox *pQueryBox = new QueryBox(this, SmResId(RID_DEFAULTSAVEQUERY)); 534 if (pQueryBox->Execute() == RET_YES) 535 { 536 SmModule *pp = SM_MOD(); 537 SmFormat aFmt( pp->GetConfig()->GetStandardFormat() ); 538 WriteTo( aFmt ); 539 pp->GetConfig()->SetStandardFormat( aFmt, sal_True ); 540 } 541 542 delete pQueryBox; 543 return 0; 544 } 545 IMPL_LINK_INLINE_END( SmFontTypeDialog, DefaultButtonClickHdl, Button *, pButton ) 546 547 548 SmFontTypeDialog::SmFontTypeDialog(Window * pParent, OutputDevice *pFntListDevice, sal_Bool bFreeRes) 549 : ModalDialog(pParent, SmResId(RID_FONTTYPEDIALOG)), 550 aFixedText1 (this, SmResId(1)), 551 aVariableFont (this, SmResId(1)), 552 aFixedText2 (this, SmResId(2)), 553 aFunctionFont (this, SmResId(2)), 554 aFixedText3 (this, SmResId(3)), 555 aNumberFont (this, SmResId(3)), 556 aFixedText4 (this, SmResId(4)), 557 aTextFont (this, SmResId(4)), 558 aFixedText5 (this, SmResId(5)), 559 aSerifFont (this, SmResId(5)), 560 aFixedText6 (this, SmResId(6)), 561 aSansFont (this, SmResId(6)), 562 aFixedText7 (this, SmResId(7)), 563 aFixedFont (this, SmResId(7)), 564 aFixedLine1 (this, SmResId(1)), 565 aFixedLine2 (this, SmResId(2)), 566 aOKButton1 (this, SmResId(1)), 567 aCancelButton1 (this, SmResId(1)), 568 aMenuButton (this, SmResId(1)), 569 aDefaultButton (this, SmResId(2)), 570 pFontListDev (pFntListDevice) 571 { 572 if (bFreeRes) 573 FreeResource(); 574 575 aDefaultButton.SetClickHdl(LINK(this, SmFontTypeDialog, DefaultButtonClickHdl)); 576 577 aMenuButton.GetPopupMenu()->SetSelectHdl(LINK(this, SmFontTypeDialog, MenuSelectHdl)); 578 } 579 580 void SmFontTypeDialog::ReadFrom(const SmFormat &rFormat) 581 { 582 SmModule *pp = SM_MOD(); 583 584 aVariableFont = pp->GetConfig()->GetFontPickList(FNT_VARIABLE); 585 aFunctionFont = pp->GetConfig()->GetFontPickList(FNT_FUNCTION); 586 aNumberFont = pp->GetConfig()->GetFontPickList(FNT_NUMBER); 587 aTextFont = pp->GetConfig()->GetFontPickList(FNT_TEXT); 588 aSerifFont = pp->GetConfig()->GetFontPickList(FNT_SERIF); 589 aSansFont = pp->GetConfig()->GetFontPickList(FNT_SANS); 590 aFixedFont = pp->GetConfig()->GetFontPickList(FNT_FIXED); 591 592 aVariableFont.Insert( rFormat.GetFont(FNT_VARIABLE) ); 593 aFunctionFont.Insert( rFormat.GetFont(FNT_FUNCTION) ); 594 aNumberFont .Insert( rFormat.GetFont(FNT_NUMBER) ); 595 aTextFont .Insert( rFormat.GetFont(FNT_TEXT) ); 596 aSerifFont .Insert( rFormat.GetFont(FNT_SERIF) ); 597 aSansFont .Insert( rFormat.GetFont(FNT_SANS) ); 598 aFixedFont .Insert( rFormat.GetFont(FNT_FIXED) ); 599 } 600 601 602 void SmFontTypeDialog::WriteTo(SmFormat &rFormat) const 603 { 604 SmModule *pp = SM_MOD(); 605 606 pp->GetConfig()->GetFontPickList(FNT_VARIABLE) = aVariableFont; 607 pp->GetConfig()->GetFontPickList(FNT_FUNCTION) = aFunctionFont; 608 pp->GetConfig()->GetFontPickList(FNT_NUMBER) = aNumberFont; 609 pp->GetConfig()->GetFontPickList(FNT_TEXT) = aTextFont; 610 pp->GetConfig()->GetFontPickList(FNT_SERIF) = aSerifFont; 611 pp->GetConfig()->GetFontPickList(FNT_SANS) = aSansFont; 612 pp->GetConfig()->GetFontPickList(FNT_FIXED) = aFixedFont; 613 614 rFormat.SetFont( FNT_VARIABLE, aVariableFont.Get(0) ); 615 rFormat.SetFont( FNT_FUNCTION, aFunctionFont.Get(0) ); 616 rFormat.SetFont( FNT_NUMBER, aNumberFont .Get(0) ); 617 rFormat.SetFont( FNT_TEXT, aTextFont .Get(0) ); 618 rFormat.SetFont( FNT_SERIF, aSerifFont .Get(0) ); 619 rFormat.SetFont( FNT_SANS, aSansFont .Get(0) ); 620 rFormat.SetFont( FNT_FIXED, aFixedFont .Get(0) ); 621 622 rFormat.RequestApplyChanges(); 623 } 624 625 /**************************************************************************/ 626 627 struct FieldMinMax 628 { 629 sal_uInt16 nMin, nMax; 630 }; 631 632 // Data for min and max values of the 4 metric fields 633 // for each of the 10 categories 634 static const FieldMinMax pMinMaxData[10][4] = 635 { 636 // 0 637 {{ 0, 200 }, { 0, 200 }, { 0, 100 }, { 0, 0 }}, 638 // 1 639 {{ 0, 100 }, { 0, 100 }, { 0, 0 }, { 0, 0 }}, 640 // 2 641 {{ 0, 100 }, { 0, 100 }, { 0, 0 }, { 0, 0 }}, 642 // 3 643 {{ 0, 100 }, { 1, 100 }, { 0, 0 }, { 0, 0 }}, 644 // 4 645 {{ 0, 100 }, { 0, 100 }, { 0, 0 }, { 0, 0 }}, 646 // 5 647 {{ 0, 100 }, { 0, 100 }, { 0, 0 }, { 0, 100 }}, 648 // 6 649 {{ 0, 300 }, { 0, 300 }, { 0, 0 }, { 0, 0 }}, 650 // 7 651 {{ 0, 100 }, { 0, 100 }, { 0, 0 }, { 0, 0 }}, 652 // 8 653 {{ 0, 100 }, { 0, 100 }, { 0, 0 }, { 0, 0 }}, 654 // 9 655 {{ 0, 10000 }, { 0, 10000 }, { 0, 10000 }, { 0, 10000 }} 656 }; 657 658 SmCategoryDesc::SmCategoryDesc(const ResId& rResId, sal_uInt16 nCategoryIdx) : 659 Resource(rResId), 660 bIsHighContrast(sal_False) 661 { 662 if (IsAvailableRes(ResId(1,*rResId.GetResMgr()).SetRT(RSC_STRING))) 663 { 664 Name = XubString(ResId(1,*rResId.GetResMgr())); 665 666 int i; 667 for (i = 0; i < 4; i++) 668 { 669 int nI2 = i + 2; 670 671 if (IsAvailableRes(ResId(nI2,*rResId.GetResMgr()).SetRT(RSC_STRING))) 672 { 673 Strings [i] = new XubString(ResId(nI2,*rResId.GetResMgr())); 674 Graphics [i] = new Bitmap(ResId(10*nI2,*rResId.GetResMgr())); 675 GraphicsH[i] = new Bitmap(ResId(10*nI2+1,*rResId.GetResMgr())); 676 } 677 else 678 { 679 Strings [i] = 0; 680 Graphics [i] = 0; 681 GraphicsH[i] = 0; 682 } 683 } 684 685 for (i = 0; i < 4; i++) 686 { 687 const FieldMinMax &rMinMax = pMinMaxData[ nCategoryIdx ][i]; 688 Value[i] = Minimum[i] = rMinMax.nMin; 689 Maximum[i] = rMinMax.nMax; 690 } 691 } 692 693 FreeResource(); 694 } 695 696 697 SmCategoryDesc::~SmCategoryDesc() 698 { 699 for (int i = 0; i < 4; i++) 700 { 701 delete Strings [i]; 702 delete Graphics [i]; 703 delete GraphicsH[i]; 704 } 705 } 706 707 /**************************************************************************/ 708 709 IMPL_LINK( SmDistanceDialog, GetFocusHdl, Control *, pControl ) 710 { 711 if (Categories[nActiveCategory]) 712 { 713 sal_uInt16 i; 714 715 if (pControl == &aMetricField1) 716 i = 0; 717 else if (pControl == &aMetricField2) 718 i = 1; 719 else if (pControl == &aMetricField3) 720 i = 2; 721 else if (pControl == &aMetricField4) 722 i = 3; 723 else 724 return 0; 725 aBitmap.SetBitmap(*(Categories[nActiveCategory]->GetGraphic(i))); 726 } 727 return 0; 728 } 729 730 IMPL_LINK( SmDistanceDialog, MenuSelectHdl, Menu *, pMenu ) 731 { 732 SetCategory(pMenu->GetCurItemId() - 1); 733 return 0; 734 } 735 736 737 IMPL_LINK( SmDistanceDialog, DefaultButtonClickHdl, Button *, EMPTYARG /*pButton*/ ) 738 { 739 QueryBox *pQueryBox = new QueryBox(this, SmResId(RID_DEFAULTSAVEQUERY)); 740 741 if (pQueryBox->Execute() == RET_YES) 742 { 743 SmModule *pp = SM_MOD(); 744 SmFormat aFmt( pp->GetConfig()->GetStandardFormat() ); 745 WriteTo( aFmt ); 746 pp->GetConfig()->SetStandardFormat( aFmt ); 747 } 748 delete pQueryBox; 749 return 0; 750 } 751 752 753 IMPL_LINK( SmDistanceDialog, CheckBoxClickHdl, CheckBox *, pCheckBox ) 754 { 755 if (pCheckBox == &aCheckBox1) 756 { 757 aCheckBox1.Toggle(); 758 759 sal_Bool bChecked = aCheckBox1.IsChecked(); 760 aFixedText4 .Enable( bChecked ); 761 aMetricField4.Enable( bChecked ); 762 } 763 return 0; 764 } 765 766 767 void SmDistanceDialog::SetHelpId(MetricField &rField, const rtl::OString& sHelpId) 768 { 769 //! HelpID's die auf diese Weise explizit gesetzt werden, muessen im 770 //! util Verzeichnis im File "hidother.src" mit Hilfe von "hidspecial" 771 //! definiert werden! 772 773 const XubString aEmptyText; 774 #if OSL_DEBUG_LEVEL > 1 775 DBG_ASSERT(aEmptyText.Len() == 0, "Sm: Ooops..."); 776 #endif 777 778 rField.SetHelpId(sHelpId); 779 rField.SetHelpText(aEmptyText); 780 781 // since MetricField inherits from SpinField which has a sub Edit field 782 // (which is actually the one we modify) we have to set the help-id 783 // for it too. 784 Edit *pSubEdit = rField.GetSubEdit(); 785 if (pSubEdit) 786 { 787 pSubEdit->SetHelpId(sHelpId); 788 pSubEdit->SetHelpText(aEmptyText); 789 } 790 } 791 792 793 void SmDistanceDialog::SetCategory(sal_uInt16 nCategory) 794 { 795 #if OSL_DEBUG_LEVEL > 1 796 DBG_ASSERT(/*0 <= nCategory &&*/ nCategory < NOCATEGORIES, 797 "Sm: falsche Kategorienummer in SmDistanceDialog"); 798 #endif 799 800 // array to convert category- and metricfield-number in help ids. 801 // 0 is used in case of unused combinations. 802 #if OSL_DEBUG_LEVEL > 1 803 DBG_ASSERT(NOCATEGORIES == 10, "Sm : Array passt nicht zu Anzahl der Kategorien"); 804 #endif 805 const char* __READONLY_DATA aCatMf2Hid[10][4] = 806 { 807 { HID_SMA_DEFAULT_DIST, HID_SMA_LINE_DIST, HID_SMA_ROOT_DIST, 0 }, 808 { HID_SMA_SUP_DIST, HID_SMA_SUB_DIST , 0, 0 }, 809 { HID_SMA_NUMERATOR_DIST, HID_SMA_DENOMINATOR_DIST, 0, 0 }, 810 { HID_SMA_FRACLINE_EXCWIDTH, HID_SMA_FRACLINE_LINEWIDTH, 0, 0 }, 811 { HID_SMA_UPPERLIMIT_DIST, HID_SMA_LOWERLIMIT_DIST, 0, 0 }, 812 { HID_SMA_BRACKET_EXCHEIGHT, HID_SMA_BRACKET_DIST, 0, HID_SMA_BRACKET_EXCHEIGHT2 }, 813 { HID_SMA_MATRIXROW_DIST, HID_SMA_MATRIXCOL_DIST, 0, 0 }, 814 { HID_SMA_ATTRIBUT_DIST, HID_SMA_INTERATTRIBUT_DIST, 0, 0 }, 815 { HID_SMA_OPERATOR_EXCHEIGHT, HID_SMA_OPERATOR_DIST, 0, 0 }, 816 { HID_SMA_LEFTBORDER_DIST, HID_SMA_RIGHTBORDER_DIST, HID_SMA_UPPERBORDER_DIST, HID_SMA_LOWERBORDER_DIST } 817 }; 818 819 // array to help iterate over the controls 820 Window * __READONLY_DATA aWin[4][2] = 821 { 822 { &aFixedText1, &aMetricField1 }, 823 { &aFixedText2, &aMetricField2 }, 824 { &aFixedText3, &aMetricField3 }, 825 { &aFixedText4, &aMetricField4 } 826 }; 827 828 SmCategoryDesc *pCat; 829 830 // merken der (evtl neuen) Einstellungen der aktiven SmCategoryDesc 831 // bevor zu der neuen gewechselt wird. 832 if (nActiveCategory != CATEGORY_NONE) 833 { 834 pCat = Categories[nActiveCategory]; 835 pCat->SetValue(0, (sal_uInt16) aMetricField1.GetValue()); 836 pCat->SetValue(1, (sal_uInt16) aMetricField2.GetValue()); 837 pCat->SetValue(2, (sal_uInt16) aMetricField3.GetValue()); 838 pCat->SetValue(3, (sal_uInt16) aMetricField4.GetValue()); 839 840 if (nActiveCategory == 5) 841 bScaleAllBrackets = aCheckBox1.IsChecked(); 842 843 aMenuButton.GetPopupMenu()->CheckItem(nActiveCategory + 1, sal_False); 844 } 845 846 // aktivieren/deaktivieren der zugehoerigen Controls in Abhaengigkeit von der 847 // gewaehlten Kategorie. 848 sal_Bool bActive; 849 for (sal_uInt16 i = 0; i < 4; i++) 850 { 851 FixedText *pFT = (FixedText * const) aWin[i][0]; 852 MetricField *pMF = (MetricField * const) aWin[i][1]; 853 854 // Um feststellen welche Controls aktiv sein sollen wird das 855 // vorhandensein einer zugehoerigen HelpID ueberprueft. 856 bActive = aCatMf2Hid[nCategory][i] != 0; 857 858 pFT->Show(bActive); 859 pFT->Enable(bActive); 860 pMF->Show(bActive); 861 pMF->Enable(bActive); 862 863 // setzen von Masseinheit und Anzahl der Nachkommastellen 864 FieldUnit eUnit; 865 sal_uInt16 nDigits; 866 if (nCategory < 9) 867 { 868 eUnit = FUNIT_PERCENT; 869 nDigits = 0; 870 } 871 else 872 { 873 eUnit = FUNIT_100TH_MM; 874 nDigits = 2; 875 } 876 pMF->SetUnit(eUnit); //! veraendert den Wert 877 pMF->SetDecimalDigits(nDigits); 878 879 if (bActive) 880 { 881 pCat = Categories[nCategory]; 882 pFT->SetText(*pCat->GetString(i)); 883 884 pMF->SetMin(pCat->GetMinimum(i)); 885 pMF->SetMax(pCat->GetMaximum(i)); 886 pMF->SetValue(pCat->GetValue(i)); 887 888 SetHelpId(*pMF, aCatMf2Hid[nCategory][i]); 889 } 890 } 891 // nun noch die CheckBox und das zugehoerige MetricField genau dann aktivieren, 892 // falls es sich um das Klammer Menu handelt. 893 bActive = nCategory == 5; 894 aCheckBox1.Show(bActive); 895 aCheckBox1.Enable(bActive); 896 if (bActive) 897 { 898 aCheckBox1.Check( bScaleAllBrackets ); 899 900 sal_Bool bChecked = aCheckBox1.IsChecked(); 901 aFixedText4 .Enable( bChecked ); 902 aMetricField4.Enable( bChecked ); 903 } 904 905 aMenuButton.GetPopupMenu()->CheckItem(nCategory + 1, sal_True); 906 aFixedLine.SetText(Categories[nCategory]->GetName()); 907 908 nActiveCategory = nCategory; 909 910 aMetricField1.GrabFocus(); 911 Invalidate(); 912 Update(); 913 } 914 915 916 SmDistanceDialog::SmDistanceDialog(Window *pParent, sal_Bool bFreeRes) 917 : ModalDialog(pParent, SmResId(RID_DISTANCEDIALOG)), 918 aFixedText1 (this, SmResId(1)), 919 aMetricField1 (this, SmResId(1)), 920 aFixedText2 (this, SmResId(2)), 921 aMetricField2 (this, SmResId(2)), 922 aFixedText3 (this, SmResId(3)), 923 aMetricField3 (this, SmResId(3)), 924 aCheckBox1 (this, SmResId(1)), 925 aFixedText4 (this, SmResId(4)), 926 aMetricField4 (this, SmResId(4)), 927 aOKButton1 (this, SmResId(1)), 928 aCancelButton1 (this, SmResId(1)), 929 aMenuButton (this, SmResId(1)), 930 aDefaultButton (this, SmResId(1)), 931 aBitmap (this, SmResId(1)), 932 aFixedLine (this, SmResId(1)) 933 { 934 for (sal_uInt16 i = 0; i < NOCATEGORIES; i++) 935 Categories[i] = new SmCategoryDesc(SmResId(i + 1), i); 936 nActiveCategory = CATEGORY_NONE; 937 bScaleAllBrackets = sal_False; 938 939 if (bFreeRes) 940 FreeResource(); 941 942 ApplyImages(); 943 944 // preview like controls should have a 2D look 945 aBitmap.SetBorderStyle( WINDOW_BORDER_MONO ); 946 947 aMetricField1.SetGetFocusHdl(LINK(this, SmDistanceDialog, GetFocusHdl)); 948 aMetricField2.SetGetFocusHdl(LINK(this, SmDistanceDialog, GetFocusHdl)); 949 aMetricField3.SetGetFocusHdl(LINK(this, SmDistanceDialog, GetFocusHdl)); 950 aMetricField4.SetGetFocusHdl(LINK(this, SmDistanceDialog, GetFocusHdl)); 951 aCheckBox1.SetClickHdl(LINK(this, SmDistanceDialog, CheckBoxClickHdl)); 952 953 aMenuButton.GetPopupMenu()->SetSelectHdl(LINK(this, SmDistanceDialog, MenuSelectHdl)); 954 955 aDefaultButton.SetClickHdl(LINK(this, SmDistanceDialog, DefaultButtonClickHdl)); 956 } 957 958 959 SmDistanceDialog::~SmDistanceDialog() 960 { 961 for (int i = 0; i < NOCATEGORIES; i++) 962 DELETEZ(Categories[i]); 963 } 964 965 void SmDistanceDialog::ApplyImages() 966 { 967 sal_Bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode(); 968 for (int i = 0; i < NOCATEGORIES; ++i) 969 { 970 SmCategoryDesc *pCat = Categories[i]; 971 if (pCat) 972 pCat->SetHighContrast( bHighContrast ); 973 } 974 } 975 976 void SmDistanceDialog::DataChanged( const DataChangedEvent &rEvt ) 977 { 978 if ( (rEvt.GetType() == DATACHANGED_SETTINGS) && (rEvt.GetFlags() & SETTINGS_STYLE) ) 979 ApplyImages(); 980 981 ModalDialog::DataChanged( rEvt ); 982 } 983 984 void SmDistanceDialog::ReadFrom(const SmFormat &rFormat) 985 { 986 Categories[0]->SetValue(0, rFormat.GetDistance(DIS_HORIZONTAL)); 987 Categories[0]->SetValue(1, rFormat.GetDistance(DIS_VERTICAL)); 988 Categories[0]->SetValue(2, rFormat.GetDistance(DIS_ROOT)); 989 Categories[1]->SetValue(0, rFormat.GetDistance(DIS_SUPERSCRIPT)); 990 Categories[1]->SetValue(1, rFormat.GetDistance(DIS_SUBSCRIPT)); 991 Categories[2]->SetValue(0, rFormat.GetDistance(DIS_NUMERATOR)); 992 Categories[2]->SetValue(1, rFormat.GetDistance(DIS_DENOMINATOR)); 993 Categories[3]->SetValue(0, rFormat.GetDistance(DIS_FRACTION)); 994 Categories[3]->SetValue(1, rFormat.GetDistance(DIS_STROKEWIDTH)); 995 Categories[4]->SetValue(0, rFormat.GetDistance(DIS_UPPERLIMIT)); 996 Categories[4]->SetValue(1, rFormat.GetDistance(DIS_LOWERLIMIT)); 997 Categories[5]->SetValue(0, rFormat.GetDistance(DIS_BRACKETSIZE)); 998 Categories[5]->SetValue(1, rFormat.GetDistance(DIS_BRACKETSPACE)); 999 Categories[5]->SetValue(3, rFormat.GetDistance(DIS_NORMALBRACKETSIZE)); 1000 Categories[6]->SetValue(0, rFormat.GetDistance(DIS_MATRIXROW)); 1001 Categories[6]->SetValue(1, rFormat.GetDistance(DIS_MATRIXCOL)); 1002 Categories[7]->SetValue(0, rFormat.GetDistance(DIS_ORNAMENTSIZE)); 1003 Categories[7]->SetValue(1, rFormat.GetDistance(DIS_ORNAMENTSPACE)); 1004 Categories[8]->SetValue(0, rFormat.GetDistance(DIS_OPERATORSIZE)); 1005 Categories[8]->SetValue(1, rFormat.GetDistance(DIS_OPERATORSPACE)); 1006 Categories[9]->SetValue(0, rFormat.GetDistance(DIS_LEFTSPACE)); 1007 Categories[9]->SetValue(1, rFormat.GetDistance(DIS_RIGHTSPACE)); 1008 Categories[9]->SetValue(2, rFormat.GetDistance(DIS_TOPSPACE)); 1009 Categories[9]->SetValue(3, rFormat.GetDistance(DIS_BOTTOMSPACE)); 1010 1011 bScaleAllBrackets = rFormat.IsScaleNormalBrackets(); 1012 1013 // force update (even of category 0) by setting nActiveCategory to a 1014 // non-existent category number 1015 nActiveCategory = CATEGORY_NONE; 1016 SetCategory(0); 1017 } 1018 1019 1020 void SmDistanceDialog::WriteTo(SmFormat &rFormat) /*const*/ 1021 { 1022 // hmm... koennen die tatsaechlich unterschiedlich sein? 1023 // wenn nicht kann oben naemlich das const stehen! 1024 SetCategory(nActiveCategory); 1025 1026 rFormat.SetDistance( DIS_HORIZONTAL, Categories[0]->GetValue(0) ); 1027 rFormat.SetDistance( DIS_VERTICAL, Categories[0]->GetValue(1) ); 1028 rFormat.SetDistance( DIS_ROOT, Categories[0]->GetValue(2) ); 1029 rFormat.SetDistance( DIS_SUPERSCRIPT, Categories[1]->GetValue(0) ); 1030 rFormat.SetDistance( DIS_SUBSCRIPT, Categories[1]->GetValue(1) ); 1031 rFormat.SetDistance( DIS_NUMERATOR, Categories[2]->GetValue(0) ); 1032 rFormat.SetDistance( DIS_DENOMINATOR, Categories[2]->GetValue(1) ); 1033 rFormat.SetDistance( DIS_FRACTION, Categories[3]->GetValue(0) ); 1034 rFormat.SetDistance( DIS_STROKEWIDTH, Categories[3]->GetValue(1) ); 1035 rFormat.SetDistance( DIS_UPPERLIMIT, Categories[4]->GetValue(0) ); 1036 rFormat.SetDistance( DIS_LOWERLIMIT, Categories[4]->GetValue(1) ); 1037 rFormat.SetDistance( DIS_BRACKETSIZE, Categories[5]->GetValue(0) ); 1038 rFormat.SetDistance( DIS_BRACKETSPACE, Categories[5]->GetValue(1) ); 1039 rFormat.SetDistance( DIS_MATRIXROW, Categories[6]->GetValue(0) ); 1040 rFormat.SetDistance( DIS_MATRIXCOL, Categories[6]->GetValue(1) ); 1041 rFormat.SetDistance( DIS_ORNAMENTSIZE, Categories[7]->GetValue(0) ); 1042 rFormat.SetDistance( DIS_ORNAMENTSPACE, Categories[7]->GetValue(1) ); 1043 rFormat.SetDistance( DIS_OPERATORSIZE, Categories[8]->GetValue(0) ); 1044 rFormat.SetDistance( DIS_OPERATORSPACE, Categories[8]->GetValue(1) ); 1045 rFormat.SetDistance( DIS_LEFTSPACE, Categories[9]->GetValue(0) ); 1046 rFormat.SetDistance( DIS_RIGHTSPACE, Categories[9]->GetValue(1) ); 1047 rFormat.SetDistance( DIS_TOPSPACE, Categories[9]->GetValue(2) ); 1048 rFormat.SetDistance( DIS_BOTTOMSPACE, Categories[9]->GetValue(3) ); 1049 rFormat.SetDistance( DIS_NORMALBRACKETSIZE, Categories[5]->GetValue(3) ); 1050 1051 rFormat.SetScaleNormalBrackets( bScaleAllBrackets ); 1052 1053 rFormat.RequestApplyChanges(); 1054 } 1055 1056 1057 /**************************************************************************/ 1058 1059 1060 IMPL_LINK( SmAlignDialog, DefaultButtonClickHdl, Button *, EMPTYARG /*pButton*/ ) 1061 { 1062 QueryBox *pQueryBox = new QueryBox(this, SmResId(RID_DEFAULTSAVEQUERY)); 1063 1064 if (pQueryBox->Execute() == RET_YES) 1065 { 1066 SmModule *pp = SM_MOD(); 1067 SmFormat aFmt( pp->GetConfig()->GetStandardFormat() ); 1068 WriteTo( aFmt ); 1069 pp->GetConfig()->SetStandardFormat( aFmt ); 1070 } 1071 1072 delete pQueryBox; 1073 return 0; 1074 } 1075 1076 1077 SmAlignDialog::SmAlignDialog(Window * pParent, sal_Bool bFreeRes) 1078 : ModalDialog(pParent, SmResId(RID_ALIGNDIALOG)), 1079 aLeft (this, SmResId(1)), 1080 aCenter (this, SmResId(2)), 1081 aRight (this, SmResId(3)), 1082 aFixedLine1 (this, SmResId(1)), 1083 aOKButton1 (this, SmResId(1)), 1084 aCancelButton1 (this, SmResId(1)), 1085 aDefaultButton (this, SmResId(1)) 1086 { 1087 if (bFreeRes) 1088 FreeResource(); 1089 1090 aDefaultButton.SetClickHdl(LINK(this, SmAlignDialog, DefaultButtonClickHdl)); 1091 } 1092 1093 1094 void SmAlignDialog::ReadFrom(const SmFormat &rFormat) 1095 { 1096 switch (rFormat.GetHorAlign()) 1097 { 1098 case AlignLeft: 1099 aLeft .Check(sal_True); 1100 aCenter.Check(sal_False); 1101 aRight .Check(sal_False); 1102 break; 1103 1104 case AlignCenter: 1105 aLeft .Check(sal_False); 1106 aCenter.Check(sal_True); 1107 aRight .Check(sal_False); 1108 break; 1109 1110 case AlignRight: 1111 aLeft .Check(sal_False); 1112 aCenter.Check(sal_False); 1113 aRight .Check(sal_True); 1114 break; 1115 } 1116 } 1117 1118 1119 void SmAlignDialog::WriteTo(SmFormat &rFormat) const 1120 { 1121 if (aLeft.IsChecked()) 1122 rFormat.SetHorAlign(AlignLeft); 1123 else if (aRight.IsChecked()) 1124 rFormat.SetHorAlign(AlignRight); 1125 else 1126 rFormat.SetHorAlign(AlignCenter); 1127 1128 rFormat.RequestApplyChanges(); 1129 } 1130 1131 1132 /**************************************************************************/ 1133 1134 1135 void SmShowSymbolSet::Paint(const Rectangle&) 1136 { 1137 Push(PUSH_MAPMODE); 1138 1139 // MapUnit einstellen fuer die 'nLen' berechnet wurde 1140 SetMapMode(MapMode(MAP_PIXEL)); 1141 1142 sal_uInt16 v = sal::static_int_cast< sal_uInt16 >((aVScrollBar.GetThumbPos() * nColumns)); 1143 size_t nSymbols = aSymbolSet.size(); 1144 1145 Color aTxtColor( GetTextColor() ); 1146 for (sal_uInt16 i = v; i < nSymbols ; i++) 1147 { 1148 SmSym aSymbol (*aSymbolSet[i]); 1149 Font aFont (aSymbol.GetFace()); 1150 aFont.SetAlign(ALIGN_TOP); 1151 1152 // etwas kleinere FontSize nehmen (als nLen) um etwas Luft zu haben 1153 // (hoffentlich auch genug fuer links und rechts!) 1154 aFont.SetSize(Size(0, nLen - (nLen / 3))); 1155 SetFont(aFont); 1156 // keep text color 1157 SetTextColor( aTxtColor ); 1158 1159 int nIV = i - v; 1160 sal_UCS4 cChar = aSymbol.GetCharacter(); 1161 String aText( OUString( &cChar, 1 ) ); 1162 Size aSize( GetTextWidth( aText ), GetTextHeight()); 1163 1164 DrawText(Point((nIV % nColumns) * nLen + (nLen - aSize.Width()) / 2, 1165 (nIV / nColumns) * nLen + (nLen - aSize.Height()) / 2), 1166 aText); 1167 } 1168 1169 if (nSelectSymbol != SYMBOL_NONE) 1170 { 1171 Invert(Rectangle(Point(((nSelectSymbol - v) % nColumns) * nLen, 1172 ((nSelectSymbol - v) / nColumns) * nLen), 1173 Size(nLen, nLen))); 1174 } 1175 1176 Pop(); 1177 } 1178 1179 1180 void SmShowSymbolSet::MouseButtonDown(const MouseEvent& rMEvt) 1181 { 1182 GrabFocus(); 1183 1184 if (rMEvt.IsLeft() && Rectangle(Point(0, 0), aOutputSize).IsInside(rMEvt.GetPosPixel())) 1185 { 1186 long nPos = (rMEvt.GetPosPixel().Y() / nLen) * nColumns + (rMEvt.GetPosPixel().X() / nLen) + 1187 aVScrollBar.GetThumbPos() * nColumns; 1188 SelectSymbol( sal::static_int_cast< sal_uInt16 >(nPos) ); 1189 1190 aSelectHdlLink.Call(this); 1191 1192 if (rMEvt.GetClicks() > 1) aDblClickHdlLink.Call(this); 1193 } 1194 else Control::MouseButtonDown (rMEvt); 1195 } 1196 1197 1198 void SmShowSymbolSet::KeyInput(const KeyEvent& rKEvt) 1199 { 1200 sal_uInt16 n = nSelectSymbol; 1201 1202 if (n != SYMBOL_NONE) 1203 { 1204 switch (rKEvt.GetKeyCode().GetCode()) 1205 { 1206 case KEY_DOWN: n = n + nColumns; break; 1207 case KEY_UP: n = n - nColumns; break; 1208 case KEY_LEFT: n -= 1; break; 1209 case KEY_RIGHT: n += 1; break; 1210 case KEY_HOME: n = 0; break; 1211 case KEY_END: n = static_cast< sal_uInt16 >(aSymbolSet.size() - 1); break; 1212 case KEY_PAGEUP: n -= nColumns * nRows; break; 1213 case KEY_PAGEDOWN: n += nColumns * nRows; break; 1214 1215 default: 1216 Control::KeyInput(rKEvt); 1217 return; 1218 } 1219 } 1220 else 1221 n = 0; 1222 1223 if (n >= aSymbolSet.size()) 1224 n = nSelectSymbol; 1225 1226 // adjust scrollbar 1227 if ((n < (sal_uInt16) (aVScrollBar.GetThumbPos() * nColumns)) || 1228 (n >= (sal_uInt16) ((aVScrollBar.GetThumbPos() + nRows) * nColumns))) 1229 { 1230 aVScrollBar.SetThumbPos(n / nColumns); 1231 Invalidate(); 1232 Update(); 1233 } 1234 1235 SelectSymbol(n); 1236 aSelectHdlLink.Call(this); 1237 } 1238 1239 1240 SmShowSymbolSet::SmShowSymbolSet(Window *pParent, const ResId& rResId) : 1241 Control(pParent, rResId), 1242 aVScrollBar(this, WinBits(WB_VSCROLL)) 1243 { 1244 nSelectSymbol = SYMBOL_NONE; 1245 1246 aOutputSize = GetOutputSizePixel(); 1247 long nScrollBarWidth = aVScrollBar.GetSizePixel().Width(), 1248 nUseableWidth = aOutputSize.Width() - nScrollBarWidth; 1249 1250 // Hoehe von 16pt in Pixeln (passend zu 'aOutputSize') 1251 nLen = (sal_uInt16) LogicToPixel(Size(0, 16), MapMode(MAP_POINT)).Height(); 1252 1253 nColumns = sal::static_int_cast< sal_uInt16 >(nUseableWidth / nLen); 1254 if (nColumns > 2 && nColumns % 2 != 0) 1255 nColumns--; 1256 nRows = sal::static_int_cast< sal_uInt16 >(aOutputSize.Height() / nLen); 1257 #if OSL_DEBUG_LEVEL > 1 1258 DBG_ASSERT(nColumns > 0, "Sm : keine Spalten"); 1259 DBG_ASSERT(nRows > 0, "Sm : keine Zeilen"); 1260 #endif 1261 1262 // genau passend machen 1263 aOutputSize.Width() = nColumns * nLen; 1264 aOutputSize.Height() = nRows * nLen; 1265 1266 aVScrollBar.SetPosSizePixel(Point(aOutputSize.Width() + 1, -1), 1267 Size(nScrollBarWidth, aOutputSize.Height() + 2)); 1268 aVScrollBar.Enable(sal_False); 1269 aVScrollBar.Show(); 1270 aVScrollBar.SetScrollHdl(LINK(this, SmShowSymbolSet, ScrollHdl)); 1271 1272 Size WindowSize (aOutputSize); 1273 WindowSize.Width() += nScrollBarWidth; 1274 SetOutputSizePixel(WindowSize); 1275 1276 } 1277 1278 1279 void SmShowSymbolSet::SetSymbolSet(const SymbolPtrVec_t& rSymbolSet) 1280 { 1281 aSymbolSet = rSymbolSet; 1282 1283 if (static_cast< sal_uInt16 >(aSymbolSet.size()) > (nColumns * nRows)) 1284 { 1285 aVScrollBar.SetRange(Range(0, ((aSymbolSet.size() + (nColumns - 1)) / nColumns) - nRows)); 1286 aVScrollBar.Enable(sal_True); 1287 } 1288 else 1289 { 1290 aVScrollBar.SetRange(Range(0,0)); 1291 aVScrollBar.Enable (sal_False); 1292 } 1293 1294 Invalidate(); 1295 } 1296 1297 1298 void SmShowSymbolSet::SelectSymbol(sal_uInt16 nSymbol) 1299 { 1300 int v = (int) (aVScrollBar.GetThumbPos() * nColumns); 1301 1302 if (nSelectSymbol != SYMBOL_NONE) 1303 Invalidate(Rectangle(Point(((nSelectSymbol - v) % nColumns) * nLen, 1304 ((nSelectSymbol - v) / nColumns) * nLen), 1305 Size(nLen, nLen))); 1306 1307 if (nSymbol < aSymbolSet.size()) 1308 nSelectSymbol = nSymbol; 1309 1310 if (aSymbolSet.size() == 0) 1311 nSelectSymbol = SYMBOL_NONE; 1312 1313 if (nSelectSymbol != SYMBOL_NONE) 1314 Invalidate(Rectangle(Point(((nSelectSymbol - v) % nColumns) * nLen, 1315 ((nSelectSymbol - v) / nColumns) * nLen), 1316 Size(nLen, nLen))); 1317 1318 Update(); 1319 } 1320 1321 1322 IMPL_LINK( SmShowSymbolSet, ScrollHdl, ScrollBar*, EMPTYARG /*pScrollBar*/) 1323 { 1324 Invalidate(); 1325 return 0; 1326 } 1327 1328 //////////////////////////////////////////////////////////////////////////////// 1329 1330 void SmShowSymbol::Paint(const Rectangle &rRect) 1331 { 1332 Control::Paint( rRect ); 1333 1334 const XubString &rText = GetText(); 1335 Size aTextSize(GetTextWidth(rText), GetTextHeight()); 1336 1337 DrawText(Point((GetOutputSize().Width() - aTextSize.Width()) / 2, 1338 (GetOutputSize().Height() * 7/10)), rText); 1339 } 1340 1341 1342 void SmShowSymbol::MouseButtonDown(const MouseEvent& rMEvt) 1343 { 1344 if (rMEvt.GetClicks() > 1) 1345 aDblClickHdlLink.Call(this); 1346 else 1347 Control::MouseButtonDown (rMEvt); 1348 } 1349 1350 1351 void SmShowSymbol::SetSymbol(const SmSym *pSymbol) 1352 { 1353 if (pSymbol) 1354 { 1355 Font aFont (pSymbol->GetFace()); 1356 aFont.SetSize(Size(0, GetOutputSize().Height() - GetOutputSize().Height() / 3)); 1357 aFont.SetAlign(ALIGN_BASELINE); 1358 SetFont(aFont); 1359 1360 sal_UCS4 cChar = pSymbol->GetCharacter(); 1361 String aText( OUString( &cChar, 1 ) ); 1362 SetText( aText ); 1363 } 1364 1365 // 'Invalidate' fuellt den background mit der background-Farbe. 1366 // Falls der NULL pointer uebergeben wurde reicht dies also zum loeschen 1367 // der Anzeige 1368 Invalidate(); 1369 } 1370 1371 1372 //////////////////////////////////////////////////////////////////////////////// 1373 1374 void SmSymbolDialog::FillSymbolSets(sal_Bool bDeleteText) 1375 // fuellt die Eintraege der moeglichen 'SymbolsSet's im Dialog mit den 1376 // aktuellen Werten des SymbolSet Managers, selektiert aber keinen. 1377 { 1378 aSymbolSets.Clear(); 1379 if (bDeleteText) 1380 aSymbolSets.SetNoSelection(); 1381 1382 std::set< String > aSybolSetNames( rSymbolMgr.GetSymbolSetNames() ); 1383 std::set< String >::const_iterator aIt( aSybolSetNames.begin() ); 1384 for ( ; aIt != aSybolSetNames.end(); ++aIt) 1385 aSymbolSets.InsertEntry( *aIt ); 1386 } 1387 1388 1389 IMPL_LINK( SmSymbolDialog, SymbolSetChangeHdl, ListBox *, EMPTYARG pListBox ) 1390 { 1391 (void) pListBox; 1392 #if OSL_DEBUG_LEVEL > 1 1393 DBG_ASSERT(pListBox == &aSymbolSets, "Sm : falsches Argument"); 1394 #endif 1395 1396 SelectSymbolSet(aSymbolSets.GetSelectEntry()); 1397 return 0; 1398 } 1399 1400 1401 IMPL_LINK( SmSymbolDialog, SymbolChangeHdl, SmShowSymbolSet *, EMPTYARG pShowSymbolSet ) 1402 { 1403 (void) pShowSymbolSet; 1404 #if OSL_DEBUG_LEVEL > 1 1405 DBG_ASSERT(pShowSymbolSet == &aSymbolSetDisplay, "Sm : falsches Argument"); 1406 #endif 1407 1408 SelectSymbol(aSymbolSetDisplay.GetSelectSymbol()); 1409 return 0; 1410 } 1411 1412 IMPL_LINK( SmSymbolDialog, EditClickHdl, Button *, EMPTYARG pButton ) 1413 { 1414 (void) pButton; 1415 #if OSL_DEBUG_LEVEL > 1 1416 DBG_ASSERT(pButton == &aEditBtn, "Sm : falsches Argument"); 1417 #endif 1418 1419 SmSymDefineDialog *pDialog = new SmSymDefineDialog(this, pFontListDev, rSymbolMgr); 1420 1421 // aktuelles Symbol und SymbolSet am neuen Dialog setzen 1422 const XubString aSymSetName (aSymbolSets.GetSelectEntry()), 1423 aSymName (aSymbolName.GetText()); 1424 pDialog->SelectOldSymbolSet(aSymSetName); 1425 pDialog->SelectOldSymbol(aSymName); 1426 pDialog->SelectSymbolSet(aSymSetName); 1427 pDialog->SelectSymbol(aSymName); 1428 1429 // altes SymbolSet merken 1430 XubString aOldSymbolSet (aSymbolSets.GetSelectEntry()); 1431 1432 sal_uInt16 nSymPos = GetSelectedSymbol(); 1433 1434 // Dialog an evtl geaenderte Daten des SymbolSet Manager anpassen 1435 if (pDialog->Execute() == RET_OK && rSymbolMgr.IsModified()) 1436 { 1437 rSymbolMgr.Save(); 1438 FillSymbolSets(); 1439 } 1440 1441 // wenn das alte SymbolSet nicht mehr existiert zum ersten gehen 1442 // (soweit eines vorhanden ist) 1443 if (!SelectSymbolSet(aOldSymbolSet) && aSymbolSets.GetEntryCount() > 0) 1444 SelectSymbolSet(aSymbolSets.GetEntry(0)); 1445 else 1446 { 1447 // just update display of current symbol set 1448 DBG_ASSERT( aSymSetName == aSymSetName, "unexpected change in symbol set name" ); 1449 aSymbolSet = rSymbolMgr.GetSymbolSet( aSymbolSetName ); 1450 aSymbolSetDisplay.SetSymbolSet( aSymbolSet ); 1451 } 1452 1453 if (nSymPos >= aSymbolSet.size()) 1454 nSymPos = static_cast< sal_uInt16 >(aSymbolSet.size()) - 1; 1455 SelectSymbol( nSymPos ); 1456 1457 delete pDialog; 1458 return 0; 1459 } 1460 1461 1462 IMPL_LINK( SmSymbolDialog, SymbolDblClickHdl, SmShowSymbolSet *, EMPTYARG pShowSymbolSet ) 1463 { 1464 (void) pShowSymbolSet; 1465 #if OSL_DEBUG_LEVEL > 1 1466 DBG_ASSERT(pShowSymbolSet == &aSymbolSetDisplay, "Sm : falsches Argument"); 1467 #endif 1468 1469 GetClickHdl(&aGetBtn); 1470 EndDialog(RET_OK); 1471 return 0; 1472 } 1473 1474 1475 IMPL_LINK( SmSymbolDialog, GetClickHdl, Button *, EMPTYARG pButton ) 1476 { 1477 (void) pButton; 1478 #if OSL_DEBUG_LEVEL > 1 1479 DBG_ASSERT(pButton == &aGetBtn, "Sm : falscher Button"); 1480 #endif 1481 1482 const SmSym *pSym = GetSymbol(); 1483 if (pSym) 1484 { 1485 String aText ('%'); 1486 aText += pSym->GetName(); 1487 aText += (sal_Unicode)' '; 1488 1489 rViewSh.GetViewFrame()->GetDispatcher()->Execute( 1490 SID_INSERTTEXT, SFX_CALLMODE_STANDARD, 1491 new SfxStringItem(SID_INSERTTEXT, aText), 0L); 1492 } 1493 1494 return 0; 1495 } 1496 1497 1498 IMPL_LINK_INLINE_START( SmSymbolDialog, CloseClickHdl, Button *, EMPTYARG pButton ) 1499 { 1500 (void) pButton; 1501 #if OSL_DEBUG_LEVEL > 1 1502 DBG_ASSERT(pButton == &aCloseBtn, "Sm : falscher Button"); 1503 #endif 1504 1505 EndDialog(sal_True); 1506 return 0; 1507 } 1508 IMPL_LINK_INLINE_END( SmSymbolDialog, CloseClickHdl, Button *, pButton ) 1509 1510 1511 SmSymbolDialog::SmSymbolDialog(Window *pParent, OutputDevice *pFntListDevice, 1512 SmSymbolManager &rMgr, SmViewShell &rViewShell, sal_Bool bFreeRes) : 1513 ModalDialog (pParent, SmResId(RID_SYMBOLDIALOG)), 1514 aSymbolSetText (this, SmResId(1)), 1515 aSymbolSets (this, SmResId(1)), 1516 aSymbolSetDisplay (this, SmResId(1)), 1517 aSymbolName (this, SmResId(2)), 1518 aSymbolDisplay (this, SmResId(2)), 1519 aGetBtn (this, SmResId(2)), 1520 aCloseBtn (this, SmResId(3)), 1521 aEditBtn (this, SmResId(1)), 1522 rViewSh (rViewShell), 1523 rSymbolMgr (rMgr), 1524 pFontListDev (pFntListDevice) 1525 { 1526 if (bFreeRes) 1527 FreeResource(); 1528 1529 aSymbolSetName = String(); 1530 aSymbolSet.clear(); 1531 FillSymbolSets(); 1532 if (aSymbolSets.GetEntryCount() > 0) 1533 SelectSymbolSet(aSymbolSets.GetEntry(0)); 1534 1535 InitColor_Impl(); 1536 1537 // preview like controls should have a 2D look 1538 aSymbolDisplay.SetBorderStyle( WINDOW_BORDER_MONO ); 1539 1540 aSymbolSets .SetSelectHdl (LINK(this, SmSymbolDialog, SymbolSetChangeHdl)); 1541 aSymbolSetDisplay.SetSelectHdl (LINK(this, SmSymbolDialog, SymbolChangeHdl)); 1542 aSymbolSetDisplay.SetDblClickHdl(LINK(this, SmSymbolDialog, SymbolDblClickHdl)); 1543 aSymbolDisplay .SetDblClickHdl(LINK(this, SmSymbolDialog, SymbolDblClickHdl)); 1544 aCloseBtn .SetClickHdl (LINK(this, SmSymbolDialog, CloseClickHdl)); 1545 aEditBtn .SetClickHdl (LINK(this, SmSymbolDialog, EditClickHdl)); 1546 aGetBtn .SetClickHdl (LINK(this, SmSymbolDialog, GetClickHdl)); 1547 } 1548 1549 1550 SmSymbolDialog::~SmSymbolDialog() 1551 { 1552 } 1553 1554 1555 void SmSymbolDialog::InitColor_Impl() 1556 { 1557 #if OSL_DEBUG_LEVEL > 1 1558 Color aBC( GetDisplayBackground().GetColor() ); 1559 #endif 1560 ColorData nBgCol = COL_WHITE, 1561 nTxtCol = COL_BLACK; 1562 const StyleSettings &rS = GetSettings().GetStyleSettings(); 1563 if (rS.GetHighContrastMode()) 1564 { 1565 nBgCol = rS.GetFieldColor().GetColor(); 1566 nTxtCol = rS.GetFieldTextColor().GetColor(); 1567 } 1568 1569 Color aTmpColor( nBgCol ); 1570 Wallpaper aWall( aTmpColor ); 1571 Color aTxtColor( nTxtCol ); 1572 aSymbolDisplay .SetBackground( aWall ); 1573 aSymbolDisplay .SetTextColor( aTxtColor ); 1574 aSymbolSetDisplay.SetBackground( aWall ); 1575 aSymbolSetDisplay.SetTextColor( aTxtColor ); 1576 } 1577 1578 1579 void SmSymbolDialog::DataChanged( const DataChangedEvent& rDCEvt ) 1580 { 1581 if ( rDCEvt.GetType() == DATACHANGED_SETTINGS && 1582 (rDCEvt.GetFlags() & SETTINGS_STYLE) ) 1583 InitColor_Impl(); 1584 1585 ModalDialog::DataChanged( rDCEvt ); 1586 } 1587 1588 1589 sal_Bool SmSymbolDialog::SelectSymbolSet(const XubString &rSymbolSetName) 1590 { 1591 sal_Bool bRet = sal_False; 1592 sal_uInt16 nPos = aSymbolSets.GetEntryPos(rSymbolSetName); 1593 1594 aSymbolSetName = String(); 1595 aSymbolSet.clear(); 1596 if (nPos != LISTBOX_ENTRY_NOTFOUND) 1597 { 1598 aSymbolSets.SelectEntryPos(nPos); 1599 1600 aSymbolSetName = rSymbolSetName; 1601 aSymbolSet = rSymbolMgr.GetSymbolSet( aSymbolSetName ); 1602 1603 // sort symbols by Unicode position (useful for displaying Greek characters alphabetically) 1604 std::sort( aSymbolSet.begin(), aSymbolSet.end(), lt_SmSymPtr() ); 1605 1606 aSymbolSetDisplay.SetSymbolSet( aSymbolSet ); 1607 if (aSymbolSet.size() > 0) 1608 SelectSymbol(0); 1609 1610 bRet = sal_True; 1611 } 1612 else 1613 aSymbolSets.SetNoSelection(); 1614 1615 return bRet; 1616 } 1617 1618 1619 void SmSymbolDialog::SelectSymbol(sal_uInt16 nSymbolNo) 1620 { 1621 const SmSym *pSym = NULL; 1622 if (aSymbolSetName.Len() > 0 && nSymbolNo < static_cast< sal_uInt16 >(aSymbolSet.size())) 1623 pSym = aSymbolSet[ nSymbolNo ]; 1624 1625 aSymbolSetDisplay.SelectSymbol(nSymbolNo); 1626 aSymbolDisplay.SetSymbol(pSym); 1627 aSymbolName.SetText(pSym ? pSym->GetName() : XubString()); 1628 } 1629 1630 1631 const SmSym * SmSymbolDialog::GetSymbol() const 1632 { 1633 sal_uInt16 nSymbolNo = aSymbolSetDisplay.GetSelectSymbol(); 1634 bool bValid = aSymbolSetName.Len() > 0 && nSymbolNo < static_cast< sal_uInt16 >(aSymbolSet.size()); 1635 return bValid ? aSymbolSet[ nSymbolNo ] : NULL; 1636 } 1637 1638 1639 //////////////////////////////////////////////////////////////////////////////// 1640 1641 1642 void SmShowChar::Paint(const Rectangle &rRect) 1643 { 1644 Control::Paint( rRect ); 1645 1646 OUString aText( GetText() ); 1647 if (aText.getLength() > 0) 1648 { 1649 #if OSL_DEBUG_LEVEL > 1 1650 sal_Int32 nPos = 0; 1651 sal_UCS4 cChar = aText.iterateCodePoints( &nPos ); 1652 (void) cChar; 1653 #endif 1654 Size aTextSize(GetTextWidth(aText), GetTextHeight()); 1655 1656 DrawText(Point((GetOutputSize().Width() - aTextSize.Width()) / 2, 1657 (GetOutputSize().Height() * 7/10)), aText); 1658 } 1659 } 1660 1661 1662 void SmShowChar::SetSymbol( const SmSym *pSym ) 1663 { 1664 if (pSym) 1665 SetSymbol( pSym->GetCharacter(), pSym->GetFace() ); 1666 } 1667 1668 1669 void SmShowChar::SetSymbol( sal_UCS4 cChar, const Font &rFont ) 1670 { 1671 Font aFont( rFont ); 1672 aFont.SetSize( Size(0, GetOutputSize().Height() - GetOutputSize().Height() / 3) ); 1673 aFont.SetAlign(ALIGN_BASELINE); 1674 SetFont(aFont); 1675 1676 String aText( OUString( &cChar, 1) ); 1677 SetText( aText ); 1678 1679 Invalidate(); 1680 } 1681 1682 1683 //////////////////////////////////////////////////////////////////////////////// 1684 1685 void SmSymDefineDialog::FillSymbols(ComboBox &rComboBox, sal_Bool bDeleteText) 1686 { 1687 #if OSL_DEBUG_LEVEL > 1 1688 DBG_ASSERT(&rComboBox == &aOldSymbols || &rComboBox == &aSymbols, 1689 "Sm : falsche ComboBox"); 1690 #endif 1691 1692 rComboBox.Clear(); 1693 if (bDeleteText) 1694 rComboBox.SetText(XubString()); 1695 1696 ComboBox &rBox = &rComboBox == &aOldSymbols ? aOldSymbolSets : aSymbolSets; 1697 SymbolPtrVec_t aSymSet( aSymbolMgrCopy.GetSymbolSet( rBox.GetText() ) ); 1698 for (size_t i = 0; i < aSymSet.size(); ++i) 1699 rComboBox.InsertEntry( aSymSet[i]->GetName() ); 1700 } 1701 1702 1703 void SmSymDefineDialog::FillSymbolSets(ComboBox &rComboBox, sal_Bool bDeleteText) 1704 { 1705 #if OSL_DEBUG_LEVEL > 1 1706 DBG_ASSERT(&rComboBox == &aOldSymbolSets || &rComboBox == &aSymbolSets, 1707 "Sm : falsche ComboBox"); 1708 #endif 1709 1710 rComboBox.Clear(); 1711 if (bDeleteText) 1712 rComboBox.SetText(XubString()); 1713 1714 const std::set< String > aSymbolSetNames( aSymbolMgrCopy.GetSymbolSetNames() ); 1715 std::set< String >::const_iterator aIt( aSymbolSetNames.begin() ); 1716 for ( ; aIt != aSymbolSetNames.end(); ++aIt) 1717 rComboBox.InsertEntry( *aIt ); 1718 } 1719 1720 1721 void SmSymDefineDialog::FillFonts(sal_Bool bDelete) 1722 { 1723 aFonts.Clear(); 1724 if (bDelete) 1725 aFonts.SetNoSelection(); 1726 1727 // alle Fonts der 'FontList' in die Fontliste aufnehmen 1728 // von denen mit gleichen Namen jedoch nur einen (denn der Style wird 1729 // ueber die 'FontStyleBox' gewaehlt und nicht auch noch hier) 1730 if (pFontList) 1731 { 1732 sal_uInt16 nCount = pFontList->GetFontNameCount(); 1733 for (sal_uInt16 i = 0; i < nCount; i++) 1734 aFonts.InsertEntry( pFontList->GetFontName(i).GetName() ); 1735 } 1736 } 1737 1738 1739 void SmSymDefineDialog::FillStyles(sal_Bool bDeleteText) 1740 { 1741 aStyles.Clear(); 1742 if (bDeleteText) 1743 aStyles.SetText(XubString()); 1744 1745 XubString aText (aFonts.GetSelectEntry()); 1746 if (aText.Len() != 0) 1747 { 1748 //aStyles.Fill(aText, &aFontList); 1749 // eigene StyleName's verwenden 1750 const SmFontStyles &rStyles = GetFontStyles(); 1751 for (sal_uInt16 i = 0; i < rStyles.GetCount(); i++) 1752 aStyles.InsertEntry( rStyles.GetStyleName(i) ); 1753 1754 #if OSL_DEBUG_LEVEL > 1 1755 DBG_ASSERT(aStyles.GetEntryCount() > 0, "Sm : keine Styles vorhanden"); 1756 #endif 1757 aStyles.SetText( aStyles.GetEntry(0) ); 1758 } 1759 } 1760 1761 1762 SmSym * SmSymDefineDialog::GetSymbol(const ComboBox &rComboBox) 1763 { 1764 #if OSL_DEBUG_LEVEL > 1 1765 DBG_ASSERT(&rComboBox == &aOldSymbols || &rComboBox == &aSymbols, 1766 "Sm : falsche ComboBox"); 1767 #endif 1768 return aSymbolMgrCopy.GetSymbolByName(rComboBox.GetText()); 1769 } 1770 1771 1772 IMPL_LINK( SmSymDefineDialog, OldSymbolChangeHdl, ComboBox *, EMPTYARG pComboBox ) 1773 { 1774 (void) pComboBox; 1775 #if OSL_DEBUG_LEVEL > 1 1776 DBG_ASSERT(pComboBox == &aOldSymbols, "Sm : falsches Argument"); 1777 #endif 1778 SelectSymbol(aOldSymbols, aOldSymbols.GetText(), sal_False); 1779 return 0; 1780 } 1781 1782 1783 IMPL_LINK( SmSymDefineDialog, OldSymbolSetChangeHdl, ComboBox *, EMPTYARG pComboBox ) 1784 { 1785 (void) pComboBox; 1786 #if OSL_DEBUG_LEVEL > 1 1787 DBG_ASSERT(pComboBox == &aOldSymbolSets, "Sm : falsches Argument"); 1788 #endif 1789 SelectSymbolSet(aOldSymbolSets, aOldSymbolSets.GetText(), sal_False); 1790 return 0; 1791 } 1792 1793 1794 IMPL_LINK( SmSymDefineDialog, ModifyHdl, ComboBox *, pComboBox ) 1795 { 1796 // merken der Cursorposition zum wiederherstellen derselben 1797 Selection aSelection (pComboBox->GetSelection()); 1798 1799 if (pComboBox == &aSymbols) 1800 SelectSymbol(aSymbols, aSymbols.GetText(), sal_False); 1801 else if (pComboBox == &aSymbolSets) 1802 SelectSymbolSet(aSymbolSets, aSymbolSets.GetText(), sal_False); 1803 else if (pComboBox == &aOldSymbols) 1804 // nur Namen aus der Liste erlauben 1805 SelectSymbol(aOldSymbols, aOldSymbols.GetText(), sal_True); 1806 else if (pComboBox == &aOldSymbolSets) 1807 // nur Namen aus der Liste erlauben 1808 SelectSymbolSet(aOldSymbolSets, aOldSymbolSets.GetText(), sal_True); 1809 else if (pComboBox == &aStyles) 1810 // nur Namen aus der Liste erlauben (ist hier eh immer der Fall) 1811 SelectStyle(aStyles.GetText(), sal_True); 1812 else 1813 { 1814 #if OSL_DEBUG_LEVEL > 1 1815 DBG_ASSERT(0, "Sm : falsche ComboBox Argument"); 1816 #endif 1817 } 1818 1819 pComboBox->SetSelection(aSelection); 1820 1821 UpdateButtons(); 1822 1823 return 0; 1824 } 1825 1826 1827 IMPL_LINK( SmSymDefineDialog, FontChangeHdl, ListBox *, EMPTYARG pListBox ) 1828 { 1829 (void) pListBox; 1830 #if OSL_DEBUG_LEVEL > 1 1831 DBG_ASSERT(pListBox == &aFonts, "Sm : falsches Argument"); 1832 #endif 1833 1834 SelectFont(aFonts.GetSelectEntry()); 1835 return 0; 1836 } 1837 1838 1839 IMPL_LINK( SmSymDefineDialog, SubsetChangeHdl, ListBox *, EMPTYARG pListBox ) 1840 { 1841 (void) pListBox; 1842 sal_uInt16 nPos = aFontsSubsetLB.GetSelectEntryPos(); 1843 if (LISTBOX_ENTRY_NOTFOUND != nPos) 1844 { 1845 const Subset* pSubset = reinterpret_cast<const Subset*> (aFontsSubsetLB.GetEntryData( nPos )); 1846 if (pSubset) 1847 { 1848 aCharsetDisplay.SelectCharacter( pSubset->GetRangeMin() ); 1849 } 1850 } 1851 return 0; 1852 } 1853 1854 1855 IMPL_LINK( SmSymDefineDialog, StyleChangeHdl, ComboBox *, EMPTYARG pComboBox ) 1856 { 1857 (void) pComboBox; 1858 #if OSL_DEBUG_LEVEL > 1 1859 DBG_ASSERT(pComboBox == &aStyles, "Sm : falsches Argument"); 1860 #endif 1861 1862 SelectStyle(aStyles.GetText()); 1863 return 0; 1864 } 1865 1866 1867 IMPL_LINK( SmSymDefineDialog, CharHighlightHdl, Control *, EMPTYARG ) 1868 { 1869 sal_UCS4 cChar = aCharsetDisplay.GetSelectCharacter(); 1870 1871 #if OSL_DEBUG_LEVEL > 1 1872 DBG_ASSERT( pSubsetMap, "SubsetMap missing" ); 1873 #endif 1874 if (pSubsetMap) 1875 { 1876 const Subset* pSubset = pSubsetMap->GetSubsetByUnicode( cChar ); 1877 if (pSubset) 1878 aFontsSubsetLB.SelectEntry( pSubset->GetName() ); 1879 else 1880 aFontsSubsetLB.SetNoSelection(); 1881 } 1882 1883 aSymbolDisplay.SetSymbol( cChar, aCharsetDisplay.GetFont() ); 1884 1885 UpdateButtons(); 1886 1887 // display Unicode position as symbol name while iterating over characters 1888 const String aHex( String::CreateFromInt64( cChar, 16 ).ToUpperAscii() ); 1889 const String aPattern( A2OU( aHex.Len() > 4 ? "Ux000000" : "Ux0000" ) ); 1890 String aUnicodePos( aPattern.Copy( 0, aPattern.Len() - aHex.Len() ) ); 1891 aUnicodePos += aHex; 1892 aSymbols.SetText( aUnicodePos ); 1893 aSymbolName.SetText( aUnicodePos ); 1894 1895 return 0; 1896 } 1897 1898 1899 IMPL_LINK( SmSymDefineDialog, AddClickHdl, Button *, EMPTYARG pButton ) 1900 { 1901 (void) pButton; 1902 #if OSL_DEBUG_LEVEL > 1 1903 DBG_ASSERT(pButton == &aAddBtn, "Sm : falsches Argument"); 1904 DBG_ASSERT(aAddBtn.IsEnabled(), "Sm : Voraussetzungen erfuellt ??"); 1905 #endif 1906 1907 // add symbol 1908 const SmSym aNewSymbol( aSymbols.GetText(), aCharsetDisplay.GetFont(), 1909 aCharsetDisplay.GetSelectCharacter(), aSymbolSets.GetText() ); 1910 //DBG_ASSERT( aSymbolMgrCopy.GetSymbolByName(aTmpSymbolName) == NULL, "symbol already exists" ); 1911 aSymbolMgrCopy.AddOrReplaceSymbol( aNewSymbol ); 1912 1913 // update display of new symbol 1914 aSymbolDisplay.SetSymbol( &aNewSymbol ); 1915 aSymbolName.SetText( aNewSymbol.GetName() ); 1916 aSymbolSetName.SetText( aNewSymbol.GetSymbolSetName() ); 1917 1918 // update list box entries 1919 FillSymbolSets(aOldSymbolSets, sal_False); 1920 FillSymbolSets(aSymbolSets, sal_False); 1921 FillSymbols(aOldSymbols ,sal_False); 1922 FillSymbols(aSymbols ,sal_False); 1923 1924 UpdateButtons(); 1925 1926 return 0; 1927 } 1928 1929 1930 IMPL_LINK( SmSymDefineDialog, ChangeClickHdl, Button *, EMPTYARG pButton ) 1931 { 1932 (void) pButton; 1933 #if OSL_DEBUG_LEVEL > 1 1934 DBG_ASSERT(pButton == &aChangeBtn, "Sm : falsches Argument"); 1935 DBG_ASSERT(aChangeBtn.IsEnabled(), "Sm : Voraussetzungen erfuellt ??"); 1936 #endif 1937 1938 // get new Sybol to use 1939 //! get font from symbol-disp lay since charset-display does not keep 1940 //! the bold attribut. 1941 const SmSym aNewSymbol( aSymbols.GetText(), aCharsetDisplay.GetFont(), 1942 aCharsetDisplay.GetSelectCharacter(), aSymbolSets.GetText() ); 1943 1944 // remove old symbol if the name was changed then add new one 1945 // const bool bSetNameChanged = aOldSymbolSets.GetText() != aSymbolSets.GetText(); 1946 const bool bNameChanged = aOldSymbols.GetText() != aSymbols.GetText(); 1947 if (bNameChanged) 1948 aSymbolMgrCopy.RemoveSymbol( aOldSymbols.GetText() ); 1949 aSymbolMgrCopy.AddOrReplaceSymbol( aNewSymbol, true ); 1950 1951 // clear display for original symbol if necessary 1952 if (bNameChanged) 1953 SetOrigSymbol(NULL, XubString()); 1954 1955 // update display of new symbol 1956 aSymbolDisplay.SetSymbol( &aNewSymbol ); 1957 aSymbolName.SetText( aNewSymbol.GetName() ); 1958 aSymbolSetName.SetText( aNewSymbol.GetSymbolSetName() ); 1959 1960 // update list box entries 1961 FillSymbolSets(aOldSymbolSets, sal_False); 1962 FillSymbolSets(aSymbolSets, sal_False); 1963 FillSymbols(aOldSymbols ,sal_False); 1964 FillSymbols(aSymbols ,sal_False); 1965 1966 UpdateButtons(); 1967 1968 return 0; 1969 } 1970 1971 1972 IMPL_LINK( SmSymDefineDialog, DeleteClickHdl, Button *, EMPTYARG pButton ) 1973 { 1974 (void) pButton; 1975 #if OSL_DEBUG_LEVEL > 1 1976 DBG_ASSERT(pButton == &aDeleteBtn, "Sm : falsches Argument"); 1977 DBG_ASSERT(aDeleteBtn.IsEnabled(), "Sm : Voraussetzungen erfuellt ??"); 1978 #endif 1979 1980 if (pOrigSymbol) 1981 { 1982 aSymbolMgrCopy.RemoveSymbol( pOrigSymbol->GetName() ); 1983 1984 // clear display for original symbol 1985 SetOrigSymbol(NULL, XubString()); 1986 1987 // update list box entries 1988 FillSymbolSets(aOldSymbolSets, sal_False); 1989 FillSymbolSets(aSymbolSets, sal_False); 1990 FillSymbols(aOldSymbols ,sal_False); 1991 FillSymbols(aSymbols ,sal_False); 1992 } 1993 1994 UpdateButtons(); 1995 1996 return 0; 1997 } 1998 1999 2000 void SmSymDefineDialog::UpdateButtons() 2001 { 2002 sal_Bool bAdd = sal_False, 2003 bChange = sal_False, 2004 bDelete = sal_False, 2005 bEqual; 2006 XubString aTmpSymbolName (aSymbols.GetText()), 2007 aTmpSymbolSetName (aSymbolSets.GetText()); 2008 2009 if (aTmpSymbolName.Len() > 0 && aTmpSymbolSetName.Len() > 0) 2010 { 2011 // alle Einstellungen gleich? 2012 //! (Font-, Style- und SymbolSet Name werden nicht case sensitiv verglichen) 2013 bEqual = pOrigSymbol 2014 && aTmpSymbolSetName.EqualsIgnoreCaseAscii(aOldSymbolSetName.GetText()) 2015 && aTmpSymbolName.Equals(pOrigSymbol->GetName()) 2016 && aFonts.GetSelectEntry().EqualsIgnoreCaseAscii( 2017 pOrigSymbol->GetFace().GetName()) 2018 && aStyles.GetText().EqualsIgnoreCaseAscii( 2019 GetFontStyles().GetStyleName(pOrigSymbol->GetFace())) 2020 && aCharsetDisplay.GetSelectCharacter() == pOrigSymbol->GetCharacter(); 2021 2022 // hinzufuegen nur wenn es noch kein Symbol desgleichen Namens gibt 2023 bAdd = aSymbolMgrCopy.GetSymbolByName(aTmpSymbolName) == NULL; 2024 2025 // loeschen nur wenn alle Einstellungen gleich sind 2026 bDelete = pOrigSymbol != NULL; 2027 2028 // aendern wenn bei gleichem Namen mindestens eine Einstellung anders ist 2029 // oder wenn es noch kein Symbol des neuen Namens gibt (wuerde implizites 2030 // loeschen des bereits vorhandenen Symbols erfordern) 2031 // sal_Bool bEqualName = pOrigSymbol && aTmpSymbolName == pOrigSymbol->GetName(); 2032 // bChange = pOrigSymbol && ( (bEqualName && !bEqual) || (!bEqualName && bAdd) ); 2033 2034 // aendern nur falls altes Symbol vorhanden und am neuen etwas anders ist 2035 bChange = pOrigSymbol && !bEqual; 2036 } 2037 2038 aAddBtn .Enable(bAdd); 2039 aChangeBtn.Enable(bChange); 2040 aDeleteBtn.Enable(bDelete); 2041 } 2042 2043 2044 SmSymDefineDialog::SmSymDefineDialog(Window * pParent, 2045 OutputDevice *pFntListDevice, SmSymbolManager &rMgr, sal_Bool bFreeRes) : 2046 ModalDialog (pParent, SmResId(RID_SYMDEFINEDIALOG)), 2047 aOldSymbolText (this, SmResId(1)), 2048 aOldSymbols (this, SmResId(1)), 2049 aOldSymbolSetText (this, SmResId(2)), 2050 aOldSymbolSets (this, SmResId(2)), 2051 aCharsetDisplay (this, SmResId(1)), 2052 aSymbolText (this, SmResId(9)), 2053 aSymbols (this, SmResId(4)), 2054 aSymbolSetText (this, SmResId(10)), 2055 aSymbolSets (this, SmResId(5)), 2056 aFontText (this, SmResId(3)), 2057 aFonts (this, SmResId(1)), 2058 aFontsSubsetFT (this, SmResId( FT_FONTS_SUBSET )), 2059 aFontsSubsetLB (this, SmResId( LB_FONTS_SUBSET )), 2060 aStyleText (this, SmResId(4)), 2061 aStyles (this, SmResId(3)), 2062 aOldSymbolName (this, SmResId(7)), 2063 aOldSymbolDisplay (this, SmResId(3)), 2064 aOldSymbolSetName (this, SmResId(8)), 2065 aSymbolName (this, SmResId(5)), 2066 aSymbolDisplay (this, SmResId(2)), 2067 aSymbolSetName (this, SmResId(6)), 2068 aOkBtn (this, SmResId(1)), 2069 aCancelBtn (this, SmResId(1)), 2070 aAddBtn (this, SmResId(1)), 2071 aChangeBtn (this, SmResId(2)), 2072 aDeleteBtn (this, SmResId(3)), 2073 aRightArrow (this, SmResId(1)), 2074 aRigthArrow_Im (SmResId(1)), 2075 aRigthArrow_Im_HC (SmResId(2)), // hi-contrast version 2076 rSymbolMgr (rMgr), 2077 pSubsetMap (NULL), 2078 pFontList (NULL) 2079 { 2080 if (bFreeRes) 2081 FreeResource(); 2082 2083 pFontList = new FontList( pFntListDevice ); 2084 2085 pOrigSymbol = 0; 2086 2087 // auto completion is troublesome since that symbols character also gets automatically selected in the 2088 // display and if the user previously selected a character to define/redefine that one this is bad 2089 aOldSymbols.EnableAutocomplete( sal_False, sal_True ); 2090 aSymbols .EnableAutocomplete( sal_False, sal_True ); 2091 2092 FillFonts(); 2093 if (aFonts.GetEntryCount() > 0) 2094 SelectFont(aFonts.GetEntry(0)); 2095 2096 InitColor_Impl(); 2097 2098 SetSymbolSetManager(rSymbolMgr); 2099 2100 aOldSymbols .SetSelectHdl(LINK(this, SmSymDefineDialog, OldSymbolChangeHdl)); 2101 aOldSymbolSets .SetSelectHdl(LINK(this, SmSymDefineDialog, OldSymbolSetChangeHdl)); 2102 aSymbolSets .SetModifyHdl(LINK(this, SmSymDefineDialog, ModifyHdl)); 2103 aOldSymbolSets .SetModifyHdl(LINK(this, SmSymDefineDialog, ModifyHdl)); 2104 aSymbols .SetModifyHdl(LINK(this, SmSymDefineDialog, ModifyHdl)); 2105 aOldSymbols .SetModifyHdl(LINK(this, SmSymDefineDialog, ModifyHdl)); 2106 aStyles .SetModifyHdl(LINK(this, SmSymDefineDialog, ModifyHdl)); 2107 aFonts .SetSelectHdl(LINK(this, SmSymDefineDialog, FontChangeHdl)); 2108 aFontsSubsetLB .SetSelectHdl(LINK(this, SmSymDefineDialog, SubsetChangeHdl)); 2109 aStyles .SetSelectHdl(LINK(this, SmSymDefineDialog, StyleChangeHdl)); 2110 aAddBtn .SetClickHdl (LINK(this, SmSymDefineDialog, AddClickHdl)); 2111 aChangeBtn .SetClickHdl (LINK(this, SmSymDefineDialog, ChangeClickHdl)); 2112 aDeleteBtn .SetClickHdl (LINK(this, SmSymDefineDialog, DeleteClickHdl)); 2113 aCharsetDisplay.SetHighlightHdl( LINK( this, SmSymDefineDialog, CharHighlightHdl ) ); 2114 2115 // preview like controls should have a 2D look 2116 aOldSymbolDisplay.SetBorderStyle( WINDOW_BORDER_MONO ); 2117 aSymbolDisplay .SetBorderStyle( WINDOW_BORDER_MONO ); 2118 } 2119 2120 2121 SmSymDefineDialog::~SmSymDefineDialog() 2122 { 2123 delete pSubsetMap; 2124 delete pOrigSymbol; 2125 } 2126 2127 void SmSymDefineDialog::InitColor_Impl() 2128 { 2129 #if OSL_DEBUG_LEVEL > 1 2130 Color aBC( GetDisplayBackground().GetColor() ); 2131 #endif 2132 ColorData nBgCol = COL_WHITE, 2133 nTxtCol = COL_BLACK; 2134 sal_Bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode(); 2135 if (bHighContrast) 2136 { 2137 const StyleSettings &rS = GetSettings().GetStyleSettings(); 2138 nBgCol = rS.GetFieldColor().GetColor(); 2139 nTxtCol = rS.GetFieldTextColor().GetColor(); 2140 } 2141 2142 Color aTmpColor( nBgCol ); 2143 Wallpaper aWall( aTmpColor ); 2144 Color aTxtColor( nTxtCol ); 2145 aCharsetDisplay .SetBackground( aWall ); 2146 aCharsetDisplay .SetTextColor( aTxtColor ); 2147 aOldSymbolDisplay.SetBackground( aWall ); 2148 aOldSymbolDisplay.SetTextColor( aTxtColor ); 2149 aSymbolDisplay .SetBackground( aWall ); 2150 aSymbolDisplay .SetTextColor( aTxtColor ); 2151 2152 const Image &rArrowRight = bHighContrast ? aRigthArrow_Im_HC : aRigthArrow_Im; 2153 aRightArrow.SetImage( rArrowRight ); 2154 } 2155 2156 2157 void SmSymDefineDialog::DataChanged( const DataChangedEvent& rDCEvt ) 2158 { 2159 if ( rDCEvt.GetType() == DATACHANGED_SETTINGS && 2160 (rDCEvt.GetFlags() & SETTINGS_STYLE) ) 2161 InitColor_Impl(); 2162 2163 ModalDialog::DataChanged( rDCEvt ); 2164 } 2165 2166 2167 short SmSymDefineDialog::Execute() 2168 { 2169 short nResult = ModalDialog::Execute(); 2170 2171 // Aenderungen uebernehmen falls Dialog mit OK beendet wurde 2172 if (aSymbolMgrCopy.IsModified() && nResult == RET_OK) 2173 rSymbolMgr = aSymbolMgrCopy; 2174 2175 return nResult; 2176 } 2177 2178 2179 void SmSymDefineDialog::SetSymbolSetManager(const SmSymbolManager &rMgr) 2180 { 2181 aSymbolMgrCopy = rMgr; 2182 #ifdef DEBUG 2183 // sal_uInt16 nS = aSymbolMgrCopy.GetSymbolSetCount(); 2184 #endif 2185 2186 // Das modified Flag der Kopie auf sal_False setzen, damit man spaeter damit 2187 // testen kann ob sich was geaendert hat. 2188 aSymbolMgrCopy.SetModified(sal_False); 2189 2190 FillSymbolSets(aOldSymbolSets); 2191 if (aOldSymbolSets.GetEntryCount() > 0) 2192 SelectSymbolSet(aOldSymbolSets.GetEntry(0)); 2193 FillSymbolSets(aSymbolSets); 2194 if (aSymbolSets.GetEntryCount() > 0) 2195 SelectSymbolSet(aSymbolSets.GetEntry(0)); 2196 FillSymbols(aOldSymbols); 2197 if (aOldSymbols.GetEntryCount() > 0) 2198 SelectSymbol(aOldSymbols.GetEntry(0)); 2199 FillSymbols(aSymbols); 2200 if (aSymbols.GetEntryCount() > 0) 2201 SelectSymbol(aSymbols.GetEntry(0)); 2202 2203 UpdateButtons(); 2204 } 2205 2206 2207 sal_Bool SmSymDefineDialog::SelectSymbolSet(ComboBox &rComboBox, 2208 const XubString &rSymbolSetName, sal_Bool bDeleteText) 2209 { 2210 #if OSL_DEBUG_LEVEL > 1 2211 DBG_ASSERT(&rComboBox == &aOldSymbolSets || &rComboBox == &aSymbolSets, 2212 "Sm : falsche ComboBox"); 2213 #endif 2214 2215 // 'Normalisieren' des SymbolNamens (ohne leading und trailing Leerzeichen) 2216 XubString aNormName (rSymbolSetName); 2217 aNormName.EraseLeadingChars(' '); 2218 aNormName.EraseTrailingChars(' '); 2219 // und evtl Abweichungen in der Eingabe beseitigen 2220 rComboBox.SetText(aNormName); 2221 2222 sal_Bool bRet = sal_False; 2223 sal_uInt16 nPos = rComboBox.GetEntryPos(aNormName); 2224 2225 if (nPos != COMBOBOX_ENTRY_NOTFOUND) 2226 { 2227 rComboBox.SetText(rComboBox.GetEntry(nPos)); 2228 bRet = sal_True; 2229 } 2230 else if (bDeleteText) 2231 rComboBox.SetText(XubString()); 2232 2233 sal_Bool bIsOld = &rComboBox == &aOldSymbolSets; 2234 2235 // setzen des SymbolSet Namens an der zugehoerigen Darstellung 2236 FixedText &rFT = bIsOld ? aOldSymbolSetName : aSymbolSetName; 2237 rFT.SetText(rComboBox.GetText()); 2238 2239 // setzen der zum SymbolSet gehoerenden Symbol Namen an der zugehoerigen 2240 // Auswahbox 2241 ComboBox &rCB = bIsOld ? aOldSymbols : aSymbols; 2242 FillSymbols(rCB, sal_False); 2243 2244 // bei Wechsel des SymbolSets fuer das alte Zeichen ein gueltiges 2245 // Symbol bzw keins zur Anzeige bringen 2246 if (bIsOld) 2247 { 2248 XubString aTmpOldSymbolName; 2249 if (aOldSymbols.GetEntryCount() > 0) 2250 aTmpOldSymbolName = aOldSymbols.GetEntry(0); 2251 SelectSymbol(aOldSymbols, aTmpOldSymbolName, sal_True); 2252 } 2253 2254 UpdateButtons(); 2255 2256 return bRet; 2257 } 2258 2259 2260 void SmSymDefineDialog::SetOrigSymbol(const SmSym *pSymbol, 2261 const XubString &rSymbolSetName) 2262 { 2263 // clear old symbol 2264 delete pOrigSymbol; 2265 pOrigSymbol = 0; 2266 2267 XubString aSymName, 2268 aSymSetName; 2269 if (pSymbol) 2270 { 2271 // set new symbol 2272 pOrigSymbol = new SmSym( *pSymbol ); 2273 2274 aSymName = pSymbol->GetName(); 2275 aSymSetName = rSymbolSetName; 2276 aOldSymbolDisplay.SetSymbol( pSymbol ); 2277 } 2278 else 2279 { // loeschen des angezeigten Symbols 2280 aOldSymbolDisplay.SetText(XubString()); 2281 aOldSymbolDisplay.Invalidate(); 2282 } 2283 aOldSymbolName .SetText(aSymName); 2284 aOldSymbolSetName.SetText(aSymSetName); 2285 } 2286 2287 2288 sal_Bool SmSymDefineDialog::SelectSymbol(ComboBox &rComboBox, 2289 const XubString &rSymbolName, sal_Bool bDeleteText) 2290 { 2291 #if OSL_DEBUG_LEVEL > 1 2292 DBG_ASSERT(&rComboBox == &aOldSymbols || &rComboBox == &aSymbols, 2293 "Sm : falsche ComboBox"); 2294 #endif 2295 2296 // 'Normalisieren' des SymbolNamens (ohne Leerzeichen) 2297 XubString aNormName (rSymbolName); 2298 aNormName.EraseAllChars(' '); 2299 // und evtl Abweichungen in der Eingabe beseitigen 2300 rComboBox.SetText(aNormName); 2301 2302 sal_Bool bRet = sal_False; 2303 sal_uInt16 nPos = rComboBox.GetEntryPos(aNormName); 2304 2305 sal_Bool bIsOld = &rComboBox == &aOldSymbols; 2306 2307 if (nPos != COMBOBOX_ENTRY_NOTFOUND) 2308 { 2309 rComboBox.SetText(rComboBox.GetEntry(nPos)); 2310 2311 if (!bIsOld) 2312 { 2313 const SmSym *pSymbol = GetSymbol(aSymbols); 2314 if (pSymbol) 2315 { 2316 // Font und Style entsprechend waehlen 2317 const Font &rFont = pSymbol->GetFace(); 2318 SelectFont(rFont.GetName(), sal_False); 2319 SelectStyle(GetFontStyles().GetStyleName(rFont), sal_False); 2320 2321 // da das setzen des Fonts ueber den Style Namen des SymbolsFonts nicht 2322 // so gut klappt (er kann zB leer sein obwohl der Font selbst 'bold' und 2323 // 'italic' ist!). Setzen wir hier den Font wie er zum Symbol gehoert 2324 // zu Fuss. 2325 aCharsetDisplay.SetFont(rFont); 2326 aSymbolDisplay.SetFont(rFont); 2327 2328 // das zugehoerige Zeichen auswaehlen 2329 SelectChar(pSymbol->GetCharacter()); 2330 2331 // since SelectChar will also set the unicode point as text in the 2332 // symbols box, we have to set the symbol name again to get that one displayed 2333 aSymbols.SetText( pSymbol->GetName() ); 2334 } 2335 } 2336 2337 bRet = sal_True; 2338 } 2339 else if (bDeleteText) 2340 rComboBox.SetText(XubString()); 2341 2342 if (bIsOld) 2343 { 2344 // bei Wechsel des alten Symbols nur vorhandene anzeigen sonst keins 2345 const SmSym *pOldSymbol = NULL; 2346 XubString aTmpOldSymbolSetName; 2347 if (nPos != COMBOBOX_ENTRY_NOTFOUND) 2348 { 2349 pOldSymbol = aSymbolMgrCopy.GetSymbolByName(aNormName); 2350 aTmpOldSymbolSetName = aOldSymbolSets.GetText(); 2351 } 2352 SetOrigSymbol(pOldSymbol, aTmpOldSymbolSetName); 2353 } 2354 else 2355 aSymbolName.SetText(rComboBox.GetText()); 2356 2357 UpdateButtons(); 2358 2359 return bRet; 2360 } 2361 2362 2363 void SmSymDefineDialog::SetFont(const XubString &rFontName, const XubString &rStyleName) 2364 { 2365 // Font (FontInfo) passend zu Namen und Style holen 2366 FontInfo aFI; 2367 if (pFontList) 2368 aFI = pFontList->Get(rFontName, WEIGHT_NORMAL, ITALIC_NONE); 2369 SetFontStyle(rStyleName, aFI); 2370 2371 aCharsetDisplay.SetFont(aFI); 2372 aSymbolDisplay.SetFont(aFI); 2373 2374 // update subset listbox for new font's unicode subsets 2375 FontCharMap aFontCharMap; 2376 aCharsetDisplay.GetFontCharMap( aFontCharMap ); 2377 if (pSubsetMap) 2378 delete pSubsetMap; 2379 pSubsetMap = new SubsetMap( &aFontCharMap ); 2380 // 2381 aFontsSubsetLB.Clear(); 2382 bool bFirst = true; 2383 const Subset* pSubset; 2384 while( NULL != (pSubset = pSubsetMap->GetNextSubset( bFirst )) ) 2385 { 2386 sal_uInt16 nPos = aFontsSubsetLB.InsertEntry( pSubset->GetName()); 2387 aFontsSubsetLB.SetEntryData( nPos, (void *) pSubset ); 2388 // subset must live at least as long as the selected font !!! 2389 if( bFirst ) 2390 aFontsSubsetLB.SelectEntryPos( nPos ); 2391 bFirst = false; 2392 } 2393 if( bFirst ) 2394 aFontsSubsetLB.SetNoSelection(); 2395 aFontsSubsetLB.Enable( !bFirst ); 2396 } 2397 2398 2399 sal_Bool SmSymDefineDialog::SelectFont(const XubString &rFontName, sal_Bool bApplyFont) 2400 { 2401 sal_Bool bRet = sal_False; 2402 sal_uInt16 nPos = aFonts.GetEntryPos(rFontName); 2403 2404 if (nPos != LISTBOX_ENTRY_NOTFOUND) 2405 { 2406 aFonts.SelectEntryPos(nPos); 2407 if (aStyles.GetEntryCount() > 0) 2408 SelectStyle(aStyles.GetEntry(0)); 2409 if (bApplyFont) 2410 { 2411 SetFont(aFonts.GetSelectEntry(), aStyles.GetText()); 2412 // update preview to use new font 2413 aSymbolDisplay.SetSymbol( aCharsetDisplay.GetSelectCharacter(), aCharsetDisplay.GetFont() ); 2414 } 2415 bRet = sal_True; 2416 } 2417 else 2418 aFonts.SetNoSelection(); 2419 FillStyles(); 2420 2421 UpdateButtons(); 2422 2423 return bRet; 2424 } 2425 2426 2427 sal_Bool SmSymDefineDialog::SelectStyle(const XubString &rStyleName, sal_Bool bApplyFont) 2428 { 2429 sal_Bool bRet = sal_False; 2430 sal_uInt16 nPos = aStyles.GetEntryPos(rStyleName); 2431 2432 // falls der Style nicht zur Auswahl steht nehmen wir den erst moeglichen 2433 // (sofern vorhanden) 2434 if (nPos == COMBOBOX_ENTRY_NOTFOUND && aStyles.GetEntryCount() > 0) 2435 nPos = 0; 2436 2437 if (nPos != COMBOBOX_ENTRY_NOTFOUND) 2438 { 2439 aStyles.SetText(aStyles.GetEntry(nPos)); 2440 if (bApplyFont) 2441 { 2442 SetFont(aFonts.GetSelectEntry(), aStyles.GetText()); 2443 // update preview to use new font 2444 aSymbolDisplay.SetSymbol( aCharsetDisplay.GetSelectCharacter(), aCharsetDisplay.GetFont() ); 2445 } 2446 bRet = sal_True; 2447 } 2448 else 2449 aStyles.SetText(XubString()); 2450 2451 UpdateButtons(); 2452 2453 return bRet; 2454 } 2455 2456 2457 void SmSymDefineDialog::SelectChar(xub_Unicode cChar) 2458 { 2459 aCharsetDisplay.SelectCharacter( cChar ); 2460 aSymbolDisplay.SetSymbol( cChar, aCharsetDisplay.GetFont() ); 2461 2462 UpdateButtons(); 2463 } 2464 2465 2466 /**************************************************************************/ 2467 2468