1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef _SV_SVAPP_HXX 25 #define _SV_SVAPP_HXX 26 27 #ifndef _VOS_THREAD_HXX 28 #include <vos/thread.hxx> 29 #endif 30 #include <tools/string.hxx> 31 #include <tools/link.hxx> 32 #include <tools/unqid.hxx> 33 #include <vcl/sv.h> 34 #include <vcl/dllapi.h> 35 #include <vcl/apptypes.hxx> 36 #ifndef _VCL_SETTINGS_HXX 37 #include <vcl/settings.hxx> 38 #endif 39 #include <vcl/vclevent.hxx> 40 class Link; 41 class AllSettings; 42 class DataChangedEvent; 43 class Accelerator; 44 class Help; 45 class OutputDevice; 46 class Window; 47 class WorkWindow; 48 class MenuBar; 49 class UnoWrapperBase; 50 class Reflection; 51 class KeyCode; 52 class NotifyEvent; 53 class KeyEvent; 54 class MouseEvent; 55 56 namespace vos { class IMutex; } 57 #include <com/sun/star/uno/Reference.h> 58 #include <com/sun/star/connection/XConnection.hpp> 59 60 namespace com { 61 namespace sun { 62 namespace star { 63 namespace lang { 64 class XMultiServiceFactory; 65 } 66 namespace awt { 67 class XToolkit; 68 class XDisplayConnection; 69 } 70 } } } 71 72 // helper needed by SalLayout implementations as well as svx/source/dialog/svxbmpnumbalueset.cxx 73 VCL_DLLPUBLIC sal_UCS4 GetMirroredChar( sal_UCS4 ); 74 75 // -------------------- 76 // - SystemWindowMode - 77 // -------------------- 78 79 #define SYSTEMWINDOW_MODE_NOAUTOMODE ((sal_uInt16)0x0001) 80 #define SYSTEMWINDOW_MODE_DIALOG ((sal_uInt16)0x0002) 81 82 // ------------- 83 // - EventHook - 84 // ------------- 85 86 typedef long (*VCLEventHookProc)( NotifyEvent& rEvt, void* pData ); 87 88 // -------------------- 89 // - ApplicationEvent - 90 // -------------------- 91 92 // Erstmal wieder eingebaut, damit AppEvents auf dem MAC funktionieren 93 #ifdef UNX 94 // enum Doppelt in daemon.cxx unter unix Achtung !!! 95 enum Service { SERVICE_OLE, SERVICE_APPEVENT, SERVICE_IPC }; 96 #endif 97 98 class VCL_DLLPUBLIC ApplicationAddress 99 { 100 friend class Application; 101 protected: 102 UniString aHostName; 103 UniString aDisplayName; 104 UniString aDomainName; 105 int nPID; 106 107 public: 108 ApplicationAddress(); 109 ApplicationAddress( const UniString& rDomain ); 110 ApplicationAddress( const UniString& rHost, 111 const UniString& rDisp, 112 const UniString& rDomain ); 113 ApplicationAddress( const UniString& rHost, int nPID ); 114 115 const UniString& GetHost() const { return aHostName; } 116 const UniString& GetDisplay() const { return aDisplayName; } 117 const UniString& GetDomain() const { return aDomainName; } 118 int GetPID() const { return nPID; } 119 120 sal_Bool IsConnectToSame( const ApplicationAddress& rAdr ) const; 121 }; 122 123 inline ApplicationAddress::ApplicationAddress() 124 { 125 nPID = 0; 126 } 127 128 inline ApplicationAddress::ApplicationAddress( const UniString& rDomain ) 129 { 130 aDomainName = rDomain; 131 nPID = 0; 132 } 133 134 inline ApplicationAddress::ApplicationAddress( const UniString& rHost, 135 const UniString& rDisp, 136 const UniString& rDomain ) 137 { 138 aHostName = rHost; 139 aDisplayName = rDisp; 140 aDomainName = rDomain; 141 nPID = 0; 142 } 143 144 inline ApplicationAddress::ApplicationAddress( const UniString& rHost, int nPIDPar ) 145 { 146 aHostName = rHost; 147 nPID = nPIDPar; 148 } 149 150 inline sal_Bool ApplicationAddress::IsConnectToSame( const ApplicationAddress& rAdr ) const 151 { 152 if ( nPID && ((nPID == rAdr.nPID) && (aHostName.Equals( rAdr.aHostName))) ) 153 return sal_True; 154 else 155 return sal_False; 156 } 157 158 #define APPEVENT_PARAM_DELIMITER '\n' 159 160 #define APPEVENT_OPEN_STRING "Open" 161 #define APPEVENT_PRINT_STRING "Print" 162 #define APPEVENT_DISKINSERT_STRING "DiskInsert" 163 #define APPEVENT_SAVEDOCUMENTS_STRING "SaveDocuments" 164 165 class VCL_DLLPUBLIC ApplicationEvent 166 { 167 private: 168 UniString aSenderAppName; // Absender Applikationsname 169 ByteString aEvent; // Event 170 UniString aData; // Uebertragene Daten 171 ApplicationAddress aAppAddr; // Absender Addresse 172 173 public: 174 ApplicationEvent() {} 175 ApplicationEvent( const UniString& rSenderAppName, 176 const ApplicationAddress& rAppAddr, 177 const ByteString& rEvent, 178 const UniString& rData ); 179 180 const UniString& GetSenderAppName() const { return aSenderAppName; } 181 const ByteString& GetEvent() const { return aEvent; } 182 const UniString& GetData() const { return aData; } 183 const ApplicationAddress& GetAppAddress() const { return aAppAddr; } 184 185 sal_Bool IsOpenEvent() const; 186 sal_Bool IsPrintEvent() const; 187 sal_Bool IsDiskInsertEvent() const; 188 189 sal_uInt16 GetParamCount() const { return aData.GetTokenCount( APPEVENT_PARAM_DELIMITER ); } 190 UniString GetParam( sal_uInt16 nParam ) const { return aData.GetToken( nParam, APPEVENT_PARAM_DELIMITER ); } 191 }; 192 193 inline ApplicationEvent::ApplicationEvent( const UniString& rSenderAppName, 194 const ApplicationAddress& rAppAddr, 195 const ByteString& rEvent, 196 const UniString& rData ) : 197 aSenderAppName( rSenderAppName ), 198 aEvent( rEvent ), 199 aData( rData ), 200 aAppAddr( rAppAddr ) 201 { 202 } 203 204 inline sal_Bool ApplicationEvent::IsOpenEvent() const 205 { 206 if ( aEvent.Equals( APPEVENT_OPEN_STRING )) 207 return sal_True; 208 else 209 return sal_False; 210 } 211 212 inline sal_Bool ApplicationEvent::IsPrintEvent() const 213 { 214 if ( aEvent.Equals( APPEVENT_PRINT_STRING )) 215 return sal_True; 216 else 217 return sal_False; 218 } 219 220 inline sal_Bool ApplicationEvent::IsDiskInsertEvent() const 221 { 222 if ( aEvent.Equals( APPEVENT_DISKINSERT_STRING )) 223 return sal_True; 224 else 225 return sal_False; 226 } 227 228 class VCL_DLLPUBLIC PropertyHandler 229 { 230 public: 231 virtual void Property( ApplicationProperty& ) = 0; 232 }; 233 234 // --------------- 235 // - Application - 236 // --------------- 237 238 class VCL_DLLPUBLIC Application 239 { 240 public: 241 Application(); 242 virtual ~Application(); 243 244 virtual void Main() = 0; 245 246 virtual sal_Bool QueryExit(); 247 248 virtual void UserEvent( sal_uLong nEvent, void* pEventData ); 249 250 virtual void ActivateExtHelp(); 251 virtual void DeactivateExtHelp(); 252 253 virtual void ShowStatusText( const XubString& rText ); 254 virtual void HideStatusText(); 255 256 virtual void ShowHelpStatusText( const XubString& rText ); 257 virtual void HideHelpStatusText(); 258 259 virtual void FocusChanged(); 260 virtual void DataChanged( const DataChangedEvent& rDCEvt ); 261 262 virtual void Init(); 263 virtual void DeInit(); 264 265 static void InitAppRes( const ResId& rResId ); 266 267 static sal_uInt16 GetCommandLineParamCount(); 268 static XubString GetCommandLineParam( sal_uInt16 nParam ); 269 static const XubString& GetAppFileName(); 270 271 virtual sal_uInt16 Exception( sal_uInt16 nError ); 272 static void Abort( const XubString& rErrorText ); 273 274 static void Execute(); 275 static void Quit(); 276 static void Reschedule( bool bAllEvents = false ); 277 static void Yield( bool bAllEvents = false ); 278 static void EndYield(); 279 static vos::IMutex& GetSolarMutex(); 280 static vos::OThread::TThreadIdentifier GetMainThreadIdentifier(); 281 static sal_uLong ReleaseSolarMutex(); 282 static void AcquireSolarMutex( sal_uLong nCount ); 283 static void EnableNoYieldMode( bool i_bNoYield ); 284 static void AddPostYieldListener( const Link& i_rListener ); 285 static void RemovePostYieldListener( const Link& i_rListener ); 286 287 static sal_Bool IsInMain(); 288 static sal_Bool IsInExecute(); 289 static sal_Bool IsShutDown(); 290 static sal_Bool IsInModalMode(); 291 static sal_uInt16 GetModalModeCount(); 292 293 static sal_uInt16 GetDispatchLevel(); 294 static sal_Bool AnyInput( sal_uInt16 nType = INPUT_ANY ); 295 static sal_uLong GetLastInputInterval(); 296 static sal_Bool IsUICaptured(); 297 static sal_Bool IsUserActive( sal_uInt16 nTest = USERACTIVE_ALL ); 298 299 virtual void SystemSettingsChanging( AllSettings& rSettings, 300 Window* pFrame ); 301 static void MergeSystemSettings( AllSettings& rSettings ); 302 /** validate that the currently selected system UI font is suitable 303 to display the application's UI. 304 305 A localized test string will be checked if it can be displayed 306 in the currently selected system UI font. If no glyphs are 307 missing it can be assumed that the font is proper for display 308 of the application's UI. 309 310 @returns 311 <TRUE/> if the system font is suitable for our UI 312 <FALSE/> if the test string could not be displayed with the system font 313 */ 314 static bool ValidateSystemFont(); 315 316 static void SetSettings( const AllSettings& rSettings ); 317 static const AllSettings& GetSettings(); 318 static void NotifyAllWindows( DataChangedEvent& rDCEvt ); 319 320 static void AddEventListener( const Link& rEventListener ); 321 static void RemoveEventListener( const Link& rEventListener ); 322 static void AddKeyListener( const Link& rKeyListener ); 323 static void RemoveKeyListener( const Link& rKeyListener ); 324 static void ImplCallEventListeners( sal_uLong nEvent, Window* pWin, void* pData ); 325 static void ImplCallEventListeners( VclSimpleEvent* pEvent ); 326 static sal_Bool HandleKey( sal_uLong nEvent, Window *pWin, KeyEvent* pKeyEvent ); 327 328 static sal_uLong PostKeyEvent( sal_uLong nEvent, Window *pWin, KeyEvent* pKeyEvent ); 329 static sal_uLong PostMouseEvent( sal_uLong nEvent, Window *pWin, MouseEvent* pMouseEvent ); 330 static void RemoveMouseAndKeyEvents( Window *pWin ); 331 static sal_Bool IsProcessedMouseOrKeyEvent( sal_uLong nEventId ); 332 333 static sal_uLong PostUserEvent( sal_uLong nEvent, void* pEventData = NULL ); 334 static sal_uLong PostUserEvent( const Link& rLink, void* pCaller = NULL ); 335 static sal_Bool PostUserEvent( sal_uLong& rEventId, sal_uLong nEvent, void* pEventData = NULL ); 336 static sal_Bool PostUserEvent( sal_uLong& rEventId, const Link& rLink, void* pCaller = NULL ); 337 static void RemoveUserEvent( sal_uLong nUserEvent ); 338 339 static sal_Bool InsertIdleHdl( const Link& rLink, sal_uInt16 nPriority ); 340 static void RemoveIdleHdl( const Link& rLink ); 341 342 virtual void AppEvent( const ApplicationEvent& rAppEvent ); 343 344 virtual void Property( ApplicationProperty& ); 345 void SetPropertyHandler( PropertyHandler* pHandler ); 346 347 #ifndef NO_GETAPPWINDOW 348 static WorkWindow* GetAppWindow(); 349 #endif 350 351 static Window* GetFocusWindow(); 352 static OutputDevice* GetDefaultDevice(); 353 354 static Window* GetFirstTopLevelWindow(); 355 static Window* GetNextTopLevelWindow( Window* pWindow ); 356 357 static long GetTopWindowCount(); 358 static Window* GetTopWindow( long nIndex ); 359 static Window* GetActiveTopWindow(); 360 361 static void SetAppName( const String& rUniqueName ); 362 static String GetAppName(); 363 364 static void SetDisplayName( const UniString& rDisplayName ); 365 static UniString GetDisplayName(); 366 367 static unsigned int GetScreenCount(); 368 // IsMultiDisplay returns: 369 // true: different screens are separate and windows cannot be moved 370 // between them (e.g. Xserver with multiple screens) 371 // false: screens form up one large display area 372 // windows can be moved between single screens 373 // (e.g. Xserver with Xinerama, Windows) 374 static bool IsMultiDisplay(); 375 static Rectangle GetScreenPosSizePixel( unsigned int nScreen ); 376 static Rectangle GetWorkAreaPosSizePixel( unsigned int nScreen ); 377 static rtl::OUString GetScreenName( unsigned int nScreen ); 378 static unsigned int GetDefaultDisplayNumber(); 379 // if IsMultiDisplay() == false the return value will be 380 // nearest screen of the target rectangle 381 // in case of IsMultiDisplay() == true the return value 382 // will always be GetDefaultDisplayNumber() 383 static unsigned int GetBestScreen( const Rectangle& ); 384 385 static const LocaleDataWrapper& GetAppLocaleDataWrapper(); 386 387 static sal_Bool InsertAccel( Accelerator* pAccel ); 388 static void RemoveAccel( Accelerator* pAccel ); 389 static void FlushAccel(); 390 static sal_Bool CallAccel( const KeyCode& rKeyCode, sal_uInt16 nRepeat = 0 ); 391 392 static sal_uLong AddHotKey( const KeyCode& rKeyCode, const Link& rLink, void* pData = NULL ); 393 static void RemoveHotKey( sal_uLong nId ); 394 static sal_uLong AddEventHook( VCLEventHookProc pProc, void* pData = NULL ); 395 static void RemoveEventHook( sal_uLong nId ); 396 static long CallEventHooks( NotifyEvent& rEvt ); 397 static long CallPreNotify( NotifyEvent& rEvt ); 398 static long CallEvent( NotifyEvent& rEvt ); 399 400 static void SetHelp( Help* pHelp = NULL ); 401 static Help* GetHelp(); 402 403 static void EnableAutoHelpId( sal_Bool bEnabled = sal_True ); 404 static sal_Bool IsAutoHelpIdEnabled(); 405 406 static void EnableAutoMnemonic( sal_Bool bEnabled = sal_True ); 407 static sal_Bool IsAutoMnemonicEnabled(); 408 409 static sal_uLong GetReservedKeyCodeCount(); 410 static const KeyCode* GetReservedKeyCode( sal_uLong i ); 411 static String GetReservedKeyCodeDescription( sal_uLong i ); 412 413 static void SetDefDialogParent( Window* pWindow ); 414 static Window* GetDefDialogParent(); 415 416 static void EnableDialogCancel( sal_Bool bDialogCancel = sal_True ); 417 static sal_Bool IsDialogCancelEnabled(); 418 419 static void SetSystemWindowMode( sal_uInt16 nMode ); 420 static sal_uInt16 GetSystemWindowMode(); 421 422 static void SetDialogScaleX( short nScale ); 423 static short GetDialogScaleX(); 424 425 static void SetFontPath( const String& rPath ); 426 static const String& GetFontPath(); 427 428 static UniqueItemId CreateUniqueId(); 429 430 static ::com::sun::star::uno::Reference< ::com::sun::star::awt::XDisplayConnection > GetDisplayConnection(); 431 432 // The global service manager has to be created before! 433 static ::com::sun::star::uno::Reference< ::com::sun::star::awt::XToolkit > GetVCLToolkit(); 434 static UnoWrapperBase* GetUnoWrapper( sal_Bool bCreateIfNotExists = sal_True ); 435 static void SetUnoWrapper( UnoWrapperBase* pWrapper ); 436 437 static void SetFilterHdl( const Link& rLink ); 438 static const Link& GetFilterHdl(); 439 440 static sal_Bool IsAccessibilityEnabled(); 441 442 static void EnableHeadlessMode( sal_Bool bEnable = sal_True ); 443 static sal_Bool IsHeadlessModeEnabled(); 444 445 static void EnableConversionMode( bool bEnableConv = true ); 446 static bool IsConversionModeEnabled(); 447 448 449 static void ShowNativeErrorBox(const String& sTitle , 450 const String& sMessage); 451 //IAccessibility2 Implementation 2009----- 452 static bool EnableAccessInterface(bool bEnable); 453 static bool IsEnableAccessInterface(); 454 //-----IAccessibility2 Implementation 2009 455 456 // IME Status Window Control: 457 458 /** Return true if any IME status window can be toggled on and off 459 externally. 460 461 Must only be called with the Solar mutex locked. 462 */ 463 static bool CanToggleImeStatusWindow(); 464 465 /** Toggle any IME status window on and off. 466 467 This only works if CanToggleImeStatusWinodw returns true (otherwise, 468 any calls of this method are ignored). 469 470 Must only be called with the Solar mutex locked. 471 */ 472 static void ShowImeStatusWindow(bool bShow); 473 474 /** Return true if any IME status window should be turned on by default 475 (this decision can be locale dependent, for example). 476 477 Can be called without the Solar mutex locked. 478 */ 479 static bool GetShowImeStatusWindowDefault(); 480 481 /** Returns a string representing the desktop environment 482 the process is currently running in. 483 */ 484 static const ::rtl::OUString& GetDesktopEnvironment(); 485 486 /** Add a file to the system shells recent document list if there is any. 487 This function may have no effect under Unix because there is no 488 standard API among the different desktop managers. 489 490 @param rFileUrl 491 The file url of the document. 492 493 @param rMimeType 494 The mime content type of the document specified by aFileUrl. 495 If an empty string will be provided "application/octet-stream" 496 will be used. 497 */ 498 static void AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType); 499 500 private: 501 502 DECL_STATIC_LINK( Application, PostEventHandler, void* ); 503 }; 504 505 VCL_DLLPUBLIC Application* GetpApp(); 506 507 VCL_DLLPUBLIC sal_Bool InitVCL( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & ); 508 VCL_DLLPUBLIC void DeInitVCL(); 509 510 VCL_DLLPUBLIC sal_Bool InitAccessBridge( sal_Bool bAllowCancel, sal_Bool &rCancelled ); 511 512 // only allowed to call, if no thread is running. You must call JoinMainLoopThread to free all memory. 513 VCL_DLLPUBLIC void CreateMainLoopThread( oslWorkerFunction pWorker, void * pThreadData ); 514 VCL_DLLPUBLIC void JoinMainLoopThread(); 515 516 inline void Application::EndYield() 517 { 518 PostUserEvent( Link() ); 519 } 520 521 //IAccessibility2 Implementation 2009----- 522 #ifdef WNT 523 VCL_DLLPUBLIC sal_Bool HasAtHook(); 524 VCL_DLLPUBLIC bool IsWNTInitAccessBridge(); 525 bool WNTEnableAccessInterface(bool bEnable); 526 527 class VCL_DLLPUBLIC CEnableAccessInterface 528 { 529 public: 530 CEnableAccessInterface(bool bEnable = false) 531 { 532 m_bIsEnableAccessInterface = Application::IsEnableAccessInterface(); 533 Application::EnableAccessInterface(bEnable); 534 } 535 ~CEnableAccessInterface() 536 { 537 Application::EnableAccessInterface(m_bIsEnableAccessInterface); 538 } 539 private: 540 bool m_bIsEnableAccessInterface; 541 }; 542 #endif 543 //-----IAccessibility2 Implementation 2009 544 #endif // _APP_HXX 545