LibreOffice Module vcl (master)  1
bubblewindow.cxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include <rtl/ustrbuf.hxx>
22 #include <vcl/lineinfo.hxx>
23 #include <vcl/settings.hxx>
24 #include <vcl/svapp.hxx>
25 #include <unotools/resmgr.hxx>
26 #include <bubblewindow.hxx>
27 #include <bitmaps.hlst>
28 
29 #define TIP_HEIGHT 15
30 #define TIP_WIDTH 7
31 #define TIP_RIGHT_OFFSET 18
32 #define BUBBLE_BORDER 10
33 #define TEXT_MAX_WIDTH 300
34 #define TEXT_MAX_HEIGHT 200
35 
36 BubbleWindow::BubbleWindow( vcl::Window* pParent, const OUString& rTitle,
37  const OUString& rText, const Image& rImage )
40  | WB_NOBORDER
41  )
42  , maBubbleTitle( rTitle )
43  , maBubbleText( rText )
44  , maBubbleImage( rImage )
45  , maMaxTextSize( TEXT_MAX_WIDTH, TEXT_MAX_HEIGHT )
46  , mnTipOffset( 0 )
47 {
48  SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetHelpColor() ) );
49 }
50 
52 {
54 
55  Size aSize = GetSizePixel();
56 
57  if ( ( aSize.Height() < 20 ) || ( aSize.Width() < 60 ) )
58  return;
59 
60  tools::Rectangle aRect( 0, TIP_HEIGHT, aSize.Width(), aSize.Height() - TIP_HEIGHT );
61  maRectPoly = tools::Polygon( aRect, 6, 6 );
62  vcl::Region aRegion( maRectPoly );
63  tools::Long nTipOffset = aSize.Width() - TIP_RIGHT_OFFSET + mnTipOffset;
64 
65  Point aPointArr[4];
66  aPointArr[0] = Point( nTipOffset, TIP_HEIGHT );
67  aPointArr[1] = Point( nTipOffset, 0 );
68  aPointArr[2] = Point( nTipOffset + TIP_WIDTH , TIP_HEIGHT );
69  aPointArr[3] = Point( nTipOffset, TIP_HEIGHT );
70  maTriPoly = tools::Polygon( 4, aPointArr );
71  vcl::Region aTriRegion( maTriPoly );
72 
73  aRegion.Union( aTriRegion);
74  maBounds = aRegion;
75 
77 }
78 
79 void BubbleWindow::SetTitleAndText( const OUString& rTitle,
80  const OUString& rText,
81  const Image& rImage )
82 {
83  maBubbleTitle = rTitle;
84  maBubbleText = rText;
85  maBubbleImage = rImage;
86 
87  Resize();
88 }
89 
90 void BubbleWindow::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& /*rRect*/)
91 {
92  LineInfo aThickLine( LineStyle::Solid, 2 );
93 
94  rRenderContext.DrawPolyLine( maRectPoly, aThickLine );
95  rRenderContext.DrawPolyLine( maTriPoly );
96 
97  Color aOldLine = rRenderContext.GetLineColor();
98  Size aSize = GetSizePixel();
99  tools::Long nTipOffset = aSize.Width() - TIP_RIGHT_OFFSET + mnTipOffset;
100 
101  rRenderContext.SetLineColor( GetSettings().GetStyleSettings().GetHelpColor() );
102  rRenderContext.DrawLine( Point( nTipOffset+2, TIP_HEIGHT ),
103  Point( nTipOffset + TIP_WIDTH -1 , TIP_HEIGHT ),
104  aThickLine );
105  rRenderContext.SetLineColor( aOldLine );
106 
107  Size aImgSize = maBubbleImage.GetSizePixel();
108 
110 
111  vcl::Font aOldFont = GetFont();
112  vcl::Font aBoldFont = aOldFont;
113  aBoldFont.SetWeight( WEIGHT_BOLD );
114 
115  SetFont( aBoldFont );
116  tools::Rectangle aTitleRect = maTitleRect;
117  aTitleRect.Move( aImgSize.Width(), 0 );
119 
120  SetFont( aOldFont );
121  tools::Rectangle aTextRect = maTextRect;
122  aTextRect.Move( aImgSize.Width(), 0 );
124 }
125 
127 {
128  Show( false );
129 }
130 
131 void BubbleWindow::Show( bool bVisible )
132 {
133  if ( !bVisible )
134  {
135  FloatingWindow::Show( bVisible );
136  return;
137  }
138 
139  // don't show bubbles without a text
140  if ( ( maBubbleTitle.isEmpty() ) && ( maBubbleText.isEmpty() ) )
141  return;
142 
143  Size aWindowSize = GetSizePixel();
144 
145  Size aImgSize = maBubbleImage.GetSizePixel();
146 
147  RecalcTextRects();
148 
149  aWindowSize.setHeight( maTitleRect.GetHeight() * 7 / 4+ maTextRect.GetHeight() +
150  3 * BUBBLE_BORDER + TIP_HEIGHT );
151 
153  aWindowSize.setWidth( maTitleRect.GetWidth() );
154  else
155  aWindowSize.setWidth( maTextRect.GetWidth() );
156 
157  aWindowSize.setWidth( aWindowSize.Width() + 3 * BUBBLE_BORDER + aImgSize.Width() );
158 
159  if ( aWindowSize.Height() < aImgSize.Height() + TIP_HEIGHT + 2 * BUBBLE_BORDER )
160  aWindowSize.setHeight( aImgSize.Height() + TIP_HEIGHT + 2 * BUBBLE_BORDER );
161 
162  Point aPos;
163  aPos.setX( maTipPos.X() - aWindowSize.Width() + TIP_RIGHT_OFFSET );
164  aPos.setY( maTipPos.Y() );
165  Point aScreenPos = GetParent()->OutputToAbsoluteScreenPixel( aPos );
166  if ( aScreenPos.X() < 0 )
167  {
168  mnTipOffset = aScreenPos.X();
169  aPos.AdjustX( -mnTipOffset );
170  }
171  SetPosSizePixel( aPos, aWindowSize );
172 
174 }
175 
177 {
178  Size aTotalSize;
179  bool bFinished = false;
180  vcl::Font aOldFont = GetFont();
181  vcl::Font aBoldFont = aOldFont;
182 
183  aBoldFont.SetWeight( WEIGHT_BOLD );
184 
185  while ( !bFinished )
186  {
187  SetFont( aBoldFont );
188 
192 
193  SetFont( aOldFont );
195  maBubbleText,
197 
198  if ( maTextRect.GetHeight() < 10 )
199  maTextRect.setHeight( 10 );
200 
201  aTotalSize.setHeight( maTitleRect.GetHeight() +
202  aBoldFont.GetFontHeight() * 3 / 4 +
204  3 * BUBBLE_BORDER + TIP_HEIGHT );
205  if ( aTotalSize.Height() > maMaxTextSize.Height() )
206  {
209  }
210  else
211  bFinished = true;
212  }
215 }
216 
218  : maTimeoutTimer("MenuBarUpdateIconManager")
219  , maWaitIdle("vcl MenuBarUpdateIconManager maWaitIdle")
220  , mnIconID (0)
221  , mbShowMenuIcon(false)
222  , mbShowBubble(false)
223  , mbBubbleChanged( false )
224 {
225  maTimeoutTimer.SetTimeout( 10000 );
227 
230 
231  maApplicationEventHdl = LINK(this, MenuBarUpdateIconManager, ApplicationEventHdl);
233 
234  maWindowEventHdl = LINK(this, MenuBarUpdateIconManager, WindowEventHdl);
235 }
236 
238 {
239  if ( !mpIconSysWin )
240  return nullptr;
241 
243  if( aIconRect.IsEmpty() )
244  return nullptr;
245 
246  auto pBubbleWin = mpBubbleWin;
247 
248  if ( !pBubbleWin ) {
251  mbBubbleChanged = false;
252  }
253  else if ( mbBubbleChanged ) {
254  pBubbleWin->SetTitleAndText( maBubbleTitle, maBubbleText,
255  maBubbleImage );
256  mbBubbleChanged = false;
257  }
258 
259  Point aWinPos = aIconRect.BottomCenter();
260 
261  pBubbleWin->SetTipPosPixel( aWinPos );
262 
263  return pBubbleWin;
264 }
265 
267 {
268  RemoveBubbleWindow( false );
269 }
270 
271 IMPL_LINK(MenuBarUpdateIconManager, WindowEventHdl, VclWindowEvent&, rEvent, void)
272 {
273  VclEventId nEventID = rEvent.GetId();
274 
275  if ( VclEventId::ObjectDying == nEventID )
276  {
277  if ( mpIconSysWin == rEvent.GetWindow() )
278  {
279  mpIconSysWin->RemoveEventListener( maWindowEventHdl );
280  RemoveBubbleWindow( true );
281  }
282  }
283  else if ( VclEventId::WindowMenubarAdded == nEventID )
284  {
285  vcl::Window *pWindow = rEvent.GetWindow();
286  if ( pWindow )
287  {
288  SystemWindow *pSysWin = pWindow->GetSystemWindow();
289  if ( pSysWin )
290  {
291  AddMenuBarIcon( pSysWin, false );
292  }
293  }
294  }
295  else if ( VclEventId::WindowMenubarRemoved == nEventID )
296  {
297  MenuBar *pMBar = static_cast<MenuBar*>(rEvent.GetData());
298  if ( pMBar && ( pMBar == mpIconMBar ) )
299  RemoveBubbleWindow( true );
300  }
301  else if ( ( nEventID == VclEventId::WindowMove ) ||
302  ( nEventID == VclEventId::WindowResize ) )
303  {
304  if ( ( mpIconSysWin == rEvent.GetWindow() ) &&
305  mpBubbleWin && ( mpIconMBar != nullptr ) )
306  {
307  tools::Rectangle aIconRect = mpIconMBar->GetMenuBarButtonRectPixel( mnIconID );
308  Point aWinPos = aIconRect.BottomCenter();
309  mpBubbleWin->SetTipPosPixel( aWinPos );
310  if ( mpBubbleWin->IsVisible() )
311  mpBubbleWin->Show(); // This will recalc the screen position of the bubble
312  }
313  }
314 }
315 
316 IMPL_LINK(MenuBarUpdateIconManager, ApplicationEventHdl, VclSimpleEvent&, rEvent, void)
317 {
318  switch (rEvent.GetId())
319  {
323 
324  vcl::Window *pWindow = static_cast< VclWindowEvent * >(&rEvent)->GetWindow();
325  if ( pWindow && pWindow->IsTopWindow() )
326  {
327  SystemWindow *pSysWin = pWindow->GetSystemWindow();
328  MenuBar *pMBar = pSysWin ? pSysWin->GetMenuBar() : nullptr;
329  if (pMBar)
330  {
331  AddMenuBarIcon( pSysWin, true );
332  }
333  }
334  break;
335  }
336  default: break;
337  }
338 }
339 
340 IMPL_LINK_NOARG(MenuBarUpdateIconManager, UserEventHdl, void*, void)
341 {
344  SystemWindow *pActiveSysWin = nullptr;
345 
346  vcl::Window *pBubbleWin = nullptr;
347  if ( mpBubbleWin )
348  pBubbleWin = mpBubbleWin;
349 
350  if ( pActiveWin && ( pActiveWin != pBubbleWin ) && pActiveWin->IsTopWindow() )
351  pActiveSysWin = pActiveWin->GetSystemWindow();
352 
353  if ( pActiveWin == pBubbleWin )
354  pActiveSysWin = nullptr;
355 
356  while ( !pActiveSysWin && pTopWin )
357  {
358  if ( ( pTopWin != pBubbleWin ) && pTopWin->IsTopWindow() )
359  pActiveSysWin = pTopWin->GetSystemWindow();
360  if ( !pActiveSysWin )
361  pTopWin = Application::GetNextTopLevelWindow( pTopWin );
362  }
363 
364  if ( pActiveSysWin )
365  AddMenuBarIcon( pActiveSysWin, true );
366 }
367 
369 {
370  maWaitIdle.Stop();
371  if ( mpBubbleWin )
372  mpBubbleWin->Show( false );
373 
374  maClickHdl.Call(nullptr);
375 
376  return false;
377 }
378 
380 {
381  if ( rData.bHighlight )
382  maWaitIdle.Start();
383  else
384  RemoveBubbleWindow(false);
385 
386  return false;
387 }
388 
390 {
391  mpBubbleWin = GetBubbleWindow();
392 
393  if ( mpBubbleWin )
394  {
395  mpBubbleWin->Show();
396  }
397 }
398 
400 {
402 
403  RemoveBubbleWindow(true);
404 }
405 
407 {
408  if ( bShowMenuIcon != mbShowMenuIcon )
409  {
410  mbShowMenuIcon = bShowMenuIcon;
411  if ( bShowMenuIcon )
413  else
414  RemoveBubbleWindow( true );
415  }
416 }
417 
419 {
420  mbShowBubble = bShowBubble;
421  if ( mbShowBubble )
423  else if ( mpBubbleWin )
424  mpBubbleWin->Show( false );
425 }
426 
428 {
429  mbBubbleChanged = true;
431  mpBubbleWin->Show( false );
432 }
433 
435 {
436  maBubbleImage = rImage;
438 }
439 
440 void MenuBarUpdateIconManager::SetBubbleTitle(const OUString& rTitle)
441 {
442  if (rTitle != maBubbleTitle)
443  {
444  maBubbleTitle = rTitle;
446  }
447 }
448 
449 void MenuBarUpdateIconManager::SetBubbleText(const OUString& rText)
450 {
451  if (rText != maBubbleText)
452  {
453  maBubbleText = rText;
455  }
456 }
457 
458 namespace {
459 Image GetMenuBarIcon( MenuBar const * pMBar )
460 {
461  OUString sResID;
462  vcl::Window *pMBarWin = pMBar->GetWindow();
463  sal_uInt32 nMBarHeight = 20;
464 
465  if ( pMBarWin )
466  nMBarHeight = pMBarWin->GetOutputSizePixel().getHeight();
467 
468  if (nMBarHeight >= 35)
469  sResID = RID_UPDATE_AVAILABLE_26;
470  else
471  sResID = RID_UPDATE_AVAILABLE_16;
472 
473  return Image(StockImage::Yes, sResID);
474 }
475 }
476 
478 {
479  if ( ! mbShowMenuIcon )
480  return;
481 
482  MenuBar *pActiveMBar = pSysWin->GetMenuBar();
483  if ( ( pSysWin != mpIconSysWin ) || ( pActiveMBar != mpIconMBar ) )
484  {
485  if ( bAddEventHdl && mpIconSysWin )
487 
488  RemoveBubbleWindow( true );
489 
490  if ( pActiveMBar )
491  {
492  OUStringBuffer aBuf;
493  if( !maBubbleTitle.isEmpty() )
494  aBuf.append( maBubbleTitle );
495  if( !maBubbleText.isEmpty() )
496  {
497  if( !maBubbleTitle.isEmpty() )
498  aBuf.append( "\n\n" );
499  aBuf.append( maBubbleText );
500  }
501 
502  Image aImage = GetMenuBarIcon( pActiveMBar );
503  mnIconID = pActiveMBar->AddMenuBarButton( aImage,
504  LINK( this, MenuBarUpdateIconManager, ClickHdl ),
505  aBuf.makeStringAndClear()
506  );
508  LINK( this, MenuBarUpdateIconManager, HighlightHdl ) );
509  }
510  mpIconMBar = pActiveMBar;
511  mpIconSysWin = pSysWin;
512  if ( bAddEventHdl && mpIconSysWin )
514  }
515 
516  if ( mbShowBubble && pActiveMBar )
517  {
519  if ( mpBubbleWin )
520  {
521  mpBubbleWin->Show();
523  }
524  mbShowBubble = false;
525  }
526 }
527 
529 {
530  maWaitIdle.Stop();
532 
533  if ( mpBubbleWin )
534  {
536  }
537 
538  if ( !bRemoveIcon )
539  return;
540 
541  try {
542  if ( mpIconMBar && ( mnIconID != 0 ) )
543  {
545  mpIconMBar = nullptr;
546  mnIconID = 0;
547  }
548  }
549  catch ( ... ) {
550  mpIconMBar = nullptr;
551  mnIconID = 0;
552  }
553 
554  mpIconSysWin = nullptr;
555 }
556 
557 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Size GetSizePixel() const
Definition: Image.cxx:86
void SetBackground()
Definition: window3.cxx:100
WinBits const WB_SYSTEMWINDOW
SystemWindow * GetSystemWindow() const
Definition: stacking.cxx:806
void DrawImage(const Point &rPos, const Image &rImage, DrawImageFlags nStyle=DrawImageFlags::NONE)
This is an overloaded member function, provided for convenience. It differs from the above function o...
void setWidth(tools::Long nWidth)
void Union(const tools::Rectangle &rRegion)
Definition: region.cxx:506
Image maBubbleImage
static void RemoveEventListener(const Link< VclSimpleEvent &, void > &rEventListener)
Remove a VCL event listener from the application.
Definition: svapp.cxx:826
long Long
void disposeAndClear()
Definition: vclptr.hxx:200
Link< VclWindowEvent &, void > maWindowEventHdl
void AddMenuBarIcon(SystemWindow *pSysWin, bool bAddEventHdl)
virtual Size GetSizePixel() const
Definition: window.cxx:2405
aBuf
void SetBubbleText(const OUString &rText)
void SetWeight(FontWeight)
Definition: font/font.cxx:249
void DrawPolyLine(const tools::Polygon &rPoly)
Render the given polygon as a line stroke.
Definition: polyline.cxx:33
const ContentProperties & rData
static ImplSVEvent * PostUserEvent(const Link< void *, void > &rLink, void *pCaller=nullptr, bool bReferenceLink=false)
Post a user event to the default window.
Definition: svapp.cxx:1120
constexpr Point BottomCenter() const
static void AddEventListener(const Link< VclSimpleEvent &, void > &rEventListener)
Add a VCL event listener to the application.
Definition: svapp.cxx:820
tools::Long GetFontHeight() const
Definition: font/font.cxx:883
WEIGHT_BOLD
constexpr tools::Long Width() const
void SetShowBubble(bool bShowBubble)
#define TEXT_MAX_WIDTH
WinBits const WB_OWNERDRAWDECORATION
IMPL_LINK(MenuBarUpdateIconManager, WindowEventHdl, VclWindowEvent &, rEvent, void)
virtual void MouseButtonDown(const MouseEvent &rMEvt) override
OUString maBubbleText
VclEventId
Definition: vclevent.hxx:37
constexpr tools::Long GetWidth() const
bool IsTopWindow() const
Definition: stacking.cxx:608
void SetMenuBarButtonHighlightHdl(sal_uInt16 nId, const Link< MenuBarButtonCallbackArg &, bool > &)
Definition: menu.cxx:2613
IMPL_LINK_NOARG(MenuBarUpdateIconManager, TimeOutHdl, Timer *, void)
void SetWindowRegionPixel()
Definition: paint.cxx:1037
constexpr tools::Long getHeight() const
void DrawLine(const Point &rStartPt, const Point &rEndPt)
Definition: line.cxx:160
VclPtr< MenuBar > mpIconMBar
constexpr bool IsEmpty() const
#define BUBBLE_BORDER
static vcl::Window * GetFirstTopLevelWindow()
Get the first top-level window of the application.
Definition: svapp.cxx:1169
tools::Rectangle maTextRect
void SetLineColor()
Definition: line.cxx:36
#define TIP_HEIGHT
tools::Polygon maTriPoly
Some things multiple-inherit from VclAbstractDialog and OutputDevice, so we need to use virtual inher...
Definition: outdev.hxx:175
const AllSettings & GetSettings() const
Definition: window3.cxx:129
const Color & GetLineColor() const
Definition: outdev.hxx:521
virtual void Start(bool bStartTimer=true) override
Schedules the task for execution.
Definition: timer.cxx:83
BubbleWindow(vcl::Window *pParent, const OUString &rTitle, const OUString &rText, const Image &rImage)
VclPtr< SystemWindow > mpIconSysWin
void SetTimeout(sal_uInt64 nTimeoutMs)
Definition: timer.cxx:90
vcl::Window * GetParent() const
Definition: window2.cxx:1120
static vcl::Window * GetActiveTopWindow()
Get the "active" top window.
Definition: svapp.cxx:1213
Point OutputToAbsoluteScreenPixel(const Point &rPos) const
Definition: window.cxx:2858
void RemoveBubbleWindow(bool bRemoveIcon)
WinBits const WB_NOBORDER
virtual void SetPosSizePixel(const Point &rNewPos, const Size &rNewSize)
Definition: window2.cxx:1291
vcl::Window * GetWindow(GetWindowType nType) const
Definition: stacking.cxx:1035
OUString maBubbleTitle
void AddEventListener(const Link< VclWindowEvent &, void > &rEventListener)
Definition: event.cxx:303
virtual void Paint(vcl::RenderContext &rRenderContext, const tools::Rectangle &rRect) override
VclPtr< BubbleWindow > mpBubbleWin
void Show(bool bVisible=true)
void Stop()
Definition: scheduler.cxx:590
static vcl::Window * GetNextTopLevelWindow(vcl::Window const *pWindow)
Get the next top level window.
Definition: svapp.cxx:1175
void SetTitleAndText(const OUString &rTitle, const OUString &rText, const Image &rImage)
MenuBar * GetMenuBar() const
Definition: syswin.hxx:183
constexpr tools::Long Height() const
vcl::Window * GetWindow() const
Definition: menu.hxx:370
VclPtr< BubbleWindow > GetBubbleWindow()
void SetShowMenuIcon(bool bShowMenuIcon)
#define TIP_RIGHT_OFFSET
Definition: image.hxx:39
static VclPtr< reference_type > Create(Arg &&...arg)
A construction helper for VclPtr.
Definition: vclptr.hxx:127
tools::Rectangle GetTextRect(const tools::Rectangle &rRect, const OUString &rStr, DrawTextFlags nStyle=DrawTextFlags::WordBreak, TextRectInfo *pInfo=nullptr, const vcl::ITextLayout *_pTextLayout=nullptr) const
Definition: window3.cxx:201
void SetInvokeHandler(const Link< Timer *, void > &rLink)
Definition: timer.hxx:56
const vcl::Font & GetFont() const
Definition: window3.cxx:58
Link< VclSimpleEvent &, void > maApplicationEventHdl
Size GetOutputSizePixel() const
Definition: window3.cxx:89
#define TIP_WIDTH
void setHeight(tools::Long nHeight)
tools::Rectangle maTitleRect
void Move(tools::Long nHorzMoveDelta, tools::Long nVertMoveDelta)
void RemoveEventListener(const Link< VclWindowEvent &, void > &rEventListener)
Definition: event.cxx:308
Definition: timer.hxx:26
void SetPriority(TaskPriority ePriority)
Definition: scheduler.cxx:597
void SetFont(const vcl::Font &rNewFont)
Definition: window3.cxx:59
tools::Rectangle GetMenuBarButtonRectPixel(sal_uInt16 nId)
Definition: menu.cxx:2629
tools::Long mnTipOffset
void SetBubbleImage(const Image &rImage)
sal_uInt16 AddMenuBarButton(const Image &, const Link< MenuBarButtonCallbackArg &, bool > &, const OUString &)
Definition: menu.cxx:2607
Low, very idle cleanup tasks.
void RecalcTextRects()
void SetBubbleTitle(const OUString &rTitle)
void DrawText(const Point &rStartPt, const OUString &rStr, sal_Int32 nIndex=0, sal_Int32 nLen=-1, std::vector< tools::Rectangle > *pVector=nullptr, OUString *pDisplayText=nullptr, const SalLayoutGlyphs *pLayoutCache=nullptr)
Definition: text.cxx:795
virtual void Resize() override
Definition: syswin.cxx:1005
tools::Polygon maRectPoly
void RemoveMenuBarButton(sal_uInt16 nId)
Definition: menu.cxx:2621
void setHeight(tools::Long n)
#define TEXT_MAX_HEIGHT
bool m_bDetectedRangeSegmentation false
vcl::Region maBounds
constexpr tools::Long GetHeight() const
void Show(bool bVisible=true, ShowFlags nFlags=ShowFlags::NONE)
Definition: window.cxx:2190
void Resize() override