Index: build_tools/conda/pyopencl/meta.yaml
===================================================================
--- build_tools/conda/pyopencl/meta.yaml	(revision 00371313503b156eeff494a0160a9cd7d96e7249)
+++ build_tools/conda/pyopencl/meta.yaml	(revision 20b238dfddfbdd97221dc9a51df8c42be5b54664)
@@ -38,5 +38,4 @@
   run:
     - python
-    - setuptools
     - numpy
     - pytools >=2014.2
Index: src/sas/guiframe/media/data_explorer_help.rst
===================================================================
--- src/sas/guiframe/media/data_explorer_help.rst	(revision 2bf5e3ba7e400cdaa0bce26da4e7c2cc28ed06e7)
+++ src/sas/guiframe/media/data_explorer_help.rst	(revision c1478703747151512c6522016010c4083dcd417a)
@@ -39,7 +39,7 @@
 Hide by clicking *Show/Hide Data Explorer*.
 
-*NOTE! When* Data Explorer *is hidden, all data loaded will be sent directly 
-to the current active application, if possible. When* Data Explorer *is 
-shown, data go first to the* Data Explorer.
+NOTE! When *Data Explorer* is hidden, all data loaded will be sent directly 
+to the current active application, if possible. When *Data Explorer* is 
+shown, data go first to the *Data Explorer*.
 
 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
@@ -52,7 +52,6 @@
 To load data, click the button *Load Data*, then select one or more (by holding 
 the Ctrl key) files to load into the application. The name of each selected 
-file will be listed.
-
-Clicking the *+*  symbol will display any available metadata.
+file will be listed. Clicking the *+*  symbol will display any available 
+metadata.
 
 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
@@ -64,5 +63,5 @@
 
 Right-clicking on a loaded dataset (or model calculation, what SasView calls a 
-theory) brings up a *Handy Menu* from which it is possible to access Datainfo, 
+theory) brings up a *Handy Menu* from which it is possible to access Data Info, 
 Save the data/theory, or Plot the data/theory.
 
@@ -91,6 +90,7 @@
 -----------
 
-*WARNING!* Remove Data *will stop any data operations currently using the 
-selected data sets.*
+WARNING! *Remove Data* will stop any data operations currently using the 
+selected data sets.
+
 
 *Remove Data* removes all reference to selected data from the application.
@@ -103,7 +103,4 @@
 --------------------
 
-This operation can only be performed on 1D data and plot panels currently 
-containing 1D data.
-
 Click on the button *Append To* to add selected data to a plot panel. Next to 
 the button is a combo box containing the names of available plot panels. 
@@ -113,5 +110,6 @@
 disabled.
 
-2D Data cannot be appended to any plot panels.
+2D Data cannot be appended to any plot panels. This operation can 
+only be performed on 1D data and plot panels currently containing 1D data.
 
 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
@@ -134,5 +132,5 @@
 The *Freeze Theory* button generates data from the selected theory.
 
-*NOTE! This operation can only be performed when theory labels are selected.*
+NOTE! This operation can only be performed when theory labels are selected.
 
 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
@@ -152,6 +150,2 @@
 fitted at the same time, use *Simultaneous* fitting under the *Fitting* 
 option on the menu bar.
-
-.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
-
-.. note::  This help document was last changed by Steve King, 18Feb2015
Index: src/sas/guiframe/media/data_formats_help.rst
===================================================================
--- src/sas/guiframe/media/data_formats_help.rst	(revision 3fd3d5a4a3e6ac116eb2c29ed70c05d4778d41e6)
+++ src/sas/guiframe/media/data_formats_help.rst	(revision 6f102435f014f1de2927d3b4f89c5190e0c55ce3)
@@ -29,23 +29,25 @@
 SasView recognises the following file extensions:
 
-*  .TXT
-*  .ASC
-*  .DAT
-*  .XML (in canSAS format v1.0 and 1.1)
+    .TXT
+    
+    .ASC
+    
+    .DAT
+    
+    .XML (in canSAS format v1.0 and 1.1)
 
 If using CSV output from, for example, a spreadsheet, ensure that it is not 
 using commas as delimiters for thousands.
 
-For a description of the CanSAS/SASXML format see:
-http://www.cansas.org/formats/canSAS1d/1.1/doc/
+For a description of the NIST 1D format see:
 
-For a description of the NIST 1D format see:
 http://danse.chem.utk.edu/trac/wiki/NCNROutput1D_IQ
 
 For a description of the ISIS 1D format see:
+
 http://www.isis.stfc.ac.uk/instruments/loq/software/colette-ascii-file-format-descriptions9808.pdf
 
-*NOTE! SasView does not at present load data where the Q and I(Q) data are in 
-separate files.*
+NB: SasView does not at present load data where the Q and I(Q) data are in 
+separate files.
 
 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
@@ -63,7 +65,6 @@
 
 For a description of the NIST 2D format see:
+
 http://danse.chem.utk.edu/trac/wiki/NCNROutput1D_2DQxQy 
 
 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
-
-.. note::  This help document was last changed by Steve King, 18Feb2015
Index: src/sas/guiframe/media/graph_help.rst
===================================================================
--- src/sas/guiframe/media/graph_help.rst	(revision 1394952b7caf92c44bda747fb4a54aa7117aa978)
+++ src/sas/guiframe/media/graph_help.rst	(revision 98b30b46ac241d857a5698740991daae2c25c3c2)
@@ -4,84 +4,60 @@
 .. by S King, ISIS, during SasView CodeCamp-III in Feb 2015.
 
-.. |delta| unicode:: U+03B4
-.. |phi| unicode:: U+03C6
-
-
 Plotting Data/Models
 ====================
 
-Graph_Window_Options_
-
-Dataset_Menu_Options_
+Graph_Menu_
 
 2D_Data_Averaging_
 
-.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
-
-.. _Graph_Window_Options:
-
-Graph Window Options
---------------------
+Key_Sequences_
+
+.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
+
+.. _Graph_Menu:
+
+Graph Menu
+----------
 
 Invoking_the_Graph_Menu_
 
+Reset_Graph_
+
 Hide_Show_Delete_Graph_
 
+Data_Info_
+
+Save_Plot_Image_
+
+Save_Data_
+
 Drag_Plot_
 
 Zoom_In_Out_
 
-Save_Plot_Image_
-
-Print_Plot_
-
-Reset_Graph_
-
-Graph_Modifications_
+Remove_Data_from_Plot_
 
 Change_Scale_
 
-Toggle_Scale_
-
-2D_Color_Map_
-
-Data_Coordinates_
-
-.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
-
-.. _Dataset_Menu_Options:
-
-Dataset Menu Options
---------------------
-
-Invoking_the_Dataset_Menu_
-
-Data_Info_
-
-Save_Data_
-
 Linear_Fit_
 
-Remove_Data_from_Plot_
-
-Show_Hide_Error_Bars_
-
-Modify_Plot_Property_
-
-2D Averaging
+Other_Graph_Modifications_
+
+.. _Invoking_the_Graph_Menu:
+
+Introduction
 ------------
 
-2D_Data_Averaging_
-
-.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
-
-.. _Invoking_the_Graph_Menu:
-
-Invoking the Graph Menu
------------------------
-
-To invoke the *Graph Menu* simply right-click on a data/theory plot, or click 
-the *Graph Menu* (bullet list) icon in the toolbar at the bottom of the plot. 
-Then select a menu item.
+Locating the pointer and right-clicking on a data/theory plot will bring a 
+context menu. On the menu, select a menu item.
+
+.. _Reset_Graph:
+
+Reset Graph
+-----------
+
+To reset the graph's axis range, right click on the plot and the context menu 
+pops-up. Select *Reset Graph*  and the plot will take its initial range. Also 
+the 'home' icon in tool bar will do the same.
 
 .. _Hide_Show_Delete_Graph:
@@ -90,21 +66,36 @@
 ----------------------
 
-To expand a plot window, click the *Maximise* (square) icon in the top-right 
-corner.
-
-To shrink a plot window, click the *Restore down* (square-on-square) icon in 
-the top-right corner.
-
-To hide a plot, click the *Minimise* (-) icon in the top-right corner of the 
-plot window.
-
-To show a hidden plot, select the *Restore up* (square-on-square) icon on the 
-minimised window.
-
-To delete a plot, click the *Close* (x) icon in the top-right corner of the 
-plot window.
-
-*NOTE! If a residuals graph (when fitting data) is hidden, it will not show up 
-after computation.*
+To Hide, click the Hide (bar) button in the tool bar.To Show, select the the 
+'Show' menu item in the 'Graph' menu in the menu bar.To Delete, click the 'x' 
+button in the title bar.
+
+Note: If a residuals graph (in Fitting) is hidden, it will not show up after 
+computation.
+
+.. _Data_Info:
+
+Data Info
+---------
+
+From the context menu, select 'Data Info' to see the data information dialog
+panel.
+
+.. _Save_Plot_Image:
+
+Save Plot Image
+---------------
+
+Right click on plot. Context menu will pop-up select save image [file name].
+A dialog window opens and write a the name of the file to save and click on 
+*Save Image.*
+
+.. _Save_Data:
+
+Save Data
+---------
+
+From the context menu, select 'Save points as a file' for 1D, or 'Save as a 
+file(DAT)' for 2D. Note that two formats, txt and xml, are available in 1D 
+saving.
 
 .. _Drag_Plot:
@@ -113,10 +104,6 @@
 ---------
 
-Select the *Pan* (crossed arrows) icon in the toolbar at the bottom of the plot 
-to activate this option. Move the mouse pointer to the plot. It will change to 
-a hand. Then left-click and drag the plot around. The axis values will adjust 
-accordingly.
- 
-To disable dragging mode, unselect the *crossed arrows* icon on the toolbar.
+Select the *crossed arrows*  button on the plot panel *toolbar*  to drag the 
+plot. To disable dragging mode, unselect the same button on the toolbar.
 
 .. _Zoom_In_Out:
@@ -125,78 +112,20 @@
 -----------
 
