diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XPathNodeTextMarker.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XPathNodeTextMarker.cs index c5825a3d43..2113a66deb 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XPathNodeTextMarker.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XPathNodeTextMarker.cs @@ -6,6 +6,7 @@ // using System; +using System.Linq; using System.Collections.Generic; using System.Drawing; @@ -25,7 +26,7 @@ namespace ICSharpCode.XmlEditor XPathNodeTextMarker(IDocument document, int offset, XPathNodeMatch node) { ITextMarkerService markerService = document.GetService(typeof(ITextMarkerService)) as ITextMarkerService; - marker = markerService.Create(offset, node.DisplayValue.Length); + marker = markerService.Create(offset, node.Value.Length); marker.Tag = this; } @@ -55,9 +56,12 @@ namespace ICSharpCode.XmlEditor public static void RemoveMarkers(IDocument document) { ITextMarkerService markerService = document.GetService(typeof(ITextMarkerService)) as ITextMarkerService; - foreach (ITextMarker marker in markerService.TextMarkers) { - if (marker.Tag is XPathNodeTextMarker) - marker.Delete(); + + ITextMarker[] list = markerService.TextMarkers.ToArray(); + + foreach (ITextMarker item in list) { + if (item.Tag is XPathNodeTextMarker) + item.Delete(); } } } diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlTreeView.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlTreeView.cs index d1f29baf9d..bc6e0d83dd 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlTreeView.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlTreeView.cs @@ -25,12 +25,14 @@ namespace ICSharpCode.XmlEditor public class XmlTreeView : AbstractSecondaryViewContent, IClipboardHandler { XmlTreeViewContainerControl treeViewContainer; + bool ignoreDirtyChange; public XmlTreeView(IViewContent parent) : base(parent) { this.TabPageText = "XML Tree"; this.treeViewContainer = new XmlTreeViewContainerControl(); + this.treeViewContainer.DirtyChanged += TreeViewContainerDirtyChanged; treeViewContainer.AttributesGrid.ContextMenuStrip = MenuService.CreateContextMenu(treeViewContainer, "/AddIns/XmlEditor/XmlTree/AttributesGrid/ContextMenu"); treeViewContainer.TreeView.ContextMenuStrip = MenuService.CreateContextMenu(treeViewContainer, "/AddIns/XmlEditor/XmlTree/ContextMenu"); } @@ -133,19 +135,23 @@ namespace ICSharpCode.XmlEditor { IFileDocumentProvider provider = this.PrimaryViewContent as IFileDocumentProvider; treeViewContainer.LoadXml(provider.GetDocumentForFile(this.PrimaryFile).Text, XmlView.GetProvider(Path.GetExtension(this.PrimaryFileName))); + XmlView view = XmlView.ForFile(this.PrimaryFile); + if (view != null) { + view.CheckIsWellFormed(); + } } protected override void SaveToPrimary() { // Do not modify text in the primary view if the data is not well-formed XML if (!treeViewContainer.IsErrorMessageTextBoxVisible && treeViewContainer.IsDirty) { - IFileDocumentProvider provider = this.PrimaryViewContent as IFileDocumentProvider; - StringWriter str = new StringWriter(CultureInfo.InvariantCulture); - XmlTextWriter writer = new XmlTextWriter(str); - - writer.Formatting = Formatting.Indented; - treeViewContainer.Document.WriteTo(writer); - provider.GetDocumentForFile(this.PrimaryFile).Text = str.ToString(); + XmlView view = XmlView.ForFile(this.PrimaryFile); + if (view != null) { + view.ReplaceAll(treeViewContainer.Document.OuterXml); + ignoreDirtyChange = true; + treeViewContainer.IsDirty = false; + ignoreDirtyChange = false; + } } } @@ -169,5 +175,12 @@ namespace ICSharpCode.XmlEditor { return false; } + + void TreeViewContainerDirtyChanged(object source, EventArgs e) + { + if (!ignoreDirtyChange) { + this.PrimaryFile.IsDirty = treeViewContainer.IsDirty; + } + } } } diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlView.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlView.cs index 93752f966e..85ef27b047 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlView.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlView.cs @@ -83,7 +83,7 @@ namespace ICSharpCode.XmlEditor XmlSchemaCompletionData defaultSchemaCompletionData; XmlSchemaCompletionDataCollection schemas; - if (PropertyService.Initialized) { + if (PropertyService.DataDirectory != null) { schemas = XmlSchemaManager.SchemaCompletionDataItems; defaultNamespacePrefix = XmlSchemaManager.GetNamespacePrefix(extension); defaultSchemaCompletionData = XmlSchemaManager.GetSchemaCompletionData(extension); @@ -202,21 +202,26 @@ namespace ICSharpCode.XmlEditor /// public bool IsWellFormed { get { - ITextEditor editor = TextEditor; - if (editor == null) - return false; - - try { - XmlDocument Document = new XmlDocument(); - Document.LoadXml(editor.Document.Text); - return true; - } catch(XmlException ex) { - AddTask(editor.FileName, ex.Message, ex.LinePosition - 1, ex.LineNumber - 1, TaskType.Error); - } catch (WebException ex) { - AddTask(editor.FileName, ex.Message, 0, 0, TaskType.Error); - } - return false; + return CheckIsWellFormed(); + } + } + + public bool CheckIsWellFormed() + { + ITextEditor editor = TextEditor; + if (editor == null) return false; + try { + XmlDocument Document = new XmlDocument(); + Document.LoadXml(editor.Document.Text); + return true; + } + catch (XmlException ex) { + AddTask(editor.FileName, ex.Message, ex.LinePosition - 1, ex.LineNumber - 1, TaskType.Error); } + catch (WebException ex) { + AddTask(editor.FileName, ex.Message, 0, 0, TaskType.Error); + } + return false; } static void AddTask(string fileName, string message, int column, int line, TaskType taskType) diff --git a/src/AddIns/DisplayBindings/XmlEditor/Test/Tree/XmlTreeViewClipboardHandlerTestFixture.cs b/src/AddIns/DisplayBindings/XmlEditor/Test/Tree/XmlTreeViewClipboardHandlerTestFixture.cs index fe3e4d855c..18b257b60c 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Test/Tree/XmlTreeViewClipboardHandlerTestFixture.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Test/Tree/XmlTreeViewClipboardHandlerTestFixture.cs @@ -103,7 +103,7 @@ namespace XmlEditor.Tests.Tree view.Copy(); view.Paste(); - Assert.IsTrue(xmlView.IsDirty); + Assert.IsTrue(view.IsDirty); Assert.AreEqual(htmlTreeNode.Text, htmlTreeNode.LastNode.Text); } @@ -115,7 +115,7 @@ namespace XmlEditor.Tests.Tree treeView.SelectedNode = htmlTreeNode; view.Paste(); - Assert.IsTrue(xmlView.IsDirty); + Assert.IsTrue(view.IsDirty); Assert.AreEqual(paragraphTreeNode.Text, htmlTreeNode.LastNode.Text); } @@ -127,7 +127,7 @@ namespace XmlEditor.Tests.Tree clipboardHandler.Delete(); Assert.AreEqual(0, treeView.Nodes.Count); - Assert.IsTrue(xmlView.IsDirty); + Assert.IsTrue(view.IsDirty); } } } diff --git a/src/AddIns/DisplayBindings/XmlEditor/Test/Utils/MockTextMarker.cs b/src/AddIns/DisplayBindings/XmlEditor/Test/Utils/MockTextMarker.cs index 6902f4d264..997fcc6c07 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Test/Utils/MockTextMarker.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Test/Utils/MockTextMarker.cs @@ -53,27 +53,23 @@ namespace XmlEditor.Tests.Utils public Nullable BackgroundColor { get { - return null; + throw new NotImplementedException(); } set { + throw new NotImplementedException(); } } public Nullable ForegroundColor { get { - return null; + throw new NotImplementedException(); } set { + throw new NotImplementedException(); } } - public object Tag { - get { - return null; - } - set { - } - } + public object Tag { get; set; } public void Delete() {