au.gov.ga.earthsci.common.ui.dialogs.SpatialReferenceSelectorDialog.java Source code

Java tutorial

Introduction

Here is the source code for au.gov.ga.earthsci.common.ui.dialogs.SpatialReferenceSelectorDialog.java

Source

/*******************************************************************************
 * Copyright 2013 Geoscience Australia
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/
package au.gov.ga.earthsci.common.ui.dialogs;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.gdal.osr.SpatialReference;

import au.gov.ga.earthsci.common.spatial.SpatialReferences;
import au.gov.ga.earthsci.common.spatial.SpatialReferences.SpatialReferenceSummary;
import au.gov.ga.earthsci.common.util.Util;

/**
 * A dialog that allows a user to select a spatial reference system (SRS) from a
 * list of known reference systems.
 * 
 * @author James Navin (james.navin@ga.gov.au)
 * 
 */
public final class SpatialReferenceSelectorDialog extends TitleAreaDialog {

    private static final Point DIALOG_SIZE = new Point(400, 500);

    private SpatialReferenceSummary selectedSummary = null;

    private Text filterText;
    private TableViewer referencesView;

    public SpatialReferenceSelectorDialog(Shell parentShell) {
        super(parentShell);
    }

    @Override
    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);

        newShell.setText(Messages.getString("SpatialReferenceSelectorDialog.DialogTitle")); //$NON-NLS-1$

        newShell.setSize(DIALOG_SIZE);
        newShell.setMinimumSize(DIALOG_SIZE);
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        setTitle(Messages.getString("SpatialReferenceSelectorDialog.DialogTitle")); //$NON-NLS-1$
        setMessage(Messages.getString("SpatialReferenceSelectorDialog.DialogDescription")); //$NON-NLS-1$

        Composite container = (Composite) super.createDialogArea(parent);

        addFilterText(container);
        addReferencesTableViewer(container);
        wireReferenceSelectionListener();
        wireFilterTextToViewer();

        return container;
    }

    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        super.createButtonsForButtonBar(parent);
        getButton(IDialogConstants.OK_ID).setEnabled(false);
    }

    private void wireReferenceSelectionListener() {
        referencesView.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                if (selection.isEmpty()) {
                    getButton(IDialogConstants.OK_ID).setEnabled(false);
                    selectedSummary = null;
                } else {
                    getButton(IDialogConstants.OK_ID).setEnabled(true);
                    selectedSummary = (SpatialReferenceSummary) selection.getFirstElement();
                }
            }
        });
    }

    private void wireFilterTextToViewer() {
        referencesView.addFilter(new ViewerFilter() {

            @Override
            public boolean select(Viewer viewer, Object parentElement, Object element) {
                // TODO: This filter is quite naive. Might be nicer to some wildcard matching etc.
                String search = Util.removeWhitespace(filterText.getText()).toUpperCase();
                if (Util.isEmpty(search)) {
                    return true;
                }

                SpatialReferenceSummary summary = (SpatialReferenceSummary) element;
                String candidate = Util.removeWhitespace(summary.getEpsg() + summary.getName()).toUpperCase();
                return candidate.contains(search);
            }

        });

        filterText.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                referencesView.refresh();
            }
        });
    }

    private void addFilterText(Composite container) {
        filterText = new Text(container, SWT.SINGLE | SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH | SWT.ICON_ERROR);
        filterText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
    }

    private void addReferencesTableViewer(Composite container) {
        Composite tableContainer = new Composite(container, SWT.NONE);
        tableContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
        TableColumnLayout tableColumnLayout = new TableColumnLayout();
        tableContainer.setLayout(tableColumnLayout);

        referencesView = new TableViewer(tableContainer,
                SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER | SWT.SINGLE | SWT.VIRTUAL | SWT.FULL_SELECTION);
        referencesView.setContentProvider(ArrayContentProvider.getInstance());
        referencesView.setInput(SpatialReferences.get());
        referencesView.getTable().setLinesVisible(true);
        referencesView.getTable().setHeaderVisible(true);

        TableViewerColumn epsgColumn = new TableViewerColumn(referencesView, SWT.NONE);
        epsgColumn.getColumn().setText(Messages.getString("SpatialReferenceSelectorDialog.CodeColumnTitle")); //$NON-NLS-1$
        tableColumnLayout.setColumnData(epsgColumn.getColumn(), new ColumnPixelData(80));
        epsgColumn.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                return ((SpatialReferenceSummary) element).getEpsg();
            }
        });

        TableViewerColumn nameColumn = new TableViewerColumn(referencesView, SWT.NONE);
        nameColumn.getColumn().setText(Messages.getString("SpatialReferenceSelectorDialog.NameColumnTitle")); //$NON-NLS-1$
        tableColumnLayout.setColumnData(nameColumn.getColumn(), new ColumnWeightData(100));
        nameColumn.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                return ((SpatialReferenceSummary) element).getName();
            }
        });
    }

    @Override
    protected void cancelPressed() {
        selectedSummary = null;

        super.cancelPressed();
    }

    /**
     * Get the user-selected {@link SpatialReference}, or <code>null</code> if
     * none was selected or the dialog was cancelled.
     */
    public SpatialReference getSelectedSpatialReference() {
        return selectedSummary == null ? null : selectedSummary.createReference();
    }

    public SpatialReferenceSummary getSelected() {
        return selectedSummary;
    }

}