/**
   * 在指定文本段的 index 处分割文本段
   *
   * @param xe
   * @param segNum
   * @param splitIndex
   */
  public static void splitAt(XlfEditor xe, int segNum, int splitIndex) {
    // 判断该文本段是否可编辑
    String rowID = xe.rowIdOfSegNum(segNum);
    XliffUtil xu = new XliffUtil(rowID);
    SegmentAsserts.segIsEditable(xu);

    // 进入编辑模式,方便读取样式文本框中的内容
    xe.enterEditModeSource(segNum);

    // 在实际进行分割文本段之前,得到原文本段的 tuid 和分割后两个文本段的预期内容,
    // 用以在分割后验证得到的文本段内容是否符合预期。
    String tuid = xe.tuidOfSegNum(segNum);

    // 判断给定的分割点是否可分割,然后在两个分支中分别验证结果
    HsSWTBotStyledText st = xe.getStyledText();

    if (SegmentAsserts.indexIsSplitable(st, splitIndex)) {
      String[] expectedText = st.splitTextAt(splitIndex);

      // 将光标移到指定位置,并点击相应的菜单项进行分割
      xe.navigateToIndex(splitIndex);
      ts.menuTranslationSplitSegment().click();
      xe.getNatTable();

      // 确认文本段已按预期分割
      SegmentAsserts.segIsSplit(tuid, expectedText, xe.getSplitXliffUtil(expectedText));
      System.out.println(
          "[Passed] Segment No.\""
              + segNum
              + "\" was successfully split at Index \""
              + splitIndex
              + "\".");
    } else {
      String expectedText = st.getText();
      String position;

      // 将光标移到指定位置,并点击相应的菜单项进行分割
      if (splitIndex <= 0) {
        position = "Beginning.";
        xe.navigateToBegining();
      } else {
        position = "End.";
        xe.navigateToEnd();
      }
      ts.menuTranslationSplitSegment().click();

      // 弹出提示信息
      InformationDialog dialog =
          new InformationDialog(1, TsUIConstants.getString("msgPlaceCursorToSplit"));
      dialog.lblMessage().isVisible();
      dialog.btnOK().click();

      xe.getNatTable();

      // 确认文本段没有被分割
      SegmentAsserts.segNotSplit(tuid, expectedText, xu);
      System.out.println("[Passed] Segment No.\"" + segNum + "\" was not split at the " + position);
    }
  }
  /**
   * 尝试分割已批准的文本段
   *
   * @param xe 要操作的 XlfEditor 对象
   * @param segNum 尝试分割的文本段序号
   */
  public static void splitApprovedSeg(XlfEditor xe, int segNum) {

    // 判断该文本段是否已批准
    String rowID = xe.rowIdOfSegNum(segNum);
    XliffUtil xu = new XliffUtil(rowID);
    assertTrue(xu.tuIsApproved());

    // 进入编辑模式,方便读取样式文本框中的内容
    xe.enterEditModeSource(segNum);

    // 在实际进行分割文本段之前,得到原文本段的 tuid 和分割后两个文本段的预期内容,
    // 用以在分割后验证得到的文本段内容是否符合预期。
    String tuid = xe.tuidOfSegNum(segNum);

    // 判断给定的分割点是否可分割
    HsSWTBotStyledText st = xe.getStyledText();
    String expectedText = st.getText();

    // 将光标移到任意位置(这里取 index=1),并点击相应的菜单项进行分割
    xe.navigateToIndex(1);
    ts.menuTranslationSplitSegment().click();

    // 弹出提示信息
    InformationDialog dialog =
        new InformationDialog(1, TsUIConstants.getString("msgCannotMergeApprovedSeg"));
    dialog.lblMessage().isVisible();
    dialog.btnOK().click();

    xe.getNatTable();

    // 确认文本段没有被分割
    SegmentAsserts.segNotSplit(tuid, expectedText, xu);
  }
  /**
   * 尝试不将光标置于源文本中直接分割
   *
   * @param xe 要操作的 XlfEditor 对象
   * @param segNum 尝试分割的文本段序号
   */
  public static void splitWithoutCursor(XlfEditor xe, int segNum) {

    // 判断该文本段是否可编辑
    String rowID = xe.rowIdOfSegNum(segNum);
    XliffUtil xu = new XliffUtil(rowID);
    SegmentAsserts.segIsEditable(xu);

    // 选中文本段的源文本单元格,而不进入编辑状态
    xe.selectSourceCell(segNum);

    // 在实际进行分割文本段之前,得到原文本段的 tuid,用以验证得到的文本段内容是否符合预期。
    String tuid = xe.tuidOfSegNum(segNum);

    // 判断给定的分割点是否可分割
    SWTBotNatTable nt = xe.getNatTable();
    Position pos = nt.positionOfSelectedCell();
    String expectedText = nt.getTextByPosition(pos.line, pos.column);

    // 点击相应的菜单项进行分割
    ts.menuTranslationSplitSegment().click();

    // 弹出提示信息
    InformationDialog dialog =
        new InformationDialog(1, TsUIConstants.getString("msgPlaceCursorToSplit"));
    dialog.lblMessage().isVisible();
    dialog.btnOK().click();

    xe.getNatTable();

    // 确认文本段没有被分割
    SegmentAsserts.segNotSplit(tuid, expectedText, xu);
  }
 /** 未打开文件时,分割文本段功能被禁用 */
 public static void splitWithoutFile() {
   assertTrue(HSBot.bot().editors().isEmpty());
   assertTrue(!ts.menuTranslationSplitSegment().isEnabled());
 }
