/* * Copyright 2013 Serdar. * * 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 de.fub.maps.project.datasource.spi.nodes; import de.fub.gpxmodule.xml.Wpt; import de.fub.maps.project.datasource.spi.TrackSegmentBehaviour; import de.fub.maps.project.datasource.spi.TrksegWrapper; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.lang.reflect.InvocationTargetException; import java.text.MessageFormat; import org.openide.nodes.AbstractNode; import org.openide.nodes.Children; import org.openide.nodes.PropertySupport; import org.openide.nodes.PropertySupport.ReadWrite; import org.openide.nodes.Sheet; import org.openide.util.lookup.AbstractLookup; import org.openide.util.lookup.InstanceContent; /** * * @author Serdar */ public class TrackSegmentNode extends AbstractNode implements TrackSegmentBehaviour { private static final String NAME_PATTERN = "Tracksegment: [{0, number, 000.00000000}°, {1, number, 000.00000000}°, {2, number, 000.00000000}°, {3, number, 000.00000000}°]"; private InstanceContent instanceContent = null; private boolean selected = false; private boolean visible = true; private BufferedImage image = null; private final TrksegWrapper trkseg; public TrackSegmentNode(TrksegWrapper trkseg) { this(trkseg, new InstanceContent()); } private TrackSegmentNode(TrksegWrapper trkseg, InstanceContent contenct) { super(Children.LEAF, new AbstractLookup(contenct)); this.instanceContent = contenct; instanceContent.add(trkseg); this.trkseg = trkseg; updateNode(); } private void updateNode() { if (trkseg.getTrackName() == null && trkseg.getTrackDescription() == null) { double latMax = -90; double lonMin = 180; double latMin = 90; double lonMax = -180; for (Wpt wpt : trkseg.getTrkseg().getTrkpt()) { latMax = Math.max(wpt.getLat().doubleValue(), latMax); latMin = Math.min(wpt.getLat().doubleValue(), latMin); lonMax = Math.max(wpt.getLon().doubleValue(), lonMax); lonMin = Math.min(wpt.getLon().doubleValue(), lonMin); } setDisplayName(MessageFormat.format(NAME_PATTERN, latMax, lonMin, latMin, lonMax)); } else { setDisplayName(MessageFormat.format("TrackName: {0}, Description: {1}", trkseg.getTrackName(), trkseg.getTrackDescription())); } } @Override public Image getIcon(int type) { if (image == null) { image = new BufferedImage(16, 16, BufferedImage.TYPE_4BYTE_ABGR); Graphics2D g2d = null; try { g2d = image.createGraphics(); g2d.setColor(trkseg.getColor()); g2d.fillRect(1, 1, 14, 14); g2d.setColor(Color.black); g2d.drawRect(1, 1, 14, 14); } finally { if (g2d != null) { g2d.dispose(); } } } return image; } @Override protected Sheet createSheet() { Sheet sheet = Sheet.createDefault(); Sheet.Set set = Sheet.createPropertiesSet(); sheet.put(set); Property<?> property = new PropertySupport.ReadWrite<Boolean>("visible", Boolean.class, "Visible On / Off", "") { @Override public Boolean getValue() throws IllegalAccessException, InvocationTargetException { return isVisible(); } @Override public void setValue(Boolean val) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { setVisible(val); } }; set.put(property); property = new ReadWrite<Boolean>("selected", Boolean.class, "Select On / Off", "") { @Override public Boolean getValue() throws IllegalAccessException, InvocationTargetException { return isSelected(); } @Override public void setValue(Boolean val) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { setSelected(val); } }; set.put(property); return sheet; } @Override public Image getOpenedIcon(int type) { return getIcon(type); } @Override public boolean isCheckable() { return true; } @Override public boolean isCheckEnabled() { return true; } @Override public Boolean isSelected() { return selected; } @Override public void setSelected(Boolean selected) { this.selected = selected; } @Override public boolean isVisible() { return visible; } @Override public void setVisible(boolean visible) { this.visible = visible; } }