Index: calculatorview/src/sans/perspectives/calculator/model_editor.py
===================================================================
--- calculatorview/src/sans/perspectives/calculator/model_editor.py	(revision b25caad2957d5d520b0b1b862001070ac1104add)
+++ calculatorview/src/sans/perspectives/calculator/model_editor.py	(revision 7434020a097527ae6efc0f0e238d753b17df8b04)
@@ -257,5 +257,5 @@
         self.name_tcl = wx.TextCtrl(self, -1, size=(PANEL_WIDTH*3/5, -1)) 
         self.name_tcl.Bind(wx.EVT_TEXT_ENTER, self.on_change_name)
-        self.name_tcl.SetValue('untitled')
+        self.name_tcl.SetValue('MyFunction')
         self.name_tcl.SetFont(self.font)
         hint_name = "Unique Model Function Name."
Index: plottools/src/danse/common/plottools/PlotPanel.py
===================================================================
--- plottools/src/danse/common/plottools/PlotPanel.py	(revision f80236f07fd27a5564be7dc22883b7989564c9b8)
+++ plottools/src/danse/common/plottools/PlotPanel.py	(revision 7434020a097527ae6efc0f0e238d753b17df8b04)
@@ -21,4 +21,8 @@
 from binder import BindArtist
 from matplotlib.font_manager import FontProperties
+
+from mpl_toolkits.mplot3d import Axes3D
+#from matplotlib import cm
+#from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter
 
 DEBUG = False
@@ -119,4 +123,5 @@
         wx.Panel.__init__(self, parent, id=id, **kwargs)
         self.parent = parent
+        self.dimension = 1
         self.gotLegend = 0  #to begin, legend is not picked. 
         self.legend_pos_loc = None
@@ -1427,6 +1432,4 @@
         
         """
-        #Re-adjust colorbar
-        self.figure.subplots_adjust(left=0.2, right=.8, bottom=.2)        
         self.data = data
         self.qx_data = qx_data
@@ -1470,18 +1473,48 @@
             zmin_temp = self.zmin_2D
         self.cmap = cmap
-        im = self.subplot.imshow(output, interpolation='nearest', 
-                                 origin='lower',
-                                 vmin=zmin_temp, vmax=self.zmax_2D,
-                                 cmap=self.cmap, 
-                                 extent=(self.xmin_2D, self.xmax_2D,
-                                            self.ymin_2D, self.ymax_2D))
-        
-        #Add color bar and its label
-        #TODO: make the size and location interactive to the image plot.
-        cbax = self.subplot.figure.add_axes([0.84,0.2,0.02,0.7])
-        cb = self.subplot.figure.colorbar(im, cax=cbax)
+        if self.dimension != 3:
+            #Re-adjust colorbar
+            self.subplot.figure.subplots_adjust(left=0.2, right=.8, bottom=.2)
+            
+            im = self.subplot.imshow(output, interpolation='nearest', 
+                                     origin='lower',
+                                     vmin=zmin_temp, vmax=self.zmax_2D,
+                                     cmap=self.cmap, 
+                                     extent=(self.xmin_2D, self.xmax_2D,
+                                                self.ymin_2D, self.ymax_2D))
+            cbax = self.subplot.figure.add_axes([0.84,0.2,0.02,0.7])
+        else:
+            # clear the previous 2D from memory
+            self.subplot.figure.clf()
+            self.subplot.figure.subplots_adjust(left=0.1, right=.8, bottom=.1)  
+            try:
+                # mpl >= 1.0.0
+                ax = self.subplot.figure.gca(projection='3d')
+                #ax.disable_mouse_rotation()
+                cbax = self.subplot.figure.add_axes([0.84,0.1,0.02,0.8])
+            except:
+                # mpl < 1.0.0
+                ax =  Axes3D(self.subplot.figure)
+                cbax = None
+
+            X = self.x_bins[0:-1]
+            Y = self.y_bins[0:-1]
+            X, Y = numpy.meshgrid(X, Y)
+    
+            im = ax.plot_surface(X, Y, output, rstride=1, cstride=1, cmap=cmap,
+                                   linewidth=0, antialiased=False)
+            #ax.set_zlim3d(zmin_temp, self.zmax_2D)
+            #ax.set_frame_on(False)
+            self.subplot.set_axis_off()    
+            
+        if cbax == None:
+            cb =self.subplot.figure.colorbar(im, shrink=0.6, aspect=20)
+        else:
+            cb =self.subplot.figure.colorbar(im, cax=cbax)
         cb.update_bruteforce(im)
         cb.set_label(self.scale)
-        self.subplot.figure.canvas.draw_idle()
+        
+        #if self.dimension != 3:
+        self.figure.canvas.draw_idle()
     
     def _build_matrix(self):
Index: plottools/src/danse/common/plottools/canvas.py
===================================================================
--- plottools/src/danse/common/plottools/canvas.py	(revision 0e553fd2808f3d9036eef66181f51921babd5081)
+++ plottools/src/danse/common/plottools/canvas.py	(revision 7434020a097527ae6efc0f0e238d753b17df8b04)
@@ -250,5 +250,5 @@
         
         """