-Select the *Zoom* (magnifying glass) button in the toolbar at the bottom of 
-the plot to activate this option. Move the mouse pointer to the plot. It will 
-change to a cross-hair. Then left-click and drag the pointer around to generate 
-a region of interest. Release the mouse button to generate the new view.
-
-To disable zoom mode, unselect the *Zoom* button on the toolbar.
-
-After zooming in on a a region, the *left arrow* or *right arrow* buttons on 
-the toolbar will switch between recent views.
-
-*NOTE! If a wheel mouse is available scrolling the wheel will zoom in/out 
-on the current plot (changing both axes). Alternatively, point at the numbers 
-on one axis and scroll the wheel to zoom in/out on just that axis.*
-
-To return to the original view of the data, click the the *Reset* (home) icon 
-in the toolbar at the bottom of the plot (see Reset_Graph_ for further details).
-
-.. _Save_Plot_Image:
-
-Save Plot Image
----------------
-
-To save the current plot as an image file, right click on the plot to bring up 
-the *Graph Menu* (see Invoking_the_Graph_Menu_) and select *Save Image*. 
-Alternatively, click on the *Save* (floppy disk) icon in the toolbar at the 
-bottom of the plot.
- 
-A dialog window will open. Select a folder, enter a filename, choose an output 
-image type, and click *Save*.
-
-The currently supported image types are:
-
-*  EPS (encapsulated postscript)
-*  EMF (enhanced metafile)
-*  JPG/JPEG (joint photographics experts group)
-*  PDF (portable documant format)
-*  PNG (portable network graphics)
-*  PS (postscript)
-*  RAW/RGBA (bitmap)
-*  SVG/SVGA (scalable vector graphics)
-*  TIF/TIFF (tagged iamge file)
-
-.. _Print_Plot:
-
-Print Plot
-----------
-
-To send the current plot to a printer, click on the *Print* (printer) icon in 
-the toolbar at the bottom of the plot.
-
-.. _Reset_Graph:
-
-Reset Graph
------------
-
-To reset the axis range of a graph to its initial values select *Reset Graph 
-Range* on the *Graph Menu* (see Invoking_the_Graph_Menu_). Alternatively, use 
-the *Reset* (home) icon in the toolbar at the bottom of the plot.
-
-.. _Graph_Modifications:
-
-Graph Modifications
--------------------
-
-From the *Graph Menu* (see Invoking_the_Graph_Menu_) it is also possible to 
-make some custom modifications to plots, including:
-
-*  changing the plot window title
-*  changing the axis legend locations
-*  changing the axis legend label text
-*  changing the axis legend label units
-*  changing the axis legend label font & font colour
-*  adding/removing a text string
-*  adding a grid overlay
+Select the *rectangle*  button on the plot panel *toolbar*  to zoom in a
+region of the plot.
+
+To disable zoom mode, unselect the same button on the toolbar. After zoom in
+a region, select *left arrow*  or *right arrow*  button on the toolbar to set
+the graph the the previous size. If a mouse wheel button is available,
+*zoom in/out*  by scrolling the mouse wheel (see Key_Sequences_ help for
+details).
+
+.. _Remove_Data_from_Plot:
+
+Remove Data from Plot
+---------------------
+
+Highlight the plot and the context menu appears.Select *remove [file name]*.
+The plot selected will disappear.
 
 .. _Change_Scale:
@@ -205,88 +134,20 @@
 ------------
 
-This menu option is only available with 1D data.
-
-From the *Graph Menu* (see Invoking_the_Graph_Menu_) select *Change Scale*. A 
-dialog window will appear in which it is possible to choose different 
-transformations of the x (usually Q) or y (usually I(Q)) axes, including:
-
-*  x, x^2, x^4, ln(x), log10(x), log10(x^4)
-*  y, 1/y, ln(y), y^2, y.(x^4), 1/sqrt(y),
-*  log10(y), ln(y.x), ln(y.x^2), ln(y.x^4), log10(y.x^4)
- 
-A *View* option includes short-cuts to common SAS transformations, such as:
-
-*  linear
-*  Guinier
-*  X-sectional Guinier
-*  Porod
-*  Kratky
-
-For properly corrected and scaled data, these SAS transformations can be used 
-to estimate, for example, Rg, rod diameter, or SANS incoherent background 
-levels, via a linear fit (see Linear_Fit_).
-
-.. _Toggle_Scale:
-
-Toggle Scale
-------------
-
-This menu option is only available with 2D data.
-
-From the *Graph Menu* (see Invoking_the_Graph_Menu_) select *Toggle Linear/Log 
-Scale* to switch between a linear to log intensity scale. The type of scale 
-selected is written alongside the colour scale.
-
-.. _2D_Color_Map:
-
-2D Color Map
-------------
-
-This menu option is only available with 2D data.
-
-From the *Graph Menu* (see Invoking_the_Graph_Menu_) select *2D Color Map* to 
-choose a different color scale for the image and/or change the maximum or 
-minimum limits of the scale.
-
-.. _Data_Coordinates:
-
-Data Coordinates
-----------------
-
-Clicking anywhere in the plot window will cause the current coordinates to be 
-displayed in the status bar at the very bottom-left of the SasView window.
- 
-.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
-
-.. _Invoking_the_Dataset_Menu:
-
-Invoking_the_Dataset_Menu
--------------------------
-
-From the *Graph Menu* (see Invoking_the_Graph_Menu_) highlight a plotted 
-dataset.
-
-.. _Data_Info:
-
-Data Info
----------
-
-In the *Dataset Menu* (see Invoking_the_Dataset_Menu_), highlight a data set 
-and select *DataInfo* to bring up a data information dialog panel for that 
-data set.
-
-.. _Save_Data:
-
-Save Data
----------
-
-In the *Dataset Menu* (see Invoking_the_Dataset_Menu_), select *Save Points as 
-a File* (if 1D data) or *Save as a file(DAT)* (if 2D data). A save dialog will 
-appear.
-
-1D data can be saved in either ASCII text (.TXT) or CanSAS/SASXML (.XML) 
-formats (see :ref:`1D_Formats`).
-
-2D data can only be saved in the NIST 2D format (.DAT) (see :ref:`2D_Formats`).
+If the loaded data is a 1-D data changing scale or data representation will 
+work as follows. *Right click* on the plot window. A context menu pops-up and 
+select *Change Scale* . A dialog window titled *select the scale of the graph* 
+will pop-up then change the *x* , the *y*  and the *view*  values as wish.
+
+The 'view' option includes the axis scale short-cuts such as Linear, Guinier, 
+Cross-sectional (XC) Guinier, and Porod plot scale. For a proper data set, 
+these axis scales can be used to estimate Rg, Rod diameter, or Background of 
+neutron scattering data respectively (via 'Linear Fit'; see below). For a 2D 
+image, *Right click*  on the image to pop-up the context menu. Select to 
+switch from linear to log scale. The scale selected is printed on the status 
+bar.
+
+If the loaded data is an image. *Right click*  on the image to pop-up the
+context menu. Select to switch from linear to log scale. The scale selected is
+printed on the status bar.
 
 .. _Linear_Fit:
@@ -295,46 +156,22 @@
 ----------
 
-Linear fit performs a simple ( y(x)=ax+b ) linear fit within the plot window.
-
-In the *Dataset Menu* (see Invoking_the_Dataset_Menu_), select *Linear Fit*. A 
-fitting dialog will appear. Set some initial parameters and data limits and 
-click *Fit*. The fitted parameter values are displayed and the resulting line 
-calculated from them is added to the plot. 
-
-This option is most useful for performing simple Guinier, XS Guinier, and
-Porod type analyses, for example, to estimate Rg, a rod diameter, or incoherent 
-background level, respectively.
-
-The following figure shows an example of a Guinier analysis using this option
+Linear fit is to perform a line model fitting keeping the scale of the plot.
+Highlight data to fit. From the context menu select *Linear Fit* . A dialog
+window appears. Change model initial parameters, data limits and hit *fit*
+button. New parameters values are displayed and the line with the new
+parameters is added to the plot. Especially for Guinier, XC Guinier, and
+Porod plot scale, this 'Linear Fit' will provides Rg, Rod diameter, and
+background, respectively. The following figure shows an example for the
+Guinier scale.
 
 .. image:: guinier_fit.png
 
-.. _Remove_Data_from_Plot:
-
-Remove Data from Plot
----------------------
-
-In the *Dataset Menu* (see Invoking_the_Dataset_Menu_), select *Remove*. The 
-selected data will be removed from the plot.
-
-*NOTE! This action cannot be undone.*
-
-.. _Show_Hide_Error_Bars:
-
-Show/Hide Error Bars
---------------------
-
-In the *Dataset Menu* (see Invoking_the_Dataset_Menu_), select *Show Error Bar* 
-or *Hide Error Bar* to switch between showing/hiding the errors associated 
-with the chosen dataset. 
-
-.. _Modify_Plot_Property:
-
-Modify Plot Property
---------------------
-
-In the *Dataset Menu* (see Invoking_the_Dataset_Menu_), select *Modify Plot 
-Property* to change the size, color, or shape of the displayed marker for the 
-chosen dataset, or to change the dataset label that appears on the plot.
+.. _Other_Graph_Modifications:
+
+Other Graph Modifications
+-------------------------
+
+Some custom modifications of the symbols, text, axis, etc of the graph are 
+provided.
 
 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
@@ -345,5 +182,5 @@
 -----------------
 
-Purpose_
+Principle_
 
 How_to_Average_
@@ -367,14 +204,13 @@
 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
 
-.. Purpose: 
-
-Purpose
--------
-
-This feature is only available with 2D data.
-
-2D data averaging allows you to perform different types of averages on your 
-data. The region to be averaged is displayed in the plot window and its limits 
-can be modified by dragging the boundaries around.
+.. Principle: 
+
+Principle
+---------
+
+This feature allows you to perform different types of averages on your data, 
+and allows you to see what regions of the detector will contribute to the 
+average. The region to be averaged will be drown and can be modified by 
+dragging the lines around.
 
 .. _How_to_Average:
@@ -383,36 +219,23 @@
 --------------
 
-In the *Dataset Menu* (see Invoking_the_Dataset_Menu_), select one of the 
-following averages
-
-*  Perform Circular Average
-*  Sector [Q view]
-*  Annulus [Phi view]
-*  Box sum
-*  Box averaging in Qx
-*  Box averaging on Qy
-
-A 'slicer' will appear (except for *Perform Circular Average*) in the plot that 
-you can drag by clicking on a slicer's handle. When the handle is highlighted 
-in red, it means that the slicer can move/change size.
-
-*NOTE! The slicer size will reset if you try to select a region greater than 
-the size of the data.*
-
-Alternatively, once a 'slicer' is active you can also select the region to 
-average by bringing back the *Dataset Menu* and selecting *Edit Slicer 
-Parameters*. A dialog window will appear in which you can enter values to 
-define a region or select the number of points to plot (*nbins*).
-
-A separate plot window will also have appeared, displaying the requested 
-average.
-
-*NOTE! The displayed average only updates when input focus is moved back to 
-that window; ie, when the mouse pointer is moved onto that plot.*
-
-Selecting *Box Sum* automatically brings up the 'Slicer Parameters' dialog in 
-order to display the average numerically, rather than graphically.
-
-To remove a 'slicer', bring back the *Dataset menu* and select *Clear Slicer*.
+Right click on 2D data for the context menu to appear. Select one type of 
+averages among *"sector [Q view]", "Annulus [Phi view]", "Box sum", "Box 
+averaging in Qx ", "box averaging on Qy","Perform circular Average".*
+
+A slicer will appear except for *"Perform circular Average"*  that you can 
+drag by clicking on a slicer 's marker. When the marker is highlighted in red, 
+it means that the slicer can change size.You can also move some of the slicer 
+by simply drag its side when highlighted in red. the slicer size will be reset 
+to its previous size if the user try to select a region greater than the size 
+of the data.
+
+The user can also select a region to average when a slicer has been selected 
+already by *right clicking*  on the context menu and selecting *Edit Slicer 
+Parameters* . The dialog window will appears and the user can enter values to 
+selected a region or selected numbers of points to plot *nbins* .
+
+For *Box sum* , when the user selects this option, a new panel is created 
+containing the result of average of the sum of every pixels contains on that 
+data.The user can also enter values to select a region.
 
 .. _Available_Averagings:
