// ========================================
        // method
        // ========================================
        public override void Execute()
        {
            _command    = null;
            _isExecuted = false;

            int charIndexInInline, inlineOffset;
            var inline = _target.GetInlineAt(_charIndex, out charIndexInInline, out inlineOffset);

            if (charIndexInInline != 0)
            {
                _command = new SplitInlineCommand(inline, charIndexInInline);
                _command.Execute();
                _isExecuted = true;
            }
        }
        //public override Range UndoneRange {
        //    get { return _range; }
        //}

        // ========================================
        // method
        // ========================================
        public override void Execute()
        {
            _commands.Clear();

            var line = _target.Parent as LineSegment;

            Contract.Ensures(line != null, "Parent of inline must not be null");

            var inlineIndex = line._Inlines.IndexOf(_target);

            if (_range.End < _target.Length - 1)
            {
                /// rangeより後ろの部分があればそこで分割

                var split = new SplitInlineCommand(_target, _range.End);
                split.Execute();
                _commands.Add(split);
            }

            if (_range.Offset > 0)
            {
                /// rangeより前の部分があれば分割してrange内のinlineにコマンド適用

                var split = new SplitInlineCommand(_target, _range.Offset);
                split.Execute();
                _commands.Add(split);

                var provided = _commandProvider(split.Splitted);
                provided.Execute();
                _commands.Add(provided);
            }
            else
            {
                var provided = _commandProvider(_target);
                provided.Execute();
                _commands.Add(provided);
            }
        }