home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 December / PCWorld_2000-12_cd.bin / Komunikace / Comanche / libplugin / plugIn.tcl < prev    next >
Text File  |  2000-11-02  |  10KB  |  387 lines

  1. # plugIn.tcl --
  2.  
  3. # plugIn --
  4. #   This class provides the basic interface that every plugin must comply
  5. # with.
  6.  
  7.  
  8. class plugIn {
  9.     method init {}
  10.     method requestXuiDocument {}
  11.     method answerXuiDocument {}
  12.     method deleteNodeRequest {}
  13.     method populateNodeRequest {}
  14. }
  15.  
  16. # plugIn::init --
  17. #    Initializes plugin. Usually here is where the plugin hooks with the 
  18. # namespace, etc. 
  19. # TO-DO: add arguments so we can optionally specify where we want to hook
  20.  
  21. body plugIn::init {} {}
  22.  
  23. # plugIn::requestXuiDocument --
  24. #    Request a XUI document from a node such as a property page, wizard etc.
  25. #
  26. # Arguments
  27. #    xuiData
  28. #
  29. #    xuiData is the standard XML structure for exchanging data with the
  30. # data section having the following elements
  31. #
  32. # type (xuiLabel):  document being requested
  33. # node (xuiNode):  node of the document
  34.  
  35.  
  36.  
  37. class basePlugIn {
  38.     inherit plugIn
  39.  
  40.     variable xuiRequestAnswer
  41.     
  42.     constructor  {} {
  43.     set xuiRequestAnswer [xuiStructure ::#auto]   
  44.     }
  45.     
  46.     method requestXuiDocument
  47.     method answerXuiDocument
  48.     method deleteNodeRequest
  49.     method populateNodeRequest
  50.  
  51.     method _registerWithNamespace {} 
  52.     method _inquiryForPropertyPages  { node } {}
  53.     method _inquiryForMenu { node } {}
  54.     method _inquiryForWizard { type node } {}
  55.     method _receivedWizard { type node } {}
  56.     method _inquiryForRightPaneContent { node } {}
  57.     method _receivedPropertyPages { node xuiPropertyPages } {}
  58.     method _executeCommand { node commandName } {}
  59.     method _deleteNodeRequest {node} {} 
  60. }
  61.  
  62. body basePlugIn::populateNodeRequest {args} {}
  63.  
  64. body basePlugIn::deleteNodeRequest {xuiData} {
  65.     set data [::plugInUtils::getDataField $xuiData] 
  66.     set node [[$data getComponentByName node] getId]
  67.     $this _deleteNodeRequest $node
  68. }
  69.  
  70. body basePlugIn::requestXuiDocument { xuiData } {
  71.     set data [::plugInUtils::getDataField $xuiData] 
  72.     set type [[$data getComponentByName docType] getValue]
  73.     set node [[$data getComponentByName node] getId]
  74.     switch -glob $type {
  75.     propertyPages {
  76.         $xuiRequestAnswer forgetComponents
  77.         foreach pp [ _inquiryForPropertyPages $node] {
  78.         $xuiRequestAnswer addComponent $pp
  79.         }
  80.         return $xuiRequestAnswer
  81.     } description {
  82.         _inquiryForRightPaneContent $node
  83.     } wizard* {
  84.           $xuiRequestAnswer forgetComponents
  85.       $xuiRequestAnswer clear
  86.       foreach pp [_inquiryForWizard $type $node] {
  87.         $xuiRequestAnswer addComponent $pp
  88.         }
  89.           return $xuiRequestAnswer
  90.     } command {
  91.       $xuiRequestAnswer forgetComponents
  92.       set commandName [[$data getComponentByName extraInfo] getValue]
  93.       foreach pp [_executeCommand $node $commandName] {
  94.         $xuiRequestAnswer addComponent $pp
  95.         }
  96.           return $xuiRequestAnswer
  97.     } default {
  98.     }
  99.     }
  100. }
  101.  
  102.  
  103. body basePlugIn::answerXuiDocument { xuiData } {
  104.     set data [::plugInUtils::getDataField $xuiData] 
  105.     set type [[$data getComponentByName docType] getValue]
  106.     set node [[$data getComponentByName node] getId]
  107.     set ppages [$data getComponentByName propertyPages] 
  108.     switch -glob $type {
  109.     propertyPages {
  110.             _receivedPropertyPages $node $ppages
  111.         return
  112.     } wizard* {
  113.            _receivedWizard $node $ppages   
  114.        } default {
  115.         return
  116.     }
  117.     }
  118. }
  119.  
  120. namespace eval ::plugInUtils:: {
  121.     variable addData
  122.     variable addStructure
  123.     variable addNode
  124.     variable addNewNode
  125.     variable addCaller
  126.  
  127.     set addData [xuiStructure ::#auto]
  128.     set addStructure [xuiStructure ::#auto]
  129.     $addStructure setName data
  130.     
  131.     set addCaller [xuiLabel ::#auto]
  132.     $addCaller setName caller
  133.  
  134.  
  135.     set addNewNode [xuiNode ::#auto]
  136.     $addNewNode setName newNode
  137.     
  138.     set addNode [xuiNode ::#auto]
  139.     $addNode setName node
  140.     
  141.     $addData addComponent $addCaller
  142.     $addData addComponent $addStructure
  143.     
  144.     $addStructure addComponent $addNode
  145.     $addStructure addComponent $addNewNode
  146.     
  147.     variable removeData
  148.     variable removeStructure
  149.     variable removeNode
  150.     variable removeCaller
  151.  
  152.     set removeData [xuiStructure ::#auto]
  153.     set removeStructure [xuiStructure ::#auto]
  154.     $removeStructure setName data
  155.     
  156.     set removeCaller [xuiLabel ::#auto]
  157.     $removeCaller setName caller
  158.  
  159.     set removeNode [xuiNode ::#auto]
  160.     $removeNode setName node
  161.     
  162.     $removeData addComponent $addCaller
  163.     $removeData addComponent $removeStructure
  164.     
  165.     $removeStructure addComponent $removeNode
  166.     
  167.     variable queryData
  168.     variable queryStructure
  169.     variable queryNode
  170.     variable queryCaller
  171.  
  172.     set queryData [xuiStructure ::#auto]
  173.     set queryStructure [xuiStructure ::#auto]
  174.     $queryStructure setName data
  175.     
  176.     set queryCaller [xuiLabel ::#auto]
  177.     $queryCaller setName caller
  178.     
  179.     set queryNode [xuiNode ::#auto]
  180.     $queryNode setName node
  181.     
  182.     $queryData addComponent $addCaller
  183.     $queryData addComponent $queryStructure
  184.     
  185.     $queryStructure addComponent $queryNode
  186. }
  187.  
  188. proc ::plugInUtils::getDataField { xuiData } {
  189.  
  190.     return [$xuiData getComponentByName data]
  191. }
  192.  
  193. proc ::plugInUtils::getCallerName { xuiData } {
  194.     return [[$xuiData getComponentByName caller] getValue]
  195. }
  196.  
  197. proc ::plugInUtils::getChildByClass { namespace parentNode name } {
  198.       variable queryNode
  199.       $queryNode setId $parentNode
  200.       foreach child [[$namespace getChildren $queryNode null] getChildren] {
  201.           if [$child doYouBelongTo $name] {
  202.           return $child
  203.       }
  204.       }
  205. }
  206.  
  207. proc ::plugInUtils::addNode { caller namespace parentNode args } {
  208.     variable addData
  209.     variable addNode
  210.     variable addNewNode
  211.     variable addCaller
  212.     array set options {\
  213.         -openIcon openFolder \
  214.         -closedIcon closedFolder \
  215.         -label {default label} \
  216.         -classes container \
  217.         -container {} \
  218.             -nodeName {} }
  219.     array set options $args
  220.     $addCaller setValue $caller
  221.     $addNode setId $parentNode
  222.     $addNewNode setClasses $options(-classes)
  223.     $addNewNode setLabel $options(-label)
  224.     $addNewNode setOpenIcon $options(-openIcon)
  225.     $addNewNode setClosedIcon $options(-closedIcon)
  226.     return [$namespace addNode $addData]
  227. }
  228.  
  229. proc ::plugInUtils::removeNode { caller namespace node } {
  230.     variable removeData
  231.     variable removeNode
  232.     variable removeCaller
  233.     $removeCaller setValue $caller
  234.     $removeNode setId $node
  235.     return [$namespace removeNode $removeData]
  236. }
  237.  
  238.  
  239.  
  240.  
  241. class nodeManagement {
  242.     
  243.     
  244.     variable namespace
  245.  
  246.  
  247.     variable plugIn
  248.  
  249.     variable nameMapping
  250.     variable containerMapping
  251.     variable childrenMapping
  252.     variable parentMapping
  253.     
  254.     variable addData
  255.     variable addStructure
  256.     variable addNode
  257.     variable addNewNode
  258.     
  259.     variable queryData
  260.     variable queryStructure
  261.     variable queryNode
  262.     variable queryNewNode
  263.  
  264.     constructor { ns pg } {
  265.     set namespace $ns
  266.     set plugIn $pg
  267.  
  268.     set queryData [xuiStructure ::#auto]
  269.     set queryStructure [xuiStructure ::#auto]
  270.     $queryStructure setName data
  271.  
  272.     set queryCaller [xuiLabel ::#auto]
  273.     $queryCaller setName caller
  274.     $queryCaller setValue $plugIn
  275.  
  276.     set queryNode [xuiNode ::#auto]
  277.     $queryNode setName node
  278.     
  279.     $queryData addComponent $queryCaller
  280.     $queryData addComponent $queryStructure
  281.     $queryStructure addComponent $queryNode  
  282.  
  283.  
  284.  
  285.  
  286.     }
  287.     
  288.     method addNode
  289.     method removeNode
  290.     method setContainer
  291.     method getNodeName
  292.     method getContainer
  293.     method getChildrenByClass
  294.     method getPlugInNodeChildren
  295.     method getPlugInNodeChildrenByNodeName
  296.     method getRootNode
  297.     method getParentNode
  298. }
  299.  
  300. body nodeManagement::setContainer { node newContainer } {
  301.     set containerMapping($node) $newContainer
  302. }
  303.  
  304. body nodeManagement::addNode { parentNode args } {
  305.     array set options {\
  306.             -openIcon openFolder \
  307.             -closedIcon closedFolder \
  308.             -label {default label} \
  309.             -classes container \
  310.             -container {} \
  311.             -nodeName {} } 
  312.     array set options $args   
  313.     set node [[eval ::plugInUtils::addNode \
  314.         $plugIn $namespace $parentNode $args ] getId]
  315.     set nameMapping($node) $options(-nodeName)
  316.     set containerMapping($node) $options(-container)
  317.     lappend childrenMapping($parentNode) $node
  318.     set childrenMapping($node) {}
  319.     set parentMapping($node) $parentNode
  320.     return $node            
  321. }
  322.  
  323. body nodeManagement::removeNode { node } {
  324.     ::plugInUtils::removeNode $plugIn $namespace $node
  325.     unset nameMapping($node) 
  326.     unset containerMapping($node)
  327.     # lsearch and remove from list of parent node
  328.     set parentNode $parentMapping($node) 
  329.     lremove childrenMapping($parentNode) $node
  330.     unset childrenMapping($node) 
  331.     unset parentMapping($node) 
  332.     return
  333. }
  334.  
  335. body nodeManagement::getContainer { node } {
  336.     return $containerMapping($node)
  337. }
  338.  
  339. body nodeManagement::getNodeName { node } {
  340.     return $nameMapping($node)
  341. }
  342.  
  343. body nodeManagement::getChildrenByClass {parentNode class} {
  344.     $queryNode setId $parentNode
  345.     set childList [$ns getChildren $queryData] 
  346. }
  347.  
  348. body nodeManagement::getParentNode { node } {
  349.     return $parentMapping($node)
  350. }
  351.  
  352. body nodeManagement::getPlugInNodeChildrenByNodeName {parentNode nodeName} {
  353.     set result {}
  354.     foreach child [ getPlugInNodeChildren $parentNode] {
  355.     if { [getNodeName $child] == $nodeName } {
  356.         lappend result $child
  357.     }
  358.     }
  359.     return $result
  360. }
  361.  
  362. body nodeManagement::getPlugInNodeChildren {parentNode} {
  363.     return $childrenMapping($parentNode)
  364. }
  365.  
  366. body nodeManagement::getRootNode {} {
  367.     return root
  368. }
  369.  
  370.  
  371.  
  372.  
  373.  
  374.  
  375.  
  376.  
  377.  
  378.  
  379.  
  380.  
  381.  
  382.  
  383.  
  384.  
  385.  
  386.  
  387.