Skip to content
This repository was archived by the owner on Oct 16, 2020. It is now read-only.

Commit caaedbd

Browse files
add partial implementation of rename for the WPF designer
1 parent 001f548 commit caaedbd

2 files changed

Lines changed: 56 additions & 22 deletions

File tree

src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
using System.Xml;
1616

1717
using ICSharpCode.Core.Presentation;
18+
using ICSharpCode.NRefactory.TypeSystem;
1819
using ICSharpCode.SharpDevelop;
1920
using ICSharpCode.SharpDevelop.Dom;
2021
using ICSharpCode.SharpDevelop.Editor;
@@ -194,24 +195,41 @@ void OnSelectionChanged(object sender, DesignItemCollectionEventArgs e)
194195

195196
void OnPropertyGridPropertyChanged(object sender, PropertyChangedEventArgs e)
196197
{
198+
if (propertyGridView.PropertyGrid.ReloadActive) return;
197199
if (e.PropertyName == "Name") {
198200
if (!propertyGridView.PropertyGrid.IsNameCorrect) return;
199201

200202
// get the XAML file
201-
OpenedFile fileName = this.Files.FirstOrDefault(f => f.FileName.ToString().EndsWith(".xaml", StringComparison.OrdinalIgnoreCase));
202-
if (fileName == null) return;
203+
OpenedFile file = this.Files.FirstOrDefault(f => f.FileName.ToString().EndsWith(".xaml", StringComparison.OrdinalIgnoreCase));
204+
if (file == null) return;
203205

204206
// parse the XAML file
205-
ParseInformation info = SD.ParserService.Parse(fileName.FileName);
207+
ParseInformation info = SD.ParserService.Parse(file.FileName);
206208
if (info == null) return;
209+
ICompilation compilation = SD.ParserService.GetCompilationForFile(file.FileName);
210+
var designerClass = info.UnresolvedFile.TopLevelTypeDefinitions[0]
211+
.Resolve(new SimpleTypeResolveContext(compilation.MainAssembly))
212+
.GetDefinition();
213+
if (designerClass == null) return;
214+
var reparseFileNameList = designerClass.Parts.Select(p => new ICSharpCode.Core.FileName(p.UnresolvedFile.FileName)).ToArray();
207215

208216
// rename the member
209-
#warning reimplement rename!
210-
/*
211-
IMember member = info.CompilationUnit.Classes [0].AllMembers.FirstOrDefault(m => m.Name == propertyGridView.PropertyGrid.OldName);
212-
if (member != null) {
213-
FindReferencesAndRenameHelper.RenameMember(member, propertyGridView.PropertyGrid.Name);
214-
}*/
217+
ISymbol controlSymbol = designerClass.GetFields(f => f.Name == propertyGridView.PropertyGrid.OldName, GetMemberOptions.IgnoreInheritedMembers)
218+
.SingleOrDefault();
219+
if (controlSymbol != null) {
220+
FindReferenceService.RenameSymbol(controlSymbol, propertyGridView.PropertyGrid.Name, new DummyProgressMonitor())
221+
.ObserveOnUIThread()
222+
.Subscribe(error => SD.MessageService.ShowError(error.Message), // onNext
223+
ex => SD.MessageService.ShowException(ex), // onError
224+
// onCompleted
225+
() => {
226+
foreach (var fileName in reparseFileNameList) {
227+
SD.ParserService.ParseAsync(fileName).FireAndForget();
228+
}
229+
}
230+
);
231+
232+
}
215233
}
216234
}
217235

src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGrid.cs

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using System.Collections.Specialized;
67
using System.Linq;
78
using System.Text;
89
using System.ComponentModel;
910
using System.Collections.ObjectModel;
1011
using System.Threading;
1112
using System.Globalization;
13+
using System.Windows.Controls;
14+
using System.Windows.Controls.Primitives;
1215
using ICSharpCode.WpfDesign.PropertyGrid;
1316
using System.Windows.Threading;
1417
using System.Diagnostics;
@@ -31,7 +34,7 @@ public PropertyGrid()
3134
}
3235

3336
Category specialCategory = new Category("Special");
34-
Category popularCategory = new Category("Popular");
37+
Category popularCategory = new Category("Popular");
3538
Category otherCategory = new Category("Other");
3639
Category attachedCategory = new Category("Attached");
3740

@@ -158,14 +161,17 @@ public bool IsNameEnabled {
158161
}
159162
}
160163

161-
IEnumerable<DesignItem> selectedItems;
164+
IList<DesignItem> selectedItems;
162165

163166
public IEnumerable<DesignItem> SelectedItems {
164167
get {
165168
return selectedItems;
166169
}
167170
set {
168-
selectedItems = value;
171+
if (value == null)
172+
selectedItems = null;
173+
else
174+
selectedItems = value.ToList();
169175
RaisePropertyChanged("SelectedItems");
170176
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new Action(
171177
delegate {
@@ -178,17 +184,27 @@ public void ClearFilter()
178184
{
179185
Filter = null;
180186
}
187+
188+
volatile bool reloadActive;
189+
public bool ReloadActive {
190+
get { return reloadActive; }
191+
}
181192

182193
void Reload()
183194
{
184-
Clear();
185-
186-
if (SelectedItems == null || SelectedItems.Count() == 0) return;
187-
if (SelectedItems.Count() == 1) SingleItem = SelectedItems.First();
188-
189-
foreach (var md in GetDescriptors()) {
190-
if (PassesFilter(md.Name))
191-
AddNode(md);
195+
reloadActive = true;
196+
try {
197+
Clear();
198+
199+
if (selectedItems == null || selectedItems.Count == 0) return;
200+
if (selectedItems.Count == 1) SingleItem = selectedItems[0];
201+
202+
foreach (var md in GetDescriptors()) {
203+
if (PassesFilter(md.Name))
204+
AddNode(md);
205+
}
206+
} finally {
207+
reloadActive = false;
192208
}
193209
}
194210

@@ -233,7 +249,7 @@ bool PassesFilter(string name)
233249
if (string.IsNullOrEmpty(Filter)) return true;
234250
for (int i = 0; i < name.Length; i++) {
235251
if (i == 0 || char.IsUpper(name[i])) {
236-
if (string.Compare(name, i, Filter, 0, Filter.Length, true) == 0) {
252+
if (string.Compare(name, i, Filter, 0, Filter.Length, StringComparison.OrdinalIgnoreCase) == 0) {
237253
return true;
238254
}
239255
}
@@ -271,7 +287,7 @@ Category PickCategory(PropertyNode node)
271287
if (Metadata.IsPopularProperty(node.FirstProperty)) return popularCategory;
272288
if (node.FirstProperty.IsAttachedDependencyProperty()) return attachedCategory;
273289
var typeName = node.FirstProperty.DeclaringType.FullName;
274-
if (typeName.StartsWith("System.Windows.") || typeName.StartsWith("ICSharpCode.WpfDesign.Designer.Controls."))
290+
if (typeName.StartsWith("System.Windows.", StringComparison.Ordinal) || typeName.StartsWith("ICSharpCode.WpfDesign.Designer.Controls.", StringComparison.Ordinal))
275291
return otherCategory;
276292
return specialCategory;
277293
}

0 commit comments

Comments
 (0)