Logo Search packages:      
Sourcecode: varkon version File versions  Download package

ig20.c

/*!******************************************************************/
/*  File: ig20.c                                                    */
/*  ============                                                    */
/*                                                                  */
/*  This file includes:                                             */
/*                                                                  */
/*               -- statusfield driver --                           */
/*     iggnsa();         Generate status area                       */
/*     igupsf();         Update statusfield                         */
/*     igupsa();         Update all statusfields                    */
/*                                                                  */
/*               -- menu driver --                                  */
/*     igaamu();         Add VT100-meny to menu area                */
/*     igsamu();         Sub VT100-meny from menu area              */
/*     iggalt();         Read choice from active menu               */
/*     igupmu();         Update menu area                           */
/*     igpamu();         Display menu                               */
/*     igerpl();         Erase arrow                                */
/*     igsmmu();         Select main menu                           */
/*     iggmmu();         Returns number of main menu                */
/*                                                                  */
/*               -- list driver --                                  */
/*     iginla();         Initiate list driver                       */
/*     igalla();         Add line to list area                      */
/*     igrsla();         Reset display after listing                */
/*     igexla();         Exit from list driver                      */
/*                                                                  */
/*               -- message driver --                               */
/*     igplma();         Push line in message area                  */
/*     igptma();         Push t-string in message area              */
/*     igwlma();         Write line in message area                 */
/*     igwtma();         Write t-string in message area             */
/*     igrsma();         Pop  line in message area                  */
/*    *igqema();         Return current t-string                    */
/*                                                                  */
/*     igmlv1();         Display full menus                         */
/*     igmlv2();         Only display headings                      */
/*     igmlv3();         Don't display menus                        */
/*     igslv1();         Display  status area                       */
/*     igslv2();         Don't display status area                  */
/*                                                                  */
/*  This file is part of the VARKON IG Library.                     */
/*  URL:  http://www.varkon.com                                     */
/*                                                                  */
/*  This library is free software; you can redistribute it and/or   */
/*  modify it under the terms of the GNU Library General Public     */
/*  License as published by the Free Software Foundation; either    */
/*  version 2 of the License, or (at your option) any later         */
/*  version.                                                        */
/*                                                                  */
/*  This library is distributed in the hope that it will be         */
/*  useful, but WITHOUT ANY WARRANTY; without even the implied      */
/*  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR         */
/*  PURPOSE.  See the GNU Library General Public License for more   */
/*  details.                                                        */
/*                                                                  */
/*  You should have received a copy of the GNU Library General      */
/*  Public License along with this library; if not, write to the    */
/*  Free Software Foundation, Inc., 675 Mass Ave, Cambridge,        */
/*  MA 02139, USA.                                                  */
/*                                                                  */
/*  (C)Microform AB 1984-1999, Johan Kjellander, johan@microform.se */
/*                                                                  */
/********************************************************************/

#include "../../DB/include/DB.h"
#include "../include/IG.h"
#include "../../WP/include/WP.h"
#include "../../GP/include/GP.h"
#include "../include/screen.h"
#include <string.h>

short menlev;

/* menlev är ett heltal 1, 2 eller 3 som anger hur
   stor del av menyer som skall visas på skärmen.
      1 => Meny och rubrik
      2 => Endast rubrik
      3 => Inget alls */


short stalev;

/* stalev är ett heltal 1 eller två som anger
   om statusarean skall visas på skärmen eller ej.
     1 => Visa statusarean
     2 => Visa ej statusarean */


char actmes[MAXTXT+1];

/* actmes är den sträng som finns i meddelanderaden */


short astack[MENLEV+1];

/* astack är en stack med heltal som håller reda på
   vilket alternativ som aktiverats i en viss meny */


char hstack[MENLEV+1][40];

/* hstack är en stack med strängar som håller reda på
   hur man kommit till en viss meny. */

#define MXMLEV 5
char  pstack[MXMLEV+1][81];
short pant = 0;

/* pstack är en stack med strängar som skrivits ut
   på meddelanderaden.
   pant är antal strängar i stacken */


short mstack[MENLEV+1];
short mant = 0;

/* mstack är en stack med heltal som håller reda på
   vilka menyer som aktiverats.
   mant är är antalet menyer i stacken. */


short linpnt;
bool  listop;
short bmhndl;
char  acthds[V3STRLEN+1];

/* Pekare till nästa rad i listarean samt flagga för list-stopp.
   acthds är aktuell headersträng för listarea.
   bmhndl är bitmap-handle för CGI. */

static short mmain;

/* mmain är aktuell huvudmeny */



extern bool    tmpref;
extern char    pidnam[],jobnam[],jobdir[],amodir[],asydir[],hlpdir[];
extern char    mdffil[],actcnm[];
extern V2NAPA  defnap;
extern char    txtmem[];  /* alla t-strängar i en "ragged" array */
extern char   *txtind[];  /* pekare till alla textsträngar */
extern MNUDAT  mnutab[];  /* alla menyer 910227/JK */
extern MNUALT  smbind[];
extern double  gpgszx;
extern short   sarx,sadx,sarfw,sadfw,say,shgt;
extern short   modtyp,modatt,menurx,menury,mhgt,mwdt;
extern short   ialy,ialx,lafcol,lafw,laly,lahedy,laflin;
extern short   lallin,igtrty,maly,malx,rmarg,bmarg;
extern short   v3mode,gptrty;

static void igupsf(char *s, short fnum);

/*!****************************************************************/

        void iggnsa()
 
/*      Skriver ut hela statusarean, både rubriker och värden.
 *
 *      14/5/86  Test av IP32 som terminal, R. Svedin
 *      29/10/86 Rubrik även för IP32, R. Svedin
 *      23/3/88  Ritpaketet, J. Kjellander
 *
 ***************************************************************!*/

  {
/*
***I BATCH-mode skall inget göras här.
*/
   if ( igtrty == BATCH ) return;
/*
***Likaså i X11-mode.
*/
#ifdef V3_X11
    if ( igtrty == X11 ) return;
#endif
/*
***Skall status överhuvud taget skrivas ut ?
*/
    if ( stalev == 1 )
      {
      gpspen(1);
/*
***Toppnivåns rubriker.
*/
     if ( v3mode == TOP_MOD )
       {
       igdfld(sarx,sarfw,say+1);
       igfstr(iggtts(63),JURIGHT,UNDLIN);  /* projekt */
       igpstr(":",REVERS);

       igdfld(sarx,sarfw,say+2);
       igfstr(iggtts(64),JURIGHT,UNDLIN);  /* jobkatalog */
       igpstr(":",REVERS);

       igdfld(sarx,sarfw,say+3);
       igfstr(iggtts(65),JURIGHT,UNDLIN);  /* partkatalog */
       igpstr(":",REVERS);

       igdfld(sarx,sarfw,say+4);
       igfstr(iggtts(66),JURIGHT,UNDLIN);  /* symkatalog */
       igpstr(":",REVERS);

       igdfld(sarx,sarfw,say+5);
       igfstr(iggtts(53),JURIGHT,UNDLIN);  /* hjälpkatalog */
       igpstr(":",REVERS);

       igdfld(sarx,sarfw,say+6);
       igfstr(iggtts(52),JURIGHT,NORMAL);  /* partkatalog */
       igpstr(":",REVERS);
       }
/*
***Ritmodulens rubriker.
*/
      else if ( v3mode == RIT_MOD )
        {
        igdfld(sarx,sarfw,say+1);
        igfstr(iggtts(62),JURIGHT,UNDLIN);  /* job */
        igpstr(":",REVERS);

        igdfld(sarx,sarfw,say+2);
        igfstr(iggtts(56),JURIGHT,UNDLIN);  /* ksy */
        igpstr(":",REVERS);

        igdfld(sarx,sarfw,say+3);
        igfstr(iggtts(58),JURIGHT,UNDLIN);  /* vy */
        igpstr(":",REVERS);

        igdfld(sarx,sarfw,say+4);
        igfstr(iggtts(59),JURIGHT,UNDLIN);  /* pen */
        igpstr(":",REVERS);

        igdfld(sarx,sarfw,say+5);
        igfstr(iggtts(60),JURIGHT,UNDLIN);  /* skl */
        igpstr(":",REVERS);

        igdfld(sarx,sarfw,say+6);
        igfstr(iggtts(61),JURIGHT,NORMAL);  /* niv */
        igpstr(":",REVERS);
        }
/*
***Basmodulens rubriker.
*/
      else
        {
        igdfld(sarx,sarfw,say+1);
        igfstr(iggtts(62),JURIGHT,UNDLIN);  /* job */
        igpstr(":",REVERS);

        igdfld(sarx,sarfw,say+2);
        igfstr(iggtts(54),JURIGHT,UNDLIN);  /* typ */
        igpstr(":",REVERS);

        igdfld(sarx,sarfw,say+3);
        igfstr(iggtts(55),JURIGHT,UNDLIN);  /* atr */
        igpstr(":",REVERS);

        igdfld(sarx,sarfw,say+4);
        igfstr(iggtts(56),JURIGHT,UNDLIN);  /* ksy */
        igpstr(":",REVERS);

        igdfld(sarx,sarfw,say+5);
        igfstr(iggtts(57),JURIGHT,UNDLIN);  /* ref */
        igpstr(":",REVERS);

        igdfld(sarx,sarfw,say+6);
        igfstr(iggtts(58),JURIGHT,UNDLIN);  /* vy */
        igpstr(":",REVERS);

        igdfld(sarx,sarfw,say+7);
        igfstr(iggtts(59),JURIGHT,UNDLIN);  /* pen */
        igpstr(":",REVERS);

        igdfld(sarx,sarfw,say+8);
        igfstr(iggtts(60),JURIGHT,UNDLIN);  /* skl */
        igpstr(":",REVERS);

        igdfld(sarx,sarfw,say+9);
        igfstr(iggtts(61),JURIGHT,NORMAL);  /* niv */
        igpstr(":",REVERS);
        }
/*
***Uppdatera statusvärden.
*/
      igupsa();
      }
  }

/******************************************************************/
/*!****************************************************************/

static  void igupsf(
        char *s,
        short fnum)

/*      Uppdaterar ett visst statusfälts värde.
 *
 *      In: *s   => Värde-sträng.
 *          fnum => Fältnummer.
 *
 *      Ut: Inget.
 *
 *      FV: Inget.
 *
 *      (C)microform ab 23/3/88 J. Kjellander
 *
 ***************************************************************!*/

  {

/*
***I BATCH-mode skall inget göras här.
*/
   if ( igtrty == BATCH ) return;
/*
***Likaså i X11-mode.
*/
#ifdef V3_X11
    if ( igtrty == X11 ) return;
#endif
/*
***Är statusarean påslagen ?
*/
    if ( stalev == 1 )
      {
      igdfld(sadx,sadfw,say+1+fnum);
      igfstr(s,JULEFT,NORMAL);
      igflsh();
    }
  }

/*****************************************************************/
/*!***************************************************************/

        void igupsa()

