#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

319 lines
8.5 KiB

// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.ComponentModel;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using GraphSharp.Controls;
using ICSharpCode.CodeQualityAnalysis.Controls;
using ICSharpCode.CodeQualityAnalysis.Utility;
using Microsoft.Win32;
namespace ICSharpCode.CodeQualityAnalysis
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
private MetricsReader metricsReader;
public event PropertyChangedEventHandler PropertyChanged;
public MetricsReader MetricsReader
{
get
{
return metricsReader;
}
set
{
metricsReader = value;
NotifyPropertyChanged("MetricsReader");
}
}
public MainWindow()
{
InitializeComponent();
}
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
private void btnOpenAssembly_Click(object sender, RoutedEventArgs e)
{
var fileDialog = new OpenFileDialog
{
Filter = "Component Files (*.dll, *.exe)|*.dll;*.exe"
};
fileDialog.ShowDialog();
if (String.IsNullOrEmpty(fileDialog.FileName))
return;
var dataContext = this.DataContext as MainWindowViewModel;
dataContext.ProgressbarVisible = Visibility.Visible;
dataContext.AssemblyStatsVisible = Visibility.Hidden;
dataContext.FileName = System.IO.Path.GetFileName(fileDialog.FileName);
var worker = new BackgroundWorker();
worker.DoWork += (source, args) => MetricsReader = new MetricsReader(fileDialog.FileName);
worker.RunWorkerCompleted += (source, args) => {
dataContext.ProgressbarVisible = Visibility.Hidden;
dataContext.AssemblyStatsVisible = Visibility.Visible;
dataContext.MainTabEnable = true;
if (args.Error != null) {
ICSharpCode.Core.MessageService.ShowException(args.Error);
return;
}
Helper.FillTree(definitionTree, metricsReader.MainModule);
dataContext.MainModule = metricsReader.MainModule;
FillMatrix();
};
worker.RunWorkerAsync();
}
private void btnRelayout_Click(object sender, RoutedEventArgs e)
{
graphLayout.Relayout();
}
private void btnContinueLayout_Click(object sender, RoutedEventArgs e)
{
graphLayout.ContinueLayout();
}
private void FillMatrix()
{
var matrix = new DependencyMatrix();
foreach (var ns in metricsReader.MainModule.Namespaces) {
matrix.AddRow(ns);
foreach (var type in ns.Types) {
matrix.AddRow(type);
foreach (var field in type.Fields)
matrix.AddRow(field);
foreach (var method in type.Methods)
matrix.AddRow(method);
}
matrix.AddColumn(ns);
foreach (var type in ns.Types) {
matrix.AddColumn(type);
foreach (var field in type.Fields)
matrix.AddColumn(field);
foreach (var method in type.Methods)
matrix.AddColumn(method);
}
}
matrixControl.Matrix = matrix;
matrixControl.DrawTree(metricsReader.MainModule);
}
private void definitionTree_SelectedItemChanged(object sender, SelectionChangedEventArgs e)
{
var item = e.AddedItems[0] as DependecyTreeNode;
if (item != null && item.INode.Dependency != null)
{
definitionTree.SelectedItem = item;
var graph = item.INode.Dependency.BuildDependencyGraph();
graphLayout.ChangeGraph(graph);
var viewModel = this.DataContext as MainWindowViewModel;
//testhalber
viewModel.SelectedNode = item.INode;
}
}
private void graphLayout_VertexClick(object sender, MouseButtonEventArgs e)
{
var vertexControl = sender as VertexControl;
if (vertexControl != null)
{
var vertex = vertexControl.Vertex as DependencyVertex;
if (vertex != null)
{
var d = this.DataContext as MainWindowViewModel;
d.TypeInfo = vertex.Node.GetInfo();
}
}
}
private void btnResetGraph_Click(object sender, RoutedEventArgs e)
{
graphLayout.ResetGraph();
}
private void btnSaveImageGraph_Click(object sender, RoutedEventArgs e)
{
var fileDialog = new SaveFileDialog()
{
Filter = "PNG (*.png)|*.png|JPEG (*.jpg)|*.jpg|GIF (*.gif)|*.gif|BMP (*.bmp)|*.bmp|TIFF (.tiff)|*.tiff"
};
fileDialog.ShowDialog();
if (String.IsNullOrEmpty(fileDialog.FileName))
return;
// render it
var renderBitmap = new RenderTargetBitmap((int)graphLayout.ActualWidth,
(int)graphLayout.ActualHeight,
96d,
96d,
PixelFormats.Default);
renderBitmap.Render(graphLayout);
using (var outStream = new FileStream(fileDialog.FileName, FileMode.Create))
{
BitmapEncoder encoder;
switch (fileDialog.FilterIndex)
{
case 1:
encoder = new PngBitmapEncoder();
break;
case 2:
encoder = new JpegBitmapEncoder();
break;
case 3:
encoder = new GifBitmapEncoder();
break;
case 4:
encoder = new BmpBitmapEncoder();
break;
case 5:
encoder = new TiffBitmapEncoder();
break;
default:
encoder = new PngBitmapEncoder();
break;
}
encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
encoder.Save(outStream);
}
}
/*
private void MetricLevel_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var comboBoxItem = cbxMetrixLevel.SelectedItem as ComboBoxItem;
if (comboBoxItem == null) return;
cbxMetrics.Items.Clear();
var content = comboBoxItem.Content.ToString();
if (content == "Assembly") {
//cbxMetrics.Items.Add(new ComboBoxItem { Content = });
} else if (content == "Namespace") {
} else if (content == "Type") {
} else if (content == "Field") {
} else if (content == "Method") {
cbxMetrics.Items.Add(new ComboBoxItem { Content = "IL instructions" });
cbxMetrics.Items.Add(new ComboBoxItem { Content = "Cyclomatic Complexity" });
cbxMetrics.Items.Add(new ComboBoxItem { Content = "Variables" });
}
}
*/
/*
private void Metrics_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var levelItem = cbxMetrixLevel.SelectedItem as ComboBoxItem;
if (levelItem == null) return;
var level = levelItem.Content.ToString();
var metricItem = cbxMetrics.SelectedItem as ComboBoxItem;
if (metricItem == null) return;
var metric = metricItem.Content.ToString();
// TODO: Redone this with enums or some smarter way
if (level == "Assembly") {
//cbxMetrics.Items.Add(new ComboBoxItem { Content = });
} else if (level == "Namespace") {
} else if (level == "Type") {
} else if (level == "Field") {
} else if (level == "Method") {
// var r = from ns in MetricsReader.MainModule.Namespaces
// from type in ns.Types
// from method in type.Methods
// select method;
treemap.ItemsSource = from ns in MetricsReader.MainModule.Namespaces
from type in ns.Types
from method in type.Methods
select method;
if (metric == "IL instructions")
treemap.ItemDefinition.ValuePath = "Instructions.Count";
if (metric == "Cyclomatic Complexity")
treemap.ItemDefinition.ValuePath = "CyclomaticComplexity";
if (metric == "Variables")
treemap.ItemDefinition.ValuePath = "Variables";
}
}
*/
//http://social.msdn.microsoft.com/Forums/en-MY/wpf/thread/798e100e-249d-413f-a501-50d1db680b94
void TreeMaps_Loaded(object sender, RoutedEventArgs e)
{
ItemsControl itemsControl = sender as ItemsControl;
if (itemsControl!=null)
{
itemsControl.ItemContainerGenerator.StatusChanged += new EventHandler(ItemContainerGenerator_StatusChanged);
}
}
void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
ItemContainerGenerator icg = sender as ItemContainerGenerator;
if (icg!=null&&icg.Status==GeneratorStatus.ContainersGenerated)
{
//Do what you want
// Mouse.OverrideCursor = Cursors.Wait;
icg.StatusChanged -= ItemContainerGenerator_StatusChanged;
}
}
void MenuClose_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
}
}