You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
4.5 KiB
200 lines
4.5 KiB
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) |
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) |
|
|
|
using System; |
|
using System.IO; |
|
using System.Xml; |
|
using System.Xml.Linq; |
|
|
|
using ICSharpCode.SharpDevelop.Gui; |
|
|
|
namespace ICSharpCode.SharpDevelop.Util |
|
{ |
|
/// <summary> |
|
/// IViewContent implementation that opens a file as XDocument and allows editing it, while synchronizing changes with any open editor. |
|
/// </summary> |
|
public sealed class FakeXmlViewContent : IViewContent |
|
{ |
|
public FakeXmlViewContent(string fileName) |
|
{ |
|
this.PrimaryFile = FileService.GetOrCreateOpenedFile(fileName); |
|
this.oldView = this.PrimaryFile.CurrentView; |
|
this.PrimaryFile.RegisterView(this); |
|
this.PrimaryFile.SwitchedToView(this); |
|
} |
|
|
|
IViewContent oldView; |
|
XDocument document; |
|
byte[] fileData; |
|
|
|
/// <summary> |
|
/// Gets the document. |
|
/// Can return null if there were load errors. |
|
/// </summary> |
|
public XDocument Document { |
|
get { return document; } |
|
} |
|
|
|
public void Dispose() |
|
{ |
|
if (this.IsDisposed) |
|
return; |
|
this.IsDisposed = true; |
|
if (document != null) { |
|
this.PrimaryFile.MakeDirty(); |
|
if (this.PrimaryFile.RegisteredViewContents.Count == 1) |
|
this.PrimaryFile.SaveToDisk(); |
|
} |
|
this.PrimaryFile.UnregisterView(this); |
|
if (oldView != null) |
|
this.PrimaryFile.SwitchedToView(oldView); |
|
if (Disposed != null) |
|
Disposed(this, EventArgs.Empty); |
|
} |
|
|
|
void IViewContent.Save(OpenedFile file, Stream stream) |
|
{ |
|
if (document != null) |
|
document.Save(stream, SaveOptions.DisableFormatting); |
|
else if (fileData != null) |
|
stream.Write(fileData, 0, fileData.Length); |
|
} |
|
|
|
void IViewContent.Load(OpenedFile file, Stream stream) |
|
{ |
|
document = null; |
|
fileData = null; |
|
|
|
try { |
|
document = XDocument.Load(stream, LoadOptions.PreserveWhitespace); |
|
} catch (XmlException) { |
|
stream.Position = 0; |
|
fileData = new byte[(int)stream.Length]; |
|
int pos = 0; |
|
while (pos < fileData.Length) { |
|
int c = stream.Read(fileData, pos, fileData.Length - pos); |
|
if (c == 0) break; |
|
pos += c; |
|
} |
|
} |
|
} |
|
|
|
#region IViewContent stub implementation |
|
event EventHandler IViewContent.TabPageTextChanged { |
|
add { } |
|
remove { } |
|
} |
|
|
|
event EventHandler IViewContent.TitleNameChanged { |
|
add { } |
|
remove { } |
|
} |
|
|
|
public event EventHandler Disposed; |
|
|
|
event EventHandler ICanBeDirty.IsDirtyChanged { |
|
add { } |
|
remove { } |
|
} |
|
|
|
object IViewContent.Control { |
|
get { |
|
throw new NotImplementedException(); |
|
} |
|
} |
|
|
|
object IViewContent.InitiallyFocusedControl { |
|
get { |
|
throw new NotImplementedException(); |
|
} |
|
} |
|
|
|
IWorkbenchWindow IViewContent.WorkbenchWindow { |
|
get { |
|
throw new NotImplementedException(); |
|
} |
|
set { |
|
throw new NotImplementedException(); |
|
} |
|
} |
|
|
|
string IViewContent.TabPageText { |
|
get { |
|
throw new NotImplementedException(); |
|
} |
|
} |
|
|
|
string IViewContent.TitleName { |
|
get { |
|
throw new NotImplementedException(); |
|
} |
|
} |
|
|
|
System.Collections.Generic.IList<OpenedFile> IViewContent.Files { |
|
get { return new [] { PrimaryFile }; } |
|
} |
|
|
|
public OpenedFile PrimaryFile { get; set; } |
|
|
|
ICSharpCode.Core.FileName IViewContent.PrimaryFileName { |
|
get { return PrimaryFile.FileName; } |
|
} |
|
|
|
public bool IsDisposed { get; private set; } |
|
|
|
bool IViewContent.IsReadOnly { |
|
get { |
|
throw new NotImplementedException(); |
|
} |
|
} |
|
|
|
bool IViewContent.IsViewOnly { |
|
get { |
|
throw new NotImplementedException(); |
|
} |
|
} |
|
|
|
System.Collections.Generic.ICollection<IViewContent> IViewContent.SecondaryViewContents { |
|
get { |
|
throw new NotImplementedException(); |
|
} |
|
} |
|
|
|
bool ICanBeDirty.IsDirty { |
|
get { |
|
throw new NotImplementedException(); |
|
} |
|
} |
|
|
|
INavigationPoint IViewContent.BuildNavPoint() |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
bool IViewContent.SupportsSwitchFromThisWithoutSaveLoad(OpenedFile file, IViewContent newView) |
|
{ |
|
return false; |
|
} |
|
|
|
bool IViewContent.SupportsSwitchToThisWithoutSaveLoad(OpenedFile file, IViewContent oldView) |
|
{ |
|
return false; |
|
} |
|
|
|
void IViewContent.SwitchFromThisWithoutSaveLoad(OpenedFile file, IViewContent newView) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
void IViewContent.SwitchToThisWithoutSaveLoad(OpenedFile file, IViewContent oldView) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
object IServiceProvider.GetService(Type serviceType) |
|
{ |
|
return null; |
|
} |
|
#endregion |
|
} |
|
}
|
|
|