Browse Source

Merge branch 'newNR' of github.com:icsharpcode/SharpDevelop into newNRILSpyDebugger

newNRILSpyDebugger
Siegfried Pammer 13 years ago
parent
commit
59744fabfa
  1. 10
      src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs
  2. 2
      src/AddIns/Analysis/UnitTesting/Pad/UnitTestNode.cs
  3. 12
      src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlBinding.addin
  4. 4
      src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.addin
  5. 1
      src/AddIns/Debugger/Debugger.AddIn/Pads/BreakPointsPad.cs
  6. 2
      src/AddIns/Debugger/Debugger.AddIn/Pads/CallStackPad.cs
  7. 10
      src/AddIns/Debugger/Debugger.AddIn/Pads/CommonResources.xaml
  8. 2
      src/AddIns/Debugger/Debugger.AddIn/Pads/LoadedModulesPad.cs
  9. 11
      src/AddIns/Debugger/Debugger.AddIn/Pads/LocalVarPad.cs
  10. 4
      src/AddIns/Debugger/Debugger.AddIn/Pads/ThreadsPad.cs
  11. 18
      src/AddIns/Debugger/Debugger.AddIn/TreeModel/ValueNode.cs
  12. 2
      src/AddIns/Debugger/Debugger.Core/LocalVariable.cs
  13. 14
      src/AddIns/Debugger/Debugger.Core/StackFrame.cs
  14. 8
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin
  15. 8
      src/AddIns/Misc/HelpViewer/Source/Commands.cs
  16. 12
      src/Main/Base/Project/ICSharpCode.SharpDevelop.addin
  17. 5
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  18. 127
      src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs
  19. 151
      src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs
  20. 54
      src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPadCommands.cs
  21. 471
      src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskView.cs
  22. 48
      src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml
  23. 64
      src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs
  24. 28
      src/Main/Base/Project/Src/Internal/ConditionEvaluators/WindowActiveEvaluator.cs
  25. 19
      src/Main/Base/Project/Src/Internal/ConditionEvaluators/WindowOpenEvaluator.cs
  26. 45
      src/Main/Base/Project/Src/Services/Tasks/Task.cs
  27. 80
      src/Main/ICSharpCode.Core.Presentation/GridViewColumnAutoSize.cs
  28. 1
      src/Main/ICSharpCode.Core.Presentation/ICSharpCode.Core.Presentation.csproj
  29. 3
      src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarCheckBox.cs

10
src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs

@ -3,19 +3,13 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Text;
using System.Windows.Documents;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.Semantics; using ICSharpCode.NRefactory.Semantics;
using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.NRefactory.TypeSystem.Implementation; using ICSharpCode.NRefactory.TypeSystem.Implementation;
using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Refactoring; using ICSharpCode.SharpDevelop.Refactoring;
namespace ICSharpCode.CodeAnalysis namespace ICSharpCode.CodeAnalysis
@ -24,8 +18,8 @@ namespace ICSharpCode.CodeAnalysis
{ {
public override void Run() public override void Run()
{ {
TaskView view = (TaskView)Owner; var view = (System.Windows.Controls.ListView)Owner;
foreach (SDTask t in view.SelectedTasks.ToList()) { foreach (var t in view.SelectedItems.OfType<SDTask>().ToArray()) {
FxCopTaskTag tag = t.Tag as FxCopTaskTag; FxCopTaskTag tag = t.Tag as FxCopTaskTag;
if (tag == null) if (tag == null)
continue; continue;

2
src/AddIns/Analysis/UnitTesting/Pad/UnitTestNode.cs

@ -15,8 +15,6 @@ namespace ICSharpCode.UnitTesting
{ {
public class UnitTestNode : ModelCollectionTreeNode public class UnitTestNode : ModelCollectionTreeNode
{ {
protected static readonly IComparer<SharpTreeNode> NodeTextComparer = KeyComparer.Create((SharpTreeNode n) => n.Text.ToString(), StringComparer.OrdinalIgnoreCase, StringComparer.OrdinalIgnoreCase);
readonly ITest test; readonly ITest test;
public UnitTestNode(ITest test) public UnitTestNode(ITest test)

12
src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlBinding.addin

@ -72,19 +72,20 @@
class = "ICSharpCode.XamlBinding.Options.CodeCompletion" /> class = "ICSharpCode.XamlBinding.Options.CodeCompletion" />
</Path> </Path>
<!-- TODO reimplement as context actions
<Path name="/SharpDevelop/Workbench/MainMenu"> <Path name="/SharpDevelop/Workbench/MainMenu">
<ComplexCondition> <ComplexCondition>
<And> <And>
<Condition name="ActiveContentExtension" activeextension=".xaml" /> <Condition name="ActiveContentExtension" activeextension=".xaml" />
<Condition name="WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditorProvider" /> <Condition name="WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditor" />
</And> </And>
<MenuItem id="XamlRefactoring" insertafter="Refactor" insertbefore="Project" label="${res:XML.MainMenu.RefactorMenu}" type="Menu"> <MenuItem id="XamlRefactoring" insertafter="Refactor" insertbefore="Project" label="${res:XML.MainMenu.RefactorMenu}" type="Menu">
<MenuItem id="RemoveMargin" <MenuItem id="RemoveMargin"
class="ICSharpCode.XamlBinding.PowerToys.Commands.RemoveMarginCommand" class="ICSharpCode.XamlBinding.PowerToys.Commands.RemoveMarginCommand"
label="${res:AddIns.XamlBinding.Menu.RemoveMargin}" /> label="${res:AddIns.XamlBinding.Menu.RemoveMargin}" />
<!-- <MenuItem id="RemoveUnnecessaryAttributes" <MenuItem id="RemoveUnnecessaryAttributes"
class="ICSharpCode.XamlBinding.PowerToys.Commands.RemoveUnnecessaryAttributesCommand" class="ICSharpCode.XamlBinding.PowerToys.Commands.RemoveUnnecessaryAttributesCommand"
label="${res:AddIns.XamlBinding.Menu.RemoveUnnecessaryAttributes}" />--> label="${res:AddIns.XamlBinding.Menu.RemoveUnnecessaryAttributes}" />
<MenuItem type="Separator" /> <MenuItem type="Separator" />
<MenuItem id="ExtractPropertiesAsStyle" <MenuItem id="ExtractPropertiesAsStyle"
class="ICSharpCode.XamlBinding.PowerToys.Commands.ExtractPropertiesAsStyleCommand" class="ICSharpCode.XamlBinding.PowerToys.Commands.ExtractPropertiesAsStyleCommand"
@ -138,10 +139,11 @@
<MenuItem id="EditGridColumnsAndRows" <MenuItem id="EditGridColumnsAndRows"
class="ICSharpCode.XamlBinding.PowerToys.Commands.EditGridColumnsAndRowsCommand" class="ICSharpCode.XamlBinding.PowerToys.Commands.EditGridColumnsAndRowsCommand"
label="${res:AddIns.XamlBinding.Menu.EditGridColumnsAndRows}" /> label="${res:AddIns.XamlBinding.Menu.EditGridColumnsAndRows}" />
<!-- <MenuItem id="CreateBusinessForm" <MenuItem id="CreateBusinessForm"
class="ICSharpCode.XamlBinding.PowerToys.Commands.CreateBusinessFormFromClassCommand" class="ICSharpCode.XamlBinding.PowerToys.Commands.CreateBusinessFormFromClassCommand"
label="${res:AddIns.XamlBinding.Menu.CreateBusinessFormFromClass}" />--> label="${res:AddIns.XamlBinding.Menu.CreateBusinessFormFromClass}" />
</MenuItem> </MenuItem>
</ComplexCondition> </ComplexCondition>
</Path> </Path>
-->
</AddIn> </AddIn>

4
src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.addin

@ -32,13 +32,13 @@
insertbefore = "Refactoring" insertbefore = "Refactoring"
label = "${res:MainWindow.Windows.Debug.SetCurrentStatement}" label = "${res:MainWindow.Windows.Debug.SetCurrentStatement}"
icon = "Icons.16x16.Debug.StepInto" icon = "Icons.16x16.Debug.StepInto"
class = "ICSharpCode.SharpDevelop.Services.SetCurrentStatementCommand"/> class = "Debugger.AddIn.SetCurrentStatementCommand"/>
</Condition> </Condition>
<MenuItem id = "DebuggerRunToCursor" <MenuItem id = "DebuggerRunToCursor"
insertbefore = "Refactoring" insertbefore = "Refactoring"
label = "${res:MainWindow.Windows.Debug.RunToCursor}" label = "${res:MainWindow.Windows.Debug.RunToCursor}"
icon = "Icons.16x16.Debug.Continue" icon = "Icons.16x16.Debug.Continue"
class = "ICSharpCode.SharpDevelop.Services.RunToCursorCommand"/> class = "Debugger.AddIn.RunToCursorCommand"/>
<MenuItem id = "DebuggerSeparator" <MenuItem id = "DebuggerSeparator"
insertbefore = "Refactoring" insertbefore = "Refactoring"
type = "Separator"/> type = "Separator"/>

1
src/AddIns/Debugger/Debugger.AddIn/Pads/BreakPointsPad.cs

@ -22,6 +22,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
grid.Children.Add(toolbar); grid.Children.Add(toolbar);
this.control.listView.View = (GridView)res["breakpointsGridView"]; this.control.listView.View = (GridView)res["breakpointsGridView"];
this.control.listView.SetValue(GridViewColumnAutoSize.AutoWidthProperty, "35;50%;50%");
} }
protected override bool ShowBookmarkInThisPad(SDBookmark mark) protected override bool ShowBookmarkInThisPad(SDBookmark mark)

2
src/AddIns/Debugger/Debugger.AddIn/Pads/CallStackPad.cs

@ -11,6 +11,7 @@ using System.Windows.Input;
using System.Windows.Media; using System.Windows.Media;
using Debugger; using Debugger;
using ICSharpCode.Core.Presentation;
using Debugger.AddIn.TreeModel; using Debugger.AddIn.TreeModel;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Services; using ICSharpCode.SharpDevelop.Services;
@ -34,6 +35,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
listView = new ListView(); listView = new ListView();
listView.View = (GridView)res["callstackGridView"]; listView.View = (GridView)res["callstackGridView"];
listView.MouseDoubleClick += listView_MouseDoubleClick; listView.MouseDoubleClick += listView_MouseDoubleClick;
listView.SetValue(GridViewColumnAutoSize.AutoWidthProperty, "100%");
listView.ContextMenu = CreateMenu(); listView.ContextMenu = CreateMenu();

10
src/AddIns/Debugger/Debugger.AddIn/Pads/CommonResources.xaml

@ -33,7 +33,7 @@
</Style> </Style>
<!-- Local Variables Pad and Watch Pad --> <!-- Local Variables Pad and Watch Pad -->
<tv:SharpGridView x:Key="variableGridView"> <tv:SharpGridView x:Key="variableGridView" AllowsColumnReorder="False">
<GridView.Columns> <GridView.Columns>
<GridViewColumn Header="{core:Localize MainWindow.Windows.Debug.LocalVariables.NameColumn}" Width="200"> <GridViewColumn Header="{core:Localize MainWindow.Windows.Debug.LocalVariables.NameColumn}" Width="200">
<GridViewColumn.CellTemplate> <GridViewColumn.CellTemplate>
@ -63,7 +63,7 @@
</tv:SharpGridView> </tv:SharpGridView>
<!-- Callstack --> <!-- Callstack -->
<GridView x:Key="callstackGridView"> <GridView x:Key="callstackGridView" AllowsColumnReorder="False">
<GridViewColumn Header="{core:Localize Global.Name}" Width="400"> <GridViewColumn Header="{core:Localize Global.Name}" Width="400">
<GridViewColumn.CellTemplate> <GridViewColumn.CellTemplate>
<DataTemplate> <DataTemplate>
@ -77,7 +77,7 @@
</GridView> </GridView>
<!-- Breakpoints Pad --> <!-- Breakpoints Pad -->
<GridView x:Key="breakpointsGridView"> <GridView x:Key="breakpointsGridView" AllowsColumnReorder="False">
<GridViewColumn Header="" Width="Auto"> <GridViewColumn Header="" Width="Auto">
<GridViewColumn.CellTemplate> <GridViewColumn.CellTemplate>
<DataTemplate> <DataTemplate>
@ -105,7 +105,7 @@
</GridView> </GridView>
<!-- Loaded Modules --> <!-- Loaded Modules -->
<GridView x:Key="loadedModulesGridView"> <GridView x:Key="loadedModulesGridView" AllowsColumnReorder="False">
<GridViewColumn Header="{core:Localize Global.Name}" Width="250" DisplayMemberBinding="{Binding Name}"/> <GridViewColumn Header="{core:Localize Global.Name}" Width="250" DisplayMemberBinding="{Binding Name}"/>
<GridViewColumn Header="{core:Localize MainWindow.Windows.Debug.Modules.AddressColumn}" Width="100" DisplayMemberBinding="{Binding Address}"/> <GridViewColumn Header="{core:Localize MainWindow.Windows.Debug.Modules.AddressColumn}" Width="100" DisplayMemberBinding="{Binding Address}"/>
<GridViewColumn Header="{core:Localize Global.Path}" Width="250" DisplayMemberBinding="{Binding Path}"/> <GridViewColumn Header="{core:Localize Global.Path}" Width="250" DisplayMemberBinding="{Binding Path}"/>
@ -114,7 +114,7 @@
</GridView> </GridView>
<!-- Threads --> <!-- Threads -->
<GridView x:Key="theadsGridView"> <GridView x:Key="threadsGridView" AllowsColumnReorder="False">
<GridViewColumn Header="{core:Localize Global.ID}" Width="100" DisplayMemberBinding="{Binding ID}"/> <GridViewColumn Header="{core:Localize Global.ID}" Width="100" DisplayMemberBinding="{Binding ID}"/>
<GridViewColumn Header="{core:Localize Global.Name}" Width="300" DisplayMemberBinding="{Binding Name}"/> <GridViewColumn Header="{core:Localize Global.Name}" Width="300" DisplayMemberBinding="{Binding Name}"/>
<GridViewColumn Header="{core:Localize MainWindow.Windows.Debug.Threads.Priority}" Width="120" DisplayMemberBinding="{Binding Priority}"/> <GridViewColumn Header="{core:Localize MainWindow.Windows.Debug.Threads.Priority}" Width="120" DisplayMemberBinding="{Binding Priority}"/>

2
src/AddIns/Debugger/Debugger.AddIn/Pads/LoadedModulesPad.cs

@ -10,6 +10,7 @@ using System.Windows.Controls;
using System.Windows.Data; using System.Windows.Data;
using Debugger; using Debugger;
using ICSharpCode.Core.Presentation;
using Debugger.AddIn.Pads.Controls; using Debugger.AddIn.Pads.Controls;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Services; using ICSharpCode.SharpDevelop.Services;
@ -32,6 +33,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
listView = new ListView(); listView = new ListView();
listView.View = (GridView)res["loadedModulesGridView"]; listView.View = (GridView)res["loadedModulesGridView"];
listView.SetValue(GridViewColumnAutoSize.AutoWidthProperty, "50%;70;50%;35;120");
WindowsDebugger.RefreshingPads += RefreshPad; WindowsDebugger.RefreshingPads += RefreshPad;
RefreshPad(); RefreshPad();

11
src/AddIns/Debugger/Debugger.AddIn/Pads/LocalVarPad.cs

@ -32,11 +32,12 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
var res = new CommonResources(); var res = new CommonResources();
res.InitializeComponent(); res.InitializeComponent();
this.tree = new SharpTreeView(); tree = new SharpTreeView();
this.tree.Root = new SharpTreeNode(); tree.Root = new SharpTreeNode();
this.tree.ShowRoot = false; tree.ShowRoot = false;
this.tree.View = (GridView)res["variableGridView"]; tree.View = (GridView)res["variableGridView"];
this.tree.ItemContainerStyle = (Style)res["itemContainerStyle"]; tree.ItemContainerStyle = (Style)res["itemContainerStyle"];
tree.SetValue(GridViewColumnAutoSize.AutoWidthProperty, "50%;25%;25%");
WindowsDebugger.RefreshingPads += RefreshPad; WindowsDebugger.RefreshingPads += RefreshPad;
RefreshPad(); RefreshPad();

4
src/AddIns/Debugger/Debugger.AddIn/Pads/ThreadsPad.cs

@ -10,6 +10,7 @@ using System.Windows.Input;
using Debugger; using Debugger;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.Core.Presentation;
using ICSharpCode.SharpDevelop.Services; using ICSharpCode.SharpDevelop.Services;
using ICSharpCode.SharpDevelop.Workbench; using ICSharpCode.SharpDevelop.Workbench;
using Thread = Debugger.Thread; using Thread = Debugger.Thread;
@ -33,9 +34,10 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
contextMenu.Opened += FillContextMenuStrip; contextMenu.Opened += FillContextMenuStrip;
listView = new ListView(); listView = new ListView();
listView.View = (GridView)res["theadsGridView"]; listView.View = (GridView)res["threadsGridView"];
listView.ContextMenu = contextMenu; listView.ContextMenu = contextMenu;
listView.MouseDoubleClick += listView_MouseDoubleClick; listView.MouseDoubleClick += listView_MouseDoubleClick;
listView.SetValue(GridViewColumnAutoSize.AutoWidthProperty, "70;100%;75;75");
WindowsDebugger.RefreshingPads += RefreshPad; WindowsDebugger.RefreshingPads += RefreshPad;
RefreshPad(); RefreshPad();

18
src/AddIns/Debugger/Debugger.AddIn/TreeModel/ValueNode.cs

@ -255,13 +255,25 @@ namespace Debugger.AddIn.TreeModel
public static IEnumerable<TreeNode> GetLocalVariables() public static IEnumerable<TreeNode> GetLocalVariables()
{ {
var stackFrame = GetCurrentStackFrame(); var stackFrame = GetCurrentStackFrame();
var localVars = stackFrame.GetLocalVariables(stackFrame.IP).ToList();
foreach(var par in stackFrame.MethodInfo.Parameters.Select((p, i) => new { Param = p, Index = i})) { foreach(var par in stackFrame.MethodInfo.Parameters.Select((p, i) => new { Param = p, Index = i})) {
var parCopy = par; var parCopy = par;
yield return new ValueNode(ClassBrowserIconService.Parameter, par.Param.Name, () => GetCurrentStackFrame().GetArgumentValue(par.Index)); // do not display parameters that have been copied to captured variables twice. (see SD-1912)
// display only the value of the captured instance (the value of the parameter still has the original value)
var localVar = localVars.FirstOrDefault(v => string.Equals(v.Name, parCopy.Param.Name, StringComparison.Ordinal));
if (localVar == null)
yield return new ValueNode(ClassBrowserIconService.Parameter, par.Param.Name,
() => stackFrame.GetArgumentValue(par.Index));
else {
yield return new ValueNode(ClassBrowserIconService.Parameter, localVar.Name,
() => localVar.GetValue(stackFrame));
localVars.Remove(localVar);
}
} }
foreach(LocalVariable locVar in stackFrame.GetLocalVariables(stackFrame.IP)) { foreach(LocalVariable locVar in localVars) {
var locVarCopy = locVar; var locVarCopy = locVar;
yield return new ValueNode(ClassBrowserIconService.LocalVariable, locVar.Name, () => locVarCopy.GetValue(GetCurrentStackFrame())); yield return new ValueNode(ClassBrowserIconService.LocalVariable, locVar.Name,
() => locVarCopy.GetValue(stackFrame));
} }
} }

2
src/AddIns/Debugger/Debugger.Core/LocalVariable.cs

@ -89,7 +89,7 @@ namespace Debugger.MetaData
context => context.GetThisValue(false), context => context.GetThisValue(false),
method.DeclaringType method.DeclaringType
); );
// Get dispaly classes from fields // Get display classes from fields
foreach(IField fieldInfo in method.DeclaringType.GetFields(f => f.Name.StartsWith("CS$"), GetMemberOptions.None)) { foreach(IField fieldInfo in method.DeclaringType.GetFields(f => f.Name.StartsWith("CS$"), GetMemberOptions.None)) {
IField fieldInfoCopy = fieldInfo; IField fieldInfoCopy = fieldInfo;
AddCapturedLocalVariables( AddCapturedLocalVariables(

14
src/AddIns/Debugger/Debugger.Core/StackFrame.cs

@ -270,6 +270,9 @@ namespace Debugger
{ {
for (int i = 0; i < this.MethodInfo.Parameters.Count; i++) { for (int i = 0; i < this.MethodInfo.Parameters.Count; i++) {
if (this.MethodInfo.Parameters[i].Name == name) { if (this.MethodInfo.Parameters[i].Name == name) {
LocalVariable capturedVar;
if (HasCapturedVariable(name, out capturedVar))
return capturedVar.GetValue(this);
return GetArgumentValue(i); return GetArgumentValue(i);
} }
} }
@ -280,6 +283,10 @@ namespace Debugger
/// <param name="index"> Zero-based index </param> /// <param name="index"> Zero-based index </param>
public Value GetArgumentValue(int index) public Value GetArgumentValue(int index)
{ {
var param = this.MethodInfo.Parameters[index];
LocalVariable capturedVariable;
if (HasCapturedVariable(param.Name, out capturedVariable))
return capturedVariable.GetValue(this);
return new Value(this.AppDomain, GetArgumentCorValue(index)); return new Value(this.AppDomain, GetArgumentCorValue(index));
} }
@ -312,6 +319,13 @@ namespace Debugger
return corValue; return corValue;
} }
/// <summary> Gets whether a captured variable with the <paramref name="name"/> exists. </summary>
public bool HasCapturedVariable(string name, out LocalVariable variable)
{
variable = GetLocalVariables(this.IP).FirstOrDefault(v => v.IsCaptured && v.Name == name);
return variable != null;
}
/// <summary> Get all local variables </summary> /// <summary> Get all local variables </summary>
public IEnumerable<LocalVariable> GetLocalVariables() public IEnumerable<LocalVariable> GetLocalVariables()
{ {

8
src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin

@ -44,7 +44,7 @@
<!-- <!--
<Path name = "/SharpDevelop/ViewContent/TextEditor/ContextMenu"> <Path name = "/SharpDevelop/ViewContent/TextEditor/ContextMenu">
<Condition name = "WindowActive" activewindow="ICSharpCode.AvalonEdit.AddIn.ICodeEditorProvider"> <Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditor">
<MenuItem id = "SaveWithEncoding" <MenuItem id = "SaveWithEncoding"
label = "${res:XML.MainMenu.FileMenu.SaveWithEncoding}" label = "${res:XML.MainMenu.FileMenu.SaveWithEncoding}"
insertafter="SaveAs" insertafter="SaveAs"
@ -55,7 +55,7 @@
--> -->
<Path name = "/SharpDevelop/Workbench/MainMenu/File"> <Path name = "/SharpDevelop/Workbench/MainMenu/File">
<Condition name = "WindowActive" activewindow="ICSharpCode.AvalonEdit.AddIn.ICodeEditorProvider" action="Disable"> <Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditor" action="Disable">
<MenuItem id = "SaveWithEncoding" <MenuItem id = "SaveWithEncoding"
label = "${res:XML.MainMenu.FileMenu.SaveWithEncoding}" label = "${res:XML.MainMenu.FileMenu.SaveWithEncoding}"
insertafter="SaveAs" insertafter="SaveAs"
@ -65,7 +65,7 @@
</Path> </Path>
<Path name = "/SharpDevelop/Workbench/MainMenu/Edit/Format"> <Path name = "/SharpDevelop/Workbench/MainMenu/Edit/Format">
<Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditorProvider" action="Disable"> <Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditor" action="Disable">
<MenuItem id = "RemoveLeadingWs" <MenuItem id = "RemoveLeadingWs"
insertbefore = "Separator4" insertbefore = "Separator4"
label = "${res:XML.MainMenu.EditMenu.FormatMenu.RlWs}" label = "${res:XML.MainMenu.EditMenu.FormatMenu.RlWs}"
@ -126,7 +126,7 @@
<Path name = "/SharpDevelop/Workbench/MainMenu/Edit"> <Path name = "/SharpDevelop/Workbench/MainMenu/Edit">
<MenuItem id = "Folding" label = "${res:XML.MainMenu.EditMenu.FoldingMenu}" type="Menu" insertafter="Format"> <MenuItem id = "Folding" label = "${res:XML.MainMenu.EditMenu.FoldingMenu}" type="Menu" insertafter="Format">
<Condition name = "WindowActive" activewindow="ICSharpCode.AvalonEdit.AddIn.ICodeEditorProvider" action="Disable"> <Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditor" action="Disable">
<MenuItem id = "ToggleFolding" <MenuItem id = "ToggleFolding"
label = "${res:XML.MainMenu.EditMenu.FoldingMenu.ToggleFolding}" label = "${res:XML.MainMenu.EditMenu.FoldingMenu.ToggleFolding}"
shortcut = "Shift|Control|M" shortcut = "Shift|Control|M"

8
src/AddIns/Misc/HelpViewer/Source/Commands.cs

@ -2,9 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using Microsoft.Win32; using Microsoft.Win32;
@ -12,7 +10,6 @@ using MSHelpSystem.Core;
using MSHelpSystem.Controls; using MSHelpSystem.Controls;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Gui;
namespace MSHelpSystem.Commands namespace MSHelpSystem.Commands
{ {
@ -20,9 +17,8 @@ namespace MSHelpSystem.Commands
{ {
public override void Run() public override void Run()
{ {
ICSharpCode.SharpDevelop.Gui.TaskView view = (TaskView)Owner; var view = (System.Windows.Controls.ListView)Owner;
foreach (var t in view.SelectedItems.OfType<SDTask>().ToArray()) {
foreach (var t in view.SelectedTasks.ToArray()) {
if (t.BuildError == null) if (t.BuildError == null)
continue; continue;

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

@ -1561,7 +1561,7 @@
type = "Item" type = "Item"
command = "Delete"/> command = "Delete"/>
<MenuItem id = "Separator2" type = "Separator" /> <MenuItem id = "Separator2" type = "Separator" />
<Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditorProvider" action="Disable"> <Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditor" action="Disable">
<MenuItem id = "Insert" label = "${res:XML.MainMenu.EditMenu.Insert}" type="Menu"> <MenuItem id = "Insert" label = "${res:XML.MainMenu.EditMenu.Insert}" type="Menu">
<MenuItem id = "PasteAsComment" <MenuItem id = "PasteAsComment"
label = "${res:XML.MainMenu.EditMenu.Paste.AsComment}" label = "${res:XML.MainMenu.EditMenu.Paste.AsComment}"
@ -1814,7 +1814,7 @@
<MenuItem id = "ToggleBreakpointSeparator" type = "Separator" /> <MenuItem id = "ToggleBreakpointSeparator" type = "Separator" />
<ComplexCondition action="Disable"> <ComplexCondition action="Disable">
<And> <And>
<Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditorProvider"/> <Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditor"/>
<Condition name = "ActiveViewContentUntitled" activewindowuntitled="False"/> <Condition name = "ActiveViewContentUntitled" activewindowuntitled="False"/>
</And> </And>
<MenuItem id = "Toggle Breakpoint" <MenuItem id = "Toggle Breakpoint"
@ -1827,7 +1827,7 @@
<MenuItem id = "Search" label = "${res:XML.MainMenu.SearchMenu}" type="Menu"> <MenuItem id = "Search" label = "${res:XML.MainMenu.SearchMenu}" type="Menu">
<MenuItem id = "SearchSeparator" type = "Separator" /> <MenuItem id = "SearchSeparator" type = "Separator" />
<Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditorProvider" action="Disable"> <Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditor" action="Disable">
<MenuItem id = "ToggleBookmark" <MenuItem id = "ToggleBookmark"
label = "${res:XML.MainMenu.SearchMenu.ToggleBookmark}" label = "${res:XML.MainMenu.SearchMenu.ToggleBookmark}"
shortcut = "Control|M" shortcut = "Control|M"
@ -1889,7 +1889,7 @@
<Include id = "ToolList" path = "/SharpDevelop/Workbench/Tools" /> <Include id = "ToolList" path = "/SharpDevelop/Workbench/Tools" />
<MenuItem id = "Separator2" type = "Separator" /> <MenuItem id = "Separator2" type = "Separator" />
<Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditorProvider"> <Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditor">
<MenuItem id = "ConvertCode" label = "${res:XML.MainMenu.ToolMenu.ConvertCodeTo}" type="Menu"> <MenuItem id = "ConvertCode" label = "${res:XML.MainMenu.ToolMenu.ConvertCodeTo}" type="Menu">
<Condition name="ActiveContentExtension" activeextension=".vb" action = "Disable"> <Condition name="ActiveContentExtension" activeextension=".vb" action = "Disable">
<MenuItem id = "CSharp" <MenuItem id = "CSharp"
@ -2063,7 +2063,7 @@
<Path name = "/SharpDevelop/Workbench/ToolBar/Standard"> <Path name = "/SharpDevelop/Workbench/ToolBar/Standard">
<ToolbarItem id = "SearchSeparator" type = "Separator"/> <ToolbarItem id = "SearchSeparator" type = "Separator"/>
<Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditorProvider" action="Disable"> <Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditor" action="Disable">
<ToolbarItem id = "Comment" <ToolbarItem id = "Comment"
icon = "Icons.16x16.CommentRegion" icon = "Icons.16x16.CommentRegion"
tooltip = "${res:XML.TextAreaContextMenu.CommentUncommentSelection}" tooltip = "${res:XML.TextAreaContextMenu.CommentUncommentSelection}"
@ -2155,7 +2155,7 @@
</Path> </Path>
<Path name = "/SharpDevelop/Pads/BookmarkPad/Toolbar"> <Path name = "/SharpDevelop/Pads/BookmarkPad/Toolbar">
<Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditorProvider" action="Disable"> <Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditor" action="Disable">
<ToolbarItem id = "ToggleBookmark" <ToolbarItem id = "ToggleBookmark"
tooltip = "${res:XML.MainMenu.SearchMenu.ToggleBookmark}" tooltip = "${res:XML.MainMenu.SearchMenu.ToggleBookmark}"
icon = "Bookmarks.ToggleMark" icon = "Bookmarks.ToggleMark"

5
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -269,6 +269,9 @@
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="Src\Gui\Pads\CompilerMessageView\MessageViewCategoryTextWriter.cs" /> <Compile Include="Src\Gui\Pads\CompilerMessageView\MessageViewCategoryTextWriter.cs" />
<Compile Include="Src\Gui\Pads\TaskList\TaskViewResources.xaml.cs">
<DependentUpon>TaskViewResources.xaml</DependentUpon>
</Compile>
<Compile Include="Src\Internal\Templates\StringParserPropertyContainer.cs" /> <Compile Include="Src\Internal\Templates\StringParserPropertyContainer.cs" />
<Compile Include="Src\Project\MSBuildConfigurationOrPlatformNameCollection.cs" /> <Compile Include="Src\Project\MSBuildConfigurationOrPlatformNameCollection.cs" />
<Compile Include="Templates\FileTemplate.cs" /> <Compile Include="Templates\FileTemplate.cs" />
@ -789,7 +792,6 @@
<Compile Include="Src\Project\ConfigurationGuiBinding.cs" /> <Compile Include="Src\Project\ConfigurationGuiBinding.cs" />
<Compile Include="Src\Project\ChooseStorageLocationButton.cs" /> <Compile Include="Src\Project\ChooseStorageLocationButton.cs" />
<Compile Include="Src\Gui\Pads\ProjectBrowser\NodeBuilder\NodeBuilders.cs" /> <Compile Include="Src\Gui\Pads\ProjectBrowser\NodeBuilder\NodeBuilders.cs" />
<Compile Include="Src\Gui\Pads\TaskList\TaskView.cs" />
<Compile Include="Src\Gui\Pads\TaskList\TaskListPad.cs" /> <Compile Include="Src\Gui\Pads\TaskList\TaskListPad.cs" />
<Compile Include="Src\Gui\FormLocationHelper.cs" /> <Compile Include="Src\Gui\FormLocationHelper.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\AddWebReferenceDialog.cs" /> <Compile Include="Src\Gui\Dialogs\ReferenceDialog\AddWebReferenceDialog.cs" />
@ -872,6 +874,7 @@
<Page Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\AdvancedServiceDialog.xaml" /> <Page Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\AdvancedServiceDialog.xaml" />
<Page Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ServiceReferenceOptionsPanel.xaml" /> <Page Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\ServiceReferenceOptionsPanel.xaml" />
<Page Include="Project\PortableLibrary\SelectProfileDialog.xaml" /> <Page Include="Project\PortableLibrary\SelectProfileDialog.xaml" />
<Page Include="Src\Gui\Pads\TaskList\TaskViewResources.xaml" />
<Page Include="themes\generic.xaml" /> <Page Include="themes\generic.xaml" />
<ProjectReference Include="..\..\..\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj"> <ProjectReference Include="..\..\..\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj">
<Project>{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}</Project> <Project>{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}</Project>

127
src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs

@ -2,15 +2,19 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Windows.Forms; using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.Core.Presentation;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.WinForms;
using ICSharpCode.SharpDevelop.Workbench; using ICSharpCode.SharpDevelop.Workbench;
namespace ICSharpCode.SharpDevelop.Gui namespace ICSharpCode.SharpDevelop.Gui
{ {
public class ErrorListPad : AbstractPadContent, IClipboardHandler public class ErrorListPad : AbstractPadContent
{ {
public const string DefaultContextMenuAddInTreeEntry = "/SharpDevelop/Pads/ErrorList/TaskContextMenu"; public const string DefaultContextMenuAddInTreeEntry = "/SharpDevelop/Pads/ErrorList/TaskContextMenu";
@ -21,9 +25,10 @@ namespace ICSharpCode.SharpDevelop.Gui
} }
} }
ToolStrip toolStrip; ToolBar toolBar;
Panel contentPanel = new Panel(); DockPanel contentPanel = new DockPanel();
TaskView taskView = new TaskView() { DefaultContextMenuAddInTreeEntry = ErrorListPad.DefaultContextMenuAddInTreeEntry }; ListView errorView = new ListView();
readonly ObservableCollection<SDTask> errors;
Properties properties; Properties properties;
@ -77,12 +82,9 @@ namespace ICSharpCode.SharpDevelop.Gui
instance = this; instance = this;
properties = PropertyService.NestedProperties("ErrorListPad"); properties = PropertyService.NestedProperties("ErrorListPad");
RedrawContent(); TaskService.Cleared += TaskServiceCleared;
SD.ResourceService.LanguageChanged += delegate { RedrawContent(); }; TaskService.Added += TaskServiceAdded;
TaskService.Removed += TaskServiceRemoved;
TaskService.Cleared += new EventHandler(TaskServiceCleared);
TaskService.Added += new TaskEventHandler(TaskServiceAdded);
TaskService.Removed += new TaskEventHandler(TaskServiceRemoved);
TaskService.InUpdateChanged += delegate { TaskService.InUpdateChanged += delegate {
if (!TaskService.InUpdate) if (!TaskService.InUpdate)
InternalShowResults(); InternalShowResults();
@ -91,38 +93,45 @@ namespace ICSharpCode.SharpDevelop.Gui
SD.BuildService.BuildFinished += ProjectServiceEndBuild; SD.BuildService.BuildFinished += ProjectServiceEndBuild;
SD.ProjectService.SolutionOpened += OnSolutionOpen; SD.ProjectService.SolutionOpened += OnSolutionOpen;
SD.ProjectService.SolutionClosed += OnSolutionClosed; SD.ProjectService.SolutionClosed += OnSolutionClosed;
errors = new ObservableCollection<SDTask>(TaskService.Tasks.Where(t => t.TaskType != TaskType.Comment));
toolBar = ToolBarService.CreateToolBar(contentPanel, this, "/SharpDevelop/Pads/ErrorList/Toolbar");
taskView.CreateControl(); contentPanel.Children.Add(toolBar);
contentPanel.Controls.Add(taskView); toolBar.SetValue(DockPanel.DockProperty, Dock.Top);
contentPanel.Children.Add(errorView);
errorView.ItemsSource = errors;
errorView.MouseDoubleClick += ErrorViewMouseDoubleClick;
errorView.Style = (Style)new TaskViewResources()["TaskListView"];
errorView.ContextMenu = MenuService.CreateContextMenu(this, DefaultContextMenuAddInTreeEntry);
toolStrip = SD.WinForms.ToolbarService.CreateToolStrip(this, "/SharpDevelop/Pads/ErrorList/Toolbar"); errorView.CommandBindings.Add(new CommandBinding(ApplicationCommands.Copy, ExecuteCopy, CanExecuteCopy));
toolStrip.Stretch = true; errorView.CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, ExecuteSelectAll, CanExecuteSelectAll));
toolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
contentPanel.Controls.Add(toolStrip); errors.CollectionChanged += delegate { MenuService.UpdateText(toolBar.Items); };
InternalShowResults(); InternalShowResults();
} }
void RedrawContent() void ErrorViewMouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
{ {
taskView.RefreshColumnNames(); SDTask task = errorView.SelectedItem as SDTask;
var item = errorView.ItemContainerGenerator.ContainerFromItem(task) as ListViewItem;
UIElement element = e.MouseDevice.DirectlyOver as UIElement;
if (task != null && task.FileName != null && element != null && item != null
&& element.IsDescendantOf(item)) {
SD.FileService.JumpToFilePosition(task.FileName, task.Line, task.Column);
}
} }
void OnSolutionOpen(object sender, SolutionEventArgs e) void OnSolutionOpen(object sender, SolutionEventArgs e)
{ {
taskView.ClearTasks(); errors.Clear();
UpdateToolstripStatus();
} }
void OnSolutionClosed(object sender, EventArgs e) void OnSolutionClosed(object sender, EventArgs e)
{ {
try { errors.Clear();
taskView.ClearTasks();
UpdateToolstripStatus();
} catch (Exception ex) {
MessageService.ShowException(ex);
}
} }
void ProjectServiceEndBuild(object sender, EventArgs e) void ProjectServiceEndBuild(object sender, EventArgs e)
@ -130,7 +139,6 @@ namespace ICSharpCode.SharpDevelop.Gui
if (TaskService.TaskCount > 0 && ShowAfterBuild) { if (TaskService.TaskCount > 0 && ShowAfterBuild) {
SD.Workbench.GetPad(typeof(ErrorListPad)).BringPadToFront(); SD.Workbench.GetPad(typeof(ErrorListPad)).BringPadToFront();
} }
UpdateToolstripStatus();
} }
public BuildResults BuildResults = null; public BuildResults BuildResults = null;
@ -157,7 +165,7 @@ namespace ICSharpCode.SharpDevelop.Gui
return; return;
} }
taskView.AddTask(task); errors.Add(task);
} }
@ -165,8 +173,7 @@ namespace ICSharpCode.SharpDevelop.Gui
{ {
if (TaskService.InUpdate) if (TaskService.InUpdate)
return; return;
taskView.ClearTasks(); errors.Clear();
UpdateToolstripStatus();
} }
void TaskServiceAdded(object sender, TaskEventArgs e) void TaskServiceAdded(object sender, TaskEventArgs e)
@ -174,70 +181,42 @@ namespace ICSharpCode.SharpDevelop.Gui
if (TaskService.InUpdate) if (TaskService.InUpdate)
return; return;
AddTask(e.Task); AddTask(e.Task);
UpdateToolstripStatus();
} }
void TaskServiceRemoved(object sender, TaskEventArgs e) void TaskServiceRemoved(object sender, TaskEventArgs e)
{ {
if (TaskService.InUpdate) if (TaskService.InUpdate)
return; return;
taskView.RemoveTask(e.Task); errors.Remove(e.Task);
UpdateToolstripStatus();
}
void UpdateToolstripStatus()
{
SD.WinForms.ToolbarService.UpdateToolbar(toolStrip);
SD.WinForms.ToolbarService.UpdateToolbarText(toolStrip);
} }
void InternalShowResults() void InternalShowResults()
{ {
// listView.CreateControl is called in the constructor now. errors.Clear();
if (!taskView.IsHandleCreated) {
return;
}
taskView.BeginUpdate();
taskView.ClearTasks();
foreach (SDTask task in TaskService.Tasks) { foreach (SDTask task in TaskService.Tasks) {
AddTask(task); AddTask(task);
} }
taskView.EndUpdate();
UpdateToolstripStatus();
} }
#region IClipboardHandler interface implementation void CanExecuteCopy(object sender, CanExecuteRoutedEventArgs e)
public bool EnableCut { {
get { return false; } e.CanExecute = errorView.SelectedItem != null;
}
public bool EnableCopy {
get { return taskView.TaskIsSelected; }
}
public bool EnablePaste {
get { return false; }
}
public bool EnableDelete {
get { return false; }
}
public bool EnableSelectAll {
get { return true; }
} }
public void Cut() {} void ExecuteCopy(object sender, ExecutedRoutedEventArgs e)
public void Paste() {} {
public void Delete() {} TaskViewResources.CopySelectionToClipboard(errorView);
}
public void Copy() void CanExecuteSelectAll(object sender, CanExecuteRoutedEventArgs e)
{ {
taskView.CopySelectionToClipboard(); e.CanExecute = true;
} }
public void SelectAll()
void ExecuteSelectAll(object sender, ExecutedRoutedEventArgs e)
{ {
taskView.SelectAll(); errorView.SelectAll();
} }
#endregion
} }
} }

151
src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs

@ -2,38 +2,41 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using System.Windows.Forms;
using ICSharpCode.Core; using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using ICSharpCode.Core.Presentation;
using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Parser;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.WinForms;
using ICSharpCode.SharpDevelop.Workbench; using ICSharpCode.SharpDevelop.Workbench;
namespace ICSharpCode.SharpDevelop.Gui namespace ICSharpCode.SharpDevelop.Gui
{ {
public class TaskListPad : AbstractPadContent, IClipboardHandler public class TaskListPad : AbstractPadContent
{ {
public const string DefaultContextMenuAddInTreeEntry = "/SharpDevelop/Pads/TaskList/TaskContextMenu"; public const string DefaultContextMenuAddInTreeEntry = "/SharpDevelop/Pads/TaskList/TaskContextMenu";
static TaskListPad instance; static TaskListPad instance;
Dictionary<string, bool> displayedTokens; Dictionary<string, bool> displayedTokens;
readonly ObservableCollection<SDTask> tasks;
IUnresolvedTypeDefinition oldClass; IUnresolvedTypeDefinition oldClass;
int selectedScopeIndex = 0; int selectedScopeIndex = 0;
bool isInitialized = false; bool isInitialized;
public bool IsInitialized { public bool IsInitialized {
get { return isInitialized; } get { return isInitialized; }
} }
ToolStrip toolStrip; ToolBar toolBar;
Panel contentPanel = new Panel(); DockPanel contentPanel = new DockPanel();
TaskView taskView = new TaskView() { DefaultContextMenuAddInTreeEntry = TaskListPad.DefaultContextMenuAddInTreeEntry }; ListView taskView = new ListView();
public Dictionary<string, bool> DisplayedTokens { public Dictionary<string, bool> DisplayedTokens {
get { return displayedTokens; } get { return displayedTokens; }
@ -61,18 +64,16 @@ namespace ICSharpCode.SharpDevelop.Gui
{ {
instance = this; instance = this;
this.displayedTokens = new Dictionary<string, bool>(); this.displayedTokens = new Dictionary<string, bool>();
TaskService.Cleared += TaskServiceCleared;
TaskService.Added += TaskServiceAdded;
TaskService.Removed += TaskServiceRemoved;
TaskService.InUpdateChanged += TaskServiceInUpdateChanged;
RedrawContent(); this.tasks = new ObservableCollection<SDTask>(TaskService.CommentTasks);
SD.ResourceService.LanguageChanged += delegate { RedrawContent(); };
InitializeToolStrip(); InitializePadContent();
TaskService.Cleared += new EventHandler(TaskServiceCleared);
TaskService.Added += new TaskEventHandler(TaskServiceAdded);
TaskService.Removed += new TaskEventHandler(TaskServiceRemoved);
TaskService.InUpdateChanged += new EventHandler(TaskServiceInUpdateChanged);
SD.Workbench.ActiveViewContentChanged += new EventHandler(WorkbenchActiveViewContentChanged); SD.Workbench.ActiveViewContentChanged += WorkbenchActiveViewContentChanged;
if (SD.Workbench.ActiveViewContent != null) { if (SD.Workbench.ActiveViewContent != null) {
UpdateItems(); UpdateItems();
@ -125,58 +126,61 @@ namespace ICSharpCode.SharpDevelop.Gui
UpdateItems(); UpdateItems();
} }
void InitializeToolStrip() void InitializePadContent()
{ {
taskView.CreateControl();
contentPanel.Controls.Add(taskView);
IReadOnlyList<string> tokens = SD.ParserService.TaskListTokens; IReadOnlyList<string> tokens = SD.ParserService.TaskListTokens;
foreach (string token in tokens) foreach (string token in tokens) {
{
if (!this.displayedTokens.ContainsKey(token)) { if (!this.displayedTokens.ContainsKey(token)) {
this.displayedTokens.Add(token, true); this.displayedTokens.Add(token, true);
} }
} }
toolStrip = SD.WinForms.ToolbarService.CreateToolStrip(this, "/SharpDevelop/Pads/TaskList/Toolbar"); toolBar = ToolBarService.CreateToolBar(contentPanel, this, "/SharpDevelop/Pads/TaskList/Toolbar");
var items = (IList)toolBar.ItemsSource;
foreach (string token in tokens) { foreach (string token in tokens) {
toolStrip.Items.Add(new ToolStripSeparator()); items.Add(new Separator());
toolStrip.Items.Add(new TaskListTokensToolbarCheckBox(token)); items.Add(new TaskListTokensToolbarCheckBox(token));
} }
toolStrip.Stretch = true; contentPanel.Children.Add(toolBar);
toolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; toolBar.SetValue(DockPanel.DockProperty, Dock.Top);
contentPanel.Children.Add(taskView);
taskView.ItemsSource = tasks;
taskView.MouseDoubleClick += TaskViewMouseDoubleClick;
taskView.Style = (Style)new TaskViewResources()["TaskListView"];
taskView.ContextMenu = MenuService.CreateContextMenu(taskView, DefaultContextMenuAddInTreeEntry);
contentPanel.Controls.Add(toolStrip); taskView.CommandBindings.Add(new CommandBinding(ApplicationCommands.Copy, ExecuteCopy, CanExecuteCopy));
taskView.CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, ExecuteSelectAll, CanExecuteSelectAll));
} }
void RedrawContent() void TaskViewMouseDoubleClick(object sender, MouseButtonEventArgs e)
{ {
taskView.RefreshColumnNames(); SDTask task = taskView.SelectedItem as SDTask;
var item = taskView.ItemContainerGenerator.ContainerFromItem(task) as ListViewItem;
UIElement element = e.MouseDevice.DirectlyOver as UIElement;
if (task != null && task.FileName != null && element != null && item != null
&& element.IsDescendantOf(item)) {
SD.FileService.JumpToFilePosition(task.FileName, task.Line, task.Column);
}
} }
public void UpdateItems() public void UpdateItems()
{ {
this.taskView.BeginUpdate(); tasks.Clear();
this.taskView.ClearTasks();
foreach (SDTask t in TaskService.CommentTasks) { foreach (SDTask t in TaskService.CommentTasks) {
this.AddItem(t); AddItem(t);
} }
RedrawContent();
this.taskView.EndUpdate();
} }
void AddItem(SDTask item) void AddItem(SDTask item)
{ {
foreach (KeyValuePair<string, bool> pair in displayedTokens) { foreach (KeyValuePair<string, bool> pair in displayedTokens) {
if (item.Description.StartsWith(pair.Key) && pair.Value && IsInScope(item)) if (item.Description.StartsWith(pair.Key, StringComparison.Ordinal) && pair.Value && IsInScope(item))
this.taskView.AddTask(item); tasks.Add(item);
} }
} }
@ -189,7 +193,7 @@ namespace ICSharpCode.SharpDevelop.Gui
case 0: case 0:
// Solution // Solution
if (ProjectService.OpenSolution != null) { if (ProjectService.OpenSolution != null) {
foreach (AbstractProject proj in ProjectService.OpenSolution.Projects) { foreach (IProject proj in ProjectService.OpenSolution.Projects) {
if (proj.FindFile(item.FileName) != null) if (proj.FindFile(item.FileName) != null)
return true; return true;
} }
@ -199,10 +203,10 @@ namespace ICSharpCode.SharpDevelop.Gui
// Project // Project
return ProjectService.CurrentProject != null && ProjectService.CurrentProject.FindFile(item.FileName) != null; return ProjectService.CurrentProject != null && ProjectService.CurrentProject.FindFile(item.FileName) != null;
case 2: case 2:
// All open documents // All open files
return SD.Workbench.ViewContentCollection.Select(vc => vc.GetService<ITextEditor>()).Any(editor => editor != null && item.FileName == editor.FileName); return SD.Workbench.ViewContentCollection.Select(vc => vc.GetService<ITextEditor>()).Any(editor => editor != null && item.FileName == editor.FileName);
case 3: case 3:
// Document // File
return SD.Workbench.ActiveViewContent != null && SD.Workbench.ActiveViewContent.PrimaryFileName == item.FileName; return SD.Workbench.ActiveViewContent != null && SD.Workbench.ActiveViewContent.PrimaryFileName == item.FileName;
case 4: case 4:
// Namespace // Namespace
@ -248,79 +252,52 @@ namespace ICSharpCode.SharpDevelop.Gui
void OnSolutionOpen(object sender, SolutionEventArgs e) void OnSolutionOpen(object sender, SolutionEventArgs e)
{ {
taskView.ClearTasks(); tasks.Clear();
} }
void OnSolutionClosed(object sender, EventArgs e) void OnSolutionClosed(object sender, EventArgs e)
{ {
taskView.ClearTasks(); tasks.Clear();
} }
void TaskServiceCleared(object sender, EventArgs e) void TaskServiceCleared(object sender, EventArgs e)
{ {
taskView.ClearTasks(); tasks.Clear();
} }
void TaskServiceAdded(object sender, TaskEventArgs e) void TaskServiceAdded(object sender, TaskEventArgs e)
{ {
this.taskView.BeginUpdate();
if (e.Task.TaskType == TaskType.Comment) { if (e.Task.TaskType == TaskType.Comment) {
AddItem(e.Task); AddItem(e.Task);
} }
RedrawContent();
this.taskView.EndUpdate();
} }
void TaskServiceRemoved(object sender, TaskEventArgs e) void TaskServiceRemoved(object sender, TaskEventArgs e)
{ {
this.taskView.BeginUpdate();
if (e.Task.TaskType == TaskType.Comment) { if (e.Task.TaskType == TaskType.Comment) {
foreach (ListViewItem item in this.taskView.Items) { tasks.Remove(e.Task);
if (item.Tag == e.Task) {
this.taskView.Items.Remove(item);
break;
}
}
} }
RedrawContent();
this.taskView.EndUpdate();
} }
#region IClipboardHandler interface implementation void CanExecuteCopy(object sender, CanExecuteRoutedEventArgs e)
public bool EnableCut { {
get { return false; } e.CanExecute = taskView.SelectedItem != null;
}
public bool EnableCopy {
get { return taskView.TaskIsSelected; }
}
public bool EnablePaste {
get { return false; }
}
public bool EnableDelete {
get { return false; }
}
public bool EnableSelectAll {
get { return true; }
} }
public void Cut() {} void ExecuteCopy(object sender, ExecutedRoutedEventArgs e)
public void Paste() {} {
public void Delete() {} TaskViewResources.CopySelectionToClipboard(taskView);
}
public void Copy() void CanExecuteSelectAll(object sender, CanExecuteRoutedEventArgs e)
{ {
taskView.CopySelectionToClipboard(); e.CanExecute = true;
} }
public void SelectAll()
void ExecuteSelectAll(object sender, ExecutedRoutedEventArgs e)
{ {
taskView.SelectAll(); taskView.SelectAll();
} }
#endregion
} }
} }

54
src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPadCommands.cs

@ -2,53 +2,65 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Windows.Forms; using System.Windows;
using System.Windows.Controls;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Gui namespace ICSharpCode.SharpDevelop.Gui
{ {
public class SelectScopeComboBox : ToolStripComboBox public class SelectScopeComboBox : ComboBox
{ {
private static string[] viewTypes = new string[] {"Solution", "Project", "All open documents", "Document", "Namespace", "Class/Module"}; // TODO Translate!
static readonly string[] viewTypes = new string[] {"Solution", "Project", "All open files", "File", "Namespace", "Class/Module"};
public SelectScopeComboBox() public SelectScopeComboBox()
{ {
SetItems(); this.ItemsSource = viewTypes;
this.SelectedIndex = 0; this.SelectedIndex = 0;
} }
protected override void OnSelectedIndexChanged(EventArgs e) protected override void OnSelectionChanged(SelectionChangedEventArgs e)
{ {
base.OnSelectedIndexChanged(e); base.OnSelectionChanged(e);
if (this.SelectedIndex != TaskListPad.Instance.SelectedScopeIndex) { if (this.SelectedIndex != TaskListPad.Instance.SelectedScopeIndex) {
TaskListPad.Instance.SelectedScopeIndex = this.SelectedIndex; TaskListPad.Instance.SelectedScopeIndex = this.SelectedIndex;
} }
} }
void SetItems()
{
this.Items.Clear();
this.Items.AddRange(viewTypes);
}
} }
sealed class TaskListTokensToolbarCheckBox : ToolStripButton sealed class TaskListTokensToolbarCheckBox : CheckBox, ICheckableMenuCommand
{ {
event EventHandler ICheckableMenuCommand.IsCheckedChanged { add {} remove {} }
event EventHandler System.Windows.Input.ICommand.CanExecuteChanged { add {} remove {} }
readonly string token; readonly string token;
public TaskListTokensToolbarCheckBox(string token) public TaskListTokensToolbarCheckBox(string token)
: base(token)
{ {
this.token = token; this.token = token;
this.CheckOnClick = true; this.Content = token;
this.Checked = true; this.Command = this;
this.CommandParameter = TaskListPad.Instance;
this.IsChecked = TaskListPad.Instance.DisplayedTokens[token];
SetResourceReference(FrameworkElement.StyleProperty, ToolBar.CheckBoxStyleKey);
}
bool ICheckableMenuCommand.IsChecked(object parameter)
{
var pad = (TaskListPad)parameter;
return pad.DisplayedTokens[token];
}
public bool CanExecute(object parameter)
{
return true;
} }
protected override void OnCheckedChanged(EventArgs e) public void Execute(object parameter)
{ {
base.OnCheckedChanged(e); var pad = (TaskListPad)parameter;
TaskListPad.Instance.DisplayedTokens[token] = this.Checked; pad.DisplayedTokens[token] = IsChecked == true;
if (TaskListPad.Instance.IsInitialized) if (pad.IsInitialized)
TaskListPad.Instance.UpdateItems(); pad.UpdateItems();
} }
} }
} }

471
src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskView.cs

@ -1,471 +0,0 @@
// 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)
// much of TaskView's code has been refactored from
// TaskList.cs (formerly OpenTaskView.cs) & ErrorList.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Text;
using System.Windows.Forms;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.WinForms;
namespace ICSharpCode.SharpDevelop.Gui
{
public enum TaskViewCols : int {
Icon = 0,
Line = 1,
Description = 2,
File = 3,
Path = 4
}
/// <summary>
/// Description of TaskView.
/// </summary>
public class TaskView : ListView
{
ColumnHeader type = new ColumnHeader();
ColumnHeader line = new ColumnHeader();
ColumnHeader description = new ColumnHeader();
ColumnHeader file = new ColumnHeader();
ColumnHeader path = new ColumnHeader();
ToolTip taskToolTip = new ToolTip();
public string DefaultContextMenuAddInTreeEntry { get; set; }
public SDTask SelectedTask {
get {
if (this.FocusedItem==null) {
return null;
}
return (SDTask)this.FocusedItem.Tag;
}
}
public bool TaskIsSelected {
get {
return this.FocusedItem!=null;
}
}
public IEnumerable<SDTask> SelectedTasks {
get {
foreach (ListViewItem item in this.SelectedItems) {
yield return (SDTask)item.Tag;
}
}
}
public void CopySelectionToClipboard()
{
StringBuilder b = new StringBuilder();
foreach (SDTask t in this.SelectedTasks) {
if (b.Length > 0) b.AppendLine();
b.Append(t.Description);
if (!string.IsNullOrEmpty(t.FileName)) {
b.Append(" - ");
b.Append(t.FileName);
if (t.Line >= 1) {
b.Append(':');
b.Append(t.Line);
if (t.Column > 1) {
b.Append(',');
b.Append(t.Column);
}
}
}
}
SD.Clipboard.SetText(b.ToString());
}
public void SelectAll()
{
BeginUpdate();
try {
foreach (ListViewItem item in this.Items) {
item.Selected = true;
}
} finally {
EndUpdate();
}
}
public TaskView() : base()
{
RefreshColumnNames();
this.Columns.Add(type);
this.Columns.Add(line);
this.Columns.Add(description);
this.Columns.Add(file);
this.Columns.Add(path);
this.HideSelection = false;
this.FullRowSelect = true;
this.AutoArrange = true;
this.Alignment = ListViewAlignment.Left;
this.View = View.Details;
this.Dock = DockStyle.Fill;
this.GridLines = true;
this.Activation = ItemActivation.OneClick;
OnResize(EventArgs.Empty);
// ...
ImageList imglist = new ImageList();
imglist.ColorDepth = ColorDepth.Depth32Bit;
// HACK: these images must be in the same order as the TaskType enumeration.
// because of how the ListViewItem's ImageIndex is set in TaskView.AddTask();
imglist.Images.Add(SD.ResourceService.GetBitmap("Icons.16x16.Error"));
imglist.Images.Add(SD.ResourceService.GetBitmap("Icons.16x16.Warning"));
imglist.Images.Add(SD.ResourceService.GetBitmap("Icons.16x16.Information"));
imglist.Images.Add(SD.ResourceService.GetBitmap("Icons.16x16.Question"));
// TODO: use reflection and a custom attribute on the TaskType enumeration to tie this ImageList to TaskType
// imglist.Images.Add(ResourceService.GetBitmap(Task.GetBitmapName(TaskType.Error)));
// imglist.Images.Add(ResourceService.GetBitmap(Task.GetBitmapName(TaskType.Warning)));
// imglist.Images.Add(ResourceService.GetBitmap(Task.GetBitmapName(TaskType.Message)));
// imglist.Images.Add(ResourceService.GetBitmap(Task.GetBitmapName(TaskType.Comment)));
this.SmallImageList = this.LargeImageList = imglist;
// Set up the delays for the ToolTip.
taskToolTip.InitialDelay = 500;
taskToolTip.ReshowDelay = 100;
taskToolTip.AutoPopDelay = 5000;
//
// // Force the ToolTip text to be displayed whether or not the form is active.
// taskToolTip.ShowAlways = false;
SortBy(TaskViewCols.Path);
}
public void RefreshColumnNames()
{
type.Text = "!";
line.Text = ResourceService.GetString("Global.TextLine");
description.Text = ResourceService.GetString("CompilerResultView.DescriptionText");
file.Text = ResourceService.GetString("CompilerResultView.FileText");
path.Text = ResourceService.GetString("Global.Path");
}
#region Event Overrides
protected override void OnResize(EventArgs e) {
// recalculate column widths
type.Width = 24;
line.Width = 50;
int w = this.Width - type.Width - line.Width;
file.Width = w * 15 / 100;
path.Width = w * 15 / 100;
description.Width = w - file.Width - path.Width - 5;
base.OnResize(e);
}
protected override void OnColumnClick(ColumnClickEventArgs e)
{
SortBy(e.Column);
base.OnColumnClick(e);
}
protected override void OnItemActivate(EventArgs e) {
if (this.FocusedItem != null) {
System.Diagnostics.Debug.Assert(SelectedTask != null);
SelectedTask.JumpToPosition();
}
base.OnItemActivate(e);
}
ListViewItem currentListViewItem = null;
protected override void OnMouseMove(MouseEventArgs e) {
base.OnMouseMove(e);
ListViewItem item = GetItemAt(e.X, e.Y);
if (item != currentListViewItem) {
if (item != null) {
SDTask task = (SDTask)item.Tag;
string description = task.Description;
if (description != null) {
description = description.Replace("\t", " ");
description = FixDescriptionForTooltip(description, 200);
}
taskToolTip.SetToolTip(this, description);
taskToolTip.Active = true;
} else {
taskToolTip.RemoveAll();
taskToolTip.Active = false;
}
currentListViewItem = item;
}
}
// when there is a very long word (e.g. huge generic type), Windows.Forms hangs when showing the tooltip,
// so we need to separate the words
static string FixDescriptionForTooltip(string description, int spaceEvery)
{
StringBuilder b = new StringBuilder(description.Length);
int i = 0;
foreach (char c in description) {
b.Append(c);
if (char.IsWhiteSpace(c)) {
i = 0;
} else {
if (++i == spaceEvery) {
b.Append(' ');
i = 0;
}
}
}
return b.ToString();
}
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x007B) { // handle WM_CONTEXTMENU
if (this.SelectedItems.Count > 0) {
long lParam = m.LParam.ToInt64();
int x = unchecked((short)(lParam & 0xffff));
int y = unchecked((short)((lParam & 0xffff0000) >> 16));
Point pos;
if (x == -1 && y == -1) {
pos = this.SelectedItems[0].Bounds.Location;
pos.X += 30;
pos.Y += 4;
} else {
pos = PointToClient(new Point(x, y));
}
string entry = ((SDTask)this.SelectedItems[0].Tag).ContextMenuAddInTreeEntry;
for (int i = 1; i < this.SelectedItems.Count; i++) {
string entry2 = ((SDTask)this.SelectedItems[i].Tag).ContextMenuAddInTreeEntry;
if (entry2 != entry) {
entry = null;
break;
}
}
if (entry == null)
entry = DefaultContextMenuAddInTreeEntry;
if (entry != null)
SD.WinForms.MenuService.ShowContextMenu(this, entry, this, pos.X, pos.Y);
}
}
base.WndProc(ref m);
}
#endregion
#region Task Management
public void ClearTasks()
{
this.Items.Clear();
}
public void AddTask(SDTask task)
{
string fileName = task.FileName;
string path = task.FileName;
try {
fileName = Path.GetFileName(fileName);
} catch (Exception) {}
try {
path = Path.GetDirectoryName(path);
if (Project.ProjectService.OpenSolution != null) {
path = FileUtility.GetRelativePath(Project.ProjectService.OpenSolution.Directory, path);
}
} catch (Exception) {}
ListViewItem item = new ListViewItem(new string[] {
String.Empty,
task.Line.ToString(),
FormatDescription(task.Description),
fileName,
path
});
item.ImageIndex = item.StateImageIndex = (int)task.TaskType;
item.Tag = task;
// insert new item into sorted list (binary search)
// ... using the current ListViewItemSorter
int left = 0;
int right = this.Items.Count - 1;
while (left <= right) {
int m = left + (right - left) / 2;
if (this.mySorter.Compare(item, this.Items[m]) > 0) {
left = m + 1;
} else {
right = m - 1;
}
}
this.Items.Insert(left, item);
}
/// <summary>
/// Removes new lines, carriage returns and tab characters from
/// the list view task description and replaces them with a space.
/// </summary>
/// <param name="description">The task list description.</param>
/// <returns>A formatted task list description.</returns>
string FormatDescription(string description)
{
if (string.IsNullOrEmpty(description))
return string.Empty;
string FormattedDescription = description.Replace("\r", " ");
FormattedDescription = FormattedDescription.Replace("\t", " ");
return FormattedDescription.Replace("\n", " ");
}
public void RemoveTask(SDTask task)
{
for (int i = 0; i < Items.Count; ++i) {
if ((SDTask)Items[i].Tag == task) {
Items.RemoveAt(i);
break;
}
}
}
public void UpdateResults(IEnumerable<SDTask> taskSet)
{
this.BeginUpdate();
this.ClearTasks();
foreach (SDTask task in taskSet) {
this.AddTask(task);
}
this.EndUpdate();
}
#endregion
#region Custom IComparer for sorting TaskView.
int currentSortColumn = -1;
SortOrder currentSortOrder = SortOrder.Ascending;
/// <summary>
/// Applies the specified sort request by creating,
/// configuring, and installing a
/// <see cref="TaskViewSorter"/>.
/// </summary>
private void SortBy(TaskViewCols col)
{
SortBy((int)col);
}
private void SortBy(int col)
{
if (col==currentSortColumn) {
// same as last sort; toggle the current sort order.
if (currentSortOrder == SortOrder.Ascending) {
currentSortOrder = SortOrder.Descending;
} else {
currentSortOrder = SortOrder.Ascending;
}
} else {
currentSortColumn = col;
currentSortOrder = SortOrder.Ascending;
}
this.mySorter = new TaskViewSorter(currentSortColumn, currentSortOrder);
this.ListViewItemSorter = mySorter;
this.ListViewItemSorter = null;
}
TaskViewSorter mySorter;
/// <summary>
/// Custom <see cref="IComparer"/> for TaskView.
/// </summary>
private class TaskViewSorter : IComparer
{
int sortCol = -1;
SortOrder sortOrder = SortOrder.Ascending;
public TaskViewSorter(int col, SortOrder order)
{
sortCol = col;
sortOrder = order;
}
protected int CompareLineNumbers(ListViewItem a, ListViewItem b)
{
return ((SDTask)a.Tag).Line.CompareTo(((SDTask)b.Tag).Line);
}
protected int CompareAsText(ListViewItem a, ListViewItem b, TaskViewCols col)
{
return CompareAsText(a, b, (int)col);
}
protected int CompareAsText(ListViewItem a, ListViewItem b, int col)
{
return a.SubItems[col].Text.CompareTo(b.SubItems[col].Text);;
}
#region System.Collections.IComparer interface implementation
/// <summary>
/// The meat of this IComparer class; intelligently compares
/// two TaskView ListItems.
/// </summary>
/// <returns>
/// A signed integer indicating the relative sort ranking
/// of item <paramref name="x"/> relative to item
/// <paramref name="y"/>.
/// Return value greater than zero: x &gt; y.
/// Return value is zero: x == y.
/// Return value is less than zero: x &lt; y.
/// </returns>
public int Compare(object x, object y) {
ListViewItem a = (ListViewItem)x; // List item a
ListViewItem b = (ListViewItem)y; // List item b
int r = 0; // the result
if (sortCol==(int)TaskViewCols.Line) {
// Sorts as Line Number
r = CompareLineNumbers(a, b);
} else { // all others
r = CompareAsText(a, b, sortCol);
// doing this test first is an optimization; we only
// need to check for secondary sort conditions if
// the primary test is a tie.
if (r == 0) {
if (sortCol==(int)TaskViewCols.Path) {
// Sorts as Path -> File
r = CompareAsText(a, b, TaskViewCols.File);
if (r == 0) {
// Sorts as Path -> File -> Line
r = CompareLineNumbers(a, b);
}
} else if (sortCol==(int)TaskViewCols.File) {
// Sorts as File -> Line
r = CompareLineNumbers(a, b);
}
}
}
if (sortOrder == SortOrder.Descending) {
// Return the opposite ranking
return -r;
}
return r;
}
#endregion
}
#endregion
}
}

48
src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml

@ -0,0 +1,48 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ICSharpCode.SharpDevelop.Gui.TaskViewResources"
xmlns:core="http://icsharpcode.net/sharpdevelop/core"
xmlns:local="clr-namespace:ICSharpCode.SharpDevelop.Gui">
<Style TargetType="{x:Type ListView}" x:Key="TaskListView">
<Setter Property="core:SortableGridViewColumn.SortMode" Value="Automatic" />
<Setter Property="core:GridViewColumnAutoSize.AutoWidth" Value="35;50;70%;15%;15%" />
<Setter Property="View">
<Setter.Value>
<GridView AllowsColumnReorder="False">
<core:SortableGridViewColumn
SortBy="TaskType"
Header="!">
<core:SortableGridViewColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding TaskTypeImage}" Height="16" Width="16" />
</DataTemplate>
</core:SortableGridViewColumn.CellTemplate>
</core:SortableGridViewColumn>
<core:SortableGridViewColumn
DisplayMemberBinding="{Binding Line}"
Header="{core:Localize Global.TextLine}" />
<core:SortableGridViewColumn
SortBy="Description"
Header="{core:Localize CompilerResultView.DescriptionText}">
<core:SortableGridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Description}" TextTrimming="WordEllipsis" SizeChanged="TextBlockSizeChanged" />
</DataTemplate>
</core:SortableGridViewColumn.CellTemplate>
</core:SortableGridViewColumn>
<core:SortableGridViewColumn
DisplayMemberBinding="{Binding File}"
Header="{core:Localize CompilerResultView.FileText}" />
<core:SortableGridViewColumn
Header="{core:Localize Global.Path}">
<core:SortableGridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path}" TextTrimming="WordEllipsis" SizeChanged="TextBlockSizeChanged" />
</DataTemplate>
</core:SortableGridViewColumn.CellTemplate>
</core:SortableGridViewColumn>
</GridView>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

64
src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs

@ -0,0 +1,64 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
namespace ICSharpCode.SharpDevelop.Gui
{
public partial class TaskViewResources : ResourceDictionary
{
public TaskViewResources()
{
InitializeComponent();
}
static readonly System.Reflection.MethodInfo GetLineDetails =
typeof(TextBlock).GetMethod("GetLineDetails",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
void TextBlockSizeChanged(object sender, SizeChangedEventArgs e)
{
TextBlock target = sender as TextBlock;
if (target == null) return;
var args = new object[] { 0, 0, 0, 0, 0 };
GetLineDetails.Invoke(target, args);
if ((int)args[4] > 0) {
target.ToolTip = new ToolTip {
Content = new TextBlock { Text = target.Text, TextWrapping = TextWrapping.Wrap },
PlacementTarget = target,
Placement = PlacementMode.Relative,
VerticalOffset = -2,
HorizontalOffset = -6
};
} else {
target.ToolTip = null;
}
}
public static void CopySelectionToClipboard(ListView taskView)
{
StringBuilder b = new StringBuilder();
foreach (SDTask t in taskView.SelectedItems) {
if (b.Length > 0) b.AppendLine();
b.Append(t.Description);
if (!string.IsNullOrEmpty(t.FileName)) {
b.Append(" - ");
b.Append(t.FileName);
if (t.Line >= 1) {
b.Append(':');
b.Append(t.Line);
if (t.Column > 1) {
b.Append(',');
b.Append(t.Column);
}
}
}
}
SD.Clipboard.SetText(b.ToString());
}
}
}

28
src/Main/Base/Project/Src/Internal/ConditionEvaluators/WindowActiveEvaluator.cs

@ -10,16 +10,16 @@ namespace ICSharpCode.SharpDevelop
/// <summary> /// <summary>
/// Tests if the current workbench window is a specified type or implements an interface. /// Tests if the current workbench window is a specified type or implements an interface.
/// </summary> /// </summary>
/// <attribute name="activewindow"> /// <attribute name="activeWindow">
/// The fully qualified name of the type the active window should be or the /// The fully qualified name of the type the active window should be or the
/// interface name it should implement. /// interface name it should implement.
/// "*" to test if any window is active. /// "*" to test if any window is active.
/// </attribute> /// </attribute>
/// <example title="Test if the current window is a text editor"> /// <example title="Test if the current window is a text editor">
/// &lt;Condition name="WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditorProvider"&gt; /// &lt;Condition name="WindowActive" activeWindow="ICSharpCode.SharpDevelop.Editor.ITextEditor"&gt;
/// </example> /// </example>
/// <example title="Test if any window is active"> /// <example title="Test if any window is active">
/// &lt;Condition name="WindowActive" activewindow="*"&gt; /// &lt;Condition name="WindowActive" activeWindow="*"&gt;
/// </example> /// </example>
public class WindowActiveConditionEvaluator : IConditionEvaluator public class WindowActiveConditionEvaluator : IConditionEvaluator
{ {
@ -29,25 +29,33 @@ namespace ICSharpCode.SharpDevelop
return false; return false;
} }
string activewindow = condition.Properties["activewindow"]; string activeWindow = condition.Properties["activewindow"];
if (activeWindow == "*") {
if (activewindow == "*") {
return SD.Workbench.ActiveWorkbenchWindow != null; return SD.Workbench.ActiveWorkbenchWindow != null;
} }
if (SD.Workbench.ActiveWorkbenchWindow == null || SD.Workbench.ActiveWorkbenchWindow.ActiveViewContent == null) { Type activeWindowType = Type.GetType(activeWindow, false);
if (activeWindowType == null) {
SD.Log.WarnFormatted("WindowActiveCondition: cannot find Type {0}", activeWindow);
return false; return false;
} }
if (SD.GetActiveViewContentService(activeWindowType) != null)
return true;
if (SD.Workbench.ActiveWorkbenchWindow == null
|| SD.Workbench.ActiveWorkbenchWindow.ActiveViewContent == null)
return false;
Type currentType = SD.Workbench.ActiveWorkbenchWindow.ActiveViewContent.GetType(); Type currentType = SD.Workbench.ActiveWorkbenchWindow.ActiveViewContent.GetType();
if (currentType.FullName == activewindow) if (currentType.FullName == activeWindow)
return true; return true;
foreach (Type interf in currentType.GetInterfaces()) { foreach (Type interf in currentType.GetInterfaces()) {
if (interf.FullName == activewindow) if (interf.FullName == activeWindow)
return true; return true;
} }
while ((currentType = currentType.BaseType) != null) { while ((currentType = currentType.BaseType) != null) {
if (currentType.FullName == activewindow) if (currentType.FullName == activeWindow)
return true; return true;
} }
return false; return false;

19
src/Main/Base/Project/Src/Internal/ConditionEvaluators/WindowOpenEvaluator.cs

@ -17,7 +17,7 @@ namespace ICSharpCode.SharpDevelop
/// "*" to test if any window is open. /// "*" to test if any window is open.
/// </attribute> /// </attribute>
/// <example title="Test if a text editor is opened"> /// <example title="Test if a text editor is opened">
/// &lt;Condition name="WindowOpen" openwindow="ICSharpCode.SharpDevelop.Editor.ITextEditorProvider"&gt; /// &lt;Condition name="WindowOpen" openwindow="ICSharpCode.SharpDevelop.Editor.ITextEditor"&gt;
/// </example> /// </example>
/// <example title="Test if any window is open"> /// <example title="Test if any window is open">
/// &lt;Condition name="WindowOpen" openwindow="*"&gt; /// &lt;Condition name="WindowOpen" openwindow="*"&gt;
@ -30,19 +30,28 @@ namespace ICSharpCode.SharpDevelop
return false; return false;
} }
string openwindow = condition.Properties["openwindow"]; string openWindow = condition.Properties["openwindow"];
if (openwindow == "*") { Type openWindowType = Type.GetType(openWindow, false);
if (openWindowType == null) {
SD.Log.WarnFormatted("WindowOpenCondition: cannot find Type {0}", openWindow);
return false;
}
if (SD.GetActiveViewContentService(openWindowType) != null)
return true;
if (openWindow == "*") {
return SD.Workbench.ActiveWorkbenchWindow != null; return SD.Workbench.ActiveWorkbenchWindow != null;
} }
foreach (IViewContent view in SD.Workbench.ViewContentCollection) { foreach (IViewContent view in SD.Workbench.ViewContentCollection) {
Type currentType = view.GetType(); Type currentType = view.GetType();
if (currentType.ToString() == openwindow) { if (currentType.ToString() == openWindow) {
return true; return true;
} }
foreach (Type i in currentType.GetInterfaces()) { foreach (Type i in currentType.GetInterfaces()) {
if (i.ToString() == openwindow) { if (i.ToString() == openWindow) {
return true; return true;
} }
} }

45
src/Main/Base/Project/Src/Services/Tasks/Task.cs

@ -2,7 +2,9 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Windows.Media;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.Core.Presentation;
using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
@ -26,8 +28,6 @@ namespace ICSharpCode.SharpDevelop
TaskType type; TaskType type;
PermanentAnchor position; PermanentAnchor position;
bool hasLocation; bool hasLocation;
string contextMenuAddInTreeEntry;
object tag;
public override string ToString() public override string ToString()
{ {
@ -78,29 +78,40 @@ namespace ICSharpCode.SharpDevelop
} }
} }
public string File {
get { return position == null ? null : System.IO.Path.GetFileName(position.FileName); }
}
public string Path {
get { return position == null ? null : System.IO.Path.GetDirectoryName(position.FileName); }
}
public TaskType TaskType { public TaskType TaskType {
get { get {
return type; return type;
} }
} }
public string ContextMenuAddInTreeEntry { public ImageSource TaskTypeImage {
get { get {
return contextMenuAddInTreeEntry; switch (type) {
} case TaskType.Error:
set { return PresentationResourceService.GetBitmapSource("Icons.16x16.Error");
contextMenuAddInTreeEntry = value; case TaskType.Warning:
return PresentationResourceService.GetBitmapSource("Icons.16x16.Warning");
case TaskType.Message:
return PresentationResourceService.GetBitmapSource("Icons.16x16.Information");
case TaskType.Comment:
return PresentationResourceService.GetBitmapSource("Icons.16x16.Question");
default:
throw new ArgumentOutOfRangeException();
}
} }
} }
public object Tag { public string ContextMenuAddInTreeEntry { get; set; }
get {
return tag; public object Tag { get; set; }
}
set {
tag = value;
}
}
/// <summary> /// <summary>
/// Contains a reference to the build error. /// Contains a reference to the build error.
@ -151,9 +162,9 @@ namespace ICSharpCode.SharpDevelop
description = error.ErrorText + " (" + error.ErrorCode + ")"; description = error.ErrorText + " (" + error.ErrorCode + ")";
} }
if (error.ContextMenuAddInTreeEntry != null) { if (error.ContextMenuAddInTreeEntry != null) {
contextMenuAddInTreeEntry = error.ContextMenuAddInTreeEntry; ContextMenuAddInTreeEntry = error.ContextMenuAddInTreeEntry;
} }
tag = error.Tag; this.Tag = error.Tag;
this.BuildError = error; this.BuildError = error;
} }

