#
#  PreferencesPanelController.py
#  ControlledPreferences
#
#  Converted by u.fiedler on 04.02.05.
#  with great help from Bob Ippolito - Thank you Bob!
#
#  The original version was written in Objective-C by Malcolm Crawford
#  at http://homepage.mac.com/mmalc/CocoaExamples/controllers.html


from FontNameToDisplayNameTransformer import FontNameToDisplayNameTransformer
from Foundation import *
from AppKit import *
from PyObjCTools.KeyValueCoding import *

class PreferencesPanelController (NSWindowController):
        
    @objc.IBAction
    def changeTextFont_(self, sender):
        "The user changed the current font selection, so update the default font"
        
        # Get font name and size from user defaults
        defaults = NSUserDefaultsController.sharedUserDefaultsController().values()
        fontName = getKey(defaults, u'FontName')
        fontSize = getKey(defaults, u'FontSize')
        
        # Create font from name and size; initialize font panel
        font = NSFont.fontWithName_size_(fontName, fontSize)
        if font is None:
            font = NSFont.systemFontOfSize_(NSFont.systemFontSize())
        NSFontManager.sharedFontManager().setSelectedFont_isMultiple_(font, False)
        NSFontManager.sharedFontManager().orderFrontFontPanel_(self)
        
        # Set window as firstResponder so we get changeFont: messages
        self.window().makeFirstResponder_(self.window())
    
		
    @objc.IBAction
    def changeFont_(self, sender):
        "This is the message the font panel sends when a new font is selected"
        # Get selected font
        fontManager = NSFontManager.sharedFontManager()
        selectedFont = fontManager.selectedFont()
        if selectedFont is None:
            selectedFont = NSFont.systemFontOfSize_(NSFont.systemFontSize())
        panelFont = fontManager.convertFont_(selectedFont)
        
        # Get and store details of selected font
        # Note: use fontName, not displayName.  The font name identifies the font to
        # the system, we use a value transformer to show the user the display name
        fontSize = panelFont.pointSize()
        
        defaults = NSUserDefaultsController.sharedUserDefaultsController().values()
        defaults.setValue_forKey_(panelFont.fontName(), u"FontName")
        defaults.setValue_forKey_(fontSize, u"FontSize")


"""
Set up initial values for defaults:
Create dictionary with keys and values for WordOfTheDay, FontName,
FontSize, and FavoriteColor.  Mostly straightforward, but:

Store the fontName of the font as the default; the textfield displays
the font's displayName using a value transformer.

The color must be archived -- you can't store NSColors directly in NSUserDefaults.
"""

dictionary = {}
dictionary[u'WordOfTheDay'] = u'Today'
systemFont = NSFont.systemFontOfSize_(NSFont.systemFontSize())
dictionary[u"FontName"] = systemFont.fontName()
dictionary[u"FontSize"] = systemFont.pointSize()
archivedColor = NSArchiver.archivedDataWithRootObject_(NSColor.greenColor())
dictionary[u'FavoriteColor'] = archivedColor
NSUserDefaultsController.sharedUserDefaultsController().setInitialValues_(dictionary)

# Create and register font name value transformer
transformer = FontNameToDisplayNameTransformer.alloc().init()
NSValueTransformer.setValueTransformer_forName_(transformer, u'FontNameToDisplayNameTransformer')
