/**
 * Tests for #7019: FILL-IN issues.
 *
 * Extended version: the logical fill-in and an editor added.
 * 
 * This test will eventually contain all kinds of editors to test them for other issues and
 * regressions.
 */
{FWDREVISION.i}

// MESSAGE SESSION:DATE-FORMAT.
// MESSAGE SESSION:NUMERIC-FORMAT.

/**
 * Now test suite support setting SESSION:DATE-FORMAT dinamically, so we need not to fix it.
 */
IF SESSION:DISPLAY-TYPE = 'GUI' THEN DO:
  CURRENT-WINDOW:TITLE="{&FWDREVISION}" + SESSION:DATE-FORMAT + " " + SESSION:NUMERIC-FORMAT.
  CURRENT-WINDOW:HEIGHT-CHARS = 33.
  CURRENT-WINDOW:WIDTH-CHARS = 80.
END.


/**
 * The DECIMAL FILL-IN and its format text
 */
DEFINE VARIABLE v AS DECIMAL /* NO-UNDO */ VIEW-AS FILL-IN SIZE 30 BY 1 FONT 1.
DEFINE VARIABLE vFormat AS CHARACTER /* NO-UNDO */ FORMAT "x(256)" VIEW-AS FILL-IN SIZE 30 BY 1 FONT 1.

/**
 * The DATE FILL-IN and its format text
 */
DEFINE VARIABLE d AS DATE /* NO-UNDO */ VIEW-AS FILL-IN SIZE 30 BY 1 FONT 1.
DEFINE VARIABLE dFormat AS CHARACTER /* NO-UNDO */ FORMAT "x(256)" VIEW-AS FILL-IN SIZE 30 BY 1 FONT 1.

/**
 * The INTEGER FILL-IN and its format text
 */
DEFINE VARIABLE i AS INTEGER /* NO-UNDO */ VIEW-AS FILL-IN SIZE 30 BY 1 FONT 1.
DEFINE VARIABLE iFormat AS CHARACTER /* NO-UNDO */ FORMAT "x(256)" VIEW-AS FILL-IN SIZE 30 BY 1 FONT 1.

/**
 * The CHARACTER FILL-IN and its format text
 */
DEFINE VARIABLE s AS CHARACTER /* NO-UNDO */ VIEW-AS FILL-IN SIZE 30 BY 1 FONT 1.
DEFINE VARIABLE sFormat AS CHARACTER /* NO-UNDO */ FORMAT "x(256)" VIEW-AS FILL-IN SIZE 30 BY 1 FONT 1.

/**
 * The LOGICAL FILL-IN and its format text
 */
DEFINE VARIABLE l AS LOGICAL /* NO-UNDO */ VIEW-AS FILL-IN SIZE 30 BY 1 FONT 1.
DEFINE VARIABLE lFormat AS CHARACTER /* NO-UNDO */ FORMAT "x(256)" VIEW-AS FILL-IN SIZE 30 BY 1 FONT 1.

DEFINE VARIABLE e AS CHARACTER /* NO-UNDO */ VIEW-AS EDITOR SIZE 30 BY 5 FONT 1.

/**
 * If useEditor is FALSE, this field is used as source/target to receive/provide SCREEN-VALUE and FORMAT for FILL-INs under testing
 */
DEFINE VARIABLE valueEditor AS CHARACTER /* NO-UNDO */ FORMAT "x(256)" VIEW-AS FILL-IN SIZE 30 BY 1 FONT 1.

/**
 * When this box is checked, the editor widget is used instead of value FILL-IN
 */
DEFINE VARIABLE useEditor AS LOGICAL NO-UNDO VIEW-AS TOGGLE-BOX SIZE 30 BY 1 FONT 1.

/**
 * Pressing one of these buttons set the SCREEN-VALUE of the 
 * corresponding FILL-IN from the valueEditor FILL-IN
 */
DEFINE BUTTON bSetDecimal LABEL "Set decimal" SIZE 30 BY 1 FONT 1.
DEFINE BUTTON bSetInteger LABEL "Set integer" SIZE 30 BY 1 FONT 1.
DEFINE BUTTON bSetCharacter LABEL "Set character" SIZE 30 BY 1 FONT 1.
DEFINE BUTTON bSetDate LABEL "Set date" SIZE 30 BY 1 FONT 1.
DEFINE BUTTON bSetLogical LABEL "Set logical" SIZE 30 BY 1 FONT 1.

/**
 * Pressing one of these buttons set the valueEditor SCREEN-VALUE from the
 * corresponding FILL-IN
 */
