]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/demo/FloatCanvas.py
Remove some items from the Recent additions list
[wxWidgets.git] / wxPython / demo / FloatCanvas.py
index 77fbcb8c829ab395895a0ac105643bdc871b8ac6..038d496c662be5ae3b21f9e4887defcc17671973 100644 (file)
@@ -1,92 +1,38 @@
-#!/usr/bin/env python2.3
+
+
+#print "running:", wx.__version__
+##First, make sure Numeric or numarray can be imported.
 try:
     import Numeric
     import RandomArray
     haveNumeric = True
 except ImportError:
+    # Numeric isn't there, let's try numarray
     try:
         import numarray as Numeric
         import numarray.random_array as RandomArray
         haveNumeric = True
     except ImportError:
+        # numarray isn't there either
         haveNumeric = False
-
-if not haveNumeric:
-    errorText = """
-The FloatCanvas requires either the Numeric or Numarray module:
-You can get them at:
-     http://sourceforge.net/projects/numpy
-
-NOTE: The Numeric module is substantially faster than numarray for this
-purpose, if you have lot's of objects
-"""
-
-StartUpDemo = "all"
-if __name__ == "__main__": # parse options if run stand-alone
-    # check options:
-    import sys, getopt
-    optlist, args = getopt.getopt(sys.argv[1:],'l',["local","all","text","map","stext","hit","hitf","animate","speed","temp","props"])
-
-    for opt in optlist:
-        if opt[0] == "--all":
-            StartUpDemo = "all"
-        elif opt[0] == "--text":
-            StartUpDemo = "text"
-        elif opt[0] == "--map":
-            StartUpDemo = "map"
-        elif opt[0] == "--stext":
-            StartUpDemo = "stext"
-        elif opt[0] == "--hit":
-            StartUpDemo = "hit"
-        elif opt[0] == "--hitf":
-            StartUpDemo = "hitf"
-        elif opt[0] == "--animate":
-            StartUpDemo = "animate"
-        elif opt[0] == "--speed":
-            StartUpDemo = "speed"
-        elif opt[0] == "--temp":
-            StartUpDemo = "temp"
-        elif opt[0] == "--props":
-            StartUpDemo = "props"
-import wx
-import time, random
-
-#---------------------------------------------------------------------------
-
-class TestPanel(wx.Panel):
-    def __init__(self, parent, log):
-        self.log = log
-        wx.Panel.__init__(self, parent, -1)
-
-        b = wx.Button(self, -1, "Show the FloatCanvas sample", (50,50))
-        self.Bind(wx.EVT_BUTTON, self.OnButton, b)
-
-
-    def OnButton(self, evt):
-        if not haveNumeric:
-            dlg = wx.MessageDialog(self, errorText, 'Sorry', wx.OK |
-                                   wx.ICON_INFORMATION)
-            dlg.ShowModal()
-            dlg.Destroy()
-
-        else:
-            win = DrawFrame(None, -1, "FloatCanvas Drawing Window",wx.DefaultPosition,(500,500))
-            win.Show(True)
-            win.DrawTest()
-
-
-
+        errorText = (
+        "The FloatCanvas requires either the Numeric or numarray module\n\n"
+        "You can get them at:\n"
+        "http://sourceforge.net/projects/numpy\n\n"
+        "NOTE: The Numeric module is substantially faster than numarray for this\n"
+        "purpose, if you have lots of objects\n"
+        )
+      
 #---------------------------------------------------------------------------
 
 
-if haveNumeric:
-
+def BuildDrawFrame(): # this gets called when needed, rather than on import
     try:
-        from floatcanvas import NavCanvas, FloatCanvas
+        from floatcanvas import NavCanvas, FloatCanvas, Resources
     except ImportError: # if it's not there locally, try the wxPython lib.
-        from wx.lib.floatcanvas import NavCanvas, FloatCanvas
-
-    import wxPython.lib.colourdb
+        from wx.lib.floatcanvas import NavCanvas, FloatCanvas, Resources
+    import wx.lib.colourdb
+    import time, random
 
     class DrawFrame(wx.Frame):
 
@@ -105,10 +51,16 @@ if haveNumeric:
             file_menu = wx.Menu()
             item = file_menu.Append(-1, "&Close","Close this frame")
             self.Bind(wx.EVT_MENU, self.OnQuit, item)
+
+            item = file_menu.Append(-1, "&SavePNG","Save the current image as a PNG")
+            self.Bind(wx.EVT_MENU, self.OnSavePNG, item)
             MenuBar.Append(file_menu, "&File")
 
             draw_menu = wx.Menu()
 
+            item = draw_menu.Append(-1, "&Clear","Clear the Canvas")
+            self.Bind(wx.EVT_MENU, self.Clear, item)
+
             item = draw_menu.Append(-1, "&Draw Test","Run a test of drawing random components")
             self.Bind(wx.EVT_MENU, self.DrawTest, item)
 
@@ -117,22 +69,40 @@ if haveNumeric:
 
             item = draw_menu.Append(-1, "Draw &Map","Run a test of drawing a map")
             self.Bind(wx.EVT_MENU, self.DrawMap, item)
+
             item = draw_menu.Append(-1, "&Text Test","Run a test of text drawing")
             self.Bind(wx.EVT_MENU, self.TestText, item)
+
             item = draw_menu.Append(-1, "&ScaledText Test","Run a test of text drawing")
             self.Bind(wx.EVT_MENU, self.TestScaledText, item)
-            item = draw_menu.Append(-1, "&Clear","Clear the Canvas")
-            self.Bind(wx.EVT_MENU, self.Clear, item)
+
+            item = draw_menu.Append(-1, "&ScaledTextBox Test","Run a test of the Scaled Text Box")
+            self.Bind(wx.EVT_MENU, self.TestScaledTextBox, item)
+
+            item = draw_menu.Append(-1, "&Bitmap Test","Run a test of the Bitmap Object")
+            self.Bind(wx.EVT_MENU, self.TestBitmap, item)
+
             item = draw_menu.Append(-1, "&Hit Test","Run a test of the hit test code")
             self.Bind(wx.EVT_MENU, self.TestHitTest, item)
+
             item = draw_menu.Append(-1, "Hit Test &Foreground","Run a test of the hit test code with a foreground Object")
             self.Bind(wx.EVT_MENU, self.TestHitTestForeground, item)
+
             item = draw_menu.Append(-1, "&Animation","Run a test of Animation")
             self.Bind(wx.EVT_MENU, self.TestAnimation, item)
-            item = draw_menu.Append(-1, "&Speed","Run a test of Drawing Speed")
-            self.Bind(wx.EVT_MENU, self.SpeedTest, item)
+
+            #item = draw_menu.Append(-1, "&Speed","Run a test of Drawing Speed")
+            #self.Bind(wx.EVT_MENU, self.SpeedTest, item)
+
             item = draw_menu.Append(-1, "Change &Properties","Run a test of Changing Object Properties")
             self.Bind(wx.EVT_MENU, self.PropertiesChangeTest, item)
+
+            item = draw_menu.Append(-1, "&Arrows","Run a test of Arrows")
+            self.Bind(wx.EVT_MENU, self.ArrowTest, item)
+
+            item = draw_menu.Append(-1, "&Hide","Run a test of the Show() Hide() Show() and methods")
+            self.Bind(wx.EVT_MENU, self.HideTest, item)
+
             MenuBar.Append(draw_menu, "&Tests")
 
             view_menu = wx.Menu()
@@ -148,29 +118,46 @@ if haveNumeric:
 
             self.SetMenuBar(MenuBar)
 
-            self.CreateStatusBar()            
+            self.CreateStatusBar()
+
+            
             # Add the Canvas
             self.Canvas = NavCanvas.NavCanvas(self,
-                                              -1,
-                                              (500,500),
                                               Debug = 0,
                                               BackgroundColor = "DARK SLATE BLUE")
 
+            self.MsgWindow = wx.TextCtrl(self, wx.ID_ANY,
+                                         "Look Here for output from events\n",
+                                         style = (wx.TE_MULTILINE |
+                                                  wx.TE_READONLY |
+                                                  wx.SUNKEN_BORDER)
+                                         )
+            
+            ##Create a sizer to manage the Canvas and message window
+            MainSizer = wx.BoxSizer(wx.VERTICAL)
+            MainSizer.Add(self.Canvas, 4, wx.EXPAND)
+            MainSizer.Add(self.MsgWindow, 1, wx.EXPAND | wx.ALL, 5)
+
+            self.SetSizer(MainSizer)
             wx.EVT_CLOSE(self, self.OnCloseWindow)
 
             FloatCanvas.EVT_MOTION(self.Canvas, self.OnMove ) 
-            #FloatCanvas.EVT_LEFT_UP(self.Canvas, self.OnLeftUp ) 
 
             self.EventsAreBound = False
 
-            ## getting all the colors and linestyles  for random objects
-            wxPython.lib.colourdb.updateColourDB()
-            self.colors = wxPython.lib.colourdb.getColourList()
-            #self.LineStyles = FloatCanvas.DrawObject.LineStyleList.keys()
+            ## getting all the colors for random objects
+            wx.lib.colourdb.updateColourDB()
+            self.colors = wx.lib.colourdb.getColourList()
 
 
             return None
 
+        def Log(self, text):
+            self.MsgWindow.AppendText(text)
+            if not text[-1] == "\n":
+                self.MsgWindow.AppendText("\n")
+            
+
         def BindAllMouseEvents(self):
             if not self.EventsAreBound:
                 ## Here is how you catch FloatCanvas mouse events
@@ -190,7 +177,20 @@ if haveNumeric:
             self.EventsAreBound = True
 
         def UnBindAllMouseEvents(self):
