diff options
Diffstat (limited to '')
-rw-r--r-- | odk/examples/java/ToDo/ToDo.java | 932 |
1 files changed, 932 insertions, 0 deletions
diff --git a/odk/examples/java/ToDo/ToDo.java b/odk/examples/java/ToDo/ToDo.java new file mode 100644 index 0000000000..36d0d7eece --- /dev/null +++ b/odk/examples/java/ToDo/ToDo.java @@ -0,0 +1,932 @@ +/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * The Contents of this file are made available subject to the terms of + * the BSD license. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *************************************************************************/ + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.GregorianCalendar; + +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.XIndexAccess; +import com.sun.star.lang.XMultiComponentFactory; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.XServiceInfo; +import com.sun.star.lang.XSingleComponentFactory; +import com.sun.star.lib.uno.helper.Factory; +import com.sun.star.lib.uno.helper.WeakBase; +import com.sun.star.sheet.XCellRangeMovement; +import com.sun.star.sheet.XFunctionAccess; +import com.sun.star.sheet.XSpreadsheet; +import com.sun.star.sheet.XSpreadsheetDocument; +import com.sun.star.table.CellAddress; +import com.sun.star.table.CellRangeAddress; +import com.sun.star.table.XCell; +import com.sun.star.table.XCellRange; +import com.sun.star.table.XColumnRowRange; +import com.sun.star.table.XTableRows; +import com.sun.star.text.XSimpleText; +import com.sun.star.text.XText; +import com.sun.star.text.XTextCursor; +import com.sun.star.text.XTextField; +import com.sun.star.text.XTextRange; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XComponentContext; +import org.openoffice.XToDo; + +/** This class capsulates the class, that implements the minimal component, a + * factory for creating the service (<CODE>__getServiceFactory</CODE>) and a + * method, that writes the information into the given registry key + * (<CODE>__writeRegistryServiceInfo</CODE>). + */ +public class ToDo { + + /** This class implements the component. At least the interfaces + * XInterface, XTypeProvider, and XWeak implemented by the helper class + * WeakBase and XServiceInfo should be provided by the service. + */ + public static class ToDoImpl extends WeakBase implements XServiceInfo, XToDo { + + /** The service name, that must be used to get an instance of this service. + */ + private static final String __serviceName = "org.openoffice.ToDo"; + + /** The initial component contextr, that gives access to + * the service manager, supported singletons, ... + * It's often later used + */ + private XComponentContext m_cmpCtx; + + /** The service manager, that gives access to all registered services. + * It's often later used + */ + private XMultiComponentFactory m_xMCF; + + // Implementation helper variables + private static final int INT_COLUMN_FEATURE = 0; + private static final int INT_COLUMN_NEEDEDDAYS = 2; + private static final int INT_COLUMN_STARTDATE = 3; + private static final int INT_COLUMN_START_DAY_OF_WEEK = 4; + private static final int INT_COLUMN_ENDDATE = 5; + private static final int INT_COLUMN_END_DAY_OF_WEEK = 6; + private static final int INT_COLUMN_DUEDATE = 7; + private static final int INT_COLUMN_STATUS = 8; + + private static final int INT_ROW_FROM = 14; // 8 + + private static final int INT_ROW_HOLIDAYS_START = 4; + private static final int INT_COLUMN_HOLIDAYS_START = 7; // 10 + + private static final String STRING_SEPARATOR = "/"; + + + /** The constructor of the inner class has a XComponenContext parameter. + * @param xCompContext the initial component context + */ + public ToDoImpl(XComponentContext xCompContext) { + try { + m_cmpCtx = xCompContext; + m_xMCF = m_cmpCtx.getServiceManager(); + } + catch( Exception e ) { + e.printStackTrace(System.err); + } + } + + /** This method returns an array of all supported service names. + * @return Array of supported service names. + */ + public String[] getSupportedServiceNames() { + return getServiceNames(); + } + + private static String[] getServiceNames() { + String[] sSupportedServiceNames = { __serviceName }; + return sSupportedServiceNames; + } + + /** This method returns true, if the given service will be + * supported by the component. + * @return True, if the given service name will be supported. + */ + public boolean supportsService(String sServiceName) { + return sServiceName.equals( __serviceName ); + } + + /** Return the class name of the component. + * @return Class name of the component. + */ + public String getImplementationName() { + return ToDoImpl.class.getName(); + } + + /** 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( java.lang.Object aInstance ) + throws com.sun.star.uno.RuntimeException { + try { + // Querying for the interface XSpreadsheetDocument + XSpreadsheetDocument xspreadsheetdocument = + UnoRuntime.queryInterface( + XSpreadsheetDocument.class, aInstance ); + + // Querying for the interface XIndexAccess + XIndexAccess xindexaccess = UnoRuntime.queryInterface( XIndexAccess.class, + xspreadsheetdocument.getSheets() ); + + // Getting the first XSpreadsheet + XSpreadsheet xspreadsheet = UnoRuntime.queryInterface( + XSpreadsheet.class, xindexaccess.getByIndex( 0 )); + + // Querying for the interface XCellRange on the XSpreadsheet + XCellRange xcellrange = UnoRuntime.queryInterface( XCellRange.class, xspreadsheet ); + + /* Getting the gregorian calendar with the date on which to start + the calculation */ + GregorianCalendar gregCalAbsoluteStartDate = + this.getGregorianCalendarFromString(this.getStringFromCell( + xcellrange, 5, 2 ) ); + gregCalAbsoluteStartDate.add( Calendar.DATE, -1 ); + + // Set the start date with the absolute start date + GregorianCalendar gregCalStartDate = + (GregorianCalendar) gregCalAbsoluteStartDate.clone(); + + /* Creating the service FunctionAccess, which allows generic + access to all spreadsheet functions */ + Object objectFunctionAccess = + m_xMCF.createInstanceWithContext( + "com.sun.star.sheet.FunctionAccess", m_cmpCtx ); + + // Querying for the interface XFunctionAccess on service + // FunctionAccess + XFunctionAccess xfunctionaccess = UnoRuntime.queryInterface(XFunctionAccess.class, + objectFunctionAccess ); + + // Creating vector for holidays + ArrayList<Object> vectorHolidays = new ArrayList<Object>(); + + // Get the Official Holidays + this.getOfficialHolidays( vectorHolidays, xcellrange, + xfunctionaccess, + gregCalStartDate.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 = ToDoImpl.INT_ROW_FROM - 1; + + // Getting the feature of the first cell + String sFeature = this.getStringFromCell(xcellrange, + intRowTo + 1, + ToDoImpl.INT_COLUMN_FEATURE); + + // Determine the last row with an entry in the first column + while ( ( sFeature != null ) && + ( !sFeature.equals( "" ) ) ) { + intRowTo++; + sFeature = this.getStringFromCell( xcellrange, + intRowTo + 1, ToDoImpl.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 = ToDoImpl.INT_ROW_FROM; intRow < INT_ROW_TO + 5; + intRow++ ) { + for ( int intColumn = ToDoImpl.INT_COLUMN_STARTDATE; + intColumn <= ToDoImpl.INT_COLUMN_END_DAY_OF_WEEK; + intColumn++ ) { + this.setStringToCell(xcellrange, intRow, intColumn, ""); + } + } + + /* Clearing the background color of the due date cells and setting + the hyperlink to the bugtracker */ + for (int intRow = ToDoImpl.INT_ROW_FROM; intRow < INT_ROW_TO; intRow++) + { + // Querying for the interface XPropertySet for the cell + // providing the due date + XPropertySet xpropertyset = UnoRuntime.queryInterface(XPropertySet.class, + xcellrange.getCellByPosition( + ToDoImpl.INT_COLUMN_DUEDATE, + intRow )); + + // Changing the background color of the cell to white + xpropertyset.setPropertyValue( "CellBackColor", + Integer.valueOf( 16777215 ) ); + + // Getting the cell of the bug id + XCell xcell = xcellrange.getCellByPosition( + ToDoImpl.INT_COLUMN_FEATURE, intRow ); + + // Querying for the interface XSimpleText + XSimpleText xsimpletext = UnoRuntime.queryInterface( XSimpleText.class, xcell ); + + // Getting the text cursor + XTextCursor xtextcursor = xsimpletext.createTextCursor(); + + // Querying for the interface XTextRange + XTextRange xtextrange = UnoRuntime.queryInterface( XTextRange.class, xtextcursor ); + + // Getting the bug ID from the cell + String sBugID = xtextrange.getString(); + if ( !sBugID.startsWith( + "http://www.openoffice.org/issues/show_bug.cgi?id=") ) { + String sBugIDLink = + "http://www.openoffice.org/issues/show_bug.cgi?id=" + sBugID; + + // Querying for the interface XMultiServiceFactory + XMultiServiceFactory xMSFTextField = + UnoRuntime.queryInterface( + XMultiServiceFactory.class, aInstance ); + + // Creating an instance of the text field URL + Object objectTextField = + xMSFTextField.createInstance( + "com.sun.star.text.TextField.URL" ); + + // Querying for the interface XTextField + XTextField xtextfield = UnoRuntime.queryInterface( XTextField.class, + objectTextField ); + + // Querying for the interface XPropertySet + XPropertySet xpropertysetTextField = UnoRuntime.queryInterface( XPropertySet.class, + xtextfield ); + + // Setting the URL + xpropertysetTextField.setPropertyValue( "URL", + sBugIDLink ); + + // Setting the representation of the URL + xpropertysetTextField.setPropertyValue( "Representation", + sBugID ); + + // Querying for the interface 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 = ToDoImpl.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 sStatus = this.getStringFromCell( xcellrange, + intRow, ToDoImpl.INT_COLUMN_STATUS ); + + /* Testing if the number of needed days is greater than + zero and if + the status is not "done" */ + if ( ( intNeededDays > 0 ) + && !( sStatus.toLowerCase().trim().equals("done")) ) { + // Getting the start date after a specified number of + // workdays + gregCalStartDate = this.getWorkday( + gregCalStartDate, 1, objectHolidays, + xfunctionaccess ); + + // Getting a string with the date format jjjj-mm-dd from + // the gregorian calendar + String sDate = this.getStringFromGregorianCalendar( + gregCalStartDate ); + + // Set the start date in the specified cell of the table + this.setStringToCell(xcellrange, intRow, + ToDoImpl.INT_COLUMN_STARTDATE, sDate); + + // For the start day set the day of week in the specified + // cell of the table + this.setDayOfWeek( gregCalStartDate, + xcellrange, intRow, + ToDoImpl.INT_COLUMN_START_DAY_OF_WEEK ); + + // Getting the end date after a specified number of workdays + GregorianCalendar gregCalEndDate = + this.getWorkday( gregCalStartDate, + intNeededDays - 1, + objectHolidays, xfunctionaccess ); + + // Creating a string with the date format jjjj-mm-dd + sDate = this.getStringFromGregorianCalendar( + gregCalEndDate ); + + // Set the end date in the specified cell of the table + this.setStringToCell( xcellrange, intRow, + ToDoImpl.INT_COLUMN_ENDDATE, sDate ); + + // For the end day set the day of week in the specified + // cell of the table + this.setDayOfWeek(gregCalEndDate, xcellrange, + intRow, ToDoImpl.INT_COLUMN_END_DAY_OF_WEEK); + + // Set the initial date for the next loop + gregCalStartDate = ( GregorianCalendar ) + gregCalEndDate.clone(); + + // Get the due date from the table + String sDueDate = this.getStringFromCell( + xcellrange, intRow, ToDoImpl.INT_COLUMN_DUEDATE ); + + // Testing if the due date is not empty + if ( !sDueDate.equals( "" ) ) { + GregorianCalendar gregCalDueDate = + this.getGregorianCalendarFromString(sDueDate); + + // Testing if the due date is before the calculated + // end date + if ( gregCalDueDate.before( + gregCalEndDate ) ) { + /* Getting the date when the processing of the + feature/bug should + be started at the latest */ + GregorianCalendar gregCalLatestDateToStart = + this.getWorkday(gregCalDueDate, + -( 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 gregCalPreviousStartDate = + this.getGregorianCalendarFromString( + this.getStringFromCell( + xcellrange, intRowToInsert, + ToDoImpl.INT_COLUMN_STARTDATE ) ); + + // Testing if we have to search for an earlier date + // to begin + while ((gregCalLatestDateToStart.before( + gregCalPreviousStartDate)) && + (INT_ROW_FROM != intRowToInsert)) { + // Decrease the row + intRowToInsert--; + + // Get the start date for the feature/bug in + // the current row + String sStartDate = this.getStringFromCell( + xcellrange, intRowToInsert, + ToDoImpl.INT_COLUMN_STARTDATE ); + + // Search until a valid start date is found + while ( sStartDate.equals( "" ) ) { + // Decrease the row + intRowToInsert--; + + // Get the start date for the feature/bug + // in the current row + sStartDate = this.getStringFromCell( + xcellrange, intRowToInsert, + ToDoImpl.INT_COLUMN_STARTDATE ); + } + + // Get the GregorianCalendar format for the + // start date + gregCalPreviousStartDate = + this.getGregorianCalendarFromString( + sStartDate ); + } + + // 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 gregCalPreviousNewEndDate = + this.getWorkday(gregCalPreviousStartDate, + intNeededDays - 1 + + intNeededDaysWhereToInsert, + objectHolidays, + xfunctionaccess); + String sPreviousDueDate = this.getStringFromCell( + xcellrange, intRowToInsert, + ToDoImpl.INT_COLUMN_DUEDATE ); + + GregorianCalendar gregCalPreviousDueDate = null; + + if ( !sPreviousDueDate.equals( "" ) ) { + gregCalPreviousDueDate = + this.getGregorianCalendarFromString( + sPreviousDueDate ); + } + + if ( ( intRowToInsert == intRow ) || + ( gregCalPreviousNewEndDate.after( + gregCalPreviousDueDate ) ) ) { + // Querying for the interface XPropertySet for + // the cell providing the due date + XPropertySet xpropertyset = UnoRuntime.queryInterface( + XPropertySet.class, + xcellrange.getCellByPosition( + ToDoImpl.INT_COLUMN_DUEDATE, + intRow ) ); + + // Changing the background color of the cell + // to red + xpropertyset.setPropertyValue( + "CellBackColor", Integer.valueOf( 16711680 ) ); + } else { + // Querying for the interface XColumnRowRange + // on the XCellRange + XColumnRowRange xcolumnrowrange = + UnoRuntime.queryInterface( + XColumnRowRange.class, xcellrange ); + // Inserting one row to the table + XTableRows xTableRows = + xcolumnrowrange.getRows(); + xTableRows.insertByIndex( intRowToInsert, 1 ); + + // Querying for the interface + // XCellRangeMovement on XCellRange + 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 >= ToDoImpl.INT_ROW_FROM ) { + // Get the start date + gregCalStartDate = + this.getGregorianCalendarFromString( + this.getStringFromCell( xcellrange, + intRow,ToDoImpl.INT_COLUMN_ENDDATE)); + } + else { + // Set the start date with the absolute s + // tart date + gregCalStartDate = (GregorianCalendar) + gregCalAbsoluteStartDate.clone(); + } + } + } + } + } + } + } + catch( Exception exception ) { + showExceptionMessage( exception ); + } + } + + /** Getting a string from a gregorian calendar. + * @param gregCal Date to be converted. + * @return string (converted gregorian calendar). + */ + private String getStringFromGregorianCalendar( GregorianCalendar gregCal ) { + String sDate = ( gregCal.get( Calendar.MONTH ) + 1 ) + + STRING_SEPARATOR + gregCal.get( Calendar.DATE ) + + STRING_SEPARATOR + gregCal.get( Calendar.YEAR ); + + return sDate; + } + + /** Getting a GregorianCalendar from a string. + * @param sDate String to be converted. + * @return The result of the converting of the string. + */ + private GregorianCalendar getGregorianCalendarFromString( String sDate ) { + int []intDateValue = this.getDateValuesFromString( sDate ); + + return( new GregorianCalendar( intDateValue[ 2 ], intDateValue[ 0 ], + intDateValue[ 1 ] ) ); + } + + /** Getting the day, month and year from a string. + * @param sDate String to be parsed. + * @return Returns an array of integer variables. + */ + private int[] getDateValuesFromString( String sDate) { + int[] intDateValues = new int[ 3 ]; + + int intPositionFirstTag = sDate.indexOf( STRING_SEPARATOR ); + int intPositionSecondTag = sDate.indexOf(STRING_SEPARATOR, + intPositionFirstTag + 1); + + // Getting the value of the month + intDateValues[ 0 ] = Integer.parseInt( + sDate.substring(0, intPositionFirstTag)) - 1; + // Getting the value of the day + intDateValues[ 1 ] = Integer.parseInt( + sDate.substring(intPositionFirstTag + 1, intPositionSecondTag)); + // Getting the value of the year + intDateValues[ 2 ] = Integer.parseInt( + sDate.substring(intPositionSecondTag + 1, sDate.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. + */ + private 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 = 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 sDate Date to write to the cell. + */ + private void setStringToCell( XCellRange xcellrange, int intRow, + int intColumn, String sDate ) { + 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 = UnoRuntime.queryInterface(XTextRange.class, xcellStartDate); + // Setting the new start date + xtextrange.setString( sDate ); + } + catch( Exception exception ) { + this.showExceptionMessage( exception ); + } + } + + /** Calculates the week of day and calls the method "setStringToCell". + * @param gregCal Day to be written to the cell. + * @param xcellrange Providing access to the cells. + * @param intRow Number of row. + * @param intColumn Number of column. + */ + private void setDayOfWeek( GregorianCalendar gregCal, + XCellRange xcellrange, int intRow, + int intColumn) { + int intDayOfWeek = gregCal.get( Calendar.DAY_OF_WEEK ); + String sDayOfWeek = ""; + if ( intDayOfWeek == Calendar.MONDAY ) { + sDayOfWeek = "MON"; + } else if ( intDayOfWeek == Calendar.TUESDAY ) { + sDayOfWeek = "TUE"; + } else if ( intDayOfWeek == Calendar.WEDNESDAY ) { + sDayOfWeek = "WED"; + } else if ( intDayOfWeek == Calendar.THURSDAY ) { + sDayOfWeek = "THU"; + } else if ( intDayOfWeek == Calendar.FRIDAY ) { + sDayOfWeek = "FRI"; + } + + this.setStringToCell( xcellrange, intRow, intColumn, + sDayOfWeek ); + } + + /** 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. + */ + private void getOfficialHolidays( + ArrayList<Object> 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 dEasterSunday = ( Double ) + xfunctionaccess.callFunction( + "EASTERSUNDAY", new Object[] { Integer.valueOf(intYear) }); + + int intEasterSunday = (int)Math.round( + dEasterSunday.doubleValue()); + + // New-year + vectorHolidays.add( xfunctionaccess.callFunction( + "DATE", + new Object[] { + Integer.valueOf( intYear ), + Integer.valueOf( 1 ), + Integer.valueOf( 1 ) } )); + + // Good Friday + vectorHolidays.add( + Double.valueOf( intEasterSunday - 2 ) ); + + // Easter monday + vectorHolidays.add( + Double.valueOf( intEasterSunday + 1 ) ); + + // Labour Day + vectorHolidays.add( xfunctionaccess.callFunction( + "DATE", + new Object[] { + Integer.valueOf( intYear ), + Integer.valueOf( 5 ), + Integer.valueOf( 1 ) } )); + + // Ascension Day + vectorHolidays.add(Double.valueOf(intEasterSunday + 39 )); + + // Pentecost monday + vectorHolidays.add(Double.valueOf(intEasterSunday + 50 )); + + // German Unification + vectorHolidays.add( xfunctionaccess.callFunction( + "DATE", + new Object[] { + Integer.valueOf( intYear ), + Integer.valueOf( 10 ), + Integer.valueOf( 3 ) } )); + + // Christmas Day First + vectorHolidays.add( xfunctionaccess.callFunction( + "DATE", + new Object[] { + Integer.valueOf( intYear ), + Integer.valueOf( 12 ), + Integer.valueOf( 25 ) } )); + + // Christmas Day Second + vectorHolidays.add( xfunctionaccess.callFunction( + "DATE", + new Object[] { + Integer.valueOf( intYear ), + Integer.valueOf( 12 ), + Integer.valueOf( 26 ) } )); + } + } + catch( Exception exception ) { + this.showExceptionMessage( exception ); + } + } + + /** Returns the serial number of the date before or after a specified + * number of workdays. + * @param gregCalStartDate 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. + */ + private GregorianCalendar getWorkday( + GregorianCalendar gregCalStartDate, + int intDays, Object[][] objectHolidays, + XFunctionAccess xfunctionaccess ) { + GregorianCalendar gregCalWorkday = null; + + try { + // Getting the value of the start date + Double dDate = ( Double ) xfunctionaccess.callFunction( + "DATE", + new Object[] { + Integer.valueOf( gregCalStartDate.get( Calendar.YEAR ) ), + Integer.valueOf( gregCalStartDate.get( Calendar.MONTH ) + 1 ), + Integer.valueOf( gregCalStartDate.get( Calendar.DATE ) ) + } ); + + Double dWorkday = ( Double ) xfunctionaccess.callFunction( + "com.sun.star.sheet.addin.Analysis.getWorkday", + new Object[] { dDate, Integer.valueOf( intDays ), objectHolidays } ); + + Double dYear = ( Double ) xfunctionaccess.callFunction( + "YEAR", new Object[] { dWorkday } ); + Double dMonth = ( Double ) xfunctionaccess.callFunction( + "MONTH", new Object[] { dWorkday } ); + Double dDay = ( Double ) xfunctionaccess.callFunction( + "DAY", new Object[] { dWorkday } ); + + gregCalWorkday = new GregorianCalendar( + dYear.intValue(), + dMonth.intValue() - 1, + dDay.intValue() ); + } + catch( Exception exception ) { + this.showExceptionMessage( exception ); + } + + return gregCalWorkday; + } + + /** 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. + */ + private void getPrivateHolidays( ArrayList<Object> vectorHolidays, + XCellRange xcellrange, + XFunctionAccess xfunctionaccess ) { + try { + int intRow = ToDoImpl.INT_ROW_HOLIDAYS_START; + int intColumn = ToDoImpl.INT_COLUMN_HOLIDAYS_START; + + double dHolidayStart = xcellrange.getCellByPosition( + intColumn, intRow ).getValue(); + + double dHolidayEnd = xcellrange.getCellByPosition( + intColumn + 1, intRow ).getValue(); + + while ( dHolidayStart != 0 ) { + if ( dHolidayEnd == 0 ) { + vectorHolidays.add( + Integer.valueOf( (int) Math.round( + dHolidayStart ) ) ); + } + else { + for ( int intHoliday = (int) Math.round( + dHolidayStart ); + intHoliday <= (int) Math.round( dHolidayEnd ); + intHoliday++ ) { + vectorHolidays.add( Double.valueOf( intHoliday ) ); + } + } + + intRow++; + dHolidayStart = xcellrange.getCellByPosition( + intColumn, intRow).getValue(); + dHolidayEnd = xcellrange.getCellByPosition( + intColumn + 1, intRow).getValue(); + } + } + catch( Exception exception ) { + this.showExceptionMessage( exception ); + } + } + + /** Showing the stack trace in a JOptionPane. + * @param sMessage The message to show. + */ + private void showMessage( String sMessage ) { + javax.swing.JFrame jframe = new javax.swing.JFrame(); + jframe.setLocation(100, 100); + jframe.setSize(300, 200); + jframe.setVisible(true); + javax.swing.JOptionPane.showMessageDialog( + jframe, sMessage, "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 occurred exception. + * @see #showMessage(String) + */ + private void showExceptionMessage( Exception exception ) { + java.io.StringWriter swriter = new java.io.StringWriter(); + java.io.PrintWriter printwriter = + new java.io.PrintWriter( swriter ); + exception.printStackTrace( printwriter); + System.err.println( exception ); + this.showMessage( swriter.getBuffer().substring(0) ); + } + } + + /** + * Gives a factory for creating the service. + * This method is called by the <code>JavaLoader</code> + * <p> + * @return returns a <code>XSingleComponentFactory</code> for creating + * the component + * @param sImplName the name of the implementation for which a + * service is desired + * @see com.sun.star.comp.loader.JavaLoader + */ + public static XSingleComponentFactory __getComponentFactory(String sImplName) { + XSingleComponentFactory xFactory = null; + + if ( sImplName.equals( ToDoImpl.class.getName() ) ) + xFactory = Factory.createComponentFactory(ToDoImpl.class, + ToDoImpl.getServiceNames()); + + return xFactory; + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |