diff --git a/src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs b/src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs index d141fbf8dd..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 @@ -24,8 +18,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/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 240e87af6d..a03691c85a 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/Debugger/Debugger.AddIn/Debugger.AddIn.addin b/src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.addin index 3e0f0d2e62..5208464bd6 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"/> diff --git a/src/AddIns/Debugger/Debugger.AddIn/Pads/BreakPointsPad.cs b/src/AddIns/Debugger/Debugger.AddIn/Pads/BreakPointsPad.cs index 29f6ea4ec1..1000f5b05e 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Pads/BreakPointsPad.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/Pads/BreakPointsPad.cs @@ -22,6 +22,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads grid.Children.Add(toolbar); this.control.listView.View = (GridView)res["breakpointsGridView"]; + this.control.listView.SetValue(GridViewColumnAutoSize.AutoWidthProperty, "35;50%;50%"); } protected override bool ShowBookmarkInThisPad(SDBookmark mark) diff --git a/src/AddIns/Debugger/Debugger.AddIn/Pads/CallStackPad.cs b/src/AddIns/Debugger/Debugger.AddIn/Pads/CallStackPad.cs index 244d34415f..36911458d4 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Pads/CallStackPad.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/Pads/CallStackPad.cs @@ -11,6 +11,7 @@ using System.Windows.Input; using System.Windows.Media; using Debugger; +using ICSharpCode.Core.Presentation; using Debugger.AddIn.TreeModel; using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Services; @@ -34,6 +35,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads listView = new ListView(); listView.View = (GridView)res["callstackGridView"]; listView.MouseDoubleClick += listView_MouseDoubleClick; + listView.SetValue(GridViewColumnAutoSize.AutoWidthProperty, "100%"); listView.ContextMenu = CreateMenu(); diff --git a/src/AddIns/Debugger/Debugger.AddIn/Pads/CommonResources.xaml b/src/AddIns/Debugger/Debugger.AddIn/Pads/CommonResources.xaml index 874def159d..53441f0761 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Pads/CommonResources.xaml +++ b/src/AddIns/Debugger/Debugger.AddIn/Pads/CommonResources.xaml @@ -33,7 +33,7 @@ - + @@ -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(); 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() { 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 @@ - + - + - + ().ToArray()) { if (t.BuildError == null) continue; diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin index cdd9bf4c90..1373a70e39 100755 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin @@ -1561,7 +1561,7 @@ type = "Item" command = "Delete"/> - + - + - + - + - + - + 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..77b87c6eab 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs +++ b/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) 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.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"; @@ -21,9 +25,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; Properties properties; @@ -77,12 +82,9 @@ 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); + TaskService.Cleared += TaskServiceCleared; + TaskService.Added += TaskServiceAdded; + TaskService.Removed += TaskServiceRemoved; TaskService.InUpdateChanged += delegate { if (!TaskService.InUpdate) InternalShowResults(); @@ -91,38 +93,45 @@ 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"); - taskView.CreateControl(); - contentPanel.Controls.Add(taskView); + 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(this, DefaultContextMenuAddInTreeEntry); - toolStrip = SD.WinForms.ToolbarService.CreateToolStrip(this, "/SharpDevelop/Pads/ErrorList/Toolbar"); - toolStrip.Stretch = true; - toolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + errorView.CommandBindings.Add(new CommandBinding(ApplicationCommands.Copy, ExecuteCopy, CanExecuteCopy)); + errorView.CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, ExecuteSelectAll, CanExecuteSelectAll)); - 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 +139,6 @@ namespace ICSharpCode.SharpDevelop.Gui if (TaskService.TaskCount > 0 && ShowAfterBuild) { SD.Workbench.GetPad(typeof(ErrorListPad)).BringPadToFront(); } - UpdateToolstripStatus(); } public BuildResults BuildResults = null; @@ -157,7 +165,7 @@ namespace ICSharpCode.SharpDevelop.Gui return; } - taskView.AddTask(task); + errors.Add(task); } @@ -165,8 +173,7 @@ namespace ICSharpCode.SharpDevelop.Gui { if (TaskService.InUpdate) return; - taskView.ClearTasks(); - UpdateToolstripStatus(); + errors.Clear(); } void TaskServiceAdded(object sender, TaskEventArgs e) @@ -174,70 +181,42 @@ 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 - public bool EnableCut { - get { return false; } - } - 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; } + void CanExecuteCopy(object sender, CanExecuteRoutedEventArgs e) + { + e.CanExecute = errorView.SelectedItem != null; } - public void Cut() {} - public void Paste() {} - public void Delete() {} + void ExecuteCopy(object sender, ExecutedRoutedEventArgs e) + { + 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 } } 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..5ec5690716 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs +++ b/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) 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.Windows; +using System.Windows.Controls; +using System.Windows.Input; +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; namespace ICSharpCode.SharpDevelop.Gui { - public class TaskListPad : AbstractPadContent, IClipboardHandler + public class TaskListPad : AbstractPadContent { public const string DefaultContextMenuAddInTreeEntry = "/SharpDevelop/Pads/TaskList/TaskContextMenu"; static TaskListPad instance; Dictionary displayedTokens; + readonly ObservableCollection tasks; IUnresolvedTypeDefinition oldClass; int selectedScopeIndex = 0; - bool isInitialized = false; + bool isInitialized; public bool IsInitialized { 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 +64,16 @@ namespace ICSharpCode.SharpDevelop.Gui { instance = this; this.displayedTokens = new Dictionary(); + TaskService.Cleared += TaskServiceCleared; + TaskService.Added += TaskServiceAdded; + TaskService.Removed += TaskServiceRemoved; + TaskService.InUpdateChanged += TaskServiceInUpdateChanged; - RedrawContent(); - SD.ResourceService.LanguageChanged += delegate { RedrawContent(); }; + this.tasks = new ObservableCollection(TaskService.CommentTasks); - InitializeToolStrip(); - - TaskService.Cleared += new EventHandler(TaskServiceCleared); - TaskService.Added += new TaskEventHandler(TaskServiceAdded); - TaskService.Removed += new TaskEventHandler(TaskServiceRemoved); - TaskService.InUpdateChanged += new EventHandler(TaskServiceInUpdateChanged); + InitializePadContent(); - SD.Workbench.ActiveViewContentChanged += new EventHandler(WorkbenchActiveViewContentChanged); + SD.Workbench.ActiveViewContentChanged += WorkbenchActiveViewContentChanged; if (SD.Workbench.ActiveViewContent != null) { UpdateItems(); @@ -125,58 +126,61 @@ 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.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); - 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() { - 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 +193,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; } @@ -199,10 +203,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 @@ -248,79 +252,52 @@ 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 - public bool EnableCut { - get { return false; } - } - 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; } + void CanExecuteCopy(object sender, CanExecuteRoutedEventArgs e) + { + e.CanExecute = taskView.SelectedItem != null; } - public void Cut() {} - public void Paste() {} - public void Delete() {} + void ExecuteCopy(object sender, ExecutedRoutedEventArgs e) + { + 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(); } - #endregion } } 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..827f7e05a8 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPadCommands.cs +++ b/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) 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"}; + // TODO Translate! + static readonly string[] viewTypes = new string[] {"Solution", "Project", "All open files", "File", "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 : ToolStripButton + sealed class TaskListTokensToolbarCheckBox : CheckBox, ICheckableMenuCommand { + event EventHandler ICheckableMenuCommand.IsCheckedChanged { add {} remove {} } + event EventHandler System.Windows.Input.ICommand.CanExecuteChanged { add {} remove {} } readonly string token; public TaskListTokensToolbarCheckBox(string token) - : base(token) { this.token = token; - this.CheckOnClick = true; - this.Checked = true; + this.Content = token; + 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); - TaskListPad.Instance.DisplayedTokens[token] = this.Checked; - if (TaskListPad.Instance.IsInitialized) - TaskListPad.Instance.UpdateItems(); + var pad = (TaskListPad)parameter; + pad.DisplayedTokens[token] = IsChecked == true; + 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..1bbb32aa7a --- /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..55a4d9dc27 --- /dev/null +++ b/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()); + } + } +} 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; diff --git a/src/Main/Base/Project/Src/Internal/ConditionEvaluators/WindowOpenEvaluator.cs b/src/Main/Base/Project/Src/Internal/ConditionEvaluators/WindowOpenEvaluator.cs index 890a10cad9..6905f6d798 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("WindowOpenCondition: 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; } } 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/GridViewColumnAutoSize.cs b/src/Main/ICSharpCode.Core.Presentation/GridViewColumnAutoSize.cs new file mode 100644 index 0000000000..4898eb83eb --- /dev/null +++ b/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 +{ + /// + /// 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 = + 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> percentages = new Dictionary>(); + 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); + } + } + } +} diff --git a/src/Main/ICSharpCode.Core.Presentation/ICSharpCode.Core.Presentation.csproj b/src/Main/ICSharpCode.Core.Presentation/ICSharpCode.Core.Presentation.csproj index b49b89d88b..86e767f4f7 100644 --- a/src/Main/ICSharpCode.Core.Presentation/ICSharpCode.Core.Presentation.csproj +++ b/src/Main/ICSharpCode.Core.Presentation/ICSharpCode.Core.Presentation.csproj @@ -72,6 +72,7 @@ Properties\GlobalAssemblyInfo.cs + 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()