/*      Uppdaterar samtliga statusareans värde-fält.
 *
 *      (C)microform ab 23/6/85 J. Kjellander
 *
 *      13/6/86  Variabler för skärmstorlek.  R. Svedin
 *      30/9/86  Ny nivåhantering, J. Kjellander
 *      18/10/86 gpgwin(), J. Kjellander
 *      23/3/88  Ritpaketet, J. Kjellander
 *      1999-04-22 BATCH, J.Kjellander
 *
 ***************************************************************!*/

 {
   char   strbuf[20];
   double skala;
   VY     actwin;

/*
***I BATCH-mode skall inget göras här.
*/
   if ( igtrty == BATCH ) return;
/*
***Likaså i X11-mode.
*/
#ifdef V3_X11
    if ( igtrty == X11 ) return;
#endif
/*
***Nokia-terminalen suddar inte när en text skriver över
***en annan.
*/
      if ( igtrty == N220G  &&  stalev == 1 )
        {
        igmvac(sadx,say+1);
        igerar(sadfw,9);
        }
/*
***V3:s toppnivå.
*/
    if ( v3mode == TOP_MOD )
      {
      igupsf(pidnam,0);
      igupsf(jobdir,1);
      igupsf(amodir,2);
      igupsf(asydir,3);
      igupsf(hlpdir,4);
      igupsf(mdffil,5);
      }
/*
***Ritmodulen.
*/
    else if ( v3mode == RIT_MOD )
      {
      igupsf(jobnam,0);
      igupsf(actcnm,1);
      gpgwin(&actwin);
      igupsf(actwin.vynamn,2);
      sprintf(strbuf,"%d",defnap.pen);
      igupsf(strbuf,3);
      skala = gpgszx / (actwin.vywin[2]-actwin.vywin[0]);
      sprintf(strbuf,"%.4g",skala);
      igupsf(strbuf,4);
      sprintf(strbuf,"%d",defnap.level);
      igupsf(strbuf,5);
      }
/*
***Basmodulen.
*/
    else
      {
      igupsf(jobnam,0);
      if ( modtyp == 3 ) igupsf("GEOMETRY",1);
      else igupsf("DRAWING",1);
      if ( modatt == LOCAL ) igupsf("LOCAL",2);
      else if ( modatt == GLOBAL ) igupsf("GLOBAL",2);
      else igupsf("BASIC",2);
      igupsf(actcnm,3);
      if ( tmpref ) igupsf(iggtts(23),4);
      else igupsf(iggtts(22),4);
      gpgwin(&actwin);
      igupsf(actwin.vynamn,5);
      sprintf(strbuf,"%d",defnap.pen);
      igupsf(strbuf,6);
      skala = gpgszx / (actwin.vywin[2]-actwin.vywin[0]);
      sprintf(strbuf,"%.4g",skala);
      igupsf(strbuf,7);
      sprintf(strbuf,"%d",defnap.level);
      igupsf(strbuf,8);
      }
 }

/******************************************************************/
/*!****************************************************************/

         bool igaamu(short mnum)

/*       Add new vt100 menu to menu area and make it active.
 *
 *       IN:
 *       mnum:          menynummer
 *
 *       Ut: Inget.
 *
 *       FV: Inget.
 *
 *       REVIDERAD:
 *
 *       21/10-85 Menystack, Ulf Johansson
 *       9/10/86  Menypil, J. Kjellander
 *
 ****************************************************************!*/

  {

/*
***Kolla att menystacken inte är full.
*/
    if (mant < MENLEV)
      {
/*
***Uppdatera mstack, astack och skriv ut den nya menyn.
*/
      mstack[ mant++ ] = mnum;
      astack[mant] = -1;
      igupmu();
      return(TRUE);
      }
      else return(FALSE);
  }

/******************************************************************/
/*!****************************************************************/

        bool igsamu()

/*      Sub vt100 menu from menu area and make
 *      previous menu active.
 *
 *      In: Inget.
 *
 *      Ut: Inget.
 *
 *      FV: Inget.
 *
 *      REVIDERAD:
 *
 *      21/10-85 Ulf Johansson
 *      9/10/86  Menypil, J. Kjellander
 *
 ****************************************************************!*/

  {
    if (mant > 0)
      {
/*
***Stryk menyn.
*/
      mant--;
      igupmu();
      return(TRUE);
      }
      else return(FALSE);
  }

/******************************************************************/
/*!****************************************************************/

        short iggalt(
        MNUALT **paltp,
        short   *ptyp)