-            ## Here is how you catch FloatCanvas mouse events
+            ## Here is how you unbind FloatCanvas mouse events
+            FloatCanvas.EVT_LEFT_DOWN(self.Canvas, None ) 
+            FloatCanvas.EVT_LEFT_UP(self.Canvas, None )
+            FloatCanvas.EVT_LEFT_DCLICK(self.Canvas, None) 
+
+            FloatCanvas.EVT_MIDDLE_DOWN(self.Canvas, None )
+            FloatCanvas.EVT_MIDDLE_UP(self.Canvas, None )
+            FloatCanvas.EVT_MIDDLE_DCLICK(self.Canvas, None )
+
+            FloatCanvas.EVT_RIGHT_DOWN(self.Canvas, None )
+            FloatCanvas.EVT_RIGHT_UP(self.Canvas, None )
+            FloatCanvas.EVT_RIGHT_DCLICK(self.Canvas, None )
+
+            FloatCanvas.EVT_MOUSEWHEEL(self.Canvas, None )
             FloatCanvas.EVT_LEFT_DOWN(self.Canvas, None ) 
             FloatCanvas.EVT_LEFT_UP(self.Canvas, None )
             FloatCanvas.EVT_LEFT_DCLICK(self.Canvas, None) 
@@ -207,62 +207,84 @@ if haveNumeric:
 
             self.EventsAreBound = False
 
-        def PrintCoords(self,event):
-            print "coords are: %s"%(event.Coords,)
-            print "pixel coords are: %s\n"%(event.GetPosition(),)
 
+        def PrintCoords(self,event):
+            #print "coords are: %s"%(event.Coords,)
+            #print "pixel coords are: %s\n"%(event.GetPosition(),)
+            self.Log("coords are: %s"%(event.Coords,))
+            self.Log("pixel coords are: %s\n"%(event.GetPosition(),))
+
+        def OnSavePNG(self, event=None):
+            import os
+            dlg = wx.FileDialog(
+                self, message="Save file as ...", defaultDir=os.getcwd(), 
+                defaultFile="", wildcard="*.png", style=wx.SAVE
+                )
+            if dlg.ShowModal() == wx.ID_OK:
+                path = dlg.GetPath()
+                if not(path[-4:].lower() == ".png"):
+                    path = path+".png"
+                self.Canvas.SaveAsImage(path)
+
+                    
         def OnLeftDown(self, event):
-            print "Left Button has been clicked in DrawFrame"
+            self.Log("LeftDown")
             self.PrintCoords(event)
 
         def OnLeftUp(self, event):
-            print "Left up in DrawFrame"
+            self.Log("LeftUp")
             self.PrintCoords(event)
 
         def OnLeftDouble(self, event):
-            print "Left Double Click in DrawFrame"
+            self.Log("LeftDouble")
             self.PrintCoords(event)
 
         def OnMiddleDown(self, event):
-            print "Middle Button clicked in DrawFrame"
+            self.Log("MiddleDown")
             self.PrintCoords(event)
 
         def OnMiddleUp(self, event):
-            print "Middle Button Up in DrawFrame"
+            self.Log("MiddleUp")
             self.PrintCoords(event)
 
         def OnMiddleDouble(self, event):
-            print "Middle Button Double clicked in DrawFrame"
+            self.Log("MiddleDouble")
             self.PrintCoords(event)
 
         def OnRightDown(self, event):
-            print "Right Button has been clicked in DrawFrame"
+            self.Log("RightDown")
             self.PrintCoords(event)
 
         def OnRightUp(self, event):
-            print "Right Button Up in DrawFrame"
+            self.Log("RightDown")
             self.PrintCoords(event)
 
         def OnRightDouble(self, event):
-            print "Right Button Double clicked in DrawFrame"
+            self.Log("RightDouble")
             self.PrintCoords(event)
 
         def OnWheel(self, event):
-            print "Mouse Wheel Moved in DrawFrame"
+            self.Log("Mouse Wheel")
             self.PrintCoords(event)
-
+            Rot = event.GetWheelRotation()
+            Rot = Rot / abs(Rot) * 0.1
+            if event.ControlDown(): # move left-right
+                self.Canvas.MoveImage( (Rot, 0), "Panel" )
+            else: # move up-down
+                self.Canvas.MoveImage( (0, Rot), "Panel" )
+                
         def OnMove(self, event):
             """
-            Updates the staus bar with the world coordinates
+            Updates the status bar with the world coordinates
             """
             self.SetStatusText("%.2f, %.2f"%tuple(event.Coords))
 
         def OnAbout(self, event):
-            print "OnAbout called"
-
-            dlg = wx.MessageDialog(self, "This is a small program to demonstrate\n"
-                                                      "the use of the FloatCanvas\n",
-                                                      "About Me", wx.OK | wx.ICON_INFORMATION)
+            dlg = wx.MessageDialog(self,
+                                   "This is a small program to demonstrate\n"
+                                   "the use of the FloatCanvas\n",
+                                   "About Me",
+                                   wx.OK | wx.ICON_INFORMATION)
             dlg.ShowModal()
             dlg.Destroy()
 
@@ -283,8 +305,7 @@ if haveNumeric:
 
         def DrawTest(self,event=None):
             wx.GetApp().Yield()
-#            import random
-#            import RandomArray
+
             Range = (-10,10)
             colors = self.colors
 
@@ -294,44 +315,49 @@ if haveNumeric:
             Canvas.ClearAll()
             Canvas.SetProjectionFun(None)
 
-            ##         Random tests of everything:
+            ############# Random tests of everything ##############
 
             # Rectangles
             for i in range(3):
-                x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
+                xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
                 lw = random.randint(1,5)
                 cf = random.randint(0,len(colors)-1)
-                h = random.randint(1,5)
-                w = random.randint(1,5)
-                Canvas.AddRectangle(x,y,w,h,LineWidth = lw,FillColor = colors[cf])
+                wh = (random.randint(1,5), random.randint(1,5))
+                Canvas.AddRectangle(xy, wh, LineWidth = lw, FillColor = colors[cf])
 
             # Ellipses
             for i in range(3):
-                x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
+                xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
                 lw = random.randint(1,5)
                 cf = random.randint(0,len(colors)-1)
                 h = random.randint(1,5)
                 w = random.randint(1,5)
-                Canvas.AddEllipse(x,y,h,w,LineWidth = lw,FillColor = colors[cf])
+                Canvas.AddEllipse(xy, (h,w), LineWidth = lw,FillColor = colors[cf])
 
             # Points
             for i in range(5):
-                x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
+                xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
                 D = random.randint(1,50)
                 cf = random.randint(0,len(colors)-1)
-                Canvas.AddPoint((x,y), Color = colors[cf], Diameter = D)
+                Canvas.AddPoint(xy, Color = colors[cf], Diameter = D)
+
+            # SquarePoints
+            for i in range(500):
+                xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
+                S = random.randint(1, 50)
+                cf = random.randint(0,len(colors)-1)
+                Canvas.AddSquarePoint(xy, Color = colors[cf], Size = S)
 
-                # Circles
+            # Circles
             for i in range(5):
-                x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
+                xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
                 D = random.randint(1,5)
                 lw = random.randint(1,5)
                 cf = random.randint(0,len(colors)-1)
                 cl = random.randint(0,len(colors)-1)
-                Canvas.AddCircle(x,y,D,LineWidth = lw,LineColor = colors[cl],FillColor = colors[cf])
-                Canvas.AddText("Circle # %i"%(i),x,y,Size = 12,BackgroundColor = None,Position = "cc")
-
-                # Lines
+                Canvas.AddCircle(xy, D, LineWidth = lw, LineColor = colors[cl], FillColor = colors[cf])
+                Canvas.AddText("Circle # %i"%(i), xy, Size = 12, BackgroundColor = None, Position = "cc")
+            # Lines
             for i in range(5):
                 points = []
                 for j in range(random.randint(2,10)):
@@ -341,8 +367,7 @@ if haveNumeric:
                 cf = random.randint(0,len(colors)-1)
                 cl = random.randint(0,len(colors)-1)
                 Canvas.AddLine(points, LineWidth = lw, LineColor = colors[cl])
-
-                # Polygons
+            # Polygons
             for i in range(3):
                 points = []
                 for j in range(random.randint(2,6)):
@@ -370,16 +395,27 @@ if haveNumeric:
             for i in range(3):
                 ts = random.randint(10,40)
                 cf = random.randint(0,len(colors)-1)
-                x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
-                Canvas.AddText(String, xy, Size = ts, Color = colors[cf], Position = "cc")
+                xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
+                Canvas.AddText(String, xy, Size = ts, Color = colors[cf], Position = "cc")
 
             # Scaled Text
             String = "Scaled text"
             for i in range(3):
                 ts = random.random()*3 + 0.2
                 cf = random.randint(0,len(colors)-1)
-                x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
-                Canvas.AddScaledText(String, x, y, Size = ts, Color = colors[cf], Position = "cc")
+                Point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
+                Canvas.AddScaledText(String, Point, Size = ts, Color = colors[cf], Position = "cc")
+
+            # Arrows
+            N = 5
+            Points = RandomArray.uniform(Range[0], Range[1], (N,2) )
+            for i in range(N):
+                Canvas.AddArrow(Points[i],
+                                random.uniform(20,100),
+                                Direction = random.uniform(0,360),
+                                LineWidth = random.uniform(1,5),
+                                LineColor = colors[random.randint(0,len(colors)-1)],
+                                ArrowHeadAngle = random.uniform(20,90))
 
             Canvas.ZoomToBB()
 
@@ -407,31 +443,29 @@ if haveNumeric:
             colors = self.colors
             # Rectangles
             for i in range(3):
-                x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
+                xy = (random.uniform(Range[0],Range[1]), random.uniform(Range[0],Range[1]))
                 lw = random.randint(1,5)
                 cf = random.randint(0,len(colors)-1)
-                h = random.randint(1,5)
-                w = random.randint(1,5)
-                Canvas.AddRectangle(x,y,h,w,LineWidth = lw,FillColor = colors[cf])
+                wh = (random.randint(1,5), random.randint(1,5) )
+                Canvas.AddRectangle(xy, wh, LineWidth = lw, FillColor = colors[cf])
 
             # Ellipses
             for i in range(3):
-                x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
+                xy = (random.uniform(Range[0],Range[1]), random.uniform(Range[0],Range[1]))
                 lw = random.randint(1,5)
                 cf = random.randint(0,len(colors)-1)
-                h = random.randint(1,5)
-                w = random.randint(1,5)
-                Canvas.AddEllipse(x,y,h,w,LineWidth = lw,FillColor = colors[cf])
+                wh = (random.randint(1,5), random.randint(1,5) )
+                Canvas.AddEllipse(xy, wh, LineWidth = lw, FillColor = colors[cf])
 
             # Circles
             for i in range(5):
