summaryrefslogtreecommitdiff
path: root/forms/qa/integration/forms/CellBinding.java
diff options
context:
space:
mode:
Diffstat (limited to 'forms/qa/integration/forms/CellBinding.java')
-rw-r--r--forms/qa/integration/forms/CellBinding.java560
1 files changed, 560 insertions, 0 deletions
diff --git a/forms/qa/integration/forms/CellBinding.java b/forms/qa/integration/forms/CellBinding.java
new file mode 100644
index 000000000000..3bf171d82465
--- /dev/null
+++ b/forms/qa/integration/forms/CellBinding.java
@@ -0,0 +1,560 @@
+/*
+ * CellBinding.java
+ *
+ * Created on 12. Mai 2004, 15:15
+ */
+
+package integration.forms;
+
+import com.sun.star.uno.*;
+import com.sun.star.util.*;
+import com.sun.star.lang.*;
+import com.sun.star.beans.*;
+import com.sun.star.form.binding.*;
+import com.sun.star.accessibility.*;
+import com.sun.star.awt.XListBox;
+import com.sun.star.table.CellAddress;
+import com.sun.star.table.XCell;
+import com.sun.star.sheet.XCellRangeData;
+import com.sun.star.sheet.XCellRangeFormula;
+import com.sun.star.table.CellRangeAddress;
+import com.sun.star.text.XTextRange;
+
+/**
+ *
+ * @author fs93730
+ */
+public class CellBinding extends complexlib.ComplexTestCase
+{
+ /** the test document our form layer lives in */
+ private SpreadsheetDocument m_document;
+ /** our form layer */
+ private FormLayer m_formLayer;
+ /** our service factory */
+ private XMultiServiceFactory m_orb;
+
+ /** Creates a new instance of CellBinding */
+ public CellBinding()
+ {
+ }
+
+ public String[] getTestMethodNames()
+ {
+ return new String[] {
+ "checkTextFieldBinding",
+ "checkBooleanRadioBinding",
+ "checkStringRadioBinding",
+ "checkBooleanCheckBoxBinding",
+ "checkStringCheckBoxBinding",
+ "checkListBoxBinding",
+ "checkListBoxIndexBinding"
+ };
+ }
+
+ public String getTestObjectName()
+ {
+ return "Form Control Spreadsheet Cell Binding Test";
+ }
+
+ /* ------------------------------------------------------------------ */
+ /** closes our document, if we have an open one
+ */
+ private void closeDocument()
+ {
+ try
+ {
+ // close our document
+ if ( m_document != null )
+ {
+ XCloseable closeDoc = (XCloseable)UnoRuntime.queryInterface( XCloseable.class,
+ m_document.getDocument() );
+ closeDoc.close( true );
+ }
+ }
+ catch ( com.sun.star.uno.Exception e )
+ {
+ }
+ }
+
+ /* ------------------------------------------------------------------ */
+ public void before() throws com.sun.star.uno.Exception, java.lang.Exception
+ {
+ m_orb = (XMultiServiceFactory)param.getMSF();
+ m_document = new SpreadsheetDocument( m_orb );
+ m_formLayer = new FormLayer( m_document );
+ }
+
+ /* ------------------------------------------------------------------ */
+ public void after() throws com.sun.star.uno.Exception, java.lang.Exception
+ {
+ closeDocument();
+ }
+
+ /* ------------------------------------------------------------------ */
+ public void checkTextFieldBinding( ) throws com.sun.star.uno.Exception, java.lang.Exception
+ {
+ final short col = 0;
+ final short row = 2;
+ final String text = new String( "content" );
+ final String otherText = new String( "something else" );
+ final String yetAnotherText = new String( "yet another text" );
+
+ // cretae a normal text control
+ XPropertySet controlModel = m_formLayer.createControlAndShape( "DatabaseTextField", 30, 9, 30, 6 );
+
+ // bind it to cell A1
+ bindToCell( controlModel, col, row );
+
+ // switch to alive mode
+ m_document.getCurrentView().toggleFormDesignMode();
+
+ // test the data transfer control -> cell
+ simulateUserTextInput( controlModel, text );
+ verifyStringCellContent( col, row, text, "A text field does not forward its user input to the cell." );
+
+ // the same, but this time changing the control value programmatically
+ controlModel.setPropertyValue( "Text", otherText );
+ verifyStringCellContent( col, row, otherText, "A text field does not forward programmatic changes to the cell." );
+
+ // the other way round: cell->control
+ setCellText( col, row, yetAnotherText );
+ String controlText = (String)controlModel.getPropertyValue( "Text" );
+ if ( !controlText.equals( yetAnotherText ) )
+ failed( "Changes in the cell are not forwarded to the text field." );
+ }
+ /* ------------------------------------------------------------------ */
+ public void checkBooleanRadioBinding( ) throws com.sun.star.uno.Exception, java.lang.Exception
+ {
+ // two radio buttons
+ XPropertySet primaryRadio = createRadio( 28, "radio button no. 1", "radio group", "primary" );
+ XPropertySet secondaryRadio = createRadio( 33, "radio button no. 2", "radio group", "secodary" );
+
+ // bind them
+ short col = (short)0;
+ short row1 = (short)6;
+ short row2 = (short)7;
+ bindToCell( primaryRadio, col, row1 );
+ bindToCell( secondaryRadio, col, row2 );
+
+ // check the first button
+ simulateUserRadioCheck( primaryRadio );
+ // check the cell content
+ verifyNumericCellContent( col, row1, 1, "Radio buttons do not forward their (boolean) values to cells (1)." );
+ verifyNumericCellContent( col, row2, 0, "Radio buttons do not forward their (boolean) values to cells (2)." );
+ // check the second button
+ simulateUserRadioCheck( secondaryRadio );
+ // check the cell content
+ verifyNumericCellContent( col, row1, 0, "Radio buttons do not forward their (boolean) values to cells (3)." );
+ verifyNumericCellContent( col, row2, 1, "Radio buttons do not forward their (boolean) values to cells (4)." );
+
+ // the other way round: writing values into the cell
+ setCellValue( col, row1, 1.0 );
+ // setting this should have checked the primary radio, which should have unchecked the secondary radio,
+ // which should have been propagated to the second cell
+ verifyNumericCellContent( col, row2, 0, "Changing primary cell is not propagated to the secondary cell (via the radio buttons)." );
+
+ // setting an empty cell should result in the radio being unchecked
+ setCellEmpty( col, row1 );
+ if ( ((Short)primaryRadio.getPropertyValue( "State" )).shortValue() != 0 )
+ failed( "Setting a cell to 'empty' does not reset the bound radio button." );
+ }
+
+ /* ------------------------------------------------------------------ */
+ public void checkStringRadioBinding( ) throws com.sun.star.uno.Exception, java.lang.Exception
+ {
+ // two radio buttons
+ XPropertySet primaryRadio = createRadio( 46, "radio button A", "radio ref group", "primary" );
+ XPropertySet secondaryRadio = createRadio( 51, "radio button B", "radio ref group", "secodary" );
+
+ // give the ref values
+ String refValueA = new String( "ref value A" );
+ String refValueB = new String( "ref value B" );
+ primaryRadio.setPropertyValue( "RefValue", refValueA );
+ secondaryRadio.setPropertyValue( "RefValue", refValueB );
+
+ // bind them to the same cell
+ short col = (short)0;
+ short row = (short)10;
+ bindToCell( primaryRadio, col, row );
+ bindToCell( secondaryRadio, col, row );
+
+ // checking a radio should set the respective ref value at the cell
+ simulateUserRadioCheck( primaryRadio );
+ verifyStringCellContent( col, row, refValueA, "A bound radio button with a reference value does not pass this value to the cell upon checking (1)." );
+ simulateUserRadioCheck( secondaryRadio );
+ verifyStringCellContent( col, row, refValueB, "A bound radio button with a reference value does not pass this value to the cell upon checking (2)." );
+
+ // changing the cell should check the buttons if the cell text equals the ref value
+ setCellText( col, row, "no ref value" );
+ verifyRadioStates( primaryRadio, secondaryRadio, (short)0, (short)0, "Radio button not unchecked, though the bound cell value does not equal ref value." );
+
+ setCellText( col, row, refValueA );
+ verifyRadioStates( primaryRadio, secondaryRadio, (short)1, (short)0, "Radio button not properly un/checked according to the cell and ref value (1)." );
+
+ setCellText( col, row, refValueB );
+ verifyRadioStates( primaryRadio, secondaryRadio, (short)0, (short)1, "Radio button not properly un/checked according to the cell and ref value (2)." );
+ }
+
+ /* ------------------------------------------------------------------ */
+ public void checkBooleanCheckBoxBinding( ) throws com.sun.star.uno.Exception, java.lang.Exception
+ {
+ XPropertySet checkBox = m_formLayer.createControlAndShape( "DatabaseCheckBox", 30, 59, 40, 4 );
+ checkBox.setPropertyValue( "Label", "check box" );
+ checkBox.setPropertyValue( "TriState", new Boolean( true ) );
+
+ short col = (short)0;
+ short row = (short)13;
+ bindToCell( checkBox, col, row );
+
+ // initialize with "not checked"
+ checkBox.setPropertyValue( "State", new Short( (short)0 ) );
+ verifyNumericCellContent( col, row, 0, "programmatically unchecking the check box is not propagated to the cell." );
+
+ // first click: "not checked" -> "checked"
+ simulateUserCheckBoxCheck( checkBox, (short)1 );
+ verifyNumericCellContent( col, row, 1, "moving the check box state to 'checked' is not propagated to the cell." );
+
+ // second click: "checked" -> "indetermined"
+ simulateUserCheckBoxCheck( checkBox, (short)2 );
+ verifyVoidCell( col, row, "propagating the 'indetermined' state to the cell does not work." );
+
+ // third click: "indetermined" -> "not checked"
+ simulateUserCheckBoxCheck( checkBox, (short)0 );
+ verifyNumericCellContent( col, row, 0, "unchecking a check box via UI is not propagated to the cell." );
+ }
+
+ /* ------------------------------------------------------------------ */
+ public void checkStringCheckBoxBinding( ) throws com.sun.star.uno.Exception, java.lang.Exception
+ {
+ String refValue = new String( "checked " );
+
+ XPropertySet checkBox = m_formLayer.createControlAndShape( "DatabaseCheckBox", 30, 68, 40, 4 );
+ checkBox.setPropertyValue( "Label", "check box with ref value" );
+ checkBox.setPropertyValue( "TriState", new Boolean( true ) );
+ checkBox.setPropertyValue( "RefValue", refValue );
+
+ short col = (short)0;
+ short row = (short)15;
+ bindToCell( checkBox, col, row );
+
+ // initialize with "not checked"
+ checkBox.setPropertyValue( "State", new Short( (short)0 ) );
+ verifyNumericCellContent( col, row, 0, "programmatically unchecking the check box is not propagated to the cell." );
+
+ // first click: "not checked" -> "checked"
+ simulateUserCheckBoxCheck( checkBox, (short)1 );
+ verifyStringCellContent( col, row, refValue, "moving the check box state to 'checked' does not propagated the ref value to the cell." );
+
+ // second click: "checked" -> "indetermined"
+ simulateUserCheckBoxCheck( checkBox, (short)2 );
+ verifyVoidCell( col, row, "propagating the 'indetermined' state to the cell does not work, when exchanging ref values." );
+
+ // third click: "indetermined" -> "not checked"
+ simulateUserCheckBoxCheck( checkBox, (short)0 );
+ verifyStringCellContent( col, row, "", "unchecking a check box via UI does not propagated the ref value to the cell." );
+ }
+
+ /* ------------------------------------------------------------------ */
+ /** verifies that a list box, which is bound via an ordinary value binding,
+ * works as expected
+ */
+ public void checkListBoxBinding( ) throws com.sun.star.uno.Exception, java.lang.Exception
+ {
+ XPropertySet listBox = m_formLayer.createControlAndShape( "DatabaseListBox", 30, 80, 40, 6 );
+ listBox.setPropertyValue( "Dropdown", new Boolean( true ) );
+ listBox.setPropertyValue( "StringItemList", new String[] { "Apples", "Oranges", "Peaches" } );
+
+ short col = (short)0;
+ short row = (short)18;
+
+ // ...............................................................
+ // add a list entry source which fills the list boxes list from cells in the
+ // spreadsheet
+ short sourceCol = (short)4;
+ setCellText( sourceCol, (short)( row - 1 ), "Apples" );
+ setCellText( sourceCol, (short)( row + 0 ), "Oranges" );
+ setCellText( sourceCol, (short)( row + 1 ), "Peaches" );
+
+ //setListSource( listBox, sourceCol, row, (short)( row + 2 ) );
+ // TODO: this is currently prone to deadlocks
+
+ // ...............................................................
+ // bind to a cell
+ bindToCell( listBox, col, row );
+
+ // ...............................................................
+ // do the tests
+ listBox.setPropertyValue( "SelectedItems", new short[] { (short)0 } );
+ verifyStringCellContent( col, row, "Apples", "programmatically selecting a list entry is not propagated to the cell." );
+
+ simulateUserListBoxSelection( listBox, "Oranges" );
+ verifyStringCellContent( col, row, "Oranges", "UI-selecting a list entry is not propagated to the cell." );
+
+ setCellText( col, row, "Peaches" );
+ short[] selectedItems = (short[])listBox.getPropertyValue( "SelectedItems" );
+ assureEquals( "changes in the cell bound to a list box are not propagated to the list box selection",
+ 2, selectedItems[0] );
+ }
+
+ /* ------------------------------------------------------------------ */
+ /** verifies that a list box, which is bound via a value binding exchanging the <b>index</b>
+ * of the selected entry, works as expected
+ */
+ public void checkListBoxIndexBinding() throws com.sun.star.uno.Exception, java.lang.Exception
+ {
+ XPropertySet listBox = m_formLayer.createControlAndShape( "DatabaseListBox", 30, 94, 40, 6 );
+ listBox.setPropertyValue( "Dropdown", new Boolean( true ) );
+ listBox.setPropertyValue( "StringItemList", new String[] { "Pears", "Bananas", "Strawberries" } );
+
+ short col = (short)0;
+ short row = (short)21;
+
+ // ...............................................................
+ // add a list entry source which fills the list boxes list from cells in the
+ // spreadsheet
+ short sourceCol = (short)4;
+ setCellText( sourceCol, (short)( row - 1 ), "Pears" );
+ setCellText( sourceCol, (short)( row + 0 ), "Bananas" );
+ setCellText( sourceCol, (short)( row + 1 ), "Strawberries" );
+
+ //setListSource( listBox, sourceCol, row, (short)( row + 2 ) );
+ // TODO: this is currently prone to deadlocks
+
+ // ...............................................................
+ // bind to a cell
+ bindToCell( listBox, col, row, "com.sun.star.table.ListPositionCellBinding" );
+
+ // ...............................................................
+ // do the tests
+ listBox.setPropertyValue( "SelectedItems", new short[] { (short)0 } );
+ verifyNumericCellContent( col, row, 1, "programmatically selecting a list entry is not propagated (as index) to the cell." );
+
+ simulateUserListBoxSelection( listBox, "Bananas" );
+ verifyNumericCellContent( col, row, 2, "UI-selecting a list entry is not propagated (as index) to the cell." );
+
+ setCellValue( col, row, 3 );
+ short[] selectedItems = (short[])listBox.getPropertyValue( "SelectedItems" );
+ assureEquals( "changes in the cell bound to a list box via list index are not propagated to the list box selection",
+ 2, selectedItems[0] );
+ }
+
+ /* ------------------------------------------------------------------ */
+ /** verifies that the content of a given cell equals a given string
+ */
+ private XPropertySet createRadio( int yPos, String label, String name, String tag ) throws com.sun.star.uno.Exception, java.lang.Exception
+ {
+ XPropertySet radio = m_formLayer.createControlAndShape( "DatabaseRadioButton", 30, yPos, 40, 4 );
+ radio.setPropertyValue( "Label", label );
+ radio.setPropertyValue( "Name", name );
+ radio.setPropertyValue( "Tag", tag );
+ return radio;
+ }
+
+ /* ------------------------------------------------------------------ */
+ /** verifies the states of two radio button
+ */
+ private boolean verifyRadioStates( XPropertySet radio1, XPropertySet radio2, short value1, short value2,
+ String errorMessage ) throws com.sun.star.uno.Exception, java.lang.Exception
+ {
+ if ( ( ((Short)radio1.getPropertyValue( "State" )).shortValue() != value1 )
+ || ( ((Short)radio2.getPropertyValue( "State" )).shortValue() != value2 )
+ )
+ {
+ failed( errorMessage );
+ return false;
+ }
+ return true;
+ }
+
+ /* ------------------------------------------------------------------ */
+ /** verifies that the content of a given cell equals a given string
+ */
+ private boolean verifyVoidCell( short col, short row, String failErrorMessage ) throws com.sun.star.uno.Exception
+ {
+ XCellRangeData cell = (XCellRangeData)UnoRuntime.queryInterface( XCellRangeData.class,
+ m_document.getSheet( 0 ).getCellByPosition( col, row )
+ );
+ Object cellContent = cell.getDataArray()[0][0];
+ if ( ((com.sun.star.uno.Any)cellContent).getType().getTypeClass() != com.sun.star.uno.TypeClass.VOID )
+ {
+ failed( failErrorMessage );
+ return false;
+ }
+ return true;
+ }
+
+ /* ------------------------------------------------------------------ */
+ /** verifies that the content of a given cell equals a given string
+ */
+ private boolean verifyNumericCellContent( short col, short row, double value, String failErrorMessage ) throws com.sun.star.uno.Exception
+ {
+ XCell cell = (XCell)UnoRuntime.queryInterface( XCell.class,
+ m_document.getSheet( 0 ).getCellByPosition( col, row )
+ );
+ if ( cell.getValue() != value )
+ {
+ failed( failErrorMessage );
+ return false;
+ }
+ return true;
+ }
+
+ /* ------------------------------------------------------------------ */
+ /** verifies that the content of a given cell equals a given string
+ */
+ private boolean verifyStringCellContent( short col, short row, String text, String failErrorMessage ) throws com.sun.star.uno.Exception
+ {
+ XTextRange cell = (XTextRange)UnoRuntime.queryInterface( XTextRange.class,
+ m_document.getSheet( 0 ).getCellByPosition( col, row )
+ );
+ if ( !cell.getString().equals( text ) )
+ {
+ failed( failErrorMessage );
+ return false;
+ }
+ return true;
+ }
+
+ /* ------------------------------------------------------------------ */
+ /** sets the text of a given cell to a given string
+ */
+ private void setCellText( short col, short row, String text ) throws com.sun.star.uno.Exception
+ {
+ XTextRange cell = (XTextRange)UnoRuntime.queryInterface( XTextRange.class,
+ m_document.getSheet( 0 ).getCellByPosition( col, row )
+ );
+ cell.setString( text );
+ }
+
+ /* ------------------------------------------------------------------ */
+ /** sets a numeric value in a given cell
+ */
+ private void setCellValue( short col, short row, double value ) throws com.sun.star.uno.Exception
+ {
+ XCell cell = (XCell)UnoRuntime.queryInterface( XCell.class,
+ m_document.getSheet( 0 ).getCellByPosition( col, row )
+ );
+ cell.setValue( value );
+ }
+
+ /* ------------------------------------------------------------------ */
+ /** sets a numeric value in a given cell
+ */
+ private void setCellEmpty( short col, short row ) throws com.sun.star.uno.Exception
+ {
+ // as long as #i29130# is not fixed, we do not set the cell to "empty", but to
+ // an invalid formular, which serves well for our purpose
+ XCellRangeFormula cell = (XCellRangeFormula)UnoRuntime.queryInterface( XCellRangeFormula.class,
+ m_document.getSheet( 0 ).getCellByPosition( col, row )
+ );
+ String[][] args = new String[][] { new String[] { "=INVALID_FUNCTION()" } };
+ cell.setFormulaArray( args );
+ }
+
+ /* ------------------------------------------------------------------ */
+ /** binds the given control model to the given cell in the first sheet,
+ * using the given service name for the binding
+ */
+ private void bindToCell( XPropertySet controlModel, short column, short row, String _bindingServiceName ) throws com.sun.star.uno.Exception
+ {
+ XBindableValue bindableModel = (XBindableValue)UnoRuntime.queryInterface( XBindableValue.class,
+ controlModel
+ );
+
+ CellAddress address = new CellAddress();
+ address.Column = column;
+ address.Row = row;
+ address.Sheet = 0;
+
+ NamedValue[] parameters = new NamedValue[] { new NamedValue() };
+ parameters[0].Name = "BoundCell";
+ parameters[0].Value = address;
+
+ XValueBinding cellBinding = (XValueBinding)UnoRuntime.queryInterface( XValueBinding.class,
+ m_document.createInstanceWithArguments( _bindingServiceName, parameters )
+ );
+
+ bindableModel.setValueBinding( cellBinding );
+ }
+
+ /* ------------------------------------------------------------------ */
+ /** binds the given control model to the given cell in the first sheet
+ */
+ private void bindToCell( XPropertySet _controlModel, short _column, short _row ) throws com.sun.star.uno.Exception
+ {
+ bindToCell( _controlModel, _column, _row, "com.sun.star.table.CellValueBinding" );
+ }
+
+ /* ------------------------------------------------------------------ */
+ /** sets the given cell range as list entry source for the given control
+ */
+ private void setListSource( XPropertySet _listSink, short _sourceCol, short _rowStart, short _rowEnd ) throws com.sun.star.uno.Exception
+ {
+ CellRangeAddress listSourceAddress = new CellRangeAddress( (short)0, (int)_sourceCol, (int)_rowStart, (int)_sourceCol, (int)_rowEnd );
+ NamedValue addressParameter = new NamedValue( "CellRange", listSourceAddress );
+
+ XListEntrySource listSource = (XListEntrySource)UnoRuntime.queryInterface( XListEntrySource.class,
+ m_document.createInstanceWithArguments( "com.sun.star.table.CellRangeListSource", new NamedValue[]{ addressParameter } )
+ );
+ XListEntrySink listSink = (XListEntrySink)UnoRuntime.queryInterface( XListEntrySink.class,
+ _listSink );
+ listSink.setListEntrySource( listSource );
+ }
+
+ /* ------------------------------------------------------------------ */
+ /** simulates a user action to check a radio button
+ */
+ private void simulateUserRadioCheck( XPropertySet radioModel ) throws com.sun.star.uno.Exception
+ {
+ XAccessible accessible = (XAccessible)UnoRuntime.queryInterface(
+ XAccessible.class, m_document.getCurrentView().getControl( radioModel ) );
+
+ XAccessibleValue xValue = (XAccessibleValue)UnoRuntime.queryInterface(
+ XAccessibleValue.class, accessible.getAccessibleContext() );
+
+ Integer newValue = new Integer( 1 );
+ xValue.setCurrentValue( newValue );
+ }
+
+ /* ------------------------------------------------------------------ */
+ /** simulates a user action to check a radio button
+ */
+ private void simulateUserCheckBoxCheck( XPropertySet checkBox, short state ) throws com.sun.star.uno.Exception
+ {
+ XAccessible accessible = (XAccessible)UnoRuntime.queryInterface(
+ XAccessible.class, m_document.getCurrentView().getControl( checkBox ) );
+
+ XAccessibleValue xValue = (XAccessibleValue)UnoRuntime.queryInterface(
+ XAccessibleValue.class, accessible.getAccessibleContext() );
+
+ xValue.setCurrentValue( new Short( state ) );
+ }
+
+ /* ------------------------------------------------------------------ */
+ /** simulates a user selecting an entry in a list box
+ */
+ private void simulateUserListBoxSelection( XPropertySet _listBox, String _selectEntry ) throws com.sun.star.uno.Exception
+ {
+ XListBox listBoxControl = (XListBox)UnoRuntime.queryInterface(
+ XListBox.class, m_document.getCurrentView().getControl( _listBox ) );
+ listBoxControl.selectItem( _selectEntry, true );
+ }
+
+ /* ------------------------------------------------------------------ */
+ /** simulates text input into the control belonging to the given model
+ */
+ private void simulateUserTextInput( XPropertySet controlModel, String text ) throws com.sun.star.uno.Exception
+ {
+ XAccessible accessible = (XAccessible)UnoRuntime.queryInterface(
+ XAccessible.class, m_document.getCurrentView().getControl( controlModel ) );
+
+ XAccessibleContext context = accessible.getAccessibleContext();
+ XServiceInfo si = (XServiceInfo)UnoRuntime.queryInterface( XServiceInfo.class,
+ accessible.getAccessibleContext() );
+
+ XAccessibleEditableText textAccess = (XAccessibleEditableText)UnoRuntime.queryInterface(
+ XAccessibleEditableText.class, accessible.getAccessibleContext() );
+
+ textAccess.setText( text );
+ }
+}