DEFINE BUTTON bGetDecimal LABEL "Get decimal" SIZE 30 BY 1 FONT 1.
DEFINE BUTTON bGetInteger LABEL "Get integer" SIZE 30 BY 1 FONT 1.
DEFINE BUTTON bGetCharacter LABEL "Get character" SIZE 30 BY 1 FONT 1.
DEFINE BUTTON bGetDate LABEL "Get date" SIZE 30 BY 1 FONT 1.
DEFINE BUTTON bGetLogical LABEL "Get logical" SIZE 30 BY 1 FONT 1.

/**
 * Pressing one of these buttons set the format spec of the 
 * corresponding FILL-IN from the valueEditor FILL-IN
 */
DEFINE BUTTON bSetDecimalFormat LABEL "Set decimal format" SIZE 30 BY 1 FONT 1.
DEFINE BUTTON bSetIntegerFormat LABEL "Set integer format" SIZE 30 BY 1 FONT 1.
DEFINE BUTTON bSetCharacterFormat LABEL "Set character format" SIZE 30 BY 1 FONT 1.
DEFINE BUTTON bSetDateFormat LABEL "Set date format" SIZE 30 BY 1 FONT 1.
DEFINE BUTTON bSetLogicalFormat LABEL "Set log. format" SIZE 30 BY 1 FONT 1.


/**
 * Set session date format like SESSION:DATE-FORMAT = 'mdy'.
 */
DEFINE BUTTON bSessionDateFormat LABEL "Set DATE-FORMAT" SIZE 30 BY 1 FONT 1.
 
/**
 * Set session SESSION:YEAR-OFFSET, e.g. 1950, 1920 or 2000, 2050
 */
DEFINE BUTTON bSessionYearOffset LABEL "Set YEAR-OFFSET" SIZE 30 BY 1 FONT 1.

/**
 * Set session SESSION:NUMERIC-FORMAT, e.g. ".," or ".,"
 */
DEFINE BUTTON bSessionNumericFormat LABEL "Set NUMERIC-FORMAT" SIZE 30 BY 1 FONT 1.

DEFINE FRAME f
  "Decimal:   "     v AT ROW 1 COLUMN 10 NO-LABEL vFormat AT ROW 1 COLUMN 42 NO-LABEL SKIP
  "Integer:   "     i AT ROW 2 COLUMN 10 NO-LABEL iFormat AT ROW 2 COLUMN 42 NO-LABEL SKIP
  "Char: "          s AT ROW 3 COLUMN 10 NO-LABEL sFormat AT ROW 3 COLUMN 42 NO-LABEL SKIP
  "Date:      "     d AT ROW 4 COLUMN 10 NO-LABEL dFormat AT ROW 4 COLUMN 42 NO-LABEL SKIP
  "Logical:   "     l AT ROW 5 COLUMN 10 NO-LABEL lFormat AT ROW 5 COLUMN 42 NO-LABEL SKIP
  "Value: "  valueEditor AT ROW 6 COLUMN 10 NO-LABEL SKIP
  bSetDecimal         AT ROW 7 COLUMN 10 NO-LABEL SKIP
  bSetInteger         AT ROW 8 COLUMN 10 NO-LABEL SKIP
  bSetCharacter       AT ROW 9 COLUMN 10 NO-LABEL SKIP
  bSetDate            AT ROW 10 COLUMN 10 NO-LABEL SKIP
  bSetLogical         AT ROW 11 COLUMN 10 NO-LABEL SKIP

  bGetDecimal         AT ROW 12 COLUMN 10 NO-LABEL SKIP
  bGetInteger         AT ROW 13 COLUMN 10 NO-LABEL SKIP
  bGetCharacter       AT ROW 14 COLUMN 10 NO-LABEL SKIP
  bGetDate            AT ROW 15 COLUMN 10 NO-LABEL SKIP
  bGetLogical         AT ROW 16 COLUMN 10 NO-LABEL SKIP
  
  bSetDecimalFormat   AT ROW 17 COLUMN 10 NO-LABEL SKIP
  bSetIntegerFormat   AT ROW 18 COLUMN 10 NO-LABEL SKIP
  bSetCharacterFormat AT ROW 19 COLUMN 10 NO-LABEL SKIP
  bSetDateFormat      AT ROW 20 COLUMN 10 NO-LABEL SKIP
  bSetLogicalFormat   AT ROW 21 COLUMN 10 NO-LABEL SKIP
  
  bSessionDateFormat  AT ROW 22 COLUMN 10 NO-LABEL SKIP
  bSessionYearOffset  AT ROW 23 COLUMN 10 NO-LABEL SKIP
  bSessionNumericFormat AT ROW 24 COLUMN 10 NO-LABEL SKIP
  e                   AT ROW 25 COLUMN 10 NO-LABEL SKIP
  useEditor           AT ROW 30 COLUMN 10 NO-LABEL SKIP
  
  WITH SIZE 75 BY 31 TITLE "Test 7019 ext."
  .
    
