PREVIEW: Hilfsprogramm zur Darstellung von Texten

Bei der Arbeit mit verschiedenen Editoren, sei es nun Tempus oder 1st Wordplus, hat mir schon des öfteren eine Möglichkeit gefehlt, meine “Machwerke” schon einmal im Voraus anzusehen, ohne gleich den Drucker anzuwerfen und eventuell mal wieder einen schlechten Ausdruck zu erhalten.

Durch die diversen DTP-Programme, die so nach und nach in den verschiedenen Zeitschriften getestet wurden, kam mir die Idee, ein Programm zu schreiben, mit dem ich mir meine Textfiles auch einmal vor dem Ausdrucken im endgültigen Druckbild ansehen konnte. Damit dieses Programm auch aus anderen Programmen wie z.B. 1st Word heraus zu benutzen ist, lag die Programmierung als Accessory nahe.

Um das Programm universell nutzbar zu machen, habe ich in diesem Programm den in dieser Zeitschrift bereits beschriebenen Trick mit der externen Variablen _app benutzt (das geht nicht nur aus Turbo-C, wie im entsprechenden Handbuch beschrieben - nein, auch mit Megamax Laser-C kann man diesen Trick anwenden). Wenn man das Accessory in PRG umbenennt, kann man es ganz normal aus dem Desktop starten, verliert dann allerdings den ACC-typischen Vorteil. Weiter benötigt das Programm eine Resourcefile, die jedoch nur aus einer beinahe bildschirmgroßen Box, in der nur ein Exit-Button vorhanden sein muß, besteht. Der Inhalt des zugehörigen Header-Files:

#define TREE 0 
#define EXITALL 1

Die verschiedenen Routinen:

main(): Nach dem Anmelden der Applikation und Öffnen der Workstation mit v_opnvwk() wird das zugehörige Resourcefile geladen. Wenn es nicht gefunden werden kann, wird das Programm abgebrochen. Anschließend wird die bereits erwähnte Variable _app abgefragt und der eigentliche Job entweder direkt, oder erst nach einem AC_OPEN-Event ausgeführt.

job(): In dieser Routine wird der Bildschirm gerettet und die Dialogbox dargestellt, der Name der anzuzeigenden ASCII-Datei abgefragt und dieser Name mit draw_melde(cx,cy,name) in eine Statuszeile geschrieben. Schließlich wird die Datei geöffnet, das erste ‘Blatt’ gezeichnet und der Inhalt/der Datei Zeichen für Zeichen eingelesen. Die eingelesen Zeichen werden geprüft, ob es Steuerzeichen (Linefeed, Formfeed etc.) sind und allenfalls als einzelne Pixel auf dem ‘Blatt’ dargestellt. Wenn notwendig, werden weitere ‘Blätter’ zur Verfügung gestellt. Alle zehn ‘Blätter’ muß durch Antippen irgendeiner Taste die unterbrochene Ausgabe der Datei weitergeschaltet werden. Wenn die gesamte Datei dargestellt ist, wartet das Programm auf den Druck auf den Exit-Button, der Bildschirm wird restauriert und das Programm verlassen.

hole_file(filename): Einlesen des Dateinamens mit der Fileselectbox.

draw_seite(cx,cy) und neues_blatt(): Ein leeres ‘Blatt’ wird die VDI-Funktionen vsf_color(handle,farbe), vsf_interior(handle,typ), pt_set(points[0],cx,cy), v_fillarea(handle,count,points) und vsf_style(handle,typ) dargestellt.

draw_melde(): Eine Statuszeile wird mit den bereits erwähnten VDI-Grafikfunktionen gezeichnet und der vollständige Dateiname wird hier eingetragen.

set_pixel(cx,cy): Über den Umweg pt_set(points|0],cx,cy) und v_pline(handle, count, points) wird an der übergebenen Position ein Pixel gesetzt (Das geht bestimmt noch einfacher - mir wollte hier aber nichts besseres einfallen...).

check_word(): Diese Routine ist der Versuch, 1st_Word-Dateien an ihrem typischen Anfang zu erkennen und das immer vor den Texten stehende Lineal auszublenden. Dazu sucht das Programm in den ersten 250 Byte nach dem 1st Word typischen Steuerzeichen des Textanfangs. Wird es nicht fündig, spult es wieder zum Anfang der Datei zurück (Fseek(fd,0L,0);).

So unbeholfen diese Routine auch aussieht, ihren Zweck erfüllt sie bei mir bisher tadellos. Damit wünsche ich viel Spaß beim Abtippen und Ausprobieren des Programmes. Es sollte eigentlich mit allen ST-Konfigurationen Zusammenarbeiten. Bei geladenem GDOS (Vers. 1.1) kann es allerdings, wie ich festgestellt habe, zu leichten Problemen kommen. Warum, ist mir allerdings noch nicht klar. Mit Hilfe der im Programmkopf gesetzten Konstanten MAX_ZEILE und MAX_SPALTE sowie MAX_1stWORD und MAX_NORMAL kann sich schliesslich jeder das Programm auf seinen Drucker anpassen (Wieviele Zeichen gehen in eine Zeile, wieviele Zeilen auf ein Blatt). Vorsichtig sein sollte man mit zu vielen Steuerzeichen in einer Zeile. Da das Programm auf diese Steuerzeichen testet, kann es bei zu vielen derartigen Umschaltungen (kursiv, unterstrichen etc.) speziell bei 1st_Word-Dateien zu unschönen Differenzen kommen. Ein mäßiger Gebrauch macht aber keine Probleme.

/*


                PREVIEW.C 

                    in

            Megamax - Laser C 
                03.04.89 
              Lutz-R. Frank 
                V. 1.1 
    (c) MAXON Computer GmbH

*/

#include <stdio.h>
#include <osbind.h>
#include <gemdefs.h>
#include <obdefs.h>
#include <string.h>

#include "preview.h"

#define MAX_SPALT   85 
#define CX_START    28 
#define CY_START    35 
#define ACC	        1

extern gl_apid; 
extern int _app;

int MAX_ZEILE=60; /* hier können die gewünschten Längen */ 
int MAX_1stWORD=54; /* für 1stWORD und normale Texte ein- */ 
int MAX_NORMAL=60; /* gegeben werden ... */
int WORD=10;

char fname[128]; 
char buffer; 
char old; 
int exit_bttn=1; 
int fd; 
int wid; 
int ret; 
int xd,yd,wd,hd,start_obj,exit_obj;

int pxarray[128], 
    contrl[12], 
    intin[128], 
    ptsin[128],
    intout[128], 
    ptsout[128];

int handle, 
    msgbuf[8], 
    app_id, 
    menu_id;

int work_in[12]; 
int work_out[57];

OBJECT *tree;

main()
{
    int i;

    app_id=appl_init();
    for(i=0; i<10; work_in[i++]=1);
        work_in[10]=0;
        v_opnvwk (work_in, &handle, work_out); 
        if(! rsrc_load("preview.rsc"))
        {
            form_alert(1,"[3][ Fataler Fehler | Ich kann das RSC-File | nicht finden !][ Sorry ]");
            v_clsvwk(handle); 
            appl_exit(); 
            return;
        }
    if(!_app)
    {
        menu_id=menu_register(gl_apid," Text Preview ");
        while(1)
        {
            evnt_mesag(msgbuf); 
            if(msgbuf[0]==AC_OPEN)
            {
                job();
            }
        }
    }
    else
    {
        job();
        rsrc_free();
    }
}

/* ---------------------------------------------- */

job()
{
    int cx,cy; 
    int cx1,cy1;
    int xmin,ymin,xmax,ymax,x,y,b, h; 
    int breite,hoehe; 
    int zeile=0, spalte=0, seite=0; 
    int count=0;

    wind_get(0,WF_WORKXYWH,&xmin,&ymin,&breite, &hoehe); 
    xmax=xmin+breite-20; 
    ymax=ymin+hoehe-20; 
    x=20; y=30; b=615; h=360;
    wid=wind_create(0,xmin,ymin,xmax,ymax); 
    wind_update(1); 
    wind_open(wid,x,y,b,h); 
    wind_update(0);
    rsrc_gaddr(R_TREE,TREE,&tree);
    form_center(tree,&xd,&yd,&wd,&hd); 
    form_dial(0,0,0,0,0,xd,yd,wd,hd);
    objc_draw(tree,TREE,MAX_DEPTH,xd,yd,wd,hd); 
    hole_file(fname);
    objc_draw(tree,TREE,MAX_DEPTH,xd,yd,wd,hd);
    draw_melde(165,340,fname);
    cx=CX_START;
    cy=CY_START;
    MAX_ZEILE=MAX_NORMAL;
    WORD=0;
    v_hide_c(handle); 
    fd=Fopen(fname,0); 
    if(fd>0)
    {
        cx1=cx;
        cy1=cy;
        cx=cx1+10;
        cy=cy1+7;
        check_word();
        draw_seite(cx1,cy1);
        while(Fread(fd,1L,&buffer))
        {
            cx++;
            spalte++;
            if (((int)buffer==10) || (spalte==MAX_SPALT))
            {
                cy=cy+2; 
                cx=cx1+10; 
                zeile++; 
                spalte=0;
            }
            if(((int)buffer==12) || (zeile==MAX_ZEILE) || (((int)&old==27) && ((int)buffer==-128)))
            {
                seite++; 
                spalte=0; 
                zeile=0; 
                cx1=cx1+120; 
                cx=cx1+10; 
                cy=cy1+7; 
                if(seite==5)
                {
                    cx1=CX_START; 
                    cx=cx1+10; 
                    cy1=cy1+150; 
                    cy=cy1+7;
                }
                if(seite==10)
                {
                    seite=0; 
                    cx1=CX_START; 
                    cy1=CY_START; 
                    cx=cx1+10; 
                    cy=cy1+7; 
                    v_show_c(handle); 
                    gemdos(7); 
                    v_hide_c(handle); 
                    neues_blatt();
                }
                draw_seite(cx1,cyl);
            }
            if(((int)&old!=27) && ((int)buffer!=-128))
            {
                if(((int)buffer>32) && ((int)buffer<254))
                {
                    set_pixel(cx,cy);
                }
            }
            old=buffer;
        }
    }
    v_show_c(handle);
    Fclose(fd);
    exit_obj=form_do(tree,start_obj);
    objc change(tree,exit_obj,0,xd,yd,wd,hd,NORMAL+SHADOWED+OUTLINED,0); 
    form_dial(3,0,0,0,0,xd,yd,wd,hd); 
    wind_update(1); 
    wind_close(wid); 
    wind_delete(wid); 
    wind_update(0);
}

/* --------------------------------------------- */

