FoxA2Interface.Mod 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. MODULE FoxA2Interface; (** AUTHOR ""; PURPOSE ""; *)
  2. IMPORT Streams, Basic := FoxBasic, WMUtilities, TextUtilities, WMGraphics, Diagnostics, Texts;
  3. CONST
  4. Tab = 9X;
  5. TYPE
  6. Writer* = OBJECT (Basic.Writer)
  7. VAR
  8. alertCount, commentCount, keywordCount : LONGINT;
  9. PROCEDURE &InitA2Writer(w: Streams.Writer);
  10. BEGIN
  11. InitBasicWriter(w); alertCount := 0; commentCount := 0; keywordCount := 0;
  12. IF w IS TextUtilities.TextWriter THEN
  13. w(TextUtilities.TextWriter).SetFontName("Vera");
  14. END;
  15. END InitA2Writer;
  16. PROCEDURE SetFontStyle*(style: SET);
  17. BEGIN
  18. IF w IS TextUtilities.TextWriter THEN
  19. w(TextUtilities.TextWriter).SetFontStyle(style);
  20. END;
  21. END SetFontStyle;
  22. PROCEDURE SetColor;
  23. BEGIN
  24. RETURN; (* prohibitively expensive for large files *)
  25. IF w IS TextUtilities.TextWriter THEN
  26. IF alertCount > 0 THEN w(TextUtilities.TextWriter).SetFontColor(WMGraphics.Red);
  27. ELSIF commentCount > 0 THEN w(TextUtilities.TextWriter).SetFontColor(LONGINT(0999999FFH));
  28. ELSE w(TextUtilities.TextWriter).SetFontColor(WMGraphics.Black);
  29. END;
  30. END;
  31. END SetColor;
  32. PROCEDURE SetStyle;
  33. BEGIN
  34. RETURN; (* prohibitively expensive for large files *)
  35. IF w IS TextUtilities.TextWriter THEN
  36. IF keywordCount > 0 THEN w(TextUtilities.TextWriter).SetFontStyle({WMGraphics.FontBold});
  37. ELSE w(TextUtilities.TextWriter).SetFontStyle({});
  38. END;
  39. END;
  40. END SetStyle;
  41. PROCEDURE BeginAlert*;
  42. BEGIN INC(alertCount); IF alertCount = 1 THEN SetColor END;
  43. END BeginAlert;
  44. PROCEDURE EndAlert*;
  45. BEGIN DEC(alertCount); IF alertCount = 0 THEN SetColor END;
  46. END EndAlert;
  47. PROCEDURE BeginComment*;
  48. BEGIN INC(commentCount); IF commentCount = 1 THEN SetColor END;
  49. END BeginComment;
  50. PROCEDURE EndComment*;
  51. BEGIN DEC(commentCount); IF commentCount = 0 THEN SetColor END;
  52. END EndComment;
  53. PROCEDURE BeginKeyword*;
  54. BEGIN INC(keywordCount); IF keywordCount = 1 THEN SetStyle END;
  55. END BeginKeyword;
  56. PROCEDURE EndKeyword*;
  57. BEGIN DEC(keywordCount); IF keywordCount = 0 THEN SetStyle END;
  58. END EndKeyword;
  59. PROCEDURE AlertString*(CONST s: ARRAY OF CHAR);
  60. BEGIN
  61. BeginAlert; w.String(s); EndAlert;
  62. END AlertString;
  63. END Writer;
  64. StreamDiagnostics* = OBJECT (Diagnostics.Diagnostics);
  65. VAR
  66. writer: Streams.Writer;
  67. PROCEDURE &Init *(w: Streams.Writer);
  68. BEGIN
  69. ASSERT(w # NIL);
  70. writer := w;
  71. END Init;
  72. PROCEDURE Error* (CONST source : ARRAY OF CHAR; position : Streams.Position; CONST message : ARRAY OF CHAR);
  73. BEGIN Print (writer, source, position, Diagnostics.TypeError, message);
  74. END Error;
  75. PROCEDURE Warning* (CONST source : ARRAY OF CHAR; position : Streams.Position; CONST message : ARRAY OF CHAR);
  76. BEGIN Print (writer, source, position, Diagnostics.TypeWarning, message);
  77. END Warning;
  78. PROCEDURE Information* (CONST source : ARRAY OF CHAR; position : Streams.Position; CONST message : ARRAY OF CHAR);
  79. BEGIN Print (writer, source, position, Diagnostics.TypeInformation, message);
  80. END Information;
  81. END StreamDiagnostics;
  82. PROCEDURE Print (w: Streams.Writer; CONST source : ARRAY OF CHAR; position: Streams.Position; type: WORD; CONST message: ARRAY OF CHAR);
  83. VAR attributes: Texts.Attributes;
  84. BEGIN
  85. IF w IS TextUtilities.TextWriter THEN
  86. attributes := w(TextUtilities.TextWriter).currentAttributes;
  87. IF (type = Diagnostics.TypeWarning) THEN
  88. w(TextUtilities.TextWriter).SetFontColor(LONGINT(0808000FFH));
  89. ELSIF (type = Diagnostics.TypeError) THEN
  90. w(TextUtilities.TextWriter).SetFontColor(WMGraphics.Red);
  91. ELSE
  92. w(TextUtilities.TextWriter).SetFontColor(WMGraphics.Black);
  93. END;
  94. END;
  95. w.Char(Tab);
  96. IF (source # "") THEN w.String (source); END;
  97. IF (position # Streams.Invalid) THEN w.Char ('@'); w.Int(position, 0); END;
  98. w.Char(Tab);
  99. IF (type = Diagnostics.TypeWarning) THEN
  100. w.String("warning");
  101. ELSIF (type = Diagnostics.TypeError) THEN
  102. w.String("error");
  103. ELSE
  104. END;
  105. IF (type # Diagnostics.TypeInformation) THEN w.String(": ") END;
  106. w.String(message); w.Ln;
  107. w.Update;
  108. IF attributes # NIL THEN
  109. w(TextUtilities.TextWriter).SetAttributes(attributes);
  110. END;
  111. END Print;
  112. PROCEDURE DebugWriterFactory(CONST title: ARRAY OF CHAR): Streams.Writer;
  113. VAR writer: WMUtilities.WindowWriter;
  114. BEGIN
  115. NEW(writer,title,600,400,FALSE); RETURN writer
  116. END DebugWriterFactory;
  117. PROCEDURE WriterFactory(w: Streams.Writer): Basic.Writer;
  118. VAR writer: Writer;
  119. BEGIN
  120. NEW(writer,w);
  121. RETURN writer
  122. END WriterFactory;
  123. PROCEDURE DiagnosticsFactory(w: Streams.Writer): Diagnostics.Diagnostics;
  124. VAR diagnostics: StreamDiagnostics;
  125. BEGIN
  126. NEW(diagnostics, w);
  127. RETURN diagnostics
  128. END DiagnosticsFactory;
  129. PROCEDURE Install*;
  130. BEGIN
  131. Basic.InstallWriterFactory(WriterFactory, DebugWriterFactory, DiagnosticsFactory);
  132. END Install;
  133. END FoxA2Interface.
  134. FSTools.DeleteFiles FoxA2Interface.Obw ~