Kaydet (Commit) 2e2b262e authored tarafından Bertram Nolte's avatar Bertram Nolte

Added new Java example.

üst ac50b4f0
# Builds the java demo component.
PRJ=..$(PS)..$(PS)..
SETTINGS=../../../settings
# Include settings makefile depending on platform/compiler
ifeq "$(MAKECMDGOALS)" "win_microcxx"
-include $(SETTINGS)/win_microcxx_settings.mk
ifndef PS
$(error Platform/Compiler settings file not found)
endif
SHAREDLIB_OUT=$(OUT_BIN)
endif
ifeq "$(MAKECMDGOALS)" "solaris_workshopcxx"
-include $(SETTINGS)/solaris_workshopcxx_settings.mk
ifndef PS
$(error Platform/Compiler settings file not found)
endif
SHAREDLIB_OUT=$(OUT_LIB)
endif
ifeq "$(MAKECMDGOALS)" "linux_gcc"
-include $(SETTINGS)/linux_gcc_settings.mk
ifndef PS
$(error Platform/Compiler settings file not found)
endif
SHAREDLIB_OUT=$(OUT_LIB)
endif
# Define non-platform/compiler specific settings
include $(SETTINGS)/dk.mk
include $(SETTINGS)/std.mk
# Define non-platform/compiler specific settings
# Targets
.PHONY: ALL
ALL :
@echo -------------------------------------------------------------
@echo You must supply a target where TARGET is one of the following:
@echo
@echo win_microcxx : Windows using Microsoft C++ compiler/linker
@echo solaris_workshopcxx : Solaris using Sun Workshop C++ compiler
@echo linux_gcc : Linux using gcc
@echo -------------------------------------------------------------
REGISTERFLAGFILE = $(OUT_MISC)$(PS)register_components_todo_is_ok.flag
OUT_COMPONENT = $(OUT_CLASS)$(PS)todo
COMPONENT_RDB = $(OUT_BIN)$(PS)ToDo.rdb
COMPONENT_JAR = $(OUT_CLASS)$(PS)ToDo.jar
COMPONENT_MANIFESTFILE = Manifest
IDLFILES = XToDo.idl
# normally the idl file should be stored in a directory tree fitting the module structure,
# for the example we know the module structure
PACKAGE = org$(PS)OpenOffice
JAVAFILES = ToDo.java
GENJAVAFILES = $(patsubst %.idl,$(OUT_MISC)$(PS)$(PACKAGE)$(PS)%.java,$(IDLFILES) )
GENURDFILES = $(patsubst %.idl,$(OUT_MISC)$(PS)%.urd,$(IDLFILES) )
CLASSFILES = $(patsubst %.java,$(OUT_COMPONENT)$(PS)%.class,$(JAVAFILES) )
CLASSFILES += $(patsubst %.java,$(OUT_COMPONENT)$(PS)$(PACKAGE)$(PS)%.class,$(GENJAVAFILES) )
DK_CLASSPATH = $(subst $(EMPTYSTRING) $(EMPTYSTRING),, \
$(CLASSES_DIR)$(PS)jurt.jar\
$(PATH_SEPARATOR)$(CLASSES_DIR)$(PS)unoil.jar\
$(PATH_SEPARATOR)$(CLASSES_DIR)$(PS)ridl.jar\
$(PATH_SEPARATOR)$(CLASSES_DIR)$(PS)sandbox.jar\
$(PATH_SEPARATOR)$(CLASSES_DIR)$(PS)java_uno.jar\
$(PATH_SEPARATOR)$(CLASSES_DIR)$(PS)juh.jar\
$(PATH_SEPARATOR)$(CLASSES_DIR)$(PS)jut.jar\
$(PATH_SEPARATOR)$(OUT_COMPONENT) \
)
OFFICE_FILEURL = $(subst \,/,$(OFFICE_PROGRAM_PATH))
OFFICE_CLASSPATH = $(subst $(CLASSES_DIR),$(OFFICE_PROGRAM_PATH)$(PS)classes, $(DK_CLASSPATH))
win_microcxx : $(COMPONENT_JAR) $(REGISTERFLAGFILE)
solaris_workshopcxx : $(COMPONENT_JAR) $(REGISTERFLAGFILE)
linux_gcc : $(COMPONENT_JAR) $(REGISTERFLAGFILE)
include $(SETTINGS)/stdtarget.mk
$(OUT_COMPONENT) : $(OUT) $(OUT_CLASS)
$(MKDIR) $(OUT_COMPONENT)
$(GENJAVAFILES) : $(IDLFILES)
$(BIN_DIR)$(PS)idlc -I. -I$(IDL_DIR) -O$(OUT_MISC) $(IDLFILES)
$(BIN_DIR)$(PS)regmerge $(COMPONENT_RDB) /UCR $(GENURDFILES)
$(BIN_DIR)$(PS)regmerge $(COMPONENT_RDB) / $(BIN_DIR)$(PS)$(DKREGISTRYNAME)
$(BIN_DIR)$(PS)javamaker -BUCR -Torg.OpenOffice.XToDo -O$(OUT_MISC) $(COMPONENT_RDB)
$(CLASSFILES) : $(OUT_COMPONENT) $(GENJAVAFILES) $(JAVAFILES)
javac -classpath $(DK_CLASSPATH) -d $(OUT_COMPONENT) $(GENJAVAFILES) $(JAVAFILES)
$(COMPONENT_JAR) : $(CLASSFILES)
jar cvfm $(COMPONENT_JAR) Manifest -C $(OUT_COMPONENT) .
$(REGISTERFLAGFILE) : $(REGISTERFLAGFILE)
ifneq "$(OFFICE_PROGRAM_PATH)" ""
$(BIN_DIR)$(PS)regmerge $(OFFICE_PROGRAM_PATH)$(PS)applicat.rdb /UCR $(GENURDFILES)
$(COPY) $(COMPONENT_JAR) $(OFFICE_PROGRAM_PATH)$(PS)classes
java -classpath $(OFFICE_CLASSPATH) com.sun.star.tools.uno.RegComp "$(URLPREFIX)$(OFFICE_FILEURL)/applicat.rdb" register "$(URLPREFIX)$(OFFICE_FILEURL)/classes/ToDo.jar" com.sun.star.loader.Java2
@echo bla > $(REGISTERFLAGFILE)
else
@echo --------------------------------------------------------------------------------
@echo If you want to install your component automatically, please set an
@echo OFFICE_PROGRAM_PATH environment variable to a valid office installation.
@echo --------------------------------------------------------------------------------
endif
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);
}
}
// Guard against multiple includes
#ifndef _ORG_OPENOFFICE_IDL_
#define _ORG_OPENOFFICE_IDL__
/// Template for OpenOffice ToDo add-in component idl file.
/** Provides lifetime control by reference counting and the possibility of
querying for other interfaces of the same logical object.
*/
#include <com/sun/star/uno/XInterface.idl>
module org {
module OpenOffice {
interface XToDo : com::sun::star::uno::XInterface
{
void recalc( [in] any aInstance );
};
};
};
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment