25#include <com/sun/star/accessibility/AccessibleRelationType.hpp>
26#include <com/sun/star/awt/XWindow.hpp>
27#include <com/sun/star/awt/XVclWindowPeer.hpp>
31#include <officecfg/Office/Common.hxx>
78#include <bitmaps.hlst>
79#include <calendar.hxx>
117 OUStringBuffer
aBuffer(4 * 5 + 5);
134 return aBuffer.makeStringAndClear();
138 : m_pYieldMutex(
std::move(pMutex))
191 auto& rCache = pSVData->maGDIData.maScaleCache;
194 return rKeyValuePair.first.mpBitmap ==
this;
267 constexpr int FlashesWanted = 1;
360 , m_bTakeOwnership(bTakeOwnership)
361 , m_bEventListener(false)
362 , m_bKeyEventListener(false)
363 , m_bMouseEventListener(false)
500 pOldLabel->SetAccessibleRelationLabelFor(
nullptr);
585 m_aStyleUpdatedHdl.Call(*
this);
674 return rLabel.replaceFirst(
"~",
"");
695css::uno::Reference<css::datatransfer::clipboard::XClipboard>
824 HandleEventListener(rEvent);
829 return HandleKeyEventListener(rEvent);
834 HandleMouseEventListener(rEvent);
839 return m_aMnemonicActivateHdl.Call(*
this);
844Image createImage(
const OUString& rImage)
846 if (rImage.isEmpty())
848 if (rImage.lastIndexOf(
'.') != rImage.getLength() - 4)
850 assert((rImage ==
"dialog-warning" || rImage ==
"dialog-error"
851 || rImage ==
"dialog-information")
852 &&
"unknown stock image");
853 if (rImage ==
"dialog-warning")
855 else if (rImage ==
"dialog-error")
857 else if (rImage ==
"dialog-information")
868sal_uInt16 insert_to_menu(sal_uInt16 nLastId,
PopupMenu* pMenu,
int pos,
const OUString& rId,
869 const OUString& rStr,
const OUString* pIconName,
871 const css::uno::Reference<css::graphic::XGraphic>& rImage,
874 const sal_uInt16 nNewid = nLastId + 1;
877 if (eCheckRadioFalse == TRISTATE_TRUE)
879 else if (eCheckRadioFalse == TRISTATE_FALSE)
889 else if (pImageSurface)
891 pMenu->
SetItemImage(nNewid, createImage(*pImageSurface));
903 , m_bTakeOwnership(bTakeOwnership)
953 const css::uno::Reference<css::graphic::XGraphic>& rImage,
983 signal_activate(m_xMenu->GetCurItemIdent());
998 , m_xToolBox(pToolBox)
1069 pPopup->EndExecute();
1089 auto aPopup =
m_aMenus.find(nItemId);
1180 const css::uno::Reference<css::graphic::XGraphic>& rIcon)
1194 const css::uno::Reference<css::graphic::XGraphic>& rIcon)
1257 signal_clicked(m_xToolBox->GetItemCommand(nItemId));
1263 set_menu_item_active(m_xToolBox->GetItemCommand(nItemId),
true);
1270 for (
const auto& rFloat : m_aFloats)
1272 if (rEvent.GetWindow() == rFloat.second)
1275 signal_toggle_menu(m_xToolBox->GetItemCommand(nItemId));
1287 std::shared_ptr<VclSizeGroup> m_xGroup;
1290 SalInstanceSizeGroup()
1297 assert(pVclWidget && pVclWidget->
getWidget());
1322 bool bTakeOwnership)
1333 assert(!pNewParent || pNewVclParent);
1341 SAL_WARN(
"vcl",
"ignoring move because new parent is already disposed");
1354 pFirstChild->ImplControlFocus();
1360 xPage->set_expand(
true);
1362 return css::uno::Reference<css::awt::XWindow>(xPage->GetComponentInterface(),
1363 css::uno::UNO_QUERY);
1371 return std::make_unique<SalInstanceContainer>(pParent,
m_pBuilder,
false);
1410 xOutput->
DrawOutDev(
Point(), aTempLogicSize, rRenderLogicPos, aRenderLogicSize,
1434 rOutput.
DrawOutDev(rRenderLogicPos, aRenderLogicSize,
Point(), aTempLogicSize,
1439 rOutput.
DrawBitmapEx(rRenderLogicPos, aRenderLogicSize,
1454 if (!pChild->IsVisible())
1459 if (bHasMirroredGraphics)
1461 - pChild->GetOutDev()->GetOutputWidthPixel();
1466 Point aPos(rRenderLogicPos);
1467 aPos +=
Point(nDeltaX, nDeltaY);
1476 bool bChangeSize = aOrigSize != rSizePixel;
1487 bool bTakeOwnership)
1489 , m_xBox(pContainer)
1512 rTopLeft.
getY() + aCurrentPos.Y());
1515 aCurrentTopLeft +
basegfx::B2IPoint(aCurrentSize.Width(), aCurrentSize.Height()));
1517 if (!aCurrentRange.isEmpty())
1519 rControlDataCollection.emplace_back(rCurrent.
GetHelpId(), aCurrentRange);
1525 if (
nullptr != pChild)
1527 CollectChildren(*pChild, aCurrentTopLeft, rControlDataCollection);
1550 bool bTakeOwnership)
1552 , m_xWindow(pWindow)
1567 css::uno::UNO_QUERY);
1577 pSysWin->setOptimalLayoutSize(
true);
1582 pDockWin->setOptimalLayoutSize();
1585 assert(
false &&
"must be system or docking window");
1610 Size aParentGeometry(pParent->GetSizePixel());
1612 auto nX = (aParentGeometry.
Width() - aGeometry.
Width()) / 2;
1613 auto nY = (aParentGeometry.
Height() - aGeometry.
Height()) / 2;
1660 pWidgetOld->
set_property(
"has-default", OUString::boolean(
false));
1664 pWidgetNew->
set_property(
"has-default", OUString::boolean(
true));
1705 CollectChildren(*
m_xWindow, aTopLeft, aRet);
1739 if (!pChild->IsVisible())
1741 if (rVisibleWidgets.find(pChild) == rVisibleWidgets.end())
1743 rWasVisibleWidgets.emplace_back(pChild);
1748 hideUnless(pChild, rVisibleWidgets, rWasVisibleWidgets);
1755 bool bTakeOwnership)
1758 , m_nOldEditWidthReq(0)
1759 , m_nOldBorderWidth(0)
1761 const bool bScreenshotMode(officecfg::Office::Common::Misc::ScreenshotMode::get());
1762 if (bScreenshotMode)
1769 const std::function<
void(sal_Int32)>& rEndDialogFn)
1777 return m_xDialog->StartExecuteAsync(aCtx);
1781 const std::function<
void(sal_Int32)>& rEndDialogFn)
1783 assert(rxSelf.get() ==
this);
1792 return m_xDialog->StartExecuteAsync(aCtx);
1813 pCandidate && (pCandidate != pContentArea && pCandidate->
IsVisible());
1816 aVisibleWidgets.insert(pCandidate);
1821 pCandidate && (pCandidate != pContentArea && pCandidate->
IsVisible());
1824 if (aVisibleWidgets.insert(pCandidate).second)
1837 pActionArea->
Hide();
1855 pActionArea->
Show();
1862 m_xDialog->SetInstallLOKNotifierHdl(rLink);
1889 xButton->
set_id(
"close");
1892 xButton->
set_id(
"cancel");
1903 m_xDialog->add_button(xButton, nResponse,
true);
1917 m_xDialog->set_default_response(nResponse);
1929 const Point aMenuPos(rCEvt.GetMousePosPixel());
1931 sal_uInt16 nLocalID(1);
1933 aMenu->InsertItem(nLocalID,
VclResId(SV_BUTTONTEXT_SCREENSHOT));
1934 aMenu->SetHelpText(nLocalID,
VclResId(SV_HELPTEXT_SCREENSHOT));
1935 aMenu->SetHelpId(nLocalID,
"InteractiveScreenshotMode");
1936 aMenu->EnableItem(nLocalID);
1938 const sal_uInt16
nId(aMenu->Execute(
m_xDialog, aMenuPos));
1969 bool bTakeOwnership)
1971 , m_xMessageDialog(pDialog)
2012 for (
size_t i = 0;
i <
m_aIds.size(); ++
i)
2023 , m_xWizard(pDialog)
2024 , m_aUpdateRoadmapIdle(
"SalInstanceAssistant m_aUpdateRoadmapIdle")
2083 if (nOldIndex == -1)
2086 if (nOldIndex == nNewIndex)
2108 xPage->set_id(rIdent);
2110 xGrid->set_hexpand(
true);
2111 xGrid->set_vexpand(
true);
2174 rGrid.disposeAndClear();
2176 rPage.disposeAndClear();
2181 if (notify_events_disabled())
2183 auto nCurItemId = m_xWizard->GetCurrentRoadmapItemID();
2184 int nPageIndex(find_id(nCurItemId));
2185 if (!signal_jump_page(get_page_ident(nPageIndex)) && nCurItemId != m_xWizard->GetCurLevel())
2186 m_xWizard->SelectRoadmapItemByID(m_xWizard->GetCurLevel());
2191 disable_notify_events();
2193 m_xWizard->DeleteRoadmapItems();
2196 for (
size_t i = 0;
i < m_aAddedPages.size(); ++
i)
2198 const OUString& rLabel = m_aAddedPages[
i]->GetText();
2199 bool bSensitive = m_aAddedPages[
i]->IsEnabled();
2200 if (rLabel.isEmpty())
2202 m_xWizard->InsertRoadmapItem(
nPos++, rLabel, m_aIds[
i], bSensitive);
2205 m_xWizard->SelectRoadmapItemByID(m_aIds[get_current_page()],
false);
2207 m_xWizard->ShowRoadmap(
nPos != 0);
2209 enable_notify_events();
2213 bool bTakeOwnership)
2237 virtual void set_position(
int nPos)
override { m_xPaned->set_position(nPos); }
2239 virtual int get_position()
const override {
return m_xPaned->get_position(); }
2244 const Color& rButtonTextColor,
2245 const Color& rBackgroundColor,
2246 const Color& rShadowColor,
2247 const Color& rFaceColor)
2262 bool bTakeOwnership,
2263 bool bUserManagedScrolling)
2265 , m_xScrolledWindow(pScrolledWindow)
2266 , m_bUserManagedScrolling(bUserManagedScrolling)
2278 int step_increment,
int page_increment,
2362 int step_increment,
int page_increment,
2471 const Color& rShadowColor,
2472 const Color& rFaceColor)
2490 signal_vadjustment_changed();
2491 if (!m_bUserManagedScrolling)
2492 m_aOrigVScrollHdl.Call(pScrollBar);
2497 signal_hadjustment_changed();
2498 if (!m_bUserManagedScrolling)
2499 m_aOrigHScrollHdl.Call(&m_xScrolledWindow->getHorzScrollBar());
2514 , m_xScrollBar(pScrollbar)
2521 int page_increment,
int page_size)
override
2589 bool bTakeOwnership)
2591 , m_xNotebook(pNotebook)
2624 if (nPageIndex == -1)
2629 if (
m_aPages.size() < nPageIndex + 1U)
2632 m_aPages[nPageIndex] = std::make_shared<SalInstanceContainer>(pChild,
m_pBuilder,
false);
2660 iter->second.second.disposeAndClear();
2661 iter->second.first.disposeAndClear();
2670 sal_uInt16 nNewPageId = nLastPageId + 1;
2677 xGrid->set_hexpand(
true);
2678 xGrid->set_vexpand(
true);
2686 unsigned int nPageIndex =
static_cast<unsigned int>(
nPos);
2713 rItem.second.second.disposeAndClear();
2714 rItem.second.first.disposeAndClear();
2722 return !m_aLeavePageHdl.IsSet() || m_aLeavePageHdl.Call(get_current_page_ident());
2727 m_aEnterPageHdl.Call(get_current_page_ident());
2736 mutable std::vector<std::unique_ptr<SalInstanceContainer>> m_aPages;
2743 bool bTakeOwnership)
2745 , m_xNotebook(pNotebook)
2749 LINK(
this, SalInstanceVerticalNotebook, DeactivatePageHdl));
2764 virtual int get_page_index(
const OUString& rIdent)
const override
2766 sal_uInt16 nPageIndex = m_xNotebook->
GetPagePos(rIdent);
2775 if (nPageIndex == -1)
2777 auto pChild = m_xNotebook->
GetPage(rIdent);
2778 if (m_aPages.size() < nPageIndex + 1U)
2779 m_aPages.resize(nPageIndex + 1U);
2780 if (!m_aPages[nPageIndex])
2782 return m_aPages[nPageIndex].get();
2795 virtual void remove_page(
const OUString& rIdent)
override
2797 sal_uInt16 nPageIndex = m_xNotebook->
GetPagePos(rIdent);
2801 if (nPageIndex < m_aPages.size())
2802 m_aPages.erase(m_aPages.begin() + nPageIndex);
2805 virtual void insert_page(
const OUString& rIdent,
const OUString& rLabel,
int nPos)
override
2808 xGrid->set_hexpand(
true);
2809 xGrid->set_vexpand(
true);
2814 unsigned int nPageIndex =
static_cast<unsigned int>(
nPos);
2815 if (nPageIndex < m_aPages.size())
2816 m_aPages.insert(m_aPages.begin() + nPageIndex,
nullptr);
2822 virtual void set_tab_label_text(
const OUString& rIdent,
const OUString& rText)
override
2835 assert(
false &&
"not implemented");
2838 virtual ~SalInstanceVerticalNotebook()
override
2848 return !m_aLeavePageHdl.IsSet() || m_aLeavePageHdl.Call(get_current_page_ident());
2853 m_aEnterPageHdl.Call(get_current_page_ident());
2857 bool bTakeOwnership)
2859 , m_xButton(pButton)
2860 , m_aOldClickHdl(pButton->GetClickHdl())
2871 m_xButton->SetModeImage(createImage(*pDevice));
2890 nBits &= ~WB_WORDBREAK;
2906 m_xButton->SetCustomButtonImage(createImage(*pDevice));
2921 if (!m_aClickHdl.IsSet())
2923 pButton->SetClickHdl(m_aOldClickHdl);
2942 else if (nResponse ==
RET_NO)
2944 else if (nResponse ==
RET_OK)
2956 bool bTakeOwnership)
2958 , m_xMenuButton(pButton)
2995 pImageSurface,
nullptr, eCheckRadioFalse);
3001 m_xMenuButton->GetPopupMenu()->InsertSeparator(rId, nInsertPos);
3060 signal_selected(m_xMenuButton->GetCurItemIdent());
3065 if (notify_events_disabled())
3080 bool bTakeOwnership)
3082 , m_xMenuToggleButton(pButton)
3084 m_xMenuToggleButton->SetDelayMenu(
true);
3088 virtual void set_active(
bool active)
override
3091 m_xMenuToggleButton->SetActive(active);
3095 virtual bool get_active()
const override {
return m_xMenuToggleButton->GetActive(); }
3101 bool bConsumed = signal_activate_link();
3103 m_aOrigClickHdl.Call(rButton);
3107 bool bTakeOwnership)
3109 , m_xRadioButton(pButton)
3157 if (notify_events_disabled())
3164 if (notify_events_disabled())
3171 bool bTakeOwnership)
3173 , m_xCheckButton(pButton)
3208 if (notify_events_disabled())
3210 m_xCheckButton->EnableTriState(
false);
3228 m_xScale->SetSlideHdl(
LINK(
this, SalInstanceScale, SlideHdl));
3231 virtual void set_value(
int value)
override { m_xScale->SetThumbPos(value); }
3233 virtual void set_range(
int min,
int max)
override
3235 m_xScale->SetRangeMin(min);
3236 m_xScale->SetRangeMax(max);
3239 virtual int get_value()
const override {
return m_xScale->GetThumbPos(); }
3243 m_xScale->SetLineSize(step);
3244 m_xScale->SetPageSize(page);
3249 step = m_xScale->GetLineSize();
3250 page = m_xScale->GetPageSize();
3267 SalInstanceSpinner(Throbber* pThrobber,
SalInstanceBuilder* pBuilder,
bool bTakeOwnership)
3269 , m_xThrobber(pThrobber)
3273 virtual void start()
override { m_xThrobber->start(); }
3275 virtual void stop()
override { m_xThrobber->stop(); }
3285 bool bTakeOwnership)
3287 , m_xProgressBar(pProgressBar)
3291 virtual void set_percentage(
int value)
override { m_xProgressBar->SetValue(value); }
3293 virtual OUString
get_text()
const override {
return m_xProgressBar->GetText(); }
3295 virtual void set_text(
const OUString& rText)
override { m_xProgressBar->SetText(rText); }
3309 , m_xCalendar(pCalendar)
3311 m_xCalendar->SetSelectHdl(
LINK(
this, SalInstanceCalendar, SelectHdl));
3312 m_xCalendar->SetActivateHdl(
LINK(
this, SalInstanceCalendar, ActivateHdl));
3315 virtual void set_date(
const Date& rDate)
override { m_xCalendar->SetCurDate(rDate); }
3317 virtual Date get_date()
const override {
return m_xCalendar->GetFirstSelectedDate(); }
3319 virtual ~SalInstanceCalendar()
override
3329 if (notify_events_disabled())
3336 if (notify_events_disabled())
3342 bool bTakeOwnership)
3368 , m_rInsertTextHdl(rInsertTextHdl)
3376 OUString sText(rText);
3386 , m_aTextFilter(m_aInsertTextHdl)
3420 rStartPos = rSelection.
Min();
3421 rEndPos = rSelection.
Max();
3422 return rSelection.
Len();
3495 m_xEntry->SetControlForeground(rColor);
3507 m_xEntry->SetPlaceholderText(rText);
3566 if (notify_events_disabled())
3570 signal_cursor_position();
3583class UpdateGuardIfHidden
3588 bool m_bOrigEnableInvalidate;
3592 : m_rTreeView(rTreeView)
3596 , m_bOrigEnableInvalidate(!m_rTreeView.
IsVisible()
3601 if (m_bOrigEnableInvalidate)
3605 ~UpdateGuardIfHidden()
3607 if (m_bOrigEnableInvalidate)
3661 auto xCell = std::make_unique<SvLBoxString>(rStr);
3663 xCell->SetCustomRender();
3664 pEntry->
AddItem(std::move(xCell));
3668 const OUString* pId,
const OUString* pIconName,
3679 m_aUserData.emplace_back(std::make_unique<OUString>(*pId));
3683 pUserData =
nullptr;
3692 if (pIconName || pImageSurface)
3694 Image aImage(pIconName ? createImage(*pIconName) : createImage(*pImageSurface));
3695 pEntry->
AddItem(std::make_unique<SvLBoxContextBmp>(aImage, aImage,
false));
3700 pEntry->
AddItem(std::make_unique<SvLBoxContextBmp>(aDummy, aDummy,
false));
3710 pVclRetIter->
iter = pEntry;
3713 if (bChildrenOnDemand)
3817 pEntry->
AddItem(std::make_unique<SvLBoxButton>(
pData));
3831 return static_cast<SvLBoxString&
>(rItem).IsEmphasized();
3839 for (
size_t i = 0;
i < rWidths.size(); ++
i)
3840 pHeaderBar->SetItemSize(pHeaderBar->GetItemId(
i), rWidths[
i]);
3845 bool bTakeOwnership)
3847 , m_xTreeView(pTreeView)
3848 , m_aCheckButtonData(pTreeView, false)
3849 , m_aRadioButtonData(pTreeView, true)
3850 , m_bTogglesAsRadio(false)
3871 pHeaderBar->SetItemSize(pHeaderBar->GetItemId(pHeaderBar->GetItemCount() - 1),
3904 std::vector<tools::Long> aWidths;
3906 if (aWidths.size() > 2)
3908 std::vector<int> aColWidths;
3909 for (
size_t i = 1;
i < aWidths.size() - 1; ++
i)
3910 aColWidths.push_back(aWidths[
i] - aWidths[
i - 1]);
3939 std::vector<tools::Long> aTabPositions{ 0 };
3940 for (
size_t i = 0;
i < rWidths.size(); ++
i)
3941 aTabPositions.push_back(aTabPositions[
i] + rWidths[
i]);
3950 size_t nTabCount = rEditables.size();
3951 for (
size_t i = 0;
i < nTabCount; ++
i)
3964 return pHeaderBar->GetItemSize(pHeaderBar->GetItemId(nColumn));
3978 return pHeaderBar->GetItemText(pHeaderBar->GetItemId(nColumn));
3988 return pHeaderBar->SetItemText(pHeaderBar->GetItemId(nColumn), rTitle);
3994 assert(
n_children() == 0 &&
"tree must be empty");
4012 pHeaderBox->GetParent()->Show();
4019 pHeaderBox->GetParent()->Hide();
4024 const OUString* pId,
const OUString* pIconName,
4028 do_insert(pParent,
pos, pStr, pId, pIconName, pImageSurface, bChildrenOnDemand, pRet,
false);
4033 OUString sSep(
VclResId(STR_SEPARATOR));
4034 do_insert(
nullptr,
pos, &sSep,
nullptr,
nullptr,
nullptr,
false,
nullptr,
true);
4038 int nSourceCount,
const std::function<
void(
weld::TreeIter&,
int nSourceIndex)>& func,
4039 const weld::TreeIter* pParent,
const std::vector<int>* pFixedWidths)
4060 size_t nExtraCols = bHasAutoCheckButton ? 2 : 1;
4063 for (
int i = 0;
i < nSourceCount; ++
i)
4066 if (bHasAutoCheckButton)
4068 aVclIter.
iter->
AddItem(std::make_unique<SvLBoxContextBmp>(aDummy, aDummy,
false));
4075 size_t nFixedWidths = std::min(pFixedWidths->size(), aVclIter.
iter->
ItemCount());
4076 for (
size_t j = 0; j < nFixedWidths; ++j)
4080 pViewDataItem->
mnWidth = (*pFixedWidths)[j];
4123 const OUString* pId =
static_cast<const OUString*
>(pEntry->GetUserData());
4134 int min = std::min(pos1, pos2);
4135 int max = std::max(pos1, pos2);
4139 pModel->
Move(pEntry1, pEntry2);
4164 &&
"don't select when frozen, select after thaw. Note selection doesn't survive a "
4172 assert(pEntry &&
"bad pos?");
4203 &&
"don't select when frozen, select after thaw. Note selection doesn't survive a "
4220 &&
"don't select when frozen, select after thaw. Note selection doesn't survive a "
4235 std::vector<int> aRows;
4313 for (sal_uInt16 nCur = 0; nCur <
nCount; ++nCur)
4320 rItem.
Enable(bSensitive);
4331 rItem.
Enable(bSensitive);
4390 assert(
n_children() == 0 &&
"tree must be empty");