@@ -421,5 +244,5 @@
 --------------------
 
-The available averages are
+Some different types of averaging are provided for.
 
 .. _Unmasked_Circular_Average:
@@ -428,6 +251,6 @@
 -------------------------
 
-This operation will perform an average in constant Q-rings around the (x,y) 
-pixel location of the beam center.
+This operation will perform and average in constant q-rings around the (x,y) pixel
+location of the beam center.
 
 .. _Masked_Circular_Average:
@@ -436,6 +259,6 @@
 -----------------------
 
-This operation is the same as 'Unmasked Circular Average' except that any 
-masked region is excluded.
+This operation is same as 'Masked Circular Average' except that the masked
+region is excluded if masked.
 
 .. _Sector_Average:
@@ -444,19 +267,17 @@
 -----------------------
 
-This operation averages in constant Q-arcs.
-
-The width of the sector is specified in degrees (+/- |delta|\|phi|\) each side 
-of the central angle (|phi|\).
+This operation averages in constant q-arcs. The width of the sector is specified in
+degrees (+/- delta phi) each side of the central angle (phi).
 
 .. _Annular_Average:
 
-Annular Average [|phi| View]
-----------------------------
-
-This operation performs an average between two Q-values centered on (0,0), 
-and averaged over a specified number of pixels.
-
-The data is returned as a function of angle (|phi|\) in degrees with zero 
-degrees at the 3 O'clock position.
+Annular Average [Phi View]
+--------------------------
+
+It performs an average between two q-values centered in (0,0), and averaged 
+over a width of a specified number of pixels. The data is returned as a 
+function of angle (phi) in degrees. Moving one circle of this slicer to 
+radius of zero corresponding to a circular averaging on radius qmax , the 
+outer circle. The angle zero starts from the positive x-axis direction.
 
 .. _Box_Sum:
@@ -465,8 +286,7 @@
 -------
 
-This operation performs a sum of counts in a 2D region of interest.
-
-When editing the slicer parameters, the user can enter the length and the width 
-the rectangular slicer and the coordinates of the center of the rectangle.
+Perform the sum of counts in a 2D region of interest.When editing the slicer, 
+the user can enter the length and the width the rectangle slicer and the 
+coordinates of the center of this rectangle.
 
 .. _Box_Averaging_in_Qx:
@@ -475,10 +295,9 @@
 -------------------
 
-This operation computes an average I(Qx) for the region of interest.
-
-When editing the slicer parameters, the user can control the length and the 
-width the rectangular slicer. The averaged output is calculated from constant 
-bins with rectangular shape. The resultant Q values are nominal values, that 
-is, the central value of each bin on the x-axis.
+Computes average I(Qx) for a region of interest. When editing the slicer, the 
+user can control the length and the width the rectangle slicer. The averaged 
+output is calculated from the constant bins with rectangular shape. The 
+resultant q values are nominal values, i.e., the central values of each bins 
+on the x-axis.
 
 .. _Box_Averaging_in_Qy:
@@ -487,13 +306,54 @@
 -------------------
 
-
-This operation computes an average I(Qy) for the region of interest.
-
-When editing the slicer parameters, the user can control the length and the 
-width the rectangular slicer. The averaged output is calculated from constant 
-bins with rectangular shape. The resultant Q values are nominal values, that 
-is, the central value of each bin on the x-axis.
-
-.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
-
-.. note::  This help document was last changed by Steve King, 18Feb2015
+Computes average I(Qy) for a region of interest.When editing the slicer, the 
+user can control the length and the width the rectangle slicer. The averaged 
+output is calculated from the constant bins with rectangular shape. The 
+resultant q values are nominal values, i.e., the central values of each bins 
+on the y-axis.
+
+.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
+
+.. _Key_Sequences:
+
+Key Sequences
+-------------
+
+Floating_Panel_
+
+Context_Menu_
+
+Zoom_
+
+.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
+
+.. _Floating_Panel:
+
+Floating Panel
+--------------
+
+For a graph panel to float on the top of the SV window:
+
+Press the *Ctrl(Cmd on MAC) key*  on dragging and placing a panel. Or if you 
+want to make all plot panels float, select 'Float' from Graph/Preperences in 
+the menu bar. Otherwise choose 'Dock'.
+
+.. _Context_Menu:
+
+Graph Context Menu
+------------------
+
+To get the graph context menu to print, copy, save data, (2D)average, etc, 
+*locate the mouse point on the plot to highlight and *(Mouse) Right Click* 
+to bring up the full menu.
+
+.. _Zoom:
+
+Zoom In/Out
+-----------
+
+To Zoom in or out the full plot, *locate the mouse point inside the graph 
+which will be the center of the zooming, then *rotate MouseWheel*.
+
+*To Zoom in or out the plot in x or y direction, *locate (and click) the 
+mouse point near x (or y) axis just outside of the graph and then *rotate 
+MouseWheel* .* Note that this works only on the 1D plots.
Index: c/sas/guiframe/report_dialog.py
===================================================================
--- src/sas/guiframe/report_dialog.py	(revision e8bb5b62d717c7b44481a4b621030699e4efdaf4)
+++ 	(revision )
@@ -1,144 +1,0 @@
-"""
-    Base class for reports. Child classes will need to implement
-    the onSave() method.
-"""
-import wx
-import logging
-import sys
-import wx.html as html
-
-ISPDF = False
-if sys.platform == "win32":
-    _STATICBOX_WIDTH = 450
-    PANEL_WIDTH = 500 
-    PANEL_HEIGHT = 700
-    FONT_VARIANT = 0
-    ISPDF = True
-elif sys.platform == "darwin":
-    _STATICBOX_WIDTH = 480
-    PANEL_WIDTH = 530
-    PANEL_HEIGHT = 700
-    FONT_VARIANT = 1
-    ISPDF = True
-
-class BaseReportDialog(wx.Dialog):
-    
-    def __init__(self, report_list, *args, **kwds):
-        """
-        Initialization. The parameters added to Dialog are:
-        
-        :param report_list: list of html_str, text_str, image for report
-        """
-        kwds["style"] = wx.RESIZE_BORDER|wx.DEFAULT_DIALOG_STYLE
-        super(BaseReportDialog, self).__init__(*args, **kwds)
-        kwds["image"] = 'Dynamic Image'
-
-        # title
-        self.SetTitle("Report")
-        # size
-        self.SetSize((720, 650))
-        # font size
-        self.SetWindowVariant(variant=FONT_VARIANT)
-        # check if tit is MAC
-        self.is_pdf = ISPDF
-        # report string
-        self.report_list = report_list
-        # wild card
-        # pdf supporting only on MAC
-        if self.is_pdf:
-            self.wild_card = ' PDF files (*.pdf)|*.pdf|'
-            self.index_offset = 0
-        else:
-            self.wild_card = ''
-            self.index_offset = 1
-        self.wild_card += 'HTML files (*.html)|*.html|'
-        self.wild_card += 'Text files (*.txt)|*.txt'
-
-    def _setup_layout(self):
-        """
-        Set up layout
-        """
-        hbox = wx.BoxSizer(wx.HORIZONTAL)
-        
-        # buttons
-        button_close = wx.Button(self, wx.ID_OK, "Close")
-        button_close.SetToolTipString("Close this report window.")
-        hbox.Add(button_close)
-        button_close.SetFocus()
-
-        button_preview = wx.Button(self, wx.NewId(), "Preview")
-        button_preview.SetToolTipString("Print preview this report.")
-        button_preview.Bind(wx.EVT_BUTTON, self.onPreview,
-                            id=button_preview.GetId()) 
-        hbox.Add(button_preview)
-
-        button_print = wx.Button(self, wx.NewId(), "Print")
-        button_print.SetToolTipString("Print this report.")
-        button_print.Bind(wx.EVT_BUTTON, self.onPrint,
-                          id=button_print.GetId())
-        hbox.Add(button_print)
-        
-        button_save = wx.Button(self, wx.NewId(), "Save")
-        button_save.SetToolTipString("Save this report.")
-        button_save.Bind(wx.EVT_BUTTON, self.onSave, id=button_save.GetId())
-        hbox.Add(button_save)
-        
-        # panel for report page
-        vbox = wx.BoxSizer(wx.VERTICAL)
-        # html window
-        self.hwindow = html.HtmlWindow(self, style=wx.BORDER)
-        # set the html page with the report string
-        self.hwindow.SetPage(self.report_html)
-        
-        # add panels to boxsizers
-        vbox.Add(hbox)
-        vbox.Add(self.hwindow, 1, wx.EXPAND|wx.ALL,0)
-
-        self.SetSizer(vbox)
-        self.Centre()
-        self.Show(True)
-
-    def onPreview(self, event=None):
-        """
-        Preview
-        : event: Preview button event
-        """
-        previewh = html.HtmlEasyPrinting(name="Printing", parentWindow=self)
-        previewh.PreviewText(self.report_html)
-        
-    def onPrint(self, event=None):
-        """
-        Print
-        : event: Print button event
-        """
-        printh = html.HtmlEasyPrinting(name="Printing", parentWindow=self)
-        printh.PrintText(self.report_html)
-
-    def OnClose(self, event=None):
-        """
-        Close the Dialog
-        : event: Close button event
-        """
-        self.Close()
-    
-    def HTML2PDF(self, data, filename):
-        """
-        Create a PDF file from html source string.
-        Returns True is the file creation was successful. 
-        : data: html string
-        : filename: name of file to be saved
-        """
-        try:
-            from xhtml2pdf import pisa
-            # open output file for writing (truncated binary)
-            resultFile = open(filename, "w+b")
-            # convert HTML to PDF
-            pisaStatus = pisa.CreatePDF(data, dest=resultFile)
-            # close output file
-            resultFile.close()
-            self.Update()
-            return pisaStatus.err
-        except:
-            logging.error("Error creating pdf: %s" % sys.exc_value)
-        return False
-
Index: src/sas/models/media/model_functions.rst
===================================================================
--- src/sas/models/media/model_functions.rst	(revision 7072ce6239234d337481e73082d58570af29eaf3)
+++ src/sas/models/media/model_functions.rst	(revision cd06a5f8afa8ee7bffadb488c3a0a9cf32d5e242)
@@ -10,4 +10,5 @@
 
 .. To do:
