summaryrefslogtreecommitdiff
path: root/odk/examples/java/ToDo/ToDo.java
diff options
context:
space:
mode:
authorBertram Nolte <bnolte@openoffice.org>2001-09-18 14:13:37 +0000
committerBertram Nolte <bnolte@openoffice.org>2001-09-18 14:13:37 +0000
commit2e2b262e69b07a1165c7eed3184ae205723e5770 (patch)
treecb3d20400207ec3d839b289478d484032502aa4f /odk/examples/java/ToDo/ToDo.java
parentac50b4f05b63aeafbebf98c5bfadf9d9639699a7 (diff)
Added new Java example.
Diffstat (limited to 'odk/examples/java/ToDo/ToDo.java')
-rw-r--r--odk/examples/java/ToDo/ToDo.java833
1 files changed, 833 insertions, 0 deletions
diff --git a/odk/examples/java/ToDo/ToDo.java b/odk/examples/java/ToDo/ToDo.java
new file mode 100644
index 000000000000..81e33589f8aa
--- /dev/null
+++ b/odk/examples/java/ToDo/ToDo.java
@@ -0,0 +1,833 @@
+import com.sun.star.comp.loader.FactoryHelper;
+import com.sun.star.lang.XMultiServiceFactory;
+import com.sun.star.lang.XSingleServiceFactory;
+import com.sun.star.registry.XRegistryKey;
+import com.sun.star.uno.UnoRuntime;
+import com.sun.star.sheet.XSpreadsheetDocument;
+import com.sun.star.sheet.XSpreadsheet;
+import com.sun.star.container.XIndexAccess;
+import com.sun.star.table.XCellRange;
+import com.sun.star.table.XCell;
+import com.sun.star.lang.XTypeProvider;
+import com.sun.star.uno.Type;
+import com.sun.star.text.XTextRange;
+import com.sun.star.sheet.XCellRangeMovement;
+import com.sun.star.table.CellAddress;
+import com.sun.star.table.CellRangeAddress;
+import com.sun.star.table.XColumnRowRange;
+import com.sun.star.sheet.XFunctionAccess;
+import com.sun.star.uno.XInterface;
+import com.sun.star.beans.XPropertySet;
+import com.sun.star.text.XSimpleText;
+import com.sun.star.text.XTextCursor;
+import com.sun.star.text.XText;
+import com.sun.star.text.XTextField;
+
+// ONLY FOR TESTING BEGIN
+//import com.sun.star.container.XSet;
+//import org.OpenOffice.XInstanceInspector;
+// ONLY FOR TESTING END
+
+import java.util.GregorianCalendar;
+import java.util.Calendar;
+import java.util.Vector;
+import java.util.Arrays;
+
+import org.OpenOffice.XToDo;
+
+/** This outer class provides an inner class to implement the service
+ * description, a method to instantiate the
+ * component on demand (__getServiceFactory()), and a method to give
+ * information about the component (__writeRegistryServiceInfo()).
+ * @author Bertram Nolte
+ */
+public class ToDo {
+ /** This inner class provides the component as a concrete implementation
+ * of the service description. It implements the needed interfaces.
+ * @implements XToDo
+ */
+ static public class _ToDo implements XToDo, XTypeProvider {
+ static private final String __serviceName = "org.OpenOffice.ToDo";
+
+ static private final int INT_COLUMN_FEATURE = 0;
+ static private final int INT_COLUMN_COMMENT = 1;
+ static private final int INT_COLUMN_NEEDEDDAYS = 2;
+ static private final int INT_COLUMN_STARTDATE = 3;
+ static private final int INT_COLUMN_START_DAY_OF_WEEK = 4;
+ static private final int INT_COLUMN_ENDDATE = 5;
+ static private final int INT_COLUMN_END_DAY_OF_WEEK = 6;
+ static private final int INT_COLUMN_DUEDATE = 7;
+ static private final int INT_COLUMN_STATUS = 8;
+
+ static private final int INT_ROW_FROM = 8;
+ //static private final int INT_ROW_TO = 56;
+
+ static private final int INT_ROW_HOLIDAYS_START = 3;
+ static private final int INT_COLUMN_HOLIDAYS_START = 10;
+
+ static private final String STRING_SEPARATOR = ".";
+
+ private XMultiServiceFactory xmultiservicefactory;
+
+ /** Memorizes the multi service factory.
+ * @param xMultiServiceFactory The multi service factory.
+ */
+ public _ToDo(XMultiServiceFactory xMultiServiceFactory) {
+ xmultiservicefactory = xMultiServiceFactory;
+ }
+
+ /** For every bug/feature listed in a spreadsheet document this method calculates
+ * the start date, day of week of the start date, the end date and the day of week
+ * of the end date. All calculations are dependent on the values of "Needed Days",
+ * "Due Date" and "Status". The columns "Needed Days" and "Status" are mandatory.
+ * The first feature/bug should be placed in row nine. The date to start the
+ * calculation should be placed in cell C6. The private holidays should be placed
+ * in cell K4/K5 and below.
+ * All rows will be calculated up to the first empty cell in the first column.
+ * If a cell in the column "Due Date" will be colored red, you should take a look
+ * at your entries.
+ * @param aInstance Spreadsheet document.
+ * @throws com.sun.star.uno.RuntimeException This exception could occur at every interface method.
+ */
+ public void recalc( Object aInstance )
+ throws com.sun.star.uno.RuntimeException {
+ try {
+ // Querying for the interface XSpreadsheetDocument
+ XSpreadsheetDocument xspreadsheetdocument = (XSpreadsheetDocument)
+ UnoRuntime.queryInterface(XSpreadsheetDocument.class, aInstance );
+
+ // Querying for the interface XIndexAccess
+ XIndexAccess xindexaccess = ( XIndexAccess )
+ UnoRuntime.queryInterface( XIndexAccess.class,
+ xspreadsheetdocument.getSheets() );
+
+ // Getting the first XSpreadsheet
+ XSpreadsheet xspreadsheet = (XSpreadsheet) xindexaccess.getByIndex( 0 );
+
+ // Querying for the interface XCellRange on the XSpeadsheet
+ XCellRange xcellrange = ( XCellRange )
+ UnoRuntime.queryInterface( XCellRange.class, xspreadsheet );
+
+ /* Getting the gregorian calendar with the date on which to start the
+ calculation */
+ GregorianCalendar gregoriancalendarAbsoluteStartDate =
+ this.getGregorianCalendarFromString(
+ this.getStringFromCell( xcellrange, 5, 2 ) );
+ gregoriancalendarAbsoluteStartDate.add( Calendar.DATE, -1 );
+
+ // Set the start date with the absolute start date
+ GregorianCalendar gregoriancalendarStartDate =
+ (GregorianCalendar) gregoriancalendarAbsoluteStartDate.clone();
+
+ /* Creating the service FunctionAccess, which allows generic access to
+ all spreadsheet functions */
+ Object objectFunctionAccess = xmultiservicefactory.createInstance(
+ "com.sun.star.sheet.FunctionAccess" );
+
+ // Querying for the interface XFunctionAccess on service FunctionAccess
+ XFunctionAccess xfunctionaccess = (XFunctionAccess)
+ UnoRuntime.queryInterface(XFunctionAccess.class, objectFunctionAccess );
+
+ // Creating vector for holidays
+ Vector vectorHolidays = new Vector();
+
+ // Get the Official Holidays
+ this.getOfficialHolidays( vectorHolidays, xcellrange,
+ xfunctionaccess, gregoriancalendarStartDate.get( Calendar.YEAR ) );
+
+ // Get the private holidays
+ this.getPrivateHolidays( vectorHolidays, xcellrange,
+ xfunctionaccess );
+
+ // Getting the object array of holidays
+ Object[] objectSortedHolidays = vectorHolidays.toArray();
+
+ // Sorting the holidays
+ Arrays.sort( objectSortedHolidays );
+
+ // Collect the Official Holidays and the private holidays
+ Object [][]objectHolidays = new Object[][] { objectSortedHolidays };
+
+ // Row index
+ int intRowTo = this.INT_ROW_FROM - 1;
+
+ // Getting the feature of the first cell
+ String stringFeature = this.getStringFromCell( xcellrange,
+ intRowTo + 1, this.INT_COLUMN_FEATURE );
+
+ // Determine the last row with an entry in the first column
+ while ( ( stringFeature != null ) && ( !stringFeature.equals( "" ) ) ) {
+ intRowTo++;
+ stringFeature = this.getStringFromCell( xcellrange,
+ intRowTo + 1, this.INT_COLUMN_FEATURE );
+ }
+
+ // Setting the last row to be calculated
+ final int INT_ROW_TO = intRowTo + 1;
+
+ // Deleting cells which will be recalculated
+ for ( int intRow = this.INT_ROW_FROM; intRow < INT_ROW_TO + 5; intRow++ )
+ {
+ for ( int intColumn = this.INT_COLUMN_STARTDATE;
+ intColumn <= this.INT_COLUMN_END_DAY_OF_WEEK; intColumn++ )
+ {
+ this.setStringToCell( xcellrange, intRow, intColumn, "" );
+ }
+ }
+
+ /* Clearing the background color of the due date cells and setting the
+ the hyperlink to the bugtracker */
+ for ( int intRow = this.INT_ROW_FROM; intRow < INT_ROW_TO; intRow++ ) {
+
+ // Querying for the interface XPropertySet for the cell providing the due date
+ XPropertySet xpropertyset = ( XPropertySet )
+ UnoRuntime.queryInterface( XPropertySet.class,
+ xcellrange.getCellByPosition( this.INT_COLUMN_DUEDATE,
+ intRow ) );
+
+ // Changing the background color of the cell to white
+ xpropertyset.setPropertyValue( "CellBackColor", new Integer( 16777215 ) );
+
+ // Getting the cell of the bug id
+ XCell xcell = xcellrange.getCellByPosition( this.INT_COLUMN_FEATURE, intRow );
+
+ // Querying for the interface XSimpleText
+ XSimpleText xsimpletext = ( XSimpleText )
+ UnoRuntime.queryInterface( XSimpleText.class, xcell );
+
+ // Getting the text cursor
+ XTextCursor xtextcursor = xsimpletext.createTextCursor();
+
+ // Querying for the interface XTextRange
+ XTextRange xtextrange = ( XTextRange )
+ UnoRuntime.queryInterface( XTextRange.class, xtextcursor );
+
+ // Getting the bug ID from the cell
+ String stringBugID = xtextrange.getString();
+
+ if ( !stringBugID.startsWith( "http://webserver2/Bugtracker/Source/Body_ReportDetail.asp?ID=" ) ) {
+ String stringBugIDLink = "http://webserver2/Bugtracker/Source/Body_ReportDetail.asp?ID=" + stringBugID;
+
+ // Querying for the interface XMultiServiceFactory
+ XMultiServiceFactory xmultiservicefactoryTextField = (XMultiServiceFactory)
+ UnoRuntime.queryInterface(XMultiServiceFactory.class, aInstance );
+
+ // Creating an instance of the text field URL
+ Object objectTextField = xmultiservicefactoryTextField.createInstance( "com.sun.star.text.TextField.URL" );
+
+ // Querying for the interface XTextField
+ XTextField xtextfield = ( XTextField )
+ UnoRuntime.queryInterface( XTextField.class, objectTextField );
+
+ // Querying for the interface XPropertySet
+ XPropertySet xpropertysetTextField = ( XPropertySet )
+ UnoRuntime.queryInterface( XPropertySet.class, xtextfield );
+
+ /*
+ // ONLY FOR TESTING BEGIN
+ if ( ( this.INT_ROW_FROM == intRow )
+ || ( ( this.INT_ROW_FROM + 1 ) == intRow ) ) {
+ // Querying for the interface XSet on the XMultiServiceFactory
+ XSet xsetMultiServiceFactory = ( XSet ) UnoRuntime.queryInterface(
+ XSet.class, xmultiservicefactory );
+
+ // Getting the single service factory of the instance inspector
+ XSingleServiceFactory xsingleservicefactoryInstanceInspector =
+ InstanceInspector.__getServiceFactory(
+ "InstanceInspector$_InstanceInspector", xmultiservicefactory, null );
+
+ // Inserting the single service factory into the multi service factory
+ xsetMultiServiceFactory.insert( xsingleservicefactoryInstanceInspector );
+
+ // Creating an instance of the instance inspector with arguments
+ Object objectInstanceInspector =
+ xmultiservicefactory.createInstanceWithArguments(
+ "org.OpenOffice.InstanceInspector",
+ new Object[]{ xmultiservicefactory } );
+
+ // Create a new instance inspector
+ XInstanceInspector xinstanceinspector = ( XInstanceInspector )
+ UnoRuntime.queryInterface( XInstanceInspector.class,
+ objectInstanceInspector );
+
+ // Inspect the calc
+ xinstanceinspector.inspect( xpropertysetTextField );
+ );
+ }
+ // ONLY FOR TESTING END
+ */
+
+
+ // Setting the URL
+ xpropertysetTextField.setPropertyValue( "URL", stringBugIDLink );
+
+ // Setting the representation of the URL
+ xpropertysetTextField.setPropertyValue( "Representation", stringBugID );
+
+ // Querying for the interface XText
+ XText xtext = ( XText )
+ UnoRuntime.queryInterface( XText.class, xcell );
+
+ // Delete cell content
+ xtextrange.setString( "" );
+
+ // Inserting the text field URL to the cell
+ xtext.insertTextContent( xtextrange, xtextfield, false );
+ }
+ }
+
+ // Processing all features/bugs in the table
+ for ( int intRow = this.INT_ROW_FROM; intRow < INT_ROW_TO; intRow++ ) {
+ // Getting the cell of the column "Needed Days" in the current row
+ XCell xcell = xcellrange.getCellByPosition( INT_COLUMN_NEEDEDDAYS, intRow );
+ // Getting the number of needed days to perform the feature
+ int intNeededDays = (int) Math.round( xcell.getValue() );
+
+ // Getting the content of a specified cell
+ String stringStatus = this.getStringFromCell( xcellrange, intRow, this.INT_COLUMN_STATUS );
+
+ /* Testing if the number of needed days is greater than zero and if
+ the status is not "done" */
+ if ( ( intNeededDays > 0 )
+ && !( stringStatus.toLowerCase().trim().equals( "done" ) ) ) {
+ // Getting the start date after a specified number of workdays
+ gregoriancalendarStartDate = this.getWorkday(
+ gregoriancalendarStartDate, 1, objectHolidays, xfunctionaccess );
+
+ // Getting a string with the date format jjjj-mm-dd from the gregorian calendar
+ String stringDate = this.getStringFromGregorianCalendar( gregoriancalendarStartDate );
+
+ // Set the start date in the specified cell of the table
+ this.setStringToCell( xcellrange, intRow, this.INT_COLUMN_STARTDATE, stringDate );
+
+ // For the start day set the day of week in the specified cell of the table
+ this.setDayOfWeek( gregoriancalendarStartDate, xcellrange, intRow, this.INT_COLUMN_START_DAY_OF_WEEK );
+
+ // Getting the end date after a specified number of workdays
+ GregorianCalendar gregoriancalendarEndDate =
+ this.getWorkday( gregoriancalendarStartDate, intNeededDays - 1,
+ objectHolidays, xfunctionaccess );
+
+ // Creating a string with the date format jjjj-mm-dd
+ stringDate = this.getStringFromGregorianCalendar( gregoriancalendarEndDate );
+
+ // Set the end date in the specified cell of the table
+ this.setStringToCell( xcellrange, intRow, this.INT_COLUMN_ENDDATE, stringDate );
+
+ // For the end day set the day of week in the specified cell of the table
+ this.setDayOfWeek( gregoriancalendarEndDate, xcellrange, intRow, this.INT_COLUMN_END_DAY_OF_WEEK );
+
+ // Set the initial date for the next loop
+ gregoriancalendarStartDate = ( GregorianCalendar ) gregoriancalendarEndDate.clone();
+
+ // Get the due date from the table
+ String stringDueDate = this.getStringFromCell( xcellrange, intRow, this.INT_COLUMN_DUEDATE );
+
+ // Testing if the due date is not empty
+ if ( !stringDueDate.equals( "" ) ) {
+ GregorianCalendar gregoriancalendarDueDate = this.getGregorianCalendarFromString( stringDueDate );
+
+ // Testing if the due date is before the calculated end date
+ if ( gregoriancalendarDueDate.before( gregoriancalendarEndDate ) ) {
+ /* Getting the date when the processing of the feature/bug should
+ be started at the latest */
+ /*
+ // This is only a temporary fix
+ GregorianCalendar gregoriancalendarLatestDateToStart = ( GregorianCalendar ) gregoriancalendarDueDate.clone();
+ gregoriancalendarLatestDateToStart.add( Calendar.DATE, -( intNeededDays - 1 ) );
+ while ( ( gregoriancalendarLatestDateToStart.get( Calendar.DAY_OF_WEEK ) == 1 ) || ( gregoriancalendarLatestDateToStart.get( Calendar.DAY_OF_WEEK ) == 7 ) ) {
+ gregoriancalendarLatestDateToStart.add( Calendar.DATE, -1 );
+ }
+
+ String stringLatestDateToStart = this.getStringFromGregorianCalendar( gregoriancalendarLatestDateToStart );
+ */
+ GregorianCalendar gregoriancalendarLatestDateToStart =
+ this.getWorkday( gregoriancalendarDueDate, -( intNeededDays - 1 ),
+ objectHolidays, xfunctionaccess );
+
+ // Begin with the current row
+ int intRowToInsert = intRow;
+
+ // Get the start date for the feature/bug in the current row
+ GregorianCalendar gregoriancalendarPreviousStartDate =
+ this.getGregorianCalendarFromString( this.getStringFromCell(
+ xcellrange, intRowToInsert, this.INT_COLUMN_STARTDATE ) );
+
+ // Testing if we have to search for an earlier date to begin
+ while ( ( gregoriancalendarLatestDateToStart.before( gregoriancalendarPreviousStartDate ) ) && ( INT_ROW_FROM != intRowToInsert ) ) {
+ // Decrease the row
+ intRowToInsert--;
+
+ // Get the start date for the feature/bug in the current row
+ String stringStartDate = this.getStringFromCell( xcellrange, intRowToInsert, this.INT_COLUMN_STARTDATE );
+
+ // Search until a valid start date is found
+ while ( stringStartDate.equals( "" ) ) {
+ // Decrease the row
+ intRowToInsert--;
+
+ // Get the start date for the feature/bug in the current row
+ stringStartDate = this.getStringFromCell( xcellrange, intRowToInsert, this.INT_COLUMN_STARTDATE );
+ }
+
+ // Get the GregorianCalender format for the start date
+ gregoriancalendarPreviousStartDate = this.getGregorianCalendarFromString( stringStartDate );
+ }
+
+ // Getting the cell of the column "Needed Days" in the row where to insert
+ XCell xcellNeededDaysWhereToInsert = xcellrange.getCellByPosition( INT_COLUMN_NEEDEDDAYS, intRowToInsert );
+ // Getting the number of needed days to perform the feature
+ int intNeededDaysWhereToInsert = (int) Math.round( xcellNeededDaysWhereToInsert.getValue() );
+
+ GregorianCalendar gregoriancalendarPreviousNewEndDate =
+ this.getWorkday( gregoriancalendarPreviousStartDate, intNeededDays - 1 + intNeededDaysWhereToInsert,
+ objectHolidays, xfunctionaccess );
+
+ //String stringPreviousNewEndDate = this.getStringFromGregorianCalendar( gregoriancalendarPreviousNewEndDate );
+
+ String stringPreviousDueDate = this.getStringFromCell( xcellrange, intRowToInsert, this.INT_COLUMN_DUEDATE );
+
+ GregorianCalendar gregoriancalendarPreviousDueDate = null;
+
+ if ( !stringPreviousDueDate.equals( "" ) ) {
+ gregoriancalendarPreviousDueDate = this.getGregorianCalendarFromString( stringPreviousDueDate );
+ }
+
+ if ( ( intRowToInsert == intRow ) || ( gregoriancalendarPreviousNewEndDate.after( gregoriancalendarPreviousDueDate ) ) ) {
+ // Querying for the interface XPropertySet for the cell providing the due date
+ XPropertySet xpropertyset = ( XPropertySet )
+ UnoRuntime.queryInterface( XPropertySet.class,
+ xcellrange.getCellByPosition( this.INT_COLUMN_DUEDATE,
+ intRow ) );
+
+ // Changing the background color of the cell to red
+ xpropertyset.setPropertyValue( "CellBackColor", new Integer( 16711680 ) );
+ } else {
+ // Querying for the interface XColumnRowRange on the XCellRange
+ XColumnRowRange xcolumnrowrange = ( XColumnRowRange )
+ UnoRuntime.queryInterface( XColumnRowRange.class, xcellrange );
+ // Inserting one row to the table
+ xcolumnrowrange.getRows().insertByIndex( intRowToInsert, 1 );
+
+ // Querying for the interface XCellRangeMovement on XCellRange
+ XCellRangeMovement xcellrangemovement = ( XCellRangeMovement )
+ UnoRuntime.queryInterface( XCellRangeMovement.class, xcellrange );
+
+ // Creating the cell address of the destination
+ CellAddress celladdress = new CellAddress();
+ celladdress.Sheet = 0;
+ celladdress.Column = 0;
+ celladdress.Row = intRowToInsert;
+
+ // Creating the cell range of the source
+ CellRangeAddress cellrangeaddress = new CellRangeAddress();
+ cellrangeaddress.Sheet = 0;
+ cellrangeaddress.StartColumn = 0;
+ cellrangeaddress.StartRow = intRow + 1;
+ cellrangeaddress.EndColumn = 8;
+ cellrangeaddress.EndRow = intRow + 1;
+
+ // Moves the cell range to another position in the document
+ xcellrangemovement.moveRange( celladdress, cellrangeaddress );
+
+ // Removing the row not needed anymore
+ xcolumnrowrange.getRows().removeByIndex( intRow + 1, 1 );
+
+ // Set the current row, because we want to recalculate all rows below
+ intRow = intRowToInsert - 1;
+
+ // Tests at which line we want to insert
+ if ( intRow >= this.INT_ROW_FROM ) {
+ // Get the start date
+ gregoriancalendarStartDate = this.getGregorianCalendarFromString(
+ this.getStringFromCell( xcellrange, intRow,
+ this.INT_COLUMN_ENDDATE ) );
+ }
+ else {
+ // Set the start date with the absolute start date
+ gregoriancalendarStartDate =
+ (GregorianCalendar) gregoriancalendarAbsoluteStartDate.clone();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ catch( Exception exception ) {
+ this.showExceptionMessage( exception );
+ }
+ }
+
+ /** Sequence of all types (usually interface types) provided by the object.
+ * @return Sequence of all types.
+ */
+ public com.sun.star.uno.Type[] getTypes() {
+ Type[] typeReturn = {};
+
+ try {
+ typeReturn = new Type[] {
+ new Type( XTypeProvider.class ),
+ new Type( XToDo.class )
+ };
+ } catch( Exception exception ) {
+ this.showExceptionMessage( exception );
+ }
+
+ return( typeReturn );
+ }
+
+ /** Getting the implementation ID that can be used to unambigously distinguish
+ * between two set of types (interface XTypeProvider).
+ * @return ID as a sequence of bytes.
+ */
+ public byte[] getImplementationId() {
+ byte[] byteReturn = {};
+
+ try {
+ byteReturn = new String( "" + this.hashCode() ).getBytes();
+ } catch( Exception exception ) {
+ this.showExceptionMessage( exception );
+ }
+
+ return( byteReturn );
+ }
+
+ /** Getting a string from a gregorian calendar.
+ * @param gregoriancalendar Date to be converted.
+ * @return string (converted gregorian calendar).
+ */
+ public String getStringFromGregorianCalendar( GregorianCalendar gregoriancalendar ) {
+ String stringDate = gregoriancalendar.get( Calendar.DATE )
+ + STRING_SEPARATOR + ( gregoriancalendar.get( Calendar.MONTH ) + 1 )
+ + STRING_SEPARATOR + gregoriancalendar.get( Calendar.YEAR );
+
+ return( stringDate );
+ }
+
+ /** Getting a GregorianCalendar from a string.
+ * @param stringDate String to be converted.
+ * @return The result of the converting of the string.
+ */
+ public GregorianCalendar getGregorianCalendarFromString( String stringDate ) {
+ int []intDateValue = this.getDateValuesFromString( stringDate );
+
+ return( new GregorianCalendar( intDateValue[ 2 ], intDateValue[ 1 ], intDateValue[ 0 ] ) );
+ }
+
+ /** Getting the day, month and year from a string.
+ * @param stringDate String to be parsed.
+ * @return Returns an array of integer variables.
+ */
+ public int[] getDateValuesFromString( String stringDate) {
+ int[] intDateValues = new int[ 3 ];
+
+ int intPositionFirstTag = stringDate.indexOf( STRING_SEPARATOR );
+ int intPositionSecondTag = stringDate.indexOf( STRING_SEPARATOR, intPositionFirstTag + 1 );
+
+ // Getting the value of the year
+ intDateValues[ 0 ] = Integer.parseInt( stringDate.substring( 0, intPositionFirstTag ) );
+
+ // Getting the value of the month
+ intDateValues[ 1 ] = Integer.parseInt(
+ stringDate.substring( intPositionFirstTag + 1, intPositionSecondTag ) ) - 1;
+
+ // Getting the value of the day
+ intDateValues[ 2 ] = Integer.parseInt(
+ stringDate.substring( intPositionSecondTag + 1, stringDate.length() ) );
+
+ return( intDateValues );
+ }
+
+ /** Getting a content from a specified cell.
+ * @param xcellrange Providing access to cells.
+ * @param intRow Number of row.
+ * @param intColumn Number of column.
+ * @return String from the specified cell.
+ */
+ public String getStringFromCell( XCellRange xcellrange, int intRow, int intColumn ) {
+ XTextRange xtextrangeStartDate = null;
+
+ try {
+ // Getting the cell holding the information about the start date
+ XCell xcellStartDate = xcellrange.getCellByPosition( intColumn, intRow );
+ // Querying for the interface XTextRange on the XCell
+ xtextrangeStartDate = (XTextRange)
+ UnoRuntime.queryInterface( XTextRange.class, xcellStartDate );
+ }
+ catch( Exception exception ) {
+ this.showExceptionMessage( exception );
+ }
+
+ // Getting the start date
+ return( xtextrangeStartDate.getString().trim() );
+ }
+
+ /** Writing a specified string to a specified cell.
+ * @param xcellrange Providing access to the cells.
+ * @param intRow Number of row.
+ * @param intColumn Number of column.
+ * @param stringDate Date to write to the cell.
+ */
+ public void setStringToCell( XCellRange xcellrange, int intRow, int intColumn, String stringDate ) {
+ try {
+ // Getting the cell holding the information on the day to start
+ XCell xcellStartDate = xcellrange.getCellByPosition( intColumn, intRow );
+ // Querying for the interface XTextRange on the XCell
+ XTextRange xtextrange = (XTextRange) UnoRuntime.queryInterface(
+ XTextRange.class, xcellStartDate );
+ // Setting the new start date
+ xtextrange.setString( stringDate );
+ }
+ catch( Exception exception ) {
+ this.showExceptionMessage( exception );
+ }
+ }
+
+ /** Calculates the week of day and calls the method "setStringToCell".
+ * @param gregoriancalendar Day to be written to the cell.
+ * @param xcellrange Providing access to the cells.
+ * @param intRow Number of row.
+ * @param intColumn Number of column.
+ */
+ public void setDayOfWeek( GregorianCalendar gregoriancalendar,
+ XCellRange xcellrange, int intRow, int intColumn ) {
+ int intDayOfWeek = gregoriancalendar.get( Calendar.DAY_OF_WEEK );
+ String stringDayOfWeek = "";
+ if ( intDayOfWeek == Calendar.MONDAY ) {
+ stringDayOfWeek = "MON";
+ } else if ( intDayOfWeek == Calendar.TUESDAY ) {
+ stringDayOfWeek = "TUE";
+ } else if ( intDayOfWeek == Calendar.WEDNESDAY ) {
+ stringDayOfWeek = "WED";
+ } else if ( intDayOfWeek == Calendar.THURSDAY ) {
+ stringDayOfWeek = "THU";
+ } else if ( intDayOfWeek == Calendar.FRIDAY ) {
+ stringDayOfWeek = "FRI";
+ }
+
+ this.setStringToCell( xcellrange, intRow, intColumn, stringDayOfWeek );
+ }
+
+ /** Calculates the dates of the official holidays with help of Calc functions.
+ * @param vectorHolidays Holding all holidays.
+ * @param xcellrange Providing the cells.
+ * @param xfunctionaccess Provides access to functions of the Calc.
+ * @param intYear Year to calculate the official holidays.
+ */
+ public void getOfficialHolidays(
+ Vector vectorHolidays,
+ XCellRange xcellrange,
+ XFunctionAccess xfunctionaccess,
+ int intYear ) {
+ try {
+ // Official Holidays for how many years?
+ final int intHowManyYears = 2;
+
+ // Get the Official Holiday for two years
+ for ( int intNumberOfYear = 0; intNumberOfYear <= ( intHowManyYears - 1 ); intNumberOfYear++ ) {
+ intYear += intNumberOfYear;
+
+ // Getting the Easter sunday
+ Double doubleEasterSunday = ( Double ) xfunctionaccess.callFunction(
+ "EASTERSUNDAY", new Object[] { new Integer( intYear ) } );
+
+ int intEasterSunday = ( int ) Math.round( doubleEasterSunday.doubleValue() );
+
+ // New-year
+ vectorHolidays.addElement( xfunctionaccess.callFunction(
+ "DATE",
+ new Object[] { new Integer( intYear ), new Integer( 1 ), new Integer( 1 ) } ) );
+
+ // Good Friday
+ vectorHolidays.addElement( new Double( intEasterSunday - 2 ) );
+
+ // Easter monday
+ vectorHolidays.addElement( new Double( intEasterSunday + 1 ) );
+
+ // Labour Day
+ vectorHolidays.addElement( xfunctionaccess.callFunction(
+ "DATE",
+ new Object[] { new Integer( intYear ), new Integer( 5 ), new Integer( 1 ) } ) );
+
+ // Ascension Day
+ vectorHolidays.addElement( new Double( intEasterSunday + 39 ) );
+
+ // Pentecost monday
+ vectorHolidays.addElement( new Double( intEasterSunday + 50 ) );
+
+ // German Unification
+ vectorHolidays.addElement( xfunctionaccess.callFunction(
+ "DATE",
+ new Object[] { new Integer( intYear ), new Integer( 10 ), new Integer( 3 ) } ) );
+
+ // Christmas Day First
+ vectorHolidays.addElement( xfunctionaccess.callFunction(
+ "DATE",
+ new Object[] { new Integer( intYear ), new Integer( 12 ), new Integer( 25 ) } ) );
+
+ // Christmas Day Second
+ vectorHolidays.addElement( xfunctionaccess.callFunction(
+ "DATE",
+ new Object[] { new Integer( intYear ), new Integer( 12 ), new Integer( 26 ) } ) );
+ }
+ }
+ catch( Exception exception ) {
+ this.showExceptionMessage( exception );
+ }
+ }
+
+ /** Returns the serial number of the date before or after a specified number of
+ * workdays.
+ * @param gregoriancalendarStartDate Date to start with the calculation.
+ * @param intDays Number of workdays (e.g. 5 or -3).
+ * @param objectHolidays Private and public holidays to take into account.
+ * @param xfunctionaccess Allows to call functions from the Calc.
+ * @return The gregorian date before or after a specified number of workdays.
+ */
+ public GregorianCalendar getWorkday(
+ GregorianCalendar gregoriancalendarStartDate,
+ int intDays, Object[][] objectHolidays,
+ XFunctionAccess xfunctionaccess ) {
+ GregorianCalendar gregoriancalendarWorkday = null;
+
+ try {
+ // Getting the value of the start date
+ Double doubleDate = ( Double ) xfunctionaccess.callFunction( "DATE",
+ new Object[] {
+ new Integer( gregoriancalendarStartDate.get( Calendar.YEAR ) ),
+ new Integer( gregoriancalendarStartDate.get( Calendar.MONTH ) + 1 ),
+ new Integer( gregoriancalendarStartDate.get( Calendar.DATE ) )
+ } );
+ Double doubleWorkday = ( Double ) xfunctionaccess.callFunction(
+ "WORKDAY",
+ //"ARBEITSTAG",
+ new Object[] { doubleDate, new Integer( intDays ), objectHolidays } );
+ //"EOMONTH",
+ //new Object[] { doubleDate, new Integer( intDays ) } );
+
+ Double doubleYear = ( Double ) xfunctionaccess.callFunction( "YEAR",
+ new Object[] { doubleWorkday } );
+ Double doubleMonth = ( Double ) xfunctionaccess.callFunction( "MONTH",
+ new Object[] { doubleWorkday } );
+ Double doubleDay = ( Double ) xfunctionaccess.callFunction( "DAY",
+ new Object[] { doubleWorkday } );
+
+ gregoriancalendarWorkday = new GregorianCalendar(
+ doubleYear.intValue(),
+ doubleMonth.intValue() - 1,
+ doubleDay.intValue() );
+ }
+ catch( Exception exception ) {
+ this.showExceptionMessage( exception );
+ }
+
+ return( gregoriancalendarWorkday );
+ }
+
+ /** Getting the holidays from the spreadsheet.
+ * @param vectorHolidays Holding all holidays.
+ * @param xcellrange Providing the cells.
+ * @param xfunctionaccess Provides the access to functions of the Calc.
+ */
+ public void getPrivateHolidays( Vector vectorHolidays, XCellRange xcellrange,
+ XFunctionAccess xfunctionaccess ) {
+ try {
+ int intRow = this.INT_ROW_HOLIDAYS_START;
+ int intColumn = this.INT_COLUMN_HOLIDAYS_START;
+
+ double doubleHolidayStart = xcellrange.getCellByPosition( intColumn,
+ intRow ).getValue();
+
+ double doubleHolidayEnd = xcellrange.getCellByPosition( intColumn + 1,
+ intRow ).getValue();
+
+ while ( doubleHolidayStart != 0 ) {
+ if ( doubleHolidayEnd == 0 ) {
+ vectorHolidays.addElement( new Integer( (int) Math.round(
+ doubleHolidayStart ) ) );
+ }
+ else {
+ for ( int intHoliday = (int) Math.round( doubleHolidayStart );
+ intHoliday <= (int) Math.round( doubleHolidayEnd ); intHoliday++ ) {
+ vectorHolidays.addElement( new Double( intHoliday ) );
+ }
+ }
+
+ intRow++;
+ doubleHolidayStart =
+ xcellrange.getCellByPosition( intColumn, intRow ).getValue();
+ doubleHolidayEnd =
+ xcellrange.getCellByPosition( intColumn + 1, intRow ).getValue();
+ }
+ }
+ catch( Exception exception ) {
+ this.showExceptionMessage( exception );
+ }
+ }
+
+ /** Showing the stack trace in a JOptionPane.
+ * @param stringMessage The message to show.
+ */
+ public void showMessage( String stringMessage ) {
+ javax.swing.JFrame jframe = new javax.swing.JFrame();
+ jframe.setLocation(100, 100);
+ jframe.setSize(300, 200);
+ jframe.setVisible(true);
+ javax.swing.JOptionPane.showMessageDialog( jframe, stringMessage,
+ "Debugging information", javax.swing.JOptionPane.INFORMATION_MESSAGE );
+ jframe.dispose();
+ }
+
+ /** Writing the stack trace from an exception to a string and calling the method
+ * showMessage() with this string.
+ * @param exception The occured exception.
+ * @see showMessage
+ */
+ public void showExceptionMessage( Exception exception ) {
+ java.io.StringWriter stringwriter = new java.io.StringWriter();
+ java.io.PrintWriter printwriter = new java.io.PrintWriter( stringwriter );
+ exception.printStackTrace( printwriter);
+ System.err.println( exception );
+ this.showMessage( stringwriter.getBuffer().substring(0) );
+ }
+
+ }
+
+ /**
+ * Returns a factory for creating the service.
+ * This method is called by the <code>JavaLoader</code>
+ * <p>
+ * @return returns a <code>XSingleServiceFactory</code> for creating the component
+ * @param implName the name of the implementation for which a service is desired
+ * @param multiFactory the service manager to be used if needed
+ * @param regKey the registryKey
+ * @see com.sun.star.comp.loader.JavaLoader
+ */
+ public static XSingleServiceFactory __getServiceFactory(String implName,
+ XMultiServiceFactory multiFactory,
+ XRegistryKey regKey) {
+ XSingleServiceFactory xSingleServiceFactory = null;
+
+ if (implName.equals(_ToDo.class.getName()) )
+ xSingleServiceFactory = FactoryHelper.getServiceFactory(_ToDo.class,
+ _ToDo.__serviceName,
+ multiFactory,
+ regKey);
+
+ return xSingleServiceFactory;
+ }
+
+ /**
+ * Writes the service information into the given registry key.
+ * This method is called by the <code>JavaLoader</code>
+ * <p>
+ * @return returns true if the operation succeeded
+ * @param regKey the registryKey
+ * @see com.sun.star.comp.loader.JavaLoader
+ */
+ public static boolean __writeRegistryServiceInfo(XRegistryKey regKey) {
+ return FactoryHelper.writeRegistryServiceInfo(_ToDo.class.getName(),
+ _ToDo.__serviceName, regKey);
+ }
+}