diff options
author | Chris Sherlock <chris.sherlock79@gmail.com> | 2014-05-22 02:51:15 +1000 |
---|---|---|
committer | Chris Sherlock <chris.sherlock79@gmail.com> | 2014-05-23 08:37:26 +1000 |
commit | 7818974103fcdf16e03354f62a4165eedea4427c (patch) | |
tree | 393e708e8f61e885060893115731342b90d33b36 /vcl | |
parent | f56101cb2135136af91926be7b8f758509a3f938 (diff) |
vcl: split window.cxx into event and settings functions
Change-Id: Ic038a1c95721d4e578face5deea0b8d8a4ab7304
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/Library_vcl.mk | 2 | ||||
-rw-r--r-- | vcl/source/window/event.cxx | 578 | ||||
-rw-r--r-- | vcl/source/window/mouseevent.cxx | 3 | ||||
-rw-r--r-- | vcl/source/window/settings.cxx | 388 | ||||
-rw-r--r-- | vcl/source/window/window.cxx | 891 |
5 files changed, 970 insertions, 892 deletions
diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk index e3215251397d..7ea6981a3ef4 100644 --- a/vcl/Library_vcl.mk +++ b/vcl/Library_vcl.mk @@ -101,6 +101,7 @@ $(eval $(call gb_Library_use_externals,vcl,\ )) $(eval $(call gb_Library_add_exception_objects,vcl,\ + vcl/source/window/settings \ vcl/source/window/resource \ vcl/source/window/abstdlg \ vcl/source/window/accel \ @@ -134,6 +135,7 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\ vcl/source/window/mnemonic \ vcl/source/window/mnemonicengine \ vcl/source/window/mouseevent \ + vcl/source/window/event \ vcl/source/window/msgbox \ vcl/source/window/popupmenuwindow \ vcl/source/window/printdlg \ diff --git a/vcl/source/window/event.cxx b/vcl/source/window/event.cxx new file mode 100644 index 000000000000..66e2d74fd06a --- /dev/null +++ b/vcl/source/window/event.cxx @@ -0,0 +1,578 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <vcl/event.hxx> +#include <vcl/window.hxx> +#include <vcl/dockwin.hxx> +#include <vcl/layout.hxx> + +#include <window.h> +#include <svdata.hxx> +#include <salframe.hxx> + +#include <com/sun/star/awt/MouseEvent.hpp> +#include <com/sun/star/awt/KeyModifier.hpp> +#include <com/sun/star/awt/MouseButton.hpp> + +void Window::DataChanged( const DataChangedEvent& ) +{ +} + +void Window::NotifyAllChildren( DataChangedEvent& rDCEvt ) +{ + + DataChanged( rDCEvt ); + + Window* pChild = mpWindowImpl->mpFirstChild; + while ( pChild ) + { + pChild->NotifyAllChildren( rDCEvt ); + pChild = pChild->mpWindowImpl->mpNext; + } +} + +bool Window::PreNotify( NotifyEvent& rNEvt ) +{ + bool bDone = false; + if ( mpWindowImpl->mpParent && !ImplIsOverlapWindow() ) + bDone = mpWindowImpl->mpParent->PreNotify( rNEvt ); + + if ( !bDone ) + { + if( rNEvt.GetType() == EVENT_GETFOCUS ) + { + bool bCompoundFocusChanged = false; + if ( mpWindowImpl->mbCompoundControl && !mpWindowImpl->mbCompoundControlHasFocus && HasChildPathFocus() ) + { + mpWindowImpl->mbCompoundControlHasFocus = true; + bCompoundFocusChanged = true; + } + + if ( bCompoundFocusChanged || ( rNEvt.GetWindow() == this ) ) + ImplCallEventListeners( VCLEVENT_WINDOW_GETFOCUS ); + } + else if( rNEvt.GetType() == EVENT_LOSEFOCUS ) + { + bool bCompoundFocusChanged = false; + if ( mpWindowImpl->mbCompoundControl && mpWindowImpl->mbCompoundControlHasFocus && !HasChildPathFocus() ) + { + mpWindowImpl->mbCompoundControlHasFocus = false ; + bCompoundFocusChanged = true; + } + + if ( bCompoundFocusChanged || ( rNEvt.GetWindow() == this ) ) + ImplCallEventListeners( VCLEVENT_WINDOW_LOSEFOCUS ); + } + + // #82968# mouse and key events will be notified after processing ( in ImplNotifyKeyMouseCommandEventListeners() )! + // see also ImplHandleMouseEvent(), ImplHandleKey() + + } + + return bDone; +} + +bool Window::Notify( NotifyEvent& rNEvt ) +{ + bool nRet = false; + + // check for docking window + // but do nothing if window is docked and locked + ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this ); + if( pWrapper && !( !pWrapper->IsFloatingMode() && pWrapper->IsLocked() ) ) + { + if ( rNEvt.GetType() == EVENT_MOUSEBUTTONDOWN ) + { + const MouseEvent* pMEvt = rNEvt.GetMouseEvent(); + bool bHit = pWrapper->GetDragArea().IsInside( pMEvt->GetPosPixel() ); + if ( pMEvt->IsLeft() ) + { + if ( pMEvt->IsMod1() && (pMEvt->GetClicks() == 2) ) + { + // ctrl double click toggles floating mode + pWrapper->SetFloatingMode( !pWrapper->IsFloatingMode() ); + return true; + } + else if ( pMEvt->GetClicks() == 1 && bHit) + { + // allow start docking during mouse move + pWrapper->ImplEnableStartDocking(); + return true; + } + } + } + else if ( rNEvt.GetType() == EVENT_MOUSEMOVE ) + { + const MouseEvent* pMEvt = rNEvt.GetMouseEvent(); + bool bHit = pWrapper->GetDragArea().IsInside( pMEvt->GetPosPixel() ); + if ( pMEvt->IsLeft() ) + { + // check if a single click initiated this sequence ( ImplStartDockingEnabled() ) + // check if window is docked and + if( pWrapper->ImplStartDockingEnabled() && !pWrapper->IsFloatingMode() && + !pWrapper->IsDocking() && bHit ) + { + Point aPos = pMEvt->GetPosPixel(); + Window* pWindow = rNEvt.GetWindow(); + if ( pWindow != this ) + { + aPos = pWindow->OutputToScreenPixel( aPos ); + aPos = ScreenToOutputPixel( aPos ); + } + pWrapper->ImplStartDocking( aPos ); + } + return true; + } + } + else if( rNEvt.GetType() == EVENT_KEYINPUT ) + { + const KeyCode& rKey = rNEvt.GetKeyEvent()->GetKeyCode(); + if( rKey.GetCode() == KEY_F10 && rKey.GetModifier() && + rKey.IsShift() && rKey.IsMod1() ) + { + pWrapper->SetFloatingMode( !pWrapper->IsFloatingMode() ); + /* At this point the floating toolbar frame does not have the + * input focus since these frames don't get the focus per default + * To enable keyboard handling of this toolbar set the input focus + * to the frame. This needs to be done with ToTop since GrabFocus + * would not notice any change since "this" already has the focus. + */ + if( pWrapper->IsFloatingMode() ) + ToTop( TOTOP_GRABFOCUSONLY ); + return true; + } + } + } + + // manage the dialogs + if ( (GetStyle() & (WB_DIALOGCONTROL | WB_NODIALOGCONTROL)) == WB_DIALOGCONTROL ) + { + // if the parent also has dialog control activated, the parent takes over control + if ( (rNEvt.GetType() == EVENT_KEYINPUT) || (rNEvt.GetType() == EVENT_KEYUP) ) + { + if ( ImplIsOverlapWindow() || + ((getNonLayoutRealParent(this)->GetStyle() & (WB_DIALOGCONTROL | WB_NODIALOGCONTROL)) != WB_DIALOGCONTROL) ) + { + nRet = ImplDlgCtrl( *rNEvt.GetKeyEvent(), rNEvt.GetType() == EVENT_KEYINPUT ); + } + } + else if ( (rNEvt.GetType() == EVENT_GETFOCUS) || (rNEvt.GetType() == EVENT_LOSEFOCUS) ) + { + ImplDlgCtrlFocusChanged( rNEvt.GetWindow(), rNEvt.GetType() == EVENT_GETFOCUS ); + if ( (rNEvt.GetWindow() == this) && (rNEvt.GetType() == EVENT_GETFOCUS) && + !(GetStyle() & WB_TABSTOP) && !(mpWindowImpl->mnDlgCtrlFlags & WINDOW_DLGCTRL_WANTFOCUS) ) + { + sal_uInt16 n = 0; + Window* pFirstChild = ImplGetDlgWindow( n, DLGWINDOW_FIRST ); + if ( pFirstChild ) + pFirstChild->ImplControlFocus(); + } + } + } + + if ( !nRet ) + { + if ( mpWindowImpl->mpParent && !ImplIsOverlapWindow() ) + nRet = mpWindowImpl->mpParent->Notify( rNEvt ); + } + + return nRet; +} + +void Window::ImplCallEventListeners( sal_uLong nEvent, void* pData ) +{ + // The implementation was moved to CallEventListeners(), + // because derived classes in svtools must be able to + // call the event listeners and ImplCallEventListeners() + // is not exported. + // TODO: replace ImplCallEventListeners() by CallEventListeners() in vcl + + CallEventListeners( nEvent, pData ); +} + +void Window::CallEventListeners( sal_uLong nEvent, void* pData ) +{ + VclWindowEvent aEvent( this, nEvent, pData ); + + ImplDelData aDelData; + ImplAddDel( &aDelData ); + + ImplGetSVData()->mpApp->ImplCallEventListeners( &aEvent ); + + if ( aDelData.IsDead() ) + return; + + mpWindowImpl->maEventListeners.Call( &aEvent ); + + if ( aDelData.IsDead() ) + return; + + ImplRemoveDel( &aDelData ); + + Window* pWindow = this; + while ( pWindow ) + { + pWindow->ImplAddDel( &aDelData ); + + pWindow->mpWindowImpl->maChildEventListeners.Call( &aEvent ); + + if ( aDelData.IsDead() ) + return; + + pWindow->ImplRemoveDel( &aDelData ); + + pWindow = pWindow->GetParent(); + } +} + +void Window::FireVclEvent( VclSimpleEvent* pEvent ) +{ + ImplGetSVData()->mpApp->ImplCallEventListeners(pEvent); +} + +void Window::AddEventListener( const Link& rEventListener ) +{ + mpWindowImpl->maEventListeners.addListener( rEventListener ); +} + +void Window::RemoveEventListener( const Link& rEventListener ) +{ + mpWindowImpl->maEventListeners.removeListener( rEventListener ); +} + +void Window::AddChildEventListener( const Link& rEventListener ) +{ + mpWindowImpl->maChildEventListeners.addListener( rEventListener ); +} + +void Window::RemoveChildEventListener( const Link& rEventListener ) +{ + mpWindowImpl->maChildEventListeners.removeListener( rEventListener ); +} + +ImplSVEvent * Window::PostUserEvent( const Link& rLink, void* pCaller ) +{ + ImplSVEvent* pSVEvent = new ImplSVEvent; + pSVEvent->mpData = pCaller; + pSVEvent->mpLink = new Link( rLink ); + pSVEvent->mpWindow = this; + pSVEvent->mbCall = true; + ImplAddDel( &(pSVEvent->maDelData) ); + if ( !mpWindowImpl->mpFrame->PostEvent( pSVEvent ) ) + { + ImplRemoveDel( &(pSVEvent->maDelData) ); + delete pSVEvent->mpLink; + delete pSVEvent; + pSVEvent = 0; + } + return pSVEvent; +} + +void Window::RemoveUserEvent( ImplSVEvent * nUserEvent ) +{ + DBG_ASSERT( nUserEvent->mpWindow == this, + "Window::RemoveUserEvent(): Event doesn't send to this window or is already removed" ); + DBG_ASSERT( nUserEvent->mbCall, + "Window::RemoveUserEvent(): Event is already removed" ); + + if ( nUserEvent->mpWindow ) + { + nUserEvent->mpWindow->ImplRemoveDel( &(nUserEvent->maDelData) ); + nUserEvent->mpWindow = NULL; + } + + nUserEvent->mbCall = false; +} + + +MouseEvent ImplTranslateMouseEvent( const MouseEvent& rE, Window* pSource, Window* pDest ) +{ + Point aPos = pSource->OutputToScreenPixel( rE.GetPosPixel() ); + aPos = pDest->ScreenToOutputPixel( aPos ); + return MouseEvent( aPos, rE.GetClicks(), rE.GetMode(), rE.GetButtons(), rE.GetModifier() ); +} + +CommandEvent ImplTranslateCommandEvent( const CommandEvent& rCEvt, Window* pSource, Window* pDest ) +{ + if ( !rCEvt.IsMouseEvent() ) + return rCEvt; + + Point aPos = pSource->OutputToScreenPixel( rCEvt.GetMousePosPixel() ); + aPos = pDest->ScreenToOutputPixel( aPos ); + return CommandEvent( aPos, rCEvt.GetCommand(), rCEvt.IsMouseEvent(), rCEvt.GetData() ); +} + +void Window::ImplNotifyKeyMouseCommandEventListeners( NotifyEvent& rNEvt ) +{ + if( rNEvt.GetType() == EVENT_COMMAND ) + { + const CommandEvent* pCEvt = rNEvt.GetCommandEvent(); + if ( pCEvt->GetCommand() != COMMAND_CONTEXTMENU ) + // non context menu events are not to be notified up the chain + // so we return immediately + return; + + if ( mpWindowImpl->mbCompoundControl || ( rNEvt.GetWindow() == this ) ) + { + if ( rNEvt.GetWindow() == this ) + // not interested in: The event listeners are already called in ::Command, + // and calling them here a second time doesn't make sense + ; + else + { + CommandEvent aCommandEvent = ImplTranslateCommandEvent( *pCEvt, rNEvt.GetWindow(), this ); + ImplCallEventListeners( VCLEVENT_WINDOW_COMMAND, &aCommandEvent ); + } + } + } + + // #82968# notify event listeners for mouse and key events separately and + // not in PreNotify ( as for focus listeners ) + // this allows for processing those events internally first and pass it to + // the toolkit later + + ImplDelData aDelData; + ImplAddDel( &aDelData ); + + if( rNEvt.GetType() == EVENT_MOUSEMOVE ) + { + if ( mpWindowImpl->mbCompoundControl || ( rNEvt.GetWindow() == this ) ) + { + if ( rNEvt.GetWindow() == this ) + ImplCallEventListeners( VCLEVENT_WINDOW_MOUSEMOVE, (void*)rNEvt.GetMouseEvent() ); + else + { + MouseEvent aMouseEvent = ImplTranslateMouseEvent( *rNEvt.GetMouseEvent(), rNEvt.GetWindow(), this ); + ImplCallEventListeners( VCLEVENT_WINDOW_MOUSEMOVE, &aMouseEvent ); + } + } + } + else if( rNEvt.GetType() == EVENT_MOUSEBUTTONUP ) + { + if ( mpWindowImpl->mbCompoundControl || ( rNEvt.GetWindow() == this ) ) + { + if ( rNEvt.GetWindow() == this ) + ImplCallEventListeners( VCLEVENT_WINDOW_MOUSEBUTTONUP, (void*)rNEvt.GetMouseEvent() ); + else + { + MouseEvent aMouseEvent = ImplTranslateMouseEvent( *rNEvt.GetMouseEvent(), rNEvt.GetWindow(), this ); + ImplCallEventListeners( VCLEVENT_WINDOW_MOUSEBUTTONUP, &aMouseEvent ); + } + } + } + else if( rNEvt.GetType() == EVENT_MOUSEBUTTONDOWN ) + { + if ( mpWindowImpl->mbCompoundControl || ( rNEvt.GetWindow() == this ) ) + { + if ( rNEvt.GetWindow() == this ) + ImplCallEventListeners( VCLEVENT_WINDOW_MOUSEBUTTONDOWN, (void*)rNEvt.GetMouseEvent() ); + else + { + MouseEvent aMouseEvent = ImplTranslateMouseEvent( *rNEvt.GetMouseEvent(), rNEvt.GetWindow(), this ); + ImplCallEventListeners( VCLEVENT_WINDOW_MOUSEBUTTONDOWN, &aMouseEvent ); + } + } + } + else if( rNEvt.GetType() == EVENT_KEYINPUT ) + { + if ( mpWindowImpl->mbCompoundControl || ( rNEvt.GetWindow() == this ) ) + ImplCallEventListeners( VCLEVENT_WINDOW_KEYINPUT, (void*)rNEvt.GetKeyEvent() ); + } + else if( rNEvt.GetType() == EVENT_KEYUP ) + { + if ( mpWindowImpl->mbCompoundControl || ( rNEvt.GetWindow() == this ) ) + ImplCallEventListeners( VCLEVENT_WINDOW_KEYUP, (void*)rNEvt.GetKeyEvent() ); + } + + if ( aDelData.IsDead() ) + return; + ImplRemoveDel( &aDelData ); + + // #106721# check if we're part of a compound control and notify + Window *pParent = ImplGetParent(); + while( pParent ) + { + if( pParent->IsCompoundControl() ) + { + pParent->ImplNotifyKeyMouseCommandEventListeners( rNEvt ); + break; + } + pParent = pParent->ImplGetParent(); + } +} + +void Window::ImplCallInitShow() +{ + mpWindowImpl->mbReallyShown = true; + mpWindowImpl->mbInInitShow = true; + StateChanged( STATE_CHANGE_INITSHOW ); + mpWindowImpl->mbInInitShow = false; + + Window* pWindow = mpWindowImpl->mpFirstOverlap; + while ( pWindow ) + { + if ( pWindow->mpWindowImpl->mbVisible ) + pWindow->ImplCallInitShow(); + pWindow = pWindow->mpWindowImpl->mpNext; + } + + pWindow = mpWindowImpl->mpFirstChild; + while ( pWindow ) + { + if ( pWindow->mpWindowImpl->mbVisible ) + pWindow->ImplCallInitShow(); + pWindow = pWindow->mpWindowImpl->mpNext; + } +} + + +void Window::ImplCallResize() +{ + mpWindowImpl->mbCallResize = false; + + if( GetBackground().IsGradient() ) + Invalidate(); + + Resize(); + + // #88419# Most classes don't call the base class in Resize() and Move(), + // => Call ImpleResize/Move instead of Resize/Move directly... + ImplCallEventListeners( VCLEVENT_WINDOW_RESIZE ); +} + +void Window::ImplCallMove() +{ + mpWindowImpl->mbCallMove = false; + + if( mpWindowImpl->mbFrame ) + { + // update frame position + SalFrame *pParentFrame = NULL; + Window *pParent = ImplGetParent(); + while( pParent ) + { + if( pParent->mpWindowImpl->mpFrame != mpWindowImpl->mpFrame ) + { + pParentFrame = pParent->mpWindowImpl->mpFrame; + break; + } + pParent = pParent->GetParent(); + } + + SalFrameGeometry g = mpWindowImpl->mpFrame->GetGeometry(); + mpWindowImpl->maPos = Point( g.nX, g.nY ); + if( pParentFrame ) + { + g = pParentFrame->GetGeometry(); + mpWindowImpl->maPos -= Point( g.nX, g.nY ); + } + // the client window and and all its subclients have the same position as the borderframe + // this is important for floating toolbars where the borderwindow is a floating window + // which has another borderwindow (ie the system floating window) + Window *pClientWin = mpWindowImpl->mpClientWindow; + while( pClientWin ) + { + pClientWin->mpWindowImpl->maPos = mpWindowImpl->maPos; + pClientWin = pClientWin->mpWindowImpl->mpClientWindow; + } + } + + Move(); + + ImplCallEventListeners( VCLEVENT_WINDOW_MOVE ); +} + +void Window::ImplCallFocusChangeActivate( Window* pNewOverlapWindow, + Window* pOldOverlapWindow ) +{ + ImplSVData* pSVData = ImplGetSVData(); + Window* pNewRealWindow; + Window* pOldRealWindow; + bool bCallActivate = true; + bool bCallDeactivate = true; + + pOldRealWindow = pOldOverlapWindow->ImplGetWindow(); + pNewRealWindow = pNewOverlapWindow->ImplGetWindow(); + if ( (pOldRealWindow->GetType() != WINDOW_FLOATINGWINDOW) || + pOldRealWindow->GetActivateMode() ) + { + if ( (pNewRealWindow->GetType() == WINDOW_FLOATINGWINDOW) && + !pNewRealWindow->GetActivateMode() ) + { + pSVData->maWinData.mpLastDeacWin = pOldOverlapWindow; + bCallDeactivate = false; + } + } + else if ( (pNewRealWindow->GetType() != WINDOW_FLOATINGWINDOW) || + pNewRealWindow->GetActivateMode() ) + { + if ( pSVData->maWinData.mpLastDeacWin ) + { + if ( pSVData->maWinData.mpLastDeacWin == pNewOverlapWindow ) + bCallActivate = false; + else + { + Window* pLastRealWindow = pSVData->maWinData.mpLastDeacWin->ImplGetWindow(); + pSVData->maWinData.mpLastDeacWin->mpWindowImpl->mbActive = false; + pSVData->maWinData.mpLastDeacWin->Deactivate(); + if ( pLastRealWindow != pSVData->maWinData.mpLastDeacWin ) + { + pLastRealWindow->mpWindowImpl->mbActive = true; + pLastRealWindow->Activate(); + } + } + pSVData->maWinData.mpLastDeacWin = NULL; + } + } + + if ( bCallDeactivate ) + { + if( pOldOverlapWindow->mpWindowImpl->mbActive ) + { + pOldOverlapWindow->mpWindowImpl->mbActive = false; + pOldOverlapWindow->Deactivate(); + } + if ( pOldRealWindow != pOldOverlapWindow ) + { + if( pOldRealWindow->mpWindowImpl->mbActive ) + { + pOldRealWindow->mpWindowImpl->mbActive = false; + pOldRealWindow->Deactivate(); + } + } + } + if ( bCallActivate && ! pNewOverlapWindow->mpWindowImpl->mbActive ) + { + if( ! pNewOverlapWindow->mpWindowImpl->mbActive ) + { + pNewOverlapWindow->mpWindowImpl->mbActive = true; + pNewOverlapWindow->Activate(); + } + if ( pNewRealWindow != pNewOverlapWindow ) + { + if( ! pNewRealWindow->mpWindowImpl->mbActive ) + { + pNewRealWindow->mpWindowImpl->mbActive = true; + pNewRealWindow->Activate(); + } + } + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/window/mouseevent.cxx b/vcl/source/window/mouseevent.cxx index b23b9c037b68..3fb692d16f71 100644 --- a/vcl/source/window/mouseevent.cxx +++ b/vcl/source/window/mouseevent.cxx @@ -17,10 +17,11 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ +#include <vcl/event.hxx> + #include <com/sun/star/awt/MouseEvent.hpp> #include <com/sun/star/awt/KeyModifier.hpp> #include <com/sun/star/awt/MouseButton.hpp> -#include <vcl/event.hxx> /** inits this vcl KeyEvent with all settings from the given awt event **/ MouseEvent::MouseEvent( const ::com::sun::star::awt::MouseEvent& rEvent ) diff --git a/vcl/source/window/settings.cxx b/vcl/source/window/settings.cxx new file mode 100644 index 000000000000..66935d787063 --- /dev/null +++ b/vcl/source/window/settings.cxx @@ -0,0 +1,388 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <i18nlangtag/mslangid.hxx> + +#include <vcl/event.hxx> +#include <vcl/svapp.hxx> +#include <vcl/window.hxx> +#include <vcl/virdev.hxx> +#include <vcl/settings.hxx> + +#include <unotools/fontcfg.hxx> +#include <unotools/confignode.hxx> + +#include <comphelper/processfactory.hxx> + +#include <salframe.hxx> +#include <svdata.hxx> +#include <brdwin.hxx> +#include <PhysicalFontCollection.hxx> + +#include <window.h> + +void Window::SetSettings( const AllSettings& rSettings ) +{ + SetSettings( rSettings, false ); +} + +void Window::SetSettings( const AllSettings& rSettings, bool bChild ) +{ + + if ( mpWindowImpl->mpBorderWindow ) + { + mpWindowImpl->mpBorderWindow->SetSettings( rSettings, false ); + if ( (mpWindowImpl->mpBorderWindow->GetType() == WINDOW_BORDERWINDOW) && + ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->mpMenuBarWindow ) + ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->mpMenuBarWindow->SetSettings( rSettings, true ); + } + + AllSettings aOldSettings(*mxSettings); + OutputDevice::SetSettings( rSettings ); + sal_uLong nChangeFlags = aOldSettings.GetChangeFlags( rSettings ); + + // recalculate AppFont-resolution and DPI-resolution + ImplInitResolutionSettings(); + + if ( nChangeFlags ) + { + DataChangedEvent aDCEvt( DATACHANGED_SETTINGS, &aOldSettings, nChangeFlags ); + DataChanged( aDCEvt ); + } + + if ( bChild || mpWindowImpl->mbChildNotify ) + { + Window* pChild = mpWindowImpl->mpFirstChild; + while ( pChild ) + { + pChild->SetSettings( rSettings, bChild ); + pChild = pChild->mpWindowImpl->mpNext; + } + } +} + +void Window::UpdateSettings( const AllSettings& rSettings, bool bChild ) +{ + + if ( mpWindowImpl->mpBorderWindow ) + { + mpWindowImpl->mpBorderWindow->UpdateSettings( rSettings, false ); + if ( (mpWindowImpl->mpBorderWindow->GetType() == WINDOW_BORDERWINDOW) && + ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->mpMenuBarWindow ) + ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->mpMenuBarWindow->UpdateSettings( rSettings, true ); + } + + AllSettings aOldSettings(*mxSettings); + sal_uLong nChangeFlags = mxSettings->Update( mxSettings->GetWindowUpdate(), rSettings ); + nChangeFlags |= SETTINGS_IN_UPDATE_SETTINGS; // Set this flag so the receiver of the data changed + // event can distinguish between the changing of global + // setting and a local change ( with SetSettings ) + + // recalculate AppFont-resolution and DPI-resolution + ImplInitResolutionSettings(); + + /* #i73785# + * do not overwrite a WheelBehavior with false + * this looks kind of a hack, but WheelBehavior + * is always a local change, not a system property, + * so we can spare all our users the hassle of reacting on + * this in their respective DataChanged. + */ + MouseSettings aSet( mxSettings->GetMouseSettings() ); + aSet.SetWheelBehavior( aOldSettings.GetMouseSettings().GetWheelBehavior() ); + mxSettings->SetMouseSettings( aSet ); + + if( (nChangeFlags & SETTINGS_STYLE) && IsBackground() ) + { + Wallpaper aWallpaper = GetBackground(); + if( !aWallpaper.IsBitmap() && !aWallpaper.IsGradient() ) + { + if ( mpWindowImpl->mnStyle & WB_3DLOOK ) + { + if (aOldSettings.GetStyleSettings().GetFaceColor() != rSettings.GetStyleSettings().GetFaceColor()) + SetBackground( Wallpaper( rSettings.GetStyleSettings().GetFaceColor() ) ); + } + else + { + if (aOldSettings.GetStyleSettings().GetWindowColor() != rSettings.GetStyleSettings().GetWindowColor()) + SetBackground( Wallpaper( rSettings.GetStyleSettings().GetWindowColor() ) ); + } + } + } + + if ( nChangeFlags ) + { + DataChangedEvent aDCEvt( DATACHANGED_SETTINGS, &aOldSettings, nChangeFlags ); + DataChanged( aDCEvt ); + // notify data change handler + ImplCallEventListeners( VCLEVENT_WINDOW_DATACHANGED, &aDCEvt); + } + + if ( bChild || mpWindowImpl->mbChildNotify ) + { + Window* pChild = mpWindowImpl->mpFirstChild; + while ( pChild ) + { + pChild->UpdateSettings( rSettings, bChild ); + pChild = pChild->mpWindowImpl->mpNext; + } + } +} + +void Window::ImplUpdateGlobalSettings( AllSettings& rSettings, bool bCallHdl ) +{ + StyleSettings aTmpSt( rSettings.GetStyleSettings() ); + aTmpSt.SetHighContrastMode( false ); + rSettings.SetStyleSettings( aTmpSt ); + ImplGetFrame()->UpdateSettings( rSettings ); + // reset default border width for layouters + ImplGetSVData()->maAppData.mnDefaultLayoutBorder = -1; + + // Verify availability of the configured UI font, otherwise choose "Andale Sans UI" + + // WTF, what makes Andale Sans UI a suitable cross-platform fallback font? + + OUString aUserInterfaceFont; + bool bUseSystemFont = rSettings.GetStyleSettings().GetUseSystemUIFonts(); + + // check whether system UI font can display a typical UI text + if( bUseSystemFont ) + bUseSystemFont = ImplCheckUIFont( rSettings.GetStyleSettings().GetAppFont() ); + + if ( !bUseSystemFont ) + { + OutputDevice *pOutDev = GetOutDev(); + pOutDev->ImplInitFontList(); + OUString aConfigFont = utl::DefaultFontConfiguration::get().getUserInterfaceFont( rSettings.GetUILanguageTag() ); + sal_Int32 nIndex = 0; + while( nIndex != -1 ) + { + OUString aName( aConfigFont.getToken( 0, ';', nIndex ) ); + if ( !aName.isEmpty() && mpWindowImpl->mpFrameData->mpFontCollection->FindFontFamily( aName ) ) + { + aUserInterfaceFont = aConfigFont; + break; + } + } + + if ( aUserInterfaceFont.isEmpty() ) + { + OUString aFallbackFont ("Andale Sans UI" ); + if ( mpWindowImpl->mpFrameData->mpFontCollection->FindFontFamily( aFallbackFont ) ) + aUserInterfaceFont = aFallbackFont; + } + } + + if ( !bUseSystemFont && !aUserInterfaceFont.isEmpty() ) + { + StyleSettings aStyleSettings = rSettings.GetStyleSettings(); + Font aFont = aStyleSettings.GetAppFont(); + aFont.SetName( aUserInterfaceFont ); + aStyleSettings.SetAppFont( aFont ); + aFont = aStyleSettings.GetHelpFont(); + aFont.SetName( aUserInterfaceFont ); + aStyleSettings.SetHelpFont( aFont ); + aFont = aStyleSettings.GetTitleFont(); + aFont.SetName( aUserInterfaceFont ); + aStyleSettings.SetTitleFont( aFont ); + aFont = aStyleSettings.GetFloatTitleFont(); + aFont.SetName( aUserInterfaceFont ); + aStyleSettings.SetFloatTitleFont( aFont ); + aFont = aStyleSettings.GetMenuFont(); + aFont.SetName( aUserInterfaceFont ); + aStyleSettings.SetMenuFont( aFont ); + aFont = aStyleSettings.GetToolFont(); + aFont.SetName( aUserInterfaceFont ); + aStyleSettings.SetToolFont( aFont ); + aFont = aStyleSettings.GetLabelFont(); + aFont.SetName( aUserInterfaceFont ); + aStyleSettings.SetLabelFont( aFont ); + aFont = aStyleSettings.GetInfoFont(); + aFont.SetName( aUserInterfaceFont ); + aStyleSettings.SetInfoFont( aFont ); + aFont = aStyleSettings.GetRadioCheckFont(); + aFont.SetName( aUserInterfaceFont ); + aStyleSettings.SetRadioCheckFont( aFont ); + aFont = aStyleSettings.GetPushButtonFont(); + aFont.SetName( aUserInterfaceFont ); + aStyleSettings.SetPushButtonFont( aFont ); + aFont = aStyleSettings.GetFieldFont(); + aFont.SetName( aUserInterfaceFont ); + aStyleSettings.SetFieldFont( aFont ); + aFont = aStyleSettings.GetIconFont(); + aFont.SetName( aUserInterfaceFont ); + aStyleSettings.SetIconFont( aFont ); + aFont = aStyleSettings.GetGroupFont(); + aFont.SetName( aUserInterfaceFont ); + aStyleSettings.SetGroupFont( aFont ); + rSettings.SetStyleSettings( aStyleSettings ); + } + + StyleSettings aStyleSettings = rSettings.GetStyleSettings(); + // #97047: Force all fonts except Menu and Help to a fixed height + // to avoid UI scaling due to large fonts + // - but allow bigger fonts on bigger screens (i16682, i21238) + // dialogs were designed to fit 800x600 with an 8pt font, so scale accordingly + int maxFontheight = 9; // #107886#: 9 is default for some asian systems, so always allow if requested + if( GetDesktopRectPixel().getHeight() > 600 ) + maxFontheight = (int) ((( 8.0 * (double) GetDesktopRectPixel().getHeight()) / 600.0) + 1.5); + + Font aFont = aStyleSettings.GetMenuFont(); + int defFontheight = aFont.GetHeight(); + if( defFontheight > maxFontheight ) + defFontheight = maxFontheight; + + // if the UI is korean, chinese or another locale + // where the system font size is kown to be often too small to + // generate readable fonts enforce a minimum font size of 9 points + bool bBrokenLangFontHeight = MsLangId::isCJK(Application::GetSettings().GetUILanguageTag().getLanguageType()); + if (bBrokenLangFontHeight) + defFontheight = std::max(9, defFontheight); + + // i22098, toolfont will be scaled differently to avoid bloated rulers and status bars for big fonts + int toolfontheight = defFontheight; + if( toolfontheight > 9 ) + toolfontheight = (defFontheight+8) / 2; + + aFont = aStyleSettings.GetAppFont(); + aFont.SetHeight( defFontheight ); + aStyleSettings.SetAppFont( aFont ); + aFont = aStyleSettings.GetTitleFont(); + aFont.SetHeight( defFontheight ); + aStyleSettings.SetTitleFont( aFont ); + aFont = aStyleSettings.GetFloatTitleFont(); + aFont.SetHeight( defFontheight ); + aStyleSettings.SetFloatTitleFont( aFont ); + // keep menu and help font size from system unless in broken locale size + if( bBrokenLangFontHeight ) + { + aFont = aStyleSettings.GetMenuFont(); + if( aFont.GetHeight() < defFontheight ) + { + aFont.SetHeight( defFontheight ); + aStyleSettings.SetMenuFont( aFont ); + } + aFont = aStyleSettings.GetHelpFont(); + if( aFont.GetHeight() < defFontheight ) + { + aFont.SetHeight( defFontheight ); + aStyleSettings.SetHelpFont( aFont ); + } + } + + // use different height for toolfont + aFont = aStyleSettings.GetToolFont(); + aFont.SetHeight( toolfontheight ); + aStyleSettings.SetToolFont( aFont ); + + aFont = aStyleSettings.GetLabelFont(); + aFont.SetHeight( defFontheight ); + aStyleSettings.SetLabelFont( aFont ); + aFont = aStyleSettings.GetInfoFont(); + aFont.SetHeight( defFontheight ); + aStyleSettings.SetInfoFont( aFont ); + aFont = aStyleSettings.GetRadioCheckFont(); + aFont.SetHeight( defFontheight ); + aStyleSettings.SetRadioCheckFont( aFont ); + aFont = aStyleSettings.GetPushButtonFont(); + aFont.SetHeight( defFontheight ); + aStyleSettings.SetPushButtonFont( aFont ); + aFont = aStyleSettings.GetFieldFont(); + aFont.SetHeight( defFontheight ); + aStyleSettings.SetFieldFont( aFont ); + aFont = aStyleSettings.GetIconFont(); + aFont.SetHeight( defFontheight ); + aStyleSettings.SetIconFont( aFont ); + aFont = aStyleSettings.GetGroupFont(); + aFont.SetHeight( defFontheight ); + aStyleSettings.SetGroupFont( aFont ); + + rSettings.SetStyleSettings( aStyleSettings ); + + bool bForceHCMode = false; + + // auto detect HC mode; if the system already set it to "yes" + // (see above) then accept that + if( !rSettings.GetStyleSettings().GetHighContrastMode() ) + { + bool bTmp = false, bAutoHCMode = true; + utl::OConfigurationNode aNode = utl::OConfigurationTreeRoot::tryCreateWithComponentContext( + comphelper::getProcessComponentContext(), + OUString("org.openoffice.Office.Common/Accessibility") ); // note: case sensitive ! + if ( aNode.isValid() ) + { + ::com::sun::star::uno::Any aValue = aNode.getNodeValue( OUString("AutoDetectSystemHC") ); + if( aValue >>= bTmp ) + bAutoHCMode = bTmp; + } + if( bAutoHCMode ) + { + if( rSettings.GetStyleSettings().GetFaceColor().IsDark() || + rSettings.GetStyleSettings().GetWindowColor().IsDark() ) + bForceHCMode = true; + } + } + + static const char* pEnvHC = getenv( "SAL_FORCE_HC" ); + if( pEnvHC && *pEnvHC ) + bForceHCMode = true; + + if( bForceHCMode ) + { + aStyleSettings = rSettings.GetStyleSettings(); + aStyleSettings.SetHighContrastMode( true ); + rSettings.SetStyleSettings( aStyleSettings ); + } + +#if defined(DBG_UTIL) + // If needed, set AppFont to bold, in order to check + // if there is enough space available for texts on other systems + if ( DbgIsBoldAppFont() ) + { + aStyleSettings = rSettings.GetStyleSettings(); + aFont = aStyleSettings.GetAppFont(); + aFont.SetWeight( WEIGHT_BOLD ); + aStyleSettings.SetAppFont( aFont ); + aFont = aStyleSettings.GetGroupFont(); + aFont.SetWeight( WEIGHT_BOLD ); + aStyleSettings.SetGroupFont( aFont ); + aFont = aStyleSettings.GetLabelFont(); + aFont.SetWeight( WEIGHT_BOLD ); + aStyleSettings.SetLabelFont( aFont ); + aFont = aStyleSettings.GetRadioCheckFont(); + aFont.SetWeight( WEIGHT_BOLD ); + aStyleSettings.SetRadioCheckFont( aFont ); + aFont = aStyleSettings.GetPushButtonFont(); + aFont.SetWeight( WEIGHT_BOLD ); + aStyleSettings.SetPushButtonFont( aFont ); + aFont = aStyleSettings.GetFieldFont(); + aFont.SetWeight( WEIGHT_BOLD ); + aStyleSettings.SetFieldFont( aFont ); + aFont = aStyleSettings.GetIconFont(); + aFont.SetWeight( WEIGHT_BOLD ); + aStyleSettings.SetIconFont( aFont ); + rSettings.SetStyleSettings( aStyleSettings ); + } +#endif + + if ( bCallHdl ) + GetpApp()->OverrideSystemSettings( rSettings ); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx index 849bce6ada01..a2d2736a7ff7 100644 --- a/vcl/source/window/window.cxx +++ b/vcl/source/window/window.cxx @@ -508,263 +508,6 @@ bool Window::ImplCheckUIFont( const Font& rFont ) return bUIFontOk; } -void Window::ImplUpdateGlobalSettings( AllSettings& rSettings, bool bCallHdl ) -{ - StyleSettings aTmpSt( rSettings.GetStyleSettings() ); - aTmpSt.SetHighContrastMode( false ); - rSettings.SetStyleSettings( aTmpSt ); - ImplGetFrame()->UpdateSettings( rSettings ); - // reset default border width for layouters - ImplGetSVData()->maAppData.mnDefaultLayoutBorder = -1; - - // Verify availability of the configured UI font, otherwise choose "Andale Sans UI" - - // WTF, what makes Andale Sans UI a suitable cross-platform fallback font? - - OUString aUserInterfaceFont; - bool bUseSystemFont = rSettings.GetStyleSettings().GetUseSystemUIFonts(); - - // check whether system UI font can display a typical UI text - if( bUseSystemFont ) - bUseSystemFont = ImplCheckUIFont( rSettings.GetStyleSettings().GetAppFont() ); - - if ( !bUseSystemFont ) - { - OutputDevice *pOutDev = GetOutDev(); - pOutDev->ImplInitFontList(); - OUString aConfigFont = utl::DefaultFontConfiguration::get().getUserInterfaceFont( rSettings.GetUILanguageTag() ); - sal_Int32 nIndex = 0; - while( nIndex != -1 ) - { - OUString aName( aConfigFont.getToken( 0, ';', nIndex ) ); - if ( !aName.isEmpty() && mpWindowImpl->mpFrameData->mpFontCollection->FindFontFamily( aName ) ) - { - aUserInterfaceFont = aConfigFont; - break; - } - } - - if ( aUserInterfaceFont.isEmpty() ) - { - OUString aFallbackFont ("Andale Sans UI" ); - if ( mpWindowImpl->mpFrameData->mpFontCollection->FindFontFamily( aFallbackFont ) ) - aUserInterfaceFont = aFallbackFont; - } - } - - if ( !bUseSystemFont && !aUserInterfaceFont.isEmpty() ) - { - StyleSettings aStyleSettings = rSettings.GetStyleSettings(); - Font aFont = aStyleSettings.GetAppFont(); - aFont.SetName( aUserInterfaceFont ); - aStyleSettings.SetAppFont( aFont ); - aFont = aStyleSettings.GetHelpFont(); - aFont.SetName( aUserInterfaceFont ); - aStyleSettings.SetHelpFont( aFont ); - aFont = aStyleSettings.GetTitleFont(); - aFont.SetName( aUserInterfaceFont ); - aStyleSettings.SetTitleFont( aFont ); - aFont = aStyleSettings.GetFloatTitleFont(); - aFont.SetName( aUserInterfaceFont ); - aStyleSettings.SetFloatTitleFont( aFont ); - aFont = aStyleSettings.GetMenuFont(); - aFont.SetName( aUserInterfaceFont ); - aStyleSettings.SetMenuFont( aFont ); - aFont = aStyleSettings.GetToolFont(); - aFont.SetName( aUserInterfaceFont ); - aStyleSettings.SetToolFont( aFont ); - aFont = aStyleSettings.GetLabelFont(); - aFont.SetName( aUserInterfaceFont ); - aStyleSettings.SetLabelFont( aFont ); - aFont = aStyleSettings.GetInfoFont(); - aFont.SetName( aUserInterfaceFont ); - aStyleSettings.SetInfoFont( aFont ); - aFont = aStyleSettings.GetRadioCheckFont(); - aFont.SetName( aUserInterfaceFont ); - aStyleSettings.SetRadioCheckFont( aFont ); - aFont = aStyleSettings.GetPushButtonFont(); - aFont.SetName( aUserInterfaceFont ); - aStyleSettings.SetPushButtonFont( aFont ); - aFont = aStyleSettings.GetFieldFont(); - aFont.SetName( aUserInterfaceFont ); - aStyleSettings.SetFieldFont( aFont ); - aFont = aStyleSettings.GetIconFont(); - aFont.SetName( aUserInterfaceFont ); - aStyleSettings.SetIconFont( aFont ); - aFont = aStyleSettings.GetGroupFont(); - aFont.SetName( aUserInterfaceFont ); - aStyleSettings.SetGroupFont( aFont ); - rSettings.SetStyleSettings( aStyleSettings ); - } - - StyleSettings aStyleSettings = rSettings.GetStyleSettings(); - // #97047: Force all fonts except Menu and Help to a fixed height - // to avoid UI scaling due to large fonts - // - but allow bigger fonts on bigger screens (i16682, i21238) - // dialogs were designed to fit 800x600 with an 8pt font, so scale accordingly - int maxFontheight = 9; // #107886#: 9 is default for some asian systems, so always allow if requested - if( GetDesktopRectPixel().getHeight() > 600 ) - maxFontheight = (int) ((( 8.0 * (double) GetDesktopRectPixel().getHeight()) / 600.0) + 1.5); - - Font aFont = aStyleSettings.GetMenuFont(); - int defFontheight = aFont.GetHeight(); - if( defFontheight > maxFontheight ) - defFontheight = maxFontheight; - - // if the UI is korean, chinese or another locale - // where the system font size is kown to be often too small to - // generate readable fonts enforce a minimum font size of 9 points - bool bBrokenLangFontHeight = MsLangId::isCJK(Application::GetSettings().GetUILanguageTag().getLanguageType()); - if (bBrokenLangFontHeight) - defFontheight = std::max(9, defFontheight); - - // i22098, toolfont will be scaled differently to avoid bloated rulers and status bars for big fonts - int toolfontheight = defFontheight; - if( toolfontheight > 9 ) - toolfontheight = (defFontheight+8) / 2; - - aFont = aStyleSettings.GetAppFont(); - aFont.SetHeight( defFontheight ); - aStyleSettings.SetAppFont( aFont ); - aFont = aStyleSettings.GetTitleFont(); - aFont.SetHeight( defFontheight ); - aStyleSettings.SetTitleFont( aFont ); - aFont = aStyleSettings.GetFloatTitleFont(); - aFont.SetHeight( defFontheight ); - aStyleSettings.SetFloatTitleFont( aFont ); - // keep menu and help font size from system unless in broken locale size - if( bBrokenLangFontHeight ) - { - aFont = aStyleSettings.GetMenuFont(); - if( aFont.GetHeight() < defFontheight ) - { - aFont.SetHeight( defFontheight ); - aStyleSettings.SetMenuFont( aFont ); - } - aFont = aStyleSettings.GetHelpFont(); - if( aFont.GetHeight() < defFontheight ) - { - aFont.SetHeight( defFontheight ); - aStyleSettings.SetHelpFont( aFont ); - } - } - - // use different height for toolfont - aFont = aStyleSettings.GetToolFont(); - aFont.SetHeight( toolfontheight ); - aStyleSettings.SetToolFont( aFont ); - - aFont = aStyleSettings.GetLabelFont(); - aFont.SetHeight( defFontheight ); - aStyleSettings.SetLabelFont( aFont ); - aFont = aStyleSettings.GetInfoFont(); - aFont.SetHeight( defFontheight ); - aStyleSettings.SetInfoFont( aFont ); - aFont = aStyleSettings.GetRadioCheckFont(); - aFont.SetHeight( defFontheight ); - aStyleSettings.SetRadioCheckFont( aFont ); - aFont = aStyleSettings.GetPushButtonFont(); - aFont.SetHeight( defFontheight ); - aStyleSettings.SetPushButtonFont( aFont ); - aFont = aStyleSettings.GetFieldFont(); - aFont.SetHeight( defFontheight ); - aStyleSettings.SetFieldFont( aFont ); - aFont = aStyleSettings.GetIconFont(); - aFont.SetHeight( defFontheight ); - aStyleSettings.SetIconFont( aFont ); - aFont = aStyleSettings.GetGroupFont(); - aFont.SetHeight( defFontheight ); - aStyleSettings.SetGroupFont( aFont ); - - rSettings.SetStyleSettings( aStyleSettings ); - - bool bForceHCMode = false; - - // auto detect HC mode; if the system already set it to "yes" - // (see above) then accept that - if( !rSettings.GetStyleSettings().GetHighContrastMode() ) - { - bool bTmp = false, bAutoHCMode = true; - utl::OConfigurationNode aNode = utl::OConfigurationTreeRoot::tryCreateWithComponentContext( - comphelper::getProcessComponentContext(), - OUString("org.openoffice.Office.Common/Accessibility") ); // note: case sensitive ! - if ( aNode.isValid() ) - { - ::com::sun::star::uno::Any aValue = aNode.getNodeValue( OUString("AutoDetectSystemHC") ); - if( aValue >>= bTmp ) - bAutoHCMode = bTmp; - } - if( bAutoHCMode ) - { - if( rSettings.GetStyleSettings().GetFaceColor().IsDark() || - rSettings.GetStyleSettings().GetWindowColor().IsDark() ) - bForceHCMode = true; - } - } - - static const char* pEnvHC = getenv( "SAL_FORCE_HC" ); - if( pEnvHC && *pEnvHC ) - bForceHCMode = true; - - if( bForceHCMode ) - { - aStyleSettings = rSettings.GetStyleSettings(); - aStyleSettings.SetHighContrastMode( true ); - rSettings.SetStyleSettings( aStyleSettings ); - } - -#if defined(DBG_UTIL) - // If needed, set AppFont to bold, in order to check - // if there is enough space available for texts on other systems - if ( DbgIsBoldAppFont() ) - { - aStyleSettings = rSettings.GetStyleSettings(); - aFont = aStyleSettings.GetAppFont(); - aFont.SetWeight( WEIGHT_BOLD ); - aStyleSettings.SetAppFont( aFont ); - aFont = aStyleSettings.GetGroupFont(); - aFont.SetWeight( WEIGHT_BOLD ); - aStyleSettings.SetGroupFont( aFont ); - aFont = aStyleSettings.GetLabelFont(); - aFont.SetWeight( WEIGHT_BOLD ); - aStyleSettings.SetLabelFont( aFont ); - aFont = aStyleSettings.GetRadioCheckFont(); - aFont.SetWeight( WEIGHT_BOLD ); - aStyleSettings.SetRadioCheckFont( aFont ); - aFont = aStyleSettings.GetPushButtonFont(); - aFont.SetWeight( WEIGHT_BOLD ); - aStyleSettings.SetPushButtonFont( aFont ); - aFont = aStyleSettings.GetFieldFont(); - aFont.SetWeight( WEIGHT_BOLD ); - aStyleSettings.SetFieldFont( aFont ); - aFont = aStyleSettings.GetIconFont(); - aFont.SetWeight( WEIGHT_BOLD ); - aStyleSettings.SetIconFont( aFont ); - rSettings.SetStyleSettings( aStyleSettings ); - } -#endif - - if ( bCallHdl ) - GetpApp()->OverrideSystemSettings( rSettings ); -} - -MouseEvent ImplTranslateMouseEvent( const MouseEvent& rE, Window* pSource, Window* pDest ) -{ - Point aPos = pSource->OutputToScreenPixel( rE.GetPosPixel() ); - aPos = pDest->ScreenToOutputPixel( aPos ); - return MouseEvent( aPos, rE.GetClicks(), rE.GetMode(), rE.GetButtons(), rE.GetModifier() ); -} - -CommandEvent ImplTranslateCommandEvent( const CommandEvent& rCEvt, Window* pSource, Window* pDest ) -{ - if ( !rCEvt.IsMouseEvent() ) - return rCEvt; - - Point aPos = pSource->OutputToScreenPixel( rCEvt.GetMousePosPixel() ); - aPos = pDest->ScreenToOutputPixel( aPos ); - return CommandEvent( aPos, rCEvt.GetCommand(), rCEvt.IsMouseEvent(), rCEvt.GetData() ); -} - void Window::ImplInitWindowData( WindowType nType ) { // We will eventually being removing the inheritance of OutputDevice from Window. @@ -1114,62 +857,6 @@ void Window::ImplSetFrameParent( const Window* pParent ) } } -void Window::ImplCallResize() -{ - mpWindowImpl->mbCallResize = false; - - if( GetBackground().IsGradient() ) - Invalidate(); - - Resize(); - - // #88419# Most classes don't call the base class in Resize() and Move(), - // => Call ImpleResize/Move instead of Resize/Move directly... - ImplCallEventListeners( VCLEVENT_WINDOW_RESIZE ); -} - -void Window::ImplCallMove() -{ - mpWindowImpl->mbCallMove = false; - - if( mpWindowImpl->mbFrame ) - { - // update frame position - SalFrame *pParentFrame = NULL; - Window *pParent = ImplGetParent(); - while( pParent ) - { - if( pParent->mpWindowImpl->mpFrame != mpWindowImpl->mpFrame ) - { - pParentFrame = pParent->mpWindowImpl->mpFrame; - break; - } - pParent = pParent->GetParent(); - } - - SalFrameGeometry g = mpWindowImpl->mpFrame->GetGeometry(); - mpWindowImpl->maPos = Point( g.nX, g.nY ); - if( pParentFrame ) - { - g = pParentFrame->GetGeometry(); - mpWindowImpl->maPos -= Point( g.nX, g.nY ); - } - // the client window and and all its subclients have the same position as the borderframe - // this is important for floating toolbars where the borderwindow is a floating window - // which has another borderwindow (ie the system floating window) - Window *pClientWin = mpWindowImpl->mpClientWindow; - while( pClientWin ) - { - pClientWin->mpWindowImpl->maPos = mpWindowImpl->maPos; - pClientWin = pClientWin->mpWindowImpl->mpClientWindow; - } - } - - Move(); - - ImplCallEventListeners( VCLEVENT_WINDOW_MOVE ); -} - ImplWinData* Window::ImplGetWinData() const { if ( !mpWindowImpl->mpWinData ) @@ -1443,30 +1130,6 @@ void Window::ImplSetReallyVisible() } } -void Window::ImplCallInitShow() -{ - mpWindowImpl->mbReallyShown = true; - mpWindowImpl->mbInInitShow = true; - StateChanged( STATE_CHANGE_INITSHOW ); - mpWindowImpl->mbInInitShow = false; - - Window* pWindow = mpWindowImpl->mpFirstOverlap; - while ( pWindow ) - { - if ( pWindow->mpWindowImpl->mbVisible ) - pWindow->ImplCallInitShow(); - pWindow = pWindow->mpWindowImpl->mpNext; - } - - pWindow = mpWindowImpl->mpFirstChild; - while ( pWindow ) - { - if ( pWindow->mpWindowImpl->mbVisible ) - pWindow->ImplCallInitShow(); - pWindow = pWindow->mpWindowImpl->mpNext; - } -} - void Window::ImplAddDel( ImplDelData* pDel ) // TODO: make "const" when incompatiblity ok { DBG_ASSERT( !pDel->mpWindow, "Window::ImplAddDel(): cannot add ImplDelData twice !" ); @@ -3007,83 +2670,6 @@ void Window::ImplInvertFocus( const Rectangle& rRect ) InvertTracking( rRect, SHOWTRACK_SMALL | SHOWTRACK_WINDOW ); } -void Window::ImplCallFocusChangeActivate( Window* pNewOverlapWindow, - Window* pOldOverlapWindow ) -{ - ImplSVData* pSVData = ImplGetSVData(); - Window* pNewRealWindow; - Window* pOldRealWindow; - bool bCallActivate = true; - bool bCallDeactivate = true; - - pOldRealWindow = pOldOverlapWindow->ImplGetWindow(); - pNewRealWindow = pNewOverlapWindow->ImplGetWindow(); - if ( (pOldRealWindow->GetType() != WINDOW_FLOATINGWINDOW) || - pOldRealWindow->GetActivateMode() ) - { - if ( (pNewRealWindow->GetType() == WINDOW_FLOATINGWINDOW) && - !pNewRealWindow->GetActivateMode() ) - { - pSVData->maWinData.mpLastDeacWin = pOldOverlapWindow; - bCallDeactivate = false; - } - } - else if ( (pNewRealWindow->GetType() != WINDOW_FLOATINGWINDOW) || - pNewRealWindow->GetActivateMode() ) - { - if ( pSVData->maWinData.mpLastDeacWin ) - { - if ( pSVData->maWinData.mpLastDeacWin == pNewOverlapWindow ) - bCallActivate = false; - else - { - Window* pLastRealWindow = pSVData->maWinData.mpLastDeacWin->ImplGetWindow(); - pSVData->maWinData.mpLastDeacWin->mpWindowImpl->mbActive = false; - pSVData->maWinData.mpLastDeacWin->Deactivate(); - if ( pLastRealWindow != pSVData->maWinData.mpLastDeacWin ) - { - pLastRealWindow->mpWindowImpl->mbActive = true; - pLastRealWindow->Activate(); - } - } - pSVData->maWinData.mpLastDeacWin = NULL; - } - } - - if ( bCallDeactivate ) - { - if( pOldOverlapWindow->mpWindowImpl->mbActive ) - { - pOldOverlapWindow->mpWindowImpl->mbActive = false; - pOldOverlapWindow->Deactivate(); - } - if ( pOldRealWindow != pOldOverlapWindow ) - { - if( pOldRealWindow->mpWindowImpl->mbActive ) - { - pOldRealWindow->mpWindowImpl->mbActive = false; - pOldRealWindow->Deactivate(); - } - } - } - if ( bCallActivate && ! pNewOverlapWindow->mpWindowImpl->mbActive ) - { - if( ! pNewOverlapWindow->mpWindowImpl->mbActive ) - { - pNewOverlapWindow->mpWindowImpl->mbActive = true; - pNewOverlapWindow->Activate(); - } - if ( pNewRealWindow != pNewOverlapWindow ) - { - if( ! pNewRealWindow->mpWindowImpl->mbActive ) - { - pNewRealWindow->mpWindowImpl->mbActive = true; - pNewRealWindow->Activate(); - } - } - } -} - static bool IsWindowFocused(const WindowImpl& rWinImpl) { if (rWinImpl.mpSysObj) @@ -4012,362 +3598,6 @@ void Window::StateChanged( StateChangedType eType ) } } -void Window::DataChanged( const DataChangedEvent& ) -{ -} - -void Window::ImplNotifyKeyMouseCommandEventListeners( NotifyEvent& rNEvt ) -{ - if( rNEvt.GetType() == EVENT_COMMAND ) - { - const CommandEvent* pCEvt = rNEvt.GetCommandEvent(); - if ( pCEvt->GetCommand() != COMMAND_CONTEXTMENU ) - // non context menu events are not to be notified up the chain - // so we return immediately - return; - - if ( mpWindowImpl->mbCompoundControl || ( rNEvt.GetWindow() == this ) ) - { - if ( rNEvt.GetWindow() == this ) - // not interested in: The event listeners are already called in ::Command, - // and calling them here a second time doesn't make sense - ; - else - { - CommandEvent aCommandEvent = ImplTranslateCommandEvent( *pCEvt, rNEvt.GetWindow(), this ); - ImplCallEventListeners( VCLEVENT_WINDOW_COMMAND, &aCommandEvent ); - } - } - } - - // #82968# notify event listeners for mouse and key events separately and - // not in PreNotify ( as for focus listeners ) - // this allows for processing those events internally first and pass it to - // the toolkit later - - ImplDelData aDelData; - ImplAddDel( &aDelData ); - - if( rNEvt.GetType() == EVENT_MOUSEMOVE ) - { - if ( mpWindowImpl->mbCompoundControl || ( rNEvt.GetWindow() == this ) ) - { - if ( rNEvt.GetWindow() == this ) - ImplCallEventListeners( VCLEVENT_WINDOW_MOUSEMOVE, (void*)rNEvt.GetMouseEvent() ); - else - { - MouseEvent aMouseEvent = ImplTranslateMouseEvent( *rNEvt.GetMouseEvent(), rNEvt.GetWindow(), this ); - ImplCallEventListeners( VCLEVENT_WINDOW_MOUSEMOVE, &aMouseEvent ); - } - } - } - else if( rNEvt.GetType() == EVENT_MOUSEBUTTONUP ) - { - if ( mpWindowImpl->mbCompoundControl || ( rNEvt.GetWindow() == this ) ) - { - if ( rNEvt.GetWindow() == this ) - ImplCallEventListeners( VCLEVENT_WINDOW_MOUSEBUTTONUP, (void*)rNEvt.GetMouseEvent() ); - else - { - MouseEvent aMouseEvent = ImplTranslateMouseEvent( *rNEvt.GetMouseEvent(), rNEvt.GetWindow(), this ); - ImplCallEventListeners( VCLEVENT_WINDOW_MOUSEBUTTONUP, &aMouseEvent ); - } - } - } - else if( rNEvt.GetType() == EVENT_MOUSEBUTTONDOWN ) - { - if ( mpWindowImpl->mbCompoundControl || ( rNEvt.GetWindow() == this ) ) - { - if ( rNEvt.GetWindow() == this ) - ImplCallEventListeners( VCLEVENT_WINDOW_MOUSEBUTTONDOWN, (void*)rNEvt.GetMouseEvent() ); - else - { - MouseEvent aMouseEvent = ImplTranslateMouseEvent( *rNEvt.GetMouseEvent(), rNEvt.GetWindow(), this ); - ImplCallEventListeners( VCLEVENT_WINDOW_MOUSEBUTTONDOWN, &aMouseEvent ); - } - } - } - else if( rNEvt.GetType() == EVENT_KEYINPUT ) - { - if ( mpWindowImpl->mbCompoundControl || ( rNEvt.GetWindow() == this ) ) - ImplCallEventListeners( VCLEVENT_WINDOW_KEYINPUT, (void*)rNEvt.GetKeyEvent() ); - } - else if( rNEvt.GetType() == EVENT_KEYUP ) - { - if ( mpWindowImpl->mbCompoundControl || ( rNEvt.GetWindow() == this ) ) - ImplCallEventListeners( VCLEVENT_WINDOW_KEYUP, (void*)rNEvt.GetKeyEvent() ); - } - - if ( aDelData.IsDead() ) - return; - ImplRemoveDel( &aDelData ); - - // #106721# check if we're part of a compound control and notify - Window *pParent = ImplGetParent(); - while( pParent ) - { - if( pParent->IsCompoundControl() ) - { - pParent->ImplNotifyKeyMouseCommandEventListeners( rNEvt ); - break; - } - pParent = pParent->ImplGetParent(); - } -} - -bool Window::PreNotify( NotifyEvent& rNEvt ) -{ - bool bDone = false; - if ( mpWindowImpl->mpParent && !ImplIsOverlapWindow() ) - bDone = mpWindowImpl->mpParent->PreNotify( rNEvt ); - - if ( !bDone ) - { - if( rNEvt.GetType() == EVENT_GETFOCUS ) - { - bool bCompoundFocusChanged = false; - if ( mpWindowImpl->mbCompoundControl && !mpWindowImpl->mbCompoundControlHasFocus && HasChildPathFocus() ) - { - mpWindowImpl->mbCompoundControlHasFocus = true; - bCompoundFocusChanged = true; - } - - if ( bCompoundFocusChanged || ( rNEvt.GetWindow() == this ) ) - ImplCallEventListeners( VCLEVENT_WINDOW_GETFOCUS ); - } - else if( rNEvt.GetType() == EVENT_LOSEFOCUS ) - { - bool bCompoundFocusChanged = false; - if ( mpWindowImpl->mbCompoundControl && mpWindowImpl->mbCompoundControlHasFocus && !HasChildPathFocus() ) - { - mpWindowImpl->mbCompoundControlHasFocus = false ; - bCompoundFocusChanged = true; - } - - if ( bCompoundFocusChanged || ( rNEvt.GetWindow() == this ) ) - ImplCallEventListeners( VCLEVENT_WINDOW_LOSEFOCUS ); - } - - // #82968# mouse and key events will be notified after processing ( in ImplNotifyKeyMouseCommandEventListeners() )! - // see also ImplHandleMouseEvent(), ImplHandleKey() - - } - - return bDone; -} - -bool Window::Notify( NotifyEvent& rNEvt ) -{ - bool nRet = false; - - // check for docking window - // but do nothing if window is docked and locked - ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this ); - if( pWrapper && !( !pWrapper->IsFloatingMode() && pWrapper->IsLocked() ) ) - { - if ( rNEvt.GetType() == EVENT_MOUSEBUTTONDOWN ) - { - const MouseEvent* pMEvt = rNEvt.GetMouseEvent(); - bool bHit = pWrapper->GetDragArea().IsInside( pMEvt->GetPosPixel() ); - if ( pMEvt->IsLeft() ) - { - if ( pMEvt->IsMod1() && (pMEvt->GetClicks() == 2) ) - { - // ctrl double click toggles floating mode - pWrapper->SetFloatingMode( !pWrapper->IsFloatingMode() ); - return true; - } - else if ( pMEvt->GetClicks() == 1 && bHit) - { - // allow start docking during mouse move - pWrapper->ImplEnableStartDocking(); - return true; - } - } - } - else if ( rNEvt.GetType() == EVENT_MOUSEMOVE ) - { - const MouseEvent* pMEvt = rNEvt.GetMouseEvent(); - bool bHit = pWrapper->GetDragArea().IsInside( pMEvt->GetPosPixel() ); - if ( pMEvt->IsLeft() ) - { - // check if a single click initiated this sequence ( ImplStartDockingEnabled() ) - // check if window is docked and - if( pWrapper->ImplStartDockingEnabled() && !pWrapper->IsFloatingMode() && - !pWrapper->IsDocking() && bHit ) - { - Point aPos = pMEvt->GetPosPixel(); - Window* pWindow = rNEvt.GetWindow(); - if ( pWindow != this ) - { - aPos = pWindow->OutputToScreenPixel( aPos ); - aPos = ScreenToOutputPixel( aPos ); - } - pWrapper->ImplStartDocking( aPos ); - } - return true; - } - } - else if( rNEvt.GetType() == EVENT_KEYINPUT ) - { - const KeyCode& rKey = rNEvt.GetKeyEvent()->GetKeyCode(); - if( rKey.GetCode() == KEY_F10 && rKey.GetModifier() && - rKey.IsShift() && rKey.IsMod1() ) - { - pWrapper->SetFloatingMode( !pWrapper->IsFloatingMode() ); - /* At this point the floating toolbar frame does not have the - * input focus since these frames don't get the focus per default - * To enable keyboard handling of this toolbar set the input focus - * to the frame. This needs to be done with ToTop since GrabFocus - * would not notice any change since "this" already has the focus. - */ - if( pWrapper->IsFloatingMode() ) - ToTop( TOTOP_GRABFOCUSONLY ); - return true; - } - } - } - - // manage the dialogs - if ( (GetStyle() & (WB_DIALOGCONTROL | WB_NODIALOGCONTROL)) == WB_DIALOGCONTROL ) - { - // if the parent also has dialog control activated, the parent takes over control - if ( (rNEvt.GetType() == EVENT_KEYINPUT) || (rNEvt.GetType() == EVENT_KEYUP) ) - { - if ( ImplIsOverlapWindow() || - ((getNonLayoutRealParent(this)->GetStyle() & (WB_DIALOGCONTROL | WB_NODIALOGCONTROL)) != WB_DIALOGCONTROL) ) - { - nRet = ImplDlgCtrl( *rNEvt.GetKeyEvent(), rNEvt.GetType() == EVENT_KEYINPUT ); - } - } - else if ( (rNEvt.GetType() == EVENT_GETFOCUS) || (rNEvt.GetType() == EVENT_LOSEFOCUS) ) - { - ImplDlgCtrlFocusChanged( rNEvt.GetWindow(), rNEvt.GetType() == EVENT_GETFOCUS ); - if ( (rNEvt.GetWindow() == this) && (rNEvt.GetType() == EVENT_GETFOCUS) && - !(GetStyle() & WB_TABSTOP) && !(mpWindowImpl->mnDlgCtrlFlags & WINDOW_DLGCTRL_WANTFOCUS) ) - { - sal_uInt16 n = 0; - Window* pFirstChild = ImplGetDlgWindow( n, DLGWINDOW_FIRST ); - if ( pFirstChild ) - pFirstChild->ImplControlFocus(); - } - } - } - - if ( !nRet ) - { - if ( mpWindowImpl->mpParent && !ImplIsOverlapWindow() ) - nRet = mpWindowImpl->mpParent->Notify( rNEvt ); - } - - return nRet; -} - -void Window::ImplCallEventListeners( sal_uLong nEvent, void* pData ) -{ - // The implementation was moved to CallEventListeners(), - // because derived classes in svtools must be able to - // call the event listeners and ImplCallEventListeners() - // is not exported. - // TODO: replace ImplCallEventListeners() by CallEventListeners() in vcl - - CallEventListeners( nEvent, pData ); -} - -void Window::CallEventListeners( sal_uLong nEvent, void* pData ) -{ - VclWindowEvent aEvent( this, nEvent, pData ); - - ImplDelData aDelData; - ImplAddDel( &aDelData ); - - ImplGetSVData()->mpApp->ImplCallEventListeners( &aEvent ); - - if ( aDelData.IsDead() ) - return; - - mpWindowImpl->maEventListeners.Call( &aEvent ); - - if ( aDelData.IsDead() ) - return; - - ImplRemoveDel( &aDelData ); - - Window* pWindow = this; - while ( pWindow ) - { - pWindow->ImplAddDel( &aDelData ); - - pWindow->mpWindowImpl->maChildEventListeners.Call( &aEvent ); - - if ( aDelData.IsDead() ) - return; - - pWindow->ImplRemoveDel( &aDelData ); - - pWindow = pWindow->GetParent(); - } -} - -void Window::FireVclEvent( VclSimpleEvent* pEvent ) -{ - ImplGetSVData()->mpApp->ImplCallEventListeners(pEvent); -} - -void Window::AddEventListener( const Link& rEventListener ) -{ - mpWindowImpl->maEventListeners.addListener( rEventListener ); -} - -void Window::RemoveEventListener( const Link& rEventListener ) -{ - mpWindowImpl->maEventListeners.removeListener( rEventListener ); -} - -void Window::AddChildEventListener( const Link& rEventListener ) -{ - mpWindowImpl->maChildEventListeners.addListener( rEventListener ); -} - -void Window::RemoveChildEventListener( const Link& rEventListener ) -{ - mpWindowImpl->maChildEventListeners.removeListener( rEventListener ); -} - -ImplSVEvent * Window::PostUserEvent( const Link& rLink, void* pCaller ) -{ - ImplSVEvent* pSVEvent = new ImplSVEvent; - pSVEvent->mpData = pCaller; - pSVEvent->mpLink = new Link( rLink ); - pSVEvent->mpWindow = this; - pSVEvent->mbCall = true; - ImplAddDel( &(pSVEvent->maDelData) ); - if ( !mpWindowImpl->mpFrame->PostEvent( pSVEvent ) ) - { - ImplRemoveDel( &(pSVEvent->maDelData) ); - delete pSVEvent->mpLink; - delete pSVEvent; - pSVEvent = 0; - } - return pSVEvent; -} - -void Window::RemoveUserEvent( ImplSVEvent * nUserEvent ) -{ - DBG_ASSERT( nUserEvent->mpWindow == this, - "Window::RemoveUserEvent(): Event doesn't send to this window or is already removed" ); - DBG_ASSERT( nUserEvent->mbCall, - "Window::RemoveUserEvent(): Event is already removed" ); - - if ( nUserEvent->mpWindow ) - { - nUserEvent->mpWindow->ImplRemoveDel( &(nUserEvent->maDelData) ); - nUserEvent->mpWindow = NULL; - } - - nUserEvent->mbCall = false; -} - bool Window::IsLocked( bool bChildren ) const { if ( mpWindowImpl->mnLockCount != 0 ) @@ -4606,127 +3836,6 @@ void Window::SetCompositionCharRect( const Rectangle* pRect, long nCompositionLe } } -void Window::SetSettings( const AllSettings& rSettings ) -{ - SetSettings( rSettings, false ); -} - -void Window::SetSettings( const AllSettings& rSettings, bool bChild ) -{ - - if ( mpWindowImpl->mpBorderWindow ) - { - mpWindowImpl->mpBorderWindow->SetSettings( rSettings, false ); - if ( (mpWindowImpl->mpBorderWindow->GetType() == WINDOW_BORDERWINDOW) && - ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->mpMenuBarWindow ) - ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->mpMenuBarWindow->SetSettings( rSettings, true ); - } - - AllSettings aOldSettings(*mxSettings); - OutputDevice::SetSettings( rSettings ); - sal_uLong nChangeFlags = aOldSettings.GetChangeFlags( rSettings ); - - // recalculate AppFont-resolution and DPI-resolution - ImplInitResolutionSettings(); - - if ( nChangeFlags ) - { - DataChangedEvent aDCEvt( DATACHANGED_SETTINGS, &aOldSettings, nChangeFlags ); - DataChanged( aDCEvt ); - } - - if ( bChild || mpWindowImpl->mbChildNotify ) - { - Window* pChild = mpWindowImpl->mpFirstChild; - while ( pChild ) - { - pChild->SetSettings( rSettings, bChild ); - pChild = pChild->mpWindowImpl->mpNext; - } - } -} - -void Window::UpdateSettings( const AllSettings& rSettings, bool bChild ) -{ - - if ( mpWindowImpl->mpBorderWindow ) - { - mpWindowImpl->mpBorderWindow->UpdateSettings( rSettings, false ); - if ( (mpWindowImpl->mpBorderWindow->GetType() == WINDOW_BORDERWINDOW) && - ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->mpMenuBarWindow ) - ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->mpMenuBarWindow->UpdateSettings( rSettings, true ); - } - - AllSettings aOldSettings(*mxSettings); - sal_uLong nChangeFlags = mxSettings->Update( mxSettings->GetWindowUpdate(), rSettings ); - nChangeFlags |= SETTINGS_IN_UPDATE_SETTINGS; // Set this flag so the receiver of the data changed - // event can distinguish between the changing of global - // setting and a local change ( with SetSettings ) - - // recalculate AppFont-resolution and DPI-resolution - ImplInitResolutionSettings(); - - /* #i73785# - * do not overwrite a WheelBehavior with false - * this looks kind of a hack, but WheelBehavior - * is always a local change, not a system property, - * so we can spare all our users the hassle of reacting on - * this in their respective DataChanged. - */ - MouseSettings aSet( mxSettings->GetMouseSettings() ); - aSet.SetWheelBehavior( aOldSettings.GetMouseSettings().GetWheelBehavior() ); - mxSettings->SetMouseSettings( aSet ); - - if( (nChangeFlags & SETTINGS_STYLE) && IsBackground() ) - { - Wallpaper aWallpaper = GetBackground(); - if( !aWallpaper.IsBitmap() && !aWallpaper.IsGradient() ) - { - if ( mpWindowImpl->mnStyle & WB_3DLOOK ) - { - if (aOldSettings.GetStyleSettings().GetFaceColor() != rSettings.GetStyleSettings().GetFaceColor()) - SetBackground( Wallpaper( rSettings.GetStyleSettings().GetFaceColor() ) ); - } - else - { - if (aOldSettings.GetStyleSettings().GetWindowColor() != rSettings.GetStyleSettings().GetWindowColor()) - SetBackground( Wallpaper( rSettings.GetStyleSettings().GetWindowColor() ) ); - } - } - } - - if ( nChangeFlags ) - { - DataChangedEvent aDCEvt( DATACHANGED_SETTINGS, &aOldSettings, nChangeFlags ); - DataChanged( aDCEvt ); - // notify data change handler - ImplCallEventListeners( VCLEVENT_WINDOW_DATACHANGED, &aDCEvt); - } - - if ( bChild || mpWindowImpl->mbChildNotify ) - { - Window* pChild = mpWindowImpl->mpFirstChild; - while ( pChild ) - { - pChild->UpdateSettings( rSettings, bChild ); - pChild = pChild->mpWindowImpl->mpNext; - } - } -} - -void Window::NotifyAllChildren( DataChangedEvent& rDCEvt ) -{ - - DataChanged( rDCEvt ); - - Window* pChild = mpWindowImpl->mpFirstChild; - while ( pChild ) - { - pChild->NotifyAllChildren( rDCEvt ); - pChild = pChild->mpWindowImpl->mpNext; - } -} - void Window::CollectChildren(::std::vector<Window *>& rAllChildren ) { rAllChildren.push_back( this ); |