/* Copyright 2008-2010 Gephi Authors : Patick J. McSweeney <pjmcswee@syr.edu>, Mathieu Bastian <mathieu.bastian@gephi.org> Website : http://www.gephi.org This file is part of Gephi. Gephi is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gephi 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Gephi. If not, see <http://www.gnu.org/licenses/>. */ package org.gephi.statistics; import org.gephi.statistics.spi.StatisticsBuilder; import org.gephi.statistics.spi.Statistics; import java.util.ArrayList; import org.gephi.statistics.api.*; import java.util.List; import org.gephi.data.attributes.api.AttributeController; import org.gephi.data.attributes.api.AttributeModel; import org.gephi.graph.api.GraphController; import org.gephi.graph.api.GraphModel; import org.gephi.project.api.ProjectController; import org.gephi.statistics.spi.StatisticsUI; import org.gephi.utils.longtask.spi.LongTask; import org.gephi.utils.longtask.api.LongTaskExecutor; import org.gephi.utils.longtask.api.LongTaskListener; import org.gephi.project.api.Workspace; import org.gephi.project.api.WorkspaceListener; import org.openide.util.Lookup; import org.openide.util.lookup.ServiceProvider; /** * * @author Mathieu Bastian * @author Patrick J. McSweeney */ @ServiceProvider(service = StatisticsController.class) public class StatisticsControllerImpl implements StatisticsController { private StatisticsBuilder[] statisticsBuilders; private StatisticsModelImpl model; public StatisticsControllerImpl() { statisticsBuilders = Lookup.getDefault().lookupAll(StatisticsBuilder.class).toArray(new StatisticsBuilder[0]); //Workspace events ProjectController pc = Lookup.getDefault().lookup(ProjectController.class); pc.addWorkspaceListener(new WorkspaceListener() { public void initialize(Workspace workspace) { workspace.add(new StatisticsModelImpl()); } public void select(Workspace workspace) { model = workspace.getLookup().lookup(StatisticsModelImpl.class); if (model == null) { model = new StatisticsModelImpl(); workspace.add(model); } } public void unselect(Workspace workspace) { } public void close(Workspace workspace) { } public void disable() { model = null; } }); if (pc.getCurrentWorkspace() != null) { model = pc.getCurrentWorkspace().getLookup().lookup(StatisticsModelImpl.class); if (model == null) { model = new StatisticsModelImpl(); pc.getCurrentWorkspace().add(model); } } } /** * * @param statistics */ public void execute(final Statistics pStatistics, LongTaskListener listener) { final GraphController graphController = Lookup.getDefault().lookup(GraphController.class); final GraphModel graphModel = graphController.getModel(); final AttributeModel attributeModel = Lookup.getDefault().lookup(AttributeController.class).getModel(); StatisticsBuilder builder = getBuilder(pStatistics.getClass()); final StatisticsUI[] uis = getUI(pStatistics); for (StatisticsUI s : uis) { s.setup(pStatistics); } model.setRunning(pStatistics, true); if (pStatistics instanceof LongTask) { LongTaskExecutor executor = new LongTaskExecutor(true, builder.getName(), 10); // executor.addLongTaskListener(this); if (listener != null) { executor.setLongTaskListener(listener); } executor.execute((LongTask) pStatistics, new Runnable() { public void run() { pStatistics.execute(graphModel, attributeModel); model.setRunning(pStatistics, false); for (StatisticsUI s : uis) { model.addResult(s); s.unsetup(); } model.addReport(pStatistics); } }, builder.getName(), null); } else { pStatistics.execute(graphModel, attributeModel); model.setRunning(pStatistics, false); for (StatisticsUI s : uis) { model.addResult(s); s.unsetup(); } model.addReport(pStatistics); if (listener != null) { listener.taskFinished(null); } } } public StatisticsUI[] getUI(Statistics statistics) { ArrayList<StatisticsUI> list = new ArrayList<StatisticsUI>(); for (StatisticsUI sui : Lookup.getDefault().lookupAll(StatisticsUI.class)) { if (sui.getStatisticsClass().equals(statistics.getClass())) { list.add(sui); } } return list.toArray(new StatisticsUI[0]); } public StatisticsBuilder getBuilder(Class<? extends Statistics> statisticsClass) { for (StatisticsBuilder b : statisticsBuilders) { if (b.getStatisticsClass().equals(statisticsClass)) { return b; } } return null; } public void setStatisticsUIVisible(StatisticsUI ui, boolean visible) { model.setVisible(ui, visible); } public StatisticsModelImpl getModel() { return model; } }