au.gov.ansto.bragg.kakadu.ui.plot.Plot.java Source code

Java tutorial

Introduction

Here is the source code for au.gov.ansto.bragg.kakadu.ui.plot.Plot.java

Source

/*******************************************************************************
 * Copyright (c) 2007 Australian Nuclear Science and Technology Organisation.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Danil Klimontov (Bragg Institute) - initial API and implementation
 *******************************************************************************/
package au.gov.ansto.bragg.kakadu.ui.plot;

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.gumtree.data.interfaces.IGroup;
import org.gumtree.vis.dataset.XYErrorDataset;
import org.gumtree.vis.gdm.dataset.Hist2DDataset;
import org.gumtree.vis.interfaces.IHist2D;
import org.gumtree.vis.interfaces.IPlot;
import org.gumtree.vis.interfaces.IPlot1D;
import org.gumtree.vis.interfaces.IXYErrorDataset;
import org.gumtree.vis.interfaces.IXYErrorSeries;
import org.gumtree.vis.mask.AbstractMask;
import org.gumtree.vis.mask.IMaskEventListener;
import org.gumtree.vis.swt.PlotComposite;

import au.gov.ansto.bragg.cicada.core.Exporter;
import au.gov.ansto.bragg.cicada.core.exception.ExportException;
import au.gov.ansto.bragg.datastructures.util.ConverterLib;
import au.gov.ansto.bragg.kakadu.core.UIAlgorithmManager;
import au.gov.ansto.bragg.kakadu.core.data.DataType;
import au.gov.ansto.bragg.kakadu.core.data.Operation;
import au.gov.ansto.bragg.kakadu.core.data.OperationStatus;
import au.gov.ansto.bragg.kakadu.ui.SWTResourceManager;
import au.gov.ansto.bragg.kakadu.ui.region.RegionEventListener;
import au.gov.ansto.bragg.kakadu.ui.region.RegionParameter;
import au.gov.ansto.bragg.kakadu.ui.util.Util;

/**
 * The class provides controller for data visualization. 
 * 
 * @author Danil Klimontov (dak)
 */
public class Plot extends Composite {
    final private static String IS_SKIP_ENABLED_PROPERTY_LABLE = "kakadu.plot.isSkipEnabled";
    private static int idCounter = 0;
    private int id;

    private EmptyPlotComposite emptyPlotComposit;
    private SchemaPlotComposite schemaPlotComposite;
    private CalculationPlotComposite calculationPlotComposite;
    private StatusBarComposite statusBarComposite;

    private IPlot currentKurandaWidget;
    private PlotType currentPlotType = PlotType.EmptyPlot;
    private DataType currentDataType = DataType.Undefined;

    private Composite propertiesComposite;
    private ScrolledComposite scrolledComposite;
    private Composite plotAreaComposite;
    private PlotComposite plotComposite;
    //   private ToolItem propertiesToolItem;
    //   private ToolItem viewControlToolItem;
    private ToolItem fittingControlToolItem;
    private ToolItem maskControlToolItem;
    private ToolItem exportPictureToolItem;
    private ToolItem exportDataToolItem;
    //   private ToolItem intervalToolItem;
    private ToolItem printToolItem;
    //   private ExpandBar plotPropertiesExpandBar;
    private SashForm sashForm;
    private SashForm innerSash;
    private StackLayout plotLayout;
    private Operation operaton;
    //   private 

    private boolean isInnerPlotRegionProcessing = false;
    private boolean isInnerUIRegionProcessing = false;
    private boolean isMaskingEnabled = false;
    private boolean isSchemaMode;
    private boolean isExportMenuInitialized = false;
    private String forceTitle = null;
    private String title;
    //   private ParameterRegionManager parameterRegionManager;
    private ToolBar plotToolsToolbar;
    private ToolBar plotDataToolbar;
    private ToolBar navigateDataToolbar;
    private boolean isQuickRemoveEnabled = false;
    private boolean isIntervalEnabled = false;
    private RegionParameter regionParameter;
    private RegionEventListener regionEventListener;
    private final MultiPlotDataManager multiPlotDataManager = new MultiPlotDataManager(this);

    /** P <plotRegionId, uiRegion> */
    private final Map<String, AbstractMask> maskMap = new HashMap<String, AbstractMask>();
    final private List<PlotPropertyChangeListener> plotPropertyChangeListeners = new ArrayList<PlotPropertyChangeListener>();

    private PlotRegionListener plotRegionListener = new PlotRegionListener();
    //   final ChartMouseListener pointLocatorListener = new ChartMouseListener() {
    //      public void locationUpdated(double x, double y, double val) {
    //         statusBarComposite.setCursorLocation(x, y, val);
    //      }
    //
    //      @Override
    //      public void chartMouseClicked(ChartMouseEvent event) {
    //         // TODO Auto-generated method stub
    //         
    //      }
    //
    //      @Override
    //      public void chartMouseMoved(ChartMouseEvent event) {
    //         // TODO Auto-generated method stub
    //         statusBarComposite.setCursorLocation(event.get);
    //      }
    //   };
    //   private au.gov.ansto.bragg.kakadu.core.data.region.RegionListener uiRegionListener = 
    //      new au.gov.ansto.bragg.kakadu.core.data.region.RegionListener() {
    //      
    //      public void regionAdded(UIRegion region) {
    //         if (!isInnerUIRegionProcessing) {
    //            addMask(region);
    //         }
    //      }
    //      public void regionRemoved(UIRegion region) {
    //         if (!isInnerUIRegionProcessing) {
    //            removeMask(region);
    //         }
    //      }
    //      public void regionUpdated(UIRegion region) {
    //         if (!isInnerUIRegionProcessing) {
    //            updateMask(region);
    //         }
    //      }
    //   };

    private ViewPlotPropertiesComposite viewPlotPropertiesComposite;
    private FitPlotPropertiesComposite fitPlotPropertiesComposite;
    private MaskPlotPropertiesComposite maskPlotPropertiesComposite;
    //   private StatisticPlotPropertiesComposite statisticPlotPropertiesComposite;
    //   private MultiPlotPropertiesComposite multiPlotPropertiesComposite;

    //   private ExpandItem dataExpandItem;
    //   private ExpandItem maskExpandItem;
    //   private ExpandItem viewExpandItem;
    //   private ExpandItem fitExpandItem;
    //   private ExpandItem statisticExpandItem;
    private Menu exportDataMenu;
    private ToolItem resetPlotToolItem;
    private ToolItem logarithmToolItem;
    //   private ToolItem backgroundColorToolItem;
    private ToolItem copyToolItem;
    //   private ToolItem navigateBackToolItem;
    //   private ToolItem navigateForwardToolItem;

    /**
     * Creates a new Plot instance.
     * @param parent parent Composite.
     * @param style SWT styles for the Plot object.
     * @param algorithmTask algorithm task for the plot.
     */
    public Plot(Composite parent, int style) {
        super(parent, style);
        //      Rectangle size = get;
        //      int width = size.width;
        //      int height = size.height;
        //      if (width >height)
        //         size.width = height;
        //      else 
        //         size.height = width;
        //      this.setBounds(size);
        id = idCounter++;
        SWTResourceManager.registerResourceUser(parent);
        String isInveralEnabledProperty = System.getProperty(IS_SKIP_ENABLED_PROPERTY_LABLE);
        if (isInveralEnabledProperty != null) {
            isIntervalEnabled = Boolean.valueOf(isInveralEnabledProperty);
        }
    }

    /**
     * Gets an unique id of the plot. 
     * @return id of the plot.
     */
    public int getId() {
        return id;
    }

    /**
     * Initialize all UI components and listeners.
     * The method must be called manually.
     * 
     * @param algorithmTask
     */
    public void init(PlotType plotType) {

        initUI(plotType);
        initListeners();
        // [Tony] [2008-12-12] Set plot type during init phrase
        setPlotType(plotType);
        //      initExportAction();
        layout();
    }

    protected void initUI(PlotType plotType) {
        GridLayout gridLayout = new GridLayout();
        gridLayout.marginHeight = 0;
        gridLayout.marginWidth = 0;
        gridLayout.horizontalSpacing = 0;
        gridLayout.verticalSpacing = 0;
        setLayout(gridLayout);

        GridData data = null;
        Composite controlAreaComposite = new Composite(this, SWT.NONE);
        GridLayout topCompositeLayout = new GridLayout();
        topCompositeLayout.marginWidth = 0;
        topCompositeLayout.marginHeight = 0;
        topCompositeLayout.verticalSpacing = 0;
        topCompositeLayout.horizontalSpacing = 0;
        topCompositeLayout.numColumns = 2;
        controlAreaComposite.setLayout(topCompositeLayout);

        plotDataToolbar = new ToolBar(controlAreaComposite, SWT.HORIZONTAL);
        data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        data.verticalAlignment = GridData.FILL;
        data.grabExcessVerticalSpace = true;
        data.grabExcessHorizontalSpace = true;
        plotDataToolbar.setLayoutData(data);

        //      propertiesToolItem = new ToolItem (plotDataToolbar, SWT.CHECK);
        ////      propertiesToolItem.setText ("Plot Properties");
        //      propertiesToolItem.setText ("Data");
        //      propertiesToolItem.setToolTipText("Control the plot data");
        //
        //      viewControlToolItem = new ToolItem (plotDataToolbar, SWT.CHECK);
        //      viewControlToolItem.setText("View");
        //      viewControlToolItem.setToolTipText("Control the view properties");

        fittingControlToolItem = new ToolItem(plotDataToolbar, SWT.CHECK);
        fittingControlToolItem.setText("Fitting");
        fittingControlToolItem.setToolTipText("Control curve fitting");

        maskControlToolItem = new ToolItem(plotDataToolbar, SWT.CHECK);
        maskControlToolItem.setText("Mask");
        maskControlToolItem.setToolTipText("ROI and mask control");

        //      if (isIntervalEnabled){
        //         intervalToolItem = new ToolItem (plotDataToolbar, SWT.NONE);
        //         intervalToolItem.setText("Skip");
        //         intervalToolItem.setToolTipText("Set skip frequency");
        //         final Menu intervalMenu = new Menu(intervalToolItem.getParent());
        //         MenuItem nullIntervalMenuItem = new MenuItem(intervalMenu, SWT.RADIO);
        //         nullIntervalMenuItem.setText("none");
        //         nullIntervalMenuItem.setSelection(true);
        //         nullIntervalMenuItem.addSelectionListener(new SelectionListener() {
        //            
        //            @Override
        //            public void widgetSelected(SelectionEvent e) {
        ////               currentKurandaWidget.setHorizontalInterval(0);
        //               try {
        ////                  currentKurandaWidget.refreshPlot();
        //                  
        //               } catch (Exception e1) {
        //                  handleException(e1);
        //               }
        //            }
        //            
        //            @Override
        //            public void widgetDefaultSelected(SelectionEvent e) {
        //            }
        //         });
        //         MenuItem skip1MenuItem = new MenuItem(intervalMenu, SWT.RADIO);
        //         skip1MenuItem.setText("next 1");
        //         skip1MenuItem.addSelectionListener(new SelectionListener() {
        //            
        //            @Override
        //            public void widgetSelected(SelectionEvent e) {
        ////               currentKurandaWidget.setHorizontalInterval(0);
        //               try {
        ////                  currentKurandaWidget.refreshPlot();
        //                  
        //               } catch (Exception e1) {
        //                  handleException(e1);
        //               }            }
        //            
        //            @Override
        //            public void widgetDefaultSelected(SelectionEvent e) {
        //            }
        //         });
        //         MenuItem skip2MenuItem = new MenuItem(intervalMenu, SWT.RADIO);
        //         skip2MenuItem.setText("next 2");
        //         skip2MenuItem.addSelectionListener(new SelectionListener() {
        //            
        //            @Override
        //            public void widgetSelected(SelectionEvent e) {
        ////               currentKurandaWidget.setHorizontalInterval(0);
        //               try {
        ////                  currentKurandaWidget.refreshPlot();
        //                  
        //               } catch (Exception e1) {
        //                  handleException(e1);
        //               }            }
        //            
        //            @Override
        //            public void widgetDefaultSelected(SelectionEvent e) {
        //            }
        //         });
        //         MenuItem skip3MenuItem = new MenuItem(intervalMenu, SWT.RADIO);
        //         skip3MenuItem.setText("next 3");
        //         skip3MenuItem.addSelectionListener(new SelectionListener() {
        //            
        //            @Override
        //            public void widgetSelected(SelectionEvent e) {
        ////               currentKurandaWidget.setHorizontalInterval(0);
        //               try {
        ////                  currentKurandaWidget.refreshPlot();
        //                  
        //               } catch (Exception e1) {
        //                  handleException(e1);
        //               }
        //            }
        //            
        //            @Override
        //            public void widgetDefaultSelected(SelectionEvent e) {
        //            }
        //         });
        //         MenuItem skip4MenuItem = new MenuItem(intervalMenu, SWT.RADIO);
        //         skip4MenuItem.setText("next 4");
        //         skip4MenuItem.addSelectionListener(new SelectionListener() {
        //            
        //            @Override
        //            public void widgetSelected(SelectionEvent e) {
        ////               currentKurandaWidget.setHorizontalInterval(0);
        //               try {
        ////                  currentKurandaWidget.refreshPlot();
        //                  
        //               } catch (Exception e1) {
        //                  handleException(e1);
        //               }
        //            }
        //            
        //            @Override
        //            public void widgetDefaultSelected(SelectionEvent e) {
        //            }
        //         });
        //         MenuItem skip5MenuItem = new MenuItem(intervalMenu, SWT.RADIO);
        //         skip5MenuItem.setText("next 5");
        //         skip5MenuItem.addSelectionListener(new SelectionListener() {
        //            
        //            @Override
        //            public void widgetSelected(SelectionEvent e) {
        ////               currentKurandaWidget.setHorizontalInterval(0);
        //               try {
        ////                  currentKurandaWidget.refreshPlot();
        //                  
        //               } catch (Exception e1) {
        //                  handleException(e1);
        //               }
        //            }
        //            
        //            @Override
        //            public void widgetDefaultSelected(SelectionEvent e) {
        //            }
        //         });
        //         MenuItem skip6MenuItem = new MenuItem(intervalMenu, SWT.RADIO);
        //         skip6MenuItem.setText("next 6");
        //         skip6MenuItem.addSelectionListener(new SelectionListener() {
        //            
        //            @Override
        //            public void widgetSelected(SelectionEvent e) {
        ////               currentKurandaWidget.setHorizontalInterval(0);
        //               try {
        ////                  currentKurandaWidget.refreshPlot();
        //                  
        //               } catch (Exception e1) {
        //                  handleException(e1);
        //               }
        //            }
        //            
        //            @Override
        //            public void widgetDefaultSelected(SelectionEvent e) {
        //            }
        //         });
        //         intervalToolItem.addSelectionListener(new SelectionListener() {
        //            
        //            @Override
        //            public void widgetSelected(SelectionEvent e) {
        //               ToolItem item = (ToolItem) e.widget;
        //               Rectangle rect = item.getBounds();
        //               Point pt = item.getParent()
        //                     .toDisplay(new Point(rect.x, rect.y));
        //               intervalMenu.setLocation(pt.x, pt.y + rect.height);
        //               intervalMenu.setVisible(true);               
        //            }
        //            
        //            @Override
        //            public void widgetDefaultSelected(SelectionEvent e) {
        //            }
        //         });
        //      }

        exportDataToolItem = new ToolItem(plotDataToolbar, SWT.NONE);
        exportDataToolItem.setText("Export");
        exportDataToolItem.setToolTipText("Export selected Plot Data Item to file");
        //      exportDataToolItem.setImage(SWTResourceManager.getImage("icons/export.gif", plotToolbar));

        exportDataMenu = new Menu(exportDataToolItem.getParent());

        navigateDataToolbar = new ToolBar(controlAreaComposite, SWT.HORIZONTAL);
        data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        data.grabExcessHorizontalSpace = true;
        navigateDataToolbar.setLayoutData(data);

        //      navigateBackToolItem = new ToolItem (navigateDataToolbar, SWT.NONE);
        //      navigateBackToolItem.setToolTipText("Navigate backward");
        //      navigateBackToolItem.setImage(SWTResourceManager.getImage("icons/nav_backward.gif"));
        //      navigateBackToolItem.setDisabledImage(SWTResourceManager.getImage("icons/nav_backward_dis.gif"));
        //      navigateBackToolItem.setEnabled(false);
        //      
        //      navigateForwardToolItem = new ToolItem (navigateDataToolbar, SWT.NONE);
        //      navigateForwardToolItem.setToolTipText("Navigate forward");
        //      navigateForwardToolItem.setImage(SWTResourceManager.getImage("icons/nav_forward.gif"));
        //      navigateForwardToolItem.setDisabledImage(SWTResourceManager.getImage("icons/nav_forward_dis.gif"));
        //      navigateForwardToolItem.setEnabled(false);

        //      plotDataToolbar.pack();
        //main sash
        sashForm = new SashForm(this, SWT.HORIZONTAL);
        data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        data.verticalAlignment = GridData.FILL;
        data.grabExcessHorizontalSpace = true;
        data.grabExcessVerticalSpace = true;
        sashForm.setLayoutData(data);

        scrolledComposite = new ScrolledComposite(sashForm, SWT.BORDER | SWT.V_SCROLL);
        propertiesComposite = new Composite(scrolledComposite, SWT.NONE);
        //      propertiesComposite = new Composite(sashForm, SWT.BORDER | SWT.V_SCROLL);
        GridLayout propertiesCompositeLayout = new GridLayout();
        propertiesCompositeLayout.marginWidth = 0;
        propertiesCompositeLayout.marginHeight = 0;
        propertiesCompositeLayout.verticalSpacing = 0;
        propertiesCompositeLayout.horizontalSpacing = 0;
        propertiesCompositeLayout.numColumns = 1;
        propertiesComposite.setLayout(propertiesCompositeLayout);

        innerSash = new SashForm(propertiesComposite, SWT.VERTICAL);
        data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        data.verticalAlignment = GridData.BEGINNING;
        data.grabExcessHorizontalSpace = true;
        data.grabExcessVerticalSpace = false;
        innerSash.setLayoutData(data);

        //      plotPropertiesExpandBar = new ExpandBar(propertiesComposite, SWT.V_SCROLL);
        //      plotPropertiesExpandBar.addMouseWheelListener(new MouseWheelListener(){
        //
        //         public void mouseScrolled(MouseEvent arg0) {
        //            
        //            plotPropertiesExpandBar.
        //         }
        //         
        //      });
        maskPlotPropertiesComposite = new MaskPlotPropertiesComposite(innerSash, SWT.NONE, this);
        viewPlotPropertiesComposite = new ViewPlotPropertiesComposite(innerSash, SWT.NONE, this);
        fitPlotPropertiesComposite = new FitPlotPropertiesComposite(innerSash, SWT.NONE, this);
        //      statisticPlotPropertiesComposite = new StatisticPlotPropertiesComposite(innerSash, SWT.NONE, this);

        //      dataExpandItem = new ExpandItem (plotPropertiesExpandBar, SWT.NONE);
        //      dataExpandItem.setText("Plot data");
        //      dataExpandItem.setHeight(multiPlotPropertiesComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
        //      dataExpandItem.setControl(multiPlotPropertiesComposite);
        //      dataExpandItem.setExpanded(true);
        //
        //      viewExpandItem = new ExpandItem (plotPropertiesExpandBar, SWT.NONE);
        //      viewExpandItem.setText("View");
        //      viewExpandItem.setHeight(viewPlotPropertiesComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
        //      viewExpandItem.setControl(viewPlotPropertiesComposite);
        //
        //      fitExpandItem = new ExpandItem (plotPropertiesExpandBar, SWT.NONE);
        //      fitExpandItem.setText("Fitting");
        //      fitExpandItem.setHeight(fitPlotPropertiesComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
        //      fitExpandItem.setControl(fitPlotPropertiesComposite);
        ////      fitPlotPropertiesComposite.setExpandItem(fitExpandItem);
        //
        //      maskExpandItem = new ExpandItem (plotPropertiesExpandBar, SWT.NONE);
        //      maskExpandItem.setText("Mask");
        //      maskExpandItem.setHeight(maskPlotPropertiesComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
        //      maskExpandItem.setControl(maskPlotPropertiesComposite);
        //      plotPropertiesExpandBar.addExpandListener(new ExpandListener(){
        //
        //         public void itemCollapsed(ExpandEvent arg0) {
        //            
        //            
        //         }
        //
        //         public void itemExpanded(ExpandEvent arg0) {
        //            
        //            ((MaskPlotPropertiesComposite) maskPlotPropertiesComposite).initMaskEnabled();
        //         }
        //      });
        //         maskExpandItem.setImage(image);

        //      updatePlotPropertiesBar();

        plotAreaComposite = new Composite(sashForm, SWT.NONE);
        GridLayout rightFormCompositeLayout = new GridLayout();
        rightFormCompositeLayout.marginWidth = 0;
        rightFormCompositeLayout.marginHeight = 0;
        rightFormCompositeLayout.verticalSpacing = 0;
        rightFormCompositeLayout.horizontalSpacing = 0;
        rightFormCompositeLayout.numColumns = 2;
        plotAreaComposite.setLayout(rightFormCompositeLayout);

        plotToolsToolbar = new ToolBar(plotAreaComposite, SWT.VERTICAL);
        data = new GridData();
        data.verticalAlignment = GridData.FILL;
        data.grabExcessVerticalSpace = true;
        plotToolsToolbar.setLayoutData(data);

        resetPlotToolItem = new ToolItem(plotToolsToolbar, SWT.NONE);
        resetPlotToolItem.setToolTipText("Reset");
        resetPlotToolItem.setImage(SWTResourceManager.getImage("icons/refresh16x16.png"));

        logarithmToolItem = new ToolItem(plotToolsToolbar, SWT.NONE);
        logarithmToolItem.setToolTipText("Toggle logarithm scale");
        logarithmToolItem.setImage(SWTResourceManager.getImage("icons/logarithm.gif"));

        //      backgroundColorToolItem = new ToolItem (plotToolsToolbar, SWT.NONE);
        ////      backgroundColorToolItem.setToolTipText("Change background colour");
        //      backgroundColorToolItem.setImage(SWTResourceManager.getImage("icons/colorscm16x16.png"));

        copyToolItem = new ToolItem(plotToolsToolbar, SWT.NONE);
        copyToolItem.setToolTipText("Copy");
        copyToolItem.setImage(SWTResourceManager.getImage("icons/copy16x16.png"));

        exportPictureToolItem = new ToolItem(plotToolsToolbar, SWT.NONE);
        //      exportPictureToolItem.setText ("Export Picture");
        exportPictureToolItem.setToolTipText("Save");
        exportPictureToolItem.setImage(SWTResourceManager.getImage("icons/picture_save16x16.png"));

        printToolItem = new ToolItem(plotToolsToolbar, SWT.NONE);
        //      printToolItem.setText("Print");
        printToolItem.setToolTipText("Print");
        printToolItem.setImage(SWTResourceManager.getImage("icons/printer16x16.png"));

        //      multiPlotPropertiesComposite = new MultiPlotPropertiesComposite(innerSash, SWT.NONE, this);

        //      plotComposite = new Composite(plotAreaComposite, SWT.NONE);
        plotComposite = new PlotComposite(plotAreaComposite, SWT.NONE);
        data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        data.verticalAlignment = GridData.FILL;
        data.grabExcessHorizontalSpace = true;
        data.grabExcessVerticalSpace = true;
        plotComposite.setLayoutData(data);

        plotLayout = new StackLayout();
        plotComposite.setLayout(plotLayout);

        statusBarComposite = new StatusBarComposite(plotAreaComposite, SWT.BORDER);
        data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        data.grabExcessHorizontalSpace = true;
        data.horizontalSpan = 2;
        statusBarComposite.setLayoutData(data);

        initKurandaWidget(plotType);

        emptyPlotComposit = new EmptyPlotComposite(plotComposite, SWT.NONE);
        plotLayout.topControl = emptyPlotComposit;

        schemaPlotComposite = new SchemaPlotComposite(plotComposite, SWT.NONE, this);
        calculationPlotComposite = new CalculationPlotComposite(plotComposite, SWT.NONE, this);

        //      new MultiPlotPropertiesComposite(sashForm, SWT.NONE);
        innerSash.setWeights(new int[] { 20, 20, 20 });
        innerSash.setMaximizedControl(maskPlotPropertiesComposite);
        propertiesComposite.pack();
        scrolledComposite.setContent(propertiesComposite);
        scrolledComposite.setExpandVertical(true);
        scrolledComposite.setExpandHorizontal(true);
        scrolledComposite.addControlListener(new ControlAdapter() {
            public void controlResized(ControlEvent e) {
                innerSash.layout();
                propertiesComposite.pack();
                propertiesComposite.layout();
                propertiesComposite.update();
                Rectangle r = scrolledComposite.getClientArea();
                scrolledComposite.setMinSize(innerSash.computeSize(r.width, SWT.DEFAULT));
            }
        });

        sashForm.setWeights(new int[] { 25, 75 });
        sashForm.setMaximizedControl(plotAreaComposite);

        updateUIComponents();
    }

