/******************************************************************************* * Copyright 2012 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.worldwind.common.layers.point.types; import gov.nasa.worldwind.avlist.AVKey; import gov.nasa.worldwind.avlist.AVList; import gov.nasa.worldwind.event.SelectEvent; import gov.nasa.worldwind.event.SelectListener; import gov.nasa.worldwind.geom.Position; import gov.nasa.worldwind.layers.IconLayer; import gov.nasa.worldwind.pick.PickedObject; import gov.nasa.worldwind.render.DrawContext; import gov.nasa.worldwind.render.UserFacingIcon; import gov.nasa.worldwind.render.WWIcon; import java.net.MalformedURLException; import java.net.URL; import au.gov.ga.earthsci.worldwind.common.WorldWindowRegistry; import au.gov.ga.earthsci.worldwind.common.layers.Bounds; import au.gov.ga.earthsci.worldwind.common.layers.point.PointLayer; import au.gov.ga.earthsci.worldwind.common.layers.point.PointLayerHelper; import au.gov.ga.earthsci.worldwind.common.layers.styled.StyleAndText; import au.gov.ga.earthsci.worldwind.common.util.DefaultLauncher; /** * {@link PointLayer} implementation which extends {@link IconLayer} and uses * Icons to represent points. * * @author Michael de Hoog (michael.dehoog@ga.gov.au) */ public class IconPointLayer extends IconLayer implements PointLayer, SelectListener { private final PointLayerHelper helper; private WWIcon pickedIcon; public IconPointLayer(PointLayerHelper helper) { this.helper = helper; WorldWindowRegistry.INSTANCE.addSelectListener(this); } @Override public void render(DrawContext dc) { if (isEnabled()) { helper.requestPoints(this); } super.render(dc); } @Override public Bounds getBounds() { return helper.getBounds(); } @Override public boolean isFollowTerrain() { return helper.isFollowTerrain(); } @Override public void addPoint(Position position, AVList attributeValues) { StyleAndText properties = helper.getStyle(attributeValues); UserFacingIcon icon = new UserFacingIcon(); icon.setPosition(position); icon.setToolTipText(properties.text); icon.setValue(AVKey.URL, properties.link); properties.style.setPropertiesFromAttributes(helper.getContext(), attributeValues, icon); this.addIcon(icon); } @Override public void loadComplete() { } @Override public URL getUrl() throws MalformedURLException { return helper.getUrl(); } @Override public String getDataCacheName() { return helper.getDataCacheName(); } @Override public void selected(SelectEvent e) { if (e == null) { return; } PickedObject topPickedObject = e.getTopPickedObject(); if (topPickedObject != null && topPickedObject.getObject() instanceof WWIcon) { if (pickedIcon != null) { highlight(pickedIcon, false); } pickedIcon = (WWIcon) topPickedObject.getObject(); highlight(pickedIcon, true); if (e.getEventAction() == SelectEvent.LEFT_CLICK) { String link = pickedIcon.getStringValue(AVKey.URL); if (link != null) { try { URL url = new URL(link); DefaultLauncher.openURL(url); } catch (MalformedURLException m) { } } } } else if (pickedIcon != null) { highlight(pickedIcon, false); pickedIcon = null; } } protected void highlight(WWIcon icon, boolean highlight) { icon.setShowToolTip(highlight); icon.setHighlighted(highlight); } @Override public boolean isLoading() { return helper.getPointProvider().isLoading(); } @Override public void addLoadingListener(LoadingListener listener) { helper.getPointProvider().addLoadingListener(listener); } @Override public void removeLoadingListener(LoadingListener listener) { helper.getPointProvider().removeLoadingListener(listener); } }