/*
* Copyright (C) 2013 Serdar
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package de.fub.maps.project.plugins.tasks.map;
import de.fub.maps.project.api.process.ProcessPipeline;
import de.fub.maps.project.api.process.ProcessState;
import de.fub.maps.project.models.Aggregator;
import java.util.ArrayList;
import java.util.List;
import javax.swing.Action;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.openide.nodes.ChildFactory;
import org.openide.nodes.FilterNode;
import org.openide.nodes.Node;
import org.openide.util.Utilities;
import org.openide.util.WeakListeners;
import org.openide.util.lookup.Lookups;
/**
*
* @author Serdar
*/
public class MapRendererChildNodeFactory extends ChildFactory<Aggregator> implements ChangeListener, ProcessPipeline.ProcessListener {
private final MapRenderer mapRenderer;
private final ArrayList<Aggregator> aggregatorList = new ArrayList<Aggregator>();
public MapRendererChildNodeFactory(MapRenderer mapRenderer) {
assert mapRenderer != null;
this.mapRenderer = mapRenderer;
init();
}
private void init() {
// add change listener to aggregator list of mapRenderer process
this.mapRenderer.getAggregatorList().addChangeListener(
WeakListeners.change(
MapRendererChildNodeFactory.this,
this.mapRenderer.getAggregatorList()));
// add process listener to mapRenderer process
this.mapRenderer.addProcessListener(
WeakListeners.create(
ProcessPipeline.ProcessListener.class,
MapRendererChildNodeFactory.this,
this.mapRenderer));
// if the list contains aggregators than add them to the aggregatorList
if (!this.mapRenderer.getAggregatorList().isEmpty()) {
aggregatorList.addAll(mapRenderer.getAggregatorList());
}
}
@Override
protected boolean createKeys(List<Aggregator> toPopulate) {
toPopulate.addAll(aggregatorList);
return true;
}
@Override
protected Node createNodeForKey(Aggregator aggregator) {
return new MapRendererSubNode(mapRenderer, aggregator);
}
@Override
public void started() {
aggregatorList.clear();
refresh(true);
}
@Override
public void changed(ProcessPipeline.ProcessEvent event) {
// do nothing
}
@Override
public void canceled() {
refresh(true);
}
@Override
public void finished() {
aggregatorList.clear();
aggregatorList.addAll(mapRenderer.getAggregatorList());
refresh(true);
}
@Override
public void stateChanged(ChangeEvent e) {
if (this.mapRenderer.getProcessState() != ProcessState.RUNNING) {
aggregatorList.addAll(mapRenderer.getAggregatorList());
refresh(true);
}
}
private static class MapRendererSubNode extends FilterNode {
private final Aggregator aggregator;
public MapRendererSubNode(MapRenderer mapRenderer, Aggregator aggregator) {
super(aggregator.getDataObject().getNodeDelegate(), Children.LEAF, Lookups.fixed(mapRenderer.getProcessParentDetector(), aggregator, aggregator.getDataObject()));
this.aggregator = aggregator;
}
@Override
public Action getPreferredAction() {
Action[] actions = getActions(false);
return actions.length > 0 ? actions[0] : null;
}
@Override
public Action[] getActions(boolean context) {
List<? extends Action> actionsForPath = Utilities.actionsForPath("Projects/Mapsforge/Detector/Tasks/MapRenderer/Actions");
return actionsForPath.toArray(new Action[actionsForPath.size()]);
}
}
}