au.gov.ansto.bragg.kakadu.ui.views.mask.MaskPropertiesComposite.java Source code

Java tutorial

Introduction

Here is the source code for au.gov.ansto.bragg.kakadu.ui.views.mask.MaskPropertiesComposite.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.views.mask;

import java.util.ArrayList;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.gumtree.data.interfaces.IGroup;
import org.gumtree.vis.mask.Abstract2DMask;
import org.gumtree.vis.mask.AbstractMask;
import org.gumtree.vis.mask.RectangleMask;

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.region.RegionParameterManager;
import au.gov.ansto.bragg.kakadu.ui.util.DisplayManager;

/**
 * Composite for UI components for Mask Properties managing.
 * 
 * @author Danil Klimontov (dak)
 */
public class MaskPropertiesComposite extends Composite {

    private List maskList;
    private RectangularMaskEditor maskEditor;
    private java.util.List<AbstractMask> regions;
    private AbstractMask selectedRegion;
    private RegionParameter currentRegionParameter;

    private RegionEventListener regionListener = new RegionEventListener() {
        public void maskAdded(final AbstractMask region) {

            regions.add(region);
            DisplayManager.getDefault().asyncExec(new Runnable() {

                @Override
                public void run() {
                    if (maskList.indexOf(region.getName()) < 0) {
                        maskList.add(region.getName());
                    }
                }
            });
            fireActionStateChangeListeners();

        }

        public void maskRemoved(final AbstractMask region) {
            if (selectedRegion == region) {
                setSelectedRegion(null);
            }
            DisplayManager.getDefault().asyncExec(new Runnable() {

                @Override
                public void run() {
                    if (maskList.indexOf(region.getName()) >= 0) {
                        maskList.remove(region.getName());
                    }
                }
            });

            //         int index = RegionUtil.getRegionIndex(regions, region);
            ////         final int index = regions.indexOf(region);
            //         if (index >= 0) {
            //            maskList.remove(index);
            //            regions.remove(index);
            //         }

            fireActionStateChangeListeners();
        }

        public void maskUpdated(final AbstractMask region) {
            DisplayManager.getDefault().asyncExec(new Runnable() {

                @Override
                public void run() {

                    if (selectedRegion == region) {
                        //all current changes will be ignored
                        setSelectedRegion(region);
                    }
                    //         int index = RegionUtil.getRegionIndex(regions, region);
                    final int index = regions.indexOf(region);
                    if (index >= 0) {
                        maskList.setItem(index, region.getName());
                    }

                    fireActionStateChangeListeners();
                }
            });
        }
    };
    private RegionParameterManager regionManager;
    private java.util.List<RegionParameter> regionParameterList;
    private Combo currentParameterCombo;

    public MaskPropertiesComposite(Composite parent, int style) {
        super(parent, style);
        initialise();
    }

    protected void initialise() {
        GridLayout gridLayout = new GridLayout();
        gridLayout.marginHeight = 3;
        gridLayout.marginWidth = 3;
        gridLayout.horizontalSpacing = 3;
        gridLayout.verticalSpacing = 3;
        gridLayout.numColumns = 2;
        setLayout(gridLayout);

        Label parameterTitleLabel = new Label(this, SWT.NONE);
        parameterTitleLabel.setText("Parameter");
        GridData data = new GridData();
        parameterTitleLabel.setLayoutData(data);

        currentParameterCombo = new Combo(this, SWT.SINGLE | SWT.READ_ONLY);
        currentParameterCombo.setEnabled(false);
        data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        data.grabExcessHorizontalSpace = true;
        currentParameterCombo.setLayoutData(data);

        Label titleLabel = new Label(this, SWT.NONE);
        titleLabel.setText("Mask list:");
        data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        data.grabExcessHorizontalSpace = true;
        data.horizontalSpan = 2;
        titleLabel.setLayoutData(data);

        maskList = new List(this, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL);
        data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        data.verticalAlignment = GridData.FILL;
        data.grabExcessHorizontalSpace = true;
        data.grabExcessVerticalSpace = true;
        data.horizontalSpan = 2;
        maskList.setLayoutData(data);

        Composite maskEditorGroup = new Composite(this, SWT.NONE);
        //      maskEditorGroup.setText ("Mask Properties");
        data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        data.grabExcessHorizontalSpace = true;
        data.horizontalSpan = 2;
        maskEditorGroup.setLayoutData(data);
        maskEditorGroup.setLayout(new FillLayout());

        maskEditor = new RectangularMaskEditor(maskEditorGroup, SWT.NONE);

        initListeners();
    }

