#region --- License --- /* Licensed under the MIT/X11 license. * Copyright (c) 2006-2008 the OpenTK Team. * This notice may not be removed from any source distribution. * See license.txt for licensing details. */ #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 { bool show_hidden; List hidden_items = new List(); #region class ExampleInfo /// /// Contains the information necessary to display and launch an example thorugh the ExampleLauncer. /// class ExampleInfo { public Type Example; public ExampleAttribute Attributes; public ExampleInfo(Type example, ExampleAttribute attr) { Example = example; Attributes = attr; } public override string ToString() { return Attributes.ToString(); } } #endregion #region --- Constructor --- public ExampleLauncher() { this.Font = SystemFonts.MessageBoxFont; 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) { object[] attributes = type.GetCustomAttributes(false); ExampleAttribute example = null; foreach (object attr in attributes) if (attr is ExampleAttribute) example = (ExampleAttribute)attr; if (example != null) { //sb.Append(example.Category); //sb.Append(" "); //if (example.Difficulty < 10) // sb.Append("0"); // To keep items nicely sorted. //sb.Append(example.Difficulty); //sb.Append(": "); ////sb.Append(type.Name); //sb.Append(example.Title); if (example.Visible) listBox1.Items.Add(new ExampleInfo(type, example)); else { #if DEBUG example.Title += " (hidden)"; listBox1.Items.Add(new ExampleInfo(type, example)); #else hidden_items.Add(new ExampleInfo(type, example)); #endif } // Clean the StringBuilder for the next pass. sb.Remove(0, sb.Length); } } // Select first item if (listBox1.Items.Count > 0) this.listBox1.SelectedIndex = 0; RaiseWindow(); } #endregion void RaiseWindow() { // Force the ExampleLauncher to appear. this.TopMost = false; this.TopMost = true; this.TopMost = false; } #region private void RunExample() private void RunExample() { if (listBox1.SelectedItem != null) { try { ExampleInfo info = (ExampleInfo)listBox1.SelectedItem; Type example = info.Example; Debug.Print("Launching example: {0}", example.ToString()); this.Visible = false; Application.DoEvents(); example.GetMethod("Main").Invoke(null, null); GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); } catch (TargetInvocationException expt) { string ex_info; if (expt.InnerException != null) ex_info = expt.InnerException.ToString(); else ex_info = expt.ToString(); MessageBox.Show(ex_info, "An OpenTK example encountered an error.", MessageBoxButtons.OK, MessageBoxIcon.Warning); Debug.Print(expt.ToString()); #if DEBUG //throw; #endif } catch (NullReferenceException expt) { MessageBox.Show(expt.ToString(), "The Example launcher failed to load the example.", MessageBoxButtons.OK, MessageBoxIcon.Warning); } finally { this.Visible = true; RaiseWindow(); } } } #endregion #region Launcher events 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; // On Ctrl+F1 enable hidden items (for debugging/testing OpenTK) case Keys.F1: if (e.Control) show_hidden = !show_hidden; if (show_hidden) listBox1.Items.AddRange(hidden_items.ToArray()); else foreach (ExampleInfo item in hidden_items) listBox1.Items.Remove(item); break; } } private void runButton_Click(object sender, EventArgs e) { RunExample(); } private void ExampleLauncher_FormClosing(object sender, FormClosingEventArgs e) { Debug.Flush(); Debug.Close(); Trace.Flush(); Trace.Close(); } #endregion /// /// The main entry point for the application. /// [STAThread] static void Main() { try { //FileIOPermission fileIO = new FileIOPermission(FileIOPermissionAccess.AllAccess, "."); //fileIO.Demand(); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); using (Form exampleLauncher = new ExampleLauncher()) { Application.Run(exampleLauncher); } } catch (System.Security.SecurityException e) { MessageBox.Show("The Example Launcher failed to start, due to insufficient permissions. This may happen if you execute the application from a network share.", "OpenTK Example Launcher failed to start.", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); Trace.WriteLine(e.ToString()); } } } }