+.. Remove the 'This is xi' & 'This is zeta' lines before release!
 .. Add example parameters/plots for the CoreShellEllipsoidXTModel
 .. Add example parameters/plots for the RectangularPrism models
@@ -19,6 +20,4 @@
 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
 
-
-.. note::  The contents of this document are awaiting proof reading. Feb2015
 
 
@@ -170,5 +169,4 @@
 - RaspBerryModel_
 - CoreShellModel_ (including magnetic 2D version)
-- MicelleSphCoreModel_
 - CoreMultiShellModel_ (including magnetic 2D version)
 - Core2ndMomentModel_
@@ -2446,5 +2444,5 @@
 
 where |delta|\ T = tail length (or *t_length*), |delta|\ H = head thickness (or *h_thickness*),
-|drho|\ H = SLD(headgroup) - SLD(solvent), and |drho|\ T = SLD(tail) - SLD(solvent). The total thickness is 2(H+T).
+|drho|\ H = SLD(headgroup) - SLD(solvent), and |drho|\ T = SLD(tail) - SLD(solvent).
 
 The 2D scattering intensity is calculated in the same way as 1D, where the *q* vector is defined as
@@ -3374,26 +3372,4 @@
 
 
-.. _MicelleSphCoreModel:
-
-**2.1.42. MicelleSphCoreModel**
-
-This model provides the form factor, *P(q)*, for a micelle with a spherical core 
-and Gaussian polymer chains attached to the surface.
-
-*2.1.42.1. Definition*
-
-The 1D scattering intensity for this model is calculated according to the equations given by Pedersen
-(Pedersen, 2000).
-
-*2.1.42.2. Validation of the MicelleSphCoreModel*
-
-This model has not yet been validated. Feb2015
-
-REFERENCES
-
-J Pedersen, *J. Appl. Cryst.*, 33 (2000) 637-640
-
-
-
 2.2 Shape-independent Functions
 -------------------------------
Index: src/sas/perspectives/calculator/image_viewer.py
===================================================================
--- src/sas/perspectives/calculator/image_viewer.py	(revision eec63a8510b9e95652aeb0169dd434d2357ee878)
+++ src/sas/perspectives/calculator/image_viewer.py	(revision 7a04dbb34bb699a5460b3ad23209d05b641f3265)
@@ -59,4 +59,5 @@
                 plot_frame = ImageFrame(parent, -1, basename, img)
                 plot_frame.Show(False)
+                #plot_frame.im_show(img)
                 ax = plot_frame.plotpanel
                 if not is_png:
@@ -72,4 +73,5 @@
             except:
                 print "parent", parent
+                raise
                 err_msg += "Failed to load '%s'.\n"% basename
         if err_msg:
@@ -78,4 +80,5 @@
             else:
                 print err_msg
+
         
     def choose_data_file(self, location=None):
@@ -83,9 +86,24 @@
         Open a file dialog to allow loading a file
         """
+        parent = self.parent
         path = None
         if location == None:
             location = os.getcwd()
-        dlg = wx.FileDialog(self.parent, "Image Viewer: Choose a image file", 
-                            location, "", "", style=wx.FD_OPEN|wx.FD_MULTIPLE)
+        wlist = ''
+        elist = ["All images (*.png, *.bmp, *.gif, *.jpg, *.tif, *.tiff) | \
+                *.png; *.bmp; *.gif; *.jpg; *.tif; *.tiff", 
+                "PNG files (*.PNG, *.png) | *.png", 
+                "BMP files (*.BMP, *.bmp) | *.bmp", 
+                "GIF files (*.GIF, *.gif) | *.gif",
+                "JPG files (*.JPG, *.jpg) | *.jpg",
+                "TIF files (*.TIF, *.tif) | *.tif",
+                "TIFF files (*.TIFF, *.tiff) | *.tiff"]
+        if not IS_WIN:
+            del elist[0]
+        elist.append("All files (*.*) | *.*")
+        wlist = '|'.join(elist)        
+        style = wx.OPEN|wx.FD_MULTIPLE
+        dlg = wx.FileDialog(parent, "Image Viewer: Choose a image file", 
+                            location, "", wlist, style=style)
         if dlg.ShowModal() == wx.ID_OK:
             path = dlg.GetPaths()
Index: src/sas/perspectives/calculator/media/data_operator_help.rst
===================================================================
--- src/sas/perspectives/calculator/media/data_operator_help.rst	(revision 684fadea996acb945349f183745ff53188353534)
+++ src/sas/perspectives/calculator/media/data_operator_help.rst	(revision 98b30b46ac241d857a5698740991daae2c25c3c2)
@@ -9,10 +9,9 @@
 Description
 -----------
+This dialog panel provides arithmetic operations between two data sets (the 
+last data set could be a number).
 
-This tool permits arithmetic operations between two data sets. Alternatively, 
-the last data set can be a number.
-
-*NOTE! When* Data1 *and* Data2 *are both data, their Q (or Qx and Qy for 2D) 
-value(s) must match with each other UNLESS using the 'append' operator.*
+When data1 and data2 are selected, their x (or qx and qy for 2D) value(s)
+must match with each other.
 
 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
@@ -20,36 +19,21 @@
 How To
 ------
+1. Type the data name resulted from an operation.
 
-1) Enure you have loaded data into the *Data Explorer* (see :ref:`Load_Data`).
+2) Select a data/theory in the drop down menus. When data2 is set to number, 
+   type a number in the text control box.
 
-2) Select *Data Operation* from the *Tool* menu on the SasView toolbar.
+3) Select an arithmetic operator symbol; + (for addition), - (for subtraction), 
+   * (for multiplication), / (for division), and | (for combination of two data
+   sets).
 
-3) Select a dataset/theory in the drop-down menu *Data1*. A mini-plot of the
-   data will appear underneath.
+   If two data sets do not match, the operation will fail and the background color
+   of the combo box items will turn to red (WIN only).
 
-4) Select a dataset/theory in the drop-down menu *Data2* or select *Number* 
-   and enter a number in the box that appears alongside.
+4) If the operation is successful, hit the Apply button to make the new data.
+   Then the data name will be shown up in the data box in the data explorer.
 
-5) Select an arithmetic operator symbol from the *Operator* drop-down. The 
-   available operators are:
-   
-*  + (for addition)
-*  - (for subtraction), 
-*  * (for multiplication)
-*  / (for division)
-*  | (for combination of two data sets)
-
-   If two data sets do not match, the operation will fail and the background 
-   color of the combo box items will turn to red (WIN only).
-
-6) If the operation is successful, hit the Apply button to make the new dataset.
-   The new dataset will appear in the *Data Explorer*.
-
-*NOTE! Any errors and warnings will be displayed at the bottom of the SasView
-window.*
+Note: Any errors and warnings will be displayed at the bottom of the SasView
+window.
 
 .. image:: data_oper_pic.png
-
-.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
-
-.. note::  This help document was last changed by Steve King, 18Feb2015 
Index: src/sas/perspectives/calculator/media/density_calculator_help.rst
===================================================================
--- src/sas/perspectives/calculator/media/density_calculator_help.rst	(revision 054a3adbdd801eeb581a05fa28b4d54492c8e75a)
+++ src/sas/perspectives/calculator/media/density_calculator_help.rst	(revision ec392464eef959a5c2e87e6a72ed72fd7e947a07)
@@ -10,5 +10,5 @@
 -----------
 
-This tool calculates the mass density from the molar volume or vice 
+This tool is to calculate the mass density from the molar volume or vice 
 versa. To calculate the mass density, the chemical formula and molar volume 
 should be provided.
@@ -19,15 +19,15 @@
 ------
 
-1) Enter the empirical formula of a molecule. For mixtures, the ratio of each 
-   of the molecules should be used, for example, (H2O)0.5(D2O)0.5.
+1. Molecular Formula: The chemical formula of ONE molecule or ONE atom. For 
+mixtures, the ratio of the each molecules should be used; for example, 
+(H2O)0.5(D2O)0.5.
 
-2) Use the input combo box to choose between molar volume or mass density and 
-   then type in an input value.
+2. Select input (molar volume or mass density) from combobox. Then type in the 
+input value.
 
-3) Click the 'Calculate' button to perform the calculation.
+3. Click the 'Calculate' button to perform the calculation.
+
+4. Outputs also include the molar mass (weight) that depends only on the 
+chemical formula
 
 .. image:: density_tutor.gif
-
-.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
-
-.. note::  This help document was last changed by Steve King, 18Feb2015
Index: src/sas/perspectives/fitting/batchfitpage.py
===================================================================
--- src/sas/perspectives/fitting/batchfitpage.py	(revision fa09d62cc24b9425dc926fced79d5ba20fa6fcd3)
+++ src/sas/perspectives/fitting/batchfitpage.py	(revision 794922220f2fb3b23dd08c648aabf87b4850596c)
@@ -17,5 +17,4 @@
 from sas.models.qsmearing import smear_selection
 from sas.perspectives.fitting.fitpage import FitPage
-from sas.perspectives.fitting.fitpage import check_data_validity
 
 class BatchFitPage(FitPage):
@@ -31,371 +30,337 @@
         """
         FitPage.__init__(self, parent, color=color)
