Browse Source

Merge branch '4.1' into newNR

newNRvisualizers
Daniel Grunwald 15 years ago
parent
commit
68b5f28abe
  1. 6
      src/AddIns/BackendBindings/Scripting/Test/Utils/MockTextEditorOptions.cs
  2. 9
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBNetProject.cs
  3. 6
      src/AddIns/BackendBindings/WixBinding/Test/Utils/MockTextEditorOptions.cs
  4. 4
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ChangeMarkerMargin.cs
  5. 14
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs
  6. 38
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DefaultChangeWatcher.cs
  7. 13
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/CodeEditorOptions.cs
  8. 3
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml
  9. 42
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineNode.cs
  10. 16
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/DragMoveMouseGesture.cs
  11. 13
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/PointerTool.cs
  12. 6
      src/AddIns/DisplayBindings/XmlEditor/Test/Utils/MockTextEditorOptions.cs
  13. 6
      src/AddIns/Misc/PackageManagement/Project/Src/SelectProjectsView.xaml
  14. 6
      src/AddIns/Misc/SearchAndReplace/Project/Engine/TextIterator/ForwardTextIterator.cs
  15. 4
      src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchResultNode.cs
  16. 2
      src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/OverrideToStringMethodDialog.xaml.cs
  17. 2
      src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/PropertyOrFieldWrapper.cs
  18. 13
      src/AddIns/Misc/TextTemplating/Project/Src/IAssemblyParserService.cs
  19. 12
      src/AddIns/Misc/TextTemplating/Project/Src/IReflectionProjectContent.cs
  20. 19
      src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingAssemblyParserService.cs
  21. 45
      src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingAssemblyResolver.cs
  22. 25
      src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingReflectionProjectContent.cs
  23. 4
      src/AddIns/Misc/TextTemplating/Project/TextTemplating.csproj
  24. BIN
      src/AddIns/Misc/TextTemplating/Project/lib/Mono.TextTemplating.dll
  25. 21
      src/AddIns/Misc/TextTemplating/Test/Helpers/FakeAssemblyParserService.cs
  26. 13
      src/AddIns/Misc/TextTemplating/Test/Helpers/FakeReflectionProjectContent.cs
  27. 72
      src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingAssemblyResolverTests.cs
  28. 22
      src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingReflectionProjectContentTests.cs
  29. 3
      src/AddIns/Misc/TextTemplating/Test/TextTemplating.Tests.csproj
  30. 2
      src/AddIns/VersionControl/GitAddIn/Src/GitVersionProvider.cs
  31. 8
      src/Libraries/AvalonDock/AvalonDock/ManagedContent.cs
  32. 22
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/InsightWindow.cs
  33. 16
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/InsightWindow.xaml
  34. 19
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/EditingCommandHandler.cs
  35. 2
      src/Libraries/NRefactory/ICSharpCode.Editor/TextChangeEventArgs.cs
  36. 246
      src/Main/Base/Project/ICSharpCode.SharpDevelop.addin
  37. 2
      src/Main/Base/Project/Src/Bookmarks/Commands/MenuCommands.cs
  38. 6
      src/Main/Base/Project/Src/Editor/AvalonEdit/AvalonEditTextEditorAdapter.cs
  39. 6
      src/Main/Base/Project/Src/Editor/IEditorControlService.cs
  40. 5
      src/Main/Base/Project/Src/Editor/ITextEditor.cs
  41. 4
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/GacReferencePanel.cs
  42. 2
      src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/EditAvailableConfigurationsDialog.cs
  43. 36
      src/Main/Base/Project/Src/Gui/FormLocationHelper.cs
  44. 2
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ReferenceNode.cs
  45. 13
      src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonDockLayout.cs
  46. 9
      src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs
  47. 12
      src/Main/Base/Project/Src/Project/Solution/Solution.cs
  48. 9
      src/Main/Base/Project/Src/Services/DisplayBinding/AutoDetectDisplayBinding.cs
  49. 4
      src/Main/Base/Project/Src/Util/ExtensionMethods.cs
  50. 2
      src/Main/ICSharpCode.Core.WinForms/Util/ClipboardWrapper.cs
  51. 8
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/TypeInference.cs

6
src/AddIns/BackendBindings/Scripting/Test/Utils/MockTextEditorOptions.cs

@ -30,5 +30,11 @@ namespace ICSharpCode.Scripting.Tests.Utils @@ -30,5 +30,11 @@ namespace ICSharpCode.Scripting.Tests.Utils
throw new NotImplementedException();
}
}
public string FontFamily {
get {
throw new NotImplementedException();
}
}
}
}

9
src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBNetProject.cs

@ -172,7 +172,14 @@ namespace ICSharpCode.VBNetBinding @@ -172,7 +172,14 @@ namespace ICSharpCode.VBNetBinding
bool? GetValue(string name, bool defaultVal)
{
string val = GetEvaluatedProperty(name);
string val;
try {
val = GetEvaluatedProperty(name);
} catch (ObjectDisposedException) {
// This can happen when the project is disposed but the resolver still tries
// to access Option Infer (or similar).
val = null;
}
if (val == null)
return defaultVal;

6
src/AddIns/BackendBindings/WixBinding/Test/Utils/MockTextEditorOptions.cs

@ -50,5 +50,11 @@ namespace WixBinding.Tests.Utils @@ -50,5 +50,11 @@ namespace WixBinding.Tests.Utils
}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged { add { } remove { } }
public string FontFamily {
get {
throw new NotImplementedException();
}
}
}
}

4
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ChangeMarkerMargin.cs

@ -50,8 +50,6 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -50,8 +50,6 @@ namespace ICSharpCode.AvalonEdit.AddIn
if (textView != null && textView.VisualLinesValid) {
var zeroLineInfo = changeWatcher.GetChange(0);
Debug.Assert(zeroLineInfo.Change == ChangeType.None || zeroLineInfo.Change == ChangeType.Deleted);
foreach (VisualLine line in textView.VisualLines) {
Rect rect = new Rect(0, line.VisualTop - textView.ScrollOffset.Y, 5, line.Height);
@ -202,7 +200,7 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -202,7 +200,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
differ.editor.Visibility = Visibility.Collapsed;
differ.copyButton.Visibility = Visibility.Collapsed;
} else {
var baseDocument = new TextDocument(changeWatcher.BaseDocument.Text);
var baseDocument = new TextDocument(DocumentUtilitites.GetTextSource(changeWatcher.BaseDocument));
if (differ.editor.SyntaxHighlighting != null) {
var mainHighlighter = new DocumentHighlighter(baseDocument, differ.editor.SyntaxHighlighting.MainRuleSet);
var popupHighlighter = differ.editor.TextArea.GetService(typeof(IHighlighter)) as DocumentHighlighter;

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

@ -118,8 +118,9 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -118,8 +118,9 @@ namespace ICSharpCode.AvalonEdit.AddIn
} else {
this.errorPainter.UpdateErrors();
}
changeWatcher.Initialize(this.Document, value);
if (changeWatcher != null) {
changeWatcher.Initialize(this.Document, value);
}
FetchParseInformation();
}
}
@ -146,8 +147,9 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -146,8 +147,9 @@ namespace ICSharpCode.AvalonEdit.AddIn
textMarkerService = new TextMarkerService(this);
iconBarManager = new IconBarManager();
changeWatcher = new DefaultChangeWatcher();
if (CodeEditorOptions.Instance.EnableChangeMarkerMargin) {
changeWatcher = new DefaultChangeWatcher();
}
primaryTextEditor = CreateTextEditor();
primaryTextEditorAdapter = (CodeEditorAdapter)primaryTextEditor.TextArea.GetService(typeof(ITextEditor));
Debug.Assert(primaryTextEditorAdapter != null);
@ -206,7 +208,9 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -206,7 +208,9 @@ namespace ICSharpCode.AvalonEdit.AddIn
textView.Services.AddService(typeof(IBookmarkMargin), iconBarManager);
codeEditorView.TextArea.LeftMargins.Insert(0, new IconBarMargin(iconBarManager));
codeEditorView.TextArea.LeftMargins.Add(new ChangeMarkerMargin(changeWatcher));
if (CodeEditorOptions.Instance.EnableChangeMarkerMargin) {
codeEditorView.TextArea.LeftMargins.Add(new ChangeMarkerMargin(changeWatcher));
}
textView.Services.AddService(typeof(ISyntaxHighlighter), new AvalonEditSyntaxHighlighterAdapter(textView));

38
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DefaultChangeWatcher.cs

