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>
116 OUStringBuffer
aBuffer(4 * 5 + 5);
133 return aBuffer.makeStringAndClear();
137 : m_pYieldMutex(
std::move(pMutex))
190 auto& rCache = pSVData->maGDIData.maScaleCache;
193 return rKeyValuePair.first.mpBitmap ==
this;
266 constexpr int FlashesWanted = 1;
359 , m_bTakeOwnership(bTakeOwnership)
360 , m_bEventListener(false)
361 , m_bKeyEventListener(false)
362 , m_bMouseEventListener(false)
499 pOldLabel->SetAccessibleRelationLabelFor(
nullptr);
584 m_aStyleUpdatedHdl.Call(*
this);
673 return rLabel.replaceFirst(
"~",
"");
694css::uno::Reference<css::datatransfer::clipboard::XClipboard>
823 HandleEventListener(rEvent);
828 return HandleKeyEventListener(rEvent);
833 HandleMouseEventListener(rEvent);
838 return m_aMnemonicActivateHdl.Call(*
this);
843Image createImage(
const OUString& rImage)
845 if (rImage.isEmpty())
847 if (rImage.lastIndexOf(
'.') != rImage.getLength() - 4)
849 assert((rImage ==
"dialog-warning" || rImage ==
"dialog-error"
850 || rImage ==
"dialog-information")
851 &&
"unknown stock image");
852 if (rImage ==
"dialog-warning")
854 else if (rImage ==
"dialog-error")
856 else if (rImage ==
"dialog-information")
867sal_uInt16 insert_to_menu(sal_uInt16 nLastId,
PopupMenu* pMenu,
int pos,
const OUString& rId,
868 const OUString& rStr,
const OUString* pIconName,
870 const css::uno::Reference<css::graphic::XGraphic>& rImage,
873 const sal_uInt16 nNewid = nLastId + 1;
876 if (eCheckRadioFalse == TRISTATE_TRUE)
878 else if (eCheckRadioFalse == TRISTATE_FALSE)
888 else if (pImageSurface)
890 pMenu->
SetItemImage(nNewid, createImage(*pImageSurface));
902 , m_bTakeOwnership(bTakeOwnership)
952 const css::uno::Reference<css::graphic::XGraphic>& rImage,
989 signal_activate(m_xMenu->GetCurItemIdent());
1002 bool bTakeOwnership)
1004 , m_xToolBox(pToolBox)
1075 pPopup->EndExecute();
1095 auto aPopup =
m_aMenus.find(nItemId);
1186 const css::uno::Reference<css::graphic::XGraphic>& rIcon)
1200 const css::uno::Reference<css::graphic::XGraphic>& rIcon)
1263 signal_clicked(m_xToolBox->GetItemCommand(nItemId));
1269 set_menu_item_active(m_xToolBox->GetItemCommand(nItemId),
true);
1276 for (
const auto& rFloat : m_aFloats)
1278 if (rEvent.GetWindow() == rFloat.second)
1281 signal_toggle_menu(m_xToolBox->GetItemCommand(nItemId));
1293 std::shared_ptr<VclSizeGroup> m_xGroup;
1296 SalInstanceSizeGroup()
1303 assert(pVclWidget && pVclWidget->
getWidget());
1328 bool bTakeOwnership)
1339 assert(!pNewParent || pNewVclParent);
1347 SAL_WARN(
"vcl",
"ignoring move because new parent is already disposed");
1360 pFirstChild->ImplControlFocus();
1366 xPage->set_expand(
true);
1368 return css::uno::Reference<css::awt::XWindow>(xPage->GetComponentInterface(),
1369 css::uno::UNO_QUERY);
1377 return std::make_unique<SalInstanceContainer>(pParent,
m_pBuilder,
false);
1416 xOutput->
DrawOutDev(
Point(), aTempLogicSize, rRenderLogicPos, aRenderLogicSize,
1440 rOutput.
DrawOutDev(rRenderLogicPos, aRenderLogicSize,
Point(), aTempLogicSize,
1445 rOutput.
DrawBitmapEx(rRenderLogicPos, aRenderLogicSize,
1460 if (!pChild->IsVisible())
1465 if (bHasMirroredGraphics)
1467 - pChild->GetOutDev()->GetOutputWidthPixel();
1472 Point aPos(rRenderLogicPos);
1473 aPos +=
Point(nDeltaX, nDeltaY);
1482 bool bChangeSize = aOrigSize != rSizePixel;
1493 bool bTakeOwnership)
1495 , m_xBox(pContainer)
1518 rTopLeft.
getY() + aCurrentPos.Y());
1521 aCurrentTopLeft +
basegfx::B2IPoint(aCurrentSize.Width(), aCurrentSize.Height()));
1523 if (!aCurrentRange.isEmpty())
1525 rControlDataCollection.emplace_back(rCurrent.
GetHelpId(), aCurrentRange);
1531 if (
nullptr != pChild)
1533 CollectChildren(*pChild, aCurrentTopLeft, rControlDataCollection);
1556 bool bTakeOwnership)
1558 , m_xWindow(pWindow)
1573 css::uno::UNO_QUERY);
1583 pSysWin->setOptimalLayoutSize(
true);
1588 pDockWin->setOptimalLayoutSize();
1591 assert(
false &&
"must be system or docking window");
1616 Size aParentGeometry(pParent->GetSizePixel());
1618 auto nX = (aParentGeometry.
Width() - aGeometry.
Width()) / 2;
1619 auto nY = (aParentGeometry.
Height() - aGeometry.
Height()) / 2;
1666 pWidgetOld->
set_property(
"has-default", OUString::boolean(
false));
1670 pWidgetNew->
set_property(
"has-default", OUString::boolean(
true));
1711 CollectChildren(*
m_xWindow, aTopLeft, aRet);
1745 if (!pChild->IsVisible())
1747 if (rVisibleWidgets.find(pChild) == rVisibleWidgets.end())
1749 rWasVisibleWidgets.emplace_back(pChild);
1754 hideUnless(pChild, rVisibleWidgets, rWasVisibleWidgets);
1761 bool bTakeOwnership)
1764 , m_nOldEditWidthReq(0)
1765 , m_nOldBorderWidth(0)
1767 const bool bScreenshotMode(officecfg::Office::Common::Misc::ScreenshotMode::get());
1768 if (bScreenshotMode)
1775 const std::function<
void(sal_Int32)>& rEndDialogFn)
1783 return m_xDialog->StartExecuteAsync(aCtx);
1787 const std::function<
void(sal_Int32)>& rEndDialogFn)
1789 assert(rxSelf.get() ==
this);
1798 return m_xDialog->StartExecuteAsync(aCtx);
1819 pCandidate && (pCandidate != pContentArea && pCandidate->
IsVisible());
1822 aVisibleWidgets.insert(pCandidate);
1827 pCandidate && (pCandidate != pContentArea && pCandidate->
IsVisible());
1830 if (aVisibleWidgets.insert(pCandidate).second)
1843 pActionArea->Hide();
1861 pActionArea->Show();
1868 m_xDialog->SetInstallLOKNotifierHdl(rLink);
1895 xButton->
set_id(
"close");
1898 xButton->
set_id(
"cancel");
1909 m_xDialog->add_button(xButton, nResponse,
true);
1923 m_xDialog->set_default_response(nResponse);
1935 const Point aMenuPos(rCEvt.GetMousePosPixel());
1937 sal_uInt16 nLocalID(1);
1939 aMenu->InsertItem(nLocalID,
VclResId(SV_BUTTONTEXT_SCREENSHOT));
1940 aMenu->SetHelpText(nLocalID,
VclResId(SV_HELPTEXT_SCREENSHOT));
1941 aMenu->SetHelpId(nLocalID,
"InteractiveScreenshotMode");
1942 aMenu->EnableItem(nLocalID);
1944 const sal_uInt16
nId(aMenu->Execute(
m_xDialog, aMenuPos));
1975 bool bTakeOwnership)
1977 , m_xMessageDialog(pDialog)
2018 for (
size_t i = 0;
i <
m_aIds.size(); ++
i)
2029 , m_xWizard(pDialog)
2030 , m_aUpdateRoadmapIdle(
"SalInstanceAssistant m_aUpdateRoadmapIdle")
2089 if (nOldIndex == -1)
2092 if (nOldIndex == nNewIndex)
2114 xPage->set_id(rIdent);
2116 xGrid->set_hexpand(
true);
2117 xGrid->set_vexpand(
true);
2180 rGrid.disposeAndClear();
2182 rPage.disposeAndClear();
2187 if (notify_events_disabled())
2189 auto nCurItemId = m_xWizard->GetCurrentRoadmapItemID();
2190 int nPageIndex(find_id(nCurItemId));
2191 if (!signal_jump_page(get_page_ident(nPageIndex)) && nCurItemId != m_xWizard->GetCurLevel())
2192 m_xWizard->SelectRoadmapItemByID(m_xWizard->GetCurLevel());
2197 disable_notify_events();
2199 m_xWizard->DeleteRoadmapItems();
2202 for (
size_t i = 0;
i < m_aAddedPages.size(); ++
i)
2204 const OUString& rLabel = m_aAddedPages[
i]->GetText();
2205 bool bSensitive = m_aAddedPages[
i]->IsEnabled();
2206 if (rLabel.isEmpty())
2208 m_xWizard->InsertRoadmapItem(
nPos++, rLabel, m_aIds[
i], bSensitive);
2211 m_xWizard->SelectRoadmapItemByID(m_aIds[get_current_page()],
false);
2213 m_xWizard->ShowRoadmap(
nPos != 0);
2215 enable_notify_events();
2219 bool bTakeOwnership)
2243 virtual void set_position(
int nPos)
override { m_xPaned->set_position(nPos); }
2245 virtual int get_position()
const override {
return m_xPaned->get_position(); }
2250 const Color& rButtonTextColor,
2251 const Color& rBackgroundColor,
2252 const Color& rShadowColor,
2253 const Color& rFaceColor)
2268 bool bTakeOwnership,
2269 bool bUserManagedScrolling)
2271 , m_xScrolledWindow(pScrolledWindow)
2272 , m_bUserManagedScrolling(bUserManagedScrolling)
2284 int step_increment,
int page_increment,
2368 int step_increment,
int page_increment,
2477 const Color& rShadowColor,
2478 const Color& rFaceColor)
2496 signal_vadjustment_changed();
2497 if (!m_bUserManagedScrolling)
2498 m_aOrigVScrollHdl.Call(pScrollBar);
2503 signal_hadjustment_changed();
2504 if (!m_bUserManagedScrolling)
2505 m_aOrigHScrollHdl.Call(&m_xScrolledWindow->getHorzScrollBar());
2520 , m_xScrollBar(pScrollbar)
2527 int page_increment,
int page_size)
override
2595 bool bTakeOwnership)
2597 , m_xNotebook(pNotebook)
2630 if (nPageIndex == -1)
2635 if (
m_aPages.size() < nPageIndex + 1U)
2638 m_aPages[nPageIndex] = std::make_shared<SalInstanceContainer>(pChild,
m_pBuilder,
false);
2666 iter->second.second.disposeAndClear();
2667 iter->second.first.disposeAndClear();
2676 sal_uInt16 nNewPageId = nLastPageId + 1;
2683 xGrid->set_hexpand(
true);
2684 xGrid->set_vexpand(
true);
2692 unsigned int nPageIndex =
static_cast<unsigned int>(
nPos);
2719 rItem.second.second.disposeAndClear();
2720 rItem.second.first.disposeAndClear();
2728 return !m_aLeavePageHdl.IsSet() || m_aLeavePageHdl.Call(get_current_page_ident());
2733 m_aEnterPageHdl.Call(get_current_page_ident());
2742 mutable std::vector<std::unique_ptr<SalInstanceContainer>> m_aPages;
2749 bool bTakeOwnership)
2751 , m_xNotebook(pNotebook)
2755 LINK(
this, SalInstanceVerticalNotebook, DeactivatePageHdl));
2770 virtual int get_page_index(
const OUString& rIdent)
const override
2772 sal_uInt16 nPageIndex = m_xNotebook->
GetPagePos(rIdent);
2781 if (nPageIndex == -1)
2783 auto pChild = m_xNotebook->
GetPage(rIdent);
2784 if (m_aPages.size() < nPageIndex + 1U)
2785 m_aPages.resize(nPageIndex + 1U);
2786 if (!m_aPages[nPageIndex])
2788 return m_aPages[nPageIndex].get();
2801 virtual void remove_page(
const OUString& rIdent)
override
2803 sal_uInt16 nPageIndex = m_xNotebook->
GetPagePos(rIdent);
2807 if (nPageIndex < m_aPages.size())
2808 m_aPages.erase(m_aPages.begin() + nPageIndex);
2811 virtual void insert_page(
const OUString& rIdent,
const OUString& rLabel,
int nPos)
override
2814 xGrid->set_hexpand(
true);
2815 xGrid->set_vexpand(
true);
2820 unsigned int nPageIndex =
static_cast<unsigned int>(
nPos);
2821 if (nPageIndex < m_aPages.size())
2822 m_aPages.insert(m_aPages.begin() + nPageIndex,
nullptr);
2828 virtual void set_tab_label_text(
const OUString& rIdent,
const OUString& rText)
override
2841 assert(
false &&
"not implemented");
2844 virtual ~SalInstanceVerticalNotebook()
override
2854 return !m_aLeavePageHdl.IsSet() || m_aLeavePageHdl.Call(get_current_page_ident());
2859 m_aEnterPageHdl.Call(get_current_page_ident());
2863 bool bTakeOwnership)
2865 , m_xButton(pButton)
2866 , m_aOldClickHdl(pButton->GetClickHdl())
2877 m_xButton->SetModeImage(createImage(*pDevice));
2896 nBits &= ~WB_WORDBREAK;
2912 m_xButton->SetCustomButtonImage(createImage(*pDevice));
2927 if (!m_aClickHdl.IsSet())
2929 pButton->SetClickHdl(m_aOldClickHdl);
2948 else if (nResponse ==
RET_NO)
2950 else if (nResponse ==
RET_OK)
2962 bool bTakeOwnership)
2964 , m_xMenuButton(pButton)
3001 pImageSurface,
nullptr, eCheckRadioFalse);
3007 m_xMenuButton->GetPopupMenu()->InsertSeparator(rId, nInsertPos);
3066 signal_selected(m_xMenuButton->GetCurItemIdent());
3071 if (notify_events_disabled())
3086 bool bTakeOwnership)
3088 , m_xMenuToggleButton(pButton)
3090 m_xMenuToggleButton->SetDelayMenu(
true);
3094 virtual void set_active(
bool active)
override
3097 m_xMenuToggleButton->SetActive(active);
3101 virtual bool get_active()
const override {
return m_xMenuToggleButton->GetActive(); }
3107 bool bConsumed = signal_activate_link();
3109 m_aOrigClickHdl.Call(rButton);
3115 bool bTakeOwnership)
3117 , m_xRadioButton(pButton)
3170 if (notify_events_disabled())
3177 if (notify_events_disabled())
3184 bool bTakeOwnership)
3186 , m_xCheckButton(pButton)
3226 if (notify_events_disabled())
3228 m_xCheckButton->EnableTriState(
false);
3246 m_xScale->SetSlideHdl(
LINK(
this, SalInstanceScale, SlideHdl));
3249 virtual void set_value(
int value)
override { m_xScale->SetThumbPos(value); }
3251 virtual void set_range(
int min,
int max)
override
3253 m_xScale->SetRangeMin(min);
3254 m_xScale->SetRangeMax(max);
3257 virtual int get_value()
const override {
return m_xScale->GetThumbPos(); }
3261 m_xScale->SetLineSize(step);
3262 m_xScale->SetPageSize(page);
3267 step = m_xScale->GetLineSize();
3268 page = m_xScale->GetPageSize();
3285 SalInstanceSpinner(Throbber* pThrobber,
SalInstanceBuilder* pBuilder,
bool bTakeOwnership)
3287 , m_xThrobber(pThrobber)
3291 virtual void start()
override { m_xThrobber->start(); }
3293 virtual void stop()
override { m_xThrobber->stop(); }
3303 bool bTakeOwnership)
3305 , m_xProgressBar(pProgressBar)
3309 virtual void set_percentage(
int value)
override { m_xProgressBar->SetValue(value); }
3311 virtual OUString
get_text()
const override {
return m_xProgressBar->GetText(); }
3313 virtual void set_text(
const OUString& rText)
override { m_xProgressBar->SetText(rText); }
3319 if (notify_events_disabled())
3326 if (notify_events_disabled())
3332 bool bTakeOwnership)
3358 , m_rInsertTextHdl(rInsertTextHdl)
3366 OUString sText(rText);
3376 , m_aTextFilter(m_aInsertTextHdl)
3410 rStartPos = rSelection.
Min();
3411 rEndPos = rSelection.
Max();
3412 return rSelection.
Len();
3485 m_xEntry->SetControlForeground(rColor);
3497 m_xEntry->SetPlaceholderText(rText);
3556 if (notify_events_disabled())
3560 signal_cursor_position();
3573class UpdateGuardIfHidden
3578 bool m_bOrigEnableInvalidate;
3582 : m_rTreeView(rTreeView)
3586 , m_bOrigEnableInvalidate(!m_rTreeView.
IsVisible()
3591 if (m_bOrigEnableInvalidate)
3595 ~UpdateGuardIfHidden()
3597 if (m_bOrigEnableInvalidate)
3651 auto xCell = std::make_unique<SvLBoxString>(rStr);
3653 xCell->SetCustomRender();
3654 pEntry->
AddItem(std::move(xCell));
3658 const OUString* pId,
const OUString* pIconName,
3669 m_aUserData.emplace_back(std::make_unique<OUString>(*pId));
3673 pUserData =
nullptr;
3682 if (pIconName || pImageSurface)
3684 Image aImage(pIconName ? createImage(*pIconName) : createImage(*pImageSurface));
3685 pEntry->
AddItem(std::make_unique<SvLBoxContextBmp>(aImage, aImage,
false));
3690 pEntry->
AddItem(std::make_unique<SvLBoxContextBmp>(aDummy, aDummy,
false));
3700 pVclRetIter->
iter = pEntry;
3703 if (bChildrenOnDemand)
3807 pEntry->
AddItem(std::make_unique<SvLBoxButton>(
pData));
3821 return static_cast<SvLBoxString&
>(rItem).IsEmphasized();
3829 for (
size_t i = 0;
i < rWidths.size(); ++
i)
3830 pHeaderBar->SetItemSize(pHeaderBar->GetItemId(
i), rWidths[
i]);
3835 bool bTakeOwnership)
3837 , m_xTreeView(pTreeView)
3838 , m_aCheckButtonData(pTreeView, false)
3839 , m_aRadioButtonData(pTreeView, true)
3840 , m_bTogglesAsRadio(false)
3861 pHeaderBar->SetItemSize(pHeaderBar->GetItemId(pHeaderBar->GetItemCount() - 1),
3894 std::vector<tools::Long> aWidths;
3896 if (aWidths.size() > 2)
3898 std::vector<int> aColWidths;
3899 for (
size_t i = 1;
i < aWidths.size() - 1; ++
i)
3900 aColWidths.push_back(aWidths[
i] - aWidths[
i - 1]);
3929 std::vector<tools::Long> aTabPositions{ 0 };
3930 for (
size_t i = 0;
i < rWidths.size(); ++
i)
3931 aTabPositions.push_back(aTabPositions[
i] + rWidths[
i]);
3940 size_t nTabCount = rEditables.size();
3941 for (
size_t i = 0;
i < nTabCount; ++
i)
3954 return pHeaderBar->GetItemSize(pHeaderBar->GetItemId(nColumn));
3968 return pHeaderBar->GetItemText(pHeaderBar->GetItemId(nColumn));
3978 return pHeaderBar->SetItemText(pHeaderBar->GetItemId(nColumn), rTitle);
3984 assert(
n_children() == 0 &&
"tree must be empty");
4002 pHeaderBox->GetParent()->Show();
4009 pHeaderBox->GetParent()->Hide();
4014 const OUString* pId,
const OUString* pIconName,
4018 do_insert(pParent,
pos, pStr, pId, pIconName, pImageSurface, bChildrenOnDemand, pRet,
false);
4023 OUString sSep(
VclResId(STR_SEPARATOR));
4024 do_insert(
nullptr,
pos, &sSep,
nullptr,
nullptr,
nullptr,
false,
nullptr,
true);
4028 int nSourceCount,
const std::function<
void(
weld::TreeIter&,
int nSourceIndex)>& func,
4029 const weld::TreeIter* pParent,
const std::vector<int>* pFixedWidths)
4050 size_t nExtraCols = bHasAutoCheckButton ? 2 : 1;
4053 for (
int i = 0;
i < nSourceCount; ++
i)
4056 if (bHasAutoCheckButton)
4058 aVclIter.
iter->
AddItem(std::make_unique<SvLBoxContextBmp>(aDummy, aDummy,
false));
4065 size_t nFixedWidths = std::min(pFixedWidths->size(), aVclIter.
iter->
ItemCount());
4066 for (
size_t j = 0; j < nFixedWidths; ++j)
4070 pViewDataItem->
mnWidth = (*pFixedWidths)[j];
4113 const OUString* pId =
static_cast<const OUString*
>(pEntry->GetUserData());
4124 int min = std::min(pos1, pos2);
4125 int max = std::max(pos1, pos2);
4129 pModel->
Move(pEntry1, pEntry2);
4154 &&
"don't select when frozen, select after thaw. Note selection doesn't survive a "
4162 assert(pEntry &&
"bad pos?");
4193 &&
"don't select when frozen, select after thaw. Note selection doesn't survive a "
4210 &&
"don't select when frozen, select after thaw. Note selection doesn't survive a "
4225 std::vector<int> aRows;
4303 for (sal_uInt16 nCur = 0; nCur <
nCount; ++nCur)
4310 rItem.
Enable(bSensitive);
4321 rItem.
Enable(bSensitive);
4380 assert(
n_children() == 0 &&
"tree must be empty");