#----------------------------------------------------------------------
# Name:        SizersView.py
# Purpose:     Designer for sizer objects
#
# Author:      Riaan Booysen
#
# Created:     2003
# RCS-ID:      $Id: SizersView.py,v 1.9 2007/07/02 15:01:16 riaan Exp $
# Copyright:   (c) 2003 - 2007 Riaan Booysen
# Licence:     GPL
#----------------------------------------------------------------------
print 'importing Views.SizersView'

import os, copy

import wx

import Preferences, Utils
from Utils import _

import sourceconst
import PaletteMapping, PaletteStore, Help

from InspectableViews import DesignerError
from DataView import DataView
import ObjCollection

class SizersView(DataView):
    viewName = 'Sizers'
    viewTitle = _('Sizers')
    
    collectionMethod = sourceconst.init_sizers
    def __init__(self, parent, inspector, model, compPal, designer):
        DataView.__init__(self, parent, inspector, model, compPal)
        designer.initSizers(self)

        self.sizerConnectList = []

##    def layoutSizers(self):
##        objs = self.objectOrder[:]
##        objs.reverse()
##        for name in objs:
##            self.objects[name][1].Layout()

    def recreateSizers(self):
        # disconnect controls from sizers
        for prop in self.sizerConnectList:
            ctrl = self.controllerView.objects[prop.comp_name][1]
            ctrl.SetSizer(None)

        # build and delete list of sizers that are not owned by other sizers
        delLst = []
        for itemInfo in self.objects.values():
            sizer = itemInfo[1]
            if not hasattr(sizer, '_sub_sizer'):
                delLst.append(sizer)
        for sizer in delLst:
            if sizer:
                sizer.Destroy()

        # remove references
        for objInfo in self.controllerView.objects.values():
            ctrl = objInfo[1]
            if hasattr(ctrl, '_in_sizer'):
                del ctrl._in_sizer
            if hasattr(ctrl, '_has_sizer'):
                del ctrl._has_sizer

        # recreate
        for sizerName in self.objectOrder:
            self.objects[sizerName][0].recreateSizer()

        for sizerName in self.objectOrder:
            self.objects[sizerName][0].recreateSizerItems()

        for prop in self.sizerConnectList:
            compn, ctrl = self.controllerView.objects[prop.comp_name][:2]
            sizer = self.objects[Utils.ctrlNameFromSrcRef(prop.params[0])][1]
            compn.SetSizer(sizer)

    def saveCtrls(self, definedCtrls, module=None):
        collDeps = []
        self.writeSizerConnectProps(collDeps)
        DataView.saveCtrls(self, definedCtrls, module, collDeps=collDeps)

    def checkSizerConnectRename(self, oldName, newName):
        srOldName = Utils.srcRefFromCtrlName(oldName)
        srNewName = Utils.srcRefFromCtrlName(newName)
        for prop in self.sizerConnectList:
            if prop.params[0] == srOldName:
                prop.params[0] = srNewName

    def checkCollectionRename(self, oldName, newName, companion=None):
        for objInfo in self.objects.values():
            cmp = objInfo[0]
            if cmp != companion and cmp.collections.has_key('Items'):
                collEditView = cmp.collections['Items']
                objColl = self.model.objectCollections[
                      collEditView.collectionMethod]
                objColl.renameCtrl(oldName, newName)

    def designerRenameNotify(self, oldName, newName):
        for prop in self.sizerConnectList:
            if prop.comp_name == oldName:
                prop.comp_name = newName

        self.checkCollectionRename(oldName, newName)


    def writeSizerConnectProps(self, output, stripFrmId=''):
        from Companions import BaseCompanions
        writerDTC = BaseCompanions.DesignTimeCompanion('SizerWriter', self)
        for prop in self.sizerConnectList:
            writerDTC.addContinuedLine(sourceconst.bodyIndent+prop.asText(stripFrmId),
                  output, sourceconst.bodyIndent)

    def initObjectsAndCompanions(self, creators, objColl, dependents, depLinks):
        DataView.initObjectsAndCompanions(self, creators, objColl, dependents, depLinks)

        for ctrlName in objColl.propertiesByName.keys():
            for prop in objColl.propertiesByName[ctrlName]:
                if prop.prop_setter == 'SetSizer':
                    compn, ctrl = self.controllerView.objects[ctrlName][:2]
                    sizer = self.objects[Utils.ctrlNameFromSrcRef(prop.params[0])][1]
                    compn.SetSizer(sizer)
                    self.sizerConnectList.append(prop)


    def deleteCtrl(self, name, parentRef = None):
        DataView.deleteCtrl(self, name, parentRef)

        srName = Utils.srcRefFromCtrlName(name)
        for prop in self.sizerConnectList[:]:
            if prop.params[0] == srName:
                compn, ctrl = self.controllerView.objects[prop.comp_name][:2]
                ctrl.SetSizer(None)
                ctrl.Refresh()
                self.sizerConnectList.remove(prop)

        wx.CallAfter(self.recreateSizers)
        wx.CallAfter(self.controllerView.OnRelayoutDesigner, None)#Refresh()

