Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge branch '4.0'

  • Loading branch information...
commit 76f209348c89f2e92c1fe2ac1b8b13779ea6c2fc 2 parents 1b2c8b4 + 32c1efa
@dgrunwald dgrunwald authored
Showing with 456 additions and 351 deletions.
  1. +3 −0  data/resources/StringResources.resx
  2. +1 −2  data/templates/file/CSharp/CSharp.UnitTest.xft
  3. +2 −4 src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingStrategy.cs
  4. +5 −0 src/AddIns/BackendBindings/Scripting/Test/Utils/FakeDocument.cs
  5. +32 −41 src/AddIns/BackendBindings/VBNetBinding/Project/Src/Parser/Parser.cs
  6. +4 −2 src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs
  7. +5 −0 src/AddIns/DisplayBindings/XmlEditor/Test/Utils/MockDocument.cs
  8. +1 −1  src/AddIns/Misc/AddInManager/Project/Src/Commands.cs
  9. +1 −1  src/AddIns/Misc/SearchAndReplace/Project/Engine/Search.cs
  10. +1 −2  src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchAndReplacePanel.cs
  11. +5 −0 src/AddIns/Misc/SearchAndReplace/Test/MockDocument.cs
  12. +6 −4 src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/AbstractInlineRefactorDialog.cs
  13. +33 −9 src/AddIns/VersionControl/GitAddIn/Src/RegisterEventsCommand.cs
  14. +3 −3 src/AddIns/VersionControl/SubversionAddIn/Src/Commands/AutostartCommands.cs
  15. +2 −0  src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/DocumentChangeOperation.cs
  16. +4 −1 src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/TextDocument.cs
  17. +2 −3 src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/UndoOperationGroup.cs
  18. +38 −25 src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/UndoStack.cs
  19. +6 −5 src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/SnippetAnchorElement.cs
  20. +15 −7 src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/SnippetBoundElement.cs
  21. +1 −0  src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/SnippetCaretElement.cs
  22. +10 −3 src/Main/Base/Project/ICSharpCode.SharpDevelop.addin
  23. +26 −2 src/Main/Base/Project/Src/Editor/AvalonEdit/AvalonEditDocumentAdapter.cs
  24. +1 −0  src/Main/Base/Project/Src/Editor/IDocument.cs
  25. +7 −4 src/Main/Base/Project/Src/Editor/IFormattingStrategy.cs
  26. +10 −3 src/Main/Base/Project/Src/Editor/ReadOnlyDocument.cs
  27. +2 −5 src/Main/Base/Project/Src/Editor/Search/ProvidedDocumentInformation.cs
  28. +3 −1 src/Main/Base/Project/Src/Gui/Dialogs/TabbedOptions.cs
  29. +3 −1 src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs
  30. +8 −6 src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs
  31. +5 −3 src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs
  32. +10 −5 src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs
  33. +38 −6 src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs
  34. +3 −13 src/Main/Base/Project/Src/Project/Solution/Solution.cs
  35. +16 −1 src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs
  36. +8 −3 src/Main/Base/Project/Src/Services/File/FileService.cs
  37. +5 −3 src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs
  38. +1 −0  src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs
  39. +1 −1  src/Main/Base/Project/Src/Services/Tasks/ErrorPainter.cs
  40. +128 −159 src/Setup/Files.wxs
  41. +1 −22 src/Setup/Setup.wxs