    private void initListeners() {
        maskList.addSelectionListener(new SelectionListener() {
            public void widgetDefaultSelected(SelectionEvent e) {
            }

            public void widgetSelected(SelectionEvent e) {
                int selectionIndex = maskList.getSelectionIndex();
                if (selectionIndex >= 0 && regions != null) {

                    //save current mask changes
                    if (maskEditor.isChanged() && cofirmApplyChangesAction()) {
                        maskEditor.applyChanges();
                    }

                    AbstractMask mask = (AbstractMask) regions.get(selectionIndex);
                    setSelectedRegion(mask);
                }
            }
        });

        currentParameterCombo.addSelectionListener(new SelectionListener() {
            public void widgetDefaultSelected(SelectionEvent e) {
            }

            public void widgetSelected(SelectionEvent e) {
                final RegionParameter parameterRegionManager = regionParameterList
                        .get(currentParameterCombo.getSelectionIndex());
                setRegionParameter(parameterRegionManager);
            }
        });

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

    protected void setSelectedRegion(AbstractMask region) {
        selectedRegion = region;
        maskEditor.setRegion(selectedRegion);
        if (selectedRegion != null) {
            //               int index = RegionUtil.getRegionIndex(regions, region);
            int index = regions.indexOf(selectedRegion);
            if (index >= 0) {
                maskList.select(index);
            } else {
                maskList.deselectAll();
            }
        } else {
            maskList.deselectAll();
        }

        fireActionStateChangeListeners();

    }

    public AbstractMask getSelectedRegion() {
        return selectedRegion;
    }

    public void setRegions(java.util.List<AbstractMask> regions) {
        this.regions = regions;

        AbstractMask oldSelectedRegion = selectedRegion;

        maskList.removeAll();
        setSelectedRegion(null);
        if (regions != null) {
            for (AbstractMask region : regions) {
                maskList.add(region.getName());
            }

            //restore selection
            if (regions.indexOf(oldSelectedRegion) >= 0) {
                setSelectedRegion(oldSelectedRegion);
            }
        }

    }

    public void setRegionParameter(RegionParameter regionParameter) {
        if (currentRegionParameter == regionParameter) {
            return;
        }

        checkMaskChanged();

        if (currentRegionParameter != null) {
            currentRegionParameter.removeRegionListener(regionListener);
        }
        currentRegionParameter = regionParameter;

        if (currentRegionParameter != null) {
            currentRegionParameter.addRegionListener(regionListener);
            setRegions(currentRegionParameter.getMaskList());

            final int index = regionParameterList.indexOf(currentRegionParameter);
            if (index >= 0) {
                currentParameterCombo.select(index);
            }
        } else {
            setRegions(null);
        }

        maskEditor.setRegionParameter(currentRegionParameter);

        //      if (regionManager != null) {
        //         regionManager.setLastEditableParameterRegionManager(parameterRegionManager);
        //      }

        fireActionStateChangeListeners();

    }

    public RegionParameter getCurrentParameterRegionManager() {
        return currentRegionParameter;
    }

    private boolean cofirmApplyChangesAction() {
        return MessageDialog.openConfirm(getShell(), "Mask Editor",
                "Mask has been changed. Do you want to save changes before continue? Otherwise all the changes will be ignored.");

    }

    private void disposeUIComonents() {
        if (this.currentRegionParameter != null) {
            this.currentRegionParameter.removeRegionListener(regionListener);
        }
    }

    public void setRegionManager(RegionParameterManager regionManager) {
        this.regionManager = regionManager;
        loadParametersList();
        if (regionManager != null && regionManager.getParameterList().size() > 0) {
            setRegionParameter(regionManager != null ? regionManager.getParameterList().get(0) : null);
        }

        //      fireActionStateChangeListeners();
    }

    private void loadParametersList() {
        currentParameterCombo.removeAll();
        if (regionManager != null) {
            regionParameterList = regionManager.getParameterList();
            for (RegionParameter parameter : regionParameterList) {
                currentParameterCombo.add(parameter.getOperation().getUILabel() + " - " + parameter.getName());
            }
        } else {
            regionParameterList = null;
        }
        currentParameterCombo.setEnabled(currentParameterCombo.getItemCount() > 0);
    }

    private void checkMaskChanged() {
        //save mask changes
        if (maskEditor.isChanged() && cofirmApplyChangesAction()) {
            maskEditor.applyChanges();
        }
    }

    public void createNewMask() {
        final Abstract2DMask region = new RectangleMask(true, 0, 0, 0, 0);
        //      region.setName("Mask " + region.getId());

        currentRegionParameter.addMask(region);
        setSelectedRegion(region);
    }

    public void addNewMask(IGroup regionSet) {
        //      final UIRegion region = new UIRegion(true, 0, 0, 0, 0);
        java.util.List<AbstractMask> regionList = RegionParameterManager.convertToUIObject(regionSet);
        for (AbstractMask region : regionList) {
            //         if (region.isInclusive())
            //            region.setName("Region " + UIRegion.nextId());
            //         else 
            //            region.setName("Mask " + UIRegion.nextId());
            currentRegionParameter.addMask(region);
        }
        //      setSelectedRegion(region);
    }

    public void removeSelectedMask() {
        if (selectedRegion != null && confirmMaskRemoval()) {

            currentRegionParameter.removeMask(selectedRegion);

            fireActionStateChangeListeners();
        }
    }

    public void removeAllMasks() {
        if (regions.size() > 0 && currentRegionParameter != null && confirmAllMasksRemoval()) {

            currentRegionParameter.clearMask();

            fireActionStateChangeListeners();

        }
    }

    private boolean confirmAllMasksRemoval() {
        return MessageDialog.openConfirm(getShell(), "Mask Properties",
                "Are you sure you want to remove ALL masks from the paremeter '" + currentParameterCombo.getText()
                        + "'?");
    }

    private boolean confirmMaskRemoval() {
        return MessageDialog.openConfirm(getShell(), "Mask Properties",
                "Are you sure you want to remove mask '" + selectedRegion.toString() + "'?");
    }

    private final java.util.List<ActionStateChangeListener> actionStateChangeListeners = new ArrayList<ActionStateChangeListener>();

    public void addActionStateChangeListener(ActionStateChangeListener listener) {
        actionStateChangeListeners.add(listener);
    }

    public void removeActionStateChangeListener(ActionStateChangeListener listener) {
        actionStateChangeListeners.remove(listener);
    }

    protected void fireActionStateChangeListeners() {
        for (ActionStateChangeListener listener : actionStateChangeListeners) {
            listener.updateActionsState();
        }
    }

    public static interface ActionStateChangeListener {

        void updateActionsState();
    }

    public java.util.List<AbstractMask> getRegionList() {
        return regions;
    }

    public List getControl() {
        return maskList;
    }
}