hole_file(file_name) /* Filename der Textdatei */ 
char *file_name[]; /* einlesen */
{
    int i;
    char pfad[64],file[64]; 
    char drive;

    drive=(char) (Dgetdrv()+65); 
    strcpy(pfad,"X:\\*.*"); 
    pfad[0]=drive; 
    file[0]=0;

    fsel_input(pfad,file,&exit_bttn);
    i=0;
    while(pfad[i]) i++;
    while(i && pfad[i] != ':' && pfad[i] != '\\'')
        i--;
    strcpy(&pfad[i+1],file); 
    strcpy(fname,pfad);
}

/* --------------------------------------------- */

draw_seite(x_pos,y_pos) /* Ein leeres "Blatt" an der */ 
int x_pos, y_pos; /* x,y-Position zeichnen */
{
    int count=5; 
    int x_len=100, y_len; 
    int points [5][2]; 
    int i;

    y_len=2*MAX_ZEILE+20+WORD;
    x_pos=x_pos+2;
    y_pos=y_pos+2;
    vsf_color(handle, 1) ;
    vsf_interior(handle,1);
    pt_set(points[0],x_pos,y_pos);
    pt_set(points[1],(x_pos+x_len),y_pos);
    pt_set(points[2],(x_pos+x_len),(y_pos+y_len));
    pt_set(points[3],x_pos,(y_pos+y_len));
    pt_set(points[4],x_pos,y_pos);
    v_fillarea(handle,count,points);
    x_pos=x_pos-2;
    y_pos=y_pos-2;
    vsf_style(handle,2);
    vsf_interior(handle,8);
    pt_set(points[0],x_pos,y_pos);
    pt_set(points[1],(x_pos+x_len),y_pos);
    pt_set(points[2],(x_pos+x_len),(y_pos+y_len));
    pt_set(points[3],x_pos,(y_pos+y_len));
    pt_set(points[4],x_pos,y_pos);
    v_fillarea(handle,count,points);
}

/* --------------------------------------------- */

neues_blatt()
{
    int count=5; /* bei zehn angezeigten Seiten */ 
    int x_len=610, /* vorm Umblättern den Screen */
        y_len=300, /* restaurieren */
        x_pos=20, 
        y_pos=30; 
    int points [5][2]; 
    int i;

    vsf_perimeter(handle,0);
    vsf_style(handle,4);
    vsf_interior(handle,2);
    pt_set(points[0],x_pos,y_pos);
    pt_set(points[1],(x_pos+x_len),y_pos);
    pt_set(points[2],(x_pos+x_len),(y_pos+y_len));
    pt_set(points[3],x_pos,(y_pos+y_len));
    pt_set(points[4],x_pos,y_pos);
    v_fillarea(handle,count,points);
    vsf_perimeter(handle,1);
}

/* --------------------------------------------- */

draw_melde(x_pos2,y_pos2,filemelde) 
int x_pos2, y_pos2; 
char *filemelde;
{
    int count=5; /* den gewählten Dateinamenin */
    int x_len=350,/* einer Infobox anzeigen */
        y_len=40; 
    int points [5][2]; 
    int i,j=0;

    vsf_style(handle,2); 
    vsf_interior(handle,8); 
    pt_set(points[0],x_pos2,y_pos2) ; 
    pt_set(points[1],(x_pos2+x_len),y_pos2); 
    pt_set(points[2],(x_pos2+x_len),(y_pos2+y_len)); 
    pt_set(points[3],x_pos2,(y_pos2+y_len)); 
    pt_set(points[4],x_pos2,y_pos2); 
    v_fillarea(handle,count,points); 
    x_pos2=x_pos2+2; 
    y_pos2=y_pos2+2; 
    x_len=x_len-4; 
    y_len=y_len-4; 
    do {
        pt_set(points[0],x_pos2,y_pos2); 
        pt_set(points[1],(x_pos2+x_len),y_pos2); 
        pt_set(points[2],(x_pos2+x_len),(y_pos2+y_len));
        pt_set(points[3],x_pos2,(y_pos2+y_len)); 
        pt_set(points[4],x_pos2,y_pos2); 
        v_fillarea(handle,count,points);
        j++;
        x_pos2++; 
        y_pos2++; 
        x_len=x_len-2; 
        y_len=y_len-2;
    } while(j!=2);
    v_gtext(handle,x_pos2+9,y_pos2+22,filemelde);
}

/* --------------------------------------------- */

set_pixel(cx,cy)
int cx, cy;
{
    int points[2][2]; 
    int count=2;

    vsf_color(1); 
    cy=cy+WORD;
    pt_set(points[0],cx,cy); 
    pt_set(points[1],cx,cy); 
    v_pline(handle,count,points);
}

/* --------------------------------------------- */

check_word()
{
    int count=0;

    if(Fread(fd,1L,&buffer)>0)
    {
        Fread(fd,1L,&buffer); 
        if((int)buffer==48)
        {
            do
            {
                count++;
                if (count==250) break; 
                if ((int)buffer==-128) break;
                Fread(fd,1L,&buffer);
            } while((int)buffer!=-128); 
            MAX_ZEILE=MAX_1stWORD;
            WORD=10;
        }
        else
        {
            Fseek(fd,0L,0);
        }
    }
}

/* --------------------------------------------- */

Lutz-R. Frank
Aus: ST-Computer 10 / 1989, Seite 95

Links

Copyright-Bestimmungen: siehe Über diese Seite