-        
-        ## draw sizer
-        
-    def _fill_data_sizer(self):
-        """
-        fill sizer 0 with data info
-        """
-        self.data_box_description = wx.StaticBox(self, -1, 'I(q) Data Source')
-        if check_data_validity(self.data):
-            dname_color = wx.BLUE
+        self.window_name = "BatchFit"
+        self.window_caption  = "BatchFit"
+        self._set_save_flag(False)
+        self._set_bookmark_flag(False)
+        
+    def _fill_range_sizer(self):
+        """
+        Fill the sizer containing the plotting range
+        add  access to npts
+        """
+        is_2Ddata = False
+        
+        # Check if data is 2D
+        if self.data.__class__.__name__ ==  "Data2D" or \
+                        self.enable2D:
+            is_2Ddata = True
+            
+        title = "Fitting"     
+        self._get_smear_info()
+        
+        #Sizers
+        box_description_range = wx.StaticBox(self, -1, str(title))
+        boxsizer_range = wx.StaticBoxSizer(box_description_range, wx.VERTICAL)      
+        self.sizer_set_smearer = wx.BoxSizer(wx.VERTICAL)
+        #sizer_smearer = wx.BoxSizer(wx.HORIZONTAL)
+        self.sizer_new_smear = wx.BoxSizer(wx.HORIZONTAL)
+        self.sizer_set_masking = wx.BoxSizer(wx.HORIZONTAL)
+        sizer_chi2 = wx.BoxSizer(wx.VERTICAL)
+
+        sizer_fit = wx.GridSizer(2, 4, 2, 6)
+        #Fit button
+        self.btFit = wx.Button(self, wx.NewId(), 'Fit', size=(88, 25))
+        self.default_bt_colour =  self.btFit.GetDefaultAttributes()
+        self.btFit.Bind(wx.EVT_BUTTON, self._onFit, id= self.btFit.GetId())
+        self.btFit.SetToolTipString("Start fitting.")
+
+        # Update and Draw button
+        self.draw_button = wx.Button(self, wx.NewId(), 'Compute', size=(88, 24))
+        self.draw_button.Bind(wx.EVT_BUTTON, \
+                              self._onDraw,id=self.draw_button.GetId())
+        self.draw_button.SetToolTipString("Compute and Draw.")  
+        sizer_fit.Add(self.draw_button, 0, 0)
+        sizer_fit.Add(self.btFit, 0, 0) 
+        sizer_chi2.Add((-1, 5))
+        # get smear_selection
+        self.current_smearer = smear_selection( self.data, self.model )
+        boxsizer_range.Add(self.sizer_set_masking)
+         #2D data? default
+        is_2Ddata = False
+        
+        #check if it is 2D data
+        if self.data.__class__.__name__ ==  "Data2D" or \
+                        self.enable2D:
+            is_2Ddata = True
+            
+        self.sizer5.Clear(True)
+     
+        self.qmin  = self.ModelTextCtrl(self, -1, size=(_BOX_WIDTH, 20), 
+                                          style=wx.TE_PROCESS_ENTER, 
+                                    text_enter_callback = self._onQrangeEnter)
+        self.qmin.SetValue(str(self.qmin_x))
+        self.qmin.SetToolTipString("Minimun value of Q in linear scale.")
+     
+        self.qmax  = self.ModelTextCtrl(self, -1, size=(_BOX_WIDTH, 20), 
+                                          style=wx.TE_PROCESS_ENTER, 
+                                        text_enter_callback=self._onQrangeEnter)
+        self.qmax.SetValue(str(self.qmax_x))
+        self.qmax.SetToolTipString("Maximum value of Q in linear scale.")
+        
+        id = wx.NewId()
+        self.reset_qrange =wx.Button(self, id, 'Reset', size=(77, 20))
+      
+        self.reset_qrange.Bind(wx.EVT_BUTTON, self.on_reset_clicked, id=id)
+        self.reset_qrange.SetToolTipString(\
+                                    "Reset Q range to the default values")
+     
+        sizer_horizontal = wx.BoxSizer(wx.HORIZONTAL)
+        sizer = wx.GridSizer(2, 4, 2, 6)
+
+        self.btEditMask = wx.Button(self, wx.NewId(),'Editor', size=(88, 23))
+        self.btEditMask.Bind(wx.EVT_BUTTON, 
+                             self._onMask,id=self.btEditMask.GetId())
+        self.btEditMask.SetToolTipString("Edit Mask.")
+        self.EditMask_title = wx.StaticText(self, -1, ' Masking(2D)')
+
+        sizer.Add(wx.StaticText(self, -1, 'Q range'))     
+        sizer.Add(wx.StaticText(self, -1, ' Min[1/A]'))
+        sizer.Add(wx.StaticText(self, -1, ' Max[1/A]'))
+        sizer.Add(self.EditMask_title)
+ 
+        sizer.Add(self.reset_qrange)   
+        sizer.Add(self.qmin)
+        sizer.Add(self.qmax)
+
+        sizer.Add(self.btEditMask)
+        boxsizer_range.Add(sizer_chi2) 
+        boxsizer_range.Add((10, 10))
+        boxsizer_range.Add(sizer)
+        
+        boxsizer_range.Add((10, 15))
+        boxsizer_range.Add(sizer_fit)
+        if is_2Ddata:
+            self.btEditMask.Enable()  
+            self.EditMask_title.Enable() 
         else:
