25 #include <boost/property_tree/ptree.hpp>
51 #define TB_SEP_SIZE 8 // Separator size
65 mbNativeButtons =
false;
66 mbIsPaintLocked =
false;
67 mbAssumeDocked =
false;
68 mbAssumePopupMode =
false;
69 mbAssumeFloating =
false;
70 mbKeyInputDisabled =
false;
71 mbMenubuttonSelected =
false;
72 mbMenubuttonWasLastSelected =
false;
73 mbWillUsePopupMode =
false;
74 mbDropDownByKeyboard =
false;
79 m_pLayoutData.reset();
80 mpMenu.disposeAndClear();
88 mbNonInteractiveWindow =
false;
95 mbEmptyBtn = bEmptyBtn;
100 mnImageAngle = 0_deg10;
101 mbMirrorMode =
false;
102 mbVisibleText =
false;
115 init(nItemId, nItemBits,
false);
122 init(nItemId, nItemBits,
false);
130 init(nItemId, nItemBits,
false);
135 Size aSize( rDefaultSize );
151 bCheckMaxWidth =
false;
153 if ( !bCheckMaxWidth || (aWinSize.
Width() <= maxWidth) )
196 rbImage = rbText =
false;
205 bHasText = !
maText.isEmpty();
212 if( bHasImage || !bHasText )
225 if( bHasText || !bHasImage )
382 SAL_WARN_IF( !nItemId,
"vcl",
"ToolBox::InsertItem(): ItemId == 0" );
384 "ToolBox::InsertItem(): ItemId already exists" );
387 mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ?
mpData->m_aItems.begin()+nPos :
mpData->m_aItems.end(),
389 mpData->ImplClearLayoutData();
394 ImplToolItems::size_type nNewPos = ( nPos ==
APPEND ) ? (
mpData->m_aItems.size() - 1 ) : nPos;
399 ImplToolItems::size_type nPos )
401 SAL_WARN_IF( !nItemId,
"vcl",
"ToolBox::InsertItem(): ItemId == 0" );
403 "ToolBox::InsertItem(): ItemId already exists" );
406 mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ?
mpData->m_aItems.begin()+nPos :
mpData->m_aItems.end(),
408 mpData->ImplClearLayoutData();
413 ImplToolItems::size_type nNewPos = ( nPos ==
APPEND ) ? (
mpData->m_aItems.size() - 1 ) : nPos;
419 SAL_WARN_IF( !nItemId,
"vcl",
"ToolBox::InsertItem(): ItemId == 0" );
421 "ToolBox::InsertItem(): ItemId already exists" );
424 mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ?
mpData->m_aItems.begin()+nPos :
mpData->m_aItems.end(),
426 mpData->ImplClearLayoutData();
431 ImplToolItems::size_type nNewPos = ( nPos ==
APPEND ) ? (
mpData->m_aItems.size() - 1 ) : nPos;
436 const Size& rRequestedSize, ImplToolItems::size_type nPos)
446 InsertItem(nItemId, aImage, aLabel, nBits, nPos);
459 SAL_WARN_IF( !nItemId,
"vcl",
"ToolBox::InsertWindow(): ItemId == 0" );
461 "ToolBox::InsertWindow(): ItemId already exists" );
465 aItem.
mnId = nItemId;
469 mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ?
mpData->m_aItems.begin()+nPos :
mpData->m_aItems.end(), aItem );
470 mpData->ImplClearLayoutData();
478 ImplToolItems::size_type nNewPos = ( nPos ==
APPEND ) ? (
mpData->m_aItems.size() - 1 ) : nPos;
488 mpData->m_aItems.push_back( aItem );
489 mpData->ImplClearLayoutData();
494 ImplToolItems::size_type nNewPos =
mpData->m_aItems.size() - 1;
506 mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ?
mpData->m_aItems.begin()+nPos :
mpData->m_aItems.end(), aItem );
507 mpData->ImplClearLayoutData();
512 ImplToolItems::size_type nNewPos = ( nPos ==
APPEND ) ? (
mpData->m_aItems.size() - 1 ) : nPos;
522 mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ?
mpData->m_aItems.begin()+nPos :
mpData->m_aItems.end(), aItem );
523 mpData->ImplClearLayoutData();
528 ImplToolItems::size_type nNewPos = ( nPos ==
APPEND ) ? (
mpData->m_aItems.size() - 1 ) : nPos;
534 if( nPos >=
mpData->m_aItems.size() )
540 if (
mpData->m_aItems[nPos].mpWindow )
541 mpData->m_aItems[nPos].mpWindow->Hide();
554 mpData->m_aItems.erase(
mpData->m_aItems.begin()+nPos );
555 mpData->ImplClearLayoutData();
564 "ToolBox::CopyItem(): ItemId already exists" );
578 mpData->m_aItems.push_back( aNewItem );
579 mpData->ImplClearLayoutData();
584 ImplToolItems::size_type nNewPos2 =
mpData->m_aItems.size() - 1;
591 mpData->ImplClearLayoutData();
617 if(
mpData->meButtonSize != eSize )
619 mpData->meButtonSize = eSize;
627 return mpData->meButtonSize;
632 ImageType eImageType = ImageType::Size16;
634 eImageType = ImageType::Size26;
636 eImageType = ImageType::Size32;
646 Size aUnscaledSize(16, 16);
655 aUnscaledSize =
Size(32, 32);
657 return Size(aUnscaledSize.
Width() * fScaleFactor,
658 aUnscaledSize.
Height() * fScaleFactor);
677 if ( (eNewAlign == WindowAlign::Left) || (eNewAlign == WindowAlign::Right) )
721 ImplToolItems::size_type
nCount =
mpData->m_aItems.size();
722 for( ImplToolItems::size_type
nPos = 0;
nPos < nCount;
nPos++ )
732 auto it = std::find_if(
mpData->m_aItems.begin(),
mpData->m_aItems.end(),
733 [&rPos](
const ImplToolItem& rItem) {
return rItem.maRect.IsInside( rPos ); });
735 if( it !=
mpData->m_aItems.end() )
736 return std::distance(
mpData->m_aItems.begin(), it);
749 auto it = std::find_if(
mpData->m_aItems.begin(),
mpData->m_aItems.end(),
750 [&rPos](
const ImplToolItem& rItem) {
return rItem.maRect.IsInside( rPos ); });
764 if ( nPos < mpData->m_aItems.size() )
765 return mpData->m_aItems[nPos].maContentSize;
775 auto it = std::find_if(
mpData->m_aItems.begin(),
mpData->m_aItems.end(),
776 [&rCommand](
const ImplToolItem& rItem) {
return rItem.maCommandStr == rCommand; });
777 if (it !=
mpData->m_aItems.end())
798 case WindowAlign::Top:
802 if( devPos.Y() >= aScreen.
Bottom() )
803 aPos.setY( rRect.
Top() );
805 case WindowAlign::Bottom:
809 if( devPos.Y() <= aScreen.
Top() )
810 aPos.setY( rRect.
Bottom() );
812 case WindowAlign::Left:
816 if( devPos.X() >= aScreen.
Right() )
817 aPos.setX( rRect.
Left() );
819 case WindowAlign::Right:
823 if( devPos.X() <= aScreen.
Left() )
824 aPos.setX( rRect.
Right() );
847 if ( nPos < mpData->m_aItems.size() )
848 return mpData->m_aItems[nPos].maRect;
855 return mpData->maMenubuttonItem.maRect;
879 mpData->m_aItems[nPos].mnBits = nBits;
884 if ( nBits != nOldBits )
895 mpData->m_aItems[nPos].mbNonInteractiveWindow = bNonInteractive;
926 if ( nPos < mpData->m_aItems.size() )
928 mpData->m_aItems[nPos].mpUserData = pNewData;
971 return Image( aRotBitmapEx );
985 while( nDeltaAngle < 0_deg10 )
986 nDeltaAngle += 3600_deg10;
989 if( nDeltaAngle && !!pItem->
maImage )
1009 return Image( aMirrBitmapEx );
1054 mpData->ImplClearLayoutData();
1175 if ( pItem->
meState == eState )
1183 ImplToolItems::size_type nGroupPos;
1189 pGroupItem = &
mpData->m_aItems[nGroupPos-1];
1201 while ( nGroupPos < nItemCount )
1203 pGroupItem = &
mpData->m_aItems[nGroupPos];
1276 mpData->ImplClearLayoutData();
1385 mpData->mbKeyInputDisabled = std::none_of(
mpData->m_aItems.begin(),
mpData->m_aItems.end(),
1388 return rItem.mbEnabled;
1396 ImplToolItems::size_type
nCount =
mpData->m_aItems.size();
1397 for( ImplToolItems::size_type
i = 0;
i < nCount;
i++ )
1409 if( !
mpData->m_pLayoutData )
1411 return mpData->m_pLayoutData ?
mpData->m_pLayoutData->m_aDisplayText : OUString();
1417 if( !
mpData->m_pLayoutData )
1419 if(
mpData->m_pLayoutData )
1421 for(
size_t i = 0;
i <
mpData->m_pLayoutData->m_aLineItemIds.size();
i++ )
1423 if(
mpData->m_pLayoutData->m_aLineItemIds[
i] == nItemID )
1425 nItemIndex =
mpData->m_pLayoutData->m_aLineIndices[
i];
1430 return (
mpData->m_pLayoutData && nItemIndex != -1) ?
mpData->m_pLayoutData->GetCharacterBounds( nItemIndex+nIndex ) :
tools::Rectangle();
1437 if( !
mpData->m_pLayoutData )
1439 if(
mpData->m_pLayoutData )
1441 nIndex =
mpData->m_pLayoutData->GetIndexForPoint( rPoint );
1442 for(
size_t i = 0;
i <
mpData->m_pLayoutData->m_aLineIndices.size();
i++ )
1444 if(
mpData->m_pLayoutData->m_aLineIndices[
i] <= nIndex &&
1445 (
i ==
mpData->m_pLayoutData->m_aLineIndices.size()-1 ||
mpData->m_pLayoutData->m_aLineIndices[
i+1] > nIndex) )
1447 rItemID =
mpData->m_pLayoutData->m_aLineItemIds[
i];
1458 mpData->maDropdownClickHdl = rLink;
1464 if( aType ==
mpData->maMenuType )
1467 mpData->maMenuType = aType;
1482 if( !
mpData->maMenubuttonItem.maRect.IsEmpty() )
1489 return mpData->maMenuType;
1504 mpData->maMenuButtonHdl = rLink;
1511 return std::any_of(
mpData->m_aItems.begin(),
mpData->m_aItems.end(),
1512 [](
const ImplToolItem& rItem) {
return rItem.IsClipped(); });
1525 return nMenuItemBits;
1540 if (
mpData->m_aItems.empty() )
1544 for (
const auto& rItem :
mpData->m_aItems )
1546 if( rItem.IsClipped() )
1549 MenuItemBits nMenuItemBits = ConvertBitsFromToolBoxToMenu(rItem.mnBits);
1550 pMenu->
InsertItem(
id, rItem.maText, rItem.maImage, nMenuItemBits);
1561 for (
const auto& rItem :
mpData->m_aItems )
1563 if( rItem.IsItemHidden() )
1566 MenuItemBits nMenuItemBits = ConvertBitsFromToolBoxToMenu(rItem.mnBits);
1567 pMenu->
InsertItem(
id, rItem.maText, rItem.maImage, nMenuItemBits );
1579 sal_uInt16
id = GetMenu()->GetItemId( rEvent.GetItemPos() );
1594 mpData->maMenuButtonHdl.Call(
this );
1603 bool bBorderDel =
false;
1644 "cannot assume docked and floating" );
1646 if(
mpData->mbAssumeDocked )
1648 else if(
mpData->mbAssumeFloating )
1657 if(
mpData->mbAssumePopupMode )
1671 if(
mpData->mbIsLocked != bLock )
1673 mpData->mbIsLocked = bLock;
1688 static int nAlwaysLocked = -1;
1690 if( nAlwaysLocked == -1 )
1696 "/org.openoffice.Office.UI.GlobalSettings/Toolbars" );
1700 bool bStatesEnabled = bool();
1701 css::uno::Any aValue = aNode.
getNodeValue(
"StatesEnabled" );
1702 if( aValue >>= bStatesEnabled )
1704 if( bStatesEnabled )
1709 "/org.openoffice.Office.UI.GlobalSettings/Toolbars/States" );
1711 bool bLocked = bool();
1712 css::uno::Any aValue2 = aNode2.
getNodeValue(
"Locked" );
1713 if( aValue2 >>= bLocked )
1714 nAlwaysLocked = bLocked ? 1 : 0;
1720 return nAlwaysLocked == 1;
1725 return mpData->mbWillUsePopupMode;
1730 mpData->mbWillUsePopupMode = b;
1739 auto childrenNode = rJsonWriter.
startArray(
"children");
1740 for (ToolBox::ImplToolItems::size_type
i = 0;
i <
GetItemCount(); ++
i)
1749 rJsonWriter.
put(
"type",
"toolitem");
#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...
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
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
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.
sal_uInt16 GetChildCount() const
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
ImplDockingWindowWrapper * GetDockingWindowWrapper(const vcl::Window *pWin)
static VclPtr< reference_type > Create(Arg &&...arg)
A construction helper for VclPtr.
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)