#
#   Python GUI - Controls - Generic
#

from GUI.Properties import overridable_property
from GUI import Component

class Control(Component):
    """Abstract base class for components such as buttons, check
    boxes and text entry boxes."""

    title = overridable_property('title', "Title of the control.")
    value = overridable_property('value', "Value of the control.")
    enabled = overridable_property('enabled', "True if user can manipulate the control.")
    font = overridable_property('font')
    color = overridable_property('color')
    just = overridable_property('just', "Justification ('left', 'center' or 'right').")
    lines = overridable_property('lines',
        "Height of the control measured in lines of the current font.")
    tab_stop = overridable_property('tab_stop',
        "Whether tab key can navigate into this control.")
    
    _vertical_padding = 0 # Extra height to add when setting 'lines' property
    _default_tab_stop = True
    _user_tab_stop_override = True
    
    def __init__(self, font = None, lines = None, **kwds):
        Component.__init__(self, **kwds)
        #  If font and lines are both specified, must set font first.
        if font:
            self.font = font
        if lines is not None:
            self.lines = lines
    
    def get_lines(self):
        return int(round((self.height - self._vertical_padding) / self.font.line_height))
    
    def set_lines(self, num_lines):
        self.height = self._calc_height(self.font, num_lines)

    def _calc_height(self, font, num_lines = 1):
        return num_lines * font.line_height + self._vertical_padding

    def _is_targetable(self):
        return self.enabled
            