#region --- License --- /* Copyright (c) 2006, 2007 Stefanos Apostolopoulos * See license.txt for license info */ #endregion #region --- Using Directives --- using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Reflection; using System.Threading; using System.Diagnostics; using System.Security; using System.Security.Permissions; using System.Security.Policy; using System.IO; using OpenTK; #endregion namespace Examples { public partial class ExampleLauncher : Form { #region class ExampleInfo /// /// Contains the information necessary to display and launch an example thorugh the ExampleLauncer. /// class ExampleInfo { public string Name; public string Description; public Type Example; public ExampleInfo(string name, string description, Type example) { Name = name; Description = description; Example = example; } public override string ToString() { return Name; } } #endregion #region --- Constructor --- public ExampleLauncher() { InitializeComponent(); } #endregion #region public void ExampleLauncher_Load(object sender, EventArgs e) public void ExampleLauncher_Load(object sender, EventArgs e) { try { if (File.Exists("debug.log")) File.Delete("debug.log"); } catch (Exception expt) { MessageBox.Show("Could not access debug.log", expt.ToString()); } Debug.Listeners.Clear(); Debug.Listeners.Add(new TextWriterTraceListener("debug.log")); Debug.Listeners.Add(new ConsoleTraceListener()); Debug.AutoFlush = true; // Get all examples Type[] types = Assembly.GetExecutingAssembly().GetTypes(); StringBuilder sb = new StringBuilder(); foreach (Type type in types) { if (type.GetInterface("IExample") != null) { sb.Append(type.Namespace); sb.Replace("Examples.", String.Empty); sb.Append(" "); int order; try { FieldInfo info = type.GetField("order"); order = (int)info.GetValue(null); } catch (NullReferenceException nre) { Debug.Print("Example {0} does not have ordering info", type.FullName); order = 0; } if (order < 10) sb.Append("0"); // To keep items sorted nicely. sb.Append(order.ToString()); sb.Append(": "); sb.Append(type.Name); listBox1.Items.Add(new ExampleInfo(sb.ToString(), "", type)); // Clean the StringBuilder for the next pass. sb.Remove(0, sb.Length); } } // Select first item if (listBox1.Items.Count > 0) this.listBox1.SelectedIndex = 0; } #endregion private void RunExample() { if (listBox1.SelectedItem != null) { Type example = (listBox1.SelectedItem as ExampleInfo).Example; Debug.Print("Launching example: {0}", example.ToString()); this.Visible = false; try { if (example.BaseType == typeof(GameWindow)) { using (GameWindow gw = (GameWindow)(example.GetConstructor(Type.EmptyTypes).Invoke(null))) { (gw as IExample).Launch(); } } else if (example.BaseType == typeof(Form)) { using (Form f = (Form)example.GetConstructor(Type.EmptyTypes).Invoke(null)) { f.ShowDialog(this); } } else { // Console application. IExample ex = (IExample)example.GetConstructor(Type.EmptyTypes).Invoke(null); ex.Launch(); } } catch (Exception expt) { #if DEBUG throw; #else if (expt.InnerException != null) MessageBox.Show(expt.InnerException.ToString(), "An error has occured: \"" + expt.InnerException.Message + "\"", MessageBoxButtons.OK, MessageBoxIcon.Warning); else MessageBox.Show(expt.ToString(), "An error has occured: \"" + expt.Message + "\"", MessageBoxButtons.OK, MessageBoxIcon.Warning); #endif } GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); this.Visible = true; } } private void listBox1_DoubleClick(object sender, EventArgs e) { RunExample(); } private void listBox1_KeyUp(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.Enter: RunExample(); break; } } private void runButton_Click(object sender, EventArgs e) { RunExample(); } /// /// The main entry point for the application. /// [STAThread] static void Main() { using (Form exampleLauncher = new ExampleLauncher()) { Application.EnableVisualStyles(); Application.Run(exampleLauncher); } } private void ExampleLauncher_FormClosing(object sender, FormClosingEventArgs e) { Debug.Flush(); Debug.Close(); Trace.Flush(); Trace.Close(); } } }