summaryrefslogtreecommitdiffstats
path: root/include/svtools/ctrlbox.hxx
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--include/svtools/ctrlbox.hxx505
1 files changed, 505 insertions, 0 deletions
diff --git a/include/svtools/ctrlbox.hxx b/include/svtools/ctrlbox.hxx
new file mode 100644
index 000000000..180fb64bf
--- /dev/null
+++ b/include/svtools/ctrlbox.hxx
@@ -0,0 +1,505 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#pragma once
+
+#include <svtools/svtdllapi.h>
+#include <editeng/borderline.hxx>
+#include <vcl/idle.hxx>
+#include <vcl/metric.hxx>
+#include <vcl/weld.hxx>
+
+#include <memory>
+
+namespace weld { class CustomWeld; }
+
+class BitmapEx;
+class BorderWidthImpl;
+class FontList;
+class VclSimpleEvent;
+class VirtualDevice;
+
+/** Utility class storing the border line width, style and colors. The widths
+ are defined in Twips.
+ */
+class ImpLineListData
+{
+private:
+ BorderWidthImpl const m_aWidthImpl;
+
+ Color ( * m_pColor1Fn )( Color );
+ Color ( * m_pColor2Fn )( Color );
+ Color ( * m_pColorDistFn )( Color, Color );
+
+ tools::Long m_nMinWidth;
+ SvxBorderLineStyle m_nStyle;
+
+public:
+ ImpLineListData( BorderWidthImpl aWidthImpl,
+ SvxBorderLineStyle nStyle, tools::Long nMinWidth, Color ( *pColor1Fn )( Color ),
+ Color ( *pColor2Fn )( Color ), Color ( *pColorDistFn )( Color, Color ) ) :
+ m_aWidthImpl( aWidthImpl ),
+ m_pColor1Fn( pColor1Fn ),
+ m_pColor2Fn( pColor2Fn ),
+ m_pColorDistFn( pColorDistFn ),
+ m_nMinWidth( nMinWidth ),
+ m_nStyle( nStyle )
+ {
+ }
+
+ /** Returns the computed width of the line 1 in twips. */
+ tools::Long GetLine1ForWidth( tools::Long nWidth ) const { return m_aWidthImpl.GetLine1( nWidth ); }
+
+ /** Returns the computed width of the line 2 in twips. */
+ tools::Long GetLine2ForWidth( tools::Long nWidth ) const { return m_aWidthImpl.GetLine2( nWidth ); }
+
+ /** Returns the computed width of the gap in twips. */
+ tools::Long GetDistForWidth( tools::Long nWidth ) const { return m_aWidthImpl.GetGap( nWidth ); }
+
+ Color GetColorLine1( const Color& rMain ) const
+ {
+ return ( *m_pColor1Fn )( rMain );
+ }
+
+ Color GetColorLine2( const Color& rMain ) const
+ {
+ return ( *m_pColor2Fn )( rMain );
+ }
+
+ Color GetColorDist( const Color& rMain, const Color& rDefault ) const
+ {
+ return ( *m_pColorDistFn )( rMain, rDefault );
+ }
+
+ /** Returns the minimum width in twips */
+ tools::Long GetMinWidth( ) const { return m_nMinWidth;}
+ SvxBorderLineStyle GetStyle( ) const { return m_nStyle;}
+};
+
+enum class SvxBorderLineStyle : sal_Int16;
+
+typedef ::std::vector< FontMetric > ImplFontList;
+
+/*************************************************************************
+
+class LineListBox
+
+Description
+
+Allows selection of line styles and sizes. Note that before first insert,
+units and window size need to be set. Supported units are typographic point
+(pt) and millimeters (mm). For SourceUnit, pt, mm and twips are supported.
+All scalar numbers in 1/100 of the corresponding unit.
+
+Line1 is the outer, Line2 the inner line, Distance is the distance between
+these two lines. If Line2 == 0, only Line1 will be shown. Defaults for
+source and target unit are FieldUnit::POINT.
+
+SetColor() sets the line color.
+
+Remarks
+
+Contrary to a simple ListBox, user-specific data are not supported.
+If UpdateMode is disabled, no data should be read, no selections
+should be set, and the return code shall be ignore, as in these are
+not defined in this mode. Also the bit WinBit WB_SORT may not be set.
+
+--------------------------------------------------------------------------
+
+class FontNameBox
+
+Description
+
+Allows selection of fonts. The ListBox will be filled using Fill parameter,
+which is pointer to an FontList object.
+
+Calling EnableWYSIWYG() enables rendering the font name in the currently
+selected font.
+
+See also
+
+FontList; FontStyleBox; FontSizeBox; FontNameMenu
+
+--------------------------------------------------------------------------
+
+class FontStyleBox
+
+Description
+
+Allows select of FontStyle's. The parameter Fill points to a list
+of available font styles for the font.
+
+Reproduced styles are always added - this could change in future, as
+potentially not all applications [Draw,Equation,FontWork] can properly
+handle synthetic fonts. On filling, the previous name will be retained
+if possible.
+
+For DontKnow, the FontStyleBox should be filled with OUString(),
+so it will contain a list with the default attributes. The currently
+shown style probably needs to be reset by the application.
+
+See also
+
+FontList; FontNameBox; FontSizeBox;
+
+--------------------------------------------------------------------------
+
+class FontSizeBox
+
+Description
+
+Allows selection of font sizes. The values are retrieved via GetValue()
+and set via SetValue(). The Fill parameter fills the ListBox with the
+available sizes for the passed font.
+
+All sizes are in 1/10 typographic point (pt).
+
+The passed FontList must be retained until the next fill call.
+
+Additionally it supports a relative mod, which allows entering
+percentage values. This, eg., can be useful for template dialogs.
+This mode can only be enabled, but not disabled again.
+
+For DontKnow the FontSizeBox should be filled FontMetric(), so it will
+contain a list with the standard sizes. Th currently shown size
+probably needs to be reset by the application.
+
+See also
+
+FontList; FontNameBox; FontStyleBox; FontSizeMenu
+
+*************************************************************************/
+
+inline Color sameColor( Color rMain )
+{
+ return rMain;
+}
+
+inline Color sameDistColor( Color /*rMain*/, Color rDefault )
+{
+ return rDefault;
+}
+
+class ValueSet;
+
+class SVT_DLLPUBLIC SvtLineListBox
+{
+public:
+ typedef Color (*ColorFunc)(Color);
+ typedef Color (*ColorDistFunc)(Color, Color);
+
+ SvtLineListBox(std::unique_ptr<weld::MenuButton> pControl);
+ ~SvtLineListBox();
+
+ static OUString GetLineStyleName(SvxBorderLineStyle eStyle);
+
+ /** Set the width in Twips */
+ void SetWidth(tools::Long nWidth)
+ {
+ m_nWidth = nWidth;
+ UpdateEntries();
+ UpdatePreview();
+ }
+
+ tools::Long GetWidth() const { return m_nWidth; }
+
+ /** Insert a listbox entry with all widths in Twips. */
+ void InsertEntry(const BorderWidthImpl& rWidthImpl,
+ SvxBorderLineStyle nStyle, tools::Long nMinWidth = 0,
+ ColorFunc pColor1Fn = &sameColor,
+ ColorFunc pColor2Fn = &sameColor,
+ ColorDistFunc pColorDistFn = &sameDistColor);
+
+ void SelectEntry( SvxBorderLineStyle nStyle );
+ SvxBorderLineStyle GetSelectEntryStyle() const;
+
+ void SetSourceUnit( FieldUnit eNewUnit ) { eSourceUnit = eNewUnit; }
+
+ void SetColor( const Color& rColor )
+ {
+ aColor = rColor;
+ UpdateEntries();
+ UpdatePreview();
+ }
+
+ const Color& GetColor() const { return aColor; }
+
+ void SetSelectHdl(const Link<SvtLineListBox&,void>& rLink) { maSelectHdl = rLink; }
+
+ void set_sensitive(bool bSensitive) { m_xControl->set_sensitive(bSensitive); }
+
+private:
+
+ SVT_DLLPRIVATE void ImpGetLine( tools::Long nLine1, tools::Long nLine2, tools::Long nDistance,
+ Color nColor1, Color nColor2, Color nColorDist,
+ SvxBorderLineStyle nStyle, BitmapEx& rBmp );
+
+ void UpdatePaintLineColor(); // returns sal_True if maPaintCol has changed
+ DECL_DLLPRIVATE_LINK(ValueSelectHdl, ValueSet*, void);
+ DECL_DLLPRIVATE_LINK(FocusHdl, weld::Widget&, void);
+ DECL_DLLPRIVATE_LINK(ToggleHdl, weld::Toggleable&, void);
+ DECL_DLLPRIVATE_LINK(NoneHdl, weld::Button&, void);
+
+ void UpdateEntries();
+ sal_Int32 GetStylePos(sal_Int32 nListPos) const;
+
+ const Color& GetPaintColor() const
+ {
+ return maPaintCol;
+ }
+ Color GetColorLine1( sal_Int32 nPos );
+ Color GetColorLine2( sal_Int32 nPos );
+ Color GetColorDist( sal_Int32 nPos );
+
+ void UpdatePreview();
+
+ SvtLineListBox( const SvtLineListBox& ) = delete;
+ SvtLineListBox& operator =( const SvtLineListBox& ) = delete;
+
+ std::unique_ptr<weld::MenuButton> m_xControl;
+ std::unique_ptr<weld::Builder> m_xBuilder;
+ std::unique_ptr<weld::Widget> m_xTopLevel;
+ std::unique_ptr<weld::Button> m_xNoneButton;
+ std::unique_ptr<ValueSet> m_xLineSet;
+ std::unique_ptr<weld::CustomWeld> m_xLineSetWin;
+
+ std::vector<std::unique_ptr<ImpLineListData>> m_vLineList;
+ tools::Long m_nWidth;
+ ScopedVclPtr<VirtualDevice> aVirDev;
+ Color aColor;
+ Color maPaintCol;
+ FieldUnit eSourceUnit;
+ Link<SvtLineListBox&,void> maSelectHdl;
+};
+
+class SVT_DLLPUBLIC SvtCalendarBox
+{
+public:
+ SvtCalendarBox(std::unique_ptr<weld::MenuButton> pControl, bool bUseLabel = true);
+ ~SvtCalendarBox();
+
+ weld::MenuButton& get_button() { return *m_xControl; }
+
+ void set_date(const Date& rDate);
+ Date get_date() const { return m_xCalendar->get_date(); }
+
+ void set_label(const OUString& rLabel) { m_xControl->set_label(rLabel); }
+ OUString get_label() const { return m_xControl->get_label(); }
+
+ void set_sensitive(bool bSensitive) { m_xControl->set_sensitive(bSensitive); }
+ bool get_sensitive() const { return m_xControl->get_sensitive(); }
+ void set_visible(bool bSensitive) { m_xControl->set_visible(bSensitive); }
+ void show() { set_visible(true); }
+ void grab_focus() { m_xControl->grab_focus(); }
+
+ void connect_activated(const Link<SvtCalendarBox&, void>& rActivatedHdl) { m_aActivatedHdl = rActivatedHdl; }
+ void connect_selected(const Link<SvtCalendarBox&, void>& rSelectHdl) { m_aSelectHdl = rSelectHdl; }
+
+ void connect_focus_in(const Link<weld::Widget&, void>& rLink) { m_xControl->connect_focus_in(rLink); }
+ void connect_focus_out(const Link<weld::Widget&, void>& rLink) { m_xControl->connect_focus_out(rLink); }
+private:
+ DECL_DLLPRIVATE_LINK(SelectHdl, weld::Calendar&, void);
+ DECL_DLLPRIVATE_LINK(ActivateHdl, weld::Calendar&, void);
+
+ bool m_bUseLabel;
+
+ std::unique_ptr<weld::MenuButton> m_xControl;
+ std::unique_ptr<weld::Builder> m_xBuilder;
+ std::unique_ptr<weld::Widget> m_xTopLevel;
+ std::unique_ptr<weld::Calendar> m_xCalendar;
+
+ Link<SvtCalendarBox&, void> m_aActivatedHdl;
+ Link<SvtCalendarBox&, void> m_aSelectHdl;
+
+ void set_label_from_date();
+};
+
+class SVT_DLLPUBLIC FontNameBox
+{
+private:
+ std::unique_ptr<weld::ComboBox> m_xComboBox;
+ std::unique_ptr<ImplFontList> mpFontList;
+ size_t mnPreviewProgress;
+ bool mbWYSIWYG;
+ OUString maFontMRUEntriesFile;
+ Idle maUpdateIdle;
+
+ SVT_DLLPRIVATE void ImplDestroyFontList();
+
+ DECL_DLLPRIVATE_LINK(CustomRenderHdl, weld::ComboBox::render_args, void);
+ DECL_DLLPRIVATE_LINK(CustomGetSizeHdl, OutputDevice&, Size);
+ DECL_DLLPRIVATE_LINK(SettingsChangedHdl, VclSimpleEvent&, void);
+ DECL_DLLPRIVATE_LINK(UpdateHdl, Timer*, void);
+
+ void LoadMRUEntries( const OUString& aFontMRUEntriesFile );
+ void SaveMRUEntries( const OUString& aFontMRUEntriesFile ) const;
+
+ OutputDevice& CachePreview(size_t nIndex, Point* pTopLeft);
+
+public:
+ FontNameBox(std::unique_ptr<weld::ComboBox> p);
+ ~FontNameBox();
+
+ void Fill( const FontList* pList );
+
+ void EnableWYSIWYG(bool bEnable);
+ bool IsWYSIWYGEnabled() const { return mbWYSIWYG; }
+
+ void connect_changed(const Link<weld::ComboBox&, void>& rLink) { m_xComboBox->connect_changed(rLink); }
+ void connect_focus_in(const Link<weld::Widget&, void>& rLink) { m_xComboBox->connect_focus_in(rLink); }
+ void connect_focus_out(const Link<weld::Widget&, void>& rLink) { m_xComboBox->connect_focus_out(rLink); }
+ void connect_key_press(const Link<const KeyEvent&, bool>& rLink) { m_xComboBox->connect_key_press(rLink); }
+ int get_active() const { return m_xComboBox->get_active(); }
+ OUString get_active_text() const { return m_xComboBox->get_active_text(); }
+ void set_active_or_entry_text(const OUString& rText);
+ void set_active(int nPos) { m_xComboBox->set_active(nPos); }
+ int get_count() const { return m_xComboBox->get_count(); }
+ OUString get_text(int nIndex) const { return m_xComboBox->get_text(nIndex); }
+ void set_sensitive(bool bSensitive) { m_xComboBox->set_sensitive(bSensitive); }
+ void save_value() { m_xComboBox->save_value(); }
+ OUString const& get_saved_value() const { return m_xComboBox->get_saved_value(); }
+ void select_entry_region(int nStartPos, int nEndPos) { m_xComboBox->select_entry_region(nStartPos, nEndPos); }
+ bool get_entry_selection_bounds(int& rStartPos, int& rEndPos) { return m_xComboBox->get_entry_selection_bounds(rStartPos, rEndPos); }
+ void clear() { m_xComboBox->clear(); }
+ void grab_focus() { m_xComboBox->grab_focus(); }
+ bool has_focus() const { return m_xComboBox->has_focus(); }
+ void connect_entry_activate(const Link<weld::ComboBox&, bool>& rLink) { m_xComboBox->connect_entry_activate(rLink); }
+ void connect_get_property_tree(const Link<tools::JsonWriter&, void>& rLink) { m_xComboBox->connect_get_property_tree(rLink); }
+ void set_entry_width_chars(int nWidth) { m_xComboBox->set_entry_width_chars(nWidth); }
+ void set_size_request(int nWidth, int nHeight) { m_xComboBox->set_size_request(nWidth, nHeight); }
+ int get_max_mru_count() const { return m_xComboBox->get_max_mru_count(); }
+ void set_max_mru_count(int nCount) { m_xComboBox->set_max_mru_count(nCount); }
+
+ // font size is in points, not pixels, e.g. see Window::[G]etPointFont
+ void set_entry_font(const vcl::Font& rFont) { m_xComboBox->set_entry_font(rFont); }
+ vcl::Font get_entry_font() { return m_xComboBox->get_entry_font(); }
+
+ void set_tooltip_text(const OUString& rTip) { m_xComboBox->set_tooltip_text(rTip); }
+
+private:
+ void InitFontMRUEntriesFile();
+
+ FontNameBox( const FontNameBox& ) = delete;
+ FontNameBox& operator =( const FontNameBox& ) = delete;
+};
+
+class SVT_DLLPUBLIC FontStyleBox
+{
+ std::unique_ptr<weld::ComboBox> m_xComboBox;
+public:
+ FontStyleBox(std::unique_ptr<weld::ComboBox> p);
+
+ void Fill(std::u16string_view rName, const FontList* pList);
+
+ void connect_changed(const Link<weld::ComboBox&, void>& rLink) { m_xComboBox->connect_changed(rLink); }
+ OUString get_active_text() const { return m_xComboBox->get_active_text(); }
+ void set_active_text(const OUString& rText) { m_xComboBox->set_active_text(rText); }
+ void set_size_request(int nWidth, int nHeight) { m_xComboBox->set_size_request(nWidth, nHeight); }
+
+ void append_text(const OUString& rStr) { m_xComboBox->append_text(rStr); }
+ void set_sensitive(bool bSensitive) { m_xComboBox->set_sensitive(bSensitive); }
+ void save_value() { m_xComboBox->save_value(); }
+ OUString const& get_saved_value() const { return m_xComboBox->get_saved_value(); }
+ int get_count() const { return m_xComboBox->get_count(); }
+ int find_text(const OUString& rStr) const { return m_xComboBox->find_text(rStr); }
+private:
+ FontStyleBox(const FontStyleBox& ) = delete;
+ FontStyleBox& operator=(const FontStyleBox&) = delete;
+};
+
+class SVT_DLLPUBLIC FontSizeBox
+{
+ const FontList* pFontList;
+ int nSavedValue;
+ int nMin;
+ int nMax;
+ FieldUnit eUnit;
+ sal_uInt16 nDecimalDigits;
+ sal_uInt16 nRelMin;
+ sal_uInt16 nRelMax;
+ sal_uInt16 nRelStep;
+ short nPtRelMin;
+ short nPtRelMax;
+ short nPtRelStep;
+ bool bRelativeMode:1,
+ bRelative:1,
+ bPtRelative:1,
+ bStdSize:1;
+ Link<weld::ComboBox&, void> m_aChangeHdl;
+ Link<weld::Widget&, void> m_aFocusOutHdl;
+ std::unique_ptr<weld::ComboBox> m_xComboBox;
+
+ sal_uInt16 GetDecimalDigits() const { return nDecimalDigits; }
+ void SetDecimalDigits(sal_uInt16 nDigits) { nDecimalDigits = nDigits; }
+ FieldUnit GetUnit() const { return eUnit; }
+ void SetUnit(FieldUnit _eUnit) { eUnit = _eUnit; }
+ void SetRange(int nNewMin, int nNewMax) { nMin = nNewMin; nMax = nNewMax; }
+ void SetValue(int nNewValue, FieldUnit eInUnit);
+
+ void InsertValue(int i);
+
+ OUString format_number(int nValue) const;
+
+ DECL_DLLPRIVATE_LINK(ModifyHdl, weld::ComboBox&, void);
+ DECL_DLLPRIVATE_LINK(ReformatHdl, weld::Widget&, void);
+public:
+ FontSizeBox(std::unique_ptr<weld::ComboBox> p);
+
+ void Fill(const FontList* pList);
+
+ void EnableRelativeMode(sal_uInt16 nMin, sal_uInt16 nMax, sal_uInt16 nStep = 5);
+ void EnablePtRelativeMode(short nMin, short nMax, short nStep = 10);
+ bool IsRelativeMode() const { return bRelativeMode; }
+ void SetRelative( bool bRelative );
+ bool IsRelative() const { return bRelative; }
+ void SetPtRelative( bool bPtRel )
+ {
+ bPtRelative = bPtRel;
+ SetRelative(true);
+ }
+ bool IsPtRelative() const { return bPtRelative; }
+
+ void connect_changed(const Link<weld::ComboBox&, void>& rLink) { m_aChangeHdl = rLink; }
+ void connect_focus_out(const Link<weld::Widget&, void>& rLink) { m_aFocusOutHdl = rLink; }
+ void connect_key_press(const Link<const KeyEvent&, bool>& rLink) { m_xComboBox->connect_key_press(rLink); }
+ OUString get_active_text() const { return m_xComboBox->get_active_text(); }
+ void set_active_or_entry_text(const OUString& rText);
+ void set_sensitive(bool bSensitive) { m_xComboBox->set_sensitive(bSensitive); }
+ void set_size_request(int nWidth, int nHeight) { m_xComboBox->set_size_request(nWidth, nHeight); }
+
+ int get_active() const { return m_xComboBox->get_active(); }
+ int get_value() const;
+ void set_value(int nValue);
+ void save_value() { nSavedValue = get_value(); }
+ int get_saved_value() const { return nSavedValue; }
+ bool get_value_changed_from_saved() const { return get_value() != get_saved_value(); }
+ int get_count() const { return m_xComboBox->get_count(); }
+ OUString get_text(int i) const { return m_xComboBox->get_text(i); }
+ void grab_focus() { m_xComboBox->grab_focus(); }
+ bool has_focus() const { return m_xComboBox->has_focus(); }
+ void connect_entry_activate(const Link<weld::ComboBox&, bool>& rLink) { m_xComboBox->connect_entry_activate(rLink); }
+ void disable_entry_completion() { m_xComboBox->set_entry_completion(false, false); }
+ void connect_get_property_tree(const Link<tools::JsonWriter&, void>& rLink) { m_xComboBox->connect_get_property_tree(rLink); }
+
+private:
+ FontSizeBox(const FontSizeBox&) = delete;
+ FontSizeBox& operator=(const FontSizeBox&) = delete;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */