Skip to content

Commit fa4e5ef

Browse files
committed
Merge pull request #965 from brunoss/next
ToDo's WPF
2 parents f475f3f + 9534699 commit fa4e5ef

13 files changed

+331
-326
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<DataGrid x:Class="Rubberduck.Controls.GroupingGrid"
2+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
6+
xmlns:local="clr-namespace:Rubberduck.Controls"
7+
mc:Ignorable="d"
8+
d:DesignHeight="300" d:DesignWidth="300">
9+
<DataGrid.Resources>
10+
<Style x:Key="GrouHeaderStyle" TargetType="{x:Type GroupItem}">
11+
<Setter Property="Template">
12+
<Setter.Value>
13+
<ControlTemplate>
14+
<Expander Background="White" Foreground="Black" Header="{Binding Name}" IsExpanded="{Binding IsExpanded, RelativeSource={RelativeSource AncestorType=DataGrid}}">
15+
<ItemsPresenter></ItemsPresenter>
16+
</Expander>
17+
</ControlTemplate>
18+
</Setter.Value>
19+
</Setter>
20+
</Style>
21+
</DataGrid.Resources>
22+
<DataGrid.GroupStyle>
23+
<GroupStyle ContainerStyle="{StaticResource GrouHeaderStyle}">
24+
<GroupStyle.Panel>
25+
<ItemsPanelTemplate>
26+
<DataGridRowsPresenter></DataGridRowsPresenter>
27+
</ItemsPanelTemplate>
28+
</GroupStyle.Panel>
29+
</GroupStyle>
30+
</DataGrid.GroupStyle>
31+
</DataGrid>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using System.Windows;
7+
using System.Windows.Controls;
8+
using System.Windows.Data;
9+
using System.Windows.Documents;
10+
using System.Windows.Input;
11+
using System.Windows.Media;
12+
using System.Windows.Media.Imaging;
13+
using System.Windows.Navigation;
14+
using System.Windows.Shapes;
15+
16+
namespace Rubberduck.Controls
17+
{
18+
public partial class GroupingGrid
19+
{
20+
public static readonly DependencyProperty IsExpandedProperty =
21+
DependencyProperty.Register("IsExpanded", typeof(bool), typeof(GroupingGrid));
22+
23+
public bool IsExpanded
24+
{
25+
get { return (bool)GetValue(IsExpandedProperty); }
26+
set { SetValue(IsExpandedProperty, value); }
27+
}
28+
29+
public GroupingGrid()
30+
{
31+
InitializeComponent();
32+
}
33+
}
34+
}

RetailCoder.VBE/Root/RubberduckModule.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
using Rubberduck.UI.CodeExplorer;
2020
using Rubberduck.UI.CodeInspections;
2121
using Rubberduck.UI.Command;
22+
using Rubberduck.UI.Command.MenuItems;
23+
using Rubberduck.UI.ToDoItems;
2224
using Rubberduck.UI.UnitTesting;
2325
using Rubberduck.VBEditor.VBEHost;
2426

@@ -74,12 +76,17 @@ public override void Load()
7476
.WhenInjectedInto<RunCodeInspectionsCommand>()
7577
.InSingletonScope()
7678
.WithConstructorArgument<IDockableUserControl>(new CodeInspectionsWindow { ViewModel = _kernel.Get<InspectionResultsViewModel>() });
77-
79+
7880
Bind<IPresenter>().To<CodeExplorerDockablePresenter>()
7981
.WhenInjectedInto<CodeExplorerCommand>()
8082
.InSingletonScope()
8183
.WithConstructorArgument<IDockableUserControl>(new CodeExplorerWindow { ViewModel = _kernel.Get<CodeExplorerViewModel>() });
8284

85+
Bind<IPresenter>().To<ToDoExplorerDockablePresenter>()
86+
.WhenInjectedInto<ToDoExplorerCommand>()
87+
.InSingletonScope()
88+
.WithConstructorArgument<IDockableUserControl>(new ToDoExplorerWindow { ViewModel = _kernel.Get<ToDoExplorerViewModel>() });
89+
8390
BindWindowsHooks();
8491
Debug.Print("completed RubberduckModule.Load()");
8592
}

