Kaydet (Commit) f49575a8 authored tarafından Juergen Schmidt's avatar Juergen Schmidt

#99053# did some improvements

üst a12ececf
......@@ -9,23 +9,26 @@ include $(SETTINGS)/dk.mk
include $(SETTINGS)/std.mk
# Define non-platform/compiler specific settings
REGISTERFLAG = $(OUT_MISC)$(PS)todo_register_component.flag
COMPONENTJARFLAG = $(OUT_MISC)$(PS)todo_create_component_jar.flag
TYPEFLAG= $(OUT_MISC)$(PS)todo_type_generation.flag
JAVAFLAG= $(OUT_MISC)$(PS)todo_javac.flag
OUT_COMPONENT = $(OUT_CLASS)$(PS)todo
COMPONENT_RDB = $(OUT_BIN)$(PS)ToDo.rdb
COMPONENT_JAR = $(OUT_CLASS)$(PS)ToDo.jar
COMPONENT_MANIFESTFILE = Manifest
COMPONENT_NAME=ToDo
OUT_COMPONENT = $(OUT_CLASS)$(PS)$(COMPONENT_NAME)
COMPONENT_RDB_NAME = $(COMPONENT_NAME).rdb
COMPONENT_RDB = $(OUT_BIN)$(PS)$(COMPONENT_RDB_NAME)
COMPONENT_PACKAGE_NAME = $(COMPONENT_NAME).zip
COMPONENT_PACKAGE_URL = $(subst \\,/,"file:///$(COMPONENT_PACKAGE_DIR)$(PS)$(COMPONENT_PACKAGE_NAME)")
COMPONENT_JAR_NAME = $(COMPONENT_NAME).jar
COMPONENT_JAR = $(OUT_CLASS)$(PS)$(COMPONENT_JAR_NAME)
COMPONENT_MANIFESTFILE = $(OUT_COMPONENT)$(PS)$(COMPONENT_NAME).Manifest
REGISTERFLAG = $(OUT_MISC)$(PS)$(COMPONENT_NAME)_register_component.flag
COMPONENTJARFLAG = $(OUT_MISC)$(PS)$(COMPONENT_NAME)_create_component_jar.flag
TYPEFLAG= $(OUT_MISC)$(PS)$(COMPONENT_NAME)_type_generation.flag
JAVAFLAG= $(OUT_MISC)$(PS)$(COMPONENT_NAME)_javac.flag
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
PACKAGE = org$(PS)openoffice
JAVAFILES = ToDo.java
......@@ -35,6 +38,8 @@ GENURDFILES = $(subst \\,\,$(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))
COMPONENT_CLASSFILES = $(COMPONENT_NAME).class $(COMPONENT_NAME)$$$(COMPONENT_NAME)Implementation.class
COMPONENT_CLASSFILES += $(subst $(OUT_MISC)$(PS),,$(GENJAVAFILES:.java=.class))
SDK_CLASSPATH = $(subst $(EMPTYSTRING) $(PATH_SEPARATOR),$(PATH_SEPARATOR),$(OFFICE_CLASSES_DIR)$(PS)jurt.jar\
$(PATH_SEPARATOR)$(OFFICE_CLASSES_DIR)$(PS)unoil.jar\
......@@ -57,27 +62,33 @@ include $(SETTINGS)/stdtarget.mk
$(OUT_COMPONENT) : $(OUT) $(OUT_CLASS)
$(MKDIR) $@
$(OUT_COMPONENT)$(PS)$(COMPONENT_NAME).Manifest : $(OUT_COMPONENT)
@echo RegistrationClassName: $(COMPONENT_NAME)> $@
$(TYPEFLAG) : $(IDLFILES)
$(BIN_DIR)$(PS)idlc -I. -I$(IDL_DIR) -O$(OUT_MISC) $^
$(BIN_DIR)$(PS)regmerge $(COMPONENT_RDB) /UCR $(GENURDFILES)
$(BIN_DIR)$(PS)regmerge $(COMPONENT_RDB) / $(DKREGISTRYNAME)
$(BIN_DIR)$(PS)javamaker -BUCR -Torg.OpenOffice.XToDo -O$(OUT_MISC) $(COMPONENT_RDB)
# $(BIN_DIR)$(PS)regmerge $(COMPONENT_RDB) / $(DKREGISTRYNAME)
$(BIN_DIR)$(PS)javamaker -BUCR -Torg.openoffice.XToDo -O$(OUT_MISC) $(COMPONENT_RDB) $(DKREGISTRYNAME)
@echo bla > $@
$(JAVAFLAG) : $(OUT_COMPONENT) $(TYPEFLAG) $(JAVAFILES)
javac -classpath "$(SDK_CLASSPATH)" -d $(OUT_COMPONENT) $(GENJAVAFILES) $(JAVAFILES)
@echo bla > $@
$(COMPONENTJARFLAG) : $(JAVAFLAG)
jar cvfm $(COMPONENT_JAR) $(COMPONENT_MANIFESTFILE) -C $(OUT_COMPONENT) .
$(COMPONENTJARFLAG) : $(COMPONENT_MANIFESTFILE) $(JAVAFLAG)
# jar cvfm $(COMPONENT_JAR) $(COMPONENT_MANIFESTFILE) -C $(OUT_COMPONENT) .
cd $(OUT_COMPONENT) && jar cvfm $(COMPONENT_JAR) $(COMPONENT_MANIFESTFILE) $(COMPONENT_CLASSFILES)
$(COPY) $(COMPONENT_JAR) $(OUT_BIN)
cd $(OUT_BIN) && jar cvfM $(COMPONENT_PACKAGE_NAME) $(COMPONENT_JAR_NAME) $(COMPONENT_RDB_NAME)
$(DEL) $(OUT_BIN)$(PS)$(COMPONENT_JAR_NAME)
-$(DEL) $(REGISTERFLAG)
@echo $(COMPONENT_PACKAGE_URL)
@echo bla > $@
$(REGISTERFLAG) : $(COMPONENTJARFLAG)
ifneq "$(SDK_AUTO_DEPLOYMENT)" ""
$(BIN_DIR)$(PS)regmerge "$(URLPREFIX)$(OFFICE_FILEURL)/applicat.rdb" /UCR $(GENURDFILES)
$(COPY) $(COMPONENT_JAR) "$(OFFICE_CLASSES_DIR)"
java -classpath "$(SDK_CLASSPATH)" com.sun.star.tools.uno.RegComp "$(URLPREFIX)$(OFFICE_FILEURL)/applicat.rdb" register "$(URLPREFIX)$(OFFICE_FILEURL)/classes/ToDo.jar" com.sun.star.loader.Java2
cd $(OFFICE_PROGRAM_PATH) && pkgchk $(COMPONENT_PACKAGE_URL)
@echo bla > $@
else
@echo --------------------------------------------------------------------------------
......
import com.sun.star.comp.loader.FactoryHelper;
import com.sun.star.lang.XInitialization;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.lang.XSingleServiceFactory;
import com.sun.star.lang.XTypeProvider;
import com.sun.star.lib.uno.helper.WeakBase;
import com.sun.star.registry.XRegistryKey;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.Type;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XInterface;
import com.sun.star.uno.XWeak;
import org.openoffice.*;
// addintional interfaces used by the implementation
import com.sun.star.sheet.XSpreadsheetDocument;
import com.sun.star.sheet.XSpreadsheet;
import com.sun.star.sheet.XCellRangeMovement;
......@@ -23,32 +30,77 @@ 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
/** 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 inner class provides the component as a concrete implementation
* of the service description. It implements the needed interfaces.
* @implements XToDo
/** Gives 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.
* @see com.sun.star.comp.loader.JavaLoader#
* @param stringImplementationName The implementation name of the component.
* @param xmultiservicefactory The service manager, who gives access to every
* known service.
* @param xregistrykey Makes structural information (except regarding tree
* structures) of a single
* registry key accessible.
*/
public static XSingleServiceFactory __getServiceFactory(String stringImplementationName,
XMultiServiceFactory xmultiservicefactory,
XRegistryKey xregistrykey) {
XSingleServiceFactory xsingleservicefactory = null;
if ( stringImplementationName.equals(
ToDoImplementation.class.getName() ) )
xsingleservicefactory = FactoryHelper.getServiceFactory(
ToDoImplementation.class,
ToDoImplementation.__serviceName,
xmultiservicefactory,
xregistrykey );
return xsingleservicefactory;
}
/** Writes the service information into the given registry key.
* This method is called by the <code>JavaLoader</code>.
* @return returns true if the operation succeeded
* @see com.sun.star.comp.loader.JavaLoader#
* @param xregistrykey Makes structural information (except regarding tree
* structures) of a single
* registry key accessible.
*/
public static boolean __writeRegistryServiceInfo(XRegistryKey xregistrykey) {
return FactoryHelper.writeRegistryServiceInfo(
ToDoImplementation.class.getName(),
ToDoImplementation.__serviceName,
xregistrykey );
}
/** 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.
*/
static public class _ToDo implements XToDo, XTypeProvider {
static private final String __serviceName = "org.OpenOffice.ToDo";
public static class ToDoImplementation 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 service manager, that gives access to all registered services.
*/
private XMultiServiceFactory xmultiservicefactory;
// Implementation helper variables
static private final int INT_COLUMN_FEATURE = 0;
static private final int INT_COLUMN_COMMENT = 1;
static private final int INT_COLUMN_NEEDEDDAYS = 2;
......@@ -60,20 +112,75 @@ public class ToDo {
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.
/** The constructor of the inner class has a XMultiServiceFactory parameter.
* @param xmultiservicefactoryInitialization A special service factory
* could be introduced while initializing.
*/
public _ToDo(XMultiServiceFactory xMultiServiceFactory) {
xmultiservicefactory = xMultiServiceFactory;
public ToDoImplementation(XMultiServiceFactory xmultiservicefactoryInitialization) {
xmultiservicefactory = xmultiservicefactoryInitialization;
}
/** This method returns an array of all supported service names.
* @return Array of supported service names.
*/
public String[] getSupportedServiceNames() {
String []stringSupportedServiceNames = new String[ 1 ];
stringSupportedServiceNames[ 0 ] = __serviceName;
return( stringSupportedServiceNames );
}
/** This method returns true, if the given service will be
* supported by the component.
* @param stringService Service name.
* @return True, if the given service name will be supported.
*/
public boolean supportsService(String stringService) {
boolean booleanSupportsService = false;
if ( stringService.equals( __serviceName ) ) {
booleanSupportsService = true;
}
return( booleanSupportsService );
}
/** Return the class name of the component.
* @return Class name of the component.
*/
public String getImplementationName() {
return( ToDoImplementation.class.getName() );
}
/** Provides a sequence of all types (usually interface types)
* provided by the object.
* @return Sequence of all types (usually interface types) provided by the
* service.
*/
public Type[] getTypes() {
Type[] typeReturn = {};
try {
typeReturn = new Type[] {
new Type( XToDo.class),
new Type( XTypeProvider.class ),
new Type( XServiceInfo.class ),
new Type( XWeak.class ),
new Type( XInterface.class )
};
} catch( Exception exception ) {
System.err.println( exception );
}
return( typeReturn );
}
/** For every bug/feature listed in a spreadsheet document this method calculates
......@@ -89,18 +196,18 @@ public class ToDo {
* @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 {
public void recalc( java.lang.Object aInstance )
throws com.sun.star.uno.RuntimeException {
try {
// Querying for the interface XSpreadsheetDocument
XSpreadsheetDocument xspreadsheetdocument =
( XSpreadsheetDocument ) UnoRuntime.queryInterface(
XSpreadsheetDocument.class, aInstance );
( XSpreadsheetDocument ) UnoRuntime.queryInterface(
XSpreadsheetDocument.class, aInstance );
// Querying for the interface XIndexAccess
XIndexAccess xindexaccess = ( XIndexAccess )
UnoRuntime.queryInterface( XIndexAccess.class,
xspreadsheetdocument.getSheets() );
UnoRuntime.queryInterface( XIndexAccess.class,
xspreadsheetdocument.getSheets() );
// Getting the first XSpreadsheet
XSpreadsheet xspreadsheet = (XSpreadsheet)
......@@ -110,40 +217,37 @@ public class ToDo {
XCellRange xcellrange = ( XCellRange )
UnoRuntime.queryInterface( XCellRange.class, xspreadsheet );
/* Getting the gregorian calendar with the date on which to start the
calculation */
/* Getting the gregorian calendar with the date on which to start the
calculation */
GregorianCalendar gregoriancalendarAbsoluteStartDate =
this.getGregorianCalendarFromString(
this.getStringFromCell( xcellrange, 5, 2 ) );
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 */
/* Creating the service FunctionAccess, which allows generic access to
all spreadsheet functions */
Object objectFunctionAccess =
xmultiservicefactory.createInstance(
"com.sun.star.sheet.FunctionAccess" );
xmultiservicefactory.createInstance("com.sun.star.sheet.FunctionAccess" );
// Querying for the interface XFunctionAccess on service
// FunctionAccess
XFunctionAccess xfunctionaccess = (XFunctionAccess)
UnoRuntime.queryInterface(XFunctionAccess.class,
objectFunctionAccess );
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 ) );
xfunctionaccess,
gregoriancalendarStartDate.get( Calendar.YEAR ) );
// Get the private holidays
this.getPrivateHolidays( vectorHolidays, xcellrange,
xfunctionaccess );
this.getPrivateHolidays( vectorHolidays, xcellrange, xfunctionaccess );
// Getting the object array of holidays
Object[] objectSortedHolidays = vectorHolidays.toArray();
......@@ -160,11 +264,11 @@ public class ToDo {
// Getting the feature of the first cell
String stringFeature = this.getStringFromCell( xcellrange,
intRowTo + 1, this.INT_COLUMN_FEATURE );
intRowTo + 1, this.INT_COLUMN_FEATURE );
// Determine the last row with an entry in the first column
while ( ( stringFeature != null ) &&
( !stringFeature.equals( "" ) ) ) {
( !stringFeature.equals( "" ) ) ) {
intRowTo++;
stringFeature = this.getStringFromCell( xcellrange,
intRowTo + 1, this.INT_COLUMN_FEATURE );
......@@ -174,26 +278,24 @@ public class ToDo {
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 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++ ) {
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++ ) {
/* 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 ) );
UnoRuntime.queryInterface( XPropertySet.class,
xcellrange.getCellByPosition( this.INT_COLUMN_DUEDATE,
intRow ) );
// Changing the background color of the cell to white
xpropertyset.setPropertyValue( "CellBackColor",
......@@ -216,95 +318,54 @@ public class ToDo {
// 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/Bugtrack" +
"er/Source/Body_ReportDetail.asp?ID=" + stringBugID;
if ( !stringBugID.startsWith( "http://so-web1.germany.sun.com/bis/servlet/" +
"intray.ControlPanel?system=1&update=true&id=" ) ) {
String stringBugIDLink = "http://so-web1.germany.sun.com/bis/servlet/" +
"intray.ControlPanel?system=1&update=true&id=" + stringBugID +
"&showframeset=true";
// Querying for the interface XMultiServiceFactory
XMultiServiceFactory xmultiservicefactoryTextField =
(XMultiServiceFactory)
UnoRuntime.queryInterface(XMultiServiceFactory.class,
aInstance );
(XMultiServiceFactory)UnoRuntime.queryInterface(XMultiServiceFactory.class,
aInstance );
// Creating an instance of the text field URL
Object objectTextField =
xmultiservicefactoryTextField.createInstance(
"com.sun.star.text.TextField.URL" );
xmultiservicefactoryTextField.createInstance(
"com.sun.star.text.TextField.URL" );
// Querying for the interface XTextField
XTextField xtextfield = ( XTextField )
UnoRuntime.queryInterface( XTextField.class,
objectTextField );
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
*/
UnoRuntime.queryInterface( XPropertySet.class,
xtextfield );
// Setting the URL
xpropertysetTextField.setPropertyValue( "URL",
stringBugIDLink );
xpropertysetTextField.setPropertyValue( "URL", stringBugIDLink );
// Setting the representation of the URL
xpropertysetTextField.setPropertyValue(
"Representation", stringBugID );
xpropertysetTextField.setPropertyValue( "Representation", stringBugID );
// Querying for the interface XText
XText xtext = ( XText )
UnoRuntime.queryInterface( XText.class, xcell );
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 );
xtext.insertTextContent( xtextrange, xtextfield, false );
}
}
// Processing all features/bugs in the table
for ( int intRow = this.INT_ROW_FROM; intRow < INT_ROW_TO;
intRow++ ) {
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 );
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() );
......@@ -312,105 +373,87 @@ public class ToDo {
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" */
/* 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" ) )
) {
&& !( stringStatus.toLowerCase().trim().equals( "done" ) ) ) {
// Getting the start date after a specified number of workdays
gregoriancalendarStartDate = this.getWorkday(
gregoriancalendarStartDate, 1, objectHolidays,
xfunctionaccess );
gregoriancalendarStartDate, 1, objectHolidays,
xfunctionaccess );
// Getting a string with the date format jjjj-mm-dd from the gregorian calendar
String stringDate =
this.getStringFromGregorianCalendar(
gregoriancalendarStartDate );
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 );
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 );
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 );
this.getWorkday( gregoriancalendarStartDate,
intNeededDays - 1,
objectHolidays, xfunctionaccess );
// Creating a string with the date format jjjj-mm-dd
stringDate = this.getStringFromGregorianCalendar(
gregoriancalendarEndDate );
gregoriancalendarEndDate );
// Set the end date in the specified cell of the table
this.setStringToCell( xcellrange, intRow,
this.INT_COLUMN_ENDDATE, stringDate );
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 );
intRow, this.INT_COLUMN_END_DAY_OF_WEEK );
// Set the initial date for the next loop
gregoriancalendarStartDate = ( GregorianCalendar )
gregoriancalendarEndDate.clone();
gregoriancalendarEndDate.clone();
// Get the due date from the table
String stringDueDate = this.getStringFromCell(
xcellrange, intRow, this.INT_COLUMN_DUEDATE );
xcellrange, intRow, this.INT_COLUMN_DUEDATE );
// Testing if the due date is not empty
if ( !stringDueDate.equals( "" ) ) {
GregorianCalendar gregoriancalendarDueDate =
this.getGregorianCalendarFromString(
stringDueDate );
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 );
if ( gregoriancalendarDueDate.before( gregoriancalendarEndDate ) ) {
/* Getting the date when the processing of the feature/bug should
be started at the latest */
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 ) );
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 ) ) {
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 );
String stringStartDate = this.getStringFromCell(
xcellrange, intRowToInsert, this.INT_COLUMN_STARTDATE );
// Search until a valid start date is found
while ( stringStartDate.equals( "" ) ) {
......@@ -418,78 +461,62 @@ public class ToDo {
intRowToInsert--;
// Get the start date for the feature/bug in the current row
stringStartDate =
this.getStringFromCell( xcellrange,
intRowToInsert,
this.INT_COLUMN_STARTDATE );
stringStartDate = this.getStringFromCell(
xcellrange, intRowToInsert, this.INT_COLUMN_STARTDATE );
}
// Get the GregorianCalender format for the start date
gregoriancalendarPreviousStartDate =
this.getGregorianCalendarFromString(
stringStartDate );
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 );
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 );
Math.round( xcellNeededDaysWhereToInsert.getValue() );
String stringPreviousDueDate =
this.getStringFromCell( xcellrange,
intRowToInsert, this.INT_COLUMN_DUEDATE );
GregorianCalendar gregoriancalendarPreviousNewEndDate =
this.getWorkday( gregoriancalendarPreviousStartDate,
intNeededDays - 1 + intNeededDaysWhereToInsert,
objectHolidays, xfunctionaccess );
String stringPreviousDueDate = this.getStringFromCell(
xcellrange, intRowToInsert, this.INT_COLUMN_DUEDATE );
GregorianCalendar
gregoriancalendarPreviousDueDate = null;
if ( !stringPreviousDueDate.equals( "" ) ) {
gregoriancalendarPreviousDueDate =
this.getGregorianCalendarFromString(
stringPreviousDueDate );
this.getGregorianCalendarFromString( stringPreviousDueDate );
}
if ( ( intRowToInsert == intRow ) ||
( gregoriancalendarPreviousNewEndDate.after(
gregoriancalendarPreviousDueDate ) ) ) {
// Querying for the interface XPropertySet for the cell providing the due date
( 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 ) );
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 ) );
"CellBackColor", new Integer( 16711680 ) );
} else {
// Querying for the interface XColumnRowRange on the XCellRange
XColumnRowRange xcolumnrowrange = (
XColumnRowRange )
UnoRuntime.queryInterface(
XColumnRowRange.class, xcellrange );
XColumnRowRange xcolumnrowrange = ( XColumnRowRange )
UnoRuntime.queryInterface(
XColumnRowRange.class, xcellrange );
// Inserting one row to the table
xcolumnrowrange.getRows().insertByIndex(
intRowToInsert, 1 );
xcolumnrowrange.getRows().insertByIndex( intRowToInsert, 1 );
// Querying for the interface XCellRangeMovement on XCellRange
XCellRangeMovement xcellrangemovement =
( XCellRangeMovement )
UnoRuntime.queryInterface(
XCellRangeMovement.class, xcellrange );
XCellRangeMovement xcellrangemovement = ( XCellRangeMovement )
UnoRuntime.queryInterface( XCellRangeMovement.class, xcellrange );
// Creating the cell address of the destination
CellAddress celladdress = new CellAddress();
......@@ -507,12 +534,10 @@ public class ToDo {
cellrangeaddress.EndRow = intRow + 1;
// Moves the cell range to another position in the document
xcellrangemovement.moveRange( celladdress,
cellrangeaddress );
xcellrangemovement.moveRange( celladdress, cellrangeaddress );
// Removing the row not needed anymore
xcolumnrowrange.getRows().removeByIndex(
intRow + 1, 1 );
xcolumnrowrange.getRows().removeByIndex( intRow + 1, 1 );
// Set the current row, because we want to recalculate all rows below
intRow = intRowToInsert - 1;
......@@ -520,16 +545,14 @@ public class ToDo {
// 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 ) );
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();
gregoriancalendarStartDate = ( GregorianCalendar )
gregoriancalendarAbsoluteStartDate.clone();
}
}
}
......@@ -542,43 +565,14 @@ public class ToDo {
}
}
/** 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 = {};
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 ) {
public String getStringFromGregorianCalendar( GregorianCalendar gregoriancalendar ) {
String stringDate = gregoriancalendar.get( Calendar.DATE )
+ STRING_SEPARATOR + ( gregoriancalendar.get( Calendar.MONTH ) + 1 )
+ STRING_SEPARATOR + gregoriancalendar.get( Calendar.YEAR );
+ STRING_SEPARATOR + ( gregoriancalendar.get( Calendar.MONTH ) + 1 )
+ STRING_SEPARATOR + gregoriancalendar.get( Calendar.YEAR );
return( stringDate );
}
......@@ -587,12 +581,11 @@ public class ToDo {
* @param stringDate String to be converted.
* @return The result of the converting of the string.
*/
public GregorianCalendar getGregorianCalendarFromString(
String stringDate ) {
public GregorianCalendar getGregorianCalendarFromString( String stringDate ) {
int []intDateValue = this.getDateValuesFromString( stringDate );
return( new GregorianCalendar( intDateValue[ 2 ], intDateValue[ 1 ],
intDateValue[ 0 ] ) );
intDateValue[ 0 ] ) );
}
/** Getting the day, month and year from a string.
......@@ -604,21 +597,20 @@ public class ToDo {
int intPositionFirstTag = stringDate.indexOf( STRING_SEPARATOR );
int intPositionSecondTag = stringDate.indexOf( STRING_SEPARATOR,
intPositionFirstTag + 1 );
intPositionFirstTag + 1 );
// Getting the value of the year
intDateValues[ 0 ] = Integer.parseInt( stringDate.substring( 0,
intPositionFirstTag ) );
intPositionFirstTag ) );
// Getting the value of the month
intDateValues[ 1 ] = Integer.parseInt(
stringDate.substring( intPositionFirstTag + 1,
intPositionSecondTag ) ) - 1;
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()
) );
stringDate.substring( intPositionSecondTag + 1, stringDate.length()
) );
return( intDateValues );
}
......@@ -629,17 +621,15 @@ public class ToDo {
* @param intColumn Number of column.
* @return String from the specified cell.
*/
public String getStringFromCell( XCellRange xcellrange, int intRow,
int intColumn ) {
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 );
XCell xcellStartDate = xcellrange.getCellByPosition( intColumn, intRow );
// Querying for the interface XTextRange on the XCell
xtextrangeStartDate = (XTextRange)
UnoRuntime.queryInterface( XTextRange.class, xcellStartDate );
UnoRuntime.queryInterface( XTextRange.class, xcellStartDate );
}
catch( Exception exception ) {
this.showExceptionMessage( exception );
......@@ -656,14 +646,13 @@ public class ToDo {
* @param stringDate Date to write to the cell.
*/
public void setStringToCell( XCellRange xcellrange, int intRow,
int intColumn, String stringDate ) {
int intColumn, String stringDate ) {
try {
// Getting the cell holding the information on the day to start
XCell xcellStartDate = xcellrange.getCellByPosition( intColumn,
intRow );
XCell xcellStartDate = xcellrange.getCellByPosition( intColumn, intRow );
// Querying for the interface XTextRange on the XCell
XTextRange xtextrange = (XTextRange) UnoRuntime.queryInterface(
XTextRange.class, xcellStartDate );
XTextRange xtextrange = (XTextRange)
UnoRuntime.queryInterface( XTextRange.class, xcellStartDate );
// Setting the new start date
xtextrange.setString( stringDate );
}
......@@ -679,7 +668,7 @@ public class ToDo {
* @param intColumn Number of column.
*/
public void setDayOfWeek( GregorianCalendar gregoriancalendar,
XCellRange xcellrange, int intRow, int intColumn ) {
XCellRange xcellrange, int intRow, int intColumn ) {
int intDayOfWeek = gregoriancalendar.get( Calendar.DAY_OF_WEEK );
String stringDayOfWeek = "";
if ( intDayOfWeek == Calendar.MONDAY ) {
......@@ -715,17 +704,16 @@ public class ToDo {
// Get the Official Holiday for two years
for ( int intNumberOfYear = 0;
intNumberOfYear <= ( intHowManyYears - 1 );
intNumberOfYear++ ) {
intNumberOfYear <= ( intHowManyYears - 1 );
intNumberOfYear++ ) {
intYear += intNumberOfYear;
// Getting the Easter sunday
Double doubleEasterSunday = ( Double )
xfunctionaccess.callFunction(
"EASTERSUNDAY", new Object[] { new Integer( intYear ) } );
xfunctionaccess.callFunction(
"EASTERSUNDAY", new Object[] { new Integer( intYear ) } );
int intEasterSunday = ( int ) Math.round(
doubleEasterSunday.doubleValue() );
int intEasterSunday = ( int ) Math.round( doubleEasterSunday.doubleValue() );
// New-year
vectorHolidays.addElement( xfunctionaccess.callFunction(
......@@ -743,35 +731,33 @@ public class ToDo {
// Labour Day
vectorHolidays.addElement( xfunctionaccess.callFunction(
"DATE",
new Object[] { new Integer( intYear ), new Integer( 5 ),
new Integer( 1 ) } ) );
"DATE",
new Object[] { new Integer( intYear ), new Integer( 5 ),
new Integer( 1 ) } ) );
// Ascension Day
vectorHolidays.addElement(
new Double( intEasterSunday + 39 ) );
vectorHolidays.addElement( new Double( intEasterSunday + 39 ) );
// Pentecost monday
vectorHolidays.addElement(
new Double( intEasterSunday + 50 ) );
vectorHolidays.addElement( new Double( intEasterSunday + 50 ) );
// German Unification
vectorHolidays.addElement( xfunctionaccess.callFunction(
"DATE",
new Object[] { new Integer( intYear ), new Integer( 10 ),
new Integer( 3 ) } ) );
"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 ) } ) );
"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 ) } ) );
"DATE",
new Object[] { new Integer( intYear ), new Integer( 12 ),
new Integer( 26 ) } ) );
}
}
catch( Exception exception ) {
......@@ -788,37 +774,31 @@ public class ToDo {
* @return The gregorian date before or after a specified number of workdays.
*/
public GregorianCalendar getWorkday(
GregorianCalendar gregoriancalendarStartDate,
int intDays, Object[][] objectHolidays,
XFunctionAccess xfunctionaccess ) {
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 ) )
} );
"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(
"com.sun.star.sheet.addin.Analysis.getWorkday",
new Object[] { doubleDate, new Integer( intDays ),
objectHolidays } );
new Object[] { doubleDate, new Integer( intDays ), objectHolidays } );
Double doubleYear = ( Double ) xfunctionaccess.callFunction(
"YEAR",
new Object[] { doubleWorkday } );
"YEAR", new Object[] { doubleWorkday } );
Double doubleMonth = ( Double ) xfunctionaccess.callFunction(
"MONTH",
new Object[] { doubleWorkday } );
"MONTH", new Object[] { doubleWorkday } );
Double doubleDay = ( Double ) xfunctionaccess.callFunction(
"DAY",
new Object[] { doubleWorkday } );
"DAY", new Object[] { doubleWorkday } );
gregoriancalendarWorkday = new GregorianCalendar(
doubleYear.intValue(),
......@@ -838,43 +818,36 @@ public class ToDo {
* @param xfunctionaccess Provides the access to functions of the Calc.
*/
public void getPrivateHolidays( Vector vectorHolidays,
XCellRange xcellrange,
XFunctionAccess xfunctionaccess ) {
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();
intColumn, intRow ).getValue();
double doubleHolidayEnd = xcellrange.getCellByPosition(
intColumn + 1,
intRow ).getValue();
intColumn + 1, intRow ).getValue();
while ( doubleHolidayStart != 0 ) {
if ( doubleHolidayEnd == 0 ) {
vectorHolidays.addElement(
new Integer( (int) Math.round(
doubleHolidayStart ) ) );
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 ) );
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();
doubleHolidayStart = xcellrange.getCellByPosition( intColumn, intRow ).getValue();
doubleHolidayEnd = xcellrange.getCellByPosition( intColumn + 1, intRow ).getValue();
}
}
catch( Exception exception ) {
......@@ -891,8 +864,8 @@ public class ToDo {
jframe.setSize(300, 200);
jframe.setVisible(true);
javax.swing.JOptionPane.showMessageDialog( jframe, stringMessage,
"Debugging information",
javax.swing.JOptionPane.INFORMATION_MESSAGE );
"Debugging information",
javax.swing.JOptionPane.INFORMATION_MESSAGE );
jframe.dispose();
}
......@@ -904,7 +877,7 @@ public class ToDo {
public void showExceptionMessage( Exception exception ) {
java.io.StringWriter stringwriter = new java.io.StringWriter();
java.io.PrintWriter printwriter =
new java.io.PrintWriter( stringwriter );
new java.io.PrintWriter( stringwriter );
exception.printStackTrace( printwriter);
System.err.println( exception );
this.showMessage( stringwriter.getBuffer().substring(0) );
......@@ -912,40 +885,5 @@ public class ToDo {
}
/**
* 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);
}
}
......@@ -11,7 +11,7 @@
#include <com/sun/star/uno/XInterface.idl>
module org {
module OpenOffice {
module openoffice {
interface XToDo : com::sun::star::uno::XInterface
{
void recalc( [in] any aInstance );
......
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