-            dname_color = wx.RED
-        self.data_box_description.SetForegroundColour(dname_color)
-        boxsizer1 = wx.StaticBoxSizer(self.data_box_description, wx.VERTICAL)
-        #----------------------------------------------------------
-        sizer_data = wx.BoxSizer(wx.VERTICAL)
-        text1 = wx.StaticText(self, -1, ' - Choose a file to set initial fit parameters -')
-        text1.SetForegroundColour(wx.RED)
-        sizer_data.Add(text1)
-        text2 = wx.StaticText(self, -1, ' - This panel is not designed to view individual fits. - ')
-        text2.SetForegroundColour(wx.RED)
-        sizer_data.Add(text2)
-        
-        combo = wx.BoxSizer(wx.HORIZONTAL)
-        self.dataSource = wx.ComboBox(self, -1, style=wx.CB_READONLY)
-        wx.EVT_COMBOBOX(self.dataSource, -1, self.on_select_data)
-        self.dataSource.SetMinSize((_DATA_BOX_WIDTH, -1))
-        
-        combo.Add(wx.StaticText(self, -1, 'Name : '))
-        combo.Add((0,5))
-        combo.Add(self.dataSource)
-        
-        sizer_data.Add(combo, 0, wx.ALL, 10)
-        boxsizer1.Add(sizer_data, 0, wx.ALL, 0)
-        self.sizer0.Add(boxsizer1, 0, wx.EXPAND | wx.ALL, 10)
-        self.sizer0.Layout()
-
-#    COMMENTED OUT TO USE METHODS INHERITED FROM fitpage.py
-        
-#     def _fill_range_sizer(self):
-#         """
-#         Fill the sizer containing the plotting range
-#         add  access to npts
-#         """
-#         is_2Ddata = False
-#         
-#         # Check if data is 2D
-#         if self.data.__class__.__name__ ==  "Data2D" or \
-#                         self.enable2D:
-#             is_2Ddata = True
-#             
-#         title = "Fitting"     
-#         self._get_smear_info()
-#         
-#         #Sizers
-#         box_description_range = wx.StaticBox(self, -1, str(title))
-#         boxsizer_range = wx.StaticBoxSizer(box_description_range, wx.VERTICAL)      
-#         self.sizer_set_smearer = wx.BoxSizer(wx.VERTICAL)
-#         #sizer_smearer = wx.BoxSizer(wx.HORIZONTAL)
-#         self.sizer_new_smear = wx.BoxSizer(wx.HORIZONTAL)
-#         self.sizer_set_masking = wx.BoxSizer(wx.HORIZONTAL)
-#         sizer_chi2 = wx.BoxSizer(wx.VERTICAL)
-# 
-#         sizer_fit = wx.GridSizer(2, 4, 2, 6)
-#         #Fit button
-#         self.btFit = wx.Button(self, wx.NewId(), 'Fit', size=(88, 25))
-#         self.default_bt_colour =  self.btFit.GetDefaultAttributes()
-#         self.btFit.Bind(wx.EVT_BUTTON, self._onFit, id= self.btFit.GetId())
-#         self.btFit.SetToolTipString("Start fitting.")
-# 
-#         # Update and Draw button
-#         self.draw_button = wx.Button(self, wx.NewId(), 'Compute', size=(88, 24))
-#         self.draw_button.Bind(wx.EVT_BUTTON, \
-#                               self._onDraw,id=self.draw_button.GetId())
-#         self.draw_button.SetToolTipString("Compute and Draw.")  
-#         sizer_fit.Add(self.draw_button, 0, 0)
-#         sizer_fit.Add(self.btFit, 0, 0) 
-#         sizer_chi2.Add((-1, 5))
-#         # get smear_selection
-#         self.current_smearer = smear_selection( self.data, self.model )
-#         boxsizer_range.Add(self.sizer_set_masking)
-#          #2D data? default
-#         is_2Ddata = False
-#         
-#         #check if it is 2D data
-#         if self.data.__class__.__name__ ==  "Data2D" or \
-#                         self.enable2D:
-#             is_2Ddata = True
-#             
-#         self.sizer5.Clear(True)
-#      
-#         self.qmin  = self.ModelTextCtrl(self, -1, size=(_BOX_WIDTH, 20), 
-#                                           style=wx.TE_PROCESS_ENTER, 
-#                                     text_enter_callback = self._onQrangeEnter)
-#         self.qmin.SetValue(str(self.qmin_x))
-#         self.qmin.SetToolTipString("Minimun value of Q in linear scale.")
-#      
-#         self.qmax  = self.ModelTextCtrl(self, -1, size=(_BOX_WIDTH, 20), 
-#                                           style=wx.TE_PROCESS_ENTER, 
-#                                         text_enter_callback=self._onQrangeEnter)
-#         self.qmax.SetValue(str(self.qmax_x))
-#         self.qmax.SetToolTipString("Maximum value of Q in linear scale.")
-#         
-#         id = wx.NewId()
-#         self.reset_qrange =wx.Button(self, id, 'Reset', size=(77, 20))
-#       
-#         self.reset_qrange.Bind(wx.EVT_BUTTON, self.on_reset_clicked, id=id)
-#         self.reset_qrange.SetToolTipString(\
-#                                     "Reset Q range to the default values")
-#      
-#         sizer_horizontal = wx.BoxSizer(wx.HORIZONTAL)
-#         sizer = wx.GridSizer(2, 4, 2, 6)
-# 
-#         self.btEditMask = wx.Button(self, wx.NewId(),'Editor', size=(88, 23))
-#         self.btEditMask.Bind(wx.EVT_BUTTON, 
-#                              self._onMask,id=self.btEditMask.GetId())
-#         self.btEditMask.SetToolTipString("Edit Mask.")
-#         self.EditMask_title = wx.StaticText(self, -1, ' Masking(2D)')
-# 
-#         sizer.Add(wx.StaticText(self, -1, 'Q range'))     
-#         sizer.Add(wx.StaticText(self, -1, ' Min[1/A]'))
-#         sizer.Add(wx.StaticText(self, -1, ' Max[1/A]'))
-#         sizer.Add(self.EditMask_title)
-#  
-#         sizer.Add(self.reset_qrange)   
-#         sizer.Add(self.qmin)
-#         sizer.Add(self.qmax)
-# 
-#         sizer.Add(self.btEditMask)
-#         boxsizer_range.Add(sizer_chi2) 
-#         boxsizer_range.Add((10, 10))
-#         boxsizer_range.Add(sizer)
-#         
-#         boxsizer_range.Add((10, 15))
-#         boxsizer_range.Add(sizer_fit)
-#         if is_2Ddata:
-#             self.btEditMask.Enable()  
-#             self.EditMask_title.Enable() 
-#         else:
-#             self.btEditMask.Disable()  
-#             self.EditMask_title.Disable()
-# 
-#         ## save state
-#         #self.save_current_state()
-# 
-#         self.sizer5.Add(boxsizer_range, 0, wx.EXPAND | wx.ALL, 10)
-#         self.sizer5.Layout()
-#        
-#     def _on_select_model(self, event=None): 
-#         """
-#         call back for model selection
-#         """  
-#         
-#         self.Show(False)    
-#         self._on_select_model_helper() 
-#         self.set_model_param_sizer(self.model)                   
-#         if self.model is None:
-#             self._set_bookmark_flag(False)
-#             self._keep.Enable(False)
-#             self._set_save_flag(False)
-#         self.enable_disp.SetValue(False)
-#         self.disable_disp.SetValue(True)
-#         try:
-#             self.set_dispers_sizer()
-#         except:
-#             pass
-#         self.state.structurecombobox = self.structurebox.GetCurrentSelection()
-#         self.state.formfactorcombobox = self.formfactorbox.GetCurrentSelection()
-#       
-#         if self.model != None:
-#             self._set_copy_flag(True)
-#             self._set_paste_flag(True)
-#             if self.data != None:
-#                 self._set_bookmark_flag(False)
-#                 self._keep.Enable(False)
-#                 
-#             temp_smear = None
-#             ## event to post model to fit to fitting plugins
-#             (ModelEventbox, _) = wx.lib.newevent.NewEvent()
-#          
-#             ## set smearing value whether or not 
-#             #    the data contain the smearing info
-#             evt = ModelEventbox(model=self.model, 
-#                                         smearer=temp_smear, 
-#                                         qmin=float(self.qmin_x),
-#                                         uid=self.uid,
-#                                      qmax=float(self.qmax_x)) 
-#    
-#             self._manager._on_model_panel(evt=evt)
-#             self.mbox_description.SetLabel("Model [%s]" % str(self.model.name))
-#             self.state.model = self.model.clone()
-#             self.state.model.name = self.model.name
-# 
-#             
-#         if event != None:
-#             ## post state to fit panel
-#             new_event = PageInfoEvent(page = self)
-#             wx.PostEvent(self.parent, new_event) 
-#             #update list of plugins if new plugin is available
-#             if self.plugin_rbutton.GetValue():
-#                 temp = self.parent.update_model_list()
-#                 if temp:
-#                     self.model_list_box = temp
-#                     current_val = self.formfactorbox.GetValue()
-#                     pos = self.formfactorbox.GetSelection()
-#                     self._show_combox_helper()
-#                     self.formfactorbox.SetSelection(pos)
-#                     self.formfactorbox.SetValue(current_val)
-#             self._onDraw(event=None)
-#         else:
-#             self._draw_model()
-#         self.SetupScrolling()
-#         self.Show(True)   
-#         
-#     def _update_paramv_on_fit(self):
-#         """
-#         make sure that update param values just before the fitting
-#         """
-#         #flag for qmin qmax check values
-#         flag = True
-#         self.fitrange = True
-#         is_modified = False
-# 
-#         if self.model != None:           
-#             ##Check the values
-#             self._check_value_enter( self.fittable_param, is_modified)
-#             self._check_value_enter( self.fixed_param, is_modified)
-#             self._check_value_enter( self.parameters, is_modified)
-# 
-#             # If qmin and qmax have been modified, update qmin and qmax and 
-#              # Here we should check whether the boundaries have been modified.
-#             # If qmin and qmax have been modified, update qmin and qmax and 
-#             # set the is_modified flag to True
-#             self.fitrange = self._validate_qrange(self.qmin, self.qmax)
-#             if self.fitrange:
-#                 tempmin = float(self.qmin.GetValue())
-#                 if tempmin != self.qmin_x:
-#                     self.qmin_x = tempmin
-#                 tempmax = float(self.qmax.GetValue())
-#                 if tempmax != self.qmax_x:
-#                     self.qmax_x = tempmax
-#                 if tempmax == tempmin:
-#                     flag = False    
-#                 #temp_smearer = None
-#                 if self._is_2D():
-#                     # only 2D case set mask  
-#                     flag = self._validate_Npts()
-#                     if not flag:
-#                         return flag
-#             else: flag = False
-#         else: 
-#             flag = False
-# 
-#         #For invalid q range, disable the mask editor and fit button, vs.    
-#         if not self.fitrange:
-#             #self.btFit.Disable()
-#             if self._is_2D():
-#                 self.btEditMask.Disable()
-#         else:
-#             #self.btFit.Enable(True)
-#             if self._is_2D() and  self.data != None:
-#                 self.btEditMask.Enable(True)
-# 
-#         if not flag:
-#             msg = "Cannot Plot or Fit :Must select a "
-#             msg += " model or Fitting range is not valid!!!  "
-#             wx.PostEvent(self.parent.parent, StatusEvent(status=msg))
-#         
-#         self.save_current_state()
-#    
-#         return flag  
-#     def save_current_state(self):
-#         """
-#         Currently no save option implemented for batch page
-#         """
-#         pass 
-#     def save_current_state_fit(self):
-#         """
-#         Currently no save option implemented for batch page
-#         """
-#         pass
-#     def set_data(self, data):
-#         """
-#         reset the current data 
-#         """
-#         #id = None
-#         group_id = None
-#         flag = False
-#         if self.data is None and data is not None:
-#             flag = True
-#         if data is not None:
-#             #id = data.id
-#             group_id = data.group_id
-#             if self.data is not None:
-#                 flag = (data.id != self.data.id)
-#         self.data = data
-#         if self.data is None:
-#             data_min = ""
-#             data_max = ""
-#             data_name = ""
-#             self._set_bookmark_flag(False)
-#             self._keep.Enable(False)
-#             self._set_save_flag(False)
-#         else:
-#             if self.model != None:
-#                 self._set_bookmark_flag(False)
-#                 self._keep.Enable(False)
-#             self._set_save_flag(False)
-#             self._set_preview_flag(True)
-#   
-#             self.formfactorbox.Enable()
-#             self.structurebox.Enable()
-#             data_name = self.data.name
-#             #set maximum range for x in linear scale
-#             if not hasattr(self.data,"data"): #Display only for 1D data fit
-#                 # Minimum value of data   
-#                 data_min = min(self.data.x)
-#                 # Maximum value of data  
-#                 data_max = max(self.data.x)
-#                 self.btEditMask.Disable()  
-#                 self.EditMask_title.Disable()
-#             else:
-#                 
-#                 ## Minimum value of data 
-#                 data_min = 0
-#                 x = max(math.fabs(self.data.xmin), math.fabs(self.data.xmax)) 
-#                 y = max(math.fabs(self.data.ymin), math.fabs(self.data.ymax))
-#                 ## Maximum value of data  
-#                 data_max = math.sqrt(x*x + y*y)
-#                 self.btEditMask.Enable()  
-#                 self.EditMask_title.Enable() 
-# 
-#         self.dataSource.SetValue(data_name)
-#         self.qmin_x = data_min
-#         self.qmax_x = data_max
-#         #self.minimum_q.SetValue(str(data_min))
-#         #self.maximum_q.SetValue(str(data_max))
-#         self.qmin.SetValue(str(data_min))
-#         self.qmax.SetValue(str(data_max))
-#         self.qmin.SetBackgroundColour("white")
-#         self.qmax.SetBackgroundColour("white")
-#         self.state.data = data
-#         self.state.qmin = self.qmin_x
-#         self.state.qmax = self.qmax_x
-#         
-#         #update model plot with new data information
-#         if flag:
-#             #set model view button
-#             if self.data.__class__.__name__ == "Data2D":
-#                 self.enable2D = True
-#                 self.model_view.SetLabel("2D Mode")
-#             else:
-#                 self.enable2D = False
-#                 self.model_view.SetLabel("1D Mode")
-#                 
-#             self.model_view.Disable()
-#             
-#             wx.PostEvent(self._manager.parent, 
-#                              NewPlotEvent(group_id=group_id,
-#                                                action="delete"))
-#             #plot the current selected data
-#             wx.PostEvent(self._manager.parent, NewPlotEvent(plot=self.data, 
-#                                                     title=str(self.data.title)))
-#             self._manager.store_data(uid=self.uid, data=data,
-#                                      data_list=self.data_list,
-#                                       caption=self.window_name)
-#             self._draw_model()
+            self.btEditMask.Disable()  
+            self.EditMask_title.Disable()
+
+        ## save state
+        #self.save_current_state()
+
+        self.sizer5.Add(boxsizer_range, 0, wx.EXPAND | wx.ALL, 10)
+        self.sizer5.Layout()
+       
+    def _on_select_model(self, event=None): 
+        """
+        call back for model selection
+        """  
+        
+        self.Show(False)    
+        self._on_select_model_helper() 
+        self.set_model_param_sizer(self.model)                   
+        if self.model is None:
+            self._set_bookmark_flag(False)
+            self._keep.Enable(False)
+            self._set_save_flag(False)
+        self.enable_disp.SetValue(False)
+        self.disable_disp.SetValue(True)
+        try:
+            self.set_dispers_sizer()
+        except:
+            pass
+        self.state.structurecombobox = self.structurebox.GetCurrentSelection()
+        self.state.formfactorcombobox = self.formfactorbox.GetCurrentSelection()
+      
+        if self.model != None:
+            self._set_copy_flag(True)
+            self._set_paste_flag(True)
+            if self.data != None:
+                self._set_bookmark_flag(False)
+                self._keep.Enable(False)
+                
+            temp_smear = None
+            ## event to post model to fit to fitting plugins
+            (ModelEventbox, _) = wx.lib.newevent.NewEvent()
+         
+            ## set smearing value whether or not 
+            #    the data contain the smearing info
+            evt = ModelEventbox(model=self.model, 
+                                        smearer=temp_smear, 
+                                        qmin=float(self.qmin_x),
+                                        uid=self.uid,
+                                     qmax=float(self.qmax_x)) 
+   
+            self._manager._on_model_panel(evt=evt)
+            self.mbox_description.SetLabel("Model [%s]" % str(self.model.name))
+            self.state.model = self.model.clone()
+            self.state.model.name = self.model.name
+
+            
+        if event != None:
+            ## post state to fit panel
+            new_event = PageInfoEvent(page = self)
+            wx.PostEvent(self.parent, new_event) 
+            #update list of plugins if new plugin is available
+            if self.plugin_rbutton.GetValue():
+                temp = self.parent.update_model_list()
+                if temp:
+                    self.model_list_box = temp
+                    current_val = self.formfactorbox.GetValue()
+                    pos = self.formfactorbox.GetSelection()
+                    self._show_combox_helper()
+                    self.formfactorbox.SetSelection(pos)
+                    self.formfactorbox.SetValue(current_val)
+            self._onDraw(event=None)
+        else:
+            self._draw_model()
+        self.SetupScrolling()
+        self.Show(True)   
+        
+    def _update_paramv_on_fit(self):
+        """
+        make sure that update param values just before the fitting
+        """
+        #flag for qmin qmax check values
+        flag = True
+        self.fitrange = True
+        is_modified = False
+
+        if self.model != None:           
+            ##Check the values
+            self._check_value_enter( self.fittable_param, is_modified)
+            self._check_value_enter( self.fixed_param, is_modified)
+            self._check_value_enter( self.parameters, is_modified)
+
+            # If qmin and qmax have been modified, update qmin and qmax and 
+             # Here we should check whether the boundaries have been modified.
+            # If qmin and qmax have been modified, update qmin and qmax and 
+            # set the is_modified flag to True
+            self.fitrange = self._validate_qrange(self.qmin, self.qmax)
+            if self.fitrange:
+                tempmin = float(self.qmin.GetValue())
+                if tempmin != self.qmin_x:
+                    self.qmin_x = tempmin
+                tempmax = float(self.qmax.GetValue())
+                if tempmax != self.qmax_x:
+                    self.qmax_x = tempmax
+                if tempmax == tempmin:
+                    flag = False    
+                #temp_smearer = None
+                if self._is_2D():
+                    # only 2D case set mask  
+                    flag = self._validate_Npts()
+                    if not flag:
+                        return flag
+            else: flag = False
+        else: 
+            flag = False
+
+        #For invalid q range, disable the mask editor and fit button, vs.    
+        if not self.fitrange:
+            #self.btFit.Disable()
+            if self._is_2D():
+                self.btEditMask.Disable()
+        else:
+            #self.btFit.Enable(True)
+            if self._is_2D() and  self.data != None:
+                self.btEditMask.Enable(True)
+
+        if not flag:
+            msg = "Cannot Plot or Fit :Must select a "
+            msg += " model or Fitting range is not valid!!!  "
+            wx.PostEvent(self.parent.parent, StatusEvent(status=msg))
+        
+        self.save_current_state()
+   
+        return flag  
+    def save_current_state(self):
+        """
+        Currently no save option implemented for batch page
+        """
+        pass 
+    def save_current_state_fit(self):
+        """
+        Currently no save option implemented for batch page
+        """
+        pass
+    def set_data(self, data):
+        """
+        reset the current data 
+        """
+        #id = None
+        group_id = None
+        flag = False
+        if self.data is None and data is not None:
+            flag = True
+        if data is not None:
+            #id = data.id
+            group_id = data.group_id
+            if self.data is not None:
+                flag = (data.id != self.data.id)
+        self.data = data
+        if self.data is None:
+            data_min = ""
+            data_max = ""
+            data_name = ""
+            self._set_bookmark_flag(False)
+            self._keep.Enable(False)
+            self._set_save_flag(False)
+        else:
+            if self.model != None:
+                self._set_bookmark_flag(False)
+                self._keep.Enable(False)
+            self._set_save_flag(False)
+            self._set_preview_flag(True)
+  
+            self.formfactorbox.Enable()
+            self.structurebox.Enable()
+            data_name = self.data.name
+            #set maximum range for x in linear scale
+            if not hasattr(self.data,"data"): #Display only for 1D data fit
+                # Minimum value of data   
+                data_min = min(self.data.x)
+                # Maximum value of data  
+                data_max = max(self.data.x)
+                self.btEditMask.Disable()  
+                self.EditMask_title.Disable()
+            else:
+                
+                ## Minimum value of data 
+                data_min = 0
+                x = max(math.fabs(self.data.xmin), math.fabs(self.data.xmax)) 
+                y = max(math.fabs(self.data.ymin), math.fabs(self.data.ymax))
+                ## Maximum value of data  
+                data_max = math.sqrt(x*x + y*y)
+                self.btEditMask.Enable()  
+                self.EditMask_title.Enable() 
+
+        self.dataSource.SetValue(data_name)
+        self.qmin_x = data_min
+        self.qmax_x = data_max
+        #self.minimum_q.SetValue(str(data_min))
+        #self.maximum_q.SetValue(str(data_max))
+        self.qmin.SetValue(str(data_min))
+        self.qmax.SetValue(str(data_max))
+        self.qmin.SetBackgroundColour("white")
+        self.qmax.SetBackgroundColour("white")
+        self.state.data = data
+        self.state.qmin = self.qmin_x
+        self.state.qmax = self.qmax_x
+        
+        #update model plot with new data information
+        if flag:
+            #set model view button
+            if self.data.__class__.__name__ == "Data2D":
+                self.enable2D = True
+                self.model_view.SetLabel("2D Mode")
+            else:
+                self.enable2D = False
+                self.model_view.SetLabel("1D Mode")
+                
+            self.model_view.Disable()
+            
+            wx.PostEvent(self._manager.parent, 
+                             NewPlotEvent(group_id=group_id,
+                                               action="delete"))
+            #plot the current selected data
+            wx.PostEvent(self._manager.parent, NewPlotEvent(plot=self.data, 
+                                                    title=str(self.data.title)))
+            self._manager.store_data(uid=self.uid, data=data,
+                                     data_list=self.data_list,
+                                      caption=self.window_name)
+            self._draw_model()
     
 
Index: src/sas/perspectives/fitting/fitpanel.py
===================================================================
--- src/sas/perspectives/fitting/fitpanel.py	(revision fa09d62cc24b9425dc926fced79d5ba20fa6fcd3)
+++ src/sas/perspectives/fitting/fitpanel.py	(revision 794922220f2fb3b23dd08c648aabf87b4850596c)
@@ -371,7 +371,6 @@
         """
         from fitpage import FitPage
-        from batchfitpage import BatchFitPage
+        panel = FitPage(parent=self)
         if self.batch_on:
-            panel = BatchFitPage(parent=self)
             self.batch_page_index += 1
             caption = "BatchPage" + str(self.batch_page_index)
@@ -379,5 +378,4 @@
         else:
             #Increment index of fit page
-            panel = FitPage(parent=self)
             self.fit_page_index += 1
             caption = "FitPage" + str(self.fit_page_index)
@@ -469,5 +467,5 @@
         if data_1d_list and data_2d_list:
             # need to warning the user that this batch is a special case
-            from sas.perspectives.fitting.fitting_widgets import BatchDataDialog
+            from sas import BatchDataDialog
             dlg = BatchDataDialog(self)
             if dlg.ShowModal() == wx.ID_OK:
Index: src/sas/perspectives/fitting/report_dialog.py
===================================================================
--- src/sas/perspectives/fitting/report_dialog.py	(revision e8bb5b62d717c7b44481a4b621030699e4efdaf4)
+++ src/sas/perspectives/fitting/report_dialog.py	(revision 4ec242ef37ff5f92d91a892156e04d092559af32)
@@ -14,35 +14,61 @@
 
 import wx
+import sys
 import os
 import wx.html as html
-
-from sas.guiframe.report_dialog import BaseReportDialog
-
-class ReportDialog(BaseReportDialog):
+import logging
+
+_STATICBOX_WIDTH = 480
+PANEL_WIDTH = 530
+PANEL_HEIGHT = 700
+FONT_VARIANT = 1
+ISMAC = False
+ISPDF = False
+if sys.platform == "win32":
+    _STATICBOX_WIDTH = 450
+    PANEL_WIDTH = 500
+    PANEL_HEIGHT = 700
+    FONT_VARIANT = 0
+    ISMAC = False
+    ISPDF = True
+elif sys.platform == "darwin":
+    ISMAC = True
+    ISPDF = True
+
+        
+class ReportDialog(wx.Dialog):
     """
     The report dialog box.
     """
     
-    def __init__(self, report_list, *args, **kwds):
+    def __init__(self, list, *args, **kwds):
         """
         Initialization. The parameters added to Dialog are:
         
