// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "flutter/shell/platform/common/text_editing_delta.h"

namespace flutter {

TextEditingDelta::TextEditingDelta(const std::u16string& text_before_change,
                                   TextRange range,
                                   const std::u16string& text)
    : old_text_(text_before_change),
      delta_text_(text),
      delta_start_(range.start()),
      delta_end_(range.start() + range.length()) {}

TextEditingDelta::TextEditingDelta(const std::string& text_before_change,
                                   TextRange range,
                                   const std::string& text)
    : old_text_(Utf8ToUtf16(text_before_change)),
      delta_text_(Utf8ToUtf16(text)),
      delta_start_(range.start()),
      delta_end_(range.start() + range.length()) {}

TextEditingDelta::TextEditingDelta(const std::u16string& text)
    : old_text_(text), delta_text_(u""), delta_start_(-1), delta_end_(-1) {}

TextEditingDelta::TextEditingDelta(const std::string& text)
    : old_text_(Utf8ToUtf16(text)),
      delta_text_(u""),
      delta_start_(-1),
      delta_end_(-1) {}

}  // namespace flutter
