25 #include <boost/property_tree/ptree.hpp>
48 #define TB_SEP_SIZE 8 // Separator size
62 mbNativeButtons =
false;
63 mbIsPaintLocked =
false;
64 mbAssumeDocked =
false;
65 mbAssumePopupMode =
false;
66 mbAssumeFloating =
false;
67 mbKeyInputDisabled =
false;
68 mbMenubuttonSelected =
false;
69 mbMenubuttonWasLastSelected =
false;
70 mbWillUsePopupMode =
false;
71 mbDropDownByKeyboard =
false;
76 m_pLayoutData.reset();
77 mpMenu.disposeAndClear();
85 mbNonInteractiveWindow =
false;
92 mbEmptyBtn = bEmptyBtn;
97 mnImageAngle = 0_deg10;
99 mbVisibleText =
false;
112 init(nItemId, nItemBits,
false);
119 init(nItemId, nItemBits,
false);
127 init(nItemId, nItemBits,
false);
132 Size aSize( rDefaultSize );
148 bCheckMaxWidth =
false;
150 if ( !bCheckMaxWidth || (aWinSize.
Width() <= maxWidth) )
193 rbImage = rbText =
false;
202 bHasText = !
maText.isEmpty();
209 if( bHasImage || !bHasText )
222 if( bHasText || !bHasImage )
379 SAL_WARN_IF( !nItemId,
"vcl",
"ToolBox::InsertItem(): ItemId == 0" );
381 "ToolBox::InsertItem(): ItemId already exists" );
384 mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ?
mpData->m_aItems.begin()+nPos :
mpData->m_aItems.end(),
386 mpData->ImplClearLayoutData();
391 ImplToolItems::size_type nNewPos = ( nPos ==
APPEND ) ? (
mpData->m_aItems.size() - 1 ) : nPos;
396 ImplToolItems::size_type nPos )
398 SAL_WARN_IF( !nItemId,
"vcl",
"ToolBox::InsertItem(): ItemId == 0" );
400 "ToolBox::InsertItem(): ItemId already exists" );
403 mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ?
mpData->m_aItems.begin()+nPos :
mpData->m_aItems.end(),
405 mpData->ImplClearLayoutData();
410 ImplToolItems::size_type nNewPos = ( nPos ==
APPEND ) ? (
mpData->m_aItems.size() - 1 ) : nPos;
416 SAL_WARN_IF( !nItemId,
"vcl",
"ToolBox::InsertItem(): ItemId == 0" );
418 "ToolBox::InsertItem(): ItemId already exists" );
421 mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ?
mpData->m_aItems.begin()+nPos :
mpData->m_aItems.end(),
423 mpData->ImplClearLayoutData();
428 ImplToolItems::size_type nNewPos = ( nPos ==
APPEND ) ? (
mpData->m_aItems.size() - 1 ) : nPos;
433 const Size& rRequestedSize, ImplToolItems::size_type nPos)
443 InsertItem(nItemId, aImage, aLabel, nBits, nPos);
456 SAL_WARN_IF( !nItemId,
"vcl",
"ToolBox::InsertWindow(): ItemId == 0" );
458 "ToolBox::InsertWindow(): ItemId already exists" );
462 aItem.
mnId = nItemId;
466 mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ?
mpData->m_aItems.begin()+nPos :
mpData->m_aItems.end(), aItem );
467 mpData->ImplClearLayoutData();
475 ImplToolItems::size_type nNewPos = ( nPos ==
APPEND ) ? (
mpData->m_aItems.size() - 1 ) : nPos;
485 mpData->m_aItems.push_back( aItem );
486 mpData->ImplClearLayoutData();
491 ImplToolItems::size_type nNewPos =
mpData->m_aItems.size() - 1;
503 mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ?
mpData->m_aItems.begin()+nPos :
mpData->m_aItems.end(), aItem );
504 mpData->ImplClearLayoutData();
509 ImplToolItems::size_type nNewPos = ( nPos ==
APPEND ) ? (
mpData->m_aItems.size() - 1 ) : nPos;
519 mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ?
mpData->m_aItems.begin()+nPos :
mpData->m_aItems.end(), aItem );
520 mpData->ImplClearLayoutData();
525 ImplToolItems::size_type nNewPos = ( nPos ==
APPEND ) ? (
mpData->m_aItems.size() - 1 ) : nPos;
531 if( nPos >=
mpData->m_aItems.size() )
537 if (
mpData->m_aItems[nPos].mpWindow )
538 mpData->m_aItems[nPos].mpWindow->Hide();
551 mpData->m_aItems.erase(
mpData->m_aItems.begin()+nPos );
552 mpData->ImplClearLayoutData();
561 "ToolBox::CopyItem(): ItemId already exists" );
575 mpData->m_aItems.push_back( aNewItem );
576 mpData->ImplClearLayoutData();
581 ImplToolItems::size_type nNewPos2 =
mpData->m_aItems.size() - 1;
588 mpData->ImplClearLayoutData();
614 if(
mpData->meButtonSize != eSize )
616 mpData->meButtonSize = eSize;
624 return mpData->meButtonSize;
629 ImageType eImageType = ImageType::Size16;
631 eImageType = ImageType::Size26;
633 eImageType = ImageType::Size32;
643 Size aUnscaledSize(16, 16);
652 aUnscaledSize =
Size(32, 32);
654 return Size(aUnscaledSize.
Width() * fScaleFactor,
655 aUnscaledSize.
Height() * fScaleFactor);
674 if ( (eNewAlign == WindowAlign::Left) || (eNewAlign == WindowAlign::Right) )
718 ImplToolItems::size_type
nCount =
mpData->m_aItems.size();
719 for( ImplToolItems::size_type
nPos = 0;
nPos < nCount;
nPos++ )
729 auto it = std::find_if(
mpData->m_aItems.begin(),
mpData->m_aItems.end(),
730 [&rPos](
const ImplToolItem& rItem) {
return rItem.maRect.IsInside( rPos ); });
732 if( it !=
mpData->m_aItems.end() )
733 return std::distance(
mpData->m_aItems.begin(), it);
740 return (nPos < mpData->m_aItems.size()) ?
mpData->m_aItems[nPos].mnId : 0;
746 auto it = std::find_if(
mpData->m_aItems.begin(),
mpData->m_aItems.end(),
747 [&rPos](
const ImplToolItem& rItem) {
return rItem.maRect.IsInside( rPos ); });
761 if ( nPos < mpData->m_aItems.size() )
762 return mpData->m_aItems[nPos].maContentSize;
772 auto it = std::find_if(
mpData->m_aItems.begin(),
mpData->m_aItems.end(),
773 [&rCommand](
const ImplToolItem& rItem) {
return rItem.maCommandStr == rCommand; });
774 if (it !=
mpData->m_aItems.end())
795 case WindowAlign::Top:
799 if( devPos.Y() >= aScreen.
Bottom() )
800 aPos.setY( rRect.
Top() );
802 case WindowAlign::Bottom:
806 if( devPos.Y() <= aScreen.
Top() )
807 aPos.setY( rRect.
Bottom() );
809 case WindowAlign::Left:
813 if( devPos.X() >= aScreen.
Right() )
814 aPos.setX( rRect.
Left() );
816 case WindowAlign::Right:
820 if( devPos.X() <= aScreen.
Left() )
821 aPos.setX( rRect.
Right() );
844 if ( nPos < mpData->m_aItems.size() )
845 return mpData->m_aItems[nPos].maRect;
852 return mpData->maMenubuttonItem.maRect;
876 mpData->m_aItems[nPos].mnBits = nBits;
881 if ( nBits != nOldBits )
892 mpData->m_aItems[nPos].mbNonInteractiveWindow = bNonInteractive;
923 if ( nPos < mpData->m_aItems.size() )
925 mpData->m_aItems[nPos].mpUserData = pNewData;
968 return Image( aRotBitmapEx );
982 while( nDeltaAngle < 0_deg10 )
983 nDeltaAngle += 3600_deg10;
986 if( nDeltaAngle && !!pItem->
maImage )
1006 return Image( aMirrBitmapEx );
1051 mpData->ImplClearLayoutData();
1172 if ( pItem->
meState == eState )
1180 ImplToolItems::size_type nGroupPos;
1186 pGroupItem = &
mpData->m_aItems[nGroupPos-1];
1198 while ( nGroupPos < nItemCount )
1200 pGroupItem = &
mpData->m_aItems[nGroupPos];
1273 mpData->ImplClearLayoutData();
1382 mpData->mbKeyInputDisabled = std::none_of(
mpData->m_aItems.begin(),
mpData->m_aItems.end(),
1385 return rItem.mbEnabled;
1393 ImplToolItems::size_type
nCount =
mpData->m_aItems.size();
1394 for( ImplToolItems::size_type
i = 0;
i < nCount;
i++ )
1406 if( !
mpData->m_pLayoutData )
1408 return mpData->m_pLayoutData ?
mpData->m_pLayoutData->m_aDisplayText : OUString();
1414 if( !
mpData->m_pLayoutData )
1416 if(
mpData->m_pLayoutData )
1420 if(
mpData->m_pLayoutData->m_aLineItemIds[
i] == nItemID )
1422 nItemIndex =
mpData->m_pLayoutData->m_aLineIndices[
i];
1427 return (
mpData->m_pLayoutData && nItemIndex != -1) ?
mpData->m_pLayoutData->GetCharacterBounds( nItemIndex+nIndex ) :
tools::Rectangle();
1434 if( !
mpData->m_pLayoutData )
1436 if(
mpData->m_pLayoutData )
1438 nIndex =
mpData->m_pLayoutData->GetIndexForPoint( rPoint );
1441 if(
mpData->m_pLayoutData->m_aLineIndices[
i] <= nIndex &&
1442 (
i ==
mpData->m_pLayoutData->m_aLineIndices.size()-1 ||
mpData->m_pLayoutData->m_aLineIndices[
i+1] > nIndex) )
1444 rItemID =
mpData->m_pLayoutData->m_aLineItemIds[
i];
1455 mpData->maDropdownClickHdl = rLink;
1461 if( aType ==
mpData->maMenuType )
1464 mpData->maMenuType = aType;
1479 if( !
mpData->maMenubuttonItem.maRect.IsEmpty() )
1486 return mpData->maMenuType;
1501 mpData->maMenuButtonHdl = rLink;
1508 return std::any_of(
mpData->m_aItems.begin(),
mpData->m_aItems.end(),
1509 [](
const ImplToolItem& rItem) {
return rItem.IsClipped(); });
1522 return nMenuItemBits;
1537 if (
mpData->m_aItems.empty() )
1541 for (
const auto& rItem :
mpData->m_aItems )
1543 if( rItem.IsClipped() )
1546 MenuItemBits nMenuItemBits = ConvertBitsFromToolBoxToMenu(rItem.mnBits);
1547 pMenu->
InsertItem(
id, rItem.maText, rItem.maImage, nMenuItemBits);
1558 for (
const auto& rItem :
mpData->m_aItems )
1560 if( rItem.IsItemHidden() )
1563 MenuItemBits nMenuItemBits = ConvertBitsFromToolBoxToMenu(rItem.mnBits);
1564 pMenu->
InsertItem(
id, rItem.maText, rItem.maImage, nMenuItemBits );
1576 sal_uInt16
id = GetMenu()->GetItemId( rEvent.GetItemPos() );
1591 mpData->maMenuButtonHdl.Call(
this );
1600 bool bBorderDel =
false;
1641 "cannot assume docked and floating" );
1643 if(
mpData->mbAssumeDocked )
1645 else if(
mpData->mbAssumeFloating )
1654 if(
mpData->mbAssumePopupMode )
1668 if(
mpData->mbIsLocked != bLock )
1670 mpData->mbIsLocked = bLock;
1685 static int nAlwaysLocked = -1;
1687 if( nAlwaysLocked == -1 )
1693 "/org.openoffice.Office.UI.GlobalSettings/Toolbars" );
1697 bool bStatesEnabled = bool();
1698 css::uno::Any aValue = aNode.
getNodeValue(
"StatesEnabled" );
1699 if( aValue >>= bStatesEnabled )
1701 if( bStatesEnabled )
1706 "/org.openoffice.Office.UI.GlobalSettings/Toolbars/States" );
1708 bool bLocked = bool();
1709 css::uno::Any aValue2 = aNode2.
getNodeValue(
"Locked" );
1710 if( aValue2 >>= bLocked )
1711 nAlwaysLocked = bLocked ? 1 : 0;
1717 return nAlwaysLocked == 1;
1722 return mpData->mbWillUsePopupMode;
1727 mpData->mbWillUsePopupMode = b;
1736 auto childrenNode = rJsonWriter.
startArray(
"children");
1737 for (ToolBox::ImplToolItems::size_type
i = 0;
i <
GetItemCount(); ++
i)
1746 rJsonWriter.
put(
"type",
"toolitem");
#define LINK(Instance, Class, Member)
Size GetSizePixel() const
bool IsInPopupMode() const
void setWidth(tools::Long nWidth)
OUString DetermineIconTheme() const
Determine which icon theme should be used.
const StyleSettings & GetStyleSettings() const
static const AllSettings & GetSettings()
Gets the application's settings.
OUString GetLabelForCommand(const css::uno::Sequence< css::beans::PropertyValue > &rProperties)
Return a label for the given command.
const OUString & GetHelpText() const
const OUString & GetQuickHelpText() const
std::function< std::unique_ptr< UIObject >vcl::Window *)> FactoryFunction
virtual Size GetSizePixel() const
virtual void SetSizePixel(const Size &rNewSize)
static Size SizeByThemeName(std::u16string_view)
Obtain the icon size by theme name.
tools::Rectangle GetDesktopRectPixel() const
void logAction(VclPtr< Control > const &xUIElement, VclEventId nEvent)
static OutputDevice * GetDefaultDevice()
Get the default "device" (in this case the default window).
static UITestLogger & getInstance()
void Enable(bool bEnable=true, bool bChild=true)
PropertiesInfo aProperties
virtual void DumpAsPropertyTree(tools::JsonWriter &)
Dumps itself and potentially its children to a property tree, to be written easily to JSON...
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
void EndTracking(TrackingEventFlags nFlags=TrackingEventFlags::NONE)
void ShowTitleButton(TitleButton nButton, bool bVisible)
tools::Long GetCtrlTextWidth(const OUString &rStr, const SalLayoutGlyphs *pLayoutCache=nullptr) const
bool Mirror(BmpMirrorFlags nMirrorFlags)
Mirror the bitmap.
Image GetImageForCommand(const OUString &rsCommandName, const Reference< frame::XFrame > &rxFrame, vcl::ImageType eImageType)
VclPtr< vcl::Window > mpWindow
OUString GetModuleIdentifier(const Reference< frame::XFrame > &rxFrame)
bool IsFloatingMode() const
ImplDockingWindowWrapper.
virtual void Invalidate(InvalidateFlags nFlags=InvalidateFlags::NONE)
bool IsUpdateMode() const
tools::Long Width() const
Some things multiple-inherit from VclAbstractDialog and OutputDevice, so we need to use virtual inher...
void GrabFocusToDocument()
static OConfigurationTreeRoot tryCreateWithComponentContext(const css::uno::Reference< css::uno::XComponentContext > &rxContext, const OUString &_rPath, sal_Int32 _nDepth=-1, CREATION_MODE _eMode=CM_UPDATABLE)
bool IsMouseCaptured() const
tools::Rectangle GetMenuRect() const
bool Rotate(Degree10 nAngle10, const Color &rFillColor)
Rotate bitmap by the specified angle.
Point OutputToAbsoluteScreenPixel(const Point &rPos) const
float GetDPIScaleFactor() const
vcl::Window * GetWindow(GetWindowType nType) const
Sequence< beans::PropertyValue > GetCommandProperties(const OUString &rsCommandName, const OUString &rsModuleName)
Return a label for the given command.
sal_uInt16 GetChildCount() const
SAL_DLLPRIVATE void ImplInitSettings()
DockingManager * ImplGetDockingManager()
#define SAL_WARN_IF(condition, area, stream)
const ::std::vector< Color > ImpSvNumberformatScan::StandardColor COL_WHITE
ImplDockingWindowWrapper * GetDockingWindowWrapper(const vcl::Window *pWin)
static VclPtr< reference_type > Create(Arg &&...arg)
A construction helper for VclPtr.
tools::Long Height() const
FloatingWindow * GetFloatingWindow() const
css::uno::Any getNodeValue(const OUString &_rPath) const
Reference< XComponentContext > getProcessComponentContext()
FILE * init(int, char **)
BitmapEx GetBitmapEx() const
void setHeight(tools::Long nHeight)
static OUString EraseAllMnemonicChars(const OUString &rStr)
void CallEventListeners(VclEventId nEvent, void *pData=nullptr)
bool IsReallyVisible() const
OUString GetTooltipForCommand(const OUString &rsCommandName, const css::uno::Sequence< css::beans::PropertyValue > &rProperties, const Reference< frame::XFrame > &rxFrame)
void EndPopupMode(FloatWinPopupEndFlags nFlags=FloatWinPopupEndFlags::NONE)