// If you want to change the number you also have to: // - Add new slot ids to sfxsids.hrc // - Add new slots to frmslots.sdi // - Add new slot definitions to sfx.sdi constint NUM_OF_DOCKINGWINDOWS = 10;
namespace {
class SfxTitleDockingWindow : public SfxDockingWindow
{
VclPtr<vcl::Window> m_pWrappedWindow;
// Use factory manager to retrieve XWindow factory. That can be used to instantiate // the real window factory.
uno::Reference< lang::XSingleComponentFactory > xFactoryMgr = ui::theWindowContentFactoryManager::get(xContext);
SfxDispatcher* pDispatcher = pBindings->GetDispatcher();
uno::Reference< frame::XFrame > xFrame = pDispatcher->GetFrame()->GetFrame().GetFrameInterface(); // create a resource URL from the nId provided by the sfx2
OUString aResourceURL = "private:resource/dockingwindow/" + OUString::number(nId);
uno::Sequence<uno::Any> aArgs(comphelper::InitAnyPropertySequence(
{
{"Frame", uno::Any(xFrame)},
{"ResourceURL", uno::Any(aResourceURL)},
}));
staticbool lcl_checkDockingWindowID( sal_uInt16 nID )
{ return nID >= SID_DOCKWIN_START && nID < o3tl::make_unsigned(SID_DOCKWIN_START+NUM_OF_DOCKINGWINDOWS);
}
static SfxWorkWindow* lcl_getWorkWindowFromXFrame( const uno::Reference< frame::XFrame >& rFrame )
{ // We need to find the corresponding SfxFrame of our XFrame
SfxFrame* pFrame = SfxFrame::GetFirst();
SfxFrame* pXFrame = nullptr; while ( pFrame )
{
uno::Reference< frame::XFrame > xViewShellFrame( pFrame->GetFrameInterface() ); if ( xViewShellFrame == rFrame )
{
pXFrame = pFrame; break;
} else
pFrame = SfxFrame::GetNext( *pFrame );
}
// If we have a SfxFrame we can retrieve the work window (Sfx layout manager for docking windows) if ( pXFrame ) return pXFrame->GetWorkWindow_Impl(); else return nullptr;
}
/** Factory function used by the framework layout manager to "create" a docking window with a special name. ThestringrDockingWindowNameMUSTBEavalidID!TheIDispre-definedbyacertainslotrangelocated insfxsids.hrc(currentlySID_DOCKWIN_START=9800).
*/ void SfxDockingWindowFactory( const uno::Reference< frame::XFrame >& rFrame, std::u16string_view rDockingWindowName )
{
SolarMutexGuard aGuard;
sal_uInt16 nID = sal_uInt16(o3tl::toInt32(rDockingWindowName));
// Check the range of the provided ID otherwise nothing will happen if ( !lcl_checkDockingWindowID( nID )) return;
SfxWorkWindow* pWorkWindow = lcl_getWorkWindowFromXFrame( rFrame ); if ( pWorkWindow )
{
SfxChildWindow* pChildWindow = pWorkWindow->GetChildWindow_Impl(nID); if ( !pChildWindow )
{ // Register window at the workwindow child window list
pWorkWindow->SetChildWindow_Impl( nID, true, false );
}
}
}
/** Function used by the framework layout manager to determine the visibility state of a docking window with aspecialname.ThestringrDockingWindowNameMUSTBEavalidID!TheIDispre-definedbyacertainslot rangelocatedinsfxsids.hrc(currentlySID_DOCKWIN_START=9800).
*/ bool IsDockingWindowVisible( const uno::Reference< frame::XFrame >& rFrame, std::u16string_view rDockingWindowName )
{
SolarMutexGuard aGuard;
sal_uInt16 nID = sal_uInt16(o3tl::toInt32(rDockingWindowName));
// Check the range of the provided ID otherwise nothing will happen if ( lcl_checkDockingWindowID( nID ))
{
SfxWorkWindow* pWorkWindow = lcl_getWorkWindowFromXFrame( rFrame ); if ( pWorkWindow )
{
SfxChildWindow* pChildWindow = pWorkWindow->GetChildWindow_Impl(nID); if ( pChildWindow ) returntrue;
}
}
returnfalse;
}
class SfxDockingWindow_Impl
{ friendclass SfxDockingWindow;
// The following members are only valid in the time from startDocking to // EndDocking:
Size aSplitSize;
tools::Long nHorizontalSize;
tools::Long nVerticalSize;
sal_uInt16 nLine;
sal_uInt16 nPos;
sal_uInt16 nDockLine;
sal_uInt16 nDockPos; bool bNewLine; bool bDockingPrevented;
OUString aWinState;
if ( IsFloatingMode() )
{ // start timer for saving window status information
pImpl->aMoveIdle.Start();
} else
{
Size aSize( GetSizePixel() ); switch ( pImpl->GetDockAlignment() )
{ case SfxChildAlignment::LEFT: case SfxChildAlignment::FIRSTLEFT: case SfxChildAlignment::LASTLEFT: case SfxChildAlignment::RIGHT: case SfxChildAlignment::FIRSTRIGHT: case SfxChildAlignment::LASTRIGHT:
pImpl->nHorizontalSize = aSize.Width();
pImpl->aSplitSize = aSize; break; case SfxChildAlignment::TOP: case SfxChildAlignment::LOWESTTOP: case SfxChildAlignment::HIGHESTTOP: case SfxChildAlignment::BOTTOM: case SfxChildAlignment::HIGHESTBOTTOM: case SfxChildAlignment::LOWESTBOTTOM:
pImpl->nVerticalSize = aSize.Height();
pImpl->aSplitSize = aSize; break; default: break;
}
}
}
if ( (Application::IsInModalMode() && IsFloatingMode()) || !pMgr ) returnfalse;
if ( pImpl->bDockingPrevented ) returnfalse;
if (!IsFloatingMode())
{ // Test, if FloatingMode is permitted. if ( CheckAlignment(GetAlignment(),SfxChildAlignment::NOALIGNMENT) != SfxChildAlignment::NOALIGNMENT ) returnfalse;
if ( pImpl->pSplitWin )
{ // The DockingWindow is inside a SplitWindow and will be teared of.
pImpl->pSplitWin->RemoveWindow(this/*, sal_False*/);
pImpl->pSplitWin = nullptr;
}
} elseif ( pMgr )
{
pImpl->aWinState = GetFloatingWindow()->GetWindowState();
// Test if it is allowed to dock, if (CheckAlignment(GetAlignment(),pImpl->GetLastAlignment()) == SfxChildAlignment::NOALIGNMENT) returnfalse;
// Test, if the Workwindow allows for docking at the moment.
SfxWorkWindow *pWorkWin = pBindings->GetWorkWindow_Impl(); if ( !pWorkWin->IsDockingAllowed() || !pWorkWin->IsInternalDockingAllowed() ) returnfalse;
}
// Remember old alignment and then switch. // SV has already switched, but the alignment SfxDockingWindow is still // the old one. What I was before?
SfxChildAlignment eLastAlign = GetAlignment();
if (IsFloatingMode())
{
SetAlignment(SfxChildAlignment::NOALIGNMENT); if ( !pImpl->aWinState.isEmpty() )
GetFloatingWindow()->SetWindowState( pImpl->aWinState ); else
GetFloatingWindow()->SetOutputSizePixel( GetFloatingSize() );
} else
{ if (pImpl->GetDockAlignment() == eLastAlign)
{ // If ToggleFloatingMode was called, but the DockAlignment still // is unchanged, then this means that it must have been a toggling // through DClick, so use last alignment
SetAlignment (pImpl->GetLastAlignment());
} else
{
// Toggling was triggered by dragging
pImpl->nLine = pImpl->nDockLine;
pImpl->nPos = pImpl->nDockPos;
SetAlignment (pImpl->GetDockAlignment());
}
// The DockingWindow is now in a SplitWindow
pImpl->pSplitWin = pWorkWin->GetSplitWindow_Impl(GetAlignment());
// The LastAlignment is still the last docked
SfxSplitWindow *pSplit = pWorkWin->GetSplitWindow_Impl(pImpl->GetLastAlignment());
DBG_ASSERT( pSplit, "LastAlignment is not correct!" ); if ( pSplit && pSplit != pImpl->pSplitWin )
pSplit->ReleaseWindow_Impl(this); if ( pImpl->GetDockAlignment() == eLastAlign )
pImpl->pSplitWin->InsertWindow( this, pImpl->aSplitSize ); else
pImpl->pSplitWin->InsertWindow( this, pImpl->aSplitSize, pImpl->nLine, pImpl->nPos, pImpl->bNewLine ); if ( !pImpl->pSplitWin->IsFadeIn() )
pImpl->pSplitWin->FadeIn();
}
// Keep the old alignment for the next toggle; set it only now due to the // unregister SplitWindow!
pImpl->SetLastAlignment(eLastAlign);
// Reset DockAlignment, if EndDocking is still called
pImpl->SetDockAlignment(GetAlignment());
// Dock or undock SfxChildWindow correctly.
pWorkWin->ConfigChild_Impl( SfxChildIdentifier::SPLITWINDOW, SfxDockingConfig::TOGGLEFLOATMODE, pMgr->GetType() );
}
if ( pImpl->pSplitWin )
{ // Get the current docking data
pImpl->pSplitWin->GetWindowPos(this, pImpl->nLine, pImpl->nPos);
pImpl->nDockLine = pImpl->nLine;
pImpl->nDockPos = pImpl->nPos;
pImpl->bNewLine = false;
}
}
if ( GetOuterRect().Contains( rPos ) )
{ // Mouse within OuterRect: calculate Alignment and Rectangle
SfxChildAlignment eAlign = CalcAlignment(rPos, rRect); if (eAlign == SfxChildAlignment::NOALIGNMENT)
bFloatMode = true;
pImpl->SetDockAlignment(eAlign);
} else
{ // Mouse is not within OuterRect: must be FloatingWindow // Is this allowed? if (CheckAlignment(pImpl->GetDockAlignment(),SfxChildAlignment::NOALIGNMENT) != SfxChildAlignment::NOALIGNMENT) returnfalse;
bFloatMode = true; if ( SfxChildAlignment::NOALIGNMENT != pImpl->GetDockAlignment() )
{ // Due to a bug the rRect may only be changed when the // alignment is changed!
pImpl->SetDockAlignment(SfxChildAlignment::NOALIGNMENT);
rRect.SetSize(CalcDockingSize(SfxChildAlignment::NOALIGNMENT));
}
}
return bFloatMode;
}
/** Virtual method of the DockingWindow class ensures the correct alignment on theparentwindow.Ifthismethodisoverriddenbyaderivedclass,then SfxDockingWindow::EndDocking()mustbecalledfirst.
*/ void SfxDockingWindow::EndDocking( const tools::Rectangle& rRect, bool bFloatMode )
{ if ( !pImpl || !pImpl->bConstructed || IsDockingCanceled() || !pMgr ) return;
// If the alignment changes and the window is in a docked state in a // SplitWindow, then it must be re-registered. If it is docked again, // PrepareToggleFloatingMode() and ToggleFloatingMode() perform the // re-registered bool bReArrange = !bFloatMode;
if ( bReArrange )
{ if ( GetAlignment() != pImpl->GetDockAlignment() )
{ // before Show() is called must the reassignment have been made, // therefore the base class can not be called if ( IsFloatingMode() )
Show( false, ShowFlags::NoFocusChange );
/** Constructor for the SfxDockingWindow class. A SfxChildWindow will be requiredbecausethedockingisimplementedinSfxthroughSfxChildWindows.
*/
SfxDockingWindow::SfxDockingWindow( SfxBindings *pBindinx, SfxChildWindow *pCW,
vcl::Window* pParent, const OUString& rID, const OUString& rUIXMLDescription)
: ResizableDockingWindow(pParent)
, pBindings(pBindinx)
, pMgr(pCW)
{
m_xBuilder = Application::CreateInterimBuilder(m_xBox, rUIXMLDescription, true);
m_xContainer = m_xBuilder->weld_box(rID);
pImpl.reset(new SfxDockingWindow_Impl(this));
}
/** Initialization of the SfxDockingDialog class via a SfxChildWinInfo. Theinitializationisdoneonlyina2ndstepaftertheconstructor,this constructorshouldbecalledfromthederivedclassorfromthe SfxChildWindows.
*/ void SfxDockingWindow::Initialize(SfxChildWinInfo *pInfo)
{ if ( !pMgr )
{
pImpl->SetDockAlignment( SfxChildAlignment::NOALIGNMENT );
pImpl->bConstructed = true; return;
}
if (pInfo && (pInfo->nFlags & SfxChildWindowFlags::FORCEDOCK))
pImpl->bDockingPrevented = true;
if ( pFloatWin )
{ // initialize floating window if ( pImpl->aWinState.isEmpty() ) // window state never set before, get if from defaults
pImpl->aWinState = pFloatWin->GetWindowState();
// trick: use VCL method SetWindowState to adjust position and size
pFloatWin->SetWindowState( pImpl->aWinState );
Size aSize(pFloatWin->GetSizePixel());
// remember floating size for calculating alignment and tracking rectangle
SetFloatingSize(aSize);
}
// allow calling of docking handlers
pImpl->bConstructed = true;
}
/** Fills a SfxChildWinInfo with specific data from SfxDockingWindow, sothatitcanbewrittenintheINIfile.Itisassumedthatrinfo receivesallotherpossiblerelevantdataintheChildWindowclass. InsertionsaremarkedwithsizeandtheZoomInflag. Ifthismethodisoverridden,thebaseimplementationmustbecalledfirst.
*/ void SfxDockingWindow::FillInfo(SfxChildWinInfo& rInfo) const
{ if (!pMgr || !pImpl) return;
if (GetFloatingWindow() && pImpl->bConstructed)
pImpl->aWinState = GetFloatingWindow()->GetWindowState();
/** This method calculates a resulting alignment for the given mouse position andtrackingrectangle.Whenchangingthealignmentitcanalsobethat thetrackingrectangleischanged,sothatanalteredrectangleis returned.Theuserofthisclasscaninfluencebehaviourofthismethod, andthusthebehaviorofhisDockinWindowclasswhendockingwherethe calledvirtualmethod:
// limit border to predefined constant values if ( nLRBorder > MAX_TOGGLEAREA_WIDTH )
nLRBorder = MAX_TOGGLEAREA_WIDTH; if ( nTBBorder > MAX_TOGGLEAREA_WIDTH )
nTBBorder = MAX_TOGGLEAREA_WIDTH;
// shrink area for floating mode if possible
tools::Rectangle aInRect = GetInnerRect(); if ( aInRect.GetWidth() > nLRBorder )
aInRect.AdjustLeft(nLRBorder/2 ); if ( aInRect.GetWidth() > nLRBorder )
aInRect.AdjustRight( -(nLRBorder/2) ); if ( aInRect.GetHeight() > nTBBorder )
aInRect.AdjustTop(nTBBorder/2 ); if ( aInRect.GetHeight() > nTBBorder )
aInRect.AdjustBottom( -(nTBBorder/2) );
// calculate alignment resulting from docking rectangle bool bBecomesFloating = false;
SfxChildAlignment eDockAlign = pImpl->GetDockAlignment();
tools::Rectangle aDockingRect( rRect ); if ( !IsFloatingMode() )
{ // don't use tracking rectangle for alignment check, because it will be too large // to get a floating mode as result - switch to floating size // so the calculation only depends on the position of the rectangle, not the current // docking state of the window
aDockingRect.SetSize( GetFloatingSize() );
// in this mode docking is never done by keyboard, so it's OK to use the mouse position
aDockingRect.SetPos( pWorkWin->GetWindow()->OutputToScreenPixel( pWorkWin->GetWindow()->GetPointerPosPixel() ) );
}
Point aPos = aDockingRect.TopLeft();
tools::Rectangle aIntersect = GetOuterRect().GetIntersection( aDockingRect ); if ( aIntersect.IsEmpty() ) // docking rectangle completely outside docking area -> floating mode
bBecomesFloating = true; else
{ // create a small test rect around the mouse position and use this one // instead of the passed rRect to not dock too easily or by accident
tools::Rectangle aSmallDockingRect;
aSmallDockingRect.SetSize( Size( MAX_TOGGLEAREA_WIDTH, MAX_TOGGLEAREA_HEIGHT ) );
Point aNewPos(rPos);
aNewPos.AdjustX( -(aSmallDockingRect.GetWidth()/2) );
aNewPos.AdjustY( -(aSmallDockingRect.GetHeight()/2) );
aSmallDockingRect.SetPos(aNewPos);
tools::Rectangle aIntersectRect = aInRect.GetIntersection( aSmallDockingRect ); if ( aIntersectRect == aSmallDockingRect ) // docking rectangle completely inside (shrunk) inner area -> floating mode
bBecomesFloating = true;
}
if ( bBecomesFloating )
{
eDockAlign = CheckAlignment(pImpl->GetDockAlignment(),SfxChildAlignment::NOALIGNMENT);
} else
{ // docking rectangle is in the "sensible area"
Point aInPosTL( aPos.X()-aInRect.Left(), aPos.Y()-aInRect.Top() );
Point aInPosBR( aPos.X()-aInRect.Left() + aDockingRect.GetWidth(), aPos.Y()-aInRect.Top() + aDockingRect.GetHeight() );
Size aInSize = aInRect.GetSize(); bool bNoChange = false;
// check if alignment is still unchanged switch ( GetAlignment() )
{ case SfxChildAlignment::LEFT: case SfxChildAlignment::FIRSTLEFT: case SfxChildAlignment::LASTLEFT: if (aInPosTL.X() <= 0)
{
eDockAlign = GetAlignment();
bNoChange = true;
} break; case SfxChildAlignment::TOP: case SfxChildAlignment::LOWESTTOP: case SfxChildAlignment::HIGHESTTOP: if ( aInPosTL.Y() <= 0)
{
eDockAlign = GetAlignment();
bNoChange = true;
} break; case SfxChildAlignment::RIGHT: case SfxChildAlignment::FIRSTRIGHT: case SfxChildAlignment::LASTRIGHT: if ( aInPosBR.X() >= aInSize.Width())
{
eDockAlign = GetAlignment();
bNoChange = true;
} break; case SfxChildAlignment::BOTTOM: case SfxChildAlignment::LOWESTBOTTOM: case SfxChildAlignment::HIGHESTBOTTOM: if ( aInPosBR.Y() >= aInSize.Height())
{
eDockAlign = GetAlignment();
bNoChange = true;
} break; default: break;
}
if ( !bNoChange )
{ // alignment will change, test alignment according to distance of the docking rectangles edges bool bForbidden = true; if ( aInPosTL.X() <= 0)
{
eDockAlign = CheckAlignment(pImpl->GetDockAlignment(),SfxChildAlignment::LEFT);
bForbidden = ( eDockAlign != SfxChildAlignment::LEFT &&
eDockAlign != SfxChildAlignment::FIRSTLEFT &&
eDockAlign != SfxChildAlignment::LASTLEFT );
}
// the calculated alignment was rejected by the window -> take floating mode if ( bForbidden )
eDockAlign = CheckAlignment(pImpl->GetDockAlignment(),SfxChildAlignment::NOALIGNMENT);
}
}
if ( eDockAlign == SfxChildAlignment::NOALIGNMENT )
{ // In the FloatingMode the tracking rectangle will get the floating // size. Due to a bug the rRect may only be changed when the // alignment is changed! if ( eDockAlign != pImpl->GetDockAlignment() )
aDockingRect.SetSize( aFloatingSize );
} else
{
sal_uInt16 nLine, nPos;
SfxSplitWindow *pSplitWin = pWorkWin->GetSplitWindow_Impl(eDockAlign);
aPos = pSplitWin->ScreenToOutputPixel( aPos ); if ( pSplitWin->GetWindowPos( aPos, nLine, nPos ) )
{ // mouse over splitwindow, get line and position
pImpl->nDockLine = nLine;
pImpl->nDockPos = nPos;
pImpl->bNewLine = false;
} else
{ // mouse touches inner border -> create new line if ( eDockAlign == GetAlignment() && pImpl->pSplitWin &&
pImpl->nLine == pImpl->pSplitWin->GetLineCount()-1 && pImpl->pSplitWin->GetWindowCount(pImpl->nLine) == 1 )
{ // if this window is the only one in the last line, it can't be docked as new line in the same splitwindow
pImpl->nDockLine = pImpl->nLine;
pImpl->nDockPos = pImpl->nPos;
pImpl->bNewLine = false;
} else
{ // create new line
pImpl->nDockLine = pSplitWin->GetLineCount();
pImpl->nDockPos = 0;
pImpl->bNewLine = true;
}
}
bool bChanged = pImpl->nLine != pImpl->nDockLine || pImpl->nPos != pImpl->nDockPos || eDockAlign != GetAlignment(); if ( !bChanged && !IsFloatingMode() )
{ // window only slightly moved, no change of any property
rRect.SetSize( pImpl->aSplitSize );
rRect.SetPos( aDockingRect.TopLeft() ); return eDockAlign;
}
// calculate new size and position
Size aSize;
Point aPoint = aDockingRect.TopLeft();
Size aInnerSize = GetInnerRect().GetSize(); if ( eDockAlign == SfxChildAlignment::LEFT || eDockAlign == SfxChildAlignment::RIGHT )
{ if ( pImpl->bNewLine )
{ // set height to height of free area
aSize.setHeight( aInnerSize.Height() );
aSize.setWidth( pImpl->nHorizontalSize ); if ( eDockAlign == SfxChildAlignment::LEFT )
{
aPoint = aInnerRect.TopLeft();
} else
{
aPoint = aInnerRect.TopRight();
aPoint.AdjustX( -(aSize.Width()) );
}
} else
{ // get width from splitwindow
aSize.setWidth( pSplitWin->GetLineSize(nLine) );
aSize.setHeight( pImpl->aSplitSize.Height() );
}
} else
{ if ( pImpl->bNewLine )
{ // set width to width of free area
aSize.setWidth( aInnerSize.Width() );
aSize.setHeight( pImpl->nVerticalSize ); if ( eDockAlign == SfxChildAlignment::TOP )
{
aPoint = aInnerRect.TopLeft();
} else
{
aPoint = aInnerRect.BottomLeft();
aPoint.AdjustY( -(aSize.Height()) );
}
} else
{ // get height from splitwindow
aSize.setHeight( pSplitWin->GetLineSize(nLine) );
aSize.setWidth( pImpl->aSplitSize.Width() );
}
}
/** Virtual method of the SfxDockingWindow class. This method determines how thesizeoftheDockingWindowschangesdependingonthealignment.Thebase implementationusesthefloatingmode,thesizeofthemarkedFloating Size.Forhorizontalalignment,thewidthwillbethewidthoftheouter DockingRectangle,withverticalalignmenttheheightwillbetheheightof theinnerDockingRectangle(resultingfromtheorderinwhichtheSFXchild windowsaredisplayed).Theothersizeissettothecurrentfloating-size, thiscouldchangedbyatointerveningderivedclass.Thedockingsizemust bethesameforLeft/RightandTop/Bottom.
*/
Size SfxDockingWindow::CalcDockingSize(SfxChildAlignment eAlign)
{ // Note: if the resizing is also possible in the docked state, then the // Floating-size does also have to be adjusted?
Size aSize = GetFloatingSize(); switch (eAlign)
{ case SfxChildAlignment::TOP: case SfxChildAlignment::BOTTOM: case SfxChildAlignment::LOWESTTOP: case SfxChildAlignment::HIGHESTTOP: case SfxChildAlignment::LOWESTBOTTOM: case SfxChildAlignment::HIGHESTBOTTOM:
aSize.setWidth( aOuterRect.Right() - aOuterRect.Left() ); break; case SfxChildAlignment::LEFT: case SfxChildAlignment::RIGHT: case SfxChildAlignment::FIRSTLEFT: case SfxChildAlignment::LASTLEFT: case SfxChildAlignment::FIRSTRIGHT: case SfxChildAlignment::LASTRIGHT:
aSize.setHeight( aInnerRect.Bottom() - aInnerRect.Top() ); break; case SfxChildAlignment::NOALIGNMENT: break; default: break;
}
return aSize;
}
/** Virtual method of the SfxDockingWindow class. Here a derived class can disallowcertainalignments.Thebaseimplementationdoesnot prohibitalignment.
*/
SfxChildAlignment SfxDockingWindow::CheckAlignment(SfxChildAlignment,
SfxChildAlignment eAlign)
{ return eAlign;
}
/** The window is closed when the ChildWindow is destroyed by running the ChildWindow-slots.Ifthisismethodisoverriddenbyaderivedclass method,thentheSfxDockingDialogWindow:Close()mustbecalledafterwards iftheClose()wasnotcancelledwith"returnsal_False".
*/ bool SfxDockingWindow::Close()
{ // Execute with Parameters, since Toggle is ignored by some ChildWindows. if ( !pMgr ) returntrue;
/** With this method, a minimal OutputSize be can set, that is queried in theResizing()-Handler.
*/ void SfxDockingWindow::SetMinOutputSizePixel( const Size& rSize )
{
pImpl->aMinSize = rSize;
ResizableDockingWindow::SetMinOutputSizePixel( rSize );
}
/** Set the minimum size which is returned.*/ const Size& SfxDockingWindow::GetMinOutputSizePixel() const
{ return pImpl->aMinSize;
}
if ( rEvt.GetType() == NotifyEventType::GETFOCUS )
{ if (pMgr != nullptr)
pBindings->SetActiveFrame( pMgr->GetFrame() );
if ( pImpl->pSplitWin )
pImpl->pSplitWin->SetActiveWindow_Impl( this ); elseif (pMgr != nullptr)
pMgr->Activate_Impl();
// In VCL EventNotify goes first to the window itself, also call the // base class, otherwise the parent learns nothing // if ( rEvt.GetWindow() == this ) PB: #i74693# not necessary any longer
ResizableDockingWindow::EventNotify( rEvt ); // tdf#151112 move focus into container widget hierarchy if not already there if (m_xContainer && !m_xContainer->has_child_focus())
m_xContainer->child_grab_focus(); returntrue;
} elseif( rEvt.GetType() == NotifyEventType::KEYINPUT )
{ // First, allow KeyInput for Dialog functions if (!DockingWindow::EventNotify(rEvt) && SfxViewShell::Current())
{ // then also for valid global accelerators. return SfxViewShell::Current()->GlobalKeyInput_Impl( *rEvt.GetKeyEvent() );
} returntrue;
} elseif ( rEvt.GetType() == NotifyEventType::LOSEFOCUS && !HasChildPathFocus() )
{
pBindings->SetActiveFrame( nullptr );
}
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.38Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-09-28)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.