/** * DataCleaner (community edition) * Copyright (C) 2014 Neopost - Customer Information Management * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * 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 Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.datacleaner.widgets.visualization; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.util.Set; import org.datacleaner.api.OutputDataStream; import org.datacleaner.job.builder.AnalysisJobBuilder; import org.datacleaner.job.builder.ComponentBuilder; import edu.uci.ics.jung.algorithms.layout.AbstractLayout; import edu.uci.ics.jung.algorithms.layout.GraphElementAccessor; import edu.uci.ics.jung.algorithms.layout.Layout; import edu.uci.ics.jung.algorithms.layout.LayoutDecorator; import edu.uci.ics.jung.visualization.VisualizationViewer; import edu.uci.ics.jung.visualization.picking.PickedState; public class JobGraphContext { private final VisualizationViewer<Object, JobGraphLink> _visualizationViewer; private final JobGraph _jobGraph; private final AnalysisJobBuilder _analysisJobBuilder; public JobGraphContext(final JobGraph jobGraph, final VisualizationViewer<Object, JobGraphLink> visualizationViewer, final AnalysisJobBuilder analysisJobBuilder) { _jobGraph = jobGraph; _visualizationViewer = visualizationViewer; _analysisJobBuilder = analysisJobBuilder; } public VisualizationViewer<Object, JobGraphLink> getVisualizationViewer() { return _visualizationViewer; } public JobGraph getJobGraph() { return _jobGraph; } /** * Gets the main/primary/parent {@link AnalysisJobBuilder} in use on the * {@link JobGraph} canvas. Note that other {@link AnalysisJobBuilder}s may * exist if the job has components which publish {@link OutputDataStream}s. * Therefore the {@link #getAnalysisJobBuilder(Object)} method is preferred * if any vertex-specific interaction is needed. * * @return */ public AnalysisJobBuilder getMainAnalysisJobBuilder() { return _analysisJobBuilder; } /** * Gets the {@link AnalysisJobBuilder} object pertaining to a particular * vertex on the {@link JobGraph}. * * @param vertex * @return */ public AnalysisJobBuilder getAnalysisJobBuilder(final Object vertex) { if (vertex instanceof ComponentBuilder) { return ((ComponentBuilder) vertex).getAnalysisJobBuilder(); } return _analysisJobBuilder; } public Object getVertex(final MouseEvent me) { return getVertex(me.getPoint()); } /** * Gets the vertex at a particular point, or null if it does not exist. * * @param point2D * @return */ public Object getVertex(final Point2D point2D) { final GraphElementAccessor<?, ?> pickSupport = _visualizationViewer.getPickSupport(); @SuppressWarnings("rawtypes") final Layout graphLayout = _visualizationViewer.getModel().getGraphLayout(); @SuppressWarnings("unchecked") final Object vertex = pickSupport.getVertex(graphLayout, point2D.getX(), point2D.getY()); return vertex; } public AbstractLayout<Object, JobGraphLink> getGraphLayout() { Layout<Object, JobGraphLink> layout = getVisualizationViewer().getGraphLayout(); while (layout instanceof LayoutDecorator) { layout = ((LayoutDecorator<Object, JobGraphLink>) layout).getDelegate(); } return (AbstractLayout<Object, JobGraphLink>) layout; } public Set<Object> getSelectedVertices() { final PickedState<Object> pickedVertexState = _visualizationViewer.getPickedVertexState(); if (pickedVertexState == null) { return null; } return pickedVertexState.getPicked(); } }