diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/NewFileDialog.cs b/src/Main/Base/Project/Src/Gui/Dialogs/NewFileDialog.cs index da2a856952..c1220f313e 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/NewFileDialog.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/NewFileDialog.cs @@ -373,7 +373,7 @@ namespace ICSharpCode.SharpDevelop.Gui return true; } - public void SaveFile(FileDescriptionTemplate newfile, string content) + public void SaveFile(FileDescriptionTemplate newfile, string content, byte[] binaryContent) { string parsedFileName = StringParser.Parse(newfile.Name); // Parse twice so that tags used in included standard header are parsed @@ -382,9 +382,16 @@ namespace ICSharpCode.SharpDevelop.Gui parsedFileName = parsedFileName.Substring(1); if (newfile.IsDependentFile && Path.IsPathRooted(parsedFileName)) { Directory.CreateDirectory(Path.GetDirectoryName(parsedFileName)); - File.WriteAllText(parsedFileName, parsedContent, ParserService.DefaultFileEncoding); + if (binaryContent != null) + File.WriteAllBytes(parsedFileName, binaryContent); + else + File.WriteAllText(parsedFileName, parsedContent, ParserService.DefaultFileEncoding); ParserService.ParseFile(parsedFileName, parsedContent); } else { + if (binaryContent != null) { + LoggingService.Warn("binary file was skipped"); + return; + } IWorkbenchWindow window = FileService.NewFile(Path.GetFileName(parsedFileName), StringParser.Parse(newfile.Language), parsedContent); if (window == null) { return; @@ -486,7 +493,11 @@ namespace ICSharpCode.SharpDevelop.Gui ScriptRunner scriptRunner = new ScriptRunner(); foreach (FileDescriptionTemplate newfile in item.Template.FileDescriptionTemplates) { - SaveFile(newfile, scriptRunner.CompileScript(item.Template, newfile)); + if (newfile.ContentData != null) { + SaveFile(newfile, null, newfile.ContentData); + } else { + SaveFile(newfile, scriptRunner.CompileScript(item.Template, newfile), null); + } } DialogResult = DialogResult.OK; } diff --git a/src/Main/Base/Project/Src/Internal/Templates/File/FileDescriptionTemplate.cs b/src/Main/Base/Project/Src/Internal/Templates/File/FileDescriptionTemplate.cs index 6145f2c11d..7c55f2311d 100644 --- a/src/Main/Base/Project/Src/Internal/Templates/File/FileDescriptionTemplate.cs +++ b/src/Main/Base/Project/Src/Internal/Templates/File/FileDescriptionTemplate.cs @@ -19,7 +19,11 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates { string name; string language; + + // Either content or contentData is set, the other is null string content; + byte[] contentData; + string buildAction; string copyToOutputDirectory; string dependentUpon; @@ -42,7 +46,11 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates if (xml.HasAttribute("src")) { string fileName = Path.Combine(hintPath, StringParser.Parse(xml.GetAttribute("src"))); try { - content = File.ReadAllText(fileName); + if (xml.HasAttribute("binary") && bool.Parse(xml.GetAttribute("binary"))) { + contentData = File.ReadAllBytes(fileName); + } else { + content = File.ReadAllText(fileName); + } } catch (Exception e) { content = "Error reading content from " + fileName + ":\n" + e.ToString(); LoggingService.Warn(content); @@ -95,6 +103,12 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates } } + public byte[] ContentData { + get { + return contentData; + } + } + public string BuildAction { get { return buildAction ?? ""; diff --git a/src/Main/Base/Project/Src/Internal/Templates/File/ScriptRunner.cs b/src/Main/Base/Project/Src/Internal/Templates/File/ScriptRunner.cs index 382b960b81..b76df9ddae 100644 --- a/src/Main/Base/Project/Src/Internal/Templates/File/ScriptRunner.cs +++ b/src/Main/Base/Project/Src/Internal/Templates/File/ScriptRunner.cs @@ -33,6 +33,8 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates public string CompileScript(FileTemplate item, FileDescriptionTemplate file) { + if (file.Content == null) + throw new ArgumentException("file must have textual content"); Match m = scriptRegex.Match(file.Content); m = m.NextMatch(); if (m.Success) { diff --git a/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs b/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs index 28cfea7103..78d57cddc4 100644 --- a/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs +++ b/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs @@ -202,11 +202,15 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates if (!Directory.Exists(Path.GetDirectoryName(fileName))) { Directory.CreateDirectory(Path.GetDirectoryName(fileName)); } - Properties properties = ((Properties)PropertyService.Get("ICSharpCode.TextEditor.Document.Document.DefaultDocumentAggregatorProperties", new Properties())); - - StreamWriter sr = new StreamWriter(File.Create(fileName), Encoding.GetEncoding(properties.Get("Encoding", 1252))); - sr.Write(StringParser.Parse(StringParser.Parse(file.Content, new string[,] { {"ProjectName", projectCreateInformation.ProjectName}, {"FileName", fileName}}))); - sr.Close(); + if (file.ContentData != null) { + // Binary content + File.WriteAllBytes(fileName, file.ContentData); + } else { + // Textual content + StreamWriter sr = new StreamWriter(File.Create(fileName), ParserService.DefaultFileEncoding); + sr.Write(StringParser.Parse(StringParser.Parse(file.Content, new string[,] { {"ProjectName", projectCreateInformation.ProjectName}, {"FileName", fileName}}))); + sr.Close(); + } } catch (Exception ex) { StringParser.Properties["fileName"] = fileName; MessageService.ShowError(ex, "${res:ICSharpCode.SharpDevelop.Internal.Templates.ProjectDescriptor.FileCouldntBeWrittenError}"); diff --git a/src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Gui/SearchAndReplacePanel.cs b/src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Gui/SearchAndReplacePanel.cs index 45afaa9560..05e8643283 100644 --- a/src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Gui/SearchAndReplacePanel.cs +++ b/src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Gui/SearchAndReplacePanel.cs @@ -42,11 +42,13 @@ namespace SearchAndReplace SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.FindPanel.xfrm")); Get