<xsharper> <versionInfo title="gui-progress" value="Run XSharper script in a window with a progress bar." Version="0.1.0.0" Copyright="(C) 2009 DeltaX Inc." /> <param name="filename" required="1" /> <param name="arguments" default="${=null}" /> <param name="title" default="XSharper script" /> <include id="myScript" from="${filename}" dynamic="true" /> <return>${= gui_Progress('myScript', .SplitArgs($arguments), $title); }</return> <sub id="gui_Progress"> <param name="scriptid" required="1" /> <param name="arguments" default="${=new string[0]}" /> <param name="title" default="XSharper script" /> <?_ Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); ProgressForm p=new ProgressForm(); p.Script=c.Find<XS.Script>(c.GetString("scriptid"),true); p.Arguments=c.GetStringArray("arguments"); p.Context=c; p.Text=c.GetStr("title"); Application.Run(p); return p.ExitCode; ?> </sub> <reference name="System.Windows.Forms" addUsing="true" /> <reference name="System.Drawing" addUsing="true" /> <?h class ProgressForm : Form { public XS.ScriptContext Context { get;set; } public XS.Script Script { get; set; } public string[] Arguments { get;set;} public int ExitCode { get; private set;} EventHandler<XS.OutputEventArgs> _oldOut; private System.Windows.Forms.ProgressBar progress; private System.Windows.Forms.Label info; public ProgressForm() { this.SuspendLayout(); this.progress = new System.Windows.Forms.ProgressBar(); this.progress.Location = new System.Drawing.Point(13, 13); this.progress.Name = "progress"; this.progress.Size = new System.Drawing.Size(342, 23); this.info = new System.Windows.Forms.Label(); this.info.AutoEllipsis = true; this.info.Location = new System.Drawing.Point(13, 43); this.info.Name = "info"; this.info.Size = new System.Drawing.Size(342, 23); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(367, 71); this.ControlBox = false; this.Controls.Add(this.info); this.Controls.Add(this.progress); this.Name = "ProgressForm"; this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Load += new System.EventHandler(this.ProgressForm_Load); this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Progress_FormClosing); this.ResumeLayout(false); } private void OnOutput(object sender1, XS.OutputEventArgs e1) { if (e1.OutputType==XS.OutputType.Out || e1.OutputType==XS.OutputType.Bold) info.Text=e1.Text; progress.Value=Context.GetInt("progress",0); if (_oldOut!=null) _oldOut.Invoke(sender1,e1); } private void Progress_FormClosing(object sender, FormClosingEventArgs e) { if (_running.WaitOne(0,false)) e.Cancel=true; } private System.Threading.ManualResetEvent _running = new System.Threading.ManualResetEvent(false); private void ProgressForm_Load(object sender, EventArgs e) { BeginInvoke((MethodInvoker)delegate() { run(); }); } void run() { _oldOut=Context.Output; EventHandler<XS.OperationProgressEventArgs> oldProgress=Context.Progress; ExitCode=-1; try { _running.Set(); Context.Output= OnOutput; Cursor = Cursors.WaitCursor; Context.Progress= delegate(object sender1, XS.OperationProgressEventArgs e1) { Application.DoEvents(); }; using (XS.ConsoleRedirector r=new XS.ConsoleRedirector(Context)) { Context.In=TextReader.Null; ExitCode = XS.Utils.To< int? >( Context.ExecuteScript(Script, Arguments, XS.CallIsolation.High) )??0; } } catch(XS.ScriptTerminateException te) { Context.WriteException(te); progress.Value=100; ExitCode = te.ExitCode; Context.ResetAbort(); MessageBox.Show(te.Message,this.Text, MessageBoxButtons.OK, MessageBoxIcon.Hand); } catch(Exception ex) { Context.WriteException(ex); progress.Value=100; MessageBox.Show(ex.Message,this.Text, MessageBoxButtons.OK, MessageBoxIcon.Hand); ExitCode = -1; } _running.Reset(); Context.Output=_oldOut; Context.Progress=oldProgress; Close(); } } ?> </xsharper>