-                x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
+                xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
                 D = random.randint(1,5)
                 lw = random.randint(1,5)
                 cf = random.randint(0,len(colors)-1)
                 cl = random.randint(0,len(colors)-1)
-                Canvas.AddCircle(x,y,D,LineWidth = lw,LineColor = colors[cl],FillColor = colors[cf])
-                Canvas.AddText("Circle # %i"%(i),x,y,Size = 12,BackgroundColor = None,Position = "cc")
+                Canvas.AddCircle(xy, D, LineWidth = lw, LineColor = colors[cl], FillColor = colors[cf])
+                Canvas.AddText("Circle # %i"%(i), xy, Size = 12, BackgroundColor = None, Position = "cc")
 
             # Lines
             for i in range(5):
@@ -464,13 +498,13 @@ if haveNumeric:
             for i in range(3):
                 ts = random.random()*3 + 0.2
                 cf = random.randint(0,len(colors)-1)
-                x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
-                Canvas.AddScaledText(String, xy, Size = ts, Color = colors[cf], Position = "cc")
+                xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
+                Canvas.AddScaledText(String, xy, Size = ts, Color = colors[cf], Position = "cc")
 
 
             # Now the Foreground Object:
-            C = Canvas.AddCircle(0,0,7,LineWidth = 2,LineColor = "Black",FillColor = "Red", InForeground = True)
-            T = Canvas.AddScaledText("Click to Move",0,0, Size = 0.6, Position = 'cc', InForeground = True)
+            C = Canvas.AddCircle((0,0), 7, LineWidth = 2,LineColor = "Black",FillColor = "Red", InForeground = True)
+            T = Canvas.AddScaledText("Click to Move", (0,0), Size = 0.6, Position = 'cc', InForeground = True)
             C.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.MoveMe)
             C.Text = T
 
@@ -518,173 +552,173 @@ if haveNumeric:
             Canvas.ClearAll()
             Canvas.SetProjectionFun(None)
 
-            #Add a HitAble rectangle
+            #Add a Hit-able rectangle
             w, h = 60, 20
 
             dx = 80
             dy = 40
-            x,y = 20, 20
+            x, y = 20, 20
             FontSize = 8
 
             #Add one that is not HitAble
-            Canvas.AddRectangle(x, y, w, h, LineWidth = 2)
-            Canvas.AddText("Not Hit-able", x, y, Size = FontSize, Position = "bl")
+            Canvas.AddRectangle((x,y), (w, h), LineWidth = 2)
+            Canvas.AddText("Not Hit-able", (x,y), Size = FontSize, Position = "bl")
 
 
             x += dx
-            R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2)
+            R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2)
             R.Name = "Line Rectangle"
             R.HitFill = False
             R.HitLineWidth = 5 # Makes it a little easier to hit
             R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHit)
-            Canvas.AddText("Left Click Line", x, y, Size = FontSize, Position = "bl")
-            Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
+            Canvas.AddText("Left Click Line", (x,y), Size = FontSize, Position = "bl")
+            Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
 
             x += dx
             color = "Red"
-            R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
+            R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color)
             R.Name = color + "Rectangle"
             R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHit)
-            Canvas.AddText("Left Click Fill", x, y, Size = FontSize, Position = "bl")
-            Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
+            Canvas.AddText("Left Click Fill", (x, y), Size = FontSize, Position = "bl")
+            Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
 
             x = 20
             y += dy
             color = "LightBlue"
-            R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
+            R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color)
             R.Name = color + " Rectangle"
             R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHit)
-            Canvas.AddText("Right Click Fill", x, y, Position = "bl")
-            Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
+            Canvas.AddText("Right Click Fill", (x, y), Size = FontSize,  Position = "bl")
+            Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
 
             x += dx
             color = "Grey"
-            R = Canvas.AddEllipse(x, y, w, h,LineWidth = 2,FillColor = color)
+            R = Canvas.AddEllipse((x, y), (w, h),LineWidth = 2,FillColor = color)
             R.Name = color +" Ellipse"
             R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHit)
-            Canvas.AddText("Right Click Fill", x, y, Size = FontSize, Position = "bl")
-            Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
+            Canvas.AddText("Right Click Fill", (x, y), Size = FontSize, Position = "bl")
+            Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
 
             x += dx
             color = "Brown"
-            R = Canvas.AddCircle(x+dx/2, y+dy/2, dx/4, LineWidth = 2, FillColor = color)
+            R = Canvas.AddCircle((x+dx/2, y+dy/2), dx/4, LineWidth = 2, FillColor = color)
             R.Name = color + " Circle"
             R.HitFill = True
             R.Bind(FloatCanvas.EVT_FC_LEFT_DCLICK, self.RectGotHit)
-            Canvas.AddText("Left D-Click Fill", x, y, Size = FontSize, Position = "bl")
-            Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
+            Canvas.AddText("Left D-Click Fill", (x, y), Size = FontSize, Position = "bl")
+            Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
 
             x = 20
             y += dy
             color = "Pink"
-            R = Canvas.AddCircle(x+dx/2, y+dy/2, dx/4, LineWidth = 2,FillColor = color)
+            R = Canvas.AddCircle((x+dx/2, y+dy/2), dx/4, LineWidth = 2,FillColor = color)
             R.Name = color +  " Circle"
             R.Bind(FloatCanvas.EVT_FC_LEFT_UP, self.RectGotHit)
-            Canvas.AddText("Left Up Fill", x, y, Size = FontSize, Position = "bl")
-            Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
+            Canvas.AddText("Left Up Fill", (x, y), Size = FontSize, Position = "bl")
+            Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
 
             x += dx
             color = "White"
-            R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
+            R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color)
             R.Name = color + " Rectangle"
             R.Bind(FloatCanvas.EVT_FC_MIDDLE_DOWN, self.RectGotHit)
-            Canvas.AddText("Middle Down", x, y, Size = FontSize, Position = "bl")
-            Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
+            Canvas.AddText("Middle Down", (x, y), Size = FontSize, Position = "bl")
+            Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
 
             x += dx
             color = "AQUAMARINE"
-            R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
+            R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color)
             R.Name = color + " Rectangle"
             R.Bind(FloatCanvas.EVT_FC_MIDDLE_UP, self.RectGotHit)
-            Canvas.AddText("Middle Up", x, y, Size = FontSize, Position = "bl")
-            Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
+            Canvas.AddText("Middle Up", (x, y), Size = FontSize, Position = "bl")
+            Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
 
             x = 20
             y += dy
             color = "CORAL"
-            R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
+            R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color)
             R.Name = color + " Rectangle"
             R.Bind(FloatCanvas.EVT_FC_MIDDLE_DCLICK, self.RectGotHit)
-            Canvas.AddText("Middle DoubleClick", x, y, Size = FontSize, Position = "bl")
-            Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
+            Canvas.AddText("Middle DoubleClick", (x, y), Size = FontSize, Position = "bl")
+            Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
 
             x += dx
             color = "CYAN"
-            R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
+            R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color)
             R.Name = color + " Rectangle"
             R.Bind(FloatCanvas.EVT_FC_RIGHT_UP, self.RectGotHit)
-            Canvas.AddText("Right Up", x, y, Size = FontSize, Position = "bl")
-            Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
+            Canvas.AddText("Right Up", (x, y), Size = FontSize, Position = "bl")
+            Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
 
             x += dx
             color = "LIME GREEN"
-            R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
+            R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color)
             R.Name = color + " Rectangle"
             R.Bind(FloatCanvas.EVT_FC_RIGHT_DCLICK, self.RectGotHit)
-            Canvas.AddText("Right Double Click", x, y, Size = FontSize, Position = "bl")
-            Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
+            Canvas.AddText("Right Double Click", (x, y), Size = FontSize, Position = "bl")
+            Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
 
             x = 20
             y += dy
             color = "MEDIUM GOLDENROD"
-            R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
+            R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color)
             R.Name = color
             R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHitRight)
             R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft)
-            Canvas.AddText("L and R Click", x, y, Size = FontSize, Position = "bl")
-            Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
+            Canvas.AddText("L and R Click", (x, y), Size = FontSize, Position = "bl")
+            Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
 
             x += dx
             color = "SALMON"
-            R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
+            R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color)
             R.Name = color + " Rectangle"
             R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver)
-            Canvas.AddText("Mouse Enter", x, y, Size = FontSize, Position = "bl")
-            Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
+            Canvas.AddText("Mouse Enter", (x, y), Size = FontSize, Position = "bl")
+            Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
 
             x += dx
             color = "MEDIUM VIOLET RED"
-            R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
+            R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color)
             R.Name = color
             R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave)
-            Canvas.AddText("Mouse Leave", x, y, Size = FontSize, Position = "bl")
-            Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
+            Canvas.AddText("Mouse Leave", (x, y), Size = FontSize, Position = "bl")
+            Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
 
             x = 20
             y += dy
             color = "SKY BLUE"
-            R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
+            R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color)
             R.Name = color
             R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver)
             R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave)
-            Canvas.AddText("Enter and Leave", x, y, Size = FontSize, Position = "bl")
-            Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
+            Canvas.AddText("Enter and Leave", (x, y), Size = FontSize, Position = "bl")
+            Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
 
             x += dx
             color = "WHEAT"
-            R = Canvas.AddRectangle(x, y, w+12, h, LineColor = None, FillColor = color)
+            R = Canvas.AddRectangle((x, y), (w+12, h), LineColor = None, FillColor = color)
             R.Name = color
             R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver)
             R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave)
-            Canvas.AddText("Mouse Enter&Leave", x, y, Size = FontSize, Position = "bl")
-            Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
+            Canvas.AddText("Mouse Enter&Leave", (x, y), Size = FontSize, Position = "bl")
+            Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
 
             x += dx
             color = "KHAKI"
-            R = Canvas.AddRectangle(x-12, y, w+12, h, LineColor = None, FillColor = color)
+            R = Canvas.AddRectangle((x-12, y), (w+12, h), LineColor = None, FillColor = color)
             R.Name = color
             R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver)
             R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave)
-            Canvas.AddText("Mouse ENter&Leave", x, y, Size = FontSize, Position = "bl")
-            Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
+            Canvas.AddText("Mouse ENter&Leave", (x, y), Size = FontSize, Position = "bl")
+            Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
 
             x = 20
             y += dy
             L = Canvas.AddLine(( (x, y), (x+10, y+10), (x+w, y+h) ), LineWidth = 2, LineColor = "Red")
             L.Name = "A Line"
             L.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft)