80
src/Main/ICSharpCode.Core.Presentation/GridViewColumnAutoSize.cs

@ -0,0 +1,80 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows;
using System.Windows.Controls;
namespace ICSharpCode.Core.Presentation
{
/// <summary>
/// This class adds the AutoWidth property to the WPF ListView.
/// It supports a semi-colon-separated list of values, for each defined cell.
/// Each value can either be a fixed size double, or a percentage.
/// The sizes of columns with a percentage will be calculated from the
/// remaining width (after assigning the fixed sizes).
/// Examples: 50%;25%;25% or 30;100%;50
/// </summary>
public class GridViewColumnAutoSize
{
public static readonly DependencyProperty AutoWidthProperty =
DependencyProperty.RegisterAttached("AutoWidth", typeof(string), typeof(GridViewColumnAutoSize),
new FrameworkPropertyMetadata(null, AutoWidthPropertyChanged));
public static string GetAutoWidth(DependencyObject obj)
{
return (string)obj.GetValue(AutoWidthProperty);
}
public static void SetAutoWidth(DependencyObject obj, string value)
{
obj.SetValue(AutoWidthProperty, value);
}
static void AutoWidthPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
ListView grid = sender as ListView;
if (grid == null) return;
grid.SizeChanged += delegate(object listView, SizeChangedEventArgs e) {
ListView lv = listView as ListView;
if (lv == null) return;
GridView v = lv.View as GridView;
if (v == null) return;
CalculateSizes(v, GetAutoWidth(lv), e.NewSize.Width);
};
GridView view = grid.View as GridView;
if (view == null) return;
CalculateSizes(view, args.NewValue as string, grid.ActualWidth);
}
static void CalculateSizes(GridView view, string sizeValue, double fullWidth)
{
string[] sizes = (sizeValue ?? "").Split(';');
Debug.Assert(sizes.Length == view.Columns.Count);
Dictionary<int, Func<double, double>> percentages = new Dictionary<int, Func<double, double>>();
double remainingWidth = fullWidth - 30; // 30 is a good offset for the scrollbar
for (int i = 0; i < view.Columns.Count; i++) {
var column = view.Columns[i];
double size;
bool isPercentage = !double.TryParse(sizes[i], out size);
if (isPercentage) {
size = double.Parse(sizes[i].TrimEnd('%', ' '));
percentages.Add(i, w => w * size / 100.0);
} else {
column.Width = size;
remainingWidth -= size;
}
}
if (remainingWidth < 0) return;
foreach (var p in percentages) {
var column = view.Columns[p.Key];
column.Width = p.Value(remainingWidth);
}
}
}
}

1
src/Main/ICSharpCode.Core.Presentation/ICSharpCode.Core.Presentation.csproj

@ -72,6 +72,7 @@
<Link>Properties\GlobalAssemblyInfo.cs</Link> <Link>Properties\GlobalAssemblyInfo.cs</Link>
</Compile> </Compile>
<Compile Include="GlobalStyles.cs" /> <Compile Include="GlobalStyles.cs" />
<Compile Include="GridViewColumnAutoSize.cs" />
<Compile Include="Menu\MenuCheckBox.cs" /> <Compile Include="Menu\MenuCheckBox.cs" />
<Compile Include="NotBoolConverter.cs" /> <Compile Include="NotBoolConverter.cs" />
<Compile Include="RestrictDesiredSize.cs" /> <Compile Include="RestrictDesiredSize.cs" />

3
src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarCheckBox.cs

@ -46,6 +46,9 @@ namespace ICSharpCode.Core.Presentation
if (codon.Properties.Contains("tooltip")) { if (codon.Properties.Contains("tooltip")) {
this.ToolTip = StringParser.Parse(codon.Properties["tooltip"]); this.ToolTip = StringParser.Parse(codon.Properties["tooltip"]);
} }
if (codon.Properties.Contains("label")) {
this.Content = ToolBarService.CreateToolBarItemContent(codon);
}
} }
public void UpdateStatus() public void UpdateStatus()

Loading…
Cancel
Save