#------------------------------------------------------------------------------
#
#   Python GUI - PyObjC version
#
#   Mixin class for controls based on NSButton
#
#------------------------------------------------------------------------------

from Foundation import NSMutableDictionary, NSAttributedString
from AppKit import NSMutableParagraphStyle, NSFontAttributeName, \
    NSForegroundColorAttributeName, NSParagraphStyleAttributeName, \
    NSButton
from GUI.Utils import NSMultiClass, PyGUI_NS_EventHandler, \
    ns_set_action, ns_size_to_fit
from GUI import Control
from GUI.StdColors import black

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

class ButtonBasedControl(object):

    _ns_handle_mouse = True

    _color = None

    def _create_ns_button(self, title, font, ns_button_type, ns_bezel_style,
            padding = (0, 0)):
        ns_button = PyGUI_NSButton.alloc().init()
        ns_button.pygui_component = self
        ns_button.setButtonType_(ns_button_type)
        ns_button.setBezelStyle_(ns_bezel_style)
        ns_button.setTitle_(title)
        ns_button.setFont_(font._ns_font)
        num_lines = title.count("\n") + 1
        ns_size_to_fit(ns_button, padding = padding,
            height = font.line_height * num_lines + 5)
        ns_set_action(ns_button, 'doAction:')
        return ns_button

    def set_title(self, title):
        Control.set_title(self, title)
        self._ns_update_attributed_title()
    
    def set_font(self, font):
        Control.set_font(self, font)
        self._ns_update_attributed_title()
    
    def set_just(self, just):
        Control.set_just(self, just)
        self._ns_update_attributed_title()
    
    def get_color(self):
        if self._color:
            return self._color
        else:
            return black
    
    def set_color(self, color):
        self._color = color
        self._ns_update_attributed_title()
    
    #  There is no direct way of setting the text colour of the title;
    #  it must be done using an attributed string. But when doing
    #  this, the attributes must include the font and alignment
    #  as well. So when using a custom color, we construct a new
    #  attributed string whenever the title, font, alignment or color
    #  is changed.

    def _ns_update_attributed_title(self):
        if self._color:
            ns_button = self._ns_view
            ns_attrs = NSMutableDictionary.alloc().init()
            ns_attrs[NSFontAttributeName] = ns_button.font()
            ns_attrs[NSForegroundColorAttributeName] = self._color._ns_color
            ns_parstyle = NSMutableParagraphStyle.alloc().init()
            ns_parstyle.setAlignment_(ns_button.alignment())
            ns_attrs[NSParagraphStyleAttributeName] = ns_parstyle
            ns_attstr = NSAttributedString.alloc().initWithString_attributes_(
                ns_button.title(), ns_attrs)
            ns_button.setAttributedTitle_(ns_attstr)
    
#------------------------------------------------------------------------------

class PyGUI_NSButton(NSButton, PyGUI_NS_EventHandler):
    __metaclass__ = NSMultiClass
    __slots__ = ['pygui_component']
