From c0365b6e7a0f2dafae099af1bce3cb8eb299423b Mon Sep 17 00:00:00 2001 From: PeterForstmeier Date: Sat, 30 Jun 2012 21:05:19 +0200 Subject: [PATCH] DataTemplateSelector in Analysis/CodeAnalysis/Src/AnalysisProjectOptionsPanelXaml.xaml --- .../Analysis/CodeAnalysis/CodeAnalysis.csproj | 1 + .../Src/AnalysisProjectOptionsPanelXaml.xaml | 66 ++++- .../AnalysisProjectOptionsPanelXaml.xaml.cs | 279 ++++++------------ .../Src/AnalysisProjectOptionsTreeNodes.cs | 199 +++++++++++++ 4 files changed, 349 insertions(+), 196 deletions(-) create mode 100644 src/AddIns/Analysis/CodeAnalysis/Src/AnalysisProjectOptionsTreeNodes.cs diff --git a/src/AddIns/Analysis/CodeAnalysis/CodeAnalysis.csproj b/src/AddIns/Analysis/CodeAnalysis/CodeAnalysis.csproj index 56a8a9d0e1..f15494109a 100644 --- a/src/AddIns/Analysis/CodeAnalysis/CodeAnalysis.csproj +++ b/src/AddIns/Analysis/CodeAnalysis/CodeAnalysis.csproj @@ -72,6 +72,7 @@ AnalysisProjectOptionsPanelXaml.xaml Code + diff --git a/src/AddIns/Analysis/CodeAnalysis/Src/AnalysisProjectOptionsPanelXaml.xaml b/src/AddIns/Analysis/CodeAnalysis/Src/AnalysisProjectOptionsPanelXaml.xaml index a96d97aef5..7dc0ca2cb9 100644 --- a/src/AddIns/Analysis/CodeAnalysis/Src/AnalysisProjectOptionsPanelXaml.xaml +++ b/src/AddIns/Analysis/CodeAnalysis/Src/AnalysisProjectOptionsPanelXaml.xaml @@ -8,9 +8,43 @@ xmlns:tv="http://icsharpcode.net/sharpdevelop/treeview" xmlns:local="clr-namespace:ICSharpCode.CodeAnalysis" xmlns:core="http://icsharpcode.net/sharpdevelop/core"> - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -30,15 +64,15 @@ - + - + - + @@ -49,26 +83,38 @@ + + + + + + + + - + + + diff --git a/src/AddIns/Analysis/CodeAnalysis/Src/AnalysisProjectOptionsPanelXaml.xaml.cs b/src/AddIns/Analysis/CodeAnalysis/Src/AnalysisProjectOptionsPanelXaml.xaml.cs index 6d17061ffa..bf10252ce2 100644 --- a/src/AddIns/Analysis/CodeAnalysis/Src/AnalysisProjectOptionsPanelXaml.xaml.cs +++ b/src/AddIns/Analysis/CodeAnalysis/Src/AnalysisProjectOptionsPanelXaml.xaml.cs @@ -44,14 +44,14 @@ namespace ICSharpCode.CodeAnalysis private bool userCheck; private Dictionary rules = new Dictionary(); - private List> bla = new List>(); + private List> bla = new List>(); public AnalysisProjectOptionsPanelXaml() { InitializeComponent(); DataContext = this; - bla.Add(Tuple.Create(SystemIcons.Warning,"Warning")); - bla.Add(Tuple.Create(SystemIcons.Error,"Error")); + bla.Add(Tuple.Create(SystemIcons.Warning,"Warning",0)); + bla.Add(Tuple.Create(SystemIcons.Error,"Error",1)); // bla.Add(Tuple.Create(null,"None")); } @@ -86,12 +86,12 @@ namespace ICSharpCode.CodeAnalysis ruleAssemblies = value; if (initSuccess) { - //// OnOptionChanged(EventArgs.Empty); ReloadRuleList(); } } } } + #endregion #region Rule string Property @@ -106,20 +106,18 @@ namespace ICSharpCode.CodeAnalysis b.Append(';'); if ((bool)rule.IsChecked) b.Append('+'); - else b.Append('-'); if (rule.isError) b.Append('!'); b.Append(rule.Identifier); } - Console.WriteLine(""); - Console.WriteLine(b.ToString()); } } return b.ToString(); } + void ReadRuleString() { userCheck = false; @@ -150,21 +148,42 @@ namespace ICSharpCode.CodeAnalysis ruleNode.isError = error; } } - /* - foreach (SharpTreeNode cat in ruleTreeView.Root.Children) { - bool noneChecked = true; - foreach (RuleTreeNode rtn in cat.Children) { - if ((bool)rtn.IsChecked) { - noneChecked = false; - break; + userCheck = true; +// SetCategoryIcon(); + SetCategoryIcon(); + } + + /* + void oldSetCategoryIcon() + { + foreach (CategoryTreeNode element in ruleTreeView.Root.Children) { + Console.WriteLine(" {0} - errorstate {1}",element.Text, element.ErrorState.ToString()); + if (element.ErrorState > -1) { + element.Index = element.ErrorState; + } + Console.WriteLine("-------------------------"); + } + + } + */ + + + void SetCategoryIcon() { + foreach (CategoryTreeNode element in ruleTreeView.Root.Children) { +// Console.WriteLine(" {0} ",element.Text); + if (!element.NewErrorState.HasValue) { + Console.WriteLine (" {0} is Mixed Mode",element.Text); + } else{ + if (element.NewErrorState == true) { + Console.WriteLine (" {0} is Error",element.Text); + element.Index = 1; + } else { + Console.WriteLine (" {0} is Warning",element.Text); } } - cat.IsChecked = !noneChecked; - } */ - userCheck = true; + } } - string ruleString = ""; public string RuleString { @@ -229,18 +248,16 @@ namespace ICSharpCode.CodeAnalysis } else { foreach (FxCopCategory cat in ruleList) { CategoryTreeNode catNode = new CategoryTreeNode(cat,bla); + catNode.PropertyChanged += OnPropertyChanged; ruleTreeView.Root.Children.Add(catNode); foreach (RuleTreeNode ruleNode in catNode.Children) { + ruleNode.PropertyChanged += OnPropertyChanged; rules[ruleNode.Identifier] = ruleNode; } } - initSuccess = true; + ReadRuleString(); - foreach (var element in ruleTreeView.Root.Children) { - element.PropertyChanged += delegate { - base.IsDirty = true; - }; - } + initSuccess = true; } } } @@ -248,9 +265,20 @@ namespace ICSharpCode.CodeAnalysis private void OnPropertyChanged(object sender,System.ComponentModel.PropertyChangedEventArgs e) { - base.IsDirty = true; + if (initSuccess) { + base.IsDirty = true; + if (e.PropertyName == "Index") { + RuleTreeNode r = sender as RuleTreeNode; + if (r != null) { + var p = r.Parent; + if (p != null) { + SetCategoryIcon(); + } + } + } + } } - + private string[] GetRuleAssemblyList(bool replacePath) { @@ -270,6 +298,7 @@ namespace ICSharpCode.CodeAnalysis return list.ToArray(); } + private void ChangeRuleAssembliesButtonClick( object sender, RoutedEventArgs e) { var stringListDialog = new StringListEditorDialog(); @@ -289,183 +318,59 @@ namespace ICSharpCode.CodeAnalysis this.RuleAssemblies = b.ToString(); } finally { initSuccess = oldInitSuccess; -// base.IsDirty = true; } } } - #endregion + } + + public class TypeSelector : DataTemplateSelector + { - #region TreeNodes - - class BaseTree:SharpTreeNode - { - private int index; - - public BaseTree(IEnumerable> ruleState) - { - this.RuleState = ruleState; - } - - public IEnumerable> RuleState {get;set;} - - - public virtual int Index { - get { return index; } - set { - if (index != value) { - index = value; - switch (index) { - case 0: - break; - case 1: - break; - case 2: - break; - default: - break; - } - base.RaisePropertyChanged("Index"); - } - } - - } - } - - - class CategoryTreeNode : BaseTree - { - internal FxCopCategory category; - - public CategoryTreeNode(FxCopCategory category,IEnumerable> bla):base(bla) - { - this.category = category; - foreach (FxCopRule rule in category.Rules) { - this.Children.Add(new RuleTreeNode(rule,bla)); - } - } - - - public override bool IsCheckable { - get { return true; } - } - - public override object Text { - get { return category.DisplayName; } - } - - - internal int ErrorState { - get { - bool allWarn = true; - bool allErr = true; - foreach (RuleTreeNode tn in Children) { - if (tn.isError) - allWarn = false; - else - allErr = false; - } - if (allErr) - return 1; - else if (allWarn) - return 0; - else - return -1; - } - } - } - + public DataTemplate ComboTemplate { get; set; } + public DataTemplate TxtTemplate { get; set; } - class RuleTreeNode :BaseTree + public override DataTemplate SelectTemplate(object item, DependencyObject container) { - internal FxCopRule rule; -// internal bool isError; - bool error; - - internal bool isError { - get { return error; } - set { error = value; - if (error) { - base.Index = 1; - } - } - } - - public RuleTreeNode(FxCopRule rule,IEnumerable> ruleState):base(ruleState) - { - this.rule = rule; - } - - public override bool IsCheckable { - get { return true; } - } - - public override object Text { - get { return rule.CheckId + " : " + rule.DisplayName; } - } - - public string Identifier { - get { - return rule.CategoryName + "#" + rule.CheckId; - } - } - - public override int Index { - get { return base.Index; } - set { base.Index = value; - if (Index == 1) { - error = true; - } - } - } +// var element = item as RuleTreeNode; +// if (element != null) { +// return ComboTemplate; +// } else { +// return TxtTemplate; +// } + return ComboTemplate; } - - class MessageNode : SharpTreeNode - { - private string message; - public MessageNode (string message) - { - this.message = message; - } - - public override object Text { - get { return message; } - } - } - #endregion - } - + [ValueConversion(typeof(System.Drawing.Icon), typeof(System.Windows.Media.ImageSource))] public class ImageConverter : IValueConverter - { + { public object Convert(object value, Type targetType, - object parameter, CultureInfo culture) - { - // empty images are empty... - if (value == null) { return null; } - var image = (System.Drawing.Icon)value; - // Winforms Image we want to get the WPF Image from... - var bitmap = new System.Windows.Media.Imaging.BitmapImage(); - bitmap.BeginInit(); - MemoryStream memoryStream = new MemoryStream(); - // Save to a memory stream... - image.Save(memoryStream); - // Rewind the stream... - memoryStream.Seek(0, System.IO.SeekOrigin.Begin); - bitmap.StreamSource = memoryStream; - bitmap.EndInit(); - return bitmap; - } + object parameter, CultureInfo culture) + { + // empty images are empty... + if (value == null) { return null; } + var image = (System.Drawing.Icon)value; + // Winforms Image we want to get the WPF Image from... + var bitmap = new System.Windows.Media.Imaging.BitmapImage(); + bitmap.BeginInit(); + MemoryStream memoryStream = new MemoryStream(); + // Save to a memory stream... + image.Save(memoryStream); + // Rewind the stream... + memoryStream.Seek(0, System.IO.SeekOrigin.Begin); + bitmap.StreamSource = memoryStream; + bitmap.EndInit(); + return bitmap; + } public object ConvertBack(object value, Type targetType, - object parameter, CultureInfo culture) - { - return null; - } + object parameter, CultureInfo culture) + { + return null; + } } - } \ No newline at end of file diff --git a/src/AddIns/Analysis/CodeAnalysis/Src/AnalysisProjectOptionsTreeNodes.cs b/src/AddIns/Analysis/CodeAnalysis/Src/AnalysisProjectOptionsTreeNodes.cs new file mode 100644 index 0000000000..042d7332ae --- /dev/null +++ b/src/AddIns/Analysis/CodeAnalysis/Src/AnalysisProjectOptionsTreeNodes.cs @@ -0,0 +1,199 @@ +/* + * Created by SharpDevelop. + * User: Peter Forstmeier + * Date: 30.06.2012 + * Time: 20:55 + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; +using System.Collections.Generic; +using System.Drawing; + +using ICSharpCode.TreeView; + +namespace ICSharpCode.CodeAnalysis +{ + /// + /// Description of AnalysisProjectOptionsTreeNodes. + /// + public class BaseTree:SharpTreeNode + { + private int index; + + public BaseTree(IEnumerable> ruleState) + { + this.RuleState = ruleState; + } + + public IEnumerable> RuleState {get;set;} + + + public virtual int Index { + get { return index; } + set { + if (index != value) { + index = value; + switch (index) { + case 0: + break; + case 1: + break; + case 2: + break; + default: + break; + } + base.RaisePropertyChanged("Index"); + } + } + } + } + + + public class CategoryTreeNode : BaseTree + { + internal FxCopCategory category; + + public CategoryTreeNode(FxCopCategory category,IEnumerable> bla):base(bla) + { + this.category = category; + foreach (FxCopRule rule in category.Rules) { + this.Children.Add(new RuleTreeNode(rule,bla)); + } + } + + + public override bool IsCheckable { + get { return true; } + } + + public override object Text { + get { return category.DisplayName; } + } + + public override int Index { + get { return base.Index; } + set { + if (value != base.Index) { + base.Index = value; + foreach (RuleTreeNode rule in this.Children) { + rule.Index = Index; + } + } + } + } + + + + public Nullable NewErrorState { + get { + bool allWarn = true; + bool allErr = true; + foreach (RuleTreeNode tn in Children) { + if (tn.isError) + allWarn = false; + else + allErr = false; + } + if (allErr) + return true; + else if (allWarn) + return false; + else + return null; + + } + } + + /* + internal int ErrorState { + get { + bool allWarn = true; + bool allErr = true; + foreach (RuleTreeNode tn in Children) { + if (tn.isError) + allWarn = false; + else + allErr = false; + } + if (allErr) + return 1; + else if (allWarn) + return 0; + else + return -1; + } + } + */ + } + + + public class RuleTreeNode :BaseTree + { + internal FxCopRule rule; + bool error; + + internal bool isError { + get { return error; } + set { + if (error != value) { + error = value; + if (error) { + base.Index = 1; + } + } + + } + } + + public RuleTreeNode(FxCopRule rule,IEnumerable> ruleState):base(ruleState) + { + this.rule = rule; + } + + public override bool IsCheckable { + get { return true; } + } + + public override object Text { + get { return rule.CheckId + " : " + rule.DisplayName; } + } + + public string Identifier { + get { + return rule.CategoryName + "#" + rule.CheckId; + } + } + + + public override int Index { + get { return base.Index; } + set { + if (value != Index) { + if (Index == 1) { + error = true; + } else { + error = false; + } + base.Index = value; + } + } + } + } + + + public class MessageNode : SharpTreeNode + { + private string message; + + public MessageNode (string message) + { + this.message = message; + } + + public override object Text { + get { return message; } + } + } + +}