home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 357.lha / intuisup_v1.15 / examples / mask / test.c < prev    next >
C/C++ Source or Header  |  1990-03-10  |  8KB  |  193 lines

  1. #include <intuition/intuisup.h>
  2.  
  3. #define TEXT_AREA1   0     /* these area the gadgetIds for the text areas  */
  4. #define TEXT_AREA2   1
  5. #define TEXT_AREA3   2
  6. #define TEXT_AREA4   3
  7. #define TEXT_AREA5   4
  8.  
  9. #define AREAS_NUM    5     /* total number of areas                        */
  10. #define FONTS_NUM    3     /* total number of fonts                        */
  11.  
  12. extern USHORT CommentsData[];
  13. struct Image  CommentsImage = { 0,0, 167,146, 2, CommentsData, 0x1,0x0, NULL };
  14. struct Box    box = { NULL, 182,15, 254,19, 0,1,0,2, "", BOX_SHADING };
  15.  
  16. struct Library *IntuitionBase, *GfxBase, *DiskfontBase;
  17.  
  18. #ifdef ISUP_RUNTIME
  19. struct   Library  *iSupBase;
  20. #else
  21. struct   Device   *ConsoleDevice;
  22. struct   IOStdReq  ConsoleMsg;
  23. #endif
  24.  
  25. struct   TextAttr Attribute[FONTS_NUM];
  26. struct   TextFont *Font[FONTS_NUM];
  27. struct   TextArea *textarea[AREAS_NUM];
  28. struct   Window   *window;
  29.  
  30.  
  31. BOOL
  32. LoadFonts()
  33. {
  34.    extern struct   TextFont *OpenFont(), *OpenDiskFont();
  35.  
  36.    USHORT   i;
  37.  
  38.    /* Just change these attributes to get new fonts in the text areas,  */
  39.    /* they will adapt to any font (as long as it's left->right one)     */
  40.    Attribute[0].ta_Name  = "courier.font";
  41.    Attribute[0].ta_YSize = 15;
  42.    Attribute[1].ta_Name  = "courier.font";
  43.    Attribute[1].ta_YSize = 13;
  44.    Attribute[2].ta_Name  = "courier.font";
  45.    Attribute[2].ta_YSize = 11;
  46.  
  47.    for(i=0; i<FONTS_NUM; i++)
  48.       {
  49.       if (  !(Font[i]=OpenFont(&Attribute[i]))
  50.          || (Font[i]->tf_YSize!=Attribute[i].ta_YSize) )
  51.          {
  52.          if (!(Font[i]=OpenDiskFont(&Attribute[i])))
  53.             {
  54.             DisplayBeep(NULL);
  55.             return(FALSE);
  56.             }
  57.          }
  58.       }
  59.    return(TRUE);
  60. }
  61.  
  62. VOID main(argc, argv)
  63. LONG argc;
  64. char **argv;
  65. {
  66.    extern struct IntuiMessage *GetMsg();
  67.    extern struct Window       *OpenStdWindow();
  68.  
  69.    UBYTE    rc = 0;
  70.    LONG     class;
  71.    USHORT   id, mouse_x, mouse_y, area;
  72.    APTR     address;
  73.    struct   IntuiMessage *message;
  74.  
  75.    if (  !(GfxBase       = (struct Library *)OpenLibrary("graphics.library", 0))
  76.       || !(IntuitionBase = (struct Library *)OpenLibrary("intuition.library", 0))
  77.       || !(DiskfontBase  = (struct Library *)OpenLibrary("diskfont.library", 0))
  78. #ifdef ISUP_RUNTIME
  79.       || !(iSupBase      = (struct Library *)OpenLibrary("isup.library", 0))
  80. #else
  81.       || !(!OpenDevice("console.device", -1, &ConsoleMsg, 0) && (ConsoleDevice=ConsoleMsg.io_Device))
  82. #endif
  83.       ) goto MAIN_DONE;
  84.  
  85.    if (!LoadFonts()) { rc = 20; goto MAIN_DONE; }
  86.    if (!(window=OpenStdWindow("Mask editing with iSup Text Areas", 0x1B, 10,20, 450,167, NULL)))
  87.       { rc = 30; goto MAIN_DONE; }
  88.    ModifyIDCMP(window,  CLOSEWINDOW | GADGETDOWN | NEWSIZE);
  89.  
  90.    /* Prepare the windows for text areas. Set the colors (already done) */
  91.    /* and the fonts. Note that we leave a little room around the text   */
  92.    /* areas: this is safer in case some character have fancy kerning -  */
  93.    /* for instance 'u' as -1 in Times 18 and will come out of the area  */
  94.    /* by one pixel towards the left if it appears first on a line.      */
  95.    SetFont(window->RPort, Font[0]);
  96.    textarea[0]=OpenTextArea(window, 186,17, 246,16, TEXT_AREA1, 1, TA_CENTER_JUSTIFY);
  97.    DrawBox(window->RPort, &box, 0,0);
  98.  
  99.    SetFont(window->RPort, Font[1]);
  100.    textarea[1]=OpenTextArea(window, 184,40, 253,14, TEXT_AREA2,  1, TA_ARYTHMETIC);
  101.    textarea[2]=OpenTextArea(window, 184,60, 253,28, TEXT_AREA3,  2, 0);
  102.  
  103.    SetFont(window->RPort, Font[2]);
  104.    textarea[3]=OpenTextArea(window, 184,94, 253,24, TEXT_AREA4,  3, TA_WORD_MODE);
  105.    textarea[4]=OpenTextArea(window, 184,124,253,36, TEXT_AREA5, -1, TA_WORD_MODE);
  106.  
  107.    for(area=0; area<AREAS_NUM; area++)
  108.       if (!textarea[area]) { rc = 50+area; goto MAIN_DONE; }
  109.  
  110.    /* Link the areas together. This enables the user to move from one   */
  111.    /* area to another with the cursor keys when he reaches an end.      */
  112.    LinkTextArea(textarea[0], NULL, textarea[1]);
  113.    LinkTextArea(textarea[AREAS_NUM-1], textarea[AREAS_NUM-2], NULL);
  114.    for(area=1; area<AREAS_NUM-1; area++)
  115.       LinkTextArea(textarea[area], textarea[area-1], textarea[area+1]);
  116.  
  117.    /* Place some text in the text areas. You should ALWAYS place some   */
  118.    /* text in a text area. They are returned with 0 acitves lines, and  */
  119.    /* must have at least one line to be usable. If no text is wanted    */
  120.    /* upon startup, you MUST use the following:                         */
  121.    /*    AddTextAreaLine(myarea, -1, "", LN_PARAGRAPH_BEGIN);           */
  122.    /* We also specify here which areas have a limited number of lines,  */
  123.    /* the default upon opening being unlimited lines.                   */
  124.    AddTextAreaLine(textarea[0], -1, "Gauthier Groult", LN_PARAGRAPH_BEGIN);
  125.    AddTextAreaLine(textarea[1], -1, "(1) 47 89 09 54", LN_PARAGRAPH_BEGIN);
  126.    AddTextAreaLine(textarea[2], -1, "groult@germinal.ibp.fr", LN_PARAGRAPH_BEGIN);
  127.    AddTextAreaLine(textarea[2], -1, "groult@cbmfra", LN_PARAGRAPH_BEGIN);
  128.    AddTextAreaLine(textarea[3], -1, "33, Blvd Saint Denis", LN_PARAGRAPH_BEGIN);
  129.    AddTextAreaLine(textarea[3], -1, "92400 Courbevoie", LN_PARAGRAPH_BEGIN);
  130.    AddTextAreaLine(textarea[3], -1, "France - Europe", LN_PARAGRAPH_BEGIN);
  131.    AddTextAreaLine(textarea[4], -1, "Born on March 11, 1966.", LN_PARAGRAPH_BEGIN);
  132.    AddTextAreaLine(textarea[4], -1, "Enjoys windsurfing, surfing, snowboarding, skiing & speedsailing.", LN_PARAGRAPH_BEGIN);
  133.    AddTextAreaLine(textarea[4], -1, "Plays the guitar, pronounced blues influence.", LN_PARAGRAPH_BEGIN);
  134.    AddTextAreaLine(textarea[4], -1, "Likes blond, tall, well balanced girls.", LN_PARAGRAPH_BEGIN);
  135.    AddTextAreaLine(textarea[4], -1, "Speaks and writes French, English and Italian. Basic knowledge of Russian.", LN_PARAGRAPH_BEGIN);
  136.  
  137.    for(area=0; area<AREAS_NUM; area++) RefreshTextArea(textarea[area]);
  138.  
  139.    DrawImage(window->RPort, &CommentsImage, 10, 15);
  140.  
  141.    /* Force editing into the first area with some fake mouse coords     */
  142.    /* that will posiion the cursor at the end of the text               */
  143.    /* We come back from here whenever the user does anything else then  */
  144.    /* editing (clicking somewhere outside the area, pulling a menu or   */
  145.    /* anything else), and the message that caused the exit will be left */
  146.    /* on our port transparently. How about it?                          */
  147.    EditTextArea(textarea[0], 1000, 1000);
  148.  
  149.    FOREVER
  150.       {
  151.       WaitPort(window->UserPort);
  152.  
  153.       while (message = GetMsg(window->UserPort))
  154.             {
  155.             class   = message->Class;
  156.             address = message->IAddress;
  157.             mouse_x = message->MouseX;
  158.             mouse_y = message->MouseY;
  159.             ReplyMsg(message);
  160.  
  161.             switch(class)
  162.                   {
  163.                   case CLOSEWINDOW: goto MAIN_DONE; break;
  164.  
  165.                   case GADGETDOWN:
  166.                   /* here we go to the actual editing. As you can   */
  167.                   /* see, its not too complicated!                  */
  168.                   id = ((struct Gadget *)address)->GadgetID;
  169.                   if (id >= TEXT_AREA1 && id <=TEXT_AREA5)
  170.                      EditTextArea(textarea[id], mouse_x, mouse_y);
  171.                   break;
  172.                   }
  173.             }
  174.       }
  175.  
  176.    MAIN_DONE:
  177.       for(area=0; area<AREAS_NUM; area++)
  178.          if (textarea[area])   CloseTextArea(textarea[area]);
  179.  
  180.       if (window)       CloseStdWindow(window);
  181.  
  182. #ifdef ISUP_RUNTIME
  183.       if (iSupBase)      CloseLibrary(iSupBase);
  184. #else
  185.       if (ConsoleDevice) CloseDevice(&ConsoleMsg);
  186. #endif
  187.       if (DiskfontBase)  CloseLibrary(DiskfontBase);
  188.       if (IntuitionBase) CloseLibrary(IntuitionBase);
  189.       if (GfxBase)       CloseLibrary(GfxBase);
  190.       exit(rc);
  191. }
  192.  
  193.