components_dialogs_JRKeyboardDialog.bs

import "pkg:/source/translationKeys.bs"
import "pkg:/source/utils/dialogResult.bs"
import "pkg:/source/utils/misc.bs"
import "pkg:/source/utils/translate.bs"

sub init()
  constants = m.global.constants

  ' Theme the built-in dialog chrome from the app palette (replaces the ad-hoc
  ' hardcoded palettes previously duplicated at each StandardKeyboardDialog site)
  dlgPalette = createObject("roSGNode", "RSGPalette")
  dlgPalette.colors = {
    DialogBackgroundColor: constants.colorBackgroundPrimary,
    DialogFocusColor: constants.colorPrimary,
    DialogFocusItemColor: constants.colorTextPrimary,
    DialogSecondaryTextColor: constants.colorTextSecondary,
    DialogSecondaryItemColor: constants.colorSecondary,
    DialogTextColor: constants.colorTextPrimary
  }
  m.top.palette = dlgPalette

  m.top.setField("buttons", [translate(translationKeys.ButtonOk), translate(translationKeys.ButtonCancel)])

  m.resolved = false
  m.top.observeFieldScoped("buttonSelected", "onButtonSelected")
  m.top.observeFieldScoped("wasClosed", "onWasClosed")
end sub

sub onSecureChanged()
  ' setField: BSC cannot resolve fields of the internal node on built-in dialog subtypes
  editBox = m.top.getField("textEditBox")
  if isValid(editBox) then editBox.secureMode = m.top.secure
end sub

sub onButtonSelected()
  if m.top.getField("buttonSelected") = 0
    resolveDialog(false)
  else
    resolveDialog(true)
  end if
  m.top.close = true
end sub

' Back button (or any close without a button press) — resolve as cancelled so the
' caller's observer always fires exactly once.
sub onWasClosed()
  resolveDialog(true)
end sub

sub resolveDialog(cancelled as boolean)
  if m.resolved then return
  m.resolved = true

  ' getField: BSC cannot resolve fields of the internal node on built-in dialog subtypes
  m.top.result = textDialogResult(cancelled, toString(m.top.getField("text")))
end sub