// // System.Windows.Forms.Application // // Author: // stubbed out by Jaak Simm (jaaksimm@firm.ee) // Miguel de Icaza (miguel@ximian.com) // Dennis hayes (dennish@raytek.com) // WINELib implementation started by John Sohn (jsohn@columbus.rr.com) // // (C) Ximian, Inc 2002 // using System; using System.Drawing; using Microsoft.Win32; using System.ComponentModel; using System.Threading; using System.Globalization; using System.Reflection; using System.Collections; using System.Runtime.CompilerServices; namespace System.Windows.Forms { /// /// Provides static methods and properties to manage an application, /// such as methods to start and stop an application, to process /// Windows messages, and properties to get information about an /// application. This class cannot be inherited. /// [MonoTODO] public sealed class Application { static private ApplicationContext applicationContext = null; static private bool messageLoopStarted = false; static private bool messageLoopStopRequest = false; private static ArrayList messageFilters = new ArrayList (); // --- (public) Properties --- public static bool AllowQuit { // according to docs return false if embbedded in a // browser, not (yet?) embedded in a browser get { return true; } } [MonoTODO] public static string CommonAppDataPath { get { throw new NotImplementedException (); } } [MonoTODO] // Registry key not yet defined (this should be interesting) //public static RegistryKey CommonAppDataRegistry { // get { throw new NotImplementedException (); } //} [MonoTODO] public static string CompanyName { get { throw new NotImplementedException (); } } [MonoTODO] public static CultureInfo CurrentCulture { get { throw new NotImplementedException (); } set { throw new NotImplementedException (); } } [MonoTODO] public static InputLanguage CurrentInputLanguage { get { throw new NotImplementedException (); } } [MonoTODO] public static string ExecutablePath { get { throw new NotImplementedException (); } } [MonoTODO] public static string LocalUserAppDataPath { get { throw new NotImplementedException (); } } public static bool MessageLoop { get { return messageLoopStarted; } } [MonoTODO] public static string ProductName { get { throw new NotImplementedException (); } } [MonoTODO] public static string ProductVersion { get { throw new NotImplementedException (); } } [MonoTODO] public static string SafeTopLevelCaptionFormat { get { throw new NotImplementedException (); } set { throw new NotImplementedException (); } } [MonoTODO] public static string StartupPath { get { throw new NotImplementedException (); } } [MonoTODO] public static string UserAppDataPath { get { throw new NotImplementedException (); } } [MonoTODO] // Registry key not yet defined //public static RegistryKey UserAppDataRegistry { // get { throw new NotImplementedException (); } //} // --- Methods --- public static void AddMessageFilter (IMessageFilter value) { messageFilters.Add (value); } //Compact Framework public static void DoEvents () { Win32.MSG msg = new Win32.MSG(); while (Win32.PeekMessageA (ref msg, (IntPtr) 0, 0, 0, Win32.PM_REMOVE) != 0); } //Compact Framework public static void Exit () { Win32.PostQuitMessage (0); } public static void ExitThread () { messageLoopStopRequest = true; } [MonoTODO] public static ApartmentState OleRequired () { throw new NotImplementedException (); } [MonoTODO] public static void OnThreadException (Exception t) { throw new NotImplementedException (); } public static void RemoveMessageFilter (IMessageFilter value) { messageFilters.Remove (value); } static private void ApplicationFormClosed (object o, EventArgs args) { Win32.PostQuitMessage (0); } //Compact Framework static public void Run () { Win32.MSG msg = new Win32.MSG(); messageLoopStarted = true; while (!messageLoopStopRequest && Win32.GetMessageA (ref msg, 0, 0, 0) != 0) { bool dispatchMessage = true; Message message = new Message (); message.HWnd = msg.hwnd; message.Msg = (int) msg.message; message.WParam = msg.wParam; message.LParam = msg.lParam; IEnumerator e = messageFilters.GetEnumerator(); while (e.MoveNext()) { IMessageFilter filter = (IMessageFilter) e.Current; // if PreFilterMessage returns true // the message should not be dispatched if (filter.PreFilterMessage (ref message)) dispatchMessage = false; } if (dispatchMessage) { Win32.TranslateMessage (ref msg); Win32.DispatchMessageA (ref msg); } //if (Idle != null) //Idle (null, new EventArgs()); } //if (ApplicationExit != null) //ApplicationExit (null, new EventArgs()); } public static void Run (ApplicationContext context) { applicationContext = context; applicationContext.MainForm.Show (); applicationContext.MainForm.Closed += new EventHandler (ApplicationFormClosed); Run(); } //[TypeAttributes.BeforeFieldInit] public static void Run (Form form) // Documents say this parameter name should be mainform, // but the verifier says context. { form.CreateControl (); ApplicationContext context = new ApplicationContext ( form); Run (context); } // --- Events --- public static event EventHandler ApplicationExit; public static event EventHandler Idle; public static event ThreadExceptionEventHandler ThreadException; public static event EventHandler ThreadExit; } }