| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| package integration.forms; |
| |
| import com.sun.star.uno.UnoRuntime; |
| import com.sun.star.beans.XPropertySet; |
| import com.sun.star.sheet.XSpreadsheet; |
| import com.sun.star.sheet.XSpreadsheets; |
| import com.sun.star.sheet.XSpreadsheetView; |
| import com.sun.star.container.XNamed; |
| import com.sun.star.container.XNameContainer; |
| import com.sun.star.container.XIndexContainer; |
| import com.sun.star.drawing.XDrawPageSupplier; |
| import com.sun.star.awt.XControl; |
| import com.sun.star.awt.XControlModel; |
| import com.sun.star.awt.XListBox; |
| import com.sun.star.script.XLibraryContainer; |
| import com.sun.star.script.XEventAttacherManager; |
| import com.sun.star.script.ScriptEventDescriptor; |
| import com.sun.star.accessibility.XAccessible; |
| import com.sun.star.accessibility.XAccessibleContext; |
| import com.sun.star.accessibility.XAccessibleSelection; |
| import com.sun.star.frame.XStorable; |
| |
| public class ListSelection extends integration.forms.TestCase |
| { |
| /** Creates a new instance of ListSelection */ |
| public ListSelection() |
| { |
| super( DocumentType.CALC ); |
| } |
| |
| /* ------------------------------------------------------------------ */ |
| public String[] getTestMethodNames() |
| { |
| return new String[] { |
| "checkUserListSelection" |
| }; |
| } |
| |
| /* ------------------------------------------------------------------ */ |
| public String getTestObjectName() |
| { |
| return "Form Control List Selection Test"; |
| } |
| |
| /* ------------------------------------------------------------------ */ |
| public void checkUserListSelection() throws com.sun.star.uno.Exception, java.lang.Exception |
| { |
| boolean interactiveTest = param.getBool( "Interactive" ); |
| |
| if ( interactiveTest ) |
| { |
| prepareDocument(); |
| waitForUserInput(); |
| closeDocumentByUI(); |
| } |
| else |
| { |
| int runs = param.getInt( "Runs" ); |
| if ( runs == 0 ) |
| runs = 10; |
| |
| for ( int i = 0; i < runs; ++i ) |
| { |
| log.println( "Round " + ( i + 1 ) + " of " + runs ); |
| prepareDocument(); |
| impl_clickListBox(); |
| synchronized( this ) { this.wait( 1000 ); } |
| closeDocument(); |
| } |
| } |
| } |
| |
| /* ------------------------------------------------------------------ */ |
| final private void impl_clickListBox() |
| { |
| try |
| { |
| final int runs = 10; |
| java.util.Random generator = new java.util.Random(); |
| for ( int i = 0; i < runs; ++i ) |
| { |
| // obtain the active sheet |
| XSpreadsheetView view = (XSpreadsheetView)m_document.getCurrentView().query( XSpreadsheetView.class ); |
| XSpreadsheet activeSheet = view.getActiveSheet(); |
| |
| // Accessibility access to the list box control in this sheet |
| XAccessible accessibleListBox = (XAccessible)UnoRuntime.queryInterface( |
| XAccessible.class, getListBoxControl( activeSheet ) ); |
| XAccessibleContext context = accessibleListBox.getAccessibleContext(); |
| |
| // the first "accessible child" of a list box is its list |
| XAccessibleSelection accessibleList = (XAccessibleSelection)UnoRuntime.queryInterface( |
| XAccessibleSelection.class, context.getAccessibleChild( 1 ) ); |
| |
| int selectPosition = generator.nextInt( 5 ); |
| String selectSheetName = getListBoxControl( activeSheet ).getItem( (short)selectPosition ); |
| accessibleList.selectAccessibleChild( selectPosition ); |
| try |
| { |
| synchronized( this ) |
| { |
| this.wait( 500 ); |
| } |
| } |
| catch( java.lang.InterruptedException e ) { } |
| |
| XNamed sheetName = (XNamed)UnoRuntime.queryInterface( XNamed.class, view.getActiveSheet() ); |
| assure( "sheet was not selected as expected!", sheetName.getName().equals( selectSheetName ) ); |
| } |
| } |
| catch( com.sun.star.uno.Exception e ) |
| { |
| e.printStackTrace( System.err ); |
| failed( "caught an exception: " + e.toString() ); |
| } |
| } |
| |
| /* ------------------------------------------------------------------ */ |
| final private void impl_setupListenerScript() |
| { |
| try |
| { |
| XPropertySet docProps = dbfTools.queryPropertySet( m_document.getDocument() ); |
| XLibraryContainer basicLibs = (XLibraryContainer)UnoRuntime.queryInterface( |
| XLibraryContainer.class, docProps.getPropertyValue( "BasicLibraries" ) ); |
| XNameContainer basicLib = basicLibs.createLibrary( "default" ); |
| |
| String sListSelectionScript = |
| "Option Explicit\n" + |
| "\n" + |
| "Sub onListBoxSelected( oEvent as Object )\n" + |
| " Dim oView as Object\n" + |
| " Dim oSheet as Object\n" + |
| " Dim oSheets as Object\n" + |
| "\n" + |
| " Dim oControlModel as Object\n" + |
| " Dim sSheet as String\n" + |
| "\n" + |
| " if ( oEvent.Selected <> 65535 ) Then\n" + |
| " oControlModel = oEvent.Source.Model\n" + |
| " sSheet = oControlModel.StringItemList( oEvent.Selected )\n" + |
| "\n" + |
| " oSheets = thisComponent.Sheets\n" + |
| " oSheet = oSheets.getByName(sSheet)\n" + |
| "\n" + |
| " oView = thisComponent.CurrentController\n" + |
| " oView.setActiveSheet( oSheet )\n" + |
| " End If\n" + |
| "End Sub\n" + |
| "\n" + |
| "Sub onButtonClicked\n" + |
| " MsgBox \"clicked\"\n" + |
| "End Sub\n"; |
| |
| basicLib.insertByName( "callbacks", sListSelectionScript ); |
| } |
| catch( com.sun.star.uno.Exception e ) |
| { |
| e.printStackTrace( System.err ); |
| failed( "caught an exception: " + e.toString() ); |
| } |
| } |
| |
| /* ------------------------------------------------------------------ */ |
| final private void impl_assignStarBasicScript( XPropertySet controlModel, String interfaceName, String interfaceMethod, String scriptCode ) |
| { |
| try |
| { |
| XIndexContainer parentForm = (XIndexContainer)dbfTools.getParent( controlModel, XIndexContainer.class ); |
| |
| XEventAttacherManager manager = (XEventAttacherManager)UnoRuntime.queryInterface( |
| XEventAttacherManager.class, parentForm ); |
| |
| int containerPosition = -1; |
| for ( int i = 0; i < parentForm.getCount(); ++i ) |
| { |
| XPropertySet child = dbfTools.queryPropertySet( parentForm.getByIndex( i ) ); |
| if ( child.equals( controlModel ) ) |
| { |
| containerPosition = i; |
| break; |
| } |
| } |
| manager.registerScriptEvent( containerPosition, new ScriptEventDescriptor( |
| interfaceName, |
| interfaceMethod, |
| "", |
| "StarBasic", |
| scriptCode |
| ) ); |
| } |
| catch( com.sun.star.uno.Exception e ) |
| { |
| e.printStackTrace( System.err ); |
| failed( "caught an exception: " + e.toString() ); |
| } |
| } |
| |
| /* ------------------------------------------------------------------ */ |
| protected void prepareDocument() throws com.sun.star.uno.Exception, java.lang.Exception |
| { |
| super.prepareDocument(); |
| impl_setupListenerScript(); |
| |
| SpreadsheetDocument document = (SpreadsheetDocument)m_document; |
| XSpreadsheets sheets = document.getSheets(); |
| |
| // delete all sheets except one |
| String[] sheetNames = sheets.getElementNames(); |
| for ( short i = 1; i < sheetNames.length; ++i ) |
| sheets.removeByName( sheetNames[ i ] ); |
| |
| // need 5 sheets |
| String[] newSheetNames = new String[] { "first", "second", "third", "forth", "fifth" }; |
| |
| // give the first one the right name |
| XNamed sheet = (XNamed)UnoRuntime.queryInterface( XNamed.class, |
| sheets.getByName( sheetNames[ 0 ] ) |
| ); |
| sheet.setName( newSheetNames[ 0 ] ); |
| |
| // add some dummy buttons |
| for ( int i = 0; i < 4; ++i ) |
| { |
| XPropertySet buttonModel = m_formLayer.createControlAndShape( "CommandButton", 10, 10 + i * 10, 30, 8 ); |
| impl_assignStarBasicScript( buttonModel, "XActionListener", "actionPerformed", "document:default.callbacks.onButtonClicked" ); |
| } |
| |
| // and a list box |
| XPropertySet listBox = m_formLayer.createControlAndShape( "ListBox", 50, 10, 40, 6 ); |
| listBox.setPropertyValue( "Dropdown", new Boolean( true ) ); |
| listBox.setPropertyValue( "StringItemList", newSheetNames ); |
| listBox.setPropertyValue( "Name", "ListBox" ); |
| |
| impl_assignStarBasicScript( listBox, "XItemListener", "itemStateChanged", "document:default.callbacks.onListBoxSelected" ); |
| |
| // clone this sheet |
| for ( short i = 1; i < newSheetNames.length; ++i ) |
| sheets.copyByName( newSheetNames[0], newSheetNames[i], i ); |
| |
| // switch the thing to alive mode |
| m_document.getCurrentView().toggleFormDesignMode(); |
| |
| try |
| { |
| XStorable storable = (XStorable)m_document.query( XStorable.class ); |
| java.io.File testFile = java.io.File.createTempFile( getTestObjectName(),".ods"); |
| storable.storeAsURL( testFile.getAbsoluteFile().toURL().toString(), new com.sun.star.beans.PropertyValue[]{} ); |
| testFile.deleteOnExit(); |
| } |
| catch( java.lang.Throwable e ) |
| { |
| e.printStackTrace(); |
| failed( "caught an exception: " + e.toString() ); |
| } |
| } |
| |
| /* ------------------------------------------------------------------ */ |
| protected XControlModel getListBoxModel( XSpreadsheet sheet ) |
| { |
| XDrawPageSupplier suppPage = (XDrawPageSupplier)UnoRuntime.queryInterface( |
| XDrawPageSupplier.class, sheet ); |
| FormComponent formsRoot = new FormComponent( suppPage.getDrawPage() ); |
| XControlModel listBoxModel = (XControlModel)formsRoot.getByIndex( 0 ). |
| getByName( "ListBox" ).query( XControlModel.class ); |
| return listBoxModel; |
| } |
| |
| /* ------------------------------------------------------------------ */ |
| protected XListBox getListBoxControl( XSpreadsheet sheet ) throws com.sun.star.uno.Exception |
| { |
| return (XListBox)UnoRuntime.queryInterface( |
| XListBox.class, m_document.getCurrentView().getControl( getListBoxModel( sheet ) ) ); |
| } |
| } |