X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8b9a4190f70909de9568f45389e7aa3ecbc66b8a..16541a4ef4c409e27a047f898f9d770bdcfa9f30:/wxPython/wx/lib/wxpTag.py
diff --git a/wxPython/wx/lib/wxpTag.py b/wxPython/wx/lib/wxpTag.py
index c1ae845457..d362fb365f 100644
--- a/wxPython/wx/lib/wxpTag.py
+++ b/wxPython/wx/lib/wxpTag.py
@@ -1,8 +1,276 @@
+#----------------------------------------------------------------------
+# Name: wxPython.lib.wxpTag
+# Purpose: A wxHtmlTagHandler that knows how to build and place
+# wxPython widgets onto web pages.
+#
+# Author: Robin Dunn
+#
+# Created: 13-Sept-1999
+# RCS-ID: $Id$
+# Copyright: (c) 1999 by Total Control Software
+# Licence: wxWindows license
+#----------------------------------------------------------------------
+# 12/13/2003 - Jeff Grimmett (grimmtooth@softhome.net)
+#
+# o Updated for V2.5 compatability
+#
-"""Renamer stub: provides a way to drop the wx prefix from wxPython objects."""
+'''
+wxPython.lib.wxpTag
-from wx import _rename
-from wxPython.lib import wxpTag
-_rename(globals(), wxpTag.__dict__, modulename='lib.wxpTag')
-del wxpTag
-del _rename
+This module contains a wxHtmlTagHandler that knows how to build
+and place wxPython widgets onto wxHtmlWindow web pages.
+
+You don\'t need to use anything in this module directly, just
+importing it will create the tag handler and add it to any
+wxHtmlWinParsers created from that time forth.
+
+Tags of the following form are recognised::
+
+
+
+
+
+
+
+Both the begining and ending WXP tags are required.
+
+In the future support will be added for another tag that can be
+embedded between the two begining and ending WXP tags and will
+facilitate calling methods of the widget to help initialize it.
+Additionally, support may be added to fetch the module from a web
+server as is done with java applets.
+
+'''
+#----------------------------------------------------------------------
+
+import types
+
+import wx
+import wx.html
+
+
+#----------------------------------------------------------------------
+
+WXPTAG = 'WXP'
+PARAMTAG = 'PARAM'
+
+#----------------------------------------------------------------------
+
+class wxpTagHandler(wx.html.HtmlWinTagHandler):
+ def __init__(self):
+ wx.html.HtmlWinTagHandler.__init__(self)
+ self.ctx = None
+
+ def GetSupportedTags(self):
+ return WXPTAG+','+PARAMTAG
+
+
+ def HandleTag(self, tag):
+ name = tag.GetName()
+ if name == WXPTAG:
+ return self.HandleWxpTag(tag)
+ elif name == PARAMTAG:
+ return self.HandleParamTag(tag)
+ else:
+ raise ValueError, 'unknown tag: ' + name
+
+
+ def HandleWxpTag(self, tag):
+ # create a new context object
+ self.ctx = _Context()
+
+ # find and import the module
+ modName = ''
+ if tag.HasParam('MODULE'):
+ modName = tag.GetParam('MODULE')
+ if modName:
+ self.ctx.classMod = _my_import(modName)
+ else:
+ self.ctx.classMod = wx
+
+ # find and verify the class
+ if not tag.HasParam('CLASS'):
+ raise AttributeError, "WXP tag requires a CLASS attribute"
+
+ className = tag.GetParam('CLASS')
+ self.ctx.classObj = getattr(self.ctx.classMod, className)
+ if type(self.ctx.classObj) not in [ types.ClassType, types.TypeType]:
+ raise TypeError, "WXP tag attribute CLASS must name a class"
+
+ # now look for width and height
+ width = -1
+ height = -1
+ if tag.HasParam('WIDTH'):
+ width = tag.GetParam('WIDTH')
+ if width[-1] == '%':
+ self.ctx.floatWidth = int(width[:-1], 0)
+ width = self.ctx.floatWidth
+ else:
+ width = int(width)
+ if tag.HasParam('HEIGHT'):
+ height = int(tag.GetParam('HEIGHT'))
+ self.ctx.kwargs['size'] = wx.Size(width, height)
+
+ # parse up to the closing tag, and gather any nested Param tags.
+ self.ParseInner(tag)
+
+ # create the object
+ parent = self.GetParser().GetWindowInterface().GetHTMLWindow()
+ if parent:
+ obj = apply(self.ctx.classObj,
+ (parent,),
+ self.ctx.kwargs)
+ obj.Show(True)
+
+ # add it to the HtmlWindow
+ self.GetParser().GetContainer().InsertCell(
+ wx.html.HtmlWidgetCell(obj, self.ctx.floatWidth))
+ self.ctx = None
+
+ return True
+
+
+ def HandleParamTag(self, tag):
+ if not tag.HasParam('NAME'):
+ return False
+
+ name = tag.GetParam('NAME')
+ value = ""
+ if tag.HasParam('VALUE'):
+ value = tag.GetParam('VALUE')
+
+ # check for a param named 'id'
+ if name == 'id':
+ theID = -1
+ try:
+ theID = int(value)
+ except ValueError:
+ theID = getattr(self.ctx.classMod, value)
+ value = theID
+
+
+ # check for something that should be evaluated
+ elif value and value[0] in '[{(' or value[:2] == 'wx':
+ saveVal = value
+ try:
+ value = eval(value, self.ctx.classMod.__dict__)
+ except:
+ value = saveVal
+
+ # convert to wx.Colour
+ elif value and value[0] == '#':
+ try:
+ red = int('0x'+value[1:3], 16)
+ green = int('0x'+value[3:5], 16)
+ blue = int('0x'+value[5:], 16)
+ value = wx.Color(red, green, blue)
+ except:
+ pass
+
+ if self.ctx:
+ self.ctx.kwargs[str(name)] = value
+ return False
+
+
+#----------------------------------------------------------------------
+# just a place to hold some values
+class _Context:
+ def __init__(self):
+ self.kwargs = {}
+ self.width = -1
+ self.height = -1
+ self.classMod = None
+ self.classObj = None
+ self.floatWidth = 0
+
+
+#----------------------------------------------------------------------
+# Function to assist with importing packages
+def _my_import(name):
+ mod = __import__(name)
+ components = name.split('.')
+ for comp in components[1:]:
+ mod = getattr(mod, comp)
+ return mod
+
+
+#----------------------------------------------------------------------
+# Function to parse a param string (of the form 'item=value item2="value etc"'
+# and creates a dictionary
+def _param2dict(param):
+ i = 0; j = 0; s = len(param); d = {}
+ while 1:
+ while i=s: break
+ j = i
+ while j=s:
+ break
+ word = param[i:j]
+ i=j+1
+ if (param[i] == '"'):
+ j=i+1
+ while j