Browse Source

Fixed SD2-1652: "Cannot save with current encoding" not implemented in AvalonEdit.AddIn

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5630 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Daniel Grunwald 15 years ago
parent
commit
6c771a6218
  1. 9
      data/resources/StringResources.resx
  2. 28
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs
  3. 18
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs

9
data/resources/StringResources.resx

@ -890,6 +890,15 @@ SharpDevelop can collect this information and upload it automatically.</value> @@ -890,6 +890,15 @@ SharpDevelop can collect this information and upload it automatically.</value>
<data name="AddIns.XamlBinding.Options.UseExtensionCompletion" xml:space="preserve">
<value>Use markup extension completion</value>
</data>
<data name="AvalonEdit.FileEncoding.EncodingCausesDataLoss" xml:space="preserve">
<value>The file cannot be saved with the current encoding ${encoding} without losing data.</value>
</data>
<data name="AvalonEdit.FileEncoding.EncodingCausesDataLoss.Continue" xml:space="preserve">
<value>Continue</value>
</data>
<data name="AvalonEdit.FileEncoding.EncodingCausesDataLoss.UseUTF8" xml:space="preserve">
<value>Save as UTF-8</value>
</data>
<data name="BackendBindings.ExecutionManager.CantExecuteDLLError" xml:space="preserve">
<value>Project is configured as dll and no execution command is specified.
You can specifiy an execution command in the project options.</value>

28
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs

@ -77,8 +77,36 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -77,8 +77,36 @@ namespace ICSharpCode.AvalonEdit.AddIn
{
if (file != PrimaryFile)
return;
if (codeEditor.CanSaveWithCurrentEncoding()) {
codeEditor.Save(stream);
} else {
int r = MessageService.ShowCustomDialog(
"${res:Dialog.Options.IDEOptions.TextEditor.General.FontGroupBox.FileEncodingGroupBox}",
StringParser.Parse("${res:AvalonEdit.FileEncoding.EncodingCausesDataLoss}",
new StringTagPair("encoding", codeEditor.Encoding.EncodingName)),
0, -1,
"${res:AvalonEdit.FileEncoding.EncodingCausesDataLoss.UseUTF8}",
"${res:AvalonEdit.FileEncoding.EncodingCausesDataLoss.Continue}");
if (r == 1) {
// continue saving with data loss
MemoryStream ms = new MemoryStream();
codeEditor.Save(ms);
ms.Position = 0;
ms.WriteTo(stream);
ms.Position = 0;
// Read back the version we just saved to show the data loss to the user (he'll be able to press Undo).
using (StreamReader reader = new StreamReader(ms, codeEditor.Encoding, false)) {
codeEditor.Document.Text = reader.ReadToEnd();
}
return;
} else {
// unfortunately we don't support cancel within IViewContent.Save, so we'll use the safe choice of UTF-8 instead
codeEditor.Encoding = System.Text.Encoding.UTF8;
codeEditor.Save(stream);
}
}
}
bool isLoading;

18
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs

@ -250,6 +250,24 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -250,6 +250,24 @@ namespace ICSharpCode.AvalonEdit.AddIn
/// </summary>
public bool UseFixedEncoding { get; set; }
public Encoding Encoding {
get { return primaryTextEditor.Encoding; }
set { primaryTextEditor.Encoding = value; }
}
/// <summary>
/// Gets if the document can be saved with the current encoding without losing data.
/// </summary>
public bool CanSaveWithCurrentEncoding()
{
Encoding encoding = this.Encoding;
if (encoding == null || Utils.FileReader.IsUnicode(encoding))
return true;
// not a unicode codepage
string text = document.Text;
return encoding.GetString(encoding.GetBytes(text)) == text;
}
// always use primary text editor for loading/saving
// (the file encoding is stored only there)
public void Load(Stream stream)

Loading…
Cancel
Save