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