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;
+ }
+ }
+}