-            Canvas.AddText("Left Down", x, y, Size = FontSize, Position = "bl")
-            Canvas.AddText(L.Name, x, y+h, Size = FontSize, Position = "tl")
+            Canvas.AddText("Left Down", (x, y), Size = FontSize, Position = "bl")
+            Canvas.AddText(L.Name, (x, y+h), Size = FontSize, Position = "tl")
 
             x += dx
             color = "SEA GREEN"
@@ -692,8 +726,8 @@ if haveNumeric:
             R = Canvas.AddPolygon(Points,  LineWidth = 2, FillColor = color)
             R.Name = color + " Polygon"
             R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHitRight)
-            Canvas.AddText("RIGHT_DOWN", x, y, Size = FontSize, Position = "bl")
-            Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
+            Canvas.AddText("RIGHT_DOWN", (x, y), Size = FontSize, Position = "bl")
+            Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
 
             x += dx
             color = "Red"
@@ -701,22 +735,33 @@ if haveNumeric:
             R = Canvas.AddPointSet(Points,  Diameter = 4, Color = color)
             R.Name = "PointSet"
             R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.PointSetGotHit)
-            Canvas.AddText("LEFT_DOWN", x, y, Size = FontSize, Position = "bl")
-            Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
+            Canvas.AddText("LEFT_DOWN", (x, y), Size = FontSize, Position = "bl")
+            Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
 
             x = 20
             y += dy
-            T = Canvas.AddText("Hit-able Text", x, y, Size = 15, Color = "Red", Position = 'tl')
+            T = Canvas.AddText("Hit-able Text", (x, y), Size = 15, Color = "Red", Position = 'tl')
             T.Name = "Hit-able Text"
             T.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft)
-            Canvas.AddText("Left Down", x, y, Size = FontSize, Position = "bl")
+            Canvas.AddText("Left Down", (x, y), Size = FontSize, Position = "bl")
 
             x += dx
-            T = Canvas.AddScaledText("Scaled Text", x, y, Size = 1./2*h, Color = "Pink", Position = 'bl')
+            T = Canvas.AddScaledText("Scaled Text", (x, y), Size = 1./2*h, Color = "Pink", Position = 'bl')
             Canvas.AddPointSet( (x, y), Diameter = 3)
             T.Name = "Scaled Text"
             T.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft)
-            Canvas.AddText("Left Down", x, y, Size = FontSize, Position = "tl")
+            Canvas.AddText("Left Down", (x, y), Size = FontSize, Position = "tl")
+
+            x += dx
+            color = "Cyan"
+            Point = (x + w/2, y)
+            #Points = Numeric.array(( (x, y), (x, y+2.*h/3), (x+w, y+h), (x+w, y+h/2.), (x + 2.*w/3, y+h/2.), (x + 2.*w/3,y) ), Numeric.Float)
+            R = Canvas.AddSquarePoint(Point,  Size = 8, Color = color)
+            R.Name = "SquarePoint"
+            R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHit)
+            Canvas.AddText("LEFT_DOWN", (x, y), Size = FontSize, Position = "bl")
+            Canvas.AddText(R.Name, (x, y), Size = FontSize, Position = "tl")
+
 
             self.Canvas.ZoomToBB()
 
@@ -737,12 +782,12 @@ if haveNumeric:
             x,y = 20, 20
 
             color = "Red"
-            R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color, InForeground = False)
+            R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color, InForeground = False)
             R.Name = color + "Rectangle"
             R.HitFill = True
             R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHit)
-            Canvas.AddText("Left Click Fill", x, y, Position = "bl")
-            Canvas.AddText(R.Name, x, y+h, Position = "tl")
+            Canvas.AddText("Left Click Fill", (x, y), Position = "bl")
+            Canvas.AddText(R.Name, (x, y+h), Position = "tl")
 
             ## A set of Rectangles that move together
 
@@ -750,35 +795,36 @@ if haveNumeric:
             ## custom FloatCanvas DrawObject
 
             self.MovingRects = []
+            WH = (w/2, h/2)
             x += dx
             color = "LightBlue"
-            R = Canvas.AddRectangle(x, y, w/2, h/2, LineWidth = 2, FillColor = color, InForeground = True)
+            R = Canvas.AddRectangle((x, y), WH, LineWidth = 2, FillColor = color, InForeground = True)
             R.HitFill = True
             R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectMoveLeft)
-            L = Canvas.AddText("Left", x + w/4, y + h/4, Position = "cc", InForeground = True)
+            L = Canvas.AddText("Left", (x + w/4, y + h/4), Position = "cc", InForeground = True)
             self.MovingRects.extend( (R,L) )
 
             x += w/2
-            R = Canvas.AddRectangle(x, y, w/2, h/2, LineWidth = 2, FillColor = color, InForeground = True)
+            R = Canvas.AddRectangle((x, y), WH, LineWidth = 2, FillColor = color, InForeground = True)
             R.HitFill = True
             R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectMoveRight)
-            L = Canvas.AddText("Right", x + w/4, y + h/4, Position = "cc", InForeground = True)
+            L = Canvas.AddText("Right", (x + w/4, y + h/4), Position = "cc", InForeground = True)
             self.MovingRects.extend( (R,L) )
 
             x -= w/2
             y += h/2
-            R = Canvas.AddRectangle(x, y, w/2, h/2, LineWidth = 2, FillColor = color, InForeground = True)
+            R = Canvas.AddRectangle((x, y), WH, LineWidth = 2, FillColor = color, InForeground = True)
             R.HitFill = True
             R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectMoveUp)
-            L = Canvas.AddText("Up", x + w/4, y + h/4, Position = "cc", InForeground = True)
+            L = Canvas.AddText("Up", (x + w/4, y + h/4), Position = "cc", InForeground = True)
             self.MovingRects.extend( (R,L) )
 
 
             x += w/2
-            R = Canvas.AddRectangle(x, y, w/2, h/2, LineWidth = 2, FillColor = color, InForeground = True)
+            R = Canvas.AddRectangle((x, y), WH, LineWidth = 2, FillColor = color, InForeground = True)
             R.HitFill = True
             R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectMoveDown)
-            L = Canvas.AddText("Down", x + w/4, y + h/4, Position = "cc", InForeground = True)
+            L = Canvas.AddText("Down", (x + w/4, y + h/4), Position = "cc", InForeground = True)
             self.MovingRects.extend( (R,L) )
 
             self.Canvas.ZoomToBB()
@@ -802,27 +848,26 @@ if haveNumeric:
                 elif Dir == "right": X += 10
                 elif Dir == "up": Y += 10
                 elif Dir == "down": Y -= 10
-                Object.SetXY(X,Y)
+                Object.SetPoint((X,Y))
             self.Canvas.Draw()
 
-
         def PointSetGotHit(self, Object):
-            print Object.Name, "Got Hit\n"
+            self.Log(Object.Name + "Got Hit\n")
 
         def RectGotHit(self, Object):
-            print Object.Name, "Got Hit\n"
+            self.Log(Object.Name + "Got Hit\n")
 
         def RectGotHitRight(self, Object):
-            print Object.Name, "Got Hit With Right\n"
+            self.Log(Object.Name + "Got Hit With Right\n")
 
         def RectGotHitLeft(self, Object):
-            print Object.Name, "Got Hit with Left\n"
+            self.Log(Object.Name + "Got Hit with Left\n")
 
         def RectMouseOver(self, Object):
-            print "Mouse entered:", Object.Name
+            self.Log("Mouse entered:" +  Object.Name)
 
         def RectMouseLeave(self, Object):
-            print "Mouse left ", Object.Name
+            self.Log("Mouse left " +  Object.Name)
 
 
         def TestText(self, event= None):
@@ -833,51 +878,57 @@ if haveNumeric:
             Canvas.ClearAll()
             Canvas.SetProjectionFun(None)
 
-            x,y  = (0, 0)
+            Point  = (3, 0)
 
             ## Add a non-visible rectangle, just to get a Bounding Box
             ## Text objects have a zero-size bounding box, because it changes with zoom
-            Canvas.AddRectangle(-10,-10,20,20,LineWidth = 1, LineColor = None)
+            Canvas.AddRectangle((-10,-10),
+                                (20,20),
+                                LineWidth = 1,
+                                LineColor = None)
 
             # Text
             String = "Some text"
-            self.Canvas.AddText("Top Left",x,y,Size = 14,Color = "Yellow",BackgroundColor = "Blue", Position = "tl")
-            self.Canvas.AddText("Bottom Left",x,y,Size = 14,Color = "Cyan",BackgroundColor = "Black",Position = "bl")
-            self.Canvas.AddText("Top Right",x,y,Size = 14,Color = "Black",BackgroundColor = "Cyan",Position = "tr")
-            self.Canvas.AddText("Bottom Right",x,y,Size = 14,Color = "Blue",BackgroundColor = "Yellow",Position = "br")
-            Canvas.AddPointSet((x,y), Color = "White", Diameter = 2)
+            self.Canvas.AddText("Top Left",Point,Size = 14,Color = "Yellow",BackgroundColor = "Blue", Position = "tl")
+            self.Canvas.AddText("Bottom Left",Point,Size = 14,Color = "Cyan",BackgroundColor = "Black",Position = "bl")
+            self.Canvas.AddText("Top Right",Point,Size = 14,Color = "Black",BackgroundColor = "Cyan",Position = "tr")
+            self.Canvas.AddText("Bottom Right",Point,Size = 14,Color = "Blue",BackgroundColor = "Yellow",Position = "br")
+            Canvas.AddPointSet((Point), Color = "White", Diameter = 2)
 
-            x,y  = (0, 2)
+            Point  = (3, 2)
 
-            Canvas.AddPointSet((x,y), Color = "White", Diameter = 2)
-            self.Canvas.AddText("Top Center",x,y,Size = 14,Color = "Black",Position = "tc")
-            self.Canvas.AddText("Bottom Center",x,y,Size = 14,Color = "White",Position = "bc")
+            Canvas.AddPointSet((Point), Color = "White", Diameter = 2)
+            self.Canvas.AddText("Top Center",Point,Size = 14,Color = "Black",Position = "tc")
+            self.Canvas.AddText("Bottom Center",Point,Size = 14,Color = "White",Position = "bc")
 
-            x,y  = (0, 4)
+            Point  = (3, 4)
 
-            Canvas.AddPointSet((x,y), Color = "White", Diameter = 2)
-            self.Canvas.AddText("Center Right",x,y,Size = 14,Color = "Black",Position = "cr")
-            self.Canvas.AddText("Center Left",x,y,Size = 14,Color = "Black",Position = "cl")
+            Canvas.AddPointSet((Point), Color = "White", Diameter = 2)
+            self.Canvas.AddText("Center Right",Point,Size = 14,Color = "Black",Position = "cr")
+            self.Canvas.AddText("Center Left",Point,Size = 14,Color = "Black",Position = "cl")
 
-            x,y  = (0, -2)
+            Point  = (3, -2)
 
-            Canvas.AddPointSet((x,y), Color = "White", Diameter = 2)
-            self.Canvas.AddText("Center Center",x,y,Size = 14,Color = "Black",Position = "cc")
+            Canvas.AddPointSet((Point), Color = "White", Diameter = 2)
+            self.Canvas.AddText("Center Center",
+                                Point, Size = 14,
+                                Color = "Black",
+                                Position = "cc")
 
-            self.Canvas.AddText("40 Pixels",-10,8,Size = 40)
-            self.Canvas.AddText("20 Pixels",-10,5,Size = 20)
-            self.Canvas.AddText("10 Pixels",-10,3,Size = 10)
+            self.Canvas.AddText("40 Pixels", (-10,8), Size = 40)
+            self.Canvas.AddText("20 Pixels", (-10,5), Size = 20)
+            self.Canvas.AddText("10 Pixels", (-10,3), Size = 10)
 
-            self.Canvas.AddText("MODERN Font", -10, 0, Family = wx.MODERN)
-            self.Canvas.AddText("DECORATIVE Font", -10, -1, Family = wx.DECORATIVE)
-            self.Canvas.AddText("ROMAN Font", -10, -2, Family = wx.ROMAN)
-            self.Canvas.AddText("SCRIPT Font", -10, -3, Family = wx.SCRIPT)
-            self.Canvas.AddText("ROMAN BOLD Font", -10, -4, Family = wx.ROMAN, Weight=wx.BOLD)
-            self.Canvas.AddText("ROMAN ITALIC BOLD Font", -10, -5, Family = wx.ROMAN, Weight=wx.BOLD, Style=wx.ITALIC)
+            self.Canvas.AddText("MODERN Font", (-10, 0), Family = wx.MODERN)
+            self.Canvas.AddText("DECORATIVE Font", (-10, -1), Family = wx.DECORATIVE)
+            self.Canvas.AddText("ROMAN Font", (-10, -2), Family = wx.ROMAN)
+            self.Canvas.AddText("SCRIPT Font", (-10, -3), Family = wx.SCRIPT)
+            self.Canvas.AddText("ROMAN BOLD Font", (-10, -4), Family = wx.ROMAN, Weight=wx.BOLD)
+            self.Canvas.AddText("ROMAN ITALIC BOLD Font", (-10, -5), Family = wx.ROMAN, Weight=wx.BOLD, Style=wx.ITALIC)
 
             # NOTE: this font exists on my Linux box..who knows were else you'll find it!
             Font = wx.Font(20, wx.DEFAULT, wx.ITALIC, wx.NORMAL, False, "zapf chancery")
-            self.Canvas.AddText("zapf chancery Font", -10, -6, Font = Font)
+            self.Canvas.AddText("zapf chancery Font", (-10, -6), Font = Font)
 
             self.Canvas.ZoomToBB()
 
@@ -889,46 +940,357 @@ if haveNumeric:
             Canvas.ClearAll()
             Canvas.SetProjectionFun(None)
 
-            x,y  = (0, 0)
+            Point  = (0, 0)
 
-            T = Canvas.AddScaledText("Top Left",x,y,Size = 5,Color = "Yellow",BackgroundColor = "Blue", Position = "tl")
-            T = Canvas.AddScaledText("Bottom Left",x,y,Size = 5,Color = "Cyan",BackgroundColor = "Black",Position = "bl")
-            T = Canvas.AddScaledText("Top Right",x,y,Size = 5,Color = "Black",BackgroundColor = "Cyan",Position = "tr")
-            T = Canvas.AddScaledText("Bottom Right",x,y,Size = 5,Color = "Blue",BackgroundColor = "Yellow",Position = "br")
-            Canvas.AddPointSet((x,y), Color = "Red", Diameter = 4)
+            T = Canvas.AddScaledText("Top Left",
+                                     Point,
+                                     Size = 5,
+                                     Color = "Yellow",
+                                     BackgroundColor = "Blue",
+                                     Position = "tl")
+            T = Canvas.AddScaledText("Bottom Left",Point,Size = 5,Color = "Cyan",BackgroundColor = "Black",Position = "bl")
+            T = Canvas.AddScaledText("Top Right",Point,Size = 5,Color = "Black",BackgroundColor = "Cyan",Position = "tr")
+            T = Canvas.AddScaledText("Bottom Right",Point,Size = 5,Color = "Blue",BackgroundColor = "Yellow",Position = "br")
+            Canvas.AddPointSet((Point), Color = "Red", Diameter = 4)
 
 
-            x,y  = (0, 20)
+            Point  = (0, 20)
 
-            Canvas.AddScaledText("Top Center",x,y,Size = 7,Color = "Black",Position = "tc")
-            Canvas.AddScaledText("Bottom Center",x,y,Size = 7,Color = "White",Position = "bc")
-            Canvas.AddPointSet((x,y), Color = "White", Diameter = 4)
+            Canvas.AddScaledText("Top Center",Point,Size = 7,Color = "Black",Position = "tc")
+            Canvas.AddScaledText("Bottom Center",Point,Size = 7,Color = "White",Position = "bc")
+            Canvas.AddPointSet((Point), Color = "White", Diameter = 4)
 
-            x,y  = (0, -20)
+            Point  = (0, -20)
 
-            Canvas.AddScaledText("Center Right",x,y,Size = 9,Color = "Black",Position = "cr")
-            Canvas.AddScaledText("Center Left",x,y,Size = 9,Color = "Black",Position = "cl")
-            Canvas.AddPointSet((x,y), Color = "White", Diameter = 4)
+            Canvas.AddScaledText("Center Right",Point,Size = 9,Color = "Black",Position = "cr")
+            Canvas.AddScaledText("Center Left",Point,Size = 9,Color = "Black",Position = "cl")
+            Canvas.AddPointSet((Point), Color = "White", Diameter = 4)
 
             x = -200
 
-            self.Canvas.AddScaledText("MODERN Font", x, 0, Size = 7, Family = wx.MODERN, Color = (0,0,0))
-            self.Canvas.AddScaledText("DECORATIVE Font", x, -10, Size = 7, Family = wx.DECORATIVE, Color = (0,0,1))
-            self.Canvas.AddScaledText("ROMAN Font", x, -20, Size = 7, Family = wx.ROMAN)
-            self.Canvas.AddScaledText("SCRIPT Font", x, -30, Size = 7, Family = wx.SCRIPT)
-            self.Canvas.AddScaledText("ROMAN BOLD Font", x, -40, Size = 7, Family = wx.ROMAN, Weight=wx.BOLD)
-            self.Canvas.AddScaledText("ROMAN ITALIC BOLD Font", x, -50, Size = 7, Family = wx.ROMAN, Weight=wx.BOLD, Style=wx.ITALIC)
+            self.Canvas.AddScaledText("MODERN Font", (x, 0), Size = 7, Family = wx.MODERN, Color = (0,0,0))
+            self.Canvas.AddScaledText("DECORATIVE Font", (x, -10), Size = 7, Family = wx.DECORATIVE, Color = (0,0,1))
+            self.Canvas.AddScaledText("ROMAN Font", (x, -20), Size = 7, Family = wx.ROMAN)
+            self.Canvas.AddScaledText("SCRIPT Font", (x, -30), Size = 7, Family = wx.SCRIPT)
+            self.Canvas.AddScaledText("ROMAN BOLD Font", (x, -40), Size = 7, Family = wx.ROMAN, Weight=wx.BOLD)
+            self.Canvas.AddScaledText("ROMAN ITALIC BOLD Font", (x, -50), Size = 7, Family = wx.ROMAN, Weight=wx.BOLD, Style=wx.ITALIC)
             Canvas.AddPointSet((x,0), Color = "White", Diameter = 4)
 
 
             # NOTE: this font exists on my Linux box..who knows were else you'll find it!
-            x,y = (-100, 50)
+            Point = (-100, 50)
             Font = wx.Font(12, wx.DEFAULT, wx.ITALIC, wx.NORMAL, False, "zapf chancery")
-            T = self.Canvas.AddScaledText("zapf chancery Font", x, y, Size = 20, Font = Font, Position = 'bc')
+            T = self.Canvas.AddScaledText("zapf chancery Font", Point, Size = 20, Font = Font, Position = 'bc')
 
-            x,y = (-50, -50)
+            Point = (-50, -50)
             Font = wx.Font(12, wx.DEFAULT, wx.ITALIC, wx.NORMAL, False, "bookman")