vFormat:READ-ONLY = TRUE.
dFormat:READ-ONLY = TRUE.
iFormat:READ-ONLY = TRUE.
sFormat:READ-ONLY = TRUE.
lFormat:READ-ONLY = TRUE.

vFormat:TAB-STOP = FALSE.
dFormat:TAB-STOP = FALSE.
iFormat:TAB-STOP = FALSE.
sFormat:TAB-STOP = FALSE.
lFormat:TAB-STOP = FALSE.

vFormat:SCREEN-VALUE = v:FORMAT.
dFormat:SCREEN-VALUE = d:FORMAT + " " + SESSION:DATE-FORMAT + " " + STRING(SESSION:YEAR-OFFSET).
iFormat:SCREEN-VALUE = i:FORMAT.
sFormat:SCREEN-VALUE = s:FORMAT.
lFormat:SCREEN-VALUE = l:FORMAT.

/* Set new value handlers */
ON CHOOSE OF bSetDecimal DO:
  v:SCREEN-VALUE = IF useEditor THEN e:SCREEN-VALUE ELSE valueEditor:SCREEN-VALUE.
END.

ON CHOOSE OF bSetInteger DO:
  i:SCREEN-VALUE = IF useEditor THEN e:SCREEN-VALUE ELSE valueEditor:SCREEN-VALUE.
END.

ON CHOOSE OF bSetCharacter DO:
  s:SCREEN-VALUE = IF useEditor THEN e:SCREEN-VALUE ELSE valueEditor:SCREEN-VALUE.
END.

ON CHOOSE OF bSetDate DO:
  d:SCREEN-VALUE = IF useEditor THEN e:SCREEN-VALUE ELSE valueEditor:SCREEN-VALUE.
END.

ON CHOOSE OF bSetLogical DO:
  l:SCREEN-VALUE = IF useEditor THEN e:SCREEN-VALUE ELSE valueEditor:SCREEN-VALUE.
END.

/* Get new value handlers */
ON CHOOSE OF bGetDecimal DO:
  IF useEditor THEN
     e:SCREEN-VALUE = v:SCREEN-VALUE.
  ELSE
     valueEditor:SCREEN-VALUE = v:SCREEN-VALUE.
END.

ON CHOOSE OF bGetInteger DO:
  IF useEditor THEN e:SCREEN-VALUE = i:SCREEN-VALUE. ELSE valueEditor:SCREEN-VALUE = i:SCREEN-VALUE.
END.

ON CHOOSE OF bGetCharacter DO:
  IF useEditor THEN e:SCREEN-VALUE = s:SCREEN-VALUE. ELSE valueEditor:SCREEN-VALUE = s:SCREEN-VALUE.
END.

ON CHOOSE OF bGetDate DO:
  ASSIGN d.
  IF useEditor THEN e:SCREEN-VALUE = STRING(d). ELSE valueEditor:SCREEN-VALUE = STRING(d).
END.

ON CHOOSE OF bGetLogical DO:
  ASSIGN l.
  IF useEditor THEN e:SCREEN-VALUE = l:SCREEN-VALUE. ELSE valueEditor:SCREEN-VALUE = l:SCREEN-VALUE.
END.

ON CHOOSE OF bSetDecimalFormat DO:
  v:FORMAT = IF useEditor THEN e:SCREEN-VALUE ELSE valueEditor:SCREEN-VALUE.
  MESSAGE "Decimal format is now" v:FORMAT.
  vFormat:SCREEN-VALUE = v:FORMAT.
END.

ON CHOOSE OF bSetIntegerFormat DO:
  i:FORMAT = IF useEditor THEN e:SCREEN-VALUE ELSE valueEditor:SCREEN-VALUE.
  MESSAGE "Integer format is now" i:FORMAT.
  iFormat:SCREEN-VALUE = i:FORMAT.
END.

ON CHOOSE OF bSetCharacterFormat DO:
  s:FORMAT = IF useEditor THEN e:SCREEN-VALUE ELSE valueEditor:SCREEN-VALUE.
  MESSAGE "Character format is now" s:FORMAT.
  sFormat:SCREEN-VALUE = s:FORMAT.
END.

