using System; using System.Collections.Generic; using System.Text; using System.ComponentModel; using System.Drawing; using Menees.DiffUtils; using System.Diagnostics; namespace sharpcomparer { public class ColumnComparison : Comparison { public ColumnComparison(Column leftItem, Column rightItem, ComparisonDifference difference) : base(leftItem, rightItem, difference) { } public static List Compare(List left, List right) { int i = 0; left.Sort(delegate(Column p1, Column p2) { return p1.OrdinalPosition.CompareTo(p2.OrdinalPosition); }); right.Sort(delegate(Column p1, Column p2) { return p1.OrdinalPosition.CompareTo(p2.OrdinalPosition); }); List c1 = new List(); List c2 = new List(); foreach (Column c in left) { c1.Add(new ColumnComparison(c, null, Comparison.ComparisonDifference.None)); } foreach (Column c in right) { c2.Add(new ColumnComparison(null, c, Comparison.ComparisonDifference.None)); } if (left.Count > 0 && left[0].TableName == "ATTIVITA") { Debug.Write("Break"); } int offset1 = 0; int offset2 = 0; MyersDiff comparer = new MyersDiff(left.ToArray(), right.ToArray(), true); EditScript script = comparer.Execute(); List ColumnsA; List ColumnsB; if (script.Count > 0) { foreach (Edit edit in script) { switch (edit.Type) { case EditType.Insert: ColumnsB = c2.GetRange(edit.StartB + offset2, edit.Length); ColumnsA = new List(); foreach (ColumnComparison b in ColumnsB) { ColumnComparison a = new ColumnComparison(null, b.RightItem, Comparison.ComparisonDifference.RightOnly); ColumnsA.Add(a); } c1.InsertRange(edit.StartA + offset1, ColumnsA); offset1 += edit.Length; break; case EditType.Change: for (i = 0; i < edit.Length; i++) { c1[edit.StartA + offset1 + i].Difference = Comparison.ComparisonDifference.Different; c2[edit.StartA + offset1 + i].Difference = Comparison.ComparisonDifference.Different; c1[edit.StartA + offset1 + i].RightItem = right[edit.StartB]; } break; case EditType.Delete: ColumnsA = c1.GetRange(edit.StartA + offset1, edit.Length); ColumnsB = new List(); foreach (ColumnComparison a in ColumnsA) { ColumnComparison b = new ColumnComparison(a.LeftItem, null, Comparison.ComparisonDifference.LeftOnly); ColumnsB.Add(b); a.Difference = Comparison.ComparisonDifference.LeftOnly; } c2.InsertRange(edit.StartB + offset2, ColumnsB); offset2 += edit.Length; break; case EditType.None: // NOOP break; } } } for (i = 0; i < c1.Count; i++) { ColumnComparison cc1 = c1[i]; ColumnComparison cc2 = c2[i]; if ((cc1.Difference == Comparison.ComparisonDifference.None || cc1.Difference == Comparison.ComparisonDifference.Different) && cc1.RightItem == null) { cc1.RightItem = cc2.RightItem; if (cc1.LeftItem != null && cc1.LeftItem.TableName == "ATTIVITA" && cc2.RightItem == null) { int a = 0; } } } for (i = 0; i < c1.Count; i++) { ColumnComparison cc1 = c1[i]; if ( (cc1.Difference == Comparison.ComparisonDifference.Different && cc1.RightItem == null) || (cc1.Difference == Comparison.ComparisonDifference.None && cc1.RightItem == null) ) { Debug.Assert(false, "null RightItem on Different comparison"); } } return c1; } } }