1#  Copyright (c) 2007, Enthought, Inc.
2#  License: BSD Style.
3
4# tree_editor.py -- Example of a tree editor
5
6# --[Imports]--------------------------------------------------------------
7
8from traits.api \
9    import HasTraits, Str, Regex, List, Instance
10from traitsui.api \
11    import TreeEditor, TreeNode, View, Item, VSplit, \
12    HGroup, Handler, Group
13from traitsui.menu \
14    import Menu, Action, Separator
15try:
16    from traitsui.wx.tree_editor \
17        import NewAction, CopyAction, CutAction, \
18        PasteAction, DeleteAction, RenameAction
19except RuntimeError:
20    from traitsui.qt4.tree_editor \
21        import NewAction, CopyAction, CutAction, \
22        PasteAction, DeleteAction, RenameAction
23# --[Code]-----------------------------------------------------------------
24
25# DATA CLASSES
26
27
28class Employee(HasTraits):
29    name = Str('<unknown>')
30    title = Str()
31    phone = Regex(regex=r'\d\d\d-\d\d\d\d')
32
33    def default_title(self):
34        self.title = 'Senior Engineer'
35
36
37class Department(HasTraits):
38    name = Str('<unknown>')
39    employees = List(Employee)
40
41
42class Company(HasTraits):
43    name = Str('<unknown>')
44    departments = List(Department)
45    employees = List(Employee)
46
47
48class Owner(HasTraits):
49    name = Str('<unknown>')
50    company = Instance(Company)
51
52# INSTANCES
53
54
55jason = Employee(
56    name='Jason',
57    title='Engineer',
58    phone='536-1057')
59
60mike = Employee(
61    name='Mike',
62    title='Sr. Marketing Analyst',
63    phone='536-1057')
64
65dave = Employee(
66    name='Dave',
67    title='Sr. Engineer',
68    phone='536-1057')
69
70susan = Employee(
71    name='Susan',
72    title='Engineer',
73    phone='536-1057')
74
75betty = Employee(
76    name='Betty',
77    title='Marketing Analyst')
78
79owner = Owner(
80    name='wile',
81    company=Company(
82        name='Acme Labs, Inc.',
83        departments=[
84            Department(
85                name='Marketing',
86                employees=[mike, betty]
87            ),
88            Department(
89                name='Engineering',
90                employees=[dave, susan, jason]
91            )
92        ],
93        employees=[dave, susan, mike, betty, jason]
94    )
95)
96
97# View for objects that aren't edited
98no_view = View()
99
100# Actions used by tree editor context menu
101
102def_title_action = Action(name='Default title',
103                          action='object.default')
104
105dept_action = Action(
106    name='Department',
107    action='handler.employee_department(editor,object)')
108
109# View used by tree editor
110employee_view = View(
111    VSplit(
112        HGroup('3', 'name'),
113        HGroup('9', 'title'),
114        HGroup('phone'),
115        id='vsplit'),
116    id='traits.doc.example.treeeditor',
117    dock='vertical')
118
119
120class TreeHandler(Handler):
121
122    def employee_department(self, editor, object):
123        dept = editor.get_parent(object)
124        print('%s works in the %s department.' % (object.name, dept.name))
125
126
127# Tree editor
128tree_editor = TreeEditor(
129    nodes=[
130        TreeNode(node_for=[Company],
131                 auto_open=True,
132                 children='',
133                 label='name',
134                 view=View(Group('name',
135                                 orientation='vertical',
136                                 show_left=True))),
137        TreeNode(node_for=[Company],
138                 auto_open=True,
139                 children='departments',
140                 label='=Departments',
141                 view=no_view,
142                 add=[Department]),
143        TreeNode(node_for=[Company],
144                 auto_open=True,
145                 children='employees',
146                 label='=Employees',
147                 view=no_view,
148                 add=[Employee]),
149        TreeNode(node_for=[Department],
150                 auto_open=True,
151                 children='employees',
152                 label='name',
153                 menu=Menu(NewAction,
154                           Separator(),
155                           DeleteAction,
156                           Separator(),
157                           RenameAction,
158                           Separator(),
159                           CopyAction,
160                           CutAction,
161                           PasteAction),
162                 view=View(Group('name',
163                                 orientation='vertical',
164                                 show_left=True)),
165                 add=[Employee]),
166        TreeNode(node_for=[Employee],
167                 auto_open=True,
168                 label='name',
169                 menu=Menu(NewAction,
170                           Separator(),
171                           def_title_action,
172                           dept_action,
173                           Separator(),
174                           CopyAction,
175                           CutAction,
176                           PasteAction,
177                           Separator(),
178                           DeleteAction,
179                           Separator(),
180                           RenameAction),
181                 view=employee_view)
182    ]
183)
184# The main view
185view = View(
186    Group(
187        Item(
188            name='company',
189            id='company',
190            editor=tree_editor,
191            resizable=True),
192        orientation='vertical',
193        show_labels=True,
194        show_left=True, ),
195    title='Company Structure',
196    id='traitsui.tests.tree_editor_test',
197    dock='horizontal',
198    drop_class=HasTraits,
199    handler=TreeHandler(),
200    buttons=['Undo', 'OK', 'Cancel'],
201    resizable=True,
202    width=.3,
203    height=.3)
204
205if __name__ == '__main__':
206    owner.configure_traits(view=view)
207