-        :param report_list: list of html_str, text_str, image
+        :param list: report_list (list of html_str, text_str, image)
         from invariant_state
         """
-        super(ReportDialog, self).__init__(report_list, *args, **kwds)
-
+        kwds["style"] = wx.RESIZE_BORDER|wx.DEFAULT_DIALOG_STYLE
+        wx.Dialog.__init__(self, *args, **kwds)
+        kwds["image"] = 'Dynamic Image'
         # title
         self.SetTitle("Report: Fitting")
-
+        # size
+        self.SetSize((720, 650))
+        # font size
+        self.SetWindowVariant(variant=FONT_VARIANT)
+        # check if tit is MAC
+        self.is_pdf = ISPDF
+        # report string
+        self.report_list = list
         # number of images of plot
-        self.nimages = len(self.report_list[2])
-        
-        if self.report_list[2] != None:
+        self.nimages = len(list[2])
+        
+        if list[2] != None:
             # put image path in the report string
-            if len(self.report_list[2]) == 1:
+            if len(list[2]) == 1:
                 self.report_html = self.report_list[0] % \
                                     "memory:img_fit0.png"
-            elif len(self.report_list) == 2:
+            elif len(list[2]) == 2:
                 self.report_html = self.report_list[0] % \
                                     ("memory:img_fit0.png",
@@ -59,11 +85,71 @@
         self._setup_layout()
         
+    def _setup_layout(self):
+        """
+        Set up layout
+        """
+        hbox = wx.BoxSizer(wx.HORIZONTAL)
+        
+        # buttons
+        id = wx.ID_OK
+        button_close = wx.Button(self, id, "Close")
+        button_close.SetToolTipString("Close this report window.")
+        #hbox.Add((5,10), 1 , wx.EXPAND|wx.ADJUST_MINSIZE,0)
+        hbox.Add(button_close)
+        button_close.SetFocus()
+
+        id = wx.NewId()
+        button_preview = wx.Button(self, id, "Preview")
+        button_preview.SetToolTipString("Print preview this report.")
+        button_preview.Bind(wx.EVT_BUTTON, self.onPreview,
+                            id=button_preview.GetId()) 
+        hbox.Add(button_preview)
+
+        id = wx.NewId()
+        button_print = wx.Button(self, id, "Print")
+        button_print.SetToolTipString("Print this report.")
+        button_print.Bind(wx.EVT_BUTTON, self.onPrint,
+                          id=button_print.GetId())
+        hbox.Add(button_print)
+        
+        id = wx.NewId()
+        button_save = wx.Button(self, id, "Save")
+        button_save.SetToolTipString("Save this report.")
+        button_save.Bind(wx.EVT_BUTTON, self.onSave, id=button_save.GetId())
+        hbox.Add(button_save)
+        
+        # panel for report page
+        #panel = wx.Panel(self, -1)
+        vbox = wx.BoxSizer(wx.VERTICAL)
+        # html window
+        self.hwindow = html.HtmlWindow(self, style=wx.BORDER)
+        # set the html page with the report string
+        self.hwindow.SetPage(self.report_html)
+        
+        # add panels to boxsizers
+        vbox.Add(hbox)
+        vbox.Add(self.hwindow, 1, wx.EXPAND|wx.ALL,0)
+
+        self.SetSizer(vbox)
+        self.Centre()
+        self.Show(True)
+
     def onSave(self, event=None):
         """
         Save
         """
+        # pdf supporting only on MAC, not on exe
+        if self.is_pdf:
+            wild_card = ' PDF files (*.pdf)|*.pdf|'
+            ind_cor = 0
+        else:
+            wild_card = ''
+            ind_cor = 1
+        wild_card += 'HTML files (*.html)|*.html|'
+        wild_card += 'Text files (*.txt)|*.txt'
+
         #todo: complete saving fig file and as a txt file
         dlg = wx.FileDialog(self, "Choose a file",
-                            wildcard=self.wild_card,
+                            wildcard=wild_card,
                             style=wx.SAVE|wx.OVERWRITE_PROMPT|wx.CHANGE_DIR)
         dlg.SetFilterIndex(0)  # Set .html files to be default
@@ -80,5 +166,5 @@
         pic_fname = []
         #PDF
-        if ext_num == (0 + 2 * self.index_offset):
+        if ext_num == (0 + 2 * ind_cor):
             # TODO: Sort this case out
             ext = '.pdf'
@@ -130,5 +216,5 @@
             return
         #HTML + png(graph)
-        elif ext_num == (1 - self.index_offset):
+        elif ext_num == (1 - ind_cor):
             ext = '.html'
             for num in range(self.nimages):
@@ -136,5 +222,5 @@
             report_frame = self.report_list[0]
         #TEXT + pdf(graph)
-        elif ext_num == (2 - self.index_offset):
+        elif ext_num == (2 - ind_cor):
             ext = '.txt'
             # changing the image extension actually changes the image
@@ -155,5 +241,5 @@
             pic_fname.append(pic_name)
         #put the image path in html string
-        if ext_num == (1 - self.index_offset):
+        if ext_num == (1 - ind_cor):
             if self.nimages == 1:
                 report = report_frame % os.path.basename(pic_fname[0])
@@ -173,2 +259,59 @@
             self.report_list[2][num].savefig(pic_fname[num])
         
+    def onPreview(self, event=None):
+        """
+        Preview
+        
+        : event: Preview button event
+        """
+        previewh = html.HtmlEasyPrinting(name="Printing", parentWindow=self)
+        previewh.PreviewText(self.report_html)
+        if event is not None:
+            event.Skip()
+        self.Update()
+    
+    def onPrint(self, event=None):
+        """
+        Print
+        
+        : event: Print button event
+        """
+        printh = html.HtmlEasyPrinting(name="Printing", parentWindow=self)
+        printh.PrintText(self.report_html)
+        if event is not None:
+            event.Skip()
+        self.Update()
+        
+    def OnClose(self, event=None):
+        """
+        Close the Dialog
+        
+        : event: Close button event
+        """
+        self.Close()
+        # Reset memory
+        #wx.MemoryFSHandler()
+        if event is not None:
+            event.Skip()
+    
+    def HTML2PDF(self, data, filename):
+        """
+        Create a PDF file from html source string.
+        Returns True is the file creation was successful. 
+        
+        : data: html string
+        : filename: name of file to be saved
+        """
+        try:
+            from xhtml2pdf import pisa
+            # open output file for writing (truncated binary)
+            resultFile = open(filename, "w+b")
+            # convert HTML to PDF
+            pisaStatus = pisa.CreatePDF(data, dest=resultFile)
+            # close output file
+            resultFile.close()
+            self.Update()
+            return pisaStatus.err
+        except:
+            logging.error("Error creating pdf: %s" % sys.exc_value)
+        return False
Index: src/sas/perspectives/invariant/report_dialog.py
===================================================================
--- src/sas/perspectives/invariant/report_dialog.py	(revision e8bb5b62d717c7b44481a4b621030699e4efdaf4)
+++ src/sas/perspectives/invariant/report_dialog.py	(revision 4ec242ef37ff5f92d91a892156e04d092559af32)
@@ -15,30 +15,116 @@
 """
 import wx
