org.kalypso.gml.ui.coverage.CoverageManagementWidget.java Source code

Java tutorial

Introduction

Here is the source code for org.kalypso.gml.ui.coverage.CoverageManagementWidget.java

Source

/*----------------    FILE HEADER KALYPSO ------------------------------------------
 *
 *  This file is part of kalypso.
 *  Copyright (C) 2004 by:
 *
 *  Technical University Hamburg-Harburg (TUHH)
 *  Institute of River and coastal engineering
 *  Denickestrae 22
 *  21073 Hamburg, Germany
 *  http://www.tuhh.de/wb
 *
 *  and
 *
 *  Bjoernsen Consulting Engineers (BCE)
 *  Maria Trost 3
 *  56070 Koblenz, Germany
 *  http://www.bjoernsen.de
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Contact:
 *
 *  E-Mail:
 *  belger@bjoernsen.de
 *  schlienger@bjoernsen.de
 *  v.doemming@tuhh.de
 *
 *  ---------------------------------------------------------------------------*/
package org.kalypso.gml.ui.coverage;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
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.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.kalypso.commons.command.ICommand;
import org.kalypso.commons.command.ICommandTarget;
import org.kalypso.contribs.eclipse.core.resources.ResourceUtilities;
import org.kalypso.contribs.eclipse.jface.viewers.ViewerUtilities;
import org.kalypso.contribs.eclipse.jface.wizard.IUpdateable;
import org.kalypso.gml.ui.KalypsoGmlUiExtensions;
import org.kalypso.gml.ui.i18n.Messages;
import org.kalypso.gml.ui.internal.coverage.AddCoverageAction;
import org.kalypso.gml.ui.internal.coverage.CoverageColorRangeAction;
import org.kalypso.gml.ui.internal.coverage.CoverageColormapHandler;
import org.kalypso.gml.ui.internal.coverage.ExportCoverageAction;
import org.kalypso.gml.ui.internal.coverage.JumpToCoverageAction;
import org.kalypso.gml.ui.internal.coverage.MoveCoverageDownAction;
import org.kalypso.gml.ui.internal.coverage.MoveCoverageUpAction;
import org.kalypso.gml.ui.internal.coverage.RemoveCoverageAction;
import org.kalypso.gmlschema.GMLSchemaUtilities;
import org.kalypso.gmlschema.feature.IFeatureType;
import org.kalypso.gmlschema.property.IPropertyType;
import org.kalypso.gmlschema.property.relation.IRelationType;
import org.kalypso.ogc.gml.IKalypsoFeatureTheme;
import org.kalypso.ogc.gml.IKalypsoTheme;
import org.kalypso.ogc.gml.featureview.IFeatureChangeListener;
import org.kalypso.ogc.gml.featureview.control.FeatureComposite;
import org.kalypso.ogc.gml.featureview.maker.CachedFeatureviewFactory;
import org.kalypso.ogc.gml.featureview.maker.FeatureviewHelper;
import org.kalypso.ogc.gml.map.IMapPanel;
import org.kalypso.ogc.gml.map.widgets.AbstractThemeInfoWidget;
import org.kalypso.ogc.gml.mapmodel.CommandableWorkspace;
import org.kalypso.ogc.gml.mapmodel.IKalypsoThemePredicate;
import org.kalypso.ogc.gml.mapmodel.IMapModell;
import org.kalypso.ogc.gml.mapmodel.IMapModellListener;
import org.kalypso.ogc.gml.mapmodel.MapModellAdapter;
import org.kalypso.ogc.gml.widgets.AbstractWidget;
import org.kalypso.ui.editor.gmleditor.command.MoveFeatureCommand;
import org.kalypso.ui.editor.mapeditor.views.IWidgetWithOptions;
import org.kalypso.ui.editor.styleeditor.viewer.ColorMapViewer;
import org.kalypsodeegree.graphics.sld.ColorMapEntry;
import org.kalypsodeegree.graphics.sld.RasterSymbolizer;
import org.kalypsodeegree.model.feature.Feature;
import org.kalypsodeegree.model.feature.FeatureList;
import org.kalypsodeegree.model.feature.GMLWorkspace;
import org.kalypsodeegree.model.feature.IFeatureBindingCollection;
import org.kalypsodeegree.model.feature.event.ModellEvent;
import org.kalypsodeegree.model.feature.event.ModellEventListener;
import org.kalypsodeegree.model.geometry.GM_Envelope;
import org.kalypsodeegree.model.geometry.GM_Position;
import org.kalypsodeegree_impl.gml.binding.commons.ICoverage;
import org.kalypsodeegree_impl.gml.binding.commons.ICoverageCollection;