-            T = self.Canvas.AddScaledText("Bookman Font", x, y, Size = 8, Font = Font)
+            T = self.Canvas.AddScaledText("Bookman Font", Point, Size = 8, Font = Font)
+
+            self.Canvas.ZoomToBB()
+
+        def TestScaledTextBox(self, event= None):
+            wx.GetApp().Yield()
+
+            self.UnBindAllMouseEvents()
+            Canvas = self.Canvas
+            Canvas.ClearAll()
+            Canvas.SetProjectionFun(None)
+
+            Point = (45,40)
+            Box = Canvas.AddScaledTextBox("A Two Line\nString",
+                                          Point,
+                                          2,
+                                          Color = "Black",
+                                          BackgroundColor = None,
+                                          LineColor = "Red",
+                                          LineStyle = "Solid",
+                                          LineWidth = 1,
+                                          Width = None,
+                                          PadSize = 5,
+                                          Family = wx.ROMAN,
+                                          Style = wx.NORMAL,
+                                          Weight = wx.NORMAL,
+                                          Underline = False,
+                                          Position = 'br',
+                                          Alignment = "left",
+                                          InForeground = False)
+
+            # All defaults
+            Box = Canvas.AddScaledTextBox("A Two Line\nString",
+                                          Point,
+                                          2)
+
+            Box = Canvas.AddScaledTextBox("A Two Line\nString",
+                                          Point,
+                                          2,
+                                          BackgroundColor = "Yellow",
+                                          LineColor = "Red",
+                                          LineStyle = "Solid",
+                                          PadSize = 5,
+                                          Family = wx.TELETYPE,
+                                          Position = 'bl')
+
+            Box = Canvas.AddScaledTextBox("A String\nThis box is clickable",
+                                          Point,
+                                          2,
+                                          BackgroundColor = "Yellow",
+                                          LineColor = "Red",
+                                          LineStyle = "Solid",
+                                          PadSize = 5,
+                                          Family = wx.TELETYPE,
+                                          Position = 'tr')
+
+            Box.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.binding2)
+
+            Canvas.AddPoint(Point, Diameter = 4)
+
+            Point = (45,15)
+            Box = Canvas.AddScaledTextBox("A Two Line\nString",
+                                          Point,
+                                          2,
+                                          Color = "Black",
+                                          BackgroundColor = 'Red',
+                                          LineColor = "Blue",
+                                          LineStyle = "LongDash",
+                                          LineWidth = 2,
+                                          Width = None,
+                                          PadSize = 5,
+                                          Family = wx.TELETYPE,
+                                          Style = wx.NORMAL,
+                                          Weight = wx.NORMAL,
+                                          Underline = False,
+                                          Position = 'cr',
+                                          Alignment = "left",
+                                          InForeground = False)
+
+            Box = Canvas.AddScaledTextBox("A Two Line\nString",
+                                          Point,
+                                          1.5,
+                                          Color = "Black",
+                                          BackgroundColor = 'Red',
+                                          LineColor = "Blue",
+                                          LineStyle = "LongDash",
+                                          LineWidth = 2,
+                                          Width = None,
+                                          PadSize = 5,
+                                          Family = wx.TELETYPE,
+                                          Style = wx.NORMAL,
+                                          Weight = wx.NORMAL,
+                                          Underline = False,
+                                          Position = 'cl',
+                                          Alignment = "left",
+                                          InForeground = False)
+
+            Canvas.AddPoint(Point, Diameter = 4)
+
+            Point = (45,-10)
+            Box = Canvas.AddScaledTextBox("A Two Line\nString",
+                                          Point,
+                                          2,
+                                          Color = "Black",
+                                          BackgroundColor = 'Red',
+                                          LineColor = "Blue",
+                                          LineStyle = "LongDash",
+                                          LineWidth = 2,
+                                          Width = None,
+                                          PadSize = 3,
+                                          Family = wx.TELETYPE,
+                                          Style = wx.NORMAL,
+                                          Weight = wx.NORMAL,
+                                          Underline = False,
+                                          Position = 'tc',
+                                          Alignment = "left",
+                                          InForeground = False)
+
+            Box = Canvas.AddScaledTextBox("A three\nLine\nString",
+                                          Point,
+                                          1.5,
+                                          Color = "Black",
+                                          BackgroundColor = 'Red',
+                                          LineColor = "Blue",
+                                          LineStyle = "LongDash",
+                                          LineWidth = 2,
+                                          Width = None,
+                                          PadSize = 0.5,
+                                          Family = wx.TELETYPE,
+                                          Style = wx.NORMAL,
+                                          Weight = wx.NORMAL,
+                                          Underline = False,
+                                          Position = 'bc',
+                                          Alignment = "left",
+                                          InForeground = False)
+
+
+            Canvas.AddPoint(Point, Diameter = 4)
+
+            Box = Canvas.AddScaledTextBox("Some Auto Wrapped Text. There is enough to do.",
+                                          (80,40),
+                                          2,
+                                          BackgroundColor = 'White',
+                                          LineWidth = 2,
+                                          Width = 20,
+                                          PadSize = 0.5,
+                                          Family = wx.TELETYPE,
+                                          )
+
+            Box = Canvas.AddScaledTextBox("Some more auto wrapped text. Wrapped to a different width.\n\nThis is another paragraph.",
+                                          (80,20),
+                                          2,
+                                          BackgroundColor = 'White',
+                                          LineWidth = 2,
+                                          Width = 40,
+                                          PadSize = 0.5,
+                                          Family = wx.ROMAN,
+                                          Alignment = "right"
+                                          )
+            Point = Numeric.array((100, -20), Numeric.Float)
+            Box = Canvas.AddScaledTextBox("Here is even more auto wrapped text. This time the line spacing is set to 0.8. \n\nThe Padding is set to 0.",
+                                          Point,
+                                          Size = 3,
+                                          BackgroundColor = 'White',
+                                          LineWidth = 1,
+                                          Width = 40,
+                                          PadSize = 0.0,
+                                          Family = wx.ROMAN,
+                                          Position = "cc",
+                                          LineSpacing = 0.8
+                                          )
+            Canvas.AddPoint(Point, "Red", 2)
+
+            Point = Numeric.array((0, -40), Numeric.Float)
+    #        Point = Numeric.array((0, 0), Numeric.Float)
+            for Position in ["tl", "bl", "tr", "br"]:
+    #        for Position in ["br"]:
+                Box = Canvas.AddScaledTextBox("Here is a\nfour liner\nanother line\nPosition=%s"%Position,
+                                          Point,
+                                          Size = 4,
+                                          Color = "Red",
+                                          BackgroundColor = None,#'LightBlue',
+                                          LineWidth = 1,
+                                          LineColor = "White",
+                                          Width = None,
+                                          PadSize = 2,
+                                          Family = wx.ROMAN,
+                                          Position = Position,
+                                          LineSpacing = 0.8
+                                          )
+            Canvas.AddPoint(Point, "Red", 4)
+
+            Point = Numeric.array((-20, 60), Numeric.Float)
+            Box = Canvas.AddScaledTextBox("Here is some\ncentered\ntext",
+                                          Point,
+                                          Size = 4,
+                                          Color = "Red",
+                                          BackgroundColor = 'LightBlue',
+                                          LineWidth = 1,
+                                          LineColor = "White",
+                                          Width = None,
+                                          PadSize = 2,
+                                          Family = wx.ROMAN,
+                                          Position = "tl",
+                                          Alignment = "center",
+                                          LineSpacing = 0.8
+                                          )
+
+            Point = Numeric.array((-20, 20), Numeric.Float)
+            Box = Canvas.AddScaledTextBox("Here is some\nright aligned\ntext",
+                                          Point,
+                                          Size = 4,
+                                          Color = "Red",
+                                          BackgroundColor = 'LightBlue',
+                                          LineColor = None,
+                                          Width = None,
+                                          PadSize = 2,
+                                          Family = wx.ROMAN,
+                                          Position = "tl",
+                                          Alignment = "right",
+                                          LineSpacing = 0.8
+                                          )
+
+            Point = Numeric.array((100, -60), Numeric.Float)
+            Box = Canvas.AddScaledTextBox("Here is some auto wrapped text. This time it is centered, rather than right aligned.\n\nThe Padding is set to 2.",
+                                          Point,
+                                          Size = 3,
+                                          BackgroundColor = 'White',
+                                          LineWidth = 1,
+                                          Width = 40,
+                                          PadSize = 2.0,
+                                          Family = wx.ROMAN,
+                                          Position = "cc",
+                                          LineSpacing = 0.8,
+                                          Alignment = 'center',
+                                          )
+
+
+
+
+            self.Canvas.ZoomToBB()
+
+        def binding2(self, event):
+            self.Log("I'm the TextBox")
+
+        def TestBitmap(self, event= None):
+            wx.GetApp().Yield()
+
+            self.UnBindAllMouseEvents()
+            Canvas = self.Canvas
+            Canvas.ClearAll()
+            Canvas.SetProjectionFun(None)
+
+            Canvas.AddRectangle((10, 20),
+                                (400, 100),
+                                LineWidth = 3,
+                                LineColor = "Blue",
+                                FillColor = "Red")
+
+            bmp = Resources.getMagPlusBitmap()
+
+            Canvas.AddText("These are Unscaled Bitmaps:", (140, 90))
+          
+            Point = (150, 50)
+            BitMap = Canvas.AddBitmap(bmp, Point, Position = "cc" )
+            Canvas.AddPoint(Point, Diameter=4, Color="Green")
+
+            Point = (200, 50)
+            BitMap = Canvas.AddBitmap(bmp, Point, Position = "br" )
+            Canvas.AddPoint(Point, Diameter=4, Color="Green")
+
+            Point = (200, 50)
+            BitMap = Canvas.AddBitmap(bmp, Point, Position = "bl" )
+            Canvas.AddPoint(Point, Diameter=4, Color="Green")
+
+            Point = (200, 50)
+            BitMap = Canvas.AddBitmap(bmp, Point, Position = "tr" )
+            Canvas.AddPoint(Point, Diameter=4, Color="Green")
+
+            Point = (200, 50)
+            BitMap = Canvas.AddBitmap(bmp, Point, Position = "tl" )
+            Canvas.AddPoint(Point, Diameter=4, Color="Green")
+
+            Point = (250, 50)
+            BitMap = Canvas.AddBitmap(bmp, Point, Position = "cr" )
+            Canvas.AddPoint(Point, Diameter=4, Color="Green")
+
+            Point = (250, 50)
+            BitMap = Canvas.AddBitmap(bmp, Point, Position = "cl" )
+            Canvas.AddPoint(Point, Diameter=4, Color="Green")
+
+            Point = (300, 50)
+            BitMap = Canvas.AddBitmap(bmp, Point, Position = "tc" )
+            Canvas.AddPoint(Point, Diameter=4, Color="Green")
+
+            Point = (300, 50)
+            BitMap = Canvas.AddBitmap(bmp, Point, Position = "bc" )
+            Canvas.AddPoint(Point, Diameter=4, Color="Green")
+
+            Canvas.AddScaledText("These are Scaled Bitmaps:", (220, -60), Size = 10, Position = "tr")
+            Point = (250, -100)
+            BitMap = Canvas.AddScaledBitmap(bmp, Point, Height = 50, Position = "bc" )
+            BitMap = Canvas.AddScaledBitmap(bmp, Point, Height = 50, Position = "tc" )
+            Canvas.AddPoint(Point, Diameter=4, Color="Green")
+
+            Point = (300, -100)
+            BitMap = Canvas.AddScaledBitmap(Resources.getMondrianImage(), Point, Height = 50)
 
             self.Canvas.ZoomToBB()
 
