(**********************************************************)
(**********************************************************)
(********                                          ********)
(********      DRUCKERINITIALISIERUNGSPROGRAMM     ********)
(********                                          ********)
(********     FR    OKIDATA / MICROLINE    182    ********)
(********                                          ********)
(********         ACCESSORY GESCHRIEBEN VON:       ********)
(********                                          ********)
(********             CARSTEN SCHNEIDER            ********)
(********             JAHNSTR. 5                   ********)
(********             6348 HERBORN 1               ********)
(********                                          ********)
(********     Entwickelt mit ST Pascal + von CCD   ********)
(********                                          ********)
(**********************************************************)
(**********************************************************)


{$SO,D-}    (* Compilerdirektiven *)

program oki_druckereinstellung;
const
   FILENAME = 'OKI.RSC';    (* Name der RSC Datei *)

   {$I oki.i}               (* RSC Definitionsdatei fuer Konstanten *)
   {$I gemconst.pas}        (* Konstantendefinitionsdatei fr GEM Anwendung *)
                            (* mit ST Pascal + *)
type

   {$I gemtype.pas}         (* Typdefinitionsdatei fr GEM Anwendung *)
                            (* mit ST Pascal + *)

var                         (* Variablendeklarationsteil *)
   menu_id,ap_id:integer;
   alert,our_name:Str255;
   menue:Dialog_Ptr;
   fehler:boolean;


          (*********** Prozedurdeklarationsteil ***********)

   {$I gemsubs.pas}        (* Funktions- und Prozedurdeklaration fr GEM *)
                           (* Anwendung mit ST Pascal + *)


procedure Cprnout(ch:char);    (* GEMDOS Prozedur Zeichen an Drucker *)
gemdos($05);


function Cprnos:integer;       (* GEMDOS Funktion Druckerstatus erfragen *)
gemdos($11);


procedure vergleiche(Pushed:integer; menue:Dialog_Ptr; alert:Str255);
label
   10;         (* verarbeitet Tastendruck *)

var
   Taste:integer;

