summaryrefslogtreecommitdiffstats
path: root/include/vcl/svapp.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'include/vcl/svapp.hxx')
-rw-r--r--include/vcl/svapp.hxx538
1 files changed, 538 insertions, 0 deletions
diff --git a/include/vcl/svapp.hxx b/include/vcl/svapp.hxx
new file mode 100644
index 000000000000..b4acc579ad94
--- /dev/null
+++ b/include/vcl/svapp.hxx
@@ -0,0 +1,538 @@
+/* -*- 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 .
+ */
+
+#ifndef _SV_SVAPP_HXX
+#define _SV_SVAPP_HXX
+
+#include <config_features.h>
+
+#include <sal/config.h>
+
+#include <stdexcept>
+
+#include <osl/thread.hxx>
+#include <osl/mutex.hxx>
+#include <tools/string.hxx>
+#include <tools/link.hxx>
+#include <tools/solar.h>
+#include <vcl/dllapi.h>
+#include <vcl/apptypes.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/vclevent.hxx>
+
+class BitmapEx;
+class Link;
+class AllSettings;
+class DataChangedEvent;
+class Accelerator;
+class Help;
+class OutputDevice;
+class Window;
+class WorkWindow;
+class MenuBar;
+class UnoWrapperBase;
+class Reflection;
+class KeyCode;
+class NotifyEvent;
+class KeyEvent;
+class MouseEvent;
+class ZoomEvent;
+class ScrollEvent;
+
+#include <com/sun/star/uno/Reference.h>
+#include <com/sun/star/connection/XConnection.hpp>
+
+namespace com {
+namespace sun {
+namespace star {
+namespace uno {
+ class XComponentContext;
+}
+namespace ui {
+ namespace dialogs {
+ class XFilePicker2;
+ class XFolderPicker2;
+ }
+}
+namespace awt {
+ class XToolkit;
+ class XDisplayConnection;
+}
+} } }
+
+// helper needed by SalLayout implementations as well as svx/source/dialog/svxbmpnumbalueset.cxx
+VCL_DLLPUBLIC sal_UCS4 GetMirroredChar( sal_UCS4 );
+VCL_DLLPUBLIC sal_UCS4 GetLocalizedChar( sal_UCS4, LanguageType );
+
+#define SYSTEMWINDOW_MODE_NOAUTOMODE ((sal_uInt16)0x0001)
+#define SYSTEMWINDOW_MODE_DIALOG ((sal_uInt16)0x0002)
+
+typedef long (*VCLEventHookProc)( NotifyEvent& rEvt, void* pData );
+
+// ATTENTION: ENUM duplicate in daemon.cxx under Unix!
+
+#ifdef UNX
+enum Service { SERVICE_OLE, SERVICE_APPEVENT, SERVICE_IPC };
+#endif
+
+class VCL_DLLPUBLIC ApplicationEvent
+{
+public:
+ enum Type {
+ TYPE_ACCEPT, TYPE_APPEAR, TYPE_HELP, TYPE_VERSION, TYPE_OPEN,
+ TYPE_OPENHELPURL, TYPE_PRINT, TYPE_PRIVATE_DOSHUTDOWN, TYPE_QUICKSTART,
+ TYPE_SHOWDIALOG, TYPE_UNACCEPT
+ };
+
+ ApplicationEvent() {}
+
+ explicit ApplicationEvent(
+ Type rEvent, const OUString& rData = OUString()):
+ aEvent(rEvent),
+ aData(rData)
+ {}
+
+ Type GetEvent() const { return aEvent; }
+ const OUString& GetData() const { return aData; }
+
+private:
+ Type aEvent;
+ OUString aData;
+};
+
+
+class VCL_DLLPUBLIC Application
+{
+public:
+ enum DialogCancelMode {
+ DIALOG_CANCEL_OFF, ///< do not automatically cancel dialogs
+ DIALOG_CANCEL_SILENT, ///< silently cancel any dialogs
+ DIALOG_CANCEL_FATAL
+ ///< cancel any dialogs by throwing a DialogCancelledException
+ };
+
+ class VCL_DLLPUBLIC DialogCancelledException:
+ virtual public std::runtime_error
+ {
+ public:
+ explicit DialogCancelledException(char const * what_arg):
+ runtime_error(what_arg) {}
+
+ virtual ~DialogCancelledException() throw ();
+ };
+
+ Application();
+ virtual ~Application();
+
+ virtual int Main() = 0;
+
+ virtual sal_Bool QueryExit();
+
+ virtual void UserEvent( sal_uLong nEvent, void* pEventData );
+
+ virtual void FocusChanged();
+ virtual void DataChanged( const DataChangedEvent& rDCEvt );
+
+ virtual void Init();
+ virtual void InitFinished();
+ virtual void DeInit();
+
+ static sal_uInt16 GetCommandLineParamCount();
+ static XubString GetCommandLineParam( sal_uInt16 nParam );
+ static const XubString& GetAppFileName();
+
+ virtual sal_uInt16 Exception( sal_uInt16 nError );
+ static void Abort( const XubString& rErrorText );
+
+ static void Execute();
+ static void Quit();
+ static void Reschedule( bool bAllEvents = false );
+ static void Yield( bool bAllEvents = false );
+ static void EndYield();
+ static osl::SolarMutex& GetSolarMutex();
+ static oslThreadIdentifier GetMainThreadIdentifier();
+ static sal_uLong ReleaseSolarMutex();
+ static void AcquireSolarMutex( sal_uLong nCount );
+ static void EnableNoYieldMode( bool i_bNoYield );
+ static void AddPostYieldListener( const Link& i_rListener );
+ static void RemovePostYieldListener( const Link& i_rListener );
+
+ static sal_Bool IsInMain();
+ static sal_Bool IsInExecute();
+ static sal_Bool IsInModalMode();
+
+ static sal_uInt16 GetDispatchLevel();
+ static bool AnyInput( sal_uInt16 nType = VCL_INPUT_ANY );
+ static sal_uLong GetLastInputInterval();
+ static sal_Bool IsUICaptured();
+
+ virtual void SystemSettingsChanging( AllSettings& rSettings,
+ Window* pFrame );
+ static void MergeSystemSettings( AllSettings& rSettings );
+ /** validate that the currently selected system UI font is suitable
+ to display the application's UI.
+
+ A localized test string will be checked if it can be displayed
+ in the currently selected system UI font. If no glyphs are
+ missing it can be assumed that the font is proper for display
+ of the application's UI.
+
+ @returns
+ <TRUE/> if the system font is suitable for our UI
+ <FALSE/> if the test string could not be displayed with the system font
+ */
+ static bool ValidateSystemFont();
+
+ static void SetSettings( const AllSettings& rSettings );
+ static const AllSettings& GetSettings();
+ static void NotifyAllWindows( DataChangedEvent& rDCEvt );
+
+ static void AddEventListener( const Link& rEventListener );
+ static void RemoveEventListener( const Link& rEventListener );
+ static void AddKeyListener( const Link& rKeyListener );
+ static void RemoveKeyListener( const Link& rKeyListener );
+ static void ImplCallEventListeners( sal_uLong nEvent, Window* pWin, void* pData );
+ static void ImplCallEventListeners( VclSimpleEvent* pEvent );
+ static sal_Bool HandleKey( sal_uLong nEvent, Window *pWin, KeyEvent* pKeyEvent );
+
+ static sal_uLong PostKeyEvent( sal_uLong nEvent, Window *pWin, KeyEvent* pKeyEvent );
+ static sal_uLong PostMouseEvent( sal_uLong nEvent, Window *pWin, MouseEvent* pMouseEvent );
+#if !HAVE_FEATURE_DESKTOP
+ static sal_uLong PostZoomEvent( sal_uLong nEvent, Window *pWin, ZoomEvent* pZoomEvent );
+ static sal_uLong PostScrollEvent( sal_uLong nEvent, Window *pWin, ScrollEvent* pScrollEvent );
+#endif
+ static void RemoveMouseAndKeyEvents( Window *pWin );
+
+ static sal_uLong PostUserEvent( const Link& rLink, void* pCaller = NULL );
+ static sal_Bool PostUserEvent( sal_uLong& rEventId, const Link& rLink, void* pCaller = NULL );
+ static void RemoveUserEvent( sal_uLong nUserEvent );
+
+ static sal_Bool InsertIdleHdl( const Link& rLink, sal_uInt16 nPriority );
+ static void RemoveIdleHdl( const Link& rLink );
+
+ virtual void AppEvent( const ApplicationEvent& rAppEvent );
+
+#ifndef NO_GETAPPWINDOW
+ static WorkWindow* GetAppWindow();
+#endif
+
+ static Window* GetFocusWindow();
+ static OutputDevice* GetDefaultDevice();
+
+ static Window* GetFirstTopLevelWindow();
+ static Window* GetNextTopLevelWindow( Window* pWindow );
+
+ static long GetTopWindowCount();
+ static Window* GetTopWindow( long nIndex );
+ static Window* GetActiveTopWindow();
+
+ static void SetAppName( const String& rUniqueName );
+ static String GetAppName();
+ static bool LoadBrandBitmap (const char* pName, BitmapEx &rBitmap);
+
+ // default name of the application for message dialogs and printing
+ static void SetDisplayName( const OUString& rDisplayName );
+ static OUString GetDisplayName();
+
+
+ static unsigned int GetScreenCount();
+ static Rectangle GetScreenPosSizePixel( unsigned int nScreen );
+
+ // IsUnifiedDisplay returns:
+ // true: screens form up one large display area
+ // windows can be moved between single screens
+ // (e.g. Xserver with Xinerama, Windows)
+ // false: different screens are separate and windows cannot be moved
+ // between them (e.g. Xserver with multiple screens)
+ static bool IsUnifiedDisplay();
+ // if IsUnifiedDisplay() == true the return value will be
+ // nearest screen of the target rectangle
+ // in case of IsUnifiedDisplay() == false the return value
+ // will always be GetDisplayDefaultScreen()
+ SAL_DLLPRIVATE static unsigned int GetBestScreen( const Rectangle& );
+ static Rectangle GetWorkAreaPosSizePixel( unsigned int nScreen );
+ // This returns the LCD screen number for a laptop, or the primary
+ // external VGA display for a desktop machine - it is where a presenter
+ // console should be rendered if there are other (non-built-in) screens
+ // present.
+ static unsigned int GetDisplayBuiltInScreen();
+ // Practically, this means - Get the screen we should run a presentation on.
+ static unsigned int GetDisplayExternalScreen();
+
+ static const LocaleDataWrapper& GetAppLocaleDataWrapper();
+
+ static sal_Bool InsertAccel( Accelerator* pAccel );
+ static void RemoveAccel( Accelerator* pAccel );
+
+ static long CallEventHooks( NotifyEvent& rEvt );
+
+ static void SetHelp( Help* pHelp = NULL );
+ static Help* GetHelp();
+
+ static void EnableAutoHelpId( sal_Bool bEnabled = sal_True );
+ static sal_Bool IsAutoHelpIdEnabled();
+
+ static void EnableAutoMnemonic( sal_Bool bEnabled = sal_True );
+ static sal_Bool IsAutoMnemonicEnabled();
+
+ static sal_uLong GetReservedKeyCodeCount();
+ static const KeyCode* GetReservedKeyCode( sal_uLong i );
+
+ static void SetDefDialogParent( Window* pWindow );
+ static Window* GetDefDialogParent();
+
+ static DialogCancelMode GetDialogCancelMode();
+ static void SetDialogCancelMode( DialogCancelMode mode );
+ static sal_Bool IsDialogCancelEnabled();
+
+ static void SetSystemWindowMode( sal_uInt16 nMode );
+ static sal_uInt16 GetSystemWindowMode();
+
+ static void SetDialogScaleX( short nScale );
+
+ static ::com::sun::star::uno::Reference< ::com::sun::star::awt::XDisplayConnection > GetDisplayConnection();
+
+ // The global service manager has to be created before!
+ static ::com::sun::star::uno::Reference< ::com::sun::star::awt::XToolkit > GetVCLToolkit();
+ static UnoWrapperBase* GetUnoWrapper( sal_Bool bCreateIfNotExists = sal_True );
+ static void SetUnoWrapper( UnoWrapperBase* pWrapper );
+
+ static void SetFilterHdl( const Link& rLink );
+ static const Link& GetFilterHdl();
+
+ static void EnableHeadlessMode( bool dialogsAreFatal );
+ static sal_Bool IsHeadlessModeEnabled();
+ static bool IsHeadlessModeRequested();
+ ///< check command line arguments for --headless
+
+ static void ShowNativeErrorBox(const String& sTitle ,
+ const String& sMessage);
+
+ // IME Status Window Control:
+
+ /** Return true if any IME status window can be toggled on and off
+ externally.
+
+ Must only be called with the Solar mutex locked.
+ */
+ static bool CanToggleImeStatusWindow();
+
+ /** Toggle any IME status window on and off.
+
+ This only works if CanToggleImeStatusWinodw returns true (otherwise,
+ any calls of this method are ignored).
+
+ Must only be called with the Solar mutex locked.
+ */
+ static void ShowImeStatusWindow(bool bShow);
+
+ /** Return true if any IME status window should be turned on by default
+ (this decision can be locale dependent, for example).
+
+ Can be called without the Solar mutex locked.
+ */
+ static bool GetShowImeStatusWindowDefault();
+
+ /** Returns a string representing the desktop environment
+ the process is currently running in.
+ */
+ static const OUString& GetDesktopEnvironment();
+
+ /** Add a file to the system shells recent document list if there is any.
+ This function may have no effect under Unix because there is no
+ standard API among the different desktop managers.
+
+ @param rFileUrl
+ The file url of the document.
+
+ @param rMimeType
+ The mime content type of the document specified by aFileUrl.
+ If an empty string will be provided "application/octet-stream"
+ will be used.
+ */
+ static void AddToRecentDocumentList(const OUString& rFileUrl, const OUString& rMimeType);
+
+ /** Do we have a native / system file selector available ?
+ */
+ static bool hasNativeFileSelection();
+
+ /** Create a platform specific file picker, if one is available,
+ otherwise return an empty reference
+ */
+ static com::sun::star::uno::Reference< com::sun::star::ui::dialogs::XFilePicker2 >
+ createFilePicker( const com::sun::star::uno::Reference<
+ com::sun::star::uno::XComponentContext >& rServiceManager );
+
+ /** Create a platform specific folder picker, if one is available,
+ otherwise return an empty reference
+ */
+ static com::sun::star::uno::Reference< com::sun::star::ui::dialogs::XFolderPicker2 >
+ createFolderPicker( const com::sun::star::uno::Reference<
+ com::sun::star::uno::XComponentContext >& rServiceManager );
+
+private:
+
+ DECL_STATIC_LINK( Application, PostEventHandler, void* );
+};
+
+
+class VCL_DLLPUBLIC SolarMutexGuard
+{
+ private:
+ SolarMutexGuard( const SolarMutexGuard& );
+ const SolarMutexGuard& operator = ( const SolarMutexGuard& );
+ ::osl::SolarMutex& m_solarMutex;
+
+ public:
+
+ /** Acquires the object specified as parameter.
+ */
+ SolarMutexGuard() :
+ m_solarMutex(Application::GetSolarMutex())
+ {
+ m_solarMutex.acquire();
+ }
+
+ /** Releases the mutex or interface. */
+ ~SolarMutexGuard()
+ {
+ m_solarMutex.release();
+ }
+};
+
+class VCL_DLLPUBLIC SolarMutexClearableGuard
+{
+ SolarMutexClearableGuard( const SolarMutexClearableGuard& );
+ const SolarMutexClearableGuard& operator = ( const SolarMutexClearableGuard& );
+ bool m_bCleared;
+public:
+ /** Acquires mutex
+ @param pMutex pointer to mutex which is to be acquired */
+ SolarMutexClearableGuard()
+ : m_bCleared(false)
+ , m_solarMutex( Application::GetSolarMutex() )
+ {
+ m_solarMutex.acquire();
+ }
+
+ /** Releases mutex. */
+ virtual ~SolarMutexClearableGuard()
+ {
+ if( !m_bCleared )
+ {
+ m_solarMutex.release();
+ }
+ }
+
+ /** Releases mutex. */
+ void SAL_CALL clear()
+ {
+ if( !m_bCleared )
+ {
+ m_solarMutex.release();
+ m_bCleared = true;
+ }
+ }
+protected:
+ osl::SolarMutex& m_solarMutex;
+};
+
+class VCL_DLLPUBLIC SolarMutexResettableGuard
+{
+ SolarMutexResettableGuard( const SolarMutexResettableGuard& );
+ const SolarMutexResettableGuard& operator = ( const SolarMutexResettableGuard& );
+ bool m_bCleared;
+public:
+ /** Acquires mutex
+ @param pMutex pointer to mutex which is to be acquired */
+ SolarMutexResettableGuard()
+ : m_bCleared(false)
+ , m_solarMutex( Application::GetSolarMutex() )
+ {
+ m_solarMutex.acquire();
+ }
+
+ /** Releases mutex. */
+ virtual ~SolarMutexResettableGuard()
+ {
+ if( !m_bCleared )
+ {
+ m_solarMutex.release();
+ }
+ }
+
+ /** Releases mutex. */
+ void SAL_CALL clear()
+ {
+ if( !m_bCleared)
+ {
+ m_solarMutex.release();
+ m_bCleared = true;
+ }
+ }
+ /** Releases mutex. */
+ void SAL_CALL reset()
+ {
+ if( m_bCleared)
+ {
+ m_solarMutex.acquire();
+ m_bCleared = false;
+ }
+ }
+protected:
+ osl::SolarMutex& m_solarMutex;
+};
+
+
+/**
+ A helper class that calls Application::ReleaseSolarMutex() in its constructor
+ and restores the mutex in its destructor.
+*/
+class SolarMutexReleaser
+{
+ sal_uLong mnReleased;
+
+public:
+ SolarMutexReleaser(): mnReleased(Application::ReleaseSolarMutex()) {}
+
+ ~SolarMutexReleaser()
+ {
+ Application::AcquireSolarMutex( mnReleased );
+ }
+};
+
+VCL_DLLPUBLIC Application* GetpApp();
+
+VCL_DLLPUBLIC sal_Bool InitVCL();
+VCL_DLLPUBLIC void DeInitVCL();
+
+VCL_DLLPUBLIC bool InitAccessBridge( bool bAllowCancel, bool &rCancelled );
+
+// only allowed to call, if no thread is running. You must call JoinMainLoopThread to free all memory.
+VCL_DLLPUBLIC void CreateMainLoopThread( oslWorkerFunction pWorker, void * pThreadData );
+VCL_DLLPUBLIC void JoinMainLoopThread();
+
+inline void Application::EndYield()
+{
+ PostUserEvent( Link() );
+}
+
+#endif // _APP_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */