def __init__(self, proportion=0):
        """
        Construct the flags object initialized with the given proportion
        (0 by default).

        Modeled after wxSizerFlags in sizer.h file of wxWidgets.
        """
        ## theClass = 'SizerFlags'

        ## wx.RegisterFirstCallerClassName(self, theClass)

        ## Object.__init__(self)

        ## self.tsBeginClassRegistration(theClass, wx.ID_ANY)

        try:
            self.logger = wxDisplay.TheLogger
            if self.logger is None:
                self.logger = Logger()
        except AttributeError as errorCode:
            msg = "Display.TheLogger not available (%s)" % errorCode
            print(" DEBUG: %s" % msg)
            self.logger = Logger()
            self.logger.debug(msg)

        # Set Default Values
        self.ts_BorderInPixels = 0  # -1
        self.ts_Flags = 0
        self.ts_Proportion = proportion
class SizerFlags(object):
    """
    Normally, when you add an item to a sizer via wx.Sizer.Add, you have to
    specify a lot of flags and parameters which can be unwieldy. This is
    where wx.SizerFlags comes in: it allows you to specify all parameters
    using the named methods instead. For example, instead of:

    sizer.Add(ctrl, 0, wx.EXPAND | wx.ALL, 10)

    you can now write:

    sizer.AddF(ctrl, wx.SizerFlags().Expand().Border(wx.ALL, 10))

    This is more readable and also allows you to create wx.SizerFlags objects
    which can be reused for several sizer items.:

    flagsExpand = wx.SizerFlags(1)
    flagsExpand.Expand().Border(wx.ALL, 10)
    sizer.AddF(ctrl1, flagsExpand)
    sizer.AddF(ctrl2, flagsExpand)

    Note that by specification, all methods of wx.SizerFlags return the
    wx.SizerFlags object itself allowing chaining multiple method calls
    like in the examples above.
    """

    def __init__(self, proportion=0):
        """
        Construct the flags object initialized with the given proportion
        (0 by default).

        Modeled after wxSizerFlags in sizer.h file of wxWidgets.
        """
        ## theClass = 'SizerFlags'

        ## wx.RegisterFirstCallerClassName(self, theClass)

        ## Object.__init__(self)

        ## self.tsBeginClassRegistration(theClass, wx.ID_ANY)

        try:
            self.logger = wxDisplay.TheLogger
            if self.logger is None:
                self.logger = Logger()
        except AttributeError as errorCode:
            msg = "Display.TheLogger not available (%s)" % errorCode
            print(" DEBUG: %s" % msg)
            self.logger = Logger()
            self.logger.debug(msg)

        # Set Default Values
        self.ts_BorderInPixels = 0  # -1
        self.ts_Flags = 0
        self.ts_Proportion = proportion

        ## self.tsEndClassRegistration(theClass)

    # -----------------------------------------------------------------------

    ##        def __del__(self):
    ##            '''
    ##            '''
    ##            pass

    # -----------------------------------------------------------------------

    def Align(self, alignment):
        """
        Sets the item alignment

        Modeled after Align in sizer.h file of wxWidgets.
        """
        # notice that Align() replaces the current alignment flags, use
        # specific methods below such as Top(), Left() &c if you want
        # to set just the vertical or horizontal alignment

        self.ts_Flags &= ~wx.ALIGN_MASK
        self.ts_Flags |= alignment

        self.logger.wxASSERT_MSG(
            (self.ts_Flags == (self.ts_Flags & SIZER_FLAGS_MASK)),
            "Align Flags 0x%X != 0x%X." % (self.ts_Flags, self.ts_Flags & SIZER_FLAGS_MASK),
        )

        return self

    # -----------------------------------------------------------------------

    @staticmethod
    def ASSERT_VALID_SIZER_FLAGS(f):
        """
        Checks if flags value (f) is within the mask of allowed values.

        Return True is specified flag bits (f) represents a combination
        of valid sizer flag bits.
        """
        if f == (f & SIZER_FLAGS_MASK):

            valid = True

        else:

            valid = False

        return valid

    # -----------------------------------------------------------------------

    def Border(self, direction=wx.ALL, borderInPixels=-1):
        """
        Sets the border of the item in the direction(s) or sides given
        by the direction parameter. If the borderInPixels value is not
        given then the default border size (see GetDefaultBorder) will
        be used.

        Modeled after Border in sizer.h file of wxWidgets.
        """
        self.ts_Flags &= ~wx.ALL
        self.ts_Flags |= direction

        self.logger.wxASSERT_MSG(
            (self.ts_Flags == (self.ts_Flags & SIZER_FLAGS_MASK)),
            "Border Flags 0x%X != 0x%X." % (self.ts_Flags, self.ts_Flags & SIZER_FLAGS_MASK),
        )

        self.ts_BorderInPixels = borderInPixels

        return self

    # -----------------------------------------------------------------------

    def Bottom(self):
        """
        Aligns the object to the bottom of the available space, a shortcut
        for calling Align(wx.ALIGN_BOTTOM)

        Modeled after Bottom in sizer.h file of wxWidgets.
        """
        self.ts_Flags = (self.ts_Flags & ~wx.ALIGN_CENTER_VERTICAL) | wx.ALIGN_BOTTOM

        self.logger.wxASSERT_MSG(
            (self.ts_Flags == (self.ts_Flags & SIZER_FLAGS_MASK)),
            "Bottom Flags 0x%X != 0x%X." % (self.ts_Flags, self.ts_Flags & SIZER_FLAGS_MASK),
        )

        return self

    # -----------------------------------------------------------------------

    def Center(self):
        """
        Sets the centering alignment flags.

        Modeled after Center in sizer.h file of wxWidgets.
        """
        return self.Centre()

    # -----------------------------------------------------------------------

    def Centre(self):
        """
        Same as Center for those with an alternate dialect of English.

        Modeled after Centre in sizer.h file of wxWidgets.
        """
        return self.Align(wx.ALIGN_CENTER)

    # -----------------------------------------------------------------------

    def DoubleBorder(self, direction=wx.ALL):
        """
        Sets the border in the given direction to twice the default border
        size.

        Modeled after DoubleBorder in sizer.h file of wxWidgets.
        """
        self.logger.wxASSERT_MSG((direction == wx.ALL), "DoubleBorder direction 0x%X != 0x%X." % (direction, wx.ALL))

        if wx.USE_BORDER_BY_DEFAULT:

            # Can only support one border character
            return self.Border(direction, self.GetDefaultBorder())

        else:

            return self

    # -----------------------------------------------------------------------

    def DoubleHorzBorder(self):
        """
        Sets the left and right borders to twice the default border size.

        Modeled after DoubleHorzBorder in sizer.h file of wxWidgets.
        """
        if wx.USE_BORDER_BY_DEFAULT:

            # Can only support one border character
            return self.Border(wx.LEFT | wx.RIGHT, SizerFlags.GetDefaultBorder())

        else:

            return self

    # -----------------------------------------------------------------------

    def Expand(self):
        """
        Sets the wx.EXPAND flag, which will cause the item to be expanded
        to fill as much space as it is given by the sizer.

        Modeled after Expand in sizer.h file of wxWidgets.
        """
        self.ts_Flags |= wx.EXPAND

        self.logger.wxASSERT_MSG(
            (self.ts_Flags == (self.ts_Flags & SIZER_FLAGS_MASK)),
            "Expand Flags 0x%X != 0x%X." % (self.ts_Flags, self.ts_Flags & SIZER_FLAGS_MASK),
        )

        return self

    # -----------------------------------------------------------------------

    def FixedMinSize(self):
        """
        Sets the wx.FIXED_MINSIZE flag.

        Modeled after FixedMinSize in sizer.h file of wxWidgets.
        """
        self.ts_Flags |= wx.FIXED_MINSIZE

        self.logger.wxASSERT_MSG(
            (self.ts_Flags == (self.ts_Flags & SIZER_FLAGS_MASK)),
            "FixedMinSize Flags 0x%X != 0x%X." % (self.ts_Flags, self.ts_Flags & SIZER_FLAGS_MASK),
        )

        return self

    # -----------------------------------------------------------------------

    def GetBorderInPixels(self):
        """
        Returns the border value in pixels to be used in the sizer item.

        Modeled after GetBorderInPixels in sizer.h file of wxWidgets.
        """
        return self.ts_BorderInPixels

    # -----------------------------------------------------------------------

    @staticmethod
    def GetDefaultBorder():
        """
        Returns the default border size used by the other border methods

        Modeled after GetDefaultBorder in sizer.h file of wxWidgets.
        """
        if wx.USE_BORDER_BY_DEFAULT:

            return -1

        else:

            return 0

    # -----------------------------------------------------------------------

    def GetFlags(self):
        """
        Returns the flags value to be used in the sizer item.

        Modeled after GetFlags in sizer.h file of wxWidgets.
        """
        self.logger.wxASSERT_MSG(
            (self.ts_Flags == (self.ts_Flags & SIZER_FLAGS_MASK)),
            "GetFlags Flags 0x%X != 0x%X." % (self.ts_Flags, self.ts_Flags & SIZER_FLAGS_MASK),
        )

        return self.ts_Flags

    # -----------------------------------------------------------------------

    def GetProportion(self):
        """
        Returns the proportion value to be used in the sizer item.

        Modeled after GetProportion in sizer.h file of wxWidgets.
        """
        return self.ts_Proportion

    # -----------------------------------------------------------------------

    def HorzBorder(self):
        """
        Sets the left and right borders to the default border size.

        Modeled after HorzBorder in sizer.h file of wxWidgets.
        """
        if wx.USE_BORDER_BY_DEFAULT:

            return self.Border(wx.LEFT | wx.RIGHT, SizerFlags.GetDefaultBorder())

        else:

            return self

    # -----------------------------------------------------------------------

    def Left(self):
        """
        Aligns the object to the left, a shortcut for calling
        Align(wx.ALIGN_LEFT)

        Modeled after Left in sizer.h file of wxWidgets.
        """
        self.ts_Flags &= ~(wx.ALIGN_RIGHT | wx.ALIGN_CENTER_HORIZONTAL)

        self.logger.wxASSERT_MSG(
            (self.ts_Flags == (self.ts_Flags & SIZER_FLAGS_MASK)),
            "Left Flags 0x%X != 0x%X." % (self.ts_Flags, self.ts_Flags & SIZER_FLAGS_MASK),
        )

        return self

    # -----------------------------------------------------------------------

    def Proportion(self, proportion):
        """
        Sets the items proportion value.

        Modeled after Proportion in sizer.h file of wxWidgets.
        """
        self.ts_Proportion = proportion

        return self

    # -----------------------------------------------------------------------

    def ReserveSpaceEvenIfHidden(self):
        """
        Makes the item ignore windows visibility status

        Modeled after ReserveSpaceEvenIfHidden in sizer.h file of wxWidgets.
        """
        self.ts_Flags |= wx.RESERVE_SPACE_EVEN_IF_HIDDEN

        self.logger.wxASSERT_MSG(
            (self.ts_Flags == (self.ts_Flags & SIZER_FLAGS_MASK)),
            "ReserveSpaceEvenIfHidden Flags 0x%X != 0x%X." % (self.ts_Flags, self.ts_Flags & SIZER_FLAGS_MASK),
        )

        return self

    # -----------------------------------------------------------------------

    def Right(self):
        """
        Aligns the object to the right, a shortcut for calling
        Align(wx.ALIGN_RIGHT)

        Modeled after Right in sizer.h file of wxWidgets.
        """
        self.ts_Flags = self.ts_Flags & ~wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_RIGHT

        self.logger.wxASSERT_MSG(
            (self.ts_Flags == (self.ts_Flags & SIZER_FLAGS_MASK)),
            "Right Flags 0x%X != 0x%X." % (self.ts_Flags, self.ts_Flags & SIZER_FLAGS_MASK),
        )

        return self

    # -----------------------------------------------------------------------

    def Shaped(self):
        """
        Sets the wx.SHAPED flag.

        Modeled after Shaped in sizer.h file of wxWidgets.
        """
        self.ts_Flags |= wx.SHAPED

        self.logger.wxASSERT_MSG(
            (self.ts_Flags == (self.ts_Flags & SIZER_FLAGS_MASK)),
            "Shaped Flags 0x%X != 0x%X." % (self.ts_Flags, self.ts_Flags & SIZER_FLAGS_MASK),
        )

        return self

    # -----------------------------------------------------------------------

    def Top(self):
        """
        Aligns the object to the top of the available space, a shortcut
        for calling Align(wx.ALIGN_TOP)

        Modeled after Top in sizer.h file of wxWidgets.
        """
        self.ts_Flags &= ~(wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_VERTICAL)

        self.logger.wxASSERT_MSG(
            (self.ts_Flags == (self.ts_Flags & SIZER_FLAGS_MASK)),
            "Top Flags 0x%X != 0x%X." % (self.ts_Flags, self.ts_Flags & SIZER_FLAGS_MASK),
        )

        return self

    # -----------------------------------------------------------------------

    def TripleBorder(self, direction=wx.ALL):
        """
        Sets the border in the given direction to three times the default
        border size.

        Modeled after TripleBorder in sizer.h file of wxWidgets.
        """
        self.logger.wxASSERT_MSG(
            (self.ts_Flags == (self.ts_Flags & SIZER_FLAGS_MASK)),
            "TripleBorder Flags 0x%X != 0x%X." % (self.ts_Flags, self.ts_Flags & SIZER_FLAGS_MASK),
        )

        if wx.USE_BORDER_BY_DEFAULT:

            # Can only support one border character
            return self.Border(direction, SizerFlags.GetDefaultBorder())

        else:

            return self

    # -----------------------------------------------------------------------
    # Begin tsWx API Extensions

    def tsGetBorderCharacterDimensions(self, thickness):
        """
        Return width and height of border character in pixels.

        Parameter:

        thickness --- Border line thickness in pixels.
        """
        if thickness == -1:

            if wx.USE_BORDER_BY_DEFAULT:

                # Default (1-pixel) border required.
                dimensions = wxSize(wx.pixelWidthPerCharacter, wx.pixelHeightPerCharacter)
            else:

                # No border required.
                dimensions = wxSize(0, 0)

        elif thickness == 0:

            # No border required.
            dimensions = wxSize(0, 0)

        else:

            # Override thickness and apply default (1-pixel) border.
            dimensions = wxSize(
                min(1, thickness) * wx.pixelWidthPerCharacter, min(1, thickness) * wx.pixelHeightPerCharacter
            )

        return dimensions