/**
 * A widget with option pane, which allows the user to edit a coverage collection.<BR>
 * The user can add / remove coverage data to / from the collection and change the order of the elements of the
 * collection. In addition he can jump to the extent of an collection element in the map.
 * 
 * @author Thomas Jung
 * @author Gernot Belger
 */
public class CoverageManagementWidget extends AbstractWidget implements IWidgetWithOptions {
    /** Allows to define on the theme, if the user is allowed to change the grid folder for this theme */
    private static final String THEME_PROPERTY_ALLOW_USER_CHANGE_GRID_FOLDER = "allowUserChangeGridFolder"; //$NON-NLS-1$

    public static final IKalypsoThemePredicate COVERAGE_PREDICATE = new IKalypsoThemePredicate() {
        @Override
        public boolean decide(final IKalypsoTheme theme) {
            if (!(theme instanceof IKalypsoFeatureTheme))
                return false;

            final IKalypsoFeatureTheme ft = (IKalypsoFeatureTheme) theme;
            final FeatureList featureList = ft.getFeatureList();
            final Feature coveragesFeature = featureList == null ? null : featureList.getOwner();

            if (coveragesFeature == null)
                return false;

            final IRelationType targetPropertyType = featureList.getPropertyType();
            final IFeatureType targetFeatureType = targetPropertyType.getTargetFeatureType();

            return GMLSchemaUtilities.substitutes(targetFeatureType, ICoverage.FEATURE__COVERAGE);
        }
    };

    private final AbstractThemeInfoWidget m_infoWidget = new AbstractThemeInfoWidget("", "") //$NON-NLS-1$ //$NON-NLS-2$
    {
    };

    private final IMapModellListener m_mapModelListener = new MapModellAdapter() {
        @Override
        public void themeActivated(final IMapModell source, final IKalypsoTheme previouslyActive,
                final IKalypsoTheme nowActive) {
            refreshThemeCombo();
        }

        @Override
        public void themeAdded(final IMapModell source, final IKalypsoTheme theme) {
            refreshThemeCombo();
        }

        @Override
        public void themeRemoved(final IMapModell source, final IKalypsoTheme theme, final boolean lastVisibility) {
            refreshThemeCombo();
        }
    };

    private final Runnable m_refreshCoverageViewerRunnable = new Runnable() {
        @Override
        public void run() {
            ViewerUtilities.refresh(m_coverageViewer, true);
        }
    };

    private ICoverageCollection m_coverages;

    private ICoverage m_selectedCoverage;

    /** If set, data files get imported by default into this folder */
    private IFolder m_dataFolder;

    /**
     * If set to <code>true</code>, the user is allowed to change the data import folder, where data files are imported.<br>
     * Will default to <code>true</code>, if {@link #m_dataFolder} is <code>null</code>.
     */
    private boolean m_allowUserChangeDataFolder = true;

    protected ListViewer m_coverageViewer;

    protected IKalypsoFeatureTheme m_theme;

    private ColorMapViewer m_colorMapViewer;

    private ComboViewer m_themeCombo;

    /** If <code>true</code>, a colormap editor is shown for the current raster style. Default to <code>true</code>. */
    private boolean m_showStyle = true;