-        if sys.platform == 'linux2':
+        if sys.platform == 'linux2' or self.panel.dimension == 3:
             evt.Skip()
         else:
Index: sansguiframe/src/sans/guiframe/data_panel.py
===================================================================
--- sansguiframe/src/sans/guiframe/data_panel.py	(revision 98fdccdc928f739647fe860088440575c240730d)
+++ sansguiframe/src/sans/guiframe/data_panel.py	(revision 7434020a097527ae6efc0f0e238d753b17df8b04)
@@ -387,7 +387,35 @@
             import MaskPanel as MaskDialog
         
-        panel = MaskDialog(base=self, data=data, id=wx.NewId())
+        panel = MaskDialog(parent=self.parent, base=self, 
+                           data=data, id=wx.NewId())
         #self.panel.Bind(wx.EVT_CLOSE, self._draw_masked_model)
         panel.ShowModal()
+    
+    def on_plot_3d(self, event):
+        """
+        Frozen image of 3D
+        """
+        data = self._get_data_selection(event)
+        from sans.guiframe.local_perspectives.plotting.masking \
+        import FloatPanel as Float3dDialog
+        
+        panel = Float3dDialog(base=self, data=data, 
+                              dimension=3, id=wx.NewId())
+        panel.ShowModal()   
+    
+    def on_quick_plot(self, event):
+        """
+        Frozen plot
+        """
+        data = self._get_data_selection(event)
+        from sans.guiframe.local_perspectives.plotting.masking \
+        import FloatPanel as QucikPlotDialog
+        if data.__class__.__name__ == "Data2D":
+            dimension = 2
+        else:
+            dimension = 1
+        panel = QucikPlotDialog(base=self, data=data, 
+                                dimension=dimension, id=wx.NewId())
+        panel.ShowModal()    
         
     def on_save_as(self, event):
@@ -426,4 +454,16 @@
         wx.EVT_MENU(self, id, self.on_save_as)
     
+        self.quickplot_id = wx.NewId()
+        name = "Quick Plot"
+        msg = "Plot the current Data"
+        self.data_menu.Append(self.quickplot_id, name, msg)
+        wx.EVT_MENU(self, self.quickplot_id, self.on_quick_plot)
+    
+        self.plot3d_id = wx.NewId()
+        name = "Quick 3DPlot (Slow)"
+        msg = "Plot3D the current 2D Data"
+        self.data_menu.Append(self.plot3d_id, name, msg)
+        wx.EVT_MENU(self, self.plot3d_id, self.on_plot_3d)
+            
         self.editmask_id = wx.NewId()
         name = "Edit Mask"
@@ -431,5 +471,5 @@
         self.data_menu.Append(self.editmask_id, name, msg)
         wx.EVT_MENU(self, self.editmask_id, self.on_edit_data)
-
+        
         tree_ctrl_theory_label = wx.StaticText(self, -1, "Theory")
         tree_ctrl_theory_label.SetForegroundColour('blue')
@@ -474,6 +514,8 @@
             return
         if self.data_menu is not None:
-            menu_enable = (data_class_name == "Data2D" and is_data)
-            self.data_menu.Enable(self.editmask_id, menu_enable)
+            menu_enable = (data_class_name == "Data2D")
+            maskmenu_enable = (menu_enable and is_data)
+            self.data_menu.Enable(self.editmask_id, maskmenu_enable)
+            self.data_menu.Enable(self.plot3d_id, menu_enable)
             self.PopupMenu(self.data_menu) 
         
Index: sansguiframe/src/sans/guiframe/local_perspectives/plotting/masking.py
===================================================================
--- sansguiframe/src/sans/guiframe/local_perspectives/plotting/masking.py	(revision 02aff3d6327c131927351665eba5b01fdf7e70d5)
+++ sansguiframe/src/sans/guiframe/local_perspectives/plotting/masking.py	(revision 7434020a097527ae6efc0f0e238d753b17df8b04)
@@ -25,5 +25,5 @@
 from danse.common.plottools.plottables import Graph
 from binder import BindArtist
