コード例 #1
0
ファイル: Comparison.cs プロジェクト: treiduce/SCModManager
        public void ResolveAs(Side side)
        {
            ResultBlock result;

            if (!HasSide(side))
            {
                result = new ResultBlock(string.Empty, PrevBlock);
            }
            else if (side == Side.Left)
            {
                result = new ResultBlock(left, PrevBlock);
            }
            else
            {
                result = new ResultBlock(right, PrevBlock);
            }

            result.NextBlock = NextBlock;
            if (NextBlock != null)
            {
                NextBlock.PrevBlock = result;
            }

            RebuildRequested?.Invoke(this, new RebuildRequestEventArgs(result));
        }
コード例 #2
0
ファイル: Comparison.cs プロジェクト: treiduce/SCModManager
 public ResultBlock(string both, ResultBlock previous)
     : this(previous)
 {
     left         = right = effectiveLeft = effectiveRight = effectiveResult = both;
     IsEqual      = hasLeft = hasRight = true;
     IsWhiteSpace = String.IsNullOrWhiteSpace(both);
 }
コード例 #3
0
ファイル: Comparison.cs プロジェクト: treiduce/SCModManager
        private void Result_RebuildRequested(object sender, RebuildRequestEventArgs e)
        {
            if (Root == sender)
            {
                Root = e.First;
            }

            (sender as ResultBlock).RebuildRequested -= Result_RebuildRequested;
            RebuildRequested?.Invoke(sender, e);
        }
コード例 #4
0
ファイル: Comparison.cs プロジェクト: treiduce/SCModManager
        public Comparison(List <Diff> source)
        {
            ResultBlock current = null;
            ResultBlock result;

            int i = 0;

            for (; i < source.Count - 1; i++)
            {
                if (source[i].Operation.IsEqual)
                {
                    result = new ResultBlock(source[i].Text, current);
                }
                else if (!source[i + 1].Operation.IsEqual)
                {
                    var left  = source[i].Operation.IsDelete ? source[i].Text : source[i + 1].Text;
                    var right = source[i].Operation.IsDelete ? source[i + 1].Text : source[i].Text;
                    result = new ResultBlock(left, right, current);
                    i     += 1;
                }
                else
                {
                    result = new ResultBlock(source[i].Text, source[i].Operation.IsDelete, current);
                }

                if (current == null)
                {
                    Root = result;
                }

                current = result;
                result.RebuildRequested += Result_RebuildRequested;
                result.RedrawRequested  += Result_RedrawRequested;
            }

            if (i < source.Count)
            {
                if (source.Last().Operation.IsEqual)
                {
                    result = new ResultBlock(source[i].Text, current);
                }
                else
                {
                    result = new ResultBlock(source[i].Text, source[i].Operation.IsDelete, current);
                }

                if (current == null)
                {
                    Root = result;
                }

                result.RebuildRequested += Result_RebuildRequested;
                result.RedrawRequested  += Result_RedrawRequested;
            }
        }
コード例 #5
0
ファイル: Comparison.cs プロジェクト: treiduce/SCModManager
        internal void Append(string insertedText)
        {
            var block = Root;

            while (block?.NextBlock != null)
            {
                block = block.NextBlock;
            }

            var newBlock = new ResultBlock(insertedText, block);
        }
コード例 #6
0
ファイル: Comparison.cs プロジェクト: treiduce/SCModManager
 private ResultBlock(ResultBlock previous)
 {
     TakeLeft          = ReactiveCommand.Create(() => ResolveAs(Side.Left));
     TakeRight         = ReactiveCommand.Create(() => ResolveAs(Side.Right));
     TakeLeftThenRight = ReactiveCommand.Create(() => ResolveAs(Side.Left, Side.Right));
     TakeRightThenLeft = ReactiveCommand.Create(() => ResolveAs(Side.Right, Side.Left));
     PrevBlock         = previous;
     if (PrevBlock != null)
     {
         PrevBlock.NextBlock = this;
     }
 }
コード例 #7
0
ファイル: MergeProcess.cs プロジェクト: treiduce/SCModManager
        private bool AreAllConflictsResolved()
        {
            ResultBlock block = Comparison.Root;

            while (block != null)
            {
                if (block.IsConflict &&
                    !(HideWhiteSpace && block.IsWhiteSpace))
                {
                    return(false);
                }
                block = block.NextBlock;
            }

            return(true);
        }
コード例 #8
0
ファイル: Comparison.cs プロジェクト: treiduce/SCModManager
        internal int GetOffsetToBlock(ResultBlock block, Side side)
        {
            var current = Root;
            var start   = 0;

            while (current != null)
            {
                if (current == block)
                {
                    return(start);
                }
                start  += current.Length(side);
                current = current.NextBlock;
            }

            return(-1);
        }