    /** If <code>true</code>, Add and Remove coverage buttons are shown. Default to <code>true</code>. */
    private boolean m_showAddRemoveButtons = true;

    private String m_featureTemplateGft = "resources/coverage.gft"; //$NON-NLS-1$

    private final ModellEventListener m_modellistener = new ModellEventListener() {
        @Override
        public void onModellChange(final ModellEvent modellEvent) {
            refreshControl();
        }
    };

    private final Set<IUpdateable> m_actions = new HashSet<>();

    private final IAction[] m_customActions;

    private final String m_partName;

    public CoverageManagementWidget() {
        this(Messages.getString("org.kalypso.gml.ui.map.CoverageManagementWidget.0"), //$NON-NLS-1$
                Messages.getString("org.kalypso.gml.ui.map.CoverageManagementWidget.1")); //$NON-NLS-1$
    }

    /**
     * @param name
     *          The name of the widget.
     * @param tooltip
     *          The tooltip of the widget.
     */
    public CoverageManagementWidget(final String name, final String tooltip) {
        this(name, tooltip, null);
    }

    /**
     * @param name
     *          The name of the widget.
     * @param tooltip
     *          The tooltip of the widget.
     * @param customActions
     *          Additional actions to be added to the toolbar of this widget. CustomActions may implement {@link CoverageManagementAction} in order to get informed about selection changes.
     */
    public CoverageManagementWidget(final String name, final String tooltip, final Action[] customActions) {
        this(name, tooltip, customActions, null);
    }

    /**
     * @param name
     *          The name of the widget.
     * @param tooltip
     *          The tooltip of the widget.
     * @param customActions
     *          Additional actions to be added to the toolbar of this widget. CustomActions may implement {@link CoverageManagementAction} in order to get informed about selection changes.
     * @param partName
     *          The name of the part.
     */
    public CoverageManagementWidget(final String name, final String tooltip, final Action[] customActions,
            final String partName) {
        super(name, tooltip);

        m_customActions = customActions;
        m_partName = partName;
    }

    @Override
    public void activate(final ICommandTarget commandPoster, final IMapPanel mapPanel) {
        super.activate(commandPoster, mapPanel);

        /* Search for a coverage collection. */
        final IMapModell mapModell = mapPanel == null ? null : mapPanel.getMapModell();
        mapModell.addMapModelListener(m_mapModelListener);

        refreshThemeCombo();

        m_infoWidget.activate(commandPoster, mapPanel);
    }

    @Override
    public void finish() {
        super.finish();

        m_infoWidget.finish();
    }

    protected void handleThemeActivated(final IKalypsoTheme activeTheme) {
        setCoverages(null, null);

        if (activeTheme instanceof IKalypsoFeatureTheme) {
            final IKalypsoFeatureTheme ft = (IKalypsoFeatureTheme) activeTheme;
            final FeatureList featureList = ft.getFeatureList();
            final Feature coveragesFeature = featureList == null ? null : featureList.getOwner();
            if (coveragesFeature != null)
                setCoverages((ICoverageCollection) coveragesFeature.getAdapter(ICoverageCollection.class), ft);
        }
    }

    private void setCoverages(final ICoverageCollection coverages, final IKalypsoFeatureTheme theme) {
        // remove listener
        if (m_theme != null) {
            final CommandableWorkspace workspace = m_theme.getWorkspace();
            if (workspace != null)
                workspace.removeModellListener(m_modellistener);
        }

        m_coverages = coverages;
        m_theme = theme;

        // add listener
        if (m_theme != null)
            m_theme.getWorkspace().addModellListener(m_modellistener);

        if (m_theme == null)
            m_infoWidget.setThemes(null);
        else
            m_infoWidget.setThemes(new IKalypsoTheme[] { m_theme });

        updateStylePanel();

        final ListViewer coverageViewer = m_coverageViewer;
        if (coverageViewer != null && !coverageViewer.getControl().isDisposed()) {
            coverageViewer.getControl().getDisplay().syncExec(new Runnable() {
                @Override
                public void run() {
                    if (!coverageViewer.getControl().isDisposed()) {
                        if (coverages == null) {
                            coverageViewer.setInput(null);
                            return;
                        }

                        final IFeatureBindingCollection<ICoverage> coverageList = coverages.getCoverages();
                        coverageViewer.setInput(coverageList);
                        if (coverageList != null && coverageList.size() > 0)
                            coverageViewer.setSelection(new StructuredSelection(coverageList.get(0)), true);
                    }
                }
            });
        }
    }

