diff options
-rw-r--r-- | include/svtools/editbrowsebox.hxx | 8 | ||||
-rw-r--r-- | include/vcl/weld.hxx | 3 | ||||
-rw-r--r-- | svtools/source/brwbox/ebbcontrols.cxx | 18 | ||||
-rw-r--r-- | vcl/inc/salvtables.hxx | 4 | ||||
-rw-r--r-- | vcl/source/app/salvtables.cxx | 17 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtkinst.cxx | 69 |
6 files changed, 104 insertions, 15 deletions
diff --git a/include/svtools/editbrowsebox.hxx b/include/svtools/editbrowsebox.hxx index a758d1142a88..64787aff043d 100644 --- a/include/svtools/editbrowsebox.hxx +++ b/include/svtools/editbrowsebox.hxx @@ -172,7 +172,7 @@ namespace svt virtual bool ProcessKey(const KeyEvent& rKEvt); - virtual void SetPointFont(const vcl::Font& rFont); + virtual void SetPointFont(const vcl::Font& rFont) = 0; // chain after the FocusInHdl void SetFocusInHdl(const Link<LinkParamNone*,void>& rHdl) @@ -564,6 +564,8 @@ namespace svt virtual ~CheckBoxControl() override; virtual void dispose() override; + virtual void SetPointFont(const vcl::Font& rFont) override; + void SetToggleHdl(const Link<weld::CheckButton&,void>& rHdl) {m_aToggleLink = rHdl;} // sets a link to call when the text is changed by the user @@ -629,6 +631,8 @@ namespace svt public: ComboBoxControl(BrowserDataWin* pParent); + virtual void SetPointFont(const vcl::Font& rFont) override; + virtual void SetEditableReadOnly(bool bReadOnly) override { m_xWidget->set_entry_editable(!bReadOnly); @@ -696,6 +700,8 @@ namespace svt public: ListBoxControl(BrowserDataWin* pParent); + virtual void SetPointFont(const vcl::Font& rFont) override; + weld::ComboBox& get_widget() { return *m_xWidget; } // sets a link to call when the selection is changed by the user diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx index 9038351c2715..00275b919a84 100644 --- a/include/vcl/weld.hxx +++ b/include/vcl/weld.hxx @@ -787,6 +787,9 @@ public: virtual void paste_entry_clipboard() = 0; // font size is in points, not pixels, e.g. see Window::[G]etPointFont + virtual void set_font(const vcl::Font& rFont) = 0; + + // font size is in points, not pixels, e.g. see Window::[G]etPointFont virtual void set_entry_font(const vcl::Font& rFont) = 0; virtual vcl::Font get_entry_font() = 0; diff --git a/svtools/source/brwbox/ebbcontrols.cxx b/svtools/source/brwbox/ebbcontrols.cxx index de2cf8ffb021..d35f2c7aa9a7 100644 --- a/svtools/source/brwbox/ebbcontrols.cxx +++ b/svtools/source/brwbox/ebbcontrols.cxx @@ -37,6 +37,11 @@ namespace svt m_xWidget->connect_mouse_move(LINK(this, ControlBase, MouseMoveHdl)); } + void ComboBoxControl::SetPointFont(const vcl::Font& rFont) + { + m_xWidget->set_entry_font(rFont); + } + void ComboBoxControl::dispose() { m_xWidget.reset(); @@ -127,6 +132,11 @@ namespace svt m_xWidget->connect_mouse_move(LINK(this, ControlBase, MouseMoveHdl)); } + void ListBoxControl::SetPointFont(const vcl::Font& rFont) + { + m_xWidget->set_font(rFont); + } + void ListBoxControl::dispose() { m_xWidget.reset(); @@ -201,6 +211,10 @@ namespace svt m_xBox->connect_toggled(LINK(this, CheckBoxControl, OnToggle)); } + void CheckBoxControl::SetPointFont(const vcl::Font& /*rFont*/) + { + } + void CheckBoxControl::EnableTriState( bool bTriState ) { if (m_aModeState.bTriStateEnabled != bTriState) @@ -361,10 +375,6 @@ namespace svt return static_cast<BrowserDataWin*>(GetParent())->GetParent()->ProcessKey(rKEvt); } - void ControlBase::SetPointFont(const vcl::Font& /*rFont*/) - { - } - IMPL_LINK(ControlBase, KeyInputHdl, const KeyEvent&, rKEvt, bool) { return ProcessKey(rKEvt); diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx index 1574a3a144c6..d3d31afa97cb 100644 --- a/vcl/inc/salvtables.hxx +++ b/vcl/inc/salvtables.hxx @@ -911,6 +911,8 @@ public: virtual void paste_entry_clipboard() override; + virtual void set_font(const vcl::Font& rFont) override; + virtual void set_entry_font(const vcl::Font&) override; virtual vcl::Font get_entry_font() override; @@ -981,6 +983,8 @@ public: virtual bool get_entry_selection_bounds(int& rStartPos, int& rEndPos) override; + virtual void set_font(const vcl::Font& rFont) override; + virtual void set_entry_font(const vcl::Font& rFont) override; virtual vcl::Font get_entry_font() override; diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index 3efdb345e1ea..54199b1284b3 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -6264,6 +6264,12 @@ void SalInstanceComboBoxWithoutEdit::copy_entry_clipboard() { assert(false); } void SalInstanceComboBoxWithoutEdit::paste_entry_clipboard() { assert(false); } +void SalInstanceComboBoxWithoutEdit::set_font(const vcl::Font& rFont) +{ + m_xComboBox->SetControlFont(rFont); + m_xComboBox->Invalidate(); +} + void SalInstanceComboBoxWithoutEdit::set_entry_font(const vcl::Font&) { assert(false); } vcl::Font SalInstanceComboBoxWithoutEdit::get_entry_font() @@ -6425,12 +6431,17 @@ bool SalInstanceComboBoxWithEdit::get_entry_selection_bounds(int& rStartPos, int return rSelection.Len(); } +void SalInstanceComboBoxWithEdit::set_font(const vcl::Font& rFont) +{ + m_xComboBox->SetControlFont(rFont); + m_xComboBox->Invalidate(); +} + void SalInstanceComboBoxWithEdit::set_entry_font(const vcl::Font& rFont) { Edit* pEdit = m_xComboBox->GetSubEdit(); assert(pEdit); - pEdit->SetPointFont(*pEdit->GetOutDev(), rFont); - m_xComboBox->SetControlFont(rFont); // tdf#134601 set it as control font to take effect properly + pEdit->SetControlFont(rFont); // tdf#134601 set it as control font to take effect properly pEdit->Invalidate(); } @@ -6562,6 +6573,8 @@ public: rEntry.SetAutocompleteHdl(Link<Edit&, void>()); } + virtual void set_font(const vcl::Font&) override { assert(false && "not implemented"); } + virtual void set_entry_font(const vcl::Font& rFont) override { Edit& rEntry = m_pEntry->getEntry(); diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index f9d079b6b734..94a5a614d3c6 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -17196,12 +17196,14 @@ private: GtkWidget* m_pEntry; GtkEditable* m_pEditable; // GtkCellView* m_pCellView; + GtkCssProvider* m_pFontCssProvider; GtkEventController* m_pKeyController; GtkEventController* m_pEntryKeyController; GtkEventController* m_pMenuKeyController; GtkEventController* m_pEntryFocusController; // std::unique_ptr<CustomRenderMenuButtonHelper> m_xCustomMenuButtonHelper; - std::unique_ptr<vcl::Font> m_xFont; + std::optional<vcl::Font> m_xFont; + std::optional<vcl::Font> m_xEntryFont; std::unique_ptr<comphelper::string::NaturalStringSorter> m_xSorter; vcl::QuickSelectionEngine m_aQuickSelectionEngine; std::vector<std::unique_ptr<GtkTreeRowReference, GtkTreeRowReferenceDeleter>> m_aSeparatorRows; @@ -18228,6 +18230,7 @@ public: // , m_pToggleButton(GTK_WIDGET(gtk_builder_get_object(pComboBuilder, "button"))) , m_pEntry(GTK_IS_ENTRY(gtk_combo_box_get_child(pComboBox)) ? gtk_combo_box_get_child(pComboBox) : nullptr) , m_pEditable(GTK_EDITABLE(m_pEntry)) + , m_pFontCssProvider(nullptr) // , m_pCellView(nullptr) , m_aQuickSelectionEngine(*this) // , m_bHoverSelection(false) @@ -18592,9 +18595,30 @@ public: gtk_widget_activate_action(m_pEntry, "paste.clipboard", nullptr); } + virtual void set_font(const vcl::Font& rFont) override + { + m_xFont = rFont; + GtkStyleContext *pWidgetContext = gtk_widget_get_style_context(GTK_WIDGET(m_pComboBox)); + if (m_pFontCssProvider) + gtk_style_context_remove_provider(pWidgetContext, GTK_STYLE_PROVIDER(m_pFontCssProvider)); + m_pFontCssProvider = gtk_css_provider_new(); + OUString aBuffer = "combobox { " + vcl_font_to_css(rFont) + "}"; + OString aResult = OUStringToOString(aBuffer, RTL_TEXTENCODING_UTF8); + css_provider_load_from_data(m_pFontCssProvider, aResult.getStr(), aResult.getLength()); + gtk_style_context_add_provider(pWidgetContext, GTK_STYLE_PROVIDER(m_pFontCssProvider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + } + + virtual vcl::Font get_font() override + { + if (m_xFont) + return *m_xFont; + return GtkInstanceWidget::get_font(); + } + virtual void set_entry_font(const vcl::Font& rFont) override { - m_xFont.reset(new vcl::Font(rFont)); + m_xEntryFont = rFont; assert(m_pEntry); PangoAttrList* pOrigList = gtk_entry_get_attributes(GTK_ENTRY(m_pEntry)); PangoAttrList* pAttrList = pOrigList ? pango_attr_list_copy(pOrigList) : pango_attr_list_new(); @@ -18605,8 +18629,8 @@ public: virtual vcl::Font get_entry_font() override { - if (m_xFont) - return *m_xFont; + if (m_xEntryFont) + return *m_xEntryFont; assert(m_pEntry); PangoContext* pContext = gtk_widget_get_pango_context(m_pEntry); return pango_to_vcl(pango_context_get_font_description(pContext), @@ -18923,8 +18947,10 @@ private: GtkWidget* m_pToggleButton; GtkWidget* m_pEntry; GtkCellView* m_pCellView; + GtkCssProvider* m_pFontCssProvider; std::unique_ptr<CustomRenderMenuButtonHelper> m_xCustomMenuButtonHelper; - std::unique_ptr<vcl::Font> m_xFont; + std::optional<vcl::Font> m_xFont; + std::optional<vcl::Font> m_xEntryFont; std::unique_ptr<comphelper::string::NaturalStringSorter> m_xSorter; vcl::QuickSelectionEngine m_aQuickSelectionEngine; std::vector<std::unique_ptr<GtkTreeRowReference, GtkTreeRowReferenceDeleter>> m_aSeparatorRows; @@ -19961,6 +19987,7 @@ public: , m_pToggleButton(GTK_WIDGET(gtk_builder_get_object(pComboBuilder, "button"))) , m_pEntry(GTK_WIDGET(gtk_builder_get_object(pComboBuilder, "entry"))) , m_pCellView(nullptr) + , m_pFontCssProvider(nullptr) , m_aQuickSelectionEngine(*this) , m_bHoverSelection(false) , m_bMouseInOverlayButton(false) @@ -20377,9 +20404,30 @@ public: gtk_editable_paste_clipboard(GTK_EDITABLE(m_pEntry)); } + virtual void set_font(const vcl::Font& rFont) override + { + m_xFont = rFont; + GtkStyleContext *pWidgetContext = gtk_widget_get_style_context(GTK_WIDGET(getContainer())); + if (m_pFontCssProvider) + gtk_style_context_remove_provider(pWidgetContext, GTK_STYLE_PROVIDER(m_pFontCssProvider)); + m_pFontCssProvider = gtk_css_provider_new(); + OUString aBuffer = "box#combobox { " + vcl_font_to_css(rFont) + "}"; + OString aResult = OUStringToOString(aBuffer, RTL_TEXTENCODING_UTF8); + css_provider_load_from_data(m_pFontCssProvider, aResult.getStr(), aResult.getLength()); + gtk_style_context_add_provider(pWidgetContext, GTK_STYLE_PROVIDER(m_pFontCssProvider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + } + + virtual vcl::Font get_font() override + { + if (m_xFont) + return *m_xFont; + return GtkInstanceContainer::get_font(); + } + virtual void set_entry_font(const vcl::Font& rFont) override { - m_xFont.reset(new vcl::Font(rFont)); + m_xEntryFont = rFont; assert(m_pEntry); PangoAttrList* pOrigList = gtk_entry_get_attributes(GTK_ENTRY(m_pEntry)); PangoAttrList* pAttrList = pOrigList ? pango_attr_list_copy(pOrigList) : pango_attr_list_new(); @@ -20390,8 +20438,8 @@ public: virtual vcl::Font get_entry_font() override { - if (m_xFont) - return *m_xFont; + if (m_xEntryFont) + return *m_xEntryFont; assert(m_pEntry); PangoContext* pContext = gtk_widget_get_pango_context(m_pEntry); return pango_to_vcl(pango_context_get_font_description(pContext), @@ -21007,6 +21055,11 @@ public: m_xEntry->paste_clipboard(); } + virtual void set_font(const vcl::Font&) override + { + assert(false && "not implemented"); + } + virtual void set_entry_font(const vcl::Font& rFont) override { m_xEntry->set_font(rFont); |