/*      Returnerar alternativ ur aktiv meny.
 *
 *      In: paltp = Pekare till alternativpekare
 *          ptyp  = Pekare till typ av alternativ
 *
 *      Ut: *paltp = Pekare till alternativ eller NULL
 *          *ptyp  = Typ av alternativ om paltp=NULL
 *
 *      FV: Inget.
 *
 *      REVIDERAD:
 *
 *      22/10-85 Symboler, Ulf Johansson
 *      6/11/85  Meny noll, J. Kjellander
 *      24/2/86  Input läge i X-led R. Svedin
 *      2/10/86  Direkt till huvudmeny, J. Kjellander
 *      12/10/86 Historik, J. Kjellander
 *      28/10/86 Flyttat menyarean, R. Svedin
 *      8/11/88  Snabbval, J. Kjellander
 *      7/8/91   Pil uppåt, J. Kjellander
 *      23/8/92  X11, J. Kjellander
 *
 ****************************************************************!*/

  {
    MNUDAT *menu;
    MNUALT *alt;
    short i,nalt,wdth,cnum,nhits,plen,mnum,altnum,xpos;
    char cbuf[81];
    char c;
    bool exit;

/*
***Div. initiering.
*/
    if ( (mnum=mstack[mant-1]) == 0 ) mnum = iggmmu();
    menu = &mnutab[mnum];
    nalt = menu->nalt;
    plen = strlen(iggtts(MSELPR));      /* promtlängd */
    wdth = 1;
    cnum = 0;                           /* antal inlästa tecken */
    cbuf[0] = '\0';
/*
***Skriv ut prompt och definiera inmatningsfält.
*/
    if ( igtrty != X11 )
      {
      igmvac(ialx,ialy);
      igerar(rmarg,1);
      igmvac(ialx,ialy);
      igpstr(iggtts(MSELPR),REVERS);
      }

    xpos = ialx + plen + 2;

    if ( igtrty != X11 )
      {
      igdfld(xpos,wdth,ialy);
      igmvac(xpos,ialy);
      igflsh();
      }
/*
***Läs in svar.
*/
    exit = FALSE;

    while ( !exit )
      {
      switch ( iggtsm(&c,&alt) )
        {
/*
***Ett tecken, kolla om något alternativ ännu valts ut.
*/
        case SMBCHAR:
        cbuf[cnum++] = c;
        cbuf[cnum] = '\0';

        i = nhits = altnum = 0;
        alt = menu->alt;
        while ( i++ < nalt )
          {
          if (strncmp(alt->str,cbuf,cnum) == 0)
            {
            nhits++;
            *paltp = alt;
            altnum = i;
            }
          alt++;
          }

        if (nhits <= 0)
          {
          igbell();
          cbuf[ --cnum ] = '\0';
          }
        else if (nhits > 1)
          {
          xpos++;
          wdth++;
          }
        else
          {
/*
***Om meny spara nuvarande rubrik i hstack.
*/
          if ( (*paltp)->acttyp == MENU && mant == 1 )
            hstack[mant][0] = '\0';
          if ( (*paltp)->acttyp == MENU && mant > 1 )
            strcpy(hstack[mant],menu->rubr);
/*
***Om inte meny, spara alternativet i hstack och astack
***samt markera i menyn.
*/
          if ( (*paltp)->acttyp != MENU )
            {
            astack[mant] = altnum;
            strcpy(hstack[mant],(*paltp)->str);
            if ( menlev == 1 && igtrty != X11 )
              {
              igdfld(menurx+1,menu->wdth,menury+1+astack[mant]);
              igfstr((*paltp)->str,JULEFT,REVERS);
              }
            }
          exit = TRUE;
          }
        break;
/*
***Return och pil uppåt.
*/
        case SMBRETURN:
        case SMBUP:
        *paltp = NULL;
        *ptyp = SMBRETURN;
        exit = TRUE;
        break;
/*
***Backspace.
*/
        case SMBBACKSP:
        if (cnum == 0) igbell();
        else 
          {
          cbuf[ --cnum ] = '\0';
          xpos--;
          wdth--;
          }
        break;
/*
***Hjälp.
*/
        case SMBHELP:
        if ( ighelp() == GOMAIN ) goto gomain;
/*
***Snabbval. Under inmatningen kan ett MBS-program ha anropats
***och gjort PSH_MEN()!!!.
*/
        case SMBESCAPE:
        if ( (mnum=mstack[mant-1]) == 0 ) mnum = iggmmu();
        menu = &mnutab[mnum];
        nalt = menu->nalt;

        if ( igtrty != X11 )
          {
          igmvac(ialx,ialy);
          igerar(rmarg,1);
          igmvac(ialx,ialy);
          igpstr(iggtts(MSELPR),REVERS);
          igdfld(ialx+plen+2,menu->wdth,ialy);
          }
        break;
/*
***Huvudmenyn.
*/
        case SMBMAIN:
        goto gomain;
        break;
/*
***Meny-alternativ.
*/
        case SMBALT:
       *paltp = alt;
        return(0);
        break;
/*
***Fel.
*/
        default:
        igbell();
        break;
        }
/*
***Skriv ut inmatade tecken och läs in nästa.
*/
      xpos = ialx + plen + 2;

      if ( igtrty != X11 )
        {
        igdfld(xpos,wdth,ialy);
        igfstr(cbuf,JULEFT,NORMAL);
        igmvac(xpos,ialy);
        igflsh();
        }
      }
/*
***Avslutning.
*/
    if ( igtrty != X11 )
      {
      igmvac(ialx,ialy);
      igerar(rmarg,1);
      igflsh();
      }

    return(0);
/*
***GOMAIN.
*/
gomain:
   *paltp = NULL;
   *ptyp = SMBMAIN;
    return(0);
  }

/******************************************************************/
/*!****************************************************************/

        short igupmu()

/*      Uppdatera aktiv meny.
 *
 *      In: Inget.
 *
 *      Ut: Inget.
 *
 *      FV: Inget.
 *
 *      REVIDERAD:
 *
 *      22/10-85 Scroll, Ulf Johansson
 *      6/11/85  Meny noll, J. Kjellander
 *      19/2/86  Menystack endast för LVT100 R. Svedin
 *      14/5/86  Test av IP3215 R. Svedin
 *      2/10/86  menlev, J. Kjellander
 *      9/10/86  Tagit bort stacken, J. Kjellander
 *      28/10/86 Flyttat menyarean, R. Svedin
 *
 ****************************************************************!*/

  {
    short m;

/*
***Om det är en NOKIA måste vi sudda menyarean
***eftersom en ny text inte skriver över en gammal.
*/
    if ( igtrty == N220G  &&  menlev < 3)
      {
      igmvac(menurx,menury);
      if ( menlev == 1 ) igerar(mwdt+2,mhgt);
      else igerar(mwdt+2,2);
      }
/*
***Skriv ut aktiv meny om det finns nån.
*/
    if ( mant > 0 )
      {
      if ( (m=mstack[mant-1]) == 0 ) m = iggmmu();
      igpamu(menurx,menury,m);
      }

    igflsh();

    return(0);
  }