    // TODO: move control and everything into separate class
    @Override
    public Control createControl(final Composite parent, final FormToolkit toolkit) {
        final Composite panel = toolkit.createComposite(parent, SWT.NONE);
        panel.setLayout(new GridLayout());

        /* Theme selection combo */
        final Composite themeSelectionPanel = toolkit.createComposite(panel, SWT.NONE);
        GridLayoutFactory.fillDefaults().numColumns(2).applyTo(themeSelectionPanel);

        themeSelectionPanel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

        toolkit.createLabel(themeSelectionPanel,
                Messages.getString("org.kalypso.gml.ui.map.CoverageManagementWidget.2"), SWT.NONE); //$NON-NLS-1$
        m_themeCombo = new ComboViewer(themeSelectionPanel, SWT.READ_ONLY | SWT.DROP_DOWN);
        final GridData comboGridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
        m_themeCombo.getControl().setLayoutData(comboGridData);

        /* Coverage table + info pane */
        final Composite coveragePanel = toolkit.createComposite(panel, SWT.NONE);
        // REMEARK: no height hint needed: we never need more height than the toolbar on the left.
        coveragePanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        GridLayoutFactory.fillDefaults().numColumns(2).applyTo(coveragePanel);

        m_coverageViewer = new ListViewer(coveragePanel, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);

        final GridData coverageViewerData = new GridData(SWT.FILL, SWT.FILL, true, false);
        coverageViewerData.heightHint = 100;
        m_coverageViewer.getControl().setLayoutData(coverageViewerData);
        toolkit.adapt(m_coverageViewer.getControl(), true, false);

        final ToolBar coverageToolbar = new ToolBar(coveragePanel, SWT.VERTICAL | SWT.FLAT);
        toolkit.adapt(coverageToolbar);
        coverageToolbar.getLayout();
        coverageToolbar.setLayoutData(new GridData(SWT.CENTER, SWT.FILL, false, true));

        /* Info view */
        final Group coverageInfoGroup = new Group(panel, SWT.H_SCROLL);
        GridLayoutFactory.swtDefaults().applyTo(coverageInfoGroup);
        final GridData infoGroupData = new GridData(SWT.FILL, SWT.CENTER, true, false);
        coverageInfoGroup.setLayoutData(infoGroupData);
        toolkit.adapt(coverageInfoGroup);
        coverageInfoGroup.setText(Messages.getString("org.kalypso.gml.ui.map.CoverageManagementWidget.3")); //$NON-NLS-1$

        final CachedFeatureviewFactory featureviewFactory = new CachedFeatureviewFactory(new FeatureviewHelper());
        featureviewFactory.addView(AddCoverageAction.class.getResource(m_featureTemplateGft));
        final FeatureComposite featureComposite = new FeatureComposite(null, null, featureviewFactory);
        featureComposite.setFormToolkit(toolkit);

        featureComposite.addChangeListener(new IFeatureChangeListener() {
            @Override
            public void featureChanged(final ICommand changeCommand) {
                m_theme.postCommand(changeCommand, null);
                updateCoverageProperties();
                updateButtons();
            }

            @Override
            public void openFeatureRequested(final Feature feature, final IPropertyType pt) {
            }
        });

        /* Color Map table */
        final Composite colormapPanel = toolkit.createComposite(panel, SWT.NONE);
        GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).applyTo(colormapPanel);

