home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 20 / AACD20.BIN / AACD / Programming / AmiSlate-Source / AmiSource-c / StringRequest.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-08-04  |  5.5 KB  |  196 lines

  1. #include <stdio.h>
  2. #include <intuition/intuition.h>
  3. #include <intuition/intuitionbase.h>
  4. #include <intuition/screens.h>
  5. #include <intuition/gadgetclass.h>
  6. #include <libraries/gadtools.h>
  7. #include <exec/types.h>
  8. #include <exec/libraries.h>
  9. #include <libraries/dos.h>            /* contains RETURN_OK, RETURN_WARN #def's */
  10. #include <clib/exec_protos.h>
  11. #include <clib/intuition_protos.h>
  12. #include <clib/gadtools_protos.h>
  13. #include <string.h>
  14. #include <errno.h>
  15. #include <libraries/gadtools.h>
  16.  
  17. extern char * sScreenTitle;
  18.  
  19. extern struct Library *GadToolsBase;
  20. extern struct Screen *Scr;
  21. extern struct Window *DrawWindow;
  22. extern int screentype;
  23. extern __chip UWORD waitPointer[];
  24.  
  25. #include "amislate.h"
  26.  
  27. /* Lets the user put a string into szBuffer.  Returns TRUE if the user entered
  28.    a string, otherwise FALSE */
  29. BOOL GetUserString (char *szBuffer, char *szTitle, char *szGadText, int nLength)
  30. {
  31.     ULONG winsig, signals;
  32.     int fwindowwidth = 2*Scr->Width/3, fwindowheight = 35 + Scr->RastPort.TxHeight;
  33.     int fwindowleft = (DrawWindow->LeftEdge + (DrawWindow->Width/2) - (fwindowwidth/2));
  34.     int fwindowtop  = (DrawWindow->TopEdge  + (DrawWindow->Height/2)- (fwindowheight/2));
  35.     struct NewGadget stringGad;
  36.     struct IntuiMessage *imsg;
  37.     struct Gadget *newgad = NULL;
  38.     struct Gadget *Stringgadlist = NULL;
  39.     void *Stringvi;
  40.     struct Window *Stringwindow;
  41.     BOOL done=FALSE, BRet = TRUE;
  42.     struct TextAttr topaz8 = {(STRPTR)"topaz.font", 8, 0x00, 0x00 };
  43.  
  44.     if (szTitle == NULL) szTitle = "String Requester Active";
  45.     if (szBuffer == NULL) return(FALSE);
  46.  
  47.     /* Allow strings starting with ASCII 1 to be treated as an empty string */
  48.     if (*szBuffer == '\1') *szBuffer = '\0';
  49.     if (*szTitle  == '\1') *szTitle  = '\0';
  50.     if (*szGadText== '\1') *szGadText= '\0';
  51.     
  52.     Stringvi = GetVisualInfo(Scr, TAG_END);
  53.     if (Stringvi == NULL) return(FALSE);
  54.  
  55.     if (fwindowleft < 0) fwindowleft = DrawWindow->LeftEdge;
  56.     if (fwindowheight < 0) fwindowtop = DrawWindow->TopEdge;
  57.  
  58.     newgad = CreateContext(&Stringgadlist);
  59.     if (newgad == 0)
  60.     {
  61.         MakeReq("Couldn't create String gad context!\n",NULL,"Dammit!");
  62.         return(FALSE);
  63.     }
  64.  
  65.     if (newgad == NULL) return(FALSE);
  66.  
  67.     stringGad.ng_TextAttr     = &topaz8;
  68.     stringGad.ng_VisualInfo  = Stringvi;
  69.     stringGad.ng_LeftEdge     = 5;
  70.     stringGad.ng_TopEdge        = 18 + Scr->RastPort.TxHeight;
  71.     stringGad.ng_Width     = (fwindowwidth-10);
  72.     stringGad.ng_Height     = 13;
  73.     stringGad.ng_GadgetText  = szGadText;
  74.     stringGad.ng_GadgetID     = 35;    
  75.     stringGad.ng_Flags     = PLACETEXT_ABOVE;
  76.  
  77.     newgad = CreateGadget(STRING_KIND, newgad, &stringGad, 
  78.                   GTST_String, szBuffer, 
  79.                   STRINGA_Justification, GACT_STRINGCENTER, 
  80.                   GA_Immediate, TRUE,
  81.                   TAG_END);  
  82.               
  83.      if (newgad == NULL) 
  84.     {
  85.         FreeGadgets(Stringgadlist);
  86.         FreeVisualInfo(Stringvi);
  87.         return(FALSE);
  88.     }
  89.     
  90.     if (GadToolsBase->lib_Version == 37)
  91.     {
  92.     /* Only do it the "illegal" way under v37.  GA_Immediate in the CreateGadget
  93.        line, above, won't work under v37 but will on later releases. */
  94.         newgad->Activation |= GACT_IMMEDIATE; 
  95.     }
  96.  
  97.     switch (screentype)
  98.     {
  99.         case USE_PUBLICSCREEN:
  100.             Stringwindow = OpenWindowTags(NULL,
  101.                 WA_Left,        fwindowleft,
  102.                 WA_Top,            fwindowtop,
  103.                 WA_Width,           fwindowwidth,
  104.                 WA_Height,        fwindowheight,
  105.                 WA_PubScreen,        Scr,
  106.                 WA_PubScreenFallBack,     TRUE,
  107.                 WA_IDCMP,        STRINGIDCMP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|IDCMP_ACTIVEWINDOW,
  108.                 WA_Flags,        WFLG_DRAGBAR|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
  109.                 WA_Gadgets,        Stringgadlist,
  110.                 WA_Title,           szTitle,
  111.                 WA_ScreenTitle,        sScreenTitle,
  112.                 TAG_DONE );
  113.         break;
  114.         case USE_CUSTOMSCREEN:
  115.             Stringwindow = OpenWindowTags(NULL,
  116.                 WA_Left,        fwindowleft,
  117.                 WA_Top,            fwindowtop,
  118.                 WA_Width,        fwindowwidth,
  119.                 WA_Height,        fwindowheight,
  120.                 WA_CustomScreen,     Scr,
  121.                 WA_IDCMP,        STRINGIDCMP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|IDCMP_ACTIVEWINDOW,
  122.                 WA_Flags,        WFLG_DRAGBAR|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
  123.                 WA_Gadgets,        Stringgadlist,
  124.                 WA_Title,             szTitle,
  125.                 WA_ScreenTitle,      sScreenTitle,
  126.                 WA_CustomScreen,     Scr,
  127.                 TAG_DONE );
  128.         break;
  129.         case USE_WORKBENCHSCREEN:
  130.             Stringwindow = OpenWindowTags(NULL,
  131.                 WA_Left,        fwindowleft,
  132.                 WA_Top,            fwindowtop,
  133.                 WA_Width,        fwindowwidth,
  134.                 WA_Height,        fwindowheight,
  135.                 WA_IDCMP,        STRINGIDCMP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|IDCMP_ACTIVEWINDOW,
  136.                 WA_Flags,        WFLG_DRAGBAR|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
  137.                 WA_Gadgets,        Stringgadlist,
  138.                 WA_Title,             szTitle,
  139.                 WA_ScreenTitle,      sScreenTitle,
  140.                 TAG_DONE );
  141.         break;
  142.     }
  143.  
  144.     if (Stringwindow == NULL) 
  145.     {
  146.         FreeVisualInfo(Stringvi);
  147.         return(FALSE);
  148.     }
  149.     GT_RefreshWindow(Stringwindow, NULL); 
  150.  
  151.     SetWindowTitle("AmiSlate window inactive--close daughter window to continue"); 
  152.     SetPointer(DrawWindow, waitPointer, 16, 16, -6, 0);
  153.  
  154.     winsig = 1 << Stringwindow->UserPort->mp_SigBit;
  155.  
  156.     while (done==FALSE)
  157.     {
  158.         signals = Wait(winsig);
  159.         if (signals&winsig)
  160.         {
  161.             while ((done==FALSE) && (imsg = GT_GetIMsg(Stringwindow->UserPort)))
  162.             {
  163.                 switch(imsg->Class)
  164.                 {            
  165.                 case IDCMP_ACTIVEWINDOW:
  166.                     ActivateGadget(newgad,Stringwindow,NULL);
  167.                     break;
  168.                         
  169.                 case IDCMP_GADGETUP:
  170.                     strncpy(szBuffer,((struct StringInfo*)newgad->SpecialInfo)->Buffer,nLength);
  171.                     done = TRUE;
  172.                     break;
  173.         
  174.                 case IDCMP_CLOSEWINDOW:
  175.                     done = TRUE;
  176.                     BRet = FALSE;
  177.                     break;
  178.                     
  179.                 case IDCMP_REFRESHWINDOW:
  180.                     GT_BeginRefresh(Stringwindow);
  181.                     GT_EndRefresh(Stringwindow, TRUE);
  182.                     break;
  183.                 }
  184.             GT_ReplyIMsg(imsg);
  185.             }
  186.         }
  187.     }
  188.     CloseWindow(Stringwindow);
  189.     FreeGadgets(Stringgadlist);
  190.     FreeVisualInfo(Stringvi); 
  191.     Stringwindow = NULL;
  192.     ClearPointer(DrawWindow);
  193.     SetWindowTitle("AmiSlate window ready.");
  194.     return(BRet);
  195. }
  196.