Browse Source

convert ErrorListPad and TaskListPad to WPF

pull/59/merge
Siegfried Pammer 12 years ago
parent
commit
21ec3eaf0b
  1. 4
      src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs
  2. 5
      src/AddIns/Misc/HelpViewer/Source/Commands.cs
  3. 5
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  4. 83
      src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs
  5. 112
      src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPad.cs
  6. 32
      src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskListPadCommands.cs
  7. 471
      src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskView.cs
  8. 48
      src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml
  9. 76
      src/Main/Base/Project/Src/Gui/Pads/TaskList/TaskViewResources.xaml.cs
  10. 45
      src/Main/Base/Project/Src/Services/Tasks/Task.cs
  11. 3
      src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarCheckBox.cs

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

@ -24,8 +24,8 @@ namespace ICSharpCode.CodeAnalysis @@ -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<SDTask>().ToArray()) {
FxCopTaskTag tag = t.Tag as FxCopTaskTag;
if (tag == null)
continue;

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

@ -20,9 +20,8 @@ namespace MSHelpSystem.Commands @@ -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<SDTask>().ToArray()) {
if (t.BuildError == null)
continue;

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

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

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

@ -2,8 +2,11 @@ @@ -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 @@ -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<SDTask> errors = new ObservableCollection<SDTask>();
Properties properties;
@ -77,9 +81,6 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -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 @@ -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 @@ -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 @@ -157,7 +160,7 @@ namespace ICSharpCode.SharpDevelop.Gui
return;
}
taskView.AddTask(task);
errors.Add(task);
}
@ -165,8 +168,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -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 @@ -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 @@ -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 @@ -232,11 +217,11 @@ namespace ICSharpCode.SharpDevelop.Gui
public void Copy()
{
taskView.CopySelectionToClipboard();
TaskViewResources.CopySelectionToClipboard(errorView);
}
public void SelectAll()
{
taskView.SelectAll();
errorView.SelectAll();
}
#endregion
}

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

@ -2,14 +2,17 @@ @@ -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 @@ -22,6 +25,7 @@ namespace ICSharpCode.SharpDevelop.Gui
static TaskListPad instance;
Dictionary<string, bool> displayedTokens;
readonly ObservableCollection<SDTask> tasks;
IUnresolvedTypeDefinition oldClass;
int selectedScopeIndex = 0;
bool isInitialized = false;
@ -30,10 +34,10 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -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<string, bool> DisplayedTokens {
get { return displayedTokens; }
@ -61,18 +65,16 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -61,18 +65,16 @@ namespace ICSharpCode.SharpDevelop.Gui
{
instance = this;
this.displayedTokens = new Dictionary<string, bool>();
this.tasks = new ObservableCollection<SDTask>();
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 @@ -125,58 +127,58 @@ namespace ICSharpCode.SharpDevelop.Gui
UpdateItems();
}
void InitializeToolStrip()
void InitializePadContent()
{
taskView.CreateControl();
contentPanel.Controls.Add(taskView);
IReadOnlyList<string> 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<string, bool> 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 @@ -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 @@ -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 @@ -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 @@ -314,7 +300,7 @@ namespace ICSharpCode.SharpDevelop.Gui
public void Copy()
{
taskView.CopySelectionToClipboard();
TaskViewResources.CopySelectionToClipboard(taskView);
}
public void SelectAll()
{

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

@ -3,6 +3,7 @@ @@ -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 @@ -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();
}
}
}

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

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

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

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

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

@ -0,0 +1,76 @@ @@ -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
{
/// <summary>
/// Description of TaskViewResources.
/// </summary>
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());
}
}
}

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

@ -2,7 +2,9 @@ @@ -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 @@ -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 @@ -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; }
/// <summary>
/// Contains a reference to the build error.
@ -151,9 +162,9 @@ namespace ICSharpCode.SharpDevelop @@ -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;
}

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

@ -46,6 +46,9 @@ namespace ICSharpCode.Core.Presentation @@ -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()

Loading…
Cancel
Save