Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Archived » BIRT » Interactivity on a SWT Chart Viewer
Interactivity on a SWT Chart Viewer [message #368385] Wed, 27 May 2009 10:41 Go to next message
Maghen Calinghee is currently offline Maghen CalingheeFriend
Messages: 23
Registered: July 2009
Junior Member
Hi,

I'm using a chart viewer in SWT and i've used interactivity when the mouse
is hover the chart to display a tooltip. The tooltip shows up but it does
not evaluate the content. I've put an expression : row["myData"] in my
report for the ToolTip content in the "Interactivity" part of my chart. On
my SWT Chart Viewer, it shows this expression instead of the evaluation of
this expression.

Did I do something wrong in my SWT Chart Viewer?

Maghen.
Re: Interactivity on a SWT Chart Viewer [message #368400 is a reply to message #368385] Wed, 27 May 2009 17:14 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: jasonweathersby.windstream.net

Maghen,

I am posting two classes that show how to get the values. Row[xxx] does
not mean anything to the chart engine when used outside of BIRT. Take a
look at the two attached classes. Look at how MyActionRenderer to see
how the tooltip can be handled.


import java.util.Map;

import org.eclipse.birt.chart.render.ActionRendererAdapter;
import org.eclipse.birt.chart.computation.DataPointHints;
import org.eclipse.birt.chart.event.StructureSource;
import org.eclipse.birt.chart.event.StructureType;
import org.eclipse.birt.chart.factory.IDataRowExpressionEvaluator;
import org.eclipse.birt.chart.model.attribute.ActionType;
import org.eclipse.birt.chart.model.attribute.ScriptValue;
import org.eclipse.birt.chart.model.attribute.TooltipValue;
import org.eclipse.birt.chart.model.attribute.URLValue;
import org.eclipse.birt.chart.model.attribute.impl.ScriptValueImpl;
import org.eclipse.birt.chart.model.data.Action;
import org.eclipse.birt.chart.render.ActionRendererAdapter;
import org.eclipse.birt.chart.util.ChartUtil;
/**
* Simple implementation for IActionRenderer
*/
public class MyActionRenderer extends ActionRendererAdapter {
private Map cacheScriptEvaluator;
public void processAction( Action action, StructureSource source )
{


if ( ActionType.SHOW_TOOLTIP_LITERAL.equals( action.getType( ) ) )
{
TooltipValue tv = (TooltipValue) action.getValue( );
if ( StructureType.SERIES_DATA_POINT.equals( source.getType( ) ) )
{
final DataPointHints dph = (DataPointHints) source.getSource( );
String MyToolTip = "My Value is " + dph.getDisplayValue() + "--"
+dph.getBaseDisplayValue();
tv.setText( MyToolTip );
}
}
if ( ActionType.INVOKE_SCRIPT_LITERAL.equals( action.getType( ) ) )
{
ScriptValue sv = (ScriptValue) action.getValue( );
String tst = sv.getScript();
if ( StructureType.SERIES_DATA_POINT.equals( source.getType( ) ) )
{
//final DataPointHints dph = (DataPointHints) source.getSource( );
//double x =dph.getLocation().getX();
// double y =dph.getLocation().getY();
//String MyToolTip = "categoryData " + "My Value is " +
dph.getDisplayValue() + "--" +dph.getBaseDisplayValue() + "-- X" +x +"--
Y"+y;
String nscript = "alert(categoryData);alert(evt.clientX);";
sv.setScript(nscript);
}


System.out.println(tst);
System.out.println(source.getType( ));
}
}
}






import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Vector;

import org.eclipse.birt.chart.api.ChartEngine;
import org.eclipse.birt.chart.device.EmptyUpdateNotifier;
import org.eclipse.birt.chart.device.IDeviceRenderer;
import org.eclipse.birt.chart.device.IDisplayServer;
import org.eclipse.birt.chart.device.IImageMapEmitter;
import org.eclipse.birt.chart.factory.GeneratedChartState;
import org.eclipse.birt.chart.factory.IGenerator;
import org.eclipse.birt.chart.model.Chart;
import org.eclipse.birt.chart.model.ChartWithAxes;
import org.eclipse.birt.chart.model.attribute.ActionType;
import org.eclipse.birt.chart.model.attribute.Anchor;
import org.eclipse.birt.chart.model.attribute.AxisType;
import org.eclipse.birt.chart.model.attribute.Bounds;
import org.eclipse.birt.chart.model.attribute.ChartDimension;
import org.eclipse.birt.chart.model.attribute.DataType;
import org.eclipse.birt.chart.model.attribute.IntersectionType;
import org.eclipse.birt.chart.model.attribute.LegendItemType;
import org.eclipse.birt.chart.model.attribute.LineAttributes;
import org.eclipse.birt.chart.model.attribute.LineStyle;
import org.eclipse.birt.chart.model.attribute.Marker;
import org.eclipse.birt.chart.model.attribute.MarkerType;
import org.eclipse.birt.chart.model.attribute.Position;
import org.eclipse.birt.chart.model.attribute.SortOption;
import org.eclipse.birt.chart.model.attribute.TickStyle;
import org.eclipse.birt.chart.model.attribute.TriggerCondition;
import org.eclipse.birt.chart.model.attribute.impl.BoundsImpl;
import org.eclipse.birt.chart.model.attribute.impl.CallBackValueImp l;
import org.eclipse.birt.chart.model.attribute.impl.ColorDefinitionI mpl;
import org.eclipse.birt.chart.model.attribute.impl.ScriptValueImpl;
import org.eclipse.birt.chart.model.attribute.impl.TooltipValueImpl ;
import org.eclipse.birt.chart.model.attribute.impl.URLValueImpl;
import org.eclipse.birt.chart.model.component.Axis;
import org.eclipse.birt.chart.model.component.Series;
import org.eclipse.birt.chart.model.component.impl.AxisImpl;
import org.eclipse.birt.chart.model.component.impl.SeriesImpl;
import org.eclipse.birt.chart.model.data.BaseSampleData;
import org.eclipse.birt.chart.model.data.DataFactory;
import org.eclipse.birt.chart.model.data.NumberDataSet;
import org.eclipse.birt.chart.model.data.OrthogonalSampleData;
import org.eclipse.birt.chart.model.data.Query;
import org.eclipse.birt.chart.model.data.SampleData;
import org.eclipse.birt.chart.model.data.SeriesDefinition;
import org.eclipse.birt.chart.model.data.TextDataSet;
import org.eclipse.birt.chart.model.data.Trigger;
import org.eclipse.birt.chart.model.data.impl.ActionImpl;
import org.eclipse.birt.chart.model.data.impl.NumberDataSetImpl;
import org.eclipse.birt.chart.model.data.impl.QueryImpl;
import org.eclipse.birt.chart.model.data.impl.SeriesDefinitionImpl;
import org.eclipse.birt.chart.model.data.impl.TextDataSetImpl;
import org.eclipse.birt.chart.model.data.impl.TriggerImpl;
import org.eclipse.birt.chart.model.impl.ChartWithAxesImpl;
import org.eclipse.birt.chart.model.layout.Legend;
import org.eclipse.birt.chart.model.layout.Plot;
import org.eclipse.birt.chart.model.type.BarSeries;
import org.eclipse.birt.chart.model.type.LineSeries;
import org.eclipse.birt.chart.model.type.impl.LineSeriesImpl;
import org.eclipse.birt.chart.model.type.impl.BarSeriesImpl;
import org.eclipse.birt.core.framework.PlatformConfig;
import org.eclipse.emf.ecore.util.EcoreUtil;

/**
* Test decription:
* </p>
* Chart script: BeforeDrawLegendItem()
* </p>
*/

public class StandaloneChart {

private static String OUTPUT = "output/Standalone.png"; //$NON-NLS-1$
private static String OUTPUT_HTML = "output/Standalone.html"; //$NON-NLS-1$

/**
* Comment for <code>serialVersionUID</code>
*/
private static final long serialVersionUID = 1L;

/**
* A chart model instance
*/
private Chart cm = null;

/**
* The swing rendering device
*/
private IDeviceRenderer dRenderer = null;
private IDisplayServer dServer = null;

private GeneratedChartState gcs = null;

/**
* execute application
*
* @param args
*/
public static void main(String[] args) {
new StandaloneChart();
System.out.println("Finished");
}

/**
* Constructor
*/
public StandaloneChart() {
PlatformConfig pf = new PlatformConfig();
pf.setProperty("STANDALONE", true);

//Returns a singleton instance of the Chart Engine
ChartEngine ce = ChartEngine.instance(pf);
//Returns a singleton instance of the Generator
IGenerator gr = ce.getGenerator();

try {
//device renderers for dv.SWT, dv.PNG, dv.JPG
//dv.PDF, dv.SVG, dv.SWING, dv.PNG24, div.BMP
dRenderer = ce.getRenderer("dv.PNG");
dServer = dRenderer.getDisplayServer();
} catch (Exception ex) {
ex.printStackTrace();
}

//cm = new AfterDatasetFilled().GetChartModel();
cm = StandaloneChart.createStackedBar();

//cm = StandaloneChart.createMultipleYAxes();
//cm = StandaloneChart.createStockChart();
//cm = StandaloneChart.createTest();
BufferedImage img = new BufferedImage(600, 600,
BufferedImage.TYPE_INT_ARGB);
Graphics g = img.getGraphics();

Graphics2D g2d = (Graphics2D) g;
//Look at IDeviceRenderer.java for all properties
//like DPI_RESOLUTION
//FILE_IDENTIFIER
//FORMAT_IDENTIFIER
//UPDATE_NOTIFIER
dRenderer.setProperty(IDeviceRenderer.GRAPHICS_CONTEXT, g2d);
dRenderer.setProperty(IDeviceRenderer.FILE_IDENTIFIER, OUTPUT);
//$NON-NLS-1$

//Set the bounds for the entire chart
Bounds bo = BoundsImpl.create(0, 0, 600, 600);
bo.scale(72d / dRenderer.getDisplayServer().getDpiResolution());

try {

gcs = gr.build(dServer, cm, bo, null, null, null);
gcs.getRunTimeContext().setActionRenderer( new MyActionRenderer());
dRenderer.setProperty(IDeviceRenderer.UPDATE_NOTIFIER,
new EmptyUpdateNotifier(cm, gcs.getChartModel()));

gr.render(dRenderer, gcs);
String im = ((IImageMapEmitter) dRenderer).getImageMap();

BufferedWriter out = new BufferedWriter(new FileWriter(OUTPUT_HTML));

out.write("<html>");
out.newLine();
out.write("<body>");
out.newLine();
out.write("<div>");
out.newLine();
out.write("<map name='testmap'>");
out.write(im);
out.write("</map>");
out.newLine();
out
.write("<img id=myimage src='standalone.png'
usemap='#testmap'></img>");
out.newLine();
out.write("</div>");
out.newLine();
out.write("</body>");
out.newLine();
out.write("</html>");
out.newLine();
out.close();

System.out.println(im);

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static final Chart createStackedBar()

{

ChartWithAxes cwaBar = ChartWithAxesImpl.create();

cwaBar.setType("Bar Chart"); //$NON-NLS-1$

cwaBar.setSubType("Stacked"); //$NON-NLS-1$

// Plot

cwaBar.getBlock().setBackground(ColorDefinitionImpl.WHITE()) ;

cwaBar.getBlock().getOutline().setVisible(true);

Plot p = cwaBar.getPlot();

p.getClientArea().setBackground(ColorDefinitionImpl.create(2 55,

255,

225));

// Title

cwaBar.getTitle()

.getLabel()

.getCaption()

.setValue("Stacked Bar Chart"); //$NON-NLS-1$

// Legend

Legend lg = cwaBar.getLegend();

lg.setItemType(LegendItemType.CATEGORIES_LITERAL);

//Add Script

cwaBar
.setScript("function beforeGeneration( cm, icsc )"
+ " {importPackage(Packages.org.eclipse.birt.chart.model.attribu te); "
+ "
importPackage(Packages.org.eclipse.birt.chart.model.attribut e.impl); "
+ " cm.getLegend().getOutline( ).setStyle(
LineStyle.DASH_DOTTED_LITERAL );"
+ " cm.getLegend().getOutline( ).setColor(
ColorDefinitionImpl.GREEN() );"
+ " cm.getLegend().getOutline( ).setVisible( true );} ");

// X-Axis

Axis xAxisPrimary = cwaBar.getPrimaryBaseAxes()[0];

xAxisPrimary.setType(AxisType.TEXT_LITERAL);


xAxisPrimary.getMajorGrid().setTickStyle(TickStyle.BELOW_LIT ERAL);

xAxisPrimary.getOrigin().setType(IntersectionType.MIN_LITERA L);

// Y-Axis

Axis yAxisPrimary = cwaBar.getPrimaryOrthogonalAxis(xAxisPrimary);

yAxisPrimary.getMajorGrid().setTickStyle(TickStyle.LEFT_LITE RAL);

yAxisPrimary.setType(AxisType.LINEAR_LITERAL);

yAxisPrimary.setLabelPosition(Position.RIGHT_LITERAL);
yAxisPrimary.getLabel().getCaption().getFont().setRotation(4 5);



// Data Set

TextDataSet categoryValues = TextDataSetImpl.create(new String[] {
"Item 1a", "Item 2", "Item 3", "Item 4", "Item 5" }); //$NON-NLS-1$
//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$

NumberDataSet orthoValues1 = NumberDataSetImpl.create(new double[] {

25, 35, 15, 5, 20

});

NumberDataSet orthoValues2 = NumberDataSetImpl.create(new double[] {

5, 10, 25, 10, 5

});

SampleData sd = DataFactory.eINSTANCE.createSampleData();

BaseSampleData sdBase = DataFactory.eINSTANCE.createBaseSampleData();

sdBase.setDataSetRepresentation("");//$NON-NLS-1$

sd.getBaseSampleData().add(sdBase);

OrthogonalSampleData sdOrthogonal1 = DataFactory.eINSTANCE
.createOrthogonalSampleData();

sdOrthogonal1.setDataSetRepresentation("");//$NON-NLS-1$

sdOrthogonal1.setSeriesDefinitionIndex(0);

sd.getOrthogonalSampleData().add(sdOrthogonal1);

OrthogonalSampleData sdOrthogonal2 = DataFactory.eINSTANCE
.createOrthogonalSampleData();

sdOrthogonal2.setDataSetRepresentation("");//$NON-NLS-1$

sdOrthogonal2.setSeriesDefinitionIndex(1);

sd.getOrthogonalSampleData().add(sdOrthogonal2);

cwaBar.setSampleData(sd);

// X-Series

Series seCategory = SeriesImpl.create();

seCategory.setDataSet(categoryValues);

SeriesDefinition sdX = SeriesDefinitionImpl.create();

xAxisPrimary.getSeriesDefinitions().add(sdX);

sdX.getSeries().add(seCategory);
sdX.getSeriesPalette().shift(0);

// Y-Series

BarSeries bs1 = (BarSeries) BarSeriesImpl.create();

bs1.setDataSet(orthoValues1);

bs1.setStacked(true);

bs1.getLabel().setVisible(true);

bs1.setLabelPosition(Position.INSIDE_LITERAL);
bs1.setRiserOutline(ColorDefinitionImpl.TRANSPARENT());

BarSeries bs2 = (BarSeries) BarSeriesImpl.create();

bs2.setDataSet(orthoValues2);

bs2.setStacked(true);

bs2.setRiserOutline(ColorDefinitionImpl.TRANSPARENT());
bs2.getLabel().setVisible(true);

bs2.setLabelPosition(Position.INSIDE_LITERAL);

Trigger tr1 = TriggerImpl.create(TriggerCondition.ONMOUSEOVER_LITERAL,
ActionImpl.create(ActionType.SHOW_TOOLTIP_LITERAL,
TooltipValueImpl.create(200, "value")));
//Trigger tr2 = TriggerImpl.create(TriggerCondition.ONCLICK_LITERAL,
// ActionImpl.create(ActionType.URL_REDIRECT_LITERAL, URLValueImpl
// .create("https://www.google.com", null, "component",
// "value", "")));
bs1.setSeriesIdentifier( "Callback" ); //$NON-NLS-1$

Trigger tr2 = TriggerImpl.create( TriggerCondition.ONCLICK_LITERAL,
ActionImpl.create( ActionType.INVOKE_SCRIPT_LITERAL,
ScriptValueImpl.create( "alert('hello');" ) ) );


//Trigger tr3 =
TriggerImpl.create(TriggerCondition.ONMOUSEOVER_LITERAL,
ActionImpl.create(ActionType.SHOW_TOOLTIP_LITERAL,
TooltipValueImpl.create(200, null)));

//Trigger tr3 = (Trigger) EcoreUtil.copy(tr1);
//Trigger tr4 = (Trigger) EcoreUtil.copy(tr2);
bs1.getTriggers().add(tr1);
//bs1.getTriggers().add(tr2);

//bs2.getTriggers().add(tr3);
//bs2.getTriggers().add(tr4);

SeriesDefinition sdY = SeriesDefinitionImpl.create();

sdY.getSeriesPalette().shift(0);

yAxisPrimary.getSeriesDefinitions().add(sdY);

sdY.getSeries().add(bs1);

sdY.getSeries().add(bs2);

return cwaBar;

}

public static final Chart createMultipleYAxes( )
{
ChartWithAxes cwaBar = ChartWithAxesImpl.create( );
cwaBar.setType( "Line Chart" ); //$NON-NLS-1$
cwaBar.setSubType( "Overlay" ); //$NON-NLS-1$

// Plot
cwaBar.getBlock( ).setBackground( ColorDefinitionImpl.WHITE( ) );
cwaBar.getPlot( )
.getClientArea( )
.setBackground( ColorDefinitionImpl.create( 255, 255, 225 ) );

// Title
cwaBar.getTitle( )
.getLabel( )
.getCaption( )
.setValue( "Line Chart with Multiple Y Axis" );//$NON-NLS-1$

// Legend
Legend lg = cwaBar.getLegend( );
LineAttributes lia = lg.getOutline( );
lg.getText( ).getFont( ).setSize( 16 );
lia.setStyle( LineStyle.SOLID_LITERAL );
lg.getInsets( ).set( 10, 5, 0, 0 );
lg.getOutline( ).setVisible( false );
lg.setAnchor( Anchor.NORTH_LITERAL );

// X-Axis
Axis xAxisPrimary = cwaBar.getPrimaryBaseAxes( )[0];
//xAxisPrimary.setType( AxisType.LINEAR_LITERAL );
xAxisPrimary.setType( AxisType.LOGARITHMIC_LITERAL );
xAxisPrimary.getMajorGrid( ).setTickStyle( TickStyle.BELOW_LITERAL );
xAxisPrimary.getOrigin( ).setType( IntersectionType.MIN_LITERAL );

// Y-Axis
Axis yAxisPrimary = cwaBar.getPrimaryOrthogonalAxis( xAxisPrimary );
yAxisPrimary.getMajorGrid( ).setTickStyle( TickStyle.LEFT_LITERAL );

// Y-Axis (2)
Axis yAxis = AxisImpl.create( Axis.ORTHOGONAL );
yAxis.setType( AxisType.LINEAR_LITERAL );
yAxis.getMajorGrid( ).setTickStyle( TickStyle.RIGHT_LITERAL );
yAxis.setLabelPosition( Position.RIGHT_LITERAL );
xAxisPrimary.getAssociatedAxes( ).add( yAxis );

// Data Set
//TextDataSet categoryValues = TextDataSetImpl.create( new String[]{
// "March", "April", "May", "June", "July"}
);//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$//$NON -NLS-5$
NumberDataSet categoryValues = NumberDataSetImpl.create(new
double[]{1,2,3,4,5});

NumberDataSet orthoValues1 = NumberDataSetImpl.create( new double[]{
12.5, 19.6, 18.3, 13.2, 26.5
} );
NumberDataSet orthoValues2 = NumberDataSetImpl.create( new double[]{
22.7, 23.6, 38.3, 43.2, 40.5
} );

SampleData sd = DataFactory.eINSTANCE.createSampleData( );
BaseSampleData sdBase = DataFactory.eINSTANCE.createBaseSampleData( );
sdBase.setDataSetRepresentation( "" );//$NON-NLS-1$
sd.getBaseSampleData( ).add( sdBase );

OrthogonalSampleData sdOrthogonal1 =
DataFactory.eINSTANCE.createOrthogonalSampleData( );
sdOrthogonal1.setDataSetRepresentation( "" );//$NON-NLS-1$
sdOrthogonal1.setSeriesDefinitionIndex( 0 );
sd.getOrthogonalSampleData( ).add( sdOrthogonal1 );

OrthogonalSampleData sdOrthogonal2 =
DataFactory.eINSTANCE.createOrthogonalSampleData( );
sdOrthogonal2.setDataSetRepresentation( "" );//$NON-NLS-1$
sdOrthogonal2.setSeriesDefinitionIndex( 1 );
sd.getOrthogonalSampleData( ).add( sdOrthogonal2 );

cwaBar.setSampleData( sd );

// X-Series
Series seCategory = SeriesImpl.create( );
seCategory.setDataSet( categoryValues );

SeriesDefinition sdX = SeriesDefinitionImpl.create( );
xAxisPrimary.getSeriesDefinitions( ).add( sdX );
sdX.getSeries( ).add( seCategory );

// Y-Series (1)
LineSeries ls1 = (LineSeries) LineSeriesImpl.create( );
ls1.setSeriesIdentifier( "A Corp." );//$NON-NLS-1$
ls1.setDataSet( orthoValues1 );
ls1.getLineAttributes( ).setColor( ColorDefinitionImpl.CREAM( ) );
for ( int i = 0; i < ls1.getMarkers( ).size( ); i++ )
{
( (Marker) ls1.getMarkers( ).get( i ) ).setType(
MarkerType.TRIANGLE_LITERAL );
( (Marker) ls1.getMarkers( ).get( i ) ).setSize( 10 );
}
ls1.getLabel( ).setVisible( true );

SeriesDefinition sdY1 = SeriesDefinitionImpl.create( );
sdY1.getSeriesPalette( ).shift( -2 );
yAxisPrimary.getSeriesDefinitions( ).add( sdY1 );
sdY1.getSeries( ).add( ls1 );

// Y-Serires (2)
LineSeries ls2 = (LineSeries) LineSeriesImpl.create( );
ls2.setSeriesIdentifier( "B Corp." );//$NON-NLS-1$
ls2.setDataSet( orthoValues2 );
ls2.getLineAttributes( ).setColor( ColorDefinitionImpl.CREAM( ) );
for ( int i = 0; i < ls2.getMarkers( ).size( ); i++ )
{
( (Marker) ls2.getMarkers( ).get( i ) ).setType(
MarkerType.CIRCLE_LITERAL );
( (Marker) ls2.getMarkers( ).get( i ) ).setSize( 10 );
}
ls2.getLabel( ).setVisible( true );

SeriesDefinition sdY2 = SeriesDefinitionImpl.create( );
sdY2.getSeriesPalette( ).shift( -3 );
yAxis.getSeriesDefinitions( ).add( sdY2 );
sdY2.getSeries( ).add( ls2 );

return cwaBar;
}

}

Jason


Maghen Calinghee wrote:
> Hi,
>
> I'm using a chart viewer in SWT and i've used interactivity when the
> mouse is hover the chart to display a tooltip. The tooltip shows up but
> it does not evaluate the content. I've put an expression : row["myData"]
> in my report for the ToolTip content in the "Interactivity" part of my
> chart. On my SWT Chart Viewer, it shows this expression instead of the
> evaluation of this expression.
>
> Did I do something wrong in my SWT Chart Viewer?
>
> Maghen.
>
>
>
Re: Interactivity on a SWT Chart Viewer [message #368419 is a reply to message #368400] Thu, 28 May 2009 12:10 Go to previous message
Maghen Calinghee is currently offline Maghen CalingheeFriend
Messages: 23
Registered: July 2009
Junior Member
Hi Jason,

I've seen the attached classes and now i understand how it works. In fact
I just need to define an ActionRenderer to handle the "tooltip" actions.
And I need to set it on the RuntimeContext of the GeneratedChartState used
in my Chart Viewer.
GeneratedChartState.getRunTimeContext().setActionRenderer(ne w
MyActionRenderer());

Thanks you very much for your precious help!

Maghen.
Previous Topic:Pie Chart Legend Auto-Size?
Next Topic:how to handle multiple parms in query
Goto Forum:
  


Current Time: Thu Apr 25 11:24:45 GMT 2024

Powered by FUDForum. Page generated in 0.04444 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top