/**
 * 分割文本段的常用方法
 *
 * @author felix_lu
 */
public class SplitSegment {

  static TS ts = TS.getInstance();

  /**
   * 在指定文本段的 index 处分割文本段
   *
   * @param xe
   * @param segNum
   * @param splitIndex
   */
  public static void splitAt(XlfEditor xe, int segNum, int splitIndex) {
    // 判断该文本段是否可编辑
    String rowID = xe.rowIdOfSegNum(segNum);
    XliffUtil xu = new XliffUtil(rowID);
    SegmentAsserts.segIsEditable(xu);

    // 进入编辑模式,方便读取样式文本框中的内容
    xe.enterEditModeSource(segNum);

    // 在实际进行分割文本段之前,得到原文本段的 tuid 和分割后两个文本段的预期内容,
    // 用以在分割后验证得到的文本段内容是否符合预期。
    String tuid = xe.tuidOfSegNum(segNum);

    // 判断给定的分割点是否可分割,然后在两个分支中分别验证结果
    HsSWTBotStyledText st = xe.getStyledText();

    if (SegmentAsserts.indexIsSplitable(st, splitIndex)) {
      String[] expectedText = st.splitTextAt(splitIndex);

      // 将光标移到指定位置,并点击相应的菜单项进行分割
      xe.navigateToIndex(splitIndex);
      ts.menuTranslationSplitSegment().click();
      xe.getNatTable();

      // 确认文本段已按预期分割
      SegmentAsserts.segIsSplit(tuid, expectedText, xe.getSplitXliffUtil(expectedText));
      System.out.println(
          "[Passed] Segment No.\""
              + segNum
              + "\" was successfully split at Index \""
              + splitIndex
              + "\".");
    } else {
      String expectedText = st.getText();
      String position;

      // 将光标移到指定位置,并点击相应的菜单项进行分割
      if (splitIndex <= 0) {
        position = "Beginning.";
        xe.navigateToBegining();
      } else {
        position = "End.";
        xe.navigateToEnd();
      }
      ts.menuTranslationSplitSegment().click();

      // 弹出提示信息
      InformationDialog dialog =
          new InformationDialog(1, TsUIConstants.getString("msgPlaceCursorToSplit"));
      dialog.lblMessage().isVisible();
      dialog.btnOK().click();

      xe.getNatTable();

      // 确认文本段没有被分割
      SegmentAsserts.segNotSplit(tuid, expectedText, xu);
      System.out.println("[Passed] Segment No.\"" + segNum + "\" was not split at the " + position);
    }
  }

