1"""Incremental demo for wx support of tasks.
2
3Multiple tasks
4
5Note that naively subclassing SecondTask from ExampleTask, it initially used
6the same menu_bar and tool_bars traits from ExampleTask.  This caused the
7incorrect tying of the controls to SecondTask because the class attributes
8were shared between both classes.
9"""
10
11from pyface.api import (
12    GUI,
13    ConfirmationDialog,
14    FileDialog,
15    ImageResource,
16    YES,
17    OK,
18    CANCEL,
19)
20from pyface.tasks.api import (
21    Task,
22    TaskWindow,
23    TaskLayout,
24    PaneItem,
25    IEditor,
26    IEditorAreaPane,
27    EditorAreaPane,
28    Editor,
29    DockPane,
30    HSplitter,
31    VSplitter,
32)
33from pyface.tasks.action.api import (
34    DockPaneToggleGroup,
35    SMenuBar,
36    SMenu,
37    SToolBar,
38    TaskAction,
39    TaskToggleGroup,
40)
41from traits.api import on_trait_change, Property, Instance
42
43
44class Pane1(DockPane):
45    # TaskPane interface ---------------------------------------------------
46
47    id = "steps.pane1"
48    name = "Pane 1"
49
50
51class Pane2(DockPane):
52    # TaskPane interface ---------------------------------------------------
53
54    id = "steps.pane2"
55    name = "Pane 2"
56
57
58class Pane3(DockPane):
59    # TaskPane interface ---------------------------------------------------
60
61    id = "steps.pane3"
62    name = "Pane 3"
63
64
65class Pane4(DockPane):
66    # TaskPane interface ---------------------------------------------------
67
68    id = "steps.pane4"
69    name = "Pane 4"
70
71
72class Pane5(DockPane):
73    # TaskPane interface ---------------------------------------------------
74
75    id = "steps.pane5"
76    name = "Pane 5"
77
78
79class Pane6(DockPane):
80    # TaskPane interface ---------------------------------------------------
81
82    id = "steps.pane6"
83    name = "Pane 6"
84
85
86class Pane7(DockPane):
87    # TaskPane interface ---------------------------------------------------
88
89    id = "steps.pane7"
90    name = "Pane 7"
91
92
93class ExampleTask(Task):
94    """ A simple task for opening a blank editor.
95    """
96
97    # Task interface -------------------------------------------------------
98
99    id = "example.example_task"
100    name = "Multi-Tab Editor"
101
102    active_editor = Property(
103        Instance(IEditor), depends_on="editor_area.active_editor"
104    )
105
106    editor_area = Instance(IEditorAreaPane)
107
108    menu_bar = SMenuBar(
109        SMenu(
110            TaskAction(name="New", method="new", accelerator="Ctrl+N"),
111            id="File",
112            name="&File",
113        ),
114        SMenu(
115            DockPaneToggleGroup(), TaskToggleGroup(), id="View", name="&View"
116        ),
117    )
118
119    tool_bars = [
120        SToolBar(
121            TaskAction(
122                method="new",
123                tooltip="New file",
124                image=ImageResource("document_new"),
125            ),
126            image_size=(32, 32),
127        )
128    ]
129
130    # ------------------------------------------------------------------------
131    # 'Task' interface.
132    # ------------------------------------------------------------------------
133
134    def _default_layout_default(self):
135        return TaskLayout(
136            top=HSplitter(
137                PaneItem("steps.pane1"),
138                PaneItem("steps.pane2"),
139                PaneItem("steps.pane3"),
140            )
141        )
142
143    def create_central_pane(self):
144        """ Create the central pane: the script editor.
145        """
146        self.editor_area = EditorAreaPane()
147        return self.editor_area
148
149    def create_dock_panes(self):
150        """ Create the file browser and connect to its double click event.
151        """
152        return [Pane1(), Pane2(), Pane3()]
153
154    # ------------------------------------------------------------------------
155    # 'ExampleTask' interface.
156    # ------------------------------------------------------------------------
157
158    def new(self):
159        """ Opens a new empty window
160        """
161        editor = Editor()
162        self.editor_area.add_editor(editor)
163        self.editor_area.activate_editor(editor)
164        self.activated()
165
166    # Trait property getter/setters ----------------------------------------
167
168    def _get_active_editor(self):
169        if self.editor_area is not None:
170            return self.editor_area.active_editor
171        return None
172
173
174class SecondTask(ExampleTask):
175    """ A simple task for opening a blank editor.
176    """
177
178    # Task interface -------------------------------------------------------
179
180    id = "example.second_task"
181    name = "Second Multi-Tab Editor"
182
183    menu_bar = SMenuBar(
184        SMenu(
185            TaskAction(name="New", method="new", accelerator="Ctrl+N"),
186            id="File",
187            name="&File",
188        ),
189        SMenu(
190            DockPaneToggleGroup(), TaskToggleGroup(), id="View", name="&View"
191        ),
192    )
193
194    tool_bars = [
195        SToolBar(
196            TaskAction(
197                method="new",
198                tooltip="New file",
199                image=ImageResource("document_new"),
200            ),
201            image_size=(32, 32),
202        )
203    ]
204
205    # ------------------------------------------------------------------------
206    # 'Task' interface.
207    # ------------------------------------------------------------------------
208
209    def _default_layout_default(self):
210        return TaskLayout(
211            left=VSplitter(
212                PaneItem("steps.pane1"),
213                PaneItem("steps.pane2"),
214                PaneItem("steps.pane3"),
215            )
216        )
217
218
219def main(argv):
220    """ A simple example of using Tasks.
221    """
222    # Create the GUI (this does NOT start the GUI event loop).
223    gui = GUI()
224
225    # Create a Task and add it to a TaskWindow.
226    task1 = ExampleTask()
227    task2 = SecondTask()
228    window = TaskWindow(size=(800, 600))
229    window.add_task(task1)
230    window.add_task(task2)
231
232    # Show the window.
233    window.open()
234
235    # Start the GUI event loop.
236    gui.start_event_loop()
237
238
239if __name__ == "__main__":
240    import sys
241
242    main(sys.argv)
243