blob: 04efc3eccb9a10ba3eeda6d186110adc2270194c [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_vcl.hxx"
#include "svsys.h"
#include "comphelper/processfactory.hxx"
#include "osl/module.h"
#include "osl/file.hxx"
#include "osl/thread.h"
#include "rtl/tencinfo.h"
#include "rtl/instance.hxx"
#include "vos/process.hxx"
#include "vos/mutex.hxx"
#include "tools/tools.h"
#include "tools/debug.hxx"
#include "tools/time.hxx"
#include "i18npool/mslangid.hxx"
#include "unotools/syslocaleoptions.hxx"
#include "vcl/settings.hxx"
#include "vcl/keycod.hxx"
#include "vcl/event.hxx"
#include "vcl/vclevent.hxx"
#include "vcl/virdev.hxx"
#include "vcl/wrkwin.hxx"
#include "vcl/svapp.hxx"
#include "vcl/cvtgrf.hxx"
#include "vcl/unowrap.hxx"
#include "vcl/timer.hxx"
#include "vcl/unohelp.hxx"
#include "vcl/lazydelete.hxx"
#include "salinst.hxx"
#include "salframe.hxx"
#include "salsys.hxx"
#include "svdata.hxx"
#include "salimestatus.hxx"
#include "xconnection.hxx"
#include "window.h"
#include "accmgr.hxx"
#include "idlemgr.hxx"
#include "svids.hrc"
#include "com/sun/star/uno/Reference.h"
#include "com/sun/star/awt/XToolkit.hpp"
#include "com/sun/star/uno/XNamingService.hpp"
#include "com/sun/star/lang/XMultiServiceFactory.hpp"
#include <utility>
#ifdef WNT
#include <tchar.h>
#endif
using namespace ::com::sun::star::uno;
// keycodes handled internally by VCL
class ImplReservedKey
{
public:
ImplReservedKey( KeyCode aKeyCode, sal_uInt16 nResId ) :
mKeyCode(aKeyCode), mnResId( nResId)
{}
KeyCode mKeyCode;
sal_uInt16 mnResId;
};
typedef std::pair<ImplReservedKey*, size_t> ReservedKeys;
namespace
{
struct ImplReservedKeysImpl
{
ReservedKeys* operator()()
{
static ImplReservedKey ImplReservedKeys[] =
{
ImplReservedKey(KeyCode(KEY_F1,0), SV_SHORTCUT_HELP),
ImplReservedKey(KeyCode(KEY_F1,KEY_SHIFT), SV_SHORTCUT_ACTIVEHELP),
ImplReservedKey(KeyCode(KEY_F1,KEY_MOD1), SV_SHORTCUT_CONTEXTHELP),
ImplReservedKey(KeyCode(KEY_F2,KEY_SHIFT), SV_SHORTCUT_CONTEXTHELP),
ImplReservedKey(KeyCode(KEY_F4,KEY_MOD1), SV_SHORTCUT_DOCKUNDOCK),
ImplReservedKey(KeyCode(KEY_F4,KEY_MOD2), SV_SHORTCUT_DOCKUNDOCK),
ImplReservedKey(KeyCode(KEY_F4,KEY_MOD1|KEY_MOD2), SV_SHORTCUT_DOCKUNDOCK),
ImplReservedKey(KeyCode(KEY_F6,0), SV_SHORTCUT_NEXTSUBWINDOW),
ImplReservedKey(KeyCode(KEY_F6,KEY_MOD1), SV_SHORTCUT_TODOCUMENT),
ImplReservedKey(KeyCode(KEY_F6,KEY_SHIFT), SV_SHORTCUT_PREVSUBWINDOW),
ImplReservedKey(KeyCode(KEY_F6,KEY_MOD1|KEY_SHIFT), SV_SHORTCUT_SPLITTER),
ImplReservedKey(KeyCode(KEY_F10,0), SV_SHORTCUT_MENUBAR)
#ifdef UNX
,
ImplReservedKey(KeyCode(KEY_1,KEY_SHIFT|KEY_MOD1), 0),
ImplReservedKey(KeyCode(KEY_2,KEY_SHIFT|KEY_MOD1), 0),
ImplReservedKey(KeyCode(KEY_3,KEY_SHIFT|KEY_MOD1), 0),
ImplReservedKey(KeyCode(KEY_4,KEY_SHIFT|KEY_MOD1), 0),
ImplReservedKey(KeyCode(KEY_5,KEY_SHIFT|KEY_MOD1), 0),
ImplReservedKey(KeyCode(KEY_6,KEY_SHIFT|KEY_MOD1), 0),
ImplReservedKey(KeyCode(KEY_7,KEY_SHIFT|KEY_MOD1), 0),
ImplReservedKey(KeyCode(KEY_8,KEY_SHIFT|KEY_MOD1), 0),
ImplReservedKey(KeyCode(KEY_9,KEY_SHIFT|KEY_MOD1), 0),
ImplReservedKey(KeyCode(KEY_0,KEY_SHIFT|KEY_MOD1), 0),
ImplReservedKey(KeyCode(KEY_ADD,KEY_SHIFT|KEY_MOD1), 0)
#endif
};
static ReservedKeys aKeys
(
&ImplReservedKeys[0],
sizeof(ImplReservedKeys) / sizeof(ImplReservedKey)
);
return &aKeys;
}
};
struct ImplReservedKeys
: public rtl::StaticAggregate<ReservedKeys, ImplReservedKeysImpl> {};
}
// #include <usr/refl.hxx>
class Reflection;
extern "C" {
typedef UnoWrapperBase* (SAL_CALL *FN_TkCreateUnoWrapper)();
}
// =======================================================================
// --------------
// - ImplHotKey -
// --------------
struct ImplHotKey
{
ImplHotKey* mpNext;
void* mpUserData;
KeyCode maKeyCode;
Link maLink;
};
// =======================================================================
// -----------------
// - ImplEventHook -
// -----------------
struct ImplEventHook
{
ImplEventHook* mpNext;
void* mpUserData;
VCLEventHookProc mpProc;
};
// =======================================================================
// ---------------------
// - ImplPostEventData -
// ---------------------
struct ImplPostEventData
{
sal_uLong mnEvent;
const Window* mpWin;
sal_uLong mnEventId;
KeyEvent maKeyEvent;
MouseEvent maMouseEvent;
ImplPostEventData( sal_uLong nEvent, const Window* pWin, const KeyEvent& rKeyEvent ) :
mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maKeyEvent( rKeyEvent ) {}
ImplPostEventData( sal_uLong nEvent, const Window* pWin, const MouseEvent& rMouseEvent ) :
mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maMouseEvent( rMouseEvent ) {}
~ImplPostEventData() {}
};
typedef ::std::pair< Window*, ImplPostEventData* > ImplPostEventPair;
static ::std::list< ImplPostEventPair > aPostedEventList;
// =======================================================================
Application* GetpApp()
{
ImplSVData* pSVData = ImplGetSVData();
if ( !pSVData )
return NULL;
return pSVData->mpApp;
}
// -----------------------------------------------------------------------
Application::Application()
{
if( ! ImplGetSVData() )
ImplInitSVData();
ImplGetSVData()->mpApp = this;
InitSalData();
}
// -----------------------------------------------------------------------
Application::~Application()
{
ImplDeInitSVData();
DeInitSalData();
ImplGetSVData()->mpApp = NULL;
ImplDestroySVData();
GlobalDeInitTools();
}
// -----------------------------------------------------------------------
void Application::InitAppRes( const ResId& )
{
}
// -----------------------------------------------------------------------
sal_Bool Application::QueryExit()
{
WorkWindow* pAppWin = ImplGetSVData()->maWinData.mpAppWin;
// Aufruf des Close-Handlers des Applikationsfensters
if ( pAppWin )
return pAppWin->Close();
else
return sal_True;
}
// -----------------------------------------------------------------------
void Application::UserEvent( sal_uLong, void* )
{
}
// -----------------------------------------------------------------------
void Application::ShowStatusText( const XubString& )
{
}
// -----------------------------------------------------------------------
void Application::ShowHelpStatusText( const XubString& )
{
}
// -----------------------------------------------------------------------
void Application::ActivateExtHelp()
{
}
// -----------------------------------------------------------------------
void Application::DeactivateExtHelp()
{
}
// -----------------------------------------------------------------------
void Application::HideStatusText()
{
}
// -----------------------------------------------------------------------
void Application::HideHelpStatusText()
{
}
// -----------------------------------------------------------------------
void Application::FocusChanged()
{
}
// -----------------------------------------------------------------------
void Application::DataChanged( const DataChangedEvent& )
{
}
// -----------------------------------------------------------------------
void Application::Init()
{
}
// -----------------------------------------------------------------------
void Application::DeInit()
{
}
// -----------------------------------------------------------------------
sal_uInt16 Application::GetCommandLineParamCount()
{
vos::OStartupInfo aStartInfo;
return (sal_uInt16)aStartInfo.getCommandArgCount();
}
// -----------------------------------------------------------------------
XubString Application::GetCommandLineParam( sal_uInt16 nParam )
{
vos::OStartupInfo aStartInfo;
rtl::OUString aParam;
aStartInfo.getCommandArg( nParam, aParam );
return XubString( aParam );
}
// -----------------------------------------------------------------------
const XubString& Application::GetAppFileName()
{
ImplSVData* pSVData = ImplGetSVData();
DBG_ASSERT( pSVData->maAppData.mpAppFileName, "AppFileName vor SVMain ?!" );
if ( pSVData->maAppData.mpAppFileName )
return *pSVData->maAppData.mpAppFileName;
/*
* #91147# provide a fallback for people without initialized
* vcl here (like setup in responsefile mode)
*/
static String aAppFileName;
if( !aAppFileName.Len() )
{
vos::OStartupInfo aStartInfo;
::rtl::OUString aExeFileName;
aStartInfo.getExecutableFile( aExeFileName );
// convert path to native file format
rtl::OUString aNativeFileName;
osl::FileBase::getSystemPathFromFileURL( aExeFileName, aNativeFileName );
aAppFileName = aNativeFileName;
}
return aAppFileName;
}
// -----------------------------------------------------------------------
sal_uInt16 Application::Exception( sal_uInt16 nError )
{
switch ( nError & EXC_MAJORTYPE )
{
// Bei System machen wir nichts und lassen dem System den
// vortritt
case EXC_SYSTEM:
return 0;
case EXC_DISPLAY:
case EXC_REMOTE:
return 0;
#ifdef DBG_UTIL
case EXC_RSCNOTLOADED:
Abort( XubString( RTL_CONSTASCII_USTRINGPARAM( "Resource not loaded" ) ) );
break;
case EXC_SYSOBJNOTCREATED:
Abort( XubString( RTL_CONSTASCII_USTRINGPARAM( "System Object not created" ) ) );
break;
default:
Abort( XubString( RTL_CONSTASCII_USTRINGPARAM( "Unknown Error" ) ) );
break;
#else
default:
Abort( ImplGetSVEmptyStr() );
break;
#endif
}
return 0;
}
// -----------------------------------------------------------------------
void Application::Abort( const XubString& rErrorText )
{
SalAbort( rErrorText );
}
// -----------------------------------------------------------------------
sal_uLong Application::GetReservedKeyCodeCount()
{
return ImplReservedKeys::get()->second;
}
const KeyCode* Application::GetReservedKeyCode( sal_uLong i )
{
if( i >= GetReservedKeyCodeCount() )
return NULL;
else
return &ImplReservedKeys::get()->first[i].mKeyCode;
}
String Application::GetReservedKeyCodeDescription( sal_uLong i )
{
ResMgr* pResMgr = ImplGetResMgr();
if( ! pResMgr )
return String();
ImplReservedKey *pImplReservedKeys = ImplReservedKeys::get()->first;
if( i >= GetReservedKeyCodeCount() || ! pImplReservedKeys[i].mnResId )
return String();
else
return String( ResId( pImplReservedKeys[i].mnResId, *pResMgr ) );
}
// -----------------------------------------------------------------------
void Application::Execute()
{
DBG_STARTAPPEXECUTE();
ImplSVData* pSVData = ImplGetSVData();
pSVData->maAppData.mbInAppExecute = sal_True;
while ( !pSVData->maAppData.mbAppQuit )
Application::Yield();
pSVData->maAppData.mbInAppExecute = sal_False;
DBG_ENDAPPEXECUTE();
}
// -----------------------------------------------------------------------
inline void ImplYield( bool i_bWait, bool i_bAllEvents )
{
ImplSVData* pSVData = ImplGetSVData();
// run timers that have timed out
if ( !pSVData->mbNoCallTimer )
while ( pSVData->mbNotAllTimerCalled )
Timer::ImplTimerCallbackProc();
pSVData->maAppData.mnDispatchLevel++;
// do not wait for events if application was already quit; in that
// case only dispatch events already available
// do not wait for events either if the app decided that it is too busy for timers
// (feature added for the slideshow)
pSVData->mpDefInst->Yield( i_bWait && !pSVData->maAppData.mbAppQuit && !pSVData->maAppData.mbNoYield, i_bAllEvents );
pSVData->maAppData.mnDispatchLevel--;
// flush lazy deleted objects
if( pSVData->maAppData.mnDispatchLevel == 0 )
vcl::LazyDelete::flush();
// the system timer events will not necesseraly come in in non waiting mode
// e.g. on aqua; need to trigger timer checks manually
if( pSVData->maAppData.mbNoYield && !pSVData->mbNoCallTimer )
{
do
{
Timer::ImplTimerCallbackProc();
}
while( pSVData->mbNotAllTimerCalled );
}
// call post yield listeners
if( pSVData->maAppData.mpPostYieldListeners )
pSVData->maAppData.mpPostYieldListeners->callListeners( NULL );
}
// -----------------------------------------------------------------------
void Application::Reschedule( bool i_bAllEvents )
{
ImplYield( false, i_bAllEvents );
}
// -----------------------------------------------------------------------
void Application::Yield( bool i_bAllEvents )
{
ImplYield( true, i_bAllEvents );
}
// -----------------------------------------------------------------------
IMPL_STATIC_LINK_NOINSTANCE( ImplSVAppData, ImplQuitMsg, void*, EMPTYARG )
{
ImplGetSVData()->maAppData.mbAppQuit = sal_True;
return 0;
}
// -----------------------------------------------------------------------
void Application::Quit()
{
Application::PostUserEvent( STATIC_LINK( NULL, ImplSVAppData, ImplQuitMsg ) );
}
// -----------------------------------------------------------------------
vos::IMutex& Application::GetSolarMutex()
{
ImplSVData* pSVData = ImplGetSVData();
return *(pSVData->mpDefInst->GetYieldMutex());
}
// -----------------------------------------------------------------------
vos::OThread::TThreadIdentifier Application::GetMainThreadIdentifier()
{
return ImplGetSVData()->mnMainThreadId;
}
// -----------------------------------------------------------------------
sal_uLong Application::ReleaseSolarMutex()
{
ImplSVData* pSVData = ImplGetSVData();
return pSVData->mpDefInst->ReleaseYieldMutex();
}
// -----------------------------------------------------------------------
void Application::AcquireSolarMutex( sal_uLong nCount )
{
ImplSVData* pSVData = ImplGetSVData();
pSVData->mpDefInst->AcquireYieldMutex( nCount );
}
// -----------------------------------------------------------------------
sal_Bool Application::IsInMain()
{
return ImplGetSVData()->maAppData.mbInAppMain;
}
// -----------------------------------------------------------------------
sal_Bool Application::IsInExecute()
{
return ImplGetSVData()->maAppData.mbInAppExecute;
}
// -----------------------------------------------------------------------
sal_Bool Application::IsShutDown()
{
return ImplGetSVData()->maAppData.mbAppQuit;
}
// -----------------------------------------------------------------------
sal_Bool Application::IsInModalMode()
{
return (ImplGetSVData()->maAppData.mnModalMode != 0);
}
// -----------------------------------------------------------------------
sal_uInt16 Application::GetModalModeCount()
{
return ImplGetSVData()->maAppData.mnModalMode;
}
// -----------------------------------------------------------------------
sal_uInt16 Application::GetDispatchLevel()
{
return ImplGetSVData()->maAppData.mnDispatchLevel;
}
// -----------------------------------------------------------------------
sal_Bool Application::AnyInput( sal_uInt16 nType )
{
return (sal_Bool)ImplGetSVData()->mpDefInst->AnyInput( nType );
}
// -----------------------------------------------------------------------
sal_uLong Application::GetLastInputInterval()
{
return (Time::GetSystemTicks()-ImplGetSVData()->maAppData.mnLastInputTime);
}
// -----------------------------------------------------------------------
extern int nImplSysDialog;
sal_Bool Application::IsUICaptured()
{
ImplSVData* pSVData = ImplGetSVData();
// Wenn Mouse gecaptured, oder im TrackingModus oder im Auswahlmodus
// eines FloatingWindows (wie Menus, Aufklapp-ToolBoxen) soll kein
// weiteres Fenster aufgezogen werden
// D&D aktive !!!
if ( pSVData->maWinData.mpCaptureWin || pSVData->maWinData.mpTrackWin ||
pSVData->maWinData.mpFirstFloat || nImplSysDialog )
return sal_True;
else
return sal_False;
}
// -----------------------------------------------------------------------
sal_Bool Application::IsUserActive( sal_uInt16 nTest )
{
if ( nTest & (USERACTIVE_MOUSEDRAG | USERACTIVE_INPUT) )
{
if ( IsUICaptured() )
return sal_True;
}
if ( nTest & USERACTIVE_INPUT )
{
if ( GetLastInputInterval() < 500 )
return sal_True;
if ( AnyInput( INPUT_KEYBOARD ) )
return sal_True;
}
if ( nTest & USERACTIVE_MODALDIALOG )
{
if ( ImplGetSVData()->maAppData.mnModalDialog )
return sal_True;
}
return sal_False;
}
// -----------------------------------------------------------------------
void Application::SystemSettingsChanging( AllSettings& /*rSettings*/,
Window* /*pFrame*/ )
{
}
// -----------------------------------------------------------------------
void Application::MergeSystemSettings( AllSettings& rSettings )
{
Window* pWindow = ImplGetSVData()->maWinData.mpFirstFrame;
if( ! pWindow )
pWindow = ImplGetDefaultWindow();
if( pWindow )
{
ImplSVData* pSVData = ImplGetSVData();
if ( !pSVData->maAppData.mbSettingsInit )
{
// side effect: ImplUpdateGlobalSettings does an ImplGetFrame()->UpdateSettings
pWindow->ImplUpdateGlobalSettings( *pSVData->maAppData.mpSettings );
pSVData->maAppData.mbSettingsInit = sal_True;
}
// side effect: ImplUpdateGlobalSettings does an ImplGetFrame()->UpdateSettings
pWindow->ImplUpdateGlobalSettings( rSettings, sal_False );
}
}
// -----------------------------------------------------------------------
bool Application::ValidateSystemFont()
{
Window* pWindow = ImplGetSVData()->maWinData.mpFirstFrame;
if( ! pWindow )
pWindow = ImplGetDefaultWindow();
if( pWindow )
{
AllSettings aSettings;
pWindow->ImplGetFrame()->UpdateSettings( aSettings );
return pWindow->ImplCheckUIFont( aSettings.GetStyleSettings().GetAppFont() );
}
return false;
}
// -----------------------------------------------------------------------
void Application::SetSettings( const AllSettings& rSettings )
{
ImplSVData* pSVData = ImplGetSVData();
if ( !pSVData->maAppData.mpSettings )
{
GetSettings();
*pSVData->maAppData.mpSettings = rSettings;
ResMgr::SetDefaultLocale( rSettings.GetUILocale() );
}
else
{
AllSettings aOldSettings = *pSVData->maAppData.mpSettings;
if( aOldSettings.GetUILanguage() != rSettings.GetUILanguage() && pSVData->mpResMgr )
{
delete pSVData->mpResMgr;
pSVData->mpResMgr = NULL;
}
ResMgr::SetDefaultLocale( rSettings.GetUILocale() );
*pSVData->maAppData.mpSettings = rSettings;
sal_uLong nChangeFlags = aOldSettings.GetChangeFlags( *pSVData->maAppData.mpSettings );
if ( nChangeFlags )
{
DataChangedEvent aDCEvt( DATACHANGED_SETTINGS, &aOldSettings, nChangeFlags );
GetpApp()->DataChanged( aDCEvt );
// notify data change handler
ImplCallEventListeners( VCLEVENT_APPLICATION_DATACHANGED, NULL, &aDCEvt);
// Update all windows
Window* pFirstFrame = pSVData->maWinData.mpFirstFrame;
// Daten, die neu berechnet werden muessen, zuruecksetzen
long nOldDPIX = 0;
long nOldDPIY = 0;
if ( pFirstFrame )
{
nOldDPIX = pFirstFrame->mnDPIX;
nOldDPIY = pFirstFrame->mnDPIY;
pSVData->maGDIData.mnAppFontX = 0;
}
Window* pFrame = pFirstFrame;
while ( pFrame )
{
// AppFont-Cache-Daten zuruecksetzen
pFrame->mpWindowImpl->mpFrameData->meMapUnit = MAP_PIXEL;
// UpdateSettings am ClientWindow aufrufen, damit
// die Daten nicht doppelt geupdatet werden
Window* pClientWin = pFrame;
while ( pClientWin->ImplGetClientWindow() )
pClientWin = pClientWin->ImplGetClientWindow();
pClientWin->UpdateSettings( rSettings, sal_True );
Window* pTempWin = pFrame->mpWindowImpl->mpFrameData->mpFirstOverlap;
while ( pTempWin )
{
// UpdateSettings am ClientWindow aufrufen, damit
// die Daten nicht doppelt geupdatet werden
pClientWin = pTempWin;
while ( pClientWin->ImplGetClientWindow() )
pClientWin = pClientWin->ImplGetClientWindow();
pClientWin->UpdateSettings( rSettings, sal_True );
pTempWin = pTempWin->mpWindowImpl->mpNextOverlap;
}
pFrame = pFrame->mpWindowImpl->mpFrameData->mpNextFrame;
}
// Wenn sich die DPI-Aufloesung fuer Screen-Ausgaben
// geaendert hat, setzen wir auch bei allen
// Screen-Kompatiblen VirDev's die neue Aufloesung
pFirstFrame = pSVData->maWinData.mpFirstFrame;
if ( pFirstFrame )
{
if ( (pFirstFrame->mnDPIX != nOldDPIX) ||
(pFirstFrame->mnDPIY != nOldDPIY) )
{
VirtualDevice* pVirDev = pSVData->maGDIData.mpFirstVirDev;
while ( pVirDev )
{
if ( pVirDev->mbScreenComp &&
(pVirDev->mnDPIX == nOldDPIX) &&
(pVirDev->mnDPIY == nOldDPIY) )
{
pVirDev->mnDPIX = pFirstFrame->mnDPIX;
pVirDev->mnDPIY = pFirstFrame->mnDPIY;
if ( pVirDev->IsMapMode() )
{
MapMode aMapMode = pVirDev->GetMapMode();
pVirDev->SetMapMode();
pVirDev->SetMapMode( aMapMode );
}
}
pVirDev = pVirDev->mpNext;
}
}
}
}
}
}
// -----------------------------------------------------------------------
const AllSettings& Application::GetSettings()
{
ImplSVData* pSVData = ImplGetSVData();
if ( !pSVData->maAppData.mpSettings )
{
pSVData->maAppData.mpCfgListener = new LocaleConfigurationListener;
pSVData->maAppData.mpSettings = new AllSettings();
pSVData->maAppData.mpSettings->GetSysLocale().GetOptions().AddListener( pSVData->maAppData.mpCfgListener );
}
return *(pSVData->maAppData.mpSettings);
}
// -----------------------------------------------------------------------
void Application::NotifyAllWindows( DataChangedEvent& rDCEvt )
{
ImplSVData* pSVData = ImplGetSVData();
Window* pFrame = pSVData->maWinData.mpFirstFrame;
while ( pFrame )
{
pFrame->NotifyAllChilds( rDCEvt );
Window* pSysWin = pFrame->mpWindowImpl->mpFrameData->mpFirstOverlap;
while ( pSysWin )
{
pSysWin->NotifyAllChilds( rDCEvt );
pSysWin = pSysWin->mpWindowImpl->mpNextOverlap;
}
pFrame = pFrame->mpWindowImpl->mpFrameData->mpNextFrame;
}
}
// -----------------------------------------------------------------------
void Application::ImplCallEventListeners( sal_uLong nEvent, Window *pWin, void* pData )
{
ImplSVData* pSVData = ImplGetSVData();
VclWindowEvent aEvent( pWin, nEvent, pData );
if ( pSVData->maAppData.mpEventListeners )
if ( !pSVData->maAppData.mpEventListeners->empty() )
pSVData->maAppData.mpEventListeners->Call( &aEvent );
}
// -----------------------------------------------------------------------
void Application::ImplCallEventListeners( VclSimpleEvent* pEvent )
{
ImplSVData* pSVData = ImplGetSVData();
if ( pSVData->maAppData.mpEventListeners )
if ( !pSVData->maAppData.mpEventListeners->empty() )
pSVData->maAppData.mpEventListeners->Call( pEvent );
}
// -----------------------------------------------------------------------
void Application::AddEventListener( const Link& rEventListener )
{
ImplSVData* pSVData = ImplGetSVData();
if( !pSVData->maAppData.mpEventListeners )
pSVData->maAppData.mpEventListeners = new VclEventListeners;
pSVData->maAppData.mpEventListeners->push_back( rEventListener );
}
// -----------------------------------------------------------------------
void Application::RemoveEventListener( const Link& rEventListener )
{
ImplSVData* pSVData = ImplGetSVData();
if( pSVData->maAppData.mpEventListeners )
pSVData->maAppData.mpEventListeners->remove( rEventListener );
}
// -----------------------------------------------------------------------
void Application::AddKeyListener( const Link& rKeyListener )
{
ImplSVData* pSVData = ImplGetSVData();
if( !pSVData->maAppData.mpKeyListeners )
pSVData->maAppData.mpKeyListeners = new VclEventListeners;
pSVData->maAppData.mpKeyListeners->push_back( rKeyListener );
}
// -----------------------------------------------------------------------
void Application::RemoveKeyListener( const Link& rKeyListener )
{
ImplSVData* pSVData = ImplGetSVData();
if( pSVData->maAppData.mpKeyListeners )
pSVData->maAppData.mpKeyListeners->remove( rKeyListener );
}
// -----------------------------------------------------------------------
sal_Bool Application::HandleKey( sal_uLong nEvent, Window *pWin, KeyEvent* pKeyEvent )
{
// let listeners process the key event
VclWindowEvent aEvent( pWin, nEvent, (void *) pKeyEvent );
ImplSVData* pSVData = ImplGetSVData();
sal_Bool bProcessed = sal_False;
if ( pSVData->maAppData.mpKeyListeners )
if ( !pSVData->maAppData.mpKeyListeners->empty() )
bProcessed = pSVData->maAppData.mpKeyListeners->Process( &aEvent );
return bProcessed;
}
// -----------------------------------------------------------------------------
sal_uLong Application::PostKeyEvent( sal_uLong nEvent, Window *pWin, KeyEvent* pKeyEvent )
{
const ::vos::OGuard aGuard( GetSolarMutex() );
sal_uLong nEventId = 0;
if( pWin && pKeyEvent )
{
ImplPostEventData* pPostEventData = new ImplPostEventData( nEvent, pWin, *pKeyEvent );
PostUserEvent( nEventId,
STATIC_LINK( NULL, Application, PostEventHandler ),
pPostEventData );
if( nEventId )
{
pPostEventData->mnEventId = nEventId;
aPostedEventList.push_back( ImplPostEventPair( pWin, pPostEventData ) );
}
else
delete pPostEventData;
}
return nEventId;
}
// -----------------------------------------------------------------------------
sal_uLong Application::PostMouseEvent( sal_uLong nEvent, Window *pWin, MouseEvent* pMouseEvent )
{
const ::vos::OGuard aGuard( GetSolarMutex() );
sal_uLong nEventId = 0;
if( pWin && pMouseEvent )
{
Point aTransformedPos( pMouseEvent->GetPosPixel() );
aTransformedPos.X() += pWin->mnOutOffX;
aTransformedPos.Y() += pWin->mnOutOffY;
const MouseEvent aTransformedEvent( aTransformedPos, pMouseEvent->GetClicks(), pMouseEvent->GetMode(),
pMouseEvent->GetButtons(), pMouseEvent->GetModifier() );
ImplPostEventData* pPostEventData = new ImplPostEventData( nEvent, pWin, aTransformedEvent );
PostUserEvent( nEventId,
STATIC_LINK( NULL, Application, PostEventHandler ),
pPostEventData );
if( nEventId )
{
pPostEventData->mnEventId = nEventId;
aPostedEventList.push_back( ImplPostEventPair( pWin, pPostEventData ) );
}
else
delete pPostEventData;
}
return nEventId;
}
// -----------------------------------------------------------------------------
IMPL_STATIC_LINK_NOINSTANCE( Application, PostEventHandler, void*, pCallData )
{
const ::vos::OGuard aGuard( GetSolarMutex() );
ImplPostEventData* pData = static_cast< ImplPostEventData * >( pCallData );
const void* pEventData;
sal_uLong nEvent;
const sal_uLong nEventId = pData->mnEventId;
switch( pData->mnEvent )
{
case VCLEVENT_WINDOW_MOUSEMOVE:
nEvent = SALEVENT_EXTERNALMOUSEMOVE;
pEventData = &pData->maMouseEvent;
break;
case VCLEVENT_WINDOW_MOUSEBUTTONDOWN:
nEvent = SALEVENT_EXTERNALMOUSEBUTTONDOWN;
pEventData = &pData->maMouseEvent;
break;
case VCLEVENT_WINDOW_MOUSEBUTTONUP:
nEvent = SALEVENT_EXTERNALMOUSEBUTTONUP;
pEventData = &pData->maMouseEvent;
break;
case VCLEVENT_WINDOW_KEYINPUT:
nEvent = SALEVENT_EXTERNALKEYINPUT;
pEventData = &pData->maKeyEvent;
break;
case VCLEVENT_WINDOW_KEYUP:
nEvent = SALEVENT_EXTERNALKEYUP;
pEventData = &pData->maKeyEvent;
break;
default:
nEvent = 0;
pEventData = NULL;
break;
};
if( pData->mpWin && pData->mpWin->mpWindowImpl->mpFrameWindow && pEventData )
ImplWindowFrameProc( pData->mpWin->mpWindowImpl->mpFrameWindow, NULL, (sal_uInt16) nEvent, pEventData );
// remove this event from list of posted events, watch for destruction of internal data
::std::list< ImplPostEventPair >::iterator aIter( aPostedEventList.begin() );
while( aIter != aPostedEventList.end() )
{
if( nEventId == (*aIter).second->mnEventId )
{
delete (*aIter).second;
aIter = aPostedEventList.erase( aIter );
}
else
++aIter;
}
return 0;
}
// -----------------------------------------------------------------------
void Application::RemoveMouseAndKeyEvents( Window* pWin )
{
const ::vos::OGuard aGuard( GetSolarMutex() );
// remove all events for specific window, watch for destruction of internal data
::std::list< ImplPostEventPair >::iterator aIter( aPostedEventList.begin() );
while( aIter != aPostedEventList.end() )
{
if( pWin == (*aIter).first )
{
if( (*aIter).second->mnEventId )
RemoveUserEvent( (*aIter).second->mnEventId );
delete (*aIter).second;
aIter = aPostedEventList.erase( aIter );
}
else
++aIter;
}
}
// -----------------------------------------------------------------------
sal_Bool Application::IsProcessedMouseOrKeyEvent( sal_uLong nEventId )
{
const ::vos::OGuard aGuard( GetSolarMutex() );
// find event
::std::list< ImplPostEventPair >::iterator aIter( aPostedEventList.begin() );
while( aIter != aPostedEventList.end() )
{
if( (*aIter).second->mnEventId == nEventId )
return sal_False;
else
++aIter;
}
return sal_True;
}
// -----------------------------------------------------------------------
sal_uLong Application::PostUserEvent( sal_uLong nEvent, void* pEventData )
{
sal_uLong nEventId;
PostUserEvent( nEventId, nEvent, pEventData );
return nEventId;
}
// -----------------------------------------------------------------------
sal_uLong Application::PostUserEvent( const Link& rLink, void* pCaller )
{
sal_uLong nEventId;
PostUserEvent( nEventId, rLink, pCaller );
return nEventId;
}
// -----------------------------------------------------------------------
sal_Bool Application::PostUserEvent( sal_uLong& rEventId, sal_uLong nEvent, void* pEventData )
{
ImplSVEvent* pSVEvent = new ImplSVEvent;
pSVEvent->mnEvent = nEvent;
pSVEvent->mpData = pEventData;
pSVEvent->mpLink = NULL;
pSVEvent->mpWindow = NULL;
pSVEvent->mbCall = sal_True;
rEventId = (sal_uLong)pSVEvent;
Window* pDefWindow = ImplGetDefaultWindow();
if ( pDefWindow && pDefWindow->ImplGetFrame()->PostEvent( pSVEvent ) )
return sal_True;
else
{
rEventId = 0;
delete pSVEvent;
return sal_False;
}
}
// -----------------------------------------------------------------------
sal_Bool Application::PostUserEvent( sal_uLong& rEventId, const Link& rLink, void* pCaller )
{
ImplSVEvent* pSVEvent = new ImplSVEvent;
pSVEvent->mnEvent = 0;
pSVEvent->mpData = pCaller;
pSVEvent->mpLink = new Link( rLink );
pSVEvent->mpWindow = NULL;
pSVEvent->mbCall = sal_True;
rEventId = (sal_uLong)pSVEvent;
Window* pDefWindow = ImplGetDefaultWindow();
if ( pDefWindow && pDefWindow->ImplGetFrame()->PostEvent( pSVEvent ) )
return sal_True;
else
{
rEventId = 0;
delete pSVEvent;
return sal_False;
}
}
// -----------------------------------------------------------------------
void Application::RemoveUserEvent( sal_uLong nUserEvent )
{
if(nUserEvent)
{
ImplSVEvent* pSVEvent = (ImplSVEvent*)nUserEvent;
DBG_ASSERT( !pSVEvent->mpWindow,
"Application::RemoveUserEvent(): Event is send to a window" );
DBG_ASSERT( pSVEvent->mbCall,
"Application::RemoveUserEvent(): Event is already removed" );
if ( pSVEvent->mpWindow )
{
if( ! pSVEvent->maDelData.IsDelete() )
pSVEvent->mpWindow->ImplRemoveDel( &(pSVEvent->maDelData) );
pSVEvent->mpWindow = NULL;
}
pSVEvent->mbCall = sal_False;
}
}
// -----------------------------------------------------------------------
sal_Bool Application::InsertIdleHdl( const Link& rLink, sal_uInt16 nPrio )
{
ImplSVData* pSVData = ImplGetSVData();
// Falls er noch nicht existiert, dann anlegen
if ( !pSVData->maAppData.mpIdleMgr )
pSVData->maAppData.mpIdleMgr = new ImplIdleMgr;
return pSVData->maAppData.mpIdleMgr->InsertIdleHdl( rLink, nPrio );
}
// -----------------------------------------------------------------------
void Application::RemoveIdleHdl( const Link& rLink )
{
ImplSVData* pSVData = ImplGetSVData();
if ( pSVData->maAppData.mpIdleMgr )
pSVData->maAppData.mpIdleMgr->RemoveIdleHdl( rLink );
}
// -----------------------------------------------------------------------
void Application::EnableNoYieldMode( bool i_bNoYield )
{
ImplSVData* pSVData = ImplGetSVData();
pSVData->maAppData.mbNoYield = i_bNoYield;
}
// -----------------------------------------------------------------------
void Application::AddPostYieldListener( const Link& i_rListener )
{
ImplSVData* pSVData = ImplGetSVData();
if( ! pSVData->maAppData.mpPostYieldListeners )
pSVData->maAppData.mpPostYieldListeners = new VclEventListeners2();
pSVData->maAppData.mpPostYieldListeners->addListener( i_rListener );
}
// -----------------------------------------------------------------------
void Application::RemovePostYieldListener( const Link& i_rListener )
{
ImplSVData* pSVData = ImplGetSVData();
if( pSVData->maAppData.mpPostYieldListeners )
pSVData->maAppData.mpPostYieldListeners->removeListener( i_rListener );
}
// -----------------------------------------------------------------------
WorkWindow* Application::GetAppWindow()
{
return ImplGetSVData()->maWinData.mpAppWin;
}
// -----------------------------------------------------------------------
Window* Application::GetFocusWindow()
{
return ImplGetSVData()->maWinData.mpFocusWin;
}
// -----------------------------------------------------------------------
OutputDevice* Application::GetDefaultDevice()
{
return ImplGetDefaultWindow();
}
// -----------------------------------------------------------------------
Window* Application::GetFirstTopLevelWindow()
{
ImplSVData* pSVData = ImplGetSVData();
return pSVData->maWinData.mpFirstFrame;
}
// -----------------------------------------------------------------------
Window* Application::GetNextTopLevelWindow( Window* pWindow )
{
return pWindow->mpWindowImpl->mpFrameData->mpNextFrame;
}
// -----------------------------------------------------------------------
long Application::GetTopWindowCount()
{
long nRet = 0;
ImplSVData* pSVData = ImplGetSVData();
Window *pWin = pSVData ? pSVData->maWinData.mpFirstFrame : NULL;
while( pWin )
{
if( pWin->ImplGetWindow()->IsTopWindow() )
nRet++;
pWin = pWin->mpWindowImpl->mpFrameData->mpNextFrame;
}
return nRet;
}
// -----------------------------------------------------------------------
Window* Application::GetTopWindow( long nIndex )
{
long nIdx = 0;
ImplSVData* pSVData = ImplGetSVData();
Window *pWin = pSVData ? pSVData->maWinData.mpFirstFrame : NULL;
while( pWin )
{
if( pWin->ImplGetWindow()->IsTopWindow() )
{
if( nIdx == nIndex )
return pWin->ImplGetWindow();
else
nIdx++;
}
pWin = pWin->mpWindowImpl->mpFrameData->mpNextFrame;
}
return NULL;
}
// -----------------------------------------------------------------------
Window* Application::GetActiveTopWindow()
{
Window *pWin = ImplGetSVData()->maWinData.mpFocusWin;
while( pWin )
{
if( pWin->IsTopWindow() )
return pWin;
pWin = pWin->mpWindowImpl->mpParent;
}
return NULL;
}
// -----------------------------------------------------------------------
void Application::SetAppName( const XubString& rUniqueName )
{
ImplSVData* pSVData = ImplGetSVData();
// Falls er noch nicht existiert, dann anlegen
if ( !pSVData->maAppData.mpAppName )
pSVData->maAppData.mpAppName = new XubString( rUniqueName );
else
*(pSVData->maAppData.mpAppName) = rUniqueName;
}
// -----------------------------------------------------------------------
XubString Application::GetAppName()
{
ImplSVData* pSVData = ImplGetSVData();
if ( pSVData->maAppData.mpAppName )
return *(pSVData->maAppData.mpAppName);
else
return ImplGetSVEmptyStr();
}
// -----------------------------------------------------------------------
void Application::SetDisplayName( const UniString& rName )
{
ImplSVData* pSVData = ImplGetSVData();
// Falls er noch nicht existiert, dann anlegen
if ( !pSVData->maAppData.mpDisplayName )
pSVData->maAppData.mpDisplayName = new UniString( rName );
else
*(pSVData->maAppData.mpDisplayName) = rName;
}
// -----------------------------------------------------------------------
UniString Application::GetDisplayName()
{
ImplSVData* pSVData = ImplGetSVData();
if ( pSVData->maAppData.mpDisplayName )
return *(pSVData->maAppData.mpDisplayName);
else if ( pSVData->maWinData.mpAppWin )
return pSVData->maWinData.mpAppWin->GetText();
else
return ImplGetSVEmptyStr();
}
// -----------------------------------------------------------------------
unsigned int Application::GetScreenCount()
{
SalSystem* pSys = ImplGetSalSystem();
return pSys ? pSys->GetDisplayScreenCount() : 0;
}
rtl::OUString Application::GetScreenName( unsigned int nScreen )
{
SalSystem* pSys = ImplGetSalSystem();
return pSys ? pSys->GetScreenName( nScreen ) : rtl::OUString();
}
bool Application::IsMultiDisplay()
{
SalSystem* pSys = ImplGetSalSystem();
return pSys ? pSys->IsMultiDisplay() : false;
}
unsigned int Application::GetDefaultDisplayNumber()
{
SalSystem* pSys = ImplGetSalSystem();
return pSys ? pSys->GetDefaultDisplayNumber() : 0;
}
Rectangle Application::GetScreenPosSizePixel( unsigned int nScreen )
{
SalSystem* pSys = ImplGetSalSystem();
return pSys ? pSys->GetDisplayScreenPosSizePixel( nScreen ) : Rectangle();
}
Rectangle Application::GetWorkAreaPosSizePixel( unsigned int nScreen )
{
SalSystem* pSys = ImplGetSalSystem();
return pSys ? pSys->GetDisplayWorkAreaPosSizePixel( nScreen ) : Rectangle();
}
namespace {
unsigned long calcDistSquare( const Point& i_rPoint, const Rectangle& i_rRect )
{
const Point aRectCenter( (i_rRect.Left() + i_rRect.Right())/2,
(i_rRect.Top() + i_rRect.Bottom())/ 2 );
const long nDX = aRectCenter.X() - i_rPoint.X();
const long nDY = aRectCenter.Y() - i_rPoint.Y();
return nDX*nDX + nDY*nDY;
}
}
unsigned int Application::GetBestScreen( const Rectangle& i_rRect )
{
if( IsMultiDisplay() )
return GetDefaultDisplayNumber();
const unsigned int nScreens = GetScreenCount();
unsigned int nBestMatchScreen = 0;
unsigned long nOverlap = 0;
for( unsigned int i = 0; i < nScreens; i++ )
{
const Rectangle aCurScreenRect( GetScreenPosSizePixel( i ) );
// if a screen contains the rectangle completely it is obviously the best screen
if( aCurScreenRect.IsInside( i_rRect ) )
return i;
// next the screen which contains most of the area of the rect is the best
Rectangle aIntersection( aCurScreenRect.GetIntersection( i_rRect ) );
if( ! aIntersection.IsEmpty() )
{
const unsigned long nCurOverlap( aIntersection.GetWidth() * aIntersection.GetHeight() );
if( nCurOverlap > nOverlap )
{
nOverlap = nCurOverlap;
nBestMatchScreen = i;
}
}
}
if( nOverlap > 0 )
return nBestMatchScreen;
// finally the screen which center is nearest to the rect is the best
const Point aCenter( (i_rRect.Left() + i_rRect.Right())/2,
(i_rRect.Top() + i_rRect.Bottom())/2 );
unsigned long nDist = ULONG_MAX;
for( unsigned int i = 0; i < nScreens; i++ )
{
const Rectangle aCurScreenRect( GetScreenPosSizePixel( i ) );
const unsigned long nCurDist( calcDistSquare( aCenter, aCurScreenRect ) );
if( nCurDist < nDist )
{
nBestMatchScreen = i;
nDist = nCurDist;
}
}
return nBestMatchScreen;
}
// -----------------------------------------------------------------------
sal_Bool Application::InsertAccel( Accelerator* pAccel )
{
ImplSVData* pSVData = ImplGetSVData();
if ( !pSVData->maAppData.mpAccelMgr )
pSVData->maAppData.mpAccelMgr = new ImplAccelManager();
return pSVData->maAppData.mpAccelMgr->InsertAccel( pAccel );
}
// -----------------------------------------------------------------------
void Application::RemoveAccel( Accelerator* pAccel )
{
ImplSVData* pSVData = ImplGetSVData();
if ( pSVData->maAppData.mpAccelMgr )
pSVData->maAppData.mpAccelMgr->RemoveAccel( pAccel );
}
// -----------------------------------------------------------------------
void Application::FlushAccel()
{
ImplSVData* pSVData = ImplGetSVData();
if ( pSVData->maAppData.mpAccelMgr )
pSVData->maAppData.mpAccelMgr->FlushAccel();
}
// -----------------------------------------------------------------------
sal_Bool Application::CallAccel( const KeyCode& rKeyCode, sal_uInt16 nRepeat )
{
ImplSVData* pSVData = ImplGetSVData();
if ( pSVData->maAppData.mpAccelMgr )
{
if ( pSVData->maAppData.mpAccelMgr->IsAccelKey( rKeyCode, nRepeat ) )
return sal_True;
}
return sal_False;
}
// -----------------------------------------------------------------------
void Application::SetHelp( Help* pHelp )
{
ImplGetSVData()->maAppData.mpHelp = pHelp;
}
// -----------------------------------------------------------------------
Help* Application::GetHelp()
{
return ImplGetSVData()->maAppData.mpHelp;
}
// -----------------------------------------------------------------------
void Application::EnableAutoHelpId( sal_Bool bEnabled )
{
ImplGetSVData()->maHelpData.mbAutoHelpId = bEnabled;
}
// -----------------------------------------------------------------------
sal_Bool Application::IsAutoHelpIdEnabled()
{
return ImplGetSVData()->maHelpData.mbAutoHelpId;
}
// -----------------------------------------------------------------------
void Application::EnableAutoMnemonic( sal_Bool bEnabled )
{
AllSettings aSettings = GetSettings();
StyleSettings aStyle = aSettings.GetStyleSettings();
aStyle.SetAutoMnemonic( bEnabled );
aSettings.SetStyleSettings( aStyle );
SetSettings( aSettings );
}
// -----------------------------------------------------------------------
sal_Bool Application::IsAutoMnemonicEnabled()
{
return GetSettings().GetStyleSettings().GetAutoMnemonic();
}
// -----------------------------------------------------------------------
void Application::SetDialogScaleX( short nScale )
{
ImplSVData* pSVData = ImplGetSVData();
pSVData->maAppData.mnDialogScaleX = nScale;
pSVData->maGDIData.mnAppFontX = pSVData->maGDIData.mnRealAppFontX;
if ( nScale )
pSVData->maGDIData.mnAppFontX += (pSVData->maGDIData.mnAppFontX*nScale)/100;
}
// -----------------------------------------------------------------------
short Application::GetDialogScaleX()
{
return ImplGetSVData()->maAppData.mnDialogScaleX;
}
// -----------------------------------------------------------------------
void Application::SetDefDialogParent( Window* pWindow )
{
ImplGetSVData()->maWinData.mpDefDialogParent = pWindow;
}
// -----------------------------------------------------------------------
Window* Application::GetDefDialogParent()
{
ImplSVData* pSVData = ImplGetSVData();
// #103442# find some useful dialog parent if there
// was no default set
// NOTE: currently even the default is not used
if( sal_False && pSVData->maWinData.mpDefDialogParent != NULL )
return pSVData->maWinData.mpDefDialogParent;
else
{
// always use the topmost parent of the candidate
// window to avoid using dialogs or floaters
// as DefDialogParent
// current focus frame
Window *pWin = NULL;
if( (pWin = pSVData->maWinData.mpFocusWin) != NULL )
{
while( pWin->mpWindowImpl && pWin->mpWindowImpl->mpParent )
pWin = pWin->mpWindowImpl->mpParent;
if( (pWin->mpWindowImpl->mnStyle & WB_INTROWIN) == 0 )
{
// check for corrupted window hierarchy, #122232#, may be we now crash somewhere else
if( !pWin->mpWindowImpl )
{
DBG_ERROR( "Window hierarchy corrupted!" );
pSVData->maWinData.mpFocusWin = NULL; // avoid further access
return NULL;
}
// MAV: before the implementation has used only decorated windows,
// but it is not true in case of ActiveX or plugin scenario,
// so this check is commented out
// if( pWin->mpWindowImpl->mpFrameWindow->GetStyle() & (WB_MOVEABLE | WB_SIZEABLE) )
return pWin->mpWindowImpl->mpFrameWindow->ImplGetWindow();
// else
// return NULL;
}
}
// last active application frame
if( NULL != (pWin = pSVData->maWinData.mpActiveApplicationFrame) )
{
return pWin->mpWindowImpl->mpFrameWindow->ImplGetWindow();
}
else
{
// first visible top window (may be totally wrong....)
pWin = pSVData->maWinData.mpFirstFrame;
while( pWin )
{
if( pWin->ImplGetWindow()->IsTopWindow() &&
pWin->mpWindowImpl->mbReallyVisible &&
(pWin->mpWindowImpl->mnStyle & WB_INTROWIN) == 0
)
{
while( pWin->mpWindowImpl->mpParent )
pWin = pWin->mpWindowImpl->mpParent;
return pWin->mpWindowImpl->mpFrameWindow->ImplGetWindow();
}
pWin = pWin->mpWindowImpl->mpFrameData->mpNextFrame;
}
// use the desktop
return NULL;
}
}
}
// -----------------------------------------------------------------------
void Application::EnableDialogCancel( sal_Bool bDialogCancel )
{
ImplGetSVData()->maAppData.mbDialogCancel = bDialogCancel;
}
// -----------------------------------------------------------------------
sal_Bool Application::IsDialogCancelEnabled()
{
return ImplGetSVData()->maAppData.mbDialogCancel;
}
// -----------------------------------------------------------------------
void Application::SetSystemWindowMode( sal_uInt16 nMode )
{
ImplGetSVData()->maAppData.mnSysWinMode = nMode;
}
// -----------------------------------------------------------------------
sal_uInt16 Application::GetSystemWindowMode()
{
return ImplGetSVData()->maAppData.mnSysWinMode;
}
// -----------------------------------------------------------------------
const String& Application::GetFontPath()
{
ImplSVData* pSVData = ImplGetSVData();
if( !pSVData->maAppData.mpFontPath )
{
if( const char* pFontPath = ::getenv( "SAL_FONTPATH_PRIVATE" ) )
pSVData->maAppData.mpFontPath = new String( String::CreateFromAscii( pFontPath ) );
}
if( pSVData->maAppData.mpFontPath )
return *(pSVData->maAppData.mpFontPath);
return ImplGetSVEmptyStr();
}
// -----------------------------------------------------------------------
void Application::SetFontPath( const String& rPath )
{
ImplSVData* pSVData = ImplGetSVData();
// if it doesn't exist create a new one
if( !pSVData->maAppData.mpFontPath )
pSVData->maAppData.mpFontPath = new String( rPath );
else
*(pSVData->maAppData.mpFontPath) = rPath;
}
// -----------------------------------------------------------------------
UniqueItemId Application::CreateUniqueId()
{
ImplSVData* pSVData = ImplGetSVData();
if ( !pSVData->maAppData.mpUniqueIdCont )
pSVData->maAppData.mpUniqueIdCont = new UniqueIdContainer( UNIQUEID_SV_BEGIN );
return pSVData->maAppData.mpUniqueIdCont->CreateId();
}
// -----------------------------------------------------------------------
::com::sun::star::uno::Reference< ::com::sun::star::awt::XToolkit > Application::GetVCLToolkit()
{
::com::sun::star::uno::Reference< ::com::sun::star::awt::XToolkit > xT;
UnoWrapperBase* pWrapper = Application::GetUnoWrapper( sal_True );
if ( pWrapper )
xT = pWrapper->GetVCLToolkit();
return xT;
}
// -----------------------------------------------------------------------
extern "C" { static void SAL_CALL thisModule() {} }
UnoWrapperBase* Application::GetUnoWrapper( sal_Bool bCreateIfNotExist )
{
ImplSVData* pSVData = ImplGetSVData();
static sal_Bool bAlreadyTriedToCreate = sal_False;
if ( !pSVData->mpUnoWrapper && bCreateIfNotExist && !bAlreadyTriedToCreate )
{
::rtl::OUString aLibName = ::vcl::unohelper::CreateLibraryName( "ootk", sal_True );
oslModule hTkLib = osl_loadModuleRelative(
&thisModule, aLibName.pData, SAL_LOADMODULE_DEFAULT );
if ( hTkLib )
{
::rtl::OUString aFunctionName( RTL_CONSTASCII_USTRINGPARAM( "CreateUnoWrapper" ) );
FN_TkCreateUnoWrapper fnCreateWrapper = (FN_TkCreateUnoWrapper)osl_getFunctionSymbol( hTkLib, aFunctionName.pData );
if ( fnCreateWrapper )
{
pSVData->mpUnoWrapper = fnCreateWrapper();
}
}
DBG_ASSERT( pSVData->mpUnoWrapper, "UnoWrapper could not be created!" );
bAlreadyTriedToCreate = sal_True;
}
return pSVData->mpUnoWrapper;
}
// -----------------------------------------------------------------------
void Application::SetUnoWrapper( UnoWrapperBase* pWrapper )
{
ImplSVData* pSVData = ImplGetSVData();
DBG_ASSERT( !pSVData->mpUnoWrapper, "SetUnoWrapper: Wrapper allready exists" );
pSVData->mpUnoWrapper = pWrapper;
}
// -----------------------------------------------------------------------
::com::sun::star::uno::Reference< ::com::sun::star::awt::XDisplayConnection > Application::GetDisplayConnection()
{
ImplSVData* pSVData = ImplGetSVData();
if( !pSVData->mxDisplayConnection.is() )
{
pSVData->mxDisplayConnection.set( new ::vcl::DisplayConnection );
pSVData->mxDisplayConnection->start();
}
return pSVData->mxDisplayConnection.get();
}
// -----------------------------------------------------------------------
void Application::SetFilterHdl( const Link& rLink )
{
ImplGetSVData()->maGDIData.mpGrfConverter->SetFilterHdl( rLink );
}
// -----------------------------------------------------------------------
const Link& Application::GetFilterHdl()
{
return ImplGetSVData()->maGDIData.mpGrfConverter->GetFilterHdl();
}
// -----------------------------------------------------------------------
sal_Bool ImplCallHotKey( const KeyCode& rKeyCode )
{
ImplSVData* pSVData = ImplGetSVData();
ImplHotKey* pHotKeyData = pSVData->maAppData.mpFirstHotKey;
while ( pHotKeyData )
{
if ( pHotKeyData->maKeyCode.IsDefinedKeyCodeEqual( rKeyCode ) )
{
pHotKeyData->maLink.Call( pHotKeyData->mpUserData );
return sal_True;
}
pHotKeyData = pHotKeyData->mpNext;
}
return sal_False;
}
// -----------------------------------------------------------------------
void ImplFreeHotKeyData()
{
ImplSVData* pSVData = ImplGetSVData();
ImplHotKey* pTempHotKeyData;
ImplHotKey* pHotKeyData = pSVData->maAppData.mpFirstHotKey;
while ( pHotKeyData )
{
pTempHotKeyData = pHotKeyData->mpNext;
delete pHotKeyData;
pHotKeyData = pTempHotKeyData;
}
pSVData->maAppData.mpFirstHotKey = NULL;
}
// -----------------------------------------------------------------------
sal_uIntPtr Application::AddHotKey( const KeyCode& rKeyCode, const Link& rLink, void* pData )
{
ImplSVData* pSVData = ImplGetSVData();
ImplHotKey* pHotKeyData = new ImplHotKey;
pHotKeyData->mpUserData = pData;
pHotKeyData->maKeyCode = rKeyCode;
pHotKeyData->maLink = rLink;
pHotKeyData->mpNext = pSVData->maAppData.mpFirstHotKey;
pSVData->maAppData.mpFirstHotKey = pHotKeyData;
return (sal_uIntPtr)pHotKeyData;
}
// -----------------------------------------------------------------------
void Application::RemoveHotKey( sal_uIntPtr nId )
{
ImplSVData* pSVData = ImplGetSVData();
ImplHotKey* pFindHotKeyData = (ImplHotKey*)nId;
ImplHotKey* pPrevHotKeyData = NULL;
ImplHotKey* pHotKeyData = pSVData->maAppData.mpFirstHotKey;
while ( pHotKeyData )
{
if ( pHotKeyData == pFindHotKeyData )
{
if ( pPrevHotKeyData )
pPrevHotKeyData->mpNext = pFindHotKeyData->mpNext;
else
pSVData->maAppData.mpFirstHotKey = pFindHotKeyData->mpNext;
delete pFindHotKeyData;
break;
}
pPrevHotKeyData = pHotKeyData;
pHotKeyData = pHotKeyData->mpNext;
}
DBG_ASSERT( pHotKeyData, "Application::RemoveHotKey() - HotKey is not added" );
}
// -----------------------------------------------------------------------
void ImplFreeEventHookData()
{
ImplSVData* pSVData = ImplGetSVData();
ImplEventHook* pTempEventHookData;
ImplEventHook* pEventHookData = pSVData->maAppData.mpFirstEventHook;
while ( pEventHookData )
{
pTempEventHookData = pEventHookData->mpNext;
delete pEventHookData;
pEventHookData = pTempEventHookData;
}
pSVData->maAppData.mpFirstEventHook = NULL;
}
// -----------------------------------------------------------------------
sal_uIntPtr Application::AddEventHook( VCLEventHookProc pProc, void* pData )
{
ImplSVData* pSVData = ImplGetSVData();
ImplEventHook* pEventHookData = new ImplEventHook;
pEventHookData->mpUserData = pData;
pEventHookData->mpProc = pProc;
pEventHookData->mpNext = pSVData->maAppData.mpFirstEventHook;
pSVData->maAppData.mpFirstEventHook = pEventHookData;
return (sal_uIntPtr)pEventHookData;
}
// -----------------------------------------------------------------------
void Application::RemoveEventHook( sal_uIntPtr nId )
{
ImplSVData* pSVData = ImplGetSVData();
ImplEventHook* pFindEventHookData = (ImplEventHook*)nId;
ImplEventHook* pPrevEventHookData = NULL;
ImplEventHook* pEventHookData = pSVData->maAppData.mpFirstEventHook;
while ( pEventHookData )
{
if ( pEventHookData == pFindEventHookData )
{
if ( pPrevEventHookData )
pPrevEventHookData->mpNext = pFindEventHookData->mpNext;
else
pSVData->maAppData.mpFirstEventHook = pFindEventHookData->mpNext;
delete pFindEventHookData;
break;
}
pPrevEventHookData = pEventHookData;
pEventHookData = pEventHookData->mpNext;
}
DBG_ASSERT( pEventHookData, "Application::RemoveEventHook() - EventHook is not added" );
}
// -----------------------------------------------------------------------
long Application::CallEventHooks( NotifyEvent& rEvt )
{
ImplSVData* pSVData = ImplGetSVData();
long nRet = 0;
ImplEventHook* pTempEventHookData;
ImplEventHook* pEventHookData = pSVData->maAppData.mpFirstEventHook;
while ( pEventHookData )
{
pTempEventHookData = pEventHookData->mpNext;
nRet = pEventHookData->mpProc( rEvt, pEventHookData->mpUserData );
if ( nRet )
break;
pEventHookData = pTempEventHookData;
}
return nRet;
}
// -----------------------------------------------------------------------
long Application::CallPreNotify( NotifyEvent& rEvt )
{
return ImplCallPreNotify( rEvt );
}
// -----------------------------------------------------------------------
long Application::CallEvent( NotifyEvent& rEvt )
{
return ImplCallEvent( rEvt );
}
// -----------------------------------------------------------------------
const LocaleDataWrapper& Application::GetAppLocaleDataWrapper()
{
return GetSettings().GetLocaleDataWrapper();
}
// -----------------------------------------------------------------------
void Application::EnableHeadlessMode( sal_Bool bEnable )
{
EnableDialogCancel( bEnable );
}
// -----------------------------------------------------------------------
sal_Bool Application::IsHeadlessModeEnabled()
{
return IsDialogCancelEnabled();
}
void Application::EnableConversionMode( bool bEnableConv )
{
ImplGetSVData()->maAppData.mbConversionMode = bEnableConv;
}
// -----------------------------------------------------------------------
bool Application::IsConversionModeEnabled()
{
return ImplGetSVData()->maAppData.mbConversionMode;
}
// -----------------------------------------------------------------------
void Application::ShowNativeErrorBox(const String& sTitle ,
const String& sMessage)
{
int btn = ImplGetSalSystem()->ShowNativeMessageBox (
sTitle,
sMessage,
SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK,
SALSYSTEM_SHOWNATIVEMSGBOX_BTN_OK);
if (btn != SALSYSTEM_SHOWNATIVEMSGBOX_BTN_OK) {
OSL_TRACE("ShowNativeMessageBox returned %d\n", btn);
}
}
// -----------------------------------------------------------------------
bool Application::CanToggleImeStatusWindow()
{
ImplSVData* pSVData = ImplGetSVData();
if( ! pSVData->mpImeStatus )
pSVData->mpImeStatus = pSVData->mpDefInst->CreateI18NImeStatus();
return pSVData->mpImeStatus->canToggle();
}
void Application::ShowImeStatusWindow(bool bShow)
{
ImplGetSVData()->maAppData.meShowImeStatusWindow = bShow
? ImplSVAppData::ImeStatusWindowMode_SHOW
: ImplSVAppData::ImeStatusWindowMode_HIDE;
ImplSVData* pSVData = ImplGetSVData();
if( ! pSVData->mpImeStatus )
pSVData->mpImeStatus = pSVData->mpDefInst->CreateI18NImeStatus();
pSVData->mpImeStatus->toggle();
}
bool Application::GetShowImeStatusWindowDefault()
{
rtl_TextEncodingInfo aInfo;
aInfo.StructSize = sizeof aInfo;
return rtl_getTextEncodingInfo(osl_getThreadTextEncoding(), &aInfo)
&& aInfo.MaximumCharSize > 1;
}
const ::rtl::OUString& Application::GetDesktopEnvironment()
{
return SalGetDesktopEnvironment();
}
void Application::AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType)
{
ImplSVData* pSVData = ImplGetSVData();
pSVData->mpDefInst->AddToRecentDocumentList(rFileUrl, rMimeType);
}
sal_Bool Application::IsAccessibilityEnabled()
{
#ifdef WNT
return IsWNTInitAccessBridge();
#else
return sal_False;
#endif
}
sal_Bool InitAccessBridge( sal_Bool bShowCancel, sal_Bool &rCancelled )
{
sal_Bool bRet = true;
// Disable Java bridge on UNIX and OS/2
#ifndef WNT
(void) bShowCancel; // unsued
(void) rCancelled; // unused
#else
// Checking HasAtHook() was introduced with IBM's IA2 CWS.
if( HasAtHook() )
{
bRet = ImplInitAccessBridge( bShowCancel, rCancelled );
if( !bRet && bShowCancel && !rCancelled )
{
// disable accessibility if the user chooses to continue
AllSettings aSettings = Application::GetSettings();
MiscSettings aMisc = aSettings.GetMiscSettings();
aMisc.SetEnableATToolSupport( sal_False );
aSettings.SetMiscSettings( aMisc );
Application::SetSettings( aSettings );
}
}
else
{
bRet = false;
}
#endif // !UNX
return bRet;
}
#ifdef WNT
sal_Bool HasAtHook()
{
sal_Int32 bIsRuning=0;
// BOOL WINAPI SystemParametersInfo(
// __in UINT uiAction,
// __in UINT uiParam,
// __inout PVOID pvParam,
// __in UINT fWinIni
// );
// pvParam must be BOOL (defined in MFC as int)
// End
if(SystemParametersInfo(SPI_GETSCREENREADER,0,&bIsRuning,0))
{
if( bIsRuning )
return sal_True;
}
return sal_False;
}
#endif
// MT: AppProperty, AppEvent was in oldsv.cxx, but is still needed...
// ------------------------------------------------------------------------
TYPEINIT0(ApplicationProperty)
// ------------------------------------------------------------------------
static PropertyHandler* pHandler=NULL;
void Application::Property( ApplicationProperty& rProp )
{
if ( pHandler )
pHandler->Property( rProp );
}
void Application::SetPropertyHandler( PropertyHandler* p )
{
if ( pHandler )
delete pHandler;
pHandler = p;
}
bool Application::EnableAccessInterface(bool bEnable)
{
#ifdef WNT
return WNTEnableAccessInterface(bEnable);
#else
bEnable = true; // avoid compiler warning
return true;
#endif
}
bool Application::IsEnableAccessInterface()
{
return ImplGetSVData()->maAppData.m_bEnableAccessInterface;
}
void Application::AppEvent( const ApplicationEvent& /*rAppEvent*/ )
{
}