// /** // ******** // * // * ORIGINAL CODE BASE IS Copyright (C) 2006-2010 by Alphons van der Heijden // * The code was donated on 4/28/2010 by Alphons van der Heijden // * To Brandon 'Dimentox Travanti' Husbands & Malcolm J. Kudra, who in turn License under the GPLv2. // * In agreement with Alphons van der Heijden's wishes. // * // * The community would like to thank Alphons for all of his hard work, blood sweat and tears. // * Without his work the community would be stuck with crappy editors. // * // * The source code in this file ("Source Code") is provided by The LSLEditor Group // * to you under the terms of the GNU General Public License, version 2.0 // * ("GPL"), unless you have obtained a separate licensing agreement // * ("Other License"), formally executed by you and The LSLEditor Group. Terms of // * the GPL can be found in the gplv2.txt document. // * // ******** // * GPLv2 Header // ******** // * LSLEditor, a External editor for the LSL Language. // * Copyright (C) 2010 The LSLEditor Group. // // * This program is free software; you can redistribute it and/or // * modify it under the terms of the GNU General Public License // * as published by the Free Software Foundation; either version 2 // * of the License, or (at your option) any later version. // * // * This program is distributed in the hope that it will be useful, // * but WITHOUT ANY WARRANTY; without even the implied warranty of // * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // * GNU General Public License for more details. // * // * You should have received a copy of the GNU General Public License // * along with this program; if not, write to the Free Software // * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // ******** // * // * The above copyright notice and this permission notice shall be included in all // * copies or substantial portions of the Software. // * // ******** // */ using System; using System.IO; using System.Xml; using System.Drawing; using System.Text; using System.Windows.Forms; using LSLEditor.Docking; using LSLEditor.Helpers; namespace LSLEditor { public partial class EditForm : DockContent { public RuntimeConsole runtime; private string m_FullPathName; private Guid m_Guid; // private bool sOutline = true; public LSLEditorForm parent; public Encoding encodedAs = null; private const int WM_NCACTIVATE = 0x0086; protected override void WndProc(ref Message m) { if (m.Msg == WM_NCACTIVATE) { if (m.LParam != IntPtr.Zero) { m.WParam = new IntPtr(1); } else { this.numberedTextBoxUC1.TextBox.MakeAllInvis(); } } try { base.WndProc(ref m); } catch {} } public SyntaxRichTextBox TextBox { get { return this.numberedTextBoxUC1.TextBox; } } public XmlDocument ConfLSL { get { return this.parent.ConfLSL; } } public XmlDocument ConfCSharp { get { return this.parent.ConfCSharp; } } public Guid guid { get { return m_Guid; } set { this.m_Guid = value; } } public bool IsScript { get { return this.TextBox.ToolTipping; } set { if(value) this.tabPage1.Text = "Script"; else this.tabPage1.Text = "Text"; this.TextBox.ToolTipping = value; } } public EditForm(LSLEditorForm lslEditorForm) { InitializeComponent(); this.guid = new Guid(); this.components = new System.ComponentModel.Container(); this.Icon = lslEditorForm.Icon; this.parent = lslEditorForm; this.numberedTextBoxUC1.TextBox.setEditform(this); this.numberedTextBoxUC1.TextBox.Init(this.parent, this.parent.ConfLSL); this.numberedTextBoxUC1.TextBox.OnDirtyChanged += new IsDirtyHandler(TextBox_OnDirtyChanged); this.Move += new EventHandler(EditForm_Position); this.Resize += new EventHandler(EditForm_Position); this.Layout += new LayoutEventHandler(EditForm_Layout); ImageList imageList = new ImageList(); imageList.Images.Add(new Bitmap(this.GetType(), "Images.Unknown.gif")); imageList.Images.Add(new Bitmap(this.GetType(), "Images.Functions.gif")); imageList.Images.Add(new Bitmap(this.GetType(), "Images.Events.gif")); imageList.Images.Add(new Bitmap(this.GetType(), "Images.Constants.gif")); imageList.Images.Add(new Bitmap(this.GetType(), "Images.Class.gif")); imageList.Images.Add(new Bitmap(this.GetType(), "Images.Vars.gif")); imageList.Images.Add(new Bitmap(this.GetType(), "Images.Properties.gif")); imageList.Images.Add(new Bitmap(this.GetType(), "Images.States.gif")); this.tvOutline.ImageList = imageList; if (lslEditorForm.outlineToolStripMenuItem.Checked) { splitContainer1.Panel2Collapsed = false; } else { splitContainer1.Panel2Collapsed = true; } SetFont(); } public void SetFont() { this.numberedTextBoxUC1.Font = Properties.Settings.Default.FontEditor; } void EditForm_Layout(object sender, LayoutEventArgs e) { if (this.WindowState == FormWindowState.Minimized) this.numberedTextBoxUC1.TextBox.MakeAllInvis(); } void EditForm_Position(object sender, EventArgs e) { //this.numberedTextBoxUC1.TextBox.SetPosition(this.MdiParent.RectangleToScreen(this.MdiParent.ClientRectangle)); } void TextBox_OnDirtyChanged(object sender, EventArgs e) { this.Text = this.ScriptName; if (this.numberedTextBoxUC1.TextBox.Dirty) this.Text = this.Text.Trim()+"* "; else this.Text = this.Text.Trim()+" "; TabPage tabPage = this.Tag as TabPage; if (tabPage != null) tabPage.Text = this.Text; this.parent.OnDirtyChanged(this.numberedTextBoxUC1.TextBox.Dirty); } private void exitToolStripMenuItem_Click(object sender, EventArgs e) { this.Close(); } public string FullPathName { get { return this.m_FullPathName; } set { this.m_FullPathName = value; string strDirectory = Path.GetDirectoryName(this.m_FullPathName); if (Directory.Exists(strDirectory)) { Properties.Settings.Default.WorkingDirectory = strDirectory; } else { if(!Directory.Exists(Properties.Settings.Default.WorkingDirectory)) Properties.Settings.Default.WorkingDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); this.m_FullPathName = Path.Combine(Properties.Settings.Default.WorkingDirectory, this.m_FullPathName); } this.Text = this.ScriptName; TabPage tabPage = this.Tag as TabPage; if (tabPage != null) tabPage.Text = this.Text + " "; } } public string ScriptName { get { return Path.GetFileName(this.m_FullPathName); } } public string ProjectName { get { return parent.SolutionExplorer.GetProjectName(this.guid); } } public string SourceCode { get { return this.numberedTextBoxUC1.TextBox.Text; } set { this.numberedTextBoxUC1.TextBox.Text = value; } } private int PercentageIndentTab() { int intSpaces = 0; int intTabs = 0; StringReader sr = new StringReader(this.TextBox.Text); while (true) { string strLine = sr.ReadLine(); if (strLine == null) break; if (strLine.Length == 0) continue; if (strLine[0] == ' ') intSpaces++; else if (strLine[0] == '\t') intTabs++; } if (intTabs == 0 && intSpaces==0) return 50; return (int)Math.Round((100.0 * intTabs) / (intTabs + intSpaces)); } public void LoadFile(string strPath) { if(strPath.StartsWith("http://")) this.FullPathName = Path.GetFileName(strPath); else this.FullPathName = strPath; this.encodedAs = this.numberedTextBoxUC1.TextBox.LoadFile(strPath); if (!this.IsScript) return; if (Properties.Settings.Default.IndentAutoCorrect) { this.TextBox.FormatDocument(); this.TextBox.ClearUndoStack(); } else { if (Properties.Settings.Default.IndentWarning) { if ((PercentageIndentTab() > 50 && Properties.Settings.Default.SL4SpacesIndent) || (PercentageIndentTab() < 50 && !Properties.Settings.Default.SL4SpacesIndent)) { if (MessageBox.Show("Indent scheme differs from settings\nDo you want to correct it?\nIt can also be corrected by pressing Ctrl-D or turn on Autocorrection (tools menu)", "Indent Warning!!", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK) { this.TextBox.FormatDocument(); //this.TextBox.ClearUndoStack(); } } } } } public void SaveCurrentFile(string strPath) { this.FullPathName = strPath; Encoding encodeAs = this.encodedAs; if (this.IsScript && encodeAs == null) { switch (Properties.Settings.Default.OutputFormat) { case "UTF8": encodeAs = Encoding.UTF8; break; case "Unicode": encodeAs = Encoding.Unicode; break; case "BigEndianUnicode": encodeAs = Encoding.BigEndianUnicode; break; default: encodeAs = Encoding.Default; break; } } else if (encodeAs == null) { encodeAs = Encoding.UTF8; } this.numberedTextBoxUC1.TextBox.SaveCurrentFile(strPath, encodeAs); this.encodedAs = encodeAs; } public void SaveCurrentFile() { this.SaveCurrentFile(this.FullPathName); } public bool Dirty { get { return this.numberedTextBoxUC1.TextBox.Dirty; } set { this.numberedTextBoxUC1.TextBox.Dirty = value; } } public TabControl tabControl { get { return this.tabControl1; } } public void SetFocus() { this.numberedTextBoxUC1.TextBox.Focus(); } public void StopCompiler() { this.numberedTextBoxUC1.TextBox.MakeAllInvis(); if (runtime != null) { this.components.Remove(runtime); if (!runtime.IsDisposed) runtime.Dispose(); runtime = null; } for (int intI = this.tabControl1.TabPages.Count - 1; intI > 0; intI--) { this.tabControl1.TabPages.RemoveAt(intI); } } public SecondLifeHost.SecondLifeHostChatHandler ChatHandler; public SecondLifeHost.SecondLifeHostMessageLinkedHandler MessageLinkedHandler; public bool StartCompiler() { //if (this.disableCompilesyntaxCheckToolStripMenuItem.Checked) // return false; if (!this.IsScript) return false; StopCompiler(); if (this.parent == null) return false; runtime = new RuntimeConsole(this.parent); // for disposing this.components.Add(runtime); if (!runtime.Compile(this)) { this.tabControl1.SelectedIndex = 0; return false; } TabPage tabPage = new TabPage("Debug"); tabPage.Controls.Add(runtime); this.tabControl1.TabPages.Add(tabPage); this.tabControl1.SelectedIndex = 1; return true; } public bool SyntaxCheck() { //if (this.disableCompilesyntaxCheckToolStripMenuItem.Checked) // return false; if (!this.IsScript) return false; LSL2CSharp translator = new LSL2CSharp(ConfLSL); string strCSharp = translator.Parse(SourceCode); if (System.Diagnostics.Debugger.IsAttached) { for (int intI = this.tabControl1.TabPages.Count - 1; intI > 0; intI--) { this.tabControl1.TabPages.RemoveAt(intI); } // TODO TabPage tabPage = new TabPage("C#"); NumberedTextBox.NumberedTextBoxUC numberedTextBoxUC1 = new NumberedTextBox.NumberedTextBoxUC(); numberedTextBoxUC1.TextBox.Init(null, this.ConfCSharp); numberedTextBoxUC1.TextBox.Text = strCSharp; numberedTextBoxUC1.TextBox.ReadOnly = true; numberedTextBoxUC1.Dock = DockStyle.Fill; tabPage.Controls.Add(numberedTextBoxUC1); this.tabControl.TabPages.Add(tabPage); } return (null != CompilerHelper.CompileCSharp(this, strCSharp)); } public int Find(string strSearch, int intStart, int intEnd, RichTextBoxFinds options) { intStart = this.numberedTextBoxUC1.TextBox.Find(strSearch, intStart, intEnd, options); this.numberedTextBoxUC1.TextBox.Focus(); return intStart; } private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) { this.numberedTextBoxUC1.TextBox.MakeAllInvis(); } private void EditForm_FormClosing(object sender, FormClosingEventArgs e) { this.parent.CancelClosing = false; if (this.Dirty) { DialogResult dialogResult = MessageBox.Show(this, @"Save """ + this.ScriptName + @"""?", "File has changed", MessageBoxButtons.YesNoCancel); if (dialogResult == DialogResult.Yes) e.Cancel = !this.parent.SaveFile(this,false); else e.Cancel = (dialogResult == DialogResult.Cancel); } this.parent.CancelClosing = e.Cancel; } private void disableCompilesyntaxCheckToolStripMenuItem_Click(object sender, EventArgs e) { //this.disableCompilesyntaxCheckToolStripMenuItem.Checked = !this.disableCompilesyntaxCheckToolStripMenuItem.Checked; } private void tvOutline_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { this.parent.BeginInvoke(new TreeNodeMouseClickEventHandler( delegate(object sender2, TreeNodeMouseClickEventArgs e2) { if (e.Node.Tag is Helpers.OutlineHelper) { Helpers.OutlineHelper ohOutline = (Helpers.OutlineHelper)e.Node.Tag; if (ohOutline.line < this.TextBox.Lines.Length) { //editForm.Focus(); //editForm.TextBox.Select(); //editForm.TextBox.Goto(ohOutline.line + 1); //TextBox.Focus(); this.TextBox.Select(); this.TextBox.SelectionStart = this.TextBox.GetFirstCharIndexFromLine(ohOutline.line); } } }), sender, e); } private void tvOutline_AfterSelect(object sender, TreeViewEventArgs e) { //this.TextBox.Select } private void splitContainer1_Click(object sender, EventArgs e) { } private void tvOutline_VisibleChanged(object sender, EventArgs e) { this.tvOutline.ExpandAll(); } } }