Java tutorial
/* * 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.hydrologis.jgrass.geonotes.fieldbook; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import net.refractions.udig.project.IBlackboard; import net.refractions.udig.project.ILayer; import net.refractions.udig.project.IMap; import net.refractions.udig.project.render.IViewportModel; import net.refractions.udig.project.ui.ApplicationGIS; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StackLayout; 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.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Layout; import org.geotools.geometry.jts.JTS; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.referencing.CRS; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.referencing.operation.MathTransform; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.Point; import eu.hydrologis.jgrass.geonotes.GeonoteConstants; import eu.hydrologis.jgrass.geonotes.GeonotesHandler; import eu.hydrologis.jgrass.geonotes.GeonotesPlugin; import eu.hydrologis.jgrass.geonotes.GeonotesUI; import eu.hydrologis.jgrass.geonotes.tools.GeoNoteSelectionTool; import eu.hydrologis.jgrass.geonotes.util.GeonotesNameSorter; import eu.hydrologis.jgrass.geonotes.util.ImageManager; /** * List viewer of the geonotes fieldbook. * * @author Andrea Antonello (www.hydrologis.com) */ public class GeonotesListViewer extends TableViewer implements ISelectionChangedListener { /** * different types of points */ private Image geonoteImage; private Image geonoteGpsImage; private Image geonotePhotoImage; private final Composite related; private List<GeonotesHandler> selectedNotesList; private GeometryFactory gF = new GeometryFactory(); private Composite neutralComposite; private ViewerSorter tableSorter = new GeonotesNameSorter(); public GeonotesListViewer(Composite parent, Composite related, int multi) { super(parent, multi); this.related = related; geonoteImage = ImageManager.ICON_PIN_30.getSwtImage(); geonoteGpsImage = ImageManager.ICON_GPS_PIN_30.getSwtImage(); geonotePhotoImage = ImageManager.ICON_PHOTO_PIN.getSwtImage(); this.addSelectionChangedListener(this); GeonotesListContentProvider glCP = new GeonotesListContentProvider(); this.setContentProvider(glCP); GeonotesListLabelProvider glLP = new GeonotesListLabelProvider(); this.setLabelProvider(glLP); this.setSorter(tableSorter); setRelatedToNeutral(); } public void setTableSorter(ViewerSorter tableSorter) { this.tableSorter = tableSorter; } public void selectionChanged(SelectionChangedEvent event) { if (!(event.getSelection() instanceof StructuredSelection)) { return; } StructuredSelection sel = (StructuredSelection) event.getSelection(); Iterator<?> geonotesIterator = sel.iterator(); if (!geonotesIterator.hasNext()) { return; } selectedNotesList = new ArrayList<GeonotesHandler>(); int selectedNumber = 0; while (geonotesIterator.hasNext()) { Object note = geonotesIterator.next(); if (note instanceof GeonotesHandler) { GeonotesHandler geonoteHandler = (GeonotesHandler) note; selectedNotesList.add(geonoteHandler); selectedNumber++; } } if (selectedNumber == 1) { Layout layout = related.getLayout(); if (layout instanceof StackLayout) { GeonotesHandler geonoteHandler = selectedNotesList.get(0); StackLayout sl = (StackLayout) layout; GeonotesUI geonotesUI = GeonotesUI.guiCache.get(geonoteHandler); if (geonotesUI == null) { geonotesUI = new GeonotesUI(geonoteHandler); } geonotesUI.createNoteComposite(related); Composite composite = geonotesUI.getGeonoteWrappingComposite(); sl.topControl = composite; related.layout(); } } Display.getDefault().asyncExec(new Runnable() { public void run() { highlightSelectedPins(); } }); } /** * Puts the geonotes panel to be empty. * * <p> * This is needed for example if a note is removed and the geonotes * panel should be empty * </p> */ public void setRelatedToNeutral() { if (neutralComposite == null) { neutralComposite = new Group(related, SWT.None); neutralComposite.setLayout(new GridLayout(1, false)); Label neutralLabel = new Label(neutralComposite, SWT.NONE); neutralLabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true)); neutralLabel.setText("No geonote selected."); } Layout layout = related.getLayout(); if (layout instanceof StackLayout) { StackLayout sl = (StackLayout) layout; sl.topControl = neutralComposite; related.layout(); } } /** * Getter for the currently selected Geonotes list. * * @return the currently selected geonotes list. */ public List<GeonotesHandler> getCurrentGeonotesSelection() { if (selectedNotesList != null) { return selectedNotesList; } return null; } private void highlightSelectedPins() { IMap map = ApplicationGIS.getActiveMap(); List<ILayer> mapLayers = map.getMapLayers(); if (mapLayers.size() < 1) { return; } IViewportModel viewportModel = map.getViewportModel(); CoordinateReferenceSystem mapCrs = viewportModel.getCRS(); List<ReferencedEnvelope> refList = new ArrayList<ReferencedEnvelope>(); for (int i = 0; i < selectedNotesList.size(); i++) { GeonotesHandler geonoteHandler = selectedNotesList.get(i); Coordinate position = geonoteHandler.getPosition(); CoordinateReferenceSystem noteCrs = geonoteHandler.getCrs(); try { if (!CRS.equalsIgnoreMetadata(noteCrs, mapCrs)) { // transform coordinates before check MathTransform transform = CRS.findMathTransform(noteCrs, mapCrs, true); // jts geometry Point pt = gF.createPoint(new Coordinate(position.x, position.y)); Geometry targetGeometry = JTS.transform(pt, transform); position = targetGeometry.getCoordinate(); } } catch (Exception e) { // if transform doesn't work, try to go on with the current prj } java.awt.Point positionInPixels = viewportModel.worldToPixel(position); Coordinate start = viewportModel.pixelToWorld(positionInPixels.x - 3, positionInPixels.y - 3); Coordinate end = viewportModel.pixelToWorld(positionInPixels.x + 3, positionInPixels.y + 3); ReferencedEnvelope selectionBox = new ReferencedEnvelope(new Envelope(start, end), mapCrs); refList.add(selectionBox); } IBlackboard blackboard = map.getBlackboard(); blackboard.put(GeoNoteSelectionTool.SELECTIONID, (ReferencedEnvelope[]) refList.toArray(new ReferencedEnvelope[refList.size()])); ILayer geonotesLayer = GeonotesPlugin.getDefault().getGeonotesLayer(); geonotesLayer.refresh(null); } private class GeonotesListContentProvider implements ITreeContentProvider { public Object[] getChildren(Object parentElement) { return new Object[] { parentElement }; } public Object getParent(Object element) { return null; } public boolean hasChildren(Object element) { return false; } public Object[] getElements(Object inputElement) { if (inputElement instanceof List) { List<?> list = (List<?>) inputElement; Object[] array = (Object[]) list.toArray(new Object[list.size()]); return array; } return null; } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } } private class GeonotesListLabelProvider implements ILabelProvider { public Image getImage(Object element) { if (element instanceof GeonotesHandler) { GeonotesHandler note = (GeonotesHandler) element; if (note.getType() == GeonoteConstants.GPS) { return geonoteGpsImage; } else if (note.getType() == GeonoteConstants.PHOTO) { return geonotePhotoImage; } else if (note.getType() == GeonoteConstants.NORMAL) { return geonoteImage; } else { return geonoteImage; } } return null; } public String getText(Object element) { if (element instanceof GeonotesHandler) { return ((GeonotesHandler) element).getTitle(); } return null; } public void addListener(ILabelProviderListener listener) { } public void dispose() { } public boolean isLabelProperty(Object element, String property) { return false; } public void removeListener(ILabelProviderListener listener) { } } }