home *** CD-ROM | disk | FTP | other *** search
/ The Best of Mecomp Multimedia 2 / MECOMP-CD-II.iso / amiga / programmieren / e / easyplugins / source / dclistview.e < prev    next >
Encoding:
Text File  |  1998-03-07  |  5.5 KB  |  171 lines

  1. OPT MODULE, PREPROCESS
  2.  
  3. MODULE 'gadtools', 'libraries/gadtools', 'devices/inputevent',
  4.        'intuition/gadgetclass', 'intuition/intuition', 'utility/tagitem',
  5.        'tools/EasyGUI', 'tools/textlen', 'tools/ctype', 'exec/nodes',
  6.        'exec/lists', 'utility'
  7.  
  8. ->define DCLIST to make EasyGUI's gadget list more readable!
  9. EXPORT CONST DCLIST=PLUGIN
  10.  
  11. EXPORT ENUM DCLV_LABEL=$FF000001,            -> [I..]
  12.   DCLV_RELX,                                 -> [I..]
  13.   DCLV_RELY,                                 -> [I..]
  14.   DCLV_LIST,                                 -> [ISG]
  15.   DCLV_CURRENT,                              -> [ISG]
  16.   DCLV_CLICK,                                -> [..G]
  17.   DCLV_TOP,                                  -> [ISG]
  18.   DCLV_DISABLED                              -> [ISG]
  19.  
  20. EXPORT OBJECT dclistview OF plugin PRIVATE
  21.   disabled
  22.   current
  23.   top
  24.   clicked
  25.   listview:PTR TO gadget
  26.   label
  27.   labelhi
  28.   relx, rely
  29.   execlist
  30.   maxnode
  31.   key
  32.   second1, micros1
  33.   second2, micros2
  34. ENDOBJECT
  35.  
  36. PROC dclistview(tags:PTR TO tagitem) OF dclistview
  37. DEF key,label
  38.   IF utilitybase
  39.     self.label:=      GetTagData(DCLV_LABEL,     NIL, tags)
  40.     self.relx :=  Max(GetTagData(DCLV_RELX,        5, tags), 5)
  41.     self.rely :=  Max(GetTagData(DCLV_RELY,        5, tags), 2)
  42.     self.execlist:=   GetTagData(DCLV_LIST,      NIL, tags)
  43.     self.maxnode:=    max_node(self.execlist)
  44.     self.current:=Max(GetTagData(DCLV_CURRENT,   NIL, tags), -1)
  45.     self.top:=    Max(GetTagData(DCLV_TOP,       NIL, tags),0)
  46.     self.disabled:=   GetTagData(DCLV_DISABLED,FALSE, tags)
  47.     IF label:=self.label
  48.       self.key:= IF (key:=InStr(label, '_'))<>-1 THEN tolower(label[key+1]) ELSE NIL
  49.       self.key:= IF isalpha(self.key) THEN self.key ELSE NIL
  50.     ENDIF
  51.     self.second1:=NIL
  52.     self.second2:=NIL
  53.     self.micros1:=NIL
  54.     self.micros2:=NIL
  55.   ELSE
  56.     Raise("util")
  57.   ENDIF
  58. ENDPROC
  59.  
  60. PROC end() OF dclistview IS EMPTY
  61.  
  62. PROC min_size(ta,fh) OF dclistview
  63.   self.labelhi:=IF self.label THEN fh+5 ELSE 0
  64. ENDPROC Max(textlen_key(self.label,ta,self.key),self.relx*fh), self.rely*fh+self.labelhi+5
  65.  
  66. PROC will_resize() OF dclistview IS (RESIZEX OR RESIZEY)
  67.  
  68. PROC gtrender(gl,vis,ta,x,y,xs,ys,w) OF dclistview HANDLE
  69.   self.listview:=CreateGadgetA(LISTVIEW_KIND,gl,
  70.                  [x,y+self.labelhi,xs,ys-self.labelhi,self.label,
  71.                      ta,0,0,vis,NIL]:newgadget,
  72.                  [GTLV_LABELS, self.execlist,
  73.                   GA_DISABLED, self.disabled,
  74.                   IF self.key THEN GT_UNDERSCORE ELSE TAG_IGNORE, "_",
  75.                   GTLV_SHOWSELECTED, NIL,
  76.                   GTLV_SELECTED, self.current,
  77.                   GTLV_TOP, self.top,
  78.                   TAG_DONE])
  79.   IF self.listview=NIL THEN Raise("dclv")
  80. EXCEPT DO
  81.   ReThrow()
  82. ENDPROC self.listview
  83.  
  84. PROC message_test(imsg:PTR TO intuimessage,win:PTR TO window) OF dclistview
  85. DEF islist=FALSE
  86. IF ((imsg.class=IDCMP_VANILLAKEY) AND Not(self.disabled)) THEN RETURN (self.key=tolower(imsg.code))
  87. IF (imsg.class=IDCMP_GADGETUP)
  88.   IF islist:= (imsg.iaddress=self.listview)
  89.     self.second2:=imsg.seconds
  90.     self.micros2:=imsg.micros
  91.   ENDIF
  92. ENDIF
  93. ENDPROC islist
  94.  
  95. PROC message_action(class,qual,code,win:PTR TO window) OF dclistview
  96. DEF newcurrent
  97. SELECT class
  98.   CASE IDCMP_VANILLAKEY
  99.     IF (qual AND (IEQUALIFIER_LSHIFT OR IEQUALIFIER_RSHIFT))
  100.       newcurrent:=Max(self.current-1, 0)
  101.     ELSE
  102.       newcurrent:=Min(self.current+1, self.maxnode)
  103.     ENDIF
  104.     IF newcurrent=self.current THEN RETURN FALSE ELSE self.current:=newcurrent
  105.     self.set(DCLV_CURRENT, self.current)
  106.   CASE IDCMP_GADGETUP
  107.     IF code=self.current
  108.       self.clicked:=(IF self.clicked THEN FALSE ELSE DoubleClick(self.second1,self.micros1,self.second2,self.micros2))
  109.     ELSE
  110.       self.current:=code
  111.     ENDIF
  112. ENDSELECT
  113.   self.second1:=self.second2
  114.   self.micros1:=self.micros2
  115.   self.second2:=NIL
  116.   self.micros2:=NIL
  117. ENDPROC TRUE
  118.  
  119. PROC set(attr, val) OF dclistview
  120.   SELECT attr
  121.     CASE DCLV_DISABLED
  122.       IF KickVersion(39)
  123.         IF self.disabled<>val
  124.           self.disabled:=val
  125.           IF visible(self) THEN
  126.             Gt_SetGadgetAttrsA(self.listview,self.gh.wnd,NIL,[GA_DISABLED,self.disabled,TAG_DONE])
  127.           self.clicked:=FALSE
  128.         ENDIF
  129.       ENDIF
  130.     CASE DCLV_LIST
  131.       self.maxnode:=max_node(val)
  132.       IF visible(self) THEN
  133.         Gt_SetGadgetAttrsA(self.listview, self.gh.wnd, NIL, [GTLV_LABELS, val, TAG_DONE])
  134.       self.execlist:=val
  135.       self.clicked:=FALSE
  136.     CASE DCLV_TOP
  137.       self.top:=Bounds(val,0,self.maxnode)
  138.       IF visible(self) THEN
  139.         Gt_SetGadgetAttrsA(self.listview, self.gh.wnd, NIL, [GTLV_TOP, self.top, TAG_DONE])
  140.     CASE DCLV_CURRENT
  141.       self.current:= Bounds(val,-1,self.maxnode)
  142.       IF visible(self) THEN
  143.         Gt_SetGadgetAttrsA(self.listview, self.gh.wnd, NIL, [GTLV_SELECTED, self.current,
  144.                                                              IF KickVersion(39) THEN GTLV_MAKEVISIBLE ELSE GTLV_TOP, Max(val,0),
  145.                                                              TAG_DONE])
  146.       self.clicked:=FALSE
  147.       RETURN self.current
  148.   ENDSELECT
  149. ENDPROC
  150.  
  151. PROC get(attr) OF dclistview
  152.   SELECT attr
  153.     CASE DCLV_LIST;     RETURN self.execlist, TRUE
  154.     CASE DCLV_CURRENT;  RETURN self.current, TRUE
  155.     CASE DCLV_TOP;      RETURN self.top, TRUE
  156.     CASE DCLV_CLICK;    RETURN self.clicked, TRUE
  157.     CASE DCLV_DISABLED; RETURN self.disabled, TRUE
  158.   ENDSELECT
  159. ENDPROC -1, FALSE
  160.  
  161. PROC visible(self:PTR TO dclistview) IS (self.listview AND self.gh.wnd)
  162.  
  163. PROC max_node(list:PTR TO lh)
  164. DEF node:PTR TO ln, i=NIL
  165.   IF list>0
  166.     node:=list.head
  167.     WHILE node:=node.succ DO INC i
  168.   ENDIF
  169. ENDPROC i
  170.  
  171.