begin
   if Pushed = INFOEIN     (*  Programminformation ausgeben *)
    then
      begin
         Taste:= Do_Alert(alert,1);                 (* Alertbox zeigen *)
         Set_Mouse(M_POINT_HAND);                   (* Mausform setzen *)
         Obj_SetState(menue,INFOEIN,NORMAL,true);   (* Info T. deselectieren *)
         Obj_SetState(menue,INFOEIN,SHADOWED,true); (* Schattenrand setzen *)
         goto 10
      end;
   if Pushed = ZEILEEIN    (* Seitenlaenge waehlen: 66 Zeilen/Seite *)
    then
      begin
         Obj_SetState(menue,ZEILEEIN,SELECTED,true);   (* Tasten setzen *)
         Obj_SetState(menue,ZEILEAUS,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(67));      (* Drucker Escape Sequenz *)
         Cprnout(chr(72));
         goto 10
      end;
   if Pushed = ZEILEAUS   (* 88 Zeilen/Seite *)
    then
      begin
         Obj_SetState(menue,ZEILEAUS,SELECTED,true);   (* Tasten setzen *)
         Obj_SetState(menue,ZEILEEIN,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(67));      (* Drucker Escape Sequenz *)
         Cprnout(chr(96));
         goto 10
      end;
   if Pushed = CANCEIN    (* Druckpuffer loeschen *)
    then
      begin
         Obj_SetState(menue,CANCEIN,SELECTED,true);    (* Tasten setzen *)
         Obj_SetState(menue,CANCAUS,NORMAL,true);
         Cprnout(chr(24));
         goto 10
      end;
   if Pushed = CANCAUS    (* Dummy *)
    then
      begin
         Obj_SetState(menue,CANCAUS,SELECTED,true);    (* Tasten setzen *)
         Obj_SetState(menue,CANCEIN,NORMAL,true);
         goto 10
      end;
   if Pushed = VORSEIN   (* Einschalten Formular Vorschub *)
    then
      begin
         Obj_SetState(menue,VORSEIN,SELECTED,true);    (* Tasten setzen *)
         Obj_SetState(menue,VORSAUS,NORMAL,true);
         Cprnout(chr(12));
         goto 10
      end;
   if Pushed = VORSAUS   (* Dummy *)
    then
      begin
         Obj_SetState(menue,VORSAUS,SELECTED,true);    (* Tasten setzen *)
         Obj_SetState(menue,VORSEIN,NORMAL,true);
         goto 10
      end;
   if Pushed = SPREIN   (* Einschalten Druck mit Sprung *)
    then
      begin
         Obj_SetState(menue,SPREIN,SELECTED,true);     (* Tasten setzen *)
         Obj_SetState(menue,SPRAUS,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(78));      (* Drucker Escape Sequenz *)
         Cprnout(chr(1));
         goto 10
      end;
   if Pushed = SPRAUS   (* Ausschalten Druck mit Sprung *)
    then
      begin
         Obj_SetState(menue,SPRAUS,SELECTED,true);     (* Tasten setzen *)
         Obj_SetState(menue,SPREIN,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(78));      (* Drucker Escape Sequenz *)
         Cprnout(chr(0));
         goto 10
      end;
   if Pushed = VFETTEIN   (* Einschalten vertikaler Fettdruck *)
    then
      begin
         Obj_SetState(menue,VFETTEIN,SELECTED,true);    (* Tasten setzen *)
         Obj_SetState(menue,VFETTAUS,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(71));      (* Drucker Escape Sequenz *)
         goto 10
      end;
   if Pushed = VFETTAUS   (* Ausschalten vertikaler Fettdruck *)
    then
      begin
         Obj_SetState(menue,VFETTAUS,SELECTED,true);   (* Tasten setzen *)
         Obj_SetState(menue,VFETTEIN,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(72));      (* Drucker Escape Sequenz *)
         goto 10
      end;
   if Pushed = HFETTEIN   (* Einschalten horizontaler Fettdruck *)
    then
      begin
         Obj_SetState(menue,HFETTEIN,SELECTED,true);   (* Tasten setzen *)
         Obj_SetState(menue,HFETTAUS,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(69));      (* Drucker Escape Sequenz *)
         goto 10
      end;
   if Pushed = HFETTAUS   (* Ausschalten horizontaler Fettdruck *)
    then
      begin
         Obj_SetState(menue,HFETTAUS,SELECTED,true);   (* Tasten setzen *)
         Obj_SetState(menue,HFETTEIN,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(70));     (* Drucker Escape Sequenz *)
         goto 10
      end;
   if Pushed = GEDEIN   (* Einschalten gedehnte Schrift *)
    then
      begin
         Obj_SetState(menue,GEDEIN,SELECTED,true);     (* Tasten setzen *)
         Obj_SetState(menue,GEDAUS,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(87));     (* Drucker Escape Sequenz *)
         Cprnout(chr(49));
         goto 10
      end;
   if Pushed = GEDAUS   (* Ausschalten gedehnte Schrift *)
    then
      begin
         Obj_SetState(menue,GEDAUS,SELECTED,true);      (* Tasten setzen *)
         Obj_SetState(menue,GEDEIN,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(87));     (* Drucker Escape Sequenz *)
         Cprnout(chr(48));
         goto 10
      end;
   if Pushed = UNTEIN   (* Einschalten Unterstreichen *)
    then
      begin
         Obj_SetState(menue,UNTEIN,SELECTED,true);      (* Tasten setzen *)
         Obj_SetState(menue,UNTAUS,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(45));     (* Drucker Escape Sequenz *)
         Cprnout(chr(1));
         goto 10
      end;
   if Pushed = UNTAUS   (* Ausschalten Unterstreichen *)
    then
      begin
         Obj_SetState(menue,UNTAUS,SELECTED,true);       (* Tasten setzen *)
         Obj_SetState(menue,UNTEIN,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(45));     (* Drucker Escape Sequenz *)
         Cprnout(chr(0));
         goto 10
      end;
   if Pushed = HOCHEIN    (* Einschalten Hochstellen *)
    then
      begin
         Obj_SetState(menue,HOCHEIN,SELECTED,true);      (* Tasten setzen *)
         Obj_SetState(menue,HOCHAUS,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(83));     (* Drucker Escape Sequenz *)
         Cprnout(chr(0));
         goto 10
      end;
   if Pushed = HOCHAUS    (* Ausschalten Hochstellen *)
    then
      begin
         Obj_SetState(menue,HOCHAUS,SELECTED,true);      (* Tasten setzen *)
         Obj_SetState(menue,HOCHEIN,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(84));     (* Drucker Escape Sequenz *)
         goto 10
      end;
   if Pushed = TIEFEIN   (* Einschalten Tiefstellen *)
    then
      begin
         Obj_SetState(menue,TIEFEIN,SELECTED,true);      (* Tasten setzen *)
         Obj_SetState(menue,TIEFAUS,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(83));     (* Drucker Escape Sequenz *)
         Cprnout(chr(1));
         goto 10
      end;
   if Pushed = TIEFAUS    (* Ausschalten Tiefstellen *)
    then
      begin
         Obj_SetState(menue,TIEFAUS,SELECTED,true);      (* Tasten setzen *)
         Obj_SetState(menue,TIEFEIN,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(84));     (* Drucker Escape Sequenz *)
         goto 10
      end;
   if Pushed = SATZEIN  (* Einschalten Zeichensatz I *)
    then
      begin
         Obj_SetState(menue,SATZEIN,SELECTED,true);      (* Tasten setzen *)
         Obj_SetState(menue,SATZAUS,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(55));     (* Drucker Escape Sequenz *)
         goto 10
      end;
   if Pushed = SATZAUS  (* Einschalten Zeichensatz II *)
    then
      begin
         Obj_SetState(menue,SATZAUS,SELECTED,true);      (* Tasten setzen *)
         OBJ_SetState(menue,SATZEIN,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(54));     (* Drucker Escape Sequenz *)
         goto 10
      end;
   if Pushed = ABSTEIN  (* Einschalten Zeilenabstand 1/6" *)
    then
      begin
         Obj_SetState(menue,ABSTEIN,SELECTED,true);      (* Tasten setzen *)
         Obj_SetState(menue,ABSTAUS,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(50));     (* Drucker Escape Sequenz *)
         goto 10
      end;
   if Pushed = ABSTAUS  (* Einschalten Zeilenabstand 1/8" *)
    then
      begin
         Obj_SetState(menue,ABSTAUS,SELECTED,true);      (* Tasten setzen *)
         Obj_SetState(menue,ABSTEIN,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(48));     (* Drucker Escape Sequenz *)
         goto 10
      end;
   if Pushed = GROEIN   (* Einschalten Grožschrift 10 CPI *)
    then
      begin
         Obj_SetState(menue,GROEIN,SELECTED,true);       (* Tasten setzen *)
         Obj_SetState(menue,GROAUS,NORMAL,true);
         Cprnout(chr(18));
         goto 10
      end;
   if Pushed = GROAUS  (* Einschalten mittlere Schrift 12 CPI *)
    then
      begin
         Obj_SetState(menue,GROAUS,SELECTED,true);       (* Tasten setzen *)
         Obj_SetState(menue,GROEIN,NORMAL,true);
         Cprnout(chr(27));
         Cprnout(chr(58));     (* Drucker Escape Sequenz *)
      end;
   10:
end;          (* of procedure vergleiche *)


procedure normalize;      (* Deselectiert Tasten *)
begin
   Obj_SetState(menue,ZEILEEIN,NORMAL,false);
   Obj_SetState(menue,ZEILEAUS,NORMAL,false);
   Obj_SetState(menue,CANCEIN,NORMAL,false);
   Obj_SetState(menue,CANCAUS,NORMAL,false);
   Obj_SetState(menue,VORSEIN,NORMAL,false);
   Obj_SetState(menue,VORSAUS,NORMAL,false);
   Obj_SetState(menue,SPREIN,NORMAL,false);
   Obj_SetState(menue,SPRAUS,NORMAL,false);
   Obj_SetState(menue,VFETTEIN,NORMAL,false);
   Obj_SetState(menue,VFETTAUS,NORMAL,false);
   Obj_SetState(menue,HFETTEIN,NORMAL,false);
   Obj_SetState(menue,HFETTAUS,NORMAL,false);
   Obj_SetState(menue,GEDEIN,NORMAL,false);
   Obj_SetState(menue,GEDAUS,NORMAL,false);
   Obj_SetState(menue,UNTEIN,NORMAL,false);
   Obj_SetState(menue,UNTAUS,NORMAL,false);
   Obj_SetState(menue,TIEFEIN,NORMAL,false);
   Obj_SetState(menue,TIEFAUS,NORMAL,false);
   Obj_SetState(menue,HOCHEIN,NORMAL,false);
   Obj_SetState(menue,HOCHAUS,NORMAL,false);
   Obj_SetState(menue,SATZEIN,NORMAL,false);
   Obj_SetState(menue,SATZAUS,NORMAL,false);
   Obj_SetState(menue,ABSTEIN,NORMAL,false);
   Obj_SetState(menue,ABSTAUS,NORMAL,false);
   Obj_SetState(menue,GROEIN,NORMAL,false);
   Obj_SetState(menue,GROAUS,NORMAL,false);
end;       (* of procedure normalize *)


function druckbereit:boolean;
var
  on_line,meldung:integer;    (* Kontrolliert Druckerstatus *)

begin
   on_line:= Cprnos;
   meldung:= 0;
   druckbereit:= true;
   while (on_line <> -1) and (meldung <> 2)  do    (* Fehlermeldung *)
    begin
       meldung:= Do_Alert('[3][Drucker ON LINE schalten !][ OK |ABORT]',1);
       on_line:= Cprnos
    end;
   if meldung = 2        (* Accessory abbrechen *)
    then
      druckbereit:= false
end;                        (* of function druckbereit *)


function ladefehler:boolean;
var
  junk:integer;     (* Kontrolliert Einladen von OKI.RSC *)

begin
   ladefehler:= false;
   if not Load_Resource(FILENAME)      (* Fehlermeldung *)
    then
      begin
         junk:= Do_Alert('[3][Wo ist die Datei OKI.RSC ?][ FEHLER ]',1);
         ladefehler:= true
      end
end;          (* of function ladefehler *)


procedure ausgabe(alert:Str255; menue:Dialog_Ptr; fehler:boolean);
var
  Pushed,Dummy,junk:integer;  (* Gibt den Dialog aus und *)
                              (* verarbeitet Mouseclicks *)

begin
   if not fehler   (* Anwendung gegebenenfalls abbrechen *)
    then
      begin
         if druckbereit   (* Druckerstatus abfragen *)
          then
            begin
               Init_Mouse;                        (* Maus initialisieren *)
               Center_Dialog(menue);              (* Dialog zentrieren *)
               Set_Mouse(M_POINT_HAND);           (* Mausform setzen *)
               Pushed:= Do_Dialog(menue,Dummy);   (* Dialog zeigen *)
               repeat                             (* Auswahlschleife *)
                  if Pushed <> ENDE
                   then
                     begin
                        vergleiche(Pushed,menue,alert);       (* Tastendruck *)
                        Pushed:= Redo_Dialog(menue,OKIMENUE)  (* verarbeiten *)
                     end
               until Pushed = ENDE;
               Obj_SetState(menue,ENDE,NORMAL,true); (* Exit deselectieren *)
               End_Dialog(menue);                    (* Dialog beenden *)
               normalize;                     (* Menuetasten deselectieren *)
               Set_Mouse(M_ARROW)             (* Mausform rcksetzen *)
            end
      end
    else
      junk:= Do_Alert('[3][Accessory defekt:|OKI.RSC fehlt !][ OK ]',1)
end;      (* of procedure ausgabe *)


procedure Event_Loop(alert:Str255; menue:Dialog_Ptr; fehler:boolean);
var
  event,dummy:integer;
  msg:Message_Buffer;

begin
   while true do        (* Endlosschleife: Wartet auf Message Events *)
    begin
       event:= Get_Event(E_MESSAGE,
                         0,0,0,0,
                         false,0,0,0,0,
                         false,0,0,0,0,
                         msg,dummy,dummy,
                         dummy,dummy,dummy,dummy);

       case msg[0] of    (* Messagebuffer abfragen *)
          AC_Open:
           (* if msg[4] = menu_id then *)   (* Fehler in Menu_Register *)
               ausgabe(alert,menue,fehler);
       end
    end       (* of while *)
end;       (* of procedure Event_Loop *)


begin                 (***** Hauptprogramm *****)
   ap_id:= Init_Gem;                  (* Applikationsnummer speichern *)
   if ap_id >= 0
    then
      begin
         our_name:= '  Oki_182 Init';
         menu_id:= Menu_Register(ap_id,our_name);    (* Menuepunkt setzen *)
         fehler:= ladefehler;
         Find_Dialog(OKIMENUE,menue);    (* Dialogpointer zuweisen *)
         Find_Alert(INFO,alert);         (* Alertstring zuweisen *)
         Event_Loop(alert,menue,fehler);    (* Warteschleife *)
      end
end.            (* Hauptprorgamm *)