@@ -941,7 +1303,9 @@ if haveNumeric:
             self.Canvas.ClearAll()
             self.Canvas.SetProjectionFun("FlatEarth")
             #start = time.clock()
-            Shorelines = Read_MapGen(os.path.join("data",'world.dat'),stats = 0)
+            self.Log("Loading Map from a File")
+            wx.GetApp().Yield() # so log text will get displayed now.
+            Shorelines = self.Read_MapGen(os.path.join("data",'world.dat'),stats = 0)
             #print "It took %f seconds to load %i shorelines"%(time.clock() - start,len(Shorelines) )
             #start = time.clock()
             for segment in Shorelines:
@@ -995,8 +1359,8 @@ if haveNumeric:
             # Pointset
             coords = []
             for i in range(1000):
-                x,y = (random.uniform(BigRange[0],BigRange[1]),random.uniform(BigRange[0],BigRange[1]))
-                coords.append( (x,y) )
+                Point = (random.uniform(BigRange[0],BigRange[1]),random.uniform(BigRange[0],BigRange[1]))
+                coords.append( (Point) )
             print "Drawing the Points"
             start = time.clock()
             for Point in coords:
@@ -1022,21 +1386,19 @@ if haveNumeric:
             self.ColorObjectsText = []
             ##One of each object:
             # Rectangle
-            x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
+            Point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
             lw = random.randint(1,5)
             cf = random.randint(0,len(colors)-1)
-            h = random.randint(1,5)
-            w = random.randint(1,5)
-            self.Rectangle = Canvas.AddRectangle(x,y,w,h,LineWidth = lw,FillColor = colors[cf])
+            wh = ( random.randint(1,5), random.randint(1,5) )
+            self.Rectangle = Canvas.AddRectangle(Point, wh, LineWidth = lw, FillColor = colors[cf])
             self.ColorObjectsAll.append(self.Rectangle)
 
             # Ellipse
-            x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
+            Point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
             lw = random.randint(1,5)
             cf = random.randint(0,len(colors)-1)
-            h = random.randint(1,5)
-            w = random.randint(1,5)
-            self.Ellipse = Canvas.AddEllipse(x,y,h,w,LineWidth = lw,FillColor = colors[cf])
+            wh = ( random.randint(1,5), random.randint(1,5) )
+            self.Ellipse = Canvas.AddEllipse(Point, wh, LineWidth = lw, FillColor = colors[cf])
             self.ColorObjectsAll.append(self.Ellipse)
 
             # Point 
@@ -1048,12 +1410,12 @@ if haveNumeric:
             self.ColorObjectsColor.append(Canvas.AddPoint(xy, colors[cf], D))
 
             # Circle
-            x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
+            Point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
             D = random.randint(1,5)
             lw = random.randint(1,5)
             cf = random.randint(0,len(colors)-1)
             cl = random.randint(0,len(colors)-1)
-            self.Circle = Canvas.AddCircle(x,y,D,LineWidth = lw,LineColor = colors[cl],FillColor = colors[cf])
+            self.Circle = Canvas.AddCircle(Point, D, LineWidth = lw, LineColor = colors[cl], FillColor = colors[cf])
             self.ColorObjectsAll.append(self.Circle)
 
             # Line
@@ -1099,20 +1461,20 @@ if haveNumeric:
             String = "Unscaled text"
             ts = random.randint(10,40)
             cf = random.randint(0,len(colors)-1)
-            x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
-            self.ColorObjectsText.append(Canvas.AddText(String, x, y, Size = ts, Color = colors[cf], Position = "cc"))
+            Point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
+            self.ColorObjectsText.append(Canvas.AddText(String, Point, Size = ts, Color = colors[cf], Position = "cc"))
 
             # Scaled Text
             String = "Scaled text"
             ts = random.random()*3 + 0.2
             cf = random.randint(0,len(colors)-1)
-            x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
-            self.ColorObjectsText.append(Canvas.AddScaledText(String, x, y, Size = ts, Color = colors[cf], Position = "cc"))
+            Point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
+            self.ColorObjectsText.append(Canvas.AddScaledText(String, Point, Size = ts, Color = colors[cf], Position = "cc"))
 
             # A "Button"
-            Button = Canvas.AddRectangle(-10, -12, 20, 3, LineStyle = None, FillColor = "Red")
+            Button = Canvas.AddRectangle((-10, -12), (20, 3), LineStyle = None, FillColor = "Red")
             Canvas.AddScaledText("Click Here To Change Properties",
-                                 0, -10.5,
+                                 (0, -10.5),
                                  Size = 0.7,
                                  Color = "Black",
                                  Position = "cc")
@@ -1144,12 +1506,124 @@ if haveNumeric:
             self.PointSet.SetDiameter(random.randint(1,8))
             self.Point.SetDiameter(random.randint(1,8))
             for Object in (self.Rectangle, self.Ellipse):
-                x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
-                w,h = random.randint(1,5), random.randint(1,5)
-                Object.SetShape(x,y,w,h)
+                Point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
+                wh = ( random.randint(1,5), random.randint(1,5) )
+                Object.SetShape(Point, wh)
+            self.Canvas.Draw(Force = True)
+
+        def ArrowTest(self,event=None):
+            wx.GetApp().Yield()
+            self.UnBindAllMouseEvents()
+            Canvas = self.Canvas
+
+            Canvas.ClearAll()
+            Canvas.SetProjectionFun(None)
+
+            # put in a rectangle to get a bounding box
+            Canvas.AddRectangle((0,0), (20,20), LineColor = None)
+
+            # Draw some Arrows
+            Canvas.AddArrow((10,10),Length = 40, Direction = 0)
+            Canvas.AddArrow((10,10),Length = 50, Direction = 45 ,LineWidth = 2, LineColor = "Black", ArrowHeadAngle = 20)
+            Canvas.AddArrow((10,10),Length = 60, Direction = 90 ,LineWidth = 3, LineColor = "Red",   ArrowHeadAngle = 30)
+            Canvas.AddArrow((10,10),Length = 70, Direction = 135,LineWidth = 4, LineColor = "Red",   ArrowHeadAngle = 40)
+            Canvas.AddArrow((10,10),Length = 80, Direction = 180,LineWidth = 5, LineColor = "Blue",  ArrowHeadAngle = 50)
+            Canvas.AddArrow((10,10),Length = 90, Direction = 225,LineWidth = 4, LineColor = "Blue",  ArrowHeadAngle = 60)
+            Canvas.AddArrow((10,10),Length = 100,Direction = 270,LineWidth = 3, LineColor = "Green", ArrowHeadAngle = 70)
+            Canvas.AddArrow((10,10),Length = 110,Direction = 315,LineWidth = 2, LineColor = "Green", ArrowHeadAngle = 90 )
+
+            Canvas.AddText("Clickable Arrow", (4,18), Position = "bc")
+            Arrow = Canvas.AddArrow((4,18), 80, Direction = 90 ,LineWidth = 3, LineColor = "Red",   ArrowHeadAngle = 30)
+            Arrow.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.ArrowClicked)
+
+            Canvas.AddText("Changable Arrow", (16,4), Position = "cc")
+            self.RotArrow = Canvas.AddArrow((16,4), 80, Direction = 0 ,LineWidth = 3, LineColor = "Green",   ArrowHeadAngle = 30)
+            self.RotArrow.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RotateArrow)
+
+            Canvas.ZoomToBB()
+
+        def ArrowClicked(self,event):
+            print "The Arrow was Clicked"
+
+        def RotateArrow(self,event):
+            ##print "The Changeable Arrow was Clicked"
+            ## You can do them either one at a time, or both at once
+            ## Doing them both at once prevents the arrow points from being calculated twice
+            #self.RotArrow.SetDirection(self.RotArrow.Direction + random.uniform(-90,90))
+            #self.RotArrow.SetLength(self.RotArrow.Length + random.randint(-20,20))
+            self.RotArrow.SetLengthDirection(self.RotArrow.Length + random.randint(-20,20),
+                                             self.RotArrow.Direction + random.uniform(-90,90) )
 
             self.Canvas.Draw(Force = True)
 
+        def HideTest(self, event=None):
+            wx.GetApp().Yield()
+
+            self.UnBindAllMouseEvents()
+            Canvas = self.Canvas
+            Canvas.ClearAll()
+            Canvas.SetProjectionFun(None)
+
+            Range = (-10,10)
+
+            # Create a couple random Polygons
+            points = []
+            for j in range(6):
+                point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
+                points.append(point)
+            Poly = Canvas.AddPolygon(points,
+                                     LineWidth = 2,
+                                     LineColor = "Black",
+                                     FillColor = "LightBlue",
+                                     FillStyle = 'Solid')
+
+            points = []
+            for j in range(6):
+                point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
+                points.append(point)
+            Poly2 = Canvas.AddPolygon(points,
+                                     LineWidth = 2,
+                                     LineColor = "Black",
+                                     FillColor = "Purple",
+                                     FillStyle = 'Solid',
+                                     InForeground = True)
+
+            HideButton = Canvas.AddScaledTextBox("Click To Hide\nBackground Polygon",
+                                                      (-10, 0),
+                                                      .5,
+                                                      BackgroundColor="Red",
+                                                      PadSize = 0.5,
+                                                      Position = 'tr',
+                                                      Alignment="center",
+                                                      )
+            HideButton.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.HidePoly)
+            HideButton.HidePoly = Poly
+            
+            HideButton2 = Canvas.AddScaledTextBox("Click To Hide\nForeground Polygon",
+                                                      (-10, 5),
+                                                      .5,
+                                                      BackgroundColor="Red",
+                                                      PadSize = 0.5,
+                                                      Position = 'tr',
+                                                      Alignment="center",
+                                                      )
+            # Put a reference to the Polygon in the Button object
+            HideButton2.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.HidePoly)
+            HideButton2.HidePoly = Poly2
+            
+
+            Canvas.ZoomToBB()
+
+        def HidePoly(self, Button):
+            Poly = Button.HidePoly
+            if Poly.Visible:
+                Poly.Hide()
+                Button.SetText(Button.String.replace("Hide","Show"))
+            else:
+                Poly.Show()
+                Button.SetText(Button.String.replace("Show", "Hide"))
+            self.Canvas.Draw(True)
+
         def TempTest(self, event= None):
             wx.GetApp().Yield()
 
