From: Jeff R. <jef...@us...> - 2005-11-19 03:15:53
|
Update of /cvsroot/svgdomcsharp/SharpVectorGraphics/src/SharpVectorScripting/SharpVectors/Scripting In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12937/src/SharpVectorScripting/SharpVectors/Scripting Added Files: ClosureEventMonitor.cs ScriptEventMonitor.cs ScriptTimerMonitor.cs Log Message: Scripting Library wrappers and monitors initial add --- NEW FILE: ScriptEventMonitor.cs --- using System; using System.Reflection; using Microsoft.Vsa; using Microsoft.JScript; using Microsoft.JScript.Vsa; using SharpVectors.Dom; using SharpVectors.Dom.Svg; using SharpVectors.Dom.Events; namespace SharpVectors.Scripting { /// <summary> /// Summary description for ScriptEventMonitor. /// </summary> public class ScriptEventMonitor { private IAttribute att = null; private VsaScriptEngine engine = null; private ISvgWindow window = null; public ScriptEventMonitor(VsaScriptEngine engine, IAttribute att, ISvgWindow window) { this.att = att; this.engine = engine; this.window = window; } public void EventHandler( IEvent @event) { try { int handle = window.Document.RootElement.SuspendRedraw(60000); ((JScriptEngine)engine).Evaluate(att.Value, @event); window.Document.RootElement.UnsuspendRedraw(handle); System.GC.Collect(); System.GC.WaitForPendingFinalizers(); } catch (Exception e) { System.Windows.Forms.MessageBox.Show(e.Message + "\n" + e.StackTrace + "\n" + e.ToString()); } } } } --- NEW FILE: ClosureEventMonitor.cs --- using System; using System.Reflection; using System.Collections; using Microsoft.Vsa; using Microsoft.JScript; using Microsoft.JScript.Vsa; using SharpVectors.Dom; using SharpVectors.Dom.Svg; using SharpVectors.Dom.Events; namespace SharpVectors.Scripting { /// <summary> /// Summary description for ClosureEventMonitor. /// </summary> public class ClosureEventMonitor { private Closure closure = null; private static Hashtable monitorMap = new Hashtable(); public static ClosureEventMonitor CreateMonitor(Closure clo) { ClosureEventMonitor mon = (ClosureEventMonitor)monitorMap[clo]; if (mon == null) { mon = new ClosureEventMonitor(clo); monitorMap[clo] = mon; } return mon; } public static ClosureEventMonitor Find(Closure clo) { return (ClosureEventMonitor)monitorMap[clo]; } public static void Clear() { monitorMap.Clear(); } public ClosureEventMonitor(Closure closure) { this.closure = closure; } public void EventHandler( IEvent @event) { VsaEngine vsa = (Microsoft.JScript.Vsa.VsaEngine)closure.engine; try { //int handle = window.Document.RootElement.SuspendRedraw(60000); Object[] args = new Object[1]; args[0] = ScriptableObject.CreateWrapper(@event); GlobalScope scope = vsa.GetMainScope(); closure.Invoke(closure.GetParent(), args); //window.Document.RootElement.UnsuspendRedraw(handle); } catch (Exception e) { System.Windows.Forms.MessageBox.Show(e.Message + "\n" + e.StackTrace + "\n" + e.ToString()); } } } } --- NEW FILE: ScriptTimerMonitor.cs --- using System; using System.Reflection; using System.Collections; using System.Timers; using Microsoft.Vsa; using Microsoft.JScript; using Microsoft.JScript.Vsa; using SharpVectors.Dom; using SharpVectors.Dom.Svg; using SharpVectors.Dom.Events; namespace SharpVectors.Scripting { /// <summary> /// Summary description for ScriptTimerMonitor. /// </summary> public class ScriptTimerMonitor { private static ArrayList timerMonitors = new ArrayList(); private object scriptOrClosure = null; private VsaScriptEngine engine = null; private ISvgWindow window = null; private Timer timer = null; public ScriptTimerMonitor(VsaScriptEngine engine, ISvgWindow window, object scriptOrClosure, ulong delay, bool isInterval) { if (delay == 0) delay = 1; this.engine = engine; this.window = window; this.scriptOrClosure = scriptOrClosure; this.timer = new Timer(delay); this.timer.AutoReset = isInterval; this.timer.Elapsed += new ElapsedEventHandler(this.EventHandler); this.timer.Enabled = true; } public static string CreateMonitor(VsaScriptEngine engine, ISvgWindow window, object scriptOrClosure, ulong delay, bool isInterval) { ScriptTimerMonitor stm = new ScriptTimerMonitor(engine, window, scriptOrClosure, delay, isInterval); timerMonitors.Add(stm); return ""+stm.timer.GetHashCode(); } public static void ClearMonitor(string token) { ScriptTimerMonitor monToClear = null; foreach (ScriptTimerMonitor stm in timerMonitors) { if (""+stm.timer.GetHashCode() == token) { monToClear = stm; break; } } if (monToClear != null) { monToClear.timer.Enabled = false; monToClear.timer = null; timerMonitors.Remove(monToClear); } } public static void Reset() { foreach (ScriptTimerMonitor stm in timerMonitors) { stm.timer.Enabled = false; stm.timer = null; } timerMonitors.Clear(); } public void EventHandler(object source, ElapsedEventArgs args) { VsaEngine vsa = (Microsoft.JScript.Vsa.VsaEngine)engine.Engine; try { int handle = window.Document.RootElement.SuspendRedraw(60000); if (scriptOrClosure is Closure) { Closure closure = (Closure)scriptOrClosure; Object[] closureArgs = new Object[0]; GlobalScope scope = vsa.GetMainScope(); closure.Invoke(closure.GetParent(), closureArgs); } else ((JScriptEngine)engine).Evaluate(scriptOrClosure.ToString(), null); window.Document.RootElement.UnsuspendRedraw(handle); } catch (Exception e) { System.Windows.Forms.MessageBox.Show(scriptOrClosure.ToString() + "\n\n" + e.Message + "\n" + e.StackTrace + "\n" + e.ToString()); } // Clear this if we can if (! timer.AutoReset) { ClearMonitor(""+timer.GetHashCode()); } } } } |