MODULE ObxTabs;
(**

   project   = "BlackBox"
   organization   = "www.oberon.ch"
   contributors   = "Oberon microsystems"
   version   = "System/Rsrc/About"
   copyright   = "System/Rsrc/About"
   license   = "Docu/BB-License"
   changes   = ""
   issues   = ""

**)

   IMPORT Views, TextModels, TextViews, TextControllers;

   CONST tab = 09X; line = 0DX;

   VAR field: ARRAY 256 OF CHAR;

   PROCEDURE ReadField (r: TextModels.Reader);

      VAR i: INTEGER; ch: CHAR;
   BEGIN   (* read a field, which is a sequence of characters terminated by the end of text, or a tab or line character *)
      i := 0; r.ReadChar(ch);
      WHILE ~r.eot & (ch # tab) & (ch # line) DO
         field[i] := ch; INC(i); r.ReadChar(ch)
      END;
      field[i] := 0X
   END ReadField;
   PROCEDURE WriteField (w: TextModels.Writer);

      VAR i: INTEGER; ch: CHAR;
   BEGIN
      i := 0; ch := field[0];
      WHILE ch # 0X DO
         w.WriteChar(ch); INC(i); ch := field[i]
      END
   END WriteField;
   PROCEDURE Convert*;

      VAR c: TextControllers.Controller; t: TextModels.Model; r: TextModels.Reader;
         w: TextModels.Writer; beg, end: INTEGER;
   BEGIN
      c := TextControllers.Focus();
      IF (c # NIL) & c.HasSelection() THEN
         c.GetSelection(beg, end);
         r := c.text.NewReader(NIL); r.SetPos(beg);
         t := TextModels.CloneOf(c.text);
         w := t.NewWriter(NIL);
         ReadField(r);   (* title *)
         WHILE ~r.eot DO
            WriteField(w); w.WriteChar(" ");
            ReadField(r); WriteField(w); w.WriteChar(" ");   (* first name *)
            ReadField(r); WriteField(w); w.WriteChar(tab);   (* name *)
            ReadField(r); WriteField(w); w.WriteChar(tab);   (* company 1 *)
            ReadField(r); WriteField(w); w.WriteChar(tab);   (* company 2 *)
            ReadField(r); WriteField(w); w.WriteChar(tab);   (* address *)
            ReadField(r); WriteField(w); w.WriteChar(" ");   (* ZIP *)
            ReadField(r); WriteField(w); w.WriteChar(tab);   (* city *)
            ReadField(r); WriteField(w); w.WriteChar(line);   (* country *)
            ReadField(r)   (* title *)
         END;
         Views.OpenView(TextViews.dir.New(t))
      END
   END Convert;
END ObxTabs.