RetailCoder.VBE/Rubberduck.csproj

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,9 @@
294294
<Compile Include="Common\WinAPI\User32.cs" />
295295
<Compile Include="Common\WinAPI\WindowLongFlags.cs" />
296296
<Compile Include="Common\WinAPI\WM.cs" />
297+
<Compile Include="Controls\GroupingGrid\GroupingGrid.xaml.cs">
298+
<DependentUpon>GroupingGrid.xaml</DependentUpon>
299+
</Compile>
297300
<Compile Include="Inspections\CodeInspectionQuickFix.cs" />
298301
<Compile Include="Inspections\SelfAssignedDeclarationInspection.cs" />
299302
<Compile Include="Inspections\SelfAssignedDeclarationInspectionResult.cs" />
@@ -762,7 +765,11 @@
762765
<DependentUpon>TodoListSettingsUserControl.cs</DependentUpon>
763766
</Compile>
764767
<Compile Include="UI\Settings\TodoSettingPresenter.cs" />
768+
<Compile Include="UI\ToDoItems\ToDoExplorerControl.xaml.cs">
769+
<DependentUpon>ToDoExplorerControl.xaml</DependentUpon>
770+
</Compile>
765771
<Compile Include="UI\ToDoItems\ToDoExplorerDockablePresenter.cs" />
772+
<Compile Include="UI\ToDoItems\ToDoExplorerViewModel.cs" />
766773
<Compile Include="UI\ToDoItems\ToDoItemClickEventArgs.cs" />
767774
<Compile Include="UI\BindableSelectedItemBehavior.cs" />
768775
<Compile Include="UI\UnitTesting\StandardModuleTestExplorerModel.cs" />
@@ -857,14 +864,17 @@
857864
<EmbeddedResource Include="UI\RubberduckUI.de.resx">
858865
<Generator>PublicResXFileCodeGenerator</Generator>
859866
<LastGenOutput>RubberduckUI.de.Designer.cs</LastGenOutput>
867+
<SubType>Designer</SubType>
860868
</EmbeddedResource>
861869
<EmbeddedResource Include="UI\RubberduckUI.ja.resx">
862870
<Generator>PublicResXFileCodeGenerator</Generator>
863871
<LastGenOutput>RubberduckUI.ja.Designer.cs</LastGenOutput>
872+
<SubType>Designer</SubType>
864873
</EmbeddedResource>
865874
<EmbeddedResource Include="UI\RubberduckUI.sv.resx">
866875
<Generator>PublicResXFileCodeGenerator</Generator>
867876
<LastGenOutput>RubberduckUI.sv.Designer.cs</LastGenOutput>
877+
<SubType>Designer</SubType>
868878
</EmbeddedResource>
869879
<EmbeddedResource Include="UI\Settings\AddMarkerForm.resx">
870880
<DependentUpon>AddMarkerForm.cs</DependentUpon>
@@ -938,6 +948,7 @@
938948
</EmbeddedResource>
939949
<EmbeddedResource Include="UI\ToDoItems\ToDoExplorerWindow.resx">
940950
<DependentUpon>ToDoExplorerWindow.cs</DependentUpon>
951+
<SubType>Designer</SubType>
941952
</EmbeddedResource>
942953
<EmbeddedResource Include="UI\UnitTesting\TestExplorerWindow.resx">
943954
<DependentUpon>TestExplorerWindow.cs</DependentUpon>
@@ -1329,6 +1340,10 @@
13291340
</ProjectReference>
13301341
</ItemGroup>
13311342
<ItemGroup>
1343+
<Page Include="Controls\GroupingGrid\GroupingGrid.xaml">
1344+
<SubType>Designer</SubType>
1345+
<Generator>MSBuild:Compile</Generator>
1346+
</Page>
13321347
<Page Include="UI\BusyIndicator.xaml">
13331348
<SubType>Designer</SubType>
13341349
<Generator>MSBuild:Compile</Generator>
@@ -1345,6 +1360,10 @@
13451360
<SubType>Designer</SubType>
13461361
<Generator>MSBuild:Compile</Generator>
13471362
</Page>
1363+
<Page Include="UI\ToDoItems\ToDoExplorerControl.xaml">
1364+
<SubType>Designer</SubType>
1365+
<Generator>MSBuild:Compile</Generator>
1366+
</Page>
13481367
<Page Include="UI\UnitTesting\TestExplorerControl.xaml">
13491368
<SubType>Designer</SubType>
13501369
<Generator>MSBuild:Compile</Generator>

RetailCoder.VBE/ToDoItems/ToDoItem.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Rubberduck.Parsing.Nodes;
1+
using System;
2+
using Rubberduck.Parsing.Nodes;
23
using Rubberduck.UI;
34
using Rubberduck.VBEditor;
45

@@ -27,6 +28,9 @@ public class ToDoItem
2728
private readonly int _lineNumber;
2829
public int LineNumber { get { return _lineNumber; } }
2930

31+
private readonly string _type;
32+
public string Type { get { return _type; } }
33+
3034
private readonly QualifiedSelection _selection;
3135
public QualifiedSelection GetSelection() { return _selection; }
3236

