/************************************************************************* * * $RCSfile: RadioButtons.java,v $ * * $Revision: 1.2 $ * * last change: $Author: obo $ $Date: 2003-10-21 08:53:40 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses * * - GNU Lesser General Public License Version 2.1 * - Sun Industry Standards Source License Version 1.1 * * Sun Microsystems Inc., October, 2000 * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2000 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * * Sun Industry Standards Source License Version 1.1 * ================================================= * The contents of this file are subject to the Sun Industry Standards * Source License Version 1.1 (the "License"); You may not use this file * except in compliance with the License. You may obtain a copy of the * License at http://www.openoffice.org/license.html. * * Software provided under this License is provided on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. * See the License for the specific provisions governing your rights and * obligations concerning the Software. * * The Initial Developer of the Original Code is: Sun Microsystems, Inc. * * Copyright: 2000 by Sun Microsystems, Inc. * * All Rights Reserved. * * Contributor(s): _______________________________________ * * ************************************************************************/ package integration.forms; import com.sun.star.uno.*; import com.sun.star.util.*; import com.sun.star.lang.*; import com.sun.star.accessibility.*; import com.sun.star.container.*; import com.sun.star.beans.*; import complexlib.ComplexTestCase; import integration.forms.dbfTools; import integration.forms.DocumentHelper; import util.utils; import java.util.*; import java.io.*; import java.lang.*; /** * * @author fs@openoffice.org */ public class RadioButtons extends complexlib.ComplexTestCase { private DocumentHelper m_document; /// our current test document private FormLayer m_formLayer; /// quick access to the form layer private XMultiServiceFactory m_orb; /// our service factory private XPropertySet m_primaryForm; /// the primary form, to be used in text documents and in the first page of spreadsheets private XPropertySet m_secondaryForm; /// the secondary form, to be used in the second page of spreadsheets /* ------------------------------------------------------------------ */ public RadioButtons() { } /* ------------------------------------------------------------------ */ public String[] getTestMethodNames() { return new String[] { "checkSingleButtons", "checkThreeGroups", "checkMultipleForms", "checkCalcPageSwitch" }; } /* ------------------------------------------------------------------ */ public String getTestObjectName() { return "Form Radio Buttons Test"; } /* ------------------------------------------------------------------ */ public void before() throws com.sun.star.uno.Exception, java.lang.Exception { m_orb = (XMultiServiceFactory)param.getMSF(); } /* ------------------------------------------------------------------ */ private XPropertySet insertRadio( int nXPos, int nYPos, String label, String name, String refValue ) throws com.sun.star.uno.Exception, java.lang.Exception { return insertRadio( nXPos, nYPos, label, name, refValue, null ); } /* ------------------------------------------------------------------ */ private XPropertySet insertRadio( int nXPos, int nYPos, String label, String name, String refValue, XPropertySet parentForm ) throws com.sun.star.uno.Exception, java.lang.Exception { XIndexContainer parentContainer = dbfTools.queryXIndexContainer( parentForm ); XPropertySet xRadio = m_formLayer.createControlAndShape( "DatabaseRadioButton", nXPos, nYPos, 25, 6, parentContainer ); xRadio.setPropertyValue( "Label", label ); xRadio.setPropertyValue( "RefValue", refValue ); xRadio.setPropertyValue( "Name", name ); if ( null == m_primaryForm ) m_primaryForm = (XPropertySet)dbfTools.getParent( xRadio, XPropertySet.class ); return xRadio; } /* ------------------------------------------------------------------ */ /** this checks whether n groups of radio buttons, consisting of only one button each, * behave properly */ public void checkSingleButtons() throws com.sun.star.uno.Exception, java.lang.Exception { prepareTestStep( false ); insertRadio( 20, 30, "group 1", "group 1", "" ); insertRadio( 20, 38, "group 2", "group 2", "" ); insertRadio( 20, 46, "group 3", "group 3", "" ); insertRadio( 20, 54, "group 4", "group 4", "" ); // switch to alive mode m_document.getCurrentView( ).toggleFormDesignMode( ); checkRadio( "group 1", "" ); verifySingleRadios( 1, 0, 0, 0 ); checkRadio( "group 4", "" ); verifySingleRadios( 1, 0, 0, 1 ); checkRadio( "group 2", "" ); verifySingleRadios( 1, 1, 0, 1 ); checkRadio( "group 3", "" ); verifySingleRadios( 1, 1, 1, 1 ); cleanupTestStep(); } /* ------------------------------------------------------------------ */ /** creates three groups of radio buttons in a sample document, and checks whether they're working */ public void checkThreeGroups( ) throws com.sun.star.uno.Exception, java.lang.Exception { prepareTestStep( false ); insertRadio( 20, 30, "group 1 (a)", "group 1", "a" ); insertRadio( 20, 38, "group 1 (b)", "group 1", "b" ); insertRadio( 20, 50, "group 2 (a)", "group 2", "a" ); insertRadio( 20, 58, "group 2 (b)", "group 2", "b" ); insertRadio( 20, 70, "group 3 (a)", "group 3", "a" ); insertRadio( 20, 78, "group 3 (b)", "group 3", "b" ); // switch to alive mode m_document.getCurrentView( ).toggleFormDesignMode( ); // initially, after switching to alive mode, all buttons should be unchecked verifySixPack( 0, 0, 0, 0, 0, 0 ); // check one button in every group checkRadio( "group 1", "a" ); checkRadio( "group 2", "b" ); checkRadio( "group 3", "a" ); // and verify that this worked verifySixPack( 1, 0, 0, 1, 1, 0 ); // check all buttons which are currently unchecked checkRadio( "group 1", "b" ); checkRadio( "group 2", "a" ); checkRadio( "group 3", "b" ); // this should have reset the previous checks in the respective groups verifySixPack( 0, 1, 1, 0, 0, 1 ); // and back to the previous check state checkRadio( "group 1", "a" ); checkRadio( "group 2", "b" ); checkRadio( "group 3", "a" ); verifySixPack( 1, 0, 0, 1, 1, 0 ); cleanupTestStep(); } /* ------------------------------------------------------------------ */ /** tests whether radio buttons which belong to different forms behave properly */ public void checkMultipleForms( ) throws com.sun.star.uno.Exception, java.lang.Exception { prepareTestStep( false ); insertRadio( 20, 30, "group 1 (a)", "group 1", "a" ); insertRadio( 20, 38, "group 1 (b)", "group 1", "b" ); insertRadio( 20, 46, "group 1 (c)", "group 1", "c" ); m_secondaryForm = dbfTools.queryXPropertySet( m_document.createSiblingForm( m_primaryForm, "secondary" ) ); insertRadio( 70, 30, "group 2 (a)", "group 2", "a", m_secondaryForm ); insertRadio( 70, 38, "group 2 (b)", "group 2", "b", m_secondaryForm ); insertRadio( 70, 46, "group 2 (c)", "group 2", "c", m_secondaryForm ); // switch to alive mode m_document.getCurrentView( ).toggleFormDesignMode( ); // play around with different check states checkRadio( "group 1", "b", m_primaryForm ); checkRadio( "group 2", "c", m_secondaryForm ); verifyTwoFormRadios( 0, 1, 0, 0, 0, 1 ); checkRadio( "group 1", "c", m_primaryForm ); verifyTwoFormRadios( 0, 0, 1, 0, 0, 1 ); checkRadio( "group 2", "a", m_secondaryForm ); verifyTwoFormRadios( 0, 0, 1, 1, 0, 0 ); checkRadio( "group 1", "a", m_primaryForm ); verifyTwoFormRadios( 1, 0, 0, 1, 0, 0 ); checkRadio( "group 2", "b", m_secondaryForm ); verifyTwoFormRadios( 1, 0, 0, 0, 1, 0 ); cleanupTestStep(); } /* ------------------------------------------------------------------ */ /** tests for a special bug which we once had, where radio buttons lost their state after * switching spreadsheet pages */ public void checkCalcPageSwitch( ) throws com.sun.star.uno.Exception, java.lang.Exception { prepareTestStep( true ); m_formLayer.setInsertPage( 0 ); insertRadio( 15, 20, "group 1 (a)", "group 1", "a" ); insertRadio( 15, 26, "group 1 (b)", "group 1", "b" ); m_formLayer.setInsertPage( 1 ); XPropertySet xRadio = insertRadio( 15, 20, "group 2 (a)", "group 2", "a" ); insertRadio( 15, 26, "group 2 (b)", "group 2", "b" ); m_secondaryForm = (XPropertySet)dbfTools.getParent( xRadio, XPropertySet.class ); // switch to alive mode SpreadsheetView view = (SpreadsheetView)m_document.getCurrentView( ); view.toggleFormDesignMode( ); // and do initial checking checkRadio( "group 1", "a", m_primaryForm ); view.activateSheet( 1 ); checkRadio( "group 2", "b", m_secondaryForm ); // see whether the check states on the first page survived the page switch verifySheetRadios( 1, 0, 0, 1 ); // switch back to the first sheet, and see whether the check states survived view.activateSheet( 0 ); verifySheetRadios( 1, 0, 0, 1 ); // and for completely, check again after switching to third sheet and back to the first view.activateSheet( 2 ); view.activateSheet( 1 ); verifySheetRadios( 1, 0, 0, 1 ); cleanupTestStep(); } /* ------------------------------------------------------------------ */ public void after() { closeDocument(); } /* ------------------------------------------------------------------ */ /** 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 ) { } } /* ------------------------------------------------------------------ */ private void prepareTestStep( boolean useSpreadsheetDocument ) throws com.sun.star.uno.Exception, java.lang.Exception { m_primaryForm = null; m_document = useSpreadsheetDocument ? DocumentHelper.blankSpreadsheetDocument( m_orb ) : DocumentHelper.blankTextDocument( m_orb ); m_formLayer = new FormLayer( m_document ); } /* ------------------------------------------------------------------ */ private void cleanupTestStep( ) { closeDocument(); } /* ------------------------------------------------------------------ */ /** checks or unchecks the radio button (in our primary form) with the given name and the given ref value */ private void checkRadio( String groupName, String refValue ) throws com.sun.star.uno.Exception, java.lang.Exception { checkRadio( groupName, refValue, m_primaryForm ); } /* ------------------------------------------------------------------ */ /** checks or unchecks the radio button with the given name and the given ref value */ private void checkRadio( String groupName, String refValue, XPropertySet form ) throws com.sun.star.uno.Exception, java.lang.Exception { XPropertySet xRadio = getRadioModel( groupName, refValue, form ); XAccessible accessible = (XAccessible)UnoRuntime.queryInterface( XAccessible.class, m_document.getCurrentView().getControl( xRadio ) ); XAccessibleContext context = accessible.getAccessibleContext(); XServiceInfo si = (XServiceInfo)UnoRuntime.queryInterface( XServiceInfo.class, accessible.getAccessibleContext() ); String test = si.getImplementationName(); XAccessibleValue xValue = (XAccessibleValue)UnoRuntime.queryInterface( XAccessibleValue.class, accessible.getAccessibleContext() ); xValue.setCurrentValue( new Boolean( true ) ); } /* ------------------------------------------------------------------ */ private XPropertySet getRadioModel( String name, String refValue ) throws com.sun.star.uno.Exception, java.lang.Exception { return getRadioModel( name, refValue, m_primaryForm ); } /* ------------------------------------------------------------------ */ private XPropertySet getRadioModel( String name, String refValue, XPropertySet form ) throws com.sun.star.uno.Exception, java.lang.Exception { return m_formLayer.getRadioModel( form, name, refValue ); } /* ------------------------------------------------------------------ */ /** verifies a number of radio buttons for their states */ private boolean verifyRadios( XPropertySet[] radios, short[] states, String errorMessage ) throws com.sun.star.uno.Exception { for ( int i = 0; i