# (C) Copyright 2005-2023 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!

import wx

from traits.api import *

from traitsui.api import *

from traitsui.menu import *

from traitsui.dockable_view_element import DockableViewElement

from pyface.image_resource import ImageResource

from pyface.dock.api import *

# -------------------------------------------------------------------------------
#  Global data:
# -------------------------------------------------------------------------------

# DockControl style to use:
style = "tab"

image1 = ImageResource("folder")
image2 = ImageResource("gear")

# -------------------------------------------------------------------------------
#  'AnEditor' class:
# -------------------------------------------------------------------------------


class AnEditor(HasPrivateTraits):

    # ---------------------------------------------------------------------------
    #  Trait definitions:
    # ---------------------------------------------------------------------------

    code1 = Code()
    code2 = Code()
    name = Str("Mike Noggins")
    address = Str("1313 Drury Lane")
    shell = PythonValue

    # ---------------------------------------------------------------------------
    #  Traits view definitions:
    # ---------------------------------------------------------------------------

    traits_view = View(
        VSplit(
            VGroup("code1@", "|<>"),
            VGroup("code2@", "|<>"),
            VGroup("name", "address"),
            VGroup("shell", "|{Python Shell}<>"),
            export="editor",
            show_labels=False,
        ),
        kind="subpanel",
        resizable=True,
        buttons=NoButtons,
        dock="horizontal",
    )


# -------------------------------------------------------------------------------
#  'AView' class:
# -------------------------------------------------------------------------------


class AView(HasPrivateTraits):

    # ---------------------------------------------------------------------------
    #  Trait definitions:
    # ---------------------------------------------------------------------------

    code1 = Code()
    code2 = Code()

    # ---------------------------------------------------------------------------
    #  Traits view definitions:
    # ---------------------------------------------------------------------------

    traits_view = View(
        VSplit("code1@", "code2@", show_labels=False),
        imports=["editor"],
        dock="horizontal",
        kind="subpanel",
    )


# -------------------------------------------------------------------------------
#  Creates a DockWindow as a Traits UI widget:
# -------------------------------------------------------------------------------


def create_dock_window(parent, editor):
    """ Creates a window for editing a workflow canvas.
    """
    try:
        main = DockWindow(parent).control
        view_uis = [AView().edit_traits(parent=main) for i in range(6)]
        views = [ui.control for ui in view_uis]
        edit = DockWindow(main).control
        editors = [AnEditor().edit_traits(parent=edit) for i in range(6)]
        controls = []
        for i in range(6):
            dockable = DockableViewElement(ui=editors[i])
            controls.append(
                DockControl(
                    name="Editor %d" % (i + 1),
                    image=image1,
                    closeable=True,
                    on_close=dockable.close_dock_control,
                    control=editors[i].control,
                    export="editor",
                    dockable=dockable,
                    style=style,
                )
            )
        edit_sizer = DockSizer(contents=[tuple(controls)])
        dve0 = DockableViewElement(ui=view_uis[0])
        dve1 = DockableViewElement(ui=view_uis[1])
        main_sizer = DockSizer(
            contents=[
                [
                    DockControl(
                        name="View 1",
                        image=image1,
                        closeable=True,
                        on_close=dve0.close_dock_control,
                        dockable=dve0,
                        control=views[0],
                        style=style,
                    ),
                    DockControl(
                        name="View 2",
                        image=image1,
                        closeable=True,
                        on_close=dve1.close_dock_control,
                        dockable=dve1,
                        height=400,
                        control=views[1],
                        style=style,
                    ),
                ],
                [
                    DockControl(
                        name="Editors",
                        image=image1,
                        control=edit,
                        style="fixed",
                    ),
                    [
                        DockControl(
                            name="View 3",
                            image=image2,
                            control=views[2],
                            style=style,
                        ),
                        DockControl(
                            name="View 4",
                            image=image2,
                            control=views[3],
                            style=style,
                        ),
                    ],
                ],
                [
                    DockControl(name="View 5", control=views[4], style=style),
                    DockControl(name="View 6", control=views[5], style=style),
                ],
            ]
        )
        edit.SetSizer(edit_sizer)
        main.SetSizer(main_sizer)

        return main
    except:
        import traceback

        traceback.print_exc()
        raise


# -------------------------------------------------------------------------------
#  'EnvisageDock' class:
# -------------------------------------------------------------------------------


class EnvisageDock(HasPrivateTraits):

    # ---------------------------------------------------------------------------
    #  Trait definitions:
    # ---------------------------------------------------------------------------

    dummy = Int()

    # ---------------------------------------------------------------------------
    #  Traits view definitions:
    # ---------------------------------------------------------------------------

    view = View(
        [
            Item(
                "dummy",
                resizable=True,
                editor=CustomEditor(create_dock_window),
            ),
            "|<>",
        ],
        title="Envisage DockWindow Mock-up",
        resizable=True,
        width=1.00,
        height=1.00,
        buttons=NoButtons,
    )


# -------------------------------------------------------------------------------
#  Run the test program:
# -------------------------------------------------------------------------------

if __name__ == "__main__":
    EnvisageDock().configure_traits()