@@ -1202,7 +1676,111 @@ if haveNumeric:
             print "Point Num: %i Hit"%Point.VerticeNum
             self.SelectedPoint = Point
 
+        def Read_MapGen(self, filename, stats = 0,AllLines=0):
+            """
+            This function reads a MapGen Format file, and
+            returns a list of NumPy arrays with the line segments in them.
+
+            Each NumPy array in the list is an NX2 array of Python Floats.
+
+            The demo should have come with a file, "world.dat" that is the
+            shorelines of the whole world, in MapGen format.
+
+            """
+            import string
+            file = open(filename,'rt')
+            data = file.readlines()
+            data = map(string.strip,data)
+
+            Shorelines = []
+            segment = []
+            for line in data:
+                if line:
+                    if line == "# -b": #New segment beginning
+                        if segment: Shorelines.append(Numeric.array(segment))
+                        segment = []
+                    else:
+                        segment.append(map(float,string.split(line)))
+            if segment: Shorelines.append(Numeric.array(segment))
+
+            if stats:
+                NumSegments = len(Shorelines)
+                NumPoints = 0
+                for segment in Shorelines:
+                    NumPoints = NumPoints + len(segment)
+                AvgPoints = NumPoints / NumSegments
+                print "Number of Segments: ", NumSegments
+                print "Average Number of Points per segment: ",AvgPoints
+            if AllLines:
+                Lines = []
+                for segment in Shorelines:
+                    Lines.append(segment[0])
+                    for point in segment[1:-1]:
+                        Lines.append(point)
+                        Lines.append(point)
+                    Lines.append(segment[-1])
+                return Lines
+            else:
+                return Shorelines
+    return DrawFrame 
+
+#---------------------------------------------------------------------------
+      
+if __name__ == "__main__":
+
+    import wx
+   
+    
+    # check options:
+    import sys, getopt
+    optlist, args = getopt.getopt(sys.argv[1:],'l',["local",
+                                                    "all",
+                                                    "text",
+                                                    "map",
+                                                    "stext",
+                                                    "stextbox",
+                                                    "bitmap",
+                                                    "hit",
+                                                    "hitf",
+                                                    "animate",
+                                                    "speed",
+                                                    "temp",
+                                                    "props",
+                                                    "arrow",
+                                                    "hide"])
 
+    if not haveNumeric:
+        raise ImportError(errorText)
+    StartUpDemo = "all" # the default
+    for opt in optlist:
+        if opt[0] == "--all":
+            StartUpDemo = "all"
+        elif opt[0] == "--text":
+            StartUpDemo = "text"
+        elif opt[0] == "--map":
+            StartUpDemo = "map"
+        elif opt[0] == "--stext":
+            StartUpDemo = "stext"
+        elif opt[0] == "--stextbox":
+            StartUpDemo = "stextbox"
+        elif opt[0] == "--bitmap":
+            StartUpDemo = "bitmap"
+        elif opt[0] == "--hit":
+            StartUpDemo = "hit"
+        elif opt[0] == "--hitf":
+            StartUpDemo = "hitf"
+        elif opt[0] == "--animate":
+            StartUpDemo = "animate"
+        elif opt[0] == "--speed":
+            StartUpDemo = "speed"
+        elif opt[0] == "--temp":
+            StartUpDemo = "temp"
+        elif opt[0] == "--props":
+            StartUpDemo = "props"
+        elif opt[0] == "--arrow":
+            StartUpDemo = "arrow"
+        elif opt[0] == "--hide":
+            StartUpDemo = "hide"
 
     class DemoApp(wx.App):
         """
@@ -1259,6 +1837,7 @@ if haveNumeric:
 
         def OnInit(self):
             wx.InitAllImageHandlers()
+            DrawFrame = BuildDrawFrame()
             frame = DrawFrame(None, -1, "FloatCanvas Demo App",wx.DefaultPosition,(700,700))
 
             self.SetTopWindow(frame)
@@ -1267,8 +1846,12 @@ if haveNumeric:
             ## check to see if the demo is set to start in a particular mode.
             if StartUpDemo == "text":
                 frame.TestText()
-            if StartUpDemo == "stext":
+            elif StartUpDemo == "stext":
                 frame.TestScaledText()
+            elif StartUpDemo == "stextbox":
+                frame.TestScaledTextBox()
+            elif StartUpDemo == "bitmap":
+                frame.TestBitmap()
             elif StartUpDemo == "all":
                 frame.DrawTest()
             elif StartUpDemo == "map":
@@ -1290,98 +1873,77 @@ if haveNumeric:
             elif StartUpDemo == "props":
                 "starting PropertiesChange Test"
                 frame.PropertiesChangeTest()
+            elif StartUpDemo == "arrow":
+                "starting arrow Test"
+                frame.ArrowTest()
+            elif StartUpDemo == "hide":
+                "starting Hide Test"
+                frame.HideTest()
 
             return True
 
-    def Read_MapGen(filename,stats = 0,AllLines=0):
-        """
-        This function reads a MapGen Format file, and
-        returns a list of NumPy arrays with the line segments in them.
-
-        Each NumPy array in the list is an NX2 array of Python Floats.
-
-        The demo should have come with a file, "world.dat" that is the
-        shorelines of the whole world, in MapGen format.
-
-        """
-        import string
-        file = open(filename,'rt')
-        data = file.readlines()
-        data = map(string.strip,data)
-
-        Shorelines = []
-        segment = []
-        for line in data:
-            if line:
-                if line == "# -b": #New segment beginning
-                    if segment: Shorelines.append(Numeric.array(segment))
-                    segment = []
-                else:
-                    segment.append(map(float,string.split(line)))
-        if segment: Shorelines.append(Numeric.array(segment))
-
-        if stats:
-            NumSegments = len(Shorelines)
-            NumPoints = 0
-            for segment in Shorelines:
-                NumPoints = NumPoints + len(segment)
-            AvgPoints = NumPoints / NumSegments
-            print "Number of Segments: ", NumSegments
-            print "Average Number of Points per segment: ",AvgPoints
-        if AllLines:
-            Lines = []
-            for segment in Shorelines:
-                Lines.append(segment[0])
-                for point in segment[1:-1]:
-                    Lines.append(point)
-                    Lines.append(point)
-                Lines.append(segment[-1])
-            return Lines
-        else:
-            return Shorelines
-
-#---------------------------------------------------------------------------
-## for the wxPython demo:
-
-def runTest(frame, nb, log):
-    win = TestPanel(nb, log)
-    return win
-
-
-if haveNumeric:    
-    try:
-        import floatcanvas
-    except ImportError: # if it's not there locally, try the wxPython lib.
-        from wx.lib import floatcanvas
-
-    overview = floatcanvas.__doc__
+    app = DemoApp(False)# put in True if you want output to go to it's own window.
+    app.MainLoop()
 
 else:
-    overview = ""
-    
-
-
-      
-if __name__ == "__main__":
+    # It's not running stand-alone, set up for wxPython demo.
+    # don't  neeed wxversion here.
+    import wx
     if not haveNumeric:
-        print errorText
-    else:
-        app = DemoApp(False)# put in True if you want output to go to it's own window.
-        app.MainLoop()
-    
-    
-    
-    
-
-
-
-
-
-
-
+        ## TestPanel and runTest used for integration into wxPython Demo
+        class TestPanel(wx.Panel):
+            def __init__(self, parent, log):
+                self.log = log
+                wx.Panel.__init__(self, parent, -1)
+
+                import images
+
+                note1 = wx.StaticText(self, -1, errorText)
+                note2 = wx.StaticText(self, -1, "This is what the FloatCanvas can look like:")
+                S = wx.BoxSizer(wx.VERTICAL)
+                S.Add((10, 10), 1)
+                S.Add(note1, 0, wx.ALIGN_CENTER)
+                S.Add(note2, 0, wx.ALIGN_CENTER | wx.BOTTOM, 4)
+                S.Add(wx.StaticBitmap(self,-1,images.getFloatCanvasBitmap()),0,wx.ALIGN_CENTER)
+                S.Add((10, 10), 1)
+                self.SetSizer(S)
+                self.Layout()
 
+    else:
+        ## TestPanel and runTest used for integration into wxPython Demo
+        class TestPanel(wx.Panel):
+            def __init__(self, parent, log):
+                self.log = log
+                wx.Panel.__init__(self, parent, -1)
+                note1 = wx.StaticText(self, -1, "The FloatCanvas Demo needs")
+                note2 = wx.StaticText(self, -1, "a separate frame")
+                b = wx.Button(self, -1, "Open Demo Frame Now")
+                b.Bind(wx.EVT_BUTTON, self.OnButton)
+
+                S = wx.BoxSizer(wx.VERTICAL)
+                S.Add((10, 10), 1)
+                S.Add(note1, 0, wx.ALIGN_CENTER)
+                S.Add(note2, 0, wx.ALIGN_CENTER | wx.BOTTOM, 5)
+                S.Add(b, 0, wx.ALIGN_CENTER | wx.ALL, 5)
+                S.Add((10, 10), 1)
+                self.SetSizer(S)
+                self.Layout()
+
+            def OnButton(self, evt):
+                DrawFrame = BuildDrawFrame()
+                frame = DrawFrame(None, -1, "FloatCanvas Drawing Window",wx.DefaultPosition,(500,500))
+
+                #win = wx.lib.plot.TestFrame(self, -1, "PlotCanvas Demo")
+                frame.Show()
+                frame.DrawTest()
 
+    def runTest(frame, nb, log):
+        win = TestPanel(nb, log)
+        return win
 
+    # import to get the doc
+    from wx.lib import floatcanvas
+    overview = floatcanvas.__doc__