  /**
   * @param xe 要操作的 XlfEditor 对象
   * @param segNum 要分割的文本段序号
   * @param afterText 在此文本之后分割
   */
  public static void splitAfter(XlfEditor xe, int segNum, String afterText) {
    SWTBotNatTable nt = xe.getNatTable();
    xe.selectSourceCell(segNum);
    Position pos = nt.positionOfSelectedCell();
    String expectedText = nt.getTextByPosition(pos.line, pos.column);
    int splitIndex = StringUtil.indexAfterWithAssert(expectedText, afterText);
    splitAt(xe, segNum, splitIndex);
  }

  /**
   * @param xe 要操作的 XlfEditor 对象
   * @param segSourceText 要分割的文本段源文本内容
   * @param afterText 在此文本之后分割
   */
  public static void splitAfter(XlfEditor xe, String segSourceText, String afterText) {
    int segNum = xe.segNumOfSource(segSourceText);
    splitAfter(xe, segNum, afterText);
  }

  /**
   * @param xe 要操作的 XlfEditor 对象
   * @param segNum 要分割的文本段序号
   * @param beforeText 在此文本之前分割
   */
  public static void splitBefore(XlfEditor xe, int segNum, String beforeText) {
    SWTBotNatTable nt = xe.getNatTable();
    xe.selectSourceCell(segNum);
    Position pos = nt.positionOfSelectedCell();
    String expectedText = nt.getTextByPosition(pos.line, pos.column);
    int splitIndex = StringUtil.indexBeforeWithAssert(expectedText, beforeText);
    splitAt(xe, segNum, splitIndex);
  }

  /**
   * @param xe 要操作的 XlfEditor 对象
   * @param segSourceText 要分割的文本段源文本内容
   * @param beforeText 在此文本之前分割
   */
  public static void splitBefore(XlfEditor xe, String segSourceText, String beforeText) {
    int segNum = xe.segNumOfSource(segSourceText);
    splitBefore(xe, segNum, beforeText);
  }

  /**
   * @param xe 要操作的 XlfEditor 对象
   * @param segNum 要分割的文本段序号
   * @param afterText 在此文本之后分割,此内容在文本段中必须与下一个参数相邻
   * @param beforeText 在此文本之前分割,此内容在文本段中必须与上一个参数相邻
   */
  public static void splitBetween(XlfEditor xe, int segNum, String afterText, String beforeText) {
    SWTBotNatTable nt = xe.getNatTable();
    xe.selectSourceCell(segNum);
    Position pos = nt.positionOfSelectedCell();
    String expectedText = nt.getTextByPosition(pos.line, pos.column);
    int splitIndex = StringUtil.indexBetweenWithAssert(expectedText, afterText, beforeText);
    splitAt(xe, segNum, splitIndex);
  }

  /**
   * @param xe 要操作的 XlfEditor 对象
   * @param segSourceText 要分割的文本段源文本内容
   * @param afterText 在此文本之后分割,此内容在文本段中必须与下一个参数相邻
   * @param beforeText 在此文本之前分割,此内容在文本段中必须与上一个参数相邻
   */
  public static void splitBetween(
      XlfEditor xe, String segSourceText, String afterText, String beforeText) {
    int segNum = xe.segNumOfSource(segSourceText);
    splitBetween(xe, segNum, afterText, beforeText);
  }

  /**
   * 尝试从段首分割文本段
   *
   * @param xe 要操作的 XlfEditor 对象
   * @param segNum 尝试分割的文本段序号
   */
  public static void splitAtBeginning(XlfEditor xe, int segNum) {
    splitAt(xe, segNum, 0);
  }

