org.eclipse.plugin.worldwind.wizard.WeatherWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.plugin.worldwind.wizard.WeatherWizardPage.java

Source

/*******************************************************************************
 * Copyright (c) 2006 Vladimir Silva and others.
 * 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:
 *     Vladimir Silva - initial API and implementation
 *******************************************************************************/
package org.eclipse.plugin.worldwind.wizard;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Vector;

import org.apache.log4j.Logger;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.plugin.worldwind.Messages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.plugin.worldwind.contrib.layers.loop.HTTPLoopFileLayer;
import org.eclipse.plugin.worldwind.contrib.layers.loop.TimeLoopGroundOverlay;
//import worldwind.contrib.layers.loop.HTTPGOESLoopFileLayer;
//import worldwind.contrib.layers.loop.HTTPNavyWeatherLayer;
import org.eclipse.plugin.worldwind.contrib.parsers.ParserUtils;
import org.eclipse.plugin.worldwind.contrib.parsers.ParserUtils.HTTPDataSet;

/**
 * Weather Wizard Page
 * @author vsilva
 *
 */
public class WeatherWizardPage extends WizardPage {
    private static final Logger logger = Logger.getLogger(WeatherWizardPage.class);

    // GOES Sat layers (from config/goes.noaa.gov.xml)
    static Vector<ParserUtils.HTTPDataSet> goes = null;

    // Navy Res Labs
    static Vector<ParserUtils.HTTPDataSet> nrl = null;

    // Widgets: Source combo, Layers Table
    private TableViewer viewer;
    private Combo combo;

    // Layers selected
    private ParserUtils.HTTPDataSet[] dataSets;

    // WW Layer selected from list box 
    TimeLoopGroundOverlay layer;

    /**
     * 
     * @param pageName
     */
    protected WeatherWizardPage(String pageName) {
        super(pageName);
        setTitle(Messages.getString("wiz.weather.page.title"));
        setPageComplete(false);
        setDescription(Messages.getString("wiz.weather.page.desc"));

        // Parse Source XML Files (stored in config/)
        try {
            if (goes == null)
                goes = ParserUtils.parseGOESSatFile(Messages.getInputStream(WeatherWizardPage.class,
                        Messages.getString("layers.goes.xml.file")));

            if (nrl == null)
                nrl = ParserUtils.parseNavyLabsFile(Messages.getInputStream(WeatherWizardPage.class,
                        Messages.getString("layers.nrl.xml.file")));
        } catch (Exception e) {
            setErrorMessage("Error parsing satellite data from config: " + e.getMessage());
        }
    }

    /**
     * Create widgets
     */
    public void createControl(Composite parent) {
        Composite container = new Composite(parent, SWT.NULL);
        container.setLayout(new GridLayout(1, true));

        GridData data = new GridData(GridData.FILL_BOTH);

        Label lbl = new Label(container, SWT.NONE);
        lbl.setText(Messages.getString("wiz.weather.page.lbl1"));
        lbl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        combo = new Combo(container, SWT.READ_ONLY);
        combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        combo.add(Messages.getString("layer.nrl.name"));
        combo.add(Messages.getString("layer.goes.name"));
        combo.addSelectionListener(new SelectionListener() {
            public void widgetDefaultSelected(SelectionEvent e) {
            }

            public void widgetSelected(SelectionEvent e) {
                handleComboSelection((Combo) e.getSource());
            }
        });

        lbl = new Label(container, SWT.NONE);
        lbl.setText(Messages.getString("wiz.weather.page.lbl2"));
        lbl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        viewer = new TableViewer(container, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        viewer.getTable().setLayoutData(data);
        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                handleListSelection((StructuredSelection) event.getSelection());
            }
        });

        setControl(container);
    }

    /*
     * On list selected add data sets to dataSets instance variable.
     * dataSets will be used to retrieve information on finish
     */
    private void handleListSelection(StructuredSelection selection) {
        try {
            // clear any error messages
            setErrorMessage(null);

            int selectedIdx = combo.getSelectionIndex();
            dataSets = new ParserUtils.HTTPDataSet[selection.size()];

            logger.debug("selectionChanged " + selection + " combo idx=" + selectedIdx);

            int i = 0, j = 0;

            if (selectedIdx == 0) {
                // navy: add selected datasets to instance var dataSets
                for (Object element : selection.toArray()) {
                    j = 0;
                    for (ParserUtils.HTTPDataSet ds : nrl) {
                        if (ds.name.equals((String) element)) {
                            logger.debug("Adding NRL dataset " + nrl.get(j).name);

                            dataSets[i] = nrl.get(j);
                            break;
                        }
                        j++;
                    }
                    i++;
                }
            } else {
                // GOES: add goes data to instance
                for (Object element : selection.toArray()) {
                    j = 0;
                    for (ParserUtils.HTTPDataSet ds : goes) {
                        if (ds.name.equals((String) element)) {
                            logger.debug("Adding GOES dataset " + goes.get(j).name);

                            dataSets[i] = goes.get(j);
                            break;
                        }
                        j++;
                    }
                    i++;
                }
            }

            loadNextPage();
            setPageComplete(true);

        } catch (Exception e) {
            //e.printStackTrace();
            setErrorMessage(e.getClass().getName() + ": " + e.getMessage());

            setPageComplete(false);
        }
    }

    /*
     * When the combo changes add dataset names to the list
     */
    private void handleComboSelection(Combo combo) {
        if (viewer == null)
            return;

        int idx = combo.getSelectionIndex();
        viewer.getTable().removeAll();

        // Navy
        if (idx == 0) {
            for (ParserUtils.HTTPDataSet ds : nrl) {
                viewer.add(ds.name);
            }
            setMessage(Messages.getString("wiz.weather.title.msg1", new Object[] { nrl.size() }));
        }
        // GOES Sat
        else if (idx == 1) {
            for (ParserUtils.HTTPDataSet ds : goes) {
                viewer.add(ds.name);
            }
            setMessage(Messages.getString("wiz.weather.title.msg2", new Object[] { goes.size() }));
        }
    }

    /**
     * Get selected datasets
     * @return
     */
    ParserUtils.HTTPDataSet[] getDataSets() {
        return dataSets;
    }

    /**
     * Index of the data source
     * @return
     */
    int getSourceIndex() {
        return combo.getSelectionIndex();
    }

    //public IWizardPage getNextPage()
    private void loadNextPage() throws IOException, MalformedURLException {
        DimSelectionPage page2 = (DimSelectionPage) getWizard().getPage("page2");//super.getNextPage();

        HTTPDataSet dataSet = getDataSets()[0];
        String[] dates = null;

        layer = new HTTPLoopFileLayer(dataSet);
        dates = ((HTTPLoopFileLayer) layer).getFrameNames();

        // load page 2 data: show times, no lat/lon
        // All images are JPGs
        page2.loadData(true, false, dates, null, new String[] { "image/jpg" });
    }

    TimeLoopGroundOverlay getlayer() {
        return layer;
    }

}