/*
* 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.gpxmodule.factories;
import de.fub.gpxmodule.GPXDataObject;
import de.fub.gpxmodule.nodes.RteNode;
import de.fub.gpxmodule.nodes.TrkNode;
import de.fub.gpxmodule.xml.Gpx;
import de.fub.gpxmodule.xml.Rte;
import de.fub.gpxmodule.xml.Trk;
import de.fub.gpxmodule.xml.Wpt;
import java.awt.Image;
import java.beans.IntrospectionException;
import java.util.List;
import org.openide.filesystems.FileChangeAdapter;
import org.openide.filesystems.FileChangeListener;
import org.openide.filesystems.FileEvent;
import org.openide.filesystems.FileUtil;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.BeanNode;
import org.openide.nodes.ChildFactory;
import org.openide.nodes.Children;
import org.openide.nodes.Node;
import org.openide.util.Exceptions;
import org.openide.util.Lookup;
/**
*
* @author Serdar
*/
public class GPXChildNodeFactory extends ChildFactory<Node> {
private final GPXDataObject dataObject;
private final FileChangeListener fcl = new FileChangeAdapter() {
@Override
public void fileChanged(FileEvent fe) {
refresh(true);
}
};
public GPXChildNodeFactory(GPXDataObject dataObject) {
assert dataObject != null;
this.dataObject = dataObject;
this.dataObject.getPrimaryFile().addFileChangeListener(FileUtil.weakFileChangeListener(fcl, this.dataObject.getPrimaryFile()));
}
@Override
protected boolean createKeys(List<Node> list) {
Gpx gpx = dataObject.getGpx();
if (gpx.getTrk() != null) {
for (Trk trk : gpx.getTrk()) {
try {
list.add(
new TrkNode(
trk,
((trk.getTrkseg() == null
|| trk.getTrkseg().isEmpty())
? Children.LEAF : Children.create(new TrackSegmentNodeFactory(trk.getTrkseg()), true)),
Lookup.EMPTY));
} catch (IntrospectionException ex) {
Exceptions.printStackTrace(ex);
}
}
}
if (gpx.getWpt() != null) {
list.add(new WptRootNode(gpx.getWpt()));
}
if (gpx.getRte() != null) {
for (Rte rte : gpx.getRte()) {
try {
list.add(new RteNode(
rte,
rte.getRtept() == null
|| rte.getRtept().isEmpty()
? Children.LEAF
: Children.create(new WptNodeFactory(rte.getRtept()), true)));
} catch (IntrospectionException ex) {
Exceptions.printStackTrace(ex);
}
}
}
return true;
}
@Override
protected Node createNodeForKey(Node t) {
return t;
}
private static class WptRootNode extends AbstractNode {
private static final Node NODE = createEmptyNode();
public WptRootNode(List<Wpt> wpts) {
super(Children.create(new WptNodeFactory(wpts), true));
setDisplayName("Waypoints"); // NO18N
}
private static Node createEmptyNode() {
Node node = null;
try {
node = new BeanNode<Object>(new Object());
} catch (IntrospectionException ex) {
node = new AbstractNode(Children.LEAF);
}
return node;
}
@Override
public Image getIcon(int type) {
return NODE.getIcon(type);
}
@Override
public Image getOpenedIcon(int type) {
return NODE.getIcon(type);
}
}
}