/******************************************************************/
/*!****************************************************************/

       short igpamu(
       short x,
       short y,             
       short mnum)            

/*     Skriver ut meny.
 *
 *     In: x,y  => Menyns övre vänstra hörn, vt100-koordinat
 *         mnum => Menynummer
 *
 *     Ut: Inget
 *
 *     FV:  0   => Ok
 *         -1   => No such menu defined
 *
 *     (C)microform ab 1985 Ulf Johansson
 *
 *     2/10/86  menlev, J. Kjellander
 *     8/10/86  historik, J. Kjellander
 *     11/10/86 aktivt alt, J. Kjellander
 *     28/2/91  Optimerat suddning, J. Kjellander
 *
 ****************************************************************!*/

  {
    short   nnalt;        /* Nytt antal alternativ */
    short   nalen;        /* Ny alternativ-maxlängd */
    short   nrlen;        /* Ny rubriklängd */
    short   onalt;        /* Old antal alternativ */
    short   oalen;        /* Old alternativ-maxlängd */

    short   hlen,diff,ax,ay,nrows;    
    char    rbuf[V3STRLEN+1];

    static short omnum = 0;  /* Föregående meny */
    static short orlen = 0;  /* Föregående rubriklängd */
    MNUALT *naltp;

/* 
***Kolla att menyn finns.
*/
    if ( mnutab[mnum].rubr == NULL ) return(-1);
/*
***X11.
*/
#ifdef V3_X11
    if ( igtrty == X11 )
      {
      wppamu(&mnutab[mnum]);
      return(0);
      }
#endif
/*
***WIN32.
*/
#ifdef WIN32
    return(0);
#endif
/*
***Den gamla och den nya menyns storlek.
*/
    naltp = mnutab[mnum].alt;
    nnalt = mnutab[mnum].nalt;
    nalen = mnutab[mnum].wdth;

    if ( omnum > 0 )
      {
      onalt = mnutab[omnum].nalt;
      oalen = mnutab[omnum].wdth;
      }
    else
      { onalt = 0; oalen = 0; }
/*
***Beräkna rubrikfältets längd.
*/
    if ( menlev < 3 && mant > 1 ) hlen=strlen(hstack[mant-1]);
    else hlen = 0;

    if ( hlen > nalen ) nrlen = hlen;
    else nrlen = nalen;
    if ( igtrty == CGI ) nrlen = nrlen + 1;
    else nrlen = nrlen + 2;
/*
***Skriv ut alternativ och rubrik.
*/
    if ( menlev < 3 )
      {
/*
***Först alternativen, ev. aktivt alternativ i REVERS.
***Om de nya alternativen är färre än de gamla, sudda
***skillnaden. Likaså om nya rader är kortare än gamla.
*/
      if ( menlev == 1 )
        {
        gpspen(1);
        ax = x+1; ay = y+2;
        nrows = nnalt;
        if ( (diff = oalen - nalen) < 0 ) diff = 0;
        rbuf[diff] = '\0';
        while ( diff > 0 ) rbuf[--diff] = ' ';

        while ( nrows-- )
          {
          igdfld(ax,nalen,ay++); 
          if ( astack[mant] == nnalt-nrows )
               igfstr((naltp++)->str,JULEFT,REVERS);
          else igfstr((naltp++)->str,JULEFT,UNDLIN);
          igwstr(rbuf);
          }
        if ( onalt > nnalt )
          { igmvac(x+1,y+2+nnalt); igerar(oalen,onalt-nnalt); }
        }
     }
/*
***Skriv ut rubriken.
*/
    igdfld(x,nrlen,y+1);
    strcpy(rbuf," ");
    strcat(rbuf,mnutab[mnum].rubr);
    if ( menlev < 3 )
      {
      igfstr(rbuf,JULEFT,REVERS);
/*
***Om nya rubriken är kortare än gamla behövs lite
***extra suddning.
*/
      if ( (diff = orlen - nrlen) < 0 ) diff = 0;
      rbuf[diff] = '\0';
      while ( diff > 0 ) rbuf[--diff] = ' ';
      igwstr(rbuf);
/*
***Skriv ut historik eller tom rad.
*/
      igdfld(x,nrlen,y);
      strcpy(rbuf," ");
      if ( mant > 1 ) strcat(rbuf,hstack[mant-1]);
      igfstr(rbuf,JULEFT,REVERS);

      if ( (diff = orlen - nrlen) < 0 ) diff = 0;
      rbuf[diff] = '\0';
      while ( diff > 0 ) rbuf[--diff] = ' ';
      igwstr(rbuf);
      }
/*
***Uppdatera statiska variabler.
*/
    omnum = mnum;
    orlen = nrlen;

    return(0);

  }

/******************************************************************/
/*!****************************************************************/

        short igerpl()

/*      Suddar eventuell pil i aktiv meny.
 *
 *      In: Inget.
 *
 *      Ut: Inget.
 *
 *      FV: Inget.
 *
 *      (C)microform 1986 J. Kjellander
 *
 *      28/10/86 Flyttat menyarean, R. Svedin
 *      3/11/88  N220G, R. Svedin
 *      23/8/92 X11, J. Kjellander
 *
 ****************************************************************!*/

  {
    MNUDAT *menu;
    MNUALT *alt;
    short   m;
/*
***Terminaler med menyer i Tek-alfa mode utan färg och X11.
*/
    if ( igtrty == N220G  ||  igtrty == MSMONO  ||
         igtrty == X11 ) return(0);
/*
***Sudda ev pil på nuvarande meny.
*/
   if ( menlev == 1 && mant > 0 && astack[mant] != -1 )
     {
     gpspen(1);
     if ( (m=mstack[mant-1]) == 0 ) m = iggmmu();
     menu = &mnutab[m];
     alt  = menu->alt + astack[mant] - 1;
     igdfld(menurx+1,menu->wdth,menury+1+astack[mant]);
     igfstr(alt->str,JULEFT,UNDLIN);
     }

   return(0);
  }