@ -25,7 +25,7 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -25,7 +25,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
IDocument baseDocument;
IDocumentVersionProvider usedProvider;
IDisposable watcher;
FileName fileName;
FileName currentFileName;
public event EventHandler ChangeOccurred;
@ -43,36 +43,38 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -43,36 +43,38 @@ namespace ICSharpCode.AvalonEdit.AddIn
public void Initialize(IDocument document, FileName fileName)
{
if (changeList != null && changeList.Any())
return;
if (this.document == null) {
this.document = document;
this.textDocument = (TextDocument)document.GetService(typeof(TextDocument));
this.changeList = new CompressingTreeList<LineChangeInfo>((x, y) => x.Equals(y));
}
this.document = document;
this.fileName = fileName;
this.textDocument = (TextDocument)document.GetService(typeof(TextDocument));
this.changeList = new CompressingTreeList<LineChangeInfo>((x, y) => x.Equals(y));
InitializeBaseDocument();
InitializeBaseDocument(fileName);
if (watcher != null)
watcher.Dispose();
if (usedProvider != null) {
if (usedProvider != null)
watcher = usedProvider.WatchBaseVersionChanges(fileName, HandleBaseVersionChanges);
}
SetupInitialFileState(false);
SetupInitialFileState(fileName != currentFileName);
currentFileName = fileName;
this.textDocument.LineTrackers.Add(this);
this.textDocument.UndoStack.PropertyChanged += UndoStackPropertyChanged;
if (!this.textDocument.LineTrackers.Contains(this)) {
this.textDocument.LineTrackers.Add(this);
this.textDocument.UndoStack.PropertyChanged += UndoStackPropertyChanged;
}
}
void HandleBaseVersionChanges(object sender, EventArgs e)
{
ICSharpCode.Core.LoggingService.Info("HandleBaseVersionChanges");
InitializeBaseDocument();
InitializeBaseDocument(currentFileName);
SetupInitialFileState(true);
}
void InitializeBaseDocument()
void InitializeBaseDocument(FileName fileName)
{
Stream baseFileStream = GetBaseVersion();
Stream baseFileStream = GetBaseVersion(fileName);
if (baseFileStream != null) {
// ReadAll() is taking care of closing the stream
baseDocument = new ReadOnlyDocument(ReadAll(baseFileStream));
@ -140,7 +142,7 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -140,7 +142,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
return FileReader.ReadFileContent(memory, ParserService.DefaultFileEncoding);
}
Stream GetBaseVersion()
Stream GetBaseVersion(FileName fileName)
{
foreach (IDocumentVersionProvider provider in VersioningServices.Instance.DocumentVersionProviders) {
var result = provider.OpenBaseVersion(fileName);

13
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/CodeEditorOptions.cs

@ -66,6 +66,19 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options @@ -66,6 +66,19 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options
}
}
bool enableChangeMarkerMargin = true;
[DefaultValue(true)]
public bool EnableChangeMarkerMargin {
get { return enableChangeMarkerMargin; }
set {
if (enableChangeMarkerMargin != value) {
enableChangeMarkerMargin = value;
OnPropertyChanged("EnableChangeMarkerMargin");
}
}
}
bool wordWrap;
[DefaultValue(false)]

3
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml

@ -17,6 +17,9 @@ @@ -17,6 +17,9 @@
<CheckBox
IsChecked="{core:OptionBinding local:CodeEditorOptions.EnableFolding}"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.FoldingCheckBox}" />
<CheckBox
IsChecked="{core:OptionBinding local:CodeEditorOptions.EnableChangeMarkerMargin}"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.ChangeMarkerMarginCheckBox}" />
<CheckBox
IsChecked="{core:OptionBinding local:CodeEditorOptions.EnableQuickClassBrowser}"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.ShowQuickClassBrowserCheckBox}" />

42
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/OutlineView/OutlineNode.cs

