# (C) Copyright 2004-2021 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!

#-------------------------------------------------------------------------
#  Imports:
#-------------------------------------------------------------------------

import wx

from traits.api \
    import Trait, HasTraits, Str, Int, Range, List, Event, File, Directory, \
    Bool, Enum

from traitsui.api \
    import View, Handler, Item, CheckListEditor, ButtonEditor, FileEditor, \
    DirectoryEditor, ImageEnumEditor, Color, Font

#-------------------------------------------------------------------------
#  Constants:
#-------------------------------------------------------------------------

origin_values = ['top left', 'top right', 'bottom left', 'bottom right']

#-------------------------------------------------------------------------
#  'Instance' class:
#-------------------------------------------------------------------------


class Instance(HasTraits):

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

    integer_text = Int(1)
    enumeration = Enum('one', 'two', 'three', 'four', 'five', 'six',
                       cols=3)
    float_range = Range(0.0, 10.0, 10.0)
    int_range = Range(1, 5)
    boolean = Bool(True)

    view = View('integer_text', 'enumeration', 'float_range',
                'int_range', 'boolean')

#-------------------------------------------------------------------------
#  'TraitsTest' class
#-------------------------------------------------------------------------


class TraitsTest(HasTraits):

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

    integer_text = Int(1)
    enumeration = Enum('one', 'two', 'three', 'four', 'five', 'six',
                       cols=3)
    float_range = Range(0.0, 10.0, 10.0)
    int_range = Range(1, 6)
    int_range2 = Range(1, 50)
    compound = Trait(1, Range(1, 6),
                     'one', 'two', 'three', 'four', 'five', 'six')
    boolean = Bool(True)
    instance = Trait(Instance())
    color = Color
    font = Font
    check_list = List(editor=CheckListEditor(
        values=['one', 'two', 'three', 'four'],
        cols=4))
    list = List(Str, ['East of Eden', 'The Grapes of Wrath',
                      'Of Mice and Men'])
    button = Event(0, editor=ButtonEditor(label='Click'))
    file = File()
    directory = Directory()
    image_enum = Trait(editor=ImageEnumEditor(values=origin_values,
                                              suffix='_origin',
                                              cols=4,
                                              klass=Instance),
                       *origin_values)

    #-------------------------------------------------------------------------
    #  View definitions:
    #-------------------------------------------------------------------------

    view = View(
        ('|{Enum}',
         ('|<[Enumeration]', 'enumeration[Simple]', '_',
          'enumeration[Custom]@', '_',
          'enumeration[Text]*', '_',
          'enumeration[Readonly]~'),
         ('|<[Check List]', 'check_list[Simple]', '_',
          'check_list[Custom]@', '_',
          'check_list[Text]*', '_',
          'check_list[Readonly]~')
         ),
        ('|{Range}',
         ('|<[Float Range]', 'float_range[Simple]', '_',
          'float_range[Custom]@', '_',
          'float_range[Text]*', '_',
          'float_range[Readonly]~'),
         ('|<[Int Range]', 'int_range[Simple]', '_',
          'int_range[Custom]@', '_',
          'int_range[Text]*', '_',
          'int_range[Readonly]~'),
         ('|<[Int Range 2]', 'int_range2[Simple]', '_',
          'int_range2[Custom]@', '_',
          'int_range2[Text]*', '_',
          'int_range2[Readonly]~')
         ),
        ('|{Misc}',
         ('|<[Integer Text]', 'integer_text[Simple]', '_',
          'integer_text[Custom]@', '_',
          'integer_text[Text]*', '_',
          'integer_text[Readonly]~'),
         ('|<[Compound]', 'compound[Simple]', '_',
          'compound[Custom]@', '_',
          'compound[Text]*', '_',
          'compound[Readonly]~'),
         ('|<[Boolean]', 'boolean[Simple]', '_',
          'boolean[Custom]@', '_',
          'boolean[Text]*', '_',
          'boolean[Readonly]~')
         ),
        ('|{Color/Font}',
         ('|<[Color]', 'color[Simple]', '_',
          'color[Custom]@', '_',
          'color[Text]*', '_',
          'color[Readonly]~'),
         ('|<[Font]', 'font[Simple]', '_',
          'font[Custom]@', '_',
          'font[Text]*', '_',
          'font[Readonly]~')
         ),
        ('|{List}',
         ('|<[List]', 'list[Simple]', '_',
          'list[Custom]@', '_',
          'list[Text]*', '_',
          'list[Readonly]~')
         ),
        ('|{Button}',
         ('|<[Button]', 'button[Simple]', '_',
          'button[Custom]@'),
         #                                        'button[Text]*',
         #                                        'button[Readonly]~' ),
         ('|<[Image Enum]', 'image_enum[Simple]', '_',
          'image_enum[Custom]@', '_',
          'image_enum[Text]*', '_',
          'image_enum[Readonly]~'),
         ('|<[Instance]', 'instance[Simple]', '_',
          'instance[Custom]@', '_',
          'instance[Text]*', '_',
          'instance[Readonly]~'),
         ),
        ('|{File}',

         ('|<[File]', 'file[Simple]', '_',
          'file[Custom]@', '_',
          'file[Text]*', '_',
          'file[Readonly]~', ),
         ('|<[Directory]', 'directory[Simple]', '_',
          'directory[Custom]@', '_',
          'directory[Text]*', '_',
          'directory[Readonly]~')
         ),
        buttons=['Apply', 'Revert', 'Undo', 'OK']
    )

#-------------------------------------------------------------------------
#  'TraitSheetApp' class:
#-------------------------------------------------------------------------


class TraitSheetApp(wx.App):

    #-------------------------------------------------------------------------
    #  Initialize the object:
    #-------------------------------------------------------------------------

    def __init__(self, object):
        self.object = object
        wx.InitAllImageHandlers()
        wx.App.__init__(self, 1, 'debug.log')
        self.MainLoop()

    #-------------------------------------------------------------------------
    #  Handle application initialization:
    #-------------------------------------------------------------------------

    def OnInit(self):
        ui = self.object.edit_traits(kind='modal')
        ui = self.object.edit_traits(kind='wizard')
        ui = self.object.edit_traits(kind='nonmodal')
        ui = self.object.edit_traits(kind='live')
        self.SetTopWindow(ui.control)
        return True

#-------------------------------------------------------------------------
#  Main program:
#-------------------------------------------------------------------------

if __name__ == '__main__':
    TraitSheetApp(TraitsTest())
