#-----------------------------------------------------------------------------
# Name:        wxPythonControllers.py
# Purpose:
#
# Author:      Riaan Booysen
#
# Created:     2002/02/09
# RCS-ID:      $Id: wxPythonControllers.py,v 1.15 2007/07/02 15:01:15 riaan Exp $
# Copyright:   (c) 2002 - 2007
# Licence:     GPL
#-----------------------------------------------------------------------------
print 'importing Models.wxPythonControllers'

import os

import Preferences, Utils, Plugins
from Preferences import keyDefs
from Utils import _

import PaletteStore

import Controllers
from Controllers import addTool
from PythonControllers import BaseAppController, ModuleController
import EditorHelper, wxPythonEditorModels
from Views import EditorViews, AppViews, Designer, DataView, SizersView

class AppController(BaseAppController):
    Model = wxPythonEditorModels.AppModel

    def afterAddModulePage(self, model):
        frmMod = self.editor.addNewPage('Frame', FrameController, model)

        frmNme = os.path.splitext(os.path.basename(frmMod.filename))[0]
        model.new(frmNme)


class BaseFrameController(ModuleController):
    DefaultViews = ModuleController.DefaultViews + [EditorViews.ExploreEventsView]

    designerBmp = 'Images/Shared/Designer.png'

    def actions(self, model):
        return ModuleController.actions(self, model) + [
              (_('Frame Designer'), self.OnDesigner, self.designerBmp, 'Designer')]

    def createModel(self, source, filename, main, saved, modelParent=None):
        return self.Model(source, filename, main, self.editor, saved, modelParent)

    def createNewModel(self, modelParent=None):
        if modelParent:
            name = self.editor.getValidName(self.Model, modelParent.absModulesPaths())
        else:
            name = self.editor.getValidName(self.Model)

        model = self.createModel('', name, name[7:-3], False, modelParent)
        model.transport = self.newFileTransport('', model.filename)

        self.activeApp = modelParent

        return model, name

    def getModelParams(self, model):
        tempComp = self.Model.Companion('', None, None)
        params = tempComp.designTimeSource()
        params['parent'] = 'prnt'
        params['id'] = Utils.windowIdentifier(model.main, '')
        params['title'] = `model.main`
        return params

    def afterAddModulePage(self, model):
        model.new(self.getModelParams(model))

        if self.activeApp and self.activeApp.data and Preferences.autoAddToApplication:
            self.activeApp.addModule(model.filename, '')

    def OnDesigner(self, event):
        self.showDesigner()

    def _cancelView(self, view, name):
        view.focus()
        view.saveOnClose = False
        view.deleteFromNotebook('Source', name)

    def _cancelDesigner(self, views):
        if views.has_key('Designer'):
            views['Designer'].saveOnClose = False
            views['Designer'].close()

        if views.has_key('Data'):
            self._cancelView(views['Data'], 'Data')

    def showDesigner(self):
        # Just show if already opened
        modulePage = self.editor.getActiveModulePage()
        model = modulePage.model
        if model.views.has_key('Designer'):
            if model.views.has_key('Data'):
                model.views['Data'].focus()
            model.views['Designer'].restore()
            return

        dataView = None
        sizersView = None
        try:
            cwd = os.getcwd()
            mwd = Utils.getModelBaseDir(model)
            if mwd and mwd.startswith('file://'): os.chdir(mwd[7:])

            try:
                # update any view modifications
                model.refreshFromViews()

                model.initModule()
                model.readComponents()

                try:
                    # add or focus data view
                    if not model.views.has_key('Data'):
                        dataView = DataView.DataView(modulePage.notebook,
                             self.editor.inspector, model, self.editor.compPalette)
                        dataView.addToNotebook(modulePage.notebook)
                        model.views['Data'] = dataView
                        dataView.initialize()
                    else:
                        dataView = model.views['Data']
                except:
                    if model.views.has_key('Data'):
                        self._cancelView(model.views['Data'], 'Data')
                    raise

                dataView.focus()
                dataView.refreshCtrl()

                try:
                    # add or focus frame designer
                    if not model.views.has_key('Designer'):
                        designer = Designer.DesignerView(self.editor,
                              self.editor.inspector, model,
                              self.editor.compPalette, model.Companion,
                              dataView)
                        model.views['Designer'] = designer
                        designer.refreshCtrl()
                except:
                    self._cancelDesigner(model.views)
                    raise

                if Preferences.dsUseSizers:
                    try:
                        # add sizer view
                        if not model.views.has_key('Sizers'):
                            sizersView = SizersView.SizersView(modulePage.notebook,
                                 self.editor.inspector, model,
                                 self.editor.compPalette, model.views['Designer'])
                            sizersView.addToNotebook(modulePage.notebook)
                            model.views['Sizers'] = sizersView
                            sizersView.initialize()
                        else:
                            sizersView = model.views['Sizers']
                    except:
                        if model.views.has_key('Sizers'):
                            self._cancelView(model.views['Sizers'], 'Sizers')
                        self._cancelDesigner(model.views)
                        raise

                    sizersView.refreshCtrl()

                # Showing triggers selection of the frame in the Inspector
                model.views['Designer'].Show()
                # Make source read only
                model.views['Source'].disableSource(True)

                self.editor.setStatus(_('Designer session started.'))

            finally:
                os.chdir(cwd)

        except Exception, error:
            self.editor.setStatus(\
                _('An error occured while opening the Designer: %s')%str(error),
                  'Error')
            self.editor.statusBar.progress.SetValue(0)
            raise

class FrameController(BaseFrameController):
    Model = wxPythonEditorModels.FrameModel

class DialogController(BaseFrameController):
    Model = wxPythonEditorModels.DialogModel

class MiniFrameController(BaseFrameController):
    Model = wxPythonEditorModels.MiniFrameModel

class MDIParentController(BaseFrameController):
    Model = wxPythonEditorModels.MDIParentModel

class MDIChildController(BaseFrameController):
    Model = wxPythonEditorModels.MDIChildModel

class PopupWindowController(BaseFrameController):
    Model = wxPythonEditorModels.PopupWindowModel
    def getModelParams(self, model):
        tempComp = self.Model.Companion('', None, None)
        params = tempComp.designTimeSource()
        params['parent'] = 'prnt'
        return params

class PopupTransientWindowController(BaseFrameController):
    Model = wxPythonEditorModels.PopupTransientWindowModel
    def getModelParams(self, model):
        tempComp = self.Model.Companion('', None, None)
        params = tempComp.designTimeSource()
        params['parent'] = 'prnt'
        return params

class FramePanelController(BaseFrameController):
    Model = wxPythonEditorModels.FramePanelModel
    def getModelParams(self, model):
        tempComp = self.Model.Companion('', None, None)
        params = tempComp.designTimeSource()
        params['parent'] = 'prnt'
        params['id'] = Utils.windowIdentifier(model.main, '')
        return params

class WizardController(DialogController):
    Model = wxPythonEditorModels.WizardModel

class PyWizardPageController(FramePanelController):
    Model = wxPythonEditorModels.PyWizardPageModel
    def getModelParams(self, model):
        tempComp = self.Model.Companion('', None, None)
        params = tempComp.designTimeSource()
        params['parent'] = 'prnt'
        return params

class WizardPageSimpleController(FramePanelController):
    Model = wxPythonEditorModels.WizardPageSimpleModel
    def getModelParams(self, model):
        tempComp = self.Model.Companion('', None, None)
        params = tempComp.designTimeSource()
        params['parent'] = 'prnt'
        return params


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

Preferences.paletteTitle = Preferences.paletteTitle +' - wxPython GUI Builder'

# this registers the class browser under Tools
import ClassBrowser
# registers resource support
import ResourceSupport

Controllers.appModelIdReg.append(wxPythonEditorModels.AppModel.modelIdentifier)

for name, Ctrlr in [
      ('wx.App', AppController),
      ('wx.Frame', FrameController),
      ('wx.Dialog', DialogController),
      ('wx.MiniFrame', MiniFrameController),
      ('wx.MDIParentFrame', MDIParentController),
      ('wx.MDIChildFrame', MDIChildController),
      ('wx.PopupWindow', PopupWindowController),
      ('wx.PopupTransientWindow', PopupTransientWindowController),
      ('wx.FramePanel', FramePanelController),
      ('wx.wizard.Wizard', WizardController),
      ('wx.wizard.PyWizardPage', PyWizardPageController),
      ('wx.wizard.WizardPageSimple', WizardPageSimpleController),
    ]:
    Plugins.registerFileType(Ctrlr, newName=name)
