eu.udig.omsbox.ui.CoverageCatalogTreeViewer.java Source code

Java tutorial

Introduction

Here is the source code for eu.udig.omsbox.ui.CoverageCatalogTreeViewer.java

Source

/*
 * JGrass - Free Open Source Java GIS http://www.jgrass.org 
 * (C) HydroloGIS - www.hydrologis.com 
 *
 * This program 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 3 of the License, or
 * (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package eu.udig.omsbox.ui;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import net.refractions.udig.catalog.CatalogPlugin;
import net.refractions.udig.catalog.ICatalog;
import net.refractions.udig.catalog.IGeoResource;
import net.refractions.udig.catalog.IResolve;

import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.dialogs.PatternFilter;
import org.opengis.coverage.grid.GridCoverage;

import eu.udig.omsbox.utils.ImageCache;

/**
 * Tree viewer containing coverage resources from the catalog.
 * 
 * @author Andrea Antonello (www.hydrologis.com)
 */
public class CoverageCatalogTreeViewer extends Composite
        implements ISelectionChangedListener, IGeoResourcesSelector {

    private final HashMap<String, IGeoResource> itemsMap = new HashMap<String, IGeoResource>();
    private List<IGeoResource> selectedResources = new ArrayList<IGeoResource>();

    public CoverageCatalogTreeViewer(Composite parent, int style, int selectionStyle) {
        super(parent, style);
        setLayout(new GridLayout(1, false));
        GridData gridData = new GridData();
        gridData.grabExcessHorizontalSpace = true;
        gridData.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
        gridData.verticalAlignment = org.eclipse.swt.layout.GridData.FILL;
        gridData.grabExcessVerticalSpace = true;
        setLayoutData(gridData);

        try {
            getCoverageResources();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // Create the tree viewer to display the file tree
        PatternFilter patternFilter = new PatternFilter();
        final FilteredTree filter = new FilteredTree(this, selectionStyle, patternFilter, true);
        final TreeViewer tv = filter.getViewer();
        tv.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
        tv.setContentProvider(new MyContentProvider());
        MyLabelProvider labelProvider = new MyLabelProvider();
        tv.setLabelProvider(labelProvider);
        tv.setInput(itemsMap);
        tv.addSelectionChangedListener(this);
    }

    public void selectionChanged(SelectionChangedEvent event) {
        // if the selection is empty clear the label
        ISelection iselection = event.getSelection();
        if (iselection.isEmpty()) {
            return;
        }
        if (iselection instanceof IStructuredSelection) {
            IStructuredSelection selection = (IStructuredSelection) iselection;
            for (Iterator<?> iterator = selection.iterator(); iterator.hasNext();) {
                Object resource = iterator.next();
                selectedResources.add((IGeoResource) resource);
            }
        }
    }

    private void getCoverageResources() throws IOException {
        itemsMap.clear();
        ICatalog catalog = CatalogPlugin.getDefault().getLocalCatalog();
        List<? extends IResolve> allCatalogMembers = catalog.members(null);
        for (IResolve catalogMember : allCatalogMembers) {
            if (catalogMember instanceof IGeoResource && catalogMember.canResolve(GridCoverage.class)) {
                itemsMap.put(catalogMember.getTitle(), (IGeoResource) catalogMember);
            }

            List<IResolve> members = catalogMember.members(new NullProgressMonitor());
            for (IResolve iResolve : members) {
                if (iResolve instanceof IGeoResource && iResolve.canResolve(GridCoverage.class)) {
                    itemsMap.put(iResolve.getTitle(), (IGeoResource) iResolve);
                }

                List<IResolve> subMembers = iResolve.members(new NullProgressMonitor());
                for (IResolve subResolve : subMembers) {
                    if (subResolve instanceof IGeoResource && subResolve.canResolve(GridCoverage.class)) {
                        itemsMap.put(((IGeoResource) subResolve).getTitle(), (IGeoResource) subResolve);
                    }
                }
            }
        }
    }

    private static class MyContentProvider implements ITreeContentProvider {
        public Object[] getElements(Object arg0) {
            return getChildren(arg0);
        }

        public void dispose() {
        }

        public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
        }

        public Object[] getChildren(Object parentElement) {
            if (parentElement instanceof HashMap<?, ?>) {
                HashMap<?, ?> map = (HashMap<?, ?>) parentElement;
                Object[] array = map.keySet().toArray();
                Arrays.sort(array);
                return array;
            }
            return new Object[0];
        }

        public Object getParent(Object element) {
            return null;
        }

        public boolean hasChildren(Object element) {
            return getChildren(element).length > 0;
        }
    }

    private static class MyLabelProvider extends LabelProvider {
        public Image getImage(Object arg0) {
            return ImageCache.getInstance().getImage(ImageCache.GRID);
        }

        public String getText(Object arg0) {
            if (arg0 instanceof IGeoResource) {
                IGeoResource geoResr = (IGeoResource) arg0;
                return geoResr.getTitle();
            }
            if (arg0 instanceof String) {
                String name = (String) arg0;
                return name;
            }
            return null;
        }
    }

    public List<IGeoResource> getSelectedResources() {
        return selectedResources;
    }

}