joyy =  float(self.stick.GetPosition().y)
 
             # Get the joystick range of motion
-            xrange = self.stick.GetXMax() - self.stick.GetXMin()
-            yrange = self.stick.GetYMax() - self.stick.GetYMin()
+            xmin = self.stick.GetXMin()
+            xmax = self.stick.GetXMax()
+            if xmin < 0:
+                xmax += abs(xmin)
+                joyx += abs(xmin)
+                xmin = 0
+            xrange = max(xmax - xmin, 1)
+
+            ymin = self.stick.GetYMin()
+            ymax = self.stick.GetYMax()
+            if ymin < 0:
+                ymax += abs(ymin)
+                joyy += abs(ymin)
+                ymin = 0
+            yrange = max(ymax - ymin, 1)
 
             # calc a ratio of our range versus the joystick range
             xratio = float(edgeSize) / xrange
 
             # calc the displayable value based on position times ratio
             xval = int(joyx * xratio)
-            yval = int(joyy * xratio)
+            yval = int(joyy * yratio)
 
             # and normalize the value from our brush's origin
             x = xval + xorigin
 
             # Now to draw it.
             dc.SetPen(wx.Pen(wx.RED, 2))
-            dc.CrossHair((x, y))
+            dc.CrossHair(x, y)
 
         # Turn off drawing optimization
         dc.EndDrawing()
             self.GetMax = eval('stick.Get%sMax' % token)
 
             # Create our displays and set them up.
-            self.Min = wx.StaticText(self, -1, str(self.GetMin()),
-                                     size=(40,-1), style=wx.ALIGN_RIGHT | wx.ST_NO_AUTORESIZE)
-            self.Max = wx.StaticText(self, -1, str(self.GetMax()),
-                                     size=(40,-1), style=wx.ALIGN_LEFT | wx.ST_NO_AUTORESIZE)
+            self.Min = wx.StaticText(self, -1, str(self.GetMin()), style=wx.ALIGN_RIGHT)
+            self.Max = wx.StaticText(self, -1, str(self.GetMax()), style=wx.ALIGN_LEFT)
             self.bar = AxisBar(self)
 
             sizer.Add(self.Min, 0, wx.ALL | wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 1)
         else:
             val = eval('self.stick.Get%sPosition()' % self.token)
 
+
         #
         # While we might be able to rely on a range of 0-FFFFFF on Win, that might
         # not be true of all drivers on all platforms. Thus, calc the actual full
         # range first.
         #
+        if min < 0:
+            max += abs(min)
+            val += abs(min)
+            min = 0        
         range = float(max - min)
-
+        
         #
         # The relative value is used by the derived wx.Gauge since it is a
         # positive-only control.
         #
         relative = 0
         if range:
-            relative = int(val / range * 1000)
+            relative = int( val / range * 1000)
 
         #
         # Pass both the raw and relative values to the derived Gauge
 
         # Capture Joystick events (if they happen)
         self.Bind(wx.EVT_JOYSTICK_EVENTS, self.OnJoystick)
-
         self.stick.SetMovementThreshold(10)
 
+
     def Calibrate(self, evt=None):
         # Do not try this without a stick
         if not self.stick:
         self.pov.Calibrate()
         self.buttons.Calibrate()
 
+
     def OnJoystick(self, evt=None):
         if not self.stick:
             return
         self.axes.Update()
         self.joy.Update()
         self.pov.Update()
-        self.buttons.Update()
+        if evt is not None and evt.IsButton():
+            self.buttons.Update()
 
 
+    def ShutdownDemo(self):
+        if self.stick:
+            self.stick.ReleaseCapture()
+        self.stick = None
+        
 #----------------------------------------------------------------------------
 
 def runTest(frame, nb, log):
         win = JoystickDemoPanel(nb, log)
         return win
     else:
-        dlg = wx.MessageDialog(
-                frame, 'wx.Joystick is not available on this platform.',
-                'Sorry', wx.OK | wx.ICON_INFORMATION
-                )
-        dlg.ShowModal()
-        dlg.Destroy()
+        from Main import MessagePanel
+        win = MessagePanel(nb, 'wx.Joystick is not available on this platform.',
+                           'Sorry', wx.ICON_WARNING)
+        return win
     
 
 #----------------------------------------------------------------------------