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 #pragma once 21 22 #include <sfx2/tabdlg.hxx> 23 #include <vcl/outdev.hxx> 24 #include <vcl/customweld.hxx> 25 #include "symbol.hxx" 26 27 class SubsetMap; 28 class SmFormat; 29 class FontList; 30 class SvxShowCharSet; 31 32 #define CATEGORY_NONE 0xFFFF 33 34 /**************************************************************************/ 35 36 void SetFontStyle(std::u16string_view rStyleName, vcl::Font &rFont); 37 38 /**************************************************************************/ 39 40 class SmPrintOptionsTabPage final : public SfxTabPage 41 { 42 std::unique_ptr<weld::CheckButton> m_xTitle; 43 std::unique_ptr<weld::CheckButton> m_xText; 44 std::unique_ptr<weld::CheckButton> m_xFrame; 45 std::unique_ptr<weld::RadioButton> m_xSizeNormal; 46 std::unique_ptr<weld::RadioButton> m_xSizeScaled; 47 std::unique_ptr<weld::RadioButton> m_xSizeZoomed; 48 std::unique_ptr<weld::MetricSpinButton> m_xZoom; 49 std::unique_ptr<weld::CheckButton> m_xNoRightSpaces; 50 std::unique_ptr<weld::CheckButton> m_xSaveOnlyUsedSymbols; 51 std::unique_ptr<weld::CheckButton> m_xAutoCloseBrackets; 52 std::unique_ptr<weld::MetricSpinButton> m_xSmZoom; 53 54 DECL_LINK(SizeButtonClickHdl, weld::Toggleable&, void); 55 56 virtual bool FillItemSet(SfxItemSet* rSet) override; 57 virtual void Reset(const SfxItemSet* rSet) override; 58 59 public: 60 static std::unique_ptr<SfxTabPage> Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet &rSet); 61 62 SmPrintOptionsTabPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet &rOptions); 63 virtual ~SmPrintOptionsTabPage() override; 64 }; 65 66 /**************************************************************************/ 67 68 class SmShowFont final : public weld::CustomWidgetController 69 { 70 virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) override; 71 72 vcl::Font maFont; 73 74 public: SmShowFont()75 SmShowFont() 76 { 77 } 78 virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override; 79 void SetFont(const vcl::Font& rFont); 80 }; 81 82 class SmFontDialog : public weld::GenericDialogController 83 { 84 vcl::Font maFont; 85 SmShowFont m_aShowFont; 86 std::unique_ptr<weld::EntryTreeView> m_xFontBox; 87 std::unique_ptr<weld::Widget> m_xAttrFrame; 88 std::unique_ptr<weld::CheckButton> m_xBoldCheckBox; 89 std::unique_ptr<weld::CheckButton> m_xItalicCheckBox; 90 std::unique_ptr<weld::CustomWeld> m_xShowFont; 91 92 DECL_LINK(FontSelectHdl, weld::ComboBox&, void); 93 DECL_LINK(AttrChangeHdl, weld::Toggleable&, void); 94 95 public: 96 SmFontDialog(weld::Window* pParent, OutputDevice *pFntListDevice, bool bHideCheckboxes); 97 virtual ~SmFontDialog() override; 98 GetFont() const99 const vcl::Font& GetFont() const 100 { 101 return maFont; 102 } 103 void SetFont(const vcl::Font &rFont); 104 }; 105 106 /**************************************************************************/ 107 108 class SmFontSizeDialog final : public weld::GenericDialogController 109 { 110 std::unique_ptr<weld::MetricSpinButton> m_xBaseSize; 111 std::unique_ptr<weld::MetricSpinButton> m_xTextSize; 112 std::unique_ptr<weld::MetricSpinButton> m_xIndexSize; 113 std::unique_ptr<weld::MetricSpinButton> m_xFunctionSize; 114 std::unique_ptr<weld::MetricSpinButton> m_xOperatorSize; 115 std::unique_ptr<weld::MetricSpinButton> m_xBorderSize; 116 std::unique_ptr<weld::Button> m_xDefaultButton; 117 118 DECL_LINK(DefaultButtonClickHdl, weld::Button&, void); 119 120 public: 121 SmFontSizeDialog(weld::Window *pParent); 122 virtual ~SmFontSizeDialog() override; 123 124 void ReadFrom(const SmFormat &rFormat); 125 void WriteTo (SmFormat &rFormat) const; 126 }; 127 128 /**************************************************************************/ 129 130 class SmFontTypeDialog final : public weld::GenericDialogController 131 { 132 VclPtr<OutputDevice> pFontListDev; 133 134 std::unique_ptr<SmFontPickListBox> m_xVariableFont; 135 std::unique_ptr<SmFontPickListBox> m_xFunctionFont; 136 std::unique_ptr<SmFontPickListBox> m_xNumberFont; 137 std::unique_ptr<SmFontPickListBox> m_xTextFont; 138 std::unique_ptr<SmFontPickListBox> m_xSerifFont; 139 std::unique_ptr<SmFontPickListBox> m_xSansFont; 140 std::unique_ptr<SmFontPickListBox> m_xFixedFont; 141 std::unique_ptr<weld::MenuButton> m_xMenuButton; 142 std::unique_ptr<weld::Button> m_xDefaultButton; 143 144 DECL_LINK(MenuSelectHdl, const OString&, void); 145 DECL_LINK(DefaultButtonClickHdl, weld::Button&, void); 146 147 public: 148 SmFontTypeDialog(weld::Window* pParent, OutputDevice *pFntListDevice); 149 virtual ~SmFontTypeDialog() override; 150 151 void ReadFrom(const SmFormat &rFormat); 152 void WriteTo (SmFormat &rFormat) const; 153 }; 154 155 /**************************************************************************/ 156 157 #define NOCATEGORIES 10 158 159 class SmCategoryDesc 160 { 161 OUString Name; 162 OUString Strings[4]; 163 std::unique_ptr<weld::Widget> Graphics[4]; /* regular bitmaps */ 164 sal_uInt16 Minimum[4]; 165 sal_uInt16 Maximum[4]; 166 sal_uInt16 Value[4]; 167 168 public: 169 SmCategoryDesc(weld::Builder& rBuilder, sal_uInt16 nCategoryIdx); 170 ~SmCategoryDesc(); 171 GetName() const172 const OUString& GetName() const { return Name; } GetString(sal_uInt16 Index) const173 const OUString& GetString(sal_uInt16 Index) const { return Strings[Index]; } GetMinimum(sal_uInt16 Index)174 sal_uInt16 GetMinimum(sal_uInt16 Index) { return Minimum[Index]; } GetMaximum(sal_uInt16 Index)175 sal_uInt16 GetMaximum(sal_uInt16 Index) { return Maximum[Index]; } GetValue(sal_uInt16 Index) const176 sal_uInt16 GetValue(sal_uInt16 Index) const { return Value[Index]; } SetValue(sal_uInt16 Index,sal_uInt16 nVal)177 void SetValue(sal_uInt16 Index, sal_uInt16 nVal) { Value[Index] = nVal;} 178 GetGraphic(sal_uInt16 Index) const179 weld::Widget* GetGraphic(sal_uInt16 Index) const 180 { 181 return Graphics[Index].get(); 182 } 183 }; 184 185 class SmDistanceDialog final : public weld::GenericDialogController 186 { 187 std::unique_ptr<weld::Frame> m_xFrame; 188 std::unique_ptr<weld::Label> m_xFixedText1; 189 std::unique_ptr<weld::MetricSpinButton> m_xMetricField1; 190 std::unique_ptr<weld::Label> m_xFixedText2; 191 std::unique_ptr<weld::MetricSpinButton> m_xMetricField2; 192 std::unique_ptr<weld::Label> m_xFixedText3; 193 std::unique_ptr<weld::MetricSpinButton> m_xMetricField3; 194 std::unique_ptr<weld::CheckButton> m_xCheckBox1; 195 std::unique_ptr<weld::Label> m_xFixedText4; 196 std::unique_ptr<weld::MetricSpinButton> m_xMetricField4; 197 std::unique_ptr<weld::MenuButton> m_xMenuButton; 198 std::unique_ptr<weld::Button> m_xDefaultButton; 199 std::unique_ptr<weld::Widget> m_xBitmap; 200 201 weld::Widget* m_pCurrentImage; 202 203 std::unique_ptr<SmCategoryDesc> m_xCategories[NOCATEGORIES]; 204 sal_uInt16 nActiveCategory; 205 bool bScaleAllBrackets; 206 207 DECL_LINK(GetFocusHdl, weld::Widget&, void); 208 DECL_LINK(MenuSelectHdl, const OString&, void); 209 DECL_LINK(DefaultButtonClickHdl, weld::Button&, void); 210 DECL_LINK(CheckBoxClickHdl, weld::Toggleable&, void); 211 212 void SetCategory(sal_uInt16 Category); 213 214 public: 215 SmDistanceDialog(weld::Window *pParent); 216 virtual ~SmDistanceDialog() override; 217 218 void ReadFrom(const SmFormat &rFormat); 219 void WriteTo (SmFormat &rFormat); 220 }; 221 222 /**************************************************************************/ 223 224 225 class SmAlignDialog final : public weld::GenericDialogController 226 { 227 std::unique_ptr<weld::RadioButton> m_xLeft; 228 std::unique_ptr<weld::RadioButton> m_xCenter; 229 std::unique_ptr<weld::RadioButton> m_xRight; 230 std::unique_ptr<weld::Button> m_xDefaultButton; 231 232 DECL_LINK(DefaultButtonClickHdl, weld::Button&, void); 233 234 public: 235 SmAlignDialog(weld::Window *pParent); 236 virtual ~SmAlignDialog() override; 237 238 void ReadFrom(const SmFormat &rFormat); 239 void WriteTo (SmFormat &rFormat) const; 240 }; 241 242 /**************************************************************************/ 243 244 class SmShowSymbolSet final : public weld::CustomWidgetController 245 { 246 Size m_aOldSize; 247 SymbolPtrVec_t aSymbolSet; 248 Link<SmShowSymbolSet&,void> aSelectHdlLink; 249 Link<SmShowSymbolSet&,void> aDblClickHdlLink; 250 tools::Long nLen; 251 sal_Int32 nRows, nColumns; 252 tools::Long nXOffset, nYOffset; 253 sal_uInt16 nSelectSymbol; 254 std::unique_ptr<weld::ScrolledWindow> m_xScrolledWindow; 255 256 void SetScrollBarRange(); 257 Point OffsetPoint(const Point &rPoint) const; 258 259 virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override; 260 virtual bool MouseButtonDown(const MouseEvent& rMEvt) override; 261 virtual bool KeyInput(const KeyEvent& rKEvt) override; 262 virtual void Resize() override; 263 264 DECL_LINK(ScrollHdl, weld::ScrolledWindow&, void); 265 266 public: 267 SmShowSymbolSet(std::unique_ptr<weld::ScrolledWindow> pScrolledWindow); 268 SetDrawingArea(weld::DrawingArea * pDrawingArea)269 virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override 270 { 271 CustomWidgetController::SetDrawingArea(pDrawingArea); 272 m_aOldSize = Size(pDrawingArea->get_approximate_digit_width() * 27, 273 pDrawingArea->get_text_height() * 9); 274 pDrawingArea->set_size_request(m_aOldSize.Width(), m_aOldSize.Height()); 275 SetOutputSizePixel(m_aOldSize); 276 calccols(pDrawingArea->get_ref_device()); 277 } 278 279 void calccols(const vcl::RenderContext& rRenderContext); 280 void SelectSymbol(sal_uInt16 nSymbol); GetSelectSymbol() const281 sal_uInt16 GetSelectSymbol() const { return nSelectSymbol; } 282 void SetSymbolSet(const SymbolPtrVec_t& rSymbolSet); SetSelectHdl(const Link<SmShowSymbolSet &,void> & rLink)283 void SetSelectHdl(const Link<SmShowSymbolSet&,void>& rLink) { aSelectHdlLink = rLink; } SetDblClickHdl(const Link<SmShowSymbolSet &,void> & rLink)284 void SetDblClickHdl(const Link<SmShowSymbolSet&,void>& rLink) { aDblClickHdlLink = rLink; } 285 }; 286 287 class SmShowSymbol final : public weld::CustomWidgetController 288 { 289 private: 290 vcl::Font m_aFont; 291 OUString m_aText; 292 293 Link<SmShowSymbol&,void> aDblClickHdlLink; 294 295 virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) override; 296 virtual bool MouseButtonDown(const MouseEvent& rMEvt) override; 297 298 void setFontSize(vcl::Font &rFont) const; 299 300 public: 301 SmShowSymbol(); 302 SetDrawingArea(weld::DrawingArea * pDrawingArea)303 virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override 304 { 305 CustomWidgetController::SetDrawingArea(pDrawingArea); 306 pDrawingArea->set_size_request(pDrawingArea->get_approximate_digit_width() * 27, 307 pDrawingArea->get_text_height() * 9); 308 } 309 SetText(const OUString & rText)310 void SetText(const OUString& rText) { m_aText = rText; } GetText() const311 const OUString& GetText() const { return m_aText; } 312 SetFont(const vcl::Font & rFont)313 void SetFont(const vcl::Font& rFont) { m_aFont = rFont; } GetFont() const314 const vcl::Font& GetFont() const { return m_aFont; } 315 316 void SetSymbol(const SmSym *pSymbol); SetDblClickHdl(const Link<SmShowSymbol &,void> & rLink)317 void SetDblClickHdl(const Link<SmShowSymbol&,void> &rLink) { aDblClickHdlLink = rLink; } 318 }; 319 320 class SmSymbolDialog final : public weld::GenericDialogController 321 { 322 SmViewShell &rViewSh; 323 SmSymbolManager &rSymbolMgr; 324 325 OUString aSymbolSetName; 326 SymbolPtrVec_t aSymbolSet; 327 328 VclPtr<OutputDevice> pFontListDev; 329 330 SmShowSymbol m_aSymbolDisplay; 331 332 std::unique_ptr<weld::ComboBox> m_xSymbolSets; 333 std::unique_ptr<SmShowSymbolSet> m_xSymbolSetDisplay; 334 std::unique_ptr<weld::CustomWeld> m_xSymbolSetDisplayArea; 335 std::unique_ptr<weld::Label> m_xSymbolName; 336 std::unique_ptr<weld::CustomWeld> m_xSymbolDisplay; 337 std::unique_ptr<weld::Button> m_xGetBtn; 338 std::unique_ptr<weld::Button> m_xEditBtn; 339 340 DECL_LINK(SymbolSetChangeHdl, weld::ComboBox&, void); 341 DECL_LINK(SymbolChangeHdl, SmShowSymbolSet&, void); 342 DECL_LINK(SymbolDblClickHdl, SmShowSymbol&, void); 343 DECL_LINK(SymbolDblClickHdl2, SmShowSymbolSet&, void); 344 DECL_LINK(EditClickHdl, weld::Button&, void); 345 DECL_LINK(GetClickHdl, weld::Button&, void); 346 void SymbolDblClickHdl(); 347 348 void FillSymbolSets(); 349 const SmSym *GetSymbol() const; 350 351 public: 352 SmSymbolDialog(weld::Window* pParent, OutputDevice *pFntListDevice, 353 SmSymbolManager &rSymbolMgr, SmViewShell &rViewShell); 354 virtual ~SmSymbolDialog() override; 355 356 bool SelectSymbolSet(const OUString &rSymbolSetName); 357 void SelectSymbol(sal_uInt16 nSymbolPos); 358 }; 359 360 class SmShowChar final : public weld::CustomWidgetController 361 { 362 private: 363 OUString m_aText; 364 vcl::Font m_aFont; 365 366 virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) override; 367 virtual void Resize() override; 368 369 public: SmShowChar()370 SmShowChar() 371 { 372 } 373 SetDrawingArea(weld::DrawingArea * pDrawingArea)374 virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override 375 { 376 CustomWidgetController::SetDrawingArea(pDrawingArea); 377 pDrawingArea->set_size_request(pDrawingArea->get_approximate_digit_width() * 7, 378 pDrawingArea->get_text_height() * 3); 379 } 380 381 void SetSymbol(const SmSym *pSym); 382 void SetSymbol(sal_UCS4 cChar, const vcl::Font &rFont); SetText(const OUString & rText)383 void SetText(const OUString& rText) { m_aText = rText; } GetText() const384 const OUString& GetText() const { return m_aText; } SetFont(const vcl::Font & rFont)385 void SetFont(const vcl::Font& rFont) { m_aFont = rFont; } GetFont() const386 const vcl::Font& GetFont() const { return m_aFont; } 387 }; 388 389 class SmSymDefineDialog final : public weld::GenericDialogController 390 { 391 VclPtr<VirtualDevice> m_xVirDev; 392 SmSymbolManager m_aSymbolMgrCopy; 393 SmSymbolManager& m_rSymbolMgr; 394 SmShowChar m_aOldSymbolDisplay; 395 SmShowChar m_aSymbolDisplay; 396 std::unique_ptr<SmSym> m_xOrigSymbol; 397 std::unique_ptr<SubsetMap> m_xSubsetMap; 398 std::unique_ptr<FontList> m_xFontList; 399 std::unique_ptr<weld::ComboBox> m_xOldSymbols; 400 std::unique_ptr<weld::ComboBox> m_xOldSymbolSets; 401 std::unique_ptr<weld::ComboBox> m_xSymbols; 402 std::unique_ptr<weld::ComboBox> m_xSymbolSets; 403 std::unique_ptr<weld::ComboBox> m_xFonts; 404 std::unique_ptr<weld::ComboBox> m_xFontsSubsetLB; 405 std::unique_ptr<weld::ComboBox> m_xStyles; 406 std::unique_ptr<weld::Label> m_xOldSymbolName; 407 std::unique_ptr<weld::Label> m_xOldSymbolSetName; 408 std::unique_ptr<weld::Label> m_xSymbolName; 409 std::unique_ptr<weld::Label> m_xSymbolSetName; 410 std::unique_ptr<weld::Button> m_xAddBtn; 411 std::unique_ptr<weld::Button> m_xChangeBtn; 412 std::unique_ptr<weld::Button> m_xDeleteBtn; 413 std::unique_ptr<weld::CustomWeld> m_xOldSymbolDisplay; 414 std::unique_ptr<weld::CustomWeld> m_xSymbolDisplay; 415 std::unique_ptr<SvxShowCharSet> m_xCharsetDisplay; 416 std::unique_ptr<weld::CustomWeld> m_xCharsetDisplayArea; 417 418 DECL_LINK(OldSymbolChangeHdl, weld::ComboBox&, void); 419 DECL_LINK(OldSymbolSetChangeHdl, weld::ComboBox&, void); 420 DECL_LINK(ModifyHdl, weld::ComboBox&, void); 421 DECL_LINK(FontChangeHdl, weld::ComboBox&, void); 422 DECL_LINK(SubsetChangeHdl, weld::ComboBox&, void); 423 DECL_LINK(StyleChangeHdl, weld::ComboBox&, void); 424 DECL_LINK(CharHighlightHdl, SvxShowCharSet*, void); 425 DECL_LINK(AddClickHdl, weld::Button&, void); 426 DECL_LINK(ChangeClickHdl, weld::Button&, void); 427 DECL_LINK(DeleteClickHdl, weld::Button&, void); 428 429 void FillSymbols(weld::ComboBox& rComboBox, bool bDeleteText = true); 430 void FillSymbolSets(weld::ComboBox& rComboBox, bool bDeleteText = true); 431 void FillFonts(); 432 void FillStyles(); 433 434 void SetSymbolSetManager(const SmSymbolManager &rMgr); 435 void SetFont(const OUString &rFontName, std::u16string_view rStyleName); 436 void SetOrigSymbol(const SmSym *pSymbol, const OUString &rSymbolSetName); 437 void UpdateButtons(); 438 439 bool SelectSymbolSet(weld::ComboBox &rComboBox, std::u16string_view rSymbolSetName, 440 bool bDeleteText); 441 bool SelectSymbol(weld::ComboBox& rComboBox, const OUString &rSymbolName, 442 bool bDeleteText); 443 bool SelectFont(const OUString &rFontName, bool bApplyFont); 444 bool SelectStyle(const OUString &rStyleName, bool bApplyFont); 445 446 SmSym* GetSymbol(const weld::ComboBox& rComboBox); GetSymbol(const weld::ComboBox & rComboBox) const447 const SmSym* GetSymbol(const weld::ComboBox& rComboBox) const 448 { 449 return const_cast<SmSymDefineDialog *>(this)->GetSymbol(rComboBox); 450 } 451 452 public: 453 SmSymDefineDialog(weld::Window *pParent, OutputDevice *pFntListDevice, SmSymbolManager &rMgr); 454 virtual ~SmSymDefineDialog() override; 455 456 virtual short run() override; 457 SelectOldSymbolSet(std::u16string_view rSymbolSetName)458 void SelectOldSymbolSet(std::u16string_view rSymbolSetName) 459 { 460 SelectSymbolSet(*m_xOldSymbolSets, rSymbolSetName, false); 461 } 462 SelectOldSymbol(const OUString & rSymbolName)463 void SelectOldSymbol(const OUString &rSymbolName) 464 { 465 SelectSymbol(*m_xOldSymbols, rSymbolName, false); 466 } 467 SelectSymbolSet(std::u16string_view rSymbolSetName)468 bool SelectSymbolSet(std::u16string_view rSymbolSetName) 469 { 470 return SelectSymbolSet(*m_xSymbolSets, rSymbolSetName, false); 471 } 472 SelectSymbol(const OUString & rSymbolName)473 bool SelectSymbol(const OUString &rSymbolName) 474 { 475 return SelectSymbol(*m_xSymbols, rSymbolName, false); 476 } 477 SelectFont(const OUString & rFontName)478 bool SelectFont(const OUString &rFontName) { return SelectFont(rFontName, true); } SelectStyle(const OUString & rStyleName)479 bool SelectStyle(const OUString &rStyleName) { return SelectStyle(rStyleName, true); }; 480 void SelectChar(sal_Unicode cChar); 481 }; 482 483 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 484