diff orpg/gametree/nodehandlers/containers.py @ 0:4385a7d0efd1 grumpy-goblin

Deleted and repushed it with the 'grumpy-goblin' branch. I forgot a y
author sirebral
date Tue, 14 Jul 2009 16:41:58 -0500
parents
children 449a8900f9ac
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/orpg/gametree/nodehandlers/containers.py	Tue Jul 14 16:41:58 2009 -0500
@@ -0,0 +1,377 @@
+# Copyright (C) 2000-2001 The OpenRPG Project
+#
+#        openrpg-dev@lists.sourceforge.net
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+# --
+#
+# File: containers.py
+# Author: Chris Davis
+# Maintainer:
+# Version:
+#   $Id: containers.py,v 1.43 2007/08/08 19:17:17 digitalxero Exp $
+#
+# Description: The file contains code for the container nodehandlers
+#
+
+
+from core import *
+import wx.lib.splitter
+
+
+##########################
+##  base contiainer
+##########################
+
+class container_handler(node_handler):
+    """ should not be used! only a base class!
+    <nodehandler name='?'  module='core' class='container_handler'  />
+    """
+    def __init__(self,xml_dom,tree_node):
+        node_handler.__init__(self,xml_dom,tree_node)
+        self.load_children()
+
+    def load_children(self):
+        children = self.master_dom._get_childNodes()
+        for c in children:
+            self.tree.load_xml(c,self.mytree_node)
+
+    def check_map_aware(self, obj, evt):
+        if hasattr(obj,"map_aware") and obj.map_aware():
+            obj.on_send_to_map(evt)
+
+
+    def on_send_to_map(self, evt):
+        child = self.tree.GetFirstChild(self.mytree_node)
+        if child[0].IsOk():
+            self.traverse(child[0], self.check_map_aware, 0, evt)
+
+
+    def checkChildToMap(self, obj, evt):
+        if hasattr(obj,"map_aware") and obj.map_aware():
+            self.mapcheck = True
+
+    def checkToMapMenu(self):
+        self.mapcheck = False
+        child = self.tree.GetFirstChild(self.mytree_node)
+        if child[0].IsOk():
+            self.traverse(child[0], self.checkChildToMap, 0, self.mapcheck)
+
+        return self.mapcheck
+
+    def on_drop(self,evt):
+        drag_obj = self.tree.drag_obj
+        if drag_obj == self or self.tree.is_parent_node(self.mytree_node,drag_obj.mytree_node):
+            return
+        opt = wx.MessageBox("Add node as child?","Container Node",wx.YES_NO|wx.CANCEL)
+        if opt == wx.YES:
+            xml_dom = self.tree.drag_obj.delete()
+            xml_dom = self.master_dom.insertBefore(xml_dom,None)
+            self.tree.load_xml(xml_dom, self.mytree_node)
+            self.tree.Expand(self.mytree_node)
+        elif opt == wx.NO:
+            node_handler.on_drop(self,evt)
+
+    def gen_html(self, obj, evt):
+        self.html_str += "<p>" + obj.tohtml()
+
+    def tohtml(self):
+        self.html_str = "<table border=\"1\" ><tr><td>"
+        self.html_str += "<b>"+self.master_dom.getAttribute("name") + "</b>"
+        self.html_str += "</td></tr>\n"
+        self.html_str += "<tr><td>"
+
+        child = self.tree.GetFirstChild(self.mytree_node)
+        self.traverse(child[0], self.gen_html, 0, None)
+
+        self.html_str += "</td></tr></table>"
+        return self.html_str
+
+    def get_size_constraint(self):
+        return 2
+
+
+##########################
+## group node handler
+##########################
+class group_handler(container_handler):
+    """ group nodehandler to be used as a placeholder for other nodehandlers.
+        This handler will continue parsing child xml data.
+        <nodehandler name='?'  module='core' class='group_handler'  />
+    """
+    def __init__(self,xml_dom,tree_node):
+        container_handler.__init__(self,xml_dom,tree_node)
+
+    def load_children(self):
+        self.atts = None
+        children = self.master_dom._get_childNodes()
+        for c in children:
+            if c._get_tagName() == "group_atts":
+                self.atts = c
+            else:
+                self.tree.load_xml(c,self.mytree_node)
+        if not self.atts:
+            elem = self.xml.minidom.Element('group_atts')
+            elem.setAttribute("cols","1")
+            elem.setAttribute("border","1")
+            self.atts = self.master_dom.appendChild(elem)
+
+    def get_design_panel(self,parent):
+        return group_edit_panel(parent,self)
+
+    def on_use(self,evt):
+        return
+
+    def gen_html(self, obj, evt):
+        if self.i  not in self.tdatas:
+            self.tdatas[self.i] = ''
+        self.tdatas[self.i] += "<P>" + obj.tohtml()
+        self.i += 1
+        if self.i >= self.cols:
+            self.i = 0
+
+    def tohtml(self):
+        cols = self.atts.getAttribute("cols")
+        border = self.atts.getAttribute("border")
+        self.html_str = "<table border=\""+border+"\" ><tr><td colspan=\""+cols+"\">"
+        self.html_str += "<font size=4>"+self.master_dom.getAttribute("name") + "</font>"
+        self.html_str += "</td></tr>\n<tr>"
+
+        self.cols = int(cols)
+        self.i = 0
+        self.tdatas = {}
+
+        child = self.tree.GetFirstChild(self.mytree_node)
+        if child[0].IsOk():
+            self.traverse(child[0], self.gen_html, 0, None)
+
+        for td in self.tdatas:
+            self.html_str += "<td valign=\"top\" >" + self.tdatas[td] + "</td>\n";
+        self.html_str += "</tr></table>"
+        return self.html_str
+
+GROUP_COLS = wx.NewId()
+GROUP_BOR = wx.NewId()
+
+class group_edit_panel(wx.Panel):
+    def __init__(self, parent, handler):
+        wx.Panel.__init__(self, parent, -1)
+        self.handler = handler
+        sizer = wx.BoxSizer(wx.VERTICAL)
+        self.text = {   P_TITLE : wx.TextCtrl(self, P_TITLE, handler.master_dom.getAttribute('name'))
+                      }
+        sizer.Add(wx.StaticText(self, -1, "Title:"), 0, wx.EXPAND)
+        sizer.Add(self.text[P_TITLE], 0, wx.EXPAND)
+        sizer.Add(wx.Size(10,10))
+
+        radio_c = wx.RadioBox(self, GROUP_COLS, "Columns", choices=["1","2","3","4"])
+        cols = handler.atts.getAttribute("cols")
+        if cols != "":
+            radio_c.SetSelection(int(cols)-1)
+
+        radio_b = wx.RadioBox(self, GROUP_BOR, "Border", choices=["no","yes"])
+        border = handler.atts.getAttribute("border")
+        if border != "":
+            radio_b.SetSelection(int(border))
+
+        sizer.Add(radio_c, 0, wx.EXPAND)
+        sizer.Add(wx.Size(10,10))
+        sizer.Add(radio_b, 0, wx.EXPAND)
+
+        self.sizer = sizer
+        self.outline = wx.StaticBox(self,-1,"Group")
+        self.SetSizer(self.sizer)
+        self.SetAutoLayout(True)
+        self.Fit()
+        parent.SetSize(self.GetBestSize())
+        self.Bind(wx.EVT_TEXT, self.on_text, id=P_TITLE)
+        self.Bind(wx.EVT_RADIOBOX, self.on_radio_box, id=GROUP_BOR)
+        self.Bind(wx.EVT_RADIOBOX, self.on_radio_box, id=GROUP_COLS)
+
+    def on_radio_box(self,evt):
+        id = evt.GetId()
+        index = evt.GetInt()
+        if id == GROUP_COLS:
+            self.handler.atts.setAttribute("cols",str(index+1))
+        elif id == GROUP_BOR:
+            self.handler.atts.setAttribute("border",str(index))
+
+    def on_text(self,evt):
+        id = evt.GetId()
+        if id == P_TITLE:
+            txt = self.text[id].GetValue()
+            if txt != "":
+                self.handler.master_dom.setAttribute('name',txt)
+                self.handler.rename(txt)
+
+
+
+##########################
+## tabber node handler
+##########################
+class tabber_handler(container_handler):
+    """ <nodehandler name='?'  module='containers' class='tabber_handler'  />"""
+
+    def __init__(self,xml_dom,tree_node):
+        container_handler.__init__(self,xml_dom,tree_node)
+
+    def get_design_panel(self,parent):
+        return tabbed_panel(parent,self,1)
+
+    def get_use_panel(self,parent):
+        return tabbed_panel(parent,self,2)
+
+
+class tabbed_panel(orpgTabberWnd):
+    def __init__(self, parent, handler, mode):
+        orpgTabberWnd.__init__(self, parent, style=FNB.FNB_NO_X_BUTTON)
+        self.handler = handler
+        self.parent = parent
+        tree = self.handler.tree
+        child = tree.GetFirstChild(handler.mytree_node)
+        if child[0].IsOk():
+            handler.traverse(child[0], self.pick_panel, 0, mode, False)
+
+        parent.SetSize(self.GetBestSize())
+
+    def pick_panel(self, obj, mode):
+        if mode == 1:
+            panel = obj.get_design_panel(self)
+        else:
+            panel = obj.get_use_panel(self)
+
+        name = obj.master_dom.getAttribute("name")
+
+        if panel:
+            self.AddPage(panel, name, False)
+
+#################################
+## Splitter container
+#################################
+
+class splitter_handler(container_handler):
+    """ <nodehandler name='?'  module='containers' class='splitter_handler'  />"""
+
+    def __init__(self,xml_dom,tree_node):
+        container_handler.__init__(self,xml_dom,tree_node)
+
+    def load_children(self):
+        self.atts = None
+        children = self.master_dom._get_childNodes()
+        for c in children:
+            if c._get_tagName() == "splitter_atts":
+                self.atts = c
+            else:
+                self.tree.load_xml(c,self.mytree_node)
+        if not self.atts:
+            elem = self.xml.minidom.Element('splitter_atts')
+            elem.setAttribute("horizontal","0")
+            self.atts = self.master_dom.appendChild(elem)
+
+    def get_design_panel(self,parent):
+        return self.build_splitter_wnd(parent, 1)
+
+    def get_use_panel(self,parent):
+        return self.build_splitter_wnd(parent, 2)
+
+    def on_drop(self,evt):
+        drag_obj = self.tree.drag_obj
+        container_handler.on_drop(self,evt)
+
+    def build_splitter_wnd(self, parent, mode):
+        self.split = self.atts.getAttribute("horizontal")
+
+        self.pane = splitter_panel(parent, self)
+
+        self.splitter = wx.lib.splitter.MultiSplitterWindow(self.pane, -1, style=wx.SP_LIVE_UPDATE|wx.SP_3DSASH|wx.SP_NO_XP_THEME)
+
+        if self.split == '1':
+            self.splitter.SetOrientation(wx.VERTICAL)
+        else:
+            self.splitter.SetOrientation(wx.HORIZONTAL)
+
+        self.bestSizex = -1
+        self.bestSizey = -1
+
+        cookie = 0
+        (child, cookie) = self.tree.GetFirstChild(self.mytree_node)
+        if child.IsOk():
+            self.traverse(child, self.doSplit, 0, mode, False)
+
+        self.pane.sizer.Add(self.splitter, 1, wx.EXPAND)
+
+
+        if mode != 1:
+            self.pane.hozCheck.Hide()
+
+        self.pane.SetSize((self.bestSizex, self.bestSizey))
+        self.pane.Layout()
+        parent.SetSize(self.pane.GetSize())
+        return self.pane
+
+    def doSplit(self, obj, mode):
+        if mode == 1:
+            tmp = obj.get_design_panel(self.splitter)
+        else:
+            tmp = obj.get_use_panel(self.splitter)
+
+        if self.split == '1':
+            sash = tmp.GetBestSize()[1]+1
+            self.bestSizey += sash+11
+            if self.bestSizex < tmp.GetBestSize()[0]:
+                self.bestSizex = tmp.GetBestSize()[0]+10
+        else:
+            sash = tmp.GetBestSize()[0]+1
+            self.bestSizex += sash
+            if self.bestSizey < tmp.GetBestSize()[1]:
+                self.bestSizey = tmp.GetBestSize()[1]+31
+
+        self.splitter.AppendWindow(tmp, sash)
+
+    def get_size_constraint(self):
+        return 1
+
+class splitter_panel(wx.Panel):
+    def __init__(self, parent, handler):
+        wx.Panel.__init__(self, parent, -1)
+        self.handler = handler
+        sizer = wx.BoxSizer(wx.VERTICAL)
+
+        self.hozCheck = wx.CheckBox(self, -1, "Horizontal Split")
+        hoz = self.handler.atts.getAttribute("horizontal")
+
+        if hoz == '1':
+            self.hozCheck.SetValue(True)
+            #self.splitsize = wx.BoxSizer(wx.HORIZONTAL)
+        else:
+            self.hozCheck.SetValue(False)
+            #self.splitsize = wx.BoxSizer(wx.VERTICAL)
+
+        sizer.Add(self.hozCheck, 0, wx.EXPAND)
+        sizer.Add(wx.Size(10,0))
+        #sizer.Add(self.splitsize,  1, wx.EXPAND)
+
+        self.sizer = sizer
+        self.SetSizer(self.sizer)
+        self.SetAutoLayout(True)
+
+        self.Bind(wx.EVT_CHECKBOX, self.on_check_box, id=self.hozCheck.GetId())
+
+    def on_check_box(self,evt):
+        state = self.hozCheck.GetValue()
+        if state:
+            self.handler.atts.setAttribute("horizontal", "1")
+        else:
+            self.handler.atts.setAttribute("horizontal", "0")