@@ -43,6 +47,8 @@ public ToDoItem(TodoPriority priority, string description, QualifiedSelection qu
4347
_projectName = qualifiedSelection.QualifiedName.Project.Name;
4448
_moduleName = qualifiedSelection.QualifiedName.Component.Name;
4549
_lineNumber = qualifiedSelection.Selection.StartLine;
50+
int idxDelimiter = description.IndexOf(":", StringComparison.InvariantCulture);
51+
_type = description.Substring(0, idxDelimiter);
4652
}
4753
}
4854
}

RetailCoder.VBE/UI/Command/ToDoExplorerCommand.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ namespace Rubberduck.UI.Command
99
[ComVisible(false)]
1010
public class ToDoExplorerCommand : CommandBase
1111
{
12-
private readonly ToDoExplorerDockablePresenter _presenter;
12+
private readonly IPresenter _presenter;
1313

14-
public ToDoExplorerCommand(ToDoExplorerDockablePresenter presenter)
14+
public ToDoExplorerCommand(IPresenter presenter)
1515
{
1616
_presenter = presenter;
1717
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<UserControl x:Class="Rubberduck.UI.ToDoItems.ToDoExplorerControl"
2+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
6+
xmlns:resx="clr-namespace:Rubberduck.UI"
7+
xmlns:toDoItems="clr-namespace:Rubberduck.UI.ToDoItems"
8+
xmlns:controls="clr-namespace:Rubberduck.Controls"
9+
mc:Ignorable="d"
10+
d:DesignHeight="300" d:DesignWidth="300" d:DataContext="{d:DesignInstance toDoItems:ToDoExplorerViewModel, IsDesignTimeCreatable=False}">
11+
<UserControl.Resources>
12+
<BitmapImage x:Key="RefreshImage" UriSource="../../Resources/arrow-circle-double.png" />
13+
<BitmapImage x:Key="ClearImage" UriSource="../../Resources/cross-script.png" />
14+
</UserControl.Resources>
15+
<DockPanel LastChildFill="True">
16+
<ToolBarTray DockPanel.Dock="Top">
17+
<ToolBar>
18+
<StackPanel Orientation="Horizontal">
19+
<Button ToolTip="Refresh" Command="{Binding RefreshCommand, Mode=OneWay}">
20+
<Image Source="{StaticResource RefreshImage}"></Image>
21+
</Button>
22+
<Button ToolTip="Clear" Command="{Binding Clear}">
23+
<Image Source="{StaticResource ClearImage}"></Image>
24+
</Button>
25+
</StackPanel>
26+
</ToolBar>
27+
</ToolBarTray>
28+
<controls:GroupingGrid ItemsSource="{Binding ToDos}" AutoGenerateColumns="False" SelectedItem="{Binding SelectedToDo}" IsExpanded="True">
29+
<DataGrid.Columns>
30+
<DataGridTextColumn Header="{x:Static resx:RubberduckUI.Priority}" Binding="{Binding Priority}">
31+
</DataGridTextColumn>
32+
<DataGridTextColumn Header="{x:Static resx:RubberduckUI.TodoExplorer_Description}" Binding="{Binding Description}"></DataGridTextColumn>
33+
<DataGridTextColumn Header="{x:Static resx:RubberduckUI.ProjectName}" Binding="{Binding ProjectName}"></DataGridTextColumn>
34+
<DataGridTextColumn Header="{x:Static resx:RubberduckUI.ModuleName}" Binding="{Binding ModuleName}"></DataGridTextColumn>
35+
<DataGridTextColumn Header="{x:Static resx:RubberduckUI.TodoExplorer_LineNumber}" Binding="{Binding LineNumber}"></DataGridTextColumn>
36+
</DataGrid.Columns>
37+
</controls:GroupingGrid>
38+
</DockPanel>
39+
</UserControl>
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using System.Windows;
7+
using System.Windows.Controls;
8+
using System.Windows.Data;
9+
using System.Windows.Documents;
10+
using System.Windows.Input;
11+
using System.Windows.Media;
12+
using System.Windows.Media.Imaging;
13+
using System.Windows.Navigation;
14+
using System.Windows.Shapes;
15+
16+
namespace Rubberduck.UI.ToDoItems
17+
{
18+
/// <summary>
19+
/// Interaction logic for ToDoExplorerControl.xaml
20+
/// </summary>
21+
public partial class ToDoExplorerControl
22+
{
23+
public ToDoExplorerControl()
24+
{
25+
InitializeComponent();
26+
}
27+
}
28+
}

RetailCoder.VBE/UI/ToDoItems/ToDoExplorerDockablePresenter.cs

Lines changed: 1 addition & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -18,111 +18,10 @@ namespace Rubberduck.UI.ToDoItems
1818
/// </summary>
1919
public class ToDoExplorerDockablePresenter : DockableToolwindowPresenter
2020
{
21-
private readonly IRubberduckParser _parser;
22-
private readonly IEnumerable<ToDoMarker> _markers;
23-
private readonly GridViewSort<ToDoItem> _gridViewSort;
24-
private readonly IToDoExplorerWindow _view;
25-
private readonly ICodePaneWrapperFactory _wrapperFactory;
2621

27-
public ToDoExplorerDockablePresenter(IRubberduckParser parser, IEnumerable<ToDoMarker> markers, VBE vbe, AddIn addin, IToDoExplorerWindow window, ICodePaneWrapperFactory wrapperFactory)
22+
public ToDoExplorerDockablePresenter(VBE vbe, AddIn addin, IDockableUserControl window)
2823
: base(vbe, addin, window)
2924
{
30-
_parser = parser;
31-
_markers = markers;
32-
_gridViewSort = new GridViewSort<ToDoItem>(RubberduckUI.Priority, false);
33-
_wrapperFactory = wrapperFactory;
34-
35-
_view = window;
36-
_view.NavigateToDoItem += NavigateToDoItem;
37-
_view.RefreshToDoItems += RefreshToDoList;
38-
_view.RemoveToDoMarker += RemoveMarker;
39-
_view.SortColumn += SortColumn;
40-
}
41-
42-
public override void Show()
43-
{
44-
Refresh();
45-
base.Show();
46-
}
47-
48-
public async void Refresh()
49-
{
50-
Cursor.Current = Cursors.WaitCursor;
51-
var results = await GetItems();
52-
_view.TodoItems = _gridViewSort.Sort(results, _gridViewSort.ColumnName, _gridViewSort.SortedAscending);
53-
54-
Cursor.Current = Cursors.Default;
55-
}
56-
57-
private void RefreshToDoList(object sender, EventArgs e)
58-
{
59-
Refresh();
60-
}
61-
62-
private void RemoveMarker(object sender, EventArgs e)
63-
{
64-
var selectedIndex = _view.GridView.SelectedRows[0].Index;
65-
var dataSource = ((BindingList<ToDoItem>)_view.GridView.DataSource).ToList();
66-
var selectedItem = dataSource[selectedIndex];
67-
68-
var module = selectedItem.GetSelection().QualifiedName.Component.CodeModule;
69-
70-
var oldContent = module.Lines[selectedItem.LineNumber, 1];
71-
var newContent =
72-
oldContent.Remove(selectedItem.GetSelection().Selection.StartColumn - 1);
73-
74-
module.ReplaceLine(selectedItem.LineNumber, newContent);
75-
76-
Refresh();
77-
}
78-
79-
private void SortColumn(object sender, DataGridViewCellMouseEventArgs e)
80-
{
81-
var columnName = _view.GridView.Columns[e.ColumnIndex].Name;
82-
83-
_view.TodoItems = _gridViewSort.Sort(_view.TodoItems, columnName);
84-
}
85-
86-
private async Task<IOrderedEnumerable<ToDoItem>> GetItems()
87-
{
88-
var markers = _parser.State.AllComments.SelectMany(GetToDoMarkers).ToList();
89-
var sortedItems = markers.OrderByDescending(item => item.Priority)
90-
.ThenBy(item => item.ProjectName)
91-
.ThenBy(item => item.ModuleName)
92-
.ThenBy(item => item.LineNumber);
93-
94-
return sortedItems;
95-
}
96-
97-
private IEnumerable<ToDoItem> GetToDoMarkers(CommentNode comment)
98-
{
99-
return _markers.Where(marker => !string.IsNullOrEmpty(marker.Text)
100-
&& comment.Comment.ToLowerInvariant().Contains(marker.Text.ToLowerInvariant()))
101-
.Select(marker => new ToDoItem(marker.Priority, comment));
102-
}
103-
104-
private void NavigateToDoItem(object sender, ToDoItemClickEventArgs e)
105-
{
106-
var projects = VBE.VBProjects.Cast<VBProject>()
107-
.Where(p => p.Protection != vbext_ProjectProtection.vbext_pp_locked
108-
&& p.Name == e.SelectedItem.ProjectName
109-
&& p.VBComponents.Cast<VBComponent>()
110-
.Any(c => c.Name == e.SelectedItem.ModuleName)
111-
);
112-
113-
var firstOrDefault = projects.FirstOrDefault();
114-
if (firstOrDefault == null) { return; }
115-
116-
var component = firstOrDefault.VBComponents.Cast<VBComponent>()
117-
.First(c => c.Name == e.SelectedItem.ModuleName);
118-
119-
if (component == null)
120-
{
121-
return;
122-
}
123-
124-
var codePane = _wrapperFactory.Create(component.CodeModule.CodePane);
125-
codePane.Selection = e.SelectedItem.GetSelection().Selection;
12625
}
12726
}
12827
}

0 commit comments

Comments
 (0)