/******************************************************************/
/*!****************************************************************/

        short igsmmu(short m)

/*      Sätter aktuell huvudmeny.
 *
 *      In: m = Ny huvudmeny.
 *
 *      (C)microform 1996-02-26  J.Kjellander
 *
 ****************************************************************!*/

  {
    mmain = m;
    return(0);
  }

/******************************************************************/
/*!****************************************************************/

        short iggmmu()

/*      Returnerar aktuell huvudmeny.
 *
 *      In: Inget.
 *
 *      FV: menynummer.
 *
 *      (C)microform 1996-02-26  J.Kjellander
 *
 ****************************************************************!*/

  {

/*
***Om mmain = 0 har ingen huvudmeny angetts i menyfilen
***utan systemets default huvudmeny skall användas.
*/
   if ( mmain == 0 )
     {
     switch ( v3mode )
       {
       case BAS2_MOD: return(2);
       case BAS3_MOD: return(3);
       case RIT_MOD:  return(4);
       default:       return(-1);
       }
     }
/*
***Om mmain <> 0 har denna huvudmeny angetts som huvudmeny
***i den aktuella menyfilen.  main_menu = nnn.
*/
   else return(mmain);
  }

/******************************************************************/
/*!****************************************************************/

        short iginla(char *hs)

/*      Initiera listarean.
 *
 *      In: *hs => headlinesträng
 *
 *      Ut: Inget.
 *
 *      FV: Inget.
 *
 *      14/5/86  Villkorlig kompilering IP_32 R. Svedin
 *      18/4/87  listop, J. Kjellander
 *      31/10/88 CGI, J. KJellander
 *      3/11/88  N220G, R. Svedin
 *      21/7/92  X11, J. Kjellander
 *      1998-05-27 BATCH, J.Kjellander
 *
 ****************************************************************!*/

  {
    char  tmpbuf[80];

/*
***Stäng av liststoppet.
*/
    listop = FALSE;
/*
***WIN32.
*/
#ifdef WIN32
    msinla(hs);
    return(0);
#endif
/*
***Vilken typ av output ?.
*/
    if ( igtrty == BATCH ) return(0);
/*
***X11.
*/
#ifdef V3_X11
    else if ( igtrty == X11 )
      {
      wpinla(hs);
      return(0);
      }
#endif
/*
***Terminaler med ett bildminne. Spara undan headersträngen
***så att den kan skrivas ut igen vid ny sida.
*/
    else if ( igtrty == N220G  ||  igtrty == MSCOLOUR  ||
              igtrty == MSMONO )
      {
      gperal();
      strcpy(acthds,hs);
      }
/*
***VT100.
*/
    else
      {
      gpansi();
      sprintf(tmpbuf,"\033[%d;%dr",laflin,lallin);
      igpstr(tmpbuf,NORMAL);
      igmvac(1,1); 
      igerar(rmarg,laly);
      }
/*
***Skriv ut rubrik.
*/
    igdfld(lafcol,lafw,lahedy);
    igfstr(hs,JULEFT,REVERS);
    igmvac(1,laflin);
    linpnt = laflin;
  
    return(0);
  }

/******************************************************************/
/*!****************************************************************/

        short igalla(
        char *ls,
        short lf)

/*      Skriv ut nästa rad listarean.
 *
 *      In: *ls  => Pekare till sträng
 *          lf   => Antal radsprång före utskrift
 *
 *      Ut: Inget.
 *
 *      FV: Inget.
 *
 *      3/2/86   Bytt getchar mot iggtch R. Svedin
 *      6/10/86  GOMAIN, J. Kjellander
 *      21/10/86 Bug, J. Kjellander
 *      18/4/87  listop, J. Kjellander
 *      21/7/92  X11, J. Kjellander
 *      1998-05-27 BATCH, J.Kjellander
 *
 ****************************************************************!*/

  {
    char  c;

/*
***Vilken typ av output ?
*/
    if ( igtrty == BATCH ) return(0);
/*
***X11.
*/
#ifdef V3_X11
    if ( igtrty == X11 )
      {
      wpalla(ls,lf);
      return(0);
      }
#endif
/*
***WIN32.
*/
#ifdef WIN32
    msalla(ls,lf);
    return(0);
#endif
/*
***Om listop görs ingenting.
*/
    if ( listop ) return(0);
/*
***Om listarean är full, fråga efter rad eller sida.
*/
    while ( linpnt+lf > lallin )
      {
      igmvac(1,ialy);
      igerar(rmarg,1);
      igmvac(1,ialy);
      igpstr(iggtts(LANXT),REVERS);
      igflsh();
/*
***Läs in svar.
*/
      if ( (c=iggtch()) == ' ')
        {
        if ( igtrty != N220G  &&  igtrty !=  MSCOLOUR  &&
             igtrty != MSMONO )
          {
          igmvac(1,lallin);
          igpstr("\n",NORMAL);
          linpnt--;
          igflsh();
          }
        else igbell();
        }
      else if(c == '\n')
        {
        if ( igtrty == N220G  || igtrty == MSCOLOUR  ||  igtrty == MSMONO )
          {
          gpersc();
          igdfld(lafcol,lafw,lahedy);
          igfstr(acthds,JULEFT,REVERS);
          igmvac(1,laflin);
          linpnt = laflin;
          }
        else
          {
          igmvac(1,lallin);
          while (linpnt > laflin)
             {
             igpstr("\n",NORMAL);
             linpnt--;
             }
           }
        igflsh();
        }
      else if ( c == '\033' )
        {
        listop = TRUE;
        igrsla();
        return(REJECT);
        }
      else if ( c == *smbind[7].str )
        {
        listop = TRUE;
        igrsla();
        return(GOMAIN);
        }
      else
        {
        igbell();
        }
      }
/*
***Listarean är inte full, skriv ut raden.
*/
    linpnt += lf;
    igdfld(lafcol,lafw,linpnt);
    igfstr(ls,JULEFT,NORMAL);
    igflsh();

    return(0);
  }