        final GridData colormapPanelData = new GridData(SWT.FILL, SWT.FILL, true, true);
        colormapPanelData.exclude = !m_showStyle;
        colormapPanel.setVisible(m_showStyle);
        colormapPanel.setLayoutData(colormapPanelData);

        /* Create the color map viewer. */
        m_colorMapViewer = new ColorMapViewer(colormapPanel, SWT.NONE, toolkit);
        m_colorMapViewer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        /* Create the color map toolbar. */
        final ToolBar colormapToolbar = new ToolBar(colormapPanel, SWT.VERTICAL | SWT.FLAT);
        toolkit.adapt(colormapToolbar);
        colormapToolbar.setLayoutData(new GridData(SWT.CENTER, SWT.BEGINNING, false, true));

        /* Initialize the coverage viewer. */
        initalizeCoverageViewer(m_coverageViewer);

        /* Initialize the coverage toolbar. */
        initalizeCoverageActions(new ToolBarManager(coverageToolbar));

        /* Initialize the color map viewer. */
        updateStylePanel();

        /* Initialize the color map toolbar. */
        initalizeColorMapActions(new ToolBarManager(colormapToolbar));

        /* Hook Events */
        m_coverageViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(final SelectionChangedEvent event) {
                handleListSelectionChanged(parent, coverageInfoGroup, featureComposite, event);
            }
        });

        m_themeCombo.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(final SelectionChangedEvent event) {
                handleThemeComboSelected(event);
            }
        });

        initializeThemeCombo();

        final IFeatureBindingCollection<ICoverage> coverages = m_coverages == null ? null
                : m_coverages.getCoverages();
        if (coverages != null && coverages.size() > 0)
            m_coverageViewer.setSelection(new StructuredSelection(coverages.get(0)));

        final Point size = panel.computeSize(SWT.DEFAULT, SWT.DEFAULT);
        panel.setSize(size);

        updateButtons();

        refreshThemeCombo();

        return panel;
    }

    protected void refreshControl() {
        ViewerUtilities.refresh(m_coverageViewer, true);

        updateButtons();
    }

    protected void updateCoverageProperties() {
        if (m_theme == null)
            m_infoWidget.setThemes(null);
        else
            m_infoWidget.setThemes(new IKalypsoTheme[] { m_theme });
    }

    private void initializeThemeCombo() {
        m_themeCombo.setContentProvider(new ArrayContentProvider());
        m_themeCombo.setLabelProvider(new LabelProvider() {
            @Override
            public String getText(final Object element) {
                final IKalypsoTheme theme = (IKalypsoTheme) element;
                return theme.getLabel();
            }
        });

        refreshThemeCombo();
    }

    public void refreshThemeCombo() {
        if (m_themeCombo == null || m_themeCombo.getControl().isDisposed())
            return;

        final IKalypsoTheme[] themesForCombo = findThemesForCombo();

        final Control control = m_themeCombo.getControl();
        final ComboViewer themeCombo = m_themeCombo;
        control.getDisplay().asyncExec(new Runnable() {
            @Override
            public void run() {
                if (control.isDisposed())
                    return; // may be disposed meanwhile

                themeCombo.setInput(themesForCombo);

                if (themesForCombo.length > 0)
                    themeCombo.setSelection(new StructuredSelection(themesForCombo[0]));
            }
        });

    }

    public IKalypsoFeatureTheme[] findThemesForCombo() {
        final IMapPanel mapPanel = getMapPanel();
        final IMapModell mapModell = mapPanel == null ? null : mapPanel.getMapModell();
        final IKalypsoTheme activeTheme = mapModell == null ? null : mapModell.getActiveTheme();

        final List<IKalypsoFeatureTheme> themesForCombo = new ArrayList<>();

        if (COVERAGE_PREDICATE.decide(activeTheme))
            themesForCombo.add((IKalypsoFeatureTheme) activeTheme);
        else if (activeTheme instanceof IMapModell) {
            final IKalypsoTheme[] allThemes = ((IMapModell) activeTheme).getAllThemes();
            for (final IKalypsoTheme kalypsoTheme : allThemes) {
                if (COVERAGE_PREDICATE.decide(kalypsoTheme))
                    themesForCombo.add((IKalypsoFeatureTheme) kalypsoTheme);
            }
        } else {
            final IKalypsoTheme[] allThemes = mapModell.getAllThemes();
            for (final IKalypsoTheme kalypsoTheme : allThemes) {
                if (COVERAGE_PREDICATE.decide(kalypsoTheme))
                    themesForCombo.add((IKalypsoFeatureTheme) kalypsoTheme);
            }
        }
        return themesForCombo.toArray(new IKalypsoFeatureTheme[themesForCombo.size()]);
    }

    protected void handleThemeComboSelected(final SelectionChangedEvent event) {
        setCoverages(null, null);

        final IStructuredSelection selection = (IStructuredSelection) event.getSelection();
        final Object firstElement = selection.getFirstElement();

        if (firstElement instanceof IKalypsoFeatureTheme) {
            final IKalypsoFeatureTheme ft = (IKalypsoFeatureTheme) firstElement;

            final String property = ft.getProperty(THEME_PROPERTY_ALLOW_USER_CHANGE_GRID_FOLDER, null);
            if (property != null)
                m_allowUserChangeDataFolder = Boolean.valueOf(property);

            final FeatureList featureList = ft.getFeatureList();
            final Feature coveragesFeature = featureList == null ? null : featureList.getOwner();
            if (coveragesFeature != null)
                setCoverages((ICoverageCollection) coveragesFeature.getAdapter(ICoverageCollection.class), ft);
        }

        updateButtons();
    }

    protected void handleListSelectionChanged(final Composite parent, final Group coverageInfoGroup,
            final FeatureComposite featureComposite, final SelectionChangedEvent event) {
        final IStructuredSelection selection = (IStructuredSelection) event.getSelection();
        m_selectedCoverage = (ICoverage) selection.getFirstElement();

        featureComposite.disposeControl();

        if (m_selectedCoverage != null) {
            featureComposite.setFeature(m_selectedCoverage);
            featureComposite.createControl(coverageInfoGroup, SWT.NONE);
            parent.layout(true, true);
        }

        repaintMap();

        updateButtons();
    }

    protected void updateButtons() {
        /* Let actions update themselves */
        for (final IUpdateable action : m_actions) {
            SafeRunnable.run(new SafeRunnable() {
                @Override
                public void run() throws Exception {
                    action.update();
                }
            });
        }
    }

    /**
     * sets the input of the style panel by fetching the style from the selected theme
     */
    public void updateStylePanel() {
        if (m_colorMapViewer == null)
            return;

        if (m_theme == null)
            return;

        final IKalypsoFeatureTheme[] allCoverageThemes = findThemesForCombo();

        final CoverageColormapHandler colormapHandler = new CoverageColormapHandler(m_theme, allCoverageThemes);

        final RasterSymbolizer symb = colormapHandler.getRasterSymbolizer();
        if (symb != null)
            m_colorMapViewer.setInput(symb.getColorMap().values().toArray(new ColorMapEntry[] {}));
    }

    /**
     * initializes the button action for the style panel.
     */
    private void initalizeColorMapActions(final IToolBarManager manager) {
        addAction(manager, new CoverageColorRangeAction(this));

        manager.update(true);
    }

    private void initalizeCoverageActions(final IToolBarManager manager) {
        /* Add the default actions. */
        addDefaultActions(manager);

        /* Add actions registered by the extension point. */
        addExtensionActions(manager);

        /* Add the custom actions. */
        addCustomActions(manager);

        /* Update the toolbar manager. */
        manager.update(true);
    }

    private void addDefaultActions(final IToolBarManager manager) {
        if (m_showAddRemoveButtons) {
            addAction(manager, new AddCoverageAction(this));
            addAction(manager, new RemoveCoverageAction(this));
        }

        addAction(manager, new ExportCoverageAction(this));

        if (m_showAddRemoveButtons) {
            /* Changeing the order of grids only makes sense, if the user is allowed to add/remove them. */
            addAction(manager, new MoveCoverageUpAction(this));
            addAction(manager, new MoveCoverageDownAction(this));
        }

        addAction(manager, new JumpToCoverageAction(this));
    }

    private void addExtensionActions(final IToolBarManager manager) {
        try {
            final CoverageManagementAction[] extensionActions = KalypsoGmlUiExtensions
                    .createCoverageManagementActions();
            for (final CoverageManagementAction extensionAction : extensionActions) {
                if (!CoverageManagementAction.ROLE_WIDGET.equals(extensionAction.getActionRole()))
                    continue;

                /* Init the extension action. */
                extensionAction.init(getShell(), this);

                if (!extensionAction.isVisible())
                    continue;

                /* Get the action. */
                final IAction action = extensionAction.getAction();

                /* Add the action. */
                addAction(manager, action);
            }
        } catch (final CoreException ex) {
            ex.printStackTrace();
        }
    }

    private void addCustomActions(final IToolBarManager manager) {
        /* Should some custom action be added? */
        if (m_customActions == null)
            return;

        /* Add custom actions. */
        for (final IAction customAction : m_customActions)
            addAction(manager, customAction);
    }

    private void addAction(final IToolBarManager manager, final IAction action) {
        if (action instanceof IUpdateable)
            m_actions.add((IUpdateable) action);

        manager.add(action);
    }

    public void handleCoverageMove(final int step) {
        if (m_selectedCoverage == null)
            return;

        final Feature parentFeature = m_coverages;
        final IPropertyType pt = parentFeature.getFeatureType()
                .getProperty(ICoverageCollection.QNAME_PROP_COVERAGE_MEMBER);
        final Feature coverageFeature = m_selectedCoverage;

        final List<?> featureList = (List<?>) parentFeature.getProperty(pt);
        final int newIndex = featureList.indexOf(coverageFeature) + step;
        if (newIndex < 0 || newIndex >= featureList.size())
            return;

        final MoveFeatureCommand command = new MoveFeatureCommand(parentFeature, pt, coverageFeature, step);

        m_theme.postCommand(command, m_refreshCoverageViewerRunnable);
    }

    public IContainer findGridFolder() {
        if (m_dataFolder != null)
            return m_dataFolder;

        if (m_theme == null)
            return null;

        final FeatureList featureList = m_theme.getFeatureList();
        if (featureList == null)
            return null;

        final Feature parentFeature = featureList.getOwner();
        if (parentFeature == null)
            return null;

        final GMLWorkspace workspace = parentFeature.getWorkspace();
        if (workspace == null)
            return null;

        final URL context = workspace.getContext();
        final IFile themeDataFile = ResourceUtilities.findFileFromURL(context);
        if (themeDataFile != null)
            return themeDataFile.getParent();

        return null;
    }

    public void handleCoveragesAdded(final ICoverage[] newCoverages) {
        // set selection to new coverages
        final StructuredSelection selection = new StructuredSelection(newCoverages);
        m_coverageViewer.setSelection(selection);

        if (m_theme == null)
            return;

        final CoverageColormapHandler colormapHandler = new CoverageColormapHandler(m_theme, findThemesForCombo());

        colormapHandler.guessInitialColormap(getShell(), getCoverages());

        updateStylePanel();
    }

    private void initalizeCoverageViewer(final StructuredViewer viewer) {
        viewer.setContentProvider(new ArrayContentProvider());
        viewer.setLabelProvider(new LabelProvider() {
            @Override
            public String getText(final Object element) {
                final ICoverage coverage = (ICoverage) element;
                return coverage.getName();
            }
        });
        if (m_coverages != null)
            viewer.setInput(m_coverages.getCoverages());
    }

    @Override
    public void disposeControl() {
        if (m_theme != null && m_modellistener != null) {
            final CommandableWorkspace workspace = m_theme.getWorkspace();
            if (workspace != null)
                workspace.removeModellListener(m_modellistener);
        }
    }

    @Override
    public void mouseMoved(final MouseEvent e) {
        m_infoWidget.mouseMoved(e);
    }

    @Override
    public void paint(final Graphics g) {
        super.paint(g);

        if (m_selectedCoverage != null) {
            try {
                /* Paint bbox of selected coverage */
                final GM_Envelope boundingBox = m_selectedCoverage.getBoundedBy();

                final GM_Position minPoint = getMapPanel().getProjection().getDestPoint(boundingBox.getMin());
                final GM_Position maxPoint = getMapPanel().getProjection().getDestPoint(boundingBox.getMax());

                final int x = (int) Math.min(minPoint.getX(), maxPoint.getX());
                final int y = (int) Math.min(minPoint.getY(), maxPoint.getY());

                final int width = (int) Math.abs(minPoint.getX() - maxPoint.getX());
                final int height = (int) Math.abs(minPoint.getY() - maxPoint.getY());

                g.setColor(Color.RED);
                g.drawRect(x, y, width, height);
            } catch (final Exception e) {
                e.printStackTrace();
            }
        }

        m_infoWidget.paint(g);
    }

    /**
     * Sets the showStyle flag of this widget. Must be called before createControl is invoked.
     */
    public void setShowStyle(final boolean showStyle) {
        m_showStyle = showStyle;
    }

    /**
     * Sets the showAddRemoveButtons flag of this widget. Must be called before createControl is invoked.
     */
    public void setShowAddRemoveButtons(final boolean showAddRemoveButtons) {
        m_showAddRemoveButtons = showAddRemoveButtons;
    }

    /**
     * If add/remove buttons are shown (i.e. if the list of coverages is editable).
     */
    public boolean isShowAddRemoveButton() {
        return m_showAddRemoveButtons;
    }

    public void setFeatureTemplateGft(final String featureTemplateGft) {
        m_featureTemplateGft = featureTemplateGft;
    }

    public void setGridFolder(final IFolder gridFolder) {
        m_dataFolder = gridFolder;
    }

    public void setAllowUserChangeGridFolder(final boolean allowUserChangeGridFolder) {
        m_allowUserChangeDataFolder = allowUserChangeGridFolder;
    }

    /**
     * This function returns the selected feature theme.
     * 
     * @return The selected feature theme.
     */
    public IKalypsoFeatureTheme getSelectedTheme() {
        return m_theme;
    }

    /**
     * This function clears the theme selection.
     */
    public void clearThemeSelection() {
        if (m_themeCombo == null || m_themeCombo.getCombo().isDisposed())
            return;

        /* Empty the selection. */
        m_themeCombo.setSelection(new StructuredSelection());
    }

    @Override
    public String getPartName() {
        return m_partName;
    }

    public ICoverage[] getCoverages() {
        if (m_coverages == null)
            return new ICoverage[0];

        final IFeatureBindingCollection<ICoverage> coverages = m_coverages.getCoverages();
        if (coverages == null)
            return new ICoverage[0];

        return coverages.toArray(new ICoverage[coverages.size()]);
    }

    public ICoverage[] getSelectedCoverages() {
        if (m_selectedCoverage == null)
            return new ICoverage[0];

        return new ICoverage[] { m_selectedCoverage };
    }

    public Shell getShell() {
        return m_themeCombo.getControl().getShell();
    }

    public boolean isAllowUserChangeDataFolder() {
        return m_allowUserChangeDataFolder;
    }

    public ICoverageCollection getCoverageCollection() {
        return m_coverages;
    }

    public Runnable getRefreshRunnable() {
        return m_refreshCoverageViewerRunnable;
    }
}