    protected void updatePlotPropertiesBar() {
        //TODO review the  method... do we need this modification now?
        switch (currentPlotType) {
        default:
        case EmptyPlot:
            //         if (dataExpandItem == null || dataExpandItem.isDisposed()) {
            //            dataExpandItem = new ExpandItem (plotPropertiesExpandBar, SWT.NONE);
            //         }
            //         if (dataExpandItem.getControl() != dataSourcePlotPropertiesComposite) {
            //            dataExpandItem.setText("Data");
            //            dataExpandItem.setHeight(dataSourcePlotPropertiesComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
            //            dataExpandItem.setControl(dataSourcePlotPropertiesComposite);
            //            if (multiPlotPropertiesComposite != null && !multiPlotPropertiesComposite.isDisposed()) {
            //               multiPlotPropertiesComposite.setSize(0,0);
            //            }
            //         }

            //         if (viewExpandItem == null || viewExpandItem.isDisposed()) {
            //            viewExpandItem = new ExpandItem (plotPropertiesExpandBar, SWT.NONE);
            //            viewExpandItem.setText("View");
            //            viewExpandItem.setHeight(viewPlotPropertiesComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
            //            viewExpandItem.setControl(viewPlotPropertiesComposite);
            //         }
            //         
            //         if (fitExpandItem == null || fitExpandItem.isDisposed()) {
            //            fitExpandItem = new ExpandItem (plotPropertiesExpandBar, SWT.NONE);
            //            fitExpandItem.setText("Fitting");
            //            fitExpandItem.setHeight(fitPlotPropertiesComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
            //            fitExpandItem.setControl(fitPlotPropertiesComposite);
            //         }
            //
            //         if (maskExpandItem == null || maskExpandItem.isDisposed()) {
            //            maskExpandItem = new ExpandItem (plotPropertiesExpandBar, SWT.NONE);
            //            maskExpandItem.setText("Mask");
            //            maskExpandItem.setHeight(maskPlotPropertiesComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
            //            maskExpandItem.setControl(maskPlotPropertiesComposite);
            //   //         maskExpandItem.setImage(image);
            //         }
            //         
            //         if (statisticExpandItem == null || statisticExpandItem.isDisposed()) {
            //            statisticExpandItem = new ExpandItem (plotPropertiesExpandBar, SWT.NONE);
            //            statisticExpandItem.setText("Statistic");
            //            statisticExpandItem.setHeight(150);
            ////         statisticExpandItem.setHeight(statisticPlotPropertiesComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
            //            statisticExpandItem.setControl(statisticPlotPropertiesComposite);
            //         }

            break;
        case IntensityPlot:
        case OffsetPlot:
        case OverlayPlot:
            //         if (dataExpandItem == null || dataExpandItem.isDisposed()) {
            //            dataExpandItem = new ExpandItem (plotPropertiesExpandBar, SWT.NONE);
            //         }
            //         if (dataExpandItem.getControl() != multiPlotPropertiesComposite) {
            //            dataExpandItem.setText("Plot data");
            //            dataExpandItem.setHeight(multiPlotPropertiesComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
            //            dataExpandItem.setControl(multiPlotPropertiesComposite);
            ////            if (dataSourcePlotPropertiesComposite != null && !dataSourcePlotPropertiesComposite.isDisposed()) {
            ////               dataSourcePlotPropertiesComposite.setSize(0,0);
            ////            }
            //            dataExpandItem.setExpanded(true);
            //         }
            //
            //         if (viewExpandItem == null || viewExpandItem.isDisposed()) {
            //            viewExpandItem = new ExpandItem (plotPropertiesExpandBar, SWT.NONE);
            //            viewExpandItem.setText("View");
            //            viewExpandItem.setHeight(viewPlotPropertiesComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
            //            viewExpandItem.setControl(viewPlotPropertiesComposite);
            //         }
            //
            //         if (fitExpandItem == null || fitExpandItem.isDisposed()) {
            //            fitExpandItem = new ExpandItem (plotPropertiesExpandBar, SWT.NONE);
            //            fitExpandItem.setText("Fitting");
            //            fitExpandItem.setHeight(fitPlotPropertiesComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
            //            fitExpandItem.setControl(fitPlotPropertiesComposite);
            //         }
            ////         if (maskExpandItem != null && !maskExpandItem.isDisposed()) {
            ////            maskExpandItem.dispose();
            ////            maskPlotPropertiesComposite.setSize(0, 0);
            ////         }
            //         if (maskExpandItem == null || maskExpandItem.isDisposed()) {
            //            maskExpandItem = new ExpandItem (plotPropertiesExpandBar, SWT.NONE);
            //            maskExpandItem.setText("Mask");
            //            maskExpandItem.setHeight(maskPlotPropertiesComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
            //            maskExpandItem.setControl(maskPlotPropertiesComposite);
            //   //         maskExpandItem.setImage(image);
            //         }
            //
            //
            //         if (statisticExpandItem != null && !statisticExpandItem.isDisposed()) {
            //            statisticExpandItem.dispose();
            //            statisticPlotPropertiesComposite.setSize(0,0);
            //         }

            break;
        }

        //      plotPropertiesExpandBar.layout();
    }

