(**************************************************************************

     $RCSfile: RunOberon0.mod $
  Description: Main module for the Oberon-A implementation of the Oberon0
               System described in Mössenböck's "Object-Oriented
               Programming in Oberon-2".

   Created by: fjc (Frank Copeland)
    $Revision: 1.1 $
      $Author: fjc $
        $Date: 1995/07/02 17:02:27 $

  Copyright © 1995, Frank Copeland.
  This module is part of Oberon-A.
  See Oberon-A.doc for conditions of use and distribution.

**************************************************************************)

<*STANDARD-*> <*MAIN+*>
MODULE RunOberon0;

IMPORT
  SYS := SYSTEM, Errors, k := Kernel, Viewers0, Shapes0, Rectangles0,
  Texts0, FoldElems0, GraphicElems0, Edit0, Draw0, Oberon0, d := Dos,
  wb := Workbench;

VAR
  startDir : d.FileLockPtr;

PROCEDURE Register;

  VAR
<* IF REGISTER THEN *>
    node : k.RegNode;
<* ELSE *>
    mod : k.Module; typ : k.Type; cmd : k.Command;
<* END *>


<* IF REGISTER THEN *>
  PROCEDURE PrintModule ( modName : ARRAY OF CHAR );

    VAR mod : k.Module; node : k.RegNode;

    <*$CopyArrays-*>
    BEGIN (* PrintModule *)
      mod := k.FindModule (modName);
      IF mod # NIL THEN
        d.PrintF ("Module '%s'\n", SYS.ADR (modName));
        node := mod.types;
        IF node # NIL THEN
          WHILE node # NIL DO
            d.PrintF ("  type: '%s'\n", SYS.ADR (node.name));
            node := node.next
          END;
        ELSE
          d.PrintF ("  no types\n", NIL)
        END;
        node := mod.commands;
        IF node # NIL THEN
          WHILE node # NIL DO
            d.PrintF ("  command: '%s'\n", SYS.ADR (node.name));
            node := node.next
          END;
        ELSE
          d.PrintF ("  no commands\n", NIL)
        END;
      ELSE
        d.PrintF ("Could not find module '%s'\n", SYS.ADR (modName))
      END;
    END PrintModule;
<* END *>

  BEGIN (* Register *)
<* IF REGISTER THEN *>
  (*
    node := k.modules;
    WHILE node # NIL DO
      PrintModule (node.name);
      node := node.next
    END;
  *)
<* ELSE *>
    mod := k.RegisterModule ("Viewers0");
      cmd := k.RegisterCommand (mod, "Close", Viewers0.Close);
      cmd := k.RegisterCommand (mod, "Copy", Viewers0.Copy);
    mod := k.RegisterModule ("Shapes0");
      typ := k.RegisterType (mod, SYS.TAG (Shapes0.Graphic));
    mod := k.RegisterModule ("Rectangles0");
      typ := k.RegisterType (mod, SYS.TAG (Rectangles0.Rectangle));
      cmd := k.RegisterCommand (mod, "Set", Rectangles0.Set);
    mod := k.RegisterModule ("Texts0");
      typ := k.RegisterType (mod, SYS.TAG (Texts0.Element));
    mod := k.RegisterModule ("FoldElems0");
      typ := k.RegisterType (mod, SYS.TAG (FoldElems0.Element));
      cmd := k.RegisterCommand (mod, "Insert", FoldElems0.Insert);
    mod := k.RegisterModule ("GraphicElems0");
      typ := k.RegisterType (mod, SYS.TAG (GraphicElems0.Element));
      cmd := k.RegisterCommand (mod, "Insert", GraphicElems0.Insert);
      cmd := k.RegisterCommand (mod, "Update", GraphicElems0.Update);
    mod := k.RegisterModule ("Edit0");
      cmd := k.RegisterCommand (mod, "Open", Edit0.Open);
      cmd := k.RegisterCommand (mod, "Store", Edit0.Store);
      cmd := k.RegisterCommand (mod, "ChangeFont", Edit0.ChangeFont);
    mod := k.RegisterModule ("Draw0");
      cmd := k.RegisterCommand (mod, "Open", Draw0.Open);
      cmd := k.RegisterCommand (mod, "Store", Draw0.Store);
<* END *>
  END Register;

PROCEDURE* Cleanup ( VAR rc : LONGINT );

  VAR ignore : d.FileLockPtr;

  BEGIN (* Cleanup *)
    ignore := d.CurrentDir (startDir); startDir := NIL
  END Cleanup;

PROCEDURE Init;

  VAR wbStartup : wb.WBStartupPtr;

  BEGIN (* Init *)
    IF k.fromWorkbench THEN
      wbStartup := SYS.VAL (wb.WBStartupPtr, k.WBenchMsg);
      IF wbStartup.numArgs > 0 THEN
        startDir := d.CurrentDir (wbStartup.argList[0].lock);
        k.SetCleanup (Cleanup)
      END
    END
  END Init;

BEGIN
  Errors.Init();
  Register;
  Init;
  Oberon0.Loop
END RunOberon0.
