From 973ca64615122fb407d37d17eef14e1b90e0efda Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 22 Aug 2013 15:04:31 +0200 Subject: [PATCH 01/13] fix SD-1912 - Debugger displays wrong values for captured parameters --- .../Debugger.AddIn/TreeModel/ValueNode.cs | 18 +++++++++++++++--- .../Debugger/Debugger.Core/LocalVariable.cs | 2 +- .../Debugger/Debugger.Core/StackFrame.cs | 14 ++++++++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/AddIns/Debugger/Debugger.AddIn/TreeModel/ValueNode.cs b/src/AddIns/Debugger/Debugger.AddIn/TreeModel/ValueNode.cs index 6157580a14..cc1b6cfc35 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/TreeModel/ValueNode.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/TreeModel/ValueNode.cs @@ -255,13 +255,25 @@ namespace Debugger.AddIn.TreeModel public static IEnumerable GetLocalVariables() { 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})) { 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; - yield return new ValueNode(ClassBrowserIconService.LocalVariable, locVar.Name, () => locVarCopy.GetValue(GetCurrentStackFrame())); + yield return new ValueNode(ClassBrowserIconService.LocalVariable, locVar.Name, + () => locVarCopy.GetValue(stackFrame)); } } diff --git a/src/AddIns/Debugger/Debugger.Core/LocalVariable.cs b/src/AddIns/Debugger/Debugger.Core/LocalVariable.cs index 3e9aeef644..b3fa13c7aa 100644 --- a/src/AddIns/Debugger/Debugger.Core/LocalVariable.cs +++ b/src/AddIns/Debugger/Debugger.Core/LocalVariable.cs @@ -89,7 +89,7 @@ namespace Debugger.MetaData context => context.GetThisValue(false), 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)) { IField fieldInfoCopy = fieldInfo; AddCapturedLocalVariables( diff --git a/src/AddIns/Debugger/Debugger.Core/StackFrame.cs b/src/AddIns/Debugger/Debugger.Core/StackFrame.cs index ebe49ec296..298553d136 100644 --- a/src/AddIns/Debugger/Debugger.Core/StackFrame.cs +++ b/src/AddIns/Debugger/Debugger.Core/StackFrame.cs @@ -270,6 +270,9 @@ namespace Debugger { for (int i = 0; i < this.MethodInfo.Parameters.Count; i++) { if (this.MethodInfo.Parameters[i].Name == name) { + LocalVariable capturedVar; + if (HasCapturedVariable(name, out capturedVar)) + return capturedVar.GetValue(this); return GetArgumentValue(i); } } @@ -280,6 +283,10 @@ namespace Debugger /// Zero-based 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)); } @@ -312,6 +319,13 @@ namespace Debugger return corValue; } + /// Gets whether a captured variable with the exists. + public bool HasCapturedVariable(string name, out LocalVariable variable) + { + variable = GetLocalVariables(this.IP).FirstOrDefault(v => v.IsCaptured && v.Name == name); + return variable != null; + } + /// Get all local variables public IEnumerable GetLocalVariables() { From 1e10eb47fc8360a849e0f9bd56eb76450fbd4181 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 22 Aug 2013 17:21:46 +0200 Subject: [PATCH 02/13] check ActiveViewContent.Services as well, when evaluating WindowActive-Condition --- .../WindowActiveEvaluator.cs | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/Main/Base/Project/Src/Internal/ConditionEvaluators/WindowActiveEvaluator.cs b/src/Main/Base/Project/Src/Internal/ConditionEvaluators/WindowActiveEvaluator.cs index 68100a191f..bb6836ae20 100644 --- a/src/Main/Base/Project/Src/Internal/ConditionEvaluators/WindowActiveEvaluator.cs +++ b/src/Main/Base/Project/Src/Internal/ConditionEvaluators/WindowActiveEvaluator.cs @@ -10,16 +10,16 @@ namespace ICSharpCode.SharpDevelop /// /// Tests if the current workbench window is a specified type or implements an interface. /// - /// + /// /// The fully qualified name of the type the active window should be or the /// interface name it should implement. /// "*" to test if any window is active. /// /// - /// <Condition name="WindowActive" activewindow="ICSharpCode.SharpDevelop.Editor.ITextEditorProvider"> + /// <Condition name="WindowActive" activeWindow="ICSharpCode.SharpDevelop.Editor.ITextEditor"> /// /// - /// <Condition name="WindowActive" activewindow="*"> + /// <Condition name="WindowActive" activeWindow="*"> /// public class WindowActiveConditionEvaluator : IConditionEvaluator { @@ -29,25 +29,33 @@ namespace ICSharpCode.SharpDevelop return false; } - string activewindow = condition.Properties["activewindow"]; - - if (activewindow == "*") { + string activeWindow = condition.Properties["activewindow"]; + if (activeWindow == "*") { 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; } + 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(); - if (currentType.FullName == activewindow) + if (currentType.FullName == activeWindow) return true; foreach (Type interf in currentType.GetInterfaces()) { - if (interf.FullName == activewindow) + if (interf.FullName == activeWindow) return true; } while ((currentType = currentType.BaseType) != null) { - if (currentType.FullName == activewindow) + if (currentType.FullName == activeWindow) return true; } return false; From 46c5c037aaad79066f76e9b4396e67195968b3e5 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 22 Aug 2013 17:21:46 +0200 Subject: [PATCH 03/13] check ActiveViewContent.Services as well, when evaluating WindowActive-Condition --- .../WindowOpenEvaluator.cs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/Main/Base/Project/Src/Internal/ConditionEvaluators/WindowOpenEvaluator.cs b/src/Main/Base/Project/Src/Internal/ConditionEvaluators/WindowOpenEvaluator.cs index 890a10cad9..032ba3ff9b 100644 --- a/src/Main/Base/Project/Src/Internal/ConditionEvaluators/WindowOpenEvaluator.cs +++ b/src/Main/Base/Project/Src/Internal/ConditionEvaluators/WindowOpenEvaluator.cs @@ -17,7 +17,7 @@ namespace ICSharpCode.SharpDevelop /// "*" to test if any window is open. /// /// - /// <Condition name="WindowOpen" openwindow="ICSharpCode.SharpDevelop.Editor.ITextEditorProvider"> + /// <Condition name="WindowOpen" openwindow="ICSharpCode.SharpDevelop.Editor.ITextEditor"> /// /// /// <Condition name="WindowOpen" openwindow="*"> @@ -30,19 +30,28 @@ namespace ICSharpCode.SharpDevelop 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("WindowActiveCondition: cannot find Type {0}", openWindow); + return false; + } + + if (SD.GetActiveViewContentService(openWindowType) != null) + return true; + + if (openWindow == "*") { return SD.Workbench.ActiveWorkbenchWindow != null; } foreach (IViewContent view in SD.Workbench.ViewContentCollection) { Type currentType = view.GetType(); - if (currentType.ToString() == openwindow) { + if (currentType.ToString() == openWindow) { return true; } foreach (Type i in currentType.GetInterfaces()) { - if (i.ToString() == openwindow) { + if (i.ToString() == openWindow) { return true; } } From b277aa8865e250043e4eea7c3c2a52fa3912a2e4 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 22 Aug 2013 17:50:06 +0200 Subject: [PATCH 04/13] remove remaining traces of ITextEditorProvider and ICodeEditorProvider --- src/AddIns/Analysis/UnitTesting/Pad/UnitTestNode.cs | 2 -- .../XamlBinding/XamlBinding/XamlBinding.addin | 12 +++++++----- .../AvalonEdit.AddIn/AvalonEdit.AddIn.addin | 8 ++++---- src/Main/Base/Project/ICSharpCode.SharpDevelop.addin | 12 ++++++------ .../ConditionEvaluators/WindowOpenEvaluator.cs | 2 +- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/AddIns/Analysis/UnitTesting/Pad/UnitTestNode.cs b/src/AddIns/Analysis/UnitTesting/Pad/UnitTestNode.cs index 6e313c2e87..1d76c7bf17 100644 --- a/src/AddIns/Analysis/UnitTesting/Pad/UnitTestNode.cs +++ b/src/AddIns/Analysis/UnitTesting/Pad/UnitTestNode.cs @@ -15,8 +15,6 @@ namespace ICSharpCode.UnitTesting { public class UnitTestNode : ModelCollectionTreeNode { - protected static readonly IComparer NodeTextComparer = KeyComparer.Create((SharpTreeNode n) => n.Text.ToString(), StringComparer.OrdinalIgnoreCase, StringComparer.OrdinalIgnoreCase); - readonly ITest test; public UnitTestNode(ITest test) diff --git a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlBinding.addin b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlBinding.addin index ff88438cc2..a7594e853d 100644 --- a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlBinding.addin +++ b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlBinding.addin @@ -72,19 +72,20 @@ class = "ICSharpCode.XamlBinding.Options.CodeCompletion" /> + + label="${res:AddIns.XamlBinding.Menu.RemoveUnnecessaryAttributes}" /> - + label="${res:AddIns.XamlBinding.Menu.CreateBusinessFormFromClass}" /> + --> diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin index b8d2d83dbf..dd005cc46d 100755 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin @@ -44,7 +44,7 @@ - + - + - + - + - + - + - + - + - + Date: Fri, 23 Aug 2013 21:04:54 +0200 Subject: [PATCH 05/13] convert ErrorListPad and TaskListPad to WPF --- .../Src/SuppressMessageCommand.cs | 4 +- src/AddIns/Misc/HelpViewer/Source/Commands.cs | 5 +- .../Project/ICSharpCode.SharpDevelop.csproj | 5 +- .../Src/Gui/Pads/ErrorList/ErrorListPad.cs | 83 ++- .../Src/Gui/Pads/TaskList/TaskListPad.cs | 112 ++--- .../Gui/Pads/TaskList/TaskListPadCommands.cs | 32 +- .../Project/Src/Gui/Pads/TaskList/TaskView.cs | 471 ------------------ .../Gui/Pads/TaskList/TaskViewResources.xaml | 48 ++ .../Pads/TaskList/TaskViewResources.xaml.cs | 76 +++ .../Base/Project/Src/Services/Tasks/Task.cs | 45 +- .../ToolBar/ToolBarCheckBox.cs | 3 + 11 files changed, 269 insertions(+), 615 deletions(-) delete mode 100644 src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskView.cs create mode 100644 src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml create mode 100644 src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs diff --git a/src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs b/src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs index d141fbf8dd..429bd174d5 100644 --- a/src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs +++ b/src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs @@ -24,8 +24,8 @@ namespace ICSharpCode.CodeAnalysis { public override void Run() { - TaskView view = (TaskView)Owner; - foreach (SDTask t in view.SelectedTasks.ToList()) { + var view = (System.Windows.Controls.ListView)Owner; + foreach (var t in view.SelectedItems.OfType().ToArray()) { FxCopTaskTag tag = t.Tag as FxCopTaskTag; if (tag == null) continue; diff --git a/src/AddIns/Misc/HelpViewer/Source/Commands.cs b/src/AddIns/Misc/HelpViewer/Source/Commands.cs index 87e2a3a502..8351364055 100644 --- a/src/AddIns/Misc/HelpViewer/Source/Commands.cs +++ b/src/AddIns/Misc/HelpViewer/Source/Commands.cs @@ -20,9 +20,8 @@ namespace MSHelpSystem.Commands { public override void Run() { - ICSharpCode.SharpDevelop.Gui.TaskView view = (TaskView)Owner; - - foreach (var t in view.SelectedTasks.ToArray()) { + var view = (System.Windows.Controls.ListView)Owner; + foreach (var t in view.SelectedItems.OfType().ToArray()) { if (t.BuildError == null) continue; diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 78ac881be1..f5d67f44a9 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -269,6 +269,9 @@ Code + + TaskViewResources.xaml + @@ -789,7 +792,6 @@ - @@ -872,6 +874,7 @@ + {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1} diff --git a/src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs b/src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs index 0b903f9c21..59eeac47d2 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs @@ -2,8 +2,11 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; -using System.Windows.Forms; +using System.Collections.ObjectModel; +using System.Windows; +using System.Windows.Controls; using ICSharpCode.Core; +using ICSharpCode.Core.Presentation; using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.WinForms; using ICSharpCode.SharpDevelop.Workbench; @@ -21,9 +24,10 @@ namespace ICSharpCode.SharpDevelop.Gui } } - ToolStrip toolStrip; - Panel contentPanel = new Panel(); - TaskView taskView = new TaskView() { DefaultContextMenuAddInTreeEntry = ErrorListPad.DefaultContextMenuAddInTreeEntry }; + ToolBar toolBar; + DockPanel contentPanel = new DockPanel(); + ListView errorView = new ListView(); + readonly ObservableCollection errors = new ObservableCollection(); Properties properties; @@ -77,9 +81,6 @@ namespace ICSharpCode.SharpDevelop.Gui instance = this; properties = PropertyService.NestedProperties("ErrorListPad"); - RedrawContent(); - SD.ResourceService.LanguageChanged += delegate { RedrawContent(); }; - TaskService.Cleared += new EventHandler(TaskServiceCleared); TaskService.Added += new TaskEventHandler(TaskServiceAdded); TaskService.Removed += new TaskEventHandler(TaskServiceRemoved); @@ -92,37 +93,40 @@ namespace ICSharpCode.SharpDevelop.Gui SD.ProjectService.SolutionOpened += OnSolutionOpen; SD.ProjectService.SolutionClosed += OnSolutionClosed; - taskView.CreateControl(); - contentPanel.Controls.Add(taskView); + toolBar = ToolBarService.CreateToolBar(contentPanel, this, "/SharpDevelop/Pads/ErrorList/Toolbar"); - toolStrip = SD.WinForms.ToolbarService.CreateToolStrip(this, "/SharpDevelop/Pads/ErrorList/Toolbar"); - toolStrip.Stretch = true; - toolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + contentPanel.Children.Add(toolBar); + 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(errorView, DefaultContextMenuAddInTreeEntry); - contentPanel.Controls.Add(toolStrip); + errors.CollectionChanged += delegate { MenuService.UpdateText(toolBar.Items); }; 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) { - taskView.ClearTasks(); - UpdateToolstripStatus(); + errors.Clear(); } void OnSolutionClosed(object sender, EventArgs e) { - try { - taskView.ClearTasks(); - UpdateToolstripStatus(); - } catch (Exception ex) { - MessageService.ShowException(ex); - } + errors.Clear(); } void ProjectServiceEndBuild(object sender, EventArgs e) @@ -130,7 +134,6 @@ namespace ICSharpCode.SharpDevelop.Gui if (TaskService.TaskCount > 0 && ShowAfterBuild) { SD.Workbench.GetPad(typeof(ErrorListPad)).BringPadToFront(); } - UpdateToolstripStatus(); } public BuildResults BuildResults = null; @@ -157,7 +160,7 @@ namespace ICSharpCode.SharpDevelop.Gui return; } - taskView.AddTask(task); + errors.Add(task); } @@ -165,8 +168,7 @@ namespace ICSharpCode.SharpDevelop.Gui { if (TaskService.InUpdate) return; - taskView.ClearTasks(); - UpdateToolstripStatus(); + errors.Clear(); } void TaskServiceAdded(object sender, TaskEventArgs e) @@ -174,39 +176,22 @@ namespace ICSharpCode.SharpDevelop.Gui if (TaskService.InUpdate) return; AddTask(e.Task); - UpdateToolstripStatus(); } void TaskServiceRemoved(object sender, TaskEventArgs e) { if (TaskService.InUpdate) return; - taskView.RemoveTask(e.Task); - UpdateToolstripStatus(); - } - - void UpdateToolstripStatus() - { - SD.WinForms.ToolbarService.UpdateToolbar(toolStrip); - SD.WinForms.ToolbarService.UpdateToolbarText(toolStrip); + errors.Remove(e.Task); } void InternalShowResults() { - // listView.CreateControl is called in the constructor now. - if (!taskView.IsHandleCreated) { - return; - } - - taskView.BeginUpdate(); - taskView.ClearTasks(); + errors.Clear(); foreach (SDTask task in TaskService.Tasks) { AddTask(task); } - - taskView.EndUpdate(); - UpdateToolstripStatus(); } #region IClipboardHandler interface implementation @@ -214,7 +199,7 @@ namespace ICSharpCode.SharpDevelop.Gui get { return false; } } public bool EnableCopy { - get { return taskView.TaskIsSelected; } + get { return errorView.SelectedItem != null; } } public bool EnablePaste { get { return false; } @@ -232,11 +217,11 @@ namespace ICSharpCode.SharpDevelop.Gui public void Copy() { - taskView.CopySelectionToClipboard(); + TaskViewResources.CopySelectionToClipboard(errorView); } public void SelectAll() { - taskView.SelectAll(); + errorView.SelectAll(); } #endregion } diff --git a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs index f8020eb31c..a7d9986918 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs @@ -2,14 +2,17 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Collections; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Linq; -using System.Windows.Forms; -using ICSharpCode.Core; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using ICSharpCode.Core.Presentation; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop.Editor; -using ICSharpCode.SharpDevelop.Parser; using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.WinForms; using ICSharpCode.SharpDevelop.Workbench; @@ -22,6 +25,7 @@ namespace ICSharpCode.SharpDevelop.Gui static TaskListPad instance; Dictionary displayedTokens; + readonly ObservableCollection tasks; IUnresolvedTypeDefinition oldClass; int selectedScopeIndex = 0; bool isInitialized = false; @@ -30,10 +34,10 @@ namespace ICSharpCode.SharpDevelop.Gui get { return isInitialized; } } - ToolStrip toolStrip; - Panel contentPanel = new Panel(); + ToolBar toolBar; + DockPanel contentPanel = new DockPanel(); - TaskView taskView = new TaskView() { DefaultContextMenuAddInTreeEntry = TaskListPad.DefaultContextMenuAddInTreeEntry }; + ListView taskView = new ListView(); public Dictionary DisplayedTokens { get { return displayedTokens; } @@ -61,18 +65,16 @@ namespace ICSharpCode.SharpDevelop.Gui { instance = this; this.displayedTokens = new Dictionary(); + this.tasks = new ObservableCollection(); - RedrawContent(); - 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); + TaskService.Cleared += TaskServiceCleared; + TaskService.Added += TaskServiceAdded; + TaskService.Removed += TaskServiceRemoved; + TaskService.InUpdateChanged += TaskServiceInUpdateChanged; - SD.Workbench.ActiveViewContentChanged += new EventHandler(WorkbenchActiveViewContentChanged); + SD.Workbench.ActiveViewContentChanged += WorkbenchActiveViewContentChanged; if (SD.Workbench.ActiveViewContent != null) { UpdateItems(); @@ -125,58 +127,58 @@ namespace ICSharpCode.SharpDevelop.Gui UpdateItems(); } - void InitializeToolStrip() + void InitializePadContent() { - taskView.CreateControl(); - - contentPanel.Controls.Add(taskView); - IReadOnlyList tokens = SD.ParserService.TaskListTokens; - foreach (string token in tokens) - { + foreach (string token in tokens) { if (!this.displayedTokens.ContainsKey(token)) { 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) { - toolStrip.Items.Add(new ToolStripSeparator()); - toolStrip.Items.Add(new TaskListTokensToolbarCheckBox(token)); + items.Add(new Separator()); + items.Add(new TaskListTokensToolbarCheckBox(token)); } - toolStrip.Stretch = true; - toolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; - - contentPanel.Controls.Add(toolStrip); + contentPanel.Children.Add(toolBar); + 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); } - void RedrawContent() + void TaskViewMouseDoubleClick(object sender, System.Windows.Input.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() { - this.taskView.BeginUpdate(); - - this.taskView.ClearTasks(); + tasks.Clear(); foreach (SDTask t in TaskService.CommentTasks) { - this.AddItem(t); + AddItem(t); } - - RedrawContent(); - this.taskView.EndUpdate(); } void AddItem(SDTask item) { foreach (KeyValuePair pair in displayedTokens) { - if (item.Description.StartsWith(pair.Key) && pair.Value && IsInScope(item)) - this.taskView.AddTask(item); + if (item.Description.StartsWith(pair.Key, StringComparison.Ordinal) && pair.Value && IsInScope(item)) + tasks.Add(item); } } @@ -189,7 +191,7 @@ namespace ICSharpCode.SharpDevelop.Gui case 0: // Solution if (ProjectService.OpenSolution != null) { - foreach (AbstractProject proj in ProjectService.OpenSolution.Projects) { + foreach (IProject proj in ProjectService.OpenSolution.Projects) { if (proj.FindFile(item.FileName) != null) return true; } @@ -248,47 +250,31 @@ namespace ICSharpCode.SharpDevelop.Gui void OnSolutionOpen(object sender, SolutionEventArgs e) { - taskView.ClearTasks(); + tasks.Clear(); } void OnSolutionClosed(object sender, EventArgs e) { - taskView.ClearTasks(); + tasks.Clear(); } void TaskServiceCleared(object sender, EventArgs e) { - taskView.ClearTasks(); + tasks.Clear(); } void TaskServiceAdded(object sender, TaskEventArgs e) { - this.taskView.BeginUpdate(); - if (e.Task.TaskType == TaskType.Comment) { AddItem(e.Task); } - - RedrawContent(); - - this.taskView.EndUpdate(); } void TaskServiceRemoved(object sender, TaskEventArgs e) { - this.taskView.BeginUpdate(); - if (e.Task.TaskType == TaskType.Comment) { - foreach (ListViewItem item in this.taskView.Items) { - if (item.Tag == e.Task) { - this.taskView.Items.Remove(item); - break; - } - } + tasks.Remove(e.Task); } - - RedrawContent(); - this.taskView.EndUpdate(); } #region IClipboardHandler interface implementation @@ -296,7 +282,7 @@ namespace ICSharpCode.SharpDevelop.Gui get { return false; } } public bool EnableCopy { - get { return taskView.TaskIsSelected; } + get { return taskView.SelectedItem != null; } } public bool EnablePaste { get { return false; } @@ -314,7 +300,7 @@ namespace ICSharpCode.SharpDevelop.Gui public void Copy() { - taskView.CopySelectionToClipboard(); + TaskViewResources.CopySelectionToClipboard(taskView); } public void SelectAll() { diff --git a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPadCommands.cs b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPadCommands.cs index 36192531b4..ece595110a 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPadCommands.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPadCommands.cs @@ -3,6 +3,7 @@ using System; using System.Windows.Forms; +using ICSharpCode.Core; namespace ICSharpCode.SharpDevelop.Gui { @@ -31,24 +32,37 @@ namespace ICSharpCode.SharpDevelop.Gui } } - sealed class TaskListTokensToolbarCheckBox : ToolStripButton + sealed class TaskListTokensToolbarCheckBox : CheckBox, ICheckableMenuCommand { + public event EventHandler IsCheckedChanged = delegate {}; + + public event EventHandler CanExecuteChanged { add {} remove {} } + readonly string token; public TaskListTokensToolbarCheckBox(string token) - : base(token) { this.token = token; - this.CheckOnClick = true; - this.Checked = true; + this.Text = token; + } + + public bool 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); - TaskListPad.Instance.DisplayedTokens[token] = this.Checked; - if (TaskListPad.Instance.IsInitialized) - TaskListPad.Instance.UpdateItems(); + var pad = (TaskListPad)parameter; + pad.DisplayedTokens[token] = this.Checked; + if (pad.IsInitialized) + pad.UpdateItems(); } } } diff --git a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskView.cs b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskView.cs deleted file mode 100644 index 190cc32290..0000000000 --- a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskView.cs +++ /dev/null @@ -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 - } - - /// - /// Description of TaskView. - /// - 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 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); - } - - /// - /// Removes new lines, carriage returns and tab characters from - /// the list view task description and replaces them with a space. - /// - /// The task list description. - /// A formatted task list description. - 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 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; - - /// - /// Applies the specified sort request by creating, - /// configuring, and installing a - /// . - /// - 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; - - /// - /// Custom for TaskView. - /// - 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 - - /// - /// The meat of this IComparer class; intelligently compares - /// two TaskView ListItems. - /// - /// - /// A signed integer indicating the relative sort ranking - /// of item relative to item - /// . - /// Return value greater than zero: x > y. - /// Return value is zero: x == y. - /// Return value is less than zero: x < y. - /// - 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 - } -} diff --git a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml new file mode 100644 index 0000000000..29182e56ec --- /dev/null +++ b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml @@ -0,0 +1,48 @@ + + + \ No newline at end of file diff --git a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs new file mode 100644 index 0000000000..e37f4b0eff --- /dev/null +++ b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs @@ -0,0 +1,76 @@ +// 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; +using System.Windows.Media; + +namespace ICSharpCode.SharpDevelop.Gui +{ + /// + /// Description of TaskViewResources. + /// + 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 }; + } else { + target.ToolTip = null; + } + } + + void ListViewSizeChanged(object sender, SizeChangedEventArgs e) + { + ListView target = sender as ListView; + if (target == null) return; + GridView view = target.View as GridView; + if (view == null) return; + view.Columns[0].Width = 35; + view.Columns[1].Width = 50; + double w = target.ActualWidth - view.Columns[0].Width - view.Columns[1].Width; + view.Columns[3].Width = w * 15 / 100; + view.Columns[4].Width = w * 15 / 100; + view.Columns[2].Width = w - view.Columns[3].Width - view.Columns[4].Width - 30; + } + + 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()); + } + } +} diff --git a/src/Main/Base/Project/Src/Services/Tasks/Task.cs b/src/Main/Base/Project/Src/Services/Tasks/Task.cs index b988b7235d..96b04d77bf 100644 --- a/src/Main/Base/Project/Src/Services/Tasks/Task.cs +++ b/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) using System; +using System.Windows.Media; using ICSharpCode.Core; +using ICSharpCode.Core.Presentation; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Project; @@ -26,8 +28,6 @@ namespace ICSharpCode.SharpDevelop TaskType type; PermanentAnchor position; bool hasLocation; - string contextMenuAddInTreeEntry; - object tag; 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 { get { return type; } } - public string ContextMenuAddInTreeEntry { + public ImageSource TaskTypeImage { get { - return contextMenuAddInTreeEntry; - } - set { - contextMenuAddInTreeEntry = value; + switch (type) { + case TaskType.Error: + return PresentationResourceService.GetBitmapSource("Icons.16x16.Error"); + 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 { - get { - return tag; - } - set { - tag = value; - } - } + public string ContextMenuAddInTreeEntry { get; set; } + + public object Tag { get; set; } /// /// Contains a reference to the build error. @@ -151,9 +162,9 @@ namespace ICSharpCode.SharpDevelop description = error.ErrorText + " (" + error.ErrorCode + ")"; } if (error.ContextMenuAddInTreeEntry != null) { - contextMenuAddInTreeEntry = error.ContextMenuAddInTreeEntry; + ContextMenuAddInTreeEntry = error.ContextMenuAddInTreeEntry; } - tag = error.Tag; + this.Tag = error.Tag; this.BuildError = error; } diff --git a/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarCheckBox.cs b/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarCheckBox.cs index 9f4724f927..054dcff01a 100644 --- a/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarCheckBox.cs +++ b/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarCheckBox.cs @@ -46,6 +46,9 @@ namespace ICSharpCode.Core.Presentation if (codon.Properties.Contains("tooltip")) { this.ToolTip = StringParser.Parse(codon.Properties["tooltip"]); } + if (codon.Properties.Contains("label")) { + this.Content = ToolBarService.CreateToolBarItemContent(codon); + } } public void UpdateStatus() From b4df154db26e08d22e3b0f7a825c663c725c9e4b Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 24 Aug 2013 09:58:34 +0200 Subject: [PATCH 06/13] clean up TaskListPad code --- .../Src/SuppressMessageCommand.cs | 6 ---- src/AddIns/Misc/HelpViewer/Source/Commands.cs | 3 -- .../Src/Gui/Pads/ErrorList/ErrorListPad.cs | 10 +++--- .../Src/Gui/Pads/TaskList/TaskListPad.cs | 9 +++-- .../Gui/Pads/TaskList/TaskListPadCommands.cs | 35 +++++++++---------- .../Pads/TaskList/TaskViewResources.xaml.cs | 4 --- 6 files changed, 26 insertions(+), 41 deletions(-) diff --git a/src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs b/src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs index 429bd174d5..e24b6a98a7 100644 --- a/src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs +++ b/src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs @@ -3,19 +3,13 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; -using System.Text; -using System.Windows.Documents; using ICSharpCode.Core; -using ICSharpCode.NRefactory; using ICSharpCode.NRefactory.Semantics; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem.Implementation; using ICSharpCode.SharpDevelop; -using ICSharpCode.SharpDevelop.Editor; -using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Refactoring; namespace ICSharpCode.CodeAnalysis diff --git a/src/AddIns/Misc/HelpViewer/Source/Commands.cs b/src/AddIns/Misc/HelpViewer/Source/Commands.cs index 8351364055..03b7e8dca0 100644 --- a/src/AddIns/Misc/HelpViewer/Source/Commands.cs +++ b/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) using System; -using System.Collections.Generic; using System.Diagnostics; -using System.Globalization; using System.IO; using System.Linq; using Microsoft.Win32; @@ -12,7 +10,6 @@ using MSHelpSystem.Core; using MSHelpSystem.Controls; using ICSharpCode.Core; using ICSharpCode.SharpDevelop; -using ICSharpCode.SharpDevelop.Gui; namespace MSHelpSystem.Commands { diff --git a/src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs b/src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs index 59eeac47d2..38737f6a11 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs @@ -3,6 +3,7 @@ using System; using System.Collections.ObjectModel; +using System.Linq; using System.Windows; using System.Windows.Controls; using ICSharpCode.Core; @@ -27,7 +28,7 @@ namespace ICSharpCode.SharpDevelop.Gui ToolBar toolBar; DockPanel contentPanel = new DockPanel(); ListView errorView = new ListView(); - readonly ObservableCollection errors = new ObservableCollection(); + readonly ObservableCollection errors; Properties properties; @@ -81,9 +82,9 @@ namespace ICSharpCode.SharpDevelop.Gui instance = this; properties = PropertyService.NestedProperties("ErrorListPad"); - TaskService.Cleared += new EventHandler(TaskServiceCleared); - TaskService.Added += new TaskEventHandler(TaskServiceAdded); - TaskService.Removed += new TaskEventHandler(TaskServiceRemoved); + TaskService.Cleared += TaskServiceCleared; + TaskService.Added += TaskServiceAdded; + TaskService.Removed += TaskServiceRemoved; TaskService.InUpdateChanged += delegate { if (!TaskService.InUpdate) InternalShowResults(); @@ -92,6 +93,7 @@ namespace ICSharpCode.SharpDevelop.Gui SD.BuildService.BuildFinished += ProjectServiceEndBuild; SD.ProjectService.SolutionOpened += OnSolutionOpen; SD.ProjectService.SolutionClosed += OnSolutionClosed; + errors = new ObservableCollection(TaskService.Tasks.Where(t => t.TaskType != TaskType.Comment)); toolBar = ToolBarService.CreateToolBar(contentPanel, this, "/SharpDevelop/Pads/ErrorList/Toolbar"); diff --git a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs index a7d9986918..de33353b80 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs @@ -7,7 +7,6 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; -using System.Text; using System.Windows; using System.Windows.Controls; using ICSharpCode.Core.Presentation; @@ -65,15 +64,15 @@ namespace ICSharpCode.SharpDevelop.Gui { instance = this; this.displayedTokens = new Dictionary(); - this.tasks = new ObservableCollection(); - - InitializePadContent(); - TaskService.Cleared += TaskServiceCleared; TaskService.Added += TaskServiceAdded; TaskService.Removed += TaskServiceRemoved; TaskService.InUpdateChanged += TaskServiceInUpdateChanged; + this.tasks = new ObservableCollection(TaskService.CommentTasks); + + InitializePadContent(); + SD.Workbench.ActiveViewContentChanged += WorkbenchActiveViewContentChanged; if (SD.Workbench.ActiveViewContent != null) { diff --git a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPadCommands.cs b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPadCommands.cs index ece595110a..b9684a1e7f 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPadCommands.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPadCommands.cs @@ -2,51 +2,48 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; -using System.Windows.Forms; +using System.Windows; +using System.Windows.Controls; using ICSharpCode.Core; 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"}; + static readonly string[] viewTypes = new string[] {"Solution", "Project", "All open documents", "Document", "Namespace", "Class/Module"}; public SelectScopeComboBox() { - SetItems(); + this.ItemsSource = viewTypes; 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) { TaskListPad.Instance.SelectedScopeIndex = this.SelectedIndex; } } - - void SetItems() - { - this.Items.Clear(); - this.Items.AddRange(viewTypes); - } } sealed class TaskListTokensToolbarCheckBox : CheckBox, ICheckableMenuCommand { - public event EventHandler IsCheckedChanged = delegate {}; - - public event EventHandler CanExecuteChanged { add {} remove {} } - + event EventHandler ICheckableMenuCommand.IsCheckedChanged { add {} remove {} } + event EventHandler System.Windows.Input.ICommand.CanExecuteChanged { add {} remove {} } readonly string token; public TaskListTokensToolbarCheckBox(string token) { this.token = token; - this.Text = token; + this.Content = token; + this.Command = this; + this.CommandParameter = TaskListPad.Instance; + this.IsChecked = TaskListPad.Instance.DisplayedTokens[token]; + SetResourceReference(FrameworkElement.StyleProperty, ToolBar.CheckBoxStyleKey); } - public bool IsChecked(object parameter) + bool ICheckableMenuCommand.IsChecked(object parameter) { var pad = (TaskListPad)parameter; return pad.DisplayedTokens[token]; @@ -60,7 +57,7 @@ namespace ICSharpCode.SharpDevelop.Gui public void Execute(object parameter) { var pad = (TaskListPad)parameter; - pad.DisplayedTokens[token] = this.Checked; + pad.DisplayedTokens[token] = IsChecked == true; if (pad.IsInitialized) pad.UpdateItems(); } diff --git a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs index e37f4b0eff..4b35c6f35f 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs @@ -6,13 +6,9 @@ using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; -using System.Windows.Media; namespace ICSharpCode.SharpDevelop.Gui { - /// - /// Description of TaskViewResources. - /// public partial class TaskViewResources : ResourceDictionary { public TaskViewResources() From 71c7f52105b2e7009b7495e10a08aac0e1735c16 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 24 Aug 2013 17:34:35 +0200 Subject: [PATCH 07/13] fix text in scope ComboBox --- src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs | 2 +- src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs | 4 ++-- .../Base/Project/Src/Gui/Pads/TaskList/TaskListPadCommands.cs | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs b/src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs index 38737f6a11..b06341c021 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs @@ -103,7 +103,7 @@ namespace ICSharpCode.SharpDevelop.Gui errorView.ItemsSource = errors; errorView.MouseDoubleClick += ErrorViewMouseDoubleClick; errorView.Style = (Style)new TaskViewResources()["TaskListView"]; - errorView.ContextMenu = MenuService.CreateContextMenu(errorView, DefaultContextMenuAddInTreeEntry); + errorView.ContextMenu = MenuService.CreateContextMenu(this, DefaultContextMenuAddInTreeEntry); errors.CollectionChanged += delegate { MenuService.UpdateText(toolBar.Items); }; diff --git a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs index de33353b80..59a12beefa 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs @@ -200,10 +200,10 @@ namespace ICSharpCode.SharpDevelop.Gui // Project return ProjectService.CurrentProject != null && ProjectService.CurrentProject.FindFile(item.FileName) != null; case 2: - // All open documents + // All open files return SD.Workbench.ViewContentCollection.Select(vc => vc.GetService()).Any(editor => editor != null && item.FileName == editor.FileName); case 3: - // Document + // File return SD.Workbench.ActiveViewContent != null && SD.Workbench.ActiveViewContent.PrimaryFileName == item.FileName; case 4: // Namespace diff --git a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPadCommands.cs b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPadCommands.cs index b9684a1e7f..827f7e05a8 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPadCommands.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPadCommands.cs @@ -10,7 +10,8 @@ namespace ICSharpCode.SharpDevelop.Gui { public class SelectScopeComboBox : ComboBox { - static readonly 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() { From 0a6a63e58e26f43272e198a1e0d38237cd162980 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 24 Aug 2013 18:01:07 +0200 Subject: [PATCH 08/13] reimplement Copy and SelectAll commands --- .../Src/Gui/Pads/ErrorList/ErrorListPad.cs | 40 +++++++---------- .../Src/Gui/Pads/TaskList/TaskListPad.cs | 44 ++++++++----------- 2 files changed, 34 insertions(+), 50 deletions(-) diff --git a/src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs b/src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs index b06341c021..77b87c6eab 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs @@ -6,15 +6,15 @@ using System.Collections.ObjectModel; using System.Linq; using System.Windows; using System.Windows.Controls; +using System.Windows.Input; using ICSharpCode.Core; using ICSharpCode.Core.Presentation; using ICSharpCode.SharpDevelop.Project; -using ICSharpCode.SharpDevelop.WinForms; using ICSharpCode.SharpDevelop.Workbench; namespace ICSharpCode.SharpDevelop.Gui { - public class ErrorListPad : AbstractPadContent, IClipboardHandler + public class ErrorListPad : AbstractPadContent { public const string DefaultContextMenuAddInTreeEntry = "/SharpDevelop/Pads/ErrorList/TaskContextMenu"; @@ -105,6 +105,9 @@ namespace ICSharpCode.SharpDevelop.Gui errorView.Style = (Style)new TaskViewResources()["TaskListView"]; errorView.ContextMenu = MenuService.CreateContextMenu(this, DefaultContextMenuAddInTreeEntry); + errorView.CommandBindings.Add(new CommandBinding(ApplicationCommands.Copy, ExecuteCopy, CanExecuteCopy)); + errorView.CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, ExecuteSelectAll, CanExecuteSelectAll)); + errors.CollectionChanged += delegate { MenuService.UpdateText(toolBar.Items); }; InternalShowResults(); @@ -196,35 +199,24 @@ namespace ICSharpCode.SharpDevelop.Gui } } - #region IClipboardHandler interface implementation - public bool EnableCut { - get { return false; } - } - public bool EnableCopy { - get { return errorView.SelectedItem != null; } - } - public bool EnablePaste { - get { return false; } - } - public bool EnableDelete { - get { return false; } - } - public bool EnableSelectAll { - get { return true; } + void CanExecuteCopy(object sender, CanExecuteRoutedEventArgs e) + { + e.CanExecute = errorView.SelectedItem != null; } - public void Cut() {} - public void Paste() {} - public void Delete() {} - - public void Copy() + void ExecuteCopy(object sender, ExecutedRoutedEventArgs e) { TaskViewResources.CopySelectionToClipboard(errorView); } - public void SelectAll() + + void CanExecuteSelectAll(object sender, CanExecuteRoutedEventArgs e) + { + e.CanExecute = true; + } + + void ExecuteSelectAll(object sender, ExecutedRoutedEventArgs e) { errorView.SelectAll(); } - #endregion } } diff --git a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs index 59a12beefa..5ec5690716 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs @@ -9,16 +9,16 @@ using System.Linq; using System.Windows; using System.Windows.Controls; +using System.Windows.Input; using ICSharpCode.Core.Presentation; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Project; -using ICSharpCode.SharpDevelop.WinForms; using ICSharpCode.SharpDevelop.Workbench; namespace ICSharpCode.SharpDevelop.Gui { - public class TaskListPad : AbstractPadContent, IClipboardHandler + public class TaskListPad : AbstractPadContent { public const string DefaultContextMenuAddInTreeEntry = "/SharpDevelop/Pads/TaskList/TaskContextMenu"; @@ -27,7 +27,7 @@ namespace ICSharpCode.SharpDevelop.Gui readonly ObservableCollection tasks; IUnresolvedTypeDefinition oldClass; int selectedScopeIndex = 0; - bool isInitialized = false; + bool isInitialized; public bool IsInitialized { get { return isInitialized; } @@ -151,9 +151,12 @@ namespace ICSharpCode.SharpDevelop.Gui taskView.MouseDoubleClick += TaskViewMouseDoubleClick; taskView.Style = (Style)new TaskViewResources()["TaskListView"]; taskView.ContextMenu = MenuService.CreateContextMenu(taskView, DefaultContextMenuAddInTreeEntry); + + taskView.CommandBindings.Add(new CommandBinding(ApplicationCommands.Copy, ExecuteCopy, CanExecuteCopy)); + taskView.CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, ExecuteSelectAll, CanExecuteSelectAll)); } - void TaskViewMouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) + void TaskViewMouseDoubleClick(object sender, MouseButtonEventArgs e) { SDTask task = taskView.SelectedItem as SDTask; var item = taskView.ItemContainerGenerator.ContainerFromItem(task) as ListViewItem; @@ -276,36 +279,25 @@ namespace ICSharpCode.SharpDevelop.Gui } } - #region IClipboardHandler interface implementation - public bool EnableCut { - get { return false; } - } - public bool EnableCopy { - get { return taskView.SelectedItem != null; } - } - public bool EnablePaste { - get { return false; } - } - public bool EnableDelete { - get { return false; } - } - public bool EnableSelectAll { - get { return true; } + void CanExecuteCopy(object sender, CanExecuteRoutedEventArgs e) + { + e.CanExecute = taskView.SelectedItem != null; } - public void Cut() {} - public void Paste() {} - public void Delete() {} - - public void Copy() + void ExecuteCopy(object sender, ExecutedRoutedEventArgs e) { TaskViewResources.CopySelectionToClipboard(taskView); } - public void SelectAll() + + void CanExecuteSelectAll(object sender, CanExecuteRoutedEventArgs e) + { + e.CanExecute = true; + } + + void ExecuteSelectAll(object sender, ExecutedRoutedEventArgs e) { taskView.SelectAll(); } - #endregion } } From 91dc59fd7e4801669130253c5ac358245da37678 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 24 Aug 2013 21:56:41 +0200 Subject: [PATCH 09/13] don't crash if Pad is collapsed or too small --- .../Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs index 4b35c6f35f..d9cb148759 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs @@ -36,7 +36,7 @@ namespace ICSharpCode.SharpDevelop.Gui void ListViewSizeChanged(object sender, SizeChangedEventArgs e) { ListView target = sender as ListView; - if (target == null) return; + if (target == null || target.ActualWidth < 115.0) return; GridView view = target.View as GridView; if (view == null) return; view.Columns[0].Width = 35; From a8edb951b3b4cf53b89c119a734304e9866e1d4e Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 25 Aug 2013 16:34:25 +0200 Subject: [PATCH 10/13] implement GridViewColumnAutoSize --- .../Gui/Pads/TaskList/TaskViewResources.xaml | 2 +- .../Pads/TaskList/TaskViewResources.xaml.cs | 16 +---- .../GridViewColumnAutoSize.cs | 72 +++++++++++++++++++ .../ICSharpCode.Core.Presentation.csproj | 1 + 4 files changed, 75 insertions(+), 16 deletions(-) create mode 100644 src/Main/ICSharpCode.Core.Presentation/GridViewColumnAutoSize.cs diff --git a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml index 29182e56ec..1bbb32aa7a 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml +++ b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml @@ -5,7 +5,7 @@ xmlns:local="clr-namespace:ICSharpCode.SharpDevelop.Gui"> - + @@ -63,7 +63,7 @@ - + @@ -77,7 +77,7 @@ - + @@ -105,7 +105,7 @@ - + @@ -114,7 +114,7 @@ - + diff --git a/src/AddIns/Debugger/Debugger.AddIn/Pads/LoadedModulesPad.cs b/src/AddIns/Debugger/Debugger.AddIn/Pads/LoadedModulesPad.cs index e23452a138..068e7c8389 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Pads/LoadedModulesPad.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/Pads/LoadedModulesPad.cs @@ -10,6 +10,7 @@ using System.Windows.Controls; using System.Windows.Data; using Debugger; +using ICSharpCode.Core.Presentation; using Debugger.AddIn.Pads.Controls; using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Services; @@ -32,6 +33,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads listView = new ListView(); listView.View = (GridView)res["loadedModulesGridView"]; + listView.SetValue(GridViewColumnAutoSize.AutoWidthProperty, "50%;70;50%;35;120"); WindowsDebugger.RefreshingPads += RefreshPad; RefreshPad(); diff --git a/src/AddIns/Debugger/Debugger.AddIn/Pads/LocalVarPad.cs b/src/AddIns/Debugger/Debugger.AddIn/Pads/LocalVarPad.cs index 6d98481174..461b599cb9 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Pads/LocalVarPad.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/Pads/LocalVarPad.cs @@ -32,11 +32,12 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads var res = new CommonResources(); res.InitializeComponent(); - this.tree = new SharpTreeView(); - this.tree.Root = new SharpTreeNode(); - this.tree.ShowRoot = false; - this.tree.View = (GridView)res["variableGridView"]; - this.tree.ItemContainerStyle = (Style)res["itemContainerStyle"]; + tree = new SharpTreeView(); + tree.Root = new SharpTreeNode(); + tree.ShowRoot = false; + tree.View = (GridView)res["variableGridView"]; + tree.ItemContainerStyle = (Style)res["itemContainerStyle"]; + tree.SetValue(GridViewColumnAutoSize.AutoWidthProperty, "50%;25%;25%"); WindowsDebugger.RefreshingPads += RefreshPad; RefreshPad(); diff --git a/src/AddIns/Debugger/Debugger.AddIn/Pads/ThreadsPad.cs b/src/AddIns/Debugger/Debugger.AddIn/Pads/ThreadsPad.cs index 6fed5909b2..ec616f680d 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Pads/ThreadsPad.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/Pads/ThreadsPad.cs @@ -10,6 +10,7 @@ using System.Windows.Input; using Debugger; using ICSharpCode.Core; +using ICSharpCode.Core.Presentation; using ICSharpCode.SharpDevelop.Services; using ICSharpCode.SharpDevelop.Workbench; using Thread = Debugger.Thread; @@ -33,9 +34,10 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads contextMenu.Opened += FillContextMenuStrip; listView = new ListView(); - listView.View = (GridView)res["theadsGridView"]; + listView.View = (GridView)res["threadsGridView"]; listView.ContextMenu = contextMenu; listView.MouseDoubleClick += listView_MouseDoubleClick; + listView.SetValue(GridViewColumnAutoSize.AutoWidthProperty, "70;100%;75;75"); WindowsDebugger.RefreshingPads += RefreshPad; RefreshPad(); From 623cc269fa33f01e10f1f66ae0887e29eb546f00 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Mon, 26 Aug 2013 18:26:07 +0200 Subject: [PATCH 12/13] add documentation to GridViewColumnAutoSize and correct position of tooltip for partly visible cells in TaskView --- .../Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs | 8 +++++++- .../GridViewColumnAutoSize.cs | 8 ++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs index 40a948bd6d..55a4d9dc27 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs @@ -27,7 +27,13 @@ namespace ICSharpCode.SharpDevelop.Gui 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 }; + 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; } diff --git a/src/Main/ICSharpCode.Core.Presentation/GridViewColumnAutoSize.cs b/src/Main/ICSharpCode.Core.Presentation/GridViewColumnAutoSize.cs index 543d548e6b..4898eb83eb 100644 --- a/src/Main/ICSharpCode.Core.Presentation/GridViewColumnAutoSize.cs +++ b/src/Main/ICSharpCode.Core.Presentation/GridViewColumnAutoSize.cs @@ -9,6 +9,14 @@ using System.Windows.Controls; namespace ICSharpCode.Core.Presentation { + /// + /// 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 + /// public class GridViewColumnAutoSize { public static readonly DependencyProperty AutoWidthProperty = From 8d5347a9341ffd9f4b493c1f33806dfa5b90e6f0 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Mon, 26 Aug 2013 18:35:38 +0200 Subject: [PATCH 13/13] fix missing debugger commands --- src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.addin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.addin b/src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.addin index ce4ae66e32..11ec565dd9 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.addin +++ b/src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.addin @@ -32,13 +32,13 @@ insertbefore = "Refactoring" label = "${res:MainWindow.Windows.Debug.SetCurrentStatement}" icon = "Icons.16x16.Debug.StepInto" - class = "ICSharpCode.SharpDevelop.Services.SetCurrentStatementCommand"/> + class = "Debugger.AddIn.SetCurrentStatementCommand"/> + class = "Debugger.AddIn.RunToCursorCommand"/>