Example #1
0
        public ucTextMergeEditor(TextFileInformation fileInformation)
            : this()
        {
            this.fileInformation = fileInformation;
            toolStripButtonEnableEditing.Checked = false;
            toolStripButtonEnableEditing_CheckedChanged(toolStripButtonEnableEditing, new EventArgs());             // Apply default options

            SyntaxLanguage language = Utility.GetSyntaxLanguageForFileInformation(fileInformation);

            editorOriginal.Document.Language = language;
            editorResolved.Document.Language = language;

            if (fileInformation.PrevGenFile.HasContents == false)
            {
                displayAlgorithm = new TwoWayDiffDisplayAlgorithm(this);
                WarningText      =
                    "The previous version of the file seems to be missing. This merge is a 2 way merge," +
                    " so all changes must be examined to resolve the conflict.";
            }
            else
            {
                displayAlgorithm = new ThreeWayDiffDisplayAlgorithm(this);
            }

            Fill();
        }
Example #2
0
        private TripleSlashCommentModel(string xml, SyntaxLanguage language, ITripleSlashCommentParserContext context)
        {
            // Transform triple slash comment
            XDocument doc = TripleSlashCommentTransformer.Transform(xml, language);

            _context = context;
            if (!context.PreserveRawInlineComments)
            {
                ResolveSeeCref(doc, context.AddReferenceDelegate, context.ResolveCRef);
                ResolveSeeAlsoCref(doc, context.AddReferenceDelegate, context.ResolveCRef);
                ResolveExceptionCref(doc, context.AddReferenceDelegate, context.ResolveCRef);
            }
            ResolveCodeSource(doc, context);
            var nav = doc.CreateNavigator();

            Summary = GetSummary(nav, context);
            Remarks = GetRemarks(nav, context);
            Returns = GetReturns(nav, context);

            Exceptions     = GetExceptions(nav, context);
            Sees           = GetSees(nav, context);
            SeeAlsos       = GetSeeAlsos(nav, context);
            Examples       = GetExamples(nav, context);
            Parameters     = GetParameters(nav, context);
            TypeParameters = GetTypeParameters(nav, context);
            IsInheritDoc   = GetIsInheritDoc(nav, context);
        }
Example #3
0
        TripleSlashCommentModel(string xml, SyntaxLanguage language, TripleSlashCommentParserContext context)
        {
            // Transform triple slash comment
            var doc = TripleSlashCommentTransformer.Transform(xml, language);

            _context = context;

            ResolveSeeCref(doc);
            ResolveSeeAlsoCref(doc);
            ResolveExceptionCref(doc);

            ResolveCodeSource(doc);
            _nav    = doc.CreateNavigator();
            Summary = GetSummary();
            Remarks = GetRemarks();
            Returns = GetReturns();

            Exceptions     = GetExceptions();
            Sees           = GetSees();
            SeeAlsos       = GetSeeAlsos();
            Examples       = GetExamples();
            Parameters     = GetParameters();
            TypeParameters = GetTypeParameters();
            IsInheritDoc   = GetIsInheritDoc();
        }
Example #4
0
 public SymbolVisitorAdapter(YamlModelGenerator generator, SyntaxLanguage language, bool preserveRawInlineComments = false, string filterConfigFile = null)
 {
     _generator = generator;
     Language   = language;
     _preserveRawInlineComments = preserveRawInlineComments;
     FilterVisitor = string.IsNullOrEmpty(filterConfigFile) ? new DefaultFilterVisitor() : new DefaultFilterVisitor().WithConfig(filterConfigFile).WithCache();
 }
Example #5
0
 public static TripleSlashCommentModel CreateModel(string xml, SyntaxLanguage language, ITripleSlashCommentParserContext context)
 {
     if (context == null)
     {
         throw new ArgumentNullException(nameof(context));
     }
     if (string.IsNullOrEmpty(xml))
     {
         return(null);
     }
     // Quick turnaround for badly formed XML comment
     if (xml.StartsWith("<!-- Badly formed XML comment ignored for member "))
     {
         Logger.LogWarning($"Invalid triple slash comment is ignored: {xml}");
         return(null);
     }
     try
     {
         var model = new TripleSlashCommentModel(xml, language, context);
         return(model);
     }
     catch (XmlException)
     {
         return(null);
     }
 }