-from sans.guiframe.dataFitting import Data2D
+from sans.guiframe.dataFitting import Data1D, Data2D
 from boxMask import BoxMask
 from sectorMask import SectorMask
@@ -57,5 +57,5 @@
                  data=None, id=-1, *args, **kwds):
         kwds["style"] = wx.DEFAULT_DIALOG_STYLE
-        kwds["size"] = wx.Size(_STATICBOX_WIDTH * 2, PANEL_SIZE) 
+        kwds["size"] = wx.Size(_STATICBOX_WIDTH*0.8, PANEL_SIZE) 
         wx.Dialog.__init__(self, parent, id=id,  *args, **kwds)
         
@@ -508,10 +508,118 @@
             # when called by data panel
             event.Skip()
+            pass   
+
+class FloatPanel(wx.Dialog):
+    """
+    Provides the Mask Editor GUI.
+    """
+    ## Internal nickname for the window, used by the AUI manager
+    window_name = "Plot"
+    ## Name to appear on the window title bar
+    window_caption = "Plot"
+    ## Flag to tell the AUI manager to put this panel in the center pane
+    CENTER_PANE = True
+    def __init__(self, parent=None, base=None, 
+                 data=None, dimension=1, id=-1, *args, **kwds):
+        kwds["style"] = wx.DEFAULT_DIALOG_STYLE
+        kwds["size"] = wx.Size(_STATICBOX_WIDTH*1.3, PANEL_SIZE*1.3) 
+        wx.Dialog.__init__(self, parent, id=id,  *args, **kwds)
+        
+        if data != None:
+            #Font size 
+            kwds = []
+            self.SetWindowVariant(variant=FONT_VARIANT)
+            self.SetTitle("Plot " + data.name)
+            self.parent = base
+            self.data = data
+            self.str = self.data.__str__()
+            ## when 2 data have the same id override the 1 st plotted
+            self.name = self.data.name
+            self.dimension = dimension
+            # Panel for 2D plot
+            self.plotpanel = Maskplotpanel(self, -1, dimension,
+                                           style=wx.TRANSPARENT_WINDOW)
+            
+            self.cmap = DEFAULT_CMAP
+            ## Create Artist and bind it
+            self.subplot = self.plotpanel.subplot
+            self._setup_layout()
+            if self.dimension == 1:
+                self.newplot = Data1D(x=data.x, y=data.y, 
+                                      dx=data.dx, dy=data.dy)
+                self.newplot.name = data.name
+            else:    
+                self.newplot = Data2D(image=self.data.data)
+                self.newplot.setValues(self.data)
+                
+            self.plotpanel.add_image(self.newplot) 
+            self.Centre()
+            self.Layout()
+
+            
+    def _setup_layout(self):
+        """
+        Set up the layout
+        """
+        #  panel
+        sizer = wx.GridBagSizer(10, 10)
+        if self.dimension == 3:
+            note = "Note: I am very SLOW.     Please be PATIENT...\n"
+            note_txt = wx.StaticText(self, -1, note) 
+            note_txt.SetForegroundColour(wx.RED)
+            sizer.Add(note_txt, (0, 2), flag=wx.RIGHT|wx.BOTTOM, border=5)
+        
+        sizer.Add(self.plotpanel, (1, 1), (9, 9), 
+                  wx.EXPAND|wx.ALL, 15)
+
+        sizer.AddGrowableCol(3)
+        sizer.AddGrowableRow(2)
+        
+        self.SetSizerAndFit(sizer)
+        self.Centre()
+        self.Show(True)
+        
+    def set_plot_unfocus(self):
+        """
+        Not implemented
+        """
+        pass
+    
+
+    def _draw_model(self, event):
+        """
+         on_close, update the model2d plot
+        """
+        pass
+        
+    def freeze_axes(self):
+        """
+        freeze axes
+        """
+        self.plotpanel.axes_frozen = True
+        
+    def thaw_axes(self):
+        """
+        thaw axes
+        """
+        self.plotpanel.axes_frozen = False       
+    
+    def OnClose(self, event):
+        """
+        """
+        try:
+            self.plotpanel.subplot.figure.clf()
+        except:
+            # when called by data panel
+            event.Skip()
             pass
-        
+
+                
 class Maskplotpanel(PlotPanel):
     """
+    PlotPanel for Quick plot and masking plot
     """
-    def __init__(self, parent, id=-1, color=None, dpi=None, **kwargs):
+    def __init__(self, parent, id=-1, dimension=2, color=None, 
+                                            dpi=None, **kwargs):
         """
         """
