// package name: as default, start with complex package qa; // imports import complexlib.ComplexTestCase; import com.sun.star.uno.XInterface; import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.Type; import com.sun.star.uno.XComponentContext; import java.io.PrintWriter; import java.util.Hashtable; import com.sun.star.lang.*; import com.sun.star.beans.*; import com.sun.star.frame.*; import com.sun.star.chart.*; import com.sun.star.drawing.*; import com.sun.star.awt.*; import com.sun.star.util.XCloseable; import com.sun.star.util.CloseVetoException; import com.sun.star.chart2.XTitled; import com.sun.star.chart2.XTitle; import com.sun.star.chart2.XDataProvider; import com.sun.star.chart2.XDataReceiver; import com.sun.star.chart2.XFormattedString; import com.sun.star.chart2.XDiagramProvider; import com.sun.star.uno.AnyConverter; import com.sun.star.comp.helper.ComponentContext; /** * The following Complex Test will test the * com.sun.star.document.IndexedPropertyValues * service */ public class TestCaseOldAPI extends ComplexTestCase { // The name of the tested service private final String testedServiceName = "com.sun.star.chart.ChartDocument"; // The first of the mandatory functions: /** * Return the name of the test. * In this case it is the actual name of the service. * @return The tested service. */ public String getTestObjectName() { return testedServiceName; } // The second of the mandatory functions: return all test methods as an // array. There is only one test function in this example. /** * Return all test methods. * @return The test methods. */ public String[] getTestMethodNames() { return new String[] { "testChartType", "testTitle", "testSubTitle", "testDiagram", "testAxis", "testLegend", "testArea", "testAggregation", "testDataSeriesAndPoints", "testStatistics" }; } // ____________ public void before() { // change to "true" to get a view mbCreateView = false; if( mbCreateView ) mxChartModel = createDocument( "chart" ); else mxChartModel = createChartModel(); createFileDataSource( mxChartModel ); mxOldDoc = (XChartDocument) UnoRuntime.queryInterface( XChartDocument.class, mxChartModel ); } // ____________ public void after() { XCloseable xCloseable = (XCloseable) UnoRuntime.queryInterface( XCloseable.class, mxChartModel ); assure( "document is no XCloseable", xCloseable != null ); // do not close document if there exists a view if( ! mbCreateView ) { try { xCloseable.close( true ); } catch( CloseVetoException ex ) { failed( ex.getMessage() ); ex.printStackTrace( (PrintWriter)log ); } } } // ____________ public void testTitle() { try { // set title at new chart XTitled xTitled = (XTitled) UnoRuntime.queryInterface( XTitled.class, mxChartModel ); // set title via new API XTitle xTitle = setTitle( xTitled, "Sample", "@main-title" ); // printInterfacesAndServices( xTitle ); // get title via old API XShape xTitleShape = mxOldDoc.getTitle(); XPropertySet xTitleProp = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, xTitleShape ); // set property via old API if( xTitleProp != null ) { String aTitle = " Overwritten by Old API "; float fHeight = (float)17.0; xTitleProp.setPropertyValue( "String", aTitle ); xTitleProp.setPropertyValue( "CharHeight", new Float( fHeight ) ); float fNewHeight = AnyConverter.toFloat( xTitleProp.getPropertyValue( "CharHeight" ) ); assure( "Changing CharHeight via old API failed", fNewHeight == fHeight ); String aNewTitle = AnyConverter.toString( xTitleProp.getPropertyValue( "String" ) ); assure( "Property \"String\" failed", aNewTitle.equals( aTitle )); } } catch( Exception ex ) { failed( ex.getMessage() ); ex.printStackTrace( (PrintWriter)log ); } } // ____________ public void testSubTitle() { try { // trying back-querying (from old Wrapper to new Model) com.sun.star.chart2.XChartDocument xNewDoc = (com.sun.star.chart2.XChartDocument) UnoRuntime.queryInterface( com.sun.star.chart2.XChartDocument.class, mxOldDoc ); // set title at new chart XTitled xTitled = (XTitled) UnoRuntime.queryInterface( XTitled.class, xNewDoc.getDiagram() ); // set title via new API setTitle( xTitled, "Sub", "@sub-title" ); // get Property via old API XShape xTitleShape = mxOldDoc.getSubTitle(); XPropertySet xTitleProp = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, xTitleShape ); // set Property via old API if( xTitleProp != null ) { int nColor = 0x009acd; // DeepSkyBlue3 float fWeight = FontWeight.BOLD; xTitleProp.setPropertyValue( "CharColor", new Integer( nColor ) ); xTitleProp.setPropertyValue( "CharWeight", new Float( fWeight )); int nNewColor = AnyConverter.toInt( xTitleProp.getPropertyValue( "CharColor" ) ); assure( "Changing CharColor via old API failed", nNewColor == nColor ); float fNewWeight = AnyConverter.toFloat( xTitleProp.getPropertyValue( "CharWeight" ) ); assure( "Changing CharWeight via old API failed", fNewWeight == fWeight ); } } catch( Exception ex ) { failed( ex.getMessage() ); ex.printStackTrace( (PrintWriter)log ); } } // ------------ public void testDiagram() { try { // testing wall XDiagram xDia = mxOldDoc.getDiagram(); if( xDia != null ) { X3DDisplay xDisp = (X3DDisplay) UnoRuntime.queryInterface( X3DDisplay.class, xDia ); assure( "X3DDisplay not supported", xDisp != null ); XPropertySet xProp = xDisp.getWall(); if( xProp != null ) { // log.println( "Testing wall" ); int nColor = 0xffe1ff; // thistle1 xProp.setPropertyValue( "FillColor", new Integer( nColor ) ); int nNewColor = AnyConverter.toInt( xProp.getPropertyValue( "FillColor" ) ); assure( "Changing FillColor via old API failed", nNewColor == nColor ); } assure( "Wrong Diagram Type", xDia.getDiagramType().equals( "com.sun.star.chart.BarDiagram" )); } } catch( Exception ex ) { failed( ex.getMessage() ); ex.printStackTrace( (PrintWriter)log ); } } // ------------ public void testAxis() { try { XAxisYSupplier xYAxisSuppl = (XAxisYSupplier) UnoRuntime.queryInterface( XAxisYSupplier.class, mxOldDoc.getDiagram() ); assure( "Diagram is no y-axis supplier", xYAxisSuppl != null ); XPropertySet xProp = xYAxisSuppl.getYAxis(); assure( "No y-axis found", xProp != null ); double nNewMax = 12.3; double nNewOrigin = 2.7; xProp.setPropertyValue( "Max", new Double( nNewMax )); assure( "AutoMax is on", ! AnyConverter.toBoolean( xProp.getPropertyValue( "AutoMax" )) ); assure( "Maximum value invalid", approxEqual( AnyConverter.toDouble( xProp.getPropertyValue( "Max" )), nNewMax )); xProp.setPropertyValue( "AutoMin", new Boolean( true )); assure( "AutoMin is off", AnyConverter.toBoolean( xProp.getPropertyValue( "AutoMin" )) ); // missing: Min/Max, etc. is not always returning a double // Object oMin = xProp.getPropertyValue( "Min" ); // assure( "No Minimum set", AnyConverter.isDouble( oMin )); // log.println( "Minimum retrieved: " + AnyConverter.toDouble( oMin )); xProp.setPropertyValue( "Origin", new Double( nNewOrigin )); assure( "Origin invalid", approxEqual( AnyConverter.toDouble( xProp.getPropertyValue( "Origin" )), nNewOrigin )); xProp.setPropertyValue( "AutoOrigin", new Boolean( true )); assure( "AutoOrigin is off", AnyConverter.toBoolean( xProp.getPropertyValue( "AutoOrigin" )) ); xProp.setPropertyValue( "Logarithmic", new Boolean( true )); assure( "Scaling is not logarithmic", AnyConverter.toBoolean( xProp.getPropertyValue( "Logarithmic" )) ); xProp.setPropertyValue( "Logarithmic", new Boolean( false )); assure( "Scaling is not logarithmic", ! AnyConverter.toBoolean( xProp.getPropertyValue( "Logarithmic" )) ); int nNewColor = 0xcd853f; // peru xProp.setPropertyValue( "LineColor", new Integer( nNewColor )); assure( "Property LineColor", AnyConverter.toInt( xProp.getPropertyValue( "LineColor" )) == nNewColor ); float fNewCharHeight = (float)(16.0); xProp.setPropertyValue( "CharHeight", new Float( fNewCharHeight )); assure( "Property CharHeight", AnyConverter.toFloat( xProp.getPropertyValue( "CharHeight" )) == fNewCharHeight ); int nNewTextRotation = 700; // in 1/100 degrees xProp.setPropertyValue( "TextRotation", new Integer( nNewTextRotation )); assure( "Property TextRotation", AnyConverter.toInt( xProp.getPropertyValue( "TextRotation" )) == nNewTextRotation ); } catch( Exception ex ) { failed( ex.getMessage() ); ex.printStackTrace( (PrintWriter)log ); } } // ------------ public void testLegend() { XShape xLegend = mxOldDoc.getLegend(); assure( "No Legend returned", xLegend != null ); XPropertySet xLegendProp = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, xLegend ); assure( "Legend is no property set", xLegendProp != null ); try { ChartLegendPosition eNewPos = ChartLegendPosition.BOTTOM; xLegendProp.setPropertyValue( "Alignment", eNewPos ); assure( "Property Alignment", AnyConverter.toObject( new Type( ChartLegendPosition.class ), xLegendProp.getPropertyValue( "Alignment" )) == eNewPos ); } catch( Exception ex ) { failed( ex.getMessage() ); ex.printStackTrace( (PrintWriter)log ); } } // ------------ public void testArea() { XPropertySet xArea = mxOldDoc.getArea(); assure( "No Area", xArea != null ); try { int nColor = 0xf5fffa; // mint cream xArea.setPropertyValue( "FillColor", new Integer( nColor ) ); xArea.setPropertyValue( "FillStyle", FillStyle.SOLID ); int nNewColor = AnyConverter.toInt( xArea.getPropertyValue( "FillColor" ) ); assure( "Changing FillColor of Area failed", nNewColor == nColor ); } catch( Exception ex ) { failed( ex.getMessage() ); ex.printStackTrace( (PrintWriter)log ); } } // ------------ public void testChartType() { XMultiServiceFactory xFact = (XMultiServiceFactory) UnoRuntime.queryInterface( XMultiServiceFactory.class, mxOldDoc ); assure( "document is no factory", xFact != null ); try { String aMyServiceName = new String( "com.sun.star.chart.AreaDiagram" ); String aServices[] = xFact.getAvailableServiceNames(); boolean bServiceFound = false; for( int i = 0; i < aServices.length; ++i ) { if( aServices[ i ].equals( aMyServiceName )) { bServiceFound = true; break; } } assure( "getAvailableServiceNames did not return " + aMyServiceName, bServiceFound ); if( bServiceFound ) { XDiagram xDia = (XDiagram) UnoRuntime.queryInterface( XDiagram.class, xFact.createInstance( aMyServiceName )); assure( aMyServiceName + " could not be created", xDia != null ); mxOldDoc.setDiagram( xDia ); XPropertySet xDiaProp = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, xDia ); assure( "Diagram is no XPropertySet", xDiaProp != null ); xDiaProp.getPropertyValue( "Stacked" ); xDiaProp.setPropertyValue( "Stacked", new Boolean( true )); assure( "StackMode could not be set correctly", AnyConverter.toBoolean( xDiaProp.getPropertyValue( "Stacked" ))); } // reset to bar-chart aMyServiceName = new String( "com.sun.star.chart.BarDiagram" ); XDiagram xDia = (XDiagram) UnoRuntime.queryInterface( XDiagram.class, xFact.createInstance( aMyServiceName )); assure( aMyServiceName + " could not be created", xDia != null ); mxOldDoc.setDiagram( xDia ); } catch( Exception ex ) { failed( ex.getMessage() ); ex.printStackTrace( (PrintWriter)log ); } } // ------------ public void testAggregation() { // query to new type XChartDocument xDiaProv = (XChartDocument) UnoRuntime.queryInterface( XChartDocument.class, mxOldDoc ); assure( "query to new interface failed", xDiaProv != null ); com.sun.star.chart.XChartDocument xDoc = (com.sun.star.chart.XChartDocument) UnoRuntime.queryInterface( com.sun.star.chart.XChartDocument.class, xDiaProv ); assure( "querying back to old interface failed", xDoc != null ); } // ------------ public void testDataSeriesAndPoints() { try { XDiagram xDia = mxOldDoc.getDiagram(); assure( "Invalid Diagram", xDia != null ); XPropertySet xProp = xDia.getDataRowProperties( 1 ); assure( "No DataRowProperties for series 1 (0-based)", xProp != null ); // Gradient Gradient aGradient = new Gradient(); aGradient.Style = GradientStyle.LINEAR; aGradient.StartColor = 0xe0ffff; // light cyan aGradient.EndColor = 0xff8c00; // dark orange aGradient.Angle = 300; // 30 degrees aGradient.Border = 15; aGradient.XOffset = 0; aGradient.YOffset = 0; aGradient.StartIntensity = 100; aGradient.EndIntensity = 80; aGradient.StepCount = 23; xProp.setPropertyValue( "FillStyle", FillStyle.GRADIENT ); xProp.setPropertyValue( "FillGradient", aGradient ); Gradient aNewGradient = (Gradient) AnyConverter.toObject( new Type( Gradient.class ), xProp.getPropertyValue( "FillGradient" )); assure( "Gradient Style", aNewGradient.Style == aGradient.Style ); assure( "Gradient StartColor", aNewGradient.StartColor == aGradient.StartColor ); assure( "Gradient EndColor", aNewGradient.EndColor == aGradient.EndColor ); assure( "Gradient Angle", aNewGradient.Angle == aGradient.Angle ); assure( "Gradient Border", aNewGradient.Border == aGradient.Border ); assure( "Gradient XOffset", aNewGradient.XOffset == aGradient.XOffset ); assure( "Gradient YOffset", aNewGradient.YOffset == aGradient.YOffset ); assure( "Gradient StartIntensity", aNewGradient.StartIntensity == aGradient.StartIntensity ); assure( "Gradient EndIntensity", aNewGradient.EndIntensity == aGradient.EndIntensity ); assure( "Gradient StepCount", aNewGradient.StepCount == aGradient.StepCount ); // Hatch xProp = xDia.getDataPointProperties( 1, 1 ); assure( "No DataPointProperties for (1,1)", xProp != null ); Hatch aHatch = new Hatch(); aHatch.Style = HatchStyle.DOUBLE; aHatch.Color = 0xd2691e; // chocolate aHatch.Distance = 200; // 2 mm (?) aHatch.Angle = 230; // 23 degrees xProp.setPropertyValue( "FillHatch", aHatch ); xProp.setPropertyValue( "FillStyle", FillStyle.HATCH ); Hatch aNewHatch = (Hatch) AnyConverter.toObject( new Type( Hatch.class ), xProp.getPropertyValue( "FillHatch" )); assure( "Hatch Style", aNewHatch.Style == aHatch.Style ); assure( "Hatch Color", aNewHatch.Color == aHatch.Color ); assure( "Hatch Distance", aNewHatch.Distance == aHatch.Distance ); assure( "Hatch Angle", aNewHatch.Angle == aHatch.Angle ); } catch( Exception ex ) { failed( ex.getMessage() ); ex.printStackTrace( (PrintWriter)log ); } } // ------------ public void testStatistics() { try { XDiagram xDia = mxOldDoc.getDiagram(); assure( "Invalid Diagram", xDia != null ); XPropertySet xProp = xDia.getDataRowProperties( 0 ); assure( "No DataRowProperties for first series", xProp != null ); xProp.setPropertyValue( "MeanValue", new Boolean( true )); assure( "No MeanValue", AnyConverter.toBoolean( xProp.getPropertyValue( "MeanValue" )) ); } catch( Exception ex ) { failed( ex.getMessage() ); ex.printStackTrace( (PrintWriter)log ); } } // ================================================================================ private XModel mxChartModel; private XChartDocument mxOldDoc; private boolean mbCreateView; // -------------------------------------------------------------------------------- private void createFileDataSource( XModel xModel ) { XMultiServiceFactory xFactory = (XMultiServiceFactory) param.getMSF(); try { XDataProvider xDataProv = (XDataProvider) UnoRuntime.queryInterface( XDataProvider.class, xFactory.createInstance( "com.sun.star.comp.chart.FileDataProvider" )); XDataReceiver xRec = (XDataReceiver) UnoRuntime.queryInterface( XDataReceiver.class, xModel ); if( xDataProv != null && xRec != null ) { xRec.attachDataProvider( xDataProv ); String aURL = "file://" + System.getProperty( "user.dir" ) + System.getProperty( "file.separator" ) + "data.chd"; log.println( aURL ); xRec.setRangeRepresentation( aURL ); } } catch( Exception ex ) { failed( ex.getMessage() ); ex.printStackTrace( (PrintWriter)log ); } } // ------------ private XModel createDocument( String sDocType ) { XModel aResult = null; try { XComponentLoader aLoader = (XComponentLoader) UnoRuntime.queryInterface( XComponentLoader.class, ((XMultiServiceFactory)param.getMSF()).createInstance( "com.sun.star.frame.Desktop" ) ); aResult = (XModel) UnoRuntime.queryInterface( XModel.class, aLoader.loadComponentFromURL( "private:factory/" + sDocType, "_blank", 0, new PropertyValue[ 0 ] ) ); } catch( Exception ex ) { failed( ex.getMessage() ); ex.printStackTrace( (PrintWriter)log ); } return aResult; } // ------------ public XModel createChartModel() { XModel aResult = null; try { aResult = (XModel) UnoRuntime.queryInterface( XModel.class, ((XMultiServiceFactory)param.getMSF()).createInstance( "com.sun.star.comp.chart2.ChartModel" ) ); } catch( Exception ex ) { failed( ex.getMessage() ); ex.printStackTrace( (PrintWriter)log ); } return aResult; } // ------------ private XTitle setTitle( XTitled xTitleParent, String aTitle, String aId ) { XTitle xTitle = null; if( xTitleParent != null ) try { XMultiServiceFactory xFact = (XMultiServiceFactory)param.getMSF(); XMultiComponentFactory xCompFact = (XMultiComponentFactory) UnoRuntime.queryInterface( XMultiComponentFactory.class, xFact ); XFormattedString[] aStrings = new XFormattedString[ 2 ]; aStrings[0] = (XFormattedString) UnoRuntime.queryInterface( XFormattedString.class, xFact.createInstance( "com.sun.star.chart2.FormattedString" )); aStrings[1] = (XFormattedString) UnoRuntime.queryInterface( XFormattedString.class, xFact.createInstance( "com.sun.star.chart2.FormattedString" )); aStrings[0].setString( aTitle ); aStrings[1].setString( " Title" ); Hashtable aParams = new Hashtable(); aParams.put( "Identifier", aId ); xTitle = (XTitle) UnoRuntime.queryInterface( XTitle.class, xCompFact.createInstanceWithContext( "com.sun.star.chart2.Title", new ComponentContext( aParams, getComponentContext( xFact ) ))); xTitle.setText( aStrings ); XPropertySet xTitleProp = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, xTitle ); xTitleProp.setPropertyValue( "FillColor", new Integer( 0xfff8dc )); // cornsilk1 xTitleParent.setTitle( xTitle ); } catch( Exception ex ) { failed( ex.getMessage() ); ex.printStackTrace( (PrintWriter)log ); } return xTitle; } // ------------ private XComponentContext getComponentContext( XMultiServiceFactory xFact ) { XComponentContext xResult = null; XPropertySet xProp = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, xFact ); if( xProp != null ) try { xResult = (XComponentContext) AnyConverter.toObject( new Type( XComponentContext.class ), xProp.getPropertyValue( "DefaultContext" ) ); } catch( Exception ex ) { failed( ex.getMessage() ); ex.printStackTrace( (PrintWriter)log ); } return xResult; } // ------------ private void printInterfacesAndServices( Object oObj ) { log.println( "Services:" ); util.dbg.getSuppServices( oObj ); log.println( "Interfaces:" ); util.dbg.printInterfaces( (XInterface)oObj, true ); } // ------------ /// see rtl/math.hxx private boolean approxEqual( double a, double b ) { if( a == b ) return true; double x = a - b; return (x < 0.0 ? -x : x) < ((a < 0.0 ? -a : a) * (1.0 / (16777216.0 * 16777216.0))); } }