Index: src/sas/plottools/toolbar.py
===================================================================
--- src/sas/plottools/toolbar.py	(revision 3477478de6317fb51d4dd0dbaf9ab2a1236faf28)
+++ src/sas/plottools/toolbar.py	(revision d3d67f06423dc337fd087c81b7cbd502dc7e1084)
@@ -31,12 +31,12 @@
     def _init_toolbar(self):
         self._parent = self.canvas.GetParent()
-        _NTB2_HOME = wx.NewId()
+        self._NTB2_HOME = wx.NewId()
         self._NTB2_BACK = wx.NewId()
         self._NTB2_FORWARD = wx.NewId()
         self._NTB2_PAN = wx.NewId()
         self._NTB2_ZOOM = wx.NewId()
-        _NTB2_SAVE = wx.NewId()
-        _NTB2_PRINT = wx.NewId()
-        _NTB2_RESET = wx.NewId()
+        self._NTB2_SAVE = wx.NewId()
+        self._NTB2_PRINT = wx.NewId()
+        self._NTB2_RESET = wx.NewId()
 
         # for mpl 1.2+ compatibility
@@ -53,5 +53,5 @@
         context_tip += '    right-click the data symbols.'
         context = wx.ArtProvider.GetBitmap(wx.ART_LIST_VIEW, wx.ART_TOOLBAR)
-        self.AddSimpleTool(_NTB2_HOME, context, context_tip, context_tip)
+        self.AddSimpleTool(self._NTB2_HOME, context, context_tip, context_tip)
 
         self.InsertSeparator(1)
@@ -69,28 +69,25 @@
 
         self.AddSeparator()
-        self.AddSimpleTool(_NTB2_SAVE, _load_bitmap('filesave.png'),
+        self.AddSimpleTool(self._NTB2_SAVE, _load_bitmap('filesave.png'),
                            'Save', 'Save plot contents to file')
 
         print_bmp = wx.ArtProvider.GetBitmap(wx.ART_PRINT, wx.ART_TOOLBAR)
-        self.AddSimpleTool(_NTB2_PRINT, print_bmp, 'Print', 'Print plot')
+        self.AddSimpleTool(self._NTB2_PRINT, print_bmp, 'Print', 'Print plot')
 
         reset_bmp = wx.ArtProvider.GetBitmap(wx.ART_GO_HOME, wx.ART_TOOLBAR)
-        self.AddSimpleTool(_NTB2_RESET, reset_bmp, 'Reset', 'Reset graph range')
+        self.AddSimpleTool(self._NTB2_RESET, reset_bmp, 'Reset', 'Reset graph range')
 
-        bind(self, wx.EVT_TOOL, self.on_menu, id=_NTB2_HOME)
+        bind(self, wx.EVT_TOOL, self.context_menu, id=self._NTB2_HOME)
         bind(self, wx.EVT_TOOL, self.forward, id=self._NTB2_FORWARD)
         bind(self, wx.EVT_TOOL, self.back, id=self._NTB2_BACK)
         bind(self, wx.EVT_TOOL, self.zoom, id=self._NTB2_ZOOM)
         bind(self, wx.EVT_TOOL, self.pan, id=self._NTB2_PAN)
-        bind(self, wx.EVT_TOOL, self.save_figure, id=_NTB2_SAVE)
-        bind(self, wx.EVT_TOOL, self.on_print, id=_NTB2_PRINT)
-        bind(self, wx.EVT_TOOL, self.on_reset, id=_NTB2_RESET)
+        bind(self, wx.EVT_TOOL, self.save_figure, id=self._NTB2_SAVE)
+        bind(self, wx.EVT_TOOL, self.print_figure, id=self._NTB2_PRINT)
+        bind(self, wx.EVT_TOOL, self.home, id=self._NTB2_RESET)
 
         self.Realize()
 
     def on_menu(self, event):
-        """
-            Plot menu
-        """
         try:
             self._parent.onToolContextMenu(event=event)
@@ -98,19 +95,80 @@
             logging.error("Plot toolbar could not show menu")
 
-    def on_reset(self, event):
+    def context_menu(self, event):
         """
-            Reset plot
+        Default context menu for a plot panel
+
         """
+        # Slicer plot popup menu
+        wx_id = wx.NewId()
+        popup = wx.Menu()
+        popup.Append(wx_id, '&Save image', 'Save image as PNG')
+        wx.EVT_MENU(self, wx_id, self.save_figure)
+
+        wx_id = wx.NewId()
+        popup.Append(wx_id, '&Print image', 'Print image ')
+        wx.EVT_MENU(self, wx_id, self.print_figure)
+
+        wx_id = wx.NewId()
+        popup.Append(wx_id, '&Copy to Clipboard', 'Copy image to the clipboard')
+        wx.EVT_MENU(self, wx_id, self.copy_figure)
+
+        # Show the popup menu relative to the location of the toolbar
+        self.PopupMenu(popup, (0,0))
+
+
+    def print_figure(self, event):
         try:
-            self._parent.onResetGraph(event=event)
+            _printer = wx.Printer()
+            _printer.Print(self.canvas, PlotPrintout(self.canvas), True)
         except:
-            logging.error("Plot toolbar could not reset plot")
+            import traceback
+            logging.error(traceback.format_exc())
 
-    def on_print(self, event):
+    def copy_figure(self, event):
+        copy_image_to_clipboard(self.canvas)
+
+class PlotPrintout(wx.Printout):
+    """
+    Create the wx.Printout object for matplotlib figure from the PlotPanel.
+    Provides the required OnPrintPage and HasPage overrides.  Other methods
+    may be added/overriden in the future.
+    :TODO: this needs LOTS of TLC .. but fixes immediate problem
+    """
+    def __init__(self, canvas):
         """
-            Print
+        Initialize wx.Printout and get passed figure object
         """
-        try:
-            self.canvas.Printer_Preview(event=event)
-        except:
-            logging.error("Plot toolbar could not print")
+        wx.Printout.__init__(self)
+        self.canvas = canvas
+
+    def OnPrintPage(self, page):
+        """
+        Most rudimentry OnPrintPage overide.  instatiates a dc object, gets
+        its size, gets the size of the figure object, scales it to the dc
+        canvas size keeping the aspect ratio intact, then prints as bitmap
+        """
+        _dc = self.GetDC()
+        (_dcX, _dcY) = _dc.GetSizeTuple()
+        (_bmpX,_bmpY) = self.canvas.GetSize()
+        _scale = min(_dcX/_bmpX, _dcY/_bmpY)
+        _dc.SetUserScale(_scale, _scale)
+        _dc.DrawBitmap(self.canvas.bitmap, 0, 0, False,)
+        return True
+
+    def GetPageInfo(self):
+        """
+        just sets the page to 1 - no flexibility for now
+        """
+        return (1, 1, 1, 1)
+
+
+def copy_image_to_clipboard(canvas):
+    bmp = wx.BitmapDataObject()
+    bmp.SetBitmap(canvas.bitmap)
+
+    wx.TheClipboard.Open()
+    wx.TheClipboard.SetData(bmp)
+    wx.TheClipboard.Close()
+
+