View
3  data/resources/StringResources.resx
@@ -8030,6 +8030,9 @@ The resources files have been renamed/moved accordingly.</value>
<value>Open new buffer</value>
</data>
<data name="XML.MainMenu.FileMenu.New.Project" xml:space="preserve">
+ <value>&amp;Project...</value>
+ </data>
+ <data name="XML.MainMenu.FileMenu.New.Solution" xml:space="preserve">
<value>&amp;Solution...</value>
</data>
<data name="XML.MainMenu.FileMenu.Open" xml:space="preserve">
View
3  data/templates/file/CSharp/CSharp.UnitTest.xft
@@ -53,8 +53,7 @@
<Files>
<File name="${FullName}" language="C#"><![CDATA[${StandardHeader.C#}
<% if (ConditionalClass) { %>#if TEST
-<% } %>
-using System;
+<% } %>using System;
using NUnit.Framework;
namespace ${StandardNamespace}
View
6 .../BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingStrategy.cs
@@ -313,7 +313,7 @@ void FormatLineInternal(ITextEditor textArea, int lineNr, int cursorOffset, char
case '>':
if (IsInsideDocumentationComment(textArea, curLine, cursorOffset)) {
curLineText = curLine.Text;
- int column = textArea.Caret.Offset - curLine.Offset;
+ int column = cursorOffset - curLine.Offset;
int index = Math.Min(column - 1, curLineText.Length - 1);
while (index >= 0 && curLineText[index] != '<') {
@@ -332,9 +332,7 @@ void FormatLineInternal(ITextEditor textArea, int lineNr, int cursorOffset, char
tag += ">";
}
if (!tag.StartsWith("/")) {
- int caretOffset = textArea.Caret.Offset;
- textArea.Document.Insert(caretOffset, "</" + tag.Substring(1));
- textArea.Caret.Offset = caretOffset;
+ textArea.Document.Insert(cursorOffset, "</" + tag.Substring(1), AnchorMovementType.BeforeInsertion);
}
}
}
View
5 src/AddIns/BackendBindings/Scripting/Test/Utils/FakeDocument.cs
@@ -67,6 +67,11 @@ public void Insert(int offset, string text)
throw new NotImplementedException();
}
+ public void Insert(int offset, string text, AnchorMovementType defaultAnchorMovementType)
+ {
+ throw new NotImplementedException();
+ }
+
public void Remove(int offset, int length)
{
throw new NotImplementedException();
View
73 src/AddIns/BackendBindings/VBNetBinding/Project/Src/Parser/Parser.cs
@@ -2,7 +2,10 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
+using System.Collections.Generic;
using System.IO;
+using System.Linq;
+
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.NRefactoryResolver;
@@ -17,18 +20,12 @@ public class TParser : IParser
string[] lexerTags;
public string[] LexerTags {
- get {
- return lexerTags;
- }
- set {
- lexerTags = value;
- }
+ get { return lexerTags; }
+ set { lexerTags = value; }
}
public LanguageProperties Language {
- get {
- return LanguageProperties.VBNet;
- }
+ get { return LanguageProperties.VBNet; }
}
public IExpressionFinder CreateExpressionFinder(string fileName)
@@ -48,42 +45,36 @@ public bool CanParse(IProject project)
static void RetrieveRegions(ICompilationUnit cu, ICSharpCode.NRefactory.Parser.SpecialTracker tracker)
{
- for (int i = 0; i < tracker.CurrentSpecials.Count; ++i)
- {
- ICSharpCode.NRefactory.PreprocessingDirective directive = tracker.CurrentSpecials[i] as ICSharpCode.NRefactory.PreprocessingDirective;
- if (directive != null)
- {
- if (directive.Cmd.Equals("#region", StringComparison.OrdinalIgnoreCase))
- {
- int deep = 1;
- for (int j = i + 1; j < tracker.CurrentSpecials.Count; ++j)
- {
- ICSharpCode.NRefactory.PreprocessingDirective nextDirective = tracker.CurrentSpecials[j] as ICSharpCode.NRefactory.PreprocessingDirective;
- if (nextDirective != null)
- {
- switch (nextDirective.Cmd.ToUpperInvariant())
- {
- case "#REGION":
- ++deep;
- break;
- case "#END":
- if (nextDirective.Arg.Equals("region", StringComparison.OrdinalIgnoreCase)) {
- --deep;
- if (deep == 0) {
- cu.FoldingRegions.Add(new FoldingRegion(directive.Arg.Trim('"'), DomRegion.FromLocation(directive.StartPosition, nextDirective.EndPosition)));
- goto end;
- }
- }
- break;
- }
- }
- }
- end: ;
- }
+ Stack<ICSharpCode.NRefactory.PreprocessingDirective> regionStartDirectives = new Stack<ICSharpCode.NRefactory.PreprocessingDirective>();
+
+ foreach (ICSharpCode.NRefactory.PreprocessingDirective directive in tracker.CurrentSpecials.OfType<ICSharpCode.NRefactory.PreprocessingDirective>()) {
+ if (directive.Cmd.Equals("#region", StringComparison.OrdinalIgnoreCase))
+ regionStartDirectives.Push(directive);
+ if (directive.Cmd.Equals("#end", StringComparison.OrdinalIgnoreCase)
+ // using StartsWith allows comments at end of line
+ // fixes http://community.sharpdevelop.net/forums/t/12252.aspx
+ && directive.Arg.StartsWith("region", StringComparison.OrdinalIgnoreCase)
+ && regionStartDirectives.Any()) {
+ ICSharpCode.NRefactory.PreprocessingDirective start = regionStartDirectives.Pop();
+ cu.FoldingRegions.Add(new FoldingRegion(TrimComment(start.Arg).Trim('"'), DomRegion.FromLocation(start.StartPosition, directive.EndPosition)));
}
}
}
+ static string TrimComment(string argument)
+ {
+ bool inStr = false;
+
+ for (int i = 0; i < argument.Length; i++) {
+ if (argument[i] == '"')
+ inStr = !inStr;
+ if (argument[i] == '\'' && !inStr)
+ return argument.Substring(0, i).Trim();
+ }
+
+ return argument;
+ }
+
public ICompilationUnit Parse(IProjectContent projectContent, string fileName, ICSharpCode.SharpDevelop.ITextBuffer fileContent)
{
using (ICSharpCode.NRefactory.IParser p = ICSharpCode.NRefactory.ParserFactory.CreateParser(ICSharpCode.NRefactory.SupportedLanguage.VBNet, fileContent.CreateReader())) {
View
6 src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs
@@ -143,8 +143,10 @@ public void Execute(object parameter)
if (snippet != null) {
snippet.TrackUsage("CustomTabCommand");
- editor.Adapter.Document.Remove(wordStart, editor.CaretOffset - wordStart);
- snippet.CreateAvalonEditSnippet(editor.Adapter).Insert(editor.TextArea);
+ using (editor.Document.RunUpdate()) {
+ editor.Adapter.Document.Remove(wordStart, editor.CaretOffset - wordStart);
+ snippet.CreateAvalonEditSnippet(editor.Adapter).Insert(editor.TextArea);
+ }
return;
}
}
View
5 src/AddIns/DisplayBindings/XmlEditor/Test/Utils/MockDocument.cs
@@ -81,6 +81,11 @@ public void Insert(int offset, string text)
throw new NotImplementedException();
}
+ public void Insert(int offset, string text, AnchorMovementType defaultAnchorMovementType)
+ {
+ throw new NotImplementedException();
+ }
+
public void Remove(int offset, int length)
{
throw new NotImplementedException();
View
2  src/AddIns/Misc/AddInManager/Project/Src/Commands.cs
@@ -139,7 +139,7 @@ public override void Run()
AddInTreeNode dummyNode = new AddInTreeNode();
foreach (KeyValuePair<string, ExtensionPath> pair in addIn.Paths) {
if (pair.Key.StartsWith("/SharpDevelop/Dialogs/OptionsDialog")) {
- dummyNode.Codons.AddRange(pair.Value.Codons);
+ dummyNode.AddCodons(pair.Value.Codons);
}
}
ICSharpCode.SharpDevelop.Commands.OptionsCommand.ShowTabbedOptions(addIn.Name + " " + ResourceService.GetString("AddInManager.Options"),
View
2  src/AddIns/Misc/SearchAndReplace/Project/Engine/Search.cs
@@ -145,7 +145,7 @@ public SearchResultMatch FindNext(int offset, int length)
if (documentIterator.MoveForward()) {
info = documentIterator.Current;
// document is valid for searching -> set iterator & fileName
- if (info != null && info.EndOffset >= 0 && info.EndOffset <= info.Document.TextLength) {
+ if (info != null && info.EndOffset >= 0 && info.EndOffset < info.Document.TextLength) {
textIterator = textIteratorBuilder.BuildTextIterator(info);
} else {
textIterator = null;
View
3  src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchAndReplacePanel.cs
@@ -432,8 +432,7 @@ void RunAllInSelection(int action)
SearchReplaceManager.MarkAll(startOffset, endOffset - startOffset, monitor);
else if (action == 2)
SearchReplaceManager.ReplaceAll(startOffset, endOffset - startOffset, monitor);
-
- textEditor.Select(startOffset, textEditor.SelectionLength);
+ textEditor.Select(startOffset, endOffset - startOffset);
} finally {
ignoreSelectionChanges = false;
}
View
5 src/AddIns/Misc/SearchAndReplace/Test/MockDocument.cs
@@ -62,6 +62,11 @@ public void Insert(int offset, string text)
throw new NotImplementedException();
}
+ public void Insert(int offset, string text, AnchorMovementType defaultAnchorMovementType)
+ {
+ throw new NotImplementedException();
+ }
+
public void Remove(int offset, int length)
{
throw new NotImplementedException();
View
10 src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/AbstractInlineRefactorDialog.cs
@@ -63,10 +63,12 @@ protected virtual void OKButtonClick(object sender, RoutedEventArgs e)
LanguageProperties language = parseInfo.CompilationUnit.Language;
IClass current = parseInfo.CompilationUnit.GetInnermostClass(anchor.Line, anchor.Column);
- // GenerateCode could modify the document.
- // So read anchor.Offset after code generation.
- string code = GenerateCode(language, current) ?? "";
- editor.Document.Insert(anchor.Offset, code);
+ using (editor.Document.OpenUndoGroup()) {
+ // GenerateCode could modify the document.
+ // So read anchor.Offset after code generation.
+ string code = GenerateCode(language, current) ?? "";
+ editor.Document.Insert(anchor.Offset, code);
+ }
}
Deactivate();
View
42 src/AddIns/VersionControl/GitAddIn/Src/RegisterEventsCommand.cs
@@ -14,16 +14,17 @@ public class RegisterEventsCommand : AbstractCommand
{
public override void Run()
{
- FileService.FileCreated += (sender, args) => {
- Git.Add(args.FileName,
- exitcode => WorkbenchSingleton.SafeThreadAsyncCall(ClearStatusCacheAndEnqueueFile, args.FileName)
- );
+ FileService.FileCreated += (sender, e) => {
+ AddFile(e.FileName);
};
- FileService.FileRemoved += (sender, args) => {
- if (GitStatusCache.GetFileStatus(args.FileName) == GitStatus.Added) {
- Git.Remove(args.FileName, true,
- exitcode => WorkbenchSingleton.SafeThreadAsyncCall(ClearStatusCacheAndEnqueueFile, args.FileName));
- }
+ FileService.FileCopied += (sender, e) => {
+ AddFile(e.TargetFile);
+ };
+ FileService.FileRemoved += (sender, e) => {
+ RemoveFile(e.FileName);
+ };
+ FileService.FileRenamed += (sender, e) => {
+ RenameFile(e.SourceFile, e.TargetFile);
};
FileUtility.FileSaved += (sender, e) => {
ClearStatusCacheAndEnqueueFile(e.FileName);
@@ -31,6 +32,29 @@ public override void Run()
AbstractProjectBrowserTreeNode.OnNewNode += TreeNodeCreated;
}
+ void AddFile(string fileName)
+ {
+ Git.Add(fileName,
+ exitcode => WorkbenchSingleton.SafeThreadAsyncCall(ClearStatusCacheAndEnqueueFile, fileName)
+ );
+ }
+
+ void RemoveFile(string fileName)
+ {
+ if (GitStatusCache.GetFileStatus(fileName) == GitStatus.Added) {
+ Git.Remove(fileName, true,
+ exitcode => WorkbenchSingleton.SafeThreadAsyncCall(ClearStatusCacheAndEnqueueFile, fileName));
+ }
+ }
+
+ void RenameFile(string sourceFileName, string targetFileName)
+ {
+ Git.Add(targetFileName,
+ exitcode => WorkbenchSingleton.SafeThreadAsyncCall(RemoveFile, sourceFileName)
+ );
+ WorkbenchSingleton.SafeThreadAsyncCall(ClearStatusCacheAndEnqueueFile, targetFileName);
+ }
+
void TreeNodeCreated(object sender, TreeViewEventArgs e)
{
SolutionNode sn = e.Node as SolutionNode;
View
6 src/AddIns/VersionControl/SubversionAddIn/Src/Commands/AutostartCommands.cs
@@ -314,6 +314,8 @@ void FileCopying(object sender, FileRenamingEventArgs e)
if (!AddInOptions.AutomaticallyRenameFiles) return;
string fullSource = Path.GetFullPath(e.SourceFile);
if (!CanBeVersionControlledFile(fullSource)) return;
+ string fullTarget = Path.GetFullPath(e.TargetFile);
+ if (!CanBeVersionControlledFile(fullTarget)) return;
try {
using (SvnClientWrapper client = new SvnClientWrapper()) {
SvnMessageView.HandleNotifications(client);
@@ -335,9 +337,7 @@ void FileCopying(object sender, FileRenamingEventArgs e)
return;
}
e.OperationAlreadyDone = true;
- client.Copy(fullSource,
- Path.GetFullPath(e.TargetFile)
- );
+ client.Copy(fullSource, fullTarget);
}
} catch (Exception ex) {
MessageService.ShowError("File renamed exception: " + ex);
View
2  src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/DocumentChangeOperation.cs
@@ -23,6 +23,7 @@ public DocumentChangeOperation(TextDocument document, DocumentChangeEventArgs ch
public void Undo(UndoStack stack)
{
Debug.Assert(stack.state == UndoStack.StatePlayback);
+ stack.RegisterAffectedDocument(document);
stack.state = UndoStack.StatePlaybackModifyDocument;
this.Undo();
stack.state = UndoStack.StatePlayback;
@@ -31,6 +32,7 @@ public void Undo(UndoStack stack)
public void Redo(UndoStack stack)
{
Debug.Assert(stack.state == UndoStack.StatePlayback);
+ stack.RegisterAffectedDocument(document);
stack.state = UndoStack.StatePlaybackModifyDocument;
this.Redo();
stack.state = UndoStack.StatePlayback;
View
5 src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/TextDocument.cs
@@ -98,7 +98,6 @@ public TextDocument(IEnumerable<char> initialText)
anchorTree = new TextAnchorTree(this);
undoStack = new UndoStack();
- undoStack.AttachToDocument(this);
FireChangeEvents();
}
@@ -354,6 +353,7 @@ public void BeginUpdate()
throw new InvalidOperationException("Cannot change document within another document change.");
beginUpdateCount++;
if (beginUpdateCount == 1) {
+ undoStack.StartUndoGroup();
if (UpdateStarted != null)
UpdateStarted(this, EventArgs.Empty);
}
@@ -374,6 +374,7 @@ public void EndUpdate()
// fire change events inside the change group - event handlers might add additional
// document changes to the change group
FireChangeEvents();
+ undoStack.EndUndoGroup();
beginUpdateCount = 0;
if (UpdateFinished != null)
UpdateFinished(this, EventArgs.Empty);
@@ -590,6 +591,8 @@ void DoReplace(int offset, int length, string newText, OffsetChangeMap offsetCha
if (Changing != null)
Changing(this, args);
+ undoStack.Push(this, args);
+
cachedText = null; // reset cache of complete document text
fireTextChanged = true;
DelayedEvents delayedEvents = new DelayedEvents();
View
5 src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/UndoOperationGroup.cs
@@ -22,9 +22,8 @@ public UndoOperationGroup(Deque<IUndoableOperation> stack, int numops)
}
Debug.Assert(numops > 0 , "UndoOperationGroup : numops should be > 0");
- if (numops > stack.Count) {
- numops = stack.Count;
- }
+ Debug.Assert(numops <= stack.Count);
+
undolist = new IUndoableOperation[numops];
for (int i = 0; i < numops; ++i) {
undolist[i] = stack.PopBack();
View
63 src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/UndoStack.cs
@@ -2,9 +2,9 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
+using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
-
using ICSharpCode.AvalonEdit.Utils;
namespace ICSharpCode.AvalonEdit.Document
@@ -213,6 +213,7 @@ public void EndUndoGroup()
undoGroupDepth--;
//Util.LoggingService.Debug("Close undo group (new depth=" + undoGroupDepth + ")");
if (undoGroupDepth == 0) {
+ Debug.Assert(state == StateListen || actionCountInUndoGroup == 0);
if (actionCountInUndoGroup == optionalActionCount) {
// only optional actions: don't store them
for (int i = 0; i < optionalActionCount; i++) {
@@ -223,9 +224,11 @@ public void EndUndoGroup()
undostack.PushBack(new UndoOperationGroup(undostack, actionCountInUndoGroup));
FileModified(-actionCountInUndoGroup + 1 + optionalActionCount);
}
+ //if (state == StateListen) {
EnforceSizeLimit();
allowContinue = true;
RecalcIsOriginalFile(); // can raise event
+ //}
}
}
@@ -243,6 +246,28 @@ void ThrowIfUndoGroupOpen()
}
}
+ List<TextDocument> affectedDocuments;
+
+ internal void RegisterAffectedDocument(TextDocument document)
+ {
+ if (affectedDocuments == null)
+ affectedDocuments = new List<TextDocument>();
+ if (!affectedDocuments.Contains(document)) {
+ affectedDocuments.Add(document);
+ document.BeginUpdate();
+ }
+ }
+
+ void CallEndUpdateOnAffectedDocuments()
+ {
+ if (affectedDocuments != null) {
+ foreach (TextDocument doc in affectedDocuments) {
+ doc.EndUpdate();
+ }
+ affectedDocuments = null;
+ }
+ }
+
/// <summary>
/// Call this method to undo the last operation on the stack
/// </summary>
@@ -260,8 +285,9 @@ public void Undo()
RunUndo(uedit);
} finally {
state = StateListen;
+ FileModified(-1);
+ CallEndUpdateOnAffectedDocuments();
}
- FileModified(-1);
RecalcIsOriginalFile();
if (undostack.Count == 0)
NotifyPropertyChanged("CanUndo");
@@ -294,8 +320,9 @@ public void Redo()
RunRedo(uedit);
} finally {
state = StateListen;
+ FileModified(1);
+ CallEndUpdateOnAffectedDocuments();
}
- FileModified(1);
RecalcIsOriginalFile();
if (redostack.Count == 0)
NotifyPropertyChanged("CanRedo");
@@ -345,14 +372,15 @@ void Push(IUndoableOperation operation, bool isOptional)
if (state == StateListen && sizeLimit > 0) {
bool wasEmpty = undostack.Count == 0;
- StartUndoGroup();
+ bool needsUndoGroup = undoGroupDepth == 0;
+ if (needsUndoGroup) StartUndoGroup();
undostack.PushBack(operation);
actionCountInUndoGroup++;
if (isOptional)
optionalActionCount++;
else
FileModified(1);
- EndUndoGroup();
+ if (needsUndoGroup) EndUndoGroup();
if (wasEmpty)
NotifyPropertyChanged("CanUndo");
ClearRedoStack();
@@ -390,29 +418,14 @@ public void ClearAll()
ClearRedoStack();
}
- internal void AttachToDocument(TextDocument document)
- {
- document.UpdateStarted += document_UpdateStarted;
- document.UpdateFinished += document_UpdateFinished;
- document.Changing += document_Changing;
- }
-
- void document_UpdateStarted(object sender, EventArgs e)
- {
- StartUndoGroup();
- }
-
- void document_UpdateFinished(object sender, EventArgs e)
- {
- EndUndoGroup();
- }
-
- void document_Changing(object sender, DocumentChangeEventArgs e)
+ internal void Push(TextDocument document, DocumentChangeEventArgs e)
{
if (state == StatePlayback)
throw new InvalidOperationException("Document changes during undo/redo operations are not allowed.");
- TextDocument document = (TextDocument)sender;
- Push(new DocumentChangeOperation(document, e));
+ if (state == StatePlaybackModifyDocument)
+ state = StatePlayback; // allow only 1 change per expected modification
+ else
+ Push(new DocumentChangeOperation(document, e));
}
/// <summary>
View
11 src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/SnippetAnchorElement.cs
@@ -27,9 +27,11 @@ public SnippetAnchorElement(string name)
/// <inheritdoc />
public override void Insert(InsertionContext context)
{
- int start = context.InsertionPosition;
- AnchorSegment segment = new AnchorSegment(context.Document, start, 0);
- context.RegisterActiveElement(this, new AnchorElement(segment, "", Name, context));
+ TextAnchor start = context.Document.CreateAnchor(context.InsertionPosition);
+ start.MovementType = AnchorMovementType.BeforeInsertion;
+ start.SurviveDeletion = true;
+ AnchorSegment segment = new AnchorSegment(start, start);
+ context.RegisterActiveElement(this, new AnchorElement(segment, Name, context));
}
}
@@ -54,11 +56,10 @@ public sealed class AnchorElement : IActiveElement
/// <summary>
/// Creates a new AnchorElement.
/// </summary>
- public AnchorElement(AnchorSegment segment, string text, string name, InsertionContext context)
+ public AnchorElement(AnchorSegment segment, string name, InsertionContext context)
{
this.segment = segment;
this.context = context;
- this.Text = text;
this.Name = name;
}
View
22 src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/SnippetBoundElement.cs
@@ -35,13 +35,17 @@ public virtual string ConvertText(string input)
public override void Insert(InsertionContext context)
{
if (targetElement != null) {
- int start = context.InsertionPosition;
+ TextAnchor start = context.Document.CreateAnchor(context.InsertionPosition);
+ start.MovementType = AnchorMovementType.BeforeInsertion;
+ start.SurviveDeletion = true;
string inputText = targetElement.Text;
if (inputText != null) {
context.InsertText(ConvertText(inputText));
}
- int end = context.InsertionPosition;
- AnchorSegment segment = new AnchorSegment(context.Document, start, end - start);
+ TextAnchor end = context.Document.CreateAnchor(context.InsertionPosition);
+ end.MovementType = AnchorMovementType.BeforeInsertion;
+ end.SurviveDeletion = true;
+ AnchorSegment segment = new AnchorSegment(start, end);
context.RegisterActiveElement(this, new BoundActiveElement(context, targetElement, this, segment));
}
}
@@ -91,10 +95,14 @@ void targetElement_TextChanged(object sender, EventArgs e)
int offset = segment.Offset;
int length = segment.Length;
string text = boundElement.ConvertText(targetElement.Text);
- context.Document.Replace(offset, length, text);
- if (length == 0) {
- // replacing an empty anchor segment with text won't enlarge it, so we have to recreate it
- segment = new AnchorSegment(context.Document, offset, text.Length);
+ if (length != text.Length || text != context.Document.GetText(offset, length)) {
+ // Call replace only if we're actually changing something.
+ // Without this check, we would generate an empty undo group when the user pressed undo.
+ context.Document.Replace(offset, length, text);
+ if (length == 0) {
+ // replacing an empty anchor segment with text won't enlarge it, so we have to recreate it
+ segment = new AnchorSegment(context.Document, offset, text.Length);
+ }
}
}
}
View
1  src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Snippets/SnippetCaretElement.cs
@@ -23,6 +23,7 @@ public override void Insert(InsertionContext context)
internal static void SetCaret(InsertionContext context)
{
TextAnchor pos = context.Document.CreateAnchor(context.InsertionPosition);
+ pos.MovementType = AnchorMovementType.BeforeInsertion;
pos.SurviveDeletion = true;
context.Deactivated += (sender, e) => {
if (e.Reason == DeactivateReason.ReturnPressed || e.Reason == DeactivateReason.NoActiveElements) {
View
13 src/Main/Base/Project/ICSharpCode.SharpDevelop.addin
@@ -1171,9 +1171,16 @@
shortcut = "Control|N"
class = "ICSharpCode.SharpDevelop.Commands.CreateNewFile"/>
- <MenuItem id = "Project"
- label = "${res:XML.MainMenu.FileMenu.New.Project}"
- icon = "Icons.16x16.NewProjectIcon"
+ <Condition name="SolutionOpen" action="Disable">
+ <MenuItem id = "Project"
+ label = "${res:XML.MainMenu.FileMenu.New.Project}"
+ icon = "Icons.16x16.NewProjectIcon"
+ class = "ICSharpCode.SharpDevelop.Project.Commands.AddNewProjectToSolution"/>
+ </Condition>
+
+ <MenuItem id = "Solution"
+ label = "${res:XML.MainMenu.FileMenu.New.Solution}"
+ icon = "Icons.16x16.SolutionIcon"
shortcut = "Control|Shift|N"
class = "ICSharpCode.SharpDevelop.Project.Commands.CreateNewSolution"/>
</MenuItem>
View
28 src/Main/Base/Project/Src/Editor/AvalonEdit/AvalonEditDocumentAdapter.cs
@@ -112,12 +112,22 @@ public IDocumentLine GetLineForOffset(int offset)
public int PositionToOffset(int line, int column)
{
- return document.GetOffset(new TextLocation(line, column));
+ try {
+ return document.GetOffset(new TextLocation(line, column));
+ } catch (ArgumentOutOfRangeException e) {
+ // for UDC: re-throw exception so that stack trace identifies the caller (instead of the adapter)
+ throw new ArgumentOutOfRangeException(e.ParamName, e.ActualValue, e.Message);
+ }
}
public Location OffsetToPosition(int offset)
{
- return ToLocation(document.GetLocation(offset));
+ try {
+ return ToLocation(document.GetLocation(offset));
+ } catch (ArgumentOutOfRangeException e) {
+ // for UDC: re-throw exception so that stack trace identifies the caller (instead of the adapter)
+ throw new ArgumentOutOfRangeException(e.ParamName, e.ActualValue, e.Message);
+ }
}
public static Location ToLocation(TextLocation position)
@@ -135,6 +145,15 @@ public void Insert(int offset, string text)
document.Insert(offset, text);
}
+ public void Insert(int offset, string text, AnchorMovementType defaultAnchorMovementType)
+ {
+ if (defaultAnchorMovementType == AnchorMovementType.BeforeInsertion) {
+ document.Replace(offset, 0, text, OffsetChangeMappingType.KeepAnchorBeforeInsertion);
+ } else {
+ document.Insert(offset, text);
+ }
+ }
+
public void Remove(int offset, int length)
{
document.Remove(offset, length);
@@ -145,6 +164,11 @@ public void Replace(int offset, int length, string newText)
document.Replace(offset, length, newText);
}
+ public void Replace(int offset, int length, string newText, AnchorMovementType defaultAnchorMovementType)
+ {
+ document.Replace(offset, length, newText);
+ }
+
public char GetCharAt(int offset)
{
return document.GetCharAt(offset);
View
1  src/Main/Base/Project/Src/Editor/IDocument.cs
@@ -38,6 +38,7 @@ public interface IDocument : ITextBuffer, IServiceProvider
Location OffsetToPosition(int offset);
void Insert(int offset, string text);
+ void Insert(int offset, string text, AnchorMovementType defaultAnchorMovementType);
void Remove(int offset, int length);
void Replace(int offset, int length, string newText);
View
11 src/Main/Base/Project/Src/Editor/IFormattingStrategy.cs
@@ -76,20 +76,23 @@ protected void SurroundSelectionWithSingleLineComment(ITextEditor editor, string
Location startPosition = editor.Document.OffsetToPosition(editor.SelectionStart);
Location endPosition = editor.Document.OffsetToPosition(editor.SelectionStart + editor.SelectionLength);
+ // endLine is one above endPosition if no characters are selected on the last line (e.g. line selection from the margin)
+ int endLine = (endPosition.Column == 1 && endPosition.Line > startPosition.Line) ? endPosition.Line - 1 : endPosition.Line;
+
List<IDocumentLine> lines = new List<IDocumentLine>();
bool removeComment = true;
- for (int i = startPosition.Line; i <= endPosition.Line; i++) {
+ for (int i = startPosition.Line; i <= endLine; i++) {
lines.Add(editor.Document.GetLine(i));
- if (!lines[i - startPosition.Line].Text.Trim().StartsWith(comment))
+ if (!lines[i - startPosition.Line].Text.Trim().StartsWith(comment, StringComparison.Ordinal))
removeComment = false;
}
foreach (IDocumentLine line in lines) {
if (removeComment) {
- editor.Document.Remove(line.Offset + line.Text.IndexOf(comment), comment.Length);
+ editor.Document.Remove(line.Offset + line.Text.IndexOf(comment, StringComparison.Ordinal), comment.Length);
} else {
- editor.Document.Insert(line.Offset, comment);
+ editor.Document.Insert(line.Offset, comment, AnchorMovementType.BeforeInsertion);
}
}
}
View
13 src/Main/Base/Project/Src/Editor/ReadOnlyDocument.cs
@@ -18,6 +18,8 @@ sealed class ReadOnlyDocument : IDocument
public ReadOnlyDocument(ITextBuffer textBuffer)
{
+ if (textBuffer == null)
+ throw new ArgumentNullException("textBuffer");
// ensure that underlying buffer is immutable
this.textBuffer = textBuffer.CreateSnapshot();
List<int> lines = new List<int>();
@@ -168,17 +170,22 @@ public Location OffsetToPosition(int offset)
get { return textBuffer.TextLength; }
}
- public void Insert(int offset, string text)
+ void IDocument.Insert(int offset, string text)
{
throw new NotSupportedException();
}
- public void Remove(int offset, int length)
+ void IDocument.Insert(int offset, string text, AnchorMovementType defaultAnchorMovementType)
{
throw new NotSupportedException();
}
- public void Replace(int offset, int length, string newText)
+ void IDocument.Remove(int offset, int length)
+ {
+ throw new NotSupportedException();
+ }
+
+ void IDocument.Replace(int offset, int length, string newText)
{
throw new NotSupportedException();
}
View
7 src/Main/Base/Project/Src/Editor/Search/ProvidedDocumentInformation.cs
@@ -40,12 +40,9 @@ public class ProvidedDocumentInformation
}
public int CurrentOffset {
- get {
+ get {
if (textEditor != null) {
- if (textEditor.SelectionLength > 0)
- currentOffset = textEditor.SelectionStart;
- else
- currentOffset = textEditor.Caret.Offset;
+ return textEditor.Caret.Offset;
}
return currentOffset;
}
View
4 src/Main/Base/Project/Src/Gui/Dialogs/TabbedOptions.cs
@@ -25,7 +25,9 @@ public void AddOptionPanels(IEnumerable<IOptionPanelDescriptor> dialogPanelDescr
throw new ArgumentNullException("dialogPanelDescriptors");
foreach (IOptionPanelDescriptor descriptor in dialogPanelDescriptors) {
if (descriptor != null) {
- this.Items.Add(new OptionTabPage(this, descriptor));
+ if (descriptor.HasOptionPanel) {
+ this.Items.Add(new OptionTabPage(this, descriptor));
+ }
if (descriptor.ChildOptionPanelDescriptors != null) {
AddOptionPanels(descriptor.ChildOptionPanelDescriptors);
}
View
4 src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs
@@ -14,7 +14,9 @@ public class AddNewProjectToSolution : AbstractMenuCommand
{
public override void Run()
{
- AbstractProjectBrowserTreeNode node = ProjectBrowserPad.Instance.ProjectBrowserControl.SelectedNode;
+ TreeNode node = ProjectBrowserPad.Instance.ProjectBrowserControl.SelectedNode;
+ while (node != null && !(node is ISolutionFolderNode))
+ node = node.Parent;
ISolutionFolderNode solutionFolderNode = node as ISolutionFolderNode;
if (node != null) {
using (NewProjectDialog npdlg = new NewProjectDialog(false)) {
View
14 src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs
@@ -828,13 +828,15 @@ public override void DoDragDrop(IDataObject dataObject, DragDropEffects effect)
CopyDirectoryHere(directoryNode, effect == DragDropEffects.Move);
} else if (dataObject.GetDataPresent(DataFormats.FileDrop)) {
string[] files = (string[])dataObject.GetData(DataFormats.FileDrop);
- foreach (string fileName in files) {
- if (System.IO.Directory.Exists(fileName)) {
- if (!FileUtility.IsBaseDirectory(fileName, Directory)) {
- CopyDirectoryHere(fileName, false);
+ if (files != null) {
+ foreach (string fileName in files) {
+ if (System.IO.Directory.Exists(fileName)) {
+ if (!FileUtility.IsBaseDirectory(fileName, Directory)) {
+ CopyDirectoryHere(fileName, false);
+ }
+ } else {
+ CopyFileHere(fileName, false);
}
- } else {
- CopyFileHere(fileName, false);
}
}
}
View
8 src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs
@@ -230,9 +230,11 @@ public override AbstractProjectBrowserTreeNode GetNodeByRelativePath(string rela
{
foreach (AbstractProjectBrowserTreeNode node in Nodes)
{
- AbstractProjectBrowserTreeNode returnedNode = node.GetNodeByRelativePath(relativePath);
- if (returnedNode != null)
- return returnedNode;
+ if (node != null) {
+ AbstractProjectBrowserTreeNode returnedNode = node.GetNodeByRelativePath(relativePath);
+ if (returnedNode != null)
+ return returnedNode;
+ }
}
return this;
View
15 src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs
@@ -8,6 +8,7 @@
using System.Globalization;
using System.IO;
using System.Linq;
+using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
@@ -609,13 +610,17 @@ protected override void OnDragOver(DragEventArgs e)
DragDropEffects GetEffect(IDataObject data)
{
- if (data != null && data.GetDataPresent(DataFormats.FileDrop)) {
- string[] files = (string[])data.GetData(DataFormats.FileDrop);
- foreach (string file in files) {
- if (File.Exists(file)) {
- return DragDropEffects.Link;
+ try {
+ if (data != null && data.GetDataPresent(DataFormats.FileDrop)) {
+ string[] files = (string[])data.GetData(DataFormats.FileDrop);
+ foreach (string file in files) {
+ if (File.Exists(file)) {
+ return DragDropEffects.Link;
+ }
}
}
+ } catch (COMException) {
+ // Ignore errors getting the data (e.g. happens when dragging attachments out of Thunderbird)
}
return DragDropEffects.None;
}
View
44 src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs
@@ -839,18 +839,50 @@ enum PropertyPosition
}
}
}
- foreach (var propertyGroup in targetProject.PropertyGroups) {
- if (propertyGroup.Condition == groupCondition) {
- propertyGroup.AddProperty(propertyName, newValue);
- return;
- }
+
+ var matchedPropertyGroup = FindPropertyGroup(targetProject, groupCondition, position);
+ if (matchedPropertyGroup != null) {
+ matchedPropertyGroup.AddProperty(propertyName, newValue);
+ return;
}
- var newGroup = targetProject.AddPropertyGroup();
+ var newGroup = AddNewPropertyGroup(targetProject, position);
newGroup.Condition = groupCondition;
newGroup.AddProperty(propertyName, newValue);
}
+ ProjectPropertyGroupElement FindPropertyGroup(ProjectRootElement targetProject, string groupCondition, PropertyPosition position)
+ {
+ ProjectPropertyGroupElement matchedPropertyGroup = null;
+ foreach (var projectItem in targetProject.Children) {
+ ProjectPropertyGroupElement propertyGroup = projectItem as ProjectPropertyGroupElement;
+ if (propertyGroup != null) {
+ if (propertyGroup.Condition == groupCondition) {
+ matchedPropertyGroup = propertyGroup;
+ if (position != PropertyPosition.UseExistingOrCreateAfterLastImport) {
+ return matchedPropertyGroup;
+ }
+ }
+ }
+ if (position == PropertyPosition.UseExistingOrCreateAfterLastImport) {
+ if (projectItem is ProjectImportElement) {
+ matchedPropertyGroup = null;
+ }
+ }
+ }
+ return matchedPropertyGroup;
+ }
+
+ ProjectPropertyGroupElement AddNewPropertyGroup(ProjectRootElement targetProject, PropertyPosition position)
+ {
+ if (position == PropertyPosition.UseExistingOrCreateAfterLastImport) {
+ var propertyGroup = targetProject.CreatePropertyGroupElement();
+ targetProject.AppendChild(propertyGroup);
+ return propertyGroup;
+ }
+ return targetProject.AddPropertyGroup();
+ }
+
/// <summary>
/// Removes the property from all configurations and platforms.
/// </summary>
View
16 src/Main/Base/Project/Src/Project/Solution/Solution.cs
@@ -452,8 +452,6 @@ static bool SetupSolution(Solution newSolution)
{
ProjectSection nestedProjectsSection = null;
- bool needsConversion = false;
-
// read solution files using system encoding, but detect UTF8 if BOM is present
using (StreamReader sr = new StreamReader(newSolution.FileName, Encoding.Default, true)) {
string line = GetFirstNonCommentLine(sr);
@@ -465,17 +463,9 @@ static bool SetupSolution(Solution newSolution)
switch (match.Result("${Version}")) {
case "7.00":
- needsConversion = true;
- if (!MessageService.AskQuestion("${res:SharpDevelop.Solution.ConvertSolutionVersion7}")) {
- return false;
- }
- break;
case "8.00":
- needsConversion = true;
- if (!MessageService.AskQuestion("${res:SharpDevelop.Solution.ConvertSolutionVersion8}")) {
- return false;
- }
- break;
+ MessageService.ShowError("${res:SharpDevelop.Solution.CannotLoadOldSolution}");
+ return false;
case "9.00":
case "10.00":
case "11.00":
@@ -503,7 +493,7 @@ static bool SetupSolution(Solution newSolution)
}
}
- if (!newSolution.ReadOnly && (newSolution.FixSolutionConfiguration(newSolution.Projects) || needsConversion)) {
+ if (!newSolution.ReadOnly && (newSolution.FixSolutionConfiguration(newSolution.Projects))) {
// save in new format
newSolution.Save();
}
View
17 src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs
@@ -89,6 +89,15 @@ static IDebugger GetCompatibleDebugger()
}
}
+ static bool debuggerStarted;
+
+ /// <summary>
+ /// Gets whether the debugger is currently active.
+ /// </summary>
+ public static bool IsDebuggerStarted {
+ get { return debuggerStarted; }
+ }
+
public static event EventHandler DebugStarting;
public static event EventHandler DebugStarted;
public static event EventHandler DebugStopped;
@@ -110,12 +119,14 @@ static void OnDebugStarting(object sender, EventArgs e)
static void OnDebugStarted(object sender, EventArgs e)
{
+ debuggerStarted = true;
if (DebugStarted != null)
DebugStarted(null, e);
}
static void OnDebugStopped(object sender, EventArgs e)
{
+ debuggerStarted = false;
if (debugFeature != null)
debugFeature.EndTracking();
@@ -271,7 +282,11 @@ internal static void HandleToolTipRequest(ToolTipRequestEventArgs e)
}
if (toolTipText != null) {
if (debuggerCanShowValue && currentDebugger != null) {
- e.SetToolTip(currentDebugger.GetTooltipControl(expressionResult.Expression));
+ object toolTip = currentDebugger.GetTooltipControl(expressionResult.Expression);
+ if (toolTip != null)
+ e.SetToolTip(toolTip);
+ else
+ e.SetToolTip(toolTipText);
} else {
e.SetToolTip(toolTipText);
}
View
11 src/Main/Base/Project/Src/Services/File/FileService.cs
@@ -146,9 +146,14 @@ internal static void OpenedFileFileNameChange(OpenedFile file, FileName oldName,
if (openedFileDict[oldName] != file)
throw new ArgumentException("file must be registered as oldName");
- if (openedFileDict.ContainsKey(newName))
- throw new ArgumentException("there already is a file with the newName");
-
+ if (openedFileDict.ContainsKey(newName)) {
+ OpenedFile oldFile = openedFileDict[newName];
+ if (oldFile.CurrentView != null) {
+ oldFile.CurrentView.WorkbenchWindow.CloseWindow(true);
+ } else {
+ throw new ArgumentException("there already is a file with the newName");
+ }
+ }
openedFileDict.Remove(oldName);
openedFileDict[newName] = file;
}
View
8 src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs
@@ -624,9 +624,11 @@ public static void RemoveSolutionFolder(string guid)
static void HandleRemovedSolutionFolder(ISolutionFolder folder)
{
- if (folder is IProject) {
- OpenSolution.RemoveProjectConfigurations(folder.IdGuid);
- ParserService.RemoveProjectContentForRemovedProject((IProject)folder);
+ IProject project = folder as IProject;
+ if (project != null) {
+ OpenSolution.RemoveProjectConfigurations(project.IdGuid);
+ ParserService.RemoveProjectContentForRemovedProject(project);
+ project.Dispose();
}
if (folder is ISolutionFolderContainer) {
// recurse into child folders that were also removed
View
1  src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs
@@ -128,6 +128,7 @@ void AddTopLevelItems(List<object> resultItems, ITextEditor textEditor, Expressi
foreach (object subItem in item.Items) {
resultItems.Add(subItem);
}
+ item.Items.Clear(); // detach resultItems from old parent
}
}
}
View
2  src/Main/Base/Project/Src/Services/Tasks/ErrorPainter.cs
@@ -72,7 +72,7 @@ void textEditor_Options_PropertyChanged(object sender, System.ComponentModel.Pro
void UpdateEnabled()
{
bool newEnabled = textEditor.Options.UnderlineErrors;
- if (DebuggerService.IsDebuggerLoaded && DebuggerService.CurrentDebugger.IsDebugging)
+ if (DebuggerService.IsDebuggerStarted)
newEnabled = false;
if (isEnabled != newEnabled) {
View
287 src/Setup/Files.wxs
@@ -10,72 +10,72 @@
<Component Id="SharpDevelopExe" Guid="F632C62C-A4DD-4507-9678-C7DCFF4DBC8C" DiskId="1">
<File Id="SharpDevelop.exe" Name="SharpDevelop.exe" Source="..\..\bin\SharpDevelop.exe" Assembly=".net" AssemblyApplication="SharpDevelop.exe" AssemblyManifest="SharpDevelop.exe" KeyPath="yes">
<!--
- NGens SharpDevelop.exe. Needs the NetFx extension (WixNetFxExtension.dll),
- library (netfx.wixlib) and custom actions (netfxca.dll).
-
- Priority=0 means the image generation occurs during
- setup. Other values defer the generation.
-
- Default Platform value is 32bit which tries to generate images
- for 32 bitversions of the .NET framework on the
- target machine. This will fail on a machine with
- 64 bit version of .NET. Cannot use Platform=all
- since this runs NGen for both 32 and 64 bit versions
- regardless of whether they exist on the target
- machine.
- -->
+ NGens SharpDevelop.exe. Needs the NetFx extension (WixNetFxExtension.dll),
+ library (netfx.wixlib) and custom actions (netfxca.dll).
+
+ Priority=0 means the image generation occurs during
+ setup. Other values defer the generation.
+
+ Default Platform value is 32bit which tries to generate images
+ for 32 bitversions of the .NET framework on the
+ target machine. This will fail on a machine with
+ 64 bit version of .NET. Cannot use Platform=all
+ since this runs NGen for both 32 and 64 bit versions
+ regardless of whether they exist on the target
+ machine.
+ -->
<!-- Using priority 1 because 0 slows down setup and might have a bug that causes it to work like priority 3 (http://www.mail-archive.com/wix-users@lists.sourceforge.net/msg34312.html). -->
<netfx:NativeImage Id="SharpDevelopNGenImage" Priority="1" xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension" />
</File>
</Component>
<Component Id="BooProjectFileAssociation" Guid="8FD60FEE-9220-4409-B98E-273AAC4A03E0" DiskId="1">
<!--
- Get several ICE33 warnings using the ProgId element
- but these apparently can safely be ignored
- according to a post on the wix-users list by
- Rob Mencshing. Also using the ProgId element
- does not create the ProgId table. The current installer
- no longer uses the ProgId but instead uses Registry
- keys instead. It still creates the same entries in the
- msi.
-
- http://sourceforge.net/mailarchive/message.php?msg_id=9075241
-
- Note that the Target of the form [#FileId] expands out to the
- full path of the file. A target of the form [!FileId]
- expands to the short name of the file (i.e. it includes ~
- characters). We need the full path otherwise the exe name
- will be something like SharpDev~1.exe and the
- SharpDevelop.exe.manifest file will not be found when
- running the application so it does not use XP visual styles.
- Unfortunately using [#FileId] generates lots of ICE69
- warnings for the icon and the SharpDevelop.exe target
- if they are in a different component.
- Not sure why [!FileId] does not produce an error since
- the problem seems to be similar, basically the registry
- key generated by the ProgId element belongs to one
- component whilst we are referencing another component
- containing the SharpDevelop.exe and another
- containing the icon.
-
- http://msdn.microsoft.com/library/en-us/msi/setup/ice69.asp
-
- The ICE69 errors can be ignored for now since the component
- being referenced by the file associations will always be installed
- even though it is in a different feature. If the FileTypeRegister
- addin is an optional install then the ICE69 errors would need to
- be resolved.
-
- We are not using the ProgId element which sets up the
- file association registry keys for us, but are specifying them
- directly as registry keys. This allows us to use one of the keys
- as a key path instead of having to use the parent component's
- directory as the key path. The key path is what is used
- by the installer to detect whether the component is installed.
- Using the component's parent directory (i.e. the Bin folder)
- is not feasible since the file associations may not be installed
- if the user does not install them in the feature tree.
- -->
+ Get several ICE33 warnings using the ProgId element
+ but these apparently can safely be ignored
+ according to a post on the wix-users list by
+ Rob Mencshing. Also using the ProgId element
+ does not create the ProgId table. The current installer
+ no longer uses the ProgId but instead uses Registry
+ keys instead. It still creates the same entries in the
+ msi.
+
+ http://sourceforge.net/mailarchive/message.php?msg_id=9075241
+
+ Note that the Target of the form [#FileId] expands out to the
+ full path of the file. A target of the form [!FileId]
+ expands to the short name of the file (i.e. it includes ~
+ characters). We need the full path otherwise the exe name
+ will be something like SharpDev~1.exe and the
+ SharpDevelop.exe.manifest file will not be found when
+ running the application so it does not use XP visual styles.
+ Unfortunately using [#FileId] generates lots of ICE69
+ warnings for the icon and the SharpDevelop.exe target
+ if they are in a different component.
+ Not sure why [!FileId] does not produce an error since
+ the problem seems to be similar, basically the registry
+ key generated by the ProgId element belongs to one
+ component whilst we are referencing another component
+ containing the SharpDevelop.exe and another
+ containing the icon.
+
+ http://msdn.microsoft.com/library/en-us/msi/setup/ice69.asp
+
+ The ICE69 errors can be ignored for now since the component
+ being referenced by the file associations will always be installed
+ even though it is in a different feature. If the FileTypeRegister
+ addin is an optional install then the ICE69 errors would need to
+ be resolved.
+
+ We are not using the ProgId element which sets up the
+ file association registry keys for us, but are specifying them
+ directly as registry keys. This allows us to use one of the keys
+ as a key path instead of having to use the parent component's
+ directory as the key path. The key path is what is used
+ by the installer to detect whether the component is installed.
+ Using the component's parent directory (i.e. the Bin folder)
+ is not feasible since the file associations may not be installed
+ if the user does not install them in the feature tree.
+ -->
<RegistryValue Id="SD.booprojfile" Root="HKCR" Type="string" Key="SD.booprojfile" Value="Boo Project" KeyPath="yes" />
<RegistryValue Id="SD.booprojfile.command" Root="HKCR" Type="string" Key="SD.booprojfile\shell\open\command" Value="&quot;[#SharpDevelop.exe]&quot; &quot;%1&quot;" />
<RegistryValue Id="SD.booprojfile.icon" Root="HKCR" Type="string" Key="SD.booprojfile\DefaultIcon" Value="&quot;[#prjx.ico]&quot;" />
@@ -696,71 +696,29 @@
</Component>
</Directory>
<Directory Id="VBFileTemplatesFolder" Name="VB">
- <Component Id="VBTemplatesFileCategorySortOrderXml" Guid="420F6EAA-8F64-4837-BDE4-034E7C40F112" DiskId="1">
- <File Id="VBFileTemplateFileCategorySortOrder.xml" Name="FileCategorySortOrder.xml" Source="..\..\data\templates\file\VB\FileCategorySortOrder.xml" KeyPath="yes" />
- </Component>
- <Component Id="VBEmptyFileTemplate" Guid="92D5B825-D5A1-4164-959D-0D1DBE4ADE0D" DiskId="1">
- <File Id="VB.Empty.xft" Name="VB.Empty.xft" Source="..\..\data\templates\file\VB\VB.Empty.xft" KeyPath="yes" />
- </Component>
- <Component Id="VBEmptyClassFileTemplate" Guid="B1875095-14EF-459E-8546-A281019EBBCE" DiskId="1">
- <File Id="VB.EmptyClass.xft" Name="VB.EmptyClass.xft" Source="..\..\data\templates\file\VB\VB.EmptyClass.xft" KeyPath="yes" />
- </Component>
- <Component Id="VBFormFileTemplate" Guid="8DD19254-4E5E-4119-A3A8-7F0608B02B8C" DiskId="1">
- <File Id="VB.VB.Forms.Form.xft" Name="VB.Forms.Form.xft" Source="..\..\data\templates\file\VB\VB.Forms.Form.xft" KeyPath="yes" />
- </Component>
- <Component Id="VBUserControlFileTemplate" Guid="BCBD5075-D39A-4D86-900F-EAACFD7644C4" DiskId="1">
- <File Id="VB.VB.Forms.UserControl.xft" Name="VB.Forms.UserControl.xft" Source="..\..\data\templates\file\VB\VB.Forms.UserControl.xft" KeyPath="yes" />
- </Component>
- <Component Id="VBInterfaceFileTemplate" Guid="18F3CE0E-A859-48E4-A3E7-1666E8CE012E" DiskId="1">
- <File Id="VB.VB.Interface.xft" Name="VB.Interface.xft" Source="..\..\data\templates\file\VB\VB.Interface.xft" KeyPath="yes" />
- </Component>
- <Component Id="VBModuleFileTemplate" Guid="1ACB5E8A-CC5E-4673-A68E-A7F52DCB9DB7" DiskId="1">
- <File Id="VB.VB.Module.xft" Name="VB.Module.xft" Source="..\..\data\templates\file\VB\VB.Module.xft" KeyPath="yes" />
- </Component>
- <Component Id="VBMyExtensionClassFileTemplate" Guid="EB4D7763-0491-4888-A288-07A3539CD36B" DiskId="1">
- <File Id="VB.MyExtensionClass.xft" Name="VB.MyExtensionClass.xft" Source="..\..\data\templates\file\VB\VB.MyExtensionClass.xft" KeyPath="yes" />
- </Component>
- <Component Id="VBPatternsSingletonFileTemplate" Guid="4912461E-4703-4F3B-9DDB-73D1A720FA48" DiskId="1">
- <File Id="VB.Patterns.Singleton.xft" Name="VB.Patterns.Singleton.xft" Source="..\..\data\templates\file\VB\VB.Patterns.Singleton.xft" KeyPath="yes" />
- </Component>
- <Component Id="VBUnitTestFileTemplate" Guid="D5D60A9C-FE68-450F-9C65-6FE13741734C" DiskId="1">
- <File Id="VB.UnitTest.xft" Name="VB.UnitTest.xft" Source="..\..\data\templates\file\VB\VB.UnitTest.xft" KeyPath="yes" />
- </Component>
- <Component Id="VBExceptionFileTemplate" Guid="907F9938-D226-40C9-A0FF-A4D7744E5B17" DiskId="1">
- <File Id="VB.Exception.xft" Name="VB.Exception.xft" Source="..\..\data\templates\file\VB\VB.Exception.xft" KeyPath="yes" />
- </Component>
- <Component Id="VBStructureFileTemplate" Guid="BC352A19-6F6C-4532-B0CF-4D1244C3FA63" DiskId="1">
- <File Id="VB.Structure.xft" Name="VB.Structure.xft" Source="..\..\data\templates\file\VB\VB.Structure.xft" KeyPath="yes" />
- </Component>
- <Component Id="VBWebControlFileTemplate" Guid="9BF5162E-D3DD-46BC-A845-249733B4B37E" DiskId="1">
- <File Id="VB.Web.WebControl.xft" Name="VB.Web.WebControl.xft" Source="..\..\data\templates\file\VB\VB.Web.WebControl.xft" KeyPath="yes" />
- </Component>
- <Component Id="VBWebFormFileTemplate" Guid="AFC4CC3D-55E6-47A5-8DB1-97DCE34BFE3B" DiskId="1">
- <File Id="VB.Web.WebForm.xft" Name="VB.Web.WebForm.xft" Source="..\..\data\templates\file\VB\VB.Web.WebForm.xft" KeyPath="yes" />
- </Component>
- <Component Id="VBWebHandlerFileTemplate" Guid="445D6E1E-4280-4E61-A01E-D12D65C33303" DiskId="1">
- <File Id="VB.Web.WebHandler.xft" Name="VB.Web.WebHandler.xft" Source="..\..\data\templates\file\VB\VB.Web.WebHandler.xft" KeyPath="yes" />
- </Component>
- <Component Id="VBWebServiceFileTemplate" Guid="E920D1F5-60EB-4FFC-9E78-8CD4C65AD02C" DiskId="1">
- <File Id="VB.Web.WebService.xft" Name="VB.Web.WebService.xft" Source="..\..\data\templates\file\VB\VB.Web.WebService.xft" KeyPath="yes" />
- </Component>
- <Component Id="VBWPFFlowDocumentFileTemplate" Guid="CA1F4A0A-C925-4A70-A399-6B88E6013DF7" DiskId="1">
- <File Id="VB.WPFFlowDocument.xft" Name="VB.WPFFlowDocument.xft" Source="..\..\data\templates\file\VB\VB.WPFFlowDocument.xft" KeyPath="yes" />
- </Component>
- <Component Id="VBWPFPageFileTemplate" Guid="B6FDFB3C-52C7-43FC-A6DE-F2637E6FD5E0" DiskId="1">
- <File Id="VB.WPFPage.xft" Name="VB.WPFPage.xft" Source="..\..\data\templates\file\VB\VB.WPFPage.xft" KeyPath="yes" />
- </Component>
- <Component Id="VBWPFPageFunctionFileTemplate" Guid="EE8BA0D0-5503-4FF6-AA84-BA60BE43B68A" DiskId="1">
- <File Id="VB.WPFPageFunction.xft" Name="VB.WPFPageFunction.xft" Source="..\..\data\templates\file\VB\VB.WPFPageFunction.xft" KeyPath="yes" />
- </Component>
- <Component Id="VBWPFResourceDictionaryFileTemplate" Guid="8A5ECBA7-9052-4648-84F4-6ECC73B37A12" DiskId="1">
- <File Id="VB.WPFResourceDictionary.xft" Name="VB.WPFResourceDictionary.xft" Source="..\..\data\templates\file\VB\VB.WPFResourceDictionary.xft" KeyPath="yes" />
- </Component>
- <Component Id="VBWPFUserControlFileTemplate" Guid="B00822BB-A76E-4B63-9926-A5FB7FAF3835" DiskId="1">
- <File Id="VB.WPFUserControl.xft" Name="VB.WPFUserControl.xft" Source="..\..\data\templates\file\VB\VB.WPFUserControl.xft" KeyPath="yes" />
- </Component>
- <Component Id="VBWPFWindowFileTemplate" Guid="43DEB1E6-4A14-4F78-BEC0-BC20F30876D4" DiskId="1">
- <File Id="VB.WPFWindow.xft" Name="VB.WPFWindow.xft" Source="..\..\data\templates\file\VB\VB.WPFWindow.xft" KeyPath="yes" />
+ <Component Id="VBFileTemplates" Guid="F51E9F9D-F711-4124-90E6-C8CECD4E890C" DiskId="1">
+ <File Id="FileCategorySortOrder.xml" Name="FileCategorySortOrder.xml" Source="..\..\data\templates\file\VB\FileCategorySortOrder.xml" KeyPath="yes" />
+ <File Id="VB.Empty.xft" Name="VB.Empty.xft" Source="..\..\data\templates\file\VB\VB.Empty.xft" />
+ <File Id="VB.EmptyClass.xft" Name="VB.EmptyClass.xft" Source="..\..\data\templates\file\VB\VB.EmptyClass.xft" />
+ <File Id="VB.Exception.xft" Name="VB.Exception.xft" Source="..\..\data\templates\file\VB\VB.Exception.xft" />
+ <File Id="VB.Forms.Form.xft" Name="VB.Forms.Form.xft" Source="..\..\data\templates\file\VB\VB.Forms.Form.xft" />
+ <File Id="VB.Forms.UserControl.xft" Name="VB.Forms.UserControl.xft" Source="..\..\data\templates\file\VB\VB.Forms.UserControl.xft" />
+ <File Id="VB.Interface.xft" Name="VB.Interface.xft" Source="..\..\data\templates\file\VB\VB.Interface.xft" />
+ <File Id="VB.Module.xft" Name="VB.Module.xft" Source="..\..\data\templates\file\VB\VB.Module.xft" />
+ <File Id="VB.MyExtensionClass.xft" Name="VB.MyExtensionClass.xft" Source="..\..\data\templates\file\VB\VB.MyExtensionClass.xft" />
+ <File Id="VB.Patterns.Singleton.xft" Name="VB.Patterns.Singleton.xft" Source="..\..\data\templates\file\VB\VB.Patterns.Singleton.xft" />
+ <File Id="VB.Structure.xft" Name="VB.Structure.xft" Source="..\..\data\templates\file\VB\VB.Structure.xft" />
+ <File Id="VB.UnitTest.xft" Name="VB.UnitTest.xft" Source="..\..\data\templates\file\VB\VB.UnitTest.xft" />
+ <File Id="VB.Web.WebControl.xft" Name="VB.Web.WebControl.xft" Source="..\..\data\templates\file\VB\VB.Web.WebControl.xft" />
+ <File Id="VB.Web.WebForm.xft" Name="VB.Web.WebForm.xft" Source="..\..\data\templates\file\VB\VB.Web.WebForm.xft" />
+ <File Id="VB.Web.WebHandler.xft" Name="VB.Web.WebHandler.xft" Source="..\..\data\templates\file\VB\VB.Web.WebHandler.xft" />
+ <File Id="VB.Web.WebService.xft" Name="VB.Web.WebService.xft" Source="..\..\data\templates\file\VB\VB.Web.WebService.xft" />
+ <File Id="VB.WPFFlowDocument.xft" Name="VB.WPFFlowDocument.xft" Source="..\..\data\templates\file\VB\VB.WPFFlowDocument.xft" />
+ <File Id="VB.WPFPage.xft" Name="VB.WPFPage.xft" Source="..\..\data\templates\file\VB\VB.WPFPage.xft" />
+ <File Id="VB.WPFPageFunction.xft" Name="VB.WPFPageFunction.xft" Source="..\..\data\templates\file\VB\VB.WPFPageFunction.xft" />
+ <File Id="VB.WPFResourceDictionary.xft" Name="VB.WPFResourceDictionary.xft" Source="..\..\data\templates\file\VB\VB.WPFResourceDictionary.xft" />
+ <File Id="VB.WPFUserControl.xft" Name="VB.WPFUserControl.xft" Source="..\..\data\templates\file\VB\VB.WPFUserControl.xft" />
+ <File Id="VB.WPFWindow.xft" Name="VB.WPFWindow.xft" Source="..\..\data\templates\file\VB\VB.WPFWindow.xft" />
</Component>
</Directory>
</Directory>
@@ -817,6 +775,17 @@
<File Source="..\..\data\templates\project\VB\SharedAddin.xpt" Id="VBSharedAddin.xpt" Name="SharedAddin.xpt" />
<File Source="..\..\data\templates\project\VB\SharpDevelopAddin.xpt" Id="VBSharpDevelopAddin.xpt" Name="SharpDevelopAddin.xpt" />
<File Id="MySettings.settings" Name="MySettings.settings" Source="..\..\data\templates\project\VB\MySettings.settings" />
+ <File Id="MyWpfExtension.vb" Name="MyWpfExtension.vb" Source="..\..\data\templates\project\VB\MyWpfExtension.vb" />
+ <File Id="VB.NotifyIcon.xpt" Name="NotifyIcon.xpt" Source="..\..\data\templates\project\VB\NotifyIcon.xpt" />
+ <File Id="VB.NotifyIconResources.resx" Name="NotifyIconResources.resx" Source="..\..\data\templates\project\VB\NotifyIconResources.resx" />
+ <File Id="VB.SharpDevelopCustomTool.xpt" Name="SharpDevelopCustomTool.xpt" Source="..\..\data\templates\project\VB\SharpDevelopCustomTool.xpt" />
+ <File Id="VB.SharpDevelopCustomToolTemplate.xft.xml" Name="SharpDevelopCustomToolTemplate.xft.xml" Source="..\..\data\templates\project\VB\SharpDevelopCustomToolTemplate.xft.xml" />
+ <File Id="SilverlightApplication.xpt" Name="SilverlightApplication.xpt" Source="..\..\data\templates\project\VB\SilverlightApplication.xpt" />
+ <File Id="WebpageProject.xpt" Name="WebpageProject.xpt" Source="..\..\data\templates\project\VB\WebpageProject.xpt" />
+ <File Id="VB.WebService.xpt" Name="WebService.xpt" Source="..\..\data\templates\project\VB\WebService.xpt" />
+ <File Id="WPFApplication.xpt" Name="WPFApplication.xpt" Source="..\..\data\templates\project\VB\WPFApplication.xpt" />
+ <File Id="WPFAssemblyInfo.vb" Name="WPFAssemblyInfo.vb" Source="..\..\data\templates\project\VB\WPFAssemblyInfo.vb" />
+ <File Id="WPFNavigationApplication.xpt" Name="WPFNavigationApplication.xpt" Source="..\..\data\templates\project\VB\WPFNavigationApplication.xpt" />
</Component>
</Directory>
<Component Guid="73EAC135-57B6-46C0-9F24-70A347B9AAC8" Id="ExampleProjectTemplate" DiskId="1">
@@ -1508,50 +1477,50 @@
</Directory>
<Component Guid="542E5AE1-286C-4CE6-8800-F3AFBB24531D" Id="SharpDevelopWebsiteShortcut" DiskId="1">
<!--
- The choice here is to either useW the IniFile element to
- generate the two website shortcuts or create a
- SharpDevelop.url file on disk and use a File element and
- link to the file instead. We will use a file otherwise an
- upgrade will not remove the existing website shortcut.
- -->
+ The choice here is to either useW the IniFile element to
+ generate the two website shortcuts or create a
+ SharpDevelop.url file on disk and use a File element and
+ link to the file instead. We will use a file otherwise an
+ upgrade will not remove the existing website shortcut.
+ -->
<File Id="SharpDevelop.url" KeyPath="yes" Name="SharpDevelop.url" Source="Files\SharpDevelop.url" />
<!--
- ICE18 - Force the empty folder to be created. Even though it
- has sub folders the validator flags this as an error.
-
- http://msdn.microsoft.com/library/en-us/msi/setup/ice18.asp
- -->
+ ICE18 - Force the empty folder to be created. Even though it
+ has sub folders the validator flags this as an error.
+
+ http://msdn.microsoft.com/library/en-us/msi/setup/ice18.asp
+ -->
<CreateFolder />
</Component>
<Component Id="SharpDevelopAppPathRegistrySetting" Guid="E812C3C9-1753-4535-80B9-BD8BCE7DB1A5">
<!--
- App Path registry setting lives in HKLM so only add it if the
- user has admin rights.
- -->
+ App Path registry setting lives in HKLM so only add it if the
+ user has admin rights.
+ -->
<Condition>Privileged</Condition>
<RegistryValue Id="SharpDevelopAppPathRegistryKey" Key="Software\Microsoft\Windows\CurrentVersion\App Paths\SharpDevelop.exe" Root="HKLM" Value="[!SharpDevelop.exe]" Type="string" Action="write" />
</Component>
<!--
- Dummy components that are empty. These are used so
- the feature tree does not show the Network installation
- as an option.
- -->
+ Dummy components that are empty. These are used so
+ the feature tree does not show the Network installation
+ as an option.
+ -->
<Component Id="DummyCompleteFeatureComponent" Guid="22AB4C49-89FD-413F-8A1D-456AFB1AD611">
<!--
- Fix ICE18 error. The validator thinks that the install folder
- could be empty so we have to use CreateFolder in this component.
-
- http://msdn.microsoft.com/library/en-us/msi/setup/ice18.asp
- -->
+ Fix ICE18 error. The validator thinks that the install folder
+ could be empty so we have to use CreateFolder in this component.
+
+ http://msdn.microsoft.com/library/en-us/msi/setup/ice18.asp
+ -->
<CreateFolder />
</Component>
<Component Id="DummyFileAssocationFeatureComponent" Guid="F0390EC4-6B66-4823-B4F4-7F29E3D6AB54">
<!--
- Fix ICE18 error. The validator thinks that the install folder
- could be empty so we have to use CreateFolder in this component.
-
- http://msdn.microsoft.com/library/en-us/msi/setup/ice18.asp
- -->
+ Fix ICE18 error. The validator thinks that the install folder
+ could be empty so we have to use CreateFolder in this component.
+
+ http://msdn.microsoft.com/library/en-us/msi/setup/ice18.asp
+ -->
<CreateFolder />
</Component>
</Directory>
@@ -1561,9 +1530,9 @@
<Directory Id="ProgramMenuFolder" Name="Programs">
<Component Id="SharpDevelopProgramMenuItems" Guid="A505F0F2-5971-436D-8E3E-ABDDC0B59BF7">
<!--
- Fix ICE 38 by adding a dummy registry key that is the key for this shortcut.
- http://msdn.microsoft.com/library/en-us/msi/setup/ice38.asp
- -->
+ Fix ICE 38 by adding a dummy registry key that is the key for this shortcut.
+ http://msdn.microsoft.com/library/en-us/msi/setup/ice38.asp
+ -->
<RegistryValue Id="SharpDevelopExeStartMenuShortcutRegistryKey" Root="HKCU" Type="string" KeyPath="yes" Key="Software\SharpDevelop4" Name="ProgramFilesShortcut" Value="1" />
<Shortcut Name="SharpDevelop 4.1" Target="[!SharpDevelop.exe]" Id="SharpDevelopExeStartMenuShortcut" WorkingDirectory="BinFolder" Icon="SharpDevelopIcon.exe" Directory="ProgramMenuFolder" />
</Component>
@@ -1572,9 +1541,9 @@
<Directory Id="DesktopFolder" Name="Desktop">
<Component Id="DesktopFolderItems" Guid="F2FF4C2F-6282-4ABA-8DBB-E50E81B5920D">
<!--
- Fix ICE 38 by adding a dummy registry key that is the key for this shortcut.
- http://msdn.microsoft.com/library/en-us/msi/setup/ice38.asp
- -->
+ Fix ICE 38 by adding a dummy registry key that is the key for this shortcut.
+ http://msdn.microsoft.com/library/en-us/msi/setup/ice38.asp
+ -->
<RegistryValue Id="SharpDevelopExeDesktopShortcutRegistryKey" Type="string" Root="HKCU" KeyPath="yes" Key="Software\SharpDevelop4" Name="DesktopShortcut" Value="1" />
<Shortcut Id="SharpDevelopExeDesktopShortcut" Directory="DesktopFolder" Target="[!SharpDevelop.exe]" Name="SharpDevelop 4.1" Icon="SharpDevelopIcon.exe" WorkingDirectory="BinFolder" />
</Component>
View
23 src/Setup/Setup.wxs
@@ -274,28 +274,7 @@
<ComponentRef Id="CSharpRecentFilesCollectionTemplate"/>
<ComponentRef Id="CSharpRecentFilesCollectionTemplateRecentFileElementClass"/>
<ComponentRef Id="CSharpRecentFilesCollectionTemplateRecentFilesCollectionClass"/>
- <ComponentRef Id="VBTemplatesFileCategorySortOrderXml"/>
- <ComponentRef Id="VBExceptionFileTemplate"/>
- <ComponentRef Id="VBEmptyFileTemplate"/>
- <ComponentRef Id="VBEmptyClassFileTemplate"/>
- <ComponentRef Id="VBFormFileTemplate"/>
- <ComponentRef Id="VBUserControlFileTemplate"/>
- <ComponentRef Id="VBInterfaceFileTemplate"/>
- <ComponentRef Id="VBModuleFileTemplate"/>
- <ComponentRef Id="VBMyExtensionClassFileTemplate"/>
- <ComponentRef Id="VBPatternsSingletonFileTemplate"/>
- <ComponentRef Id="VBUnitTestFileTemplate"/>
- <ComponentRef Id="VBStructureFileTemplate"/>
- <ComponentRef Id="VBWebControlFileTemplate"/>
- <ComponentRef Id="VBWebFormFileTemplate"/>
- <ComponentRef Id="VBWebHandlerFileTemplate"/>
- <ComponentRef Id="VBWebServiceFileTemplate"/>
- <ComponentRef Id="VBWPFFlowDocumentFileTemplate"/>
- <ComponentRef Id="VBWPFPageFileTemplate"/>
- <ComponentRef Id="VBWPFPageFunctionFileTemplate"/>
- <ComponentRef Id="VBWPFResourceDictionaryFileTemplate"/>
- <ComponentRef Id="VBWPFUserControlFileTemplate"/>
- <ComponentRef Id="VBWPFWindowFileTemplate"/>
+ <ComponentRef Id="VBFileTemplates"/>
<ComponentRef Id="EmptyHTMLFileTemplate"/>
<ComponentRef Id="EmptyMsBuildFileTemplate"/>
<ComponentRef Id="EmptyResourceFileTemplate"/>
Please sign in to comment.
Something went wrong with that request. Please try again.