home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #4 / amigaacscoverdisc1998-041998.iso / utilities / shareware / dev / vbcc / machines / amiga68k / vbrowse / vbrowse.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-12-30  |  9.6 KB  |  260 lines

  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <graphics/gfxbase.h>
  5. #include <intuition/intuition.h>
  6. #include <libraries/gadtools.h>
  7. #include <clib/exec_protos.h>
  8. #include <clib/intuition_protos.h>
  9. #include <clib/graphics_protos.h>
  10. #include <clib/gadtools_protos.h>
  11. #include <clib/alib_protos.h>
  12. #include <exec/nodes.h>
  13. #include <exec/lists.h>
  14.  
  15. #include "vbrowse.h"
  16.  
  17. struct Library *GadToolsBase;
  18. struct IntuitionBase *IntuitionBase;
  19. struct GfxBase *GfxBase;
  20. struct Screen *Screen;
  21.  
  22. struct List list;
  23.  
  24. struct MsgPort *myport;
  25.  
  26. #define BREITE 600
  27. #define HOEHE  100
  28. #define LINKS  10
  29. #define OBEN   10
  30.  
  31. struct NewWindow nw={LINKS,OBEN,BREITE,HOEHE,     /* left,top,width,height    */
  32.                      0,1,               /* pens                     */
  33.                      IDCMP_NEWSIZE|IDCMP_REFRESHWINDOW|LISTVIEWIDCMP|
  34.                      GADGETUP|GADGETDOWN|CLOSEWINDOW,   /*  IDCMP   */
  35.                      /* flags   */
  36.                      WFLG_SIZEGADGET|WFLG_DRAGBAR|WFLG_DEPTHGADGET|
  37.                      WFLG_CLOSEGADGET|WFLG_SIMPLE_REFRESH|WFLG_ACTIVATE,
  38.                      0,0,               /* FirstGadget,CheckMark    */
  39.                      (UBYTE*)"vbrowse", /* title                    */
  40.                      0,0,               /* screen,SuperBitmap       */
  41.                      70,70,32767,32767,     /* MinWidth, etc.           */
  42.                      WBENCHSCREEN       /* type                     */
  43. };
  44.  
  45. struct NewGadget listview={70,30,300,320,      /* left,top,width,height    */
  46.                      0,
  47.                      0,                 /* font                     */
  48.                      2,                 /* GadgetID                 */
  49.                      0,0,0              /* flags,VInfo,UserData     */
  50. };
  51.  
  52. struct EasyStruct easy={sizeof(struct EasyStruct),0,"vbrowse",0,"OK"};
  53.  
  54.  
  55. struct Window *Window;
  56. struct Gadget *Gadget,*GadgetList;
  57. struct VisualInfo *VisualInfo;
  58.  
  59. struct TextAttr ta;
  60.  
  61. struct IntuiMessage *IMsg;
  62. struct Message *msg;
  63.  
  64. int fhoehe,scrollwidth,count;
  65.  
  66. char *call_editor="ged line %d %s",*call_error="showerr %d";
  67.  
  68. void closethings(void)
  69. {
  70.     if(myport) DeletePort(myport);
  71.     if(Screen) UnlockPubScreen(0,Screen);
  72.     if(Window) CloseWindow(Window);
  73.     if(GadgetList) FreeGadgets(GadgetList);
  74.     if(VisualInfo) FreeVisualInfo(VisualInfo);
  75.     if(GadToolsBase) CloseLibrary(GadToolsBase);
  76.     if(IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
  77.     if(GfxBase) CloseLibrary((struct Library *)GfxBase);
  78.     exit(0);
  79. }
  80.  
  81. void error(char *text)
  82. {
  83.     easy.es_TextFormat=text;
  84.     EasyRequest(0,&easy,0);
  85. }
  86. void openthings(void)
  87. {
  88.     struct TextFont *defaultf;
  89.  
  90.     if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary((UBYTE*)"intuition.library",36)))
  91.         closethings();
  92.     if(!(GadToolsBase=OpenLibrary((UBYTE*)"gadtools.library",39)))
  93.         closethings();
  94.     if(!(GfxBase=(struct GfxBase *)OpenLibrary((UBYTE*)"graphics.library",0)))
  95.         closethings();
  96.     Forbid();
  97.     if(FindPort(PORTNAME)){Permit();error("vbrowse already running");exit(EXIT_SUCCESS);}
  98.     Permit();
  99.     if(!(myport=CreatePort(PORTNAME,0)))
  100.         {error("Could get no port");closethings();}
  101.     defaultf=GfxBase->DefaultFont;
  102.     ta.ta_Name=defaultf->tf_Message.mn_Node.ln_Name;
  103.     ta.ta_YSize=defaultf->tf_YSize;
  104.     ta.ta_Style=defaultf->tf_Style;
  105.     ta.ta_Flags=defaultf->tf_Flags;
  106.     if(!(Screen=LockPubScreen(0)))  /*  Workbench   */
  107.         {error("Could not lock screen");closethings();}
  108.     fhoehe=Screen->Font->ta_YSize;
  109.     scrollwidth=fhoehe>12?fhoehe+4:16;
  110.     listview.ng_LeftEdge=10;
  111.     listview.ng_TopEdge=10+fhoehe;
  112.     listview.ng_Width=nw.Width-36;
  113.     listview.ng_Height=nw.Height-20-fhoehe;
  114.     NewList(&list);
  115.  
  116.     if(!(VisualInfo=GetVisualInfo(Screen,TAG_END)))
  117.         {error("No visual info");closethings();}
  118.     if(!(Gadget=CreateContext(&GadgetList)))
  119.         {error("No context");closethings();}
  120.     /*  hier werden die Gadgets initialisiert   */
  121.     listview.ng_VisualInfo=VisualInfo;    /*  VisualInfo und Font eintragen   */
  122.     listview.ng_TextAttr=&ta;
  123.     Gadget=CreateGadget(LISTVIEW_KIND,Gadget,&listview,GTLV_Labels,&list,
  124.                         GTLV_ScrollWidth,scrollwidth,GTLV_ShowSelected,0,TAG_END);
  125.     if(!Gadget) {error("No gadget");closethings();}
  126.  
  127.     nw.FirstGadget=GadgetList;
  128.     if(!(Window=OpenWindow(&nw)))
  129.         {error("No window");closethings();}
  130.     GT_RefreshWindow(Window,0);
  131. }
  132.  
  133. int main(int argc,char **argv)
  134. {
  135.     long lastn=0,currentn;int i;char *mem;
  136.     ULONG lasts=0,lastm=0,currents=0,currentm=0;
  137.     for(i=1;i<argc;i++){
  138.         if(!strcmp(argv[i],"editor")&&i<argc) call_editor=argv[++i];
  139.         if(!strcmp(argv[i],"error")&&i<argc) call_error=argv[++i];
  140.         if(!strcmp(argv[i],"width")&&i<argc) nw.Width=atoi(argv[++i]);
  141.         if(!strcmp(argv[i],"height")&&i<argc) nw.Height=atoi(argv[++i]);
  142.         if(!strcmp(argv[i],"left")&&i<argc) nw.LeftEdge=atoi(argv[++i]);
  143.         if(!strcmp(argv[i],"top")&&i<argc) nw.TopEdge=atoi(argv[++i]);
  144.     }
  145.     openthings();
  146.     while(1){
  147.         Wait((1<<Window->UserPort->mp_SigBit)|(1<<myport->mp_SigBit));
  148.  
  149.         while(IMsg=GT_GetIMsg(Window->UserPort)){
  150.             switch(IMsg->Class){
  151.             case IDCMP_CLOSEWINDOW:
  152.                 GT_ReplyIMsg(IMsg);
  153.                 closethings();
  154.  
  155.             case IDCMP_REFRESHWINDOW:
  156.  
  157.                 GT_BeginRefresh(Window);
  158.                 GT_EndRefresh(Window,TRUE);
  159.                 break;
  160.  
  161.             case IDCMP_GADGETUP:
  162.                 CurrentTime(¤ts,¤tm);
  163.                 GT_GetGadgetAttrs(Gadget,Window,0,GTLV_Selected,¤tn,TAG_END);
  164.                 if(currentn==lastn&&DoubleClick(lasts,lastm,currents,currentm)){
  165.                     struct Node *p;int errorn,line;char file[256];
  166.                     *file='\"';
  167.                     p=list.lh_Head;
  168.                     lastn=currentn;
  169.                     while(lastn){p=p->ln_Succ;lastn--;}
  170.                     if(sscanf(p->ln_Name,"error %d",&errorn)==1||
  171.                        sscanf(p->ln_Name,"warning %d",&errorn)==1){
  172.  
  173. /*                        printf("vbr:errorn=%d\n",errorn);*/
  174.                         mem=malloc(strlen(call_error)+100);
  175.                         sprintf(mem,call_error,errorn);
  176.                         system(mem);
  177.                         free(mem);
  178.                     }else{
  179.                         if(*p->ln_Name=='>'&&p->ln_Succ){
  180.                             p=p->ln_Succ;
  181.                             if(sscanf(p->ln_Name,"error %d in line %d of \" %[^\"]",&errorn,&line,file+1)==3||
  182.                                sscanf(p->ln_Name,"warning %d in line %d of \" %[^\"]",&errorn,&line,file+1)==3){
  183.  
  184.                                 strcat(file,"\"");
  185. /*                                printf("vbr:file=%s, line=%d\n",file,line);*/
  186.                                 mem=malloc(strlen(call_error)+strlen(file)+100);
  187.                                 sprintf(mem,call_editor,line,file);
  188.                                 system(mem);
  189.                                 free(mem);
  190.                             }
  191.                         }else error("You have to click on an error/warning message");
  192.                     }
  193.                 }
  194.                 lastn=currentn;lasts=currents;lastm=currentm;
  195.                 break;
  196.  
  197.             case IDCMP_GADGETDOWN:
  198. /*                printf("GadgetDown (%d)\n",((struct Gadget *)IMsg->IAddress)->GadgetID);*/
  199.                 break;
  200.  
  201.             case IDCMP_NEWSIZE:
  202.                 {
  203.                 int top,selected;
  204.                 GT_GetGadgetAttrs(Gadget,Window,0,GTLV_Top,&top,GTLV_Selected,&selected,TAG_END);
  205.                 RemoveGList(Window,GadgetList,-1);
  206.                 if(GadgetList) FreeGadgets(GadgetList);
  207.                 if(VisualInfo) FreeVisualInfo(VisualInfo);
  208.                 GadgetList=0;
  209.                 VisualInfo=0;
  210.                 listview.ng_LeftEdge=10;
  211.                 listview.ng_TopEdge=10+fhoehe;
  212.                 listview.ng_Width=Window->Width-36;
  213.                 listview.ng_Height=Window->Height-20-fhoehe;
  214.                 if(!(VisualInfo=GetVisualInfo(Screen,TAG_END)))
  215.                     closethings();
  216.                 if(!(Gadget=CreateContext(&GadgetList)))
  217.                     closethings();
  218.                 /*  hier werden die Gadgets initialisiert   */
  219.                 listview.ng_VisualInfo=VisualInfo;    /*  VisualInfo und Font eintragen   */
  220.                 listview.ng_TextAttr=&ta;
  221.                 Gadget=CreateGadget(LISTVIEW_KIND,Gadget,&listview,GTLV_Labels,&list,
  222.                                     GTLV_ScrollWidth,scrollwidth,GTLV_ShowSelected,0,
  223.                                     GTLV_Selected,selected,GTLV_Top,top,TAG_END);
  224.                     if(!Gadget) closethings();
  225.                 AddGList(Window,GadgetList,100,-1,0);
  226.                 SetRast(Window->RPort,0);
  227.                 RefreshGList(GadgetList,Window,0,-1);
  228.  
  229.                 GT_RefreshWindow(Window,0);
  230.  
  231.                 RefreshWindowFrame(Window);
  232.  
  233. /*                puts("NEWSIZE");*/
  234.                 }
  235.                 break;
  236.             }
  237.             GT_ReplyIMsg(IMsg);
  238.         }
  239.         while(msg=GetMsg(myport)){
  240.             struct Node *p;int l;char *text;
  241.             text=((struct mymsg *)msg)->text;count++;
  242. /*            printf("Message received: %s\n",text);*/
  243.             l=strlen(text);
  244.             p=malloc(sizeof(struct Node));
  245.             if(!p) closethings();
  246.             p->ln_Name=malloc(l+1);
  247.             if(!p->ln_Name) closethings();
  248.             strcpy(p->ln_Name,text);
  249.             p->ln_Type=0;
  250.             p->ln_Pri=0;
  251. /*                printf("adding %s\n",p->ln_Name);*/
  252.             GT_SetGadgetAttrs(Gadget,Window,0,GTLV_Labels,~0,TAG_END);
  253.             AddTail(&list,p);
  254.             GT_SetGadgetAttrs(Gadget,Window,0,GTLV_Labels,&list,GTLV_Top,count,TAG_END);
  255.             ReplyMsg(msg);
  256.         }
  257.  
  258.     }
  259. }
  260.