@ -142,34 +142,40 @@ namespace ICSharpCode.WpfDesign.Designer.OutlineView @@ -142,34 +142,40 @@ namespace ICSharpCode.WpfDesign.Designer.OutlineView
public bool CanInsert(IEnumerable<OutlineNode> nodes, OutlineNode after, bool copy)
{
var operation = PlacementOperation.Start(nodes.Select(node => node.DesignItem).ToArray(), DummyPlacementType);
var placementBehavior = DesignItem.GetBehavior<IPlacementBehavior>();
if(operation!=null)
return placementBehavior.CanEnterContainer(operation);
if (placementBehavior == null)
return false;
var operation = PlacementOperation.Start(nodes.Select(node => node.DesignItem).ToArray(), DummyPlacementType);
if (operation != null) {
bool canEnter = placementBehavior.CanEnterContainer(operation);
operation.Abort();
return canEnter;
}
return false;
}
public void Insert(IEnumerable<OutlineNode> nodes, OutlineNode after, bool copy)
{
if (copy) {
nodes = nodes.Select(n => OutlineNode.Create(n.DesignItem.Clone()));
}
else {
foreach (var node in nodes) {
node.DesignItem.Remove();
using (var moveTransaction = DesignItem.Context.OpenGroup("Item moved in outline view", nodes.Select(n => n.DesignItem).ToList())) {
if (copy) {
nodes = nodes.Select(n => OutlineNode.Create(n.DesignItem.Clone())).ToList();
} else {
foreach (var node in nodes) {
node.DesignItem.Remove();
}
}
}
var index = after == null ? 0 : Children.IndexOf(after) + 1;
var index = after == null ? 0 : Children.IndexOf(after) + 1;
var content = DesignItem.ContentProperty;
if (content.IsCollection) {
foreach (var node in nodes) {
content.CollectionElements.Insert(index++, node.DesignItem);
var content = DesignItem.ContentProperty;
if (content.IsCollection) {
foreach (var node in nodes) {
content.CollectionElements.Insert(index++, node.DesignItem);
}
} else {
content.SetValue(nodes.First().DesignItem);
}
}
else {
content.SetValue(nodes.First().DesignItem);
moveTransaction.Commit();
}
}

16
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/DragMoveMouseGesture.cs

@ -16,13 +16,15 @@ namespace ICSharpCode.WpfDesign.Designer.Services @@ -16,13 +16,15 @@ namespace ICSharpCode.WpfDesign.Designer.Services
sealed class DragMoveMouseGesture : ClickOrDragMouseGesture
{
bool isDoubleClick;
bool setSelectionIfNotMoving;
MoveLogic moveLogic;
internal DragMoveMouseGesture(DesignItem clickedOn, bool isDoubleClick)
internal DragMoveMouseGesture(DesignItem clickedOn, bool isDoubleClick, bool setSelectionIfNotMoving = false)
{
Debug.Assert(clickedOn != null);
this.isDoubleClick = isDoubleClick;
this.setSelectionIfNotMoving = setSelectionIfNotMoving;
this.positionRelativeTo = clickedOn.Services.DesignPanel;
moveLogic = new MoveLogic(clickedOn);
@ -41,10 +43,14 @@ namespace ICSharpCode.WpfDesign.Designer.Services @@ -41,10 +43,14 @@ namespace ICSharpCode.WpfDesign.Designer.Services
protected override void OnMouseUp(object sender, MouseButtonEventArgs e)
{
if (!hasDragStarted && isDoubleClick) {
// user made a double-click
Debug.Assert(moveLogic.Operation == null);
moveLogic.HandleDoubleClick();
if (!hasDragStarted) {
if (isDoubleClick) {
// user made a double-click
Debug.Assert(moveLogic.Operation == null);
moveLogic.HandleDoubleClick();
} else if (setSelectionIfNotMoving) {
services.Selection.SetSelectedComponents(new DesignItem[] { moveLogic.ClickedOn }, SelectionTypes.Auto);
}
}
moveLogic.Stop();
Stop();

13
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/PointerTool.cs

@ -37,9 +37,18 @@ namespace ICSharpCode.WpfDesign.Designer.Services @@ -37,9 +37,18 @@ namespace ICSharpCode.WpfDesign.Designer.Services
if (e.ChangedButton == MouseButton.Left && MouseGestureBase.IsOnlyButtonPressed(e, MouseButton.Left)) {
e.Handled = true;
ISelectionService selectionService = designPanel.Context.Services.Selection;
selectionService.SetSelectedComponents(new DesignItem[] { result.ModelHit }, SelectionTypes.Auto);
bool setSelectionIfNotMoving = false;
if (selectionService.IsComponentSelected(result.ModelHit)) {
new DragMoveMouseGesture(result.ModelHit, e.ClickCount == 2).Start(designPanel, e);
setSelectionIfNotMoving = true;
// There might be multiple components selected. We might have
// to set the selection to only the item clicked on
// (or deselect the item clicked on if Ctrl is pressed),
// but we should do so only if the user isn't performing a drag operation.
} else {
selectionService.SetSelectedComponents(new DesignItem[] { result.ModelHit }, SelectionTypes.Auto);
}
if (selectionService.IsComponentSelected(result.ModelHit)) {
new DragMoveMouseGesture(result.ModelHit, e.ClickCount == 2, setSelectionIfNotMoving).Start(designPanel, e);
}
}
}

6
src/AddIns/DisplayBindings/XmlEditor/Test/Utils/MockTextEditorOptions.cs

@ -46,5 +46,11 @@ namespace XmlEditor.Tests.Utils @@ -46,5 +46,11 @@ namespace XmlEditor.Tests.Utils
throw new NotImplementedException();
}
}
public string FontFamily {
get {
throw new NotImplementedException();
}
}
}
}

6
src/AddIns/Misc/PackageManagement/Project/Src/SelectProjectsView.xaml

@ -55,12 +55,12 @@ @@ -55,12 +55,12 @@
Margin="4"
Orientation="Horizontal"
HorizontalAlignment="Right">
<Button
Content="_Cancel"
IsCancel="True"/>
<Button
Content="_OK"
Click="AcceptButtonClick"/>
<Button
Content="_Cancel"
IsCancel="True"/>
</StackPanel>
</Grid>
</Window>

6
src/AddIns/Misc/SearchAndReplace/Project/Engine/TextIterator/ForwardTextIterator.cs

@ -83,6 +83,12 @@ namespace SearchAndReplace @@ -83,6 +83,12 @@ namespace SearchAndReplace
{
Debug.Assert(numChars > 0);
// HACK : ignore files with length 1 (fixes SD-1815)
if (document.TextLength == 1) {
state = TextIteratorState.Done;
return false;
}
switch (state) {
case TextIteratorState.Resetted:
if (document.TextLength == 0) {

4
src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchResultNode.cs

@ -22,8 +22,6 @@ namespace SearchAndReplace @@ -22,8 +22,6 @@ namespace SearchAndReplace
/// </summary>
sealed class SearchResultNode : SearchNode
{
static readonly FontFamily resultLineFamily = new FontFamily("Consolas, Courier New");
SearchResultMatch result;
PermanentAnchor anchor;
HighlightedInlineBuilder inlineBuilder;
@ -42,7 +40,7 @@ namespace SearchAndReplace @@ -42,7 +40,7 @@ namespace SearchAndReplace
if (lineNumber >= 1 && lineNumber <= document.LineCount) {
IDocumentLine matchedLine = document.GetLineByNumber(lineNumber);
inlineBuilder = new HighlightedInlineBuilder(document.GetText(matchedLine));
inlineBuilder.SetFontFamily(0, inlineBuilder.Text.Length, resultLineFamily);
inlineBuilder.SetFontFamily(0, inlineBuilder.Text.Length, new FontFamily(EditorControlService.GlobalOptions.FontFamily));
IHighlighter highlighter = document.GetService(typeof(IHighlighter)) as IHighlighter;
if (highlighter != null) {

2
src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/OverrideToStringMethodDialog.xaml.cs

@ -30,7 +30,7 @@ namespace SharpRefactoring.Gui @@ -30,7 +30,7 @@ namespace SharpRefactoring.Gui
InitializeComponent();
this.baseCall = baseCall;
this.fields = fields.Select(f => new PropertyOrFieldWrapper(f) { IsSelected = true }).ToList();
this.fields = fields.Where(f => f.ReturnType != null).Select(f => new PropertyOrFieldWrapper(f) { IsSelected = true }).ToList();
this.listBox.ItemsSource = this.fields;
}

2
src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/PropertyOrFieldWrapper.cs

@ -25,7 +25,7 @@ namespace SharpRefactoring.Gui @@ -25,7 +25,7 @@ namespace SharpRefactoring.Gui
public PropertyOrFieldWrapper(IMember member)
{
if (member == null || member.ReturnType == null)
if (member == null)
throw new ArgumentNullException("member");
if (!(member is IField || member is IProperty))
throw new ArgumentException("member must be IField or IProperty");

13
src/AddIns/Misc/TextTemplating/Project/Src/IAssemblyParserService.cs

@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
// 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 ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.TextTemplating
{
public interface IAssemblyParserService
{
IReflectionProjectContent GetReflectionProjectContentForReference(ReferenceProjectItem item);
}
}

12
src/AddIns/Misc/TextTemplating/Project/Src/IReflectionProjectContent.cs

@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
// 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;
namespace ICSharpCode.TextTemplating
{
public interface IReflectionProjectContent
{
string AssemblyLocation { get; }
}
}

19
src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingAssemblyParserService.cs

@ -0,0 +1,19 @@ @@ -0,0 +1,19 @@
// 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 ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.TextTemplating
{
public class TextTemplatingAssemblyParserService : IAssemblyParserService
{
public IReflectionProjectContent GetReflectionProjectContentForReference(ReferenceProjectItem item)
{
IProjectContent projectContent = AssemblyParserService.GetProjectContentForReference(item);
return new TextTemplatingReflectionProjectContent(projectContent);
}
}
}

45
src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingAssemblyResolver.cs

@ -9,25 +9,66 @@ namespace ICSharpCode.TextTemplating @@ -9,25 +9,66 @@ namespace ICSharpCode.TextTemplating
public class TextTemplatingAssemblyResolver : ITextTemplatingAssemblyResolver
{
IProject project;
IAssemblyParserService assemblyParserService;
public TextTemplatingAssemblyResolver(IProject project)
public TextTemplatingAssemblyResolver(
IProject project,
IAssemblyParserService assemblyParserService)
{
this.project = project;
this.assemblyParserService = assemblyParserService;
}
public TextTemplatingAssemblyResolver(IProject project)
: this(project, new TextTemplatingAssemblyParserService())
{
}
public string Resolve(string assemblyReference)
{
string resolvedAssemblyFileName = ResolveAssemblyFromProject(assemblyReference);
if (resolvedAssemblyFileName == null) {
resolvedAssemblyFileName = ResolveAssemblyFromGac(assemblyReference);
}
if (resolvedAssemblyFileName != null) {
return resolvedAssemblyFileName;
}
return assemblyReference;
}
string ResolveAssemblyFromProject(string assemblyReference)
{
foreach (ReferenceProjectItem refProjectItem in project.GetItemsOfType(ItemType.Reference)) {
if (IsMatch(refProjectItem, assemblyReference)) {
return refProjectItem.FileName;
}
}
return assemblyReference;
return null;
}
bool IsMatch(ReferenceProjectItem refProjectItem, string assemblyReference)
{
return String.Equals(refProjectItem.Include, assemblyReference, StringComparison.InvariantCultureIgnoreCase);
}
string ResolveAssemblyFromGac(string assemblyReference)
{
IReflectionProjectContent projectContent = GetProjectContent(assemblyReference);
if (projectContent != null) {
return projectContent.AssemblyLocation;
}
return null;
}
IReflectionProjectContent GetProjectContent(string assemblyReference)
{
var reference = new ReferenceProjectItem(project, assemblyReference);
return GetProjectContent(reference);
}
IReflectionProjectContent GetProjectContent(ReferenceProjectItem refProjectItem)
{
return assemblyParserService.GetReflectionProjectContentForReference(refProjectItem);
}
}
}

25
src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingReflectionProjectContent.cs

@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
// 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 ICSharpCode.SharpDevelop.Dom;
namespace ICSharpCode.TextTemplating
{
public class TextTemplatingReflectionProjectContent : IReflectionProjectContent
{
public TextTemplatingReflectionProjectContent(IProjectContent projectContent)
: this(projectContent as ReflectionProjectContent)
{
}
TextTemplatingReflectionProjectContent(ReflectionProjectContent projectContent)
{
if (projectContent != null) {
AssemblyLocation = projectContent.AssemblyLocation;
}
}
public string AssemblyLocation { get; private set; }
}
}

4
src/AddIns/Misc/TextTemplating/Project/TextTemplating.csproj

@ -51,6 +51,8 @@ @@ -51,6 +51,8 @@
<Link>Configuration\GlobalAssemblyInfo.cs</Link>
</Compile>
<Compile Include="Src\CompilerErrorTask.cs" />
<Compile Include="Src\IAssemblyParserService.cs" />
<Compile Include="Src\IReflectionProjectContent.cs" />
<Compile Include="Src\ITextTemplatingAppDomain.cs" />
<Compile Include="Src\ITextTemplatingAppDomainFactory.cs" />
<Compile Include="Src\ITextTemplatingAssemblyResolver.cs" />
@ -62,6 +64,7 @@ @@ -62,6 +64,7 @@
<Compile Include="Src\TemplatingHostProcessTemplateError.cs" />
<Compile Include="Src\TextTemplatingAppDomain.cs" />
<Compile Include="Src\TextTemplatingAppDomainFactory.cs" />
<Compile Include="Src\TextTemplatingAssemblyParserService.cs" />
<Compile Include="Src\TextTemplatingAssemblyResolver.cs" />
<Compile Include="Src\TextTemplatingCustomTool.cs" />
<Compile Include="Src\TextTemplatingCustomToolContext.cs" />
@ -72,6 +75,7 @@ @@ -72,6 +75,7 @@
<Compile Include="Src\TextTemplatingFilePreprocessorCustomTool.cs" />
<Compile Include="Src\TextTemplatingFileProcessor.cs" />
<Compile Include="Src\TextTemplatingHost.cs" />
<Compile Include="Src\TextTemplatingReflectionProjectContent.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\TextTemplating.xshd" />

BIN
src/AddIns/Misc/TextTemplating/Project/lib/Mono.TextTemplating.dll

Binary file not shown.

21
src/AddIns/Misc/TextTemplating/Test/Helpers/FakeAssemblyParserService.cs

@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
// 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 ICSharpCode.SharpDevelop.Project;
using ICSharpCode.TextTemplating;
namespace TextTemplating.Tests.Helpers
{
public class FakeAssemblyParserService : IAssemblyParserService
{
public FakeReflectionProjectContent FakeReflectionProjectContent = new FakeReflectionProjectContent();
public ReferenceProjectItem ItemPassedToGetReflectionProjectContentForReference;
public IReflectionProjectContent GetReflectionProjectContentForReference(ReferenceProjectItem item)
{
ItemPassedToGetReflectionProjectContentForReference = item;
return FakeReflectionProjectContent;
}
}
}

13
src/AddIns/Misc/TextTemplating/Test/Helpers/FakeReflectionProjectContent.cs

@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
// 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 ICSharpCode.TextTemplating;
namespace TextTemplating.Tests.Helpers
{
public class FakeReflectionProjectContent : IReflectionProjectContent
{
public string AssemblyLocation { get; set; }
}
}

72
src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingAssemblyResolverTests.cs

@ -15,11 +15,13 @@ namespace TextTemplating.Tests @@ -15,11 +15,13 @@ namespace TextTemplating.Tests
{
TextTemplatingAssemblyResolver resolver;
IProject project;
FakeAssemblyParserService fakeAssemblyParserService;
void CreateResolver()
{
project = ProjectHelper.CreateProject();
resolver = new TextTemplatingAssemblyResolver(project);
fakeAssemblyParserService = new FakeAssemblyParserService();
resolver = new TextTemplatingAssemblyResolver(project, fakeAssemblyParserService);
}
ReferenceProjectItem AddReferenceToProject(string referenceName)
@ -29,10 +31,25 @@ namespace TextTemplating.Tests @@ -29,10 +31,25 @@ namespace TextTemplating.Tests
return projectItem;
}
IProject GetProjectPassedToAssemblyParserService()
{
return ReferenceProjectItemPassedToGetReflectionProjectContentForReference.Project;
}
ReferenceProjectItem ReferenceProjectItemPassedToGetReflectionProjectContentForReference {
get { return fakeAssemblyParserService.ItemPassedToGetReflectionProjectContentForReference; }
}
ItemType GetReferenceItemTypePassedToAssemblyParserService()
{
return ReferenceProjectItemPassedToGetReflectionProjectContentForReference.ItemType;
}
[Test]
public void Resolve_ProjectHasNoReferences_ReturnsAssemblyReferencePassedToMethod()
{
CreateResolver();
fakeAssemblyParserService.FakeReflectionProjectContent = null;
string result = resolver.Resolve("Test");
Assert.AreEqual("Test", result);
@ -76,5 +93,58 @@ namespace TextTemplating.Tests @@ -76,5 +93,58 @@ namespace TextTemplating.Tests
Assert.AreEqual(expectedFileName, result);
}
[Test]
public void Resolve_ProjectHasNoReferencesAndAssemblyReferenceInGac_ReturnsFullPathToAssemblyFoundFromAssemblyParserService()
{
CreateResolver();
string expectedFileName = @"c:\Windows\System32\Gac\System.Data.dll";
fakeAssemblyParserService.FakeReflectionProjectContent.AssemblyLocation = expectedFileName;
string result = resolver.Resolve("System.Data");
Assert.AreEqual(expectedFileName, result);
}
[Test]
public void Resolve_ProjectHasNoReferencesAndAssemblyReferenceInGac_ReferenceItemPassedToAssemblyParserServiceUsesProject()
{
CreateResolver();
string result = resolver.Resolve("System.Data");
IProject expectedProject = GetProjectPassedToAssemblyParserService();
Assert.AreEqual(project, expectedProject);
}
[Test]
public void Resolve_ProjectHasNoReferencesAndAssemblyReferenceInGac_ReferenceItemPassedToAssemblyParserServiceIsReference()
{
CreateResolver();
string result = resolver.Resolve("System.Data");
ItemType type = GetReferenceItemTypePassedToAssemblyParserService();
Assert.AreEqual(ItemType.Reference, type);
}
[Test]
public void Resolve_ProjectHasNoReferencesAndAssemblyReferenceInGac_ReferenceItemIncludePassedToAssemblyParserServiceIsAssemblyNameToResolve()
{
CreateResolver();
string result = resolver.Resolve("System.Data");
string referenceInclude = ReferenceProjectItemPassedToGetReflectionProjectContentForReference.Include;
Assert.AreEqual("System.Data", referenceInclude);
}
[Test]
public void Resolve_ProjectHasNoReferencesAndAssemblyReferenceNotFoundInGac_ReturnsAssemblyReferencePassedToMethod()
{
CreateResolver();
fakeAssemblyParserService.FakeReflectionProjectContent = null;
string result = resolver.Resolve("System.Data");
Assert.AreEqual("System.Data", result);
}
}
}

22
src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingReflectionProjectContentTests.cs

@ -0,0 +1,22 @@ @@ -0,0 +1,22 @@
// 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 ICSharpCode.TextTemplating;
using NUnit.Framework;
namespace TextTemplating.Tests
{
[TestFixture]
public class TextTemplatingReflectionProjectContentTests
{
[Test]
public void AssemblyLocation_NullProjectContentPassedToConstructor_ReturnsNull()
{
var projectContent = new TextTemplatingReflectionProjectContent(null);
string location = projectContent.AssemblyLocation;
Assert.IsNull(location);
}
}
}

3
src/AddIns/Misc/TextTemplating/Test/TextTemplating.Tests.csproj

@ -55,6 +55,8 @@ @@ -55,6 +55,8 @@
<Link>Configuration\GlobalAssemblyInfo.cs</Link>
</Compile>
<Compile Include="Configuration\AssemblyInfo.cs" />
<Compile Include="Helpers\FakeAssemblyParserService.cs" />
<Compile Include="Helpers\FakeReflectionProjectContent.cs" />
<Compile Include="Helpers\FakeTextTemplatingAppDomain.cs" />
<Compile Include="Helpers\FakeTextTemplatingAppDomainFactory.cs" />
<Compile Include="Helpers\FakeTextTemplatingAssemblyResolver.cs" />
@ -76,6 +78,7 @@ @@ -76,6 +78,7 @@
<Compile Include="Src\TextTemplatingFilePreprocessorCustomToolTests.cs" />
<Compile Include="Src\TextTemplatingHostTests.cs" />
<Compile Include="Src\TextTemplatingPreprocessorTests.cs" />
<Compile Include="Src\TextTemplatingReflectionProjectContentTests.cs" />
</ItemGroup>
<ItemGroup>
<Folder Include="Configuration" />

2
src/AddIns/VersionControl/GitAddIn/Src/GitVersionProvider.cs

@ -185,6 +185,4 @@ namespace ICSharpCode.GitAddIn @@ -185,6 +185,4 @@ namespace ICSharpCode.GitAddIn
watcher.ReleaseWatch(HandleChanges);
}
}
}

8
src/Libraries/AvalonDock/AvalonDock/ManagedContent.cs

@ -269,7 +269,9 @@ namespace AvalonDock @@ -269,7 +269,9 @@ namespace AvalonDock
{
_dragEnabledArea.MouseRightButtonDown += (s, e) =>
{
if (!e.Handled)
// HACK: WPF still calls MouseRightButtonDown even if this managed content was just closed,
// causing an exception (SD-1858). So avoid handling this event if the ManagedContent was unloaded.
if (!e.Handled && this.IsLoaded)
{
Activate();
if (_dragEnabledArea.ContextMenu == null)
@ -400,7 +402,9 @@ namespace AvalonDock @@ -400,7 +402,9 @@ namespace AvalonDock
{
base.OnMouseDown(e);
if (!e.Handled)
// HACK: WPF still calls MouseRightButtonDown even if this managed content was just closed,
// causing an exception (SD-1858). So avoid handling this event if the ManagedContent was unloaded.
if (!e.Handled && this.IsLoaded)
{
Activate();
//FocusManager.SetFocusedElement(Content as DependencyObject, DefaultElement);

22
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/InsightWindow.cs

@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
using System;
using System.Windows;
using System.Windows.Controls;
using ICSharpCode.AvalonEdit.Editing;
using ICSharpCode.AvalonEdit.Utils;
@ -28,6 +29,12 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion @@ -28,6 +29,12 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion
{
this.CloseAutomatically = true;
AttachEvents();
Rect caret = this.TextArea.Caret.CalculateCaretRectangle();
Rect workingArea = System.Windows.Forms.Screen.FromPoint(caret.Location.ToSystemDrawing()).WorkingArea.ToWpf();
MaxHeight = workingArea.Height;
MaxWidth = Math.Min(workingArea.Width, Math.Max(1000, workingArea.Width * 0.6));
}
/// <summary>
@ -63,4 +70,19 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion @@ -63,4 +70,19 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion
}
}
}
/// <summary>
/// TemplateSelector for InsightWindow to replace plain string content by a TextBlock with TextWrapping.
/// </summary>
internal sealed class InsightWindowTemplateSelector : DataTemplateSelector
{
/// <inheritdoc/>
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is string)
return (DataTemplate)((FrameworkElement)container).FindResource("TextBlockTemplate");
return null;
}
}
}

16
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/InsightWindow.xaml

@ -2,6 +2,8 @@ @@ -2,6 +2,8 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cc="clr-namespace:ICSharpCode.AvalonEdit.CodeCompletion"
>
<cc:InsightWindowTemplateSelector x:Key="templateSelector" />
<!-- Template for InsightWindow. Based on the template for ToolTip. -->
<Style TargetType="{x:Type cc:InsightWindow}">
<Setter Property="SizeToContent" Value="WidthAndHeight" />
@ -100,10 +102,16 @@ @@ -100,10 +102,16 @@
<Path Stroke="Black" Fill="Black" Data="M 0,0 L 1,0 L 0.5,0.866 Z" Stretch="UniformToFill" />
</Button>
</StackPanel>
<ContentControl Grid.Row="0" Grid.Column="1"
Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Provider.CurrentHeader}"/>
<ContentControl Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2"
Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Provider.CurrentContent}"/>
<ContentPresenter Grid.Row="0" Grid.Column="1"
Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Provider.CurrentHeader}"/>
<ContentPresenter Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" ContentTemplateSelector="{StaticResource templateSelector}"
Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Provider.CurrentContent}">
<ContentPresenter.Resources>
<DataTemplate x:Key="TextBlockTemplate">
<TextBlock TextWrapping="Wrap" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}" />
</DataTemplate>
</ContentPresenter.Resources>
</ContentPresenter>
</Grid>
</ControlTemplate>
</Setter.Value>