/******************************************************************/
/*!****************************************************************/

        short igrsla()

/*      Återställer skärmen efter listning i listarean.
 *
 *      In: Inget.
 *
 *      Ut: Inget.
 *
 *      FV: Inget.
 *
 *      (C)microform ab 1986 J. Kjellander
 *
 *      17/1/87  IP_32 V1.3, J. Kjellander
 *      31/10/88 CGI, J. Kjellander
 *      3/11/88  N220G, R. Svedin
 *      1998-05-27 BATCH, J.Kjellander
 *
 ****************************************************************!*/

  {
    char  tmpbuf[80];

/*
***Vilken typ av output ?
*/
    if ( igtrty == BATCH ) return(0);
/*
***Terminaler med ett bildminne.
*/
    else if ( igtrty == N220G  ||  igtrty == MSCOLOUR  ||
              igtrty == MSMONO )
      {
      if ( igialt(165,67,68,FALSE) ) repagm();
      else
        {
        gpersc(); gpdram();
        igupmu(); iggnsa();
        }
      }
/*
***VT100, Återställ menyarea, statusarea och inputrad.
*/
    else
      {
      sprintf(tmpbuf,"\033[%d;%dr",1,bmarg);
      igpstr(tmpbuf,NORMAL);
      igmvac(1,1);
      igerar(rmarg,laly);
      iggnsa();
      igupmu();
      igmvac(1,ialy);
      igerar(rmarg,1);
      }

    return(0);
  }

/******************************************************************/
/*!****************************************************************/

        short igexla()

/*      Avslutar listning i listarean.
 *
 *      In: Inget.
 *
 *      Ut: Inget.
 *
 *      FV: Inget.
 *
 *      14/5/86 Villkorlig kompilering IP_32 R. Svedin
 *      18/4/87  listop, J. Kjellander
 *      21/7/92  X11, J. Kjellander
 *      1998-05-27 BATCH, J.Kjellander
 *
 ****************************************************************!*/

  {
    char  c;
    short status;
/*
***Vilken typ av output ?
*/
    if ( igtrty == BATCH ) return(0);
/*
***X11.
*/
#ifdef V3_X11
    if ( igtrty == X11 )
      {
      wpexla(TRUE);
      return(0);
      }
#endif
/*
***WIN32.
*/
#ifdef WIN32
    msexla(TRUE);
    return(0);
#endif
/*
***Om listop är avslutning redan klar.
*/
    if ( !listop )
      {
      switch ( igtrty )
        {
/*
***Om terminal med bara ett bildminne återställer vi
***skärmen utan extra fråga. Fråga kommer ju då i
***igrsla() om hurvida skärmen skall ritas om.
*/
        case N220G:
        case MSCOLOUR:
        case MSMONO:
        status = 0;
        break;
/*
***Om två bildminnen behöver inte skärmen ritas om och följd-
***aktligen kommer ingen fråga om detta i igrsla(). Ställ
***istället en fråga här.
*/
        default:
loop:
        igmvac(1,ialy);
        igerar(rmarg,1);
        igmvac(1,ialy);
        igpstr(iggtts(LARDY),REVERS);
        igflsh();

        if ( (c=iggtch()) == '\n') status = 0;
        else if ( c == *smbind[7].str ) status = GOMAIN;
        else
          {
          igbell();
          goto loop;
          }
        break;
        }
/*
***Avslutning.
*/
      igrsla();
      return(status);
      }

    else return(0);
  }

/******************************************************************/
/*!****************************************************************/

        short igplma(
        char *s,
        int   mode)

/*      Skriv ut och stacka text på meddelanderaden.
 *
 *      In:  *s  => Pekare till sträng.
 *          mode => IG_INP  = Prompt före inmatning
 *                  IG_MESS = Meddelande
 *
 *      Ut: Inget.
 *
 *      (C)microform ab 2/1/95 J. Kjellander
 *
 ****************************************************************!*/

  {
    if ( pant < MXMLEV )
      {
      strncpy(pstack[pant],s,80);
      pstack[pant][80] = '\0';
      ++pant;
      }

    return(igwlma(s,mode));
  }

/******************************************************************/
/*!****************************************************************/

        short igptma(
        int tsnum,
        int mode)

/*      Skriver ut (pushar) t-sträng på meddelanderaden eller
 *      motsvarande.
 *
 *      In: tsnum => Numret på t-strängen.
 *          mode  => IG_INP  = Prompt före inmatning
 *                   IG_MESS = Meddelande
 *
 *      Ut: Inget.
 *
 *      (C)microform ab 2/1/95 J. Kjellander
 *
 ****************************************************************!*/

  {
    return(igplma(iggtts(tsnum),mode));
  }

/******************************************************************/
/*!****************************************************************/

        short igwlma(
        char *s,
        int   mode)