Example #6
0
        public ParseResult Run(MetadataModel yaml, ResolverContext context)
        {
            var index = yaml.Indexer;

            TreeIterator.PreorderAsync <MetadataItem>(yaml.TocYamlViewModel, null,
                                                      (s) =>
            {
                if (s.IsInvalid)
                {
                    return(null);
                }
                else
                {
                    return(s.Items);
                }
            }, (member, parent) =>
            {
                // get all the possible places where link is possible
                if (member.Syntax != null && member.Syntax.Content != null)
                {
                    SyntaxLanguage[] keys = new SyntaxLanguage[member.Syntax.Content.Count];
                    member.Syntax.Content.Keys.CopyTo(keys, 0);
                    foreach (var key in keys)
                    {
                        member.Syntax.Content[key] = NormalizeLines(member.Syntax.Content[key]);
                    }
                }

                return(Task.FromResult(true));
            }
                                                      ).Wait();
            return(new ParseResult(ResultLevel.Success));
        }
Example #7
0
        private static string GetSyntaxFileName(SyntaxLanguage lang)
        {
            string file = Enum.GetName(typeof(SyntaxLanguage), lang);

            file += ".syn";

            return("GuruComponents.CodeEditor.CodeEditor.SyntaxFiles.Syns." + file);
        }
Example #8
0
        private static string GetSyntaxFileName(SyntaxLanguage lang)
        {
            string file = Enum.GetName(typeof(SyntaxLanguage), lang);

            file += ".syn";

            return "Fireball.CodeEditor.SyntaxFiles.Syns." + file;
        }
Example #9
0
 public SupportedLanguage(string title, string color, FileType fileType, SyntaxLanguage syntax, params string[] extensions)
 {
     Title      = title;
     Syntax     = syntax;
     Color      = color;
     Extensions = extensions;
     FileType   = fileType;
 }
Example #10
0
 public void SetSyntaxLanguage(SyntaxLanguage syntaxLanguage)
 {
     CodeEditorSyntaxLoader.SetSyntax(this._EditorControl, syntaxLanguage);
     if (LanguageChanged != null)
     {
         LanguageChanged(this,
                         new LanguageChangedEventArgs(this._EditorControl.Document.Parser.Language));
     }
 }
Example #11
0
 public SymbolVisitorAdapter(YamlModelGenerator generator, SyntaxLanguage language, Compilation compilation, bool preserveRawInlineComments = false, string filterConfigFile = null, IReadOnlyDictionary <Compilation, IEnumerable <IMethodSymbol> > extensionMethods = null)
 {
     _generator                 = generator;
     Language                   = language;
     _currentCompilation        = compilation;
     _currentCompilationRef     = compilation.ToMetadataReference();
     _preserveRawInlineComments = preserveRawInlineComments;
     FilterVisitor              = string.IsNullOrEmpty(filterConfigFile) ? new DefaultFilterVisitor() : new DefaultFilterVisitor().WithConfig(filterConfigFile).WithCache();
     _extensionMethods          = extensionMethods != null?extensionMethods.ToDictionary(p => p.Key, p => p.Value.Where(e => FilterVisitor.CanVisitApi(e))) : new Dictionary <Compilation, IEnumerable <IMethodSymbol> >();
 }