    public void forceEnableMask() {
        maskPlotPropertiesComposite.setMaskEnabled(true);
    }

    protected void initListeners() {
        //      propertiesToolItem.addSelectionListener(new SelectionAdapter() {
        //         public void widgetSelected(SelectionEvent e) {
        ////            if (propertiesToolItem.getSelection()) {
        ////               sashForm.setMaximizedControl(null);
        ////            } else {
        ////               sashForm.setMaximizedControl(plotAreaComposite);
        ////            }
        //            setToolItemSelection(propertiesToolItem);
        //         }
        //
        //      });

        //      viewControlToolItem.addSelectionListener(new SelectionListener(){
        //
        //         public void widgetDefaultSelected(SelectionEvent arg0) {
        //            
        //            
        //         }
        //
        //         public void widgetSelected(SelectionEvent arg0) {
        //            
        //            setToolItemSelection(viewControlToolItem);
        //         }});

        fittingControlToolItem.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent arg0) {

            }

            public void widgetSelected(SelectionEvent arg0) {

                setToolItemSelection(fittingControlToolItem);
            }
        });

        maskControlToolItem.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent arg0) {

            }

            public void widgetSelected(SelectionEvent arg0) {

                setToolItemSelection(maskControlToolItem);
            }
        });

        exportPictureToolItem.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                exportPlotAsPictureToFile();
            }
        });

        exportDataToolItem.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                // Determine where to put the dropdown list
                if (!isExportMenuInitialized) {
                    try {
                        initExportAction();
                    } catch (ExportException e1) {

                        handleException(e1);
                    }
                }
                ToolItem item = (ToolItem) e.widget;
                Rectangle rect = item.getBounds();
                Point pt = item.getParent().toDisplay(new Point(rect.x, rect.y));
                exportDataMenu.setLocation(pt.x, pt.y + rect.height);
                exportDataMenu.setVisible(true);
            }
        });

        printToolItem.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent arg0) {

            }

            public void widgetSelected(SelectionEvent arg0) {
                Thread newThread = new Thread(new Runnable() {

                    @Override
                    public void run() {
                        currentKurandaWidget.createChartPrintJob();
                    }
                });
                newThread.start();
            }
        });

        logarithmToolItem.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent arg0) {

            }

            public void widgetSelected(SelectionEvent arg0) {
                if (currentKurandaWidget instanceof IPlot1D) {
                    //               try {
                    //                  List<AbstractDataSource> dataSourceWrappers = getCurrentPlotWidget().getMultiPlotManager(
                    //                  ).getAllDataSourceWrappers();
                    //                  for (AbstractDataSource dataSourceWrapper : dataSourceWrappers){
                    //                     if (dataSourceWrapper instanceof PlotData2D)
                    //                        ((PlotData2D) dataSourceWrapper).toggleLogScale();
                    //                  }
                    //               } catch (KurandaException e) {
                    //                  
                    //                  handleException(e);
                    //               }
                    ((IPlot1D) currentKurandaWidget)
                            .setLogarithmYEnabled(!((IPlot1D) currentKurandaWidget).isLogarithmYEnabled());
                } else if (currentKurandaWidget instanceof IHist2D) {
                    //               try {
                    //                  currentKurandaWidget.toggleLogColorScale();
                    //                  getViewPlotPropertiesComposite().updateUI();
                    //               } catch (KurandaException e) {
                    //                  
                    //                  handleException(e);
                    //               }
                    ((IHist2D) currentKurandaWidget)
                            .setLogarithmScaleEnabled(!((IHist2D) currentKurandaWidget).isLogarithmScaleEnabled());
                    currentKurandaWidget.updatePlot();
                }
            }
        });

        copyToolItem.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent arg0) {

            }

            public void widgetSelected(SelectionEvent arg0) {
                currentKurandaWidget.doCopy();

            }
        });

        resetPlotToolItem.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                if (currentKurandaWidget != null) {
                    currentKurandaWidget.restoreAutoBounds();
                    currentKurandaWidget.repaint();
                }
            }
        });

        //      backgroundColorToolItem.addSelectionListener(new SelectionAdapter() {
        //         public void widgetSelected(SelectionEvent e) {
        //            if (currentKurandaWidget != null) {
        //                 ColorDialog dialog = new ColorDialog(getShell());
        //                 
        //                 RGB rgb = currentKurandaWidget.getPlotBackgroundColor();
        //                 if (rgb != null) {
        //                  dialog.setRGB(rgb);
        //               }
        //                 rgb = dialog.open();
        //
        //                 if (rgb != null) {
        //                  currentKurandaWidget.setPlotBackgroundColor(rgb.red, rgb.green, rgb.blue);
        //                  try {
        //                     currentKurandaWidget.refreshPlot();
        //                  } catch (KurandaException e1) {
        //                     handleException(e1);
        //                  }
        //               }
        //            }
        //         }
        //      });

        //      navigateBackToolItem.addSelectionListener(new SelectionListener(){
        //
        //         public void widgetDefaultSelected(SelectionEvent arg0) {
        //            
        //            
        //         }
        //
        //         public void widgetSelected(SelectionEvent arg0) {
        //            
        //            List<PlotDataItem> plotDataItems = multiPlotDataManager.getPlotDataItems();
        //            if (plotDataItems != null && plotDataItems.size() > 0){
        //               PlotDataItem currentItem = multiPlotDataManager.getSingleVisiblePlotDataItem();
        //               if (currentItem == null) return;
        //               int currentIndex = plotDataItems.indexOf(currentItem);
        //
        //               setSingleItemVisible(plotDataItems, currentIndex);
        ////               if (currentIndex > 0){
        ////                  PlotDataItem dataItem = plotDataItems.get(currentIndex - 1);
        ////                  if (dataItem.getChildrenCount() > 0){
        ////                     if (currentIndex == 1)
        ////                        return;
        ////                     
        ////                  }
        ////                  multiPlotDataManager.setSingleItemVisible(
        ////                        plotDataItems.get(currentIndex - 1));
        ////                  updateTitle();
        ////               }
        //            }
        //         }
        //         
        //      });
        //      
        //      navigateForwardToolItem.addSelectionListener(new SelectionListener(){
        //
        //         public void widgetDefaultSelected(SelectionEvent arg0) {
        //            
        //         }
        //
        //         public void widgetSelected(SelectionEvent arg0) {
        //            List<PlotDataItem> plotDataItems = multiPlotDataManager.getPlotDataItems();
        //            if (plotDataItems != null && plotDataItems.size() > 0){
        //               PlotDataItem currentItem = multiPlotDataManager.getSingleVisiblePlotDataItem();
        //               if (currentItem == null) return;
        //               int currentIndex = plotDataItems.indexOf(currentItem);
        //               if (currentIndex < 0)
        //                  return;
        //               if (currentIndex < plotDataItems.size() - 1){
        //                  multiPlotDataManager.setSingleItemVisible(
        //                        plotDataItems.get(currentIndex + 1));
        //                  updateTitle();
        //               }
        //            }
        //         }
        //         
        //      });

        addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                disposeUI();
            }
        });

        getMultiPlotDataManager().addMultiPlotDataListener(new MultiPlotDataListener() {
            public void itemAdded(PlotDataItem plotDataItem) {
                updateTitle();
                updateStatusBar();
                //            updateNavigationButton();
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                addDataItemRemoveButton(plotDataItem);
            }

            public void itemRemoved(PlotDataItem plotDataItem) {
                updateTitle();
                updateStatusBar();
                //            updateNavigationButton();
            }

            public void itemUpdated(PlotDataItem plotDataItem) {
                updateTitle();
                updateStatusBar();
                //            updateNavigationButton();
            }
        });

    }

    private void setSingleItemVisible(List<PlotDataItem> plotDataItems, int currentIndex) {
        if (currentIndex >= 0) {
            PlotDataItem dataItem = plotDataItems.get(currentIndex);
            if (dataItem.getChildrenCount() > 0) {
                if (currentIndex == 0)
                    return;
                setSingleItemVisible(plotDataItems, currentIndex - 1);
            } else {
                multiPlotDataManager.setSingleItemVisible(dataItem);
                updateTitle();
            }
        }
    }

    private void setToolItemSelection(ToolItem checkToolItem) {
        boolean isItemSelected = checkToolItem.getSelection();
        if (isItemSelected) {
            resetOtherToolItem(checkToolItem);
            setInnerSash(checkToolItem);
            sashForm.setMaximizedControl(null);
        } else {
            updateSashForm();
        }

    }

    //   public void setDataViewSelection(boolean isSelected){
    //      propertiesToolItem.setSelection(isSelected);
    //      setToolItemSelection(propertiesToolItem);
    //   }

    private void updateSashForm() {
        boolean isAnyCheckToolItemChecked =
                //         propertiesToolItem.getSelection() || viewControlToolItem.getSelection() || 
                fittingControlToolItem.getSelection() || maskControlToolItem.getSelection();
        if (!isAnyCheckToolItemChecked) {
            Control maximizedControl = sashForm.getMaximizedControl();
            if (maximizedControl == null)
                sashForm.setMaximizedControl(plotAreaComposite);
        }
    }

    private void setInnerSash(ToolItem checkToolItem) {
        //      if (checkToolItem == propertiesToolItem){
        //         innerSash.setMaximizedControl(multiPlotPropertiesComposite);
        //         return;
        //      }
        //      if (checkToolItem == viewControlToolItem){
        //         viewPlotPropertiesComposite.updateUI();
        //         innerSash.setMaximizedControl(viewPlotPropertiesComposite);
        //         return;
        //      }
        if (checkToolItem == fittingControlToolItem) {
            innerSash.setMaximizedControl(fitPlotPropertiesComposite);
            return;
        }
        if (checkToolItem == maskControlToolItem)
            innerSash.setMaximizedControl(maskPlotPropertiesComposite);
    }

    private void resetOtherToolItem(ToolItem checkToolItem) {
        //      if (checkToolItem != propertiesToolItem)
        //         if (propertiesToolItem.getSelection())
        //            propertiesToolItem.setSelection(false);
        //      if (checkToolItem != viewControlToolItem)
        //         if (viewControlToolItem.getSelection())
        //            viewControlToolItem.setSelection(false);
        if (checkToolItem != fittingControlToolItem)
            if (fittingControlToolItem.getSelection())
                fittingControlToolItem.setSelection(false);
        if (checkToolItem != maskControlToolItem)
            if (maskControlToolItem.getSelection())
                maskControlToolItem.setSelection(false);
    }

    //   protected void updateNavigationButton() {
    //      
    //      List<PlotDataItem> plotDataItems = multiPlotDataManager.getPlotDataItems();
    //      if (plotDataItems.size() > 1){
    //         if (plotDataItems.get(0).getDataType() == DataType.Map || plotDataItems.get(0).getDataType() == DataType.MapSet){
    //            navigateBackToolItem.setEnabled(true);
    //            navigateForwardToolItem.setEnabled(true);
    //         }
    //      }
    //   }

    protected void addDataItemRemoveButton(final PlotDataItem dataItem) {
        if (isQuickRemoveEnabled && dataItem.getDataType() == DataType.Pattern && !dataItem.isLinked()) {
            final ToolItem removeButtonItem = new ToolItem(navigateDataToolbar, SWT.PUSH);
            //      removeButtonItem.setText("X");
            try {
                removeButtonItem.setImage(getCheckedImage(findDataItemColor(dataItem)));
            } catch (Exception e) {
                handleException(new Exception("The color of the plot is not ready"));
            }
            removeButtonItem.setToolTipText("Remove curve "
                    + ((au.gov.ansto.bragg.datastructures.core.plot.Plot) dataItem.getData()).getTitle());

            final MultiPlotDataListener multiPlotDataListener = new MultiPlotDataListener() {

                public void itemUpdated(PlotDataItem plotDataItem) {
                    if (plotDataItem == dataItem) {
                        //                  final AbstractDataSource dataSourceWrapper = getCurrentPlotWidget().getMultiPlotManager(
                        //                  ).getDataSourceWrapper(dataItem.getKurandaPlotDataId());
                        //                  Display.getCurrent().asyncExec(new Runnable() {
                        //                     
                        //                     @Override
                        //                     public void run() {
                        //                        Image image = removeButtonItem.getImage();
                        //                        if (image != null) {
                        //                           Color color = image.getBackground();
                        //                           if (color != null) {
                        //                              color.dispose();
                        //                           }
                        //                           image.dispose();
                        //                        }
                        //                        removeButtonItem.setImage(getCheckedImage(dataSourceWrapper.getColor()));
                        //                     }
                        //                  });
                    }
                }

                public void itemRemoved(PlotDataItem plotDataItem) {
                    if (dataItem == plotDataItem) {
                        multiPlotDataManager.removeMultiPlotDataListener(this);
                        Image image = removeButtonItem.getImage();
                        if (image != null) {
                            Color color = image.getBackground();
                            if (color != null) {
                                color.dispose();
                            }
                            image.dispose();
                        }
                        removeButtonItem.dispose();
                    }
                }

                public void itemAdded(PlotDataItem plotDataItem) {
                }
            };
            removeButtonItem.addSelectionListener(new SelectionListener() {

                public void widgetSelected(SelectionEvent arg0) {
                    multiPlotDataManager.removeMultiPlotDataListener(multiPlotDataListener);
                    multiPlotDataManager.removePlotDataItem(dataItem);
                    removeButtonItem.removeSelectionListener(this);
                    removeButtonItem.dispose();
                }

                public void widgetDefaultSelected(SelectionEvent arg0) {
                }
            });
            multiPlotDataManager.addMultiPlotDataListener(multiPlotDataListener);
            layout(navigateDataToolbar.getParent().getChildren());
        }
    }

    private RGB findDataItemColor(PlotDataItem item) {
        switch (getCurrentPlotType()) {
        case OffsetPlot:
        case OverlayPlot:
            IXYErrorDataset dataset1D = (IXYErrorDataset) getCurrentPlotWidget().getDataset();
            List<IXYErrorSeries> seriesList = dataset1D.getSeries();
            for (IXYErrorSeries series : seriesList) {
                if (series == item.getPlotData()) {
                    java.awt.Color color = ((IPlot1D) getCurrentPlotWidget()).getCurveColor(series);
                    return new RGB(color.getRed(), color.getGreen(), color.getBlue());
                }
            }
            break;

        default:
            break;
        }
        return null;
    }

    /**
     * Compose title with current title mode and values.
     */
    public void updateTitle() {
        StringBuilder titleStringBuilder = new StringBuilder();
        if (viewPlotPropertiesComposite.isTitleGenerated()) {
            if (forceTitle != null && forceTitle.trim().length() > 0)
                titleStringBuilder.append(forceTitle);
            else if (currentPlotType == PlotType.IntensityPlot && currentDataType == DataType.Map
                    || currentDataType == DataType.MapSet) {
                final PlotDataItem singleVisiblePlotDataItem = multiPlotDataManager.getSingleVisiblePlotDataItem();
                if (singleVisiblePlotDataItem != null) {
                    titleStringBuilder.append(
                            ((au.gov.ansto.bragg.datastructures.core.plot.Plot) singleVisiblePlotDataItem.getData())
                                    .getTitle());
                    //               if (viewPlotPropertiesComposite.isTitleIncludeReference()) {
                    //                  titleStringBuilder.append('[');
                    //                  titleStringBuilder.append(singleVisiblePlotDataItem.getReferenceString());
                    //                  titleStringBuilder.append(']');
                    //               }
                    //               titleStringBuilder.append("; ");
                }
            } else {
                int toSkip = 0;
                for (PlotDataItem plotDataItem : multiPlotDataManager.getPlotDataItems()) {
                    //               titleStringBuilder.append(plotDataItem.getTitle());
                    //               if (viewPlotPropertiesComposite.isTitleIncludeReference()) {
                    //                  titleStringBuilder.append('[');
                    //                  titleStringBuilder.append(plotDataItem.getReferenceString());
                    //                  titleStringBuilder.append(']');
                    //               }
                    //               AlgorithmTask task = ProjectManager.getAlgorithmTask(plotDataItem.getPlotDataReference().
                    //                     getTaskId());
                    //               String sourceDataPath = task.getAlgorithmInputs().get(task.getSelectedDataItemIndex()).
                    //                     getDatabag().getLocation();
                    if (toSkip > 0) {
                        toSkip--;
                        continue;
                    }
                    toSkip = plotDataItem.getChildrenCount();
                    String copyingLog = null;
                    if (plotDataItem.getData() instanceof au.gov.ansto.bragg.datastructures.core.plot.Plot) {
                        copyingLog = ((au.gov.ansto.bragg.datastructures.core.plot.Plot) plotDataItem.getData())
                                .getTitle();
                    }

                    titleStringBuilder.append(copyingLog);
                    titleStringBuilder.append("; ");
                }
            }
        } else {
            titleStringBuilder.append(viewPlotPropertiesComposite.getCustomTitle());
        }
        setTitle(titleStringBuilder.toString());
    }

    private void initExportAction() throws ExportException {
        List<Exporter> exporterList = null;
        //      if (multiPlotDataManager.getPlotDataItems() != null && 
        //            multiPlotDataManager.getPlotDataItems().size() > 0)
        //         if (multiPlotDataManager.getPlotDataItems().get(0).getDataType() == DataType.Pattern ||
        //               multiPlotDataManager.getPlotDataItems().get(0).getDataType() == DataType.PatternSet)
        //            exporterList = UIAlgorithmManager.getAvailable1DExporterList();
        //         else
        //            exporterList = UIAlgorithmManager.getAvailableMultiDExporterList();
        //      else
        //         exporterList = UIAlgorithmManager.getAvailableExporterList();
        switch (currentDataType) {
        case Pattern:
            exporterList = UIAlgorithmManager.getAvailable1DExporterList();
            break;
        case PatternSet:
            exporterList = UIAlgorithmManager.getAvailable1DExporterList();
            break;
        case Undefined:
            exporterList = UIAlgorithmManager.getAvailableExporterList();
            break;
        default:
            exporterList = UIAlgorithmManager.getAvailableMultiDExporterList();
            break;
        }
        for (Exporter exporter : exporterList) {
            MenuItem menuItem = new MenuItem(exportDataMenu, SWT.PUSH);
            menuItem.setText(exporter.getFormater().getName());
            menuItem.addSelectionListener(new ExportListener(exporter));
        }
        isExportMenuInitialized = true;
    }

    /**
     * Initiate export of currently displayed plot to file. 
     */
    protected void exportPlotAsPictureToFile() {
        if (currentKurandaWidget == null) {
            return;
        }

        Thread newThread = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    currentKurandaWidget.doSaveAs();
                } catch (IOException e) {
                    handleException(e);
                }
            }
        });
        newThread.start();
        //      Composite c = (Composite) currentKurandaWidget;
        //
        //
        //      // create and populate image object
        //      final Point size = c.getSize();
        //      final Image image = new Image(c.getDisplay(), size.x, size.y);
        //      GC gc = new GC(c);
        //      gc.copyArea(image, 0, 0);
        //
        //      final ImageData imageData = image.getImageData();
        //
        //      
        ///* 
        // * Copy to clipboard functionality does not work due to miss of implementation of ImageTransfer in base SWT plugin.
        // * Current implementation's data in a clipboard cannot be recognized by third party applications.
        // */
        //      
        ////      Clipboard clipboard = new Clipboard(Display.getDefault());
        ////      ImageTransfer transfer = ImageTransfer.getInstance();
        ////      clipboard.setContents(new Object[]{image.getImageData()}, new Transfer[]{transfer});
        ////      clipboard.dispose();
        //
        //      
        //      //get file name. Provide the list of supported formats
        //      final String saveFilename = Util.getSaveFilenameFromShell(c.getShell(), 
        //            new String[]{"*.bmp",
        //            //         "*.gif", 
        //                     "*.jpg", 
        //                     "*.png"
        //            //         , "*.tif"
        //                     }, 
        //            new String[]{"Windows Bitmap (*.bmp)", 
        ////                     "Graphics Interchange Format (*.gif)", 
        //                     "JPEG File Interchange Format (*.jpg)", 
        //                     "Portable Network Graphics (*.png)"
        ////                     , "Tag Image File Format (*.tif)"
        //                     });
        //      
        //      if (saveFilename != null) {
        //         ImageLoader imageLoader = new ImageLoader();
        //         imageLoader.data = new ImageData[] {imageData};
        //         
        //         int fileFormat = SWT.IMAGE_PNG;
        //         String fileExt = saveFilename.substring(saveFilename.lastIndexOf('.') + 1);
        //         if (fileExt.equalsIgnoreCase("jpg")) {
        //            fileFormat = SWT.IMAGE_JPEG;
        //         } else if (fileExt.equalsIgnoreCase("png")) {
        //            fileFormat = SWT.IMAGE_PNG;
        //         } else if (fileExt.equalsIgnoreCase("gif")) {
        //            fileFormat = SWT.IMAGE_GIF;
        //         } else if (fileExt.equalsIgnoreCase("tif")) {
        //            fileFormat = SWT.IMAGE_TIFF;
        //         } else if (fileExt.equalsIgnoreCase("bmp")) {
        //            fileFormat = SWT.IMAGE_BMP;
        //         } else {
        //            fileFormat = SWT.IMAGE_PNG;      
        //         }
        //         
        //         imageLoader.save(saveFilename, fileFormat);
        //      }
        //      
        //      
        //      image.dispose();
        //      gc.dispose();

    }

    /**
     * Dispose all UI handlers before dispose the widget. 
     * Use the method to dispose all UI resources. 
     */
    protected void disposeUI() {
        //      Composite kurandaComposite = (Composite) currentKurandaWidget;
        //      if (!kurandaComposite.isDisposed())
        //         kurandaComposite.dispose();
        //      currentKurandaWidget = null;
        multiPlotDataManager.disposeResources();
        //      if (!multiPlotPropertiesComposite.isDisposed())
        //         multiPlotPropertiesComposite.dispose();
        currentKurandaWidget = null;
    }

    public void setMaskEnabled(boolean enabled) {
        boolean oldIsMaskingEnabled = isMaskingEnabled;
        isMaskingEnabled = enabled;
        if (oldIsMaskingEnabled != isMaskingEnabled) {

            //TODO add/remove region listeners

            updatePlotMasks();
        }

        currentKurandaWidget.setMaskingEnabled(enabled);
    }

    public void enableMask() {
        isMaskingEnabled = true;
        currentKurandaWidget.setMaskingEnabled(isMaskingEnabled && regionParameter != null);
    }
    /**
     * Sets data to be displayed to the Plot.
     * @param plotData plot data object. Null is excepted.
     * @throws KurandaException throws if any problems with visualization.
     */
    //   public void setPlotData(Group plotData) throws KurandaException {
    //      this.plotData = plotData;
    //
    //      if (currentKurandaWidget != null) {
    //         currentKurandaWidget.getMultiPlotManager().clearAllDataSourceWrappers();
    //      }
    //      
    //      final DataType dataType = au.gov.ansto.bragg.kakadu.core.Util.getDataType(plotData);
    //      setCurrentDataType(dataType);
    //      setPlotType(getDefaultPlotType(currentDataType));
    //      
    //      //set plot data to current plot Widget
    //      if (isSchemaMode) {
    //         schemaPlotComposite.setSchemaData(plotData);
    //      } else if (currentDataType == DataType.Calculation) {
    //         calculationPlotComposite.setCalculationData(plotData);
    //      } else if (currentKurandaWidget != null) {
    //         currentKurandaWidget.setDataSource(plotData);
    //         currentKurandaWidget.refreshPlot();
    //      }
    //      
    //      updatePlotMasks();
    //      plotComposite.redraw();
    //      
    //      updateStatistic();
    //      updateFlipAxis();
    //      updateLegend(); 
    //      
    //      updateUIComponents();
    //   }

    /**
     * Sets current data type to be processed be the plot.
     * For multi plot the data type applied for each data item.
     * @param dataType data type
     */
    public void setCurrentDataType(final DataType dataType) {
        currentDataType = dataType;
    }

    public void updateUIComponents() {
        viewPlotPropertiesComposite.setFlipAxiesEnabled(currentDataType != DataType.Calculation);
        viewPlotPropertiesComposite.setSchemaModeEnabled(currentDataType == DataType.Pattern);
        viewPlotPropertiesComposite.setShowErrorEnabled(currentDataType == DataType.Pattern);
        viewPlotPropertiesComposite.setLogYEnabled(currentDataType == DataType.Pattern);
        viewPlotPropertiesComposite.setLogXEnabled(currentDataType == DataType.Pattern);
        exportPictureToolItem.setEnabled(!isSchemaMode && currentKurandaWidget != null);
        //      exportDataToolItem.setEnabled(multiPlotPropertiesComposite != null && (multiPlotPropertiesComposite.getSelectedPlotDataItem() != null
        //            || multiPlotDataManager.getPlotDataItems().size() >= 1));
    }

    public PlotType getCurrentPlotType() {
        return currentPlotType;
    }

    public DataType getCurrentDataType() {
        return currentDataType;
    }

    public void setPlotType(PlotType plotType) {
        final PlotType previousPlotType = currentPlotType;
        currentPlotType = plotType;

        try {
            switch (plotType) {
            case OffsetPlot:
            case OverlayPlot:
                plotComposite.setDataset(new XYErrorDataset());
                currentKurandaWidget = plotComposite.getPlot();
                //            currentKurandaWidget.setPointFollowerEnabled(true);
                statusBarComposite.setValueAndZoomEnabled(false);
                break;
            case IntensityPlot:
                plotComposite.setDataset(new Hist2DDataset());
                currentKurandaWidget = plotComposite.getPlot();
                //            currentKurandaWidget.setPointFollowerEnabled(false);
                //            currentKurandaWidget.setPixelAspectRatio(mode);
                break;
            case SurfacePlot:
                //            currentKurandaWidget.setPlotType(AbstractWidget.PLOT3DSURFACE);
                break;
            default:
                //            currentKurandaWidget.setPlotType(AbstractWidget.PLOTEMPTY);
                break;
            }
        } catch (Exception e1) {
            handleException(e1);
        }

        resetStatusBar();
        updateLayout();

        //to show/hide controls specific for the current PlotType 
        //      viewPlotPropertiesComposite.updateUI();

        firePlotPropertyChangeListeners(PlotPropertyChangeListener.PLOT_TYPE_PROPERTY_ID, previousPlotType,
                plotType);
    }

    public MultiPlotDataManager getMultiPlotDataManager() {
        return multiPlotDataManager;
    }

    //   MultiPlotPropertiesComposite getMultiPlotPropertiesComposite() {
    //      return multiPlotPropertiesComposite;
    //   }

    ViewPlotPropertiesComposite getViewPlotPropertiesComposite() {
        return viewPlotPropertiesComposite;
    }

    /**
     * Sets schema mode for the plot to show data in a table.
     * @param isSchemaMode <code>true</code> if schema mode has to be loaded.
     */
    public void setSchemaMode(boolean isSchemaMode) {
        this.isSchemaMode = isSchemaMode;

        if (isSchemaMode) {
            //         schemaPlotComposite.setSchemaData(multiPlotPropertiesComposite.getSelectedPlotDataItem().getData());
            // TODO: find selected series
            PlotDataItem dataItem = null;
            if (dataItem == null)
                dataItem = multiPlotDataManager.getSingleVisiblePlotDataItem();
            if (dataItem == null) {
                List<PlotDataItem> dataItemList = multiPlotDataManager.getPlotDataItems();
                if (dataItemList != null && dataItemList.size() > 0) {
                    PlotDataItem item = dataItemList.get(0);
                    if (item.getChildrenCount() > 0)
                        dataItem = item.getChildren().get(0);
                    else
                        dataItem = item;
                }
            }
            if (dataItem != null)
                schemaPlotComposite.setSchemaData(dataItem.getData());
        }

        updateLayout();
    }

    /**
     * Sets schema mode for the plot to show data in a table.
     * @param isSchemaMode <code>true</code> if schema mode has to be loaded.
     */
    public void setMetadataMode(boolean isSchemaMode) {
        this.isSchemaMode = isSchemaMode;

        //      if (isSchemaMode && multiPlotPropertiesComposite != null && multiPlotPropertiesComposite.getSelectedPlotDataItem() != null) {
        //         schemaPlotComposite.setMataDataSchema(multiPlotPropertiesComposite.getSelectedPlotDataItem().getData());
        //      }

        updateLayout();
    }

    /**
     * Loads plotting ui control dependent to view mode and data type. 
     */
    private void updateLayout() {
        plotLayout.topControl = isSchemaMode ? schemaPlotComposite
                : currentDataType == DataType.Calculation ? calculationPlotComposite
                        : currentKurandaWidget != null ? plotComposite : emptyPlotComposit;
        plotComposite.layout();
    }

    //   private void updateFlipAxis() {
    //      if (currentKurandaWidget != null) {
    //         viewPlotPropertiesComposite.setXAxisFlip(viewPlotPropertiesComposite.isXAxisFlip());
    //      }
    //   }

    //   private void updateStatistic() {
    //      if (plotData == null || currentDataType == DataType.Calculation) {
    //         return;
    //      }
    //      statisticPlotPropertiesComposite.removeAllItems();
    //      
    //      //parse statistic info
    //      
    //      try {
    //         final Group groupData = (Group) plotData;
    //         final DataItem signal = groupData.findSignal();
    //
    //         
    //         final List<?> attributes = signal.getAttributes();
    //         for (Iterator iterator = attributes.iterator(); iterator.hasNext();) {
    //            Object attribute = iterator.next();
    //            if (attribute instanceof Attribute) {
    //               Attribute ncAttribute = (Attribute) attribute;
    //               final String name = ncAttribute.getName();
    //               final String stringValue = ncAttribute.getStringValue();
    //               statisticPlotPropertiesComposite.addItem(name, stringValue);
    //            }
    //         }
    //      } catch (Exception e) {
    //         handleException(e);
    //      }
    //   }

    public void setTitle(String title) {
        String oldTitle = this.title;
        this.title = title;
        firePlotPropertyChangeListeners(PlotPropertyChangeListener.TITLE_PROPERTY_ID, oldTitle, title);

        if (currentKurandaWidget != null) {
            currentKurandaWidget.getTitle().setText(title);
        } else {
            emptyPlotComposit.setTitle(title);
        }
    }

    private void loadMaskList(List<AbstractMask> regions) {
        if (currentKurandaWidget != null) {
            if (regions != null) {
                for (AbstractMask region : regions) {
                    addMask(region);
                }
            }
        }
    }

    /**
     * @param region
     * @return
     * @throws KurandaException
     */
    private void addMask(AbstractMask region) {
        if (currentKurandaWidget == null) {
            return;
        }

        isInnerPlotRegionProcessing = true;

        if (currentKurandaWidget instanceof IHist2D) {
            try {
                //            RectangleMask mask = new RectangleMask(true);
                //            mask.setRectangleFrame(new Rectangle2D.Double(region.getXMin(), 
                //                  region.getYMin(), region.getXMax() - region.getXMin(), 
                //                  region.getYMax() - region.getYMin()));
                currentKurandaWidget.addMask(region);

                maskMap.put(region.getName(), region);

                currentKurandaWidget.repaint();
            } catch (Exception e) {
                handleException(e);
            }
        } else if (currentKurandaWidget instanceof IPlot1D) {
            try {
                //            RangeMask mask = new RangeMask(true);
                //            mask.setBoundary(region.getXMin(), region.getXMax());
                currentKurandaWidget.addMask(region);

                maskMap.put(region.getName(), region);

                currentKurandaWidget.repaint();
            } catch (Exception e) {
                handleException(e);
            }
        }
        isInnerPlotRegionProcessing = false;
    }

    private void removeMask(AbstractMask region) {
        isInnerPlotRegionProcessing = true;

        for (Iterator<String> iterator = maskMap.keySet().iterator(); iterator.hasNext();) {
            String regionId = iterator.next();
            final AbstractMask aRegion = maskMap.get(regionId);
            if (aRegion == region) {
                try {
                    //               currentKurandaWidget.removeMask(regionId);
                    currentKurandaWidget.removeMask(findMask(regionId));
                    currentKurandaWidget.repaint();

                    maskMap.remove(regionId);
                } catch (Exception e) {
                    handleException(e);
                }
                break;
            }

        }
        isInnerPlotRegionProcessing = false;
    }

    private AbstractMask findMask(String name) {
        for (AbstractMask mask : currentKurandaWidget.getMasks()) {
            if (mask.getName().equals(name)) {
                return mask;
            }
        }
        return null;
    }

    private void updateMask(AbstractMask region) {
        isInnerPlotRegionProcessing = true;

        for (Iterator<String> iterator = maskMap.keySet().iterator(); iterator.hasNext();) {
            String regionId = iterator.next();
            final AbstractMask aRegion = maskMap.get(regionId);
            if (aRegion == region) {
                try {
                    AbstractMask mask = findMask(regionId);
                    mask.setName(region.getName());
                    //               if (mask instanceof Abstract2DMask) {
                    //                  ((Abstract2DMask) mask).setRectangleFrame(new Rectangle2D.Double(
                    //                        region.getXMin(), region.getYMin(), region.getXMax() - region.getXMin(), 
                    //                        region.getYMax() - region.getYMin()));
                    //               }
                    currentKurandaWidget.repaint();
                    maskMap.remove(regionId);
                    maskMap.put(region.getName(), region);
                } catch (Exception e) {
                    handleException(e);
                }
                break;
            }

        }
        isInnerPlotRegionProcessing = false;
    }

    public void removeAllMasks() {
        if (currentKurandaWidget != null) {
            isInnerPlotRegionProcessing = true;
            try {
                for (AbstractMask mask : currentKurandaWidget.getMasks()) {
                    currentKurandaWidget.removeMask(mask);
                }
                currentKurandaWidget.repaint();

                maskMap.clear();
            } catch (Exception e) {
                handleException(e);
            }
            isInnerPlotRegionProcessing = false;
        }
    }

    private void initKurandaWidget(PlotType plotType) {
        if (currentKurandaWidget == null) {

            try {
                switch (plotType) {
                case OffsetPlot:
                case OverlayPlot:
                    //                  currentKurandaWidget = new JFreeChart1DPlotWidget(plotComposite,
                    //                        SWT.NONE);
                    plotComposite.setDataset(new XYErrorDataset());
                    currentKurandaWidget = plotComposite.getPlot();
                    break;
                case IntensityPlot:
                    plotComposite.setDataset(new Hist2DDataset());
                    currentKurandaWidget = plotComposite.getPlot();
                    break;
                default:
                    plotComposite.setDataset(new XYErrorDataset());
                    currentKurandaWidget = plotComposite.getPlot();
                }
            } catch (Exception e) {
                handleException(e);
            }

            //         currentKurandaWidget.setPointFollowerEnabled(true);
            //         currentKurandaWidget.setRegionNamesVisible(true);
            currentKurandaWidget.addMaskEventListener(plotRegionListener);
            //         currentKurandaWidget.addPointLocatorListener(pointLocatorListener);
            //         currentKurandaWidget.addZoomListener(new IZoomListener() {
            //            public void zoomEvent(ZoomData zoomData) {
            //               statusBarComposite.setZoomInfo(zoomData.getZoomMagnificationLevelX(), zoomData.getZoomMagnificationLevelY());
            //            }
            //         });

            //init DnD
            //         DropTarget dropTarget = new DropTarget((Control)currentKurandaWidget, DND.DROP_MOVE);
            //         dropTarget.setTransfer(new Transfer[] { PlotDataItemTransfer.getInstance(), PlotDataReferenceTransfer.getInstance() });
            //         dropTarget.addDropListener(new DropTargetAdapter() {
            //         });

        }
    }

    private void resetStatusBar() {
        statusBarComposite.setZoomInfo(100);
        statusBarComposite.setCursorLocation(0, 0);
    }

    /**
     * Updates common status of PlotDataItems in status bar.
     */
    public void updateStatusBar() {
        OperationStatus commonStatus = OperationStatus.Ready;
        final List<PlotDataItem> plotDataItems = multiPlotDataManager.getPlotDataItems();
        for (PlotDataItem plotDataItem : plotDataItems) {
            if (plotDataItem.isLinked()) {
                final Operation operation = PlotManager.getOperation(plotDataItem.getPlotDataReference());
                if (operation != null) {
                    final OperationStatus status = operation.getStatus();
                    if (status.ordinal() > commonStatus.ordinal()) {
                        //show more the most last element in enumeration 
                        commonStatus = status;
                    }
                }
            }
        }
        statusBarComposite.setDataStatus(commonStatus.toString());
    }

    public static PlotType getDefaultPlotType(DataType dataType) {
        switch (dataType) {
        case Pattern:
        case PatternSet:
            return PlotType.OverlayPlot;
        case Map:
        case MapSet:
            return PlotType.IntensityPlot;
        case Calculation:
            return PlotType.SchemaPlot;

        case Undefined:
        default:
            return PlotType.EmptyPlot;
        }
    }

    private final class PlotRegionListener implements IMaskEventListener {
        public void maskAdded(final AbstractMask mask) {
            //         System.out.println("PlotRegionListener.regionAdded()"
            //               + mask.getName());
            //         if (!isInnerPlotRegionProcessing) {
            //            
            //            if (mask instanceof Abstract2DMask) {
            //               final Rectangle2D region = ((Abstract2DMask) mask).getRectangleFrame();
            //            DisplayManager.getDefault().asyncExec(new Runnable() {
            //               public void run() {
            //                  isInnerUIRegionProcessing = true;
            //                  
            //                  UIRegion uiRegion = new UIRegion(mask.isInclusive(), region.getMinX(),
            //                        region.getMinY(), region.getMaxX(), region.getMaxY());
            //                  
            ////                  uiRegion.setName("Mask " + uiRegion.getId());
            //                  
            //                  parameterRegionManager.addRegion(uiRegion);
            //                  
            //                  mask.setName(uiRegion.getName());
            //                  
            //                  maskMap.put(mask.getName(), uiRegion);
            //                  
            //                  
            //                  isInnerUIRegionProcessing = false;
            //
            //                  try {
            //                     currentKurandaWidget.repaint();
            //                  } catch (Exception e) {
            //                     handleException(e);
            //                  }
            //                  
            //               }
            //            });
            //            }
            //         }

            if (regionParameter != null) {
                regionParameter.addMask(mask);
            }
        }

        public void maskRemoved(final AbstractMask mask) {
            //         System.out.println("PlotRegionListener.regionRemoved()"
            //               + mask.getName());
            //         if (!isInnerPlotRegionProcessing) {
            //            DisplayManager.getDefault().asyncExec(new Runnable() {
            //               public void run() {
            //                  isInnerUIRegionProcessing = true;
            //                  final UIRegion uiRegion = maskMap.remove(mask.getName());
            //                  if (uiRegion != null) {
            //                     parameterRegionManager.removeRegion(uiRegion);
            //                  }
            //                  isInnerUIRegionProcessing = false;
            //               }
            //            });
            //         }

            regionParameter.removeMask(mask);
        }

        public void maskUpdated(final AbstractMask mask) {
            //         System.out.println("PlotRegionListener.regionUpdated() " + mask.getName());
            //         
            //         if (!isInnerPlotRegionProcessing) {
            //            if (mask instanceof Abstract2DMask) {
            //               final Rectangle2D region = ((Abstract2DMask) mask).getRectangleFrame();
            //            DisplayManager.getDefault().asyncExec(new Runnable() {
            //               public void run() {
            //                  isInnerUIRegionProcessing = true;
            //                  final UIRegion uiRegion = maskMap.get(mask.getName());
            //                  if (uiRegion != null) {
            //                     parameterRegionManager.updateRegion(uiRegion.getId(), 
            //                           uiRegion.getName(), uiRegion.isInclusive(), 
            //                           region.getMinX(), region.getMinY(), 
            //                           region.getMaxX(), region.getMaxY());
            //                  }
            //                  isInnerUIRegionProcessing = false;
            //               }
            //            });
            //            }
            //         }

            regionParameter.fireMaskUpdatedEvent(mask);
        }
    }

    public void handleException(Throwable throwable) {
        throwable.printStackTrace();
        showErrorMessage(throwable.getMessage());
    }

    private void showErrorMessage(String message) {
        MessageDialog.openError(getShell(), "Plot", message);
    }

    private static final class EmptyPlotComposite extends Composite {
        private Label title;
        private Label message;

        private EmptyPlotComposite(Composite parent, int style) {
            super(parent, style);
            setLayout(new GridLayout());

            title = new Label(this, SWT.NONE);
            title.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));

            message = new Label(this, SWT.NONE);
            message.setText(
                    "Data processing is in progress now or there are no displayable data for the operation. "
                            + "\nWait please for result or select another operation.\nPress 'Run Algorithm' button to run algorithm again.");
            message.setLayoutData(new GridData(GridData.CENTER, GridData.CENTER, true, true));
        }

        public String getTitle() {
            return title.getText();
        }

        public void setTitle(String title) {
            this.title.setText(title);
            layout();
        }

    }

    //   public ParameterRegionManager getParameterRegionManager() {
    //      return parameterRegionManager;
    //   }
    //
    //   public void setParameterRegionManager(ParameterRegionManager parameterRegionManager) {
    //      if (this.parameterRegionManager == parameterRegionManager) {
    //         return;
    //      }
    //      
    //      if (this.parameterRegionManager != null) {
    ////         this.parameterRegionManager.removeRegionListener(uiRegionListener);
    //      }
    //      this.parameterRegionManager = parameterRegionManager;
    //      
    //      if (this.parameterRegionManager != null) {
    ////         this.parameterRegionManager.addRegionListener(uiRegionListener);
    //      }
    //
    //      updatePlotMasks();
    //   }

    public void setRegionParameter(RegionParameter parameter) {
        if (this.regionParameter != null && this.regionParameter != parameter) {
            this.regionParameter.removeRegionListener(regionEventListener);
        }
        this.regionParameter = parameter;
        if (regionParameter != null) {
            this.regionEventListener = new RegionEventListener() {

                @Override
                public void maskUpdated(AbstractMask mask) {
                    currentKurandaWidget.repaint();
                }

                @Override
                public void maskRemoved(AbstractMask mask) {
                    currentKurandaWidget.removeMask(mask);
                    currentKurandaWidget.repaint();
                }

                @Override
                public void maskAdded(AbstractMask mask) {
                    currentKurandaWidget.addMask(mask);
                    currentKurandaWidget.repaint();
                }
            };
            regionParameter.addRegionListener(regionEventListener);
        }
    }

    public RegionParameter getRegionParameter() {
        return this.regionParameter;
    }

    private void updatePlotMasks() {
        if (currentKurandaWidget != null) {
            removeAllMasks();
            currentKurandaWidget.setMaskingEnabled(isMaskingEnabled && regionParameter != null);
            if (isMaskingEnabled && regionParameter != null) {
                loadMaskList(regionParameter.getMaskList());
            }
        }
    }

    /**
     * Shares current plot widget on package level.
     * @return current plot widget or null if not loaded yet.
     */
    public IPlot getCurrentPlotWidget() {
        return currentKurandaWidget;
    }

    public String getTitle() {
        return title;
    }

    StatusBarComposite getStatusBarComposite() {
        return statusBarComposite;
    }

    public void addPlotPropertyChangeListener(PlotPropertyChangeListener plotPropertyChangeListener) {
        plotPropertyChangeListeners.add(plotPropertyChangeListener);
    }

    public void removePlotPropertyChangeListener(PlotPropertyChangeListener plotPropertyChangeListener) {
        plotPropertyChangeListeners.remove(plotPropertyChangeListener);
    }

    public void removeAllPlotPropertyChangeListener() {
        plotPropertyChangeListeners.clear();
    }

    public List<PlotPropertyChangeListener> getChangeListeners() {
        return new ArrayList<PlotPropertyChangeListener>(plotPropertyChangeListeners);
    }

    protected void firePlotPropertyChangeListeners(int propertyId, Object oldData, Object newData) {
        for (PlotPropertyChangeListener changeListener : plotPropertyChangeListeners) {
            changeListener.propertyChanged(propertyId, oldData, newData);
        }
    }

    /**
     * @param operaton the operation to set
     */
    public void setOperaton(Operation operaton) {
        this.operaton = operaton;
    }

    /**
     * @return the operaton
     */
    public Operation getOperaton() {
        return operaton;
    }

    private final class ExportListener implements SelectionListener {
        private Exporter exporter;

        public ExportListener(Exporter exporter) {
            this.exporter = exporter;
        }

        public void widgetDefaultSelected(SelectionEvent e) {
        }

        public void widgetSelected(SelectionEvent e) {

            List<PlotDataItem> dataItems = multiPlotDataManager.getPlotDataItems();
            final String formatName = exporter.getFormater().getExtensionName();
            if (dataItems.size() > 1) {
                String folder = Util.selectDirectoryFromShell(getShell());
                if (folder == null || folder.trim().length() == 0)
                    return;
                int id = 0;
                for (PlotDataItem item : dataItems) {
                    IGroup data = item.getData();
                    String location = data.getLocation();
                    String name;
                    if (location != null) {
                        File file = new File(location);
                        name = file.getName();
                        if (name.contains(".")) {
                            name = name.substring(0, name.indexOf("."));
                        }
                    } else {
                        name = String.valueOf(id);
                    }
                    try {
                        URI fileURI = ConverterLib.path2URI(folder + "/" + name);
                        exporter.signalExport(data, fileURI);
                    } catch (Exception ex) {
                        handleException(ex);
                    }
                    id++;
                }
            } else if (dataItems.size() > 0) {
                IGroup data = dataItems.get(0).getData();
                if (data != null) {
                    String location = data.getLocation();
                    String name = null;
                    if (location != null) {
                        File file = new File(location);
                        name = file.getName();
                        if (name.contains(".")) {
                            name = name.substring(0, name.indexOf("."));
                        }
                    }
                    String saveFilename = Util.saveFilenameFromShell(e.widget.getDisplay().getActiveShell(), name,
                            formatName, "'" + formatName + "' data file");
                    if (saveFilename != null && saveFilename.trim().length() > 0) {
                        try {
                            URI fileURI = ConverterLib.path2URI(saveFilename);
                            exporter.signalExport(data, fileURI);
                        } catch (Exception ex) {
                            handleException(ex);
                        }
                    }
                }
            }
        }
    }

    public void setForceTitle(String title) {
        forceTitle = title;
    }

    public void setRefreshingEnabled(boolean isEnabled) {
        //      currentKurandaWidget.setsetRefreshingEnabled(isEnabled);
    }

    /**
     * @return the plotToolsToolbar
     */
    public ToolBar getVerticalToolbar() {
        return plotToolsToolbar;
    }

    public ToolBar getHorizontalToolbar() {
        return plotDataToolbar;
    }

    public void refresh() {

        try {
            currentKurandaWidget.repaint();
        } catch (Exception e) {
            handleException(e);
        }
    }

    public void setQuickRemoveEnabled(boolean isEnabled) {
        isQuickRemoveEnabled = isEnabled;
    }

    private Image getCheckedImage(RGB colorRGB) {
        Image image = new Image(getDisplay(), 16, 16);
        GC gc = new GC(image);
        gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
        //       gc.fillOval(0, 0, 16, 16);
        gc.fillRectangle(0, 0, 16, 16);
        gc.setForeground(new Color(getDisplay(), colorRGB));
        //       gc.drawRectangle(2, 2, 12, 12);
        gc.drawLine(3, 3, 13, 13);
        gc.drawLine(4, 3, 13, 12);
        gc.drawLine(3, 4, 12, 13);
        gc.drawLine(13, 3, 3, 13);
        gc.drawLine(12, 3, 3, 12);
        gc.drawLine(13, 4, 4, 13);
        gc.dispose();
        return image;
    }

    public void setIntervalEnabled(boolean enabled) {
        isIntervalEnabled = enabled;
    }
}