/*      Skriv ut text på meddelanderaden.
 *
 *      In:  *s  => Pekare till sträng.
 *          mode => IG_INP  = Prompt före inmatning
 *                  IG_MESS = Meddelande
 *
 *      Ut: Inget.
 *
 *     (C)microform ab 15/11/88 J. Kjellander
 *
 ****************************************************************!*/

  {
    static short pl = -1;   /* Föregående promts längd */

/*
***X11/WIN32. Om mode = IG_INP kommer promten ut i inmatningsfönstret
***utan att vi behöver göra något ytterligare här. Om mode = IG_MESS
***använder vi winpac:s meddelandefönster.
*/
#ifdef V3_X11
    if ( gptrty == X11 )
      {
      if ( mode == IG_MESS ) wpwlma(s);
      return(0);
      }
#endif

#ifdef WIN32
    if ( mode == IG_MESS ) mswlma(s);
    return(0);
#endif
/*
***Övriga terminaler.
***Första gången man kommer in här finns ingen föregående
***promt, sätt den till max.
*/
    if ( pl == -1 ) pl = rmarg;
/*
***Sudda promtarean.
*/
    igmvac(malx,maly);
    igerar(pl,1);
    pl = strlen(s);
/*
***Skriv ut.
*/
    igmvac(malx,maly);
    igpstr(s,NORMAL);
    if ( igtrty == LVT100 ) gpdram();
    igflsh();

    return(0);
  }

/******************************************************************/
/*!****************************************************************/

        short igwtma(short tsnum)

/*
 *      Skriver ut t-sträng på meddelanderaden utan att
 *      meddelandet pushas på meddelandestacken.
 *
 *      In: tsnum => Numret på t-strängen.
 *
 *      Ut: Inget.
 *
 *      (C)microform ab 2/2/95 J. Kjellander
 *
 ****************************************************************!*/

  {
    return(igwlma(iggtts(tsnum),IG_MESS));
  }

/******************************************************************/
/*!****************************************************************/

        short igrsma()

/*      Suddar meddelanderaden, dvs. gör pull på pstack.
 *
 *      In: Inget.
 *
 *      Ut: Inget.
 *
 *      FV: Inget.
 *
 ****************************************************************!*/

  {

    if ( pant > 0 ) --pant;

    if ( pant > 0 ) igwlma(pstack[pant-1],IG_MESS);
    else            igwlma("",IG_MESS);

    return(0);
  }

/******************************************************************/
/*!****************************************************************/

        char *igqema()

/*      Svarar på frågan: Vilken var den sista t-sträng som skrevs
 *      i meddelande-arean. 
 *
 *      In: Inget.
 *
 *      Ut: Inget.
 *
 *      FV: Pekare till sträng.
 *
 *
 *     (C)microform ab 28/10-85 Ulf Johansson
 *
 *     10/10/86 pstack, J. Kjellander
 *
 ****************************************************************!*/

  {
    if ( pant > 0 )
      {
      if ( pant <= MXMLEV ) return(pstack[pant-1]);
      else return(pstack[MXMLEV-1]);
      }
    else return("");
  }

/******************************************************************/
/*!******************************************************/

        short igmlv1()

/*      Aktiverar menyer och rubriker.
 *
 *      In: Inget.
 *
 *      Ut: Inget.
 *
 *      Felkod: Ingen.
 *
 *      (C)microform ab 2/10/86 J. Kjellander
 *
 ******************************************************!*/

  {
    menlev = 1;
    igupmu();

    return(0);
  }

/********************************************************/
/*!******************************************************/

        short igmlv2()

/*      Aktiverar bara rubriker.
 *
 *      In: Inget.
 *
 *      Ut: Inget.
 *
 *      Felkod: Ingen.
 *
 *      (C)microform ab 2/10/86 J. Kjellander
 *
 *      28/10/86 Flyttat menyarean, R. Svedin
 *
 ******************************************************!*/

  {
/*
***Sätt menlev.
*/
    /*igerpl();*/
    menlev = 2;
/*
***Sudda menyarean.
*/
    igmvac(menurx,menury);
    igerar(mwdt+2,mhgt);
    igupmu();

    return(0);
  }

/********************************************************/
/*!******************************************************/

        short igmlv3()

/*      Stänger av menyer och rubriker.
 *
 *      In: Inget.
 *
 *      Ut: Inget.
 *
 *      Felkod: Ingen.
 *
 *      (C)microform ab 2/10/86 J. Kjellander
 *
 ******************************************************!*/

  {
/*
***Sätt menlev.
*/
    /*igerpl();*/
    menlev = 3;
/*
***Sudda menyarean.
*/
    igmvac(menurx,menury);
    igerar(mwdt+2,mhgt);

    return(0);
  }

/********************************************************/
/*!******************************************************/

        short igslv1()

/*      Aktiverar statusarean.
 *
 *      In: Inget.
 *
 *      Ut: Inget.
 *
 *      Felkod: Ingen.
 *
 *      (C)microform ab 2/10/86 J. Kjellander
 *
 ******************************************************!*/

  {
/*
***Sätt stalev.
*/
    stalev = 1;
/*
***Uppdatera status-arean.
*/
    iggnsa();

    return(0);
  }

/********************************************************/
/*!******************************************************/

        short igslv2()

/*      Stänger av statusarean.
 *
 *      In: Inget.
 *
 *      Ut: Inget.
 *
 *      Felkod: Ingen.
 *
 *      (C)microform ab 2/10/86 J. Kjellander
 *
 ******************************************************!*/

  {
/*
***Sätt stalev.
*/
    stalev = 2;
/*
***Sudda status-arean.
*/
    igmvac(sarx-2,say-1);
    igerar(sarfw+sadfw+4,shgt+3);

    return(0);
  }

/********************************************************/

Generated by  Doxygen 1.6.0   Back to index