  /**
   * 尝试从段末分割文本段
   *
   * @param xe 要操作的 XlfEditor 对象
   * @param segNum 尝试分割的文本段序号
   */
  public static void splitAtEnd(XlfEditor xe, int segNum) {
    SWTBotNatTable nt = xe.getNatTable();
    xe.selectSourceCell(segNum);
    Position pos = nt.positionOfSelectedCell();
    String expectedText = nt.getTextByPosition(pos.line, pos.column);
    int splitIndex = expectedText.length();
    splitAt(xe, segNum, splitIndex);
  }

  /**
   * 尝试不将光标置于源文本中直接分割
   *
   * @param xe 要操作的 XlfEditor 对象
   * @param segNum 尝试分割的文本段序号
   */
  public static void splitWithoutCursor(XlfEditor xe, int segNum) {

    // 判断该文本段是否可编辑
    String rowID = xe.rowIdOfSegNum(segNum);
    XliffUtil xu = new XliffUtil(rowID);
    SegmentAsserts.segIsEditable(xu);

    // 选中文本段的源文本单元格,而不进入编辑状态
    xe.selectSourceCell(segNum);

    // 在实际进行分割文本段之前,得到原文本段的 tuid,用以验证得到的文本段内容是否符合预期。
    String tuid = xe.tuidOfSegNum(segNum);

    // 判断给定的分割点是否可分割
    SWTBotNatTable nt = xe.getNatTable();
    Position pos = nt.positionOfSelectedCell();
    String expectedText = nt.getTextByPosition(pos.line, pos.column);

    // 点击相应的菜单项进行分割
    ts.menuTranslationSplitSegment().click();

    // 弹出提示信息
    InformationDialog dialog =
        new InformationDialog(1, TsUIConstants.getString("msgPlaceCursorToSplit"));
    dialog.lblMessage().isVisible();
    dialog.btnOK().click();

    xe.getNatTable();

    // 确认文本段没有被分割
    SegmentAsserts.segNotSplit(tuid, expectedText, xu);
  }

  /**
   * 尝试分割已批准的文本段
   *
   * @param xe 要操作的 XlfEditor 对象
   * @param segNum 尝试分割的文本段序号
   */
  public static void splitApprovedSeg(XlfEditor xe, int segNum) {

    // 判断该文本段是否已批准
    String rowID = xe.rowIdOfSegNum(segNum);
    XliffUtil xu = new XliffUtil(rowID);
    assertTrue(xu.tuIsApproved());

    // 进入编辑模式,方便读取样式文本框中的内容
    xe.enterEditModeSource(segNum);

    // 在实际进行分割文本段之前,得到原文本段的 tuid 和分割后两个文本段的预期内容,
    // 用以在分割后验证得到的文本段内容是否符合预期。
    String tuid = xe.tuidOfSegNum(segNum);

    // 判断给定的分割点是否可分割
    HsSWTBotStyledText st = xe.getStyledText();
    String expectedText = st.getText();

    // 将光标移到任意位置(这里取 index=1),并点击相应的菜单项进行分割
    xe.navigateToIndex(1);
    ts.menuTranslationSplitSegment().click();

    // 弹出提示信息
    InformationDialog dialog =
        new InformationDialog(1, TsUIConstants.getString("msgCannotMergeApprovedSeg"));
    dialog.lblMessage().isVisible();
    dialog.btnOK().click();

    xe.getNatTable();

    // 确认文本段没有被分割
    SegmentAsserts.segNotSplit(tuid, expectedText, xu);
  }

  /**
   * 尝试分割已锁定的文本段
   *
   * @param xe 要操作的 XlfEditor 对象
   * @param segNum 尝试分割的文本段序号
   */
  public static void splitUntranslatableSeg(XlfEditor xe, int segNum) {
    // TODO 根据 R8 的实现,可考虑与上一个方法合并,否则还需要单独考虑“已批准且已锁定”文本段的情况
  }

  /** 未打开文件时,分割文本段功能被禁用 */
  public static void splitWithoutFile() {
    assertTrue(HSBot.bot().editors().isEmpty());
    assertTrue(!ts.menuTranslationSplitSegment().isEnabled());
  }
}