diff --git a/src/AddIns/Analysis/CodeQuality/CodeQualityAnalysis.csproj b/src/AddIns/Analysis/CodeQuality/CodeQualityAnalysis.csproj index ec89eced33..865e44896a 100644 --- a/src/AddIns/Analysis/CodeQuality/CodeQualityAnalysis.csproj +++ b/src/AddIns/Analysis/CodeQuality/CodeQualityAnalysis.csproj @@ -133,6 +133,7 @@ + @@ -143,6 +144,8 @@ + + Designer MSBuild:Compile diff --git a/src/AddIns/Analysis/CodeQuality/Src/Helper.cs b/src/AddIns/Analysis/CodeQuality/Src/Helper.cs index eb94392f4c..130a9e2a77 100644 --- a/src/AddIns/Analysis/CodeQuality/Src/Helper.cs +++ b/src/AddIns/Analysis/CodeQuality/Src/Helper.cs @@ -17,9 +17,10 @@ namespace ICSharpCode.CodeQualityAnalysis { public static void FillTree (ICSharpCode.TreeView.SharpTreeView tree,Module module) { + tree.ShowRoot = false; var root = CreateTreeItem(module); tree.Root = root; - + foreach (var ns in module.Namespaces) { var namespaceNode = CreateTreeItem(ns); diff --git a/src/AddIns/Analysis/CodeQuality/Src/MainWindow.xaml b/src/AddIns/Analysis/CodeQuality/Src/MainWindow.xaml index 2da63bf93a..91b54d206b 100644 --- a/src/AddIns/Analysis/CodeQuality/Src/MainWindow.xaml +++ b/src/AddIns/Analysis/CodeQuality/Src/MainWindow.xaml @@ -8,16 +8,25 @@ xmlns:debug="clr-namespace:System.Diagnostics;assembly=System" xmlns:datavis="clr-namespace:System.Windows.Controls.DataVisualization;assembly=System.Windows.Controls.DataVisualization.Toolkit" xmlns:tree="http://icsharpcode.net/sharpdevelop/treeview" - - Title="Code Quality Analysis" - DataContext="{Binding RelativeSource={RelativeSource Self}}" + xmlns:local="clr-namespace:ICSharpCode.CodeQualityAnalysis" + + Title="{Binding Title}" + x:Name="root"> + + + + + - + @@ -63,7 +73,14 @@ - + + + diff --git a/src/AddIns/Analysis/CodeQuality/Src/MainWindow.xaml.cs b/src/AddIns/Analysis/CodeQuality/Src/MainWindow.xaml.cs index 481450520f..4f3ef2a03d 100644 --- a/src/AddIns/Analysis/CodeQuality/Src/MainWindow.xaml.cs +++ b/src/AddIns/Analysis/CodeQuality/Src/MainWindow.xaml.cs @@ -22,11 +22,13 @@ namespace ICSharpCode.CodeQualityAnalysis /// /// Interaction logic for MainWindow.xaml /// + public partial class MainWindow : Window, INotifyPropertyChanged { private MetricsReader metricsReader; public event PropertyChangedEventHandler PropertyChanged; + public MetricsReader MetricsReader { get @@ -41,6 +43,8 @@ namespace ICSharpCode.CodeQualityAnalysis } } + + public MainWindow() { InitializeComponent(); @@ -215,6 +219,7 @@ namespace ICSharpCode.CodeQualityAnalysis } } + private void Metrics_SelectionChanged(object sender, SelectionChangedEventArgs e) { var levelItem = cbxMetrixLevel.SelectedItem as ComboBoxItem; diff --git a/src/AddIns/Analysis/CodeQuality/Src/MainWindowTranslationModel.cs b/src/AddIns/Analysis/CodeQuality/Src/MainWindowTranslationModel.cs new file mode 100644 index 0000000000..7ce07dab61 --- /dev/null +++ b/src/AddIns/Analysis/CodeQuality/Src/MainWindowTranslationModel.cs @@ -0,0 +1,102 @@ +/* + * Created by SharpDevelop. + * User: Peter Forstmeier + * Date: 03.09.2011 + * Time: 13:45 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; +using System.ComponentModel; +using System.Linq; +using System.Windows.Input; + +using ICSharpCode.CodeQualityAnalysis.Controls; +using ICSharpCode.CodeQualityAnalysis.Utility; +using Microsoft.Win32; + +namespace ICSharpCode.CodeQualityAnalysis +{ + /// + /// Description of MainWindowViewModel. + /// + public class MainWindowTranslationViewModel :ViewModelBase + { + + public MainWindowTranslationViewModel():base() + { + this.Title = "Code Quality Analysis"; + this.OpenAssembly = "OpenAssembly"; + } + + public string Title {get;private set;} + + public string OpenAssembly {get; private set;} + + + #region OpenAssembly + /* + public ICommand OpenAssemblyCommand + { + get { return new RelayCommand(OpenAssemblyExecute, CanOpenAssemblyExecute); } + } + + Boolean CanOpenAssemblyExecute() + { + return true; + } + + + void OpenAssemblyExecute() + { + var fileDialog = new OpenFileDialog + { + Filter = "Component Files (*.dll, *.exe)|*.dll;*.exe" + }; + + fileDialog.ShowDialog(); + + if (String.IsNullOrEmpty(fileDialog.FileName)) + return; + + progressBar.Visibility = Visibility.Visible; + assemblyStats.Visibility = Visibility.Hidden; + fileAssemblyLoading.Text = System.IO.Path.GetFileName(fileDialog.FileName); + + var worker = new BackgroundWorker(); + worker.DoWork += (source, args) => MetricsReader = new MetricsReader(fileDialog.FileName); + worker.RunWorkerCompleted += (source, args) => { + + progressBar.Visibility = Visibility.Hidden; + assemblyStats.Visibility = Visibility.Visible; + mainTabs.IsEnabled = true; + Helper.FillTree(definitionTree, metricsReader.MainModule); + + FillMatrix(); + }; + + worker.RunWorkerAsync(); + } + + private void FillMatrix() + { + var matrix = new DependencyMatrix(); + + foreach (var ns in metricsReader.MainModule.Namespaces) { + matrix.HeaderRows.Add(new Cell(ns)); + foreach (var type in ns.Types) { + matrix.HeaderRows.Add(new Cell(type)); + } + matrix.HeaderColumns.Add(new Cell(ns)); + foreach (var type in ns.Types) { + matrix.HeaderColumns.Add(new Cell(type)); + } + } + + //matrixControl.Matrix = matrix; + //matrixControl.DrawTree(metricsReader.MainModule); + } + */ + #endregion + } +} diff --git a/src/AddIns/Analysis/CodeQuality/Src/Utility/RelayCommand.cs b/src/AddIns/Analysis/CodeQuality/Src/Utility/RelayCommand.cs new file mode 100644 index 0000000000..ef3f0f13aa --- /dev/null +++ b/src/AddIns/Analysis/CodeQuality/Src/Utility/RelayCommand.cs @@ -0,0 +1,155 @@ +/* + * Created by SharpDevelop. + * User: Peter Forstmeier + * Date: 03.09.2011 + * Time: 14:25 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; +using System.Diagnostics; +using System.Windows.Input; + +namespace ICSharpCode.CodeQualityAnalysis.Utility +{ + public class RelayCommand : ICommand + { + + #region Declarations + + readonly Predicate _canExecute; + readonly Action _execute; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class and the command can always be executed. + /// + /// The execution logic. + public RelayCommand(Action execute) + : this(execute, null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The execution logic. + /// The execution status logic. + public RelayCommand(Action execute, Predicate canExecute) + { + + if (execute == null) + throw new ArgumentNullException("execute"); + _execute = execute; + _canExecute = canExecute; + } + + #endregion + + #region ICommand Members + + public event EventHandler CanExecuteChanged + { + add + { + + if (_canExecute != null) + CommandManager.RequerySuggested += value; + } + remove + { + + if (_canExecute != null) + CommandManager.RequerySuggested -= value; + } + } + + [DebuggerStepThrough] + public Boolean CanExecute(Object parameter) + { + return _canExecute == null ? true : _canExecute((T)parameter); + } + + public void Execute(Object parameter) + { + _execute((T)parameter); + } + + #endregion + } + + /// + /// A command whose sole purpose is to relay its functionality to other objects by invoking delegates. The default return value for the CanExecute method is 'true'. + /// + public class RelayCommand : ICommand + { + + #region Declarations + + readonly Func _canExecute; + readonly Action _execute; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class and the command can always be executed. + /// + /// The execution logic. + public RelayCommand(Action execute) + : this(execute, null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The execution logic. + /// The execution status logic. + public RelayCommand(Action execute, Func canExecute) + { + + if (execute == null) + throw new ArgumentNullException("execute"); + _execute = execute; + _canExecute = canExecute; + } + + #endregion + + #region ICommand Members + + public event EventHandler CanExecuteChanged + { + add + { + + if (_canExecute != null) + CommandManager.RequerySuggested += value; + } + remove + { + + if (_canExecute != null) + CommandManager.RequerySuggested -= value; + } + } + + [DebuggerStepThrough] + public Boolean CanExecute(Object parameter) + { + return _canExecute == null ? true : _canExecute(); + } + + public void Execute(Object parameter) + { + _execute(); + } + + #endregion + } +} diff --git a/src/AddIns/Analysis/CodeQuality/Src/Utility/ViewModelBase.cs b/src/AddIns/Analysis/CodeQuality/Src/Utility/ViewModelBase.cs new file mode 100644 index 0000000000..599af4b436 --- /dev/null +++ b/src/AddIns/Analysis/CodeQuality/Src/Utility/ViewModelBase.cs @@ -0,0 +1,80 @@ +/* + * Created by SharpDevelop. + * User: Peter Forstmeier + * Date: 03.09.2011 + * Time: 13:36 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; +using System.ComponentModel; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; + +namespace ICSharpCode.CodeQualityAnalysis.Utility +{ + /// + /// Description of ViewModelBase. + /// + public class ViewModelBase:INotifyPropertyChanged + { + public ViewModelBase() + { + } + + + public event PropertyChangedEventHandler PropertyChanged; + + protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) + { + var handler = this.PropertyChanged; + if (handler != null) + { + handler(this, e); + } + } + + + protected void RaisePropertyChanged(Expression> propertyExpresssion) + { + var propertyName = ExtractPropertyName(propertyExpresssion); + this.RaisePropertyChanged(propertyName); + } + + + protected void RaisePropertyChanged(String propertyName) + { + OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); + } + + + private static String ExtractPropertyName(Expression> propertyExpresssion) + { + if (propertyExpresssion == null) + { + throw new ArgumentNullException("propertyExpresssion"); + } + + var memberExpression = propertyExpresssion.Body as MemberExpression; + if (memberExpression == null) + { + throw new ArgumentException("The expression is not a member access expression.", "propertyExpresssion"); + } + + var property = memberExpression.Member as PropertyInfo; + if (property == null) + { + throw new ArgumentException("The member access expression does not access a property.", "propertyExpresssion"); + } + + var getMethod = property.GetGetMethod(true); + if (getMethod.IsStatic) + { + throw new ArgumentException("The referenced property is a static property.", "propertyExpresssion"); + } + + return memberExpression.Member.Name; + } + } +}