gof/Composite/simpleComposite/jython/SimpleComposite.py

  1: #! /usr/bin/env python
  2: # coding: utf-8
  3: ## ----------------------------------------
  4: ##
  5: ## (C) Copyright 2000-2010, 小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
  6: ##
  7: ## ----------------------------------------
  8: #...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
  9: """
 10: >>> tips()
 11: 
 12: >>> ## ----------------------------------------
 13: >>> None
 14: version: #1.0.37
 15: """
 16: ## ---------------------------------------- demo: jython
 17: """
 18: _jython=/Users/sketch/book/java_useBetter_1/_jython
 19: 
 20: cd /Users/sketch/book/java_useBetter_1/gof/Composite/simpleComposite/jython/
 21: JYTHONPATH=$_jython jython -i SimpleComposite.py
 22: ============================================================
 23: Version: 2.5.0 (Release_2_5_0:6476, Jun 16 2009, 13:33:26) 
 24: Module : SimpleComposite.py
 25: Date   : Sat Sep 25 15:42:41 2010
 26: ============================================================
 27: """
 28: ## ----------------------------------------
 29: from java.awt import BorderLayout
 30: from java.awt import Color
 31: from javax.swing import JFrame
 32: from javax.swing import JLabel
 33: from javax.swing import JPanel
 34: from javax.swing import JScrollPane
 35: from javax.swing import JTree
 36: from javax.swing.border import BevelBorder
 37: from javax.swing.event import TreeSelectionListener
 38: from javax.swing.tree import DefaultMutableTreeNode
 39: from random import random
 40: 
 41: ## ----------------------------------------
 42: class EmpTree(JPanel, TreeSelectionListener):
 43: 
 44:     def __init__(self, frame):
 45:         super(self.__class__,self).__init__(
 46:             BorderLayout(),
 47:             border = BevelBorder(BevelBorder.RAISED),
 48:             )
 49:         self.makeEmployees()
 50:         self.setGUI(frame)
 51: 
 52:     ## ----------------------------------------
 53:     def setGUI(self, frame):
 54:         pane = JScrollPane()
 55:         self.add("Center", pane)
 56:         self.cost = JLabel("          ")
 57:         self.add("South", self.cost)
 58:         
 59:         def addNodes(parent, employee):
 60:             for e in employee:
 61:                 child = DefaultMutableTreeNode(e.name)
 62:                 parent.add(child)
 63:                 addNodes(child, e)
 64:                 
 65:         def loadTree(topDog):
 66:             root = DefaultMutableTreeNode(topDog.name)
 67:             tree = JTree(
 68:                 root,
 69:                 valueChanged = self,
 70:                 )
 71:             addNodes(root, topDog)
 72:             pane.viewport.add(tree)
 73:             tree.expandRow(0)
 74:             
 75:         loadTree(self.boss)
 76:         
 77:         frame.contentPane.add(self)
 78:         frame.repaint()
 79: 
 80:     ## ----------------------------------------
 81:     def makeEmployees(self):
 82:         self.boss = Employee("CEO", 200000)
 83:         
 84:         marketVP = Employee("Marketing VP", 100000)
 85:         self.boss.add(marketVP)
 86:         
 87:         prodVP = Employee("Production VP", 100000)
 88:         self.boss.add(prodVP)
 89:         
 90:         salesMgr = Employee("Sales Mgr", 50000)
 91:         marketVP.add(salesMgr)
 92:         
 93:         advMgr = Employee("Advt Mgr", 50000)
 94:         marketVP.add(advMgr)
 95:         
 96:         for i in range(5):
 97:             salesMgr.add(Employee(
 98:                 "Sales %d"%i, 30000+int*1
100: 
101:         prodMgr = Employee("Prod Mgr", 40000)
102:         prodVP.add(prodMgr)
103:         shipMgr = Employee("Ship Mgr", 35000)
104:         prodVP.add(shipMgr)
105:         
106:         for i in range(4):
107:             prodMgr.add(Employee(
108:                 "Manuf %d"%i, 25000+int*2
117:         if employee is not None:
118:             self.cost.text = str(employee.getSalaries())
119: 
120:     ## ----------------------------------------
121:     @staticmethod
122:     def open():
123:         frame = JFrame(
124:             title = "Employee tree",
125:             size = (200, 300),
126:             locationRelativeTo = None,
127:             defaultCloseOperation = JFrame.EXIT_ON_CLOSE,
128:             )
129:         EmpTree(frame)
130:         frame.visible = True
131: 
132: ## ----------------------------------------
133: class Employee:
134: 
135:     def __init__(self, name, salary):
136:         self.name = name
137:         self.salary = salary
138:         self.subordinates = []
139: 
140:     def __repr__(self):
141:         return repr(self.name)
142: 
143:     def add(self, e):
144:         self.subordinates.append(e)
145: 
146:     def __iter__(self):     # elements
147:         for e in self.subordinates:
148:             yield e
149:             
150:     def getChild(self, s):
151:         newEmp = save = None
152:         if self.name == s:
153:             return self
154:         else:
155:             found = False
156:             for newEmp in self:
157:                 if found:
158:                     newEmp = save
159:                     break
160:                 found = newEmp.name == s
161:                 if not found:
162:                     newEmp = newEmp.getChild(s)
163:                     found = newEmp != None
164:                 save = newEmp
165:             return newEmp if found else None
166: 
167:     def getSalaries(self):
168:         return reduce(
169:             lambda sum,e: sum + e.getSalaries(),
170:             self.subordinates,
171:             self.salary)
172: 
173: ## ----------------------------------------
174: from __init__ import *
175: tips = EmpTree.open
176: 
177: if __name__=='__main__':
178:     inform()
179:     testmod()
180: 
181: ## ========================================

*1:random()-0.5)*10000))) 99: advMgr.add(Employee("Secy", 20000

*2:random()-0.5)*5000))) 109: for i in range(3): 110: shipMgr.add(Employee( 111: "ShipClrk %d"%i, 20000+int((random()-0.5)*5000))) 112: 113: ## ---------------------------------------- 114: def __call__(self, event): # valueChanged 115: comp = event.path.lastPathComponent 116: employee = self.boss.getChild(str(comp