INTEGRATION: CWS sdk02 (1.1.2); FILE ADDED
2003/05/09 10:36:47 jsc 1.1.2.1: #109045# insert new and remove example zip file
This commit is contained in:
370
odk/examples/DevelopersGuide/Charts/CalcHelper.java
Normal file
370
odk/examples/DevelopersGuide/Charts/CalcHelper.java
Normal file
@@ -0,0 +1,370 @@
|
||||
// __________ Imports __________
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
// base classes
|
||||
import com.sun.star.uno.XInterface;
|
||||
import com.sun.star.uno.UnoRuntime;
|
||||
import com.sun.star.lang.*;
|
||||
|
||||
// factory for creating components
|
||||
import com.sun.star.comp.servicemanager.ServiceManager;
|
||||
import com.sun.star.lang.XMultiServiceFactory;
|
||||
import com.sun.star.bridge.XUnoUrlResolver;
|
||||
import com.sun.star.uno.XNamingService;
|
||||
import com.sun.star.frame.XDesktop;
|
||||
import com.sun.star.frame.XComponentLoader;
|
||||
|
||||
// property access
|
||||
import com.sun.star.beans.*;
|
||||
|
||||
// container access
|
||||
import com.sun.star.container.*;
|
||||
|
||||
// application specific classes
|
||||
import com.sun.star.sheet.*;
|
||||
import com.sun.star.table.*;
|
||||
import com.sun.star.chart.*;
|
||||
|
||||
import com.sun.star.document.XEmbeddedObjectSupplier;
|
||||
import com.sun.star.frame.XModel;
|
||||
import com.sun.star.frame.XController;
|
||||
|
||||
// base graphics things
|
||||
import com.sun.star.awt.Point;
|
||||
import com.sun.star.awt.Size;
|
||||
import com.sun.star.awt.Rectangle;
|
||||
|
||||
// Exceptions
|
||||
import com.sun.star.uno.RuntimeException;
|
||||
import com.sun.star.container.NoSuchElementException;
|
||||
import com.sun.star.beans.UnknownPropertyException;
|
||||
import com.sun.star.lang.IndexOutOfBoundsException;
|
||||
|
||||
// __________ Implementation __________
|
||||
|
||||
/** Helper for accessing a calc document
|
||||
@author Björn Milcke
|
||||
*/
|
||||
public class CalcHelper
|
||||
{
|
||||
public CalcHelper( XSpreadsheetDocument aDoc )
|
||||
{
|
||||
maSpreadSheetDoc = aDoc;
|
||||
initSpreadSheet();
|
||||
}
|
||||
|
||||
// ____________________
|
||||
|
||||
public XSpreadsheet getChartSheet() throws RuntimeException
|
||||
{
|
||||
XNameAccess aSheetsNA = (XNameAccess) UnoRuntime.queryInterface(
|
||||
XNameAccess.class, maSpreadSheetDoc.getSheets() );
|
||||
|
||||
XSpreadsheet aSheet = null;
|
||||
try
|
||||
{
|
||||
aSheet = (XSpreadsheet) UnoRuntime.queryInterface(
|
||||
XSpreadsheet.class, aSheetsNA.getByName( msChartSheetName ) );
|
||||
}
|
||||
catch( NoSuchElementException ex )
|
||||
{
|
||||
System.out.println( "Couldn't find sheet with name " + msChartSheetName + ": " + ex );
|
||||
}
|
||||
catch( Exception ex )
|
||||
{}
|
||||
|
||||
return aSheet;
|
||||
}
|
||||
|
||||
// ____________________
|
||||
|
||||
public XSpreadsheet getDataSheet() throws RuntimeException
|
||||
{
|
||||
XNameAccess aSheetsNA = (XNameAccess) UnoRuntime.queryInterface(
|
||||
XNameAccess.class, maSpreadSheetDoc.getSheets() );
|
||||
|
||||
XSpreadsheet aSheet = null;
|
||||
if( aSheetsNA != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
aSheet = (XSpreadsheet) UnoRuntime.queryInterface(
|
||||
XSpreadsheet.class, aSheetsNA.getByName( msDataSheetName ) );
|
||||
}
|
||||
catch( NoSuchElementException ex )
|
||||
{
|
||||
System.out.println( "Couldn't find sheet with name " + msDataSheetName + ": " + ex );
|
||||
}
|
||||
catch( Exception ex )
|
||||
{}
|
||||
}
|
||||
|
||||
return aSheet;
|
||||
}
|
||||
|
||||
// ____________________
|
||||
|
||||
/** Insert a chart using the given name as name of the OLE object and the range as correspoding
|
||||
range of data to be used for rendering. The chart is placed in the sheet for charts at
|
||||
position aUpperLeft extending as large as given in aExtent.
|
||||
|
||||
The service name must be the name of a diagram service that can be instantiated via the
|
||||
factory of the chart document
|
||||
*/
|
||||
public XChartDocument insertChart(
|
||||
String sChartName,
|
||||
CellRangeAddress aRange,
|
||||
Point aUpperLeft,
|
||||
Size aExtent,
|
||||
String sChartServiceName )
|
||||
{
|
||||
XChartDocument aResult = null;
|
||||
XTableChartsSupplier aSheet;
|
||||
|
||||
// get the sheet to insert the chart
|
||||
try
|
||||
{
|
||||
aSheet = (XTableChartsSupplier) UnoRuntime.queryInterface(
|
||||
XTableChartsSupplier.class, getChartSheet() );
|
||||
}
|
||||
catch( Exception ex )
|
||||
{
|
||||
System.out.println( "Sheet not found" + ex );
|
||||
return aResult;
|
||||
}
|
||||
|
||||
XTableCharts aChartCollection = aSheet.getCharts();
|
||||
XNameAccess aChartCollectionNA = (XNameAccess) UnoRuntime.queryInterface(
|
||||
XNameAccess.class, aChartCollection );
|
||||
|
||||
if( aChartCollectionNA != null &&
|
||||
! aChartCollectionNA.hasByName( sChartName ) )
|
||||
{
|
||||
Rectangle aRect = new Rectangle( aUpperLeft.X, aUpperLeft.Y, aExtent.Width, aExtent.Height );
|
||||
|
||||
CellRangeAddress[] aAddresses = new CellRangeAddress[ 1 ];
|
||||
aAddresses[ 0 ] = aRange;
|
||||
|
||||
// first bool: ColumnHeaders
|
||||
// second bool: RowHeaders
|
||||
aChartCollection.addNewByName( sChartName, aRect, aAddresses, true, false );
|
||||
|
||||
try
|
||||
{
|
||||
XTableChart aTableChart = (XTableChart) UnoRuntime.queryInterface(
|
||||
XTableChart.class, aChartCollectionNA.getByName( sChartName ));
|
||||
|
||||
// the table chart is an embedded object which contains the chart document
|
||||
aResult = (XChartDocument) UnoRuntime.queryInterface(
|
||||
XChartDocument.class,
|
||||
((XEmbeddedObjectSupplier) UnoRuntime.queryInterface(
|
||||
XEmbeddedObjectSupplier.class,
|
||||
aTableChart )).getEmbeddedObject());
|
||||
|
||||
// create a diagram via the factory and set this as new diagram
|
||||
aResult.setDiagram(
|
||||
(XDiagram) UnoRuntime.queryInterface(
|
||||
XDiagram.class,
|
||||
((XMultiServiceFactory) UnoRuntime.queryInterface(
|
||||
XMultiServiceFactory.class,
|
||||
aResult )).createInstance( sChartServiceName )));
|
||||
}
|
||||
catch( NoSuchElementException ex )
|
||||
{
|
||||
System.out.println( "Couldn't find chart with name " + sChartName + ": " + ex );
|
||||
}
|
||||
catch( Exception ex )
|
||||
{}
|
||||
}
|
||||
|
||||
return aResult;
|
||||
}
|
||||
|
||||
// ____________________
|
||||
|
||||
/** Fill a rectangular range with random numbers.
|
||||
The first column has increasing values
|
||||
*/
|
||||
public XCellRange insertRandomRange( int nColumnCount, int nRowCount )
|
||||
{
|
||||
XCellRange aRange = null;
|
||||
|
||||
// get the sheet to insert the chart
|
||||
try
|
||||
{
|
||||
XSpreadsheet aSheet = getDataSheet();
|
||||
XCellRange aSheetRange = (XCellRange) UnoRuntime.queryInterface( XCellRange.class, aSheet );
|
||||
|
||||
aRange = aSheetRange.getCellRangeByPosition(
|
||||
0, 0,
|
||||
nColumnCount - 1, nRowCount - 1 );
|
||||
|
||||
int nCol, nRow;
|
||||
double fBase = 0.0;
|
||||
double fRange = 10.0;
|
||||
double fValue;
|
||||
Random aGenerator = new Random();
|
||||
|
||||
|
||||
for( nCol = 0; nCol < nColumnCount; nCol++ )
|
||||
{
|
||||
if( 0 == nCol )
|
||||
{
|
||||
(aSheet.getCellByPosition( nCol, 0 )).setFormula( "X" );
|
||||
}
|
||||
else
|
||||
{
|
||||
(aSheet.getCellByPosition( nCol, 0 )).setFormula( "Random " + nCol );
|
||||
}
|
||||
|
||||
for( nRow = 1; nRow < nRowCount; nRow++ )
|
||||
{
|
||||
if( 0 == nCol )
|
||||
{
|
||||
// x values: ascending numbers
|
||||
fValue = (double)nRow + aGenerator.nextDouble();
|
||||
}
|
||||
else
|
||||
{
|
||||
fValue = fBase + ( aGenerator.nextGaussian() * fRange );
|
||||
}
|
||||
|
||||
// put value into cell
|
||||
|
||||
// note: getCellByPosition is a method at ...table.XCellRange which
|
||||
// the XSpreadsheet inherits via ...sheet.XSheetCellRange
|
||||
(aSheet.getCellByPosition( nCol, nRow )).setValue( fValue );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
catch( Exception ex )
|
||||
{
|
||||
System.out.println( "Sheet not found" + ex );
|
||||
}
|
||||
|
||||
return aRange;
|
||||
}
|
||||
|
||||
// ____________________
|
||||
|
||||
public XCellRange insertFormulaRange( int nColumnCount, int nRowCount )
|
||||
{
|
||||
XCellRange aRange = null;
|
||||
|
||||
// get the sheet to insert the chart
|
||||
try
|
||||
{
|
||||
XSpreadsheet aSheet = getDataSheet();
|
||||
XCellRange aSheetRange = (XCellRange) UnoRuntime.queryInterface( XCellRange.class, aSheet );
|
||||
|
||||
aRange = aSheetRange.getCellRangeByPosition(
|
||||
0, 0,
|
||||
nColumnCount - 1, nRowCount - 1 );
|
||||
|
||||
int nCol, nRow;
|
||||
double fValue;
|
||||
double fFactor = 2.0 * java.lang.Math.PI / (double)(nRowCount - 1);
|
||||
String aFormula;
|
||||
|
||||
for( nCol = 0; nCol < nColumnCount; nCol++ )
|
||||
{
|
||||
for( nRow = 0; nRow < nRowCount; nRow++ )
|
||||
{
|
||||
if( 0 == nCol )
|
||||
{
|
||||
// x values: ascending numbers
|
||||
fValue = (double)nRow * fFactor;
|
||||
(aSheet.getCellByPosition( nCol, nRow )).setValue( fValue );
|
||||
}
|
||||
else
|
||||
{
|
||||
aFormula = new String( "=" );
|
||||
if( nCol % 2 == 0 )
|
||||
aFormula += "SIN";
|
||||
else
|
||||
aFormula += "COS";
|
||||
aFormula += "(INDIRECT(ADDRESS(" + (nRow + 1) + ";1)))+RAND()*0.2";
|
||||
(aSheet.getCellByPosition( nCol, nRow )).setFormula( aFormula );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
catch( Exception ex )
|
||||
{
|
||||
System.out.println( "Sheet not found" + ex );
|
||||
}
|
||||
|
||||
return aRange;
|
||||
}
|
||||
|
||||
// ____________________
|
||||
|
||||
/** Bring the sheet containing charts visually to the foreground
|
||||
*/
|
||||
public void raiseChartSheet()
|
||||
{
|
||||
((XSpreadsheetView) UnoRuntime.queryInterface(
|
||||
XSpreadsheetView.class,
|
||||
((XModel) UnoRuntime.queryInterface(
|
||||
XModel.class,
|
||||
maSpreadSheetDoc )).getCurrentController()) ).setActiveSheet( getChartSheet() );
|
||||
}
|
||||
|
||||
|
||||
// __________ private members and methods __________
|
||||
|
||||
private final String msDataSheetName = "Data";
|
||||
private final String msChartSheetName = "Chart";
|
||||
|
||||
private XSpreadsheetDocument maSpreadSheetDoc;
|
||||
|
||||
|
||||
// ____________________
|
||||
|
||||
/** create two sheets, one for data and one for charts in the document
|
||||
*/
|
||||
private void initSpreadSheet()
|
||||
{
|
||||
if( maSpreadSheetDoc != null )
|
||||
{
|
||||
XSpreadsheets aSheets = maSpreadSheetDoc.getSheets();
|
||||
XNameContainer aSheetsNC = (XNameContainer) UnoRuntime.queryInterface(
|
||||
XNameContainer.class, aSheets );
|
||||
XIndexAccess aSheetsIA = (XIndexAccess) UnoRuntime.queryInterface(
|
||||
XIndexAccess.class, aSheets );
|
||||
|
||||
if( aSheets != null &&
|
||||
aSheetsNC != null &&
|
||||
aSheetsIA != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
// remove all sheets except one
|
||||
for( int i = aSheetsIA.getCount() - 1; i > 0; i-- )
|
||||
{
|
||||
aSheetsNC.removeByName(
|
||||
( (XNamed) UnoRuntime.queryInterface(
|
||||
XNamed.class, aSheetsIA.getByIndex( i ) )).getName() );
|
||||
}
|
||||
|
||||
XNamed aFirstSheet = (XNamed) UnoRuntime.queryInterface(
|
||||
XNamed.class,
|
||||
aSheetsIA.getByIndex( 0 ));
|
||||
|
||||
// first sheet becomes data sheet
|
||||
aFirstSheet.setName( msDataSheetName );
|
||||
|
||||
// second sheet becomes chart sheet
|
||||
aSheets.insertNewByName( msChartSheetName, (short)1 );
|
||||
}
|
||||
catch( Exception ex )
|
||||
{
|
||||
System.out.println( "Couldn't initialize Spreadsheet Document: " + ex );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
145
odk/examples/DevelopersGuide/Charts/ChartHelper.java
Normal file
145
odk/examples/DevelopersGuide/Charts/ChartHelper.java
Normal file
@@ -0,0 +1,145 @@
|
||||
// __________ Imports __________
|
||||
|
||||
|
||||
// base classes
|
||||
import com.sun.star.uno.XInterface;
|
||||
import com.sun.star.uno.UnoRuntime;
|
||||
import com.sun.star.lang.*;
|
||||
|
||||
// factory for creating components
|
||||
import com.sun.star.lang.XMultiServiceFactory;
|
||||
|
||||
// property access
|
||||
import com.sun.star.beans.*;
|
||||
|
||||
// container access
|
||||
import com.sun.star.container.*;
|
||||
|
||||
// application specific classes
|
||||
import com.sun.star.chart.XChartDocument;
|
||||
import com.sun.star.chart.XDiagram;
|
||||
import com.sun.star.drawing.*;
|
||||
import com.sun.star.frame.XModel;
|
||||
|
||||
// base graphics things
|
||||
import com.sun.star.awt.Point;
|
||||
import com.sun.star.awt.Size;
|
||||
|
||||
// Exceptions
|
||||
import com.sun.star.uno.RuntimeException;
|
||||
import com.sun.star.container.NoSuchElementException;
|
||||
import com.sun.star.beans.UnknownPropertyException;
|
||||
import com.sun.star.lang.IndexOutOfBoundsException;
|
||||
|
||||
// __________ Implementation __________
|
||||
|
||||
/** Helper for creating an OLE chart
|
||||
@author Björn Milcke
|
||||
*/
|
||||
public class ChartHelper
|
||||
{
|
||||
public ChartHelper( XModel aContainerDoc )
|
||||
{
|
||||
maContainerDocument = aContainerDoc;
|
||||
}
|
||||
|
||||
// ____________________
|
||||
|
||||
public XChartDocument insertOLEChart(
|
||||
String sChartName,
|
||||
Point aUpperLeft,
|
||||
Size aExtent,
|
||||
String sChartServiceName )
|
||||
{
|
||||
XChartDocument aResult = null;
|
||||
|
||||
XShapes aPage = null;
|
||||
|
||||
// try interface for multiple pages in a document
|
||||
XDrawPagesSupplier aSupplier = (XDrawPagesSupplier) UnoRuntime.queryInterface(
|
||||
XDrawPagesSupplier.class, maContainerDocument );
|
||||
|
||||
if( aSupplier != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
// get first page
|
||||
aPage = (XShapes) UnoRuntime.queryInterface(
|
||||
XShapes.class, aSupplier.getDrawPages().getByIndex( 0 ) );
|
||||
}
|
||||
catch( Exception ex )
|
||||
{
|
||||
System.out.println( "First page not found in shape collection: " + ex );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// try interface for single draw page (e.g. spreadsheet)
|
||||
XDrawPageSupplier aOnePageSupplier = (XDrawPageSupplier) UnoRuntime.queryInterface(
|
||||
XDrawPageSupplier.class, maContainerDocument );
|
||||
|
||||
if( aOnePageSupplier != null )
|
||||
{
|
||||
aPage = (XShapes) UnoRuntime.queryInterface(
|
||||
XShapes.class, aOnePageSupplier.getDrawPage());
|
||||
}
|
||||
}
|
||||
|
||||
if( aPage != null )
|
||||
{
|
||||
XMultiServiceFactory aFact = (XMultiServiceFactory) UnoRuntime.queryInterface(
|
||||
XMultiServiceFactory.class, maContainerDocument );
|
||||
|
||||
if( aFact != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
// create an OLE shape
|
||||
XShape aShape = (XShape) UnoRuntime.queryInterface(
|
||||
XShape.class,
|
||||
aFact.createInstance( "com.sun.star.drawing.OLE2Shape" ));
|
||||
|
||||
// insert the shape into the page
|
||||
aPage.add( aShape );
|
||||
aShape.setPosition( aUpperLeft );
|
||||
aShape.setSize( aExtent );
|
||||
|
||||
// make the OLE shape a chart
|
||||
XPropertySet aShapeProp = (XPropertySet) UnoRuntime.queryInterface(
|
||||
XPropertySet.class, aShape );
|
||||
if( aShapeProp != null )
|
||||
{
|
||||
// set the class id for charts
|
||||
aShapeProp.setPropertyValue( "CLSID", msChartClassID );
|
||||
|
||||
// retrieve the chart document as model of the OLE shape
|
||||
aResult = (XChartDocument) UnoRuntime.queryInterface(
|
||||
XChartDocument.class,
|
||||
aShapeProp.getPropertyValue( "Model" ));
|
||||
|
||||
// create a diagram via the factory and set this as new diagram
|
||||
aResult.setDiagram(
|
||||
(XDiagram) UnoRuntime.queryInterface(
|
||||
XDiagram.class,
|
||||
((XMultiServiceFactory) UnoRuntime.queryInterface(
|
||||
XMultiServiceFactory.class,
|
||||
aResult )).createInstance( sChartServiceName )));
|
||||
}
|
||||
}
|
||||
catch( Exception ex )
|
||||
{
|
||||
System.out.println( "Couldn't change the OLE shape into a chart: " + ex );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return aResult;
|
||||
}
|
||||
|
||||
|
||||
// __________ private members and methods __________
|
||||
|
||||
private final String msChartClassID = "12dcae26-281f-416f-a234-c3086127382e";
|
||||
|
||||
private XModel maContainerDocument;
|
||||
}
|
||||
Reference in New Issue
Block a user