home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CUCD / Programming / OUI / rcs / filesel.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  23.7 KB  |  962 lines

  1. head    1.3;
  2. access;
  3. symbols;
  4. locks
  5.     dlorre:1.3; strict;
  6. comment    @// @;
  7.  
  8.  
  9. 1.3
  10. date    97.07.14.04.21.44;    author dlorre;    state Exp;
  11. branches;
  12. next    1.2;
  13.  
  14. 1.2
  15. date    96.08.28.20.02.41;    author dlorre;    state Exp;
  16. branches;
  17. next    1.1;
  18.  
  19. 1.1
  20. date    96.08.22.02.05.10;    author dlorre;    state Exp;
  21. branches;
  22. next    ;
  23.  
  24.  
  25. desc
  26. @Oui.lib -- Object User Interface
  27. Projet créé en 1994
  28. Auteur: Dominique Lorre
  29. @
  30.  
  31.  
  32. 1.3
  33. log
  34. @removed
  35. @
  36. text
  37. @// $Id: filesel.cc 1.2 1996/08/28 20:02:41 dlorre Exp dlorre $
  38. #include "filesel.h"
  39.  
  40. void listedevs(void);
  41. BOOL getfile(screen *, STRPTR , STRPTR , STRPTR , STRPTR );
  42. void initlist(void);
  43. void takefile(void);
  44. void freelist(void);
  45. void fileevents(void);
  46. void checkpath(void);
  47. void displayfiles(void);
  48. void devlist(void);
  49. void DoKeys(IntuiMessage *);
  50. void stripspaces(STRPTR );
  51. void bcpl2c(BSTR b, STRPTR d);
  52. BOOL getPath(STRPTR , STRPTR );
  53. void selection(WORD x, WORD y) ;
  54. void DrawIcon(STRPTR name, WORD place) ;
  55. void sinsert(List *list, Node *node) ;
  56.  
  57. struct fileEntry {
  58.     STRPTR  name ;
  59.     BYTE    type ;
  60.     fileEntry() : type(NULL), name(NULL) {}
  61. };
  62.  
  63. int fecmp(const void *a, const void *b)
  64. {
  65. fileEntry *fa = (fileEntry *)a ;
  66. fileEntry *fb = (fileEntry *)b ;
  67.  
  68.     if (fa->type == fb->type) {
  69.         return strcmpi(fa->name, fb->name) ;
  70.     }
  71.     else {
  72.         return fb->type - fa->type ;
  73.     }
  74. }
  75.  
  76. static fileEntry *fp ;
  77.  
  78. /* fichier control.c */
  79. LONG DeadKeyConvert(IntuiMessage *, UBYTE *, LONG, KeyMap *);
  80.  
  81. void filesel::fparent(gadget *g, unsigned long classe, unsigned short code)
  82. {
  83. STRPTR s;
  84.  
  85.     strcpy(stemp, DRAWER) ;
  86.     s = PathPart(stemp) ;
  87.     *s = '\0' ;
  88.     gdrawer->set(stemp) ;
  89.     DrawIcon(stemp, TOPDBOX) ;
  90.     freelist();
  91.     takefile();
  92. }
  93.  
  94. void filesel::fdrawer(gadget *g, unsigned long classe, unsigned short code)
  95. {
  96.     strcpy(stemp, DRAWER) ;
  97.     getPath(DRAWER, stemp);
  98.     checkpath();
  99.     gdrawer->set(stemp) ;
  100.     DrawIcon(stemp, TOPDBOX) ;
  101.     freelist();
  102.     takefile();
  103. }
  104.  
  105. void filesel::fprop(gadget *g, unsigned long classe, unsigned short code)
  106. {
  107.     if (code != topentry) {
  108.         topentry = code ;
  109.         displayfiles() ;
  110.     }
  111. }
  112.  
  113. void filesel::handlevkey(USHORT code)
  114. {
  115.     if (code == 0x0D) {
  116.         g->selectgadget(7, FALSE) ;
  117.     }
  118.     else if (code == 0x1B) {
  119.         g->selectgadget(9, FALSE) ;
  120.     }
  121.     else
  122.         g->parsegadgets(code) ;
  123. }
  124.  
  125. void filesel::open(screen *ns)
  126. {
  127. long mw ;
  128. long mc ;
  129. long l ;
  130. long pwidth, pheight ;
  131.  
  132.     ws = ns ;
  133.  
  134.     g = new gadgetlist(this, 10) ;
  135.     mw = g->lmax(ok, cancel, parent, NULL) + 20 ;
  136.     mc = g->lmax(file, drawer, comment, NULL) + 20 ;
  137.     l = g->fontheight+4 ;
  138.  
  139.     g->box(LEFTSEL, TOPSEL+HEIGHTSEL+4, mc, l) ;
  140.     new cstring(g, NULL, drawer, NULL, FALSE, PLACETEXT_IN|NG_HIGHLABEL) ;
  141.  
  142.     g->box(LEFTSEL+mc, TOPSEL+HEIGHTSEL+4, LEFTBOX + WIDTHBOX - mc - 20, l) ;
  143.     gdrawer = new string(g, WFUNC(&filesel::fdrawer)) ;
  144.  
  145.     g->box(LEFTSEL, TOPSEL+HEIGHTSEL+4+l, mc, l) ;
  146.     new cstring(g, NULL, file, NULL, FALSE, PLACETEXT_IN|NG_HIGHLABEL) ;
  147.  
  148.     g->box(LEFTSEL+mc, TOPSEL+HEIGHTSEL+4+l, LEFTBOX + WIDTHBOX - mc - 20, l) ;
  149.     gfile = new string(g, NULL, NULL, sname) ;
  150.  
  151.     g->box(LEFTSEL, TOPSEL+HEIGHTSEL+4+2*l, mc, l) ;
  152.     new cstring(g, NULL, comment, NULL, FALSE, PLACETEXT_IN|NG_HIGHLABEL) ;
  153.  
  154.     g->box(LEFTSEL+mc, TOPSEL+HEIGHTSEL+4+2*l, LEFTBOX + WIDTHBOX - mc - 20, l) ;
  155.     if (Saver)
  156.         gcom = new string(g, NULL) ;
  157.     else
  158.         cgcom = new cstring(g, NULL, NULL, NULL, TRUE) ;
  159.  
  160.     if (ws->scr->ViewPort.Modes & HIRES) {
  161.         pwidth = 18 ;
  162.         pheight = 10 ;
  163.     }
  164.     else {
  165.         pwidth = 13 ;
  166.         pheight = 11 ;
  167.     }
  168.  
  169.     g->box(pwidth-1, TOPSEL, pwidth-1, TOPSEL+pheight) ;
  170.     gprop = new eprop(g, WFUNC(&filesel::fprop), 0, TOT_DISPLAY, TOT_DISPLAY,
  171.         LORIENT_VERT, RIGHTPROP|HEIGHTPROP) ;
  172.  
  173.     g->box( ws->scr->WBorLeft+20,
  174.             g->maxh+8,
  175.             mw,
  176.             g->fontheight*3/2) ;
  177.  
  178.     g->setgpen(ws->xpens[GREEN_PEN]) ;
  179.     new fbutton(g, WFUNC(&filesel::fok), ok, TRUE) ;
  180.  
  181.     g->left = short((g->maxw+20-mw)/2) ;
  182.     g->setgpen(ws->drawinfo->dri_Pens[TEXTPEN]) ;
  183.     new fbutton(g, WFUNC(&filesel::fparent), parent, FALSE) ;
  184.  
  185.     g->left = short(g->maxw - mw) ;
  186.     g->setgpen(ws->xpens[RED_PEN]) ;
  187.     new fbutton(g, WFUNC(&filesel::fcancel), cancel, FALSE) ;
  188.  
  189.     width = short(LEFTBOX + WIDTHBOX+20) ;
  190.  
  191.     height = short(g->maxh-ws->winbarheight+8) ;
  192.  
  193.     left = short((ws->width - width - ws->scr->WBorLeft-ws->scr->WBorRight) / 2) ;
  194.     top = short((ws->height - height - ws->winbarheight - ws->scr->WBorBottom) / 2) ;
  195.  
  196.     window::_open(NULL, BUTTONIDCMP|ARROWIDCMP|SCROLLERIDCMP|
  197.                         IDCMP_MOUSEBUTTONS|IDCMP_RAWKEY|IDCMP_VANILLAKEY|
  198.                         IDCMP_DISKINSERTED|
  199.                         IDCMP_DISKREMOVED|IDCMP_IDCMPUPDATE,
  200.         WA_Flags,   WFLG_DRAGBAR|WFLG_ACTIVATE,
  201.         WA_Title,   title,
  202.         WA_Gadgets, g->glist,
  203.         WA_SizeGadget,  TRUE,
  204.         TAG_END);
  205.  
  206.     if (initok) {
  207.         recessedbox(LEFTSEL-2, TOPSEL-2, WIDTHSEL+4, HEIGHTSEL+4) ;
  208.         setapen(ws->xpens[GFILL_PEN]) ;
  209.         rectfill(LEFTSEL, TOPSEL, LEFTSEL+WIDTHSEL-1, TOPSEL+HEIGHTSEL-1) ;
  210.         bevelbox(LEFTBOX-2, TOPDBOX-2, WIDTHBOX+4, HEIGHTBOX+4) ;
  211.         recessedbox(LEFTBOX-2, TOPFBOX-2, WIDTHBOX+4, HEIGHTBOX+4) ;
  212.  
  213.         g->updategadgets() ;
  214.         if (newregion()) {
  215.             clipok = addregion(LEFTBOX, TOPDBOX, WIDTHBOX, HEIGHTBOX) ;
  216.             clipok &= addregion(LEFTBOX, TOPFBOX, WIDTHBOX, HEIGHTBOX) ;
  217.             clipok &= addregion(LEFTSEL, TOPSEL, WIDTHSEL, HEIGHTSEL) ;
  218.             if (!Saver)
  219.                 clipok &= addregion(LEFTSEL, TOPSEL+HEIGHTSEL+34, LEFTBOX+WIDTHBOX-LEFTSEL, 14) ;
  220.         }
  221.     }
  222. }
  223.  
  224. static filesel frwin(90, 40, 430, 140) ;
  225.  
  226. BOOL getfile(screen *s, STRPTR name, STRPTR title, STRPTR drawer,
  227.     STRPTR comment)
  228. {
  229. int i ;
  230.  
  231.     frwin.okflag = FALSE ;
  232.  
  233.     if (s == NULL) return(FALSE);
  234.     Plain = Italic = *s->scr->Font ;
  235.     Italic.ta_Style |= FSF_ITALIC;
  236.  
  237.     bloc = (FileInfoBlock *)AllocDosObject(DOS_FIB, NULL) ;
  238.     if (!bloc)
  239.         return FALSE ;
  240.  
  241.     ParsePatternNoCase("~(#?.info)", pat, MAXLEN) ;
  242.     Saver = short(comment != NULL) ;
  243.  
  244.     FONTHEIGHT = short(s->scr->Font->ta_YSize) ;
  245.     LEFTSEL = 20 ;
  246.     TOPSEL = TOPDBOX = short(s->winbarheight + 8) ;
  247.     WIDTHSEL = short(s->width / 3) ;
  248.     HEIGHTSEL = short(s->height / 2) ;
  249.     TOT_DISPLAY = short(HEIGHTSEL / FONTHEIGHT) ;
  250.     LEFTBOX = short(LEFTSEL + WIDTHSEL + 30) ;
  251.     TOPDBOX = TOPSEL ;
  252.     HEIGHTBOX = short(HEIGHTSEL / 2 - 10) ;
  253.     TOPFBOX = short(TOPSEL + HEIGHTBOX + 10) ;
  254.     WIDTHBOX = short((HEIGHTBOX*s->xratio) / s->yratio) ;
  255.  
  256.     listetext = new IntuiText[TOT_DISPLAY] ;
  257.     if (!listetext)
  258.         goto mem1 ;
  259.  
  260.     fpen = s->drawinfo->dri_Pens[TEXTPEN] ;
  261.     bpen = s->xpens[GFILL_PEN] ;
  262.  
  263.     for (i=0; i<TOT_DISPLAY; i++) {
  264.         listetext[i].FrontPen = fpen;
  265.         listetext[i].BackPen = bpen;
  266.         listetext[i].DrawMode = JAM2;
  267.         listetext[i].LeftEdge = short(LEFTSEL+4) ;
  268.         listetext[i].TopEdge = short(TOPSEL+i*FONTHEIGHT) ;
  269.         listetext[i].ITextFont = s->scr->Font ;
  270.         listetext[i].IText = new char[MAXLEN];
  271.         if (!listetext[i].IText)
  272.             goto mem2 ;
  273.  
  274.         listetext[i].IText[0] = '\0' ;
  275.         listetext[i].NextText = (i<(TOT_DISPLAY-1))?&listetext[i+1]:NULL;
  276.     }
  277.     Style = new TextAttr*[TOT_DISPLAY] ;
  278.     if (!Style)
  279.         goto mem3 ;
  280.  
  281.     strcpy(frwin.sname, name) ;
  282.     strcpy(frwin.title, title) ;
  283.     frwin.open(s) ;
  284.     if (frwin.initok) {
  285.         if (frwin.clipok) {
  286.             frwin.installclip() ;
  287.  
  288.             Mode = DISPLAY_FILES ;
  289.  
  290.             indsel = numsel = -1 ;
  291.  
  292.             getPath(drawer, stemp);
  293.             checkpath();
  294.             gdrawer->set(stemp) ;
  295.             DrawIcon(stemp, TOPDBOX) ;
  296.             DrawIcon(name, TOPFBOX) ;
  297.  
  298.             takefile();
  299.  
  300.             frwin.eventloop() ;
  301.  
  302.             frwin.disposeregion() ;
  303.  
  304.             freelist();
  305.             stripspaces(FILE);
  306.             strcpy(drawer, DRAWER) ;
  307.             strcpy(name, FILE) ;
  308.             if (Saver)
  309.                 strcpy(comment, COMMENT) ;
  310.         }
  311.  
  312.         frwin.close() ;
  313.     }
  314.     delete Style ;
  315.  
  316. mem3:
  317.     for (i=0; i<TOT_DISPLAY; i++) {
  318.         if (listetext[i].IText) delete listetext[i].IText ;
  319.     }
  320.  
  321. mem2:
  322.     delete listetext ;
  323.  
  324. mem1:
  325.     FreeDosObject(DOS_FIB, bloc) ;
  326.     return (frwin.okflag);
  327. }
  328.  
  329. void initlist(void)
  330. {
  331.     RepList = new List ;
  332.     NewList(RepList);
  333.     RepList->lh_Type = NT_UNKNOWN;
  334. }
  335.  
  336. void takefile(void)
  337. {
  338. ExAllData       *EAData ;
  339. ExAllData       *ead ;
  340. ExAllControl    *eac ;
  341. LONG            more ;
  342. int             i ;
  343.  
  344.     initlist();
  345.     checkpath();
  346.     clef = Lock(DRAWER, ACCESS_READ);
  347.  
  348.     EAData = new ExAllData[MAXENTRIES] ;
  349.  
  350.     eac = (ExAllControl *)AllocDosObject(DOS_EXALLCONTROL,NULL);
  351.  
  352.     nbfics = 0 ;
  353.     eac->eac_Entries = MAXENTRIES ;
  354.     eac->eac_MatchString = pat ;
  355.     eac->eac_MatchFunc = NULL ;
  356.     eac->eac_LastKey = 0;
  357.     do {
  358.         more = ExAll(clef, EAData, sizeof(ExAllData)*MAXENTRIES, ED_TYPE, eac);
  359.         if ((!more) && (IoErr() != ERROR_NO_MORE_ENTRIES)) {
  360.             // ExAll failed abnormally
  361.             break;
  362.         }
  363.         if (eac->eac_Entries == 0) {
  364.             // ExAll failed normally with no entries
  365.             continue;                   // ("more" is *usually* zero)
  366.         }
  367.         ead = EAData;
  368.         do {
  369.             RepNode = new Node ;
  370.             RepNode->ln_Name = new char[strlen(ead->ed_Name)+1] ;
  371.             strcpy(RepNode->ln_Name, ead->ed_Name) ;
  372.             RepNode->ln_Pri = BYTE(ead->ed_Type > 0) ;
  373.             AddTail(RepList, RepNode) ;
  374.             nbfics++;
  375.             ead = ead->ed_Next;
  376.         } while (ead);
  377.  
  378.     } while (more);
  379.  
  380.     FreeDosObject(DOS_EXALLCONTROL,eac);
  381.     delete EAData ;
  382.  
  383.     fp = new fileEntry[nbfics] ;
  384.  
  385.     RepNode = RepList->lh_Head ;
  386.     for (i=0; i<nbfics; i++) {
  387.         fp[i].name = RepNode->ln_Name ;
  388.         fp[i].type = RepNode->ln_Pri ;
  389.         RepNode = RepNode->ln_Succ ;
  390.     }
  391.     qsort(fp, nbfics, sizeof(fileEntry), &fecmp) ;
  392.  
  393.     RepNode = RepList->lh_Head ;
  394.     for (i=0 ; i< nbfics; i++) {
  395.         RepNode->ln_Name = fp[i].name ;
  396.         RepNode->ln_Pri = fp[i].type ;
  397.         RepNode = RepNode->ln_Succ ;
  398.     }
  399.     delete [] fp ;
  400.  
  401.     UnLock(clef);
  402.     topentry = 0 ;
  403.     gprop->set(topentry, -1, nbfics) ;
  404.     displayfiles();
  405. }
  406.  
  407. void freelist(void)
  408. {
  409.     Garage = NULL;
  410.     for (RepNode = RepList->lh_Head; RepNode->ln_Succ;
  411.          RepNode = RepNode->ln_Succ) {
  412.  
  413.         if (Garage) {
  414.             Remove((Node *)Garage);
  415.             delete Garage ;
  416.         }
  417.  
  418.         delete RepNode->ln_Name ;
  419.  
  420.         Garage = RepNode;
  421.     }
  422.  
  423.     if (Garage) {
  424.         Remove((Node *)Garage);
  425.         delete Garage ;
  426.     }
  427.  
  428.     delete RepList ;
  429. }
  430.  
  431. void filesel::simpleevent(IntuiMessage *message)
  432. {
  433. Gadget *gad ;
  434. WORD mousex, mousey ;
  435. ULONG s, m ;
  436. TagItem *tags ;
  437. long id ;
  438.  
  439.     code = message->Code;
  440.     gad = (Gadget *)message->IAddress;
  441.     classe = message->Class;
  442.     mousex = message->MouseX ;
  443.     mousey = message->MouseY ;
  444.     s = message->Seconds ;
  445.     m = message->Micros ;
  446.  
  447.     clickon = FALSE ;
  448.  
  449.     switch (classe) {
  450.     case IDCMP_MOUSEBUTTONS:
  451.         if (code == SELECTUP) {
  452.             if (mousex > LEFTSEL && mousey > TOPSEL &&
  453.                 mousex < (LEFTSEL+WIDTHSEL) &&
  454.                 mousey < (TOPSEL+HEIGHTSEL)) {
  455.                 if (DoubleClick(declic.s, declic.m, s, m)) {
  456.                     clickon = TRUE ;
  457.                 }
  458.                 else {
  459.                     declic.s = s ;
  460.                     declic.m = m ;
  461.                 }
  462.             }
  463.             selection(mousex, mousey) ;
  464.         }
  465.         break;
  466.     case IDCMP_VANILLAKEY:
  467.         handlevkey(code) ;
  468.         break ;
  469.     case IDCMP_RAWKEY:
  470.         DoKeys(message);
  471.         break;
  472.     case IDCMP_DISKINSERTED:
  473.     case IDCMP_DISKREMOVED:
  474.         if (Mode == DISPLAY_DIRS) devlist() ;
  475.         break ;
  476.     case IDCMP_IDCMPUPDATE:
  477.         tags = (TagItem *)gad ;
  478.         if (FindTagItem(PGA_Top, tags)) {
  479.             code = (unsigned short)GetTagData(PGA_Top, 0, tags) ;
  480.             id = (unsigned short)GetTagData(GA_ID, 0, tags) ;
  481.             g->processgadget(id, classe, code) ;
  482.         }
  483.         break ;
  484.     case IDCMP_GADGETUP:
  485.     case IDCMP_GADGETDOWN:
  486.             g->processgadget(gad->GadgetID, classe, code) ;
  487.         break ;
  488.     case IDCMP_REFRESHWINDOW:
  489.         beginrefresh() ;
  490.         endrefresh(TRUE) ;
  491.         break;
  492.     }
  493. }
  494.  
  495. void checkpath(void)
  496. {
  497.     clef = NULL;
  498.     clef = Lock(stemp, ACCESS_READ);
  499.     if (!clef) {
  500.         strcpy(stemp, DRAWER) ;
  501.     }
  502.     else
  503.         UnLock(clef);
  504. }
  505.  
  506. void displayfiles(void)
  507. {
  508. int                 i ;
  509. long                l ;
  510. struct TextExtent   te ;
  511.  
  512.     RepNode = RepList->lh_Head;
  513.     i=0;
  514.     while (RepNode->ln_Succ && i++<topentry)
  515.         RepNode = RepNode->ln_Succ;
  516.  
  517.     i = 0;
  518.     while (RepNode->ln_Succ && (i<TOT_DISPLAY)) {
  519.         if (RepNode->ln_Pri)
  520.             Style[i] = &Italic ;
  521.         else
  522.             Style[i] = &Plain ;
  523.  
  524.         CopyMem(RepNode->ln_Name, listetext[i].IText, strlen(RepNode->ln_Name)+1);
  525.         l = (long)frwin.textfit(listetext[i].IText,
  526.                 strlen(listetext[i].IText), &te, NULL, 1,
  527.                  WIDTHSEL, FONTHEIGHT) ;
  528.         listetext[i].IText[l] = '\0' ;
  529.         i++ ;
  530.         RepNode = RepNode->ln_Succ;
  531.     }
  532.  
  533.     while (i<TOT_DISPLAY) {
  534.         listetext[i++].IText[0] = '\0' ;
  535.     }
  536.  
  537.     for (i=0 ; i<TOT_DISPLAY; i++) {
  538.         listetext[i].ITextFont = Style[i] ;
  539.         listetext[i].FrontPen =  (unsigned char)(((i+topentry) == numsel)?bpen:fpen) ;
  540.         listetext[i].BackPen =  (unsigned char)(((i+topentry) == numsel)?fpen:bpen) ;
  541.     }
  542.     frwin.setapen(frwin.ws->xpens[GFILL_PEN]) ;
  543.     frwin.rectfill(LEFTSEL, TOPSEL, LEFTSEL+WIDTHSEL-1, TOPSEL+HEIGHTSEL-1) ;
  544.     frwin.printitext(listetext, 0, 0) ;
  545. }
  546.  
  547. void devlist(void)
  548. {
  549. DosList *dol ;
  550.  
  551.     dol = LockDosList(LDF_VOLUMES|LDF_ASSIGNS|LDF_READ) ;
  552.     dol = NextDosEntry(dol, LDF_VOLUMES|LDF_ASSIGNS|LDF_READ) ;
  553.  
  554.     freelist();
  555.     initlist();
  556.     nbfics=0;
  557.     while (dol)
  558.     {
  559.         if ((dol->dol_Type != DLT_DEVICE) || dol->dol_Task) {
  560.             bcpl2c(dol->dol_Name, name);
  561.  
  562.             RepNode = new Node ;
  563.             RepNode->ln_Name = new char[strlen(name)+1] ;
  564.             strcpy(RepNode->ln_Name,name);
  565.             if (dol->dol_Type == DLT_DIRECTORY)
  566.                 RepNode->ln_Pri = 0;
  567.             else
  568.                 RepNode->ln_Pri = 1;
  569.             sinsert(RepList, RepNode) ;
  570.             nbfics++;
  571.         }
  572.         dol = NextDosEntry(dol, LDF_VOLUMES|LDF_ASSIGNS|LDF_READ) ;
  573.     }
  574.     UnLockDosList(LDF_VOLUMES|LDF_ASSIGNS|LDF_READ) ;
  575.     topentry = 0 ;
  576.     gprop->set(topentry, -1, nbfics) ;
  577.     displayfiles();
  578. }
  579.  
  580. void bcpl2c(BSTR b, STRPTR d)
  581. {
  582. STRPTR s = (STRPTR )BADDR(b);
  583. int i ;
  584.  
  585.     i = 0 ;
  586.     while (i<s[0])
  587.         d[i++] = s[i];
  588.     d[i++]=':'; d[i] = '\0';
  589. }
  590.  
  591.  
  592. BOOL getPath(STRPTR command, STRPTR buf)
  593. {
  594. BPTR lock;
  595. BOOL Success = FALSE;
  596.  
  597.     if (lock = Lock(command, ACCESS_READ)) {
  598.         Success = (short)NameFromLock(lock, buf, 64);
  599.         UnLock(lock);
  600.     }
  601.     return(Success);
  602. }
  603.  
  604. void stripspaces(STRPTR s)
  605. {
  606. int i,j;
  607. STATIC char cop[MAXLEN];
  608.     strcpy(cop, s);
  609.     i = j = 0;
  610.     while (cop[i] && cop[i] == ' ') i++ ;
  611.     while (cop[i]) s[j++] = cop[i++] ;
  612.     s[j] = '\0';
  613.     while (j && (s[j] == ' ' || s[j] == '\0'))
  614.         j-- ;
  615.     s[j+1] = '\0' ;
  616. }
  617.  
  618. void DoKeys(IntuiMessage *msg)
  619. {
  620. LONG numchars;
  621. UBYTE buffer[] = "           ";
  622.  
  623.     numchars = DeadKeyConvert(msg, buffer, 12, 0);
  624.     if (numchars)
  625.     {
  626.         switch (buffer[0]) {
  627.         case 0x9B:
  628.             switch (buffer[1]) {
  629.             case 'A':                   // DOWN ARROW
  630.                 topentry-- ;
  631.                 numsel-- ;
  632.                 if (numsel < 0) numsel = 0 ;
  633.                 if (topentry < 0) topentry = 0 ;
  634.                 break ;
  635.             case 'B':                   // UP ARROW
  636.                 topentry++ ;
  637.                 numsel++ ;
  638.                 if (numsel >= nbfics) numsel = short(nbfics-1) ;
  639.                 if (topentry >= nbfics) topentry = long(nbfics-1) ;
  640.                 break ;
  641.             }
  642.             gprop->set(topentry, -1, -1) ;
  643.             displayfiles() ;
  644.             break ;
  645.         case 0x1B:                  // ESC
  646.             frwin.active = FALSE;
  647.             break ;
  648.         case 0x0D:                  // RETURN
  649.             frwin.okflag = TRUE ; frwin.active = FALSE ;
  650.             break ;
  651.         case 0x08:
  652.         case '/':
  653.             frwin.fparent(NULL, 0, 0) ;
  654.             break ;
  655.         }
  656.     }
  657. }
  658.  
  659.  
  660. LONG DeadKeyConvert( IntuiMessage           *msg,
  661.                      UBYTE                  *kbuffer,
  662.                      LONG                   kbsize,
  663.                      KeyMap          *kmap)
  664. {
  665. STATIC InputEvent ievent = {NULL, IECLASS_RAWKEY, 0, 0, 0};
  666.  
  667.     if (msg->Class != IDCMP_RAWKEY)
  668.         return(-2);
  669.  
  670.     ievent.ie_Code = msg->Code;
  671.     ievent.ie_Qualifier = msg->Qualifier;
  672.     ievent.ie_position.ie_addr = *((APTR*)msg->IAddress);
  673.  
  674.     return(RawKeyConvert(&ievent, (STRPTR)kbuffer, kbsize, kmap));
  675. }
  676.  
  677. void listedevs(void)
  678. {
  679.     if (Mode == DISPLAY_FILES) {
  680.         indsel = numsel = -1 ;
  681.         frwin.removeclip() ;
  682.         frwin.recessedbox(LEFTBOX-2, TOPDBOX-2, WIDTHBOX+4, HEIGHTBOX+4) ;
  683.         frwin.bevelbox(LEFTBOX-2, TOPFBOX-2, WIDTHBOX+4, HEIGHTBOX+4) ;
  684.         frwin.installclip() ;
  685.         Mode = DISPLAY_DIRS;
  686.         devlist();
  687.     }
  688.     else {
  689.         indsel = numsel = -1 ;
  690.         frwin.removeclip() ;
  691.         frwin.bevelbox(LEFTBOX-2, TOPDBOX-2, WIDTHBOX+4, HEIGHTBOX+4) ;
  692.         frwin.recessedbox(LEFTBOX-2, TOPFBOX-2, WIDTHBOX+4, HEIGHTBOX+4) ;
  693.         frwin.installclip() ;
  694.         Mode = DISPLAY_FILES;
  695.         freelist();
  696.         takefile();
  697.     }
  698. }
  699.  
  700. void selection(WORD x, WORD y)
  701. {
  702. int ind, num ;
  703. int presel ;
  704.  
  705.     if (x > LEFTSEL && y > TOPSEL && x < (LEFTSEL+WIDTHSEL) && y < (TOPSEL+HEIGHTSEL)) {
  706.         ind = (y-TOPSEL) / FONTHEIGHT ;
  707.         num = int(ind + topentry) ;
  708.         if (num>=nbfics)
  709.             return ;
  710.         presel = indsel ;
  711.         indsel = short(ind) ;
  712.         numsel = short(num) ;
  713.         if ((Style[indsel] == &Italic) &&
  714.             (Mode == DISPLAY_FILES)) {  // Répertoire sélectionné
  715.             strcpy(DTEMP, DRAWER) ;
  716.             strcpy(stemp, DRAWER) ;
  717.             AddPart(stemp, listetext[indsel].IText, MAXLEN) ;
  718.             stripspaces(stemp) ;
  719.             checkpath();
  720.             gdrawer->set(stemp) ;
  721.             DrawIcon(stemp, TOPDBOX) ;
  722.             freelist();
  723.             takefile();
  724.         }
  725.         else if (Mode == DISPLAY_DIRS) {    // Volume ou Assign sélectionné
  726.             strcpy(stemp, listetext[indsel].IText) ;
  727.             stripspaces(stemp) ;
  728.             getPath(stemp, stemp);
  729.             checkpath();
  730.             gdrawer->set(stemp) ;
  731.             frwin.removeclip() ;
  732.             frwin.bevelbox(LEFTBOX-2, TOPDBOX-2, WIDTHBOX+4, HEIGHTBOX+4) ;
  733.             frwin.recessedbox(LEFTBOX-2, TOPFBOX-2, WIDTHBOX+4, HEIGHTBOX+4) ;
  734.             frwin.installclip() ;
  735.             DrawIcon(stemp, TOPDBOX) ;
  736.             Mode = DISPLAY_FILES;
  737.             freelist();
  738.             takefile();
  739.         }
  740.         else {  // Fichier sélectionné
  741.             if (clickon && presel == indsel) {
  742.                 frwin.okflag = TRUE ;
  743.                 frwin.active = FALSE ;
  744.                 return ;
  745.             }
  746.             strcpy(stemp2, listetext[indsel].IText) ;
  747.             stripspaces(stemp2) ;
  748.             gfile->set(stemp2) ;
  749.             strcpy(comstring, DRAWER) ;
  750.             AddPart(comstring, stemp2, MAXLEN) ;
  751.             clef = Lock(comstring, ACCESS_READ) ;
  752.             if (clef) {
  753.                 Examine(clef, bloc) ;
  754.                 strcpy(comstring, bloc->fib_Comment) ;
  755.                 UnLock(clef) ;
  756.             }
  757.             else
  758.                 comstring[0] = '\0' ;
  759.             if (Saver) {
  760.                 gcom->set(comstring) ;
  761.             }
  762.             else {
  763.                 cgcom->set(comstring) ;
  764.             }
  765.             DrawIcon(stemp2, TOPFBOX) ;
  766.         }
  767.         displayfiles() ;
  768.     }
  769.     else if (x > LEFTBOX && x < (LEFTBOX+WIDTHBOX)) {
  770.         if (y>TOPDBOX && y < (TOPDBOX+HEIGHTBOX) && Mode == DISPLAY_FILES) {
  771.             listedevs() ;
  772.         }
  773.         else if (y>TOPFBOX && y < (TOPFBOX+HEIGHTBOX) && Mode == DISPLAY_DIRS) {
  774.             listedevs() ;
  775.         }
  776.     }
  777. }
  778.  
  779. void DrawIcon(STRPTR name, WORD place)
  780. {
  781. DiskObject *diskobj;
  782. Image *im ;
  783. WORD w, h ;
  784. char fname[80] ;
  785. LONG deftype ;
  786.  
  787.     frwin.setapen(0) ;
  788.     frwin.rectfill(LEFTBOX, place, LEFTBOX+WIDTHBOX, place+HEIGHTBOX) ;
  789.     if (place == TOPDBOX) {
  790.         frwin.rectfill(LEFTBOX, TOPFBOX, LEFTBOX+WIDTHBOX, TOPFBOX+HEIGHTBOX) ;
  791.         strcpy(fname, name) ;
  792.         indsel = numsel = -1 ;
  793.         deftype = WBDRAWER ;
  794.     }
  795.     else {
  796.         if (name) {
  797.             strcpy(fname, DRAWER) ;
  798.             AddPart(fname, name, MAXLEN) ;
  799.         }
  800.         else {
  801.             fname[0] = '\0' ;
  802.         }
  803.         deftype = WBPROJECT ;
  804.     }
  805.     if ((diskobj=GetDiskObject((UBYTE *)fname)) || (diskobj=GetDefDiskObject(deftype))) {
  806.        im = (Image *)diskobj->do_Gadget.GadgetRender ;
  807.         w = short(MIN(WIDTHBOX, im->Width)) ;
  808.         h = short(MIN(HEIGHTBOX, im->Height)) ;
  809.         im->LeftEdge = short((WIDTHBOX-w) / 2) ;
  810.         im->TopEdge = short((HEIGHTBOX-h) / 2) ;
  811.         im->Depth = 2 ;
  812.         DrawImage(frwin.rp, im, LEFTBOX, place) ;
  813.         FreeDiskObject(diskobj);
  814.     }
  815. }
  816.  
  817.  
  818. void sinsert(List *list, Node *node)
  819. {
  820. Node *courant, *pred ;
  821.  
  822.     if (IsListEmpty(list)) {
  823.         AddHead(list, node) ;
  824.     }
  825.     else {
  826.         courant = list->lh_Head ;
  827.         if ((courant->ln_Pri < node->ln_Pri) ||
  828.             ((courant->ln_Pri == node->ln_Pri) &&
  829.             (stricmp(courant->ln_Name, node->ln_Name) > 0))) {
  830.             AddHead(list, node) ;
  831.         }
  832.         else {
  833.             while (courant->ln_Succ && ((courant->ln_Pri > node->ln_Pri) ||
  834.                 ((courant->ln_Pri == node->ln_Pri) && (stricmp(courant->ln_Name, node->ln_Name) < 0)))) {
  835.                 pred = courant ;
  836.                 courant = courant->ln_Succ ;
  837.             }
  838.             Insert(list, node, pred) ;
  839.         }
  840.     }
  841. }
  842. @
  843.  
  844.  
  845. 1.2
  846. log
  847. @passage gprop sur la border droite de la fenêtre
  848. @
  849. text
  850. @d1 1
  851. a1 1
  852. // $Id$
  853. d124 1
  854. a124 1
  855.     if (ws->screen->ViewPort.Modes & HIRES) {
  856. d137 1
  857. a137 1
  858.     g->box( ws->screen->WBorLeft+20,
  859. d140 1
  860. a140 1
  861.             g->fontheight*2) ;
  862. d157 2
  863. a158 2
  864.     left = short((ws->width - width - ws->screen->WBorLeft-ws->screen->WBorRight) / 2) ;
  865.     top = short((ws->height - height - ws->winbarheight - ws->screen->WBorBottom) / 2) ;
  866. d179 3
  867. a181 3
  868.             addregion(LEFTBOX, TOPDBOX, WIDTHBOX, HEIGHTBOX) ;
  869.             addregion(LEFTBOX, TOPFBOX, WIDTHBOX, HEIGHTBOX) ;
  870.             addregion(LEFTSEL, TOPSEL, WIDTHSEL, HEIGHTSEL) ;
  871. d183 1
  872. a183 1
  873.                 addregion(LEFTSEL, TOPSEL+HEIGHTSEL+34, LEFTBOX+WIDTHBOX-LEFTSEL, 14) ;
  874. d195 2
  875. d198 1
  876. a198 1
  877.     Plain = Italic = *s->screen->Font ;
  878. d208 1
  879. a208 1
  880.     FONTHEIGHT = short(s->screen->Font->ta_YSize) ;
  881. d221 2
  882. a223 1
  883.     Style = new TextAttr*[TOT_DISPLAY] ;
  884. d233 1
  885. a233 1
  886.         listetext[i].ITextFont = s->screen->Font ;
  887. d235 3
  888. d241 4
  889. d248 3
  890. d252 1
  891. a252 1
  892.     frwin.installclip() ;
  893. d254 1
  894. a254 1
  895.     Mode = DISPLAY_FILES ;
  896. d256 5
  897. a260 1
  898.     indsel = numsel = -1 ;
  899. d262 1
  900. a262 5
  901.     getPath(drawer, stemp);
  902.     checkpath();
  903.     gdrawer->set(stemp) ;
  904.     DrawIcon(stemp, TOPDBOX) ;
  905.     DrawIcon(name, TOPFBOX) ;
  906. d264 1
  907. a264 1
  908.     takefile();
  909. d266 1
  910. a266 1
  911.     frwin.eventloop() ;
  912. d268 7
  913. a274 1
  914.     frwin.disposeregion() ;
  915. d276 2
  916. a277 8
  917.     freelist();
  918.     stripspaces(FILE);
  919.     strcpy(drawer, DRAWER) ;
  920.     strcpy(name, FILE) ;
  921.     if (Saver)
  922.         strcpy(comment, COMMENT) ;
  923.  
  924.     frwin.close() ;
  925. d280 1
  926. d282 1
  927. a282 1
  928.         delete listetext[i].IText ;
  929. d285 1
  930. d288 1
  931. d488 1
  932. a488 1
  933.         CopyMem(RepNode->ln_Name, listetext[i++].IText, strlen(RepNode->ln_Name)+1);
  934. d493 1
  935. d638 1
  936. a638 1
  937.     return(RawKeyConvert(&ievent, kbuffer, kbsize, kmap));
  938. d769 1
  939. a769 1
  940.     if ((diskobj=GetDiskObject(fname)) || (diskobj=GetDefDiskObject(deftype))) {
  941. @
  942.  
  943.  
  944. 1.1
  945. log
  946. @Initial revision
  947. @
  948. text
  949. @d1 1
  950. a1 1
  951.  
  952. d94 1
  953. d124 12
  954. a135 2
  955.     g->box(LEFTSEL+WIDTHSEL+4, TOPSEL, 16, HEIGHTSEL) ;
  956.     gprop = new eprop(g, WFUNC(&filesel::fprop), 0, TOT_DISPLAY, TOT_DISPLAY, LORIENT_VERT) ;
  957. d140 1
  958. a140 1
  959.             g->fontheight+4) ;
  960. d167 1
  961. @
  962.