@@ -522,6 +630,14 @@
         # Internal list of plottable names (because graph 
         # doesn't have a dictionary of handles for the plottables)
+        self.dimension = dimension
         self.plots = {}
         self.graph = Graph()
+        #add axis labels
+        if self.dimension == 1:
+            self.graph.xaxis('\\rm{x} ', '')
+            self.graph.yaxis('\\rm{y} ', '')
+        if self.dimension == 2:
+            self.graph.xaxis('\\rm{Q}_{x} ', 'A^{-1}')
+            self.graph.yaxis('\\rm{Q}_{y} ', 'A^{-1}')
         
     def add_toolbar(self):
@@ -531,11 +647,13 @@
         # Not implemented
         pass
+    
     def on_set_focus(self, event):
         """
         send to the parenet the current panel on focus
         """
-        #change the panel background
-        #self.SetColor((170, 202, 255))
-        self.draw()   
+        if self.dimension == 3:
+            pass
+        else:
+            self.draw()   
          
     def add_image(self, plot):
@@ -549,9 +667,23 @@
         self.graph.add(plot)
         #add axes
-        self.graph.xaxis('\\rm{Q}_{x} ', 'A^{-1}')
-        self.graph.yaxis('\\rm{Q}_{y} ', 'A^{-1}')
+        if self.dimension == 1:
+            self.xaxis_label = '\\rm{x} '
+            self.xaxis_unit = ''
+            self.yaxis_label = '\\rm{y} '
+            self.yaxis_unit = ''
         #draw
+        # message
+        status_type = 'progress' 
+        msg = 'Plotting...'
+        self._status_info(msg, status_type)
+        status_type = 'stop'           
+        
         self.graph.render(self)
-        self.subplot.figure.canvas.draw_idle()
+        if self.dimension == 3:
+            pass
+        else:
+            self.subplot.figure.canvas.draw_idle()
+        msg = 'Plotting Completed.'
+        self._status_info(msg, status_type)
         
     def onMouseMotion(self, event):
@@ -560,19 +692,82 @@
         """
         pass
-   
+    
+    def onWheel(self, event):
+        """
+        """
+        pass 
+     
+    def onLeftDown(self, event):
+        """
+        Disables LeftDown
+        """
+        pass
+    
+    def onPick(self, event):
+        """
+        Disables OnPick
+        """
+        pass
+    
+    def draw(self):
+        """
+        Draw
+        """
+        # message
+        status_type = 'progress' 
+        msg = 'Plotting...'
+        self._status_info(msg, status_type)
+        status_type = 'stop'           
+        
+        if self.dimension == 3:
+            pass
+        else:
+           self.subplot.figure.canvas.draw_idle() 
+        
+        msg = 'Plotting Completed.'
+        self._status_info(msg, status_type)
+       
     def onContextMenu(self, event):
         """
         Default context menu for a plot panel
         """
-        # Slicer plot popup menu
+        # Selective Slicer plot popup menu
         slicerpop = wx.Menu()
         
-        id_cm = wx.NewId()
-        slicerpop.Append(id_cm, '&Toggle Linear/Log scale')
-        wx.EVT_MENU(self, id_cm, self._onToggleScale)
+        id = wx.NewId()
+        slicerpop.Append(id,'&Print Image', 'Print image')
+        wx.EVT_MENU(self, id, self.onPrint)
+
+        id = wx.NewId()
+        slicerpop.Append(id, '&Copy to Clipboard', 'Copy to the clipboard')
+        wx.EVT_MENU(self, id, self.OnCopyFigureMenu)
+        
+        if self.dimension == 1:
+            id = wx.NewId()
+            slicerpop.Append(id, '&Change Scale')
+            wx.EVT_MENU(self, id, self._onProperties)
+        else:
+            slicerpop.AppendSeparator()
+            id_cm = wx.NewId()
+            slicerpop.Append(id_cm, '&Toggle Linear/Log scale')
+            wx.EVT_MENU(self, id_cm, self._onToggleScale)
                
         pos = event.GetPosition()
         pos = self.ScreenToClient(pos)
         self.PopupMenu(slicerpop, pos)
+        
+    def _status_info(self, msg = '', type = "update"):
+        """
+        Status msg
+        """
+        if type == "stop":
+            label = "Plotting..."
+            able = True
+        else:   
+            label = "Wait..."
+            able = False
+        if self.parent.parent.parent != None:
+                wx.PostEvent(self.parent.parent.parent, 
+                             StatusEvent(status = msg, type = type ))
 
 class ViewerFrame(wx.Frame):
