///|
fn write_form_control_properties(
  control : FormControl,
  budget? : WritePartBudget,
) -> String raise XlsxError {
  let (_, vml_type) = normalize_form_control_type(control.control_type)
  let object_type = if vml_type == "Checkbox" { "CheckBox" } else { vml_type }
  let sb = LimitedXmlBuilder::new(budget)
  sb.write_view("")
  sb.write_view(
    " {
      let attribute = match object_type {
        "GBox" => "fmlaGroup"
        "Label" => "fmlaTxbx"
        _ => "fmlaLink"
      }
      sb.write_view(" \{attribute}=\"")
      sb.write_xml_attr(link)
      sb.write_view("\"")
    }
    None => ()
  }
  if object_type == "CheckBox" || object_type == "Radio" {
    match control.checked {
      Some(value) => {
        let checked = if value { "Checked" } else { "Unchecked" }
        sb.write_view(" checked=\"\{checked}\"")
      }
      None => ()
    }
  }
  if object_type == "Scroll" || object_type == "Spin" {
    for
      (name, value) in [
        ("val", control.current_val),
        ("min", control.min_val),
        ("max", control.max_val),
        ("inc", control.inc_change),
        ("page", control.page_change),
      ] {
      match value {
        Some(value) => sb.write_view(" \{name}=\"\{value}\"")
        None => ()
      }
    }
  }
  if object_type == "Scroll" {
    match control.horizontally {
      Some(value) => sb.write_view(" horiz=\"\{if value { 1 } else { 0 }}\"")
      None => ()
    }
  }
  match form_control_vml_preset(control.control_type) {
    Some(preset) => {
      if preset.no_three_d {
        sb.write_view(" noThreeD=\"1\"")
      }
      if preset.first_button {
        sb.write_view(" firstButton=\"1\"")
      }
    }
    None => ()
  }
  sb.write_view("/>")
  sb.to_string()
}

///|
fn write_worksheet_controls(
  sb : LimitedXmlBuilder,
  sheet : Worksheet,
  shape_id_start : Int32,
  rel_id_start : Int32,
) -> Unit raise XlsxError {
  // Office 2010 controls keep a VML fallback for older consumers.
  sb.write_view(
    "",
  )
  for index, control in sheet.form_controls() {
    let shape_id = shape_id_start + index
    let rel_id = rel_id_start + index
    let (row, col) = cell_ref_to_rc(control.cell)
    let (end_col, end_x, end_row, end_y) = form_control_end_anchor(
      sheet, control,
    )
    sb.write_view(
      " {
        sb.write_view(" macro=\"")
        sb.write_xml_attr(value)
        sb.write_view("\"")
      }
      None => ()
    }
    match control.format.print_object {
      Some(value) => sb.write_view(" print=\"\{if value { 1 } else { 0 }}\"")
      None => ()
    }
    match control.format.locked {
      Some(value) => sb.write_view(" locked=\"\{if value { 1 } else { 0 }}\"")
      None => ()
    }
    let move_with_cells = !(control.format.positioning is Some(Absolute))
    let size_with_cells = control.format.positioning is Some(TwoCell) ||
      control.format.positioning is None
    sb.write_view(
      ">",
    )
    sb.write_view(
      "\{col - 1}0\{row - 1}0",
    )
    sb.write_view(
      "\{end_col}\{end_x.to_int64() * 9525L}\{end_row}\{end_y.to_int64() * 9525L}",
    )
    sb.write_view("")
  }
  sb.write_view("")
}