+import sys
 import os
 import wx.html as html
- 
-from sas.guiframe.report_dialog import BaseReportDialog
-
-class ReportDialog(BaseReportDialog):
+import logging
+ISPDF = False
+if sys.platform == "win32":
+    _STATICBOX_WIDTH = 450
+    PANEL_WIDTH = 500 
+    PANEL_HEIGHT = 700
+    FONT_VARIANT = 0
+    ISMAC = False
+    ISPDF = True
+elif sys.platform == "darwin":
+    _STATICBOX_WIDTH = 480
+    PANEL_WIDTH = 530
+    PANEL_HEIGHT = 700
+    FONT_VARIANT = 1
+    ISMAC = True
+    ISPDF = True
+  
+class ReportDialog(wx.Dialog):
     """
     The report dialog box. 
     """
     
-    def __init__(self,  report_list, *args, **kwds):
+    def __init__(self,  list, *args, **kwds):
         """
         Initialization. The parameters added to Dialog are:
         
-        :param report_list: list of html_str, text_str, image
+        :param list: report_list (list of html_str, text_str, image)
         from invariant_state
         """
-        super(ReportDialog, self).__init__(report_list, *args, **kwds)
-
+        kwds["style"] = wx.RESIZE_BORDER|wx.DEFAULT_DIALOG_STYLE
+        wx.Dialog.__init__(self, *args, **kwds)
+        kwds["image"] = 'Dynamic Image'
         # title
         self.SetTitle("Report: Invariant computaion")
-
+        # size
+        self.SetSize((720, 650))
+        # font size 
+        self.SetWindowVariant(variant=FONT_VARIANT)
+
+        # check if tit is MAC
+        self.is_pdf = ISPDF
+        
+        # report string
+        self.report_list = list
         # put image path in the report string
         self.report_html = self.report_list[0] % "memory:img_inv.png"
         # layout
         self._setup_layout()
+        # wild card
+        # pdf supporting only on MAC
+        if self.is_pdf:
+        	self.wild_card = ' PDF files (*.pdf)|*.pdf|'
+        else:
+        	self.wild_card = ''
+        self.wild_card += 'HTML files (*.html)|*.html|'
+        self.wild_card += 'Text files (*.txt)|*.txt'
+  
+        
+        
+    def _setup_layout(self):
+        """
+        Set up layout
+        """
+        hbox = wx.BoxSizer(wx.HORIZONTAL)
+        
+        # buttons
+        id = wx.ID_OK
+        button_close = wx.Button(self, id, "Close")
+        button_close.SetToolTipString("Close this report window.") 
+        #hbox.Add((5,10), 1 , wx.EXPAND|wx.ADJUST_MINSIZE,0)
+        hbox.Add(button_close)
+        button_close.SetFocus()
+
+        id = wx.NewId()
+        button_preview = wx.Button(self, id, "Preview")
+        button_preview.SetToolTipString("Print preview this report.")
+        button_preview.Bind(wx.EVT_BUTTON, self.onPreview,
+                            id=button_preview.GetId()) 
+        hbox.Add(button_preview)
+
+        id = wx.NewId()
+        button_print = wx.Button(self, id, "Print")
+        button_print.SetToolTipString("Print this report.")
+        button_print.Bind(wx.EVT_BUTTON, self.onPrint,
+                          id=button_print.GetId()) 
+        hbox.Add(button_print)
+        
+        id = wx.NewId()
+        button_save = wx.Button(self, id, "Save" )
+        button_save.SetToolTipString("Save this report.")
+        button_save.Bind(wx.EVT_BUTTON, self.onSave, id = button_save.GetId()) 
+        hbox.Add(button_save)     
+        
+        # panel for report page
+        #panel = wx.Panel(self, -1)
+        vbox = wx.BoxSizer(wx.VERTICAL)
+        # html window
+        self.hwindow = html.HtmlWindow(self,style=wx.BORDER)
+        # set the html page with the report string
+        self.hwindow.SetPage(self.report_html)
+        
+        # add panels to boxsizers
+        vbox.Add(hbox)
+        vbox.Add(self.hwindow, 1, wx.EXPAND|wx.ALL,0)
+
+        self.SetSizer(vbox)
+        self.Centre()
+        self.Show(True)
+		
 
     def onSave(self, event=None):
@@ -58,7 +144,12 @@
         fName = dlg.GetPath()
         ext_num = dlg.GetFilterIndex()  
+        # index correction 
+        if not self.is_pdf:
+        	ind_cor = 1 
+        else:
+        	ind_cor = 0 
         #set file extensions  
-        if ext_num == (0 + 2 * self.index_offset):
-            # TODO: Sort this case out
+        if ext_num == (0 + 2 * ind_cor):
+			# TODO: Sort this case out
             ext = '.pdf'
             img_ext = '_img.png'
@@ -95,9 +186,9 @@
             os.remove(pic_fname)
             return
-        elif ext_num == (1 - self.index_offset):
+        elif ext_num == (1 - ind_cor):
             ext = '.html'
             img_ext = '_img4html.png'
             report_frame = self.report_list[0]
-        elif ext_num == (2 - self.index_offset):
+        elif ext_num == (2 - ind_cor):
             ext = '.txt'   
             # changing the image extension actually changes the image
@@ -114,5 +205,5 @@
         pic_fname = os.path.splitext(fName)[0] + img_ext
         #put the image path in html string
-        if ext_num == (1 - self.index_offset):
+        if ext_num == (1 - ind_cor):
             report = report_frame % os.path.basename(pic_fname)
 
@@ -123,2 +214,54 @@
         self.report_list[2].savefig(pic_fname)
         
+            
+    def onPreview(self, event=None):
+        """
+        Preview
+        
+        : event: Preview button event
+        """
+        previewh = html.HtmlEasyPrinting(name="Printing", parentWindow=self)
+        previewh.PreviewText(self.report_html)
+        if event is not None:
+            event.Skip()
+    
+    def onPrint(self, event=None):
+        """
+        Print
+        
+        : event: Print button event
+        """
+        printh = html.HtmlEasyPrinting(name="Printing", parentWindow=self)
+        printh.PrintText(self.report_html)
+        if event is not None:
+            event.Skip()
+
+    def OnClose(self,event=None):
+        """
+        Close the Dialog
+        
+        : event: Close button event
+        """
+        self.Close()
+    
+    def HTML2PDF(self, data, filename):
+        """
+        Create a PDF file from html source string.
+        Returns True is the file creation was successful. 
+        
+        : data: html string
+        : filename: name of file to be saved
+        """
+        try:
+            from xhtml2pdf import pisa
+            # open output file for writing (truncated binary)
+            resultFile = open(filename, "w+b")
+            # convert HTML to PDF
+            pisaStatus = pisa.CreatePDF(data, dest=resultFile)
+            # close output file
+            resultFile.close()
+            self.Update()
+            return pisaStatus.err
+        except:
+            logging.error("Error creating pdf: %s" % sys.exc_value)
+        return False
