#-----------------------------------------------------------------------------
# Name:        XMLView.py
# Purpose:
#
# Author:      Riaan Booysen
#              Based on xml tree example in wxPython demo
#
# Created:     2001/01/06
# RCS-ID:      $Id: XMLView.py,v 1.9 2005/05/18 12:47:24 riaan Exp $
# Copyright:   (c) 2001 - 2005
# Licence:     GPL
#-----------------------------------------------------------------------------

import sys

import wx

from EditorViews import EditorView


class XMLTreeView(wx.TreeCtrl, EditorView):
    viewName = 'XMLTree'
    gotoLineBmp = 'Images/Editor/GotoLine.png'

    def __init__(self, parent, model):
        id = wx.NewId()
        wx.TreeCtrl.__init__(self, parent, id)#, style=wx.TR_HAS_BUTTONS | wx.SUNKEN_BORDER)
        EditorView.__init__(self, model,
          (('Goto line', self.OnGoto, self.gotoLineBmp, ''),), 0)

        self.nodeStack = []

        self.Bind(wx.EVT_KEY_UP, self.OnKeyPressed)

        self.active = True

    def buildTree(self, parent, dict):
        for item in dict.keys():
            child = self.AppendItem(parent, item, 0)
            if len(dict[item].keys()):
                self.buildTree(child, dict[item])
            self.Expand(child)

    def refreshCtrl(self):
        self.nodeStack = [self.AddRoot('Root')]
        self.loadTree(self.model.filename)
        self.Expand(self.nodeStack[0])
        return

    # Define a handler for start element events
    def startElement(self, name, attrs ):
        name = name.encode()
        if attrs:
            if attrs.has_key('class'):
                if attrs.has_key('name'):
                    name = '%s (%s:%s)' % (name, attrs['name'], attrs['class'])
                else:
                    name = '%s (%s)' % (name, attrs['class'])
            else:
                if attrs.has_key('name'):
                    name = '%s :%s' % (name, attrs['name'])

        id = self.AppendItem(self.nodeStack[-1], name)
        self.nodeStack.append(id)

    def endElement(self,  name ):
        self.nodeStack = self.nodeStack[:-1]

    def characterData(self, data ):
        if data.strip():
            data = data.encode()
            self.AppendItem(self.nodeStack[-1], data)


    def loadTree(self, filename):
        # Create a parser

        from xml.parsers import expat
        Parser = expat.ParserCreate()

        # Tell the parser what the start element handler is
        Parser.StartElementHandler = self.startElement
        Parser.EndElementHandler = self.endElement
        Parser.CharacterDataHandler = self.characterData

        # Parse the XML File
        ParserStatus = Parser.Parse(self.model.data, 1)

    def OnGoto(self, event):
        idx  = self.GetSelection()
        if idx.IsOk():
            name = self.GetItemText(idx)
            if self.model.views.has_key('Source') and \
              self.model.getModule().classes.has_key(name):
                srcView = self.model.views['Source']
                srcView.focus()
                module = self.model.getModule()
                srcView.gotoLine(int(module.classes[name].block.start) -1)

    def OnKeyPressed(self, event):
        key = event.KeyCode()
        if key == 13:
            if self.defaultActionIdx != -1:
                self.actions[self.defaultActionIdx][1](event)

##class XMLTree(wx.TreeCtrl):
##    def __init__(self, parent, ID):
##        wx.TreeCtrl.__init__(self, parent, ID)
##        self.nodeStack = [self.AddRoot(Root)]
##
##    # Define a handler for start element events
##    def StartElement(self, name, attrs ):
##        if py2:
##            name = name.encode()
##        id = self.AppendItem(self.nodeStack[-1], name)
##        self.nodeStack.append(id)
##
##    def EndElement(self,  name ):
##        self.nodeStack = self.nodeStack[:-1]
##
##    def CharacterData(self, data ):
##        if data.strip():
##            if py2:
##                data = data.encode()
##            self.AppendItem(self.nodeStack[-1], data)
##
##
##    def LoadTree(self, filename):
##        # Create a parser
##        Parser = parsermodule.ParserCreate()
##
##        # Tell the parser what the start element handler is
##        Parser.StartElementHandler = self.StartElement
##        Parser.EndElementHandler = self.EndElement
##        Parser.CharacterDataHandler = self.CharacterData
##
##        # Parse the XML File
##        ParserStatus = Parser.Parse(open(filename,'r').read(), 1)
