#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
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

// <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();
}
}
}
}
}