You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
241 lines
7.9 KiB
241 lines
7.9 KiB
// <file> |
|
// <copyright see="prj:///doc/copyright.txt">2002-2005 AlphaSierraPapa</copyright> |
|
// <license see="prj:///doc/license.txt">GNU General Public License</license> |
|
// <owner name="Mike Krüger" email="mike@icsharpcode.net"/> |
|
// <version>$Revision$</version> |
|
// </file> |
|
|
|
using System; |
|
using System.IO; |
|
using System.Diagnostics; |
|
using System.Reflection; |
|
using System.Drawing; |
|
using System.Collections; |
|
using System.Collections.Generic; |
|
using System.Windows.Forms; |
|
using System.Resources; |
|
using System.Xml; |
|
using System.Threading; |
|
using System.Runtime.Remoting; |
|
using System.Security.Policy; |
|
|
|
using ICSharpCode.Core; |
|
using ICSharpCode.SharpDevelop.Commands; |
|
using ICSharpCode.SharpDevelop.Gui; |
|
using ICSharpCode.SharpDevelop.Project; |
|
|
|
namespace ICSharpCode.SharpDevelop |
|
{ |
|
/// <summary> |
|
/// This Class is the Core main class, it starts the program. |
|
/// </summary> |
|
public class SharpDevelopMain |
|
{ |
|
static string[] commandLineArgs = null; |
|
|
|
public static string[] CommandLineArgs { |
|
get { |
|
return commandLineArgs; |
|
} |
|
} |
|
|
|
static void ShowErrorBox(object sender, ThreadExceptionEventArgs e) |
|
{ |
|
LoggingService.Error("ThreadException caught", e.Exception); |
|
ShowErrorBox(e.Exception, null); |
|
} |
|
|
|
static void ShowErrorBox(object sender, UnhandledExceptionEventArgs e) |
|
{ |
|
Exception ex = e.ExceptionObject as Exception; |
|
LoggingService.Fatal("UnhandledException caught", ex); |
|
if (e.IsTerminating) |
|
LoggingService.Fatal("Runtime is terminating because of unhandled exception."); |
|
ShowErrorBox(ex, "Unhandled exception", e.IsTerminating); |
|
} |
|
|
|
static void ShowErrorBox(Exception exception, string message) |
|
{ |
|
ShowErrorBox(exception, message, false); |
|
} |
|
|
|
static void ShowErrorBox(Exception exception, string message, bool mustTerminate) |
|
{ |
|
try { |
|
using (ExceptionBox box = new ExceptionBox(exception, message, mustTerminate)) { |
|
try { |
|
box.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm); |
|
} catch (InvalidOperationException) { |
|
box.ShowDialog(); |
|
} |
|
} |
|
} catch (Exception ex) { |
|
LoggingService.Warn("Error showing ExceptionBox", ex); |
|
MessageBox.Show(exception.ToString()); |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// Starts the core of SharpDevelop. |
|
/// </summary> |
|
[STAThread()] |
|
public static void Main(string[] args) |
|
{ |
|
#if DEBUG |
|
if (Debugger.IsAttached) { |
|
Run(args); |
|
return; |
|
} |
|
#endif |
|
// Do not use LoggingService here (see comment in Run(string[])) |
|
try { |
|
Run(args); |
|
} catch (Exception ex) { |
|
HandleMainException(ex); |
|
} |
|
} |
|
|
|
static void HandleMainException(Exception ex) |
|
{ |
|
LoggingService.Fatal(ex); |
|
try { |
|
Application.Run(new ExceptionBox(ex, "Unhandled exception terminated SharpDevelop", true)); |
|
} catch { |
|
MessageBox.Show(ex.ToString(), "Critical error (cannot use ExceptionBox)"); |
|
} |
|
} |
|
|
|
static void Run(string[] args) |
|
{ |
|
// DO NOT USE LoggingService HERE! |
|
// LoggingService requires ICSharpCode.Core.dll and log4net.dll |
|
// When a method containing a call to LoggingService is JITted, the |
|
// libraries are loaded. |
|
// We want to show the SplashScreen while those libraries are loaded, so |
|
// don't call LoggingService. |
|
|
|
#if DEBUG |
|
Control.CheckForIllegalCrossThreadCalls = true; |
|
#endif |
|
commandLineArgs = args; |
|
bool noLogo = false; |
|
|
|
SplashScreenForm.SetCommandLineArgs(args); |
|
|
|
foreach (string parameter in SplashScreenForm.GetParameterList()) { |
|
switch (parameter.ToUpper()) { |
|
case "NOLOGO": |
|
noLogo = true; |
|
break; |
|
} |
|
} |
|
|
|
if (!noLogo) { |
|
SplashScreenForm.SplashScreen.Show(); |
|
} |
|
try { |
|
RunApplication(); |
|
} finally { |
|
if (SplashScreenForm.SplashScreen != null) { |
|
SplashScreenForm.SplashScreen.Dispose(); |
|
} |
|
} |
|
} |
|
|
|
static void RunApplication() |
|
{ |
|
LoggingService.Info("Starting SharpDevelop..."); |
|
try { |
|
#if DEBUG |
|
if (!Debugger.IsAttached) { |
|
#endif |
|
Application.ThreadException += ShowErrorBox; |
|
AppDomain.CurrentDomain.UnhandledException += ShowErrorBox; |
|
#if DEBUG |
|
} |
|
#else |
|
MessageService.CustomErrorReporter = ShowErrorBox; |
|
#endif |
|
|
|
RegisterDoozers(); |
|
|
|
InitializeCore(); |
|
|
|
// finally start the workbench. |
|
try { |
|
LoggingService.Info("Starting workbench..."); |
|
new StartWorkbenchCommand().Run(SplashScreenForm.GetRequestedFileList()); |
|
} finally { |
|
LoggingService.Info("Unloading services..."); |
|
ProjectService.CloseSolution(); |
|
FileService.Unload(); |
|
PropertyService.Save(); |
|
} |
|
} finally { |
|
LoggingService.Info("Leaving RunApplication()"); |
|
} |
|
} |
|
|
|
static void RegisterDoozers() |
|
{ |
|
AddInTree.ConditionEvaluators.Add("ActiveContentExtension", new ActiveContentExtensionConditionEvaluator()); |
|
AddInTree.ConditionEvaluators.Add("ActiveViewContentUntitled", new ActiveViewContentUntitledConditionEvaluator()); |
|
AddInTree.ConditionEvaluators.Add("ActiveWindowState", new ActiveWindowStateConditionEvaluator()); |
|
AddInTree.ConditionEvaluators.Add("CombineOpen", new CombineOpenConditionEvaluator()); |
|
AddInTree.ConditionEvaluators.Add("DebuggerSupports", new DebuggerSupportsConditionEvaluator()); |
|
AddInTree.ConditionEvaluators.Add("IsProcessRunning", new IsProcessRunningConditionEvaluator()); |
|
AddInTree.ConditionEvaluators.Add("OpenWindowState", new OpenWindowStateConditionEvaluator()); |
|
AddInTree.ConditionEvaluators.Add("WindowActive", new WindowActiveConditionEvaluator()); |
|
AddInTree.ConditionEvaluators.Add("WindowOpen", new WindowOpenConditionEvaluator()); |
|
AddInTree.ConditionEvaluators.Add("ProjectActive", new ProjectActiveConditionEvaluator()); |
|
AddInTree.ConditionEvaluators.Add("ProjectOpen", new ProjectOpenConditionEvaluator()); |
|
AddInTree.ConditionEvaluators.Add("TextContent", new ICSharpCode.SharpDevelop.DefaultEditor.Conditions.TextContentConditionEvaluator()); |
|
AddInTree.ConditionEvaluators.Add("BrowserLocation", new ICSharpCode.SharpDevelop.BrowserDisplayBinding.BrowserLocationConditionEvaluator()); |
|
|
|
AddInTree.Doozers.Add("DialogPanel", new DialogPanelDoozer()); |
|
AddInTree.Doozers.Add("DisplayBinding", new DisplayBindingDoozer()); |
|
AddInTree.Doozers.Add("Pad", new PadDoozer()); |
|
AddInTree.Doozers.Add("LanguageBinding", new LanguageBindingDoozer()); |
|
AddInTree.Doozers.Add("Parser", new ParserDoozer()); |
|
AddInTree.Doozers.Add("EditAction", new ICSharpCode.SharpDevelop.DefaultEditor.Codons.EditActionDoozer()); |
|
AddInTree.Doozers.Add("SyntaxMode", new ICSharpCode.SharpDevelop.DefaultEditor.Codons.SyntaxModeDoozer()); |
|
AddInTree.Doozers.Add("BrowserSchemeExtension", new ICSharpCode.SharpDevelop.BrowserDisplayBinding.SchemeExtensionDoozer()); |
|
AddInTree.Doozers.Add("CodeCompletionBinding", new ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.CodeCompletionBindingDoozer()); |
|
AddInTree.Doozers.Add("Debugger", new DebuggerDoozer()); |
|
|
|
MenuCommand.LinkCommandCreator = delegate(string link) { return new LinkCommand(link); }; |
|
} |
|
|
|
static void InitializeCore() |
|
{ |
|
LoggingService.Info("Loading properties..."); |
|
PropertyService.Load(); |
|
|
|
StringParser.RegisterStringTagProvider(new SharpDevelopStringTagProvider()); |
|
|
|
LoggingService.Info("Loading AddInTree..."); |
|
AddInTree.Load(); |
|
|
|
LoggingService.Info("Initializing workbench..."); |
|
// .NET base autostarts |
|
// taken out of the add-in tree for performance reasons (every tick in startup counts) |
|
new InitializeWorkbenchCommand().Run(); |
|
|
|
// run workspace autostart commands |
|
try { |
|
LoggingService.Info("Running autostart commands..."); |
|
foreach (ICommand command in AddInTree.BuildItems("/Workspace/Autostart", null, false)) { |
|
command.Run(); |
|
} |
|
} catch (XmlException e) { |
|
LoggingService.Error("Could not load XML", e); |
|
MessageBox.Show("Could not load XML :" + Environment.NewLine + e.Message); |
|
return; |
|
} finally { |
|
if (SplashScreenForm.SplashScreen != null) { |
|
SplashScreenForm.SplashScreen.Dispose(); |
|
} |
|
} |
|
} |
|
} |
|
}
|
|
|