/***************************************************************************** * Copyright (c) 2006, 2008 g-Eclipse Consortium * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Initial development of the original code was made for the * g-Eclipse project founded by European Union * project number: FP6-IST-034327 http://www.geclipse.eu/ * * Contributors: * Christof Klausecker GUP, JKU - initial API and implementation *****************************************************************************/ package eu.geclipse.traceview.statistics; import java.util.ArrayList; import org.eclipse.birt.chart.device.IDeviceRenderer; import org.eclipse.birt.chart.exception.ChartException; import org.eclipse.birt.chart.factory.GeneratedChartState; import org.eclipse.birt.chart.factory.Generator; import org.eclipse.birt.chart.model.Chart; import org.eclipse.birt.chart.model.attribute.Bounds; import org.eclipse.birt.chart.model.attribute.impl.BoundsImpl; import org.eclipse.birt.chart.util.PluginSettings; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeNode; import org.eclipse.jface.viewers.TreeNodeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IViewSite; import eu.geclipse.traceview.ITrace; import eu.geclipse.traceview.TraceVisualization; import eu.geclipse.traceview.statistics.chartbuilder.AbstractChartBuilder; import eu.geclipse.traceview.statistics.providers.IStatistics; /** * Statistics Visualisation */ public class StatisticsVisualisation extends TraceVisualization { protected int x = 0; protected int y = 0; protected IDeviceRenderer render = null; protected Chart chart = null; protected GeneratedChartState state = null; protected Composite composite = null; private Image cachedImage = null; private ITrace trace = null; /** * @param parent * @param style * @param viewSite * @param trace */ public StatisticsVisualisation( final Composite parent, final int style, final IViewSite viewSite, final ITrace trace ) { super( parent, style ); this.trace = trace; // this GridLayout layout = new GridLayout(); GridData layoutData = new GridData( SWT.FILL, SWT.FILL, true, true ); layout.numColumns = 4; this.setLayout( layout ); this.setLayoutData( layoutData ); // selection layout = new GridLayout(); layoutData = new GridData( SWT.FILL, SWT.FILL, false, true ); layoutData.horizontalSpan = 1; Group selectionGroup = new Group( this, SWT.NONE ); selectionGroup.setText( Messages.getString("StatisticsVisualisation.Statistics") ); //$NON-NLS-1$ selectionGroup.setLayout( layout ); selectionGroup.setLayoutData( layoutData ); // treeviewer final TreeViewer treeViewer = new TreeViewer( selectionGroup ); layout = new GridLayout(); layoutData = new GridData( SWT.FILL, SWT.FILL, true, true ); treeViewer.getTree().setLayout( layout ); treeViewer.getTree().setLayoutData( layoutData ); treeViewer.setContentProvider( new TreeNodeContentProvider() ); treeViewer.setLabelProvider( new StatisticsVisualisationLabelProvider() ); populateTree( treeViewer ); // chart Group chartGroup = new Group( this, SWT.NONE ); layout = new GridLayout(); layoutData = new GridData( SWT.FILL, SWT.FILL, true, true ); chartGroup.setLayout( layout ); chartGroup.setLayoutData( layoutData ); chartGroup.setText( Messages.getString("StatisticsVisualisation.Chart") ); //$NON-NLS-1$ layoutData.horizontalSpan = 3; // description Group description = new Group( this, SWT.NONE ); layout = new GridLayout(); layoutData = new GridData( SWT.FILL, SWT.FILL, true, false ); layoutData.heightHint = 60; layoutData.horizontalSpan = 4; description.setLayout( layout ); description.setLayoutData( layoutData ); description.setText( Messages.getString("StatisticsVisualisation.Description") ); //$NON-NLS-1$ final Text text = new Text( description, SWT.MULTI | SWT.V_SCROLL | SWT.WRAP ); text.setEditable( false ); text.setBackground( getDisplay().getSystemColor( SWT.COLOR_WIDGET_BACKGROUND ) ); layoutData = new GridData( SWT.FILL, SWT.FILL, true, true ); text.setLayoutData( layoutData ); text.setText( Messages.getString("StatisticsVisualisation.Select") ); //$NON-NLS-1$ // Scrolled Composite new Label( chartGroup, SWT.NONE ); final ScrolledComposite sc = new ScrolledComposite( chartGroup, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER ); sc.setBackground( getDisplay().getSystemColor( SWT.COLOR_WHITE ) ); layout = new GridLayout(); layoutData = new GridData( SWT.FILL, SWT.FILL, true, true ); layoutData.verticalIndent = -18; // TODO cleaner solution or test if its ok // on other platforms sc.setLayout( layout ); sc.setLayoutData( layoutData ); // Composite this.composite = new Composite( sc, SWT.NONE ); this.composite.setBackground( getDisplay().getSystemColor( SWT.COLOR_WHITE ) ); layout = new GridLayout(); layoutData = new GridData( SWT.FILL, SWT.FILL, true, true ); this.composite.setLayout( layout ); this.composite.setLayoutData( layoutData ); // init birt renderer try { PluginSettings ps = PluginSettings.instance(); this.render = ps.getDevice( "dv.SWT" ); //$NON-NLS-1$ } catch( ChartException exception ) { Activator.logException( exception ); } sc.setContent( this.composite ); sc.addListener( SWT.Resize, new Listener() { public void handleEvent( final Event e ) { int maxX = Math.max( StatisticsVisualisation.this.x, sc.getClientArea().width ); int maxY = Math.max( StatisticsVisualisation.this.y, sc.getClientArea().height ); StatisticsVisualisation.this.composite.setSize( maxX, maxY ); } } ); this.composite.addPaintListener( new PaintListener() { public void paintControl( final PaintEvent e ) { if(StatisticsVisualisation.this.chart !=null){ paint( e ); } } } ); this.composite.addDisposeListener( new DisposeListener() { public void widgetDisposed( final DisposeEvent e ) { disposeWidget( e ); } } ); treeViewer.addSelectionChangedListener( new ISelectionChangedListener() { public void selectionChanged( final SelectionChangedEvent event ) { if( treeViewer.getSelection() instanceof IStructuredSelection ) { IStructuredSelection structuredSelection = ( IStructuredSelection )treeViewer.getSelection(); if( structuredSelection.getFirstElement() instanceof TreeNode ) { TreeNode treeNode = ( TreeNode )structuredSelection.getFirstElement(); if( treeNode.getValue() instanceof IStatistics ) { IStatistics statistics = ( IStatistics )treeNode.getValue(); text.setText( statistics.getDescription() ); } } } } } ); treeViewer.addSelectionChangedListener( new ISelectionChangedListener() { public void selectionChanged( final SelectionChangedEvent event ) { ISelection selection = treeViewer.getSelection(); if( selection != null && selection instanceof IStructuredSelection ) { IStructuredSelection structuredSelection = ( IStructuredSelection )selection; TreeNode treeNode = ( TreeNode )structuredSelection.getFirstElement(); if( treeNode != null && treeNode.getValue() instanceof AbstractChartBuilder ) { AbstractChartBuilder abstractChartBuilder = ( AbstractChartBuilder )treeNode.getValue(); IStatistics statistics = ( IStatistics )treeNode.getParent() .getValue(); text.setText( statistics.getDescription() ); statistics.initialize(); abstractChartBuilder.setTitle( statistics.getTitle() ); abstractChartBuilder.setXSeries( statistics.getXSeries() ); abstractChartBuilder.setYSeries( statistics.getYSeries() ); abstractChartBuilder.setZSeries( statistics.getZSeries() ); abstractChartBuilder.build(); StatisticsVisualisation.this.setChart( abstractChartBuilder.getChart() ); StatisticsVisualisation.this.x = abstractChartBuilder.minWidth(); StatisticsVisualisation.this.y = abstractChartBuilder.minHeight(); int maxX = Math.max( StatisticsVisualisation.this.x, sc.getClientArea().width ); int maxY = Math.max( StatisticsVisualisation.this.y, sc.getClientArea().height ); StatisticsVisualisation.this.composite.setSize( maxX, maxY ); StatisticsVisualisation.this.composite.redraw(); } } } } ); } private void populateTree( final TreeViewer treeViewer ) { ArrayList<TreeNode> root = new ArrayList<TreeNode>(); for( IConfigurationElement configurationElement : Platform.getExtensionRegistry() .getConfigurationElementsFor( "eu.geclipse.traceview.statistics.Statistics" ) ) { //$NON-NLS-1$ IStatistics statistics; try { statistics = ( IStatistics )configurationElement.createExecutableExtension( "class" ); //$NON-NLS-1$ statistics.setTrace( this.trace ); TreeNode treeNode = new TreeNode( statistics ); ArrayList<TreeNode> leaf = new ArrayList<TreeNode>(); for( IConfigurationElement configurationElement2 : Platform.getExtensionRegistry() .getConfigurationElementsFor( "eu.geclipse.traceview.statistics.Visualizations" ) ) { //$NON-NLS-1$ if( ( statistics.xAxis() == configurationElement2.getAttribute( "x" ) || //$NON-NLS-1$ statistics.xAxis().equals( configurationElement2.getAttribute( "x" ) ) )//$NON-NLS-1$ && ( statistics.yAxis() == configurationElement2.getAttribute( "y" ) || //$NON-NLS-1$ statistics.yAxis() .equals( configurationElement2.getAttribute( "y" ) ) ) //$NON-NLS-1$ && ( statistics.zAxis() == configurationElement2.getAttribute( "z" ) || statistics.zAxis() //$NON-NLS-1$ .equals( configurationElement2.getAttribute( "z" ) ) ) ) //$NON-NLS-1$ { AbstractChartBuilder abstractChartBuilder = ( AbstractChartBuilder )configurationElement2.createExecutableExtension( "class" ); //$NON-NLS-1$ TreeNode child = new TreeNode( abstractChartBuilder ); child.setParent( treeNode ); leaf.add( child ); } } treeNode.setChildren( leaf.toArray( new TreeNode[ 0 ] ) ); root.add( treeNode ); } catch( CoreException coreException ) { Activator.logException( coreException ); } } treeViewer.setInput( root.toArray( new TreeNode[ 0 ] ) ); treeViewer.expandAll(); } protected void paint( final PaintEvent e ) { Point size = this.composite.getSize(); if( this.cachedImage != null && !this.cachedImage.isDisposed() ) { this.cachedImage.dispose(); } this.cachedImage = new Image( Display.getCurrent(), size.x, size.y ); GC gc = new GC( this.cachedImage ); this.render.setProperty( IDeviceRenderer.GRAPHICS_CONTEXT, gc ); Generator gr = Generator.instance(); Bounds bo = BoundsImpl.create( 0, 0, size.x, size.y ); int resolution = this.render.getDisplayServer().getDpiResolution(); bo.scale( 72d / resolution ); try { this.state = gr.build( this.render.getDisplayServer(), this.chart, bo, null ); gr.render( this.render, this.state ); if( this.cachedImage != null ) e.gc.drawImage( this.cachedImage, 0, 0, this.cachedImage.getBounds().width, this.cachedImage.getBounds().height, 0, 0, size.x, size.y ); } catch( ChartException exception ) { Activator.logException( exception ); } finally { this.cachedImage.dispose(); } } @SuppressWarnings("unused") protected void disposeWidget( final DisposeEvent e ) { if( this.cachedImage != null && !this.cachedImage.isDisposed() ) { this.cachedImage.dispose(); } } @Override public IContributionItem[] getToolBarItems() { return new IContributionItem[ 0 ]; } @Override public ITrace getTrace() { return this.trace; } protected void setChart( final Chart chart ) { if( this.cachedImage != null ) this.cachedImage.dispose(); this.cachedImage = null; this.chart = chart; } @Override public void printTrace( final GC gc ) { // TODO Auto-generated method stub } }