ON CHOOSE OF bSetDateFormat DO:
  d:FORMAT = IF useEditor THEN e:SCREEN-VALUE ELSE valueEditor:SCREEN-VALUE NO-ERROR.
  MESSAGE ERROR-STATUS:ERROR.
  MESSAGE ERROR-STATUS:NUM-MESSAGES.
  MESSAGE ERROR-STATUS:GET-MESSAGE(1).
  
  MESSAGE "Date format is now" d:FORMAT.
  dFormat:SCREEN-VALUE = d:FORMAT + " " + SESSION:DATE-FORMAT + " " + STRING(SESSION:YEAR-OFFSET).
END.

ON CHOOSE OF bSetLogicalFormat DO:
  l:FORMAT = IF useEditor THEN e:SCREEN-VALUE ELSE valueEditor:SCREEN-VALUE.
  MESSAGE "Logical format is now" l:FORMAT.
  lFormat:SCREEN-VALUE = l:FORMAT.
END.

ON CHOOSE OF bSessionDateFormat DO:
  SESSION:DATE-FORMAT = IF useEditor THEN e:SCREEN-VALUE ELSE valueEditor:SCREEN-VALUE.
  dFormat:SCREEN-VALUE = d:FORMAT + " " + SESSION:DATE-FORMAT + " " + STRING(SESSION:YEAR-OFFSET).
  
&IF DEFINED(FWD-VERSION) &THEN // FWD
  // FIXME: this works around the #7642 bug. Remove this when #7642 is fixed!
  // For the default format, apply the change twice: first to any alternative format, then revert to the original 99/99/99.
  DEFINE VARIABLE dFormat AS CHARACTER NO-UNDO.
  dFormat = d:FORMAT.
  d:FORMAT = "99/99/9999". // Any format value other than default will DO
  d:FORMAT = dFormat.
&ENDIF
END.

ON CHOOSE OF bSessionYearOffset DO:
  SESSION:YEAR-OFFSET = IF useEditor THEN INTEGER(e:SCREEN-VALUE) ELSE INTEGER(valueEditor:SCREEN-VALUE).
  dFormat:SCREEN-VALUE = d:FORMAT + " " + SESSION:DATE-FORMAT + " " + STRING(SESSION:YEAR-OFFSET).
END.

ON CHOOSE OF bSessionNumericFormat DO:
  SESSION:NUMERIC-FORMAT = IF useEditor THEN e:SCREEN-VALUE ELSE valueEditor:SCREEN-VALUE.
  IF SESSION:DISPLAY-TYPE = 'GUI' THEN
     CURRENT-WINDOW:TITLE="{&FWDREVISION}" + SESSION:DATE-FORMAT + " " + SESSION:NUMERIC-FORMAT.
END.

ON LEAVE OF d DO:
  MESSAGE "'" d:SCREEN-VALUE "'".
  // Note: the value is *not* normalized here yet!
  ASSIGN d NO-ERROR.
  IF NOT ERROR-STATUS:ERROR THEN
  DO:
    valueEditor:SCREEN-VALUE = STRING(d).
    MESSAGE YEAR(d) MONTH(d) DAY(d).
  END.
END.

ON ENTRY OF valueEditor DO:
  MESSAGE "valueEditor entered".
END.

// ON A OF v,d,i,s,l,e DO:
//     MESSAGE
//       SELF:CURSOR-OFFSET
//       SELF:SELECTION-START SELF:SELECTION-END
//       SELF:TEXT-SELECTED
//       SELF:SCREEN-VALUE LENGTH(SELF:SCREEN-VALUE).
//     RETURN NO-APPLY.
// END.

ON VALUE-CHANGED OF useEditor DO:
  ASSIGN useEditor.
  MESSAGE "useEditor" useEditor.
END.
  
/**
 * Test when VALUE-CHANGED is being sent
 */
ON VALUE-CHANGED OF v MESSAGE "VALUE-CHANGED: v" SELF:SCREEN-VALUE NOW.
ON VALUE-CHANGED OF d MESSAGE "VALUE-CHANGED: d" SELF:SCREEN-VALUE NOW.
ON VALUE-CHANGED OF i MESSAGE "VALUE-CHANGED: i" SELF:SCREEN-VALUE NOW. 
ON VALUE-CHANGED OF s MESSAGE "VALUE-CHANGED: s" SELF:SCREEN-VALUE NOW.
ON VALUE-CHANGED OF l MESSAGE "VALUE-CHANGED: l" SELF:SCREEN-VALUE NOW.

ON Ctrl-D OF v,d,i,s,l,e DO:
    valueEditor:SCREEN-VALUE = SELF:INPUT-VALUE.
    RETURN NO-APPLY.
END.

ENABLE ALL WITH FRAME f.

VIEW FRAME f.

WAIT-FOR GO OF FRAME f.
