26 #include <boost/property_tree/ptree.hpp>
53 #define TB_SEP_SIZE 8 // Separator size
67 mbNativeButtons =
false;
68 mbIsPaintLocked =
false;
69 mbAssumeDocked =
false;
70 mbAssumePopupMode =
false;
71 mbAssumeFloating =
false;
72 mbKeyInputDisabled =
false;
73 mbMenubuttonSelected =
false;
74 mbMenubuttonWasLastSelected =
false;
75 mbWillUsePopupMode =
false;
76 mbDropDownByKeyboard =
false;
81 m_pLayoutData.reset();
82 mpMenu.disposeAndClear();
90 mbNonInteractiveWindow =
false;
97 mbEmptyBtn = bEmptyBtn;
102 mnImageAngle = 0_deg10;
103 mbMirrorMode =
false;
104 mbVisibleText =
false;
117 init(nItemId, nItemBits,
false);
124 init(nItemId, nItemBits,
false);
132 init(nItemId, nItemBits,
false);
137 Size aSize( rDefaultSize );
153 bCheckMaxWidth =
false;
155 if ( !bCheckMaxWidth || (aWinSize.
Width() <= maxWidth) )
198 rbImage = rbText =
false;
207 bHasText = !
maText.isEmpty();
214 if( bHasImage || !bHasText )
227 if( bHasText || !bHasImage )
384 SAL_WARN_IF( !nItemId,
"vcl",
"ToolBox::InsertItem(): ItemId == 0" );
386 "ToolBox::InsertItem(): ItemId already exists" );
389 mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ?
mpData->m_aItems.begin()+nPos :
mpData->m_aItems.end(),
391 mpData->ImplClearLayoutData();
396 ImplToolItems::size_type nNewPos = ( nPos ==
APPEND ) ? (
mpData->m_aItems.size() - 1 ) : nPos;
401 ImplToolItems::size_type nPos )
403 SAL_WARN_IF( !nItemId,
"vcl",
"ToolBox::InsertItem(): ItemId == 0" );
405 "ToolBox::InsertItem(): ItemId already exists" );
408 mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ?
mpData->m_aItems.begin()+nPos :
mpData->m_aItems.end(),
410 mpData->ImplClearLayoutData();
415 ImplToolItems::size_type nNewPos = ( nPos ==
APPEND ) ? (
mpData->m_aItems.size() - 1 ) : nPos;
421 SAL_WARN_IF( !nItemId,
"vcl",
"ToolBox::InsertItem(): ItemId == 0" );
423 "ToolBox::InsertItem(): ItemId already exists" );
426 mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ?
mpData->m_aItems.begin()+nPos :
mpData->m_aItems.end(),
428 mpData->ImplClearLayoutData();
433 ImplToolItems::size_type nNewPos = ( nPos ==
APPEND ) ? (
mpData->m_aItems.size() - 1 ) : nPos;
438 const Size& rRequestedSize, ImplToolItems::size_type nPos)
448 InsertItem(nItemId, aImage, aLabel, nBits, nPos);
461 SAL_WARN_IF( !nItemId,
"vcl",
"ToolBox::InsertWindow(): ItemId == 0" );
463 "ToolBox::InsertWindow(): ItemId already exists" );
467 aItem.
mnId = nItemId;
471 mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ?
mpData->m_aItems.begin()+nPos :
mpData->m_aItems.end(), aItem );
472 mpData->ImplClearLayoutData();
480 ImplToolItems::size_type nNewPos = ( nPos ==
APPEND ) ? (
mpData->m_aItems.size() - 1 ) : nPos;
490 mpData->m_aItems.push_back( aItem );
491 mpData->ImplClearLayoutData();
496 ImplToolItems::size_type nNewPos =
mpData->m_aItems.size() - 1;
508 mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ?
mpData->m_aItems.begin()+nPos :
mpData->m_aItems.end(), aItem );
509 mpData->ImplClearLayoutData();
514 ImplToolItems::size_type nNewPos = ( nPos ==
APPEND ) ? (
mpData->m_aItems.size() - 1 ) : nPos;
524 mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ?
mpData->m_aItems.begin()+nPos :
mpData->m_aItems.end(), aItem );
525 mpData->ImplClearLayoutData();
530 ImplToolItems::size_type nNewPos = ( nPos ==
APPEND ) ? (
mpData->m_aItems.size() - 1 ) : nPos;
536 if( nPos >=
mpData->m_aItems.size() )
542 if (
mpData->m_aItems[nPos].mpWindow )
543 mpData->m_aItems[nPos].mpWindow->Hide();
556 mpData->m_aItems.erase(
mpData->m_aItems.begin()+nPos );
557 mpData->ImplClearLayoutData();
566 "ToolBox::CopyItem(): ItemId already exists" );
580 mpData->m_aItems.push_back( aNewItem );
581 mpData->ImplClearLayoutData();
586 ImplToolItems::size_type nNewPos2 =
mpData->m_aItems.size() - 1;
593 mpData->ImplClearLayoutData();
619 if(
mpData->meButtonSize != eSize )
621 mpData->meButtonSize = eSize;
629 return mpData->meButtonSize;
634 ImageType eImageType = ImageType::Size16;
636 eImageType = ImageType::Size26;
638 eImageType = ImageType::Size32;
648 Size aUnscaledSize(16, 16);
657 aUnscaledSize =
Size(32, 32);
659 return Size(aUnscaledSize.
Width() * fScaleFactor,
660 aUnscaledSize.
Height() * fScaleFactor);
679 if ( (eNewAlign == WindowAlign::Left) || (eNewAlign == WindowAlign::Right) )
723 ImplToolItems::size_type
nCount =
mpData->m_aItems.size();
724 for( ImplToolItems::size_type
nPos = 0;
nPos < nCount;
nPos++ )
734 auto it = std::find_if(
mpData->m_aItems.begin(),
mpData->m_aItems.end(),
735 [&rPos](
const ImplToolItem& rItem) {
return rItem.maRect.Contains( rPos ); });
737 if( it !=
mpData->m_aItems.end() )
738 return std::distance(
mpData->m_aItems.begin(), it);
751 auto it = std::find_if(
mpData->m_aItems.begin(),
mpData->m_aItems.end(),
752 [&rPos](
const ImplToolItem& rItem) {
return rItem.maRect.Contains( rPos ); });
766 if ( nPos < mpData->m_aItems.size() )
767 return mpData->m_aItems[nPos].maContentSize;
777 auto it = std::find_if(
mpData->m_aItems.begin(),
mpData->m_aItems.end(),
778 [&rCommand](
const ImplToolItem& rItem) {
return rItem.maCommandStr == rCommand; });
779 if (it !=
mpData->m_aItems.end())
800 case WindowAlign::Top:
804 if( devPos.Y() >= aScreen.
Bottom() )
805 aPos.setY( rRect.
Top() );
807 case WindowAlign::Bottom:
811 if( devPos.Y() <= aScreen.
Top() )
812 aPos.setY( rRect.
Bottom() );
814 case WindowAlign::Left:
818 if( devPos.X() >= aScreen.
Right() )
819 aPos.setX( rRect.
Left() );
821 case WindowAlign::Right:
825 if( devPos.X() <= aScreen.
Left() )
826 aPos.setX( rRect.
Right() );
849 if ( nPos < mpData->m_aItems.size() )
850 return mpData->m_aItems[nPos].maRect;
857 return mpData->maMenubuttonItem.maRect;
881 mpData->m_aItems[nPos].mnBits = nBits;
886 if ( nBits != nOldBits )
897 mpData->m_aItems[nPos].mbNonInteractiveWindow = bNonInteractive;
928 if ( nPos < mpData->m_aItems.size() )
930 mpData->m_aItems[nPos].mpUserData = pNewData;
973 return Image( aRotBitmapEx );
987 while( nDeltaAngle < 0_deg10 )
988 nDeltaAngle += 3600_deg10;
991 if( nDeltaAngle && !!pItem->
maImage )
1011 return Image( aMirrBitmapEx );
1056 mpData->ImplClearLayoutData();
1177 if ( pItem->
meState == eState )
1185 ImplToolItems::size_type nGroupPos;
1191 pGroupItem = &
mpData->m_aItems[nGroupPos-1];
1203 while ( nGroupPos < nItemCount )
1205 pGroupItem = &
mpData->m_aItems[nGroupPos];
1278 mpData->ImplClearLayoutData();
1387 mpData->mbKeyInputDisabled = std::none_of(
mpData->m_aItems.begin(),
mpData->m_aItems.end(),
1390 return rItem.mbEnabled;
1396 mpData->m_pLayoutData.emplace();
1398 ImplToolItems::size_type
nCount =
mpData->m_aItems.size();
1399 for( ImplToolItems::size_type
i = 0;
i < nCount;
i++ )
1411 if( !
mpData->m_pLayoutData )
1413 return mpData->m_pLayoutData ?
mpData->m_pLayoutData->m_aDisplayText : OUString();
1419 if( !
mpData->m_pLayoutData )
1421 if(
mpData->m_pLayoutData )
1423 for(
size_t i = 0;
i <
mpData->m_pLayoutData->m_aLineItemIds.size();
i++ )
1425 if(
mpData->m_pLayoutData->m_aLineItemIds[
i] == nItemID )
1427 nItemIndex =
mpData->m_pLayoutData->m_aLineIndices[
i];
1432 return (
mpData->m_pLayoutData && nItemIndex != -1) ?
mpData->m_pLayoutData->GetCharacterBounds( nItemIndex+nIndex ) :
tools::Rectangle();
1439 if( !
mpData->m_pLayoutData )
1441 if(
mpData->m_pLayoutData )
1443 nIndex =
mpData->m_pLayoutData->GetIndexForPoint( rPoint );
1444 for(
size_t i = 0;
i <
mpData->m_pLayoutData->m_aLineIndices.size();
i++ )
1446 if(
mpData->m_pLayoutData->m_aLineIndices[
i] <= nIndex &&
1447 (
i ==
mpData->m_pLayoutData->m_aLineIndices.size()-1 ||
mpData->m_pLayoutData->m_aLineIndices[
i+1] > nIndex) )
1449 rItemID =
mpData->m_pLayoutData->m_aLineItemIds[
i];
1460 mpData->maDropdownClickHdl = rLink;
1466 if( aType ==
mpData->maMenuType )
1469 mpData->maMenuType = aType;
1484 if( !
mpData->maMenubuttonItem.maRect.IsEmpty() )
1491 return mpData->maMenuType;
1506 mpData->maMenuButtonHdl = rLink;
1513 return std::any_of(
mpData->m_aItems.begin(),
mpData->m_aItems.end(),
1514 [](
const ImplToolItem& rItem) {
return rItem.IsClipped(); });
1527 return nMenuItemBits;
1542 if (
mpData->m_aItems.empty() )
1546 for (
const auto& rItem :
mpData->m_aItems )
1548 if( rItem.IsClipped() )
1551 MenuItemBits nMenuItemBits = ConvertBitsFromToolBoxToMenu(rItem.mnBits);
1552 pMenu->
InsertItem(
id, rItem.maText, rItem.maImage, nMenuItemBits);
1563 for (
const auto& rItem :
mpData->m_aItems )
1565 if( rItem.IsItemHidden() )
1568 MenuItemBits nMenuItemBits = ConvertBitsFromToolBoxToMenu(rItem.mnBits);
1569 pMenu->
InsertItem(
id, rItem.maText, rItem.maImage, nMenuItemBits );
1581 sal_uInt16
id =
GetMenu()->GetItemId( rEvent.GetItemPos() );
1596 mpData->maMenuButtonHdl.Call(
this );
1605 bool bBorderDel =
false;
1646 "cannot assume docked and floating" );
1648 if(
mpData->mbAssumeDocked )
1650 else if(
mpData->mbAssumeFloating )
1659 if(
mpData->mbAssumePopupMode )
1673 if(
mpData->mbIsLocked != bLock )
1675 mpData->mbIsLocked = bLock;
1690 static int nAlwaysLocked = -1;
1692 if( nAlwaysLocked == -1 )
1698 "/org.openoffice.Office.UI.GlobalSettings/Toolbars" );
1702 bool bStatesEnabled = bool();
1703 css::uno::Any aValue = aNode.
getNodeValue(
"StatesEnabled" );
1704 if( aValue >>= bStatesEnabled )
1706 if( bStatesEnabled )
1711 "/org.openoffice.Office.UI.GlobalSettings/Toolbars/States" );
1713 bool bLocked = bool();
1714 css::uno::Any aValue2 = aNode2.
getNodeValue(
"Locked" );
1715 if( aValue2 >>= bLocked )
1716 nAlwaysLocked = bLocked ? 1 : 0;
1722 return nAlwaysLocked == 1;
1727 return mpData->mbWillUsePopupMode;
1732 mpData->mbWillUsePopupMode = b;
1739 auto childrenNode = rJsonWriter.
startArray(
"children");
1740 for (ToolBox::ImplToolItems::size_type
i = 0;
i <
GetItemCount(); ++
i)
1753 rJsonWriter.
put(
"type",
"toolitem");
1755 rJsonWriter.
put(
"command", sCommand);
1757 rJsonWriter.
put(
"selected",
true);
1759 rJsonWriter.
put(
"visible",
false);
1761 rJsonWriter.
put(
"dropdown",
true);
1763 rJsonWriter.
put(
"enabled",
false);
1766 if (!sCommand.startsWith(
".uno:") && !!aImage)
1771 css::uno::Sequence<sal_Int8>
aSeq( static_cast<sal_Int8 const *>(aOStm.
GetData()), aOStm.
Tell());
1772 OUStringBuffer
aBuffer(
"data:image/png;base64,");
1774 rJsonWriter.
put(
"image", aBuffer.makeStringAndClear());
#define LINK(Instance, Class, Member)
Size GetSizePixel() 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).
constexpr tools::Long Width() const
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...
void EndTracking(TrackingEventFlags nFlags=TrackingEventFlags::NONE)
tools::Long GetCtrlTextWidth(const OUString &rStr, const SalLayoutGlyphs *pLayoutCache=nullptr) const
static void encode(OUStringBuffer &aStrBuffer, const css::uno::Sequence< sal_Int8 > &aPass)
SystemWindow * GetFloatingWindow() 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
css::uno::Any getNodeValue(const OUString &_rPath) const noexcept
ImplDockingWindowWrapper.
virtual void Invalidate(InvalidateFlags nFlags=InvalidateFlags::NONE)
bool IsUpdateMode() 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.
static ErrCode Export(SvStream &rOStm, const Graphic &rGraphic, ConvertDataFormat nFormat)
std::unique_ptr< char[]> aBuffer
SAL_DLLPRIVATE void ImplInitSettings()
DockingManager * ImplGetDockingManager()
#define SAL_WARN_IF(condition, area, stream)
constexpr tools::Long Height() const
const ::std::vector< Color > ImpSvNumberformatScan::StandardColor COL_WHITE
void ShowMenuTitleButton(bool bVisible)
::OutputDevice const * GetOutDev() const
ImplDockingWindowWrapper * GetDockingWindowWrapper(const vcl::Window *pWin)
static VclPtr< reference_type > Create(Arg &&...arg)
A construction helper for VclPtr.
Reference< XComponentContext > getProcessComponentContext()
Sequence< sal_Int8 > aSeq
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)