コード例 #9
0
ファイル: Comparison.cs プロジェクト: treiduce/SCModManager
        public ResultBlock(string left, string right, ResultBlock previous)
            : this(previous)
        {
            var totalLen = Math.Max(left.Length, right.Length);

            var leftLines  = left.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
            var rightLines = right.Split(new[] { Environment.NewLine }, StringSplitOptions.None);

            effectiveLeft  = left;
            effectiveRight = right;

            if (leftLines.Length < rightLines.Length)
            {
                var contents = string.Join(Environment.NewLine, rightLines.Skip(leftLines.Length).Select(s => new string(' ', s.Length)));

                effectiveLeft = $"{effectiveLeft}{Environment.NewLine}{contents}";
            }
            else if (leftLines.Length > rightLines.Length)
            {
                var contents = string.Join(Environment.NewLine, leftLines.Skip(rightLines.Length).Select(s => new string(' ', s.Length)));

                effectiveRight = $"{effectiveRight}{Environment.NewLine}{contents}";
            }

            effectiveResult = string.Empty;
            var lineCount = Math.Max(leftLines.Length, rightLines.Length);

            for (int i = 0; i < lineCount; i++)
            {
                var l = i < leftLines.Length ? leftLines[i] : string.Empty;
                var r = i < rightLines.Length ? rightLines[i] : string.Empty;

                var ll = Math.Max(l.Length, r.Length);

                effectiveResult += string.Concat(new string(' ', ll), Environment.NewLine);
            }

            this.left  = left;
            this.right = right;

            hasLeft = hasRight = true;

            IsConflict   = true;
            IsWhiteSpace = String.IsNullOrWhiteSpace(left) && String.IsNullOrWhiteSpace(right);
        }
コード例 #10
0
ファイル: Comparison.cs プロジェクト: treiduce/SCModManager
 public ResultBlock(string either, bool isAdd, ResultBlock previous)
     : this(previous)
 {
     if (isAdd)
     {
         left = effectiveLeft = effectiveResult = either;
         var rightLines = left.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
         right   = effectiveRight = string.Join(Environment.NewLine, rightLines.Select(l => new string(' ', l.Length)));
         hasLeft = true;
     }
     else
     {
         right = effectiveRight = effectiveResult = either;
         var leftLines = right.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
         left     = effectiveLeft = string.Join(Environment.NewLine, leftLines.Select(l => new string(' ', l.Length)));
         hasRight = true;
     }
     IsWhiteSpace = String.IsNullOrWhiteSpace(either);
 }
コード例 #11
0
ファイル: MergeViewer.cs プロジェクト: treiduce/SCModManager
        protected override void OnPreviewMouseUp(MouseButtonEventArgs e)
        {
            var vpos = e.GetPosition(this);
            var pos  = this.GetPositionFromPoint(vpos);

            if (pos != null)
            {
                if (selectedBlock != null)
                {
                    selectedBlock.IsSelected = false;
                }

                var offs  = Document.GetOffset(pos.Value.Location);
                var block = Contents.GetBlockContainingOffset(offs, Side);

                if (block != null && !block.Block.IsEqual)
                {
                    selectedBlock            = block.Block;
                    selectedBlock.IsSelected = true;
                }
            }

            base.OnMouseUp(e);
        }
コード例 #12
0
ファイル: Comparison.cs プロジェクト: treiduce/SCModManager
 public RebuildRequestEventArgs(ResultBlock first)
 {
     First = first;
 }
コード例 #13
0
ファイル: Comparison.cs プロジェクト: treiduce/SCModManager
 public RebuildRequestEventArgs(ResultBlock first, ResultBlock second)
 {
     First  = first;
     Second = second;
 }
コード例 #14
0
ファイル: Comparison.cs プロジェクト: treiduce/SCModManager
        public void ResolveAs(Side first, Side second)
        {
            RebuildRequestEventArgs args;

            ResultBlock firstBlock  = null;
            ResultBlock secondBlock = null;

            var current = this;

            if (HasSide(first))
            {
                ResultBlock result;

                if (first == Side.Left)
                {
                    result = new ResultBlock(left, PrevBlock);
                }
                else
                {
                    result = new ResultBlock(right, PrevBlock);
                }

                result.NextBlock = NextBlock;

                if (NextBlock != null)
                {
                    current.NextBlock.PrevBlock = result;
                }

                firstBlock = current = result;
            }

            if (HasSide(second))
            {
                ResultBlock result;

                var prev = HasSide(first) ? current : PrevBlock;

                if (second == Side.Left)
                {
                    result = new ResultBlock(left, prev);
                }
                else
                {
                    result = new ResultBlock(right, prev);
                }

                result.NextBlock = NextBlock;

                if (NextBlock != null)
                {
                    current.NextBlock.PrevBlock = result;
                }

                if (current == this)
                {
                    firstBlock = current = result;
                }
                else
                {
                    secondBlock = result;
                }
            }

            args = new RebuildRequestEventArgs(firstBlock, secondBlock);

            RebuildRequested?.Invoke(this, args);
            RebuildRequested = null;
        }