33#include <com/sun/star/accessibility/AccessibleEventId.hpp>
34#include <com/sun/star/lang/XComponent.hpp>
35#include <rtl/ustring.hxx>
41#include <uiobject.hxx>
45using namespace css::uno;
46using namespace css::lang;
47using namespace css::accessibility;
51void collectUIInformation(
const OUString& aID ,
const OUString& aParentID ,
const OUString& aPos )
54 aDescription.
aID = aID ;
56 aDescription.
aAction =
"SELECT";
58 aDescription.
aParent = aParentID;
65 ITEM_OFFSET_DOUBLE = 6,
76 , mxScrolledWindow(
std::move(pScrolledWindow))
112 CustomWidgetController::SetDrawingArea(pDrawingArea);
126 Reference<XComponent> xComponent(
mxAccessible, UNO_QUERY);
128 xComponent->dispose();
137 for (
size_t i = 0;
i <
n; ++
i )
218 const size_t nItemCount =
mItemList.size();
220 for (
size_t n = 0;
n < nItemCount; ++
n )
245 auto nNewFirstLine = rScrollWin.vadjustment_get_value();
246 if ( nNewFirstLine != mnFirstLine )
248 mnFirstLine = nNewFirstLine;
257 rRenderContext.
Erase();
263 SAL_INFO(
"svtools",
"value set getting focus");
265 CustomWidgetController::GetFocus();
275 SAL_INFO(
"svtools",
"value set losing focus");
277 CustomWidgetController::LoseFocus();
290 CustomWidgetController::Resize();
298 return CustomWidgetController::KeyInput(rKeyEvent);
317 nItemPos = nLastItem;
325 nItemPos = nCurPos-1;
335 if (nCurPos < nLastItem)
343 nItemPos = nCurPos+1;
351 return CustomWidgetController::KeyInput(rKeyEvent);
358 if (nCurPos == nLastItem)
367 if (nCurPos >= nVStep)
370 nItemPos = nCurPos-nVStep;
376 else if (nCurPos >
mnCols)
379 nItemPos = nCurPos %
mnCols;
387 return CustomWidgetController::KeyInput(rKeyEvent);
392 if (nCurPos != nLastItem)
400 nItemPos = nCurPos+nVStep;
402 if (nItemPos > nLastItem)
404 nItemPos = nLastItem;
416 const sal_uInt16 nItemId =
GetItemId(nCurPos);
425 return CustomWidgetController::KeyInput(rKeyEvent);
474 bool bConsumed =
false;
483 else if (pItem && rMouseEvent.
GetClicks() == 2)
491 return CustomWidgetController::MouseButtonDown( rMouseEvent );
504 return CustomWidgetController::MouseButtonUp( rMouseEvent );
512 return CustomWidgetController::MouseMove(rMouseEvent);
642 const size_t nVisibleEnd = nVisibleBegin +
static_cast<size_t>(
mnVisLines)*
mnCols;
646 if ( nPos<nVisibleBegin || nPos>=nVisibleEnd ||
nPos>=
mItemList.size() )
649 nPos -= nVisibleBegin;
690 if (!(rStyleSettings.
GetOptions() & StyleSettingsOptions::Mono))
693 rRenderContext.
DrawLine(aPos1, aPos2);
700 rRenderContext.
DrawLine(aPos1, aPos2);
754 bool bNewLine =
false;
758 Format(pNeedsFormatToScroll->get_ref_device());
767 sal_uInt16 nNewLine =
static_cast<sal_uInt16
>(nItemPos /
mnCols);
807 aOldAny <<=
Reference(getXWeak(pItemAcc));
823 if (pItem !=
nullptr)
830 aNewAny <<=
Reference(getXWeak(pItemAcc));
876 nOff = ITEM_OFFSET_DOUBLE;
892 aWinSize.
AdjustHeight( -(NAME_LINE_HEIGHT + NAME_LINE_OFF_Y) );
901 nNoneHeight = nTxtHeight + nOff;
939 bool bAdjustmentOutOfDate = nOldLines !=
mnLines;
959 bAdjustmentOutOfDate |= nOldVisLines !=
mnVisLines;
993 nCalcHeight -= nLineSpace;
999 maVirDev->SetOutputSizePixel(aWinSize);
1015 for (
size_t i = 0;
i < nItemCount;
i++)
1051 nStartX = (aWinSize.
Width() - nAllItemWidth) / 2;
1052 nStartY = (aWinSize.
Height() - nAllItemHeight) / 2;
1081 y += nNoneHeight + nNoneSpace;
1102 for (
size_t i = 0;
i < nItemCount;
i++)
1106 if (
i >= nFirstItem &&
i < nLastItem)
1146 bool bTurnScrollbarOn =
mxScrolledWindow->get_vpolicy() != VclPolicyType::ALWAYS;
1147 if (bAdjustmentOutOfDate || bTurnScrollbarOn)
1156 if (bTurnScrollbarOn)
1181 const bool bHover = pSelectedItem == pHighlightItem;
1184 if (pHighlightItem && (pSelectedItem != pHighlightItem ||
mbNoSelection))
1198 bDrawFocus = pSelectedItem == pHighlightItem &&
mbNoSelection;
1227 const bool bFocus,
const bool bDrawSel,
1228 const bool bSelected,
const bool bHover)
1239 sal_uInt16 nTransparencePercent = 0;
1241 if (bSelected && bHover)
1246 else if (bSelected || bHover)
1252 nTransparencePercent = 55;
1311 rRenderContext.
DrawRect(aFocusRect);
1333 const int nThickness =
nAdjust * 2;
1338 nTransparencePercent / 100.0,
1342 SAL_WARN(
"svtools",
"presumably impossible in practice, but fallback to see something");
1353 rRenderContext.
DrawRect(aFocusRect);
1407 if ((aTxtPos.
X() + nTxtWidth) > aRect.
Right())
1450 nImageStyle |= DrawImageFlags::Disable;
1452 if (aImageSize.
Width() > aRectSize.
Width() ||
1474 (aRect.
GetWidth() - nTxtWidth) / 2,
1486 if (nEdgeBlendingPercent)
1490 const sal_uInt8 nAlpha((nEdgeBlendingPercent * 255) / 100);
1514 nTxtOffset += NAME_LINE_HEIGHT+NAME_LINE_OFF_Y;
1520 rRenderContext.
DrawText(
Point((aWinSize.
Width() - nTxtWidth) / 2, nTxtOffset + (NAME_OFFSET / 2)), rText);
1522 rRenderContext.
Pop();
1528 CustomWidgetController::StyleUpdated();
1596 sal_uInt16 nDesireLines )
const
1598 size_t nCalcCols = nDesireCols;
1599 size_t nCalcLines = nDesireLines;
1620 nCalcLines = (
mItemList.size()+nCalcCols-1) / nCalcCols;
1627 Size aSize( rItemSize.
Width() * nCalcCols, rItemSize.
Height() * nCalcLines );
1635 n = ITEM_OFFSET_DOUBLE;
1655 aSize.
AdjustHeight(NAME_LINE_HEIGHT + NAME_LINE_OFF_Y );
1668 std::unique_ptr<ValueSetItem> pItem(
new ValueSetItem( *
this ));
1669 pItem->mnId = nItemId;
1671 pItem->maImage = rImage;
1676 const OUString& rText,
size_t nPos,
1679 std::unique_ptr<ValueSetItem> pItem(
new ValueSetItem( *
this ));
1680 pItem->mnId = nItemId;
1682 pItem->maImage = rImage;
1683 pItem->maText = rText;
1689 std::unique_ptr<ValueSetItem> pItem(
new ValueSetItem( *
this ));
1690 pItem->mnId = nItemId;
1696 const OUString& rText )
1698 std::unique_ptr<ValueSetItem> pItem(
new ValueSetItem( *
this ));
1699 pItem->mnId = nItemId;
1701 pItem->maColor = rColor;
1702 pItem->maText = rText;
1708 DBG_ASSERT( pItem->mnId,
"ValueSet::InsertItem(): ItemId == 0" );
1710 "ValueSet::InsertItem(): ItemId already exists" );
1715 mItemList.push_back( std::move(pItem) );
1744 Size aSize = rItemSize;
1752 n = ITEM_OFFSET_DOUBLE;
1784 DBG_ASSERT( nItemId,
"ValueSet::InsertItem(): ItemId == 0" );
1786 "ValueSet::InsertItem(): ItemId already exists" );
1787 std::unique_ptr<ValueSetItem> pItem(
new ValueSetItem( *
this ));
1788 pItem->mnId = nItemId;
1790 pItem->maText = rText;
1884 OUString sString (pItem->
maText);
1885 aOldName <<= sString;
1887 aNewName <<= sString;
1898 if (nTempId == nItemId)
1904 Reference<XAccessible> xAccessible(pItem->
GetAccessible(
false));
1914 for (
const std::unique_ptr<ValueSetItem>& pItem :
mItemList)
1916 if (!pItem->mbVisible)
1926 Size aSize = pItem->maImage.GetSizePixel();
1932 maVirDev->GetTextWidth(pItem->maText) + NAME_OFFSET) );
1939 return aLargestItem;
1973 CustomWidgetController::Show();
1978 CustomWidgetController::Hide();
BitmapEx VCL_DLLPUBLIC createBlendFrame(const Size &rSize, sal_uInt8 nAlpha, Color aColorTopLeft, Color aColorBottomRight)
const StyleSettings & GetStyleSettings() const
static const AllSettings & GetSettings()
void DrawFrame(const tools::Rectangle &rRect, const Color &rLeftTopColor, const Color &rRightBottomColor)
Size GetSizePixel() const
const vcl::KeyCode & GetKeyCode() const
bool IsLeaveWindow() const
sal_uInt16 GetClicks() const
const Point & GetPosPixel() const
const vcl::Font & GetFont() const
void DrawPolyLine(const tools::Polygon &rPoly)
void DrawRect(const tools::Rectangle &rRect)
void DrawLine(const Point &rStartPt, const Point &rEndPt)
tools::Long GetTextWidth(const OUString &rStr, sal_Int32 nIndex=0, sal_Int32 nLen=-1, vcl::text::TextLayoutCache const *=nullptr, SalLayoutGlyphs const *const pLayoutCache=nullptr) const
void SetTextColor(const Color &rColor)
bool DrawPolyLineDirect(const basegfx::B2DHomMatrix &rObjectTransform, const basegfx::B2DPolygon &rB2DPolygon, double fLineWidth=0.0, double fTransparency=0.0, const std::vector< double > *=nullptr, basegfx::B2DLineJoin eLineJoin=basegfx::B2DLineJoin::NONE, css::drawing::LineCap eLineCap=css::drawing::LineCap_BUTT, double fMiterMinimumAngle=basegfx::deg2rad(15.0))
SAL_DLLPRIVATE void DrawOutDev(const Point &, const Size &, const Point &, const Size &, const Printer &)=delete
void Push(vcl::PushFlags nFlags=vcl::PushFlags::ALL)
tools::Long GetTextHeight() const
void DrawText(const Point &rStartPt, const OUString &rStr, sal_Int32 nIndex=0, sal_Int32 nLen=-1, std::vector< tools::Rectangle > *pVector=nullptr, OUString *pDisplayText=nullptr, const SalLayoutGlyphs *pLayoutCache=nullptr)
void DrawTransparent(const tools::PolyPolygon &rPolyPoly, sal_uInt16 nTransparencePercent)
constexpr tools::Long Y() const
tools::Long AdjustY(tools::Long nVertMove)
tools::Long AdjustX(tools::Long nHorzMove)
constexpr tools::Long X() const
constexpr tools::Long Height() const
tools::Long AdjustHeight(tools::Long n)
void setWidth(tools::Long nWidth)
tools::Long AdjustWidth(tools::Long n)
void setHeight(tools::Long nHeight)
constexpr tools::Long Width() const
const Color & GetWindowColor() const
const Color & GetShadowColor() const
const Color & GetMenuColor() const
StyleSettingsOptions GetOptions() const
const Color & GetWindowTextColor() const
const Color & GetActiveColor() const
const Color & GetLightColor() const
const Color & GetEdgeBlendingTopLeftColor() const
const Color & GetHighlightColor() const
const Color & GetFaceColor() const
const Color & GetMenuTextColor() const
const Color & GetHighlightTextColor() const
sal_uInt16 GetEdgeBlending() const
const Color & GetActiveTextColor() const
const Color & GetEdgeBlendingBottomRightColor() const
static UITestLogger & getInstance()
void logEvent(const EventDescription &rDescription)
static ValueItemAcc * getImplementation(const css::uno::Reference< css::uno::XInterface > &rxData) noexcept
void FireAccessibleEvent(short nEventId, const css::uno::Any &rOldValue, const css::uno::Any &rNewValue)
bool HasAccessibleListeners() const
static ValueSetAcc * getImplementation(const css::uno::Reference< css::uno::XInterface > &rxData) noexcept
void GetFocus()
Called by the corresponding ValueSet when it gets the focus.
void LoseFocus()
Called by the corresponding ValueSet when it loses the focus.
void FireAccessibleEvent(short nEventId, const css::uno::Any &rOldValue, const css::uno::Any &rNewValue)
static std::unique_ptr< UIObject > create(vcl::Window *pWindow)
SVT_DLLPRIVATE void ImplDeleteItems()
void RecalculateItemSizes()
An inelegant method; sets the item width & height such that all of the included items and their label...
void InsertItem(sal_uInt16 nItemId, const Image &rImage)
Insert @rImage item.
virtual bool MouseMove(const MouseEvent &rMEvt) override
SVT_DLLPRIVATE void TurnOnScrollBar()
Size GetLargestItemSize()
virtual void Show() override
tools::Long mnUserItemWidth
Link< ValueSet *, void > maSelectHdl
int GetScrollWidth() const
tools::Rectangle maNoneItemRect
SVT_DLLPRIVATE bool ImplHasAccessibleListeners() const
virtual ~ValueSet() override
OUString const & GetText() const
size_t GetItemCount() const
SVT_DLLPRIVATE tools::Rectangle ImplGetItemRect(size_t nPos) const
virtual OUString RequestHelp(tools::Rectangle &rHelpRect) override
OUString GetItemText(sal_uInt16 nItemId) const
void SetItemData(sal_uInt16 nItemId, void *pData)
void SetEdgeBlending(bool bNew)
void SetItemText(sal_uInt16 nItemId, const OUString &rStr)
virtual void LoseFocus() override
SVT_DLLPRIVATE void QueueReformat()
void SetStyle(WinBits nStyle)
void SelectItem(sal_uInt16 nItemId)
SVT_DLLPRIVATE void SetFirstLine(sal_uInt16 nNewFirstLine)
SVT_DLLPRIVATE void RecalcScrollBar()
sal_uInt16 GetSelectedItemId() const
SVT_DLLPRIVATE void ImplInsertItem(std::unique_ptr< ValueSetItem > pItem, const size_t nPos)
Size CalcWindowSizePixel(const Size &rItemSize, sal_uInt16 nCalcCols=0, sal_uInt16 nCalcLines=0) const
SVT_DLLPRIVATE ValueSetItem * ImplGetDrawSelectItem(sal_uInt16 nItemId, const bool bFocus, tools::Rectangle &rRect)
virtual void UserDraw(const UserDrawEvent &rUDEvt)
css::uno::Reference< css::accessibility::XAccessible > mxAccessible
std::unique_ptr< ValueSetItem > mpNoneItem
void EnableFullItemMode(bool bFullMode)
SVT_DLLPRIVATE size_t ImplGetItem(const Point &rPoint) const
Size CalcItemSizePixel(const Size &rSize) const
virtual bool MouseButtonUp(const MouseEvent &rMEvt) override
tools::Long mnUserItemHeight
SVT_DLLPRIVATE void ImplFormatItem(vcl::RenderContext const &rRenderContext, ValueSetItem *pItem, tools::Rectangle aRect)
void SetLineCount(sal_uInt16 nNewLines=0)
SVT_DLLPRIVATE ValueSetItem * ImplGetFirstItem()
virtual FactoryFunction GetUITestFactory() const override
void * GetItemData(sal_uInt16 nItemId) const
ScopedVclPtr< VirtualDevice > maVirDev
virtual void Paint(vcl::RenderContext &rRenderContext, const tools::Rectangle &rRect) override
SVT_DLLPRIVATE void ImplTracking(bool bLeaveWindow, const Point &rPos)
Color GetItemColor(sal_uInt16 nItemId) const
SVT_DLLPRIVATE bool TurnOffScrollBar()
SVT_DLLPRIVATE sal_uInt16 ImplGetVisibleItemCount() const
virtual void StyleUpdated() override
bool GetEdgeBlending() const
SVT_DLLPRIVATE void ImplFireAccessibleEvent(short nEventId, const css::uno::Any &rOldValue, const css::uno::Any &rNewValue)
void SetColCount(sal_uInt16 nNewCols=1)
virtual void Resize() override
virtual void Hide() override
void Format(vcl::RenderContext const &rRenderContext)
void SetItemColor(sal_uInt16 nItemId, const Color &rColor)
SVT_DLLPRIVATE void ImplDrawSelect(vcl::RenderContext &rRenderContext, const tools::Rectangle &rRect, const ValueSetItem *pItem, const bool bFocus, const bool bDrawSel, const bool bSelected, const bool bHover)
SVT_DLLPRIVATE void ImplDraw(vcl::RenderContext &rRenderContext)
void SetItemImage(sal_uInt16 nItemId, const Image &rImage)
Link< ValueSet *, void > maDoubleClickHdl
virtual void GetFocus() override
tools::Rectangle GetItemRect(sal_uInt16 nItemId) const
ValueSet(const ValueSet &)=delete
void SetItemHeight(tools::Long nLineHeight)
virtual bool MouseButtonDown(const MouseEvent &rMEvt) override
sal_uInt16 mnUserVisLines
tools::Rectangle maItemListRect
virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessible() override
SVT_DLLPRIVATE void ImplHighlightItem(sal_uInt16 nItemId)
size_t GetItemPos(sal_uInt16 nItemId) const
sal_uInt16 GetItemId(size_t nPos) const
std::unique_ptr< weld::ScrolledWindow > mxScrolledWindow
DrawFrameStyle mnFrameStyle
void RemoveItem(sal_uInt16 nItemId)
virtual bool KeyInput(const KeyEvent &rKEvt) override
SVT_DLLPRIVATE void ImplDrawItemText(vcl::RenderContext &rRenderContext, const OUString &rStr)
Image GetItemImage(sal_uInt16 nItemId) const
virtual void SetDrawingArea(weld::DrawingArea *pDrawingArea) override
void SetExtraSpacing(sal_uInt16 nNewSpacing)
void SetItemWidth(tools::Long nItemWidth)
reference_type * get() const
sal_uInt16 GetCode() const
constexpr ::Color COL_LIGHTGRAY(0xC0, 0xC0, 0xC0)
constexpr ::Color COL_TRANSPARENT(ColorTransparency, 0xFF, 0xFF, 0xFF, 0xFF)
#define DBG_ASSERT(sCon, aError)
std::function< std::unique_ptr< UIObject >(vcl::Window *)> FactoryFunction
constexpr sal_uInt16 KEY_RETURN
constexpr sal_uInt16 KEY_HOME
constexpr sal_uInt16 KEY_LEFT
constexpr sal_uInt16 KEY_PAGEDOWN
constexpr sal_uInt16 KEY_UP
constexpr sal_uInt16 KEY_RIGHT
constexpr sal_uInt16 KEY_DOWN
constexpr sal_uInt16 KEY_PAGEUP
constexpr sal_uInt16 KEY_END
#define LINK(Instance, Class, Member)
#define SAL_WARN(area, stream)
#define SAL_INFO(area, stream)
std::unique_ptr< sal_Int32[]> pData
RttiCompleteObjectLocator col
tools::Long const nBorder
B2DPolygon createPolygonFromRect(const B2DRectangle &rRect, double fRadiusX, double fRadiusY)
constexpr std::enable_if_t< std::is_signed_v< T >, std::make_unsigned_t< T > > make_unsigned(T value)
VCL_DLLPUBLIC void InvertFocusRect(vcl::RenderContext &rRenderContext, const tools::Rectangle &rRect)
std::map< OUString, OUString > aParameters
css::uno::Reference< css::accessibility::XAccessible > GetAccessible(bool bIsTransientChildrenDisabled)
#define VALUESET_ITEM_NONEITEM
@ VALUESETITEM_IMAGE_AND_TEXT
IMPL_LINK(ValueSet, ImplScrollHdl, weld::ScrolledWindow &, rScrollWin, void)
#define VALUESET_ITEM_NOTFOUND
#define WB_MENUSTYLEVALUESET
#define WB_NO_DIRECTSELECT