home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Misc / DC-POS24.LZX / pOS / pOS_RKRM.lzx / pOS_RKRM / pGadgets / FindGad.c < prev   
Encoding:
C/C++ Source or Header  |  1997-03-18  |  23.4 KB  |  791 lines

  1.  
  2. /*******************************************************************
  3.  $CRT 03 Jun 1996 : hb
  4.  
  5.  $AUT Holger Burkarth
  6.  $DAT >>FindGad.c<<   29 Jan 1997    13:33:08 - (C) ProDAD
  7. *******************************************************************/
  8.  
  9. //##ex mcpp:cppc -gs -o pos:pos/libs/FindGad.library p:pLib/LibCode.o p:/pOS_RKRM/pGadgets/FindGad.c -l pOSStub -l CPPList -l pOS
  10.  
  11. /***********************************************************
  12.   pOS programing example - Copyright (C) 1995-97 proDAD
  13.  
  14.   This code was written as an easy to understand example,
  15.   how to program pOS features. It is provided 'as-is',
  16.   without any express or implied warranty.
  17.  
  18.   Permission is hereby granted to use, copy and modify
  19.   this source code for any purpose, without fee, subject
  20.   to the following conditions:
  21.  
  22.     (1) This notice may not be removed or altered from any
  23.         source distribution.
  24.  
  25.     (2) Altered source versions must be plainly marked as
  26.         such, and must not be misrepresented as being
  27.         the original source code.
  28.  
  29.     (3) If only executable code is distributed, then the
  30.         accompanying documentation have to state that
  31.         "this software is based in part on examples of
  32.         the pOS developer packet".
  33.  
  34.     (4) Permission for use of this code is granted only
  35.         if the user accepts full responsibility for any
  36.         undesirable consequences. proDAD accept NO LIABILITY
  37.         for damages of any kind.
  38.  
  39.   ©proDAD
  40. ***********************************************************/
  41.  
  42. #define __COMPUTER_AMIGA 1
  43. #define NOMYDEBUG
  44.  
  45. #include "p:pExec/Library.h"
  46. #include "p:pExec/Resident.h"
  47. #include "p:pExec/Memory.h"
  48. #include "p:pExec/Sema.h"
  49. #include "p:pExec/Class.h"
  50. #include "p:pExec/Task.h"
  51. #include "p:pExec/Diagnos.h"
  52. #include "p:pExec/TstTags.h"
  53. #include "p:pDOS/Segment.h"
  54. #include "p:pDOS/DosSig.h"
  55. #include "p:pDOS/ScanDir.h"
  56. #include "p:pDOS/DosTags.h"
  57. #include "p:pGadget/Gadget.h"
  58. #include "p:pGadget/GadItem.h"
  59. #include "p:pScreen/DrawInfo.h"
  60. #include "p:pIntui/GClass.h"
  61. #include "p:pIntui/Tags.h"
  62. #include "p:pIntui/IObj.h"
  63. #include "p:pIntui/IntuMsg.h"
  64. #include "p:pIntui/EasyReq.h"
  65. #include "p:proto/pLibExt.h"
  66. #include "p:proto/pExec2.h"
  67. #include "p:proto/pDOS2.h"
  68. #include "p:proto/pIntui2.h"
  69. #include "p:proto/pUtil2.h"
  70. #include "p:proto/pList.h"
  71.  
  72.  
  73. #ifdef _____ME_____
  74.   #include "grund/inc_string.h"
  75.   #include "grund/inc_limits.h"
  76.   #include "grund/inc_stdio.h"
  77. #else
  78.  #ifdef __cplusplus
  79.  extern "C" {
  80.  #endif
  81.   #include <string.h>
  82.   #include <limits.h>
  83.   #include <stdio.h>
  84.  #ifdef __cplusplus
  85.  }
  86.  #endif
  87. #endif
  88.  
  89.  
  90. struct pOS_ExecBase* gb_ExecBase;
  91. struct pOS_ExecLibFunction* gb_ExecLib;
  92. struct pOS_DosBase     *gb_DosBase;
  93. struct pOS_IntuiDevice *gb_IntuiBase;
  94. struct pOS_UtilityBase *gb_UtilityBase;
  95.  
  96.  
  97. struct FindGadLib
  98. {
  99.   pOS_Library  fg_Lib;
  100.  
  101.   pOS_NClass  *fg_FindGadClass;
  102. };
  103.  
  104.  
  105. struct FindGadItem
  106. {
  107.   pOS_GadgetItem  fgt_GI;
  108.   UBYTE           fgt_Type;     /* enum pOS_FileInfoEntryType */
  109.   dossize_t       fgt_Size;
  110.  
  111.   CHAR            fgt_StrSize[10];
  112.   CHAR            fgt_Name[1];
  113. };
  114.  
  115.  
  116.  
  117.  
  118.  
  119. struct FindGadData
  120. {
  121.   pOS_List             fgd_List;
  122.   pOS_MemPool          fgd_Pool;
  123.   pOS_Semaphore        fgd_Sem;
  124.   pOS_Task            *fgd_ScanTask;
  125.   const pOS_DrawInfo  *fdg_DrawInfo;
  126.   pOS_Window          *fgd_Window;
  127.   pOS_List             fgd_PreList;
  128.   FindGadItem         *fgd_FirstAlterNode;
  129.   FindGadItem         *fgd_LastAlterNode;
  130.   UBYTE                fgd_RunMode;
  131.   UBYTE                fgd_NewNodes;
  132.   UBYTE                fgd_Ticks;
  133.   UBYTE Pad;
  134.  
  135.   ULONG fgd_SumFiles,fgd_SumDirs;
  136.  
  137.   pOS_Gadget *fgd_TxGad;
  138.   pOS_Gadget *fgd_LVGad;
  139.   pOS_Gadget *fgd_PatGad;
  140.   pOS_Gadget *fgd_PathGad;
  141.   pOS_Gadget *fgd_OkGad;
  142.   pOS_Gadget *fgd_AbbGad;
  143.   pOS_Gadget *fgd_AllGad;
  144.   pOS_Gadget *fgd_DirGad;
  145.   pOS_Gadget *fgd_FileGad;
  146.  
  147.   const CHAR *fgd_ActPath;
  148.         CHAR  fgd_TxBuffer[128];
  149. };
  150.  
  151.  
  152.  
  153.  
  154.  
  155. extern ULONG *FuncTable[];
  156. const CHAR LibraryName[]  ="findgad.library";
  157. const CHAR LibraryIDName[]="findgad.library 1.0 ("__DATE2__")";
  158.  
  159. const pOS_TagItem LibraryDescribe[]=
  160. {
  161.   EXTSTTAG_MainOSID, pOS_MAINOSID,
  162.   TAG_END
  163. };
  164.  
  165.  
  166. BOOL pLibMain(_R_LB pOS_ExecBase*,_R_A0 FindGadLib*);
  167. VOID PrintErr(const CHAR* bodyText,...);
  168.  
  169.  
  170. pOS_ResidentLibInit InitTable=
  171. {
  172.   sizeof(FindGadLib),
  173.   FuncTable,
  174.   NULL,
  175.   (BOOL(*)(_R_LB pOS_ExecBase*,_R_A0 pOS_Library*))pLibMain
  176. };
  177.  
  178.  
  179. /*----------------------------------
  180.  Wird in dieser Library nicht benötigt.
  181. -----------------------------------*/
  182. BOOL Open_func(_R_LB FindGadLib*)      { return(1); }
  183. VOID Close_func(_R_LB FindGadLib*)     {}
  184. ULONG Reserved_func(_R_LB FindGadLib*) { return(0); }
  185.  
  186.  
  187.  
  188. /*----------------------------------
  189. -----------------------------------*/
  190. pOS_SegmentLst* Expunge_func(_R_LB FindGadLib* lib)
  191. {
  192.   lib->fg_Lib.lib_Flags |= LIBF_DELEXP;     /* verzögertes Schließen aktivieren */
  193.   if(lib->fg_Lib.lib_OpenCnt==0) {          /* alle Verwender aben pOS_CloseLibrary() aufgerufen */
  194.     pOS_SegmentLst* Seg=lib->fg_Lib.lib_Segm;
  195.  
  196. /*\
  197. *** LibNode aushängen, ACHTUNG: Expunge wird im FORBID aufgerufen
  198. \*/
  199.     pOS_ListRemove(&lib->fg_Lib.lib_Node);
  200.  
  201.     if(lib->fg_FindGadClass)
  202.         pOS_DeleteClass(lib->fg_FindGadClass);
  203.  
  204.     _pOS_FreeLibraryMem2(&lib->fg_Lib); /* Lib-Memory freigeben */
  205.  
  206.     pOS_CloseLibrary((pOS_Library*)gb_IntuiBase); /* alle Libs schließen */
  207.     pOS_CloseLibrary((pOS_Library*)gb_DosBase);
  208.     pOS_CloseLibrary((pOS_Library*)gb_UtilityBase);
  209.     return(Seg);
  210.   }
  211.   return(0);
  212. }
  213.  
  214.  
  215. ULONG *FuncTable[]=
  216. {
  217.  (ULONG*)Open_func,
  218.  (ULONG*)Close_func,
  219.  (ULONG*)Expunge_func,
  220. // ------------
  221.  (ULONG*)Reserved_func,
  222.  (ULONG*)Reserved_func,
  223.  (ULONG*)Reserved_func,
  224.  (ULONG*)Reserved_func,
  225.  (ULONG*)Reserved_func,
  226.  (ULONG*)Reserved_func,
  227.  (ULONG*)Reserved_func,
  228.  (ULONG*)Reserved_func,
  229. // ------------
  230.  
  231.  (ULONG*)ULONG_MAX
  232. };
  233.  
  234.  
  235.  
  236. /*******************************************************************************/
  237.  
  238.  
  239. /*----------------------------------
  240. Hintergrund-Scan-Process
  241. -----------------------------------*/
  242. VOID ScanTaskFunc()
  243. {
  244.   pOS_Task *ThisTask=pOS_FindTask(NULL);
  245.   FindGadData* Obj=(FindGadData*)ThisTask->tc_UserData[0];
  246.   FindGadItem *Item;
  247.   BOOL Flg;
  248.   BOOL OpsALL,OpsDIR,OpsFILE;
  249.   const CHAR *Path,*Patt;
  250.  
  251.   struct SumAP {
  252.     pOS_AnchorPath AP;
  253.     CHAR           Buffer[pOS_DosPathName_MAX];
  254.   } *SAP;
  255.  
  256.   ThisTask->tc_FriendTask=NULL;
  257.  
  258.   Obj->fgd_SumFiles=0;
  259.   Obj->fgd_SumDirs=0;
  260.  
  261.  
  262.   if(SAP=(SumAP*)pOS_AllocMem(sizeof(SumAP),MEMF_PUBLIC)) {
  263.     SAP->AP.ap_BufLen=pOS_DosPathName_MAX;
  264.     SAP->AP.ap_BreakBits=DOSSIGF_CTRL_C;
  265.  
  266.     pOS_LockIntuiGadget(Obj->fgd_Window);
  267.     OpsALL =pOS_GetObjectData(Obj->fgd_AllGad,ICLTAG_Selected);
  268.     OpsDIR =pOS_GetObjectData(Obj->fgd_DirGad,ICLTAG_Selected);
  269.     OpsFILE=pOS_GetObjectData(Obj->fgd_FileGad,ICLTAG_Selected);
  270.     Path=(CHAR*)pOS_GetObjectData(Obj->fgd_PathGad,STRGADTAG_String);
  271.     Patt=(CHAR*)pOS_GetObjectData(Obj->fgd_PatGad,STRGADTAG_String);
  272.     Flg=!pOS_PathMatchFirst(NULL,Path,&SAP->AP,Patt,APF_MultiAssign);
  273.     pOS_UnlockIntuiGadget(Obj->fgd_Window);
  274.  
  275.     if(Flg) {
  276.       Obj->fgd_ActPath=SAP->AP.ap_Buf;
  277.       while(!pOS_PathMatchNext(&SAP->AP)) {
  278.         if(SAP->AP.ap_Flags & APF_IsWild) {
  279.           const pOS_AnchorPathObj *const APObj=pOS_CURRANCHORPATH(&SAP->AP);
  280.  
  281.           if( (SAP->AP.ap_Flags & APF_DoEnterDir) ? OpsDIR:OpsFILE ) {
  282.             UWORD Size=strlen(SAP->AP.ap_Buf);
  283.             pOS_ObtainSemaphore(&Obj->fgd_Sem);
  284.             if(Item=(FindGadItem*)
  285.                  pOS_AllocPoolMem(&Obj->fgd_Pool,Size+sizeof(FindGadItem),MEMF_PUBLIC|MEMF_CLEAR)) {
  286.  
  287.               Item->fgt_GI.gdt_Render=NULL; Item->fgt_GI.gdt_Flags=0;
  288.               strcpy(Item->fgt_Name,SAP->AP.ap_Buf);
  289.               Item->fgt_Type=APObj->an_FIB.fib_DirEntryType;
  290.               Item->fgt_Size=APObj->an_FIB.fib_Size;
  291.               pOS_ListAddTail(&Obj->fgd_PreList,&Item->fgt_GI.gdt_Node);
  292.               if(SAP->AP.ap_Flags & APF_DoEnterDir) Obj->fgd_SumDirs++;
  293.               else                                  Obj->fgd_SumFiles++;
  294.             }
  295.             pOS_ReleaseSemaphore(&Obj->fgd_Sem);
  296.           }
  297.         }
  298.         if(!OpsALL) SAP->AP.ap_Flags &= ~APF_DoEnterDir;
  299.       }
  300.       Obj->fgd_ActPath=NULL;
  301.       pOS_PathMatchEnd(&SAP->AP);
  302.  
  303.       if(SAP->AP.ap_FoundBreak==0) {
  304.         Obj->fgd_Ticks=99; // *** damit der Printer nicht umsonst wartet
  305.  
  306.         if(Obj->fgd_SumDirs==0 && Obj->fgd_SumFiles==0) {
  307.           PrintErr("No Entries on path\n<%.60s>\nPattern <%s>",Path,Patt);
  308.         }
  309.       }
  310.     }
  311.     else PrintErr("Cannot found\n<%.60s>",Path);
  312.  
  313.     pOS_FreeMem(SAP,sizeof(SumAP));
  314.   }
  315.  
  316.   pOS_ForbidSchedul();
  317.   Obj->fgd_ScanTask=NULL;
  318.   if(ThisTask->tc_FriendTask)
  319.          pOS_SendSignal(ThisTask->tc_FriendTask,SIGF_Signal);
  320. }
  321.  
  322.  
  323.  
  324. /*----------------------------------
  325. Gad-Sem muß zuvor gelockt sein.
  326. -----------------------------------*/
  327. VOID UpdateDataList(FindGadData* obj)
  328. {
  329.   pOS_NClass *TxtClass;
  330.   FindGadItem *Item,*GI;
  331.  
  332.   if(TxtClass=pOS_OpenClass("itext.class",0)) {
  333.     for(;;) {
  334.       UBYTE IType;
  335.       UWORD P1,P2;
  336.       pOS_ObtainSemaphore(&obj->fgd_Sem);
  337.       Item=(FindGadItem*)pOS_ListRemHead(&obj->fgd_PreList);
  338.       pOS_ReleaseSemaphore(&obj->fgd_Sem);
  339.       if(!Item) break;
  340.  
  341.       IType=Item->fgt_Type & FINFENTYP_FDMask;
  342.       P1=obj->fdg_DrawInfo->dri_Pens[ IType==FINFENTYP_File ? SCRPEN_FileNameSA:SCRPEN_DirNameSA];
  343.       P2=obj->fdg_DrawInfo->dri_Pens[ IType==FINFENTYP_File ? SCRPEN_FileNameIS:SCRPEN_DirNameIS];
  344.  
  345.       if(IType==FINFENTYP_File)
  346.         pOS_SPrintf(Item->fgt_StrSize,"%ld",Item->fgt_Size);
  347.       else strcpy(Item->fgt_StrSize,"<DIR>");
  348.  
  349.       if(Item->fgt_GI.gdt_Render=(pOS_IntuiObj*)pOS_NewIObject(TxtClass,NULL,0,
  350.           IOBJTAG_FGPen,   P1,
  351.           IOBJTAG_BGPen,   P2,
  352.           IOBJTAG_StaticString, (ULONG)Item->fgt_Name,
  353.           0)) {
  354.         pOS_IntuiObj *End=Item->fgt_GI.gdt_Render,*IObj;
  355.  
  356.         IObj=(pOS_IntuiObj*)pOS_NewIObject(TxtClass,NULL,0,
  357.           IOBJTAG_FGPen,   P1,
  358.           IOBJTAG_BGPen,   P2,
  359.           IOBJTAG_StaticString, (ULONG)Item->fgt_StrSize,
  360.           0);
  361.         if(IObj) {End->iobj_Next=IObj; End=IObj;}
  362.  
  363.         obj->fgd_NewNodes=TRUE;
  364.  
  365.         {
  366.           UBYTE GType,IType=Item->fgt_Type & FINFENTYP_FDMask;
  367.           UBYTE First=0,Last=0;
  368.  
  369.           for(GI=(FindGadItem*)obj->fgd_List.lh_Head;
  370.               GI->fgt_GI.gdt_Node.ln_Succ!=NULL;
  371.               GI=(FindGadItem*)GI->fgt_GI.gdt_Node.ln_Succ) {
  372.             GType=GI->fgt_Type & FINFENTYP_FDMask;
  373.             if(GI==obj->fgd_FirstAlterNode) First=1;
  374.             if(IType>GType) break;
  375.             if(IType==GType && stricmp(Item->fgt_Name,GI->fgt_Name)<0) break;
  376.             if(GI==obj->fgd_LastAlterNode) Last=1;
  377.           }
  378.           pOS_ListInsert(&obj->fgd_List,&Item->fgt_GI.gdt_Node,GI->fgt_GI.gdt_Node.ln_Pred);
  379.           if(First==0 || obj->fgd_FirstAlterNode==NULL) obj->fgd_FirstAlterNode=Item;
  380.           if(Last==1  || obj->fgd_LastAlterNode==NULL)  obj->fgd_LastAlterNode=Item;
  381.         }
  382.       }
  383.     }
  384.     pOS_CloseClass(TxtClass);
  385.   }
  386. }
  387.  
  388.  
  389.  
  390. /*----------------------------------
  391. -----------------------------------*/
  392. VOID DeleteDataList(FindGadData* obj,pOS_List* list)
  393. {
  394.   FindGadItem* Item;
  395.   for(Item=(FindGadItem*)list->lh_Head;
  396.       Item->fgt_GI.gdt_Node.ln_Succ;
  397.       Item=(FindGadItem*)Item->fgt_GI.gdt_Node.ln_Succ) {
  398.     if(Item->fgt_GI.gdt_Render)
  399.                pOS_IObjDisposeList(Item->fgt_GI.gdt_Render);
  400.   }
  401. }
  402.  
  403.  
  404.  
  405.  
  406. /*----------------------------------
  407. Hintergrund-Process starten
  408. -----------------------------------*/
  409. VOID StartTask(FindGadData *obj)
  410. {
  411.   pOS_ForbidSchedul();
  412.   if(!obj->fgd_ScanTask) {
  413.     obj->fgd_ScanTask=(pOS_Task*)pOS_CreateProcess(
  414.         DOSTAG_Name,        (ULONG)"FindGad.task",
  415.         DOSTAG_StackSize,   5000,
  416.         DOSTAG_Priority,    5,
  417.         DOSTAG_Entry,       (ULONG)ScanTaskFunc,
  418.         DOSTAG_DefaultProc, TRUE,
  419.         DOSTAG_Data1,       (ULONG)obj,
  420.         DOSTAG_Synchronous, FALSE,
  421.         TAG_DONE);
  422.   }
  423.   pOS_PermitSchedul();
  424. }
  425.  
  426.  
  427. /*----------------------------------
  428. Hintergrund-Process stoppen
  429. -----------------------------------*/
  430. VOID EndTask(FindGadData *obj)
  431. {
  432.   pOS_ForbidSchedul();
  433.   if(obj->fgd_ScanTask) {
  434.     obj->fgd_ScanTask->tc_FriendTask=pOS_FindTask(NULL);
  435.     pOS_SendSignal(obj->fgd_ScanTask,DOSSIGF_CTRL_C);
  436.     while(obj->fgd_ScanTask) pOS_WaitSignal(SIGF_Signal);
  437.   }
  438.   pOS_PermitSchedul();
  439. }
  440.  
  441.  
  442. /*----------------------------------
  443. Scanning stoppen und alle Scan-Daten freigeben
  444. -----------------------------------*/
  445. VOID StopScanning(FindGadData *obj)
  446. {
  447.   EndTask(obj);
  448.   if(obj->fgd_LVGad)
  449.     pOS_SetGadgetAttrs(NULL,obj->fgd_LVGad,
  450.           LVGADTAG_List, 0,
  451.           TAG_DONE);
  452.   DeleteDataList(obj,&obj->fgd_List);
  453.   pOS_FreePoolAll(&obj->fgd_Pool);
  454.   pOS_ListInit(&obj->fgd_List);
  455.   pOS_ListInit(&obj->fgd_PreList);
  456. }
  457.  
  458. /*----------------------------------
  459. -----------------------------------*/
  460. VOID StartScanning(FindGadData *obj)
  461. {
  462.   StopScanning(obj);
  463.   StartTask(obj);
  464.  
  465.   pOS_SetGadgetAttrs(obj->fgd_Window,obj->fgd_LVGad,
  466.       LVGADTAG_List, (ULONG)&obj->fgd_List,
  467.       TAG_DONE);
  468.   obj->fgd_RunMode=TRUE;
  469. }
  470.  
  471. /*----------------------------------
  472. -----------------------------------*/
  473. VOID SetGadgetStatus(const pOS_Class* cl,FindGadData *obj)
  474. {
  475.   BOOL Disable=pOS_GetAbsObjectData(cl,obj,ICLTAG_Disabled);
  476.  
  477.   pOS_SetGadgetAttrs(obj->fgd_Window,obj->fgd_OkGad,
  478.       ICLTAG_Disabled, (Disable || obj->fgd_RunMode!=0),
  479.       TAG_DONE);
  480.   pOS_SetGadgetAttrs(obj->fgd_Window,obj->fgd_AbbGad,
  481.       ICLTAG_Disabled, (Disable || obj->fgd_RunMode==0),
  482.       TAG_DONE);
  483.  
  484.   pOS_SetGadgetAttrs(obj->fgd_Window,obj->fgd_AllGad,
  485.       ICLTAG_Disabled, (Disable || obj->fgd_RunMode!=0),
  486.       TAG_DONE);
  487.   pOS_SetGadgetAttrs(obj->fgd_Window,obj->fgd_DirGad,
  488.       ICLTAG_Disabled, (Disable || obj->fgd_RunMode!=0),
  489.       TAG_DONE);
  490.   pOS_SetGadgetAttrs(obj->fgd_Window,obj->fgd_FileGad,
  491.       ICLTAG_Disabled, (Disable || obj->fgd_RunMode!=0),
  492.       TAG_DONE);
  493.   pOS_SetGadgetAttrs(obj->fgd_Window,obj->fgd_PathGad,
  494.       ICLTAG_Disabled, (Disable || obj->fgd_RunMode!=0),
  495.       TAG_DONE);
  496.   pOS_SetGadgetAttrs(obj->fgd_Window,obj->fgd_PatGad,
  497.       ICLTAG_Disabled, (Disable || obj->fgd_RunMode!=0),
  498.       TAG_DONE);
  499.  
  500.   pOS_SetGadgetAttrs(obj->fgd_Window,obj->fgd_LVGad,
  501.       ICLTAG_Disabled, Disable,
  502.       TAG_DONE);
  503. }
  504.  
  505.  
  506. /*----------------------------------
  507. -----------------------------------*/
  508. ULONG pOSp_FindGadDispatcher(_R_LB pOS_ExecBase* exec,_R_A0 const pOS_Class* cl,
  509.                              _R_A1 FindGadData *obj,_R_A2 pOS_GadgetMethod* mth)
  510. {
  511.   ULONG ret=0;
  512.  
  513.   switch(mth->imth_Method) {
  514. // -----
  515.     case ICLMTH_New:
  516.       pOS_SetAbsObjectData(cl,obj,
  517.          GRPGADTAG_SpaceVert,      4,
  518.          GRPGADTAG_PrivateDisable, TRUE,
  519.          ICLTAG_HelpID,  (ULONG)"{help:findgad.library.hlp}",
  520.          TAG_DONE);
  521.  
  522.       ret=pOS_DoAbsMethodA(cl,obj,(pOS_Method*)mth);
  523.       if(ret!=pOS_CLASSERR) {
  524.         __CONST__ CHAR **Names;
  525.         pOS_Gadget *XGad;
  526.  
  527.         obj->fdg_DrawInfo=(pOS_DrawInfo*)pOS_FindTagData(ICLTAG_DrawInfo,mth->imth_U.imth_New.imnw_Tags,0);
  528.         Names=obj->fdg_DrawInfo->dri_Names;
  529.  
  530.         pOS_ListInit(&obj->fgd_List);
  531.         pOS_ListInit(&obj->fgd_PreList);
  532.         pOS_InitMemPool(&obj->fgd_Pool,4096,MEMF_PUBLIC);
  533.         pOS_InitSemaphore(&obj->fgd_Sem);
  534.  
  535.         obj->fgd_TxGad=(pOS_Gadget*)
  536.             pOS_NewIObject(NULL,Names[SCRNAM_GTxtBoxClass],0,
  537.            ICLTAG_DrawInfo,      (ULONG)obj->fdg_DrawInfo,
  538.            IOBJTAG_StaticString, (ULONG)obj->fgd_TxBuffer,
  539.            ICLTAG_AddWidth,      10,
  540.            ICLTAG_AddHeight,     10,
  541.            ICLTAG_HelpID,       (ULONG)"TxtInfo",
  542.            TAG_DONE);
  543.  
  544.         obj->fgd_LVGad=(pOS_Gadget*)
  545.             pOS_NewIObject(NULL,Names[SCRNAM_GLVClass],0,
  546.            ICLTAG_DrawInfo,       (ULONG)obj->fdg_DrawInfo,
  547.            ICLTAG_StandardDrag,   TRUE,
  548.            ICLTAG_AddDragAttName, (ULONG)":ascii/line/",
  549.            LVGADTAG_List,         (ULONG)&obj->fgd_List,
  550.            LVGADTAG_HAutoGad,     TRUE,
  551.            LVGADTAG_VAutoGad,     TRUE,
  552.            LVGADTAG_ReadOnly,     TRUE,
  553.            ICLTAG_Gwk,            1,
  554.            LVGADTAG_CursorScroll, TRUE,
  555.            LVGADTAG_HAutoKt,      1,
  556.            TAG_DONE);
  557.  
  558.         obj->fgd_AllGad=(pOS_Gadget*)
  559.             pOS_NewIObject(NULL,Names[SCRNAM_GCheckBoxClass],0,
  560.            ICLTAG_DrawInfo,      (ULONG)obj->fdg_DrawInfo,
  561.            IOBJTAG_StaticString, (ULONG*)"_Rekrusiv (ALL)",
  562.            ICLTAG_ShortKey,      (ULONG)'R',
  563.            IOBJTAG_Underscore,   '_',
  564.            ICLTAG_HelpID,       (ULONG)"GAll",
  565.            TAG_DONE);
  566.  
  567.         obj->fgd_DirGad=(pOS_Gadget*)
  568.             pOS_NewIObject(NULL,Names[SCRNAM_GCheckBoxClass],0,
  569.            ICLTAG_DrawInfo,      (ULONG)obj->fdg_DrawInfo,
  570.            IOBJTAG_StaticString, (ULONG*)"_Directories",
  571.            ICLTAG_ShortKey,      (ULONG)'D',
  572.            IOBJTAG_Underscore,   '_',
  573.            ICLTAG_Selected,      TRUE,
  574.            ICLTAG_HelpID,       (ULONG)"GDirs",
  575.            TAG_DONE);
  576.  
  577.         obj->fgd_FileGad=(pOS_Gadget*)
  578.             pOS_NewIObject(NULL,Names[SCRNAM_GCheckBoxClass],0,
  579.            ICLTAG_DrawInfo,      (ULONG)obj->fdg_DrawInfo,
  580.            IOBJTAG_StaticString, (ULONG*)"_Files",
  581.            ICLTAG_ShortKey,      (ULONG)'F',
  582.            IOBJTAG_Underscore,   '_',
  583.            ICLTAG_Selected,      TRUE,
  584.            ICLTAG_HelpID,       (ULONG)"GFiles",
  585.            TAG_DONE);
  586.  
  587.         obj->fgd_PatGad=(pOS_Gadget*)
  588.             pOS_NewIObject(NULL,Names[SCRNAM_GStrClass],0,
  589.            ICLTAG_DrawInfo,      (ULONG)obj->fdg_DrawInfo,
  590.            STRGADTAG_String,     (ULONG)"#?",
  591.            STRGADTAG_DispPos,    pOS_DosFileName_MAX,
  592.            STRGADTAG_StdDragAtt, TRUE,
  593.            STRGADTAG_StdDropAtt, TRUE,
  594.            ICLTAG_StdLableName,  (ULONG*)"_Muster",
  595.            ICLTAG_RelVerify,     TRUE,
  596.            ICLTAG_HelpID,        (ULONG)"GPattern",
  597.            TAG_DONE);
  598.  
  599.         obj->fgd_PathGad=(pOS_Gadget*)
  600.             pOS_NewIObject(NULL,Names[SCRNAM_GPathClass],0,
  601.            ICLTAG_DrawInfo,      (ULONG)obj->fdg_DrawInfo,
  602.            STRGADTAG_DispPos,    pOS_DosPathName_MAX,
  603.            STRGADTAG_StdDragAtt, TRUE,
  604.            STRGADTAG_StdDropAtt, TRUE,
  605.            ICLTAG_StdLableName,  (ULONG*)"_Pfad",
  606.            ICLTAG_RelVerify,     TRUE,
  607.            ICLTAG_HelpID,        (ULONG)"GPath",
  608.            TAG_DONE);
  609.  
  610.         obj->fgd_OkGad=(pOS_Gadget*)
  611.             pOS_NewIObject(NULL,Names[SCRNAM_GButtonClass],0,
  612.            ICLTAG_DrawInfo,      (ULONG)obj->fdg_DrawInfo,
  613.            IOBJTAG_StaticString, (ULONG)"_Start",
  614.            ICLTAG_ShortKey,      (ULONG)'S',
  615.            ICLTAG_RelVerify,     TRUE,
  616.            IOBJTAG_Underscore,    '_',
  617.            ICLTAG_HelpID,       (ULONG)"GStart",
  618.            TAG_DONE);
  619.  
  620.         obj->fgd_AbbGad=(pOS_Gadget*)
  621.             pOS_NewIObject(NULL,Names[SCRNAM_GButtonClass],0,
  622.            ICLTAG_DrawInfo,      (ULONG)obj->fdg_DrawInfo,
  623.            IOBJTAG_StaticString, (ULONG)"_Abbruch",
  624.            ICLTAG_ShortKey,      (ULONG)'A',
  625.            ICLTAG_RelVerify,     TRUE,
  626.            IOBJTAG_Underscore,    '_',
  627.            ICLTAG_HelpID,       (ULONG)"GCancel",
  628.            TAG_DONE);
  629.  
  630.         XGad=(pOS_Gadget*)
  631.             pOS_NewIObject(NULL,Names[SCRNAM_GGroupClass],0,
  632.            GRPGADTAG_Horiz,     TRUE,
  633.            GRPGADTAG_AddGadget, (ULONG)obj->fgd_OkGad,
  634.            GRPGADTAG_AddGadget, (ULONG)obj->fgd_AbbGad,
  635.            TAG_DONE);
  636.  
  637.         pOS_SetAbsObjectData(cl,obj,
  638.            GRPGADTAG_AddGadget, (ULONG)obj->fgd_TxGad,
  639.            GRPGADTAG_AddGadget, (ULONG)obj->fgd_LVGad,
  640.            GRPGADTAG_AddGadget, (ULONG)obj->fgd_AllGad,
  641.            GRPGADTAG_AddGadget, (ULONG)obj->fgd_DirGad,
  642.            GRPGADTAG_AddGadget, (ULONG)obj->fgd_FileGad,
  643.            GRPGADTAG_AddGadget, (ULONG)obj->fgd_PatGad,
  644.            GRPGADTAG_AddGadget, (ULONG)obj->fgd_PathGad,
  645.            GRPGADTAG_AddGadget, (ULONG)
  646.                        pOS_NewIObject(NULL,Names[SCRNAM_GBarClass],0,
  647.                     ICLTAG_DrawInfo,    (ULONG)obj->fdg_DrawInfo,
  648.                     TAG_DONE),
  649.            GRPGADTAG_AddGadget, (ULONG)XGad,
  650.            TAG_DONE);
  651.         SetGadgetStatus(cl,obj);
  652.       }
  653.       break;
  654.  
  655. // -----
  656.     case ICLMTH_Dispose:
  657.       StopScanning(obj);
  658.       ret=pOS_DoAbsMethodA(cl,obj,(pOS_Method*)mth);
  659.       break;
  660.  
  661. // -----
  662.     case ICLMTH_Set:
  663.       ret=pOS_DoAbsMethodA(cl,obj,(pOS_Method*)mth);
  664.       SetGadgetStatus(cl,obj);
  665.       break;
  666.  
  667. // -----
  668.     case GCLMTH_Add:
  669.       obj->fgd_Window=mth->imth_U.imth_Add.imad_Info->ici_Window;
  670.       ret=pOS_DoAbsMethodA(cl,obj,(pOS_Method*)mth);
  671.       break;
  672.  
  673. // -----
  674.     case GCLMTH_Rem:
  675.       obj->fgd_Window=NULL;
  676.       ret=pOS_DoAbsMethodA(cl,obj,(pOS_Method*)mth);
  677.       break;
  678.  
  679.  
  680. // -----
  681.     case GCLMTH_Msg:
  682.       if(obj->fgd_RunMode &&
  683.              mth->imth_U.imth_Msg.immg_Msg->im_Class==IDCMP_IntuiTicks) {
  684.         if(obj->fgd_Ticks++>10) {
  685.           obj->fgd_Ticks=0;
  686.           pOS_LockIntuiGadget(obj->fgd_Window);
  687.           UpdateDataList(obj);
  688.           if(obj->fgd_NewNodes) {
  689.             pOS_SetGadgetAttrs(NULL,obj->fgd_LVGad,
  690.                LVGADTAG_HasNewNodes,   TRUE,
  691.                LVGADTAG_CalcSlider,    TRUE,
  692.                LVGADTAG_FirstDrawItem, (ULONG)obj->fgd_FirstAlterNode,
  693.                LVGADTAG_LastDrawItem,  (ULONG)obj->fgd_LastAlterNode,
  694.                TAG_DONE);
  695.             pOS_RefreshGadgetsMd(obj->fgd_Window,obj->fgd_LVGad,1,GCLMTHRE_Update);
  696.             obj->fgd_FirstAlterNode=NULL; obj->fgd_LastAlterNode=NULL;
  697.             obj->fgd_NewNodes=FALSE;
  698.           }
  699.           pOS_UnlockIntuiGadget(obj->fgd_Window);
  700.           if(obj->fgd_ScanTask==NULL) {
  701.             obj->fgd_RunMode=FALSE;
  702.             SetGadgetStatus(cl,obj);
  703.           }
  704.         }
  705.  
  706.         if(obj->fgd_ActPath)
  707.                strcpy(obj->fgd_TxBuffer,obj->fgd_ActPath);
  708.         else if(obj->fgd_SumFiles>0 || obj->fgd_SumDirs>0)
  709.                sprintf(obj->fgd_TxBuffer,"Dirs=%ld Files=%ld",obj->fgd_SumDirs,obj->fgd_SumFiles);
  710.         else {
  711.           strcpy(obj->fgd_TxBuffer,"D O N E");
  712.           if(obj->fgd_RunMode) {
  713.             obj->fgd_RunMode=FALSE;
  714.             SetGadgetStatus(cl,obj);
  715.           }
  716.         }
  717.         pOS_RefreshGadgetsMd(obj->fgd_Window,obj->fgd_TxGad,1,GCLMTHRE_Update);
  718.       }
  719.  
  720.       if(ret=pOS_DoIMethodA(obj->fgd_OkGad,(pOS_Method*)mth)) {
  721.         obj->fgd_RunMode=TRUE;
  722.         SetGadgetStatus(cl,obj);
  723.         StartScanning(obj);
  724.         obj->fgd_Ticks=0;
  725.       }
  726.       else if(ret=pOS_DoIMethodA(obj->fgd_AbbGad,(pOS_Method*)mth)) {
  727.         EndTask(obj);
  728.         SetGadgetStatus(cl,obj);
  729.       }
  730.       else ret=pOS_DoAbsMethodA(cl,obj,(pOS_Method*)mth);
  731.       break;
  732.  
  733.  
  734.  
  735.     default: ret=pOS_DoAbsMethodA(cl,obj,(pOS_Method*)mth);
  736.   }
  737.  
  738.   return(ret);
  739. }
  740.  
  741.  
  742. /*******************************************************************************/
  743.  
  744. /*----------------------------------
  745. -----------------------------------*/
  746. VOID PrintErr(const CHAR* bodyText,...)
  747. {
  748.   pOS_EasyStruct ES={
  749.     sizeof(pOS_EasyStruct),
  750.     0,0,
  751.     "FindGad.library",
  752.     bodyText,
  753.     "_Ok",
  754.     NULL,NULL
  755.   };
  756.   ULONG Idcmp=IDCMP_InactiveWindow;
  757.  
  758.   pOS_EasyRequestArgs(NULL,&ES,&Idcmp,(ULONG*) ((&bodyText)+1) );
  759. }
  760.  
  761.  
  762.  
  763.  
  764.  
  765.  
  766. /*----------------------------------
  767. -----------------------------------*/
  768. BOOL pLibMain(_R_LB pOS_ExecBase* exec,_R_A0 FindGadLib* lib)
  769. {
  770. #ifdef __pOS_EXECPRECODE
  771.   extern struct pOS_ExecBase* gb_ExecBase;
  772.   extern struct pOS_ExecLibFunction* gb_ExecLib;
  773.  
  774.   gb_ExecBase=(struct pOS_ExecBase*)exec;
  775.   gb_ExecLib=*((struct pOS_ExecLibFunction**)lib->fg_Lib.lib_Segm->sel_Seg.seg_Reserved2);
  776.   gb_DosBase  =(pOS_DosBase*)pOS_OpenLibrary("pdos.library",0);
  777.   gb_IntuiBase=(pOS_IntuiDevice*)pOS_OpenLibrary("pintui.library",0);
  778.   gb_UtilityBase=(pOS_UtilityBase*)pOS_OpenLibrary("putility.library",0);
  779. #else
  780.  #error hier fehlt etwas
  781. #endif
  782.  
  783.   lib->fg_FindGadClass=
  784.      pOS_CreateClass("FindGad.class","grpgad.class",NULL,
  785.                      (APTR)pOSp_FindGadDispatcher,
  786.                      sizeof(FindGadData),0);
  787.   return(lib->fg_FindGadClass!=NULL);
  788. }
  789.  
  790.  
  791.