home *** CD-ROM | disk | FTP | other *** search
/ The Best of Mecomp Multimedia 2 / MECOMP-CD-II.iso / amiga / programmieren / e / easyplugins / source / popmisc.e < prev    next >
Encoding:
Text File  |  1998-02-21  |  12.2 KB  |  487 lines

  1.  
  2. /*
  3.  
  4.     $VER: popmisc_plugin 1.1 (25.2.98)
  5.  
  6.     Author:         Ali Graham ($01)
  7.                     <agraham@hal9000.net.au>
  8.  
  9.     PLUGIN id:      $06
  10.  
  11.     Desc.:          Pop-up a listview containing various system entities.
  12.  
  13.     Tags:           PLA_PopMisc_ButtonText                      [ISG]
  14.                     PLA_PopMisc_StringText                      [ISG]
  15.                     PLA_PopMisc_CaseSensitive                   [ISG]
  16.                     PLA_PopMisc_RemoveDuplicates                [ISG]
  17.                     PLA_PopMisc_ListType                        [I..]
  18.                     PLA_PopMisc_ListViewX                       [I..]
  19.                     PLA_PopMisc_ListViewY                       [I..]
  20.                     PLA_PopMisc_Disabled                        [ISG]
  21.  
  22.     Values:         PLV_PopMisc_TasksList
  23.                     PLV_PopMisc_PortsList
  24.                     PLV_PopMisc_LibrariesList
  25.                     PLV_PopMisc_DevicesList
  26.                     PLV_PopMisc_ResourcesList
  27.                     PLV_PopMisc_MemNodesList
  28.  
  29. */
  30.  
  31. OPT MODULE, OSVERSION=37
  32.  
  33. ->> popmisc_plugin: modules
  34.  
  35. MODULE 'tools/easygui', 'intuition/intuition',
  36.        'graphics/text', 'intuition/gadgetclass',
  37.        'gadtools', 'libraries/gadtools',
  38.        'utility', 'utility/tagitem',
  39.        'tools/textlen'
  40.  
  41. MODULE 'exec/nodes', 'exec/execbase', 'exec/lists',
  42.        'exec/ports', 'exec/tasks', 'amigalib/lists'
  43.  
  44. MODULE 'easyplugins/dclistview'
  45.  
  46. -><
  47.  
  48. ->> popmisc_plugin: definitions
  49.  
  50. CONST NAME_LENGTH=64
  51.  
  52. EXPORT OBJECT popmisc_plugin OF plugin PRIVATE
  53.  
  54.     but_contents:PTR TO CHAR
  55.     str_contents[NAME_LENGTH]:ARRAY OF CHAR
  56.     case_sensitive
  57.     remove_duplicates
  58.     list_type
  59.     listview_x, listview_y
  60.     disabled
  61.  
  62.     but_width
  63.  
  64.     gad_str:PTR TO gadget
  65.     gad_but:PTR TO gadget
  66.  
  67.     font:PTR TO textattr
  68.  
  69.     iaddress
  70.  
  71.     list:PTR TO mlh
  72.  
  73. ENDOBJECT
  74.  
  75. OBJECT pm_node OF ln
  76.  
  77.     pm_name[NAME_LENGTH]:ARRAY OF CHAR
  78.  
  79. ENDOBJECT
  80.  
  81. -> PROGRAMMER_ID | MODULE_ID
  82. ->      $01      |   $06
  83.  
  84.  
  85. EXPORT ENUM PLA_PopMisc_ButtonText=$81006001,   ->[ISG]
  86.             PLA_PopMisc_StringText,             ->[ISG]
  87.             PLA_PopMisc_CaseSensitive,          ->[ISG]
  88.             PLA_PopMisc_RemoveDuplicates,       ->[ISG]
  89.             PLA_PopMisc_ListType,               ->[I..]
  90.             PLA_PopMisc_ListViewX,              ->[I..]
  91.             PLA_PopMisc_ListViewY,              ->[I..]
  92.             PLA_PopMisc_Disabled                ->[ISG]
  93.  
  94. EXPORT ENUM PLV_PopMisc_TasksList=0,
  95.             PLV_PopMisc_PortsList,
  96.             PLV_PopMisc_LibrariesList,
  97.             PLV_PopMisc_DevicesList,
  98.             PLV_PopMisc_ResourcesList,
  99.             PLV_PopMisc_MemNodesList
  100.  
  101. -><
  102.  
  103. /* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& */
  104.  
  105. ->> popmisc_plugin: popmisc() & end()
  106.  
  107. PROC popmisc(tags=NIL:PTR TO tagitem) OF popmisc_plugin
  108.  
  109.     DEF name:PTR TO CHAR, type
  110.  
  111.     IF utilitybase
  112.  
  113.         self.list_type      := GetTagData(PLA_PopMisc_ListType, PLV_PopMisc_TasksList, tags)
  114.  
  115.         type:=self.list_type
  116.  
  117.         SELECT type
  118.  
  119.             CASE PLV_PopMisc_TasksList;         name:='Task...'
  120.             CASE PLV_PopMisc_PortsList;         name:='Port...'
  121.             CASE PLV_PopMisc_LibrariesList;     name:='Library...'
  122.             CASE PLV_PopMisc_DevicesList;       name:='Device...'
  123.             CASE PLV_PopMisc_ResourcesList;     name:='Resource...'
  124.             CASE PLV_PopMisc_MemNodesList;      name:='MemNode...'
  125.  
  126.             DEFAULT;                            Raise("baty")
  127.  
  128.         ENDSELECT
  129.  
  130.         self.but_contents   := GetTagData(PLA_PopMisc_ButtonText, name, tags)
  131.  
  132.         AstrCopy(self.str_contents, GetTagData(PLA_PopMisc_StringText, '', tags))
  133.  
  134.         self.case_sensitive     := GetTagData(PLA_PopMisc_CaseSensitive, FALSE, tags)
  135.         self.remove_duplicates  := GetTagData(PLA_PopMisc_RemoveDuplicates, TRUE, tags)
  136.  
  137.         self.listview_x     := GetTagData(PLA_PopMisc_ListViewX, 15, tags)
  138.         self.listview_y     := GetTagData(PLA_PopMisc_ListViewY, 6, tags)
  139.  
  140.         self.disabled       := GetTagData(PLA_PopMisc_Disabled, FALSE, tags)
  141.  
  142.     ELSE
  143.  
  144.         Raise("util")
  145.  
  146.     ENDIF
  147.  
  148.     NEW self.list
  149.  
  150.     newList(self.list)
  151.  
  152. ENDPROC
  153.  
  154. PROC end() OF popmisc_plugin
  155.  
  156.     popmisc_private_clear(self)
  157.  
  158.     END self.list
  159.  
  160. ENDPROC
  161. -><
  162.  
  163. ->> popmisc_plugin: set() & get()
  164.  
  165. PROC set(attr, value) OF popmisc_plugin
  166.  
  167.     SELECT attr
  168.  
  169.         CASE PLA_PopMisc_ButtonText
  170.  
  171.             IF self.but_contents<>value
  172.  
  173.                 self.but_contents:=value
  174.  
  175.                 IF self.gad_but AND self.gh.wnd
  176.  
  177.                     Gt_SetGadgetAttrsA(self.gad_but, self.gh.wnd, NIL, [GA_TEXT, self.but_contents, TAG_DONE])
  178.  
  179.                 ENDIF
  180.  
  181.             ENDIF
  182.  
  183.         CASE PLA_PopMisc_StringText
  184.  
  185.             IF self.str_contents<>value
  186.  
  187.                 AstrCopy(self.str_contents, value)
  188.  
  189.                 IF self.gad_str AND self.gh.wnd
  190.  
  191.                     Gt_SetGadgetAttrsA(self.gad_str, self.gh.wnd, NIL, [GTST_STRING, self.str_contents, TAG_DONE])
  192.  
  193.                 ENDIF
  194.  
  195.             ENDIF
  196.  
  197.         CASE PLA_PopMisc_CaseSensitive
  198.  
  199.             IF self.case_sensitive<>value THEN self.case_sensitive:=value
  200.  
  201.         CASE PLA_PopMisc_RemoveDuplicates
  202.  
  203.             IF self.remove_duplicates<>value THEN self.remove_duplicates:=value
  204.  
  205.         CASE PLA_PopMisc_Disabled
  206.  
  207.             IF self.disabled<>value
  208.  
  209.                 self.disabled:=value
  210.  
  211.                 IF ((self.gad_str AND self.gad_but) AND self.gh.wnd)
  212.  
  213.                     Gt_SetGadgetAttrsA(self.gad_but, self.gh.wnd, NIL, [GA_DISABLED, self.disabled, TAG_DONE])
  214.                     Gt_SetGadgetAttrsA(self.gad_str, self.gh.wnd, NIL, [GA_DISABLED, self.disabled, TAG_DONE])
  215.  
  216.                 ENDIF
  217.  
  218.             ENDIF
  219.  
  220.     ENDSELECT
  221.  
  222. ENDPROC
  223.  
  224. PROC get(attr) OF popmisc_plugin
  225.  
  226.     SELECT attr
  227.  
  228.         CASE PLA_PopMisc_ButtonText;       RETURN self.but_contents, TRUE
  229.         CASE PLA_PopMisc_StringText;       RETURN self.str_contents, TRUE
  230.         CASE PLA_PopMisc_CaseSensitive;    RETURN self.case_sensitive, TRUE
  231.         CASE PLA_PopMisc_RemoveDuplicates; RETURN self.remove_duplicates, TRUE
  232.         CASE PLA_PopMisc_Disabled;         RETURN self.disabled, TRUE
  233.  
  234.     ENDSELECT
  235.  
  236. ENDPROC -1, FALSE
  237. -><
  238.  
  239. /* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& */
  240.  
  241. ->> popmisc_plugin: min_size() & will_resize()
  242. PROC min_size(ta:PTR TO textattr, fh) OF popmisc_plugin
  243.  
  244.    self.but_width:=textlen(self.but_contents,ta)+8
  245.  
  246. ENDPROC (self.but_width+(fh*8)),(fh+6)
  247.  
  248. PROC will_resize() OF popmisc_plugin IS RESIZEX
  249. -><
  250.  
  251. ->> popmisc_plugin: gtrender() & clear_render()
  252. PROC gtrender(gl, vis, ta:PTR TO textattr, x, y, xs, ys, win:PTR TO window) OF popmisc_plugin
  253.  
  254.     self.font:=ta
  255.  
  256.     self.gad_but:=CreateGadgetA(BUTTON_KIND, gl,
  257.                                 [x, y, self.but_width, ys, self.but_contents, ta, 1, 0, vis, 0]:newgadget,
  258.                                 [GA_DISABLED, self.disabled, TAG_DONE])
  259.  
  260.     self.gad_str:=CreateGadgetA(STRING_KIND, self.gad_but,
  261.                                 [x+self.but_width+1, y, xs-self.but_width, ys, NIL, ta, 2, 0, vis, 0]:newgadget,
  262.                                 [GA_DISABLED, self.disabled,
  263.                                  GTST_MAXCHARS, NAME_LENGTH,
  264.                                  GTST_STRING, self.str_contents,
  265.                                  TAG_DONE])
  266.  
  267. ENDPROC self.gad_str
  268.  
  269. PROC clear_render(win:PTR TO window) OF popmisc_plugin
  270.  
  271.     IF self.gad_str THEN AstrCopy(self.str_contents, self.gad_str.specialinfo::stringinfo.buffer)
  272.  
  273. ENDPROC
  274.  
  275. -><
  276.  
  277. ->> popmisc_plugin: message_test() & message_action()
  278. PROC message_test(imsg:PTR TO intuimessage, win:PTR TO window) OF popmisc_plugin
  279.  
  280.     IF imsg.class=IDCMP_GADGETUP
  281.  
  282.         self.iaddress:=imsg.iaddress
  283.  
  284.         RETURN (imsg.iaddress=self.gad_but) OR (imsg.iaddress=self.gad_str)
  285.  
  286.     ENDIF
  287.  
  288. ENDPROC FALSE
  289.  
  290. PROC message_action(class, qual, code, win:PTR TO window) OF popmisc_plugin
  291.  
  292.     DEF exec:PTR TO execbase, dclv:PTR TO dclistview, type,
  293.         fnode:PTR TO pm_node, node:PTR TO pm_node, sel, a,
  294.         found=FALSE
  295.  
  296.     IF self.iaddress=self.gad_but
  297.  
  298.         exec:=execbase; type:=self.list_type
  299.  
  300.         Disable()
  301.  
  302.         SELECT type
  303.  
  304.             CASE PLV_PopMisc_TasksList
  305.  
  306.                 popmisc_private_snapshot(self, exec.taskwait.head)
  307.                 popmisc_private_snapshot(self, exec.taskready.head)
  308.  
  309.             CASE PLV_PopMisc_PortsList
  310.  
  311.                 popmisc_private_snapshot(self, exec.portlist.head)
  312.  
  313.             CASE PLV_PopMisc_LibrariesList
  314.  
  315.                 popmisc_private_snapshot(self, exec.liblist.head)
  316.  
  317.             CASE PLV_PopMisc_DevicesList
  318.  
  319.                 popmisc_private_snapshot(self, exec.devicelist.head)
  320.  
  321.             CASE PLV_PopMisc_ResourcesList
  322.  
  323.                 popmisc_private_snapshot(self, exec.resourcelist.head)
  324.  
  325.             CASE PLV_PopMisc_MemNodesList
  326.  
  327.                 popmisc_private_snapshot(self, exec.memlist.head)
  328.  
  329.         ENDSELECT
  330.  
  331.         Enable()
  332.  
  333.         blockwin(self.gh)
  334.  
  335.         IF fnode:=FindName(self.list, self.str_contents)
  336.  
  337.             node:=self.list.head; a:=0
  338.  
  339.             WHILE (node<>NIL) AND (found=FALSE)
  340.  
  341.                 IF fnode=node;  found:=TRUE
  342.                 ELSE;           node:=node.succ; a:=a+1
  343.                 ENDIF
  344.  
  345.             ENDWHILE
  346.  
  347.         ENDIF
  348.  
  349.         NEW dclv.dclistview([DCLV_RELX,    self.listview_x,
  350.                             DCLV_RELY,     self.listview_y,
  351.                             DCLV_LIST,     self.list,
  352.                             DCLV_CURRENT,  (IF fnode THEN a ELSE -1),
  353.                             DCLV_TOP,      (IF fnode THEN a ELSE 0),
  354.                             TAG_DONE])
  355.  
  356.         easyguiA(NIL, [DCLIST, {popmisc_private_listclick}, dclv, TRUE],
  357.                       [EG_WTYPE,  WTYPE_NOBORDER,
  358.                        EG_SCRN,   win.wscreen,
  359.                        EG_FONT,   self.font,
  360.                        EG_LEFT,   (win.leftedge + self.x),
  361.                        EG_TOP,    (win.topedge + self.y + self.ys),
  362.                        TAG_DONE])
  363.  
  364.         sel:=dclv.get(DCLV_CURRENT)
  365.  
  366.         END dclv
  367.  
  368.         node:=self.list.head; a:=0
  369.  
  370.         WHILE node AND (a<sel)
  371.  
  372.             node:=node.succ; a:=a+1
  373.  
  374.         ENDWHILE
  375.  
  376.         IF node THEN self.set(PLA_PopMisc_StringText, node.pm_name)
  377.  
  378.         popmisc_private_clear(self)
  379.  
  380.         unblockwin(self.gh)
  381.  
  382.     ELSEIF self.iaddress=self.gad_str
  383.  
  384.         AstrCopy(self.str_contents, self.gad_str.specialinfo::stringinfo.buffer)
  385.  
  386.     ENDIF
  387.  
  388.     self.iaddress:=NIL
  389.  
  390. ENDPROC TRUE
  391. -><
  392.  
  393. /* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& */
  394.  
  395. ->> PRIVATE: clear(), snapshot() & compare()
  396. PROC popmisc_private_clear(pt:PTR TO popmisc_plugin)
  397.  
  398.     DEF node:PTR TO pm_node, tnode:PTR TO pm_node
  399.  
  400.     node:=pt.list.head
  401.  
  402.     WHILE tnode:=node.succ
  403.  
  404.         END node; node:=tnode
  405.  
  406.     ENDWHILE
  407.  
  408.     newList(pt.list)
  409.  
  410. ENDPROC
  411.  
  412. PROC popmisc_private_snapshot(pt:PTR TO popmisc_plugin, src_node:PTR TO ln)
  413.  
  414.   DEF tnode:PTR TO pm_node, node:PTR TO pm_node,
  415.       inserting, result
  416.  
  417.     WHILE src_node.succ
  418.  
  419.         NEW tnode
  420.  
  421.         AstrCopy(tnode.pm_name, src_node.name, NAME_LENGTH)
  422.         tnode.name:=tnode.pm_name
  423.  
  424.         node:=pt.list.head
  425.  
  426.         IF (popmisc_private_compare(pt, node.pm_name, tnode.pm_name)>0)
  427.  
  428.             AddHead(pt.list, tnode)
  429.  
  430.         ELSE
  431.  
  432.             inserting:=TRUE
  433.  
  434.             WHILE node.succ AND inserting
  435.  
  436.                 node:=node.succ
  437.  
  438.                 result:=popmisc_private_compare(pt, node.pm_name, tnode.pm_name)
  439.  
  440.                 IF (result=0) AND pt.remove_duplicates
  441.  
  442.                     inserting:=FALSE
  443.  
  444.                 ELSEIF (result>0)
  445.  
  446.                     Insert(pt.list, tnode, node.pred)
  447.  
  448.                     inserting:=FALSE
  449.  
  450.                 ENDIF
  451.  
  452.             ENDWHILE
  453.  
  454.             IF inserting=TRUE THEN AddTail(pt.list, tnode)
  455.  
  456.         ENDIF
  457.  
  458.         src_node:=src_node.succ
  459.  
  460.     ENDWHILE
  461.     
  462. ENDPROC
  463.  
  464. PROC popmisc_private_compare(pt:PTR TO popmisc_plugin, s:PTR TO CHAR, t:PTR TO CHAR)
  465.  
  466. ENDPROC (IF pt.case_sensitive THEN Stricmp(s, t) ELSE Strnicmp(s, t, NAME_LENGTH))
  467. -><
  468.  
  469. /* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& */
  470.  
  471. ->> PRIVATE: listclick()
  472.  
  473. PROC popmisc_private_listclick(gh:PTR TO guihandle, dclv:PTR TO dclistview)
  474.  
  475.     DEF bool=FALSE, valid=FALSE
  476.  
  477.     bool, valid:=dclv.get(DCLV_CLICK)
  478.  
  479.     IF bool AND valid THEN quitgui()
  480.  
  481. ENDPROC
  482.  
  483. -><
  484.  
  485. /* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& */
  486.  
  487.