[Libreoffice-commits] core.git: vcl/Library_vcl.mk vcl/source
Chris Sherlock
chris.sherlock79 at gmail.com
Thu May 22 15:41:12 PDT 2014
vcl/Library_vcl.mk | 2
vcl/source/window/event.cxx | 578 +++++++++++++++++++++++++
vcl/source/window/mouseevent.cxx | 3
vcl/source/window/settings.cxx | 388 ++++++++++++++++
vcl/source/window/window.cxx | 891 ---------------------------------------
5 files changed, 970 insertions(+), 892 deletions(-)
New commits:
commit 7818974103fcdf16e03354f62a4165eedea4427c
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date: Thu May 22 02:51:15 2014 +1000
vcl: split window.cxx into event and settings functions
Change-Id: Ic038a1c95721d4e578face5deea0b8d8a4ab7304
diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk
index e321525..7ea6981 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 0000000..66e2d74
--- /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 b23b9c0..3fb692d 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 0000000..66935d7
--- /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 849bce6..a2d2736 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 );
More information about the Libreoffice-commits
mailing list