Example #12
0
        private static List <SpecViewModel> GetSpec(ReferenceItem reference, SyntaxLanguage language)
        {
            var list = reference.Parts.GetLanguageProperty(language);

            if (list == null || list.Count <= 1)
            {
                return(null);
            }
            return(list.ConvertAll(s => s.ToSpecViewModel()));
        }
        public static XDocument Transform(string xml, SyntaxLanguage language)
        {
            using var ms     = new MemoryStream();
            using var writer = new XHtmlWriter(new StreamWriter(ms));
            XDocument doc  = XDocument.Parse(xml, LoadOptions.PreserveWhitespace);
            var       args = new XsltArgumentList();

            args.AddParam("language", "urn:input-variables", WebUtility.HtmlEncode(language.ToString().ToLower()));
            _transform.Transform(doc.CreateNavigator(), args, writer);
            ms.Seek(0, SeekOrigin.Begin);
            return(XDocument.Load(ms, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo));
        }
 public XDocument Transform(string xml, SyntaxLanguage language)
 {
     using (var ms = new MemoryStream())
     using (var writer = new XHtmlWriter(new StreamWriter(ms)))
     {
         XDocument doc = XDocument.Parse(xml, LoadOptions.PreserveWhitespace);
         var args = new XsltArgumentList();
         args.AddParam("language", "urn:input-variables", WebUtility.HtmlEncode(language.ToString().ToLower()));
         _transform.Transform(doc.CreateNavigator(), args, writer);
         ms.Seek(0, SeekOrigin.Begin);
         return XDocument.Load(ms, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
     }
 }
        private void OnSyntaxLanguageChanged(SyntaxLanguage newValue)
        {
            if (newValue == null)
            {
                tokenizer = null;
                return;
            }

            if (newValue.HighlightColors == null)
            {
                throw new ArgumentException("Grammer HightlightColrs must not be null");
            }

            tokenizer = new Tokenizer(newValue.Grammer);
        }
Example #16
0
        public SymbolVisitorAdapter(YamlModelGenerator generator, SyntaxLanguage language, Compilation compilation, ExtractMetadataOptions options)
        {
            _generator                 = generator;
            Language                   = language;
            _currentCompilation        = compilation;
            _currentCompilationRef     = compilation.ToMetadataReference();
            _preserveRawInlineComments = options.PreserveRawInlineComments;
            var configFilterRule = ConfigFilterRule.LoadWithDefaults(options.FilterConfigFile);
            var filterVisitor    = options.DisableDefaultFilter ? (IFilterVisitor) new AllMemberFilterVisitor() : new DefaultFilterVisitor();

            FilterVisitor     = filterVisitor.WithConfig(configFilterRule).WithCache();
            _extensionMethods = options.RoslynExtensionMethods != null?options.RoslynExtensionMethods.ToDictionary(p => p.Key, p => p.Value.Where(e => FilterVisitor.CanVisitApi(e))) : new Dictionary <Compilation, IEnumerable <IMethodSymbol> >();

            _codeSourceBasePath = options.CodeSourceBasePath;
        }
Example #17
0
 private void cboLanguage_SelectedIndexChanged(object sender, EventArgs e)
 {
     try
     {
         SyntaxLanguage language = SyntaxLanguage.CSharp;
         if (cboLanguage.Text == "VB .NET")
         {
             language = SyntaxLanguage.VBNET;
         }
         CodeEditorSyntaxLoader.SetSyntax(codeEditorDestination, language);
         codeEditorDestination.Document.Clear();
     }
     catch (Exception ex)
     {
         Debug.WriteLine(ex.ToString());
         MessageBox.Show("It's not possible to select the destination language. \n\nDetails: " + ex.Message, "VB Converter", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
 }
Example #18
0
        public void CreateScintillaComponents(string textBefore, string textAfter, SyntaxLanguage language = SyntaxLanguage.SQL)
        {
            QueryEditorBefore          = new ScintillaTextEditorFactory().Create();
            QueryEditorBefore.Text     = textBefore;
            QueryEditorBefore.ReadOnly = true;

            splitContainer1.Panel1.Controls.Add(QueryEditorBefore);

            QueryEditorAfter          = new ScintillaTextEditorFactory().Create();
            QueryEditorAfter.Text     = textAfter;
            QueryEditorAfter.ReadOnly = true;

            splitContainer1.Panel2.Controls.Add(QueryEditorAfter);

            //compute difference
            if (textBefore == null)
            {
                textBefore = "";
            }
            if (textAfter == null)
            {
                textAfter = "";
            }

            Diff diff = new Diff();

            var highlighter = new ScintillaLineHighlightingHelper();

            highlighter.ClearAll(QueryEditorAfter);
            highlighter.ClearAll(QueryEditorBefore);

            foreach (Diff.Item item in diff.DiffText(textBefore, textAfter))
            {
                for (int i = item.StartA; i < item.StartA + item.deletedA; i++)
                {
                    highlighter.HighlightLine(QueryEditorBefore, i, Color.Pink);
                }

                for (int i = item.StartB; i < item.StartB + item.insertedB; i++)
                {
                    highlighter.HighlightLine(QueryEditorAfter, i, Color.LawnGreen);
                }
            }
        }
Example #19
0
        private static string GetName(ReferenceItem reference, SyntaxLanguage language, Converter <LinkItem, string> getName)
        {
            var list = reference.Parts.GetLanguageProperty(language);

            if (list == null)
            {
                return(null);
            }
            if (list.Count == 0)
            {
                Debug.Fail("Unexpected reference.");
                return(null);
            }
            if (list.Count == 1)
            {
                return(getName(list[0]));
            }
            return(string.Concat(list.ConvertAll(item => getName(item)).ToArray()));
        }
Example #20
0
 public static TripleSlashCommentModel CreateModel(string xml, SyntaxLanguage language, ITripleSlashCommentParserContext context)
 {
     if (context == null) throw new ArgumentNullException(nameof(context));
     if (string.IsNullOrEmpty(xml)) return null;
     // Quick turnaround for badly formed XML comment
     if (xml.StartsWith("<!-- Badly formed XML comment ignored for member "))
     {
         Logger.LogWarning($"Invalid triple slash comment is ignored: {xml}");
         return null;
     }
     try
     {
         var model = new TripleSlashCommentModel(xml, language, context);
         return model;
     }
     catch (XmlException)
     {
         return null;
     }
 }
Example #21
0
        public void Run(MetadataModel yaml, ResolverContext context)
        {
            TreeIterator.Preorder(yaml.TocYamlViewModel, null,
                                  s => s.IsInvalid ? null : s.Items,
                                  (member, parent) =>
            {
                // get all the possible places where link is possible
                if (member.Syntax != null && member.Syntax.Content != null)
                {
                    SyntaxLanguage[] keys = new SyntaxLanguage[member.Syntax.Content.Count];
                    member.Syntax.Content.Keys.CopyTo(keys, 0);
                    foreach (var key in keys)
                    {
                        member.Syntax.Content[key] = NormalizeLines(member.Syntax.Content[key]);
                    }
                }

                return(true);
            });
        }
Example #22
0
        public void Run(MetadataModel yaml, ResolverContext context)
        {
            TreeIterator.Preorder(yaml.TocYamlViewModel, null,
                s => s.IsInvalid ? null : s.Items,
                (member, parent) =>
                {
                    // get all the possible places where link is possible
                    if (member.Syntax != null && member.Syntax.Content != null)
                    {
                        SyntaxLanguage[] keys = new SyntaxLanguage[member.Syntax.Content.Count];
                        member.Syntax.Content.Keys.CopyTo(keys, 0);
                        foreach(var key in keys)
                        {
                            member.Syntax.Content[key] = NormalizeLines(member.Syntax.Content[key]);
                        }
                    }

                    return true;
                });
        }
Example #23
0
        private TripleSlashCommentModel(string xml, SyntaxLanguage language, ITripleSlashCommentParserContext context)
        {
            // Transform triple slash comment
            XDocument doc = _transformer.Transform(xml, language);

            _context = context;
            if (!context.PreserveRawInlineComments)
            {
                ResolveSeeCref(doc, context.AddReferenceDelegate);
                ResolveSeeAlsoCref(doc, context.AddReferenceDelegate);
            }
            var nav = doc.CreateNavigator();
            Summary = GetSummary(nav, context);
            Remarks = GetRemarks(nav, context);
            Returns = GetReturns(nav, context);

            Exceptions = GetExceptions(nav, context);
            Sees = GetSees(nav, context);
            SeeAlsos = GetSeeAlsos(nav, context);
            Examples = GetExamples(nav, context);
            Parameters = GetParameters(nav, context);
            TypeParameters = GetTypeParameters(nav, context);
        }
Example #24
0
        public void ConfigureLanguage()
        {
            if ((this._query.QueryKind >= QueryLanguage.FSharpExpression) && this._document.get_SpanIndicatorLayers().Contains("Syntax error"))
            {
                this._document.get_SpanIndicatorLayers().get_Item("Syntax error").Clear();
            }
            QueryCompiler compiler = QueryCompiler.Create(this._query, false);

            this._language = this.GetLanguage();
            this._document.ResetLanguage();
            if (this._query.QueryKind == QueryLanguage.SQL)
            {
                string str;
                this._document.set_FooterText((string)(str = null));
                this._document.set_HeaderText(str);
            }
            else
            {
                this._document.set_HeaderText(compiler.GetHeader(this._query));
                this._document.set_FooterText(compiler.GetFooter(this._query));
            }
            this._document.set_Language(this._language);
            this._document.Reparse();
        }
 protected SimpleYamlModelGenerator(SyntaxLanguage language)
 {
     Language = language;
 }
Example #26
0
 /// <summary>
 /// DO NOT INCLUDE THE .syn Extension!!
 /// </summary>
 /// <param name="lang">The Language e.g. CSharp or VBNET or Cobol</param>
 /// <returns></returns>
 private string GetSyntaxFileName(SyntaxLanguage lang)
 {
     var file = Enum.GetName(typeof(SyntaxLanguage), lang);
     file += ".syn";
     return file;
 }
 public void SetSyntaxLanguage(SyntaxLanguage syntaxLanguage)
 {
     prevgenSyntaxEditor.Document.Language  = syntaxLanguage;
     templateSyntaxEditor.Document.Language = syntaxLanguage;
     userSyntaxEditor.Document.Language     = syntaxLanguage;
 }
Example #28
0
        public static TValue GetLanguageProperty <TValue>(this SortedList <SyntaxLanguage, TValue> dict, SyntaxLanguage language, TValue defaultValue = null)
            where TValue : class
        {
            TValue result;

            if (dict.TryGetValue(language, out result))
            {
                return(result);
            }
            if (language == SyntaxLanguage.Default && dict.Count > 0)
            {
                return(dict.Values[0]);
            }
            return(defaultValue);
        }
Example #29
0
 public void SetSyntaxLanguage(SyntaxLanguage syntaxLanguage)
 {
     prevgenSyntaxEditor.Document.Language = syntaxLanguage;
     templateSyntaxEditor.Document.Language = syntaxLanguage;
     userSyntaxEditor.Document.Language = syntaxLanguage;
 }
Example #30
0
 public SymbolVisitorAdapter(YamlModelGenerator generator, SyntaxLanguage language, bool preserveRawInlineComments = false)
 {
     _generator = generator;
     Language   = language;
     _preserveRawInlineComments = preserveRawInlineComments;
 }
Example #31
0
        private static string GetSyntaxFileName(SyntaxLanguage lang)
        {
            string file = Enum.GetName(typeof(SyntaxLanguage), lang);

              file += ".syn";

              return "System.Windows.Controls.SyntaxFiles." + file;
        }
 protected SimpleYamlModelGenerator(SyntaxLanguage language)
 {
     Language = language;
 }
        public SQLBeforeAndAfterViewer(string sqlBefore, string sqlAfter, string headerTextForBefore, string headerTextForAfter, string caption, MessageBoxButtons buttons, SyntaxLanguage language = SyntaxLanguage.SQL)
        {
            InitializeComponent();

            bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);

            if (designMode) //dont add the QueryEditor if we are in design time (visual studio) because it breaks
            {
                return;
            }

            QueryEditorBefore          = new ScintillaTextEditorFactory().Create();
            QueryEditorBefore.Text     = sqlBefore;
            QueryEditorBefore.ReadOnly = true;

            splitContainer1.Panel1.Controls.Add(QueryEditorBefore);


            QueryEditorAfter          = new ScintillaTextEditorFactory().Create();
            QueryEditorAfter.Text     = sqlAfter;
            QueryEditorAfter.ReadOnly = true;

            splitContainer1.Panel2.Controls.Add(QueryEditorAfter);


            //compute difference
            var highlighter = new ScintillaLineHighlightingHelper();

            highlighter.ClearAll(QueryEditorAfter);
            highlighter.ClearAll(QueryEditorBefore);

            if (sqlBefore == null)
            {
                sqlBefore = "";
            }
            if (sqlAfter == null)
            {
                sqlAfter = "";
            }

            Diff diff = new Diff();

            foreach (Diff.Item item in diff.DiffText(sqlBefore, sqlAfter))
            {
                for (int i = item.StartA; i < item.StartA + item.deletedA; i++)
                {
                    highlighter.HighlightLine(QueryEditorBefore, i, Color.Pink);
                }

                for (int i = item.StartB; i < item.StartB + item.insertedB; i++)
                {
                    highlighter.HighlightLine(QueryEditorAfter, i, Color.LawnGreen);
                }
            }

            switch (buttons)
            {
            case MessageBoxButtons.OK:
                btnYes.Visible = true;
                btnYes.Text    = "Ok";
                btnNo.Visible  = false;
                break;

            case MessageBoxButtons.YesNo:
                btnYes.Visible = true;
                btnNo.Visible  = true;
                break;

            default:
                throw new NotSupportedException("buttons");
            }

            lblBefore.Text = headerTextForBefore;
            lblAfter.Text  = headerTextForAfter;

            this.Text = caption;
        }
 public YamlModelGeneratorVisitor(object context, SyntaxLanguage language)
 {
     this.language = language;
 }
Example #35
0
        public static Language GetLanguageFrom(SyntaxLanguage syntax)
        {
            Stream xml = GetSyntaxStream(GetSyntaxFileName(syntax));

            return Language.FromSyntaxFile(xml);
        }
 public void ConfigureLanguage()
 {
     if ((this._query.QueryKind >= QueryLanguage.FSharpExpression) && this._document.get_SpanIndicatorLayers().Contains("Syntax error"))
     {
         this._document.get_SpanIndicatorLayers().get_Item("Syntax error").Clear();
     }
     QueryCompiler compiler = QueryCompiler.Create(this._query, false);
     this._language = this.GetLanguage();
     this._document.ResetLanguage();
     if (this._query.QueryKind == QueryLanguage.SQL)
     {
         string str;
         this._document.set_FooterText((string) (str = null));
         this._document.set_HeaderText(str);
     }
     else
     {
         this._document.set_HeaderText(compiler.GetHeader(this._query));
         this._document.set_FooterText(compiler.GetFooter(this._query));
     }
     this._document.set_Language(this._language);
     this._document.Reparse();
 }
Example #37
0
 public void SetSyntaxLanguage(SyntaxLanguage syntaxLanguage)
 {
     CodeEditorSyntaxLoader.SetSyntax(this._EditorControl, syntaxLanguage);
     if (LanguageChanged != null)
         LanguageChanged(this,
             new LanguageChangedEventArgs(this._EditorControl.Document.Parser.Language));
 }
        public static Language GetLanguageFrom(SyntaxLanguage syntax)
        {
            Stream xml = GetSyntaxStream(GetSyntaxFileName(syntax));

            return(Language.FromSyntaxFile(xml));
        }
Example #39
0
        public static void SetSyntax(CodeEditorControl editor, SyntaxLanguage language)
        {
            Stream xml = GetSyntaxStream(GetSyntaxFileName(language));

            editor.Document.Parser.Init(Language.FromSyntaxFile(xml));
        }
Example #40
0
        public static void SetSyntax(CodeEditorControl editor, SyntaxLanguage language)
        {
            Stream xml = GetSyntaxStream(GetSyntaxFileName(language));

            editor.Document.Parser.Init(Language.FromSyntaxFile(xml));
        }
Example #41
0
 private static string GetName(ReferenceItem reference, SyntaxLanguage language, Converter<LinkItem, string> getName)
 {
     var list = reference.Parts.GetLanguageProperty(language);
     if (list == null)
     {
         return null;
     }
     if (list.Count == 0)
     {
         Debug.Fail("Unexpected reference.");
         return null;
     }
     if (list.Count == 1)
     {
         return getName(list[0]);
     }
     return string.Concat(list.ConvertAll(item => getName(item)).ToArray());
 }
Example #42
0
 private static List<SpecViewModel> GetSpec(ReferenceItem reference, SyntaxLanguage language)
 {
     var list = reference.Parts.GetLanguageProperty(language);
     if (list == null || list.Count <= 1)
     {
         return null;
     }
     return list.ConvertAll(SpecViewModel.FromModel);
 }
Example #43
0
 protected void SetLanguage(SyntaxLanguage syntaxLanguage)
 {
     CodeEditorSyntaxLoader.SetSyntax(txtText, syntaxLanguage);
 }
        /// <summary>
        /// Creates a new SQL (default) Scintilla editor with highlighting
        /// </summary>
        /// <param name="commandFactory">Unless your control is going to be 100% ReadOnly then you should supply an <see cref="ICombineableFactory"/> to allow dragging and
        /// dropping components into the window.  The <see cref="ICombineableFactory"/> will decide whether the given object can be translated into an <see cref="ICombineToMakeCommand"/> and hence into a unique bit of SQL
        /// to add to the editor</param>
        /// <param name="language">Determines highlighting, options include mssql,csharp or null</param>
        /// <param name="syntaxHelper"></param>
        /// <param name="spellCheck"></param>
        /// <param name="lineNumbers"></param>
        /// <param name="currentDirectory"></param>
        /// <returns></returns>
        public Scintilla Create(ICombineableFactory commandFactory = null, SyntaxLanguage language = SyntaxLanguage.SQL, IQuerySyntaxHelper syntaxHelper = null, bool spellCheck = false, bool lineNumbers = true, string currentDirectory = null)
        {
            var toReturn = new Scintilla();

            toReturn.Dock       = DockStyle.Fill;
            toReturn.HScrollBar = true;
            toReturn.VScrollBar = true;

            if (lineNumbers)
            {
                toReturn.Margins[0].Width = 40; //allows display of line numbers
            }
            else
            {
                foreach (var margin in toReturn.Margins)
                {
                    margin.Width = 0;
                }
            }

            toReturn.ClearCmdKey(Keys.Control | Keys.S); //prevent Ctrl+S displaying ascii code
            toReturn.ClearCmdKey(Keys.Control | Keys.R); //prevent Ctrl+R displaying ascii code
            toReturn.ClearCmdKey(Keys.Control | Keys.W); //prevent Ctrl+W displaying ascii code

            switch (language)
            {
            case SyntaxLanguage.SQL:
                SetSQLHighlighting(toReturn, syntaxHelper);
                break;

            case SyntaxLanguage.CSharp:
                SetCSharpHighlighting(toReturn);
                break;

            case SyntaxLanguage.XML:
                SetLexerEnumHighlighting(toReturn, Lexer.Xml);
                break;

            case SyntaxLanguage.LogFile:
                SetLexerEnumHighlighting(toReturn, Lexer.Verilog);
                break;
            }

            if (commandFactory != null)
            {
                toReturn.AllowDrop  = true;
                toReturn.DragEnter += (s, e) => OnDragEnter(s, e, commandFactory);
                toReturn.DragDrop  += (s, e) => OnDragDrop(s, e, commandFactory);
            }

            toReturn.WrapMode = (WrapMode)UserSettings.WrapMode;
            var scintillaMenu = new ScintillaMenu(toReturn, spellCheck);

            toReturn.ContextMenuStrip = scintillaMenu;

            try
            {
                if (spellCheck)
                {
                    string aff;
                    string dic;

                    if (currentDirectory == null)
                    {
                        aff = "en_us.aff";
                        dic = "en_us.dic";
                    }
                    else
                    {
                        aff = Path.Combine(currentDirectory, "en_us.aff");
                        dic = Path.Combine(currentDirectory, "en_us.dic");
                    }

                    var hunspell = new Hunspell(aff, dic);

                    DateTime lastCheckedSpelling = DateTime.MinValue;

                    toReturn.KeyPress += (s, e) =>
                    {
                        if (DateTime.Now.Subtract(lastCheckedSpelling) > TimeSpan.FromSeconds(10))
                        {
                            lastCheckedSpelling = DateTime.Now;
                            CheckSpelling((Scintilla)s, hunspell);
                        }
                    };

                    toReturn.Leave        += (s, e) => CheckSpelling((Scintilla)s, hunspell);
                    toReturn.Disposed     += (s, e) => scintilla_Disposed(s, e, hunspell);
                    scintillaMenu.Hunspell = hunspell;
                }
            }
            catch (Exception e)
            {
                if (!DictionaryExceptionShown)
                {
                    ExceptionViewer.Show("Could not load dictionary", e);
                    DictionaryExceptionShown = true;
                }
            }

            return(toReturn);
        }