19
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/EditingCommandHandler.cs

@ -365,6 +365,8 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -365,6 +365,8 @@ namespace ICSharpCode.AvalonEdit.Editing
if (textArea != null && textArea.Document != null) {
args.CanExecute = textArea.ReadOnlySectionProvider.CanInsert(textArea.Caret.Offset)
&& Clipboard.ContainsText();
// WPF Clipboard.ContainsText() is safe to call without catching ExternalExceptions
// because it doesn't try to lock the clipboard - it just peeks inside with IsClipboardFormatAvailable().
args.Handled = true;
}
}
@ -373,15 +375,24 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -373,15 +375,24 @@ namespace ICSharpCode.AvalonEdit.Editing
{
TextArea textArea = GetTextArea(target);
if (textArea != null && textArea.Document != null) {
Debug.WriteLine( Clipboard.GetText(TextDataFormat.Html) );
IDataObject dataObject;
try {
dataObject = Clipboard.GetDataObject();
} catch (ExternalException) {
return;
}
if (dataObject == null)
return;
Debug.WriteLine( dataObject.GetData(DataFormats.Html) as string );
// convert text back to correct newlines for this document
string newLine = TextUtilities.GetNewLineFromDocument(textArea.Document, textArea.Caret.Line);
string text = TextUtilities.NormalizeNewLines(Clipboard.GetText(), newLine);
string text = (string)dataObject.GetData(DataFormats.UnicodeText);
text = TextUtilities.NormalizeNewLines(text, newLine);
if (!string.IsNullOrEmpty(text)) {
bool fullLine = textArea.Options.CutCopyWholeLine && Clipboard.ContainsData(LineSelectedType);
bool rectangular = Clipboard.ContainsData(RectangleSelection.RectangularSelectionDataType);
bool fullLine = textArea.Options.CutCopyWholeLine && dataObject.GetDataPresent(LineSelectedType);
bool rectangular = dataObject.GetDataPresent(RectangleSelection.RectangularSelectionDataType);
if (fullLine) {
DocumentLine currentLine = textArea.Document.GetLineByNumber(textArea.Caret.Line);
if (textArea.ReadOnlySectionProvider.CanInsert(currentLine.Offset)) {

2
src/Libraries/NRefactory/ICSharpCode.Editor/TextChangeEventArgs.cs

@ -39,7 +39,7 @@ namespace ICSharpCode.Editor @@ -39,7 +39,7 @@ namespace ICSharpCode.Editor
}
/// <summary>
/// The text that was inserted.
/// The text that was removed.
/// </summary>
public string RemovedText {
get { return removedText; }

246
src/Main/Base/Project/ICSharpCode.SharpDevelop.addin

@ -368,12 +368,14 @@ @@ -368,12 +368,14 @@
</Path>
<Path name = "/SharpDevelop/Pads/ProjectBrowser/ContextMenu/ReferenceFolderNode">
<MenuItem id = "AddReference"
label = "${res:ProjectComponent.ContextMenu.AddReference}"
class = "ICSharpCode.SharpDevelop.Project.Commands.AddReferenceToProject"/>
<MenuItem id = "AddWebReference"
label = "${res:ProjectComponent.ContextMenu.AddWebReference}"
class = "ICSharpCode.SharpDevelop.Project.Commands.AddWebReferenceToProject"/>
<Condition name="WriteableProject" action="Disable">
<MenuItem id = "AddReference"
label = "${res:ProjectComponent.ContextMenu.AddReference}"
class = "ICSharpCode.SharpDevelop.Project.Commands.AddReferenceToProject"/>
<MenuItem id = "AddWebReference"
label = "${res:ProjectComponent.ContextMenu.AddWebReference}"
class = "ICSharpCode.SharpDevelop.Project.Commands.AddWebReferenceToProject"/>
</Condition>
</Path>
<Path name = "/SharpDevelop/Pads/ProjectBrowser/ContextMenu/FileNode">
@ -403,23 +405,25 @@ @@ -403,23 +405,25 @@
<Not>
<Condition name = "Ownerstate" ownerstate = "Missing"/>
</Not>
<MenuItem id = "OpenSeparator" type = "Separator" />
<Condition name = "Ownerstate" ownerstate = "InProject">
<MenuItem id = "Add" label = "${res:ProjectComponent.ContextMenu.AddMenu}" type="Menu">
<Include path="/SharpDevelop/Pads/ProjectBrowser/ContextMenu/FolderNode/Add"/>
<MenuItem id = "AddDependentSeparator"
type = "Separator" />
<MenuItem id = "NewDependentItem"
label = "${res:ProjectComponent.ContextMenu.NewDependentItem}"
icon = "ProjectBrowser.CodeBehind"
class = "ICSharpCode.SharpDevelop.Project.Commands.AddNewDependentItemsToProject"/>
<MenuItem id = "ExistingItemAsDependent"
label = "${res:ProjectComponent.ContextMenu.ExistingItemAsDependent}"
icon = "ProjectBrowser.CodeBehind"
class = "ICSharpCode.SharpDevelop.Project.Commands.AddExistingItemsToProjectAsDependent"/>
</MenuItem>
<MenuItem id = "AddSeparator" type = "Separator" />
<Condition name="WriteableProject" action="Disable">
<MenuItem id = "OpenSeparator" type = "Separator" />
<Condition name = "Ownerstate" ownerstate = "InProject">
<MenuItem id = "Add" label = "${res:ProjectComponent.ContextMenu.AddMenu}" type="Menu">
<Include path="/SharpDevelop/Pads/ProjectBrowser/ContextMenu/FolderNode/Add"/>
<MenuItem id = "AddDependentSeparator"
type = "Separator" />
<MenuItem id = "NewDependentItem"
label = "${res:ProjectComponent.ContextMenu.NewDependentItem}"
icon = "ProjectBrowser.CodeBehind"
class = "ICSharpCode.SharpDevelop.Project.Commands.AddNewDependentItemsToProject"/>
<MenuItem id = "ExistingItemAsDependent"
label = "${res:ProjectComponent.ContextMenu.ExistingItemAsDependent}"
icon = "ProjectBrowser.CodeBehind"
class = "ICSharpCode.SharpDevelop.Project.Commands.AddExistingItemsToProjectAsDependent"/>
</MenuItem>
<MenuItem id = "AddSeparator" type = "Separator" />
</Condition>
</Condition>
<ComplexCondition>
@ -433,9 +437,11 @@ @@ -433,9 +437,11 @@
<Condition name = "Ownerstate" ownerstate = "InProject"/>
<Condition name = "Ownerstate" ownerstate = "BehindFile"/>
</Or>
<MenuItem id = "ExcludeFile"
label = "${res:ProjectComponent.ContextMenu.ExcludeFileFromProject}"
class = "ICSharpCode.SharpDevelop.Project.Commands.ExcludeFileFromProject"/>
<Condition name="WriteableProject" action="Disable">
<MenuItem id = "ExcludeFile"
label = "${res:ProjectComponent.ContextMenu.ExcludeFileFromProject}"
class = "ICSharpCode.SharpDevelop.Project.Commands.ExcludeFileFromProject"/>
</Condition>
<MenuItem id = "ExecuteCustomTool"
label = "${res:ProjectComponent.ContextMenu.ExecuteCustomTool}"
class = "ICSharpCode.SharpDevelop.Project.ExecuteCustomToolCommand"/>
@ -459,84 +465,94 @@ @@ -459,84 +465,94 @@
</Path>
<Path name = "/SharpDevelop/Pads/ProjectBrowser/ContextMenu/CutCopyRemoveRename">
<MenuItem id = "Cut"
label = "${res:XML.MainMenu.EditMenu.Cut}"
type = "Item"
icon = "Icons.16x16.CutIcon"
loadclasslazy = "false"
class = "ICSharpCode.SharpDevelop.Project.Commands.CutProjectBrowserNode"/>
<Condition name="WriteableProject" action="Disable">
<MenuItem id = "Cut"
label = "${res:XML.MainMenu.EditMenu.Cut}"
type = "Item"
icon = "Icons.16x16.CutIcon"
loadclasslazy = "false"
class = "ICSharpCode.SharpDevelop.Project.Commands.CutProjectBrowserNode"/>
</Condition>
<MenuItem id = "Copy"
label = "${res:XML.MainMenu.EditMenu.Copy}"
type = "Item"
icon = "Icons.16x16.CopyIcon"
loadclasslazy = "false"
class = "ICSharpCode.SharpDevelop.Project.Commands.CopyProjectBrowserNode"/>
<MenuItem id = "Remove"
label = "${res:Global.RemoveButtonText}"
type = "Item"
icon = "Icons.16x16.DeleteIcon"
loadclasslazy = "false"
class = "ICSharpCode.SharpDevelop.Project.Commands.DeleteProjectBrowserNode"/>
<MenuItem id = "Rename"
label = "${res:ProjectComponent.ContextMenu.Rename}"
shortcut = "F2"
class = "ICSharpCode.SharpDevelop.Project.Commands.RenameEntryEvent"/>
<Condition name="WriteableProject" action="Disable">
<MenuItem id = "Remove"
label = "${res:Global.RemoveButtonText}"
type = "Item"
icon = "Icons.16x16.DeleteIcon"
loadclasslazy = "false"
class = "ICSharpCode.SharpDevelop.Project.Commands.DeleteProjectBrowserNode"/>
<MenuItem id = "Rename"
label = "${res:ProjectComponent.ContextMenu.Rename}"
shortcut = "F2"
class = "ICSharpCode.SharpDevelop.Project.Commands.RenameEntryEvent"/>
</Condition>
</Path>
<Path name = "/SharpDevelop/Pads/ProjectBrowser/ContextMenu/CutPasteRemoveRename">
<MenuItem id = "Cut"
label = "${res:XML.MainMenu.EditMenu.Cut}"
type = "Item"
icon = "Icons.16x16.CutIcon"
loadclasslazy = "false"
class = "ICSharpCode.SharpDevelop.Project.Commands.CutProjectBrowserNode"/>
<MenuItem id = "Paste"
label = "${res:XML.MainMenu.EditMenu.Paste}"
type = "Item"
icon = "Icons.16x16.PasteIcon"
loadclasslazy = "false"
class = "ICSharpCode.SharpDevelop.Project.Commands.PasteProjectBrowserNode"/>
<MenuItem id = "Remove"
label = "${res:Global.RemoveButtonText}"
type = "Item"
icon = "Icons.16x16.DeleteIcon"
loadclasslazy = "false"
class = "ICSharpCode.SharpDevelop.Project.Commands.DeleteProjectBrowserNode"/>
<MenuItem id = "Rename"
label = "${res:ProjectComponent.ContextMenu.Rename}"
shortcut = "F2"
class = "ICSharpCode.SharpDevelop.Project.Commands.RenameEntryEvent"/>
<Condition name="WriteableProject" action="Disable">
<MenuItem id = "Cut"
label = "${res:XML.MainMenu.EditMenu.Cut}"
type = "Item"
icon = "Icons.16x16.CutIcon"
loadclasslazy = "false"
class = "ICSharpCode.SharpDevelop.Project.Commands.CutProjectBrowserNode"/>
<MenuItem id = "Paste"
label = "${res:XML.MainMenu.EditMenu.Paste}"
type = "Item"
icon = "Icons.16x16.PasteIcon"
loadclasslazy = "false"
class = "ICSharpCode.SharpDevelop.Project.Commands.PasteProjectBrowserNode"/>
<MenuItem id = "Remove"
label = "${res:Global.RemoveButtonText}"
type = "Item"
icon = "Icons.16x16.DeleteIcon"
loadclasslazy = "false"
class = "ICSharpCode.SharpDevelop.Project.Commands.DeleteProjectBrowserNode"/>
<MenuItem id = "Rename"
label = "${res:ProjectComponent.ContextMenu.Rename}"
shortcut = "F2"
class = "ICSharpCode.SharpDevelop.Project.Commands.RenameEntryEvent"/>
</Condition>
</Path>
<Path name = "/SharpDevelop/Pads/ProjectBrowser/ContextMenu/CutCopyPasteDeleteRename">
<MenuItem id = "Cut"
label = "${res:XML.MainMenu.EditMenu.Cut}"
type = "Item"
icon = "Icons.16x16.CutIcon"
loadclasslazy = "false"
class = "ICSharpCode.SharpDevelop.Project.Commands.CutProjectBrowserNode"/>
<Condition name="WriteableProject" action="Disable">
<MenuItem id = "Cut"
label = "${res:XML.MainMenu.EditMenu.Cut}"
type = "Item"
icon = "Icons.16x16.CutIcon"
loadclasslazy = "false"
class = "ICSharpCode.SharpDevelop.Project.Commands.CutProjectBrowserNode"/>
</Condition>
<MenuItem id = "Copy"
label = "${res:XML.MainMenu.EditMenu.Copy}"
type = "Item"
icon = "Icons.16x16.CopyIcon"
loadclasslazy = "false"
class = "ICSharpCode.SharpDevelop.Project.Commands.CopyProjectBrowserNode"/>
<MenuItem id = "Paste"
label = "${res:XML.MainMenu.EditMenu.Paste}"
type = "Item"
icon = "Icons.16x16.PasteIcon"
loadclasslazy = "false"
class = "ICSharpCode.SharpDevelop.Project.Commands.PasteProjectBrowserNode"/>
<MenuItem id = "Delete"
label = "${res:XML.MainMenu.EditMenu.Delete}"
type = "Item"
icon = "Icons.16x16.DeleteIcon"
loadclasslazy = "false"
class = "ICSharpCode.SharpDevelop.Project.Commands.DeleteProjectBrowserNode"/>
<MenuItem id = "Rename"
label = "${res:ProjectComponent.ContextMenu.Rename}"
shortcut = "F2"
class = "ICSharpCode.SharpDevelop.Project.Commands.RenameEntryEvent"/>
<Condition name="WriteableProject" action="Disable">
<MenuItem id = "Paste"
label = "${res:XML.MainMenu.EditMenu.Paste}"
type = "Item"
icon = "Icons.16x16.PasteIcon"
loadclasslazy = "false"
class = "ICSharpCode.SharpDevelop.Project.Commands.PasteProjectBrowserNode"/>
<MenuItem id = "Delete"
label = "${res:XML.MainMenu.EditMenu.Delete}"
type = "Item"
icon = "Icons.16x16.DeleteIcon"
loadclasslazy = "false"
class = "ICSharpCode.SharpDevelop.Project.Commands.DeleteProjectBrowserNode"/>
<MenuItem id = "Rename"
label = "${res:ProjectComponent.ContextMenu.Rename}"
shortcut = "F2"
class = "ICSharpCode.SharpDevelop.Project.Commands.RenameEntryEvent"/>
</Condition>
</Path>
<Path name = "/SharpDevelop/Pads/ProjectBrowser/ContextMenu/FolderNode">
@ -669,10 +685,12 @@ @@ -669,10 +685,12 @@
icon = "Icons.16x16.BrowserRefresh"
label = "${res:AddIns.HtmlHelp2.Refresh}"
class = "ICSharpCode.SharpDevelop.Project.Commands.RefreshReference"/>
<MenuItem id = "Remove"
label = "${res:Global.RemoveButtonText}"
icon = "Icons.16x16.DeleteIcon"
class = "ICSharpCode.SharpDevelop.Project.Commands.DeleteProjectBrowserNode"/>
<Condition name="WriteableProject" action="Disable">
<MenuItem id = "Remove"
label = "${res:Global.RemoveButtonText}"
icon = "Icons.16x16.DeleteIcon"
class = "ICSharpCode.SharpDevelop.Project.Commands.DeleteProjectBrowserNode"/>
</Condition>
<MenuItem id = "RemoveSeparator" type = "Separator" />
<MenuItem id = "Properties"
icon = "Icons.16x16.PropertiesIcon"
@ -1602,26 +1620,27 @@ @@ -1602,26 +1620,27 @@
<MenuItem id = "Search" label = "${res:XML.MainMenu.SearchMenu}" type="Menu">
<MenuItem id = "SearchInFilesSeparator" type = "Separator" />
<!-- <Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditorProvider" action="Disable"> -->
<MenuItem id = "ToggleBookmark"
label = "${res:XML.MainMenu.SearchMenu.ToggleBookmark}"
shortcut = "Control|M"
icon = "Bookmarks.ToggleMark"
class = "ICSharpCode.SharpDevelop.Bookmarks.ToggleBookmark"/>
<MenuItem id = "PrevBookmark"
label = "${res:XML.MainMenu.SearchMenu.PrevBookmark}"
shortcut = "Control|OemComma"
icon = "Bookmarks.GotoPrevInFile"
class = "ICSharpCode.SharpDevelop.Bookmarks.PrevBookmark"/>
<MenuItem id = "NextBookmark"
label = "${res:XML.MainMenu.SearchMenu.NextBookmark}"
shortcut = "Control|OemPeriod"
icon = "Bookmarks.GotoNextInFile"
class = "ICSharpCode.SharpDevelop.Bookmarks.NextBookmark"/>
<MenuItem id = "ClearBookmarks"
label = "${res:XML.MainMenu.SearchMenu.ClrBookmark}"
icon = "Bookmarks.ClearAll"
class = "ICSharpCode.SharpDevelop.Bookmarks.ClearBookmarks"/>
<Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditorProvider" action="Disable">
<MenuItem id = "ToggleBookmark"
label = "${res:XML.MainMenu.SearchMenu.ToggleBookmark}"
shortcut = "Control|M"
icon = "Bookmarks.ToggleMark"
class = "ICSharpCode.SharpDevelop.Bookmarks.ToggleBookmark"/>
<MenuItem id = "PrevBookmark"
label = "${res:XML.MainMenu.SearchMenu.PrevBookmark}"
shortcut = "Control|OemComma"
icon = "Bookmarks.GotoPrevInFile"
class = "ICSharpCode.SharpDevelop.Bookmarks.PrevBookmark"/>
<MenuItem id = "NextBookmark"
label = "${res:XML.MainMenu.SearchMenu.NextBookmark}"
shortcut = "Control|OemPeriod"
icon = "Bookmarks.GotoNextInFile"
class = "ICSharpCode.SharpDevelop.Bookmarks.NextBookmark"/>
<MenuItem id = "ClearBookmarks"
label = "${res:XML.MainMenu.SearchMenu.ClrBookmark}"
icon = "Bookmarks.ClearAll"
class = "ICSharpCode.SharpDevelop.Bookmarks.ClearBookmarks"/>
</Condition>
<MenuItem id = "Separator2" type = "Separator" />
<MenuItem id = "GotoLineNr"
@ -1974,6 +1993,13 @@ @@ -1974,6 +1993,13 @@
</Path>
<Path name = "/SharpDevelop/Pads/BookmarkPad/Toolbar">
<Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditorProvider" action="Disable">
<ToolbarItem id = "ToggleBookmark"
tooltip = "${res:XML.MainMenu.SearchMenu.ToggleBookmark}"
icon = "Bookmarks.ToggleMark"
class = "ICSharpCode.SharpDevelop.Bookmarks.ToggleBookmark"/>
</Condition>
<ToolbarItem id = "GotoPrev"
icon = "Bookmarks.GotoPrev"
tooltip = "${res:MainWindow.Windows.BookmarkPad.GotoPrev.ToolTip}"

2
src/Main/Base/Project/Src/Bookmarks/Commands/MenuCommands.cs

@ -41,7 +41,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -41,7 +41,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
protected override void Run(ITextEditor editor, IBookmarkMargin bookmarkMargin)
{
BookmarkManager.ToggleBookmark(editor, editor.Caret.Line,
b => b.CanToggle && b.GetType() == typeof(SDBookmark),
b => b.CanToggle && b.GetType() == typeof(Bookmark),
location => new Bookmark(editor.FileName, location));
}
}

6
src/Main/Base/Project/Src/Editor/AvalonEdit/AvalonEditTextEditorAdapter.cs

@ -109,6 +109,12 @@ namespace ICSharpCode.SharpDevelop.Editor.AvalonEdit @@ -109,6 +109,12 @@ namespace ICSharpCode.SharpDevelop.Editor.AvalonEdit
add { avalonEditOptions.PropertyChanged += value; }
remove { avalonEditOptions.PropertyChanged -= value; }
}
public string FontFamily {
get {
return "Consolas";
}
}
}
public virtual ICSharpCode.Core.FileName FileName {

6
src/Main/Base/Project/Src/Editor/IEditorControlService.cs

@ -86,6 +86,12 @@ namespace ICSharpCode.SharpDevelop.Editor @@ -86,6 +86,12 @@ namespace ICSharpCode.SharpDevelop.Editor
public bool UnderlineErrors {
get { return true; }
}
public string FontFamily {
get {
return "Consolas";
}
}
}
}
}

