home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d8xx / d832 / term.lha / Term / term-3.1-Source.lha / termInfo.c < prev    next >
C/C++ Source or Header  |  1993-01-21  |  7KB  |  297 lines

  1. /*
  2. **    termInfo.c
  3. **
  4. **    Support routines for the `About' window.
  5. **
  6. **    Copyright © 1990-1993 by Olaf `Olsen' Barthel & MXM
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termGlobal.h"
  11.  
  12.     /* The number of text strings to display. */
  13.  
  14. #define NUM_STRINGS    16
  15.  
  16.     /* ShowInfo():
  17.      *
  18.      *    Open a window, draw the `term' logo, show some text
  19.      *    and wait for user reaction.
  20.      */
  21.  
  22. BYTE
  23. ShowInfo(BYTE Ticks)
  24. {
  25.     struct Window        *InfoWindow;
  26.     LONG             i,Length,MaxWidth,Offset;
  27.     BYTE             GotRexxMessage = FALSE;
  28.     struct DiskObject    *Icon;
  29.     LONG             Height,
  30.                  Width;
  31.     struct Image        *Image;
  32.  
  33.     SZ_SizeSetup(Window -> WScreen,&UserFont,TRUE);
  34.  
  35.     if(IconBase = OpenLibrary("icon.library",0))
  36.         Icon = GetProgramIcon();
  37.     else
  38.         Icon = NULL;
  39.  
  40.     Offset = Window -> WScreen -> WBorTop + INTERHEIGHT;
  41.  
  42.     Height = Window -> WScreen -> WBorTop + INTERHEIGHT + NUM_STRINGS * (UserFontHeight + 1) + INTERHEIGHT + Window -> WScreen -> WBorBottom;
  43.  
  44.     if(!Ticks)
  45.         Height += SZ_Height(BUTTON_KIND,0,0) + INTERHEIGHT;
  46.  
  47.         /* Find the longest string. */
  48.  
  49.     for(i = MaxWidth = 0 ; i < NUM_STRINGS ; i++)
  50.     {
  51.         if((Length = SZ_TextWidth(LocaleString(MSG_TERMINFO_INFOTEXT1_TXT + i))) > MaxWidth)
  52.             MaxWidth = Length;
  53.     }
  54.  
  55.     if(Icon)
  56.     {
  57.         Image = Icon -> do_Gadget . GadgetRender;
  58.  
  59.         if(Image -> Height + INTERHEIGHT + Height > Window -> WScreen -> Height || (Image -> Depth != Window -> WScreen -> RastPort . BitMap -> Depth && !Config -> ScreenConfig -> UseWorkbench))
  60.         {
  61.             FreeDiskObject(Icon);
  62.  
  63.             Icon = NULL;
  64.         }
  65.         else
  66.         {
  67.             if(Image -> Width > MaxWidth)
  68.                 MaxWidth = Image -> Width;
  69.  
  70.             Offset += Image -> Height + INTERHEIGHT;
  71.  
  72.             Height += Image -> Height + INTERHEIGHT;
  73.         }
  74.     }
  75.  
  76.     Width = Window -> WScreen -> WBorLeft + INTERWIDTH + MaxWidth + INTERWIDTH + Window -> WScreen -> WBorRight;
  77.  
  78.         /* Open the window. */
  79.  
  80.     if(InfoWindow = OpenWindowTags(NULL,
  81.         WA_Left,        GetScreenLeft(Window) + ((Width < GetScreenWidth(Window)) ? (GetScreenWidth(Window) - Width) / 2 : 0),
  82.         WA_Top,            GetScreenTop(Window) + ((Height < GetScreenHeight(Window)) ? (GetScreenHeight(Window) - Height) / 2 : 0),
  83.         WA_Width,        Width,
  84.         WA_Height,        Height,
  85.         WA_IDCMP,        IDCMP_RAWKEY | IDCMP_VANILLAKEY | IDCMP_RAWKEY | IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS | IDCMP_INTUITICKS | IDCMP_INACTIVEWINDOW | BUTTONIDCMP,
  86.         WA_ReportMouse,        TRUE,
  87.         WA_Activate,        TRUE,
  88.         WA_RMBTrap,        TRUE,
  89.         WA_SmartRefresh,    TRUE,
  90.         WA_GimmeZeroZero,    TRUE,
  91.         WA_CustomScreen,    Window -> WScreen,
  92.     TAG_DONE))
  93.     {
  94.         struct Gadget        *GadgetList    = NULL,
  95.                     *Gadget        = NULL;
  96.  
  97.         if(!Ticks)
  98.         {
  99.             if(Gadget = CreateContext(&GadgetList))
  100.             {
  101.                 struct NewGadget NewGadget;
  102.  
  103.                 memset(&NewGadget,0,sizeof(struct NewGadget));
  104.  
  105.                 NewGadget . ng_Width        = SZ_Width(BUTTON_KIND,LocaleString(MSG_TERMINFO_CONTINUE_TXT),0,NULL);
  106.                 NewGadget . ng_Height        = SZ_Height(BUTTON_KIND,0,0);
  107.                 NewGadget . ng_GadgetText    = LocaleString(MSG_TERMINFO_CONTINUE_TXT);
  108.                 NewGadget . ng_TextAttr        = &UserFont;
  109.                 NewGadget . ng_VisualInfo    = VisualInfo;
  110.                 NewGadget . ng_GadgetID        = 0;
  111.                 NewGadget . ng_Flags        = NULL;
  112.                 NewGadget . ng_LeftEdge        = (InfoWindow -> Width - NewGadget . ng_Width) / 2;
  113.                 NewGadget . ng_TopEdge        = InfoWindow -> Height - (Window -> WScreen -> WBorBottom + INTERHEIGHT + NewGadget . ng_Height);
  114.  
  115.                 if(Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  116.                     GT_Underscore,    '_',
  117.                 TAG_DONE))
  118.                 {
  119.                     AddGList(InfoWindow,GadgetList,(UWORD)-1,(UWORD)-1,NULL);
  120.                     RefreshGList(GadgetList,InfoWindow,NULL,(UWORD)-1);
  121.                     GT_RefreshWindow(InfoWindow,NULL);
  122.                 }
  123.             }
  124.         }
  125.  
  126.         if(Gadget || Ticks)
  127.         {
  128.             struct RastPort        *IPort;
  129.             LONG             Left,Top;
  130.  
  131.             struct IntuiMessage    *Massage;
  132.             BYTE             Terminated = FALSE;
  133.  
  134.             BYTE             FgPen,BgPen;
  135.             LONG             TickCount = 0;
  136.             ULONG             SignalSet;
  137.  
  138.             UBYTE             TheKey,
  139.                         *Button;
  140.             WORD             Len;
  141.  
  142.             SetFont(InfoWindow -> RPort,UserTextFont);
  143.  
  144.             Button = LocaleString(MSG_TERMINFO_CONTINUE_TXT);
  145.  
  146.             while(*Button)
  147.             {
  148.                 if(*Button++ == '_')
  149.                 {
  150.                     TheKey = ToUpper(*Button);
  151.  
  152.                     break;
  153.                 }
  154.             }
  155.  
  156.                 /* Adapt the rendering pens accordingly. */
  157.  
  158.             FgPen = DrawInfo -> dri_Pens[SHINEPEN];
  159.             BgPen = DrawInfo -> dri_Pens[SHADOWPEN];
  160.  
  161.             if(UseMasking)
  162.             {
  163.                 if(FgPen == BgPen)
  164.                     BgPen = DrawInfo -> dri_Pens[BACKGROUNDPEN];
  165.             }
  166.  
  167.                 /* Just a shortcut. */
  168.  
  169.             IPort = InfoWindow -> RPort;
  170.  
  171.                 /* Set up rendering modes. */
  172.  
  173.             SetDrMd(IPort,JAM1);
  174.  
  175.                 /* Draw the icon if any. */
  176.  
  177.             if(Icon)
  178.                 DrawImage(IPort,Image,(InfoWindow -> Width - Image -> Width) / 2 - Image -> LeftEdge,Window -> WScreen -> WBorTop + INTERHEIGHT - Image -> TopEdge);
  179.  
  180.                 /* Determine first line. */
  181.  
  182.             Top = Offset + UserFontBase;
  183.  
  184.                 /* Walk down the text list. */
  185.  
  186.             for(i = 0 ; i < NUM_STRINGS ; i++)
  187.             {
  188.                     /* Can we print this line? */
  189.  
  190.                 if(Len = strlen(LocaleString(MSG_TERMINFO_INFOTEXT1_TXT + i)))
  191.                 {
  192.                     Length = SZ_TextWidth(LocaleString(MSG_TERMINFO_INFOTEXT1_TXT + i));
  193.  
  194.                         /* Centre it. */
  195.  
  196.                     Left = (InfoWindow -> GZZWidth - Length) / 2;
  197.  
  198.                         /* Draw the shadow. */
  199.  
  200.                     if(FgPen != BgPen)
  201.                     {
  202.                         SetAPen(IPort,BgPen);
  203.                         Move(IPort,Left + 1,Top + 1);
  204.                         Text(IPort,LocaleString(MSG_TERMINFO_INFOTEXT1_TXT + i),Len);
  205.                     }
  206.  
  207.                         /* Draw the bright part. */
  208.  
  209.                     SetAPen(IPort,FgPen);
  210.                     Move(IPort,Left,Top);
  211.                     Text(IPort,LocaleString(MSG_TERMINFO_INFOTEXT1_TXT + i),Len);
  212.                 }
  213.  
  214.                     /* Jump to next line. */
  215.  
  216.                 Top += UserFontHeight + 1;
  217.             }
  218.  
  219.                 /* Ignore any previously received input. */
  220.  
  221.             while(Massage = (struct IntuiMessage *)GetMsg(InfoWindow -> UserPort))
  222.                 ReplyMsg(Massage);
  223.  
  224.             if(Ticks)
  225.                 Say(LocaleString(MSG_TERMINFO_WELCOME_TO_TERM_TXT));
  226.  
  227.             ActivateWindow(InfoWindow);
  228.  
  229.             SetSignal(0,SIG_BREAK);
  230.  
  231.                 /* Wait for mouse/key event. */
  232.  
  233.             while(!Terminated)
  234.             {
  235.                 SignalSet = Wait(SIG_REXX | PORTMASK(InfoWindow -> UserPort) | SIG_BREAK);
  236.  
  237.                 if(SignalSet & SIG_BREAK)
  238.                     break;
  239.  
  240.                 if(Ticks)
  241.                 {
  242.                     if(SignalSet & SIG_REXX)
  243.                     {
  244.                         GotRexxMessage    = TRUE;
  245.                         Terminated    = TRUE;
  246.                     }
  247.                 }
  248.  
  249.                 while(Massage = (struct IntuiMessage *)GetMsg(InfoWindow -> UserPort))
  250.                 {
  251.                     if(Ticks)
  252.                     {
  253.                         if(Massage -> Class == IDCMP_INTUITICKS)
  254.                         {
  255.                             if(TickCount++ == 50)
  256.                                 Terminated = TRUE;
  257.                         }
  258.                         else
  259.                             Terminated = TRUE;
  260.                     }
  261.                     else
  262.                     {
  263.                         if((Massage -> Class == IDCMP_VANILLAKEY && ToUpper(Massage -> Code) == TheKey) || Massage -> Class == IDCMP_GADGETUP)
  264.                             Terminated = TRUE;
  265.  
  266.                         if(Massage -> Class == IDCMP_RAWKEY && Massage -> Code == HELP_CODE)
  267.                             GuideDisplay(CONTEXT_MAIN);
  268.                     }
  269.  
  270.                     ReplyMsg(Massage);
  271.                 }
  272.             }
  273.  
  274.             if(Gadget)
  275.                 RemoveGList(InfoWindow,GadgetList,(UWORD)-1);
  276.         }
  277.  
  278.         FreeGadgets(GadgetList);
  279.  
  280.             /* Close the window and exit. */
  281.  
  282.         CloseWindow(InfoWindow);
  283.     }
  284.  
  285.     if(Icon)
  286.         FreeDiskObject(Icon);
  287.  
  288.     if(IconBase)
  289.     {
  290.         CloseLibrary(IconBase);
  291.  
  292.         IconBase = NULL;
  293.     }
  294.  
  295.     return(GotRexxMessage);
  296. }
  297.