package org.apache.maven.diagrams.gui.controller;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JPanel;
import org.apache.maven.diagrams.connector_api.ConnectorConfiguration;
import org.apache.maven.diagrams.connector_api.ConnectorException;
import org.apache.maven.diagrams.connector_api.DiagramConnector;
import org.apache.maven.diagrams.graph_api.Graph;
import org.apache.maven.diagrams.gui.MainWindow;
import org.apache.maven.diagrams.gui.bindings.connectors.BindingsManager;
import org.apache.maven.diagrams.gui.bindings.connectors.ResolvedBinding;
import org.apache.maven.diagrams.gui.connector.AbstractConnectorConfigurationPanel;
import org.apache.maven.diagrams.gui.graph_adapter.GraphToPrefuseGraph;
import org.apache.maven.diagrams.gui.layouts.AbstractLayoutConfiguration;
import org.apache.maven.diagrams.gui.model.Model;
import org.apache.maven.diagrams.gui.renderers.ConfigurableRenderer;
import org.apache.maven.diagrams.gui.renderers.RendererConfiguration;
import org.apache.maven.diagrams.gui.renderers.RendererConfigurationPanel;
import org.apache.maven.diagrams.gui.sidebar.ConnectorConfigurationContainerPanel;
import org.apache.maven.diagrams.gui.sidebar.LayoutConfigurationContainerPanel;
import org.apache.maven.diagrams.gui.sidebar.RendererConfigurationContainerPanel;
import prefuse.Constants;
import prefuse.Display;
import prefuse.Visualization;
import prefuse.action.ActionList;
import prefuse.action.RepaintAction;
import prefuse.action.assignment.ColorAction;
import prefuse.action.assignment.DataColorAction;
import prefuse.action.assignment.FontAction;
import prefuse.action.layout.Layout;
import prefuse.action.layout.graph.NodeLinkTreeLayout;
import prefuse.action.layout.graph.TreeLayout;
import prefuse.controls.DragControl;
import prefuse.controls.PanControl;
import prefuse.controls.ZoomControl;
import prefuse.controls.ZoomToFitControl;
import prefuse.data.Node;
import prefuse.render.DefaultRendererFactory;
import prefuse.render.Renderer;
import prefuse.util.ColorLib;
import prefuse.util.FontLib;
import prefuse.visual.NodeItem;
import prefuse.visual.VisualItem;
import sun.security.action.GetLongAction;
/**
* @author <a href="mailto:ptab@newitech.com">Piotr Tabor</a>
* @version $Id$
*/
public class MainController
{
private Model model;
private MainWindow view;
private BindingsManager bindingsManager;
private LayoutController layoutController;
private ConfigurableRenderer renderer;
public MainController() throws DiagramGuiException
{
model = createModel( null );
layoutController = new LayoutController( this );
view = new MainWindow( this );
}
public MainController( DiagramConnector connector ) throws DiagramGuiException
{
model = createModel( connector );
layoutController = new LayoutController( this );
view = new MainWindow( this );
}
public Model getModel()
{
return model;
}
public void setModel( Model model )
{
this.model = model;
}
public MainWindow getView()
{
return view;
}
public void setView( MainWindow view )
{
this.view = view;
}
public BindingsManager getBindingsManager()
{
if ( bindingsManager == null )
{
bindingsManager = new BindingsManager();
InputStream is = this.getClass().getResourceAsStream( "/diagrams-gui-bindings.xml" );
if ( is == null )
{
// TODO: Logger
return null;
}
bindingsManager.loadAndResolveBindings( is );
}
return bindingsManager;
}
public void setBindingsManager( BindingsManager bindingsManager )
{
this.bindingsManager = bindingsManager;
}
@SuppressWarnings( "unchecked" )
public List<JPanel> calculatePanelsForSideBar()
{
List<JPanel> result = new LinkedList<JPanel>();
if ( model.getConnector() != null )
{
ResolvedBinding<DiagramConnector> binding =
getBindingsManager().getBindingsForConnector( model.getConnector() );
try
{
AbstractConnectorConfigurationPanel p = binding.getConnectorConfigurationPanelClass().newInstance();
p.setCurrentConfiguration( model.getConnectorConfiguration() );
ConnectorConfigurationContainerPanel cccp = new ConnectorConfigurationContainerPanel( this, p );
cccp.setName( "Connector" );
result.add( cccp );
if ( ( binding.getRendererConfigurationPanel() != null )
|| ( binding.getRendererConfiguration() != null ) )
{
RendererConfigurationContainerPanel rccp =
new RendererConfigurationContainerPanel( this.layoutController );
rccp.setName( "Node apperance" );
RendererConfigurationPanel rcp =
(RendererConfigurationPanel) ( (Class) binding.getRendererConfigurationPanel() ).newInstance();
RendererConfiguration rendererConfiguration = binding.getRendererConfiguration().newInstance();
rcp.setCurrentRendererConfiguration( rendererConfiguration );
rccp.setRendererConfigurationPanel( rcp );
result.add( rccp );
}
}
catch ( InstantiationException e )
{
// TODO: Logger
e.printStackTrace();
}
catch ( IllegalAccessException e )
{
// TODO: Logger
e.printStackTrace();
}
}
LayoutConfigurationContainerPanel lccp = new LayoutConfigurationContainerPanel( this.layoutController );
lccp.setName( "Layout" );
result.add( lccp );
return result;
}
// ============================================================
protected Model createModel( DiagramConnector connector ) throws DiagramGuiException
{
Model model = new Model();
// model.setConnectorContext( connectorContext );
if ( connector != null )
{
// ResolvedBinding<DiagramConnector> binding = getBindingsManager().getBindingsForGraphType( graphType );
// if ( binding != null )
// {
try
{
// DiagramConnector connecto = binding.getConnectorClass().newInstance();
ConnectorConfiguration configuration =
connector.getConnectorDescriptor().getConfigurationClass().newInstance();
model.setConnector( connector );
model.setConnectorConfiguration( configuration );
}
catch ( ConnectorException e )
{
throw new DiagramGuiException( "Cannot instante connector for connector type: "
+ connector.getClass().getName(), e );
}
catch ( InstantiationException e )
{
throw new DiagramGuiException( "Cannot instante connector for connector type: "
+ connector.getClass().getName(), e );
}
catch ( IllegalAccessException e )
{
throw new DiagramGuiException( "Cannot instante connector for connector type: "
+ connector.getClass().getName(), e );
}
}
// else
// {
// throw new DiagramGuiException( "Binding for graph type: " + conne + " has not been found" );
// }
// }
return model;
}
// ==============================================================
public void updateConnectorConfiguration( ConnectorConfiguration new_connector_configuration, boolean refresh )
{
model.setConnectorConfiguration( new_connector_configuration );
if ( refresh )
refreshGraph();
}
public void refreshGraph()
{
// model.getConnector().setConnectorContext( model.getConnectorContext() );
try
{
Graph g = model.getConnector().calculateGraph( model.getConnectorConfiguration() );
prefuse.data.Graph prefuse_graph = GraphToPrefuseGraph.graph2PrefuseGraph( g );
if ( !Display.class.isInstance( view.getDiagramPanel() ) )
{
initializeDisplay( prefuse_graph );
}
else
{
getVisualization().removeGroup( "graph" );
getVisualization().add( "graph", prefuse_graph );
Layout currentLayout = layoutController.getCurrentLayout();
if ( TreeLayout.class.isInstance( currentLayout ) )
{
layoutController.updateRootOnTreeLayout( getVisualization(), (TreeLayout) currentLayout );
}
getVisualization().run( "color" );
getVisualization().run( "layout" );
getVisualization().putAction( "refresh", new RepaintAction() );
}
}
catch ( ConnectorException e )
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public ConfigurableRenderer getRenderer()
{
if ( renderer == null )
{
ResolvedBinding<DiagramConnector> binding =
getBindingsManager().getBindingsForConnector( model.getConnector() );
try
{
renderer = binding.getRenderer().newInstance();
renderer.setConfiguration( binding.getRendererConfiguration().newInstance() );
}
catch ( InstantiationException e )
{
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
catch ( IllegalAccessException e )
{
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
return renderer;
}
public Visualization getVisualization()
{
if ( ( view != null ) && ( view.getDiagramPanel() != null ) )
return ( (Display) view.getDiagramPanel() ).getVisualization();
else
return null;
}
// ==============================================================
private void initializeDisplay( prefuse.data.Graph prefuse_graph )
{
Display d = prepareDisplay();
view.setDiagramPanel( d );
configureDisplay( d, prefuse_graph, "Tree", null, getRenderer() );
}
public Display prepareDisplay()
{
Display d = new Display( new Visualization() );
d.setSize( 720, 500 ); // set display size
DragControl dc = new DragControl();
dc.setFixPositionOnMouseOver( false ); // FixPositionOnMouseOver is realized by FixNodeControl()
d.addControlListener( dc );
// pan with left-click drag on background
d.addControlListener( new PanControl() );
// zoom with right-click drag
d.addControlListener( new ZoomControl() );
d.addControlListener( new ZoomToFitControl() );
d.addControlListener( new FixNodeControl() );
return d;
}
public Display configureDisplay( Display d, prefuse.data.Graph graph, String layoutName,
AbstractLayoutConfiguration<?> configuration, Renderer r )
{
d.getVisualization().add( "graph", graph );
d.getVisualization().setInteractive( "graph.edges", null, false );
DefaultRendererFactory drf = new DefaultRendererFactory( r );
drf.setDefaultRenderer( r );
d.getVisualization().setRendererFactory( drf );
// / int[] palette = new int[] { ColorLib.rgb( 255, 255, 255 ), ColorLib.rgb( 190, 190, 255 ) };
// // map nominal data values to colors using our provided palette
ColorAction fill = new ColorAction( "graph.nodes", VisualItem.FILLCOLOR, ColorLib.rgb( 255, 255, 255 ) );
// new DataColorAction( "graph.nodes", "interface", Constants.NOMINAL, VisualItem.FILLCOLOR, palette );
FontAction font = new FontAction( "graph.nodes", FontLib.getFont( "Arial", 4 ) );
// use light grey for edges
ColorAction edges = new ColorAction( "graph.edges", VisualItem.STROKECOLOR, ColorLib.gray( 200 ) );
ColorAction edges0 = new ColorAction( "graph.edges", VisualItem.FILLCOLOR, ColorLib.gray( 200 ) );
// create an action list containing all color assignments
ActionList color = new ActionList();
color.add( fill );
color.add( edges );
color.add( edges0 );
color.add( font );
d.getVisualization().putAction( "color", color );
// -- 5. the display and interactive controls -------------------------
// assign the colors
d.getVisualization().run( "color" );
layoutController.setCurrentLayout( layoutName, configuration );
d.getVisualization().putAction( "refresh", new RepaintAction() );
return d;
}
// ==============================================================
public void run()
{
view.run();
if ( model.getConnectorConfiguration() != null && model.getConnector() != null )
refreshGraph();
}
}