5
src/Main/Base/Project/Src/Editor/ITextEditor.cs

@ -153,5 +153,10 @@ namespace ICSharpCode.SharpDevelop.Editor @@ -153,5 +153,10 @@ namespace ICSharpCode.SharpDevelop.Editor
/// Gets whether errors should be underlined.
/// </summary>
bool UnderlineErrors { get; }
/// <summary>
/// Gets the name of the currently used font.
/// </summary>
string FontFamily { get; }
}
}

4
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/GacReferencePanel.cs

@ -153,6 +153,10 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -153,6 +153,10 @@ namespace ICSharpCode.SharpDevelop.Gui
void searchTask_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (this.IsDisposed) {
// avoid crash when dialog is closed before search is completed
return;
}
searchButton.Text = "Search"; this.toolTip.SetToolTip(searchButton, searchButton.Text);
filterTextBox.ReadOnly = false;
if (resultList != null && resultList.Count > 0) {

2
src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/EditAvailableConfigurationsDialog.cs

@ -220,7 +220,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -220,7 +220,7 @@ namespace ICSharpCode.SharpDevelop.Gui
IProjectAllowChangeConfigurations pacc = project as IProjectAllowChangeConfigurations;
if (pacc != null) {
if (editPlatforms) {
pacc.AddProjectPlatform(newName, dlg.CopyFrom);
pacc.AddProjectPlatform(MSBuildInternals.FixPlatformNameForProject(newName), dlg.CopyFrom);
} else {
pacc.AddProjectConfiguration(newName, dlg.CopyFrom);
}

36
src/Main/Base/Project/Src/Gui/FormLocationHelper.cs

@ -21,7 +21,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -21,7 +21,7 @@ namespace ICSharpCode.SharpDevelop.Gui
if (isResizable) {
form.Bounds = Validate(PropertyService.Get(propertyName, GetDefaultBounds(form)));
} else {
form.Location = Validate(PropertyService.Get(propertyName, GetDefaultLocation(form)), form.Size);
form.Location = Validate(new System.Drawing.Rectangle(PropertyService.Get(propertyName, GetDefaultLocation(form)), form.Size)).Location;
}
form.Closing += delegate {
if (isResizable) {
@ -41,7 +41,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -41,7 +41,7 @@ namespace ICSharpCode.SharpDevelop.Gui
if (isResizable) {
Rect bounds = PropertyService.Get(propertyName, GetDefaultBounds(window));
bounds.Offset(ownerLocation.X, ownerLocation.Y);
bounds = Validate(bounds);
bounds = Validate(bounds.TransformToDevice(window).ToSystemDrawing()).ToWpf().TransformFromDevice(window);
window.Left = bounds.X;
window.Top = bounds.Y;
window.Width = bounds.Width;
@ -50,9 +50,9 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -50,9 +50,9 @@ namespace ICSharpCode.SharpDevelop.Gui
Size size = new Size(window.ActualWidth, window.ActualHeight);
Point location = PropertyService.Get(propertyName, GetDefaultLocation(window));
location.Offset(ownerLocation.X, ownerLocation.Y);
location = Validate(location, size);
window.Left = location.X;
window.Top = location.Y;
var bounds = Validate(new Rect(location, size).TransformToDevice(window).ToSystemDrawing()).ToWpf().TransformFromDevice(window);
window.Left = bounds.X;
window.Top = bounds.Y;
}
window.Closing += delegate {
var relativeToOwner = GetLocationRelativeToOwner(window);
@ -88,35 +88,25 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -88,35 +88,25 @@ namespace ICSharpCode.SharpDevelop.Gui
return new Point(owner.Left, owner.Top);
}
public static Rect Validate(Rect bounds)
/// <remarks>Requires Pixels!!!</remarks>
public static System.Drawing.Rectangle Validate(System.Drawing.Rectangle bounds)
{
// Check if form is outside the screen and get it back if necessary.
// This is important when the user uses multiple screens, a window stores its location
// on the secondary monitor and then the secondary monitor is removed.
LoggingService.InfoFormatted("Number of screens: {0}", Screen.AllScreens.Length);
foreach (var screen in Screen.AllScreens) {
var rect = System.Drawing.Rectangle.Intersect(bounds.ToSystemDrawing(), screen.WorkingArea);
var rect = System.Drawing.Rectangle.Intersect(bounds, screen.WorkingArea);
LoggingService.InfoFormatted("Screen {2}: Validating {0}; intersection {1}", bounds, rect, screen.Bounds);
if (rect.Width > 10 && rect.Height > 10)
return bounds;
}
// center on primary screen
LoggingService.InfoFormatted("Validating {0}; center on screen", bounds);
// TODO : maybe use screen where main window is most visible?
var targetScreen = Screen.PrimaryScreen;
return new Rect((targetScreen.WorkingArea.Width - bounds.Width) / 2, (targetScreen.WorkingArea.Height - bounds.Height) / 2, bounds.Width, bounds.Height);
}
static Point Validate(Point location, Size size)
{
return Validate(new Rect(location, size)).Location;
}
static System.Drawing.Rectangle Validate(System.Drawing.Rectangle bounds)
{
return Validate(bounds.ToWpf()).ToSystemDrawing();
}
static System.Drawing.Point Validate(System.Drawing.Point location, System.Drawing.Size size)
{
return Validate(location.ToWpf(), size.ToWpf()).ToSystemDrawing();
return new System.Drawing.Rectangle((targetScreen.WorkingArea.Width - bounds.Width) / 2, (targetScreen.WorkingArea.Height - bounds.Height) / 2, bounds.Width, bounds.Height);
}
static System.Drawing.Rectangle GetDefaultBounds(Form form)

2
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ReferenceNode.cs

@ -31,7 +31,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -31,7 +31,7 @@ namespace ICSharpCode.SharpDevelop.Project
#region Cut & Paste
public override bool EnableDelete {
get {
return true;
return !Project.ReadOnly;
}
}

13
src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonDockLayout.cs

@ -53,6 +53,16 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -53,6 +53,16 @@ namespace ICSharpCode.SharpDevelop.Gui
// so we have to load the configuration now
LoggingService.Info("dockingManager_Loaded");
LoadConfiguration();
EnsureFloatingWindowsLocations();
}
void EnsureFloatingWindowsLocations()
{
foreach (var window in dockingManager.FloatingWindows) {
var newLocation = FormLocationHelper.Validate(new Rect(window.Left, window.Top, window.Width, window.Height).TransformToDevice(window).ToSystemDrawing()).ToWpf().TransformFromDevice(window);
window.Left = newLocation.Left;
window.Top = newLocation.Top;
}
}
void dockingManager_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
@ -117,6 +127,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -117,6 +127,7 @@ namespace ICSharpCode.SharpDevelop.Gui
Busy = false;
}
LoadConfiguration();
EnsureFloatingWindowsLocations();
}
public void Detach()
@ -222,7 +233,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -222,7 +233,7 @@ namespace ICSharpCode.SharpDevelop.Gui
{
AvalonPadContent p;
if (pads.TryGetValue(padDescriptor, out p))
return p.IsVisible;
return p.State != DockableContentState.Hidden;
else
return false;
}

9
src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs

@ -83,6 +83,13 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -83,6 +83,13 @@ namespace ICSharpCode.SharpDevelop.Gui
{
base.OnSourceInitialized(e);
HwndSource.FromHwnd(this.MainWin32Window.Handle).AddHook(SingleInstanceHelper.WndProc);
// validate after PresentationSource is initialized
Rect bounds = new Rect(Left, Top, Width, Height);
bounds = FormLocationHelper.Validate(bounds.TransformToDevice(this).ToSystemDrawing()).ToWpf().TransformFromDevice(this);
this.Left = bounds.Left;
this.Top = bounds.Top;
this.Width = bounds.Width;
this.Height = bounds.Height;
}
public void Initialize()
@ -555,7 +562,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -555,7 +562,7 @@ namespace ICSharpCode.SharpDevelop.Gui
public void SetMemento(Properties memento)
{
Rect bounds = memento.Get("Bounds", new Rect(10, 10, 750, 550));
bounds = FormLocationHelper.Validate(bounds);
// bounds are validated after PresentationSource is initialized (see OnSourceInitialized)
this.Left = bounds.Left;
this.Top = bounds.Top;
this.Width = bounds.Width;

12
src/Main/Base/Project/Src/Project/Solution/Solution.cs

@ -360,11 +360,14 @@ namespace ICSharpCode.SharpDevelop.Project @@ -360,11 +360,14 @@ namespace ICSharpCode.SharpDevelop.Project
SaveProjectSections(folder.Sections, projectSection);
ISolutionFolder subFolder;
// Push the sub folders in reverse order so that we pop them
// in the correct order.
for (int i = folder.Folders.Count - 1; i >= 0; i--) {
//foreach (ISolutionFolder subFolder in folder.Folders) {
subFolder = folder.Folders[i];
stack.Push(subFolder);
stack.Push(folder.Folders[i]);
}
// But use normal order for printing the nested projects section
for (int i = 0; i < folder.Folders.Count; i++) {
ISolutionFolder subFolder = folder.Folders[i];
nestedProjectsSection.Append("\t\t");
nestedProjectsSection.Append(subFolder.IdGuid);
nestedProjectsSection.Append(" = ");
@ -1192,6 +1195,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -1192,6 +1195,7 @@ namespace ICSharpCode.SharpDevelop.Project
#region System.IDisposable interface implementation
public void Dispose()
{
changeWatcher.Dispose();
foreach (IProject project in Projects) {
project.Dispose();
}

9
src/Main/Base/Project/Src/Services/DisplayBinding/AutoDetectDisplayBinding.cs

@ -48,9 +48,12 @@ namespace ICSharpCode.SharpDevelop @@ -48,9 +48,12 @@ namespace ICSharpCode.SharpDevelop
const int BUFFER_LENGTH = 4 * 1024;
using (var stream = file.OpenRead()) {
foreach (var codon in codons) {
string mime = "text/plain";
if (stream.Length > 0) {
stream.Position = 0;
string mime = FindMimeType(new BinaryReader(stream).ReadBytes(BUFFER_LENGTH));
mime = FindMimeType(new BinaryReader(stream).ReadBytes(BUFFER_LENGTH));
}
foreach (var codon in codons) {
stream.Position = 0;
double value = codon.Binding.AutoDetectFileContent(file.FileName, stream, mime);
if (value > max) {
@ -72,7 +75,7 @@ namespace ICSharpCode.SharpDevelop @@ -72,7 +75,7 @@ namespace ICSharpCode.SharpDevelop
const int FMFD_ENABLEMIMESNIFFING = 0x00000002;
IntPtr mimeout;
int result = FindMimeFromData(IntPtr.Zero, null, b, buffer.Length, null, FMFD_ENABLEMIMESNIFFING, out mimeout, 0);
if (result != 0)
throw Marshal.GetExceptionForHR(result);
string mime = Marshal.PtrToStringUni(mimeout);

4
src/Main/Base/Project/Src/Util/ExtensionMethods.cs

@ -292,13 +292,13 @@ namespace ICSharpCode.SharpDevelop @@ -292,13 +292,13 @@ namespace ICSharpCode.SharpDevelop
public static Point TransformToDevice(this Point point, Visual visual)
{
Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice;
return new Point(point.X * matrix.M11, point.Y * matrix.M22);
return matrix.Transform(point);
}
public static Point TransformFromDevice(this Point point, Visual visual)
{
Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformFromDevice;
return new Point(point.X * matrix.M11, point.Y * matrix.M22);
return matrix.Transform(point);
}
#endregion

2
src/Main/ICSharpCode.Core.WinForms/Util/ClipboardWrapper.cs

@ -12,6 +12,8 @@ namespace ICSharpCode.Core.WinForms @@ -12,6 +12,8 @@ namespace ICSharpCode.Core.WinForms
/// </summary>
public static class ClipboardWrapper
{
[Obsolete("Avoid using this property: it is problematic because it requires exclusive clipboard access. " +
"The Clipboard.ContainsText() implementation in WPF is much better than the one in WinForms.")]
public static bool ContainsText {
get {
try {

8
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/TypeInference.cs

@ -332,7 +332,9 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -332,7 +332,9 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
ConstructedReturnType CV = V.CastToConstructedReturnType();
if (CU != null && CV != null
&& object.Equals(CU.UnboundType, CV.UnboundType)
&& CU.TypeArgumentCount == CV.TypeArgumentCount)
&& CU.TypeArgumentCount == CV.TypeArgumentCount
&& CU.TypeArguments.Count == CU.TypeArgumentCount
&& CV.TypeArguments.Count == CV.TypeArgumentCount)
{
for (int i = 0; i < CU.TypeArgumentCount; i++) {
MakeExactInference(CU.TypeArguments[i], CV.TypeArguments[i]);
@ -397,7 +399,9 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -397,7 +399,9 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
ConstructedReturnType CU2 = U2.CastToConstructedReturnType();
if (CU2 != null &&
object.Equals(CU2.UnboundType, CV.UnboundType) &&
CU2.TypeArgumentCount == CV.TypeArgumentCount)
CU2.TypeArgumentCount == CV.TypeArgumentCount
&& CU2.TypeArguments.Count == CU2.TypeArgumentCount // unfortunately these might not be the same...
&& CV.TypeArguments.Count == CV.TypeArgumentCount)
{
for (int i = 0; i < CU2.TypeArgumentCount; i++) {
MakeExactInference(CU2.TypeArguments[i], CV.TypeArguments[i]);

Loading…
Cancel
Save