diff options
Diffstat (limited to 'testautomation/global/tools')
42 files changed, 19841 insertions, 0 deletions
diff --git a/testautomation/global/tools/closeoffice.bas b/testautomation/global/tools/closeoffice.bas new file mode 100644 index 000000000000..da402ecd40f7 --- /dev/null +++ b/testautomation/global/tools/closeoffice.bas @@ -0,0 +1,48 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : thorsten.bosbach@oracle.com +'* +'* short description : Exit the [Star|Open][Office|Suite][.org] nicely +'* +'\************************************************************************************* + +sub main + try + printlog ResetApplication + FileExit "SynchronMode", TRUE + catch + endcatch + wait (gOOoShutdownTimeOut * 1000) +end sub + +sub LoadIncludeFiles + use "global\system\includes\declare.inc" + use "global\system\includes\gvariabl.inc" + call getUseFiles() +end sub + diff --git a/testautomation/global/tools/compressstatus.bas b/testautomation/global/tools/compressstatus.bas new file mode 100755 index 000000000000..679b322096b0 --- /dev/null +++ b/testautomation/global/tools/compressstatus.bas @@ -0,0 +1,188 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : thorsten.bosbach@oracle.com +'* +'* short description : Compress local written status files for submission +'* +'\*********************************************************************** + +sub main + 'just run, ... + if (gMahler AND (gMahlerLocal<>"")) then + ' just a dummy call to get gDatabasePath set; DON'T call hStatusOut !!! + hStatusIn("writer", "compressstatus.bas") + call compressStatus + else + warnLog "There is nothing to be done - exiting" + endif +end sub + +'------------------------------------------------------------------------- + +sub compressStatus + dim sDestination as string + dim sList(1000) as string + dim i as integer + dim iReturn as integer + dim sJar as string + + sDestination = convertPath(gDatabasePath+"database/" + "mahlerlocal/") + ' create directory beside mahlerlocal +' sJar = convertPath(gDatabasePath+"database/" + convertDateToDatabase(now())) + sJar = convertPath(gDatabasePath+"database/" + convertDateToDatabase(now()) + "-"+removeCharacter(convertTimeToDatabase(now()),asc(":"))) + mkdir sJar + ' create jar file with same name as directory, beside mahlerlocal + try + iReturn = Shell("jar",0,"cMf " + sJar + ".jar" + " -C " + sDestination + " .",TRUE) ' wait until finished + printlog "jar cMf " + sJar + ".jar" + " -C " + sDestination + " ." + catch + printlog "No program 'jar' available" + try + iReturn = Shell("zip",0,"-Djr " + sJar + ".jar" + " " + sDestination,TRUE) ' wait until finished + printlog "zip -Djr " + sJar + ".jar" + " " + sDestination + catch + printlog "No program 'zip' available" + iReturn = fZip(sDestination, sJar +".jar") + endcatch + endcatch + if (iReturn <> 0) then + printlog iReturn + endif + if (iReturn = 0) then + printlog "Filename to submit:" + printlog sJar + ".jar" + ' copy files from mahlerlocal to backupdirectory with same name as jar file + getFileList(sDestination, "*.*", sList()) + for i = 1 to listCount(sList()) + try + filecopy(sList(i), sJar+gPathSigne) + catch + if (1=i) then warnlog "#ixxxxxx# destination file name needs to get named." + filecopy(sList(i), sJar+gPathSigne+DateiExtract(sList(i))) + endcatch + ' delete file in mahlerlocal + kill(sList(i)) + if fileexists(sList(i)) then + warnlog "file couldn't get deleted! remove manually:" + printlog sList(i) + endif + next i + endif +end sub + +'------------------------------------------------------------------------- + +function fZip(sDirectory as string, sZipFileName as string) as integer +'/// Zips the files in the first level of a directory into a file +'///+ The zip file hasn't to exists +'///+ Input: absolut directory path to zip +'///+ Absolut path and filename of zip file + dim oUCB + dim oUCB2 + dim oID + dim oRootContent + dim oInfo + dim oNewStreamContent + dim oFile + dim oArg + Dim aArgs(1) + Dim oProps(0) as new com.sun.star.beans.PropertyValue + Dim oCommand as new com.sun.star.ucb.Command + dim lsFile(500) as string + dim i as integer + dim aArray + dim sString + + fZip = 1 + if fileExists(sZipFileName) then + warnlog "Can't create zip file, because it already exists: '" + sZipFileName + "'" + exit function + endif + if NOT fileExists(sDirectory) then + warnlog "Directory to zip doesn't exist: '" + sDirectory + "'" + exit function + else + aArgs(0) = "Local" + aArgs(1) = "Office" + oUCB = CreateUnoService( "com.sun.star.ucb.UniversalContentBroker" ) + oUCB.initialize( aArgs() ) + printlog "Zip file name: '" + convertToURL(sZipFileName) + "'" + aArray = split(convertToURL(sZipFileName), "/") + sString = join(aArray, "%2F") + printlog "Zip file name: '" + sString + "'" + oID = oUCB.createContentIdentifier( "vnd.sun.star.zip://" + sString ) + oRootContent = oUCB.queryContent( oID ) + oInfo = createUnoStruct( "com.sun.star.ucb.ContentInfo" ) + oInfo.Type = "application/vnd.sun.star.zip-stream" + oInfo.Attributes = 0 + + ' get all files in a directory + getFileNameList (sDirectory+"/","*.txt",lsFile()) + printlog "Going to zip Directory: '" + sDirectory + "'" + for i = 1 to listCount(lsFile()) + printlog "Going to add: " + i + ": '" + lsFile(i) + "'" + oNewStreamContent = oRootContent.createNewContent( oInfo ) + oProps(0).Name = "Title" + oProps(0).Handle = -1 + oProps(0).Value = lsFile(i) ' Filename of one content file in zip + oCommand.Name = "setPropertyValues" + oCommand.Handle = -1 + oCommand.Argument = oProps() + oNewStreamContent.execute( oCommand, 0, Null ) + oUcb2 = createUnoService("com.sun.star.ucb.SimpleFileAccess") + oFile = oUcb2.OpenFileRead(ConvertToURL(sDirectory + "/" + lsFile(i))) + oArg = createUnoStruct( "com.sun.star.ucb.InsertCommandArgument" ) + oArg.Data = oFile + oArg.ReplaceExisting = false + oCommand.Name = "insert" + oCommand.Handle = -1 + oCommand.Argument = oArg + oNewStreamContent.execute( oCommand, 0, Null ) + next i + + REM commit that package file + oCommand.Name = "flush" + oCommand.Handle = -1 + oCommand.Argument = 0 + + oRootContent.execute( oCommand, 0, Null ) + fZip = 0 + endif +end function + +'------------------------------------------------------------------------- + +sub LoadIncludeFiles + use "global\system\includes\master.inc" + use "global\system\includes\gvariabl.inc" + gApplication = "WRITER" + call GetUseFiles +end sub + +'------------------------------------------------------------------------- + diff --git a/testautomation/global/tools/declare.bas b/testautomation/global/tools/declare.bas new file mode 100755 index 000000000000..7d00ef69f824 --- /dev/null +++ b/testautomation/global/tools/declare.bas @@ -0,0 +1,84 @@ +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : thorsten.bosbach@oracle.com +'* +'* short description : To get Help ID's from the office +'* +'\************************************************************************************* +sub main + Ich_Moechte_Help_IDs_haben +' Ich_Moechte_Die_Position_Und_Groesse_Eines_Dialoges_Haben ( ChaosDokument ) + +' ! set the proper Kontext for teh Application in the subroutine ! +' Ich_Moechte_Die_Mausposition_Herausbekommen +end sub + + +sub Ich_Moechte_Help_IDs_haben +'/// Get Id's ///' + DisplayHid true +end sub + +sub Ich_Moechte_Die_Position_Und_Groesse_Eines_Dialoges_Haben ( window ) +'/// Get Size an Position from dialogs ///' + Dim i + Dim Px : Dim Py : Dim Sx : Dim Sy + + for i = 1 to 20 + Px = window.GetPosX + Py = window.GetPosY + Sx = window.GetSizeX + Sy = window.GetSizeY + print "x: " + Px + " y: " + Py + " x-: " + Sx + " y-: " + Sy + next i +end sub + +sub Ich_Moechte_Die_Mausposition_Herausbekommen +'/// Get Mouse Position ///' + ' Writer + ' Kontext "DocumentWriter" + ' DocumentWriter.DisplayPercent + + ' Calc + ' Kontext "DocumentCalc" + ' DocumentCalc.DisplayPercent + + ' Draw + ' Kontext "DocumentDraw" + ' DocumentDraw.DisplayPercent + + ' Chart + ' Kontext "DocumentChart" + ' DocumentChart.DisplayPercent +end sub + +sub LoadIncludeFiles + use "global\system\includes\declare.inc" + use "global\system\includes\gvariabl.inc" + Call GetUseFiles() +end sub + diff --git a/testautomation/global/tools/includes/optional/t_accels.inc b/testautomation/global/tools/includes/optional/t_accels.inc new file mode 100755 index 000000000000..04718449b13b --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_accels.inc @@ -0,0 +1,124 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : joerg.skottke@oracle.com +'* +'* short description : handle accelerators +'* +'******************************************************************************* +'** +' #1 hGetAccel ' function to retrieve a language specific accelerator +'** +'\****************************************************************************** + +function hGetAccel( cCommand as string ) as string + + '///<h3>Retrieve a keyboard accelerator for a specific function</h3> + '///<i>Uses: global/input/accelerators.txt</i><br> + '///<i>NOTE: Accelerator is language dependent</i><br> + '///<u>Input</u>: + '///<ol> + '///+<li>Name of the action to be executed (string). Valid options are:</li> + '///<ul> + '///+<li>"FileOpen"</li> + '///+<li>"FileSave"</li> + '///+<li>"Print"</li> + '///+<li>"SelectAll"</li> + '///+<li>"Copy"</li> + '///+<li>"DocumentConverter_ShowLog"</li> + '///+<li>"IDE_SWITCH_TAB+"</li> + '///+<li>"IDE_SWITCH_TAB-"</li> + '///</ul> + '///</ol> + '///<u>Returns</u>: + '///<ol> + '///+<li>Accelerator (string)</li> + '///<ul> + '///+<li>A string ready to use by .typeKeys(...) method</li> + '///+<li>"Error" if the requested Accelerator is unknown</li> + '///</ul> + '///</ol> + '///<u>Description</u>: + '///<ul> + const CFN = "hGetAccel::" + const DEFAULT_LANGUAGE = "en-us" + + dim cAccel as string + dim lsAccelerators( 1000 ) as string + dim cFile as string + cFile = gTesttoolpath & "global/input/accelerators.txt" + cFile = convertpath( cFile ) + + dim cProximityLocale as string + + dim iLang as integer + + printlog( CFN & "Enter with option: " & cCommand ) + 'printlog( CFN & "Current Language.: <" & gISOLang & ">" ) + + '///+<li>Get the section from the accelerators file</li> + hGetDatafileSection( cFile , lsAccelerators() , cCommand , "" , "" ) + + '///+<li>Find the matching string for the current language</li> + cAccel = hGetValueForKeyAsString( lsAccelerators() , gISOLang ) + + '///+<li>In case of a miss we retry with a modified string</li> + '///<ul> + if ( instr( cAccel , "Error" ) <> 0 ) then + + iLang = len( gISOLang ) + + select case iLang + case 2 : + '///+<li>Try xx-XX</li> + cProximityLocale = gISOLang & "-" & ucase( gISOLang ) + printlog( CFN & "Trying alternative locale: " & cProximityLocale ) + cAccel = hGetValueForKeyAsString( lsAccelerators() , cProximityLocale ) + case 5 : + '///+<li>Try xx</li> + cProximityLocale = mid( cUpperCaseLocale , 1, 2 ) + printlog( CFN & "Trying alternative locale: " & cProximityLocale ) + cAccel = hGetValueForKeyAsString( lsAccelerators() , cProximityLocale ) + case else : + '///+<li>Try en-US</li> + cProximityLocale = "en-US" + printlog( CFN & "Trying default locale: " & cProximityLocale ) + cAccel = hGetValueForKeyAsString( lsAccelerators() , DEFAULT_LANGUAGE ) + end select + + endif + '///</ul> + + '///+<li>Build the complete accelerator-string so it can be used by "TypeKeys"</li> + '///+<li>Print it to the log and return the string to the calling function</li> + + cAccel = "<" & cAccel & ">" + printlog( CFN & "Requested accelerator: " & cAccel & " for language: " & gISOLang ) + hGetAccel() = cAccel + '///</ul> + +end function diff --git a/testautomation/global/tools/includes/optional/t_basic_ide_tools.inc b/testautomation/global/tools/includes/optional/t_basic_ide_tools.inc new file mode 100755 index 000000000000..f7537d52700c --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_basic_ide_tools.inc @@ -0,0 +1,816 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +' ** +' ** owner : joerg.skottke@oracle.com +' ** +' ** short description : tools for the property-browser test +' ** +'\****************************************************************************** + +function hShowMacroControls() as boolean + + '///<h3>Tear off the ToolsCollectionBar from the MacroBar</h3> + '///<i>Starting point: Basic dialog editor is open and has the focus</i> + '///<ul> + const CFN = "hShowMacroControls::" + + const MAX_WAIT = 5 + const SHORT_WAIT = 1 + + const VERTICALLY_CENTERED = 50 + const HORIZONTALLY_CENTERED = 50 + + if ( GVERBOSE ) then printlog( CFN & "Enter" ) + + '///+<li>Test whether the ToolsCollectionBar is already open. If yes, exit directly</li> + kontext "ToolsCollectionBar" + if ( ToolsCollectionBar.exists( SHORT_WAIT ) ) then + printlog( CFN & "ToolsCollectionBar is already open." ) + hShowMacroControls() = true + exit function + endif + + '///+<li>Verify that the Dialog Bar is available</li> + Kontext "DialogBar" + if ( DialogBar.exists( MAX_WAIT ) ) then + + '///+<li>Verify that the controls-button is enabled</li> + try + '///+<li>Click on the controls-button to open the ToolsCollectionBar</li> + controls.click() + + '///+<li>Tear off the ToolsCollectionBar from the DialogBar</li> + controls.tearOff() + + '///+<li>Verify that the ToolsCollectionBar is visible and can be accessed</li> + kontext "ToolsCollectionBar" + if ( ToolsCollectionBar.exists( MAX_WAIT ) ) then + + '///+<li>Move it to the upper left corner at pos 50/50</li> + ToolsCollectionBar.Move ( HORIZONTALLY_CENTERED , VERTICALLY_CENTERED ) + printlog( CFN & "ToolsCollectionBar is open and has been placed" ) + hShowMacroControls() = true + else + printlog( CFN & "ToolsCollectionBar is not available. Aborting." ) + hShowMacroControls() = false + endif + catch + printlog( CFN & "The Controls-Button is not enabled. Aborting." ) + hShowMacroControls() = false + endcatch + else + printlog( CFN & "The Dialog Bar is not available. Aborting." ) + hShowMacroControls() = false + endif + '///</ul> + +end function + +'******************************************************************************* + +function hGetBasicWorkFile( cMajorID as string ) as string + + '///<h3>Retrieve a filename, depending on gApplication and Build-ID</h3> + '///<i>Structure: work-directory/basic[.suffix]</i> + const CFN = "hGetBasicWorkFile::" + dim sFile as string : sFile = hGetWorkPath() & "basic" & hGetSuffix( cMajorId ) + printlog( CFN & sFile & " for " & gApplication & " (" & cMajorID & ")" ) + hGetBasicWorkFile() = sFile + +end function + +'******************************************************************************* + +function hOpenBasicIDE() as boolean + + '///<h3>Open the Basic IDE for the last module listed in the Macro Organizer</h3> + '///<i>Starting point: Basic Macro Organizer has focus</i> + + const CFN = "hOpenBasicIDE::" + const BUTTON_TIMEOUT = -1 + const MAX_WAIT = 2 + + if ( hSelectTheLastModule( true ) ) then + + if ( hClickButton( Bearbeiten) <> BUTTON_TIMEOUT ) then + + kontext "BASICIDE" + if ( BasicIDE.exists( MAX_WAIT ) ) then + printlog( "Basic IDE is open" ) + BasicIDE.maximize() + hOpenBasicIDE() = true + else + warnlog( CFN & "Failed to open BASIC IDE" ) + hOpenBasicIDE() = false + endif + else + warnlog( CFN & "Edit button is not enabled, cannot open BASIC IDE" + hOpenBasicIDE() = false + endif + else + warnlog( CFN & "Unable to select the last module" ) + hOpenBasicIDE() = false + endif + +end function + +'******************************************************************************* + +function hCloseBasicIDE() as boolean + + '///<h3>Close the BASIC-IDE</h3> + hCloseCollectionBar() + kontext "BasicIDE" + hCloseBasicIDE() = hDestroyDocument() + +end function + +'******************************************************************************* + +function hReOpenBasicDialog() as boolean + + '///<h3>Open BASIC-IDE after loading a workfile with documentbound macro</h3> + '///<i>Starting point: Focus on document containing at least one macro</i><br> + const CFN = "hReopenBasicDialog: " + const BUTTON_TIMEOUT = -1 + + if ( hSelectTheLastModule( true ) ) then + + if ( hClickButton( Bearbeiten ) <> BUTTON_TIMEOUT ) then + + kontext "BasicIDE" + BasicIde.maximize() + + if ( hFindFirstDialog() ) then + printlog( "BASIC IDE is open." ) + hReOpenBasicDialog() = true + else + warnlog( CFN & "Could not find any dialog" ) + hReOpenBasicDialog() = false + endif + else + warnlog( CFN & "Unable to click Edit button, BASIC IDE not open" ) + hReOpenBasicDialog() = false + endif + else + warnlog( CFN & "Could not open the last module for editing." ) + hReOpenBasicDialog() = false + endif + +end function + +'******************************************************************************* + +function hFindFirstDialog() as boolean + + '///<h3>Find the first dialog in the BASIC-IDE</h3> + '///<i>Starting point: Basic IDE must be open and has the focus</i> + '///<ul> + + const CFN = "hFindFirstDialog::" + const REPEAT_COUNT = 5 ' number of times to send a keystroke to BASIC IDE + const MAX_NUMBER_OF_RETRIES = 20 + const SELECT_TAB_RIGHT = "<MOD1 PAGEUP>" + const SCROLL_UP_LEFT = "<UP><LEFT>" + + dim iPosOverTabbar as integer + hFindFirstDialog() = false + + '///+<li>Set focus to Basic IDE, maximize it</li> + kontext "BasicIDE" + BasicIde.maximize() + + + '///+<li>move pointer over the tabbar and click until a dialog opens (hopefully)</li> + for iPosOverTabbar = 1 to MAX_NUMBER_OF_RETRIES + + BASICIDE.typeKeys( SELECT_TAB_RIGHT ) + + if ( DialogWindow.Exists() ) then + printlog( "BASIC Dialog window found" ) + hFindFirstDialog() = true + DialogWindow.typeKeys( SCROLL_UP_LEFT , REPEAT_COUNT ) + exit for + endif + + next iPosOverTabbar + '///</ul> + +end function + +'******************************************************************************* + +function hSelectDialogPane() as boolean + + '///<h3>Select the dialog pane in the Basic dialog editor</h3> + '///<i>Starting point: Basic dialog editor is open and has the focus</i> + const CFN = "hSelectDialogPane::" + const UP_LEFT = 10 + const DOWN_RIGHT = 90 + + if ( GVERBOSE ) then printlog( CFN & "Enter" ) + + kontext "BasicIDE" + DialogWindow.mouseDown( DOWN_RIGHT , DOWN_RIGHT ) + DialogWindow.mouseMove( UP_LEFT , UP_LEFT ) + DialogWindow.mouseUp ( UP_LEFT , UP_LEFT ) + + printlog( CFN & "Selected dialog pane (not verified)" ) + hSelectDialogPane() = true + +end function + +'******************************************************************************* + +function hCloseCollectionBar() as boolean + + const CFN = "hCloseCollectionBar(): " + + kontext "ToolsCollectionBar" + if ( ToolsCollectionBar.exists() ) then + + if ( hCloseDialog( ToolsCollectionBar, "close" ) ) then + printlog( "Closed Macro Controls Float" ) + hCloseCollectionBar() = true + else + warnlog( CFN & "Failed to close Macro Controls Float" ) + hCloseCollectionBar() = false + endif + else + printlog( "Macro Controls Float not open" ) + hCloseCollectionBar() = true + endif + +end function + +'******************************************************************************* + +function hDeleteMacro() as boolean + + '///<h3>Delete all text in the Basic IDE editor</h3> + const CFN = "hDeleteMacro(): " + + kontext "BasicIDE" + if ( BasicIDE.exists() ) then + WaitSlot() : Wait( 100 ) : EditWindow.typeKeys( "<MOD1 HOME>" ) + WaitSlot() : Wait( 100 ) : EditWindow.typeKeys( "<MOD1 SHIFT END>" ) + WaitSlot() : Wait( 100 ) : EditWindow.typeKeys( "<DELETE>" ) + hDeleteMacro() = hIsEditWindowEmpty() + else + warnlog( CFN & "Basic IDE is not open" ) + hDeleteMacro() = false + endif + +end function + +'******************************************************************************* + +function hIsEditWindowEmpty() as boolean + + '///<h3>Test if the Basic-EditWindow is empty</h3> + '///<i>Starting point: Basic IDE editor is open and has the focus</i> + const CFN = "hIsEditWindowEmpty(): " + + kontext "BasicIDE" + if ( BasicIDE.exists() ) then + SetClipboard( "" ) + WaitSlot() : EditWindow.typeKeys( "<MOD1 HOME>" ) + WaitSlot() : EditWindow.typeKeys( "<MOD1 SHIFT END>" ) + hUseAsyncSlot( "EditCopy" ) + + if ( GetClipBoardText() = "" ) then + hIsEditWindowEmpty() = true + else + warnlog( CFN & "Edit window is not empty" ) + hIsEditWindowEmpty() = false + endif + else + warnlog( CFN & "BasicIDE is not open" ) + hIsEditWindowEmpty() = false + endif + +end function + +'******************************************************************************* + +function hRenameTab( cTabName as string ) as integer + + const CFN = "hRenameTab(): " + + const MENUITEM_RENAME = 3 + const MAX_WAIT = 1000 + + const RETVAL_SUCCESS = 0 + const RETVAL_NO_IDE = 1 + const RETVAL_NO_ACCESS = 2 + const RETVAL_NO_MENU = 3 + + dim sFullString as string : sFullString = "<HOME><SHIFT END>" & cTabName & "<RETURN>" + + kontext "BasicIDE" + if ( BasicIDE.exists() ) then + try + hRenameTab() = RETVAL_NO_MENU + Tabbar.openContextMenu() + hMenuSelectNr( MENUITEM_RENAME ) + Wait( MAX_WAIT ) + + ' At this point the string on the tab should be selected, print the + ' string to the log and overwrite it with the new name + hRenameTab() = RETVAL_NO_ACCESS + + Tabbar.typeKeys( sFullString , true ) + hRenameTab() = RETVAL_SUCCESS + catch + warnlog( CFN & "Failed to rename the current module" ) + endcatch + else + warnlog( CFN & "BASIC IDE is not open" ) + hRenameTab() = RETVAL_NO_IDE + endif + +end function + +'******************************************************************************* + +function hGetTabNameFromOrganizer() as string + + '///<h3>Retrieve the name of a tab from the Basic Library Organizer</h3> + '///<i>Starting point: Basic IDE is open and has the focus</i> + '///<ul> + + const CFN = "hGetTabNameFromOrganizer::" + dim cReturnString as string + + '///+<li>Open the Basic Library Organizer</li> + '///+<li>Go to the Module-Tab</li> + '///+<li>Get the name of the currently selected item from the Module-list</li> + '///+<li>Close the Macro Library Organizer</li> + if ( hOpenBasicObjectOrganizer( 1 ) ) then + cReturnString = Modulliste.GetSelText() + TabModule.Close() + printlog( CFN & "Returning Tab-Name: " & cReturnString ) + else + cReturnString = "Failure: Macro Organizer not open" + warnlog( CFN & cReturnString ) + + endif + + '///+<li>Return the name from the Module-list</li> + hGetTabNameFromOrganizer() = cReturnString + '///</ul> + +end function + +'******************************************************************************* + +function hNewDialog() as boolean + + '///<h3>Create a new BASIC dialog</h3> + '///<i>Starting point: Basic IDE is open</i> + '///<ul> + + const CFN = "hNewDialog::" + const MAX_WAIT = 2000 + + '///+<li>Open the context menu for the tabbar</li> + kontext "basicide" + Tabbar.OpenContextMenu + + '///+<li>Select the first item (insert)</li> + hMenuSelectNr( 1 ) + WaitSlot( MAX_WAIT ) ' sleep( 1 ) + + '///+<li>Select the second item (new dialog)</li> + hMenuSelectNr( 2 ) + WaitSlot( MAX_WAIT ) ' sleep( 2 ) + + '///+<li>Verify that a new dialog is opened and has the focus</li> + if ( DialogWindow.Exists() ) then + printlog( CFN & "New dialog is open" ) + hNewDialog() = true + if ( DialogWindow.IsMax() = false ) then + DialogWindow.Maximize() + Wait( MAX_WAIT ) + end if + else + warnlog( CFN & "New dialog is not open" ) + hNewDialog() = false + endif + '///+<li>Return TRUE on success, FALSE on failure</li> + '///</ul> + +end function + +'******************************************************************************* + +function hNewModule() as boolean + + '///<h3>Create a new BASIC module</h3> + '///<i>Starting point: Basic IDE is open</i> + '///<ul> + + const CFN = "hNewModule::" + const MAX_WAIT = 2000 + + '///+<li>Open the context menu for the tabbar</li> + kontext "basicide" + Tabbar.OpenContextMenu + + '///+<li>Select the first item (insert)</li> + hMenuSelectNr( 1 ) + WaitSlot( MAX_WAIT ) ' sleep( 1 ) + + '///+<li>Select the first item (new module)</li> + hMenuSelectNr( 1 ) + WaitSlot( MAX_WAIT ) ' sleep( 2 ) + + '///+<li>Verify that a new module is opened and has the focus</li> + if ( EditWindow.Exists() ) then + printlog( CFN & "New module is open" ) + hNewModule() = true + else + warnlog( CFN & "New module is not open" ) + hNewModule() = false + endif + '///+<li>Return TRUE on success, FALSE on failure</li> + '///</ul> + +end function + +'******************************************************************************* + +function hHideModule() as boolean + + '///<h3>Hide a Basic Module from the IDE</h3> + '///<i>Starting point: Basic IDE is open and has the focus</i> + '///<ul> + + const CFN = "hHideModule::" + const MENUENTRY_HIDE = 4 + + kontext "basicide" + + '///+<li>Open the context menu of the tabbar</li> + try + tabbar.openContextMenu + + '///+<li>Select the fourth entry (Hide)</li> + hMenuSelectNr( MENUENTRY_HIDE ) + sleep( 1 ) + hHideModule() = true + printlog( CFN & "Success" ) + catch + hHideModule() = false + warnlog( CFN & "Failure" ) + endcatch + '///+<li>Return TRUE on success, FALSE on any other condition (not verified)</li> + '///</ul> + +end function + +'******************************************************************************* + +function hInitFormControls( cModule as string ) as boolean + + '///<h3>Get from a new document to the Macro Controls Float in one go</h3> + '///<i>Starting point: Plain document</i><br> + '///This function performs following steps: + '///<ol> + '///+<li>Open the Basic Organizer</li> + '///+<li>Create a new module for the current document</li> + '///+<li>Open a new basic dialog</li> + '///+<li>Open the Macro controls float</li> + '///</ol> + '///Description: + '///<ul> + + const CFN = "hInitFormControls::" + hInitFormControls() = false + '///+<li>Create and edit a new module for the current document</li> + + if ( not hInitBasicIde( cModule ) ) then + warnlog( "Could not create new module" ) + hCloseBasicIde() + exit function + endif + + kontext "BasicIde" + BasicIde.maximize() + + '///+<li>Create a new dialog.</li> + if ( not hNewDialog() ) then + warnlog( "Could not create Basic-Dialog" ) + hCloseBasicIde() + exit function + endif + + '///+<li>Open the macro controls float.</li> + if ( not hShowMacroControls() ) then + warnlog( CFN & "Could not tear off the macro controls float" ) + hCloseBasicIde() + exit function + endif + + '///+<li>Return TRUE if all went well, FALSE on any other error</li> + hInitFormControls() = true + '///</ul> + '///NOTE: The function will try to cleanup after itself in case of failure + +end function + +'******************************************************************************* + +function hInitBasicIde( cModule as string ) as boolean + + '///<h3>Get from a new document to the Basic IDE in one go</h3> + '///<i>Starting point: New, plain document</i> + + const CFN = "hInitBasicIde::" + + ToolsMacro_uno + + kontext "Makro" + if ( Makro.exists( 2 ) ) then + + if ( hCreateModuleForDoc( cModule ) ) then + + kontext "BasicIDE" + if ( BasicIDE.exists( 2 ) ) then + BasicIDE.maximize() + hInitBasicIde() = true + else + warnlog( CFN & "Failed to open BASIC IDE" ) + hInitBasicIde() = false + endif + else + warnlog( CFN & "Failed to create a module for the current document" ) + hInitBasicIde() = false + endif + else + warnlog( CFN & "Failed to open macro organizer" ) + hInitBasicIde() = false + endif + +end function + +'******************************************************************************* + +function hInsertMacro( _id as integer ) as boolean + + '///<h3>Insert a macro into the Basic-IDE edit window by Index</h3> + '///<i>Starting point: Basic IDE is open, has the focus</i> + '///<ul> + + const CFN = "hInsertMacro::" + kontext "basicide" + + printlog( CFN & "This function is deprecated" ) + + '///+<li>Delete the content of the edit window</li> + if ( not hDeleteMacro() ) then + warnlog( CFN & "Content of Basic-IDE was not deleted" ) + hInsertMacro() = false + exit function + endif + + '///+<li>Insert a macro by index (passed as function parameter)</li> + select case _id + case 1 : + ' this is a working macro that contains no errors + EditWindow.TypeKeys( "'# TTMacro1: This is a short testscript for automated testing!<return><return>" ) + EditWindow.TypeKeys( "sub main<return><return>" ) + EditWindow.TypeKeys( "print " & Chr (34) + "hallo" & Chr (34) ) + EditWindow.TypeKeys( "<Return><Return>" ) + EditWindow.TypeKeys( "<Home>end sub<return>" ) + hInsertMacro() = true + printlog( CFN & "Inserted: " & _id ) + case 2 : + EditWindow.TypeKeys( "'# TTMacro2: a second module for automated testing!" ) + EditWindow.TypeKeys( "<Return><Return>" ) + hInsertMacro() = true + printlog( CFN & "Inserted: " & _id ) + case 3 : + EditWindow.TypeKeys( "'# TTMacro3: Bring up a messagebox<return><return>" ) + EditWindow.TypeKeys( "sub main<return><return>" ) + EditWindow.TypeKeys( " msgbox " & Chr (34) + "TTMacro3" & Chr (34) ) + EditWindow.TypeKeys( "<Return><Return>" ) + EditWindow.TypeKeys( "<Home>end sub<return>" ) + hInsertMacro() = true + printlog( CFN & "Inserted: " & _id ) + end select + + '///</ul> + +end function + +'******************************************************************************* + +function hTestMacro( _id as integer ) as integer + + '///<h3>Verify that the correct macro is visible in the IDE edit Window</h3> + '///<i>Starting point: Basic IDE is open and has focus</i> + '///<ul> + + const CFN = "hTestMacro::" + qaerrorlog( CFN & "This function is deprecated, remove me!" ) + + kontext "basicide" + + '///+<li>Copy the first line in the editwindow to clipboard</li> + EditWindow.TypeKeys( "<Mod1 Home>" ) + EditWindow.TypeKeys( "<Home><Shift End>" ) + EditCopy + + '///+<li>Compare the string to a unique substring for the macro</li> + select case _id + case 1 : + if ( Instr ( GetClipboardText, "TTMacro1" ) <> 0 ) then + printlog( CFN & "The correct macro is displayed in the editwindow" ) + htestMacro() = 1 + exit function + endif + case 2 : + if ( Instr ( GetClipboardText, "TTMacro2" ) <> 0 ) then + printlog( CFN & "The correct macro is displayed in the editwindow" ) + htestMacro() = 2 + exit function + endif + case 3 : + if ( Instr ( GetClipboardText, "TTMacro3" ) <> 0 ) then + printlog( CFN & "The correct macro is displayed in the editwindow" ) + htestMacro() = 3 + exit function + endif + end select + + hTestMacro() = 0 + '///</ul> + +end function + +'******************************************************************************* + +function hCreateBasicWorkFiles() as string + + '///<H3>Create a macro, attach it to a file, save the file</H3> + '///<i>Starting point: Any plain document or the backing window</i> + '///<ul> + const CFN = "hCreateBasicWorkFiles::" + const CMACRO = "TestMacro" + + dim sFile as string : sFile = hGetBasicWorkFile( "CURRENT" ) + + '///+<li>Open a new document</li> + hCreateDocument() + + '///+<li>Change the document (to save it)</li> + printlog( CFN & hChangeDoc() ) + + '///+<li>Open Basic-Organizer, select the document and create a module</li> + if ( not hInitBasicIde( CMACRO ) ) then + printlog( CFN & "Unable to create a module, aborting" ) + hDestroyDocument() + hCreateBasicWorkFiles() = "" + exit function + endif + + '///+<li>Insert a macro that triggers a messagebox</li> + if ( not hInsertMacro( 3 ) ) then + printlog( CFN & "Unable to insert macro, aborting" ) + hCloseBasicIde() + hDestroyDocument() + hCreateBasicWorkFiles() = "" + exit function + endif + + '///+<li>Close the Basic-IDE</li> + hCloseBasicIde() + + '///+<li>Save the file without autoextension, overwrite existing</li> + if ( not hFileSaveAsKill( sFile ) ) then + printlog( CFN & "Unknown error while saving the file. Resetting" ) + ExitRestartTheOffice + hCreateBasicWorkFiles() = "" + exit function + endif + + '///+<li>Close the document</li> + hDestroyDocument() + + '///</ul> + +end function + + +'******************************************************************************* + +function hIDESelectTabByIndex( iIndex as integer ) as string + + '///<h3>Select a tab within the BASIC-IDE by index</h3> + '///<i>The BASIC-IDE has to be open and has the focus. This function + '///+ selects the tab by sending CTRL+PAGEUP or CTRL+PAGEDOWN to the IDE using + '///+ the .typeKeys method. It is assumed that - when opening the IDE - the + '///+ first tab is active. When the specified index has been reached we + '///+ retrieve the name of the current tab by opening the context menu on the + '///+ tab and selecting "Rename". The name (which should be + '///+ highlighted by default) is then copied to the clipboard and returned + '///+ to the calling function.</i><br><br> + + '///<u>Parameter(s):</u><br> + '///<ol> + + '///+<li>Index of the requested Tab (Integer)</li> + '///<ul> + '///+<li>Index must not be negative</li> + '///+<li>0 does nothing (returning the name of the current tab)</li> + '///+<li>Index must be ≤ present number of tabs</li> + '///+<li>If Index > number of tabs, the last tab is selected</li> + '///</ul> + + '///</ol> + + + '///<u>Returns:</u><br> + '///<ol> + '///+<li>Name of the selected tab (string)</li> + '///<ul> + '///+<li>Always evaluate the returnvalue</li> + '///</ul> + '///</ol> + + const CFN = "hIDESelectTabByIndex::" + printlog( CFN & "Enter with option: " & iIndex ) + dim brc as boolean 'a multi purpose boolean returnvalue + + dim cTabName as string + dim iCurrentTab as integer + + '///<u>Description:</u> + '///<ul> + '///+<li>Set context to BASIC IDE</li> + kontext "BasicIDE" + + '///+<li>Retrieve the accelerator to switch tabs</li> + '///+<li>Switch tabs</li> + select case iIndex + case 1 : + for iTab = 1 to 20 + BasicIDE.typeKeys( "<MOD1 PAGEDOWN>" ) + next iTab + case else: + for iTab = 1 to iIndex + BasicIDE.typeKeys( "<MOD1 PAGEUP>" ) + next iTab + end select + + '///+<li>Select the Tabbar</li> + Kontext "Tabbar" + + '///+<li>Open the context menu</li> + hUseMenu() + + '///+<li>Select "Rename"</li> + hSelectMenuNr( 3 ) + + '///+<li>Copy the selected string to the clipboard</li> + hUseAsyncSlot( "EditCopy" ) + + '///+<li>Send ESC to the tabbar to deselect the tab</li> + Kontext "Tabbar" + Tabbar.typeKeys( "<ESCAPE>" ) + + '///+<li>Copy the string from clipboard to a local variable</li> + cTabName = getClipboardText + + '///+<li>Print exit message, set return value</li> + if ( GVERBOSE ) then printlog( CFN & "Exit with result: " & cTabName ) + hIDESelectTabByIndex() = cTabName + '///</ul> + +end function + diff --git a/testautomation/global/tools/includes/optional/t_basic_organizer_tools.inc b/testautomation/global/tools/includes/optional/t_basic_organizer_tools.inc new file mode 100755 index 000000000000..f63d610dbdb8 --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_basic_organizer_tools.inc @@ -0,0 +1,356 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +' ** +' ** owner : joerg.skottke@oracle.com +' ** +' ** short description : tools for tools/macro test +' ** +'\****************************************************************************** + +function hSelectTheLastModule( bEditEnabled as Boolean ) as string + + '///<h3>Select the last (editable) module in the macro seletor treelist</li> + + use "global\tools\includes\optional\t_treelist_tools.inc" + + const CFN = "hSelectTheLastModule()::" + + dim bCloseDialog as boolean : bCloseDialog = FALSE + dim iNodeCount as integer + dim iCurrentNode as integer + + hSelectTheLastModule() = "" + + kontext "Makro" + if ( not Makro.exists() ) then ToolsMacro_uno : bCloseDialog = TRUE + + kontext "Makro" + iNodeCount = hSelectTheLastNode( MakroAus ) + + if ( bEditEnabled ) then + for iCurrentNode = iNodeCount to 1 step -1 + if ( Bearbeiten.isEnabled() ) then + printlog( CFN & "Editable module found at pos: " & iCurrentNode ) + exit for + endif + next iCurrentNode + else + printlog( CFN & "Module selected at pos: " & iNodeCount ) + endif + + if ( iCurrentNode > 1 ) then hSelectTheLastModule = MakroAus.getSelText() + +end function + +'******************************************************************************* + +function hCreateModuleForDoc( optional cName as string ) as boolean + + '///<h3>Create a new Basic module for the current document</h3> + '///<i>Starting point: Basic Macro Organizer is visible and has focus</i> + const CFN = "hCreateModuleForDoc::" + const DEFAULT_WAIT = 2 + const RETVAL_FAILURE = 0 + + if ( isMissing( cName ) ) then cName = "TTModule" + + kontext "Makro" + if ( Makro.exists() ) then + if ( hSelectTheLastNode( MakroAus ) > RETVAL_FAILURE ) then + + kontext "Makro" + if ( hClickButton( Neu ) ) then + + Kontext "NeuesModul" + if ( NeuesModul.exists( DEFAULT_WAIT ) ) then + Modulname.SetText( cName ) + hCloseDialog( NeuesModul, "ok" ) + + kontext "BasicIDE" + if ( BasicIde.exists( DEFAULT_WAIT ) ) then + hCreateModuleForDoc() = true + else + printlog( CFN & "BASIC IDE is not open" ) + hCreateModuleForDoc() = false + endif + else + warnlog( CFN & "Dialog <NeuesModul> did not open" ) + hCreateModuleForDoc() = false + endif + else + warnlog( CFN & "Failed to click <Neu> button" ) + hCreateModuleForDoc() = false + endif + else + warnlog( CFN & "Failed to select the last node" ) + hCreateModuleForDoc() = false + endif + else + warnlog( CFN & "Macro organizer is not open" ) + hCreateModuleForDoc() = false + endif + +end function + +'******************************************************************************* + +function hOpenBasicObjectOrganizer( iTabPage as integer ) as boolean + + '///<h3>Open the Basic Library/Module/Dialog Organizer</h3> + '///<i>Starting point: Basic IDE is open and has focus</i> + '///<ul> + + const CFN = "hOpenBasicObjectOrganizer::" + + ' This function opens a specified tab on the BASIC Organizer from the + ' BASIC-IDE + ' NOTE: This is the organizer for libraries, modules and dialogs, + ' not the one to run or assign macros! + '///+<li>Open the context menu of the tabbar</li> + kontext "basicide" + Tabbar.OpenContextMenu() + + '///+<li>Select the last entry of the context menu (dynamic menu!)</li> + if ( hMenuItemGetCount() = 2 ) then + printlog( " * short context menu (no edit-window)" ) + hMenuSelectNr( 2 ) + else + printlog( " * long context menu (edit-window/dialog visible)" ) + hMenuSelectNr( 5 ) + endif + + WaitSlot() + + '///+<li>On the basic object organizer switch to the Modules tab</li> + if ( hSelectBasicObjectOrganizerTab( 1 ) ) then + printlog( CFN & "Requested page is open" ) + hOpenBasicObjectOrganizer() = true + else + warnlog( CFN & "Failed to open requested Tabpage" ) + hOpenBasicObjectOrganizer() = false + endif + '///+<li>Return TRUE on success, FALSE on failure</li> + '///</ul> + + +end function + +'******************************************************************************* + +function hSelectBasicObjectOrganizerTab( iTabPage as integer ) as boolean + + const CFN = "hSelectBasicObjectOrganizerTab::" + + '///<h3>Switch between tab pages in the Basic Object Organizer</h3> + '///<i>Starting point: Masic Object Organizer is visible and has focus</i> + '///<ol> + '///+<li>1 = Modules</li> + '///+<li>2 = Dialogs</li> + '///+<li>3 = Libraries</li> + '///</ol> + '///Description: + '///<ul> + + '///+<li>Switch between tabpages 1, 2 or 3</li> + select case iTabPage + case 1 : + kontext + Active.SetPage TabModule + kontext "tabmodule" + if ( TabModule.exists() ) then + printlog( CFN & "Modules-Tab is open" + hSelectBasicObjectOrganizerTab() = true + exit function + endif + + case 2 : + kontext + Active.setPage TabDialogs + kontext "tabdialogs" + if ( TabDialogs.exists() ) then + printlog( CFN & "Dialogs-Tab is open" + hSelectBasicObjectOrganizerTab() = true + exit function + endif + case 3 : + kontext + Active.setPage TabBibliotheken + kontext "tabbibliotheken" + if ( TabBibliotheken.exists() ) then + printlog( CFN & "Libraries-Tab is open" + hSelectBasicObjectOrganizerTab() = true + exit function + endif + end select + + '///+<li>Return TRUE on success, FALSE on failure</li> + '///</ul> + hSelectBasicObjectOrganizerTab() = false + +end function + +'******************************************************************************* + +function hDeleteLibrary( iLocation as integer, cLibName as string ) as boolean + + '///<h3>Delete a library by name via Macro Object Organizer</h3> + '///<i>Starting point: Plain document</i> + '///<ul> + + const CFN = "hDeleteLibrary::" + const ITABPOS = 3 + + dim iObjectCount as integer + dim iCurrentObject as integer + dim cCurrentObjectName as string + + '///+<li>Open Macro Organizer</li> + ToolsMacro_uno + + '///+<li>Click Manage-button</li> + Kontext "Makro" + hClickButton( Verwalten ) + + '///+<li>Go to the Libraries Tab on the Macro Object Organizer</li> + hSelectBasicObjectOrganizerTab( ITABPOS ) + + '///+<li>Select the root node in the libraries treelist</li> + ' Needs to be specified to avoid touching the wrong library (e.g. a protected one) + kontext "TabBibliotheken" + Bibliothek.select( iLocation ) + iObjectCount = Bibliotheksliste.getItemCount() + + '///+<li>Find the requested item in the treelist</li> + for iCurrentObject = 1 to iObjectCount + + Bibliotheksliste.select( iCurrentObject ) + cCurrentObjectName = Bibliotheksliste.getSelText() + if ( cCurrentObjectName = cLibName ) then + + '///+<li>Click Delete</li> + hClickButton( Loeschen ) + exit for + endif + + next iCurrentObject + + '///+<li>Confirm to delete library</li> + Kontext "Active" + if ( Active.exists( 1 ) ) then + active.yes() + else + warnlog( CFN & "No confirmation for delete" ) + endif + + '///+<li>Verify that there is one item less in the treelist (object has been deleted)</li> + kontext "TabBibliotheken" + if ( Bibliotheksliste.getItemCount() = ( iObjectCount - 1 ) ) then + printlog( CFN & "Library has been deleted" ) + hDeleteLibrary() = true + else + printlog( CFN & "Library has not been deleted" ) + hDeleteLibrary() = false + endif + + '///+<li>Cancel Macro Object Organizer</li> + hCloseDialog( TabBibliotheken, "cancel" ) + + '///+<li>Cancel Basic Macro Organizer</li> + Kontext "Makro" + hCloseDialog( Makro, "cancel" ) + '///+<li>Return TRUE on success, FALSE on failure</li> + '///</ul> + +end function + +'******************************************************************************* + +function hNameBasicModule( cName as string ) as boolean + + '///<h3>Name a Basic Module</h3> + '///<i>Starting point: Clicked "New..." button in Basic Macro organizer.<br> + '///+ On success the kontext will be on the Basic IDE. In case of + '///+ failure we remain on the naming dialog so that the function can be + '///+ triggered again.</i><br> + '///<u>Input</u>: + '///<ol> + '///+<li>Name of the module (string)</li> + '///</ol> + '///<u>Returns</u>: + '///<ol> + '///+<li>Errorcondition (Boolean)</li> + '///<ul> + '///+<li>TRUE if name is valid, module has been created</li> + '///+<li>FALSE if name is invalid or naming dialog does not exist</li> + '///</ul> + '///</ol> + '///<u>Description</u>: + '///<ul> + + const CFN = "hNameBasicModule::" + + '///+<li>Verify that the naming dialog is open</li> + kontext "NeuesModul" + if ( not NeuesModul.exists() ) then + hNameBasicModule() = false + exit function + endif + + '///+<li>Insert the name into the EntryField</li> + Modulname.SetText( cName ) + + '///+<li>Accept the name with OK</li> + hCloseDialog( NeuesModul, "ok" ) + + '///+<li>If there is no warning, the name should be valid.</li> + kontext "BasicIDE" + if ( BasicIde.exists( 2 ) ) then + hNameBasicModule() = true + printlog( CFN & "Name accepted, Basic-Ide is open" ) + else + hNameBasicModule() = false + '///+<li>Look for invalid name warning, close it</li> + kontext "active" + if ( active.exists() ) then + printlog( CFN & "Msgbox: " & active.exists() ) + hCloseDialog( active, "ok" ) + endif + + '///+<li>If the name is invalid, get back to the naming-dialog</li> + kontext "NeuesModul" + if ( NeuesModul.exists() ) then + printlog( CFN & "Name not accepted, focus on naming-dialog" ) + else + warnlog( CFN & "Naming failed but we are not on the naming dialog" ) + endif + endif + '///</ul> + +end function + + + diff --git a/testautomation/global/tools/includes/optional/t_control_objects.inc b/testautomation/global/tools/includes/optional/t_control_objects.inc new file mode 100755 index 000000000000..b1da7d7e8d95 --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_control_objects.inc @@ -0,0 +1,611 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : joerg.skottke@oracle.com +'* +'* short description : Functions to manipulate controls by accessing them as objects +'* +'\****************************************************************************** + +private const MSG1 = "Incorrect default setting: " + +'******************************************************************************* + +function cb_test( oControl as object, def_state as string, issueid as string ) as boolean + + ' Small helper that prints a warnlog if a checkbox does not have the correct + ' default setting (checked -> def_state = TRUE). You can supply an issue id + ' which will be printed to the log. no parameter is optional, issueid can + ' be an empty string. + + ' oControl: The checkbox itself + ' def_state: Default state (checked or unchecked) + ' issueid: Issue id as string "#i123456#" for QUASTe + + dim con_state as boolean : con_state = oControl.isChecked() + dim con_name as string : con_name = oControl.name() + + printlog( con_name & " (Checkbox)" ) + cb_test() = true + + if ( def_state ) then + + if ( NOT con_state ) then + warnlog( issueid & " " & MSG1 & con_name & " should be checked" ) + cb_test() = false + endif + + oControl.unCheck() + oControl.check() + + else + + if ( con_state ) then + warnlog( issueid & " " & MSG1 & con_name & " should be unchecked" ) + cb_test() = false + endif + + oControl.check() + oControl.unCheck() + + endif + +end function + +'******************************************************************************* + +function lb_test( oControl as object, items as integer, preset as integer, issueid as string ) as boolean + + ' Do some basic testing on listboxes + ' - verify that the number of entries is correct + ' - verify that the default selection is correct + ' - select each item and restore default + + ' oControl: The Listbox as object + ' items: Number of items in the list + ' preset: Item which is selected by default (usually 1), skip with 0 + ' issueid: Issue id as string "#i123456#" for QUASTe + + dim con_name as string : con_name = oControl.name() + dim con_items as integer : con_items = oControl.getItemCount() + dim con_preset as integer : con_preset = oControl.getSelIndex() + dim con_iterator as integer + + printlog( con_name & " (Listbox)" ) + if ( oControl.isEnabled() ) then + lb_test() = true + + if ( con_items <> items ) then + warnlog( issueid & " Incorrect itemcount in listbox: " & con_name ) + printlog( "Expected: " & items ) + printlog( "Found...: " & con_items ) + lb_test() = false + endif + + if ( preset > 0 ) then + if ( con_preset <> preset ) then + warnlog( issueid & " Incorrect default setting (index): " & con_name ) + printlog( "Expected: " & preset ) + printlog( "Found...: " & con_preset ) + lb_test() = false + endif + endif + + for con_iterator = 1 to items + oControl.select( con_iterator ) + next con_iterator + + if ( preset > 0 ) then oControl.select( preset ) + else + printlog( "The control is disabled" & con_name ) + lb_test() = false + endif + +end function + +'******************************************************************************* + +function checkRadioButton( _file as string , sKey as string , control as object ) as boolean + + '///<h3>EXPERIMENTAL: Get/Set function for some control types</h3> + '///<i>This is a function that allows to change the state/content of a + '///+ control via a configuration file. This function is experimental + '///+ and should not be used.<br> + + ' a wrapper. The routine is identical to checkCheckBox. + + checkRadioButton = checkCheckBox( _file , sKey , control ) + +end function + +'******************************************************************************* + +function checkCheckBox( _file as string , sKey as string , control as object , optional cBugID as string ) as boolean + + '///<h3>EXPERIMENTAL: Get/Set function for some control types</h3> + '///<i>This is a function that allows to change the state/content of a + '///+ control via a configuration file. This function is experimental + '///+ and should not be used.<br> + + dim bIsChecked as boolean + dim sIsChecked as string + dim _sIsChecked as string + + if ( ismissing( cBugID ) ) then + cBugID = "WriteMe!" + endif + if ( sKey = "*" ) then + sKey = control.name() + endif + + sKey = lcase( sKey ) + _sIsChecked = lcase( hGetFileData( _file , sKey ) ) + + if ( _sIsChecked <> "disabled" ) then + + ' look if the control is present on the current dialog + if ( control.exists() and _ + control.IsVisible() and _ + control.IsEnabled() ) then + + ' find out whether it is checked or not, create strings for errormessage + bIsChecked = control.isChecked() + if ( bIsChecked = true ) then + sIsChecked = "checked" + else + sIsChecked = "unchecked" + endif + + ' compare + keycompare( sIsChecked , _sIsChecked , sKey , cBugID ) + checkCheckBox() = control.isChecked() + + else + + warnlog( "Control <" & sKey & "> could not be accessed." ) + + endif + + else + + if ( control.IsEnabled() ) then + warnlog( "The control should be disabled but it is not: " & sKey ) + endif + + endif + +end function + +'******************************************************************************* + +function setCheckBox( _file as string , sKey as string , control as object , optional bverbose as boolean ) as boolean + + '///<h3>EXPERIMENTAL: Get/Set function for some control types</h3> + '///<i>This is a function that allows to change the state/content of a + '///+ control via a configuration file. This function is experimental + '///+ and should not be used.<br> + + dim sIsChecked as string + dim _sIsChecked as string + + if ( sKey = "*" ) then + sKey = control.name() + endif + if ( ismissing( bverbose ) ) then + bverbose = true + endif + + sKey = lcase( sKey ) + _sIsChecked = lcase( hGetFileData( _file , sKey ) ) + + if ( _sIsChecked <> "disabled" ) then + + if ( control.exists() and _ + control.IsVisible() and _ + control.IsEnabled() ) then + + select case _sIsChecked + + case "checked" + control.check() + setCheckBox() = true + case "unchecked" + control.uncheck() + setCheckBox() = false + case else + warnlog( "what?" ) + + end select + + if ( bverbose ) then + printlog( " * " & sKey ) + endif + + else + + ' warn if the control could not be used (only works in rare cases) + warnlog( "Control <" & sKey & "> is not accessible." ) + + endif + + else + + if ( control.IsEnabled() ) then + warnlog( "The control should be disabled but it is not: " & sKey ) + endif + + endif + +end function + +'******************************************************************************* + +function checkComboBox( _file as string , sKey as string , control as object ) as boolean + + '///<h3>EXPERIMENTAL: Get/Set function for some control types</h3> + '///<i>This is a function that allows to change the state/content of a + '///+ control via a configuration file. This function is experimental + '///+ and should not be used.<br> + + dim controltext as string ' current state + dim _controltext as string ' reference + + if ( sKey = "*" ) then + sKey = control.name() + endif + + sKey = lcase( sKey ) + + if ( control.exists() = true and control.IsVisible = true ) then + + _controltext = lcase( hGetFileData( _file , skey ) ) + controltext = control.getSelText() + keycompare( controltext , _controltext , sKey ) + checkComboBox() = control.isEnabled() + + else + + warnlog( "Control <" & sKey & "> could not be accessed." ) + + endif + +end function + +'******************************************************************************* + +function setComboBox( _file as string , sKey as string , control as object , optional bverbose as boolean ) as integer + + '///<h3>EXPERIMENTAL: Get/Set function for some control types</h3> + '///<i>This is a function that allows to change the state/content of a + '///+ control via a configuration file. This function is experimental + '///+ and should not be used.<br> + + dim _controltext as string ' reference string retrieved from _file + + if ( ismissing( bverbose ) ) then + bverbose = true + endif + if ( sKey = "*" ) then + sKey = control.name() + endif + + sKey = lcase( sKey ) + + if ( control.exists() = true and control.IsVisible = true ) then + + _controltext = hGetFileData( _file , sKey ) + control.settext( _controltext ) + setComboBox() = _controltext + if ( bverbose = true ) then + printlog( " * " & sKey ) + endif + + else + + warnlog( "Control <" & sKey & "> is not accessible." ) + + endif + +end function + +'******************************************************************************* + +function checkEntryField( _file as string , sKey as string , control as object , optional cBugID as string ) as boolean + + '///<h3>EXPERIMENTAL: Get/Set function for some control types</h3> + '///<i>This is a function that allows to change the state/content of a + '///+ control via a configuration file. This function is experimental + '///+ and should not be used.<br> + + dim controltext as string ' current state + dim _controltext as string ' reference + + if ( ismissing( cBugID ) ) then + cBugID = "WriteMe!" + endif + if ( sKey = "*" ) then + sKey = control.name() + endif + + ' lowercase the name (or alias) of the control which will be tested + sKey = lcase( sKey ) + + ' get the expected setting for the control from the reference file + _controltext = lcase( hGetFileData( _file , skey ) ) + + ' if the reference file specifies that the control should be disabled + ' the routine tries to access it - expecting to fail. In this case we write + ' a string into the EF + if ( _controltext <> "disabled" ) then + + if ( control.exists() and _ + control.IsVisible() and _ + control.IsEnabled() ) then + + controltext = lcase( control.getText() ) + keycompare( controltext , _controltext , sKey , cBugID ) + checkEntryField() = control.isEnabled() + + else + + warnlog( "Control <" & sKey & "> could not be accessed." ) + + endif + + else + + if ( control.IsEnabled() ) then + warnlog( "The control should be disabled but it is not: " & sKey ) + endif + + endif + +end function + +'******************************************************************************* + +function setEntryField( _file as string , sKey as string , control as object , optional bverbose as boolean ) as string + + '///<h3>EXPERIMENTAL: Get/Set function for some control types</h3> + '///<i>This is a function that allows to change the state/content of a + '///+ control via a configuration file. This function is experimental + '///+ and should not be used.<br> + + ' this is the text that will be written into the entryfield + dim _controltext as string + + if ( ismissing( bverbose ) ) then + bverbose = true + endif + if ( sKey = "*" ) then + sKey = lcase( control.name() ) + endif + + ' get the string from the reference file + _controltext = lcase( hGetFileData( _file , sKey ) ) + + if ( _controltext <> "disabled" ) then + + ' we can only access the control if it is present + visible + if ( control.exists() and _ + control.IsVisible() and _ + control.IsEnabled() ) then + + control.setText( lcase( _controltext ) ) + setEntryField() = _controltext + + if ( bverbose ) then + printlog( " * " & sKey ) + endif + + else + + warnlog( "Control <" & sKey & "> is not accessible." ) + + endif + + else + + if ( control.IsEnabled() ) then + warnlog( "The control should be disabled but it is not: " & sKey ) + endif + + endif + +end function + +'******************************************************************************* + +function checkListBox( _file as string , sKey as string , control as object ) as boolean + + '///<h3>EXPERIMENTAL: Get/Set function for some control types</h3> + '///<i>This is a function that allows to change the state/content of a + '///+ control via a configuration file. This function is experimental + '///+ and should not be used.<br> + + dim controltext as string ' current state + dim _controltext as string ' reference + + if ( sKey = "*" ) then + sKey = control.name() + endif + + sKey = lcase( sKey ) + + if ( control.exists() = true and control.IsVisible = true ) then + + _controltext = lcase( hGetFileData( _file , skey ) ) + controltext = control.getSelIndex() + keycompare( controltext , _controltext , sKey ) + checkListBox() = control.isEnabled() + + else + + warnlog( "Control <" & sKey & "> could not be accessed." ) + + endif + +end function + +'******************************************************************************* + +function setListBox( _file as string , sKey as string , control as object , optional bverbose as boolean ) as integer + + '///<h3>EXPERIMENTAL: Get/Set function for some control types</h3> + '///<i>This is a function that allows to change the state/content of a + '///+ control via a configuration file. This function is experimental + '///+ and should not be used.<br> + + dim _controltext as string ' reference + + ' if name of the control is '*' get the name from the control itself + if ( ismissing( bverbose ) ) then + bverbose = true + endif + if ( sKey = "*" ) then + sKey = control.name() + endif + + ' change the key to lowercase + sKey = lcase( sKey ) + + if ( control.exists() = true and control.IsVisible = true ) then + + _controltext = hGetFileData( _file , sKey ) + control.select( val( _controltext ) ) + setListBox() = control.getselindex() + if ( bverbose = true ) then + printlog( " * " & sKey ) + endif + + else + + warnlog( "Control <" & sKey & "> is not accessible." ) + + endif + +end function + +'******************************************************************************* + +function checkListItem( _file as string , _iIndex as integer , sKey as string , control as object ) as boolean + + '///<h3>EXPERIMENTAL: Get/Set function for some control types</h3> + '///<i>This is a function that allows to change the state/content of a + '///+ control via a configuration file. This function is experimental + '///+ and should not be used.<br> + + dim controltext as string ' current state + dim _controltext as string ' reference + + sKey = lcase( sKey ) + + + if ( control.exists() = true and control.IsVisible() = true ) then + + control.select( _iIndex ) + controltext = control.getSelText() + _controltext = hGetFileData( _file , skey ) + + + keycompare( controltext , _controltext , sKey ) + + checkListItem() = control.isEnabled() + + else + + printlog( "Control <" & sKey & "> could not be found." ) + + endif + + +end function + +'******************************************************************************* + +function hSetControlValue( oObject as object, cValue as string ) as integer + + '///<h3>Enter some text into a EntryField/TextField</h3> + '///<i>This extends .setText() to provide a returnvalue</i><br> + '///<i>The function runs silent as long as no errors occur</i><br> + '///<u>Input</u>: + '///<ol> + '///+<li>Control Object (Object)</li> + '///<ul> + '///+<li>The object must exist</li> + '///+<li>The object must be enabled</li> + '///+<li>The object must be visible</li> + '///</ul> + '///+<li>String (string)</li> + '///<ul> + '///+<li>Any string, including empty strings (=delete)</li> + '///</ul> + '///</ol> + '///<u>Returns</u>: + '///<ol> + '///+<li>Status of the control (integer)</li> + '///<ul> + '///+<li>0 = EntryField was updated correctly</li> + '///+<li>1 = Object does not exist</li> + '///+<li>2 = Object it not visible</li> + '///+<li>3 = Object is disabled</li> + '///</ul> + '///</ol> + '///<u>Description</u>: + '///<ul> + dim irc as integer + const CFN = "hSetControlValue::" + + '///+<li>Verify that the control exists</li> + if ( oObject.exists() ) then + + '///+<li>Verify that the object is visible</li> + if ( oObject.isVisible() ) then + + '///+<li>Verify that the control is enabled</li> + if ( oObject.isEnabled() ) then + oObject.setText( cValue ) + irc = 0 + else + irc = 3 ' control disabled + printlog( CFN & "Control is disabled: ID: " & oObject ) + endif + else + irc = 2 ' control not visible + printlog( CFN & "Control is not visible: ID: " & oObject ) + endif + else + irc = 1 ' control does not exist + printlog( CFN & "Control does not exist: ID: " & oObject ) + endif + + hSetControlValue() = irc + '///</ul> + +end function + + diff --git a/testautomation/global/tools/includes/optional/t_docfuncs.inc b/testautomation/global/tools/includes/optional/t_docfuncs.inc new file mode 100755 index 000000000000..7f43b7211630 --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_docfuncs.inc @@ -0,0 +1,475 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : joerg.skottke@oracle.com +'* +'* short description : misc functions to handle documents +'* +'\****************************************************************************** + +function hUseImpressAutopilot( bEnable as boolean ) as boolean + + '///<h3>Enable/disable the Impress Autopilot in Tools/Options</h3> + '///<i>Starting point: Any plain document</i> + '///<ul> + const CFN = "global::tools::includes::optional::t_docfuncs.inc::hUseImpressAutopilot::" + + if ( GVERBOSE ) then printlog( CFN & "Enter" ) + + '///+<li>Create a new IMPRESS document</li> + gApplication = "IMPRESS" + hCreateDocument() + + '///+<li>Open Tools/Options, go to Presentataion/General page</li> + ToolsOptions + hToolsOptions( gApplication , "General" ) + + '///+<li>Check or uncheck to start with autopilot</li> + Kontext "TabSonstigesDraw" + if ( mitAutopilotStarten.exists( 2 ) ) then + + if ( bEnable ) then + mitAutopilotStarten.check() + if ( GVERBOSE ) then printlog( CFN & "Enable Impress Autopilot" ) + else + mitAutopilotStarten.uncheck() + if ( GVERBOSE ) then printlog( CFN & "Disable Impress Autopilot" ) + endif + + '///+<li>Return Status of Checkbox (checked=TRUE)</li> + hUseImpressAutopilot() = mitAutopilotStarten.isChecked() + + else + + warnlog( CFN & "Cannot find Autopilot Checkbox" ) + + endif + + '///+<li>Close Tools/Options</li> + Kontext "OptionenDlg" + hCloseDialog( OptionenDlg, "ok" ) + + '///+<li>Close IMPRESS document</li> + hDestroyDocument() + + '///+<li>Returncode is undefined</li> + if ( GVERBOSE ) then printlog( CFN & "Exit" ) + '///</ul> + +end function + +'******************************************************************************* + +function hNumericDocType( doctype as integer ) as string + + '///<h3>Convert a numeric expression to a gApplication</h3> + '///<i>BEWARE: This is a core function used by many testcases!</i><br> + '///<u>Using file: global/input/applications.txt as reference</u> + '///<ul> + + const CFN = "global::tools::includes::optional::t_docfuncs.inc::hNumericDocType::" + + dim sFile as string + sFile = gTesttoolPath & "global\input\applications.txt" + sFile = convertpath( sFile ) + + dim sList( 100 ) as string + dim iDocTypes as integer + + if ( GVERBOSE ) then printlog( CFN & "Enter" ) + + '///+<li>Retrieve matching list from file</li> + hGetDataFileSection( sFile , sList() , "application" , "" , "" ) + iDocTypes = val( sList( 0 ) ) + + '///+<li>Verify that the functionparameter (documenttype) is valid</li> + if ( ( doctype < 0 ) or ( doctype > iDocTypes ) ) then + warnlog( CFN & "Undefined numeric doctype: " & doctype ) + hNumericDocType() = "" + exit function + endif + + '///+<li>Set gApplication to the requested document type</li> + gApplication = hGetValueForKeyAsString( sList() , doctype ) + + '///+<li>Set a plain text name as returnvalue for the function</li> + hGetDataFileSection( sFile , sList() , "application_names" , "" , "" ) + hNumericDocType() = hGetValueForKeyAsString( sList() , gApplication ) + if ( GVERBOSE ) then printlog( CFN & "Exit" ) + '///</ul> + +end function + +'******************************************************************************* + +function hChangeDoc() as string + + '///<h3>Function to modify all documenttypes to set the "changed" flag</h3> + '///<i>Starting point: Any plain document</i><br> + '///<u>Input</u>: + '///<ol> + '///+<li>Nothing</li> + '///</ol> + '///<u>Returns</u>: + '///<ol> + '///+<li>String, ready to use in printlog</li> + '///<ul> + '///+<li>"Changed <Documenttype>"</li> + '///</ul> + '///</ol> + '///<u>Description</u>: + '///<ul> + + sleep() + + select case gApplication + + '///+<li>WRITER: Type some text</li> + case "WRITER", "HTML", "MASTERDOCUMENT" + Kontext "DocumentWriter" + DocumentWriter.TypeKeys "<Return>This doc is changed!" + hChangeDoc() = "Changed WRITER/HTML/MASTERDOC" + + '///+<li>CALC: Write some text into the current location (usually A1)</li> + case "CALC" : Kontext "DocumentCalc" + DocumentCalc.TypeKeys "<Down>This doc is changed!<Return>" + hChangeDoc() = "Changed CALC" + + '///+<li>DRAW: Draw a rectangle</li> + case "DRAW" : Kontext "DocumentDraw" + hRechteckErstellen ( 20, 20, 25, 25 ) + gMouseClick ( 1, 1 ) + hChangeDoc() = "Changed DRAW" + + '///+<li>IMPRESS: Draw a rectangle</li> + case "IMPRESS": Kontext "DocumentImpress" + hRechteckErstellen ( 20, 20, 25, 25 ) + gMouseClick ( 1, 1 ) + hChangeDoc() = "Changed IMPRESS" + + '///+<li>MATH: Create a simple formaula</li> + case "MATH" : SchreibenInMathdok( "b over c" ) + kontext "DocumentMath" + hChangeDoc() = "Changed MATH" + gMouseClick( 50 , 50 ) + + end select + '///</ul> + +end function + +'******************************************************************************* + +function hIdentifyWriterDoc( cString as string, bWarn as boolean ) as boolean + + '///<h3>Function to validate that the expected WRITER doc has the focus</h3> + '///<i>Starting point: Any WRITER document containing some text</i> + '///<ul> + + use "global\tools\includes\optional\t_stringtools.inc" + + const CFN = "global::tools::includes::optional::t_docfuncs.inc::hIdentifyWriterDoc::" + dim cIdentifier as string + dim irc as integer ' some temporary returnvalue + + if ( GVERBOSE ) then printlog( CFN & "Enter" ) + + '///+<li>Test the function parameter</li> + if ( cString = "" ) then + qaerrorlog( CFN & "Function parameter is empty string. Aborting" ) + hIdentifyWriterDoc() = false + exit function + endif + + '///+<li>Verify function prerequisites</li> + kontext "DocumentWriter" + if ( not DocumentWriter.exists() ) then + printlog( CFN & "There is no Writer document. Aborting" ) + hIdentifyWriterDoc() = false + exit function + endif + + hIdentifyWriterDoc() = true + + '///+<li>Go to the very beginning of the current writer document</li> + kontext "DocumentWriter" + DocumentWriter.typeKeys( "<MOD1 HOME>" ) + + '///+<li>Select the entire line</li> + DocumentWriter.typeKeys( "<SHIFT END>" ) + + '///+<li>copy the string to the clipboard and store it into a variable</li> + hUseAsyncSlot( "EditCopy" ) + cIdentifier = getClipboardText() + + '///+<li>compare the string to the reference (given as parameter)</li> + irc = hCompareSubstrings( cIdentifier, cString ) + + '///+<li>Write the result to the printlog if desired</li> + if ( irc = 0 ) then + + if ( GVERBOSE ) then printlog( CFN & "The focus is not on the expected document" ) + if ( bWarn ) then warnlog ( CFN & "The focus is not on the expected document" ) + + printlog( CFN & "Expected: " & cString ) + printlog( CFN & "Found...: " & cIdentifier ) + hIdentifyWriterDoc() = false + + else + printlog( CFN & "OK: The document contains the requested string" ) + endif + '///+<li>Return TRUE only if the current document is the expected one</li> + + if ( GVERBOSE ) then printlog( CFN & "Exit" ) + '///</ul> + +end function + +'******************************************************************************* + +function hCreateDocument() as boolean + + '///<h3>Create anew document, extends hNewDocument() by providing a returnvalue</h3> + ' TRUE = New document created, FALSE = Failed to create a new document ' + const CFN = "global::tools::includes::optional::t_docfuncs.inc::hCreateDocument::" + + dim iDocCountBefore as integer + dim iDocCountAfter as integer + + iDocCountBefore = getDocumentCount + if ( GVERBOSE ) then printlog( CFN & "Number of open documents before: " & iDocCountBefore ) + + if ( gApplication = "BACKGROUND" ) then + hFileCloseAll() + hCreateDocument() = true + else + + call hNewDocument() + iDocCountAfter = getDocumentCount() + if ( iDocCountAfter = ( iDocCountBefore + 1 ) ) then + hCreateDocument() = true + else + hCreateDocument() = false + endif + endif + if ( GVERBOSE ) then printlog( CFN & "New document created. Open: " & iDocCountAfter ) + '///</ul> + +end function + +'******************************************************************************* + +function hDocumentTypeKeys( cString as string ) as boolean + + '///<h3>Type a string to a document</h3> + '///<i>The documenttype is determined by gApplication.<br> + '///See hNumericDocType for details and number/gApplication matching</i><br> + '///<u>Input</u>: + '///<ol> + '///+<li>Keystrokes to be sent to the document (string), e.g.</li> + '///<ul> + '///+<li>"<SHIFT HOME>"</li> + '///+<li>"<MOD1 A>"</li> + '///+<li>"<MOD2 Q>"</li> + '///+<li>"Hello"</li> + '///</ul> + '///</ol> + '///<u>Returns</u>: + '///<ol> + '///+<li>Errorstatus (boolean)</li> + '///<ul> + '///+<li>TRUE if all went well</li> + '///+<li>FALSE on any error</li> + '///</ul> + '///</ol> + '///<u>Description</u>: + '///<ul> + + const CFN = "global::tools::includes::optional::t_docfuncs.inc::hDocumentTypeKeys::" + + if ( GVERBOSE ) then printlog( CFN & "Enter" ) + hDocumentTypeKeys() = true + + '///+<li>Set focus to the current documenttype determined by gApplication</li> + '///+<li>Type the string passed as function parameter</li> + select case gApplication + case "WRITER" : kontext "DocumentWriter" + DocumentWriter.typeKeys( cString ) + case "CALC" : kontext "DocumentCalc" + DocumentCalc.typeKeys( cString ) + case "IMPRESS" : kontext "DocumentImpress" + DocumentImpress.typeKeys( cString ) + case "DRAW" : kontext "DocumentDraw" + DocumentDraw.typeKeys( cString ) + case "MATH" : kontext "DocumentMath" + DocumentMath.typeKeys( cString ) + case "MASTERDOCUMENT": kontext "DocumentWriter" + DocumentWriter.typeKeys( cString ) + case "HTML" : kontext "DocumentWriter" + DocumentWriter.typeKeys( cString ) + case else + warnlog( CFN & "Exit: Unknown gApplication: " & gApplication ) + hDocumentTypeKeys() = false + exit function + end select + + '///+<li>Print some message to the log on success</li> + printlog( CFN & "Exit: Sent keystroke to " & gApplication ) + '///</ul> + +end function + + +'******************************************************************************* + +function hDestroyDocument() as boolean + + const CFN = "global::tools::includes::optional::t_docfuncs.inc::hDestroyDocument: " + dim iDocCount as integer : iDocCount = getDocumentCount() + hDestroyDocument() = false + + dim method( 3 ) as string + method( 1 ) = "no,optional" + method( 2 ) = "202,optional" + method( 3 ) = "ok,optional" ' This could be a File I/O error + + dim iCurrentMethod as integer + dim bDialogClosed as boolean + + if ( iDocCount = 0 ) then exit function + if ( GVERBOSE ) then printlog( CFN & "In.: Open: " & iDocCount ) + + hUseAsyncSlot( "FileClose" ) + + for iCurrentMethod = 1 to 3 + + bDialogClosed = false + + Kontext "Active" + if ( Active.exists( 1 ) ) then + printlog( CFN & "Msgbox: " & Active.getText() ) + if ( GVERBOSE ) then printlog( CFN & "Method: " & method( iCurrentMethod ) ) + bDialogClosed = hCloseDialog( Active, method( iCurrentMethod ) ) + else + exit for + endif + + if ( iCurrentMethod = 3 and bDialogClosed ) then + warnlog( "Unexpected messagebox was handled" ) + endif + + next iCurrentMethod + + if ( getDocumentCount() = iDocCount ) then hCloseDocument() + if ( getDocumentCount() = iDocCount - 1 ) then hDestroyDocument() = true + if ( GVERBOSE ) then printlog( CFN & "Out: Open: " & getDocumentCount() ) + +end function + +'******************************************************************************* + +function hInitSingleDoc() as boolean + + hFileCloseAll() + hCreateDocument() + + if ( GVERBOSE ) then printlog( "hInitSingleDoc(): Opening document: " & gApplication ) + + if ( getDocumentCount = 1 ) then + hInitSingleDoc() = true + else + hInitSingleDoc() = false + endif + +end function + +'*******************************************************************************'******************************************************************************* + +function hInitWriteDocIdentifier( cString as string ) as boolean + + + '///<h3>Write a specific string to an open writer document</h3> + '///<i>This function verifies that exactly one document is open, that this is a + '///+ Writer document and writes the string to the document</i><br><br> + + '///<u>Parameter(s):</u><br> + '///<ol> + + '///+<li>A free form string (String) which serves as identifier for the document</li> + '///<ul> + '///+<li>The first character should be uppercase</li> + '///</ul> + + '///</ol> + + + '///<u>Returns:</u><br> + '///<ol> + '///+<li>Errorcondition (Boolean)</li> + '///<ul> + '///+<li>TRUE: The string was written correctly</li> + '///+<li>FALSE: Too many open documents</li> + '///+<li>FALSE: Not a Writer document</li> + '///+<li>FALSE: Any other error</li> + '///</ul> + '///</ol> + + const CFN = "global::tools::includes::optional::t_docfuncs.inc::hInitWriteDocIdentifier::" + const RC_TIMEOUT = -1 + + if ( getDocumentCount = 1 and gApplication = "WRITER" ) then + + kontext "DocumentWriter" + DocumentWriter.typeKeys( "<MOD1 END>" ) + DocumentWriter.typeKeys( "<MOD1 SHIFT HOME>" ) + DocumentWriter.typeKeys( "<DELETE>" ) + DocumentWriter.typekeys( cString ) + + DocumentWriter.typeKeys( "<MOD1 END>" ) + DocumentWriter.typeKeys( "<MOD1 SHIFT HOME>" ) + + if ( hUseAsyncSlot( "EditCopy" ) <> RC_TIMEOUT ) then + + if ( getClipboardText = cString ) then + printlog( CFN & "Writer document has been successfully modified." ) + hInitWriteDocIdentifier() = true + else + warnlog( CFN & "Could not verify document identification string" ) + hInitWriteDocIdentifier() = false + endif + else + warnlog( CFN & "Unable to copy text to clipboard using <EditCopy>" ) + hInitWriteDocIdentifier() = false + endif + else + warnlog ( CFN & "Only one single writer document may be open" ) + printlog( CFN & "Number of documents: " & getDocumentCount ) + printlog( CFN & "Application........: " & gApplication ) + hInitWriteDocIdentifier() = false + endif + +end function diff --git a/testautomation/global/tools/includes/optional/t_extension_manager_tools.inc b/testautomation/global/tools/includes/optional/t_extension_manager_tools.inc new file mode 100755 index 000000000000..654b1b76c515 --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_extension_manager_tools.inc @@ -0,0 +1,780 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/****************************************************************************** +'* +'* owner : joerg.skottke@oracle.com +'* +'* short description : Tools to ease working with the extension manager +'* +'\****************************************************************************** + +function hExtensionAddGUI( _path as string, _flags as string ) as integer + + '///<h3>Install an extension using the OpenOffice.org Extension Manager UI</h3> + '///<p>This function is intended for use with the new Extension Manager UI + '///+ and replaces an older function with the same name. Please note that + '///+ the interface has changed significantly. <br>This has become necessary + '///+ because the Extension Manager can turn up with a really huge number + '///+ of different dialogs, warnings, errormessages etc. <br> + '///+ As this function is designed to handle the most common installation + '///+ scenarios it needs quite a number of differnt options.<br> + '///+ Please have a look at the usage sample:<br><br></p> + '///+ <p align="center"><i>hExtensionAddGUI( sMyExtension, + '///+ "InstallForAll,BrokenDeps,DenyUpdate" )</i<p><br> + + + '///<u>Input:</u><br> + '///<ol> + '///+<li>Path to extension (String)</li> + '///<ul> + '///+<li>The path has to be fully qualified</li> + '///+<li>The path may be platform specific</li> + '///</ul> + + '///+<li>Flags (String), defaults underlined</li> + '///<ul> + '///+<li>The string is non optional but may be empty. Allowed flags are:</li> + '///<ul> + '///+<li>InstallForAll | <u>InstallForUser</u><br>Used when running office with administrator rights</li> + '///+<li>AllowUpdate | DenyUpdate | <u>NoUpdate</u><br>Reinstall already installed extension/update</li> + '///+<li>AcceptLicense | DenyLicense | <u>NoLicense</u><br>How to handle possible license dialog</li> + '///+<li>BrokenDeps<br>Close exactly one broken dependencies warning</li> + '///+<li>UseSlot<br>Use the File Open slot to load the extension (faster)</li> + '///</ul> + '///+<li>It is recommended to use the comma as delimiter between flags</li> + '///</ul> + '///</ol> + + '///<u>Return Value:</u><br> + '///<ol> + '///+<li>Installation status (Integer)</li> + '///<ul> + '///+<li>> 0 = Installation completed with no errors, number of installed extensions</li> + '///+<li>-1 = The requested extension does not exist</li> + '///+<li>-2 = The Add-button could not be accessed</li> + '///+<li>-3 = The Extension Manager did not open</li> + '///+<li>-4 = Unknown messagebox before the file Open dialog exists</li> + '///+<li>-5 = Broken dependency warning displayed</li> + '///+<li>-6 = The File Open dialog did not pop up</li> + '///+<li>-7 = Unknown and unhandled messagebox. function exit</li> + '///</ul> + '///</ol> + + dim flags as string : flags = lcase( _flags ) + dim path as string : path = convertpath( _path ) + dim bLogs as boolean : bLogs = FALSE + + const CFN = "hExtensionAddGUI()::" + + '///<u>Description</u> + '///<ul> + + ' set defaults if string is empty + if ( flags = "" ) then flags = "installforuser,noupdate,nolicense" + if ( instr( flags , "verbose" ) <> 0 ) then bLogs = TRUE + + if ( bLogs ) then printlog( CFN & "Flags: " & flags ) + + '///+<li>Verify that the requested extension exists (filesystem level)</li> + if ( not FileExists( path ) ) then + printlog( CFN & "Requested extension does not exist" ) + printlog( CFN & path ) + hExtensionAddGUI() = -1 + exit function + endif + + + if ( bLogs ) then + printlog( "" ) + printlog( "********** Installing extension begin **********" ) + endif + + '///+<li>Open the Extension Manager - optionally using the slot (CWS oxtsysint01)</li> + if ( instr( flags , "useslot" ) <> 0 ) then + hFileOpen( path ) + else + ToolsPackageManager + kontext "PackageManager" + + if ( PackageManager.exists( 2 ) ) then + + '///+<li>Verify that the "Add.." button is available</li> + if ( add.exists() and add.isEnabled() ) then + + '///+<li>Click the "Add..." button</li> + add.click() + else + printlog( CFN & "Add button is missing or disabled" ) + hExtensionAddGUI() = -2 + exit function + endif + + '///+<li>Test for the dreaded "The office workdirectory does not exist" warning, close it</li> + kontext "Active" + if ( Active.exists( 1 ) ) then + if ( Active.getButtonCount() = 1 ) then + if ( bLogs ) then printlog( Active.getText() ) + active.ok() + else + printlog( CFN & "Unexpected/unknown messagebox" ) + printlog( Active.getText() ) + hExtensionAddGUI() = -4 + exit function + endif + endif + + '///+<li>Enter the extension name into the file picker, open the file</lI> + kontext "OeffnenDlg" + if ( OeffnenDlg.exists( 2 ) ) then + DateiName.setText( path ) + Oeffnen.click() + else + printlog( CFN & "The File Open dialog did not open" ) + hExtensionAddGUI() = -6 + exit function + endif + + else + printlog( CFN & "Extension Manager is not open" ) + hExtensionAddGUI() = -3 + exit function + endif + endif + + '///+<li>Test for the installation target dialog that comes up as soon as the + '///+ user has administrator rights or works on a userspace installation. + '///+ Handle the dialog as specified by the function flags</li> + if ( instr( flags, "installfor" ) <> 0 ) then + kontext "Active" + if ( Active.exists( 1 ) ) then + if ( Active.getButtonCount() = 3 ) then + + if ( bLogs ) then + printlog( CFN & "Installation target dialog found" ) + printlog( Active.getText() ) + endif + + if ( instr( flags , "installforall" ) <> 0 ) then + printlog( CFN & "Installing for all users" ) + Active.no() + else + printlog( CFN & "Installing for user only" ) + Active.yes() + endif + else + if ( bLogs ) then + printlog( CFN & "Unexpected/unknown dialog" ) + printlog( Active.getText() ) + endif + endif + else + if ( bLogs ) then printlog( CFN & "Skipping handling of installation target" ) + endif + else + if ( bLogs ) then printlog( CFN & "Not handling userspace installations" ) + endif + + '///+<li>Test for the broken dependencies exception, close it with ok.</li> + if ( instr( flags , "brokendeps" ) <> 0 ) then + if ( bLogs ) then printlog( CFN & "Testing for dependencies messagebox" ) + kontext "UnsatisfiedDependencies" + if ( UnsatisfiedDependencies.exists( 1 ) ) then + printlog( CFN & "Closing Unsatisfied Dependencies dialog." ) + UnsatisfiedDependencies.ok() + hExtensionAddGUI() = -5 + else + printlog( CFN & "No unsatisfied dependencies dialog" ) + endif + else + if ( bLogs ) then printlog( CFN & "Skipping handling of broken dependencies dialog" ) + endif + + '///+<li>Test for the extension update dialog which pops up if an extension + '///+ is already installed. Handle as specified by flags</li> + if ( instr( flags, "update" ) ) then + if ( bLogs ) then printlog( CFN & "Testing for version message/update" ) + kontext "Active" + if ( Active.exists( 1 ) ) then + + if ( bLogs ) then + printlog( CFN & "Found update dialog" ) + printlog( Active.getText() ) + endif + + if ( Active.getButtonCount() = 2 ) then + if ( instr( flags, "denyupdate" ) <> 0 ) then + printlog( CFN & "Denying update" ) + Active.cancel() + else + printlog( CFN & "Allowing update" ) + Active.ok() + endif + else + printlog( CFN & "Unexpected/unknown dialog displayed" ) + printlog( Active.getText() ) + hExtensionAddGUI() = -7 + exit function + endif + else + if ( instr( flags , "noupdate" ) <> 0 ) then + printlog( CFN & "No update dialog present. Good" ) + else + printlog( CFN & "Update messagebox is missing" ) + endif + endif + else + if ( bLogs ) then printlog( CFN & "Skipping handling of update dialog" ) + endif + + '///+<li>Test for the Software License Agreement dialog. Handle as specified by + '///+ flags</li> + if ( instr( flags, "license" ) <> 0 ) then + if ( bLogs ) then printlog( CFN & "Testing software license dialog" ) + kontext "ExtensionSoftwareLicenseAgreement" + if ( ExtensionSoftwareLicenseAgreement.exists( 5 ) ) then + if ( bLogs ) then printlog( CFN & "Software license dialog found" ) + if ( instr( flags , "denylicense" ) <> 0 ) then + printlog( CFN & "Cancelling software license dialog" ) + ExtensionSoftwareLicenseAgreement.cancel() + else + printlog( CFN & "Accepting software license" ) + do while ( not accept.isEnabled() ) + ScrollDown.click() + WaitSlot() + loop + accept.click() + endif + else + if ( instr( flags , "nolicense" ) <> 0 ) then + printlog( CFN & "No license dialog displayed. Good." ) + else + warnlog( CFN & "Expected license dialog is missing" ) + endif + endif + else + if ( bLogs ) then printlog( CFN & "Skipping handling of license dialog" ) + endif + + '///+<li>Retrieve the number of installed extensions</li> + kontext "PackageManager" + wait( 500 ) + hExtensionAddGUI() = BrowsePackages.getItemCount() + + '///+<li>Close the Extension Manager</li> + hCloseDialog( PackageManager , "close" ) + + if ( bLogs ) then + printlog( "********** Installing extension end **********" ) + printlog( "" ) + endif + '///</ul> + +end function + + +'******************************************************************************* + +function hExtensionRemoveGUI( cExtensionName as string ) as integer + + + '///<h3>Remove an extension via Extension Manager </h3> + + '///<u>Input value(s):</u><br> + '///<ol> + '///+<li>UI Name of the extension (string)</li> + '///</ol> + + + '///<u>Return Value:</u><br> + + '///<ol> + '///+<li>Errorcode (integer)</li> + '///<ul> + '///+<li>0 = No errors, extension was removed</li> + '///+<li>1 = Failure to open Extension Manager (fatal)</li> + '///+<li>2 = Cannot delete found extension, remove-button is disabled (fatal)</li> + '///+<li>3 = The extension was not found (non-fatal)</li> + '///</ul> + '///</ol> + + const CFN = "hExtensionRemoveGUI(): " + + printlog( "Removing extension by name: " & cExtensionName ) + + ToolsPackageManager + kontext "PackageManager" + if ( PackageManager.exists( 2 ) ) then + try + BrowsePackages.select( cExtensionName ) + if ( Remove.exists() ) then + if ( Remove.isEnabled() ) then + Remove.click() + + kontext "Active" + if ( Active.exists( 3 ) ) then + printlog( Active.getText() ) + Active.OK() + WaitSlot() + else + warnlog( CFN & "Expected confirmation dialog is missing" ) + endif + hExtensionRemoveGUI() = 0 + else + hExtensionRemoveGUI() = 2 + endif + else + hExtensionRemoveGUI() = 4 + endif + catch + hExtensionRemoveGUI() = 3 + endcatch + + kontext "PackageManager" + hCloseDialog( PackageManager , "close" ) + else + hExtensionRemoveGUI() = 1 + endif + +end function + +'******************************************************************************* + +function sExtensionCLI(sCommand as string, sExtensionName as string, optional sExtensionPath as string) as string + '/// Add/remove an extension with the command line tool 'unopkg'///' + '/// INPUT: sCommand: string of command from "add remove list reinstall" ///' + '/// INPUT: sExtensionName: name of the extension ///' + '/// INPUT: optional sExtensionPath: path to the extension ///' + '/// RETURN: currently nothing ///' + dim sLokalExtensionPath as string + dim sCommands as string + dim sUnoPkg as string + dim i, a, b as integer + dim args as string + Dim sFile as string + Dim sEnv as string + Dim sContent(5) as string + Dim sPlatformProgramPath as string + + if isMissing(sExtensionPath) then + sLokalExtensionPath = "" + else + sLokalExtensionPath = sExtensionPath + endif + + sCommands = "add remove list reinstall" + + a = len(sAppExe) + if a > 12 then + b = inStr(a-12, sAppExe, "soffice") + sUnoPkg = left(sAppExe, b-1) + "unopkg" + mid(sAppExe, b+len("soffice")) + 'printlog sUnoPkg + 'sUnoPkg = convertToUrl(sUnoPkg) + else + qaErrorLog ("Need to think about another solution..." + sAppExe) + endif + args = sCommand+" "+sLokalExtensionPath + sExtensionName + printlog "Executing: "+sUnopkg+" "+args + if gPlatGroup <> "unx" then + shell(sUnoPkg,2,args) + else + sFile = ConvertPath (gOfficePath + "user/work/uno.sh") + if gPlatform = lcase("osx") then + sPlatformProgramPath = "MacOS" + else + sPlatformProgramPath = "program" + end if + sEnv = convertToURL(convertPath(gNetzOfficePath + sPlatformProgramPath + "/fundamentalrc") + listAppend(sContent(), "export URE_BOOTSTRAP=" + sEnv) + listAppend(sContent(), sUnoPkg + " " + args) + listWrite(sContent(), sFile) + shell("bash",1,sFile) + endif +end function + +'******************************************************************************* + +function hExtensionGetItemList( cItemList() as string ) as integer + + '///<h3>Get the list of all items in the extensions list</h3> + '///<i>The array contains the list of all items in the extension manager GUI, + '///+ including all components of the extensions. Consider this when defining + '///+ the size of the array to be passed to this function as problems here are + '///+ hard to debug.<br> + '///+ Starting point is any document, the function will return to the + '///+ calling document on completion</i><br><br> + + '///<u>Input:</u> + '///<ol> + '///+<li>Array for the list items (string)</li> + '///</ol> + + + '///<u>Return Value:</u><br> + '///<ol> + '///+<li>Number of items (integer)</li> + '///<ul> + '///+<li>0 on any error</li> + '///+<li>2 if no extensions exist (My Macros/OpenOffice.org macros nodes present</li> + '///+<li>> 2 if any changes to the default exist</li> + '///</ul> + '///</ol> + + dim iItemCount as integer + dim iCurrentExtension as integer + + printlog( "Retrieving extension list" ) + + ToolsPackageManager + kontext "PackageManager" + if ( PackageManager.exists( 2 ) ) then + + iItemCount = BrowsePackages.getItemCount() + + for iCurrentExtension = 1 to iItemCount + cItemList( iCurrentExtension ) = BrowsePackages.getItemText( iCurrentExtension , 1 ) + printlog( " * " & cItemList( iCurrentExtension ) + next iCurrentExtension + + hExtensionGetItemList() = iItemCount + cItemList( 0 ) = iItemCount + hCloseDialog( PackageManager , "close" ) + + else + + hExtensionGetItemList() = 0 + + endif + +end function + +'******************************************************************************* + +function hSelectExtensionID( iPos as integer ) as string + + '///<h3>Select an item by index in the list of available extensions</h3> + '///<i>This function needs the Extension Manager to be open. It will only + '///+ select extensions but not their components.</i><br><br> + + '///<u>Input:</u> + '///<ol> + '///+<li>Absolute position of the extension to be selected (Integer)</li> + '///</ol> + + '///<u>Return Value:</u><br> + '///<ol> + '///+<li>Name of the selected extension (String)</li> + '///+<li>Empty string on index out of range or Extension Manager not open</li> + '///</ol> + + printlog( "Selecting extension at pos. " & iPos ) + + ToolsPackageManager + kontext "PackageManager" + if ( PackageManager.exists( 2 ) ) then + try + BrowsePackages.select( iPos ) + hSelectExtensionID() = BrowsePackages.getItemText( iPos , 1 ) + catch + hSelectExtensionID() = "" + endcatch + hCloseDialog( PackageManager , "close" ) + else + hSelectExtensionID() = "" + endif + + +end function + +'******************************************************************************* + +function hSelectExtensionName( cName as string ) as integer + + '///<h3>Select an item by name in the list of available extensions</h3> + '///<i>This function needs the Extension Manager to be open. It will only + '///+ select extensions but not their components.</i><br><br> + + '///<u>Input:</u> + '///<ol> + '///+<li>Name of the extension (String)</li> + '///<ul> + '///+<li>Name of any item in the treelist, even those of top nodes</li> + '///</ul> + '///</ol> + + '///<u>Return Value:</u><br> + '///<ol> + '///+<li>Absolute position of the selected extension (Integer)</li> + '///<ul> + '///+<li>0 = Extension was not found</li> + '///+<li>> 0 = Absolute position of the extension/node</li> + '///+<li>-1 = Extension Manager did not open</li> + '///</ul> + '///</ol> + + printlog( "Selecting extension by display name: " & cName ) + + ToolsPackageManager + kontext "PackageManager" + if ( PackageManager.exists( 2 ) ) then + try + BrowsePackages.select( cName ) + hSelectExtensionName() = BrowsePackages.getSelIndex() + catch + hSelectExtensionName() = 0 + endcatch + hCloseDialog( PackageManager , "close" ) + else + hSelectExtensionName() = -1 + endif + + +end function + + +'******************************************************************************* + +function hSelectOptionsItem( cName as string, iIndex as integer ) as integer + + '///<h3>Select an item in Tools/Options and verify</h3> + '///<i>You need to open the Tools/Options dialog before using this function, + '///+ it will not close the dialog either. No warnlogs are printed so evaluation + '///+ of the return value is mandatory</i><br><br> + + '///<u>Parameter(s):</u><br> + '///<ol> + + '///+<li>Name of the extension node (string)</li> + '///<ul> + '///+<li>Name of the module</li> + '///+<li>Name of the leaf</li> + '///+<li>Node must be valid</li> + '///</ul> + + '///+<li>Position of the node (absolute) (integer)</li> + '///<ul> + '///+<li>All nodes are expanded</li> + '///+<li>Position must be valid (> 0 and ≤ number of nodes in list)</li> + '///</ul> + + '///</ol> + + + '///<u>Returns:</u><br> + '///<ol> + '///+<li>Errorcondition (integer)</li> + '///<ul> + '///+<li>0 = Success</li> + '///+<li>1 = Partial success - node is at wrong position</li> + '///+<li>2 = Node does not exist</li> + '///+<li>3 = Dialog not open</li> + '///+<li>4 = Index out of range (incorrect call to function)</li> + '///</ul> + '///</ol> + + const CFN = "hSelectOptionsItem::" + printlog( CFN & "Enter with option (Name).: " & cName ) + printlog( CFN & "Enter with option (Index): " & iIndex ) + + dim brc as boolean ' a multi purpose boolean returnvalue + dim irc as integer ' a multi purpose integer returnvalue + dim crc as string ' a multi purpose string returnvalue + + '///<u>Description:</u> + '///<ul> + '///+<li>Make sure we are on the Tools/Options dialog</li> + kontext "OptionenDlg" + if ( not OptionenDlg.exists( 2 ) ) then + warnlog( CFN & "Tools/Options is not open, aborting" ) + hSelectOptionsItem() = 3 + exit function + endif + + '///+<li>Expand all nodes on "OptionsListe"</li> + irc = hExpandAllNodes( OptionsListe ) + if ( irc < iIndex ) then + warnlog( CFN & "Index out of range, quitting" ) + hSelectOptionsItem() = 4 + exit function + endif + + '///+<li>Search for the node at the given index, handle errors, exit function</li> + crc = hSelectNode( OptionsListe , iIndex ) + + ' if the name of the node at given position is ok ... + if ( crc = cName ) then + printlog( CFN & "Exit: The node was found: " & crc ) + hSelectOptionsItem() = 0 + exit function + + ' if the name is not ok, try to find the node by name + else + printlog( CFN & "Node not found at expected position, retrying" ) + irc = hSelectNodeByName( OptionsListe , cName ) + + ' if the node is found it is just at the wrong position - bad but not deadly + if ( irc > 0 ) then + qaerrorlog( CFN & "Exit: Node <" & cName & "> found at pos: " & irc ) + hSelectOptionsItem() = 1 + exit function + + ' if the node was not found at all this is really bad. + else + warnlog( CFN & "Exit: Node does not exist: " & cName ) + hSelectOptionsItem() = 3 + exit function + endif + endif + + '///</ul> + +end function + + +'******************************************************************************* + +function hIsExtensionAlreadyInstalled( cName as string ) as boolean + + '///<h3>Check if an extension is already installed</h3> + '///<i>The function opents the Extension Manager, finds (or not) the extension + '///+ and returns an appropriate return value. The Extension Manager is + '///+ closed again at the end.</i><br><br> + + '///<u>Input:</u> + '///<ol> + '///+<li>Name of the extension (String)</li> + '///</ol> + + '///<u>Return Value:</u><br> + '///<ol> + '///+<li>is the extension allredy installed (boolean)</li> + '///<ul> + '///+<li>FALSE = Extension is not installed</li> + '///+<li>FALSE = Extension Manager did not open</li> + '///+<li>TRUE = Extension is installed</li> + '///</ul> + '///</ol> + + printlog( "Checking if extension is already installed: " & cname ) + + dim iCountExtensions as integer + dim i as integer + + hIsExtensionAlreadyInstalled() = FALSE + + ToolsPackageManager + kontext "PackageManager" + + iCountExtensions = BrowsePackages.getItemCount() + + for i = 1 to iCountExtensions + if(Instr(BrowsePackages.getItemText(i,1),cname) <> 0) then + hIsExtensionAlreadyInstalled() = TRUE + endif + next + + hCloseDialog( PackageManager , "close" ) + +end function + + +'******************************************************************************* + +function hDisableUserExtensionGUI( extension_name as string ) as integer + + '///<h3>Disable a userspace extension by name via GUI</h3> + '///<i>This function tries to disable an Extension specified by name. There + '///+ are several reasons why this might fail so it is required to evaluate the + '///+ returnvalue as the function will not print any warnings. If the function + '///+ fails this is most likely caused by a) the extension already being + '///+ disabled or b) the extension belonging to the shared layer.<br> + '///+ The Extension Manager needs to be open when function is called.</i><br><br> + + '///<u>Parameter(s):</u><br> + '///<ol> + + '///+<li>Name of the extension to be disabled (string)</li> + '///<ul> + '///+<li>Only extensions from the user layer can be disabled</li> + '///</ul> + + '///</ol> + + + '///<u>Returns:</u><br> + '///<ol> + '///+<li>Errorcondition (integer)</li> + '///<ul> + '///+<li>0 = Extension was found and disabled</li> + '///+<li>1 = Extension does not exist</li> + '///+<li>2 = Extension could not be disabled</li> + '///+<li>3 = Extension Manager did not open</li> + '///</ul> + + printlog( "Disabling user extension" ) + + ToolsPackageManager + kontext "PackageManager" + if ( PackageManager.exists( 2 ) ) then + try + BrowsePackages.select( extension_name ) + if ( Disable.exists() and Disable.isEnabled() ) then + hDisableUserExtensionGUI() = 0 + else + hDisableUserExtensionGUI() = 2 + endif + hCloseDialog( PackageManager , "close" ) + catch + hDisableUserExtensionGUI() = 1 + endcatch + else + hDisableUserExtensionGUI() = 3 + endif + +end function + +'******************************************************************************* + +function hGetExtensionCount() as integer + + printlog( "Getting number of installed extensions." ) + + ToolsPackageManager + kontext "PackageManager" + if ( PackageManager.exists( 2 ) ) then + try + hGetExtensionCount() = BrowsePackages.getItemCount() + hCloseDialog( PackageManager , "close" ) + catch + hGetExtensionCount() = -2 + endcatch + else + hGetExtensionCount() = -1 + endif + + +end function + + diff --git a/testautomation/global/tools/includes/optional/t_filetools.inc b/testautomation/global/tools/includes/optional/t_filetools.inc new file mode 100755 index 000000000000..070427ef3c5b --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_filetools.inc @@ -0,0 +1,412 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : joerg.skottke@oracle.com +'* +'* short description : Functions that work with files like deleting, loading... +'* +'\****************************************************************************** + +function hHandleActivesOnLoad( iTries as integer , iAdd as integer ) as boolean + + '///<h3>Handle any dialogs that might pop up when loading a file</h3> + '///<i>Beware: This function gives only limited control over the dialogs closed, + '///+ it just closes anything it can.</i><br> + '///<i>Please refer to the inline documentation for further details</i><br> + '///<u>Input</u>: + '///<ol> + '///+<li>Number of dialogs to be closed (integer)</li> + '///<ul> + '///+<li>Number of dialogs not limited though more than 3 is not useful</li> + '///</ul> + '///+<li>Additional dialogs (integer).</li> + '///<ul> + '///+<li>Number of dialogs to handle in case of unexpected behavior. If unsure set it to 2</li> + '///</ul> + '///</ol> + '///<u>Returns</u>: + '///<ol> + '///+<li>Errorcondition (boolean)</li> + '///<ul> + '///+<li>TRUE: The expected number of dialogs were closed</li> + '///+<li>FALSE: On any other condition</li> + '///</ul> + '///</ol> + '///<u>Description</u>: + '///<ul> + '///+<li>OK to create a new document based on a template</li> + '///+<li>YES to update links</li> + '///+<li>YES to execute macros</li> + '///</ul> + + use "global/tools/includes/optional/t_stringtools.inc" + + const CFN = "hHandleActivesOnLoad::" + + dim iTry as integer + dim iActives as integer + dim cMessage as string + dim bSkip as boolean + + if ( GVERBOSE ) then printlog( CFN & "Enter" ) + + ' not good but apparently required - else hDestroyDocument will handle the + ' dialogs and warn about them. + + ' think positive: preset the returnvalue with "true" + hHandleActivesOnLoad() = true + + for iTry = 1 to iTries + iAdd + + ' handle three possible dialogs: + ' 1. The warning that the user should create a new document based + ' on this Sample/Template (the document is write protected) + ' 2. The question to update links to the internet. Note: If you + ' use proxies, they must be set correctly otherwise the result + ' is undefined. + ' 3. Some weird usage information dialog which is an active with just + ' one OK button. + + ' Although this works quite well, there is a flaw that we will not + ' get information about an "active" dialog that cannot be closed by + ' .yes() or .ok(). If this happens, we probably run into an error + kontext "Active" + try + if ( active.exists( 1 ) ) then + + iActives = iActives + 1 + cMessage = hRemoveLineBreaks( active.getText() ) + printlog( CFN & "MSG (" & iActives & "): " & cMessage ) + printlog( CFN & "Ressource type is: " & Active.getRT() ) + printlog( CFN & "Buttoncount is: " & Active.getButtonCount() ) + bSkip = false + + ' ok to create a new document + try + active.cancel() + printlog( CFN & "MSG (" & iActives & "): closed with Cancel" ) + bSkip = true + catch + printlog( CFN & "Missed - this dialog has no Cancel button (create new document)" ) + active.ok() + endcatch + + if ( not bSkip ) then + if ( Active.getRT() = 304 ) then + if ( Active.getButtonCount() = 1 ) then + active.ok() + printlog( CFN & "MSG (" & iActives & "): closed with OK" ) + bSkip = true + endif + else + endif + endif + + if ( not bSkip ) then + ' no to update links + try + active.no() + printlog( CFN & "MSG (" & iActives & "): closed with NO" ) + catch + printlog( CFN & "Missed - this dialog has no NO button (update links)" ) + endcatch + endif + + endif + catch + kontext "Active" + if ( Active.exists( 1 ) ) then + if ( Active.getButtonCount() = 2 ) then + printlog( CFN & "<Update links dialog> or <File corruption warning>" ) + active.yes() + hFileWait( FALSE ) + kontext "Active" + if ( Active.exists( 2 ) ) then + qaerrorlog( "#105670# - File corruption warning, the template is broken" ) + qaerrorlog( CFN & "Trying to recover." ) + Active.ok() + hHandleActivesOnLoad() = FALSE + exit function + endif + endif + endif + + qaerrorlog( "Problem while trying to handle messageboxes" ) + hHandleActivesOnLoad() = false + endcatch + + next iTry + + ' now see how many dialogs were allowed and how many have been closed + ' this does not change the return value of the function + if ( iActives > iTries ) then + printlog( CFN & "Exit: The test closed more dialogs than expected" ) + hHandleActivesOnLoad() = false + else + if ( GVERBOSE ) then printlog( CFN & "Exit" ) + endif + +end function + +'******************************************************************************* + +function hHandleInitialDialogs() as integer + + const CFN = "hHandleInitialDialogs::" + + '///<h3>Handle dialogs while opening samples/templates etc.</h3> + '///<i>The returnvalue is of limited use</i><br> + '///<u>Input</u>: + '///<ol> + '///+<li>Nothing</li> + '///</ol> + '///<u>Returns</u>: + '///<ol> + '///+<li>Id of the dialog (integer)</li> + '///<ul> + '///+<li>0: No dialog was found</li> + '///+<li>1: UseOfThisTemplate</li> + '///+<li>2: StarOfficeCalendar1</li> + '///+<li>3: NewsletterLayout</li> + '///+<li>4: PortfolioCurrency</li> + '///+<li>5: StarOfficeCalendar2</li> + '///</ul> + '///</ol> + '///<u>Description</u>: + '///<ul> + + + ' NOTE: The ID of the dialog will be returned but is of limited use + ' Function returns 0 if no dialogs have been encountered + + dim incident as integer + incident = 0 + + if ( GVERBOSE ) then printlog( CFN & "Enter" ) + try + + '///+<li>Test for UseOfThisTemplate-dialog</li> + Kontext "UseOfThisTemplate" + if ( UseOfThisTemplate.Exists() ) then + printlog( CFN & "Closing UseOfThisTemplate-dialog" ) + incident = 1 + CancelButton.Click() + endif + + '///+<li>Test for StarOfficeCalendar1-dialog</li> + Kontext "StarOfficeCalendar1" + if ( StarOfficeCalendar1.Exists() ) then + printlog( CFN & "Closing StarOfficeCalendar1-dialog" ) + incident = 2 + Cancel.Click() + endif + + '///+<li>Test for StarOfficeCalendar2-dialog (This should be idential to StarofficeCalendar1)</li> + Kontext "StarOfficeCalendar2" + if ( StarOfficeCalendar2.Exists() ) then + printlog( CFN & "Closing StarOfficeCalendar2-dialog" ) + incident = 5 + Cancel.Click() + endif + + '///+<li>Test for NewsletterLayout-dialog</li> + Kontext "NewsletterLayout" + if ( NewsletterLayout.Exists() ) then + printlog( CFN & "Closing NewsletterLayout-dialog" ) + incident = 3 + OkButton.Click() + endif + + '///+<li>Test for PortfolioCurrency-dialog</li> + Kontext "PortfolioCurrency" + if ( PortfolioCurrency.Exists() ) then + printlog( CFN & "Closing PortfolioCurrency-dialog" ) + incident = 4 + OKButton.Click() + endif + catch + endcatch + + hHandleInitialDialogs() = incident + if ( GVERBOSE ) then printlog( CFN & "Exit" ) + + '///</ul> + +end function + +'******************************************************************************* + +function hGetWorkPath() as string + + '///<h3>Retrieve the users work directory</h3> + '///<i>Uses: Call to UNO service</i><br> + '///<i>Errorhandling: Fixes "$(user)"-type path (uses fallback)</i><br> + '///<i>Errorhandling: Handles broken UNO connection (uses fallback)</i><br> + '///<u>Input</u>: + '///<ol> + '///+<li>Nothing</li> + '///</ol> + '///<u>Returns</u>: + '///<ol> + '///+<li>Path to local workdir (string)</li> + '///<ul> + '///+<li>Includes trailing slash/backslash</li> + '///</ul> + '///</ol> + '///<u>Description</u>: + '///<ul> + + dim sPath as string + dim sDefaultPath as string + sDefaultPath = convertpath( gOfficePath & "user/work" ) + dim oOfficeConnect as object + dim oOfficeConfig as object + dim bPathIsFromAPI as boolean + + const CFN = "hGetWorkPath::" + + '///+<li>Create an UNO service and ask it for the location of "Work"</li> + try + oOfficeConnect = hGetUnoService( true ) + oOfficeConfig = oOfficeConnect.createInstance( "com.sun.star.util.PathSettings" ) + sPath = convertFromURL( oOfficeConfig.Work ) + bPathIsFromAPI = true + catch + '///+<li>Handle broken UNO connection</li> + printlog( CFN & "Could not access service, connection broken?" ) + sPath = "" + bPathIsFromAPI = false + endcatch + + '///+<li>If the path differs from the default do a warnlog</li> + if ( sPath <> sDefaultPath ) then + printlog( CFN & "Default path is: " & sDefaultPath ) + printlog( CFN & "Workpath is not defaultpath: " & sPath ) + printlog( CFN & "Overriding UNO path" ) + sPath = convertpath( gOfficePath & "user\work" ) + bPathIsFromAPI = false + endif + + '///+<li>Apply fallback in case of broken connection or invalid path</li> + if ( instr( sPath , "$(user)" ) > 0 ) then + printlog( CFN & "sPath has $(user)-type string, using fallback" ) + sPath = sDefaultPath + bPathIsFromAPI = false + endif + + '///+<li>Add trailing pathseparator, do convertpath</li> + sPath = sPath & "/" + sPath = convertpath( sPath ) + + '///+<li>Print info to the log and return the path</li> + if ( GVERBOSE ) then + if ( bPathIsFromAPI ) then + printlog( CFN & "(From API): " & sPath ) + else + qaerrorlog( CFN & "(Junked API-Path): " & sPath ) + endif + endif + hGetWorkPath() = sPath + '///</ul> + +end function + +'******************************************************************************* + +function hGetFileSizeAsLong( cFileName as string ) as long + + '///<h3>Get the size (long) of a file</h3> + '///<u>Input</u>: + '///<ol> + '///+<li>Filename (string)</li> + '///</ol> + '///<u>Returns</u>: + '///<ol> + '///+<li>Size of file (long)</li> + '///</ol> + '///<u>Description</u>: + '///<ul> + + const CFN = "hGetFileSizeAsLong::" + + ' This function returns the size of a specified file. If it is a directory, + ' the size will default to -1 (A filesize can never be <0 - hopefully) + + dim iAttrib as integer + + '///+<li>Verify that the given file exists</li> + if ( app.dir( cFileName ) <> "" ) then + + try + iAttrib = getattr( cFileName ) + + '///+<li>Return the size for a file or -1 for a directory</li> + if ( iAttrib <> 16 and iAttrib <> 17 ) then + hGetFileSizeAsLong() = filelen( cFileName ) + else + hGetFileSizeAsLong() = -1 + endif + catch + qaerrorlog( CFN & "File was not handled correctly: " & cFileName ) + hGetFileSizeAsLong() = 0 + endcatch + + else + + '///+<li>Return a size of 0 if the file was not found</li> + hGetFileSizeAsLong() = 0 + warnlog( CFN & "File does not exist: " & cFileName ) + + endif + + '///</ul> + +end function + +'******************************************************************************* + +function hGetWorkFile( cFileName as string ) as string + + '///<h3>Returns a fully qualified filename to a workfile</h3> + '///<u>Input</u>: + '///<ol> + '///+<li>Filename without path (string)</li> + '///</ol> + '///<u>Returns</u>: + '///<ol> + '///+<li>Filename including path to user work directory (string)</li> + '///</ol> + '///<u>Description</u>: + '///<ul> + + '///+<li>Concatenate workpath and filename, convertpath</li> + hGetWorkFile() = convertpath( hGetWorkPath() & cFileName ) + '///</ul> + +end function + + diff --git a/testautomation/global/tools/includes/optional/t_key_tools.inc b/testautomation/global/tools/includes/optional/t_key_tools.inc new file mode 100755 index 000000000000..14906c127c68 --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_key_tools.inc @@ -0,0 +1,563 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : joerg.skottke@oracle.com +'* +'* short description : tools for evaluation of key=value datalists +'* +'******************************************************************************* +' ** +' #1 hGetDataPairAsString ' retrieve key=value from a list +' #1 hGetValueForPairAsString ' retrieve value from a key=value as string +' #1 hGetValueForPairAsLong ' retrieve value from a key=value as long integer +' #1 hGetValueForKeyAsInt ' retrieve value for a specified key as integer +' #1 hGetValueForKeyAsLong ' retrieve value for a specified key as long integer +' #1 hGetKeyForPairAsString ' retrieve key from key=value as string +' #1 hGetKeyForValueAsString ' retrieve key for a specified value as string +' #1 hGetKeyForValueAsInt ' retrieve key for a specified value as int +' #1 hGetIndexForKeyAsInt ' retrieve the index for a key in a list +' #1 KeyCompare ' compare two keys +' ** +'\****************************************************************************** + +' Some variables explained: +' +' cComp is the KEY belonging to the VALUE above for reverse test +' +' NOTE: Other related functions can be found in global/tools/inc/t_filters.inc + +'******************************************************************************* + +function hGetDataPairAsString( sKey as string, sVal as long ) as string + + '///<h3>Concatenate two strings and insert an = sign</h3> + '///<i>About "KEY"-functions: <br> + '///These functions are used whenever + '///+ data is to be processed that is stored in a key=value format.<br> + '///+ They handle a single string or a list of strings + '///+ to e.g. isolate a key, a value or to just retrieve the pair.</i><br><br> + + '///<u>Input</u>: + '///<ol> + + '///+<li>KEY (string)</li> + '///<ul> + '///+<li>Anything but should not contain # or '</li> + '///</ul> + + '///+<li>VALUE (string)</li> + '///<ul> + '///+<li>Anything but should not contain # or '</li> + '///</ul> + + '///</ol> + + '///<u>Returns</u>: + '///<ol> + + '///+<li>KEY=VALUE pair (string)</li> + + '///</ol> + + '///<u>Description</u>: + '///<ul> + + '///+<li>Returns string1=string2</li> + hGetDataPairAsString() = sKey & "=" & sVal + + '///</ul> + +end function + +'******************************************************************************* + +function hGetValueForPairAsString( cLine as string ) as string + + '///<h3>Retrieve value from a key=value string</h3> + '///<i>About "KEY"-functions: <br> + '///These functions are used whenever + '///+ data is to be processed that is stored in a key=value format.<br> + '///+ They handle a single string or a list of strings + '///+ to e.g. isolate a key, a value or to just retrieve the pair.</i><br><br> + + '///<u>Input</u>: + '///<ol> + + '///+<li>KEY=VALUE pair (string)</li> + + '///</ol> + + '///<u>Returns</u>: + '///<ol> + + '///+<li>VALUE (string)</li> + '///<ul> + '///+<li>Anything after the = character</li> + '///</ul> + + '///</ol> + + '///<u>Description</u>: + '///<ul> + + dim iCharPos as integer + + '///+<li>Locate the equal sign</li> + iCharPos = instr( cLine , "=" ) + iCharPos = len( cLine ) - iCharPos + + '///+<li>Isolate everything to the right of the equal sign</li> + '///+<li>Return the value as string</li> + hGetValueForPairAsString() = right( cLine , iCharPos ) + + '///</ul> + +end function + +'******************************************************************************* + +function hGetValueForPairAsLong( cLine as string ) as long + + '///<h3>Retrieve the value from a key=value pair as long</h3> + '///<i>About "KEY"-functions: <br> + '///These functions are used whenever + '///+ data is to be processed that is stored in a key=value format.<br> + '///+ They handle a single string or a list of strings + '///+ to e.g. isolate a key, a value or to just retrieve the pair.</i><br><br> + + '///<u>Input</u>: + '///<ol> + + '///+<li>KEY=VALUE pair (string)</li> + + '///</ol> + + '///<u>Returns</u>: + '///<ol> + + '///+<li>VALUE (long)</li> + '///<ul> + '///+<li>Anything after the = character as long integer value</li> + '///</ul> + + '///</ol> + + '///<u>Description</u>: + '///<ul> + + dim iCharPos as integer + + '///+<li>Locate the equal sign</li> + iCharPos = instr( cLine , "=" ) + iCharPos = len( cLine ) - iCharPos + + '///+<li>Isolate and return the Value as long datatype</li> + hGetValueForPairAsLong = val( right( cLine , iCharPos )) + + '///</ul> + +end function + +'******************************************************************************* + +function hGetValueForKeyAsInt( lsList() as string, sKey as string ) as integer + + '///<h3>Retrieve the value of a key=value pair as integer</h3> + '///<i>About "KEY"-functions: <br> + '///These functions are used whenever + '///+ data is to be processed that is stored in a key=value format.<br> + '///+ They handle a single string or a list of strings + '///+ to e.g. isolate a key, a value or to just retrieve the pair.</i><br><br> + '///<i>Prerequisite: Array compatible to listfuncs, known, valid key</i><br><br> + + '///<u>Input</u>: + '///<ol> + + '///+<li>List of KEY=VALUE pairs (string)</li> + '///<ul> + '///+<li>List must be compatible to listfunctions (see t_listfuncs.inc)</li> + '///</ul> + '///+<li>Key to be searched for within the list (string)</li> + '///<ul> + '///+<li>Key must be valid</li> + '///</ul> + + '///</ol> + + '///<u>Returns</u>: + '///<ol> + + '///+<li>VALUE (integer)</li> + '///<ul> + '///+<li>The value for a given key</li> + '///</ul> + + '///</ol> + + '///<u>Description</u>: + '///<ul> + + dim iItem as integer + dim cString as string + dim cComp as string + + hGetValueForKeyAsInt() = 0 + + ' Scan through the list and look for sKey. If found, return the Value + ' (everything to the right of the '=') + '///+<li>Search the list for the key</li> + for iItem = 1 to listcount( lsList() ) + if( instr( lsList( iItem ) , sKey ) <> 0 ) then + + '///+<li>Verify that this is really the correct key by reverse-checking</li> + cComp = hGetKeyforPairAsString( lsList( iItem ) ) + + '///+<li>Retrieve the value for the key as string</li> + if( sKey = cComp ) then + cString = hGetValueForPairAsString( lsList( iItem ) ) + iItem = listcount( lsList() ) + 1 + endif + + endif + next iItem + + '///+<li>Convert the stringvalue to integer and return it</li> + hGetValueForKeyAsInt() = val( cString ) + + '///</ul> + +end function + +'******************************************************************************* + +function hGetValueForKeyAsLong( lsList() as string, sKey as string ) as long + + '///<h3>Retrieve the value of a key=value pair as integer</h3> + '///<i>About "KEY"-functions: <br> + '///These functions are used whenever + '///+ data is to be processed that is stored in a key=value format.<br> + '///+ They handle a single string or a list of strings + '///+ to e.g. isolate a key, a value or to just retrieve the pair.</i><br><br> + '///<i>Prerequisite: Array compatible to listfuncs, known, valid key</i><br><br> + + '///<u>Input</u>: + '///<ol> + + '///+<li>List of KEY=VALUE pairs (string)</li> + '///<ul> + '///+<li>List must be compatible to listfunctions (see t_listfuncs.inc)</li> + '///</ul> + '///+<li>Key to be searched for within the list (string)</li> + '///<ul> + '///+<li>Key must be valid</li> + '///</ul> + + '///</ol> + + '///<u>Returns</u>: + '///<ol> + + '///+<li>VALUE (long integer)</li> + '///<ul> + '///+<li>The value for a given key</li> + '///</ul> + + '///</ol> + + '///<u>Description</u>: + '///<ul> + + dim iItem as integer + dim cString as string + dim cComp as string + + hGetValueForKeyAsInt() = 0 + + ' Scan through the list and look for sKey. If found, return the Value + ' (everything to the right of the '=') + '///+<li>Search the list for the key</li> + for iItem = 1 to listcount( lsList() ) + if( instr( lsList( iItem ) , sKey ) <> 0 ) then + + '///+<li>Verify that this is really the correct key by reverse-checking</li> + cComp = hGetKeyforPairAsString( lsList( iItem ) ) + + '///+<li>Retrieve the value for the key as string</li> + if( sKey = cComp ) then + cString = hGetValueForPairAsString( lsList( iItem ) ) + iItem = listcount( lsList() ) + 1 + endif + + endif + next iItem + + '///+<li>Convert the stringvalue to long integer and return it</li> + hGetValueForKeyAsInt() = val( cString ) + + '///</ul> + +end function + +'******************************************************************************* + +function hGetKeyForPairAsString( cLine as string ) as string + + '///<h3>Retrieve the KEY from a key=value pair</h3> + '///<i>About "KEY"-functions: <br> + '///These functions are used whenever + '///+ data is to be processed that is stored in a key=value format.<br> + '///+ They handle a single string or a list of strings + '///+ to e.g. isolate a key, a value or to just retrieve the pair.</i><br><br> + + '///<u>Input</u>: + '///<ol> + + '///+<li>KEY=VALUE pair (string)</li> + + '///</ol> + + '///<u>Returns</u>: + '///<ol> + + '///+<li>KEY (string)</li> + '///<ul> + '///+<li>Anything before the = character</li> + '///</ul> + + '///</ol> + + '///<u>Description</u>: + '///<ul> + + dim iCharPos as integer + + iCharPos = instr( cLine , "=" ) + + '///+<li>get the string to the left of the = char</li> + if ( iCharPos > 0 ) then + hGetKeyForPairAsString() = left( cLine , iCharPos -1 ) + else + warnlog( "Invalid string passed to hGetKeyForPairAsString" ) + printlog( "It was: " & cLine ) + endif + '///+<li>Return the key</li> + '///</ul> + +end function + +'******************************************************************************* + +function hGetKeyForValueAsString( lsList() as string, sVal as string ) as string + + '///<h3>Retrieve the KEY for a known VALUE from a key=value pair</h3> + '///<i>About "KEY"-functions: <br> + '///These functions are used whenever + '///+ data is to be processed that is stored in a key=value format.<br> + '///+ They handle a single string or a list of strings + '///+ to e.g. isolate a key, a value or to just retrieve the pair.</i><br><br> + '///<i>Prerequisite: List compatible to listfuncs, known VALUE for pair</i><br><br> + + '///<u>Input</u>: + '///<ol> + + '///+<li>List of KEY=VALUE pairs (string)</li> + '///<ul> + '///+<li></li> + '///</ul> + + '///+<li>VALUE (string)</li> + '///<ul> + '///+<li>Absolute match required.</li> + '///</ul> + + '///</ol> + + '///<u>Returns</u>: + '///<ol> + + '///+<li>KEY (string)</li> + + '///</ol> + + '///<u>Description</u>: + '///<ul> + + ' This function returns the value of a key as string. + ' The form of the input strings is 'key=value', the list is parsed + ' The key for the first occurrence of sVal is returned + + dim iCurrentValue as integer + dim iListItems as integer + iListItems = listcount( lsList() ) + dim cLine as string + + ' preset a default return string + hGetKeyForValueAsString() = "Error: No matching KEY found for VALUE" + + '///+<li>scan through a list to find an entry that matches sKey. Return the Key.</li> + for iCurrentValue = 1 to iListItems + + cLine = lsList( iCurrentValue ) + + if( instr( cLine , sVal ) <> 0 ) then + hGetKeyForValueAsString() = hGetKeyForPairAsString( cLine ) + iCurrentValue = iListItems + 1 + end if + + next iCurrentValue + '///+<li>Return the key from the first matching value</li> + '///</ul> + +end function + +'******************************************************************************* + +function hGetKeyForValueAsInt( lsList() as string, sVal as string ) as integer + + '///<h3>Retrieve the KEY for a known VALUE from a key=value pair</h3> + '///<i>About "KEY"-functions: <br> + '///These functions are used whenever + '///+ data is to be processed that is stored in a key=value format.<br> + '///+ They handle a single string or a list of strings + '///+ to e.g. isolate a key, a value or to just retrieve the pair.</i><br><br> + '///<i>Prerequisite: List compatible to listfuncs, known VALUE for pair</i><br><br> + + '///<u>Input</u>: + '///<ol> + + '///+<li>List of KEY=VALUE pairs (string)</li> + + '///+<li>VALUE (string)</li> + '///<ul> + '///+<li>Absolute match required.</li> + '///</ul> + + '///</ol> + + '///<u>Returns</u>: + '///<ol> + + '///+<li>KEY (integer)</li> + + '///</ol> + + '///<u>Description</u>: + '///<ul> + + '///+<li>Use hgetKeyForValueAsString, convert result to integer, return it.</li> + hGetKeyForValueAsInt() = val( hGetKeyForValueAsString( lsList() , sVal ) ) + '///</ul> + +end function + +'******************************************************************************* + +function hGetIndexForKeyAsInt( lsList() as string, sKey as string ) as integer + + '///<h3>Search a list of key=value pairs for a key and return its index</h3> + '///<i>About "KEY"-functions: <br> + '///These functions are used whenever + '///+ data is to be processed that is stored in a key=value format.<br> + '///+ They handle a single string or a list of strings + '///+ to e.g. isolate a key, a value or to just retrieve the pair.</i><br><br> + '///<i>Prerequisite: List compatible to listfuncs, known VALUE for pair</i><br><br> + + '///<u>Input</u>: + '///<ol> + + '///+<li>List of KEY=VALUE pairs (string)</li> + + '///+<li>KEY to search for (string)</li> + + '///</ol> + + '///<u>Returns</u>: + '///<ol> + + '///+<li>Index of the KEY in the list (integer)</li> + '///<ul> + '///+<li>0 if not found</li> + '///+<li>Any number > 0 and ≤ listcount( List() )</li> + '///</ul> + + '///</ol> + + '///<u>Description</u>: + '///<ul> + + dim iItem as integer + dim cComp as string + + hGetIndexForNamedKeyAsInt() = 0 + + ' Scan through the list and look for sKey. If found, return the Value + ' (everything to the right of the '=') + '///+<li>Scan through the list for the KEY</li> + for iItem = 1 to listcount( lsList() ) + if( instr( lsList( iItem ) , sKey ) <> 0 ) then + + '///+<li>if found, perform reverse checking</li> + cComp = hGetKeyforValueAsString( lsList( iItem ) ) + + '///+<li>get the index of the item</li> + if( sKey = cComp ) then + hGetIndexForKeyAsInt() = iItem + iItem = listcount( lsList() ) + 1 + endif + + endif + next iItem + '///+<li>Return the index</li> + '///</ul> + +end function + +'******************************************************************************* + +function keycompare( found as string, expected as string, sKey as string, optional cBugID as string) as boolean + + '///<h3>Function to compare two keys with each other</h3> + '///<u>Deprecated, do not use</u> + + if ( isMissing( cBugID ) ) then + cBugID = "" + endif + + if ( lcase(found) = lcase(expected) ) then + printlog( " * '" & sKey & "': ok" ) + keycompare = true + else + warnlog( "#" + cBugID + "# Control has incorrect value: '" & sKey & "'") + printlog( " > Found...: '" & found & "'" ) + printlog( " > Expected: '" & expected & "'" ) + keycompare = false + endif + +end function + + + diff --git a/testautomation/global/tools/includes/optional/t_listfuncs.inc b/testautomation/global/tools/includes/optional/t_listfuncs.inc new file mode 100755 index 000000000000..c90d077db651 --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_listfuncs.inc @@ -0,0 +1,464 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/****************************************************************************** +'* +'* owner : joerg.skottke@oracle.com +'* +'* short description : Replacements for routines in t_lists.inc adds some +'* +'\****************************************************************************** + +function hListDelete( aList() as string, iItemToDelete as integer ) as boolean + + '///<h3>Delete one item from a list specified by index</h3> + '///<i>Prerequisite: Array compatible with those from t_lists.inc</i><br> + '///<i>About listfunctions: All listfunctions rely on a special type of + '///+ array. This can be string arrays and - in some cases - numeric + '///+ arrays. What makes the arrays unique is that the first item which + '///+ has the index 0 contains the number of items in the list to be used, + '///+ anything that is stored beyond this number is ignored. This has three + '///+ consequences: 1) all listfunctions that alter an array must update + '///+ the index stored in array(0) and 2) it is possible that the index + '///+ point beyond ubound of the array which will most likely cause a + '///+ runtime error. 3) Means that arrays may only have an upper boundary + '///+ declared, all loops must start with index array(1) and must end with + '///+ index array(val( array(0))</i><br> + + const CFN = "hListDelete::" + const INDEX_CORRECTION = 1 + dim iCurrentItem as integer ' Increment-Variable + + if ( GVERBOSE ) then + printlog( CFN & "Removing: " & aList( iItemToDelete ) & " at pos " & iItemToDelete ) + endif + + ' Move all items down by one in the list beginning with the item after + ' iItemToDelete + for iCurrentItem = ( iItemToDelete + INDEX_CORRECTION ) to ListCount( aList() ) + aList( iCurrentItem - INDEX_CORRECTION ) = aList( iCurrentItem ) + next iCurrentItem + + ' Delete the last entry, it is no longer used and it is duplicate to the item + ' at iListSizeOld-1 (iListSizeNew) + aList( iCurrentItem ) = "" + aList( 0 ) = iCurrentItem - INDEX_CORRECTION + +end function + +'******************************************************************************* + +function hListAppend( sNewString as string, aTargetList() as string ) as integer + + '///<h3>Append an item to an existing list</h3> + '///<i>Prerequisite: Array compatible with those from t_lists.inc</i> + '///<i>About listfunctions: All listfunctions rely on a special type of + '///+ array. This can be string arrays and - in some cases - numeric + '///+ arrays. What makes the arrays unique is that the first item which + '///+ has the index 0 contains the number of items in the list to be used, + '///+ anything that is stored beyond this number is ignored. This has three + '///+ consequences: 1) all listfunctions that alter an array must update + '///+ the index stored in array(0) and 2) it is possible that the index + '///+ point beyond ubound of the array which will most likely cause a + '///+ runtime error. 3) Means that arrays may only have an upper boundary + '///+ declared, all loops must start with index array(1) and must end with + '///+ index array(val( array(0))</i><br> + + const CFN = "hListAppend::" + const RC_ARRAY_TOO_SMALL = -1 + + dim iCurrentListSize as integer + dim iNewListSize as integer + dim iArraySize as integer + dim irc as integer + + iCurrentListSize = val( aTargetList( 0 ) ) + iNewListSize = iCurrentListSize + 1 + iArraySize = ubound( aTargetList() ) + + if ( iNewListSize > iArraySize ) then + warnlog ( CFN & "Cannot append, array too small" ) + printlog( CFN & "Array-Size.....: " & iArraySize ) + printlog( CFN & "Requested index: " & iNewListSize ) + hListAppend() = RC_ARRAY_TOO_SMALL + else + aTargetList( iNewListSize ) = sNewString + aTargetList( 0 ) = iNewListSize + hListAppend() = iNewListSize + endif + +end function + +'******************************************************************************* + +function hManageComparisionList( sFileIn as string, sFileOut as string, sListOut() as string ) as integer + + '///<h3>Function to create or compare a list to a reference</h3> + '///<i>Prerequisite: List of items to compare, input- and outputfilename</i><br> + '///<i>About listfunctions: All listfunctions rely on a special type of + '///+ array. This can be string arrays and - in some cases - numeric + '///+ arrays. What makes the arrays unique is that the first item which + '///+ has the index 0 contains the number of items in the list to be used, + '///+ anything that is stored beyond this number is ignored. This has three + '///+ consequences: 1) all listfunctions that alter an array must update + '///+ the index stored in array(0) and 2) it is possible that the index + '///+ point beyond ubound of the array which will most likely cause a + '///+ runtime error. 3) Means that arrays may only have an upper boundary + '///+ declared, all loops must start with index array(1) and must end with + '///+ index array(val( array(0))</i><br> + '///<u>BEWARE: This is a core function and used by many tests!<br> + '///Please read the inline documentation for further reference</u><br> + '///Function parameters: + '///<ol> + '///+<li>sFileIn = The file that contains the reference data</li> + '///+<li>sFileOut = The file new lists are written to in case of an error</li> + '///+<li>sListOut() = The list containing the newly retrieved data.</li> + '///</ol> + '///Description: + '///<ul> + + const CFN = "hManageComparisionList::" + + ' maximum lines per file. Currently this limit is determined by the help + ' tests which have up to 22000 entries + reseve. + const FILESIZE = 25000 + const COMPARE_SUCCESS = 0 + const ENCODING_UTF8 = "UTF8" + + dim irc as integer + dim aReferenceList( FILESIZE ) as string + + if ( GVERBOSE ) then printlog( CFN & "Reading: " & sFileIn ) + + ' Do not use hGetDataFileSection() as strings in some lists may begin with a + ' "#" which is interpreted as a comment by hGetDataFileSection() + listread( aReferenceList(), sFileIn, ENCODING_UTF8 ) + + ' Word of caution: If the number of new items equals the number of removed items + ' this function returns 0 -> success. This case is highly unlikely to ever happen + ' unless someone renames scripts. + irc = hListCompare( sListOut() , aReferenceList() ) + + '///+<li>In case the lists are not identical, write the new one to the local work directory</li> + if ( irc = COMPARE_SUCCESS ) then + printlog( CFN & "Comparision succeeded" ) + hManageComparisionList() = COMPARE_SUCCESS + else + printlog( CFN & "The two compared lists differ. There are a number of possible reasons:" ) + printlog( CFN & "- Installation requirements are not met (setup /a?, missing packages?)" ) + printlog( CFN & "- Reference and actual UI-Content do not match: File an issue." ) + printlog( CFN & "- The reference file does not exist: Follow steps below." ) + printlog( CFN & "Verify and copy the file: " & sFileOut ) + printlog( CFN & "to this location........: " & sFileIn ) + printlog( CFN & "Check this file into the SCM or attach it to an issue" ) + listwrite( sListOut(), sFileOut, ENCODING_UTF8 ) + hManageComparisionList() = irc + endif + + '///+<li>Return number of differences between the lists</li> + '///</ul> + +end function + +'******************************************************************************* + +function hListCompare( aListOne() as String, aListTwo() as String ) as integer + + const CFN = "hListcompare::" + + '///<h3>Compare two lists with each other, where <b>list TWO</b> is the reference</h3> + '///<i>Prerequisites: Two lists compatible with listfunctions</i><br> + '///<i>About listfunctions: All listfunctions rely on a special type of + '///+ array. This can be string arrays and - in some cases - numeric + '///+ arrays. What makes the arrays unique is that the first item which + '///+ has the index 0 contains the number of items in the list to be used, + '///+ anything that is stored beyond this number is ignored. This has three + '///+ consequences: 1) all listfunctions that alter an array must update + '///+ the index stored in array(0) and 2) it is possible that the index + '///+ point beyond ubound of the array which will most likely cause a + '///+ runtime error. 3) Means that arrays may only have an upper boundary + '///+ declared, all loops must start with index array(1) and must end with + '///+ index array(val( array(0))</i><br> + '///<u>Duplicates gCompare2Lists but does not print warnlogs, evaluate returncode instead</u> + '///<ul> + + dim aOneOnlyList( ubound( aListOne() ) ) as string + dim aTwoOnlyList( ubound( aListTwo() ) ) as string + + dim iListOneIndex as integer + dim iListTwoIndex as integer + + dim iTwoOnlyListSize as integer + dim iListOneSize as integer + + dim bFound as boolean + + '///+<li>Create a copy of list two so we do not change the original list</li> + ListCopy( aListTwo() , aTwoOnlyList() ) + + iTwoOnlyListSize = ListCount( aTwoOnlyList() ) + iListOneSize = ListCount( aListOne() ) + + + '///+<li>Step through each item in list one</li> + for iListOneIndex = 1 to iListOneSize + + bFound = false + + '///+<li>Compare it to each item in list two</li> + for iListTwoIndex = 1 to iTwoOnlyListSize + + '///+<li>If the entries match, delete it from the TwoOnly list</li> + if ( aListOne( iListOneIndex ) = aTwoOnlyList( iListTwoIndex ) ) then + + bFound = true + aTwoOnlyList( iListTwoIndex ) = aTwoOnlyList( iTwoOnlyListSize ) + ' this breaks compatibility to listfunctions because the actual + ' number of items is out of sync with listcount + iTwoOnlyListSize = iTwoOnlyListSize -1 + exit for + + end if + + next iListTwoIndex + + '///+<li>If there is no match, the item exists in list one only -> copy</li> + if ( not bFound ) then hListAppend( aListOne( iListOneIndex ), aOneOnlyList() ) + + next iListOneIndex + + ' restore compatibility to listfunctions so hListPrint() will not fail + aTwoOnlyList( 0 ) = iTwoOnlyListSize + + '///+<li>List all items that exist in List One only</li> + if ( ListCount( aOneOnlyList() ) > 0 ) then + printlog( CFN & "Objects have been added to the list" ) + hListPrint( aOneOnlyList() , "Items found in list ONE only (NEW)" ) + hListCompare() = ListCount( aOneOnlyList() ) + end if + + '///+<li>List all items that exist in List Two only</li> + if ( ListCount( aTwoOnlyList() ) > 0 ) then + printlog( CFN & "Objects have been removed from the list" ) + hListPrint( aTwoOnlyList() , "Items found in list TWO only (MISSING)" ) + hListCompare() = ListCount( aTwoOnlyList() ) * -1 + end if + + '///</ul> + +end function + +'******************************************************************************* + +function hListPrependString( aList() as string, cString as string ) as boolean + + '///<h3>Insert a string infront of each item in a list</h3> + '///<i>Prerequisites: A list compatible with listfunctions</i><br> + '///<i>About listfunctions: All listfunctions rely on a special type of + '///+ array. This can be string arrays and - in some cases - numeric + '///+ arrays. What makes the arrays unique is that the first item which + '///+ has the index 0 contains the number of items in the list to be used, + '///+ anything that is stored beyond this number is ignored. This has three + '///+ consequences: 1) all listfunctions that alter an array must update + '///+ the index stored in array(0) and 2) it is possible that the index + '///+ point beyond ubound of the array which will most likely cause a + '///+ runtime error. 3) Means that arrays may only have an upper boundary + '///+ declared, all loops must start with index array(1) and must end with + '///+ index array(val( array(0))</i><br><br> + '///<i>Note that the function alters the input list. If the list contains + '///+ strings of the type "MyString" the items will be changed to + '///+ read "Some Text : MyString"</i><br> + '///<u>Input</u>: + '///<ol> + '///+<li>List (string)</li> + '///+<li>A text to be inserted infront of every item in the list</li> + '///</ol> + '///<u>Returns</u>: + '///<ol> + '///+<li>Errorcondition (boolean)</li> + '///<ul> + '///+<li>The returnvalue is currently undefined</li> + '///</ul> + '///</ol> + '///<u>Description</u>: + '///<ul> + + const CFN = "hListPrependString::" + dim iCurrentItem as integer + + '///+<li>Cycle through the list and insert a text infront of each item</li> + for iCurrentItem = 1 to listcount( aList() ) + aList( iCurrentItem ) = cString & " : " & aList( iCurrentItem ) + next iCurrentItem + + hListPrependString() = true + '///</ul> + +end function + +'******************************************************************************* + +function hListAppendList( aBaseList() as string, aListToAppend() as string ) as integer + + '///<h3>Append one list to another</h3> + '///<i>Prerequisites: A list compatible with listfunctions</i><br> + '///<i>About listfunctions: All listfunctions rely on a special type of + '///+ array. This can be string arrays and - in some cases - numeric + '///+ arrays. What makes the arrays unique is that the first item which + '///+ has the index 0 contains the number of items in the list to be used, + '///+ anything that is stored beyond this number is ignored. This has three + '///+ consequences: 1) all listfunctions that alter an array must update + '///+ the index stored in array(0) and 2) it is possible that the index + '///+ point beyond ubound of the array which will most likely cause a + '///+ runtime error. 3) Means that arrays may only have an upper boundary + '///+ declared, all loops must start with index array(1) and must end with + '///+ index array(val( array(0))</i><br><br> + '///<u>Input</u>: + '///<ol> + '///+<li>Target list (string)</li> + '///+<li>Source list (string)</li> + '///</ol> + '///<u>Returns</u>: + '///<ol> + '///+<li>Listsize (integer)</li> + '///<ul> + '///+<li>The size of the sum of both lists</li> + '///+<li>0 in case of error</li> + '///</ul> + '///</ol> + '///<u>Description</u>: + '///<ul> + + const CFN = "hListAppendList::" + + dim iCurrentItem as integer + dim iNewSize as integer + + '///+<li>Do some basic boundary checking</li> + if ( ubound( aBaseList() ) < _ + ( listcount( aBaseList ) + listcount( aListToAppend() ) ) ) then + warnlog( CFN & "Base Array too small" ) + iNewSize = 0 + else + + '///+<li>Append the list</li> + for iCurrentItem = 1 to listcount( aListToAppend() ) + + hListAppend( aBaseList() , aListToAppend( iCurrentItem ) ) + + next iCurrentItem + + iNewSize = listcount( aBaseList() ) + + endif + '///</ul> + +end function + + +'******************************************************************************* + +function hCountMatchesInList( acItemList() as string, cSearchTerm as string ) as integer + + + '///<h3>Find out how many times a string is found in a list</h3> + + '///<u>Parameter(s):</u><br> + '///<ol> + + '///+<li>List to be searched (String)</li> + '///<ul> + '///+<li>The list may not be empty</li> + '///+<li>Search begins at index 1</li> + '///</ul> + + '///+<li>Expression to search for (String)</li> + '///<ul> + '///+<li>Only exact matches are counted</li> + '///</ul> + + '///</ol> + + + '///<u>Returns:</u><br> + '///<ol> + '///+<li>Number of hits (Integer)</li> + '///<ul> + '///+<li>0: if no matches were found</li> + '///+<li>-1: Any error</li> + '///</ul> + '///</ol> + + const CFN = "hCountMatchesInList::" + dim iHitCount as integer + dim iCurrentItem as integer + + if ( GVERBOSE ) then printlog( CFN & "Begin with term: " & cSearchTerm ) + + for iCurrentItem = 1 to ListCount( acItemList() ) + if ( GVERBOSE ) then printlog( acItemList( iCurrentItem ) ) + + if ( instr( acItemList( iCurrentItem ), cSearchTerm ) > 0 ) then + iHitCount = iHitCount + 1 + endif + next iCurrentItem + + if ( GVERBOSE ) then printlog( CFN & "Exit with result: " & iHitCount ) + hCountMatchesInList() = iHitCount + +end function + +'******************************************************************************* + +function hListResultEvaluation( i_diffcount as integer, i_allowed_delta as integer ) as boolean + + ' This function evaluates the outcome of hManageComaprisionList() or + ' hListCompare(). This extra step is done because in some cases the + ' program installations might differ slightly - in some CWS (when using the + ' archive) we can end up having a different set of import/export filters. + ' So the evaluation must allow for a specific number of mismatches which is + ' specified in i_allowed_delta. + + hListResultEvaluation() = true + + ' If lists are identical we return directly. + if ( i_diffcount = 0 ) then + printlog( "The lists are identical. Good" ) + exit function + endif + + ' if we have differences we need to have a closer look. + ' Note that the difference is optional. + if ( i_allowed_delta <> 0 ) then + if ( i_diffcount = i_allowed_delta ) then + printlog( "The lists have the allowed delta of " & i_allowed_delta ) + exit function + endif + endif + + warnlog( "The list check failed, please review the test." ) + hListResultEvaluation() = false + +end function diff --git a/testautomation/global/tools/includes/optional/t_locale_strings1.inc b/testautomation/global/tools/includes/optional/t_locale_strings1.inc new file mode 100755 index 000000000000..29c4bcf3cb6b --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_locale_strings1.inc @@ -0,0 +1,569 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/*********************************************************************** +'* +'* owner : oliver.craemer@oracle.com +'* +'* short description : defining locale dependant strings +'* +'\*********************************************************************** + +function fLocaleString (sReturn as string) as string + +'///The function fLocaleString should be used to concentrate all locale dependant strings +'///+ in one file in order to minimize the workload for adapting a new language +'///Here is a way how to get these strings out of OOo. +'/// - "LocaleTableHeading" : run testscript qa\qatesttool\writer\tools\w_get_locale_strings.bas +'/// - "LocaleTableContents" : run testscript qa\qatesttool\writer\tools\w_get_locale_strings.bas +'/// - "LocaleNumber" : run testscript qa\qatesttool\writer\tools\w_get_locale_strings.bas +'/// - "LocaleText" : run testscript qa\qatesttool\writer\tools\w_get_locale_strings.bas +'/// - "LocaleCurrency" : run testscript qa\qatesttool\writer\tools\w_get_locale_strings.bas +'/// - "LocaleDate" : run testscript qa\qatesttool\writer\tools\w_get_locale_strings.bas +'/// - "LocaleTime" : run testscript qa\qatesttool\writer\tools\w_get_locale_strings.bas +'/// - "LocalePercent" : run testscript qa\qatesttool\writer\tools\w_get_locale_strings.bas +'/// - "LocaleScientific" : run testscript qa\qatesttool\writer\tools\w_get_locale_strings.bas +'/// - "LocaleFraction" : run testscript qa\qatesttool\writer\tools\w_get_locale_strings.bas +'/// - "LocaleBoolean" : run testscript qa\qatesttool\writer\tools\w_get_locale_strings.bas +'/// - "LocaleTable" : run testscript qa\qatesttool\writer\tools\w_get_locale_strings.bas +'/// - "LocaleCurrencyValue" : enter 10 in a cell and format to currency +'/// - "LocaleDateValue" : a valid ( for this locale) date format +'/// - "LocaleDateOutput" : enter a valid date in a cell +'/// - "LocaleTimeInput" : a valid timecode (e.g. 15:42) +'/// - "LocaleTimeValue" : enter 15:42 in a cell +'/// - "LocalePercentValue" : enter 14% in a cell +'/// - "LocaleScientificValue" : enter 1e+008 in a cell +'/// - "LocaleBooleanValue" : enter 1 in a cell and format to boolean value +'/// - "LocaleLocaleSettings" : TOOLS-OPTIONS-LANGUAGE SETTINGS-Language +'/// - "LocaleScriptType" : possible script types are "Western", "CJK" and "CTL" + + Dim sLocaleTableHeading as string + Dim sLocaleTableContents as string + Dim sLocaleNumber as string + Dim sLocaleText as string + Dim sLocaleCurrency as string + Dim sLocaleDate as string + Dim sLocaleTime as string + Dim sLocalePercent as string + Dim sLocaleScientific as string + Dim sLocaleFraction as string + Dim sLocaleBoolean as string + Dim sLocaleTable as string + Dim sLocaleCurrencyValue as string + Dim sLocaleDateValue as string + Dim sLocaleDateOutput as string + Dim sLocaleTimeInput as string + Dim sLocaleTimeValue as string + Dim slocalePercentValue as string + Dim sLocaleScientificValue as string + Dim sLocaleBooleanValue as string + Dim sLocaleLocaleSettings as string + Dim sLocaleScriptType as string + Dim sLocaleNumFormLanEng as string + Dim sLocaleNumFormLanLith as string + Dim sLocaleNumFormLanDutch as string + + select case iSprache + case 01 : sLocaleTableHeading = "Table Heading" ' English (USA) + sLocaleTableContents = "Table Contents" + sLocaleNumber = "Number" + sLocaleText = "Text" + sLocaleCurrency = "Currency" + sLocaleDate = "Date" + sLocaleTime = "Time" + sLocalePercent = "Percent" + sLocaleScientific = "Scientific" + sLocaleFraction = "Fraction" + sLocaleBoolean = "Boolean Value" + sLocaleTable = "Table" + sLocaleCurrencyValue = "$10.00" + sLocaleDateValue = "03/31/06" + sLocaleDateOutput = "03/31/06" + sLocaleTimeInput = "15:42" + sLocaleTimeValue = "03:42:00 PM" + slocalePercentValue = "14.00%" + sLocaleScientificValue = "1.00E+008" + sLocaleBooleanValue = "TRUE" + sLocaleLocaleSettings = "English (USA)" + sLocaleScriptType = "Western" + sLocaleNumFormLanEng = "English (USA)" + sLocaleNumFormLanLith = "Lithuanian" + sLocaleNumFormLanDutch = "Dutch (Netherlands)" + + case 03 : sLocaleTableHeading = "Cabeçalho da tabela" ' Portuguese + sLocaleTableContents = "Conteúdo da tabela" + sLocaleNumber = "Número" + sLocaleText = "Texto" + sLocaleCurrency = "Moeda" + sLocaleDate = "Data" + sLocaleTime = "Hora" + sLocalePercent = "Percentagem" + sLocaleScientific = "Científico" + sLocaleFraction = "Fracção" + sLocaleBoolean = "Valor logico" + sLocaleTable = "Tabela" + sLocaleCurrencyValue = "10,00 €" + sLocaleDateValue = "31-03-06" + sLocaleDateOutput = "31-03-06" + sLocaleTimeInput = "15:42" + sLocaleTimeValue = "15:42:00" + slocalePercentValue = "14,00%" + sLocaleScientificValue = "1,00E+008" + sLocaleBooleanValue = "VERDADEIRO" + sLocaleLocaleSettings = "Português (Portugal)" + sLocaleScriptType = "Western" + sLocaleNumFormLanEng = "Inglês (EUA)" + sLocaleNumFormLanLith = "Lituano" + sLocaleNumFormLanDutch = "Flamengo (Holanda)" + + case 07 : sLocaleTableHeading = "Заголовок таблицы" ' Russian + sLocaleTableContents = "Содержимое таблицы" + sLocaleNumber = "Число" + sLocaleText = "Текст" + sLocaleCurrency = "Деньги" + sLocaleDate = "Дата" + sLocaleTime = "TВремя" + sLocalePercent = "Процент" + sLocaleScientific = "Наука" + sLocaleFraction = "Дробь" + sLocaleBoolean = "Логические значения" + sLocaleTable = "Таблица" + sLocaleCurrencyValue = "10,00руб." + sLocaleDateValue = "31.03.06" + sLocaleDateOutput = "31.03.06" + sLocaleTimeInput = "15:42" + sLocaleTimeValue = "15:42:00" + slocalePercentValue = "14,00%" + sLocaleScientificValue = "1,00E+008" + sLocaleBooleanValue = "ИСТИНА" + sLocaleLocaleSettings = "Русский" + sLocaleScriptType = "Western" + sLocaleNumFormLanEng = "Английский (США)" + sLocaleNumFormLanLith = "Литовский" + sLocaleNumFormLanDutch = "Голландский (Нидерланды)" + + case 31 : sLocaleTableHeading = "Tabelkop" ' Dutch + sLocaleTableContents = "Inhoud tabel" + sLocaleNumber = "Getal" + sLocaleText = "Tekst" + sLocaleCurrency = "Valuta" + sLocaleDate = "Datum" + sLocaleTime = "Tijd" + sLocalePercent = "Procent" + sLocaleScientific = "Wetenschappelijk" + sLocaleFraction = "Breuk" + sLocaleBoolean = "Logische waarde" + sLocaleTable = "Tabel" + sLocaleCurrencyValue = "€ 10,00" + sLocaleDateValue = "31-03-06" + sLocaleDateOutput = "31-03-06" + sLocaleTimeInput = "15:42" + sLocaleTimeValue = "15:42:00" + slocalePercentValue = "14,00%" + sLocaleScientificValue = "1,00E+008" + sLocaleBooleanValue = "WAAR" + sLocaleLocaleSettings = "Nederlands (NL)" + sLocaleScriptType = "Western" + sLocaleNumFormLanEng = "Engels (VS)" + sLocaleNumFormLanLith = "Litouws" + sLocaleNumFormLanDutch = "Nederlands (NL)" + + case 33 : sLocaleTableHeading = "Titre de tableau" ' French + sLocaleTableContents = "Contenu de tableau" + sLocaleNumber = "Nombre" + sLocaleText = "Texte" + sLocaleCurrency = "Monétaire" + sLocaleDate = "Date" + sLocaleTime = "Heure" + sLocalePercent = "Pourcentage" + sLocaleScientific = "Scientifique" + sLocaleFraction = "Fraction" + sLocaleBoolean = "Valeur logique" + sLocaleTable = "Tableau" + sLocaleCurrencyValue = "10,00 €" + sLocaleDateValue = "31/03/06" + sLocaleDateOutput = "31/03/06" + sLocaleTimeInput = "15:42" + sLocaleTimeValue = "15:42:00" + slocalePercentValue = "14,00%" + sLocaleScientificValue = "1,00E+008" + sLocaleBooleanValue = "VRAI" + sLocaleLocaleSettings = "Français (France)" + sLocaleScriptType = "Western" + sLocaleNumFormLanEng = "Anglais (U.S.A.)" + sLocaleNumFormLanLith = "Lituanien" + sLocaleNumFormLanDutch = "Néerlandais (Pays-Bas)" + + case 34 : sLocaleTableHeading = "Encabezado de la tabla" ' Spanish + sLocaleTableContents = "Contenido de la tabla" + sLocaleNumber = "Número" + sLocaleText = "Texto" + sLocaleCurrency = "Moneda" + sLocaleDate = "Fecha" + sLocaleTime = "Hora" + sLocalePercent = "Porcentaje" + sLocaleScientific = "Ciencia" + sLocaleFraction = "Fracción" + sLocaleBoolean = "Valor lógico" + sLocaleTable = "Tabla" + sLocaleCurrencyValue = "10,00 €" + sLocaleDateValue = "31/03/06" + sLocaleDateOutput = "31/03/06" + sLocaleTimeInput = "15:42" + sLocaleTimeValue = "15:42:00" + slocalePercentValue = "14,00%" + sLocaleScientificValue = "1,00E+008" + sLocaleBooleanValue = "VERDADERO" + sLocaleLocaleSettings = "Español (España)" + sLocaleScriptType = "Western" + sLocaleNumFormLanEng = "Inglés (Estados Unidos)" + sLocaleNumFormLanLith = "Lituano" + sLocaleNumFormLanDutch = "Holandés (Países Bajos)" + + case 36 : sLocaleTableHeading = "Táblázatfejléc" ' Hungarian + sLocaleTableContents = "Táblázattartalom" + sLocaleNumber = "Szám" + sLocaleText = "Szöveg" + sLocaleCurrency = "Pénznem" + sLocaleDate = "Dátum" + sLocaleTime = "Idő" + sLocalePercent = "Százalék" + sLocaleScientific = "Tudományos" + sLocaleFraction = "Tört" + sLocaleBoolean = "Logikai érték" + sLocaleTable = "Táblázat" + sLocaleCurrencyValue = "10,00 Ft" + sLocaleDateValue = "06-03-31" + sLocaleDateOutput = "2006-03-31" + sLocaleTimeInput = "15:42" + sLocaleTimeValue = "15:42:00" + slocalePercentValue = "14,00%" + sLocaleScientificValue = "1,00E+008" + sLocaleBooleanValue = "IGAZ" + sLocaleLocaleSettings = "Magyar" + sLocaleScriptType = "Western" + sLocaleNumFormLanEng = "Angol (USA)" + sLocaleNumFormLanLith = "Litván" + sLocaleNumFormLanDutch = "Holland (Hollandia)" + + case 39 : sLocaleTableHeading = "Intestazione tabella" ' Italian + sLocaleTableContents = "Contenuto tabella" + sLocaleNumber = "Numero" + sLocaleText = "Testo" + sLocaleCurrency = "Valuta" + sLocaleDate = "Data" + sLocaleTime = "Orario" + sLocalePercent = "Percentuale" + sLocaleScientific = "Scientifico" + sLocaleFraction = "Frazione" + sLocaleBoolean = "Valore booleano" + sLocaleTable = "Tabella" + sLocaleCurrencyValue = "€ 10,00" + sLocaleDateValue = "31/03/06" + sLocaleDateOutput = "31/03/06" + sLocaleTimeInput = "15.42" + sLocaleTimeValue = "15.42.00" + slocalePercentValue = "14,00%" + sLocaleScientificValue = "1,00E+008" + sLocaleBooleanValue = "VERO" + sLocaleLocaleSettings = "Italiano (Italia)" + sLocaleScriptType = "Western" + sLocaleNumFormLanEng = "Inglese (USA)" + sLocaleNumFormLanLith = "Lituano" + sLocaleNumFormLanDutch = "Olandese (Paesi Bassi)" + + case 46 : sLocaleTableHeading = "Tabellöverskrift" ' Swedish + sLocaleTableContents = "Tabellinnehåll" + sLocaleNumber = "Tal" + sLocaleText = "Text" + sLocaleCurrency = "Valuta" + sLocaleDate = "Datum" + sLocaleTime = "Tid" + sLocalePercent = "Procent" + sLocaleScientific = "Vetenskap" + sLocaleFraction = "Bråk" + sLocaleBoolean = "Sannolikhet" + sLocaleTable = "Tabell" + sLocaleCurrencyValue = "10,00 kr" + sLocaleDateValue = "06-03-31" + sLocaleDateOutput = "06-03-31" + sLocaleTimeInput = "15:42" + sLocaleTimeValue = "15:42:00" + slocalePercentValue = "14,00%" + sLocaleScientificValue = "1,00E+008" + sLocaleBooleanValue = "SANT" + sLocaleLocaleSettings = "Svenska (Sverige)" + sLocaleScriptType = "Western" + sLocaleNumFormLanEng = "Engelska (USA)" + sLocaleNumFormLanLith = "Litauiska" + sLocaleNumFormLanDutch = "Holländska (Nederländerna)" + + case 48 : sLocaleTableHeading = "Nagłówek tabeli" ' Polish + sLocaleTableContents = "Zawartość tabeli" + sLocaleNumber = "Liczba" + sLocaleText = "Tekst" + sLocaleCurrency = "Waluta" + sLocaleDate = "Data" + sLocaleTime = "Godzina" + sLocalePercent = "Procent" + sLocaleScientific = "Naukowy" + sLocaleFraction = "Ułamek" + sLocaleBoolean = "Wartość logiczna" + sLocaleTable = "Tabela" + sLocaleCurrencyValue = "10,00 zł" + sLocaleDateValue = "2006-03-31" + sLocaleDateOutput = "2006-03-31" + sLocaleTimeInput = "15:42" + sLocaleTimeValue = "15:42:00" + slocalePercentValue = "14,00%" + sLocaleScientificValue = "1,00E+008" + sLocaleBooleanValue = "PRAWDA" + sLocaleLocaleSettings = "Polski" + sLocaleScriptType = "Western" + sLocaleNumFormLanEng = "Angielski (USA)" + sLocaleNumFormLanLith = "Litewski" + sLocaleNumFormLanDutch = "Holenderski (Holandia)" + + case 49 : sLocaleTableHeading = "Tabellen Überschrift" ' German + sLocaleTableContents = "Tabellen Inhalt" + sLocaleNumber = "Zahl" + sLocaleText = "Text" + sLocaleCurrency = "Währung" + sLocaleDate = "Datum" + sLocaleTime = "Zeit" + sLocalePercent = "Prozent" + sLocaleScientific = "Wissenschaft" + sLocaleFraction = "Bruch" + sLocaleBoolean = "Wahrheitswert" + sLocaleTable = "Tabelle" + sLocaleCurrencyValue = "10,00 €" + sLocaleDateValue = "31.03.06" + sLocaleDateOutput = "31.03.06" + sLocaleTimeInput = "15:42" + sLocaleTimeValue = "15:42:00" + slocalePercentValue = "14,00%" + sLocaleScientificValue = "1,00E+008" + sLocaleBooleanValue = "WAHR" + sLocaleLocaleSettings = "Deutsch (Deutschland)" + sLocaleScriptType = "Western" + sLocaleNumFormLanEng = "Englisch (USA)" + sLocaleNumFormLanLith = "Litauisch" + sLocaleNumFormLanDutch = "Niederländisch (Niederlande)" + + case 50 : sLocaleTableHeading = "Glava tabele" ' Slovenian + sLocaleTableContents = "Vsebina tabele" + sLocaleNumber = "Število" + sLocaleText = "Besedilo" + sLocaleCurrency = "Valuta" + sLocaleDate = "Datum" + sLocaleTime = "Čas" + sLocalePercent = "Odstotek" + sLocaleScientific = "Znanstveno" + sLocaleFraction = "Ulomek" + sLocaleBoolean = "Dvojiška vrednost" + sLocaleTable = "Tabela" + sLocaleCurrencyValue = "10,00 €" + sLocaleDateValue = "31.03.06" + sLocaleDateOutput = "31.03.06" + sLocaleTimeInput = "15:42" + sLocaleTimeValue = "15:42:00" + slocalePercentValue = "14,00%" + sLocaleScientificValue = "1,00E+008" + sLocaleBooleanValue = "TRUE" + sLocaleLocaleSettings = "angleški (ZDA)" + sLocaleScriptType = "Zahodni" + sLocaleNumFormLanEng = "angleški (ZDA)" + sLocaleNumFormLanLith = "litovski" + sLocaleNumFormLanDutch = "nizozemski (Nizozemska)" + + case 55 : sLocaleTableHeading = "Título da tabela" ' Brazil (Portuguese) + sLocaleTableContents = "Conteudo da table" + sLocaleNumber = "Número" + sLocaleText = "Texto" + sLocaleCurrency = "Moeda" + sLocaleDate = "Data" + sLocaleTime = "Hora" + sLocalePercent = "Porcentagem" + sLocaleScientific = "Científico" + sLocaleFraction = "Fração" + sLocaleBoolean = "Valor booleano" + sLocaleTable = "Tabela" + sLocaleCurrencyValue = "R$ 10,00" + sLocaleDateValue = "31/03/06" + sLocaleDateOutput = "31/03/06" + sLocaleTimeInput = "15:42" + sLocaleTimeValue = "15:42:00" + slocalePercentValue = "14,00%" + sLocaleScientificValue = "1,00E+008" + sLocaleBooleanValue = "VERDADEIRO" + sLocaleLocaleSettings = "Português (Brasil)" + sLocaleScriptType = "Western" + sLocaleNumFormLanEng = "Inglês (EUA)" + sLocaleNumFormLanLith = "Lituano" + sLocaleNumFormLanDutch = "Flamengo (Holanda)" + + case 81 : sLocaleTableHeading = "表の見出し" ' Japanese + sLocaleTableContents = "表の内容" + sLocaleNumber = "数値" + sLocaleText = "テキスト" + sLocaleCurrency = "通貨" + sLocaleDate = "日付" + sLocaleTime = "時刻" + sLocalePercent = "パーセンテージ" + sLocaleScientific = "科学" + sLocaleFraction = "分数" + sLocaleBoolean = "論理値" + sLocaleTable = "表" + sLocaleCurrencyValue = "¥10" + sLocaleDateValue = "3月31日" + sLocaleDateOutput = "3月31日" + sLocaleTimeInput = "15:42" + sLocaleTimeValue = "15:42" + slocalePercentValue = "14%" + sLocaleScientificValue = "1.00E+08" + sLocaleBooleanValue = "TRUE" + sLocaleLocaleSettings = "日本語" + sLocaleScriptType = "CJK" + sLocaleNumFormLanEng = "英語 (米国)" + sLocaleNumFormLanLith = "リトアニア語" + sLocaleNumFormLanDutch = "オランダ語 (オランダ)" + + case 82 : sLocaleTableHeading = "표제목" ' Korean + sLocaleTableContents = "표 내용" + sLocaleNumber = "수" + sLocaleText = "텍스트" + sLocaleCurrency = "통화" + sLocaleDate = "날짜" + sLocaleTime = "시간" + sLocalePercent = "퍼센트" + sLocaleScientific = "과학" + sLocaleFraction = "분수" + sLocaleBoolean = "논리 값" + sLocaleTable = "표" + sLocaleCurrencyValue = "₩10" + sLocaleDateValue = "2006/3/31" + sLocaleDateOutput = "2006년 3월 31" + sLocaleTimeInput = "15:42" + sLocaleTimeValue = "15시 42분 0초" + slocalePercentValue = "14%" + sLocaleScientificValue = "1.00E+08" + sLocaleBooleanValue = "참" + sLocaleLocaleSettings = "한국어(대한민국)" + sLocaleScriptType = "CJK" + sLocaleNumFormLanEng = "영어(미국)" + sLocaleNumFormLanLith = "리투아니아어" + sLocaleNumFormLanDutch = "네덜란드어(네덜란드)" + + case 86 : sLocaleTableHeading = "表格标题" ' Chinese (simplified) + sLocaleTableContents = "表格内容" + sLocaleNumber = "数字" + sLocaleText = "文字" + sLocaleCurrency = "货币" + sLocaleDate = "日期" + sLocaleTime = "时间" + sLocalePercent = "百分比" + sLocaleScientific = "科学" + sLocaleFraction = "分数" + sLocaleBoolean = "逻辑值" + sLocaleTable = "表格" + sLocaleCurrencyValue = "¥10.00" + sLocaleDateValue = "2006/3/31" + sLocaleDateOutput = "06年3月31日" + sLocaleTimeInput = "15:42" + sLocaleTimeValue = "15:42:00" + slocalePercentValue = "14.00%" + sLocaleScientificValue = "1.00E+008" + sLocaleBooleanValue = "真" + sLocaleLocaleSettings = "中文(简体)" + sLocaleScriptType = "CJK" + sLocaleNumFormLanEng = "英语(美国)" + sLocaleNumFormLanLith = "立陶宛语" + sLocaleNumFormLanDutch = "荷兰语(荷兰)" + + case 88 : sLocaleTableHeading = "表格標題" ' Chinese (traditional) + sLocaleTableContents = "表格內容" + sLocaleNumber = "数字" + sLocaleText = "文字" + sLocaleCurrency = "货币" + sLocaleDate = "日期" + sLocaleTime = "时间" + sLocalePercent = "百分比" + sLocaleScientific = "科学" + sLocaleFraction = "分数" + sLocaleBoolean = "逻辑值" + sLocaleTable = "表格" + sLocaleCurrencyValue = "NT$10.00" + sLocaleDateValue = "2006/3/31" + sLocaleDateOutput = "06/3/31" + sLocaleTimeInput = "15:42" + sLocaleTimeValue = "15:42:00" + slocalePercentValue = "14.00%" + sLocaleScientificValue = "1.00E+008" + sLocaleBooleanValue = "真" + sLocaleLocaleSettings = "中文 (繁體)" + sLocaleScriptType = "CJK" + sLocaleNumFormLanEng = "英文 (美國)" + sLocaleNumFormLanLith = "立陶宛文" + sLocaleNumFormLanDutch = "荷蘭文 (比利時)" + + case else : ' Fallback + QAErrorLog "The test does not support language " +iSprache + fLocaleString = "Abortion" + exit function + end select + + select case sReturn + case "LocaleTableHeading" : fLocaleString = slocaleTableHeading + case "LocaleTableContents" : fLocaleString = slocaleTableContents + case "LocaleNumber" : fLocaleString = sLocaleNumber + case "LocaleText" : fLocaleString = sLocaleText + case "LocaleCurrency" : fLocaleString = sLocaleCurrency + case "LocaleDate" : fLocaleString = sLocaleDate + case "LocaleTime" : fLocaleString = sLocaleTime + case "LocalePercent" : fLocaleString = sLocalePercent + case "LocaleScientific" : fLocaleString = sLocaleScientific + case "LocaleFraction" : fLocaleString = sLocaleFraction + case "LocaleBoolean" : fLocaleString = sLocaleBoolean + case "LocaleTable" : fLocaleString = sLocaleTable + case "LocaleCurrencyValue" : fLocaleString = sLocaleCurrencyValue + case "LocaleDateValue" : fLocaleString = sLocaleDateValue + case "LocaleDateOutput" : fLocaleString = sLocaleDateOutput + case "LocaleTimeInput" : fLocaleString = sLocaleTimeInput + case "LocaleTimeValue" : fLocaleString = sLocaleTimeValue + case "LocalePercentValue" : fLocaleString = slocalePercentValue + case "LocaleScientificValue" : fLocaleString = sLocaleScientificValue + case "LocaleBooleanValue" : fLocaleString = sLocaleBooleanValue + case "LocaleLocaleSettings" : fLocaleString = sLocaleLocaleSettings + case "LocaleScriptType" : fLocaleString = sLocaleScriptType + case "LocaleNumFormLanEng" : fLocaleString = sLocaleNumFormLanEng + case "LocaleNumFormLanLith" : fLocaleString = sLocaleNumFormLanLith + case "LocaleNumFormLanDutch" : fLocaleString = sLocaleNumFormLanDutch + + case else : ' Fallback + QAErrorLog "String not available" + fLocaleString = "Abortion" + end select + +end function diff --git a/testautomation/global/tools/includes/optional/t_locale_tools.inc b/testautomation/global/tools/includes/optional/t_locale_tools.inc new file mode 100644 index 000000000000..75d18e2c5856 --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_locale_tools.inc @@ -0,0 +1,92 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/*********************************************************************** +'* +'* owner : oliver.craemer@oracle.com +'* +'* short description : place it here +'* +'\*********************************************************************** +'* +' #1 fThesaurusLocales 'Get locales which are supported by Thesaurus +' #1 fSpellcheckerLocales 'Get locales which are supported by Spellchecker +'* +'\*********************************************************************** + +function fThesaurusLocales as boolean +'/// Gets the supported thesaurus locales from the API +'/// Returns TRUE if iSprache is supported by Thesaurus +'/// Returns FALSE if iSprache is not supported by Thesaurus + + dim uno as object + dim linugServiceMgr as object + dim aAllLocales (256) as variant + dim sLocale as string + dim i as integer + + fThesaurusLocales = FALSE + uno=hGetUnoService() + linugServiceMgr=uno.createInstance("com.sun.star.linguistic2.LinguServiceManager") + aAllLocales = linugServiceMgr.getThesaurus().getLocales() + for i = 0 to ubound( aAllLocales ()) + sLocale = ( aAllLocales(i).Language & "-" & (aAllLocales(i).Country) ) + printlog sLocale + if ConvertLanguage2 ( sLocale ) = iSprache then + fThesaurusLocales = TRUE + i = ubound( aAllLocales ()) + endif + next i + +end function + +'----------------------------------------------------------- + +function fSpellcheckerLocales as boolean +'/// Gets the supported spellchecker locales from the API +'/// Returns TRUE if iSprache is supported by Spellchecker +'/// Returns FALSE if iSprache is not supported by Spellchecker + + dim uno as object + dim linugServiceMgr as object + dim aAllLocales (256) as variant + dim sLocale as string + dim i as integer + + fSpellcheckerLocales = FALSE + uno=hGetUnoService() + linugServiceMgr=uno.createInstance("com.sun.star.linguistic2.LinguServiceManager") + aAllLocales = linugServiceMgr.getSpellchecker().getLocales() + for i = 0 to ubound( aAllLocales ()) + sLocale = ( aAllLocales(i).Language & "-" & (aAllLocales(i).Country) ) + printlog sLocale + if ConvertLanguage2 ( sLocale ) = iSprache then + fSpellcheckerLocales = TRUE + i = ubound( aAllLocales ()) + endif + next i + +end function + diff --git a/testautomation/global/tools/includes/optional/t_macro_tools.inc b/testautomation/global/tools/includes/optional/t_macro_tools.inc new file mode 100755 index 000000000000..6c1fcc478e5a --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_macro_tools.inc @@ -0,0 +1,175 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +' ** +' ** owner : joerg.skottke@oracle.com +' ** +' ** short description : Helper functions for Macro tests +' ** +'\****************************************************************************** + +function hInsertMacroFromFile( cMacroId as string, optional cSource as string ) as integer + + '///<h3>Paste a macro (taken from a file) to the basic IDE</h3> + '///<i>uses: framework/tools/input/macros.txt</i><br> + '///<i>Starting point: Basic IDE</i><br> + '///<u>Note</u>: Overwrites any existing macros in the current module<br> + '///<u>Input</u>: + '///<ol> + '///+<li>Name (ID) of the macro to be inserted (string)</li> + '///<ul> + '///+<li>Allowed is any string that corresponds to a section in the source file</li> + '///</ul> + '///</ol> + '///<u>Returns</u>: + '///<ol> + '///+<li>Number of lines inserted (integer)</li> + '///<ul> + '///+<li>0: Error, no lines inserted</li> + '///+<li>> 0: Number of lines</li> + '///</ul> + '///</ol> + '///<u>Description</u>: + '///<ul> + + const CFN = "hInsertMacroFromFile::" + const RETVAL_FAILURE = 0 + const MAX_LINES_IN_MACRO_FILE = 10000 + + '///+<li>Find the path to the source file</li> + dim cFile as string + dim aInstructionList( MAX_LINES_IN_MACRO_FILE ) as string + dim iInstructionCount as integer + dim iCurrentInstruction as integer + + if ( IsMissing( cSource ) ) then cFile = gTesttoolPath & "global/input/macros.txt" + + '///+<li>retrieve the macro from the file with ID as section</li> + iInstructionCount = hGetDataFileSection( cFile, aInstructionList(), cMacroId, "", "" ) + + '///+<li>Delete all content from the BASIC IDE edit window</li> + '///+<li>Insert the code into the IDE line by line</li> + kontext "BasicIDE" + if ( EditWindow.exists() ) then + if ( hDeleteMacro() ) then + for iCurrentInstruction = 1 to iInstructionCount + EditWindow.TypeKeys( "<HOME>" ) + EditWindow.TypeKeys( aInstructionList( iCurrentInstruction ) ) + EditWindow.TypeKeys( "<RETURN>" ) + next iCurrentInstruction + printlog( CFN & "Inserted macro: " & cMacroId ) + hInsertMacroFromFile() = iInstructionCount + else + printlog( CFN & "IDE is not empty, will not insert macro" ) + hInsertMacroFromFile() = RETVAL_FAILURE + endif + else + printlog( CFN & "Editwindow is not visible" ) + hInsertMacroFromFile() = RETVAL_FAILURE + endif + '///</ul> + +end function + +'******************************************************************************* + +function hMacroOrganizerRunMacro( cMacroName as string ) as integer + + ' Run a macro by name. Returnvalues as follows: + ' = 0: any error + ' > 0: position of macro in the list, success. + + const CFN = "hMacroOrganizerRunMacro::" + const RETVAL_FAILURE = 0 + + dim iMacroPosition as integer + + ToolsMacro_uno + + kontext "Makro" + if ( Makro.exists( 2 ) ) then + hExpandAllNodes( MakroAus ) + iMacroPosition = hSelectNodeByName( MakroAus, cMacroName ) + if ( iMacroPosition ) then + iMacroPosition = hSelectNextNode( MakroAus ) + if ( hClickButton( Ausfuehren ) ) then + hMacroOrganizerRunMacro() = iMacroPosition + else + ' run macro button not enabled + warnlog( CFN & "Unable to click <Run macro> button" ) + hMacroOrganizerRunMacro() = RETVAL_FAILURE + endif + else + warnlog( CFN & "Macro was not found" ) + hMacroOrganizerRunMacro() = RETVAL_FAILURE + endif + else + warnlog( CFN & "Failed to open Macro Organizer" ) + hMacroOrganizerRunMacro() = RETVAL_FAILURE + endif + + +end function + +'******************************************************************************* + +function hBasicIDERunMacro( cIdentifier as string ) as boolean + + const CFN = "hBasicIDERunMacro(): " + const MAX_WAIT = 1 + dim cMessage as string : cMessage = "" + + kontext "BasicIDE" + if ( BasicIDE.exists() ) then + + Wait( 2000 ) + + kontext "MacroBar" + if ( MacroBar.exists() ) then + BasicRun.click() + else + warnlog( "MacroBar not accessible" ) + endif + + kontext "Active" + if ( Active.exists( MAX_WAIT ) ) then + cMessage = Active.getText() + hCloseDialog( Active, "ok" ) + endif + + if ( cMessage = cIdentifier ) then + printlog( "The expected macro was executed" ) + hBasicIDERunMacro() = true + else + printlog( CFN & "Incorrect macro executed" ) + hBasicIDERunMacro() = false + endif + else + warnlog( CFN & "BasicIDE is not open" ) + hBasicIDERunMacro() = false + endif + +end function
\ No newline at end of file diff --git a/testautomation/global/tools/includes/optional/t_ole.inc b/testautomation/global/tools/includes/optional/t_ole.inc new file mode 100755 index 000000000000..13138dfc52ab --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_ole.inc @@ -0,0 +1,143 @@ +'encoding UTF-8 Do not remove or change this line! +'******************************************************************************* +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/****************************************************************************** +'* +'* owner : joerg.skottke@oracle.com +'* +'* short description : Tools for OLE objects +'* +'\****************************************************************************** + +function hGetOfficeVersion() as string + + ' The "Insert OLE object" dialog lists the OLE Objects with application name + ' and version number. THe version numbers are tracked in the officeinfo.txt + ' file which must be adjusted each time we change to a new major version. + + const CFN = "global::tools::includes::optional::t_ole.inc::hGetOfficeVersion(): " + const DATAFILE = "global/input/officeinfo.txt" + const MAX_LINES_IN_DATAFILE = 20 + + dim cPath as string + dim aItemList( MAX_LINES_IN_DATAFILE ) as string + + ' Path to info file + cPath = convertpath( gTesttoolPath & DATAFILE ) + if ( GVERBOSE ) then printlog( CFN & "Reading: " & cPath ) + + ' Read the file, store the list of known office versions + hGetDatafileSection( cPath, aItemList(), "", "", "" ) + + ' Search for the version number matching the product name, store value in global variable + gOfficeVersion = hGetValueForKeyAsString( aItemList(), gProductName ) + + ' Return content of the global variable as well + hGetOfficeVersion() = gOfficeVersion + +end function + +'******************************************************************************* + +function hGetOleObjectName( cApplication as string ) as string + + ' for cApplication you may pass gApplication. + + dim Application_API_Name as string + dim oUnoOfficeConnection as object + dim oUnoConfigurationAccess as object + dim aPropertyValue(1) as new com.sun.star.beans.PropertyValue + dim xViewRoot as object + dim cConfigString as string + dim cString as string + + const CFN = "global::tools::includes::optional::t_ole.inc::hGetOleObjectName(): " + + ' The application names for the API are case sensitive so we cannot use gApplication + select case ( ucase( cApplication ) ) + case "WRITER" : Application_API_Name = "Writer" + case "CALC" : Application_API_Name = "Calc" + case "IMPRESS": Application_API_Name = "Impress" + case "DRAW" : Application_API_Name = "Draw" + case "MATH" : Application_API_Name = "Math" + case "CHART" : Application_API_Name = "Chart" + case else + warnlog( CFN & "Invalid object type passed to function: " & cApplication ) + hGetOleObjectName() = "" + exit function + end select + + if ( GVERBOSE ) then printlog( CFN & "Retrieving OLE name for: " & cApplication ) + + ' ...Embedding is physical path, ObjectNames the top node + aPropertyValue( 0 ).Name = "nodepath" + aPropertyValue( 0 ).Value = "/org.openoffice.Office.Embedding/ObjectNames/" & Application_API_Name + + ' Connect to remote UNO + oUnoOfficeConnection = hGetUnoService( TRUE ) + + if ( isNull( oUnoOfficeConnection )) then + warnlog( CFN & "Failed to establish UNO connection, hGetUnoService failed" ) + hGetOleObjectName() = "" + else + ' Get a configuration provider + oUnoConfigurationAccess = oUnoOfficeConnection.createInstance( "com.sun.star.configuration.ConfigurationProvider" ) + + ' Get access + xViewRoot = oUnoConfigurationAccess.createInstanceWithArguments( "com.sun.star.configuration.ConfigurationAccess", aPropertyValue() ) + cConfigString = xViewRoot.getByName( "ObjectUIName" ) + + ' The string contains placeholders %PRODUCTNAME and %PRODUCTVERSION which have to be replaced + if ( gOfficeVersion = "" ) then + warnlog( CFN & "gOOoBaseVersion is empty, run hGetOfficeVersion() first" ) + cString = right( cConfigString, len( cConfigString ) - 29 ) + else + cString = gProductName & " " & gOfficeVersion & " " & right( cConfigString, len( cConfigString ) - 29 ) + endif + + endif + + hGetOleObjectName() = cString + +end function + +'******************************************************************************* + +function GetOleDefaultNames() + + const CFN = "global::tools::includes::optional::t_ole.inc::GetOleDefaultNames(): " + if ( GVERBOSE ) then printlog( CFN & "Retrieving OLE names" ) + + hGetOfficeVersion() + gOLEWriter = hGetOleObjectName( "Writer" ) + gOLECalc = hGetOleObjectName( "Calc" ) + gOLEChart = hGetOleObjectName( "Chart" ) + gOLEImpress = hGetOleObjectName( "Impress" ) + gOLEDraw = hGetOleObjectName( "Draw" ) + gOLEMath = hGetOleObjectName( "Math" ) + +end function + +'******************************************************************************* diff --git a/testautomation/global/tools/includes/optional/t_security_tools.inc b/testautomation/global/tools/includes/optional/t_security_tools.inc new file mode 100755 index 000000000000..28625be35880 --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_security_tools.inc @@ -0,0 +1,677 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : joerg.skottke@oracle.com +'* +'* short description : Tools to ease testing of security related funtionality +'* +'\****************************************************************************** + +function hSetPasswordRecommendation( bEnable as boolean ) as boolean + + '///<h3>Toggle Tools/Options/OOo/Security: Password recommendation</h3> + '///<u>Input</u>: + '///<ol> + '///+<li>Mode (boolean)</li> + '///<ul> + '///+<li>TRUE: Switch password recommendation on</li> + '///+<li>FALSE: Switch password recommendation off</li> + '///</ul> + '///</ol> + + '///<u>Returns</u>: + '///<ol> + '///+<li>Prior state (boolean)</li> + '///<ul> + '///+<li>TRUE: Password recommendation was on</li> + '///+<li>FALSE: Password recommendation was off</li> + '///</ul> + '///</ol> + + '///<u>Description</u>: + '///<ul> + + const CFN = "hSetPasswordRecommendation::" + + '///+<li>Open Tools/Options</li> + ToolsOptions + + kontext "OptionenDlg" + if ( OptionenDlg.exists( 2 ) ) then + + '///+<li>Go to the security page</li> + hToolsOptions( "STAROFFICE" , "SECURITY" ) + + '///+<li>Click on the "Options..." button</li> + kontext "TabSecurity" + if ( hClickButton( Options ) ) then + + kontext "TabSecurityOptionsAndWarnings" + if ( TabSecurityOptionsAndWarnings.exists( 1 ) ) then + + '///+<li>Retrieve the current setting for passwor recommendation</li> + if ( RecommendPasswordProtectionOnSaving.isChecked() ) then + hSetPasswordRecommendation() = true + else + hSetPasswordRecommendation() = false + endif + + '///+<li>Set the requested state</li> + if ( bEnable ) then + printlog( CFN & "Enabled password recommendation" ) + RecommendPasswordProtectionOnSaving.check() + else + printlog( CFN & "Disabled password recommendation" ) + RecommendPasswordProtectionOnSaving.uncheck() + endif + + hCloseDialog( TabSecurityOptionsAndWarnings, "ok" ) + + else + warnlog( "Failed to open security options page" ) + hSetPasswordRecommendation() = false + endif + + else + warnlog( CFN & "Unable to click options button" ) + hSetPasswordRecommendation() = false + endif + + '///+<li>Close Tools/Options</li> + Kontext "ToolsOptionsDlg" + hCloseDialog( ToolsOptionsDlg, "ok" ) + + else + warnlog( "Failed to open Tools/Options" ) + endif + '///</ul> + +end function + +'****************************************************************************** + +function hOpenDigitalSignaturesDialog() as boolean + + '///<h3>Open the Digital Signatures Dialog via File-Menu</h3> + '///<u>Input</u>: + '///<ol> + '///+<li>Nothing</li> + '///</ol> + + '///<u>Returns</u>: + '///<ol> + '///+<li>Errorcondition (boolean)</li> + '///<ul> + '///+<li>TRUE: The Digital Signatures Dialog is open</li> + '///+<li>FALSE: The Digital Signatures Dialog is not open</li> + '///</ul> + '///</ol> + + '///<u>Description</u>: + '///<ul> + + const CFN = "hOpenDigitalSignaturesDialog::" + const FILE_MENU_POSITION = 1 + const SIGNATURES_MENU_POSITION_OTHER = 15 + const SIGNATURES_MENU_POSITION_MATH = 14 + + hOpenDigitalSignaturesDialog() = false + + '///+<li>Open the file-menu</li> + call hUseMenu() + call hMenuSelectNr( FILE_MENU_POSITION ) + + '///+<li>Select "Digital signatures..."</li> + try + if ( gApplication = "MATH" ) then + call hMenuSelectNr( SIGNATURES_MENU_POSITION_MATH ) + else + call hMenuSelectNr( SIGNATURES_MENU_POSITION_OTHER ) + endif + catch + warnlog( CFN & "Failed to execute menuitem <Digital Signature...>" ) + endcatch + + ' At this stage either the digital signatures dialog or the messagebox + ' <The document needs to be saved> is open. In the latter case the function + ' returns false. The possibility that neither of both dialogs are open + ' must be handled in the parent function. This means there is no warning + ' here either + + '///+<li>Verify that the Digital Signatures dialog is open</li> + kontext "DigitalSignature" + if ( DigitalSignature.exists() ) then + printlog( CFN & "Digital signatures is open" ) + hOpenDigitalSignaturesDialog() = true + endif + '///</ul> + +end function + +'******************************************************************************* + +function hAllowMacroExecution() as boolean + + '///<h3>Allow macro execution on Macro Security Warning dialog</h3> + '///<u>Input</u>: + '///<ol> + '///+<li>Nothing</li> + '///</ol> + + '///<u>Returns</u>: + '///<ol> + '///+<li>Errorcondition (boolean)</li> + '///<ul> + '///+<li>TRUE: Macro dialog is open, successfully clicked "Run"</li> + '///+<li>FALSE: Dialog was not opened</li> + '///</ul> + '///</ol> + + '///<u>Description</u>: + '///<ul> + + const CFN = "hAllowMacroExecution::" + const MAX_WAIT_FOR_SECURITY_DIALOG = 5 + + '///+<li>Verify that the Macro security Warning is displayed</li> + kontext "SecurityWarning" + if ( SecurityWarning.exists( MAX_WAIT_FOR_SECURITY_DIALOG ) ) then + + '///+<li>Click "Run" to allow macro execution</li> + printlog( CFN & "Allowing macro execution" ) + hAllowMacroExecution() = hCloseDialog( SecurityWarning, "ok" ) + else + printlog( CFN & "Macro dialog not displayed" ) + hAllowMacroExecution() = false + endif + '///</ul> + +end function + +'******************************************************************************* + +function hDenyMacroExecution() as boolean + + '///<h3>Deny macro execution on Macro Security Warning dialog</h3> + '///<u>Input</u>: + '///<ol> + '///+<li>Nothing</li> + '///</ol> + + '///<u>Returns</u>: + '///<ol> + '///+<li>Errorcondition (boolean)</li> + '///<ul> + '///+<li>TRUE: Macro dialog is open, successfully clicked "Deny"</li> + '///+<li>FALSE: Dialog was not opened</li> + '///</ul> + '///</ol> + + '///<u>Description</u>: + '///<ul> + + const CFN = "hDenyMacroExecution::" + + '///+<li>Verify that the Macro security Warning is displayed</li> + kontext "SecurityWarning" + if ( SecurityWarning.exists() ) then + + '///+<li>Click "Cancel" to deny execution</li> + printlog( CFN & "Denied macro execution" ) + hDenyMacroExecution() = hCloseDialog( SecurityWarning, "cancel" ) + else + printlog( CFN & "Macro dialog not displayed" ) + hDenyMacroExecution() = false + endif + '///</ul> + +end function + +'******************************************************************************* + +function hSwitchMacroSecurityTab( cTab as string ) + + '///<h3>Switch between Security Level and Trusted Paths</h3> + '///<u>Input</u>: + '///<ol> + '///+<li>The Tabpage to be activated (string). Valid options are:</li> + '///<ul> + '///+<li>"SecurityLevel"</li> + '///+<li>"TrustedPaths"</li> + '///</ul> + '///</ol> + + '///<u>Returns</u>: + '///<ol> + '///+<li>Nothing</li> + '///</ol> + + '///<u>Description</u>: + '///<ul> + + kontext + + '///+<li>Switch to the given Tabpage</li> + select case ( lcase( cTab ) ) + case "securitylevel" : active.setPage TabSecurityLevel + case "trustedpaths" : active.setPage TabTrustedSources + end select + + '///</ul> + +end function + +'******************************************************************************* + +function hAddTrustedPath( cPath as string ) as boolean + + '///<h3>Add a directory to the list of trusted paths</h3> + '///<u>Input</u>: + '///<ol> + '///+<li>Fully qualified path to the directory (string)</li> + '///</ol> + + '///<u>Return</u>: + '///<ol> + '///+<li>Errorcondition (boolean)</li> + '///<ul> + '///+<li>TRUE = Path was successfully added</li> + '///+<li>FALSE = Failed to add the path</li> + '///</ul> + '///</ol> + + const CFN = "hAddTrustedPath::" + + dim iPathCount as integer + + '///<u>Description</u>: + '///<ul> + + '///+<li>Open Tools/Options</li> + ToolsOptions + + '///+<li>Switch to the Security page</li> + hToolsOptions( "StarOffice" , "Security" ) + + '///+<li>Click Macro Security</li> + hClickButton( MacroSecurity ) + + '///+<li>Switch to the Trusted Paths tab</li> + hSwitchMacroSecurityTab( "trustedpaths" ) + kontext "TabTrustedSources" + + '///+<li>Get the number of currently listed items from the list</li> + iPathCount = LocationsListBox.getItemCount() + + '///+<li>Click the "Add" button</li> + hClickButton( LocationsAdd ) + + '///+<li>Enter a path to some files containing macros</li> + kontext "OeffnenDlg" + DateiName.setText( cPath ) + + '///+<li>Click "Select"</li> + hClickButton( Oeffnen ) + + '///+<li>Verify that the item has been added to the list</li> + kontext "TabTrustedSources" + if ( LocationsListBox.getItemCount() <> ( iPathCount + 1 ) ) then + warnlog( CFN & "Incorrect number of items in locations listbox" ) + hAddTrustedPath() = false + else + printlog( "Added: " & cPath ) + hAddTrustedPath() = true + endif + + '///+<li>Close the dialog</li> + hCloseDialog( TabTrustedSources, "ok" ) + + '///+<li>Close Tools/Options</li> + Kontext "OptionenDlg" + hCloseDialog( OptionenDlg, "ok" ) + '///</ul> + +end function + +'******************************************************************************* + +function hRemoveTrustedPath( cPath as string ) as boolean + + '///<h3>Remove a directory from the list of trusted paths</h3> + '///<u>Input</u>: + '///<ol> + '///+<li>Fully qualified path to the directory (string)</li> + '///</ol> + + '///<u>Return</u>: + '///<ol> + '///+<li>Errorcondition (boolean)</li> + '///<ul> + '///+<li>TRUE = Path was successfully added</li> + '///+<li>FALSE = Failed to add the path</li> + '///</ul> + '///</ol> + + const CFN = "hRemoveTrustedPath()" + + dim iPathCount as integer + dim iCurrentPathItem as integer + + hRemoveTrustedPath() = false + + '///<u>Description</u>: + '///<ul> + + '///+<li>Open Tools/Options</li> + ToolsOptions + + '///+<li>Switch to the Security page</li> + hToolsOptions( "StarOffice" , "Security" ) + + '///+<li>Click Macro Security</li> + hClickButton( MacroSecurity ) + + '///+<li>Switch to the Trusted Paths tab</li> + hSwitchMacroSecurityTab( "trustedpaths" ) + kontext "TabTrustedSources" + + if ( TabTrustedSources.exists() ) then + + '///+<li>Get the number of currently listed items from the list</li> + iPathCount = LocationsListBox.getItemCount() + + '///+<li>Find the entry in the list</li> + for iCurrentPathItem = 1 to iPathCount + + '///+<li>If it is there, delete it</li> + LocationsListBox.select( iCurrentPathItem ) + if ( LocationsListBox.getSelText() = cPath ) then + LocationsRemove.click() + printlog( CFN & "Removed item at pos. " & iCurrentPathItem ) + hRemoveTrustedPath() = true + exit for + endif + + next iCurrentPathItem + + '///+<li>Close the dialog</li> + hCloseDialog( TabTrustedSources, "ok" ) + + else + warnlog( CFN & "Trusted Sources Tab did not open" ) + hRemoveTrustedPath() = false + endif + + '///+<li>Close Tools/Options</li> + Kontext "OptionenDlg" + hCloseDialog( OptionenDlg, "ok" ) + + '///</ul> + +end function + + +'******************************************************************************* + +function hSecurityEnterPasswordOnSave( cPassword as string ) as boolean + + + '///<h3>Enter password when saving a document</h3> + '///<i>This function enters a password into the password dialog if the " + '///+ Save with password" checkbox is checked. It will automatically + '///+ generate a faulty password to be entered on first try (to see whether + '///+ the "Invalid password confirmation" dialog pops up, on second + '///+ attempt the password is confirmed correctly and thus the document should + '///+ save ok. The office should return to the document, the File Save dialog + '///+ should close after save.</i><br><br> + + '///<u>Parameter(s):</u><br> + '///<ol> + + '///+<li>Password to use (String)</li> + '///<ul> + '///+<li>Password should contain strange characters and glyphs if possible</li> + '///</ul> + + '///</ol> + + + '///<u>Returns:</u><br> + '///<ol> + '///+<li>Errorcondition (Boolean)</li> + '///<ul> + '///+<li>TRUE if all went well</li> + '///+<li>FALSE on any error</li> + '///</ul> + '///</ol> + + const CFN = "hSecurityEnterPasswordOnSave::" + if ( GVERBOSE ) then printlog( CFN & "Enter" ) + + '///<u>Description:</u> + '///<ul> + '///+<li>Verify that the password dialog is present</li> + kontext "PasswordFileSave" + if ( PasswordFileSave.exists( 2 ) ) then + + printlog( CFN & "Password dialog is displayed" ) + + '///+<li>Enter the password</li> + Password.setText( cPassword ) + + '///+<li>Confirm with incorrect password (e.g. append a number at random)</li> + PasswordConfirm.setText( cPassword & "1" ) + + '///+<li>Click on OK</li> + hCloseDialog( PasswordFileSave, "ok" ) + + '///+<li>There should be a warning about a faulty password confirmation</li> + kontext "Active" + if ( Active.exists( 1 ) ) then + printlog( CFN & "Message: " & Active.getText() ) + + '///+<li>Close messagebox with OK</li> + Active.OK() + Active.notExists( 2 ) + else + qaerrorlog( CFN & "Warning about faulty password confirmation is missing" ) + hSecurityEnterPasswordOnSave() = false + endif + + '///+<li>We should now be back on the password dialog</li> + kontext "PasswordFileSave" + if ( PasswordFileSave.exists() ) then + + printlog( CFN & "Password dialog is displayed" ) + + '///+<li>Enter the password</li> + Password.setText( cPassword ) + + '///+<li>Confirm with correct password</li> + PasswordConfirm.setText( cPassword ) + + '///+<li>Click on OK</li> + hCloseDialog( PasswordFileSave, "ok" ) + hSecurityEnterPasswordOnSave() = true + + else + + qaerrorlog( CFN & "The password dialog is missing after confirmation error" ) + hSecurityEnterPasswordOnSave() = false + + endif + + else + + qaerrorlog( CFN & "The password dialog did not open" ) + hSecurityEnterPasswordOnSave() = false + + endif + + '///+<li>Verify that the "File Save" dialog is closed after saving</li> + kontext "SpeichernDlg" + if ( SpeichernDlg.exists() ) then + qaerrorlog( CFN & "File Save dialog is open, cancelling." ) + SpeichernDlg.cancel() + hSecurityEnterPasswordOnSave() = false + endif + '///</ul> + + if ( GVERBOSE ) then printlog( CFN & "Exit" ) + +end function + + +'******************************************************************************* + +function hSecurityEnterPasswordOnLoad( cPassword as string, bValid as boolean ) as boolean + + '///<h3>Enter a password while loading a document</h3> + '///<i>Enters a valid or invalid password while loading a passworded file</i><br><br> + + '///<u>Parameter(s):</u><br> + '///<ol> + + '///+<li>Password (String)</li> + '///<ul> + '///+<li>The password should contain special characters and glyphs</li> + '///</ul> + + '///+<li>Password validity (Boolean)</li> + '///<ul> + '///+<li>TRUE: The password is correct, the document should load</li> + '///+<li>FALSE: The password is incorrect, the document should not load</li> + '///</ul> + + '///</ol> + + + '///<u>Returns:</u><br> + '///<ol> + '///+<li>Errorcondition (Boolean)</li> + '///<ul> + '///+<li>TRUE if the password protection worked as expected</li> + '///+<li>FALSE on any error</li> + '///</ul> + '///</ol> + + const CFN = "hSecurityEnterPasswordOnLoad::" + if ( GVERBOSE ) then + printlog( CFN & "Enter with option (Password): " & cPassword ) + printlog( CFN & "Enter with option (Validity): " & bValid ) + endif + + hSecurityEnterPasswordOnLoad() = true + + '///<u>Description:</u> + '///<ul> + '///+<li>Verify that the password dialog exists</li> + kontext "PasswordFileOpen" + if ( PasswordFileOpen.exists( 3 ) ) then + + '///+<li>Enter password, click OK</li> + PasswortName.setText( cPassword ) + hCloseDialog( PasswordFileOpen, "ok" ) + + '///+<li>If the password was incorrect:</li> + '///<ul> + if ( not bValid ) then + + '///+<li>Look for a warning message</li> + kontext "Active" + if ( Active.exists( 1 ) ) then + printlog( CFN & "Message: " & Active.getText() ) + + '///+<li>Close the messagebox</li> + hCloseDialog( Active, "ok" ) + + '///+<li>Close the Password dialog with "Cancel"</li> + kontext "PasswordFileOpen" + if ( PasswordFileopen.exists( 2 ) ) then + hCloseDialog( PasswordFileOpen, "cancel" ) + else + qaerrorlog( CFN & "Password dialog is not present" ) + hSecurityEnterPasswordOnLoad() = false + endif + else + qaerrorlog( CFN & "Warning about incorrect password is missing" ) + hSecurityEnterPasswordOnLoad() = false + endif + + else + kontext "Active" + if ( Active.exists( 1 ) ) then + warnlog( CFN & "Unexpected messagebox: " & Active.getText() ) + hSecurityEnterPasswordOnLoad() = false + endif + endif + '///</ul> + + else + warnlog( CFN & "Password dialog is missing" ) + hSecurityEnterPasswordOnLoad() = false + endif + '///</ul> + +end function + +'******************************************************************************* + +function hSelectXMLSecTab( cTab as string ) as boolean + + const CFN = "hSelectXMLSecTab::" + hSelectXMLSecTab() = false + + kontext + + select case ( ucase( cTab ) ) + case "GENERAL" : active.setpage TabXMLSecGeneral + if ( TabXMLSecGeneral.exists() and TabXMLSecGeneral.isVisible() ) then + printlog( CFN & "Switched to General page" ) + hSelectXMLSecTab() = true + exit function + endif + + case "DETAILS" : active.setpage TabXMLSecDetails + if ( TabXMLSecDetails.exists() and TabXMLSecDetails.isVisible() ) then + printlog( CFN & "Switched to Details page" ) + hSelectXMLSecTab() = true + exit function + endif + + case "PATH" : active.setpage TabXMLSecCertPath + if ( TabXMLSecCertPath.exists() and TabXMLSecCertPath.isVisible() ) then + printlog( CFN & "Switched to Certification Path page" ) + hSelectXMLSecTab() = true + exit function + endif + end select + + warnlog( CFN & "Failed to switch XML Security Tabpage" ) + +end function + diff --git a/testautomation/global/tools/includes/optional/t_set_standard_controls.inc b/testautomation/global/tools/includes/optional/t_set_standard_controls.inc new file mode 100644 index 000000000000..8384edcc27d1 --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_set_standard_controls.inc @@ -0,0 +1,646 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : helge.delfs@oracle.com +'* +'* short description : Tool library for setting controls and verifying the functionality +'* +'************************************************************************************************** +'* +' #0 fSetListBoxByItem 'Function to select item in list box +' #0 fSetListBoxByString 'Function to select item by string in list box +' #0 fSetSpinFieldByString 'Function to set a string in a spin field control +' #0 fSetSpinFieldByButton 'Function to set a spin field control by using 'more' or 'less' button +' #0 fSetSpinFieldByLimit 'Function to set a spin field control to minimum or maximum value +' #0 fSetComboBoxByItem 'Function to select item in combo box +' #0 fSetComboBoxByString 'Function to select item in combo box +' #0 fSetComboBoxByText 'Function to Edit Field part of a combo box +' #0 fSetCheckBox 'Function to (un)check a check box +' #0 fSetRadioButton 'Function to check a radio button +' #0 fSetTextBox 'Function to set a textbox +'* +'\************************************************************************************************ + +'///<u><b>Library for abtracted handling of several control types</b></u> +'///+Note: This functions are designed to be called by wrapping functions +'///+All functions are designed to return error codes depending on the behaviour of the action applied. +'///<b>Return codes:</b> +'///+<ul><li>Error 0: Success</li> +'///+<li>Error 1: The basic action beeing applied caused a serious problem, e.g. a crash</li> +'///+<li>Error 2 TO 9: A functional problem occured.</li> +'///+<li>Error 11 TO 19: Wrong marginal conditions end up in Failure, e.g. control not visible</li></ul> +'/// NOTE: This errors can also be used for 'negative' testing. +'///+<ul><li>Error 42: Wrong input. Probably only of interest during test development</li> +'///+<li>Error 99: Unexpected behaviour - Shouldn't normally occur</li></ul> +'///<b>ATTENTION:</b> +'///+<ul><li>Only Errors 42 and 99 throw 'warnlogs'</li> +'///+<li>All other errors are silent!</li> +'///+<li>They only throw QAErrorlogs the give a hint what probably went wrong.</li> +'///+<li>Expected Errors MUST exclusivly be handled by the calling routine!</li></ul> +'///+<p><font size=-1><i>The idea and the first implementation of this library has been made by Peter Junge (pj at openoffice.org)</i></font></p> +' +' +function fSetTextBox ( oThisTextBox as OBJECT , sThisText as STRING ) as INTEGER + fSetTextBox = 99 +'Function to set a text box +'Input: +'+OBJECT oThisTextBox (text box name in declaration) +'+STRING sThisText (text to be set in text box control) +' Return (Error-codes): +'+0 = Sucess +'+1 = Serious problem trying to set value +'+2 = Value was not set +'+11 = Text box is not visible +'+12 = Text box is not enabled +'+99 = Unexpected error + + dim iIndex as INTEGER + dim iListLength as INTEGER + dim sResultInUI as STRING + + sResultInUI = "" + + printlog "Setting text in Text Box Edit field" + ' Check if desired Text box is visible + if NOT oThisTextBox.IsVisible then + QAErrorLog "Error 11: Text box is not visible" + fSetTextBox = 11 + exit function + endif + ' Check if desired Text box is enabled + if NOT oThisTextBox.IsEnabled then + QAErrorLog "Error 12: Text box is not enabled" + fSetTextBox = 12 + exit function + endif + ' Try to set text on Text Box + try + oThisTextBox.setText sThisText + catch + ' Throw error 1 and quit on serious problem + qaErrorLog "Error 1: Set text on Text box seems to cause a serious problem." + fSetTextBox = 1 + exit function + endcatch + 'Verify (against input) if text was set correctly + sResultInUI = oThisTextBox.GetText + if sResultInUI = sThisText then + fSetTextBox = 0 + printlog "Set '" & sThisText & "' in 'text box' control PASSED." + else + QAErrorLog "Error 2: Setting '" & sThisText & "' in 'text box' control failed!" + fSetTextBox = 2 + endif + + if fSetTextBox = 99 then + warnlog "Error 99: Something unexpected happened!!" + endif +end function +' +'-------------------------------------------------------------------- +' +function fSetListBoxByItem ( oThisListBox as OBJECT , iThisValue as INTEGER ) as INTEGER + fSetListBoxByItem = 99 +'Function to select item in list box +'Input: +'+OBJECT oThisListBox (list box name in declaration) +'+INTEGER iThisValue (item number to be selected in list box control) +'Return (Error-codes): +'+0 = Sucess +'+ 1 = Serious problem trying to set value +'+ 2 = Value was not set +'+11 = List box is not visible +'+12 = List box is not enabled +'+13 = Item number to be selected out of list range +'+99 = Unexpected error + + dim iListLength as INTEGER + dim iResultFromUI as INTEGER + + iResultFromUI = "" + + printlog "Setting Item in list box" + 'Check if desired list box is visible + if NOT oThisListBox.IsVisible then + QAErrorLog "Error 11: List box is not visible" + fSetListBoxByItem = 11 + exit function + endif + 'Check if desired list box is enabled + if NOT oThisListBox.IsEnabled then + QAErrorLog "Error 12: List box is not enabled" + fSetListBoxByItem = 12 + exit function + endif + 'Check if input value is within list length + iListLength = oThisListBox.GetItemCount + if iThisValue < 1 OR iThisValue > iListLength then + QAErrorLog "Error 13: Item number out of list range" + fSetListBoxByItem = 13 + exit function + endif + 'Try to set value in List Box + try + oThisListBox.select iThisValue + catch + 'Throw error 1 and quit on serious problem + QAErrorLog "Error 1: Set value on list box seems to cause a serious problem." + fSetListBoxByItem = 1 + exit function + endcatch + 'Verify (against input) if item was set correctly + iResultFromUI = oThisListBox.GetSelIndex + if iResultFromUI = iThisValue then + fSetListBoxByItem = 0 + printlog ">> Set value in list box seems to work" + else + QAErrorLog "Error 2: Set value in list box failed." + fSetListBoxByItem = 2 + endif + + if fSetListBoxByItem = 99 then + warnlog "Error 99: Something unexpected happened!!" + endif +end function +' +'-------------------------------------------------------------------- +' +function fSetListBoxByString ( oThisListBox as OBJECT , sThisString as STRING ) as INTEGER + fSetListBoxByString = 99 +'Function to select item by string in list box +'Input: +'+OBJECT oThisListBox (list box name in declaration) +'+STRING sThisString (string trying to match in list box items) +'Return(E rror-codes): +'+ 0 = Sucess +'+ 1 = Serious problem trying to set value +'+ 2 = Value was not set +'+11 = List box is not visible +'+12 = List box is not enabled +'+13 = String to be selected doesn't exist in list box +'+99 = Unexpected error + + dim iIndex as INTEGER + dim iListLength as INTEGER + dim bStringIsInList as BOOLEAN + dim sUIStringNow as STRING + + bStringIsInList = FALSE + sUIStringNow = "" + + printlog "** Setting Item in list box" + 'Check if desired list box is visible + if NOT oThisListBox.IsVisible then + qaErrorLog "Error 11: List box is not visible" + fSetListBoxByString = 11 + exit function + endif + 'Check if desired list box is enabled + if NOT oThisListBox.IsEnabled then + qaErrorLog "Error 12: List box is not enabled" + fSetListBoxByString = 12 + exit function + endif + 'Check if input value is existent in list entries + iListLength = oThisListBox.GetItemCount + for iIndex = 1 to iListLength + if oThisListBox.GetItemText ( iIndex ) = sThisString then + bStringIsInList = TRUE + endif + next iIndex + if bStringIsInList then + printlog "OK, String exists in list box" + else + qaErrorLog "Error 13: Input String not found in list entries" + fSetListBoxByString = 13 + exit function + endif + 'Try to set value in List Box + try + oThisListBox.select sThisString + catch + 'Throw error 1 and quit on serious problem + qaErrorLog "Error 1: Set value on list box seems to cause a serious problem." + fSetListBoxByString = 1 + exit function + endcatch + 'Verify (against input) if item was set correctly + sUIStringNow = oThisListBox.GetSelText + if sUIStringNow = sThisString then + fSetListBoxByString = 0 + printlog "Setting value in list box is OK" + else + qaErrorLog "Error 2: Set value in list box failed." + fSetListBoxByString = 2 + endif + + if fSetListBoxByString = 99 then + warnlog "Error 99: Something unexpected happened!!" + endif +end function +' +'-------------------------------------------------------------------- +' +function fSetSpinFieldByString ( oThisSpinField as OBJECT , sThisString as STRING ) as INTEGER + fSetSpinFieldByString = 99 +'Function to set a string in a spin field control +'Input: +'+OBJECT oThisSpinField (spin field name in declaration) +'+STRING sThisString (string to set in spin field control) +'Return (Error codes): +'+ 0 = Sucess +'+ 1 = Serious problem trying to set value +'+11 = Spin field is not visible +'+12 = Spin field is not enabled +'+99 = Unexpected error + + printlog "Setting value in spin field" + 'Check if desired spin field is visible + if NOT oThisSpinField.IsVisible then + qaErrorLog "Error 11: Spin field is not visible" + fSetSpinFieldByString = 11 + exit function + endif + 'Check if desired spin field is enabled + if NOT oThisSpinField.IsEnabled then + qaErrorLog "Error 12: Spin field is not enabled" + fSetSpinFieldByString = 12 + exit function + endif + 'Try to set value in spin field + try + oThisSpinField.setText sThisString + fSetSpinFieldByString = 0 + catch + 'Throw error 1 and quit on serious problem + qaErrorLog "Error 1: Setting value on spin field seems to cause a serious problem." + fSetSpinFieldByString = 1 + exit function + endcatch + if fSetSpinFieldByString = 99 then + warnlog "Error 99: Something unexpected happened!!" + endif +end function +' +'-------------------------------------------------------------------- +' +function fSetSpinFieldByButton ( oThisSpinField as OBJECT , sMoreOrLess as STRING , OPTIONAL iTimes as INTEGER ) as INTEGER + fSetSpinFieldByButton = 99 +'Function to set a spin field control by using More or Less button +'Input: +'+OBJECT oThisSpinField (spin field control name in declaration +'+STRING sMoreOrLess has to be <i>more</i> or <i>less</i> (to click on 'More' or 'Less' button in spin field) +'+<i>optional</i> INTEGER iTimes (How often to click if more than once) +'Return (Error codes): +'+ 0 = Sucess +'+ 1 = Serious problem trying to set value +'+11 = Spin field is not visible +'+12 = Spin field is not enabled +'+42 = User error, input doesn't match +'+99 = Unexpected error + + 'toggle spin field as least once + if isMissing ( iTimes ) then + iTimes = 1 + endif + printlog "Toggle value in spin field" + 'Check if desired spin field is visible + if NOT oThisSpinField.IsVisible then + qaErrorLog "Error 11: Spin field is not visible" + fSetSpinFieldByButton = 11 + exit function + endif + 'Check if desired spin field is enabled + if NOT oThisSpinField.IsEnabled then + qaErrorLog "Error 12: Spin field is not enabled" + fSetSpinFieldByButton = 12 + exit function + endif + 'Try to toggle value in spin field + try + select case lcase ( sMoreOrLess ) + case "more" : oThisSpinField.more ( iTimes ) + case "less" : oThisSpinField.less ( iTimes ) + case else + fSetSpinFieldByButton = 42 + warnlog "USER ERROR: Input doesn't match!" + exit function + end select + fSetSpinFieldByButton = 0 + catch + 'Throw error 1 and quit on serious problem + qaErrorLog "Error 1: Try to toggle spin field seems to cause a serious problem." + fSetSpinFieldByButton = 1 + exit function + endcatch + if fSetSpinFieldByButton = 99 then + warnlog "Error 99: Something unexpected happened!!" + endif +end function +' +'-------------------------------------------------------------------- +' +function fSetSpinFieldByLimit ( oThisSpinField as OBJECT , sMinOrMax as STRING ) as INTEGER + fSetSpinFieldByLimit = 99 +'Function to set a spin field control to minimum or maximum value +'Input: +'+OBJECT oThisSpinField (spin field name in declaration +'+STRING sMinOrMax has to be <i>min</i> or <i>max</i> (to set spin field to minimum or maximum value) +'Return (Error codes): +'+ 0 = Sucess +'+ 1 = Serious problem trying to set value +'+11 = Spin field is not visible +'+12 = Spin field is not enabled +'+42 = User error, input doesn't match +'+99 = Unexpected error + + printlog "Set spin field control to minimum or maximum value" + 'Check if desired spin field is visible + if NOT oThisSpinField.IsVisible then + qaErrorLog "Error 11: Spin field is not visible" + fSetSpinFieldByLimit = 11 + exit function + endif + 'Check if desired spin field is enabled + if NOT oThisSpinField.IsEnabled then + qaErrorLog "Error 12: spin field is not enabled" + fSetSpinFieldByLimit = 12 + exit function + endif + 'Try to set spin field to minimum or maximum value + try + select case lcase ( sMinOrMax ) + case "max" : oThisSpinField.toMax + case "min" : oThisSpinField.toMin + case else + fSetSpinFieldByLimit = 42 + warnlog "USER ERROR: Input doesn't match!" + exit function + end select + fSetSpinFieldByLimit = 0 + catch + 'Throw error 1 and quit on serious problem + qaErrorLog "Error 1: Trying to set spin field to minimum or maximum value seems to cause a serious problem." + fSetSpinFieldByLimit = 1 + exit function + endcatch + if fSetSpinFieldByLimit = 99 then + warnlog "Error 99: Something unexpected happened!!" + endif +end function +' +'-------------------------------------------------------------------- +' +function fSetComboBoxByItem ( oThisComboBox as OBJECT , iThisValue as INTEGER ) as INTEGER +'This is an alias for 'fSetListBoxByItem' + +'Function to select item in combo box +'Input: +'+OBJECT oThisComboBox (combo box name in declaration) +'+INTEGER iThisValue (item number to be selected in Combo box) +'Return (Error codes): +'+ 0 = Sucess +'+ 1 = Serious problem trying to set value +'+ 2 = Value was not set +'+11 = Combo box is not visible +'+12 = Combo box is not enabled +'+13 = Item number to be selected out of list range +'+99 = Unexpected error + fSetComboBoxByItem = fSetListBoxByItem ( oThisComboBox , iThisValue ) +end function +' +'-------------------------------------------------------------------- +' +function fSetComboBoxByString ( oThisComboBox as OBJECT , iThisString as STRING ) as INTEGER +'This is an alias for 'fSetListBoxByString' +'Function to select item in combo box +'Input: +'+OBJECT oThisComboBox (combo box name in declaration) +'+STRING iThisString (string to be selected in combo box control) +'Return (Error codes): +'+ 0 = Sucess +'+ 1 = Serious problem trying to set value +'+ 2 = Value was not set +'+11 = Combo box is not visible +'+12 = Combo box is not enabled +'+13 = String to be selected doesn't exist in list box +'+99 = Unexpected error + fSetComboBoxByString = fSetListBoxByString ( oThisComboBox , iThisString ) +end function +' +'-------------------------------------------------------------------- +' +function fSetComboBoxByText ( oThisComboBox as OBJECT , sThisText as STRING , OPTIONAL bVerifyAgainstEntries as BOOLEAN ) as INTEGER + fSetComboBoxByText = 99 +'Function to Edit Field part of a combo box +'Input: +'+OBJECT oThisComboBox (combo box name in declaration) +'+STRING sThisText (Text to be set in combo box edit field +'+<i>optional</i> BOOLEAN bVerifyAgainstEntries (Check if setting the text succeeded) +'Return (Error codes): +'+ 0 = Sucess +'+ 1 = Serious problem trying to set value +'+ 2 = Value was not set +'+11 = Combo box is not visible +'+12 = Combo box is not enabled +'+13 = String to be selected doesn't exist in list box (if <i>optional</i> input parameter has been used) +'+99 = Unexpected error + + dim iIndex as INTEGER + dim iListLength as INTEGER + dim bStringIsInList as BOOLEAN + dim sStringinUI as STRING + + bStringIsInList = FALSE + sStringinUI = "" + + 'Only check Edit Field against list box if 'bVerifyAgainstEntries' is explizitly TRUE + if isMissing ( bVerifyAgainstEntries ) then + bVerifyAgainstEntries = FALSE + endif + + printlog "Setting text in Combo Box Edit field" + 'Check if desired combo box is visible + if NOT oThisComboBox.IsVisible then + qaErrorLog "Error 11: Combo box is not visible" + fSetComboBoxByText = 11 + exit function + endif + 'Check if desired combo box is enabled + if NOT oThisComboBox.IsEnabled then + qaErrorLog "Error 12: Combo box is not enabled" + fSetComboBoxByText = 12 + exit function + endif + 'Check if input value is existent in list entries (optinal if desired) + if bVerifyAgainstEntries then + iListLength = oThisComboBox.GetItemCount + for iIndex = 1 to iListLength + if oThisComboBox.GetItemText ( iIndex ) = sThisText then + bStringIsInList = TRUE + endif + next iIndex + if bStringIsInList then + printlog "OK, string exists in list box control" + else + qaErrorLog "Error 13: Input string not found in list entries" + fSetComboBoxByText = 13 + exit function + endif + endif + 'Trying to set text on combo box + try + oThisComboBox.setText sThisText + catch + 'Throw error 1 and quit on serious problem + qaErrorLog "Error 1: Set text in combo box seems to cause a serious problem." + fSetComboBoxByText = 1 + exit function + endcatch + 'Verify (against input) if text was set correctly + sStringinUI = oThisComboBox.GetSelText + if sStringinUI = sThisText then + fSetComboBoxByText = 0 + printlog "Setting text in Combo box works" + else + qaErrorLog "Error 2: Set text in Combo box failed." + fSetComboBoxByText = 2 + endif + + if fSetComboBoxByText = 99 then + warnlog "Error 99: Something unexpected happened!!" + endif +end function +' +'-------------------------------------------------------------------- +' +function fSetCheckBox ( oThisCheckBox as OBJECT , bCheck as BOOLEAN ) as INTEGER + fSetCheckBox = 99 +'Function to (un)check a check box +'Input: +'+OBJECT oThisCheckBox (check box name in declaration) +'+BOOLEAN bCheck (check or uncheck the check box control) +'Return (Error codes): +'+ 0 = Sucess +'+ 1 = Serious problem trying to check the box +'+ 2 = Box was not checked +'+11 = Check box is not visible +'+12 = Check box is not enabled +'+99 = Unexpected error + + printlog "Checking check box" + 'Check if desired check box is visible + if NOT oThisCheckBox.IsVisible then + qaErrorLog "Error 11: Check box is not visible" + fSetCheckBox = 11 + exit function + endif + 'Check if desired check box is enabled + if NOT oThisCheckBox.IsEnabled then + qaErrorLog "Error 12: Check box is not enabled" + fSetCheckBox = 12 + exit function + endif + 'Try to check check box control + try + if bCheck then + oThisCheckBox.Check + else + oThisCheckBox.Uncheck + endif + catch + 'Throw error 1 and quit on serious problem + if bCheck then + qaErrorLog "Error 1: Checking check box control cause into a serious problem." + else + qaErrorLog "Error 1: Unchecking check box control cause into a serious problem." + endif + fSetCheckBox = 1 + exit function + endcatch + 'Verify (against input) if check box is checked + if oThisCheckBox.IsChecked = bCheck then + fSetCheckBox = 0 + printlog "Check check box seems to work" + else + qaErrorLog "Error 2: Check check box failed." + fSetCheckBox = 2 + endif + if fSetCheckBox = 99 then + warnlog "Error 99: Something unexpected happened!!" + endif +end function +' +'-------------------------------------------------------------------- +' +function fSetRadioButton ( oThisRadioButton as OBJECT ) as INTEGER + fSetRadioButton = 99 +'Function to check a radio button +'Input: +'+OBJECT oThisRadioButton (radio button name in declaration) +'Return (Error codes): +'+ 0 = Sucess +'+ 1 = Serious problem trying to check the radio button +'+ 2 = Radio button was not checked +'+11 = Radio button is not visible +'+12 := Radio button is not enabled +'+99 := Unexpected error + printlog "Checking radio button" + 'Check if desired radio button is visible + if NOT oThisRadioButton.IsVisible then + qaErrorLog "Error 11: Radio button is not visible" + fSetRadioButton = 11 + exit function + endif + 'Check if desired radio button is enabled + if NOT oThisRadioButton.IsEnabled then + qaErrorLog "Error 12: Radio button is not enabled" + fSetRadioButton = 12 + exit function + endif + 'Try to check Radio Button + try + oThisRadioButton.Check + catch + 'Throw error 1 and quit on serious problem + qaErrorLog "Error 1: Check radio button seems to cause a serious problem." + fSetRadioButton = 1 + exit function + endcatch + 'Verify if radio button is checked + if oThisRadioButton.IsChecked = TRUE then + fSetRadioButton = 0 + printlog "Check radio button seems to work" + else + qaErrorLog "Error 2: Check radio button failed." + fSetRadioButton = 2 + endif + if fSetRadioButton = 99 then + warnlog "Error 99: Something unexpected happened!!" + endif +end function + diff --git a/testautomation/global/tools/includes/optional/t_spreadsheet_tools1.inc b/testautomation/global/tools/includes/optional/t_spreadsheet_tools1.inc new file mode 100644 index 000000000000..55da2fc1c9aa --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_spreadsheet_tools1.inc @@ -0,0 +1,84 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/*********************************************************************** +'* +'* owner : oliver.craemer@oracle.com +'* +'* short description : Global tools for spreadsheet +'* +'************************************************************************ +'* +' #1 fGotoCell ' Set active cell in a spreadhseet to a defined cell adress +' +'* +'\*********************************************************************** + +function fGotoCell (sCelladdress as String) as integer +'/// The function sets the active cell in a spreadsheet to a defined cell address. +'/// Input: sCelladdress as String +'/// Output: <ul><li>0 = active cell has changed successfully</li> +'///+ <li>1 = active cell hasn't changed</li> + + Dim sActualPlace as string + + const CFN = "qa:qatesttool:global:tools:inc:t_spreadsheet_tools1.inc:fGotoCell: " + + 'function will return 1 if something goes wrong + fGotoCell = 1 + Kontext "RechenleisteCalc" + '/// If the spreadsheet <i>formula toolbar</i> isn't available make them + '/// + available with View / Toolbars / Formula Bar + if NOT RechenleisteCalc.Exists(1) then + ViewToolbarsFormulaBar + end if + try + Kontext "RechenleisteCalc" + sActualPlace = AktiverZellbereich.GetSelText + if UCase(sActualPlace) = UCase(sCelladdress) then + fGotocell = 0 + exit function + else + sActualPlace = "" + '/// Type the cell address into the <i>name box</i> + AktiverZellbereich.SetText sCelladdress + '///+ and press RETURN + AktiverZellbereich.TypeKeys "<RETURN>" + sleep(1) + '/// If the <i>name box<i>' address has been changed to the expected + '///+ cell address the function was successfull. + sActualPlace = AktiverZellbereich.GetSelText + if UCase(sActualPlace) = UCase(sCelladdress) then + fGotocell = 0 + else + warnlog CFN & "The cell address has not been changed!" + end if + end if + catch + warnlog CFN & "Something unexpected happened! The cell address has not been changed!" + fGotocell = 1 + endcatch +end function + diff --git a/testautomation/global/tools/includes/optional/t_stringtools.inc b/testautomation/global/tools/includes/optional/t_stringtools.inc new file mode 100755 index 000000000000..7f946fd3b046 --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_stringtools.inc @@ -0,0 +1,355 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : joerg.skottke@oracle.com +'* +'* short description : Functions for manipulation of strings +'* +'\****************************************************************************** + +function hRemoveLineBreaks( cString as string ) as string + + dim myString as string : myString = cString + myString = hStringReplaceChar( myString, CHR$(09), " " ) + myString = hStringReplaceChar( myString, CHR$(13), " " ) + myString = hStringReplaceChar( myString, CHR$(10), "" ) + hRemoveLineBreaks() = myString + +end function + +'******************************************************************************* + +function hCompareSubStrings( cRef as string, cSub as string ) as integer + + '///<h3>Find substring in a reference string</h3> + '///<i>Used to determine that we are on "The first doc!"</i><br><br> + '///<u>Parameter(s):</u> + '///<ol> + '///+<li>Term to search for (string)</li> + '///+<li>Term to be searched (string)</li> + '///</ol> + '///<u>Returns</u>: + '///<ol> + '///+<li>Errorcode (integer)</li> + '///<ul> + '///+<li>-1: Invalid parameter(s)</li> + '///+<li>0: Strings do not match</li> + '///+<li>1: Term is exact match</li> + '///+<li>2: Term is a substring</li> + '///</ul> + '///</ol> + '///<u>Description</u>: + '///<ul> + + const CFN = "hCompareSubStrings::" + const RETVAL_INVALID_PARAMETER = -1 + const RETVAL_MATCH_NONE = 0 + const RETVAL_MATCH_EXACT = 1 + const RETVAL_MATCH_SUBSTRING = 2 + + '///+<li>Test function parameters</li> + if ( ( cRef = "" ) or ( cSub = "" ) ) then + warnlog( CFN & "invalid parameter(s): Empty string passed." ) + hCompareSubStrings() = RETVAL_INVALID_PARAMETER + exit function + endif + + dim irc as integer + + '///+<li>Test if we have a substring</li> + if ( instr( cRef, cSub ) ) then + irc = RETVAL_MATCH_SUBSTRING + else + irc = RETVAL_MATCH_NONE + endif + + '///+<li>Test if we have an exact match</li> + if ( irc = RETVAL_MATCH_SUBSTRING ) then + if ( ( cRef = cSub ) and ( len( cRef ) = len( cSub ) ) ) then + irc = RETVAL_MATCH_EXACT + endif + endif + + if ( GVERBOSE ) then + select case irc + case RETVAL_MATCH_NONE : printlog( CFN & "No matching substring found" ) + case RETVAL_MATCH_EXACT : printlog( CFN & "Strings are identical" ) + case RETVAL_MATCH_SUBSTRING : printlog( CFN & "String is substring" ) + end select + endif + + hCompareSubStrings() = irc + '///</ul> + +end function + +'****************************************************************************** + +function hGetDirTreeLevel( cFullPath as string ) as integer + + '///<h3>Count the numbers of pathseparators in a path-string</h3> + '///<i>Used to find the level of current directory within the directory tree.<br> + '///+The function prints a warning when no pathseparators were found</i><br><br> + '///<u>Parameter(s):</u> + '///<ol> + '///+<li>Path (string) with <b>no trailing pathseparator</b></li> + '///</ol> + '///<u>Returns</u>: + '///<ol> + '///+<li>Number of Pathseparators within the string (integer)</li> + '///<ul> + '///+<li>0 = failure</li> + '///+<li>> 0 = level</li> + '///</ul> + '///</ol> + '///<u>Description</u>: + '///<ul> + + const CFN = "hGetDirTreeLevel::" + + dim iCurrentChar as integer + dim cCurrentChar as string + dim iSeparatorCount as integer : iSeparatorCount = 0 + + '///+<li>Walk through the string</li> + '///<ul> + for iCurrentChar = 1 to len( cFullPath ) + + '///+<li>Get the next character</li> + cCurrentChar = mid( cFullPath , iCurrentChar , 1 ) + + '///+<li>If it is a separtator, increase the counter</li> + if ( cCurrentChar = gPathSigne ) then iSeparatorCount = iSeparatorCount + 1 + + next iCurrentChar + '///</ul> + + '///+<li>Print a warning if no separators were found</li> + if ( iSeparatorCount = 0 ) then + warnlog( CFN & "Did not find any separators in given string: " & cFullPath ) + endif + '///</ul> + + hGetDirTreeLevel() = iSeparatorCount + +end function + + +'******************************************************************************* + +function hGetStringFromStaticTextField( oControl as object ) as string + + use "global\tools\includes\optional\t_accels.inc" + + '///<h3>Get the string from a static textfield</h3> + + '///<i>Static textfields like those in the document properties dialog are + '///+ in certain places designed in a way that the string can be selected + '///+ and copied to the clipboard. This has been introduced with SRC680m212 + '///+ (9156). This function uses keyboard shortcuts for "Select All" + '///+ and "Copy" to get the string into the clipboard as .uno.Copy + '///+ is not enabled.</i><br><br> + + '///<u>Parameter(s):</u><br> + '///<ol> + + '///+<li>Name of the control (Object)</li> + '///<ul> + '///+<li>The object must exist in the current context</li> + '///</ul> + + '///</ol> + + + '///<u>Returns:</u><br> + '///<ol> + '///+<li>Content of the field (String)</li> + '///<ul> + '///+<li>Blank if string is empty</li> + '///</ul> + '///</ol> + + const CFN = "hGetStringFromStaticTextField::" + dim brc as boolean 'a multi purpose boolean returnvalue + + dim cSelectAll as string + dim cCopy as string + dim cText as string + + if ( GVERBOSE ) then printlog( CFN & "Enter" ) + + '///<u>Description:</u> + '///<ul> + '///+<li>Verify that the object exists</li> + '///+<li>Get the accelerator for SelectAll and Copy</li> + '///+<li>Execute SelectAll and Copy on control</li> + '///+<li>Get the string from the clipboard</li> + if ( oControl.exists() ) then + if ( oControl.isVisible() ) then + cSelectAll = hGetAccel( "SelectAll" ) + cCopy = hGetAccel( "Copy" ) + + oControl.typeKeys( "<right>" ) + oControl.typeKeys( cSelectAll ) + oControl.typeKeys( cCopy ) + + cText = getClipboardText() + if ( GVERBOSE ) then printlog( CFN & "Exit with result: " & cText ) + else + ctext = "" + warnlog( CFN & "Exit: Control exists but is not visible" ) + endif + else + cText = "" + warnlog( CFN & "Exit: Control does not exist in this context" ) + endif + + '///</ul> + + hGetStringFromStaticTextField() = cText + +end function + + +'******************************************************************************* + +function hConvertStringToLong( cValue as string ) as long + + + '///<h3>Convert a stringvalue to long int</h3> + + '///<i>The purpose of this function is to isolate the filesize from a string + '///+ of the type "1.345 Bytes" by removing the thousands-separator + '///+ and the trailing unit. The result is then a filesize as long integer + '///+ which then can be compared to the result from the BASIC function + '///+ FileLen( FileSpec )</i><br><br> + + '///<u>Parameter(s):</u><br> + '///<ol> + + '///+<li>String containing a long integer value (String)</li> + '///<ul> + '///+<li>No floating point values allowed</li> + '///+<li>Numeric value must be at the beginning of the string (no leading characters/spaces)</li> + '///+<li>Negative values are allowed</li> + '///+<li>Leading "+" is not allowed</li> + '///</ul> + + '///</ol> + + + '///<u>Returns:</u><br> + '///<ol> + '///+<li>Value of the string as long integer (Long)</li> + '///<ul> + '///+<li>Thousands separator (. or ,) have been removed</li> + '///+<li>Decimal separators (though not allowed) have been removed</li> + '///</ul> + '///</ol> + + const CFN = "hConvertStringToLong::" + const ONE_CHARACTER = 1 + + if ( GVERBOSE ) then printlog( CFN & "Enter with option: " & cValue ) + + dim iLen as integer : iLen = len( cValue ) + + dim iChar as integer + dim cChar as string + + dim cStringValue as string : cStringValue = "" + + '///<u>Description:</u> + '///<ul> + '///+<li>Walk through the single chars of the string</li> + '///<ul> + for iChar = 1 to iLen + + '///+<li>Get the current character</li> + cChar = mid( cValue , iChar , ONE_CHARACTER ) + + '///+<li>Copy valid characters to temporary string, drop invalid, exit on first space or other character</li> + select case cChar + case "-" : cStringValue = cStringValue & cChar + case "1" : cStringValue = cStringValue & cChar + case "2" : cStringValue = cStringValue & cChar + case "3" : cStringValue = cStringValue & cChar + case "4" : cStringValue = cStringValue & cChar + case "5" : cStringValue = cStringValue & cChar + case "6" : cStringValue = cStringValue & cChar + case "7" : cStringValue = cStringValue & cChar + case "8" : cStringValue = cStringValue & cChar + case "9" : cStringValue = cStringValue & cChar + case "0" : cStringValue = cStringValue & cChar + case else: ' do nothing + end select + + next iChar + '///</ul> + + if ( GVERBOSE ) then printlog( CFN & "Exit with value: " & cStringValue ) + + '///+<li>Convert string to long integer and return to calling function</li> + hConvertStringToLong() = val( cStringValue ) + '///</ul> + +end function + +'******************************************************************************* + +function hStringReplace( cString as string, search_string as string, replace_with as string ) as string + + const CFN = "hStringReplace(): " + + dim search_string_position as string + dim search_string_found as boolean : search_string_found = true + dim len_search_string as integer : len_search_string = len( search_string ) + dim len_replace_with as integer : len_replace_with = len( replace_with ) + dim myString as string : myString = cString + + if ( GVERBOSE ) then printlog( CFN & "Replace all <" & search_string & "> with <" & replace_with & "> in <" & myString & ">" ) + + if ( not instr( replace_with, search_string ) and len_search_string >= len_replace_with ) then + do while( search_string_found ) + search_string_position = instr( myString, search_string ) + if ( search_string_position > 0 ) then + mid( myString, search_string_position, len( search_string ), replace_with ) + else + search_string_found = false + endif + loop + else + warnlog( CFN & "Function used incorrectly" ) + warnlog( CFN & "Replace all <" & search_string & "> with <" & replace_with & "> in <" & myString & ">" ) + warnlog( CFN & "The new string must be of equal length or shorter than the string to be replaced" ) + warnlog( CFN & "The new string may not contain the string to be replaced (e.g. replace 'a' with 'ha' is not allowed)" ) + endif + + if ( GVERBOSE ) then printlog( CFN & "Return string is <" & myString & ">" ) + hStringReplace() = myString + +end function diff --git a/testautomation/global/tools/includes/optional/t_toolbar_tools1.inc b/testautomation/global/tools/includes/optional/t_toolbar_tools1.inc new file mode 100644 index 000000000000..77c72a9ec2dc --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_toolbar_tools1.inc @@ -0,0 +1,418 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : helge.delfs@oracle.com +'* +'* short description : Toolbar tools 1 +'* +'*************************************************************************************** +'* +' #1 fActiveObjectInToolbar ' active/inactive image button in toolbar +'* +'\************************************************************************************* + +'****************************************************************** +'* Created by hercule.li@oracle.com +'* This function will active or inactive image button in toolbar +'* sToolbar : Toolbar name +'* sObject : image button name +'* bActive : Active or Inactive image button +'* TRUE --> Active +'* FALSE --> Inactive +'* Will return the original status of the image button +'***************************************************************** +function fActiveObjectInToolbar(sToolbar as String , sObject as String , bActive as Boolean) as Boolean + + Dim iObject as Integer + Dim sToolbarName as String + Dim sFlag as Boolean + + sToolbarName = fGetToolbarName(sToolbar) + iObject = fGetObject(sToolbar , sObject) + + ToolsCustomize + sleep 3 + Kontext + Active.SetPage TabCustomizeToolbars + Kontext "TabCustomizeToolbars" + Menu.Select sToolbarName + Sleep 1 + ToolbarContents.Typekeys "<Home>" + Sleep 1 + if iObject-1 > 0 then + ToolbarContents.Typekeys "<Down>" , iObject-1 + endif + sFlag = ToolbarContents.IsChecked + if bActive = TRUE then + if sFlag = FALSE then ToolbarContents.Check + else + ToolbarContents.UnCheck + endif + TabCustomizeToolbars.OK + fActiveObjectInToolbar = sFlag + +end function + + +'****************************************** +'* This function will Get toolbar's name ** +'* Return Toolbar's name in StarOffice ** +'****************************************** +function fGetToolbarName(sToolbar) as String + + Select case sToolbar + case "3D-Settings" : + Select case iSprache + case 01 : fGetToolbarName = "3D-Settings" + case 33 : fGetToolbarName = "3D-Settings" + case 34 : fGetToolbarName = "3D-Settings" + case 39 : fGetToolbarName = "3D-Settings" + case 46 : fGetToolbarName = "3D-Settings" + case 49 : fGetToolbarName = "3D-Einstellungen" + case 50 : fGetToolbarName = "Nastavitve 3D" + case 55 : fGetToolbarName = "3D-Settings" + case 81 : fGetToolbarName = "3D-Settings" + case 82 : fGetToolbarName = "3D-Settings" + case 86 : fGetToolbarName = "3D-Settings" + case 88 : fGetToolbarName = "3D-Settings" + case else : QAErrorLog "The test does not support the language " + iSprache + fGetToolbarName = "3D-Settings" + end select + + case "Align" : + Select case iSprache + case 01 : fGetToolbarName = "Align" + case 33 : fGetToolbarName = "Align" + case 34 : fGetToolbarName = "Align" + case 39 : fGetToolbarName = "Align" + case 46 : fGetToolbarName = "Align" + case 49 : fGetToolbarName = "Ausrichten" + case 50 : fGetToolbarName = "Poravnava" + case 55 : fGetToolbarName = "Align" + case 81 : fGetToolbarName = "Align" + case 82 : fGetToolbarName = "Align" + case 86 : fGetToolbarName = "Align" + case 88 : fGetToolbarName = "Align" + case else : QAErrorLog "The test does not support the language " + iSprache + fGetToolbarName = "Align" + end select + + case "Basic Shapes" : + Select case iSprache + case 01 : fGetToolbarName = "Basic Shapes" + case 33 : fGetToolbarName = "Basic Shapes" + case 34 : fGetToolbarName = "Basic Shapes" + case 39 : fGetToolbarName = "Basic Shapes" + case 46 : fGetToolbarName = "Basic Shapes" + case 49 : fGetToolbarName = "Standardformen" + case 50 : fGetToolbarName = "Osnovni liki" + case 55 : fGetToolbarName = "Basic Shapes" + case 81 : fGetToolbarName = "Basic Shapes" + case 82 : fGetToolbarName = "Basic Shapes" + case 86 : fGetToolbarName = "Basic Shapes" + case 88 : fGetToolbarName = "Basic Shapes" + case else : QAErrorLog "The test does not support the language " + iSprache + fGetToolbarName = "Basic Shapes" + end select + + case "Block Arrows" : + Select case iSprache + case 01 : fGetToolbarName = "Block Arrows" + case 33 : fGetToolbarName = "Block Arrows" + case 34 : fGetToolbarName = "Block Arrows" + case 39 : fGetToolbarName = "Block Arrows" + case 46 : fGetToolbarName = "Block Arrows" + case 49 : fGetToolbarName = "Blockpfeile" + case 50 : fGetToolbarName = "Votle puščice" + case 55 : fGetToolbarName = "Block Arrows" + case 81 : fGetToolbarName = "Block Arrows" + case 82 : fGetToolbarName = "Block Arrows" + case 86 : fGetToolbarName = "Block Arrows" + case 88 : fGetToolbarName = "Block Arrows" + case else : QAErrorLog "The test does not support the language " + iSprache + fGetToolbarName = "Block Arrows" + end select + + case "Bullets and Numbering" : + Select case iSprache + case 01 : fGetToolbarName = "Bullets and Numbering" + case 33 : fGetToolbarName = "Bullets and Numbering" + case 34 : fGetToolbarName = "Bullets and Numbering" + case 39 : fGetToolbarName = "Bullets and Numbering" + case 46 : fGetToolbarName = "Bullets and Numbering" + case 49 : fGetToolbarName = "Nummerierung und Aufzählungszeichen" + case 50 : fGetToolbarName = "Oznake in oštevilčevanje" + case 55 : fGetToolbarName = "Bullets and Numbering" + case 81 : fGetToolbarName = "Bullets and Numbering" + case 82 : fGetToolbarName = "Bullets and Numbering" + case 86 : fGetToolbarName = "Bullets and Numbering" + case 88 : fGetToolbarName = "Bullets and Numbering" + case else : QAErrorLog "The test does not support the language " + iSprache + fGetToolbarName = "Bullets and Numbering" + end select + + case "Database Form Design" : + Select case iSprache + case 01 : fGetToolbarName = "Database Form Design" + case 33 : fGetToolbarName = "Database Form Design" + case 34 : fGetToolbarName = "Database Form Design" + case 39 : fGetToolbarName = "Database Form Design" + case 46 : fGetToolbarName = "Database Form Design" + case 49 : fGetToolbarName = "Datenbank Formularentwurf" + case 50 : fGetToolbarName = "Oblikovanje obrazca zbirke podatkov" + case 55 : fGetToolbarName = "Database Form Design" + case 81 : fGetToolbarName = "Database Form Design" + case 82 : fGetToolbarName = "Database Form Design" + case 86 : fGetToolbarName = "Database Form Design" + case 88 : fGetToolbarName = "Database Form Design" + case else : QAErrorLog "The test does not support the language " + iSprache + fGetToolbarName = "Database Form Design" + end select + + case "Drawing" : + Select case iSprache + case 01 : fGetToolbarName = "Drawing" + case 33 : fGetToolbarName = "Drawing" + case 34 : fGetToolbarName = "Drawing" + case 39 : fGetToolbarName = "Drawing" + case 46 : fGetToolbarName = "Drawing" + case 49 : fGetToolbarName = "Zeichnen" + case 50 : fGetToolbarName = "Risba" + case 55 : fGetToolbarName = "Drawing" + case 81 : fGetToolbarName = "Drawing" + case 82 : fGetToolbarName = "Drawing" + case 86 : fGetToolbarName = "Drawing" + case 88 : fGetToolbarName = "Drawing" + case else : QAErrorLog "The test does not support the language " + iSprache + fGetToolbarName = "Drawing" + end select + + case "Drawing Object Properties" : + Select case iSprache + case 01 : fGetToolbarName = "Drawing Object Properties" + case 33 : fGetToolbarName = "Drawing Object Properties" + case 34 : fGetToolbarName = "Drawing Object Properties" + case 39 : fGetToolbarName = "Drawing Object Properties" + case 46 : fGetToolbarName = "Drawing Object Properties" + case 49 : fGetToolbarName = "Zeichnungsobjekt-Eigenschaften" + case 50 : fGetToolbarName = "Lastnosti risanega predmeta" + case 55 : fGetToolbarName = "Drawing Object Properties" + case 81 : fGetToolbarName = "Drawing Object Properties" + case 82 : fGetToolbarName = "Drawing Object Properties" + case 86 : fGetToolbarName = "Drawing Object Properties" + case 88 : fGetToolbarName = "Drawing Object Properties" + case else : QAErrorLog "The test does not support the language " + iSprache + fGetToolbarName = "Drawing Object Properties" + end select + + case "Form Design" : + Select case iSprache + case 01 : fGetToolbarName = "Form Design" + case 33 : fGetToolbarName = "Form Design" + case 34 : fGetToolbarName = "Form Design" + case 39 : fGetToolbarName = "Form Design" + case 46 : fGetToolbarName = "Form Design" + case 49 : fGetToolbarName = "Formular Entwurf" + case 50 : fGetToolbarName = "Oblikovanje obrazca" + case 55 : fGetToolbarName = "Form Design" + case 81 : fGetToolbarName = "Form Design" + case 82 : fGetToolbarName = "Form Design" + case 86 : fGetToolbarName = "Form Design" + case 88 : fGetToolbarName = "Form Design" + case else : QAErrorLog "The test does not support the language " + iSprache + fGetToolbarName = "Form Design" + end select + + case "Formatting" : + Select case iSprache + case 01 : fGetToolbarName = "Formatting" + case 33 : fGetToolbarName = "Formatting" + case 34 : fGetToolbarName = "Formatting" + case 39 : fGetToolbarName = "Formatting" + case 46 : fGetToolbarName = "Formatting" + case 49 : fGetToolbarName = "Format" + case 50 : fGetToolbarName = "Oblikovanje" + case 55 : fGetToolbarName = "Formatting" + case 81 : fGetToolbarName = "Formatting" + case 82 : fGetToolbarName = "Formatting" + case 86 : fGetToolbarName = "Formatting" + case 88 : fGetToolbarName = "Formatting" + case else : QAErrorLog "The test does not support the language " + iSprache + fGetToolbarName = "Formatting" + end select + + case "Frame" : + Select case iSprache + case 01 : fGetToolbarName = "Frame" + case 33 : fGetToolbarName = "Frame" + case 34 : fGetToolbarName = "Frame" + case 39 : fGetToolbarName = "Frame" + case 46 : fGetToolbarName = "Frame" + case 49 : fGetToolbarName = "Rahmen" + case 50 : fGetToolbarName = "Okvir" + case 55 : fGetToolbarName = "Frame" + case 81 : fGetToolbarName = "Frame" + case 82 : fGetToolbarName = "Frame" + case 86 : fGetToolbarName = "Frame" + case 88 : fGetToolbarName = "Frame" + case else : QAErrorLog "The test does not support the language " + iSprache + fGetToolbarName = "Frame" + end select + + case "Insert" : + Select case iSprache + case 01 : fGetToolbarName = "Insert" + case 33 : fGetToolbarName = "Insert" + case 34 : fGetToolbarName = "Insert" + case 39 : fGetToolbarName = "Insert" + case 46 : fGetToolbarName = "Insert" + case 49 : fGetToolbarName = "Einfügen" + case 50 : fGetToolbarName = "Vstavi" + case 55 : fGetToolbarName = "Insert" + case 81 : fGetToolbarName = "Insert" + case 82 : fGetToolbarName = "Insert" + case 86 : fGetToolbarName = "Insert" + case 88 : fGetToolbarName = "Insert" + case else : QAErrorLog "The test does not support the language " + iSprache + fGetToolbarName = "Insert" + end select + + case "OLE-Object" : + Select case iSprache + case 01 : fGetToolbarName = "OLE-Object" + case 33 : fGetToolbarName = "OLE-Object" + case 34 : fGetToolbarName = "OLE-Object" + case 39 : fGetToolbarName = "OLE-Object" + case 46 : fGetToolbarName = "OLE-Object" + case 49 : fGetToolbarName = "OLE Objekt" + case 50 : fGetToolbarName = "Predmet OLE" + case 55 : fGetToolbarName = "OLE-Object" + case 81 : fGetToolbarName = "OLE-Object" + case 82 : fGetToolbarName = "OLE-Object" + case 86 : fGetToolbarName = "OLE-Object" + case 88 : fGetToolbarName = "OLE-Object" + case else : QAErrorLog "The test does not support the language " + iSprache + fGetToolbarName = "OLE-Object" + end select + + case "Standard" : + Select case iSprache + case 01 : fGetToolbarName = "Standard" + case 33 : fGetToolbarName = "Standard" + case 34 : fGetToolbarName = "Standard" + case 39 : fGetToolbarName = "Standard" + case 46 : fGetToolbarName = "Standard" + case 49 : fGetToolbarName = "Standard" + case 50 : fGetToolbarName = "Standardno" + case 55 : fGetToolbarName = "Standard" + case 81 : fGetToolbarName = "Standard" + case 82 : fGetToolbarName = "Standard" + case 86 : fGetToolbarName = "Standard" + case 88 : fGetToolbarName = "Standard" + case else : QAErrorLog "The test does not support the language " + iSprache + fGetToolbarName = "Standard" + end select + + case "Table" : + Select case iSprache + case 01 : fGetToolbarName = "Table" + case 33 : fGetToolbarName = "Table" + case 34 : fGetToolbarName = "Table" + case 39 : fGetToolbarName = "Table" + case 46 : fGetToolbarName = "Table" + case 49 : fGetToolbarName = "Tabelle" + case 50 : fGetToolbarName = "Tabela" + case 55 : fGetToolbarName = "Table" + case 81 : fGetToolbarName = "Table" + case 82 : fGetToolbarName = "Table" + case 86 : fGetToolbarName = "Table" + case 88 : fGetToolbarName = "Table" + case else : QAErrorLog "The test does not support the language " + iSprache + fGetToolbarName = "Table" + end select + + case "Text Object" : + Select case iSprache + case 01 : fGetToolbarName = "Text Object" + case 33 : fGetToolbarName = "Text Object" + case 34 : fGetToolbarName = "Text Object" + case 39 : fGetToolbarName = "Text Object" + case 46 : fGetToolbarName = "Text Object" + case 49 : fGetToolbarName = "Textobjekt" + case 50 : fGetToolbarName = "Besedilni predmet" + case 55 : fGetToolbarName = "Text Object" + case 81 : fGetToolbarName = "Text Object" + case 82 : fGetToolbarName = "Text Object" + case 86 : fGetToolbarName = "Text Object" + case 88 : fGetToolbarName = "Text Object" + case else : QAErrorLog "The test does not support the language " + iSprache + fGetToolbarName = "Text Object" + end select + + case "XML Form Design" : + Select case iSprache + case 01 : fGetToolbarName = "XML Form Design" + case 33 : fGetToolbarName = "XML Form Design" + case 34 : fGetToolbarName = "XML Form Design" + case 39 : fGetToolbarName = "XML Form Design" + case 46 : fGetToolbarName = "XML Form Design" + case 49 : fGetToolbarName = "XML Formularentwurf" + case 50 : fGetToolbarName = "Oblikovanje obrazca XML" + case 55 : fGetToolbarName = "XML Form Design" + case 81 : fGetToolbarName = "XML Form Design" + case 82 : fGetToolbarName = "XML Form Design" + case 86 : fGetToolbarName = "XML Form Design" + case 88 : fGetToolbarName = "XML Form Design" + case else : QAErrorLog "The test does not support the language " + iSprache + fGetToolbarName = "XML Form Design" + end select + + end select + +end function + +'******************************************************* +'* This function will get the location for image button +'* in Commands in Tools/Customize/Toolbars +'******************************************************* +function fGetObject(sToolbar as String , sObject as String) as Integer + + select case gApplication + + case "WRITER" : fGetObject = fGetObjectWriter(sToolbar , sObject) + case "HTML" : fGetObject = fGetObjectWriter(sToolbar , sObject) + case "MASTERDOCUMENT" : fGetObject = fGetObjectWriter(sToolbar , sObject) + + case "CALC" : fGetObject = fGetObjectCalc(sToolbar , sObject) + + case "IMPRESS" : fGetObject = fGetObjectImpress(sToolbar , sObject) + + end select + +end function + + diff --git a/testautomation/global/tools/includes/optional/t_toolbar_writer.inc b/testautomation/global/tools/includes/optional/t_toolbar_writer.inc new file mode 100644 index 000000000000..892dbd09bb36 --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_toolbar_writer.inc @@ -0,0 +1,766 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : helge.delfs@oracle.com +'* +'* short description : Toolbar tools - Writer +'* +'*************************************************************************************** +'* +' #0 fGetObjectWriter +' #0 fGetObjectCalc +'* +'\************************************************************************************* + +'******************************************************* +'* This function will get the location for image button +'* in Commands in Tools/Customize/Toolbars from Writer +'******************************************************* +function fGetObjectWriter(sToolbar as String , sObject as String) as Integer + + Select case sToolbar + case "3D-Settings" + Select case sObject + case "Extrusion On/Off" : fGetObjectWriter = 1 + '----------------- 2 + case "Tilt Down" : fGetObjectWriter = 3 + case "Tilt Up" : fGetObjectWriter = 4 + case "Tilt Left" : fGetObjectWriter = 5 + case "Tilt Right" : fGetObjectWriter = 6 + '----------------- 7 + case "Depth" : fGetObjectWriter = 8 + case "Direction" : fGetObjectWriter = 9 + case "Lighting" : fGetObjectWriter = 10 + case "Surfact" : fGetObjectWriter = 11 + case "3D Color" : fGetObjectWriter = 12 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectWriter = 0 + end select + + case "Align" + Select case sObject + case "Left" : fGetObjectWriter = 1 + case "Centered" : fGetObjectWriter = 2 + case "Right" : fGetObjectWriter = 3 + case "Top" : fGetObjectWriter = 4 + case "Center" : fGetObjectWriter = 5 + case "Bottom" : fGetObjectWriter = 6 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectWriter = 0 + end select + + case "Basic Shapes" + Select case sObject + case "Rectangle" : fGetObjectWriter = 1 + case "Rectangle,Rounded" : fGetObjectWriter = 2 + case "Square" : fGetObjectWriter = 3 + case "Square,Rounded" : fGetObjectWriter = 4 + case "Circle" : fGetObjectWriter = 5 + case "Ellipse" : fGetObjectWriter = 6 + '----------------- 7 + case "Circle Pie" : fGetObjectWriter = 8 + case "Isosceles Triangle" : fGetObjectWriter = 9 + case "Right Triangle" : fGetObjectWriter = 10 + case "Trapezoid" : fGetObjectWriter = 11 + case "Diamond" : fGetObjectWriter = 12 + case "Parallelogram" : fGetObjectWriter = 13 + '----------------- 14 + case "Regular Pentagon" : fGetObjectWriter = 15 + case "Hexagon" : fGetObjectWriter = 16 + case "Octagon" : fGetObjectWriter = 17 + case "Cross" : fGetObjectWriter = 18 + case "Ring" : fGetObjectWriter = 19 + case "Block Arc" : fGetObjectWriter = 20 + '----------------- 21 + case "Cylinder" : fGetObjectWriter = 22 + case "Cube" : fGetObjectWriter = 23 + case "Rolded Corner" : fGetObjectWriter = 24 + case "Rrame" : fGetObjectWriter = 25 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectWriter = 0 + end select + + case "Block Arrows" + Select case sObject + end select + + case "Bullets and Numbering" + Select case sObject + end select + + case "Callouts" + Select case sObject + case "Rectanguar Callout" : fGetObjectWriter = 1 + case "Rounded Rectanguar Callout" : fGetObjectWriter = 2 + case "Round Callout" : fGetObjectWriter = 3 + case "Cloud" : fGetObjectWriter = 4 + case "Line Callout 1" : fGetObjectWriter = 5 + case "Line Callout 2" : fGetObjectWriter = 6 + case "Line Callout 3" : fGetObjectWriter = 7 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectWriter = 0 + end select + + case "Color" + Select case sObject + case "Red" : fGetObjectWriter = 1 + '----------------- 2 + case "Green" : fGetObjectWriter = 3 + '----------------- 4 + case "Blue" : fGetObjectWriter = 5 + '----------------- 6 + case "Brightness" : fGetObjectWriter = 7 + '----------------- 8 + case "Contrast" : fGetObjectWriter = 9 + '----------------- 10 + case "Gamma" : fGetObjectWriter = 11 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectWriter = 0 + end select + + case "Controls" + Select case sObject + end select + + case "Database Controls" + Select case sObject + end select + + case "Database Form Design" + Select case sObject + case "Change Anchor" : fGetObjectWriter = 12 + case "Bring To Front" : fGetObjectWriter = 13 + case "Send To Back" : fGetObjectWriter = 14 + case "Group" : fGetObjectWriter = 15 + case "UnGroup" : fGetObjectWriter = 18 + case "Enter Group" : fGetObjectWriter = 19 + case "Exit Group" : fGetObjectWriter = 20 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectWriter = 0 + end select + + case "Drawing" + Select case sObject + case "Select" : fGetObjectWriter = 1 + '----------------- 2 + case "Line" : fGetObjectWriter = 3 + case "Rectangle" : fGetObjectWriter = 4 + case "Ellipse" : fGetObjectWriter = 5 + case "Polygon" : fGetObjectWriter = 6 + case "Curve" : fGetObjectWriter = 7 + case "Freeform Line" : fGetObjectWriter = 8 + case "Arc" : fGetObjectWriter = 9 + case "Ellipse Pie" : fGetObjectWriter = 10 + case "Circle Segment" : fGetObjectWriter = 11 + case "Text" : fGetObjectWriter = 12 + case "Vertical Text" : fGetObjectWriter = 13 + case "Text Animation" : fGetObjectWriter = 14 + case "Callouts" : fGetObjectWriter = 13 + case "Vertical Callouts" : fGetObjectWriter = 14 + '----------------- 15 + case "Basic Shapes" : fGetObjectWriter = 16 + case "Symbol Shapes" : fGetObjectWriter = 17 + case "Block Arrows" : fGetObjectWriter = 18 + case "Flowcharts" : fGetObjectWriter = 19 + case "Callouts2" : fGetObjectWriter = 20 + case "Stars" : fGetObjectWriter = 21 + '----------------- 22 + case "Points" : fGetObjectWriter = 23 + '----------------- 24 + case "Fontwork Gallery" : fGetObjectWriter = 25 + case "Insert Graphics" : fGetObjectWriter = 26 + '----------------- 27 + case "Extrusion On/Off" : fGetObjectWriter = 28 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectWriter = 0 + end select + + case "Drawing Object Properties" + Select case sObject + case "Line" : fGetObjectWriter = 1 + case "Arrow Style" : fGetObjectWriter = 2 + '----------------- 3 + case "Line Style" : fGetObjectWriter = 4 + '----------------- 5 + case "Line Width" : fGetObjectWriter = 6 + '----------------- 7 + case "Line Color" : fGetObjectWriter = 8 + '----------------- 9 + case "Area" : fGetObjectWriter = 10 + '----------------- 11 + case "Area Style/Filling" : fGetObjectWriter = 12 + '----------------- 13 + case "Object rotation mode" : fGetObjectWriter = 14 + case "Display Grid" : fGetObjectWriter = 15 + case "Snap to Grid" : fGetObjectWriter = 16 + case "Guides When Moving" : fGetObjectWriter = 17 + '----------------- 18 + case "Wrap Off" : fGetObjectWriter = 19 + case "Page Wrap" : fGetObjectWriter = 20 + case "Optimal Page Wrap" : fGetObjectWriter = 21 + case "Wrap Left" : fGetObjectWriter = 22 + case "Wrap Right" : fGetObjectWriter = 23 + case "Wrap Through" : fGetObjectWriter = 24 + case "Contour" : fGetObjectWriter = 25 + '----------------- 26 + case "To Foreground" : fGetObjectWriter = 27 + case "To Background" : fGetObjectWriter = 28 + case "Bring to Front" : fGetObjectWriter = 29 + case "Send to Back" : fGetObjectWriter = 30 + case "Alignment" : fGetObjectWriter = 31 + '----------------- 32 + case "Change Anchor" : fGetObjectWriter = 33 + '----------------- 34 + case "Ungroup" : fGetObjectWriter = 35 + case "Group" : fGetObjectWriter = 36 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectWriter = 0 + end select + + case "Edit Points" + Select case sObject + end select + + case "Flowchart" + Select case sObject + end select + + case "Fontwork" + Select case sObject + case "Fontwork Gallery" : fGetObjectWriter = 1 + '----------------- 2 + case "Fontwork Shape" : fGetObjectWriter = 3 + case "Fontwork Same Letter Heights" : fGetObjectWriter = 4 + '----------------- 5 + case "Fontwork Alignment" : fGetObjectWriter = 6 + case "Fontwork Character Spacing" : fGetObjectWriter = 7 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectWriter = 0 + end select + + case "Fontwork Shape" + Select case sObject + end select + + case "Form Design" + Select case sObject + case "Bring to Front" : fGetObjectWriter = 14 + case "Send to Back" : fGetObjectWriter = 15 + case "Group" : fGetObjectWriter = 17 + case "UnGroup" : fGetObjectWriter = 18 + case "Enter Group" : fGetObjectWriter = 19 + case "Exit Group" : fGetObjectWriter = 20 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectWriter = 0 + end select + + case "Form Filter" + Select case sObject + case "Apply Form-Based Filter" : fGetObjectWriter = 1 + case "Filter Navigation" : fGetObjectWriter = 2 + '----------------- 3 + case "Close" : fGetObjectWriter = 4 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectWriter = 0 + end select + + case "Form Navigation" + Select case sObject + end select + + case "Form Object" + Select case sObject + end select + + case "Formatting" + Select case sObject + case "Sytles and Formatting" : fGetObjectWriter = 1 + '----------------- 2 + case "Apply Style" : fGetObjectWriter = 3 + '----------------- 4 + case "Font Name" : fGetObjectWriter = 5 + '----------------- 6 + case "Font Size" : fGetObjectWriter = 7 + '----------------- 8 + case "Bold" : fGetObjectWriter = 9 + case "Italic" : fGetObjectWriter = 10 + case "Underline" : fGetObjectWriter = 11 + case "Superscript" : fGetObjectWriter = 12 + case "Subscript" : fGetObjectWriter = 13 + '----------------- 14 + case "Align Left" : fGetObjectWriter = 15 + case "Centered" : fGetObjectWriter = 16 + case "Align Right" : fGetObjectWriter = 17 + case "Justfied" : fGetObjectWriter = 18 + '----------------- 19 + case "Left-To-Right" : fGetObjectWriter = 20 + case "Right-To-Left" : fGetObjectWriter = 21 + '----------------- 22 + case "Line Spacing 1" : fGetObjectWriter = 23 + case "Line Spacing 1.5" : fGetObjectWriter = 24 + case "Line Spacing 2" : fGetObjectWriter = 25 + '----------------- 26 + case "Numbering Of/Off" : fGetObjectWriter = 27 + case "Bullets Of/Off" : fGetObjectWriter = 28 + case "Decrease Indent" : fGetObjectWriter = 29 + case "Increase Indent" : fGetObjectWriter = 30 + case "Increase Font" : fGetObjectWriter = 31 + case "Reduce Font" : fGetObjectWriter = 32 + '----------------- 33 + case "Font Color" : fGetObjectWriter = 34 + case "Highlighting" : fGetObjectWriter = 35 + case "Background Color" : fGetObjectWriter = 36 + '----------------- 37 + case "Select All" : fGetObjectWriter = 38 + case "Character" : fGetObjectWriter = 39 + case "Paragraph" : fGetObjectWriter = 40 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectWriter = 0 + end select + + case "Frame" + Select case sObject + case "Optimal Page Wrap" : fGetObjectWriter = 5 + case "Wrap Left" : fGetObjectWriter = 6 + case "Wrap Right" : fGetObjectWriter = 7 + case "Wrap Through" : fGetObjectWriter = 8 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectWriter = 0 + end select + + case "Full Screen" + Select case sObject + end select + + case "Graphic Filter" + Select case sObject + end select + + case "Insert" + Select case sObject + case "Chart" : fGetObjectWriter = 18 + case "Insert Object" : fGetObjectWriter = 19 + case "Controls" : fGetObjectWriter = 20 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectWriter = 0 + end select + + case "Insert Object" + Select case sObject + end select + + case "Media Playback" + Select case sObject + end select + + case "More Controls" + Select case sObject + end select + + case "More Database Controls" + Select case sObject + end select + + case "More XML Form Controls" + Select case sObject + end select + + case "OLE-Object" + Select case sObject + case "Wrap Left" : fGetObjectWriter = 11 + case "Wrap Right" : fGetObjectWriter = 12 + case "Optimal Page Wrap" : fGetObjectWriter = 16 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectWriter = 0 + end select + + case "Optimize" + Select case sObject + end select + + case "Page Preview" + Select case sObject + end select + + case "Picture" + Select case sObject + end select + + case "Standard" + Select case sObject + case "Load URL" : fGetObjectWriter = 1 + case "New" : fGetObjectWriter = 2 + case "New Document From Template" : fGetObjectWriter = 3 + case "Open" : fGetObjectWriter = 4 + case "Save" : fGetObjectWriter = 5 + case "Save As" : fGetObjectWriter = 6 + case "Document as E-mail" : fGetObjectWriter = 7 + '----------------- 8 + case "Edit File" : fGetObjectWriter = 9 + '----------------- 10 + case "Export Directly as PDF" : fGetObjectWriter = 11 + case "Print File Directly" : fGetObjectWriter = 12 + case "Page Rreview" : fGetObjectWriter = 13 + '----------------- 14 + case "Spellcheck" : fGetObjectWriter = 15 + case "AutoSpellcheck" : fGetObjectWriter = 16 + '----------------- 17 + case "Cut" : fGetObjectWriter = 18 + case "Copy" : fGetObjectWriter = 19 + case "Paste" : fGetObjectWriter = 20 + case "Format Paintbrush" : fGetObjectWriter = 21 + '----------------- 22 + case "Can't Undo" : fGetObjectWriter = 23 + case "Can't Restore" : fGetObjectWriter = 24 + '----------------- 25 + case "Hyperlink" : fGetObjectWriter = 26 + case "Table" : fGetObjectWriter = 27 + case "Show Draw Functions" : fGetObjectWriter = 28 + '----------------- 29 + case "Find & Replace" : fGetObjectWriter = 30 + case "Navigator" : fGetObjectWriter = 31 + case "Gallery" : fGetObjectWriter = 32 + case "Data Sources" : fGetObjectWriter = 33 + case "Nonprinting Characters" : fGetObjectWriter = 34 + case "Zoom" : fGetObjectWriter = 35 + '----------------- 36 + case "StarOffice Help" : fGetObjectWriter = 37 + case "What's This?" : fGetObjectWriter = 38 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectWriter = 0 + end select + + case "Standard(Viewing MOde)" + Select case sObject + end select + + case "Stars and Banners" + Select case sObject + end select + + case "Symbol Shapes" + Select case sObject + end select + + case "Table" + Select case sObject + case "Table" : fGetObjectWriter = 22 + case "Columns" : fGetObjectWriter = 23 + case "Rows" : fGetObjectWriter = 24 + end select + + case "Text Object" + Select case sObject + case "Line Spacing 1" : fGetObjectWriter = 16 + case "Line Spacing 1.5" : fGetObjectWriter = 17 + case "Line Spacing 2" : fGetObjectWriter = 18 + case "Font Color" : fGetObjectWriter = 20 + case "Left-To-Right" : fGetObjectWriter = 22 + case "Right-To-Left" : fGetObjectWriter = 23 + end select + + case "XML Form Design" + Select case sObject + case "Bring to Front" : fGetObjectWriter = 14 + case "Send to Back" : fGetObjectWriter = 15 + case "Group" : fGetObjectWriter = 17 + case "UnGroup" : fGetObjectWriter = 18 + case "Enter Group" : fGetObjectWriter = 19 + case "Exit Group" : fGetObjectWriter = 20 + end select + + end select + +end function + + +'******************************************************* +'* This function will get the location for image button +'* in Commands in Tools/Customize/Toolbars from Calc +'******************************************************* +function fGetObjectCalc(sToolbar as String , sObject as String) as Integer + + Select case sToolbar + case "3D-Settings" + Select case sObject + case "Extrusion On/Off" : fGetObjectCalc = 1 + '----------------- 2 + case "Tilt Down" : fGetObjectCalc = 3 + case "Tilt Up" : fGetObjectCalc = 4 + case "Tilt Left" : fGetObjectCalc = 5 + case "Tilt Right" : fGetObjectCalc = 6 + '----------------- 7 + case "Depth" : fGetObjectCalc = 8 + case "Direction" : fGetObjectCalc = 9 + case "Lighting" : fGetObjectCalc = 10 + case "Surfact" : fGetObjectCalc = 11 + case "3D Color" : fGetObjectCalc = 12 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectCalc = 0 + end select + + case "Align" + Select case sObject + case "Left" : fGetObjectCalc = 1 + case "Centered" : fGetObjectCalc = 2 + case "Right" : fGetObjectCalc = 3 + case "Top" : fGetObjectCalc = 4 + case "Center" : fGetObjectCalc = 5 + case "Bottom" : fGetObjectCalc = 6 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectCalc = 0 + end select + + case "Basic Shapes" + Select case sObject + end select + + case "Block Arrows" + Select case sObject + end select + + case "Callouts" + Select case sObject + end select + + case "Color" + Select case sObject + end select + + case "Controls" + Select case sObject + end select + + case "Drawing" + Select case sObject + case "Select" : fGetObjectCalc = 1 + '----------------- 2 + case "Line" : fGetObjectCalc = 3 + case "Rectangle" : fGetObjectCalc = 4 + case "Ellipse" : fGetObjectCalc = 5 + case "Polygon" : fGetObjectCalc = 6 + case "Curve" : fGetObjectCalc = 7 + case "Freeform Line" : fGetObjectCalc = 8 + case "Arc" : fGetObjectCalc = 9 + case "Ellipse Pie" : fGetObjectCalc = 10 + case "Circle Segment" : fGetObjectCalc = 11 + case "Text" : fGetObjectCalc = 12 + case "Vertical Text" : fGetObjectCalc = 13 + case "Text Animation" : fGetObjectCalc = 14 + case "Callouts" : fGetObjectCalc = 15 + case "Vertical Callouts" : fGetObjectCalc = 16 + '----------------- 17 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectCalc = 0 + end select + + case "Drawing Object Properties" + Select case sObject + case "Display Grid" : fGetObjectCalc = 21 + case "Snap to Grid" : fGetObjectCalc = 22 + case "Guides When Moving" : fGetObjectCalc = 23 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectCalc = 0 + end select + + case "Flowchart" + Select case sObject + end select + + case "Fontwork" + Select case sObject + end select + + case "Fontwork Shape" + Select case sObject + end select + + case "Form Design" + Select case sObject + case "Bring to Front" : fGetObjectCalc = 14 + case "Send to Back" : fGetObjectCalc = 15 + case "Group" : fGetObjectCalc = 17 + case "UnGroup" : fGetObjectCalc = 18 + case "Enter Group" : fGetObjectCalc = 19 + case "Exit Group" : fGetObjectCalc = 20 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectCalc = 0 + end select + + case "Form Filter" + Select case sObject + end select + + case "Form Navigation" + Select case sObject + end select + + case "Form Object" + Select case sObject + end select + + case "Formatting" : + Select case sObject + case "Styles and Formatting" : fGetObjectCalc = 1 + case "Apply Style" : fGetObjectCalc = 2 + '---------------------- 3 + case "Font Name" : fGetObjectCalc = 4 + '---------------------- 5 + case "Font Size" : fGetObjectCalc = 6 + '---------------------- 7 + case "Bold" : fGetObjectCalc = 8 + case "Italic" : fGetObjectCalc = 9 + case "Underline" : fGetObjectCalc = 10 + case "Underline:Double" : fGetObjectCalc = 11 + '---------------------- 12 + case "Align Left" : fGetObjectCalc = 13 + case "Align Center Horizontally" : fGetObjectCalc = 14 + case "Align Right" : fGetObjectCalc = 15 + case "Justified" : fGetObjectCalc = 16 + case "Merge Cells" : fGetObjectCalc = 17 + '---------------------- 18 + case "Left-To-Right" : fGetObjectCalc = 19 + case "Right-To-Left" : fGetObjectCalc = 20 + '---------------------- 21 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectCalc = 0 + end select + + case "Full Screen" + Select case sObject + case "Full Screen" : fGetObjectCalc = 1 + end select + + case "Graphic Filter" + Select case sObject + end select + + case "Insert" + Select case sObject + case "Chart" : fGetObjectCalc = 18 + case "Insert Object" : fGetObjectCalc = 19 + case "Controls" : fGetObjectCalc = 20 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectCalc = 0 + end select + + case "Insert Cell" + Select case sObject + end select + + case "Insert Object" + Select case sObject + end select + + case "Media Playback" + Select case sObject + end select + + case "More Controls" + Select case sObject + end select + + case "Picture" + Select case sObject + end select + + case "Standard" + Select case sObject + case "Load URL" : fGetObjectCalc = 1 + case "New" : fGetObjectCalc = 2 + case "New Document From Template" : fGetObjectCalc = 3 + case "Open" : fGetObjectCalc = 4 + case "Save" : fGetObjectCalc = 5 + case "Save As" : fGetObjectCalc = 6 + case "Document as E-mail" : fGetObjectCalc = 7 + '----------------- 8 + case "Edit File" : fGetObjectCalc = 9 + '----------------- 10 + case "Export Directly as PDF" : fGetObjectCalc = 11 + case "Print File Directly" : fGetObjectCalc = 12 + case "Page Rreview" : fGetObjectCalc = 13 + '----------------- 14 + case "Spellcheck" : fGetObjectCalc = 15 + case "AutoSpellcheck" : fGetObjectCalc = 16 + '----------------- 17 + case "Cut" : fGetObjectCalc = 18 + case "Copy" : fGetObjectCalc = 19 + case "Paste" : fGetObjectCalc = 20 + case "Format Paintbrush" : fGetObjectCalc = 21 + '----------------- 22 + case "Can't Undo" : fGetObjectCalc = 23 + case "Can't Restore" : fGetObjectCalc = 24 + '----------------- 25 + case "Hyperlink" : fGetObjectCalc = 26 + case "Sort Ascending" : fGetObjectCalc = 27 + case "Sort Descending" : fGetObjectCalc = 28 + '----------------- 29 + case "Insert Chart" : fGetObjectCalc = 30 + case "Show Draw Functions" : fGetObjectCalc = 31 + '----------------- 32 + case "Find & Replace" : fGetObjectCalc = 33 + case "Navigator" : fGetObjectCalc = 34 + case "Gallery" : fGetObjectCalc = 35 + case "Data Sources" : fGetObjectCalc = 36 + case "Zoom" : fGetObjectCalc = 37 + '----------------- 38 + case "StarOffice Help" : fGetObjectCalc = 39 + case "What's This?" : fGetObjectCalc = 40 + case else : QAErrorLog "The test does not support Object : " + sObject + fGetObjectCalc = 0 + end select + + case "Standard(Viewing Mode)" + Select case sObject + end select + + case "Stars and Banners" + Select case sObject + end select + + case "Symbol Shapes" + Select case sObject + end select + + case "Text Formatting" + Select case sObject + end select + + case "Tools" + Select case sObject + end select + + case "previewbar" + Select case sObject + end select + + end select + +end function + + + diff --git a/testautomation/global/tools/includes/optional/t_treelist_tools.inc b/testautomation/global/tools/includes/optional/t_treelist_tools.inc new file mode 100755 index 000000000000..e9c254ac07b4 --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_treelist_tools.inc @@ -0,0 +1,485 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : joerg.skottke@oracle.com +'* +'* short description : Helpers for accessing treelists +'* +'\****************************************************************************** + +function hGetNodeCount( oControl as object ) as integer + + '///<h3>Retrieve the number of visible (open) nodes from a treelist</h3> + '///<u>Input</u>: + '///<ol> + '///+<li>Treelist control object (Object)</li> + '///<ul> + '///+<li>Object must exist in current context</li> + '///</ul> + '///</ol> + '///<u>Returns</u>: + '///<ol> + '///+<li>Number of items in treelist</li> + '///<ul> + '///+<li>0 on any error</li> + '///+<li>> 0 Number of items</li> + '///</ul> + '///</ol> + '///<u>Description</u>: + '///<ul> + + + const CFN = "hGetNodeCount::" + const RETVAL_FAILURE = 0 + dim iCount as integer + + '///+<li>Verify that the control exists</li> + if ( oControl.exists( 5 ) ) then + + '///+<li>Verify that the control is enabled</li> + if ( oControl.isEnabled() ) then + + if ( GVERBOSE ) then printlog( CFN & "Regular access, control available and enabled" ) + + '///+<li>get the number of items from the control</li> + iCount = oControl.getItemCount() + else + printlog( CFN & "Failure: Control claims to be disabled." ) + iCount = RETVAL_FAILURE + endif + else + try + printlog( CFN & "Forcing access to non existing control" ) + iCount = oControl.getItemCount() + catch + printlog( CFN & "Failure: Control not available." ) + iCount = RETVAL_FAILURE + endcatch + endif + + if ( GVERBOSE ) then printlog( CFN & "Exit with nodecount = " & iCount ) + + hGetNodeCount = iCount + '///</ul> + +end function + +'******************************************************************************* + +function hSelectTopNode( oControl as object ) as boolean + + '///<h3>Move selection to the first node in a treelist</h3> + '///<ul> + '///+<li>Type the "Home"-key in a treelist, to select index 1</li> + '///+<li>Verify that the top node has been selected</li> + '///</ul> + + const CFN = "hSelectTopNode::" + + try + oControl.select( 1 ) + WaitSlot() + hSelectTopNode() = true + catch + hSelectTopNode() = false + endcatch + + if ( GVERBOSE ) then printlog( CFN & "Selected Node: " & oControl.getText() ) + +end function + +'******************************************************************************* + +function hSelectNextNode( oControl as object ) as integer + + '///<h3>Move one node down in a treelist</h3> + '///<ul> + '///+<li>Returns new position or 0 on error</li> + '///</ul> + + const CFN = "hSelectNextNode::" + + dim iPosBefore as integer + dim iPosAfter as integer + + iPosBefore = oControl.getSelIndex() + + oControl.typeKeys( "<DOWN>" ) + + iPosAfter = oControl.getSelIndex() + + if ( iPosAfter = iPosBefore ) then hSelectNextNode() = 0 + + if ( iPosAfter = ( iPosBefore + 1 ) ) then hSelectNextNode() = iPosAfter + + printlog( CFN & "Selected node: " & oControl.getText() ) + +end function + +'******************************************************************************* + +function hGetNodeName( oControl as object , iNode as integer ) as string + + '///<h3>Retrieve the name of a node in a treelist specified by index</h3> + '///<ul> + '///+<li>Returns the name of the node or empty string on error</li> + '///</ul> + const CFN = "hGetNodeName::" + dim iItemCount as integer + + iItemCount = hGetNodeCount( oControl ) + if ( iNode > iItemCount ) then + warnlog( CFN & "Selected node out of range, aborting" ) + hGetNodeName() = "" + else + oControl.select( iNode ) + hGetNodeName() = oControl.getSelText() + endif + +end function + +'******************************************************************************* + +function hExpandNode( oControl as object, iNode as integer ) as integer + + '///<h3>Expand a node in a treelist specified by index</h3> + '///<ul> + '///+<li>Returns new nodecount or 0 on error</li> + '///</ul> + const RC_FAILURE = 0 + const CFN = "hExpandNode::" + + dim iOldNodeCount as integer + + if ( GVERBOSE ) then + printlog( CFN & "Enter with option (Control): " & oControl.name() ) + printlog( CFN & "Enter with option (iNode): " & iNode ) + endif + + iOldNodeCount = hGetNodeCount( oControl ) + if ( iNode <= iOldNodeCount ) then + if ( iNode > RC_FAILURE ) then + oControl.select( iNode ) + endif + try + oControl.typekeys( "<RIGHT>" ) + hExpandNode() = hGetNodeCount( oControl ) + catch + warnlog( "#i84194# Treelist access failed (Keyboard navigation)" ) + hExpandNode() = RC_FAILURE + endcatch + else + hExpandNode() = RC_FAILURE + endif + +end function + +'******************************************************************************* + +function hExpandAllNodes( oControl as object ) as integer + + '///<h3>Expand all nodes of treelist</h3> + '///<ul> + '///+<li>Run through all items in the treelist, expand every node</li> + '///+<li>Returns the number of all nodes in the treelist</li> + '///</ul> + + dim iNode as integer + dim iNodeCurCount as integer + dim iNodeRefCount as integer + dim iIteration as integer + + const CFN = "hExpandAllNodes::" + + hSelectTopNode( oControl ) + iNodeCurCount = hGetNodeCount( oControl ) + iNodeRefCount = -1 + iIteration = 0 + + if ( GVERBOSE ) then + printlog( CFN & "Initial iNodeCurCount: " & iNodeCurCount ) + printlog( CFN & "Initial iNodeRefCount: " & iNodeRefCount ) + endif + + do while ( iNodeRefCount < iNodeCurCount ) + + iIteration = iIteration + 1 + iNodeRefCount = iNodeCurCount + + for iNode = iNodeCurCount to 1 step -1 + hExpandNode( oControl , iNode ) + next iNode + + iNodeCurCount = hGetNodeCount( oControl ) + + if ( GVERBOSE ) then + printlog( "" ) + printlog( CFN & "Exit iteration....: " & iIteration ) + printlog( CFN & "Exit iNodeCurCount: " & iNodeCurCount ) + printlog( CFN & "Exit iNodeRefCount: " & iNodeRefCount ) + endif + + loop + + if ( GVERBOSE ) then + printlog( CFN & "Exit with " & iNodeCurCount & _ + " items after " & iIteration & " iterations" ) + endif + hExpandAllNodes() = iNodeCurCount + +end function + +'******************************************************************************* + +function hGetAllNodeNames( oControl as object , lsList() as string ) as integer + + hExpandAllNodes( oControl ) + hGetAllNodeNames() = hGetVisibleNodeNames( oControl, lsList() ) + +end function + +'******************************************************************************* + +function hGetVisibleNodeNames( oControl as object , lsList() as string ) as integer + + '///<h3>Retrieve the names of all nodes in a treelist</h3> + '///<ul> + '///+<li>Expand all nodes of a treelist</li> + '///+<li>Store all node names into an array</li> + '///+<li>Return the number of nodes read (listcount), 0 on error</li> + '///</ul> + + ' Get the list of all visible (expanded) nodes and store it + ' in lsList(). if _id > ubound lsList() an error is given and lsList remains + ' empty, thus returning "0" + + const CFN = "hGetVisibleNodeNames::" + + dim iNodeCount as integer + dim iThisNode as integer + + if ( GVERBOSE ) then printlog( CFN & "Enter" ) + + iNodeCount = hGetNodeCount( oControl ) + + ' Test whether the array provided is large enough to hold all items + ' from the treelist/list. If the array is ok fill it. + if ( iNodeCount > ubound( lsList() ) ) then + warnlog( "Array to small to hold: " & iNodeCount & " items" ) + else + hSelectTopNode( oControl ) + for iThisNode = 1 to iNodeCount + listappend( lsList() , hGetNodeName( oControl , iThisNode ) + next iThisNode + endif + + hGetVisibleNodeNames() = listcount( lsList() ) + if ( GVERBOSE ) then printlog( CFN & "Exit" ) + +end function + +'******************************************************************************* + +function hSelectNode( oControl as object , _id as integer ) as string + + '///<h3>Select a node in a treelist by index</h3> + '///<ul> + '///+<li>Return the name of the selected node</li> + '///</ul> + + oControl.select( _id ) : hSelectNode() = hGetNodeName( oControl , _id ) + +end function + +'******************************************************************************* + +function hSelectNodeByName( oControl as object , _name as string ) as integer + + '///<h3>Select a node by name in treelist (first occurrence)</h3> + '///<ul> + '///+<li>Try to find a node by name - directly</li> + '///+<li>If the node is not visible, expand all and search the tree</li> + '///+<li>Returns index of requested node or 0 on failure</li> + '///</ul> + + const CFN = "hSelectNodeByName::" + const RETVAL_FAILURE = 0 + + dim iThisNode as integer + dim iCurrentNode as integer + dim iNodeCount as integer + + dim cNodeName as string + + if ( GVERBOSE ) then printlog( CFN & "Enter with option (NodeName): " & _name ) + + iThisNode = RETVAL_FAILURE + + ' First we try to jump to the node directly, if this fails we use the + ' slower but safer method (expand all nodes and step through) + try + oControl.select( _name ) + iThisNode = oControl.getSelIndex() + hSelectNodeByName() = iThisNode + catch + printlog( CFN & "Node not visible: Using search method" ) + iNodeCount = hExpandAllNodes( oControl ) + + for iCurrentNode = 1 to iNodeCount + oControl.select( iCurrentNode ) + cNodeName = oControl.getSelText() + + if ( cNodeName = _name ) then + iThisNode = iCurrentNode + exit for + endif + + if ( instr( cNodeName, _name ) > 0 ) then + if ( instr( cNodeName, "(" ) > 0 ) then + printlog( CFN & "Node has readonly marker" ) + iThisNode = iCurrentNode + exit for + else + qaerrorlog( CFN & "Fuzzy match. This might or might not be the correct node" ) + endif + endif + next iCurrentNode + endcatch + + if ( iThisNode = RETVAL_FAILURE ) then + printlog( CFN & "Exit: Node not found." ) + else + if ( GVERBOSE ) then printlog( CFN & "Exit: Node selected at pos: " & iThisNode ) + endif + + hSelectNodeByName() = iThisNode + +end function + +'******************************************************************************* + +function hSelectTheLastNode( oControl as object ) as integer + + '///<h3>Select the (absolute) last node in a treelist</h3> + '///<ul> + '///+<li>Expand all nodes</li> + '///+<li>Go to the last node, select it</li> + '///+<li>Return the number of the last node in the treelist</li> + '///</ul> + + const CFN = "hSelectTheLastNode::" + dim iCurrentNodeCount as integer + + iCurrentNodeCount = hExpandAllNodes( oControl ) + if ( iCurrentNodeCount > 0 ) then + oControl.select( iCurrentNodeCount ) + if ( GVERBOSE ) then + printlog( CFN & "Nodename.....: " & oControl.getText() ) + printlog( CFN & "Node position: " & iCurrentNodeCount ) + endif + else + iCurrentNodeCount = -1 + endif + + hSelectTheLastNode() = iCurrentNodeCount + +end function + +'******************************************************************************* + +function hVerifyNodeName( oControl as object , cName as string ) as boolean + + '///<h3>Compare the name of the current node from a treelist to a reference string</h3> + '///<ul> + '///+<li>Returns true on success, false on failure</li> + '///</ul> + + hVerifyNodeName() = false + if ( oControl.getSelText() = cName ) then hVerifyNodeName() = true + +end function + +'****************************************************************************** + +function hGetListItems( oControl as object, aList() as string ) as integer + + '///<h3>Retrieve the names of all nodes from a plain (linear) list</h3> + '///<ul> + '///+<li>Cycle through a list, append all entries to an array</li> + '///+<li>Returns number of items or 0 on error</li> + '///</ul> + + const CFN = "hGetListItems::" + const RETVAL_FAILURE = 0 + + if ( GVERBOSE ) then printlog( CFN & "Enter with option (control): " & oControl.name() ) + + dim iItemCount as integer + dim iCurrentItem as integer + dim cCurrentItem as string + + iItemCount = oControl.getItemCount() + if ( iItemCount > ubound( aList() ) ) then + printlog( CFN & "Array too small, needed: " & iItemCount ) + hGetListItems() = RETVAL_FAILURE + exit function + endif + + for iCurrentItem = 1 to iItemCount + + oControl.select( iCurrentItem ) + cCurrentItem = oControl.getSelText() + hListAppend( cCurrentItem, aList() ) + + next iCurrentItem + + if ( GVERBOSE ) then printlog( CFN & "Exit with number of items: " & iItemCount ) + hGetListItems() = iItemCount + +end function + +'******************************************************************************* + +function hFindInList( oControl as object, cObject as string ) as integer + + const RETVAL_FAILURE = 0 + dim iCurrentObject as integer + + for iCurrentObject = 1 to oControl.getItemCount() + + oControl.select( iCurrentObject ) + + if ( oControl.getSelText() = cObject ) then + hFindInList() = iCurrentObject + exit function + endif + + next iCurrentObject + + hFindInList() = RETVAL_FAILURE + +end function
\ No newline at end of file diff --git a/testautomation/global/tools/includes/optional/t_ui_filters.inc b/testautomation/global/tools/includes/optional/t_ui_filters.inc new file mode 100644 index 000000000000..7b9dd66e1a40 --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_ui_filters.inc @@ -0,0 +1,131 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/****************************************************************************** +'* +'* owner : joerg.skottke@oracle.com +'* +'* short description : Get the UI names for default filters +'* +'\****************************************************************************** + +global gWriterFilter as String +global gCalcFilter as String +global gImpressFilter as String +global gMasterDocFilter as String +global gMathFilter as String +global gDrawFilter as String +global gHTMLFilter as String + +'******************************************************************************* + +sub GetDefaultFilterNames() + + const CFN = "global::tools::includes::optional::t_ui_filters.inc::GetDefaultFilterNames():" + + dim sMatchingFile as string + dim sFilterArray( 100 ) as string + + const APPLICATION_COUNT = 7 + dim cUIFilters( APPLICATION_COUNT ) as string + dim cAPIFilters( APPLICATION_COUNT ) as string + + sMatchingFile = gTesttoolPath & "global\input\filters\" + sMatchingFile = sMatchingFile & "build_to_filter.txt" + sMatchingFile = convertpath( sMatchingFile ) + + hGetDataFileSection( sMatchingFile, sFilterArray(), "Current", "", "" ) + + cAPIFilters( 1 ) = hGetValueForKeyAsString( sFilterArray(), "WRITER" ) + cAPIFilters( 2 ) = hGetValueForKeyAsString( sFilterArray(), "CALC" ) + cAPIFilters( 3 ) = hGetValueForKeyAsString( sFilterArray(), "IMPRESS" ) + cAPIFilters( 4 ) = hGetValueForKeyAsString( sFilterArray(), "MASTERDOCUMENT" ) + cAPIFilters( 5 ) = hGetValueForKeyAsString( sFilterArray(), "MATH" ) + cAPIFilters( 6 ) = hGetValueForKeyAsString( sFilterArray(), "DRAW" ) + cAPIFilters( 7 ) = hGetValueForKeyAsString( sFilterArray(), "HTML" ) + + hGetFilterGroup( cAPIFilters(), cUIFilters() ) + + gWriterFilter = cUIFilters( 1 ) + gCalcFilter = cUIFilters( 2 ) + gImpressFilter = cUIFilters( 3 ) + gMasterDocFilter = cUIFilters( 4 ) + gMathFilter = cUIFilters( 5 ) + gDrawFilter = cUIFilters( 6 ) + gHTMLFilter = cUIFilters( 7 ) + +end sub + +'******************************************************************************* + +function hGetFilterGroup( api_filters() as string, ui_filters() as string ) + + ' This is a function designed to deliver a massive speed improvement + ' compared to multiple calls to hGetUIFiltername() which establish a fresh + ' UNO connection on each call. This function establishes only one connection + ' and works with a list of API filter names which are matched to UI filter + ' names. This function does not wrap the UNO calls in a try...catch block + ' which means that if the function fails, it fails hard. Extra hard, that is. + ' There is no errorhandling. This function is intended for internal use only. + ' No returnvalue is defined at this time. + + const CFN = "global::tools::includes::optional::t_ui_filters.inc::hGetFilterGroup():" + + dim oUno as object + dim oService as object + dim oFilter as object + + dim iCurrentFilter as integer + + dim iFilterCount as integer : iFilterCount = ubound( api_filters() ) + + dim iAPIfilterList as integer + + oUno = hGetUNOService( true ) + oService = oUno.createInstance("com.sun.star.document.FilterFactory") + + for iCurrentFilter = 1 to iFilterCount + + oFilter = oService.getByName( api_filters( iCurrentFilter ) ) + + for iAPIFilterList = 0 to ubound( oFilter ) + + if ( oFilter( iAPIFilterList ).Name = "UIName" ) then + ui_filters( iCurrentFilter ) = oFilter( iAPIFilterList ).Value() + if ( GVERBOSE ) then + 'printlog( CFN & "DEBUG: Index (iCurrentFilter): " & iCurrentFilter ) + 'printlog( CFN & "DEBUG: API Filter: " & api_filters( iCurrentFilter ) ) + 'printlog( CFN & "DEBUG: UI Filter.: " & ui_filters( iCurrentFilter ) ) + endif + endif + + next iAPIFilterList + + next iCurrentFilter + +end function + +'******************************************************************************* + diff --git a/testautomation/global/tools/includes/optional/t_user_info.inc b/testautomation/global/tools/includes/optional/t_user_info.inc new file mode 100644 index 000000000000..d4771be2e3c9 --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_user_info.inc @@ -0,0 +1,56 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/****************************************************************************** +'* +'* owner : joerg.skottke@oracle.com +'* +'* short description : Extension Update Test +'* +'\****************************************************************************** + +function hCheckForAdministratorPermissions() as boolean + + ' this function returns TRUE if the user can create files in the office + ' program directory. This is relevant for macro security (VBA compatibility) + ' and extension manager behavior (access to shared installations).S + + dim iFile as integer + dim cProbeFile as string + + cProbeFile = convertpath( gNetzOfficePath & "program/tt_probe_file" ) + try + iFile = FreeFile + open cProbeFile for output as iFile + close( iFile ) + kill( cProbeFile ) + hCheckForAdministratorPermissions() = true + printlog( "Current user has administrator permissions" ) + catch + hCheckForAdministratorPermissions() = false + printlog( "Current user does not have administrator permissions" ) + endcatch + +end function diff --git a/testautomation/global/tools/includes/optional/t_xml1.inc b/testautomation/global/tools/includes/optional/t_xml1.inc new file mode 100755 index 000000000000..5afd05cbb22f --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_xml1.inc @@ -0,0 +1,652 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* Owner : helge.delfs@oracle.com +'* +'* short description : simple XML-Parser for XML-Files from Registration-Database and Routines to work with SAX-Parser in Testtool +'* +'*********************************************************************************** +' #1 hXMLGotoElement +' #1 hXMLGetFirstCharsForElement +' #1 ExtractSections +' #1 GetXMLValue +' #1 GetXMLTagValue +' #1 GetXMLValueList +' #1 GetXMLValueType +' #1 GetXMLValueLine +' #1 GetXMLValueGlobal +' #1 GetExtractXMLValue +' #1 GetExtractXMLValueList +' #1 GetExtractXMLValueFromList +' #1 hXMLSeekElementInTree +'\********************************************************************************** + +function hXMLGotoElement ( sElementLine as String, optional bSilent as boolean) as boolean +'/// uses SAX Interface in testtool ///' +'///hXMLGotoElement ( sElementLine as String ) +'///+Input : sElementLine => the tree in DOM as one string seperated with ';' +'///+ - - - - - to be more exact, the Attribute Values to 'oor:name' ///' +'///+ - - - -: bSilent => print warnings? ///' +'///+Output : -- +'///+Return : was the Element found? +'///- you can jump directly to the correct entry in the DOM-tree + + Dim sList (50) as String + Dim i as Integer + Dim x as Integer + Dim y as Integer + Dim n as Integer + dim iMax as integer + dim bFound as boolean + dim bFoundCollect as boolean + dim iAttrCount as integer + dim bLocalSilent as boolean + + if (isMissing(bSilent)) then + bLocalSilent = FALSE + else + bLocalSilent = bSilent + endif + + bFoundCollect = TRUE + ExtractSections ( sElementLine, sList () ) + + for i=1 to ListCount ( sList () ) ' for every Section + iMax = SAXGetChildCount() + x = 0 + bFound = FALSE +' ' ------------ debug start ---------------------- +' for n = 1 to iMax +' SAXSeekElement (n) +' Printlog " " + i + ":(" + n + "/" + iMax + "): '" + SAXGetElementName +' iAttrCount = SAXGetAttributeCount +' for y = 1 to iAttrCount +' Printlog " " + i + ":" + n + ":(" + y + "/" + iAttrCount + "): '"+SAXGetAttributeName (y) +"' : '"+SAXGetAttributeValue (y) +"' " +' next y +' SAXSeekElement (0) +' next n +' ' ------------- debug end ----------------------- + while ((bFound = FALSE) AND (x < iMax)) ' compare the VALUE for the ATTRIBUTE 'oor:name' with the wanted ITEM + inc(x) ' do it until it fits; else print warnlog + SAXSeekElement (x) + if (SAXGetAttributeValue ("oor:name") <> sList (i)) then + SAXSeekElement (0) + else + bFound = TRUE + endif + wend + if ((bFound = FALSE) AND (bSilent = FALSE)) then + Warnlog "hXMLGotoElement::ERROR! Element " + i + ": '" + sList (i) + "' not found :-(" + endif + bFoundCollect = bFound AND bFoundCollect + next i + hXMLGotoElement = bFoundCollect +end function +' +'------------------------------------------------------------------------------- +' +function hXMLGetFirstCharsForElement ( sElementLine as String, optional sXMLFile as String, optional bClose as Boolean ) as String +'/// uses SAX Interface in testtool ///' + Dim bCloseLocal as Boolean +'///hXMLGetFirstCharsForElement ( sElementLine as String, optional sXMLFile as String, optional bClose as Boolean ) as String +'///+Input : sElementLine => the tree in DOM as one string seperated with ';' +'///+- sXMLFile => ( optional ) if you want to open the DOM for a file you can set here the filename +'///+- bClose => ( optional ) if you want to close the DOM after getting the char, you can set this to TRUE ( default is FALSE ) +'///+Output : -- +'///+Return : the string for the element +'///- you can jump directly to the correct entry in the DOM-tree and get the char for that entry +'///- the DOM is closed after this return + + if IsMissing( sXMLFile ) = FALSE then + SAXReadFile ( sXMLFile ) + end if + + if IsMissing( bClose ) = TRUE then + bCloseLocal = FALSE + else + bCloseLocal = bClose + end if + + hXMLGotoElement ( sElementLine ) + SAXSeekElement ( 1 ) + if SAXGetNodeType = NodeTypeCharacter then + hXMLGetFirstCharsForElement = SAXGetChars + else + Warnlog "hXMLGetFirstCharsForElement : the element " + sElementLine + " has no chars" + hXMLGetFirstCharsForElement = "" + end if + + if bCloseLocal = TRUE then SAXRelease +end function +' +'------------------------------------------------------------------------------- +' +function ExtractSections ( sInput as String, lsXMLsections() as String ) as Integer +'///Input : - sInput => a full section seperated with ';' +'///+- lsXMLsections => an empty list +'///+Output : the list ( lxXMLsections ) with seperated sectionnames +'///+Return : number of sections + + Dim ii, iLen as Integer + Dim iList ( 50 ) as String + Dim bFirstEntry as Boolean + Dim Dummy as String + dim sTemp as string + + lsXMLsections(0) = 0 + iList (0) = 0 + iLen = len ( sInput ) + bFirstEntry = TRUE + + for ii=1 to ( iLen ) + Dummy = mid ( sInput, ii, 1 ) + if ( mid ( sInput, ii, 1 ) ) = ";" then ListAppend ( iList(), Str ( ii ) ) + next ii + + for ii=1 to ( ListCount ( iList () ) ) + if bFirstEntry = TRUE then + ListAppend ( lsXMLsections(), Left ( sInput, Val(iList(1))-1 ) ) + bFirstEntry = FALSE + end if + Dummy = mid ( sInput, Val(iList(ii))+1, Val(iList(ii+1))-Val(iList(ii))-1 ) + ListAppend ( lsXMLsections(), Dummy ) + next ii + + sTemp = ListCount ( lsXMLsections() ) + ExtractSections = sTemp + if (sTemp = 0) then + ListAppend (lsXMLsections(), sInput) + ExtractSections = 1 + end if +end function +' +'------------------------------------------------------------------------------- +' +function GetXMLValue ( sXMLfile as String, sXMLsectionMaster as String, sXMLsection as String, optional bSilent as Boolean ) as String +'/// Input : - sXMLfile => Filename with full path /// +'///+ - - - - - sXMLsectionMaster => the master-section ( mostly in StarOffice the filename without extension ) /// +'///+ - - - - - sXMLsection => full way to the item /// +'///+ Output : - - /// +'///+ Return : - the value /// +'/// wraper for GetXMLValueGlobal ///' + if IsMIssing ( bSilent ) <> TRUE then + GetXMLValue = GetXMLValueGlobal ( sXMLfile, sXMLsectionMaster, sXMLsection, , , , bSilent ) + else + GetXMLValue = GetXMLValueGlobal ( sXMLfile, sXMLsectionMaster, sXMLsection, , , , ) + end if +end function + +function GetXMLTagValue ( sXMLfile as String, sXMLsectionMaster as String, sXMLsection as String, sValue as String ) as String +'/// Input : - sXMLfile => Filename with full path /// +'///+ - - - - - sXMLsectionMaster => the master-section ( mostly in StarOffice the filename without extension ) /// +'///+ - - - - - sXMLsection => full way to the item /// +'///+ Output : - - /// +'///+ Return : - the value /// +'/// wraper for GetXMLValueGlobal ///' + GetXMLTagValue = GetXMLValueGlobal ( sXMLfile, sXMLsectionMaster, sXMLsection, ,sValue , , ) +end function + +function GetXMLValueList ( lsXMLValue() as String, sXMLfile as String, sXMLsectionMaster as String, sXMLsection as String ) as String +'/// Input : - sXMLfile => Filename with full path /// +'///+ - - - - - sXMLsectionMaster => the master-section ( mostly in StarOffice the filename without extension ) /// +'///+ - - - - - sXMLsection => full way to the item /// +'///+ Output : - - /// +'///+ Return : - the value /// +'/// wraper for GetXMLValueGlobal ///' + Dim sLine, sLine1 as String + Dim i, iCounter as Integer + + sLine = GetXMLValueGlobal ( sXMLfile, sXMLsectionMaster, sXMLsection, ,"cfg:value" , TRUE, ) + if sLine = "" then + GetXMLValueList = "" + else + GetXMLValueList = GetExtractXMLValueList ( lsXMLValue(), sLine, , ) + end if +end function +' +'------------------------------------------------------------------------------- +' +function GetXMLValueType ( sXMLfile as String, sXMLsectionMaster as String, sXMLsection as String, optional sType ) as String +'/// Input : - sXMLfile => Filename with full path /// +'///+ - - - - - sXMLsectionMaster => the master-section ( mostly in StarOffice the filename without extension ) /// +'///+ - - - - - sXMLsection => full way to the item /// +'///+ Output : - - /// +'///+ Return : - the value /// +'/// wraper for GetXMLValueGlobal ///' + Dim sDummy as String + if IsMissing ( sType ) = TRUE then + sDummy = "type" + else + sDummy = sType + end if + + GetXMLValueGlobal ( sXMLfile, sXMLsectionMaster, sXMLsection, sDummy, , , ) + GetXMLValueType = sDummy +end function + +function GetXMLValueLine ( sXMLfile as String, sXMLsectionMaster as String, sXMLsection as String ) as String +'/// Input : - sXMLfile => Filename with full path /// +'///+ - - - - - sXMLsectionMaster => the master-section ( mostly in StarOffice the filename without extension ) /// +'///+ - - - - - sXMLsection => full way to the item /// +'///+ Output : - - /// +'///+ Return : - the value /// +'/// wraper for GetXMLValueGlobal ///' + GetXMLValueLine = GetXMLValueGlobal ( sXMLfile, sXMLsectionMaster, sXMLsection,,, TRUE, ) +end function +' +'------------------------------------------------------------------------------- +' +function GetXMLValueGlobal ( sXMLfile as String, sXMLsectionMaster as String, sXMLsection as String, optional sXMLType, optional sXMLTag, optional biWholeLine, optional bSil as Boolean ) as String +'/// uses no SAX Parser : just text search in the file ///' +'/// You can get the value of an item in a XML-file. The value of the item must be set between <value> and <value/>. /// +'///+ The item can be written in one line or in more lines. /// +'/// Input : - sXMLfile => Filename with full path /// +'///+ - - - - - sXMLsectionMaster => the master-section ( mostly in StarOffice the filename without extension ) /// +'///+ - - - - - sXMLsection => full way to the item ///' +'///+ - - - - - optional sXMLType => if you want to get the XML-Type this variable must be set ///' +'///+ - - - - - optional sXMLTag => if sXMLTag isn't set, "value" is the tag, else you must set the tag here ///' +'///+ Output : - optional sXMLType => if sXMLType is set, it will be returned the Type of the value as string ///' +'///+ Return : - the value of the searched item ///' +' Dim FileNum as Integer + Dim Pos, iSec, i, j, iDum as Integer + Dim MasterSecOK, MasterSecEnd, SecOK, SecEnd, bThrough, bWholeLine as Boolean + Dim xmlZeile, xmlZeile2, sVariable, sDummy, sDummy2 as String + Dim lsSecList ( 1000 ) as String + Dim lsInterim ( 1000 ) as String + Dim textin as object, sfa as object, xInput as object + Dim bSilent as Boolean + + if ( IsMissing ( bSil ) ) = TRUE then + bSilent = FALSE + else + bSilent = TRUE + end if + + if ( IsMissing ( biWholeLine ) ) = TRUE then + bWholeLine = FALSE + else + bWholeLine = TRUE + end if + + if Dir( sXMLfile ) = "" then + if bSilent = FALSE then Warnlog "GetXMLValueGlobal(...) : " + sXMLfile + " is missing!" + exit function + end if + + MasterSecOK = FALSE : MasterSecEND = FALSE + SecOK=FALSE : SecEND=FALSE + bThrough = FALSE + Pos = 1 + GetXMLValueGlobal = "" + + lsSecList (0) = 0 + lsInterim (0) = 0 + + iSec = ExtractSections ( sXMLsection, lsSecList () ) + sVariable = lsSecList (iSec) + ListDelete ( lsSecList(), iSec ) + iSec = iSec-1 + if iSec = 0 then ListAppend ( lsSecList(), "" ) + + textin = createUnoService( "com.sun.star.io.TextInputStream" ) + textin.setEncoding("utf8") + sfa = createUnoService( "com.sun.star.ucb.SimpleFileAccess" ) + xInput = sfa.openFileRead( sXMLfile ) + textin.setInputStream( xInput ) + + do until textin.isEOF() + xmlZeile = textin.readLine() + + xmlZeile = TrimTab ( Trim ( xmlZeile ) ) + xmlZeile2 = lCASE( xmlZeile ) ' control case-insensitiv + + if MasterSecOK = FALSE then ' master-section ( com.sun.star. ... ) + if xmlZeile2= "<" + lCASE( sXMLsectionMaster ) + ">" OR Instr ( xmlZeile2, "<" + lCASE( sXMLsectionMaster ) + " " ) <> 0 then + MasterSecOK = TRUE + else + if xmlZeile2 = "<" + lCASE( sXMLsectionMaster ) + "/>" then + if bSilent = FALSE then warnlog "GetXMLValueGlobal(...) : '" + sXMLsectionMaster + "' -> master-section has no entries!" + exit do + end if + end if + else + if xmlZeile2= "</" + lCASE( sXMLsectionMaster ) + ">" OR xmlZeile2= "<" + lCASE( sXMLsectionMaster ) + "/>" then + if bSilent = FALSE then warnlog "GetXMLValueGlobal(...) : '" + lsSecList (Pos) + "' -> entry could not be found!" + exit do + end if + + if ( Instr (xmlZeile2, lCASE ( "<" + lsSecList (Pos)) ) <> 0 AND iSec > 0 ) AND Pos < iSec+1 then + iDum = Instr ( lsSecList (Pos), " " ) + if iDum <> 0 then lsSecList(Pos) = Left ( lsSecList(Pos), iDum -1 ) + if xmlZeile2 = "<" + lCASE( lsSecList (Pos) ) + "/>" then + if Pos = iSec then + if bSilent = FALSE then Warnlog "GetXMLValueGlobal(...) : '" + svariable + "' -> entry could not be found" + else + if bSilent = FALSE then Warnlog "GetXMLValueGlobal(...) : '" + lsSecList (Pos) + "' -> entry could not be found" + end if + exit do + else + Pos = Pos + 1 + end if + else + if Pos > iSec then + sDummy2 = Mid ( xmlZeile2, 2, len ( svariable ) + 1 ) + if sDummy2 = lCase ( svariable ) + ">" OR sDummy2 = lCase ( svariable ) + " " OR bThrough = TRUE then + iDum = Instr ( svariable, " " ) ' inserted because an error in GetXMLValueLineExtra 3.11.00 (TZ) + if iDum <> 0 then svariable = Left ( svariable, iDum -1 ) ' inserted because an error in GetXMLValueLineExtra 3.11.00 (TZ) + sDummy = Mid ( xmlZeile2, len ( xmlZeile2 ) - 1 - len ( svariable), len ( svariable)+1 ) + if ( bThrough = FALSE AND ( sDummy = "/" + lCase ( svariable ) OR Right (sDummy, 1 ) = "/" ) ) OR ( bThrough = TRUE AND sDummy = "/" + lCase ( svariable ) ) then + if ListCount ( lsInterim () ) = 0 then + if bWholeLine = TRUE then + GetXMLValueGlobal = xmlZeile + else + if ( IsMissing ( sXMLTag ) ) = TRUE then + if ( IsMissing ( sXMLType ) ) = TRUE then + GetXMLValueGlobal = GetExtractXMLValue ( xmlZeile,, ) + else + GetXMLValueGlobal = GetExtractXMLValue ( xmlZeile, sXMLType, ) + end if + else + if ( IsMissing ( sXMLType ) ) = TRUE then + GetXMLValueGlobal = GetExtractXMLValue ( xmlZeile,, sXMLTag ) + else + GetXMLValueGlobal = GetExtractXMLValue ( xmlZeile, sXMLType, sXMLTag ) + end if + end if + end if + else + ListAppend ( lsInterim (), xmlZeile2 ) + if bWholeLine = TRUE then + for j=1 to ListCount ( lsInterim () ) + GetXMLValueGlobal = GetXMLValueGlobal + lsInterim (j) + next j + else + if ( IsMissing ( sXMLTag ) ) = TRUE then + if ( IsMissing ( sXMLType ) ) = TRUE then + GetXMLValueGlobal = GetExtractXMLValueFromList ( lsInterim (),, ) + else + GetXMLValueGlobal = GetExtractXMLValueFromList ( lsInterim (), sXMLType, ) + end if + else + if ( IsMissing ( sXMLType ) ) = TRUE then + GetXMLValueGlobal = GetExtractXMLValueFromList ( lsInterim (),, sXMLTag ) + else + GetXMLValueGlobal = GetExtractXMLValueFromList ( lsInterim (), sXMLType, sXMLTag ) + end if + end if + end if + end if + bThrough = FALSE + exit do + else + if xmlZeile2 <> "" then + bThrough = TRUE + ListAppend ( lsInterim (), xmlZeile2 ) + end if + end if + end if + end if + end if + end if + loop + + xInput.closeInput '* uno-file-close + + if bSilent = FALSE then + if MasterSecOK = FALSE then warnlog "GetXMLValueGlobal (...) : '" + sXMLsectionMaster + "' -> Master-section was not found!" + end if + wait 1000 +end function +' +'------------------------------------------------------------------------------- +' +function GetExtractXMLValue ( sFullLine as String, optional sXMLType, optional sXMLTag ) as String +'/// Get the value-string, when the text is only in one line. ///' +'/// Input : - sFullLine => the whole line out of XML-File ///' +'/// Output : - optional sXMLType => if sXMLType is set, it will be returned the Type of the value as string ///' +'/// Return : - the text between <value> and <value/> ///' + Dim i, ii, iStart, iEnd as Integer + Dim sInterim, ssTag as String + + if ( IsMissing ( sXMLTag ) ) = TRUE then + ssTag = "value" + else + ssTag = sXMLTag + end if + + sInterim = lCase ( sFullLine ) + + if InStr ( sInterim, "<" + ssTag + "/>" ) <> 0 then + GetExtractXMLValue = "" + else + iStart = InStr ( sInterim, "<" + ssTag + ">" ) + iEnd = InStr ( sInterim, "</" + ssTag + ">" ) + if iStart <> 0 AND iEnd <> 0 then + if iStart + len(ssTag) + 2 = iEnd then + GetExtractXMLValue = "" + else + GetExtractXMLValue = Mid ( sFullLine, iStart + len ( ssTag )+2, iEnd - iStart - len ( ssTag ) - 2 ) + end if + end if + end if + + if ( IsMissing ( sXMLType ) ) = FALSE then + sXMLType = lcase (sXMLType) + ii = InStr ( sInterim, sXMLType + "=" ) + if ii = 0 then ii = InStr ( sInterim, sXMLType + " =" ) + if ii = 0 then ii = InStr ( sInterim, sXMLType + " =" ) + + if ii = 0 then + sXMLType = "" + else + for i=ii to len ( sInterim ) - ii + if Mid ( sInterim, i, 1 ) = chr (34) then + iStart=i + i=1000 + end if + next i + for i=(iStart+1) to len ( sInterim ) - (iStart+1) + if Mid ( sInterim, i, 1 ) = chr (34) then + iEnd=i + i=1000 + end if + next i + sXMLType = Mid ( sFullLine, iStart+1, iEnd-iStart-1 ) + end if + end if + +end function +' +'------------------------------------------------------------------------------- +' +function GetExtractXMLValueList ( lsXMLValues (), sFullLine as String, optional sXMLType, optional sXMLTag ) as Integer +'/// Get the value-string, when the text is only in one line ///' +'/// Input : - ///' +'/// Output : - ///' +'/// Return : - ///' + Dim i, ii, iStart, iEnd as Integer + Dim sInterim, ssTag as String + + lsXMLValues(0)=0 + + if ( IsMissing ( sXMLTag ) ) = TRUE then + ssTag = "value" + else + ssTag = sXMLTag + end if + + sInterim = lCase ( sFullLine ) + ii = len( sInterim ) / len ( ssTag ) ' maximal so viele Wiederholungen, wie es sTags gibt + + for i=1 to ii + if InStr ( sInterim, "<" + ssTag + "/>" ) = 0 then + iStart = InStr ( sInterim, "<" + ssTag + ">" ) + iEnd = InStr ( sInterim, "</" + ssTag + ">" ) + if iStart <> 0 AND iEnd <> 0 then + if iStart + len(ssTag) + 2 = iEnd then + ListAppend ( lsXMLValues(), "" ) + sInterim = Mid ( sInterim, iEnd + len (ssTag)+2, len (sInterim) - iEnd - len (ssTag) - 1 - 2 ) + else + ListAppend ( lsXMLValues(), Mid ( sInterim, iStart + len(ssTag)+2, iEnd - iStart - len(ssTag)-2 ) ) + sInterim = Mid ( sInterim, iEnd + len (ssTag), len (sInterim) - iEnd - len (ssTag) - 1 ) + end if + else + i = ii + 1 + end if + end if + next i + GetExtractXMLValueList = ListCount ( lsXMLValues() ) + + if ( IsMissing ( sXMLType ) ) = FALSE then + sXMLType = lcase (sXMLType) + ii = InStr ( sInterim, sXMLType + "=" ) + if ii = 0 then ii = InStr ( sInterim, sXMLType + " =" ) + if ii = 0 then ii = InStr ( sInterim, sXMLType + " =" ) + + if ii = 0 then + sXMLType = "" + else + for i=ii to len ( sInterim ) - ii + if Mid ( sInterim, i, 1 ) = chr (34) then + iStart=i + i=1000 + end if + next i + for i=(iStart+1) to len ( sInterim ) - (iStart+1) + if Mid ( sInterim, i, 1 ) = chr (34) then + iEnd=i + i=1000 + end if + next i + sXMLType = Mid ( sFullLine, iStart+1, iEnd-iStart-1 ) + end if + end if + +end function +' +'------------------------------------------------------------------------------- +' +function GetExtractXMLValueFromList ( lsList() as String, optional sXMLType, optional sXMLTag ) as String +'/// Get the value-string, when the text is in a list ( when the item is written in more than one line ). ///' +'/// Input : - lsList() => the list of the whole entry of the xml-item ///' +'/// Output : - optional sXMLType => if sXMLType is set, it will be returned the Type of the value as string ///' +'/// Return : - the text between <value> and <value/> ///' + Dim i, ii, iStart, iEnd as Integer + Dim sInterim, sInterim1, ssTag as String + + if ( IsMissing ( sXMLTag ) ) = TRUE then + ssTag = "value" + else + ssTag = sXMLTag + end if + + for i=1 to ListCount ( lsList() ) + sInterim1 = sInterim1 + lsList(i) + next i + + sInterim = lCase ( sInterim1 ) + + if InStr ( sInterim, "<"+ ssTag +"/>" ) <> 0 then + GetExtractXMLValueFromList = "" + else + iStart = InStr ( sInterim, "<" + ssTag + ">" ) + iEnd = InStr ( sInterim, "</" + ssTag + ">" ) + if iStart <> 0 AND iEnd <> 0 then + if iStart + len(ssTag) + 2 = iEnd then + GetExtractXMLValueFromList = "" + else + GetExtractXMLValueFromList = Mid ( sInterim1, iStart + len ( ssTag )+2, iEnd - iStart - len ( ssTag ) - 2 ) + end if + end if + end if + + if ( IsMissing ( sXMLType ) ) = FALSE then + sXMLType = lcase (sXMLType) + ii = InStr ( sInterim, sXMLType + "=" ) + if ii = 0 then ii = InStr ( sInterim, sXMLType + " =" ) + if ii = 0 then ii = InStr ( sInterim, sXMLType + " =" ) + + if ii = 0 then + sXMLType = "" + else + for i=ii to len ( sInterim ) - ii + if Mid ( sInterim, i, 1 ) = chr (34) then + iStart=i + i=1000 + end if + next i + for i=(iStart+1) to len ( sInterim ) - (iStart+1) + if Mid ( sInterim, i, 1 ) = chr (34) then + iEnd=i + i=1000 + end if + next i + sXMLType = Mid ( sInterim1, iStart+1, iEnd-iStart-1 ) + end if + end if +end function +' +'----------------------------------------------------------------------------- +' +function hXMLSeekElementInTree ( sSeekThisNodeXML as STRING ) as BOOLEAN + hXMLSeekElementInTree = FALSE +' Peter Junge: 2005-07-29 +'///<u><b>Recursion to find XML element</b></u>/// +'///Input: 'sSeekThisNodeXML' - XML element to seek, e.g. 'foo:bar'/// +'///(A XML DOM has to be loaded before)/// +'///Seek begins at current XML pointer/// +'///Return: TRUE if element was found, else FALSE/// +'///BEHAVIOUR: XML pointer is set to 'foo:bar' if found, if not XML pointer is reset to initial element/// +'///NOTE: Currently only the first appearence of 'foo:bar' is found./// +'///NOTE: If e.g. the Nth element should be found you have to modify this function/// +'///NOTE: There should be further enhancements possible, e.g. find element with specific attribute/// + dim iIndex as INTEGER + '///<ul><li>Check if current node matches 'sSeekThisNodeXML'</li>/// + if SAXGetElementName() = sSeekThisNodeXML then + '///<li>MATCH: Function returns TRUE</li>/// + hXMLSeekElementInTree = TRUE + else + '///<li>NO MATCH: LOOKUP if current node has elements</li>/// + for iIndex = 1 to SAXGetChildCount() + '///<li>-> (Loop) Set pointer on child</li>/// + SAXSeekElement ( iIndex ) + '///<li>-> Check if child is a XML element</li>/// + if SAXGetNodeType() = 556 then + '///<li>-> RECURSION: function recalls itself for current element</li>/// + if hXMLSeekElementInTree ( sSeekThisNodeXML ) = TRUE then + '///<li>Don't forget to pass back the result TRUE to recursions parent</li>/// + hXMLSeekElementInTree = TRUE + '///<li>Exit loop if found</li>/// + Exit For + endif + endif + '///<li>NO MATCH: Go back to parent in DOM tree</li></ul>/// + SAXSeekElement( 0 ) + next iIndex + endif +end function + diff --git a/testautomation/global/tools/includes/optional/t_xml2.inc b/testautomation/global/tools/includes/optional/t_xml2.inc new file mode 100755 index 000000000000..46dc9b350393 --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_xml2.inc @@ -0,0 +1,492 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : helge.delfs@oracle.com +'* +'* short description : XML search routines II +'* +'************************************************************************ +'* +' #1 GetXMLValueLineExtra ' DEPRECATED depending on t_xml1.inc::GetXMLValueGlobal +' #1 XMLWellFormed ' Checks the well formness of a XML file. +' #1 GetXMLValue2 ' OBSOLETE: XML search routine (as TT has no SAX included we have used that rountine) +' #1 GetBodiesItemStyleName ' DEPRECATED used by ../xml/level1/inc/sxw7_02.inc +' #1 GetLineInXMLBody ' DEPRECATED used by ../xml/level1/inc/sxw7_02.inc and ../sxw7_03.inc +' #1 GetItemStyleName ' DEPRECATED used by ../xml/level1/inc/sxw7_01.inc +' #1 GetXMLElementPath ' Gets the elementpath in a DOM tree (mostly used for [automatic-]styles) +' #1 fWhereIsXMLElementInBody ' Gets the elementpath in a DOM tree in the second level (mostly body elements) +'* +'\*********************************************************************** + +function GetXMLValueLineExtra ( sXMLfile as String, sXMLsectionMaster as String, sXMLsection as String, sGroupTyp as String, sGroupName as String ) as String +'///+ Input:<ul><li>sXMLfile => Filename with full path</li> +'///+ <li>sXMLsectionMaster => The master-section (mostly in OpenOffice.org the filename without extension)</li> +'///+ <li>sXMLsection => Full way to the item</li> +'///+ <li>sGroupTyp => First entry after tag</li> +'///+ <li>sGroupName => Value of first entry</li></ul> + GetXMLValueLineExtra = GetXMLValueGlobal ( sXMLfile, sXMLsectionMaster, sXMLsection + " " + sGroupTyp + "=" + Chr(34) + sGroupName + Chr(34),,, TRUE ) +end function + +'------------------------------------------------------------------------- + +function GetXMLItemInstance ( sXMLfile as String, sXMLsectionMaster as String, sXMLsection as String ) as String +'/// Input:<ul><li>sXMLfile => Filename with full path</li> +'///+ <li>sXMLsectionMaster => The master-section (mostly in OpenOffice.org the filename without extension)</li> +'///+ <li>sXMLsection => Full way to the item</li></ul> + Dim sLine, sLine2 as String + Dim iStart, iEnd, i, iStr, iLen as Integer + + sLine = GetXMLValueLine ( sXMLfile, sXMLsectionMaster, sXMLsection ) + sLine2 = lcase ( sLine ) + iStr = Instr ( sLine2, "instance" ) + iLen = len ( sLine2 ) + iStart = 0 + + if iStr=0 then + GetXMLItemInstance = "false" + exit function + else + for i=iStr to iLen + if iStart = 0 then + if Mid ( sLine2, i, 1 ) = Chr(34) then iStart = i + else + if Mid ( sLine2, i, 1 ) = Chr(34) then + iEnd = i + i= iLen + 1 + end if + end if + next i + end if + if iStart = 0 then + GetXMLItemInstance = "" + else + GetXMLItemInstance = Mid ( sLine, iStart+1, iEnd - iStart - 1 ) + end if +end function + +'------------------------------------------------------------------------- + +function GetXMLItemEncoding ( sXMLfile as String, sXMLsectionMaster as String, sXMLsection as String ) as String +'/// Input: <ul><li>sXMLfile => Filename with full path</li> +'///+ <li>sXMLsectionMaster => The master-section (mostly in OpenOffice.org the filename without extension)</li> +'///+ <li>sXMLsection => Full way to the item</li></ul> + Dim sLine, sLine2 as String + Dim iStart, iEnd, i, iStr, iLen as Integer + + sLine = GetXMLValueLine ( sXMLfile, sXMLsectionMaster, sXMLsection ) + sLine2 = lcase ( sLine ) + iStr = Instr ( sLine2, "encoding" ) + iLen = len ( sLine2 ) + iStart = 0 + + if iStr=0 then + GetXMLItemEncoding = "false" + exit function + else + for i=iStr to iLen + if iStart = 0 then + if Mid ( sLine2, i, 1 ) = Chr(34) then iStart = i + else + if Mid ( sLine2, i, 1 ) = Chr(34) then + iEnd = i + i= iLen + 1 + end if + end if + next i + end if + if iStart = 0 then + GetXMLItemEncoding = "" + else + GetXMLItemEncoding = Mid ( sLine, iStart+1, iEnd - iStart - 1 ) + end if +end function + +'------------------------------------------------------------------------- + +function XMLWellFormed ( sFileName as String, optional bDebug as Boolean ) as Boolean +'/// Input: File name as string +'/// <i>(obsolete: Debug)</i> +'/// Return: TRUE or FALSE + Dim InputstreamXML as string + XMLWellFormed = FALSE + if IsMissing(bDebug) = FALSE then + warnlog "Debugmode 'XMLWellFormed' is obsolete. FUNCTION is now a native TestTool function!" + end if + InputstreamXML = SAXCheckWellFormed(sFileName) + if InputstreamXML <> "" then + warnlog "Problem was found: " & InputstreamXML + else + printlog "File: '" & sFileName & "' is well formed." + XMLWellFormed = TRUE + end if +end function + +'------------------------------------------------------------------------- + +function GetXMLValue2 ( sXMLfile as String, sXMLsectionMaster as String, sXMLsection as String ) as String +'/// Input: <ul><li>sXMLfile => Filename with full path</li></ul> + Dim lsList(10) as String + Dim sInterim, sInterim2 as String + Dim i, ii, iLen, ibegin ,iEnd as Integer + + sInterim = GetXMLValueLine ( sXMLfile, sXMLsectionMaster, sXMLsection,,, ) + if sInterim = "" then + GetXMLValue2 = "" + exit function + end if + + i = ExtractSections ( sXMLsection, lsList() ) + sInterim2 = lsList(i) + iLen = len ( sInterim ) + ii = len ( sInterim2 ) + 1 + + for i=ii to iLen + if mid( sInterim, i, 1 ) = ">" then + iBegin = i+1 + i=iLen+1 + end if + next i + iEnd = ( iLen - ii - 1 ) - iBegin + GetXMLValue2 = Mid ( sInterim, iBegin, iEnd ) +end function + +'------------------------------------------------------------------------- + +function GetBodiesItemStyleName ( AXMLfile as string , WhichItem as string , HowOften as integer , OPTIONAL B ) as string +' Author: Joerg Sievers +'/// With GetBodiesItemStyleName you can get the NAME of a STYLE from +'///+ a item in the BODY of a OpenOffice.org XML-file. +'/// <blockquote>OPTIONAL PARAMETER +'///+ If there are more than one "style-name" tags in ONE line, you +'///+ have to use an optional parameter. +'/// <i>see also</i>:<ul> +'///+ <li>GetXMLValueLineExtra</li></ul> +'/// <u>simple Example</u>: +'///+ String = GetBodiesStyleName ("example.sxc") , "table:table-row" , 2) +'///+ Return: The second STYLE-NAME of the 'table-row'-tag in the office:body +'/// <u>Example with optional parameter</u>: +'///+ XML-line you want to parse for the text:span style-name and it is the second +'///+ text:span-attribute in the office:body-section: +'///+ <blockquote> +'///+ <text:p text:style-name="P1"><text:span text:style-name="T1">The first text</text:span></text:p> +'///+ <text:p text:style-name="P4"><text:span text:style-name="T4">Just a text</text:span></text:p> +'///+ </blockquote> +'///+ then you have to use: +'///+ String = GetBodiesStyleName ("example.sxc") , "table:table-row" , 2 , 1) +'///+ The first ineteger (2) is for the second <text:span-entry in the file. +'///+ The OPTIONAL second integer is the 'ONE' AFTER the first tag in the same line. + Dim FileNum as integer + Dim XMLRawLine as string + Dim XMLCLearedLine as string + Dim a as integer + Dim i as integer + Dim FoundEntry as boolean + Dim DelLeft as integer + Dim ItemPosInString as integer + Dim XMLCLearedLineWithoutLeft as string + Dim DelRight as integer + Dim XMLCLearedAndSeperatedLine as string + + if Dir ( AXMLfile ) = "" then + warnlog "GetBodiesItemStyleName(...) : '" & AXMLfile & "' is missing!" + exit function + end if + + WhichItem = "<" & WhichItem + + a = 0 + FoundEntry = FALSE + + FileNum = FreeFile + + Open AXMLfile For Input As #FileNum + + Do until EOF(#FileNum) = TRUE OR FoundEntry = TRUE + + Line input #FileNum, XMLRawLine +' deleting tabs and spaces + XMLCLearedLine = TrimTab ( Trim ( XMLRawLine ) ) +' jumping to the office:body + if InStr(XMLCLearedLine , "<office:document-") <> 0 then + + Do until EOF(#FileNum) = TRUE OR FoundEntry = TRUE + Line input #FileNum, XMLRawLine + XMLCLearedLine = TrimTab ( Trim ( XMLRawLine ) ) +' if the count of the item is the same as the one searching for... + ItemPosInString = InStr(XMLCLearedLine , WhichItem) + if ItemPosInString <> 0 then +' warnlog "Debug: ItemPosInString = '" & ItemPosInString & "'" +' Is there more than one time the 'WhichItem' in this line? +' (MUST BE GIVEN BY OPTIONAL PARAMETER!) + if IsMissing(B) = FALSE then + For i = 1 to B + DelLeft = InStr(XMLCLearedLine , "style-name=" & CHR$(34)) + XMLCLearedLineWithoutLeft = Mid(XMLCLearedLine, DelLeft+12) + XMLCLearedLine = XMLCLearedLineWithoutLeft + Next i + end if + a = a+1 + if a=HowOften then +' searching for exakt attribute stylename=" + DelLeft = InStr(XMLCLearedLine , "style-name=" & CHR$(34)) +' extrcting, stripping all things after the style-name-attribute (=12 chars) + XMLCLearedLineWithoutLeft = Mid(XMLCLearedLine, DelLeft+12) +' extracting the real name without the " + DelRight = InStr(XMLCLearedLineWithoutLeft , CHR$(34)) +' stripping it + XMLCLearedAndSeperatedLine = Mid(XMLCLearedLineWithoutLeft, 1 , DelRight-1) + GetBodiesItemStyleName = GetBodiesItemStyleName+XMLCLearedAndSeperatedLine + FoundEntry = TRUE + end if + end if + loop + end if + + loop + Close #FileNum +end function + +'------------------------------------------------------------------------- + +function GetLineInXMLBody ( AXMLfile as string , WhichItem as string , HowOften as integer) as string +'Author: Joerg Sievers +'/// With this function you can extract a whole line in <office:body> +'///+ of a XML document. It is important to give this routine the +'///+ correct <ITEM and the count in <office:body>. +'/// <u>simple Example</u>: +'///+ We want to find the 2nd (!) table:table-row item +'///+ <table:table-row table:style-name="ro2" table:visibility="collapse"> +'///+ String = GetLineInXMLBody(gOfficePath & ConvertPath("Content.xml") , "table:table-row" , 2) +'///+ Return: The whole line of the second 'table:table-row'-item. + Dim FileNum as integer + Dim XMLRawLine as string + Dim XMLCLearedLine as string + Dim a as integer + Dim FoundEntry as boolean + Dim ItemPosInString as integer + + if Dir ( AXMLfile ) = "" then + warnlog "GetLineInXMLBody(...) : '" & AXMLfile & "' is missing!" + exit function + end if + + WhichItem = "<" & WhichItem + + a = 0 + FoundEntry = FALSE + + FileNum = FreeFile + + Open AXMLfile For Input As #FileNum + + Do until EOF(#FileNum) = TRUE OR FoundEntry = TRUE + + Line input #FileNum, XMLRawLine +' deleting tabs and spaces + XMLCLearedLine = TrimTab ( Trim ( XMLRawLine ) ) +' jumping to the office:body + if InStr(XMLCLearedLine , "office:body") <> 0 then + Do until EOF(#FileNum) = TRUE OR FoundEntry = TRUE + Line input #FileNum, XMLRawLine + XMLCLearedLine = TrimTab ( Trim ( XMLRawLine ) ) +' if the count of the item is the same as the one searching for... + ItemPosInString = InStr(XMLCLearedLine , WhichItem) + if ItemPosInString <> 0 then + a = a+1 + if a=HowOften then + GetLineInXMLBody = XMLCLearedLine +' printlog "Debug from 'GetLineInXMLBody'-function: '" & XMLCLearedLine & "'" + FoundEntry = TRUE + end if + end if + loop + end if + loop + Close #FileNum +end function +' +'------------------------------------------------------------------------------- +' +function GetItemStyleName ( sMainElement$ , sUsedElement$ , sElement$ , sCount as integer , sStyleName$ ) as string +'Author: Joerg Sievers +'/// With GetItemStyleName you can get the NAME of a STYLE in ANY +'///+ Element in a main element (like office:body-content) of a OpenOffice.org XML-file. +'/// ATTENTION: +'///+ If the second parameter is the SAME as the third one, you are not going into the +'///+ third area. You will stay in the DOM in the second, where e.g. table:table element could +'///+ be found. +'/// <u>simple Example</u>: +'///+ String = GetItemStyleName ( "office:body", "table:table", "table:table-row" , 3 , "table:style-name" ) +'///+ Return: The (attribute) name of the 3rd table-row node in a Writer document. +'///+ With this name you can search in the style-section for the correct values. + Dim InputstreamXML as integer + Dim i as integer + Dim a as integer + Dim xElementName as string + 'Read the file and go to the main DOM node + SAXSeekElement(1) +' If you need a debug mode, enable the printlog entries +' ----------------------------------------------------- +' printlog " +-- function: GetItemStyleName ---------------------------" +' printlog " | Main Node : " & SAXGetElementName + 'Go to the main element (like office:body, office:script, office:automatic-styles, etc.) + SAXSeekElement(sMainElement$) +' printlog " | Main Element : " & sMainElement$ + if sUsedElement$ <> sElement$ then + SAXSeekElement(sUsedElement$) +' printlog " | Used Element : " & sUsedElement$ + end if + InputstreamXML = SaxGetChildCount +' printlog " | Count of Children : " & InputstreamXML + for i = 1 to InputstreamXML + SAXSeekElement(i) + if SAXGetNodeType = NodeTypeElement then + xElementName = SAXGetElementName + if xElementName = sElement$ then + a= a+1 +' printlog "("& i & " / " & a & ") Element:" & xElementName + if a = sCount then + GetItemStyleName = SAXGetAttributeValue(sStyleName$) +' printlog " | Name of Element : " & GetItemStyleName + exit for + end if + end if + SAXSeekElement(0) + end if + next i +' printlog " +---------------------------------------------------------" +end function + +'------------------------------------------------------------------------- + +function GetXMLElementPath ( sMainElement$ , sUsedElement$ , sStyleName$, sStyleNameValue$ ) as string +'Author: Joerg Sievers +'///+ Returns the path (in a DOM tree) for an exact named element. +'///+ With this string it is possible to navigate easily to a named +'///+ element with <i>SAXSeekElement</i>-function. + Dim InputstreamXML as integer + Dim i as integer + Dim xAttributeValue as string + Dim a as integer + Dim xElementName as string + 'Read the file and go to the main DOM node + SAXSeekElement("/") + SAXSeekElement(1) + InputstreamXML = SaxGetChildCount +' If you need a debug mode, enable the printlog entries +' ----------------------------------------------------- +' printlog " +-- function: GetXMLElementPath --------------------------" +' printlog " | Main Node : " & SAXGetElementName + 'Go to the main element (like office:body, office:script, office:automatic-styles, etc.) + SAXSeekElement(sMainElement$) +' printlog " | Main Element : " & sMainElement$ + InputstreamXML = SaxGetChildCount +' printlog " | Count of Children : " & InputstreamXML + for i = 1 to InputstreamXML + SAXSeekElement(i) + xElementName = SAXGetElementName(i) + if xElementName = sUsedElement$ then + xAttributeValue = SAXGetAttributeValue(sStyleName$) + if xAttributeValue = sStyleNameValue$ then +' printlog " | Elementname (" & i & ") : " & xElementName +' printlog " | Attribute value : " & xAttributeValue + GetXMLElementPath = SAXGetElementPath + exit for + end if + end if + SAXSeekElement(0) + next i +' printlog " +---------------------------------------------------------" +end function + +'------------------------------------------------------------------------- + +function fWhereIsXMLElementInBody ( sSubDocumentRootElement as string , sDocumentRootElement as string , sWhichElement as string , OPTIONAL A ) as string +Dim iXMLElements as integer +Dim k as integer +Dim iXMLElementsInSecondLayer as integer +Dim i as integer +'/// A function to parse a XML DOM of an office document and return the <i>Elementpath</i> +'///+ of an element where you can search for in the <u>second level</u>. +SAXSeekElement(sSubDocumentRootElement) +'/// Input:<ol><li>Which element to be searched for</li> +'///+ <li><i>SubDocumentRootElement</i>: +'///+ <ul><li>office:document-meta</li> +'///+ <li>office:document-styles</li> +'///+ <li>office:document-content</li> +'///+ <li>office:document-settings</li></ul></li> +SAXSeekElement(sDocumentRootElement) +'///+ <li><i>DocumentRootElement</i>: +'///+ <ul><li>office:meta</li> +'///+ <li>office:settings</li> +'///+ <li>office:scripts</li> +'///+ <li>office:font-decls</li> +'///+ <li>office:styles</li> +'///+ <li>office:automatic-styles</li> +'///+ <li>office:master-styles</li> + '///+ <li>office:body</li></ul></li></ol> +iXMLElements = SAXGetChildCount + 'If you need debug information, change next line value to TRUE + EnableQAErrors = FALSE + QAErrorLog "Debug: t_xml2.inc::fWhereIsXMLElementInBody::iXMLElements = "& iXMLElements +for i = 1 to iXMLElements + if SAXHasElement(i) = TRUE then + SAXSeekElement(i) + QAErrorLog "Debug: t_xml2.inc::fWhereIsXMLElementInBody::SAXSeekelement(i) [" & i & "] = +- "& SAXGetElementname(i) + iXMLElementsInSecondLayer = SAXGetChildCount + QAErrorLog "Debug: t_xml2.inc::fWhereIsXMLElementInBody::iXMLElementsInSecondLayer [" & i & "] = +- "& iXMLElementsInSecondLayer + if iXMLElementsInSecondLayer <> 0 then + for k = 1 to iXMLElementsInSecondLayer + SAXSeekElement(k) + if SAXGetNodeType = NodeTypeElement then + QAErrorLog "Debug: t_xml2.inc::fWhereIsXMLElementInBody::SAXGetElementName(a) [" & k & "] = +- "& SAXGetElementName(k) + if IsMissing(A) then + if SAXGetElementName(k) = sWhichElement then + fWhereIsXMLElementInBody = SAXGetElementPath + QAErrorLog "Debug: t_xml2.inc::fWhereIsXMLElementInBody =" & fWhereIsXMLElementInBody + exit function + end if + else + if SAXGetElementName((k-1)+A) = sWhichElement then + SAXSeekElement(0) + SAXSeekElement(sWhichElement , A) + QAErrorLog "Debug: t_xml2.inc::fWhereIsXMLElementInBody::SAXGetChildCount =" & SAXGetChildCount + fWhereIsXMLElementInBody = SAXGetElementPath + QAErrorLog "Debug: t_xml2.inc::fWhereIsXMLElementInBody =" & fWhereIsXMLElementInBody + exit function + end if + end if + end if + SAXSeekElement(0) + next k + end if + SAXSeekElement(0) + end if +next i +end function +'------------------------------------------------------------------------- + diff --git a/testautomation/global/tools/includes/optional/t_xml_filter1.inc b/testautomation/global/tools/includes/optional/t_xml_filter1.inc new file mode 100644 index 000000000000..7ccab1c0db88 --- /dev/null +++ b/testautomation/global/tools/includes/optional/t_xml_filter1.inc @@ -0,0 +1,822 @@ +'encoding UTF-8 Do not remove or change this line! +'******************************************************************************* +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/****************************************************************************** +'* +'* owner : helge.delfs@oracle.com +'* +'* short description : Tools / XML Filter Settings Resource Test +'* +'\****************************************************************************** + +testcase tToolsXMLFilterSettings + + Dim iCountOfXSLTStylesAtBeginning as integer + Dim iCountOfXSLTStylesAfterInstallCheck as integer + Dim iApplicationEntries as integer + Dim ia as integer + Dim ib as integer + Dim ic as integer + Dim iCountMsgBox as integer + Dim sErrorPointerTextForResultfile as string + Dim sFilterPackagePath as string + Dim sDocXMLTestFile as string + Dim sWhichFilterToUse as string + Dim sTempReadFilterName as string + Dim bREMOVEXSLT as boolean + Dim bJavaBroken as boolean + + 'Not being used for Writer/WEB + if gApplication = "HTML" then + goto endsub + endif + + 'Define the pointer where all warnlogs/QAErrorLogs will come from in this routine. + sErrorPointerTextForResultfile = "global::tools::inc::t_xml_filter1,inc::tToolsXMLFilterSettings: " + + 'Later it will be detected if the JRE is working with the office installation + 'Here bJavaBroken will be set to the default behaviour (Java is detected and is working) + bJavaBroken = FALSE + + '/// Opening new document. + printlog "- Opening new (application) document." + call hNewDocument + '/// Calling the menu item <i>Tools -> XML Filter Settings</i> + ToolsXMLFilterSettings + printlog "- XML Filter Settings" + Kontext "XMLFilterSettings" + if XMLFilterSettings.Exists(1) then + call Dialogtest (XMLFilterSettings) + else + warnlog sErrorPointerTextForResultfile & "Slot to open the 'XML Filter Settings dialog' failed. Exiting." + goto endsub + end if + 'Counting the existing XSLT stylesheets to verify them after the + 'XSLT stylesheet Check. Setting bREMOVEXSLT = FALSE which only will + 'be TRUE if the count of before and after the check are different. + bREMOVEXSLT = FALSE + iCountOfXSLTStylesAtBeginning = FilterList.GetItemCount + '/// Closing the XML Filter Settings-dialog. + printlog "Closing the 'XML Filter Settings'-dialog." + CloseBtn.Click + '/// Checking if there are any XSLT stylesheets available (<i>finitialXMLSetting("docbook or word or excel")</i>). + printlog " + Checking if there are any XSLT stylesheets available." + select case gApplication + case "CALC" : sWhichFilterToUse = "excel" + case "WRITER" : sWhichFilterToUse = "word" + case else : sWhichFilterToUse = "docbook" + end select + if finitialXMLSetting(sWhichFilterToUse) = FALSE then + warnlog "It wasn't possible to use/install external XML filter. Test aborting!" + goto endsub + end if + ToolsXMLFilterSettings + printlog "Open XML Filter Settings dialog again." + Kontext "XMLFilterSettings" + iCountOfXSLTStylesAfterInstallCheck = FilterList.GetItemCount + if iCountOfXSLTStylesAfterInstallCheck <> iCountOfXSLTStylesAtBeginning then + bREMOVEXSLT = TRUE + end if + '/// Checking disabling of buttons on this dialog. + printlog " + Checking that Edit/Test/Delete/SaveToPackage buttons disabled when no filter is selected." + if EditBtn.IsEnabled then + FilterList.Typekeys "<MOD1 SPACE>" + sleep(1) + end if + if EditBtn.IsEnabled then + warnlog sErrorPointerTextForResultfile & "Edit button: Enabled when no entry is selected!?" + end if + if TestXSLTs.IsEnabled then + warnlog sErrorPointerTextForResultfile & "TestXSLTs button: Enabled when no entry is selected!?" + end if + if DeleteBtn.IsEnabled then + warnlog sErrorPointerTextForResultfile & "Delete button: Enabled when no entry is selected!?" + end if + if SaveToPackage.IsEnabled then + warnlog sErrorPointerTextForResultfile & "SaveToPackage button: Enabled when no entry is selected!?" + end if + '/// Checking disabling of buttons on this dialog. + printlog " + Checking that Edit/Test/Delete/SaveToPackage buttons enabled when one filter is selected." + if NOT EditBtn.IsEnabled then + FilterList.Typekeys "<SPACE>" + sleep(1) + end if + if NOT EditBtn.IsEnabled then + warnlog sErrorPointerTextForResultfile & "Edit button: Disabled when one entry is selected!?" + end if + if NOT TestXSLTs.IsEnabled then + warnlog sErrorPointerTextForResultfile & "TestXSLTs button: Disabled when one entry is selected!?" + end if + if NOT DeleteBtn.IsEnabled then + warnlog sErrorPointerTextForResultfile & "Delete button: Disabled when one entry is selected!?" + end if + if NOT SaveToPackage.IsEnabled then + warnlog sErrorPointerTextForResultfile & "SaveToPackage button: Disabled when one entry is selected!?" + end if + '/// <i>[Loop]</i> + '///+ <ol><li>Clicking the "New" button</li> + '///+ <li>Clicking the "Edit" button</li></ol> + Kontext "XMLFilterSettings" + FilterList.TypeKeys "<HOME>" + for ic = 1 to iCountOfXSLTStylesAfterInstallCheck + Kontext "XMLFilterSettings" + if ( XMLFilterSettings.exists( 2 ) ) then + + 'read the filter names from the dialog. + sTempReadFilterName = FilterList.GetItemText(ic) + + 'lower case comparison! + sTempReadFilterName = lcase(sTempReadFilterName) + if InStr(sTempReadFilterName , sWhichFilterToUse) <> 0 then + FilterList.TypeKeys "<DOWN> " , ic-1 + ' printlog "DEBUG: Filtername: " & FilterList.GetItemText(ic) + WaitSlot() ' Sort of NOOP + endif + else + warnlog( "XML Filter Settings dialog too slow/not displayed" ) + endif + next ic + for ia = 1 to 2 + Kontext "XMLFilterSettings" + select case ia + case 1 : printlog "+- New" + NewBtn.Click + case 2 : printlog "+- Edit" + EditBtn.Click + end select + sleep(1) + Kontext "XMLFilter" + if XMLFilter.Exists(2) then + select case ia + case 1 : printlog " (XML Filter: New)" + case 2 : printlog " (XML Filter: Edit)" + end select + call Dialogtest (XMLFilter) + Tabcontrol.SetPage TabXMLGeneral + Kontext "TabXMLGeneral" + printlog " +- TabXMLGeneral" + if ia = 1 then + '/// If the "New"-button has been used: + call Dialogtest (TabXMLGeneral) + iApplicationEntries = Application.GetItemCount + '///+ <ul><li>Checking the count of applications. Should be 8.</li></ul> + printlog " Checking the count of applications. Should be 8." + if iApplicationEntries <> 8 then + warnlog " +- There should be 8 applications listed in the 'Application'-listbox but there are " & iApplicationEntries & " available!" + else + printlog " +- 8 applications listed in 'Application' listbox." + end if + end if + Kontext "XMLFilter" + Tabcontrol.SetPage TabXMLTransformation + Kontext "TabXMLTransformation" + printlog " +- TabXMLTransformation" + call Dialogtest (TabXMLTransformation) + '/// On tab page "Transformation" press all "Browse"-buttons. + printlog " +- On tab page 'Transformation' press all 'Browse'-buttons." + for ib = 1 to 4 + Kontext "TabXMLTransformation" + select case ib + case 1 : printlog " +- Browse button 'DTD'" + DTDBrowse.Click + case 2 : printlog " +- Browse button 'XSLT for export'" + XSLTForExportBrowse.Click + case 3 : printlog " +- Browse button 'XSLT for import'" + XSLTForImportBrowse.Click + case 4 : printlog " +- Browse button 'Template for import'" + BrowseTemplateForImport.Click + end select + + Kontext "OeffnenDlg" + if OeffnenDlg.Exists(3) then + '/// After every click on "Browse"-button an "FileOpen"-dialog shoud be visible. Cancel that dialog. + printlog " +- After every click on 'Browse'-button an 'FileOpen'-dialog shoud be visible. Cancel that dialog." + call Dialogtest (OeffnenDlg) + OeffnenDlg.Cancel + + else + warnlog sErrorPointerTextForResultfile & "File Open dialog did not appeared." + end if + next ib + '/// [Loop end] + Kontext "XMLFilter" + if ( XMLFilter.exists( 3 ) ) then + printlog " +- Closing 'XML Filter: New Filter'-dialog." + XMLFilter.Cancel + else + warnlog( "XML Filter Dialog not available" ) + endif + '/// Closing "XML Filter: New Filter"-dialog + else + warnlog "XML Filter dialog did not appeared!" + end if + next ia + Kontext "XMLFilterSettings" + '/// Clicking "Test XLSTs"-button. + printlog "+- Clicking 'Test XLSTs'-button." + TestXSLTs.Click + + 'If it's an Import filter it makes no sense to test the export. + if sWhichFilterToUse = "docbook" then + + printlog "+- E X P O R T (Writer, Impress)" + Kontext "TestXMLFilter" + if TestXMLFilter.Exists( 3 ) then + call Dialogtest(TestXMLFilter) + else + warnlog sErrorPointerTextForResultfile & "Testing of the XML filter not possible. Exiting." + Kontext "XMLFilterSettings" + '/// Closing the "XML Filter Settings"-dialog. + printlog "+- Closing the 'XML Filter Settings'-dialog." + 'Deinstall the XSLT stylesheet if this routine has + 'added one at the beginning. + if bREMOVEXSLT = TRUE then + call sRemoveXSLTFilter + end if + Kontext "XMLFilterSettings" + CloseBtn.Click + '/// Closing the opened application document. + printlog "- Closing the opened application document." + '/// ...if there is more than 1 document opened. + if GetDocumentCount > 1 then + call hCloseDocument + end if + 'Here the routine stops if the test dialog is not opening. + goto endsub + end if + ExportBrowseBtn.Click + '/// Press first "Browse"-button on the "Test XML Filter"-dialog. + printlog " +-Press first 'Browse'-button on the 'Test XML Filter'-dialog." + + Kontext "OeffnenDlg" + if OeffnenDlg.Exists( 3 ) then + call Dialogtest (OeffnenDlg) + OeffnenDlg.Cancel + '/// Closing 'FileOpen'-Dialog. + printlog " +- Closing 'FileOpen'-Dialog." + else + warnlog sErrorPointerTextForResultfile & "File Open dialog did not occoured?!" + end if + + Kontext "TestXMLFilter" + if ( TestXMLFilter.exists( 2 ) ) then + '/// If the application is Writer (because the default XSLT stylesheets are only Writer filter). + '///+<ul><li>Clicking on "Current Document"-button.</li></ul> + if gApplication = "WRITER" then + printlog " +- Clicking on 'Current Document'-button." + CurrentDocument.Click + + '/// If Java is not [correctly] installed a messagebox will be shown and the test of the filter will be canceled! + Kontext "Messagebox" + if MessageBox.Exists( 5 ) then + warnlog Messagebox.GetText + try + Messagebox.Cancel + catch + Messagebox.OK + endcatch + else + try + Kontext "XMLFilterOutput" + if XMLFilterOutput.Exists(1) then + '/// "XML Filter Output"-dialog should be visible. + printlog " +- 'XML Filter Output'-dialog should be visible." + call Dialogtest(XMLFilterOutput) + '/// Clicking "Validate"-button. + printlog " +- Clicking 'Validate'-button." + Validate.Click + WaitSlot( 2000 ) + '/// Checking that the validate output control is visible inside the window. + printlog " +- Checking that the validate output control is visible inside the window." + if NOT ValidateOutput.isVisible then + warnlog " +- Validate output is not visible!" + end if + '/// Closing "XML Filter Output"-dialog. + printlog " +- Closing 'XML Filter Output'-dialog." + XMLFilterOutput.Close + + else + warnlog sErrorPointerTextForResultfile & "XML Filter Ouput dialog did not occoured." + end if + catch + warnlog "Testing of XSLTs does not work." + endcatch + end if + else + Kontext "TestXMLFilter" + printlog " +- 'Current Document'-button should not be enabled if no !" + if CurrentDocument.IsEnabled then + Kontext "DocumentWriter" + try + DocumentWriter.TypeKeys "A writer document exists!" + catch + QAErrorLog "'Current Document'-button is enabled but a 'Writer' XML filter has been selected! If there's no Writer document (may be in the background) also opened it would be a bug!" + endcatch + end if + end if + else + warnlog( "FATAL: TestXMLFilter not available" ) + end if + printlog "+- I M P O R T" + endif + + + Kontext "TestXMLFilter" + if ( TestXMLFilter.exists( 2 ) ) then + '/// Clicking "Browse"-button (Import). + printlog " +- Clicking 'Browse'-button (Import)." + ImportBrowseBtn.Click + + Kontext "OeffnenDlg" + if OeffnenDlg.Exists( 2 ) then + call Dialogtest (OeffnenDlg) + '/// Closing "FileOpen"-dialog. + printlog " +- Closing 'FileOpen'-dialog." + OeffnenDlg.Cancel + else + warnlog sErrorPointerTextForResultfile & "File Open dialog did not occoured?!" + end if + else + warnlog( "FATAL: Dialog <TestXMLFilter> is not available" ) + endif + + Kontext "TestXMLFilter" + '/// Checking if 'Display Source'-checkbox is checked (should not be!). + printlog " +- Checking if 'Display Source'-checkbox is checked (should not be!)." + if NOT DisplaySource.IsChecked then + DisplaySource.Check + else + warnlog " +- Display source should be NOT checked as default!" + end if + Kontext "TestXMLFilter" + select case sWhichFilterToUse + case "docbook" : '/// If DocBook XML is being tested use a DocBook XML file. + sDocXMLTestFile = ConvertPath(gTestToolPath & "global\input\xml_filter\docbook.xml") + case "word" : '/// If Word XML is being tested use a Word XML file. + sDocXMLTestFile = ConvertPath(gTestToolPath & "global\input\xml_filter\word.xml") + case "excel" : '/// If Excel XML is being tested use a Excel XML file. + sDocXMLTestFile = ConvertPath(gTestToolPath & "global\input\xml_filter\excel.xml") + case "xhtml" : '/// If XHTML is being tested that use a XHTML file. + sDocXMLTestFile = ConvertPath(gTestToolPath & "global\input\xml_filter\xhtml.xhtml") + case else : warnlog sErrorPointerTextForResultfile & "Wrong parameter has been used! Exiting" + Kontext "TestXMLFilter" + '/// Closing the "Test XML Filter"-dialog. + printlog " +- Closing the 'Test XML Filter'-dialog" + CloseBtn.Click + Kontext "XMLFilterSettings" + '/// Closing the "XML Filter Settings"-dialog. + printlog "+- Closing the 'XML Filter Settings'-dialog." + 'Deinstall the XSLT stylesheet if this routine has + 'added one at the beginning. + if bREMOVEXSLT = TRUE then + call sRemoveXSLTFilter + end if + Kontext "XMLFilterSettings" + CloseBtn.Click + '/// Closing the opened application document. + printlog "- Closing the opened application document." + '/// ...if there is more than 1 document opened. + if GetDocumentCount > 1 then + Call hCloseDocument + end if + goto endsub + end select + '/// Clicking "Browse"-button (Import) again to test it with the XML file. + printlog " +- Clicking 'Browse'-button (Import) again to test it the XML file." + ImportBrowseBtn.Click + + Kontext "OeffnenDlg" + if OeffnenDlg.Exists( 3 ) then + call Dialogtest (OeffnenDlg) + Dateiname.SetText sDocXMLTestFile + Oeffnen.Click + try + ' If Java is not [correctly] installed a messagebox will be shown and the test of the filter will be canceled! + Kontext "Messagebox" + if Messagebox.Exists(2) then + for iCountMsgBox = 1 to 5 + Kontext "Messagebox" + if MessageBox.Exists(2) then + if MessageBox.GetRT = 304 then + if iCountMsgBox = 1 then + warnlog sErrorPointerTextForResultfile & "No output window was visible! Exiting routine!" + endif + QAErrorLog "Dialog (" & iCountMsgBox & "): " & Messagebox.GetText + Messagebox.OK + bJavaBroken = TRUE + if iCountMsgBox > 3 then + warnlog "Instead of 3 times the missing Java RT box will be shown " & iCountMsgBox & " times." + endif + end if + else + exit for + endif + next iCountMsgBox + endif + Kontext "XMLFilterOutput" + if XMLFilterOutput.Exists(3) then + '/// "XML Filter Output"-dialog should be visible. + printlog " +- 'XML Filter Output'-dialog should be visible." + call Dialogtest(XMLFilterOutput) + '/// Clicking "Validate"-button. + printlog " +- Clicking 'Validate'-button." + Validate.Click + + Kontext "Messagebox" + if Messagebox.Exists( 2 ) then + if bJavaBroken then + Messagebox.OK + else + warnlog Messagebox.GetText + Messagebox.OK + endif + endif + '/// Checking that the validate output control is visible inside the window. + printlog " +- Checking that the validate output control is visible inside the window." + Kontext "XMLFilterOutput" + if NOT ValidateOutput.isVisible then + warnlog " +- Validate output is not visible!" + end if + '/// Closing "XML Filter Output"-dialog. + printlog " +- Closing 'XML Filter Output'-dialog." + Kontext "XMLFilterOutput" + XMLFilterOutput.Close + else + warnlog sErrorPointerTextForResultfile & "No output window was visible! Exiting routine!" + Kontext "TestXMLFilter" + '/// Closing the "Test XML Filter"-dialog. + printlog " +- Closing the 'Test XML Filter'-dialog" + CloseBtn.Click + Kontext "XMLFilterSettings" + '/// Closing the "XML Filter Settings"-dialog. + printlog "+- Closing the 'XML Filter Settings'-dialog." + 'Deinstall the XSLT stylesheet if this routine has + 'added one at the beginning. + if bREMOVEXSLT = TRUE then + call sRemoveXSLTFilter + end if + Kontext "XMLFilterSettings" + CloseBtn.Click + '/// Closing the opened application document. + printlog "- Closing the opened application document." + '/// ...if there is more than 1 document opened. + if GetDocumentCount > 1 then + call hCloseDocument + end if + 'Here the routine stops if there is no Java installed or the output was not visible. + goto endsub + end if + catch + '/// If Java is not [correctly] installed a messagebox will be shown and the test of the filter will be canceled! + Kontext "Messagebox" + if MessageBox.Exists( 2 ) then + warnlog Messagebox.GetText + Messagebox.OK + warnlog sErrorPointerTextForResultfile & "Java is not usable! Exiting routine!" + Kontext "TestXMLFilter" + '/// Closing the "Test XML Filter"-dialog. + printlog " +- Closing the 'Test XML Filter'-dialog" + CloseBtn.Click + Kontext "XMLFilterSettings" + '/// Closing the "XML Filter Settings"-dialog. + printlog "+- Closing the 'XML Filter Settings'-dialog." + 'Deinstall the XSLT stylesheet if this routine has + 'added one at the beginning. + if bREMOVEXSLT = TRUE then + call sRemoveXSLTFilter + end if + Kontext "XMLFilterSettings" + CloseBtn.Click + '/// Closing the opened application document. + printlog "- Closing the opened application document." + '/// ...if there is more than 1 document opened. + if GetDocumentCount > 1 then + call hCloseDocument + end if + goto endsub + end if + endcatch + else + warnlog sErrorPointerTextForResultfile & "File Open dialog missing! Not able to load test documents. Exiting routine!" + Kontext "TestXMLFilter" + '/// Closing the "Test XML Filter"-dialog. + printlog " +- Closing the 'Test XML Filter'-dialog" + CloseBtn.Click + Kontext "XMLFilterSettings" + '/// Closing the "XML Filter Settings"-dialog. + printlog "+- Closing the 'XML Filter Settings'-dialog." + 'Deinstall the XSLT stylesheet if this routine has + 'added one at the beginning. + if bREMOVEXSLT = TRUE then + call sRemoveXSLTFilter + end if + Kontext "XMLFilterSettings" + CloseBtn.Click + '/// Closing the opened application document. + printlog "- Closing the opened application document." + '/// ...if there is more than 1 document opened. + if GetDocumentCount > 1 then + call hCloseDocument + end if + goto endsub + end if + '/// Closing the tested XML document + printlog " +- Closing the tested XML document" + '/// ...if there is more than 1 document opened. + if GetDocumentCount > 1 then + call hCloseDocument + else + QAErrorLog "#i27370# Normaly there should be a second document but there is none!" + end if + + Kontext "TestXMLFilter" + if ( TestXMLFilter.exists( 1 ) ) then + if bJavaBroken = FALSE then + '/// Clicking on "Recent File"-Button. + printlog " +- Clicking on 'Recent File'-Button." + RecentFile.Click + + Kontext "XMLFilterOutput" + '/// "XML Filter Output"-dialog should be visible. + printlog " +- 'XML Filter Output'-dialog should be visible." + + Kontext "XMLFilterOutput" + '/// Closing "XML Filter Output"-dialog. + printlog " +- Closing 'XML Filter Output'-dialog." + XMLFilterOutput.Close + + '/// Closing the tested XML document + printlog " +- Closing the tested XML document" + '/// ...if there is more than 1 document opened. + if GetDocumentCount > 1 then + call hCloseDocument + else + QAErrorLog "#i27370# Normaly there should be a second document but there is none!" + end if + + Kontext "TestXMLFilter" + '/// Closing the "Test XML Filter"-dialog. + printlog " +- Closing the 'Test XML Filter'-dialog" + endif + else + warnlog( "Dialog <TestXMLFilter> is not available" ) + endif + + CloseBtn.Click + + Kontext "XMLFilterSettings" + if ( XMLFilterSettings.exists( 1 ) ) then + '/// Clicking "Delete"-button. + printlog " +- Clicking 'Delete'-button" + DeleteBtn.Click + Kontext + if Active.Exists(1) then + if Active.GetRT = 304 then + Active.No + end if + end if + else + warnlog( "Dialog <XMLFilterSettings> is not available" ) + endif + + '/// Clicking 'Save to Package'-button. + Kontext "XMLFilterSettings" + if ( XMLFilterSettings.exists( 1 ) ) then + + printlog " +- Clicking 'Save to Package'-button." + SaveToPackage.Click + + Kontext "SpeichernDlg" + if SpeichernDlg.Exists( 3 ) then + call Dialogtest(SpeichernDlg) + SpeichernDlg.Cancel + '/// Closing 'File Save As'-Dialog. + printlog " +- Closing 'File Save As'-Dialog." + else + warnlog sErrorPointerTextForResultfile & "Save As dialog missing!" + end if + else + warnlog( "Dialog <XMLFilterSettings> is not available" ) + endif + + + '/// Clicking 'Open Package'-button. + Kontext "XMLFilterSettings" + if ( XMLFilterSettings.exists( 1 ) ) then + printlog " +- Clicking 'Open Package'-button." + OpenPackage.Click + + Kontext "OeffnenDlg" + if OeffnenDlg.Exists( 3 ) then + call Dialogtest(OeffnenDlg) + OeffnenDlg.Cancel + '/// Closing 'FileOpen'-Dialog. + printlog " +- Closing 'FileOpen'-Dialog." + else + warnlog sErrorPointerTextForResultfile & "File open dialog missing!" + end if + else + warnlog( "Dialog <XMLFilterSettings> is not available" ) + endif + + + '/// Closing the "XML Filter Settings"-dialog. + Kontext "XMLFilterSettings" + if ( XMLFilterSettings.exists( 1 ) ) then + printlog "+- Closing the 'XML Filter Settings'-dialog." + 'Deinstall the XSLT stylesheet if this routine has + 'added one at the beginning. + if bREMOVEXSLT = TRUE then + call sRemoveXSLTFilter + end if + else + warnlog( "Dialog <XMLFilterSettings> is not available" ) + endif + + + Kontext "XMLFilterSettings" + if ( XMLFilterSettings.exists( 1 ) ) then + CloseBtn.Click + '/// Closing the opened application document. + else + warnlog( "Dialog <XMLFilterSettings> is not available" ) + endif + + printlog "- Closing the opened application document." + '/// ...if there is more than 1 document opened. + if ( hFileCloseAll() <> 2 ) then + QAErrorLog "#i27370# Normaly there should be a second document but there is none!" + end if + +endcase + +'------------------------------------------------------------------------- + +sub fInitialXMLSetting( sXMLFilterType as string ) as boolean +'/// This small function adds the latest and greatest XSLT stylesheet +'///+ to the office.<br> +'///+ The result is TRUE if the packages are already available or if they +'///+ have been installed successfully in this routine. +'/// <u>Input</u>: excel, word, docbook, xhtml +'/// <u>Output</u>: TRUE or FALSE + Dim iCountOfDefaultXSLTStyles as integer + Dim iSecondCountOfDefaultXSLTStyles as integer + Dim sFilterPackagePath as string + Dim sTempReadFilterName as string + Dim ia as integer + + 'Setting boolean to FALSE + fInitialXMLSetting = FALSE + '/// Opening new document. + printlog "global::tools::inc::t_xml_filter1,inc::fInitialXMLSetting: Opening new " & gApplication & " document." + call hNewDocument + '/// Calling the menu item <i>Tools -> XML Filter Settings</i> + ToolsXMLFilterSettings + printlog "global::tools::inc::t_xml_filter1,inc::fInitialXMLSetting: Opening the XML Filter Settings dialog." + Kontext "XMLFilterSettings" + call Dialogtest (XMLFilterSettings) + '/// Checking if there are any XSLT stylesheets available. + printlog "global::tools::inc::t_xml_filter1,inc::fInitialXMLSetting: Checking if there are any XSLT stylesheets available." + iCountOfDefaultXSLTStyles = FilterList.GetItemCount + ' printlog "DEBUG (a): " & iCountOfDefaultXSLTStyles + if iCountOfDefaultXSLTStyles <> 0 then + '/// Check if the same filter already exists. + 'Using lowercased input parameter. + sXMLFilterType = lcase(sXMLFilterType) + for ia = 1 to iCountOfDefaultXSLTStyles + Kontext "XMLFilterSettings" + 'read the filter names from the dialog. + sTempReadFilterName = FilterList.GetItemText(ia) + ' printlog "global::tools::inc::t_xml_filter1,inc::fInitialXMLSetting: DEBUG: (" & ia & ") " & sTempReadFilterName + 'lower case comparison! + sTempReadFilterName = lcase(sTempReadFilterName) + 'if a _part_ of the filtername matches the readed filter name the criteria is true! + if InStr(sTempReadFilterName , sXMLFilterType) <> 0 then + fInitialXMLSetting = TRUE + Kontext "XMLFilterSettings" + CloseBtn.Click + Call hCloseDocument + exit sub + end if + next ia + 'if no filter name maches the for...next loop will be left + 'and the same routine as used for 0 filter installed will + 'be used to install a filter package. + end if + printlog "global::tools::inc::t_xml_filter1,inc::fInitialXMLSetting: The XML filter is not available: Adding the " & sXMLFilterType & " XML filter." + '///+ The packages will be used from "qatesttool/global/input/xslt_stylesheets/*.jar" + ' printlog "DEBUG: " & sXMLFilterType + select case sXMLFilterType + case "excel" : sFilterPackagePath = ConvertPath(gTestToolPath & "global\input\xslt_stylesheets\excel.jar") + case "word" : sFilterPackagePath = ConvertPath(gTestToolPath & "global\input\xslt_stylesheets\word.jar") + case "docbook" : sFilterPackagePath = ConvertPath(gTestToolPath & "global\input\xslt_stylesheets\docbook.jar") + case "xhtml" : sFilterPackagePath = ConvertPath(gTestToolPath & "global\input\xslt_stylesheets\xhtml.jar") + end select + OpenPackage.Click + + Kontext "OeffnenDlg" + if ( OeffnenDlg.exists( 2 ) ) then + call Dialogtest (OeffnenDlg) + Dateiname.SetText sFilterPackagePath + Oeffnen.Click + + Kontext + if Active.Exists(3) then + if Active.GetRT = 304 then + printlog "global::tools::inc::t_xml_filter1,inc::fInitialXMLSetting: " & Active.GetText + Active.OK + Kontext "XMLFilterSettings" + iSecondCountOfDefaultXSLTStyles = FilterList.GetItemCount + printlog "global::tools::inc::t_xml_filter1,inc::fInitialXMLSetting: Checking again the count of installed XSLT stylesheets." + if iSecondCountOfDefaultXSLTStyles <> (iCountOfDefaultXSLTStyles+1) then + warnlog "global::tools::inc::t_xml_filter1,inc::fInitialXMLSetting: It was not possible to add " & sXMLFilterType & "-XML filter!" + warnlog "global::tools::inc::t_xml_filter1,inc::fInitialXMLSetting: Test aborted!" + exit sub + else + printlog "global::tools::inc::t_xml_filter1,inc::fInitialXMLSetting: XML filter has been installed!" + fInitialXMLSetting = TRUE + end if + end if + end if + else + warnlog( "Dialog <OeffnenDlg> is not available" ) + endif + + Kontext "XMLFilterSettings" + if ( XMLFilterSettings.exists( 1 ) ) then + '/// Closing the XML Filter Settings-dialog. + printlog "global::tools::inc::t_xml_filter1,inc::fInitialXMLSetting: Closing the 'XML Filter Settings'-dialog." + CloseBtn.Click + else + warnlog( "Dialog <XMLFilterSettings> is not available" ) + endif + '/// Closing the opened application document. + printlog "global::tools::inc::t_xml_filter1,inc::fInitialXMLSetting: Closing the opened application document." + call hCloseDocument +end sub + +'------------------------------------------------------------------------- + +sub sRemoveXSLTFilter + Dim sXMLFilterType as string + Dim iCountOfDefaultXSLTStyles as integer + Dim ia as integer + Dim sTempReadFilterName as string + Kontext "XMLFilterSettings" + select case gApplication + case "CALC" : sXMLFilterType = "excel" + case "WRITER" : sXMLFilterType = "word" + case else : sXMLFilterType = "docbook" + end select + iCountOfDefaultXSLTStyles = FilterList.GetItemCount + if iCountOfDefaultXSLTStyles <> 0 then + '/// Search for the filter in filter list. + 'Using lowercased input parameter. + for ia = 1 to iCountOfDefaultXSLTStyles + Kontext "XMLFilterSettings" + 'read the filter names from the dialog. + sTempReadFilterName = FilterList.GetItemText(ia) + 'lower case comparison! + if InStr(sTempReadFilterName , sXMLFilterType) <> 0 then + '/// If the filter has been found delete it. + FilterList.TypeKeys "<HOME>" + wait( 100 ) + FilterList.TypeKeys "<DOWN>" , (ia-1) + wait( 100 ) + DeleteBtn.Click + Kontext + if Active.Exists(1) then + if Active.GetRT = 304 then + Active.Yes + end if + end if + exit sub + end if + next ia + else + warnlog "The count of XML filters has to be >0! Problem?" + end if +end sub + diff --git a/testautomation/global/tools/includes/required/t_dir.inc b/testautomation/global/tools/includes/required/t_dir.inc new file mode 100755 index 000000000000..ee673e6b1c47 --- /dev/null +++ b/testautomation/global/tools/includes/required/t_dir.inc @@ -0,0 +1,291 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : thorsten.bosbach@oracle.com +'* +'* short description : functions for directories and files; execution happens in the office +'* +'\************************************************************************ + +function DirNameList (ByVal sPfad$ , lsDirName() as String ) as Integer + '/// seperate a path in its parts + '/// <u>Input</u>: Path to seperate; Empty list, because it get's reset in this function!; + '/// <u>Return</u>: Number on entries in the list; list with entries + Dim i% : Dim Pos% + lsDirName(0) = 0 + do + Pos% = InStr(1, sPfad$, gPathsigne ) ' got a part of teh path + i% = Val(lsDirName(0) ) + 1 + lsDirName(0) = i% + lsDirName( i% ) = Left( sPfad$, Pos% ) ' .. put into list + sPfad = Mid( sPfad$, Pos% + 1 ) ' ...cut off + loop while Pos%>0 + lsDirName( i% ) = sPfad$ + DirNameList = i% ' count of +end function +' +'------------------------------------------------------------------------------- +' +function GetFileNameList ( sPath$, sMatch$ ,lsFile() as String ) as integer + '/// Get files from a directory that match the pattern and append them to a list (without path) + '/// <u>Input</u>: Directory with complete path; Search Pattern, e.g *.*; List + '/// <u>Return</u>: count of appended entries; updated list + Dim Count% : Dim Datname as String + Dim i as Integer + Count% = 0 + ' at the end of the string has to be teh path seperator, else the dir-command doesn't work + if right ( sPath$, 1 ) <> gPathSigne then sPath$ = sPath$ + gPathSigne + Datname = app.Dir( sPath$ + sMatch$ , 0) ' 0: normal files + for i=1 to 5 + if Right ( Datname, 1 ) = "." then + Datname = app.Dir + else + i=10 + end if + next i + + do until Len(Datname) = 0 + Count% = Count% + 1 + lsFile(Count%) = Datname ' append + lsFile(0) = Count% + Datname = app.Dir + loop + + GetFileNameList = Count% ' All files +end function +' +'------------------------------------------------------------------------------- +' +function GetFileList ( sPath$, sMatch$ ,lsFile() as String ) as integer + '/// Get files from a directory that match the pattern and append them to a list (<b>with</b> path) + '/// <u>Input</u>: Directory with complete path; Search Pattern, e.g *.*; List + '/// <u>Return</u>: count of appended entries; updated list + Dim Count% : Dim Datname as String + Dim i as Integer + Count% = 0 + ' at the end of the string has to be teh path seperator, else the dir-command doesn't work + if right ( sPath$, 1 ) <> gPathSigne then sPath$ = sPath$ + gPathSigne + Datname = app.Dir( sPath$ + sMatch$ , 0) + for i=1 to 5 + if Right ( Datname, 1 ) = "." then + Datname = app.Dir + else + i=10 + end if + next i + + do until Len(Datname) = 0 + lsFile(0) = Val(lsFile(0)) + 1 + lsFile( lsFile(0) ) =sPath$ + Datname + Count% = Count% + 1 + + ' if the number of files in the directory exceeds the arraysize do not + ' crash but try to handle the situation gracefully. Of course this + ' makes the testresults worthless... + if ( Count% = ubound( lsFile() ) ) then + warnlog ( "List of files exceeds bounds of array." ) + printlog( "Processing of this directory will be discontinued." ) + printlog( "Last processed file was: " & Datname ) + printlog( "Arraysize is: " & ubound( lsFile() ) ) + Datname = "" + else + Datname = app.Dir + endif + loop + GetFileList = Count% +end function +' +'------------------------------------------------------------------------------- +' +function GetDirList ( sPath$, sMatch$ ,lsFile() as String ) as integer + '/// Get Subdirectories from a directory and append them to a list (<b>with</b> path) + '/// <u>Input</u>: Directory with complete path; Search Pattern, e.g *; List + '/// <u>Return</u>: count of appended entries; updated list + Dim iFolderCount as integer + Dim Folder as String + ' at the end of the string has to be teh path seperator, else the dir-command doesn't work + if right ( sPath$, 1 ) <> gPathSigne then sPath$ = sPath$ + gPathSigne + Folder = app.Dir( sPath$ + sMatch$ , 16) + iFolderCount = 0 + + do until Len( Folder ) = 0 + select case ( lcase( Folder ) ) + case "." + case ".." + case ".svn" + case ".hg" + case else + lsFile(0) = Val(lsFile(0)) + 1 + lsFile( lsFile(0) ) = sPath$ + Folder + gPathSigne + iFolderCount = iFolderCount + 1 + end select + Folder = app.Dir + loop + GetDirList = iFolderCount +end function +' +'------------------------------------------------------------------------------- +' +function GetAllDirList ( byVal sPath$, byVal sMatch$ ,lsFile() as String ) as integer + '/// Get all directorys recursiv that match the pattern and append them to a list + '/// <u>Input</u>: Directory with complete path; Search Pattern, e.g *; Empty list, because it get's reset in this function!; + '/// <u>Return</u>: Count of appended entries (1. entry is the whole path); updated list + Dim Count% : Dim DirCount% + + DirCount% = 1 ' dummy + Count% = 1 + lsFile(0) = 1 'new list + lsFile(1) = sPath$ 'first path is the called path + + do until Count%>Val(lsFile(0)) ' get count of 1.generation + DirCount% = GetDirList( lsFile(Count%) , sMatch$, lsFile() ) ' append all subdirectories + Count% = Count% +1 + loop + + GetAllDirList = Count% - 1 ' count of... +end function +' +'------------------------------------------------------------------------------- +' +function GetAllFileList ( byVal sPath$, byVal sMatch$ ,lsFile() as String ) as integer + '/// Get all Files recursiv (including in subdirectories) that match the pattern and append them to a list + '/// <u>Input</u>: Directory with complete path; Search Pattern, e.g *.*; Empty list, because it get's reset in this function!; + '/// <u>Return</u>: Count of appended entries (1. entry is the whole path); updated list + Dim DirCount% : Dim FileCount% : Dim Count% + Dim lsDir(1000) as String + + DirCount% = GetAllDirList( sPath$, "*", lsDir() ) ' erstmal _alle_ Verzeichnisse + FileCount% = 0 + lsFile(0) = 1 + lsFile(1) = sPath$ + + For Count% = 1 to Val( lsDir(0) ) + FileCount% = FileCount% + GetFileList( lsDir( Count% ), sMatch$, lsFile() ) + next Count% + + GetAllFileList = FileCount% ' Anzahl aller Dateien +end function +' +'------------------------------------------------------------------------------- +' +function KillFileList ( lsList() as String ) as Boolean + '/// Delete all files in the list + '/// <u>Input</u>: List with files + '/// <u>Return</u>: TRUE or FALSE if files are killed; modified list with not deleted files. + Dim i as Integer + Dim FehlerListe ( 1000 ) as String + + FehlerListe ( 0 ) = 0 + for i=1 to ListCount ( lsList() ) + try + app.kill ( lsList(i) ) + catch + ListAppend ( FehlerListe (), lsList(i) ) + endcatch + next i + + lsList(0) = 0 ' delete old list + KillFileList = TRUE + for i=1 to ListCount ( FehlerListe () ) + KillFileList = FALSE + ListAppend ( lsList(), FehlerListe (i) ) + next i +end function +' +'------------------------------------------------------------------------------- +' +function KillDirList ( lsList() as String ) as Boolean + '/// Delete all directories in the list + '/// <u>Input</u>: List with directories + '/// <u>Return</u>: TRUE or FALSE if directories are killed; modified list with not deleted directories. + Dim i as Integer + Dim FehlerListe ( 1000 ) as String + + FehlerListe ( 0 ) = 0 + for i=1 to ListCount ( lsList() ) + try + app.rmDir ( lsList(i) ) + catch + ListAppend ( FehlerListe (), lsList(i) ) + endcatch + next i + + lsList(0) = 0 ' delete old list + KillDirList = TRUE + for i=1 to ListCount ( FehlerListe () ) + KillDirList = FALSE + ListAppend ( lsList(), FehlerListe (i) ) + next i +end function +' +'------------------------------------------------------------------------------- +' +function DateiExtract ( sFileDat$ ) + '/// Get the filename from a path + '/// <u>Input</u>: path with file + '/// <u>Return</u>: filename without the path + Dim i% + dim ls(20) as String + + i% = DirNameList( sFileDat$, ls() ) + DateiExtract = ls(i%) +end function +' +'------------------------------------------------------------------------------- +' +function DateiOhneExt (Datei$) as String + '/// Get the filename without the extension + '/// <u>Input</u>: filename + '/// <u>Return</u>: filename without the extension + Dim wh as Integer + Dim dummy as String + + dummy = Datei$ + for wh = 1 to len(dummy) + if mid(dummy,wh,1) = "." then + dummy = left(dummy,wh - 1) + wh = len(dummy) + 1 + else + dummy = dummy + end if + next wh + DateiOhneExt = dummy +end function +' +'------------------------------------------------------------------------------- +' +function GetExtention ( Datei as String ) as string + '/// Get the extension from a file + '/// <u>Input</u>: filename + '/// <u>Return</u>: extension of the file + Dim i% + for i% = 1 to len ( Datei ) + if mid(Datei,i%,1) = "." then Datei = right( Datei, len(Datei)-i%) + next i% + GetExtention = Datei +end function + diff --git a/testautomation/global/tools/includes/required/t_doc1.inc b/testautomation/global/tools/includes/required/t_doc1.inc new file mode 100755 index 000000000000..ff07554bca35 --- /dev/null +++ b/testautomation/global/tools/includes/required/t_doc1.inc @@ -0,0 +1,453 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : thorsten.bosbach@oracle.com +'* +'* short description : Global Routines for Document Handling +'* +'\************************************************************************************* + +sub hNewDocument ( optional bANewDoc ) + '/// hNewDocument : open a new document dependent on 'gApplication' ///' + dim sTemp as string + + if IsMissing ( bANewDoc ) <> TRUE then + if bANewDoc = TRUE then + gNoNewDoc = FALSE + else + gNoNewDoc = TRUE + end if + end if + + select case gApplication + case "WRITER" + Kontext "DocumentWriter" + if gNoNewDoc = TRUE then + FileOpen "FileName", "private:factory/swriter", "SynchronMode", TRUE + else + FileOpen "FileName", "private:factory/swriter", "FrameName", "_default", "SynchronMode", TRUE + end if + if ( DocumentWriter.IsMax() = false ) then + DocumentWriter.Maximize() + Wait( 2000 ) + end if + case "CALC" + Kontext "DocumentCalc" + if gNoNewDoc = TRUE then + FileOpen "FileName", "private:factory/scalc", "SynchronMode", TRUE + else + FileOpen "FileName", "private:factory/scalc", "FrameName", "_default", "SynchronMode", TRUE + end if + if ( DocumentCalc.IsMax() = false ) then + DocumentCalc.Maximize() + Wait( 2000 ) + end if + case "IMPRESS" + Kontext "DocumentImpress" + if gNoNewDoc = TRUE then + FileOpen "FileName", "private:factory/simpress", "SynchronMode", TRUE + else + FileOpen "FileName", "private:factory/simpress", "FrameName", "_default", "SynchronMode", TRUE + Kontext "AutoPilotPraesentation1" + if AutoPilotPraesentation1.Exists (2) then + Printlog "------------------------------The Impress-Autopilot was active------------------" + Startwithwizard.Check ' opposite of the checkboxs' title + AutoPilotPraesentation1.OK + Sleep 2 + Kontext "SeitenLayout" + SeitenLayout.Cancel + end if + Kontext "DocumentImpress" + Sleep 2 + if ( DocumentImpress.IsMax() = false ) then + DocumentImpress.Maximize() + Wait( 2000 ) + end if + end if + case "DRAW" + Kontext "DocumentDraw" + if gNoNewDoc = TRUE then + FileOpen "FileName", "private:factory/sdraw", "SynchronMode", TRUE + else + FileOpen "FileName", "private:factory/sdraw", "FrameName", "_default", "SynchronMode", TRUE + end if + if ( DocumentDraw.IsMax() = false ) then + DocumentDraw.Maximize() + Wait( 2000 ) + end if + case "MASTERDOCUMENT" + Kontext "DocumentMasterDoc" + if gNoNewDoc = TRUE then + FileOpen "FileName", "private:factory/swriter/GlobalDocument", "SynchronMode", TRUE + else + FileOpen "FileName", "private:factory/swriter/GlobalDocument", "FrameName", "_default", "SynchronMode", TRUE + end if + Kontext "Navigator" + sleep (1) + if Navigator.Exists(5) then Navigator.Close + Kontext "DocumentMasterDoc" + if ( DocumentMasterDoc.IsMax() = false ) then + DocumentMasterDoc.Maximize() + Wait( 2000 ) + end if + case "MATH" + Kontext "DocumentMath" + if gNoNewDoc = TRUE then + FileOpen "FileName", "private:factory/smath", "SynchronMode", TRUE + else + FileOpen "FileName", "private:factory/smath", "FrameName", "_default", "SynchronMode", TRUE + end if + Kontext "DocumentMath" + if ( DocumentMath.IsMax() = false ) then + DocumentMath.Maximize() + Wait( 2000 ) + end if + case "HTML" + Kontext "DocumentWriterWeb" + if gNoNewDoc = TRUE then + FileOpen "FileName", "private:factory/swriter/web", "SynchronMode", TRUE + else + FileOpen "FileName", "private:factory/swriter/web", "FrameName", "_default", "SynchronMode", TRUE + end if + Kontext "DocumentWriterWeb" + if ( DocumentWriterWeb.IsMax() = false ) then + DocumentWriterWeb.Maximize() + Wait( 2000 ) + end if + case "DATABASE" + FileOpen "FileName", "private:factory/sdatabase?Interactive", "FrameName", "_default", "SynchronMode", TRUE + Kontext "DatabaseWizard" + if DatabaseWizard.exists(5) then + FinishBtn.click + kontext "SpeichernDlg" + if SpeichernDlg.exists(5) then + if (Dateiname.getSelText = "") then + sTemp = convertPath(gOfficePath + "user/work/hNewDocument.odb") + if fileExists(sTemp) then + app.kill(sTemp) + endif + qaErrorlog "## lost default filename" + Dateiname.setText "hNewDocument" + endif + Speichern.click + Kontext "DATABASE" + else + warnlog "t_doc1.inc::hNewDocument():: Can't create Database Document 2" + endif + else + warnlog "t_doc1.inc::hNewDocument():: Can't create Database Document 1" + endif + case "BASIC" + ToolsMacroMacro + kontext "makro" + if makro.exists(5) then + MakroAus.typeKeys "<home>" + sTemp = "" + while (NOT bearbeiten.isEnabled) AND (sTemp <> MakroAus.getSelText) + sTemp = MakroAus.getSelText + MakroAus.typeKeys "<down>+" + wend + if (bearbeiten.isEnabled) then + bearbeiten.click + else + qaErrorlog "Can't edit document." + endif + else + warnlog "Can't open Basic IDE." + endif + case else : WarnLog "hNewDocument: No Applikation named '" + gApplication + "' exists in this routine!" + end select + Sleep 2 + +end sub +' +'------------------------------------------------------------------------------- +' +function hCreateLabels() as Boolean + + hCreateLabels() = false + + FileOpen( "FileName", "private:factory/swriter?slot=21051", "FrameName", "_default", "SynchronMode", TRUE ) + + Kontext + if ( Active.exists( 5 ) ) then + Active.setPage TabEtiketten + + if ( TabEtiketten.exists( 1 ) ) then + if ( Tabetiketten.isVisible() ) then + hCreateLabels() = true + else + warnlog( "<TabEtiketten> is not visible" ) + endif + else + warnlog( "<TabEtiketten> not open" ) + endif + else + warnlog( "Failed to open <TabEtiketten>" ) + endif + +end function +' +'------------------------------------------------------------------------------- +' +function hCreateBusinessCards() as Boolean + + hCreateBusinessCards() = false + + FileOpen( "FileName", "private:factory/swriter?slot=21052", "FrameName", "_default", "SynchronMode", TRUE ) + + Kontext + if ( Active.exists( 5 ) ) then + Active.setPage TabEtikettenMedium + + if ( TabEtikettenMedium.exists( 1 ) ) then + if ( TabetikettenMedium.isVisible() ) then + hCreateBusinessCards() = true + else + warnlog( "<TabEtikettenMedium> is not visible" ) + endif + else + warnlog( "<TabEtikettenMedium> not open" ) + endif + else + warnlog( "Failed to open <TabEtikettenMedium>" ) + endif + +end function +' +'------------------------------------------------------------------------------- +' +function hCloseDocument() + + '/// Trigger FileClose slot' + hUseAsyncSlot( "FileClose") + + '/// Accept to lose changes' + Kontext "Active" + if ( Active.Exists( 2 ) ) then + try + Active.No + catch + Active.Click( 202 ) + endcatch + end if + + '/// Wait for FileClose to complete' + WaitSlot( 2000 ) + +end function +' +'------------------------------------------------------------------------------- +' +sub gMouseClick ( X%, Y%, optional _mousebutton ) + + dim oDocument as object + dim mousebutton as integer + + ' Handle infamous optional parameter + if ( IsMissing( _mousebutton ) ) then + mousebutton = 1 + else + mousebutton = _mousebutton + endif + + hSetDocumentContext() ' set kontext to current document type + oDocument = hSetDocumentObject() ' get the current document object + + autoexecute = false + oDocument.MouseDown ( X%, Y%, mousebutton ) + oDocument.MouseUp ( X%, Y%, mousebutton ) + autoexecute = true + wait( 1000 ) + +end sub +' +'------------------------------------------------------------------------------- +' +sub gMouseDoubleClick ( X%, Y% ) + + dim oDocument as object + + hSetDocumentContext() ' set kontext to current document type + oDocument = hSetDocumentObject() ' get the current document object + oDocument.MouseDoubleClick ( X%, Y% ) + wait( 1000 ) + +end sub +' +'------------------------------------------------------------------------------- +' +sub gMouseMove ( BeginX%, BeginY%, EndX%, EndY% ) + + dim oDocument as object + + hSetDocumentContext() ' set kontext to current document type + oDocument = hSetDocumentObject() ' get the current document object + oDocument.MouseDown ( BeginX%, BeginY% ) + oDocument.MouseMove ( EndX%, EndY%) + oDocument.MouseUp ( EndX%, EndY% ) + wait( 1000 ) + +end sub +' +'------------------------------------------------------------------------------- +' +sub gMouseDown ( BeginX%, BeginY% ) + + dim oDocument as object + + hSetDocumentContext() ' set kontext to current document type + oDocument = hSetDocumentObject() ' get the current document object + oDocument.MouseDown ( BeginX%, BeginY% ) + wait( 300 ) + +end sub +' +'------------------------------------------------------------------------------- +' +sub gMouseMove2 ( EndX%, EndY% ) + + dim oDocument as object + + hSetDocumentContext() ' set kontext to current document type + oDocument = hSetDocumentObject() ' get the current document object + oDocument.MouseMove ( EndX%, EndY%) + wait( 300 ) + +end sub +' +'------------------------------------------------------------------------------- +' +sub gMouseUp ( EndX%, EndY% ) + + dim oDocument as object + + hSetDocumentContext() ' set kontext to current document type + oDocument = hSetDocumentObject() ' get the current document object + oDocument.MouseUp ( EndX%, EndY% ) + wait( 300 ) + +end sub +' +'------------------------------------------------------------------------------- +' +sub hTypeKeys ( OutputText , optional _iLoop as Integer ) + + dim iRepeat as integer + dim iLoop as integer + dim oDocument as object + + ' Handle infamous optional parameter + If ( IsMissing( _iLoop ) ) then + iLoop = 1 + else + iLoop = _iLoop + endif + + hSetDocumentContext() ' set kontext to current document type + oDocument = hSetDocumentObject() ' Get the document object we want to write to + + for iRepeat = 1 to iLoop + oDocument.TypeKeys( OutputText ) + wait( 200 ) + next iRepeat + +end sub + +'******************************************************************************* + +function hSetDocumentContext() as string + + ' link gApplication to its document kontext + + dim cDocumentContext as string + + select case( gApplication ) + case "DRAW" : cDocumentContext = "DocumentDraw" + case "IMPRESS" : cDocumentContext = "DocumentImpress" + case "WRITER" : cDocumentContext = "DocumentWriter" + case "CALC" : cDocumentContext = "DocumentCalc" + case "MATH" : cDocumentContext = "DocumentMath" + case "HTML" : cDocumentContext = "DocumentWriterWeb" + case "MASTERDOCUMENT" : cDocumentContext = "DocumentMasterDoc" + case "CHART" : cDocumentContext = "DocumentChart" + case "BACKGROUND" : cDocumentContext = "Background" + case else : warnlog( "Unknown gApplication: " & gApplication ) + end select + + kontext cDocumentContext : hSetDocumentContext() = cDocumentContext + +end function + +'******************************************************************************* + +function hSetDocumentObject() as object + + ' link gApplication to its document object + + dim oDocumentObject as object + + select case( gApplication ) + Case "WRITER" : oDocumentObject = DocumentWriter + Case "MASTERDOCUMENT" : oDocumentObject = DocumentMasterDoc + Case "HTML" : oDocumentObject = DocumentWriterWeb + case "CALC" : oDocumentObject = DocumentCalc + case "DRAW" : oDocumentObject = DocumentDraw + case "IMPRESS" : oDocumentObject = DocumentImpress + case "MATH" : oDocumentObject = DocumentMath + case "CHART" : oDocumentObject = DocumentChart + case "BACKGROUND" : oDocumentObject = Desktop + case else : warnlog( "Unknown gApplication: " & gApplication ) + end select + + hSetDocumentObject() = oDocumentObject + +end function + +'******************************************************************************* + +function hSetDocumentFactory() as string + + ' link gApplication to its factory as used by FileOpen slot + + dim cDocumentFactory as string + + select case( gApplication ) + case "DRAW" : cDocumentFactory = "private:factory/sdraw" + case "IMPRESS" : cDocumentFactory = "private:factory/simpress" + case "WRITER" : cDocumentFactory = "private:factory/swriter" + case "CALC" : cDocumentFactory = "private:factory/scalc" + case "MATH" : cDocumentFactory = "private:factory/smath" + case "HTML" : cDocumentFactory = "private:factory/swriter/web" + case "MASTERDOCUMENT" : cDocumentFactory = "private:factory/swriter/GlobalDocument" + case "DATABASE" : cDocumentFactory = "private:factory/sdatabase?Interactive" + case else : warnlog( "Unknown gApplication: " & gApplication ) + end select + + hSetDocumentFactory() = cDocumentFactory + +end function
\ No newline at end of file diff --git a/testautomation/global/tools/includes/required/t_doc2.inc b/testautomation/global/tools/includes/required/t_doc2.inc new file mode 100755 index 000000000000..4192563b0eba --- /dev/null +++ b/testautomation/global/tools/includes/required/t_doc2.inc @@ -0,0 +1,387 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : thorsten.bosbach@oracle.com +'* +'* short description : Global Routines for Document Handling; Part two +'* +'\*********************************************************************** + +sub hTabelleEinfuegen + '/// <b>WRITER only </b>///' + '/// hTabelleEinfuegen hInsertTable ///' + '/// insert a dummy table in writer/writerweb/masterdocument ///' + TableInsertTable + + Kontext "TabelleEinfuegenWriter" + if ( TabelleEinfuegenWriter.exists( 2 ) ) then + + hCloseDialog( TabelleEinfuegenWriter, "ok" ) + + Kontext "TableObjectbar" + if ( TableObjectbar.exists( 1 ) ) then + ' We are happy then, do nothing + else + Kontext "TextObjectbar" + TextObjectbar.SetNextToolBox + end if + + select case ( gApplication ) + Case "WRITER" : Kontext "DocumentWriter" + Case "MASTERDOCUMENT" : Kontext "DocumentMasterDoc" + Case "HTML" : Kontext "DocumentWriterWeb" + end select + else + warnlog( "hTabelleEinfuegen: Failed to open <TabelleEinfuegenWriter> dialog" ) + endif + +end sub +' +'------------------------------------------------------------------------------- +' +sub ZellenMarkieren ( Down%, Right% ) + '/// <b>CALC only</b> ///' + '/// ZellenMarkieren ( Down%, Right% ) : mark the cells ///' + Dim Anzahl as Integer + + Kontext "DocumentCalc" + Anzahl = Right% - 1 + DocumentCalc.TypeKeys "<Shift Right>", Anzahl + Anzahl = Down% - 1 + DocumentCalc.TypeKeys "<Shift Down>", Anzahl +end sub +' +'------------------------------------------------------------------------------- +' +sub hRechteckErstellen ( BeginX%, BeginY%, EndX%, EndY% ) + '/// <b>IMPRESS/DRAW only</b> ///' + '/// hRechteckErstellen ( BeginX, BeginY, EndX, EndY ) : create a rectangle ///' + WL_DRAW_Rechteck + gMouseMove ( BeginX%, BeginY%, EndX%, EndY% ) +end sub +' +'------------------------------------------------------------------------------- +' +sub hTextrahmenErstellen ( TextEingabe$, BeginX%, BeginY%, EndX%, EndY% ) + '/// <b>IMPRESS/DRAW only</b> ///' + '/// hTextrahmenErstellen ( String, BeginX, BeginY, EndX, EndY ) : create a textbox with a textstring ///' + WL_SD_TextEinfuegenDraw + gMouseMove ( BeginX%, BeginY%, EndX%, EndY% ) + hTypeKeys TextEingabe$ +end sub +' +'------------------------------------------------------------------------------- +' +sub SchreibenInMathdok ( Eingabe as String ) + '/// <b>MATH only</b> ///' + '/// SchreibenInMathDok ( String ) : write text in a mathdocument ( with clipboard ) ///' + if Eingabe <> "Unsinn" then + SetClipboard Eingabe + else + SetClipboard "NROOT <?> <?><over b==<?>" + endif + if (GetClipboard() <> Eingabe) then + warnlog "--No Clipboard available :-(--" + printlog "---ClipTest--- should: "+Eingabe +", is: "+GetClipboard + endif + hUseAsyncSlot( "EditPaste" ) +end sub +' +'------------------------------------------------------------------------------- +' +function hEnableDocumentEditMode() as boolean + + hEnableDocumentEditMode() = false + + dim iTry as integer + + printlog( "Try to switch document to edit mode" ) + for iTry = 1 to 20 + try + kontext "Standardbar" + if ( Bearbeiten.getState( 2 ) <> 1 ) then + Bearbeiten.click() + + kontext "Active" + if ( Active.exists( 1 ) ) then + printlog( "Handle <Use copy message>" ) + hCloseDialog( Active, "yes" ) + wait( 2000 ) + printlog( "Successfully switched to edit mode" ) + hEnableDocumentEditMode() = true + exit for + endif + endif + catch + wait( 200 ) + endcatch + next iTry + +end function + +'******************************************************************************* + +function sMakeReadOnlyDocumentEditable() as boolean + + sMakeReadOnlyDocumentEditable() = hEnableDocumentEditMode() + exit function + + ' Function returns TRUE if document has been made editable and FALSE if + ' no action was required (that is: Document was not read-only) + + dim iTry as integer + dim iWait as integer + dim rc as integer + const CFN = "sMakeReadOnlyDocumentEditable::" + + if ( GVERBOSE ) then printlog( CFN & "Making document editable (create a copy) if it is readonly" ) + + ' We still run into synchronization problems with the "Make document editable" feature + ' because we do not know when this button becomes available and ready for use: The + ' document has to be loaded, then we have to wait for the toolbar to get populated. + ' One thing appears to work though: Try to execute the slot using hUseAsyncSlot. + ' This is a little bit tricky because the state of the document is altered but if + ' the slot has been executed once we know for sure that the button on the toolbar is + ' available and can check its state and - if need be - chenge the document state back. + + ' ========== Workaround begin ========== + hUseAsyncSlot( "EditDoc" ) + kontext "Active" + if ( Active.exists() ) then + if ( GVERBOSE ) then printlog( "Handling create copy message" ) + Active.yes() + wait( 1000 ) + endif + ' ========== Workaround end ========== + Kontext "Standardbar" + iWait = 0 + Do + if ( Bearbeiten.IsEnabled() ) then + try + if Bearbeiten.getState( 2 ) = 0 then + exit do + endif + catch + if ( GVERBOSE ) then printlog "Attempt " & iWait & " to make document readable failed" + iWait = iWait + 1 + wait ( 1000 ) + endcatch + else + if ( GVERBOSE ) then printlog "Attempt " & iWait & " to make document readable failed" + iWait = iWait + 1 + wait ( 1000 ) + end if + if iWait >= 5 then exit do + Loop + + if ( Bearbeiten.IsEnabled() ) then + + if ( Bearbeiten.getState( 2 ) = 0 ) then + + rc = hUseAsyncSlot("editdoc") + + if ( rc >= 0 ) then + for iTry = 1 to 2 + + + Kontext "Active" + if ( Active.exists( 5 ) ) then + + printlog( CFN & "Messagebox: " & Active.getText() ) + + try + if ( GVERBOSE ) then printlog( CFN & "Document was read-only. A copy will be used." ) + Active.Yes() + if ( GVERBOSE ) then printlog( CFN & "Closed 'use copy' message" ) + catch + if ( GVERBOSE ) then printlog( CFN & "Probing for unexpected messagebox..." ) + active.ok() + qaerrorlog( "#i100701 - Object not found message" ) + endcatch + else + printlog( CFN & "No messagebox informing about a copy being used" ) + endif + sMakeReadOnlyDocumentEditable() = TRUE + next iTry + else + printlog( CFN & "Document appears to be editable" ) + endif + else + if ( GVERBOSE ) then printlog( CFN & "Button <Bearbeiten> is pressed, document is editable" ) + sMakeReadOnlyDocumentEditable() = FALSE + endif + else + if ( GVERBOSE ) then printlog( CFN & "Control <Bearbeiten> is not enabled" ) + endif + +end function +' +'------------------------------------------------------------------------------- +' +function fSelectFirstOLE() as integer + 'Select first visible OLE object using Navigator + 'Returns error-code: + '+ 0 := Sucess + '- 1 := unknown application + + const RETVAL_SUCCESS = 0 + const RETVAL_UNKNOWN_APPLICATION = -1 + + const MAX_WAIT_FOR_NAVIGATOR = 10 + + dim bNavigatorWasVisible as boolean : bNavigatorWasVisible = FALSE + dim iIndex as integer + + fSelectFirstOLE() = RETVAL_UNKNOWN_APPLICATION + + select case ( gApplication ) + case "CALC" : Kontext "NavigatorCalc" + 'First check if Navigator is visible and remember result + if NavigatorCalc.exists ( MAX_WAIT_FOR_NAVIGATOR ) then + bNavigatorWasVisible = TRUE + else + try + 'Invoke Navigator if not visible + ViewNavigator + catch + 'If inside chart or elsewhere the call + 'will fail. Again trying the slot after + 'switching to the document. + Kontext "DocumentCalc" + DocumentCalc.TypeKeys "<Escape>" + ViewNavigator + endcatch + end if + Kontext "NavigatorCalc" + if NavigatorCalc.exists ( MAX_WAIT_FOR_NAVIGATOR ) then + 'Select first OLE in list + Liste.TypeKeys "<HOME>" + for iIndex = 1 to 8 + Liste.TypeKeys "-" + wait 500 + Liste.TypeKeys "<DOWN>" + wait 500 + next iIndex + Liste.select(6) + Liste.TypeKeys "+" + Liste.TypeKeys "<DOWN><RETURN>" + fSelectFirstOLE() = RETVAL_SUCCESS + else + QAErrorLog "Navigator couldn't be opened!" + end if + case "DRAW" , "IMPRESS" : Kontext "NavigatorDraw" + if NavigatorDraw.Exists( MAX_WAIT_FOR_NAVIGATOR ) then + bNavigatorWasVisible = TRUE + else + try + 'Invoke Navigator if not visible + ViewNavigator + catch + 'If inside chart or elsewhere the call + 'will fail. Again trying the slot after + 'switching to the document. + Kontext "DocumentDraw" + DocumentDraw.TypeKeys "<Escape>" + ViewNavigator + endcatch + Kontext "NavigatorDraw" + if NavigatorDraw.exists( MAX_WAIT_FOR_NAVIGATOR ) then + 'Select first OLE in list + Liste.TypeKeys "<HOME>" + Liste.select(1) + Liste.TypeKeys "+<DOWN><RETURN>" + fSelectFirstOLE() = RETVAL_SUCCESS + else + QAErrorLog "Navigator did not open!" + end if + end if + + case "WRITER" , "HTML" , "MASTERDOCUMENT" : + select case ( gApplication ) + case "MASTERDOCUMENT" : Kontext "NavigatorGlobalDoc" + if NavigatorGlobalDoc.Exists( MAX_WAIT_FOR_NAVIGATOR ) then + bNavigatorWasVisible = TRUE + else + ViewNavigator + end if + wait 500 + Kontext "NavigatorGlobalDoc" + if Liste.IsVisible then + Kontext "GlobaldokumentToolbox" + Umschalten.Click + endif + case else : Kontext "NavigatorWriter" + 'First check if Navigator is visible and remember result + if NavigatorWriter.Exists ( MAX_WAIT_FOR_NAVIGATOR ) then + bNavigatorWasVisible = TRUE + else + try + 'Invoke Navigator if not visible + ViewNavigator + catch + 'If inside chart or elsewhere the call + 'will fail. Again trying the slot after + 'switching to the document. + Kontext "DocumentWriter" + call gMouseclick (99,99) + call gMouseclick (50,50) + ViewNavigator + endcatch + end if + end select + Kontext "NavigatorWriter" + if NavigatorWriter.Exists( MAX_WAIT_FOR_NAVIGATOR ) then + ' Check if all content is visible + if Auswahlliste.GetItemCount < 2 then + Inhaltsansicht.Click + end if + 'Select first OLE in list + Auswahlliste.TypeKeys "<HOME>" + for iIndex = 1 to 13 + Auswahlliste.TypeKeys "-<DOWN>" + next iIndex + Auswahlliste.select(5) + Auswahlliste.TypeKeys "+<DOWN><RETURN>" + fSelectFirstOLE() = RETVAL_SUCCESS + else + QAErrorLog "Navigator did not occoured!" + end if + case else : QAErrorLog "Application not supported" + end select + + 'Close navigator if it was invisible by entering the routine + if bNavigatorWasVisible = TRUE then + printlog "Leaving navigator open as initially found" + else + if ( fSelectFirstOLE = RETVAL_SUCCESS ) then + ViewNavigator + printlog "Closing navigator as initially found" + else + printlog "Closing navigator not needed. It was not possible to open it." + end if + end if +end function diff --git a/testautomation/global/tools/includes/required/t_files.inc b/testautomation/global/tools/includes/required/t_files.inc new file mode 100755 index 000000000000..4b0ddd09318b --- /dev/null +++ b/testautomation/global/tools/includes/required/t_files.inc @@ -0,0 +1,770 @@ +'encoding UTF-8 Do not remove or change this line! +'******************************************************************************* +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/****************************************************************************** +'* +'* Owner : thorsten.bosbach@oracle.com +'* +'* short description : Global routines for loading, saving, printing, export +'* +'\****************************************************************************** + +function hGrafikEinfuegen( cFile as string ) as Boolean + + hGrafikEinfuegen() = hInsertGraphic( cFile, "Static" ) + exit function + +end function + +'******************************************************************************* + +function hGrafikVerknuepftEinfuegen( cFile as string ) as Boolean + + hGrafikVerknuepftEinfuegen() = hInsertGraphic( cFile, "Linked" ) + exit function + +end function + +'******************************************************************************* + +function hInsertGraphic( byval cFile as string, byval cMode as string ) as boolean + + ' Insert a graphic file to the current document either linked or static + ' cFile: Fully qualified path to the file to be inserted + ' cMode: Supply "Linked" to link, empty string or anything else is static + + ' In difference to the older functions (GrafikEinfuegen etc.) this function + ' does provide a working returnvalue and does not secretly hide warnings and + ' errors. It does not set the file type. + + ' Make hFileWait() complain about any messageboxes + const SHOW_WARNINGS = true + + ' Find out whether we link the file or not + dim bLinked as boolean : bLinked = false + if ( lcase( cMode ) = "linked" ) then bLinked = true + + hInsertGraphic() = false + cFile = convertpath( cFile ) + + if ( FileExists( cFile ) ) then + InsertGraphicsFromFile + + kontext "GrafikEinfuegenDlg" + if ( GrafikEinfuegenDlg.exists( 3 ) ) then + + Vorschau.unCheck() + if ( Verknuepfen.isEnabled() ) then + if ( bLinked ) then + Verknuepfen.check() + else + Verknuepfen.unCheck() + endif + endif + + DateiName.setText( cFile ) + Oeffnen.click() + + if ( hFileWait( SHOW_WARNINGS ) >= 0 ) then hInsertGraphic() = true + + else + warnlog( "hInsertGraphic(): Failed to open <Insert Graphics> dialog" ) + endif + else + warnlog( "hInsertGraphic(): File does not exist: " & cFile ) + endif + +end function + +'******************************************************************************* + +function hIsNamedDocLoaded( cFileName as string ) as boolean + + ' Retrieve the current filename from the document properties - which in + ' comparision to the old approach to retrive the name from the file save + ' dialog - gives us the file including its extension. So we only need + ' to compare the last characters from a full path to be relatively + ' certain that we work with the correct file. There is some small margin of + ' error, though. + + const CFN = "global::tools::includes::required::hIsNamedDocumentLoaded(): " + const RC_FAILURE = -1 + + dim cDocumentName as string + dim iDocumentNameLength as integer + dim bTemplateDocument as boolean + + hIsNamedDocLoaded() = false + + ' If the requested document is a template, we cannot use its filename to + ' identify the document as it is named "Untitled 1" or "Untitled" in the + ' FileSave dialog and the document properties dialog. The string is locale + ' dependent. So we do a shortcut here, the calling tests fail at a later + ' point if this function does not work properly + + select case( right( cFileName, 4 ) ) + case ".vor", ".dot", ".sti", ".pot", ".std", ".xlt", ".stc", ".ots", "xltm", "xltx" + if ( GVERBOSE ) then printlog( CFN & "Template document filtered" ) + hIsNamedDocLoaded() = true + exit function + end select + + if ( hUseAsyncSlot( "FileProperties" ) <> RC_FAILURE ) then + + kontext + active.setpage(tabdokument) + + kontext "TabDokument" + if ( TabDokument.exists( 2 ) ) then + + cDocumentName = DokumentName.getText() + iDocumentNameLength = len( cDocumentName ) + + if ( GVERBOSE ) then + printlog( CFN & "Expected file: " & cFileName ) + printlog( CFN & "Current file.: " & cDocumentName ) + printlog( CFN & "Comparing last " & iDocumentNameLength & " characters" ) + endif + + if ( right( cFileName, iDocumentNameLength ) = cDocumentName ) then + if ( GVERBOSE ) then printlog( CFN & "This is the expected file" ) + hIsNamedDocLoaded() = true + else + if ( GVERBOSE ) then printlog( CFN & "This is *not* the expected file" ) + endif + + hCloseDialog( TabDokument, "cancel" ) + else + warnlog( CFN & "Unable to open dialog <Document Properties>" ) + endif + else + warnlog( CFN & "Unable to execute slot <FileProperties>" ) + endif + +end function + +'******************************************************************************* + +function hExportAsPDFmulti (iTypeOfCall as integer, bExecute as boolean, sFileName as string, bAutoExtension as boolean, bOverwriteFile as boolean, iRange as integer, iConpression as integer, optional sRange as string) as boolean + '/// Export a document to PDF with various options. + '///+ INPUT + '///+<ul><li>iTypeOfCall</li><ul><li>1: via the icon in the functionbar (no options selectable, since only file dialog comes up!)</li> + '///+<li>2: via File->Send->Document As PDF Attachment... (makes no sense either, because after the mail window comes up... (you can't handle by the testtool))</li> + '///+<li>3 via File->Export As PDF... (RECOMMENDED)</li></ul> + '///+<li>bExecute: Shall all dialogs left with OK? TRUE (RECOMMENDED) / FALSE</li> + '///+<li>sFileName: Filename to use</li> + '///+<li>bAutoExtension: Shall the file extension be chosen by StarOffice? TRUE / FALSE (RECOMMENDED)</li> + '///+<li>bOverwriteFile: If filename already exists should it be overwritten? TRUE (RECOMMENDED) / FALSE</li> + '///+<li>iRange:</li><ol><li>1: All (RECOMMENDED)</li> + '///+<li>2: Pages: The range is set in the optional parameter 'sRange' at the end</li> + '///+<li>3: Selection</li></ol> + '///+<li>iConpression:</li><ol><li>1: JpegCompression check and ReduceImageResolution check</li> + '///+<li>2: JpegCompression check and ReduceImageResolution uncheck</li> + '///+<li>3: LosslessCompression check and ReduceImageResolution uncheck</li></ol> + '///+<li>sRange: Optional parameter only used for iRange=2; takes the page range as text</li> + '///+<li>RETURN: Any Errors? TRUE / FALSE</li></ul> + dim sPDF as string + dim sTemp as string + dim iTemp as integer + dim sTFileName as string + dim iCount as integer + + sPDF = "PDF - Portable Document Format (.pdf)" + hExportAsPDFmulti = TRUE ' optimistic + iTemp = 0 + + select case (iTypeOfCall) + case 1 : '/// click the button 'Export Directly as PDF' on the Functionbar ///' + kontext "Standardbar" + try + ExportAsPDF.click + catch + Warnlog "Button 'Export directly as PDF' not accessible!" + hExportAsPDFmulti = FALSE + exit function + endcatch + case 2 : '/// File->Send->Document As PDF Attachment... ///' + try + FileSendDocumentAsPDF + catch + Warnlog "'Export as PDF' not accessible!" + hExportAsPDFmulti = FALSE + exit function + endcatch + case 3 : '/// File->Export As PDF... ///' + try + FileExportAsPDF ' works in draw/impress, too but is not 'legal' in the UI :-) + catch + Warnlog "Button 'Export as PDF' not accessible!" + hExportAsPDFmulti = FALSE + exit function + endcatch + end select + + ' only if the type is 1 OR 3 then the File Save dialog appear + ' just kept here for compatibility reasons - has to get removed around july 2007 + if (iTypeOfCall = 1 OR iTypeOfCall = 3) then + kontext "ExportierenDlg" + if ExportierenDlg.exists(5) then + try + Dateityp.Select sPDF + catch + Warnlog "Unable to select filter: '" + sPDF + "'" + ExportierenDlg.Cancel + hExportAsPDFmulti = FALSE + exit function + endcatch + + sTemp = Dateityp.GetSelText + if (sTemp <> sPDF) then + Warnlog "filter for PDF export is missing :-( '" + sPDF + "'" + end if + '/// set Textbox 'File name' ///' + Dateiname.SetText sFileName + 'if the file has no pdf extension then add the extension + if (lCase(right(sFileName, 4))=".pdf") then + sTFileName = sFileName + else + sTFileName = sFileName + ".pdf" + endif + '/// click on the button 'Export...' ///' + if (bExecute) then + speichern.Click + kontext "AlienWarning" + if AlienWarning.exists(5) then + warnlog "#i41983# Alien Warning on export not allowed." + AlienWarning.OK + endif + if (iTypeOfCall = 1) then + ''Export Directly as PDF' + endif + iCount = 0 + ' wait until file exists for max 5 minutes + while ((dir(sTFileName)="") AND (iCount < 30)) + sleep 10 + inc iCount + wEnd + endif + else + 'ExportierenDlg.Cancel + end if + + ' if file exists, there is a message... + kontext "PDFOptions" + if NOT PDFOptions.exists then + Kontext + if messagebox.exists (5) then + if (bOverwriteFile) then + messagebox.Yes + else + messagebox.No + kontext "ExportierenDlg" + ExportierenDlg.Cancel + hExportAsPDFmulti = FALSE + end if + end if + end if + end if + + + ' only if the type is 2 OR 3 then the PDF option dialog appear + if (iTypeOfCall = 2 OR iTypeOfCall = 3) then + kontext "PDFOptions" + select case (iRange) + case 1 : '/// check radiobutton 'All' ///' + try + RangeAll.Check + catch + Warnlog "Radiobutton 'All' not accessible!" + PDFOptions.Cancel + hExportAsPDFmulti = FALSE + exit function + endcatch + case 2 : '/// check radiobutton 'Pages' ///' + try + RangePages.Check + catch + Warnlog "Radiobutton 'Range' not accessible!" + PDFOptions.Cancel + hExportAsPDFmulti = FALSE + exit function + endcatch + if isMissing(sRange) then + Warnlog "parameter 'sRange' in function 'hExportAsPDFmulti' is not optional if 'iRange' = 2" + hExportAsPDFmulti = FALSE + else + '/// set range textbox the given value ///' + RangePagesEdit.SetText sRange + end if + case 3 : '/// check radiobutton 'Selection' (not enabled in math!) ///' + try + if (RangeSelection.IsEnabled <> TRUE)then + Warnlog "RangeSelection is disabled :-(" + else + RangeSelection.Check + end if + catch + Warnlog "Radiobutton 'Selection' not accessible!" + PDFOptions.Cancel + hExportAsPDFmulti = FALSE + exit function + endcatch + end select + + select case (iConpression) + case 1 : '/// JpegCompression check and ReduceImageResolution check///' + try + JpegCompression.Check + ReduceImageResolution.Check + catch + Warnlog "Radiobutton 'Reduce Image Resolution' not accessible!" + PDFOptions.Cancel + hExportAsPDFmulti = FALSE + exit function + endcatch + case 2 : '/// JpegCompression check and ReduceImageResolution uncheck ///' + try + JpegCompression.Check + ReduceImageResolution.UnCheck + catch + Warnlog "Radiobutton 'Jpeg Compression' not accessible!" + PDFOptions.Cancel + hExportAsPDFmulti = FALSE + exit function + endcatch + case 3 : '/// LosslessCompression check and ReduceImageResolution uncheck ///' + try + LosslessCompression.Check + ReduceImageResolution.UnCheck + catch + Warnlog "Radiobutton 'Lossless Compression' not accessible!" + PDFOptions.Cancel + hExportAsPDFmulti = FALSE + exit function + endcatch + end select + if (bExecute) then + try + PDFOptions.OK + catch + qaErrorlog "ImprovementOfSave: PDF export loops?" + endcatch + else + PDFOptions.Cancel + end if + end if + ' only if the type is 1 OR 3 then the File Save dialog appear + kontext "ExportierenDLG" + if (iTypeOfCall = 1 OR iTypeOfCall = 3) then + if ExportierenDLG.exists(5) then + try + Dateityp.Select sPDF + catch + Warnlog "Unable to select filter: '" + sPDF + "'" + ExportierenDLG.Cancel + hExportAsPDFmulti = FALSE + exit function + endcatch + + sTemp = Dateityp.GetSelText + if (sTemp <> sPDF) then + Warnlog "filter for PDF export is missing :-( '" + sPDF + "'" + end if + '/// set Textbox 'File name' ///' + Dateiname.SetText sFileName + 'if the file has no pdf extension then add the extension + if (lCase(right(sFileName, 4))=".pdf") then + sTFileName = sFileName + else + sTFileName = sFileName + ".pdf" + endif + '/// click on the button 'Export...' ///' + if (bExecute) then + Speichern.Click + kontext "AlienWarning" + if AlienWarning.exists(5) then + warnlog "#i41983# Alien Warning on export not allowed." + AlienWarning.OK + endif + if (iTypeOfCall = 1) then + ''Export Directly as PDF' + endif + iCount = 0 + ' wait until file exists for max 5 minutes + while ((dir(sTFileName)="") AND (iCount < 30)) + sleep 10 + inc iCount + wEnd + endif + else + try + ExportierenDLG.Cancel + catch + printlog "export not there" + endcatch + end if + + ' if file exists, there is a message... + kontext "PDFOptions" + if NOT PDFOptions.exists then + Kontext + if messagebox.exists (5) then + if (bOverwriteFile) then + messagebox.Yes + else + messagebox.No + kontext "ExportierenDLG" + ExportierenDLG.Cancel + hExportAsPDFmulti = FALSE + end if + end if + end if + end if + +end function +' +'------------------------------------------------------------------------------- +' +function hFileDelete( cFileOrig as string ) as boolean + hFileDelete() = hDeleteFile( cFileOrig ) +end function +' +'------------------------------------------------------------------------------- +' +function hDeleteFile( cFileOrig as string ) as boolean + + const CFN = "global::tools::includes::required::t_files.inc::hDeleteFile():" + dim cHome as string : cHome = convertpath( gOfficePath & "user" ) + dim cFile as string : cFile = convertpath( cFileOrig ) + + ' This function tries to delete a file and does some very basic error- + ' handling. Returns 'true' on success, only error while deleting returns + ' 'false', if the file does not exist, it is considered to be successfully + ' deleted. + ' I introduced this function due to a number of cases where deleting files + ' actually failed because of weird code or situations where the user lacks + ' accessrights to files are not handled at all. + + if ( instr( cFile , cHome ) = 0 ) then + qaerrorlog( CFN & "Trying to delete file outside (default)homedir -> forbidden" ) + qaerrorlog( CFN & "Home: " & cHome ) + qaerrorlog( CFN & "File: " & cFile ) + hDeleteFile() = false + exit function + endif + + cFile = convertpath( cFile ) + + if ( FileExists( cFile ) ) then + try + kill( cFile ) + + if ( FileExists( cFile ) ) then + warnlog( CFN & "File was not deleted: " & cFile ) + hDeleteFile() = false + else + if ( GVERBOSE ) then printlog( CFN & "File successfully deleted: " & cFile ) + hDeleteFile() = true + endif + catch + qaerrorlog( CFN & "Deleting file failed: " & cFile ) + hDeleteFile() = false + endcatch + else + printlog( CFN & "Nothing to do." ) + hDeleteFile() = true + endif + +end function +' +'------------------------------------------------------------------------------- +' +function hFileCloseAll() as integer + + dim iDocumentCount as integer : iDocumentCount = 0 + Do Until GetDocumentCount = 0 + Call hCloseDocument() + iDocumentCount = iDocumentCount + 1 + Loop + hFileCloseAll() = iDocumentCount + +end function +' +'------------------------------------------------------------------------------- +' +function hFileOpen( cFile as string ) as boolean + + dim sFile as string : sFile = convertToURL( convertpath( cFile ) ) + hFileOpen() = FALSE + const CFN = "global::tools::inc::t_files.inc::hFileOpen(): " + if ( GVERBOSE ) then printlog( CFN & "Load: " & sFile ) + FileOpen( "URL", sFile, "FrameName", "_default" ) + if ( hFileWait( FALSE ) >= 0 ) then hFileOpen() = TRUE + +end function +' +'------------------------------------------------------------------------------- +' +function hFileOpenSpecial( cFile as string, cFlag as string ) as boolean + + ' Open a file with some special options + ' cFlag = "ReadOnly" opens file read-onlx + ' cFlag = "AsTemplate" opens file as templat + ' cFlag = <Any other string> treats string as password + + dim sFile as string : sFile = convertToURL( convertpath( cFile ) ) + const CFN = "global::tools::inc::t_files.inc::hFileOpenSpecial(): " + hFileOpenSpecial() = FALSE + if ( GVERBOSE ) then printlog( "Load (Flag): " & sFile & " (" & cFlag & ")" ) + + select case( lcase( cFlag ) ) + case "readonly" + printlog( CFN & "Load file read-only: " & sFile ) + FileOpen( "URL", sFile, "FrameName", "_default", "ReadOnly", TRUE) + case "astemplate" + printlog( CFN & "Load file as template: " & sFile ) + FileOpen( "URL", sFile, "FrameName", "_default", "AsTemplate" , TRUE ) + case else + printlog( CFN & "Load file with password: " & sFile ) + FileOpen( "URL", sFile, "FrameName", "_default", "Password" , cFlag ) + end select + + if ( hFileWait( FALSE ) >= 0 ) then hFileOpenSpecial() = TRUE + +end function +' +'------------------------------------------------------------------------------- +' +function hFileOpenWithFilter( cFile as string, cFilter as string ) + + dim sFile as string : sFile = convertToURL( convertpath( cFile ) ) + const CFN = "global::tools::inc::t_files.inc::hFileOpenWithFilter(): " + hFileOpenWithFilter() = FALSE + if ( GVERBOSE ) then printlog( CFN & "Load (Filter): " & sFile & " (" & cFilter & ")" ) + FileOpen( "URL", sFile, "FrameName", "_default", "FilterName", cFilter ) + if ( hFileWait( FALSE ) >= 0 ) then hFileOpenWithFilter() = TRUE + +end function +' +'------------------------------------------------------------------------------- +' +function hFileSave() as boolean + + const CFN = "global::tools::inc::t_files.inc::hFileSave(): " + hFileSave() = FALSE + if ( GVERBOSE ) then printlog( CFN & "Save file." ) + FileSave( "SynchronMode", TRUE ) + if ( hFileWait( TRUE ) >= 0 ) then hFileSave() = TRUE + +end function +' +'------------------------------------------------------------------------------- +' +function hFileSaveAs( cFile as string ) as boolean + + dim sFile as string : sFile = convertToURL( convertpath( cFile ) ) + const CFN = "global::tools::inc::t_files.inc::hFileSaveAs(): " + hFileSaveAs() = FALSE + if ( GVERBOSE ) then printlog( CFN & "Save: " & sFile ) + FileSaveAs( "URL", sFile, "Overwrite", FALSE ) + if ( hFileWait( TRUE ) >= 0 ) then hFileSaveAs() = TRUE + +end function +' +'------------------------------------------------------------------------------- +' +function hFileSaveAsKill( cFile as string ) as boolean + + dim sFile as string : sFile = convertToURL( convertpath( cFile ) ) + const CFN = "global::tools::inc::t_files.inc::hFileSaveAsKill(): " + hFileSaveAsKill() = FALSE + if ( GVERBOSE ) then printlog( CFN & "Save, replacing: " & sFile ) + FileSaveAs( "URL", sFile, "Overwrite", TRUE ) + if ( hFileWait( TRUE ) >= 0 ) then hFileSaveAsKill() = TRUE + +end function +' +'------------------------------------------------------------------------------- +' +function hFileSaveAsKillWithPassword( cFile as string, cPassword as string ) as boolean + + dim sFile as string : sFile = convertToURL( convertpath( cFile ) ) + const CFN = "global::tools::inc::t_files.inc::hFileSaveAsKillWithPassword(): " + hFileSaveAsKillWithPassword() = FALSE + if ( GVERBOSE ) then printlog( CFN & "Save with password, replacing: " & sFile & "::" & cPassword ) + FileSaveAs( "URL", sFile, "Overwrite", TRUE, "Password", cPassword ) + if ( hFileWait( TRUE ) >= 0 ) then hFileSaveAsKillWithPassword() = TRUE + +end function +' +'------------------------------------------------------------------------------- +' +function hFileSaveAsWithFilter( cFile as string, cFilter as string ) as boolean + + dim sFile as string : sFile = convertToURL( convertpath( cFile ) ) + const CFN = "global::tools::inc::t_files.inc::hFileSaveAsWithFilter(): " + hFileSaveAsWithFilter() = FALSE + if ( GVERBOSE ) then printlog( CFN & "Save with filter: " & sFile & "::" & cFilter ) + FileSaveAs( "URL", sFile, "FilterName", cFilter, "Overwrite", FALSE ) + if ( hFileWait( TRUE ) >= 0 ) then hFileSaveAsWithFilter() = TRUE + +end function +' +'------------------------------------------------------------------------------- +' +function hFileSaveAsWithFilterKill( cFile as string, cFilter as string ) as boolean + + dim sFile as string : sFile = convertToURL( convertpath( cFile ) ) + const CFN = "global::tools::inc::t_files.inc::hFileSaveAsWithFilterKill(): " + hFileSaveAsWithFilterKill() = FALSE + if ( GVERBOSE ) then printlog( CFN & "Save with filter, replacing: " & sFile & "::" & cFilter ) + FileSaveAs( "URL", sFile, "FilterName", cFilter, "Overwrite", TRUE ) + if ( hFileWait( TRUE ) >= 0 ) then hFileSaveAsWithFilterKill() = TRUE + +end function +' +'------------------------------------------------------------------------------- +' +function hFileWait( optional bWarn as boolean ) as integer + + ' Wait max 10 seconds for the FileOpen/FileSave slot to finish + ' Returns the time it took the slot to finish + ' Negative returnvalues are given on timeout or any blocking dialog + + const CFN = "global::tools::inc::t_files.inc::hFileWait(): " + const MAX_WAIT = 10 + dim iWait as integer : iWait = 0 + dim bWarnlog as boolean + + if ( IsMissing( bWarn ) ) then + bWarnlog = TRUE + else + bWarnlog = bWarn + endif + + do while( WaitSlot() <> WSFinished ) + + iWait = iWait + 1 + + ' This is the timeout + if ( iWait = MAX_WAIT ) then + iWait = -1 + exit do + endif + + ' LOAD: Security warning prevents slot from finishing + kontext "SecurityWarning" + if ( SecurityWarning.exists() ) then + iWait = -2 + exit do + endif + + ' LOAD: Password dialog + kontext "PasswordFileOpen" + if ( PasswordFileOpen.exists() ) then + iWait = -3 + exit do + endif + + ' SAVE: Password dialog + kontext "PasswordDlg" + if ( PasswordDlg.exists() ) then + iWait = -4 + exit do + endif + + ' LOAD: Master Password Dialog + kontext "MasterPasswordEnter" + if ( MasterPasswordEnter.exists() ) then + iWait = -10 + warnlog( CFN & "Master Password dialog displayed. Tests are likely to fail" ) + exit do + endif + + ' LOAD: Filter selection dialog + Kontext "Filterauswahl" + if ( FilterAuswahl.exists() ) then + iWait = -5 + exit do + endif + + ' LOAD: ASCII Filter Options dialog + kontext "ASCIIFilterOptionen" + if AsciiFilterOptionen.Exists() then + iWait = -6 + exit do + end if + + ' LOAD/SAVE: Some other dialogs that may interrupt file I/O + kontext "Active" + if ( Active.exists() ) then + printlog( Active.getText() ) + + ' This is most likely a warning + if ( Active.getButtonCount() = 1 ) then + iWait = -7 + exit do + endif + + ' This is probably the update links dialog + if ( Active.getButtonCount() = 2 ) then + iWait = -8 + exit do + endif + + ' This is probably the styles not matching dialog + if ( Active.getButtonCount() = 3 ) then + iWait = -9 + exit do + endif + + endif + + loop + + if ( GVERBOSE ) then + select case iWait + case -1 : printlog( CFN & "Timeout reached, rc = " & iWait ) + case -2 : printlog( CFN & "Macro security warning displayed, rc = " & iWait ) + case -3 : printlog( CFN & "Password dialog (load) displayed, rc = " & iWait ) + case -4 : printlog( CFN & "Password dialog (save) displayed, rc = " & iWait ) + case -5 : printlog( CFN & "Filter Selection dialog displayed, rc = " & iWait ) + case -6 : printlog( CFN & "ASCII filter options dialog displayed, rc = " & iWait ) + case -7 : printlog( CFN & "A dialog box is in the way (1 button), rc = " & iWait ) + case -8 : printlog( CFN & "A dialog box is in the way (2 buttons), rc = " & iWait ) + case -9 : printlog( CFN & "A dialog box is in the way (3 buttons), rc = " & iWait ) + case -10 : printlog( CFN & "Master Password Dialog displayed, rc = " & iWait ) + case else : printlog( CFN & "File I/O completed in " & iWait & " seconds" ) + end select + endif + + if ( bWarnlog and ( iWait < 0 ) ) then + warnlog( CFN & "The messagebox was not expected at this point" ) + endif + + hFileWait() = iWait + +end function + diff --git a/testautomation/global/tools/includes/required/t_filters.inc b/testautomation/global/tools/includes/required/t_filters.inc new file mode 100755 index 000000000000..243483be9e7d --- /dev/null +++ b/testautomation/global/tools/includes/required/t_filters.inc @@ -0,0 +1,549 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/****************************************************************************** +'* +'* owner : joerg.skottke@oracle.com +'* +'* short description : Retrieve and set filternames and suffixes +'* +'\****************************************************************************** + +private const LENGTH_OF_FILTERFILE = 100 +private const FILE_DATA_SIZE = 300 + +function hCheckForBinfilters() as boolean + + try + hGetSuffix( "569" ) + hCheckForBinfilters() = true + catch + warnlog( "Optional legacy filters package is not installed" ) + printlog( "Please restart the setup to install the missing filters" ) + hCheckForBinfilters() = false + endcatch + +end function + +'******************************************************************************* + +function hGetSuffix( optional cBuildId as string ) as string + + ' This function retrieves the suffix depending on the build id (e.g. 680) + ' for a known gApplication from the program configuration. + + ' Currently known Build-IDs are: + ' No parameter = current + ' "" (empty string) = current + ' 300 = StarOffice 9 / OpenOffice.org 3.x + ' 680 = StarOffice 8 / OpenOffice.org 2.x + ' 645 = StarOffice 7 / OpenOffice.org 1.x + ' 641 = StarOffice 6 (XML format) + ' 569 = StarOffice 5 (Binary format) + + dim sMatchingFile as string + dim sFilterArray( 100 ) as string + dim sFilterConfigName as string + dim sSuffix( 10 ) as string + + if ( IsMissing( cBuildId ) ) then cBuildId = "current" + if ( cBuildId = "" ) then cBuildId = "current" + + sMatchingFile = gTesttoolPath & "global\input\filters\" + sMatchingFile = sMatchingFile & "build_to_suffix.txt" + sMatchingFile = convertpath( sMatchingFile ) + + 'printlog( "DEBUG: SUFFIX: Build-ID: " & cBuildId ) + hGetDataFileSection( sMatchingFile, sFilterArray(), cBuildId, "", "" ) + sFilterConfigName = hGetValueForKeyAsString( sFilterArray(), gApplication ) + 'printlog( "DEBUG: SUFFIX: Config name: " & sFilterConfigName ) + sSuffix() = hGetFilterNameExtension( sFilterConfigName ) + 'printlog( "DEBUG: SUFFIX: " & sSuffix( 0 ) ) + hGetSuffix() = "." & sSuffix( 0 ) + +end function + +'******************************************************************************* + +function hGetFilter( optional cBuildId as string ) as string + + '///<h1>Get the Filtername for a specified Build-ID</h1> + + ' Currently known Build-IDs are: + ' No parameter = current + ' "" (empty string) = current + ' 300 = StarOffice 9 / OpenOffice.org 3.x + ' 680 = StarOffice 8 / OpenOffice.org 2.x + ' 645 = StarOffice 7 / OpenOffice.org 1.x + ' 641 = StarOffice 6 (XML format) + ' 569 = StarOffice 5 (Binary format) + + dim clTemp( LENGTH_OF_FILTERFILE ) as string ' cFilterFile is stored here + + dim sMatchingFile as string + dim sFilterArray( 100 ) as string + dim sFilterConfigName as string + dim sFilter as string + + if ( IsMissing( cBuildId ) ) then cBuildId = "current" + if ( cBuildId = "" ) then cBuildId = "current" + + sMatchingFile = gTesttoolPath & "global\input\filters\" + sMatchingFile = sMatchingFile & "build_to_filter.txt" + sMatchingFile = convertpath( sMatchingFile ) + + 'printlog( "DEBUG: FILTER: Filter-ID: " & cBuildId ) + hGetDataFileSection( sMatchingFile, sFilterArray(), cBuildId, "", "" ) + sFilterConfigName = hGetValueForKeyAsString( sFilterArray(), gApplication ) + 'printlog( "DEBUG: FILTER: Config name: " & sFilterConfigName ) + sFilter = hGetUIFilterName( sFilterConfigName ) + 'printlog( "DEBUG: FILTER: " & sFilter ) + hGetFilter() = sFilter + +end function + +'******************************************************************************* + +function hSelectUIfilter( cAPIFilter as string ) as boolean + + ' Wrapper for hFindFilterPosition() which also selects the filter + dim irc as integer + + irc = hFindFilterPosition( cAPIFilter ) + if ( irc > 0 ) then + DateiTyp.select( irc ) + hSelectUIfilter() = true + else + hSelectUIfilter() = false + endif + +end function + +'******************************************************************************* + +function hFindFilterPosition( cFilter as string ) as integer + + ' This function takes a filter as provided by the office API and tries to find + ' this filter within the File Save dialogs file type list. + ' The file types have a suffix appended like " (.odt)" which is not present + ' in the API's filter name so it is not possible to select the file + ' type directly and we do not have an exact match either. + ' To ensure that we not accidentially select the template a bracket is + ' appended to the string. + + dim iCurrentFilter as integer + dim cCurrentFilter as string + dim cUniqueFilter as string + cUniqueFilter = cFilter & " (" + + const CFN = "global::tools::inc::hFindFilterPosition::" + + for iCurrentFilter = 1 to DateiTyp.getItemCount() + + cCurrentFilter = DateiTyp.getItemText( iCurrentFilter ) + + if ( cFilter = cCurrentFilter ) then + 'printlog( CFN & "Exact match - this is a UI filter name, not API" ) + 'printlog( CFN & "The filter is at pos. " & iCurrentFilter ) + hFindFilterPosition() = iCurrentFilter + exit function + endif + + if ( instr( cCurrentFilter, cUniqueFilter ) > 0 ) then + 'printlog( CFN & "Filter found at pos. " & iCurrentFilter ) + hFindFilterPosition() = iCurrentFilter + exit function + endif + + next iCurrentFilter + + warnlog( CFN & "Filter not found: " & cFilter ) + warnlog( CFN & "Refer to global::input:.filters::api_filters.txt for a complete list of available filters" ) + + hFindFilterPosition() = 0 + +end function + +'******************************************************************************* + +function hGetUIFiltername( vFiltername as string ) as string + + '/// Returns the in the UI used filter name. + '///+ <b>INPUT</b>: 'internal', language independent filter name from FilterFactory. + '///+ <u>Examples</u>:<ul><li>hGetUIFiltername("StarOffice XML (Draw)") - Draw OOo 1.x/SO6.0/SO7 UI Filtername</li> + '///+ <li>sUIFiltername = hGetUIFiltername("StarOffice XML (Impress)") - Impress OOo 1.x/SO6.0/SO7 UI Filtername</li></ul> + '/// The 'internal' name can be found in the *.xcu in + '///+ ..../share/registry/res/en-US/org/openoffice/TypeDetection/Filter.xcu. + '/// See also: hGetFilternameExtension + + Dim iCurrentFilter as integer + Dim oOpenUNOService as object + Dim oFilterName as object + Dim oUno as object + + const CFN = "global::tools:includes:required::t_filters.inc::hGetUIFiltername(): " + + oUno = hGetUNOService( TRUE ) + + oOpenUNOService = oUno.createInstance( "com.sun.star.document.FilterFactory" ) + try + oFilterName = oOpenUNOService.getByName( vFiltername ) + + for iCurrentFilter = 0 to ubound( oFilterName ) + if ( oFilterName( iCurrentFilter ).Name = "UIName" ) then + hGetUIFiltername = oFilterName( iCurrentFilter ).Value + end if + next iCurrentFilter + catch + warnlog ( CFN & vFiltername & "'): Filtername is not available." ) + hGetUIFiltername() = "" + endcatch + +end function + +'******************************************************************************* + +function hGetFilternameExtension ( vFilterName as string) + + '/// Returns the in the UI used filter name extension(s) <u>as an <b>array</b></u>. + '///+ <b>Important</b>: Also returns it <u>as an array</u> if there comes a string from the UNO API call. + '/// <u>Input</u>: 'internal', language independent name + '/// The 'internal' name can be found in the *.xcu in + '///+ ../share/registry/modules/org/openoffice/TypeDetection/Types/fcfg_[Application_name]_types.xcu file(s). + '/// List of some 'internal' filter names for OOo 2.0/SO8: + '///+<TABLE BORDER=1><TR><TH>Filter</TH><TH><i>internal</i> name</TH><TH>Note</TH></TR> + '///+<TR><TD>Spreadsheet (default)</TD><TD>calc8</TD><TD>-</TD></TR> + '///+<TR><TD>Text document (default)</TD><TD>writer8</TD><TD>-</TD></TR> + '///+<TR><TD>Master document (default)</TD><TD>writerglobal8</TD><TD>-</TD></TR> + '///+<TR><TD>Drawing (default)</TD><TD>draw8</TD><TD>-</TD></TR> + '///+<TR><TD>Presentation (default)</TD><TD>impress8</TD><TD>-</TD></TR> + '///+<TR><TD>Formula/Math (default)</TD><TD>math8</TD><TD>-</TD></TR> + '///+<TR><TD>HTML</TD><TD>writer_web_HTML</TD><TD>two extensions!</TD></TR> + '///+<TR><TD>Text</TD><TD>writer_text</TD><TD>-</TD></TR> + '///+<TR><TD>StarWriter 5.0</TD><TD>writer_StarWriter_50</TD><TD>-</TD></TR> + '///+<TR><TD>StarCalc 5.0</TD><TD>calc_StarCalc_50</TD><TD>-</TD></TR> + '///+</TABLE><br> + ' (rewritten, compatible routine; July 2004) + + Dim iCurrentExtension as integer + Dim oOpenUNOService as object + Dim oFilterNameExtension as object + Dim oUno as object + dim aExtensionsSize as integer + Dim aExtensions() as string + + const CFN = "global::tools:includes:required::t_filters.inc::hGetFilternameExtension(): " + + 'Initializize UNO communication + oUno = hGetUNOService( TRUE ) + + 'Using the TypeDetection service + oOpenUNOService = oUno.createInstance("com.sun.star.document.TypeDetection") + + 'Getting the Extension by given (internal; language- and product + 'independent) filter name + oFilterNameExtension = oOpenUNOService.getByName(vFiltername) + + 'using ubound to count the nodes + for iCurrentExtension = 0 to ubound( oFilterNameExtension ) + + 'if the node name is 'Extensions'... + if ( oFilterNameExtension( iCurrentExtension ).Name = "Extensions" ) then + + '...if it's an array... + if ( IsArray( oFilterNameExtension( iCurrentExtension ).Value) ) then + + 'set the size of the aExtensions() array + aExtensionsSize = 10 + + 're-dimension the array with the integer a + Redim aExtensions( aExtensionsSize ) as string + + 'return the array into an array + aExtensions() = oFilterNameExtension( iCurrentExtension ).Value() + else + '...otherwise 'build' an array with only + 'one entry in (0) + Redim aExtensions( 0 ) as string + aExtensions( 0 ) = oFilterNameExtension( iCurrentExtension ).Value + endif + endif + next iCurrentExtension + + 'put the results into the return value of this function into an array. + hGetFilternameExtension = aExtensions() + +end function + +'******************************************************************************* + +function hGetValueForKeyAsString( lsList() as string, sKey as string ) as string + + '/// This function returns the value of a key as string. + '///+ The form of the input strings is 'key=value', the list is parsed + '///+ The Value for the first occurrence of sKey is returned + + dim iItem as integer + dim cComp as string + + hGetValueForKeyAsString() = "Error: No matching VALUE found for key: " & sKey + + ' Scan through the list and look for sKey. If found, return the Value + ' (everything to the right of the '=') + + for iItem = 1 to listcount( lsList() ) + + if( instr( lsList( iItem ) , sKey ) <> 0 ) then + + cComp = hGetKeyforPairAsString( lsList( iItem ) ) + + if( sKey = cComp ) then + hGetValueForKeyAsString() = hGetValueForPairAsString( lsList( iItem ) ) + iItem = listcount( lsList() ) + 1 + end if + + end if + + next iItem + +end function + +'******************************************************************************* + +function hGetValueForPairAsString( cLine as string ) as string + + '/// This function takes a string that (hopefully) contains one '=' + '///+ and returns the substringstring to the right from the '=' char. + + dim iCharPos as integer + + iCharPos = instr( cLine , "=" ) + iCharPos = len( cLine ) - iCharPos + hGetValueForPairAsString() = right( cLine , iCharPos ) + +end function + +'******************************************************************************* + +function hGetKeyForPairAsString( cLine as string ) as string + + '/// This function returns the string to the left of the '=' + + dim iCharPos as integer + + iCharPos = instr( cLine , "=" ) + + ' get the string to the left of the = char + + if ( iCharPos > 0 ) then + hGetKeyForPairAsString() = left( cLine , iCharPos -1 ) + else + warnlog( "Invalid string passed to hGetKeyForPairAsString: " & cLine ) + end if + +end function + +'******************************************************************************* + +function hGetDataFileSection( cFile as string, lsList() as string, cSection as string , cComment as string, cPrint as string ) as integer + + const CFN = "hGetDataFileSection:" + + '/// This function reads a datafile into a list. + '///+ Comments (lines beginning with #) are removed from the list. + '///+ A comment can be passed to the log. + '///+ Furthermore a section in the source-file can be specified. Only + '///+ lines within the section are returned then. The delimiter for a + '///+ section is [section-name] <> [ ...] (or EOF) + '///+ <ul>NOTES:<li>Instead of lsList() a temporary list should be used that is big + '///+ enough to hold all the data from the datafile.</li> + '///+ <li> this function does - basically the same as getinivalue(...) but + '///+ is easier to debug and returns a list not the key.</li></ul> + + dim sFile as string + + dim iSectionBegin as integer + dim iSectionEnd as integer + dim iSectionItems as integer + + ' verify that the sourcefile exists, otherwise warn and abort + if ( dir( cFile ) = "" ) then + warnlog( CFN & "File not found: " & cFile ) + hGetDataFileSection() = 0 + exit function + end if + + ' print a comment to the logfile. Non optional parameter but might be "" + if ( cComment <> "" ) then + printlog( "" ) + printlog( CFN & cComment & " : " & cFile ) + printlog( "" ) + end if + + ' read the list from the file + listread( lsList() , cFile , "utf8" ) + + ' remove comments ( lines containing # ) + hListClearPattern( lsList() , "#" ) + + ' remove all blank lines + hListClearBlank( lsList() ) + + ' honor the section, if given. Non-optional parameter that can be "" + if ( cSection <> "" ) then + iSectionBegin = hGetStartOfSection( lsList() , cSection ) + iSectionEnd = hGetEndOfSection( lsList() , iSectionBegin ) + iSectionItems = hGetSection( lsList() , iSectionBegin , iSectionEnd ) + end if + + ' print the current list - if desired. + if ( lcase( cPrint ) <> "" ) then + hListPrint( lsList(), "Parent function: " & CFN ) + end if + + ' return the number of items + hGetDataFileSection() = listcount( lsList() ) + +end function + +'******************************************************************************* + +function hGetFileData( sFile as string , sKey as string ) as string + + dim sList( FILE_DATA_SIZE ) as string + dim iArraySize as integer + + ' This function reads a file and returns the first line containing sKey + iArraySize = hGetDataFileSection( sFile, sList(), "", "", "" ) + hGetFileData() = hGetValueForKeyAsString( sList() , sKey ) + +end function + +'******************************************************************************* + +function hGetStartOfSection( lsList() as string , _section as string ) as integer + + const CFN = "hGetStartOfSection::" + + '/// This function takes a list and looks for a string of the type [_section]. + '///+ The position of this successful hit is returned. + '///+ On error the returnvalue defaults to 0. + + dim iThisString as integer + dim cThisString as string + dim iListSize as integer + dim cSection as string + + iThisString = 0 + cSection = lcase ( "[" & _section & "]" ) + iListSize = listcount( lsList() ) + + do while ( iThisString <= iListSize ) + + iThisString = iThisString + 1 + cThisString = lcase( lsList( iThisString ) ) + + if ( instr( cThisString , cSection ) ) then + hGetStartOfSection() = iThisString + 1 + iThisString = iListSize + 5 + end if + + loop + + if ( iThisString = ( iListSize + 1 ) ) then + warnlog( CFN & "Section not found or empty: " & _section ) + hGetStartOfSection = 0 + end if + +end function + +'******************************************************************************* + +function hGetEndOfSection( lsList() as string , iOffset as integer ) as integer + + dim iThisString as integer + dim cThisString as string + dim iListSize as integer + + iThisString = iOffset + iListSize = listcount( lsList() ) + + do while ( iThisString <= iListSize ) + cThisString = lsList( iThisString ) + + if ( ( instr( cThisString , "[" ) > 0 ) and ( instr( cThisString , "]" ) > 0 ) )then + hGetEndOfSection() = iThisString - 1 + iThisString = iListSize + 5 + else + iThisString = iThisString + 1 + end if + + loop + + if ( iThisString = ( iListSize + 1 ) ) then + hGetEndOfSection() = iListSize + end if + +end function + +'******************************************************************************* + +function hGetSection( lsList() as string , iSectionBegin as integer , iSectionEnd as integer ) as integer + + dim iArraySize as integer + dim iThisString as integer + + iArraySize = ubound( lsList() ) + + dim lsTempList( iArraySize ) as string + listcopy( lsList() , lsTempList() ) + listalldelete( lsList() ) + + for iThisString = iSectionBegin to iSectionEnd + + listappend( lsList() , lsTempList( iThisString ) ) + + next iThisString + + hGetSection() = listcount( lsList() ) + +end function + +'******************************************************************************* + +function hGetUsedFilter () as string + + ' used in math and graphics modules + '/// Get used filter for loaded file. + try + FileSaveAs + Kontext "SpeichernDlg" + hGetUsedFilter = dateityp.getseltext + SpeichernDlg.Cancel + catch + hGetUsedFilter = "Not possible; try/catch fail in function" + endcatch +end function + diff --git a/testautomation/global/tools/includes/required/t_lists.inc b/testautomation/global/tools/includes/required/t_lists.inc new file mode 100755 index 000000000000..9fa2172fbccf --- /dev/null +++ b/testautomation/global/tools/includes/required/t_lists.inc @@ -0,0 +1,599 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : helge.delfs@oracle.com +'* +'* short description : general routines to work with lists (arrays) +'* +'\****************************************************************** + +function ListCount ( lsList() as String ) as Integer + 'Author: tz + '///Returns the number of list entries. + '///+<u>Input</u>: The list (only string lists are possible) + '///+<u>Return</u>: The number of entries + ListCount = Val(lsList(0)) +end function + +'------------------------------------------------------------------------- + +function ListCopy ( lsList1() as String, lsList2() as String ) as Boolean + 'Author: tz + '///Copies all entries out of one list into another list. + '///+<u>Input</u>:<ol><lo>list which should be copied</li><li>An empty list</li></ol>After this function the 2nd list is a copy of the 1st list. + '///+<u>Return</u>: If copy of the list is correct this function returns TRUE otherweise FALSE + + Dim ii as Integer + + ListAllDelete ( lsList2() ) + for ii=1 to ListCount ( lsList1() ) + ListAppend ( lsList2(), lsList1(ii) ) + next ii + + if ListCount ( lsList1() ) = ListCount ( lsList2 () ) then + ListCopy = TRUE + else + ListCopy = FALSE + end if +end function + +'------------------------------------------------------------------------- + +sub ListAllDelete ( lsList() as String ) + 'Author: tz + '///Deletes a complete list. + '///+<u>Input</u>: The list (only string lists are possible) + lsList(0) = "0" +end sub + +'------------------------------------------------------------------------- + +sub ListAppend ( lsList() as String, sNewEntry as String ) + 'Author: tz + '///Appends a new entry at the end of the list. + '///+<u>Input</u>: <ol><li>the list (only string lists are possible)</li><li>The new entry</li></ol> + lsList(0) = Val(lsList(0)) + 1 + lsList( lsList(0) ) = sNewEntry +end sub + +'------------------------------------------------------------------------- + +function ListDelete ( lsList() as String, iNr as Integer ) as Boolean + 'Author: tz + '///Deletes an entry out of the list on a defined position (iNr). + '///+<u>Input</u>: <ol><li>The list (only string lists are possible)</li><li>The position of the entry</li></ol> + '///+<u>Return</u>: TRUE if the entry was deleted otherweise FALSE + + + Dim i%, ListenAnzahl as Integer + + ListenAnzahl = listcount( lsList() ) + + if iNr > ListenAnzahl then + ListDelete = FALSE + Exit Function + end if + + for i% = iNr to ListenAnzahl + lsList( i% ) = lsList( i% + 1 ) + next i% + + lsList(0) = ListenAnzahl - 1 + + ListDelete = TRUE +end function + +'------------------------------------------------------------------------- + +function ListDeleteString ( lsList() as String, sText as String ) as Boolean + 'Author: tz + '///Deletes the 1st string in the list which is equal to the input string. + '///+<u>Input</u>: <ol><li>The list (only string lists are possible)</li><li>The string</li></ol> + '///+<u>Return</u>: TRUE if the entry was deleted otherwise FALSE + Dim i as Integer : Dim EintragsNr as Integer : Dim ListenAnzahl as Integer + + ListenAnzahl = Val(lsList(0)) + EintragsNr = 0 + for i = 1 to ListenAnzahl + if lsList(i) = sText then + EintragsNr = i + i = ListenAnzahl + 1 + end if + next i + if EintragsNr = 0 then + ListDeleteString = FALSE + else + ListDeleteString = ListDelete ( lsList(), EintragsNr ) + end if +end function + +'------------------------------------------------------------------------- + +function ListInsert ( lsList() as String, ZeileNr%, sWert$ ) as Boolean + 'Author: tz + '///Inserts a string at a defined position in the list. + '///+<u>Input</u>: <ol><li>The list (only string lists are possible)</li><li>The position</li><li>The string</li></ol> + '///+<u>Return</u>: TRUE if the entry was inserted otherwise FALSE + Dim i% : Dim ListenAnzahl as Integer + + ListenAnzahl = Val(lsList(0)) + if ZeileNr% > ListenAnzahl then + ListInsert = FALSE + Exit Function + end if + + ' Nach hinten verschieben, hinten beginnend + for i% = ListenAnzahl to ZeileNr% step -1 + lsList( i%+1 ) = lsList( i% ) + next i% + + ' Einfuegen + lsList( ZeileNr% ) = sWert$ + lsFile(0) = ListenAnzahl + 1 + ListInsert = TRUE + +end function + +'------------------------------------------------------------------------- + +function ListRead ( lsList() as String, Datei$, optional sEncode as String ) as Boolean + 'Author: tz + '///+Opens a file and insert all rows into a list (row for row). + '///+<u>Input</u>: <ol><li>The list (old list entries will be deleted)</li><li>The file</li><li><b>optional</b>: The encoding "UTF8"</li></ol> + '///+<u>Return</u>: TRUE or FALSE if this routine can read the file. + Dim bUTF8 as Boolean + Dim i% + Dim CompareList(15000) as String + + if Dir( Datei$ ) = "" then + Warnlog "ListRead: " + Datei$ + " is missing!" + ListRead = FALSE + exit function + end if + + if IsMissing ( sEncode ) = TRUE then + bUTF8 = FALSE + else + if UCASE ( sEncode ) = "UFT8" OR UCASE ( sEncode ) = "UTF8" then + bUTF8 = TRUE + else + Warnlog "ListRead :" + sEncode + " - Encoding is unkown!" + bUTF8 = FALSE + end if + end if + + ListAllDelete ( lsList() ) ' clean up the list + + if bUTF8 = TRUE then + Dim textin as object, sfa as object, xInput as object ' for UTF-8-input-routines + Dim iC as Integer + + textin = createUnoService( "com.sun.star.io.TextInputStream" ) ' uno-handling to input an UFT-8-File + textin.setEncoding("utf8") ' + sfa = createUnoService( "com.sun.star.ucb.SimpleFileAccess" ) ' + xInput = sfa.openFileRead( Datei$ ) ' + textin.setInputStream( xInput ) ' + + do until textin.isEOF() ' + i% = Val(lsList(0)) + 1 + lsList(0) = i% + lsList( i% ) = textin.readLine() ' + loop + xInput.closeInput ' uno-file-close + + 'INFO: (TZ) Only to workaround a problem with UNIX-Files... + if Right ( lsList(i%), 1 ) = Chr(10) then + lsList(i%) = Left ( lsList(i%), Len ( lsList(i%) ) - 1 ) + end if + 'INFO: (TBO) Remove the BOM http://www.unicode.org/versions/Unicode4.0.0/ch15.pdf + if (left(lsList(1), 1) = chr(&HFEFF)) then + lsList(1) = right(lsList(1), Len(lsList(1)) - 1) + end if + else + Dim FileNum% + + FileNum% = FreeFile + Open Datei$ for input as #FileNum% + + do until EOF(#FileNum%) ' all from LIS-file + i% = Val(lsList(0)) + 1 + lsList(0) = i% + Line Input #FileNum%, lsList( i% ) + loop + Close #FileNum% + end if + ListRead = TRUE +end function + +'------------------------------------------------------------------------- + +function ListWrite ( lsList() as String, Datei$, optional sEncode as String) as Boolean + 'Author: tz + '///+Writes a list into a file (an existing file will be deleted before) + '///+<u>Input</u>: <ol><li>The list</li><li>The file</li><li><b>optional</b>: The encoding "UTF8"</li></ol> + '///+<u>return</u>: TRUE or FALSE if this routine can read the file. + + Dim bUTF8 as Boolean + Dim i% + + if Dir (Datei$) <> "" then + Kill(Datei$) ' the file must be deleted if you use 'UTF8' + endif + + if IsMissing ( sEncode ) = TRUE then + bUTF8 = FALSE + else + if UCASE ( sEncode ) = "UTF8" then + bUTF8 = TRUE + else + Warnlog "ListWrite :" + sEncode + " - Encoding is unkown!" + bUTF8 = FALSE + end if + end if + + if bUTF8 = TRUE then + Dim textout as object, sfa as object, xOutput as object ' for UTF-8-output-routines + + textout = createUnoService( "com.sun.star.io.TextOutputStream" ) ' uno-handling to output an UFT-8-File + textout.setEncoding("utf8") ' + sfa = createUnoService( "com.sun.star.ucb.SimpleFileAccess" ) ' + xOutput = sfa.openFileWrite( Datei$ ) ' + textout.setOutputStream( xOutput ) ' + + for i%=1 to ListCount ( lsList() ) + textout.writeString( lsList( i% ) + Chr(13) + Chr(10) ) ' + next i% + xOutput.closeOutput ' uno-file-close + else + Dim FileNum% : Dim iLast% + + FileNum% = FreeFile + Open Datei$ for Output as #FileNum% + iLast% = Val(lsList(0)) + i%=1 + do while i% <= iLast% + Print #FileNum%, lsList(i%) + i% = i% +1 + loop + Close #FileNum% + endif + + ListWrite = TRUE +end function + +'------------------------------------------------------------------------- + +function ListReadAppend( lsList() as String , Datei$, optional sEncode as String ) as Boolean + 'Author: tz + '///+Appends a list into a file (If the file exists the file will be deleted before!). + '///+<u>Input</u>: <ol><li>The list</li><li>The file</li><li><b>optional</b>: The encoding "UTF8"</li></ol> + '///+<u>return</u>: TRUE or FALSE if this routine can read the file. + + Dim bUTF8 as Boolean + Dim i% + Dim CompareList() as String + Dim isCounter as Integer + Dim FileNum% + + if Dir( Datei$ ) = "" then + Warnlog "ListReadAppend : " + Datei$ + " is missing!" + ListReadAppend = FALSE + exit function + end if + + isCounter = ListCount ( lsList() ) + + if IsMissing ( sEncode ) = TRUE then + bUTF8 = FALSE + else + if UCASE ( sEncode ) = "UFT8" OR UCASE ( sEncode ) = "UTF8" then + bUTF8 = TRUE + else + Warnlog "ListRead : " + sEncode + " - Encoding is unkown!" + bUTF8 = FALSE + end if + end if + + if bUTF8 = TRUE then + Dim textin as object, sfa as object, xInput as object ' for UTF-8-input-routines + + textin = createUnoService( "com.sun.star.io.TextInputStream" ) ' uno-handling to input an UFT-8-File + textin.setEncoding("utf8") ' + sfa = createUnoService( "com.sun.star.ucb.SimpleFileAccess" ) ' + xInput = sfa.openFileRead( Datei$ ) ' + textin.setInputStream( xInput ) ' + + do until textin.isEOF() ' + i% = Val(lsList(0)) + 1 + lsList(0) = i% + lsList( i% ) = textin.readLine() ' + loop + xInput.closeInput ' uno-file-close + + 'INFO: (TZ) Only to workaround a problem with UNIX-Files... + if Right ( lsList(i%), 1 ) = Chr(10) then + lsList(i%) = Left ( lsList(i%), Len ( lsList(i%) ) - 1 ) + end if + '... + else + FileNum% = FreeFile + Open Datei$ for input as #FileNum% + + do until EOF(FileNum%) ' All from LIST-file + i% = Val(lsList(0)) + 1 + lsList(0) = i% + Line Input #FileNum%, lsList( i% ) + loop + Close #FileNum% + end if + + ListReadAppend = TRUE + +end function + +'------------------------------------------------------------------------- + +function ListWriteAppend( lsList() as String, Datei$, optional sEncode as String ) as Boolean + 'Author: tz + '///+Writes a list into a file (If the files exist all entries will be appended). + '///+<u>Input</u>: <ol><li>The list</li><li>The file</li><li><b>optional</b>: The encoding "UTF8"</li></ol> + '///+<u>return</u>: TRUE or FALSE if this routine can read the file. + + Dim bUTF8 as Boolean + Dim i% + Dim DummyList ( 15000 ) as String + + if IsMissing ( sEncode ) = TRUE then + bUTF8 = FALSE + else + if UCASE ( sEncode ) = "UTF8" then + bUTF8 = TRUE + else + Warnlog "ListRead :" + sEncode + " - Encoding is unkown!" + bUTF8 = FALSE + end if + end if + + if bUTF8 = TRUE then + Dim sfa as object, xOutput as object, textout as object ' for UTF-8-output-routines + + ListRead ( DummyList(), Datei$, "utf8" ) ' read old file in another list + for i% = 1 to ListCount ( lsList() ) + ListAppend ( DummyList(), lsList(i%) ) ' add the new list at the old list + next i% + + textout = createUnoService( "com.sun.star.io.TextOutputStream" ) ' uno-handling to output an UFT-8-File + textout.setEncoding("utf8") ' + sfa = createUnoService( "com.sun.star.ucb.SimpleFileAccess" ) ' + xOutput = sfa.openFileWrite( Datei$ ) ' + textout.setOutputStream( xOutput ) ' + + for i%=1 to ListCount (DummyList()) + textout.writeString( DummyList( i% ) + Chr(13) + Chr(10 ) ' + next i% + xOutput.closeOutput ' uno-file-close + else + Dim FileNum% + + FileNum% = FreeFile + Open Datei$ for Append as #FileNum% + + for i% = 1 to Val(lsList(0)) + Print #FileNum%, lsList(i%) + next i% + + Close #FileNum% + end if + ListWriteAppend = TRUE + +end function + +'------------------------------------------------------------------------- + +sub ListSort ( lsList() as String, optional UpDown as Boolean ) + 'Author: tz + '///+Sorts a list upward per default or downward if optional parameter is FALSE with quicksort method. + '///+<u>Input</u>: Unsorted list + + Dim Listenanzahl as Integer, i as Integer, j as Integer + Dim Zwischenspeicher as String + + ListenAnzahl = Val(lsList(0)) + for i=ListenAnzahl-1 to 1 step -1 + for j=1 to i + if UpDown = FALSE then + ' upward sorting + if uCase ( lsList(j) ) < uCase ( lsList(j+1) ) then + Zwischenspeicher = lsList (j) ' invert value (i) with value (i+1) + lsList (j) = lsList(j+1) + lsList (j+1) = Zwischenspeicher + end if + else + ' Downward sorting + if uCase ( lsList(j) ) > uCase ( lsList(j+1) ) then + Zwischenspeicher = lsList (j) ' invert value (i) with value (i+1) + lsList (j) = lsList(j+1) + lsList (j+1) = Zwischenspeicher + end if + end if + next j + next i +end sub + +'******************************************************************************* + +function gCompare2Lists( aListOne() as String, aListTwo() as String ) as boolean + + const CFN = "global::tools::inc::t_list.inc::gCompare2Lists: " + + '///<h3>Compare two lists with each other, where <b>list TWO</b> is the reference</h3> + '///<ul> + + dim aOneOnlyList( ubound( aListOne() ) ) as string + dim aTwoOnlyList( ubound( aListTwo() ) ) as string + + dim iListOneIndex as integer + dim iListTwoIndex as integer + + dim bFound as boolean + dim brc as boolean ' returncode: true if lists are identical + brc = true + + '///+<li>Create a copy of list two so we do not change the original list</li> + ListCopy( aListTwo() , aTwoOnlyList() ) + + '///+<li>Step through each item in list one</li> + for iListOneIndex = 1 to ListCount( aListOne() ) + + bFound = false + + '///+<li>Compare it to each item in list two</li> + for iListTwoIndex = 1 to ListCount( aTwoOnlyList() ) + + '///+<li>If the entries match, delete it from the TwoOnly list</li> + if ( aListOne( iListOneIndex ) = aTwoOnlyList( iListTwoIndex ) ) then + + bFound = true + ListDelete( aTwoOnlyList() , iListTwoIndex ) + exit for + + end if + + next iListTwoIndex + + '///+<li>If there is no match, the item exists in list one only -> copy</li> + if ( not bFound ) then + ListAppend( aOneOnlyList() , aListOne( iListOneIndex ) ) + end if + + next iListOneIndex + + '///+<li>List all items that exist in List One only</li> + if ( ListCount( aOneOnlyList() ) > 0 ) then + warnlog( CFN & "Objects have been added to the list" ) + hListPrint( aOneOnlyList() , "Items found in list ONE only (NEW)" ) + brc = false + end if + + '///+<li>List all items that exist in List Two only</li> + if ( ListCount( aTwoOnlyList() ) > 0 ) then + warnlog( CFN & "Objects have been removed from the list" ) + hListPrint( aTwoOnlyList() , "Items found in list TWO only (MISSING)" ) + brc = false + end if + + gCompare2Lists() = brc + '///</ul> + +end function + +'******************************************************************************* + +function hListPrint( lsList() as string , optional cComment as string ) as integer + + const CFN = "global::tools::inc::t_list.inc::hListPrint: " + + '///<h3>Print the content of a list to the log with a heading comment</h3> + '///<ul> + + dim iListItem as integer + + '///+<li>If no comment is provided we print a qaerrorlog</li> + if ( ismissing( cComment ) ) then + qaerrorlog( CFN & "Please provide any string as second parameter." ) + cComment = "" + end if + + '///+<li>Print a comment if desired</li> + if ( cComment <> "" ) then + printlog( "" ) + printlog( CFN & cComment ) + printlog( "" ) + end if + + '///+<li>Print all items in the list to the log</li> + for iListItem = 1 to listcount( lsList() ) + printlog( "(" & iListItem & ") : " & lsList( iListItem ) ) + next iListItem + + '///+<li>Return the number of listitems to the calling function</li> + hListPrint() = listcount( lsList() ) + + '///</ul> + +end function + +'******************************************************************************* + +function hListClearPattern( lsList() as string, cPattern as string ) as integer + + '///<h3>Search a list for the occurrence of a special pattern.</h3> + '///+ If the pattern is found, the entries are deleted, the new size of the + '///+ array is returned. + + dim iCurItem as integer + iCurItem = 1 + + do while ( iCurItem <= listcount( lsList() ) ) + + if ( instr( lsList( iCurItem ) , cPattern ) <> 0 ) then + listdelete( lsList() , iCurItem ) + else + iCurItem = iCurItem + 1 + end if + + loop + + hListClearPattern() = listcount( lsList() ) + +end function + +'******************************************************************************* + +function hListClearBlank( lsList() as string ) as integer + + '///<h3>Search a list for blank lines and remove them.</h3> + + dim iCurItem as integer + iCurItem = 1 + + do while ( iCurItem <= listcount( lsList() ) ) + + if ( len( lsList( iCurItem ) ) = 0 ) then + listdelete( lsList() , iCurItem ) + else + iCurItem = iCurItem + 1 + end if + + loop + + hListClearBlank() = listcount( lsList() ) + +end function + + + diff --git a/testautomation/global/tools/includes/required/t_menu.inc b/testautomation/global/tools/includes/required/t_menu.inc new file mode 100755 index 000000000000..830012cc7dae --- /dev/null +++ b/testautomation/global/tools/includes/required/t_menu.inc @@ -0,0 +1,918 @@ +'encoding UTF-8 Do not remove or change this line! +'******************************************************************************* +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/****************************************************************************** +'* +'* Owner : thorsten.bosbach@oracle.com +'* +'* short description : wrappers for accessing menues (context-, bar-, button- menues) +'* +'\****************************************************************************** + +function hMenuItemGetCount as Integer + + '/// OUTPUT: number of entries in the activated menu (without seperators) ///' + '///+ menu left open ///' + dim iCurrentMenuItem as integer + dim iValidMenuItems as integer + + sleep( 2 ) + + iValidMenuItems = 0 + for iCurrentMenuItem = 1 to MenuGetItemCount + if ( NOT MenuIsSeperator ( iCurrentMenuItem ) ) then + iValidMenuItems = iValidMenuItems + 1 + endif + next iCurrentMenuItem + hMenuItemGetCount = iValidMenuItems + +end function + +'******************************************************************************* + +function hMenuSelectNr ( EintragsNr as Integer ) as String + + '/// Selects the given nr. of <b>enabled</b> menu entry. + '/// <u>Note</u>: If there are disabled menu items are included the routine ignores them! + '///INPUT : number of entry from the top (>=1) OR + '///INPUT : number of entry from the bottom (<=-1) + '///INPUT : 0 to close menu + '///+ OUTPUT: text of the entry + + Dim i, j, RealEnd, Ende as Integer + Dim nID as long + + sleep( 2 ) + + Ende = EintragsNr + RealEnd = MenuGetItemCount + If (Ende > 0) then + if Ende > RealEnd then + Warnlog "hMenuSelectNr canceled: Entry number "+ Ende +" does not exists, because there are only " + RealEnd + " entries! " + hMenuClose + exit function + endif + j=0 + for i=1 to Ende + if MenuIsSeperator ( i+j ) then + j = j+1 + endif + next i + else + if ((RealEnd + Ende) < 0) then + Warnlog "hMenuSelectNr canceled: Entry number "+ Ende +" does not exists, because there are only " + RealEnd + " entries! " + hMenuClose + exit function + endif + j=1 + for i=-1 to Ende step -1 + if MenuIsSeperator (RealEnd +i+j) then + j = j -1 + endif + next i + j = j + RealEnd + endif + if EintragsNr = 0 then + hMenuClose + exit function + endif + nID = MenuGetItemID ( EintragsNr+j ) + hMenuSelectNr = MenuGetItemText ( nID ) + MenuSelect ( nID ) + +end function + +'******************************************************************************* + +function hMenuItemCheck ( EintragsNr as Integer ) as String + + '/// check the menu item (if it is checked, it stays checked) ///' + '///+ INPUT : number of entry from the top (>=1)///' + '///+ OUTPUT: text of the entry ///' + Dim i as Integer, j as Integer, RealEnd as Integer, Ende as Integer, nID as Integer + + Ende = EintragsNr + RealEnd = hMenuItemGetCount + + if Ende > RealEnd then + Warnlog "hMenuItemCheck canceled: Entry number "+ Ende +" does not exists, because there are only " + RealEnd + " entries! " + hMenuClose + exit function + endif + j=0 + for i=1 to Ende + if MenuIsSeperator ( i+j ) then + j = j+1 + endif + next i + nID = MenuGetItemID ( EintragsNr+j ) + hMenuItemCheck = MenuGetItemText ( nID ) + if NOT MenuIsItemChecked ( nID ) then + MenuSelect ( nID ) + else + hMenuClose() + endif + +end function + +'******************************************************************************* + +function hMenuItemUnCheck ( EintragsNr as Integer ) as String + + '/// UNcheck the menu item (if it is UNchecked, it stays UNchecked) ///' + '///+ INPUT : number of entry from the top (>=1)///' + '///+ OUTPUT: text of the entry ///' + Dim i, j, RealEnd, Ende, nID as Integer + + Ende = EintragsNr + RealEnd = hMenuItemGetCount + if Ende > RealEnd then + Warnlog "hMenuItemUnCheck canceled: Entry number "+ Ende +" does not exists, because there are only " + RealEnd + " entries! " + hMenuClose + exit function + endif + j=0 + for i=1 to Ende + if MenuIsSeperator ( i+j ) then + j = j+1 + endif + next i + nID = MenuGetItemID ( EintragsNr+j ) + hMenuItemUnCheck = MenuGetItemText ( nID ) + if MenuIsItemChecked ( nID ) then + MenuSelect ( nID ) + else + hMenuClose() + endif + +end function + +'******************************************************************************* + +function hMenuFindSelect(MenuID as variant, SelectSlot as Boolean, ExpectedNr as integer, optional VerboseWrongPosition as Boolean) as Boolean + + '/// Find specified MenuID in Menu, check if its found on the expected place, ///' + '/// if not - report the correct slot, and if specified to do so - Select the correct slot. ///' + '///+ INPUT: MenuID: the string-name of the menu-entry we are lookin for. ///' + '///+ INPUT: TRUE, if the slot should be called, ///' + '///+ FALSE, if the slot shouldn't be called. ///' + '///+ INPUT: Optional: TRUE, if errors should be reported. ///' + '///+ FALSE, silent mode for errors. ///' + '///+ INPUT: Optional: The Expected Number of entry from the top (>=1) ///' + '///+ OUTPUT: If not found at the expected place - the correct Entry-number is reported ///' + + Dim i as Integer + Dim RealId as Integer + Dim RealPosition as Integer + Dim MenuIDAsNumber as integer + Dim MenuIDAsString as string + Dim RealEnd as Integer + Dim nID as string + Dim found as string + Dim StringType as Boolean + + '/// find out if we are going to search for an ID, or a string (.uno:) ///' + if IsNumeric(MenuID) then + MenuIDAsNumber = MenuID + StringType = FALSE + else + MenuIDAsString = MenuID + StringType = TRUE + endif + + RealEnd = MenuGetItemCount + if ExpectedNr > RealEnd then + Warnlog "Entry number "+ ExpectedNr +" is higher than the number of entries (" + RealEnd + ") in this menu! " + endif + + if StringType = FALSE then 'Search for the number. + + nID = MenuGetItemID ( ExpectedNr ) + if nID <> MenuID then + if VerboseWrongPosition = TRUE then + warnlog " the questioned ID (" + MenuID + ") were not found on position " + ExpectedNr + endif + Found = FALSE + for i=1 to RealEnd + nID = MenuGetItemID (i) + printlog "For the position '" + i + "', the ItemCommand was: " + MenuGetItemCommand (MenuGetItemID (i)) + " and the ID was: " + MenuGetItemID (i) + "." + if nID = MenuID then + Found = TRUE + RealID = MenuGetItemID (i) + RealPosition = i + if VerboseWrongPosition = TRUE then + warnlog "The real Position (Separators included) was: " + i + endif + i = RealEnd + endif + next i + else + Found = TRUE + RealPosition = ExpectedNr + RealId = MenuGetItemID (ExpectedNr) + endif + + if Found = TRUE then + if SelectSlot then + MenuSelect (RealID) + hMenuFindSelect = TRUE + else + printlog "the slot was found, but the tester had choosen NOT to open the slot" + hMenuFindSelect = TRUE + hMenuClose + endif + else + if VerboseWrongPosition = TRUE then + warnlog "The slot was NOT found. Has either been removed, or it's a bug." + endif + hMenuFindSelect = FALSE + hMenuClose + endif + + else 'StringType = TRUE : Seach for the .uno; -name. + nID = lCase(MenuGetItemCommand (MenuGetItemID (ExpectedNr))) + + if nID <> lCase(MenuID) then + if VerboseWrongPosition = TRUE then + warnlog " the questioned ID (" + MenuID + ") were not found on position " + ExpectedNr + endif + Found = FALSE + for i=1 to RealEnd + nID = MenuGetItemCommand (MenuGetItemID (i)) + printlog "For the position '" + i + "', the ItemCommand was: " + nID + " and the ID was: " + MenuGetItemID (i) + "." + if nID = MenuID then + Found = TRUE + RealID = MenuGetItemID (i) + RealPosition = i + if VerboseWrongPosition = TRUE then + warnlog "The real Position (Separators included) was: " + i + endif + i = RealEnd + endif + next i + else + Found = TRUE + RealPosition = ExpectedNr + RealId = MenuGetItemID (ExpectedNr) + endif + if Found = TRUE then + if SelectSlot then + MenuSelect (RealID) + hMenuFindSelect = TRUE + else + printlog "the slot was found, but the tester had choosen NOT to open the slot" + hMenuFindSelect = TRUE + hMenuClose() + endif + else + if VerboseWrongPosition = TRUE then + warnlog "The slot was NOT found. Has either been removed, or it's a bug." + endif + hMenuFindSelect = FALSE + hMenuClose() + endif + endif 'StringType = TRUE + wait 500 'Wait 0,5 seconds in case we just have called a Submenu. + +end function + +'******************************************************************************* + +function hMenuItemIsChecked ( EintragsNr as Integer ) as Boolean + + '/// is the the menu item checked ? ///' + '///+ INPUT : number of entry from the top (>=1)///' + '///+ OUTPUT: True = yes!, False = no! ///' + + Dim i, j, Ende, RealEnd, nID as Integer + + Ende = EintragsNr + RealEnd = hMenuItemGetCount + if Ende > RealEnd then + Warnlog "hMenuItemIsChecked canceled: Entry number "+ Ende +" does not exists, because there are only " + RealEnd + " entries! " + hMenuClose + exit function + endif + j=0 + for i=1 to Ende + if MenuIsSeperator ( i+j ) then + j = j+1 + endif + next i + nID = MenuGetItemID ( EintragsNr + j ) + hMenuItemIsChecked = MenuIsItemChecked ( nID ) + +end function + +'******************************************************************************* + +function hMenuItemIsEnabled ( EintragsNr as Integer ) as Boolean + + '/// is the the menu item enabled (not greyed out) ? ///' + '///+ INPUT : number of entry from the top (>=1)///' + '///+ OUTPUT: True = yes!, False = no! ///' + '///+ menu left open ///' + + Dim i, j, Ende, RealEnd, nID as Integer + + Ende = EintragsNr + RealEnd = MenuGetItemCount + if Ende > RealEnd then + Warnlog "hMenuItemIsEnabled canceled: Entry number "+ Ende +" does not exists, because there are only " + RealEnd + " entries! " + hMenuClose + exit function + endif + j=0 + for i=1 to Ende + if MenuIsSeperator ( i+j ) then + j = j+1 + endif + next i + nID = MenuGetItemID ( EintragsNr + j ) + hMenuItemIsEnabled = MenuIsItemEnabled ( nID ) + +end function + +'******************************************************************************* + +function hMenuItemGetText ( EintragsNr as Integer ) as String + + '///+ INPUT : number of entry from the top (>=1)///' + '///+ OUTPUT: text of item without tilde ///' + '///+ menu left open ///' + + Dim i, j, RealEnd, Ende, nID as Integer + + Ende = EintragsNr + RealEnd = MenuGetItemCount + if Ende > RealEnd then + Warnlog "hMenuItemGetText canceled: Entry number "+ Ende +" does not exists, because there are only " + RealEnd + " entries! " + hMenuClose + exit function + endif + j=0 + for i=1 to Ende + if MenuIsSeperator ( i+j ) then + j = j+1 + endif + next i + nID = MenuGetItemID ( EintragsNr + j ) + hMenuItemGetText = hhEntferneTilde ( MenuGetItemText ( nID ) ) + +end function + +'******************************************************************************* + +sub hMenuClose + + '/// close menue ///' + '///+ after a hMenuClose you have to execute Kontext.UseMenu again + '///+ if you want to open any other menu. + MenuSelect ( 0 ) + +end sub + +'******************************************************************************* + +function hhEntferneTilde ( sEintrag as String ) as String + + '///+ INPUT : string with tilde ///' + '///+ OUTPUT: string without tilde ///' + + Dim i + i = Instr ( 1, sEintrag, "~", 1 ) + if i <> 0 then + hhEntferneTilde = Left ( sEintrag, i-1 ) + Right ( sEintrag, ( Len(sEintrag) - i ) ) + else + hhEntferneTilde = sEintrag + endif + +end function + +'******************************************************************************* + +function hMenuGetItemCommand ( EintragsNr as Integer ) as String + + '/// <u>hMenuGetItemCommand(Nr)</u> /// + '///+ To read the slot/UNO slot which is behind a menu item. /// + '///+ Seperators will be ignored for the input INTEGER! + + Dim i as integer + Dim j as integer + Dim RealEnd as integer + Dim DasEnde as integer + Dim nID as Integer + DasEnde = EintragsNr + RealEnd = MenuGetItemCount + if DasEnde > RealEnd then + warnlog "Parameter (" & DasEnde & ") bigger than items in menu (" & RealEnd & ") , 'hMenuGetItemCommand' canceled." + else + j=0 + for i=1 to DasEnde + if MenuIsSeperator ( i+j ) then + j = j+1 + endif + next i + nID = MenuGetItemID ( EintragsNr+j ) + hMenuGetItemCommand = MenuGetItemCommand ( nID ) + endif + +end function + +'******************************************************************************* + +function hMenuGetItemId ( EintragsNr as Integer ) as integer + + '///+ To read the Slot ID which is behind a menu item. /// + '///+ Seperators will be ignored for the input INTEGER! + + Dim i as integer + Dim j as integer + Dim RealEnd as integer + Dim DasEnde as integer + DasEnde = EintragsNr + RealEnd = MenuGetItemCount + if DasEnde > RealEnd then + warnlog "Parameter (" & DasEnde & ") bigger than items in menu (" & RealEnd & ") , 'hMenuGetItemId' canceled." + else + j=0 + for i=1 to DasEnde + if MenuIsSeperator ( i+j ) then + j = j+1 + endif + next i + hMenuGetItemId = MenuGetItemID ( EintragsNr+j ) + endif + +end function + +'******************************************************************************* + +'/// Functions for the lower part of the 'Window' Menu ///' +'///+ philosophie: you can't do any actions on the first document -> it get's the number 0 and it doesn't count ///' +'///+ so the first window you can work with gets the number 1 and counting starts with 1 ... ///' +'///<b> function hUseMenu () </b>///' +'///+ very global function: depends on 'gApplication' just activates the menu-bar ///' +'///<b> function hWindowGetIndex () as integer </b>///' +'///+ returns the number of the active window ///' +'///<b> function hWindowGetText (optional iWindow as integer) as string </b>///' +'///+ returns the text of the menu entry without the tilde: ///' +'///+ w/ calling parameter: the active window ///' +'///+ w/o calling parameter: the window i ///' +'///<b> function hWindowSelect (iWindow as integer) </b>///' +'///+ switches to the window i ///' +'///+ calling parameter: id of the window to activate ///' + +'******************************************************************************* + +function hWindowGetIndex () as integer + + '///<b> function hWindowGetIndex () as integer </b>///' + '///+ returns the number of the active window ///' + + dim iMenues as integer ' takes the number of entries in the windows menue + dim iNotWindows as integer ' number of open windows + dim iKandidate as integer + dim i as integer + + iNotWindows = GetDocumentCount() + hUseMenu() + + iMenues = hMenuItemGetCount + hMenuSelectNr(iMenues-1) ' 'windows' ist usually the one before the last + waitslot() 'wait 200 + iKandidate = 0 + iMenues = hMenuItemGetCount + for i = ((iMenues - iNotWindows) + 1) to iMenues + if (hMenuItemIsChecked (i)) then + if (iKandidate = 0) then + iKandidate = i + else + Warnlog "unexpected error 4711 - more than one window active??!! hWindowGetIndex () " + endif + endif + next i + iMenues = (iKandidate - (iMenues - iNotWindows) - 1) + hMenuClose() + + hWindowGetIndex = iMenues + +end function + +'******************************************************************************* + +function hWindowGetText (optional iWindow as integer) as string + + '///<b> function hWindowGetText (optional iWindow as integer) as string </b>///' + '///+ returns the text of the menu entry without the tilde: ///' + '///+ w/ calling parameter: the active window ///' + '///+ w/o calling parameter: the window i ///' + + dim iMenues as integer ' takes the number of entries in the windows menue + dim iNotWindows as integer ' number of open windows + dim iUseWindow + + if (isMissing(iWindow) = FALSE) then + iUseWindow = iWindow + else + iUseWindow = hWindowGetIndex() + endif + + iNotWindows = GetDocumentCount() + hUseMenu() + + iMenues = hMenuItemGetCount + hMenuSelectNr(iMenues-1) ' 'windows' ist usually the one before the last + + waitslot() 'wait 200 + iMenues = hMenuItemGetCount + hWindowGetText = hMenuItemGetTextMitTilde (iUseWindow + (iMenues - iNotWindows) + 1) + hWindowGetText = hhEntferneTilde(hWindowGetText) + hMenuClose() + +end function + +'******************************************************************************* + +function hWindowSelect (iWindow as integer) + + '///<b> function hWindowSelect (iWindow as integer) </b>///' + '///+ switches to the window i ///' + '///+ calling parameter: id of the window to activate ///' + + dim iMenues as integer ' takes the number of entries in the windows menue + dim iNotWindows as integer ' number of open windows + + iNotWindows = GetDocumentCount () + hUseMenu() + + 'ActivateDocument iNumber as integer ' is a testtool command, but there is no system that stays behind iNumber :-[ + iMenues = hMenuItemGetCount + hMenuSelectNr(iMenues-1) ' 'windows' ist usually the one before the last + WaitSlot() 'wait 200 + + iMenues = hMenuItemGetCount + hMenuSelectNr (iWindow + 1 + (iMenues - iNotWindows)) + +end function + +'******************************************************************************* + +function hUseMenu () + + '///<b> function hUseMenu () </b>///' + '///+ very global function: depends on 'gApplication' just activates the menu-bar ///' + + Select Case ( gApplication ) + Case "WRITER" + + Kontext "DocumentWriter" + DocumentWriter.UseMenu + + Case "MASTERDOCUMENT" + + Kontext "DocumentMasterDoc" + DocumentMasterDoc.UseMenu + + Case "HTML" + + Kontext "DocumentWriterWeb" + DocumentWriterWeb.UseMenu + + case "CALC" ' there are 2 entries over :-( usually only one, html 0 :-(((( + + Kontext "DocumentCalc" + DocumentCalc.UseMenu + + case "DRAW" + + Kontext "DocumentDraw" + DocumentDraw.UseMenu + + case "IMPRESS" + + Kontext "DocumentImpress" + DocumentImpress.UseMenu + + case "MATH" : + + Kontext "DocumentMath" + DocumentMath.UseMenu + + case "DATABASE" : + + Kontext "DATABASE" + Database.UseMenu + + case "BASIC" : + + Kontext "BasicIde" + BasicIde.UseMenu + + case "NONE" : + + Kontext "DocumentBackground" + DocumentBackground.UseMenu + + end select + +end function + +'******************************************************************************* + +function hOpenContextMenu() + + '/// very global function: depends on 'gApplication' just opens the Context Menu ///' + Select Case ( gApplication ) + Case "WRITER" + + Kontext "DocumentWriter" + DocumentWriter.openContextMenu + + Case "MASTERDOCUMENT" + + Kontext "DocumentMasterDoc" + DocumentMasterDoc.openContextMenu + + Case "HTML" + + Kontext "DocumentWriterWeb" + DocumentWriterWeb.openContextMenu + + case "CALC" + + Kontext "DocumentCalc" + DocumentCalc.openContextMenu + + case "DRAW" + + Kontext "DocumentDraw" + DocumentDraw.openContextMenu + + case "IMPRESS" + + Kontext "DocumentImpress" + DocumentImpress.openContextMenu + + case "MATH" : + + Kontext "DocumentMath" + DocumentMath.openContextMenu + + end select + +end function + +'******************************************************************************* + +function hGetWindowCaption( sApplication as string, optional bAll as boolean ) + + '///<b> function hGetWindowCaption () </b>///' + '///+ just returns the string from the application main window ///' + '///+ If optional parameter = true, thenn go throught all applications and get caption; return array ///' + + ' BEWARE: THIS FUNCTION MODIFIES ITS FUNCTION PARAMETER UNDER CERTAIN + ' CONDITIONS! + + dim sTemp as string + dim aApplication() as string + dim aTemp(10) as string + dim iTimes as integer + dim i as integer + + aApplication = array("SWRITER","SGLOBAL","SWEB","SCALC","SDRAW","SIMPRESS","SMATH","BASIC","DATABASE","SOFFICE") + if (isMissing(bAll) OR (NOT bAll)) then + iTimes = 0 + else + iTimes = uBound(aApplication()) + sApplication = aApplication(0) + endif + for i=0 to iTimes + Select Case Ucase(sApplication) + Case "SWRITER" + Kontext "DocumentWriter" + try + sTemp = DocumentWriter.caption + catch + endcatch + Case "SGLOBAL" + Kontext "DocumentMasterDoc" + try + sTemp = DocumentMasterDoc.caption + catch + endcatch + Case "SWEB" + Kontext "DocumentWriterWeb" + try + sTemp = DocumentWriterWeb.caption + catch + endcatch + case "SCALC" + Kontext "DocumentCalc" + try + sTemp = DocumentCalc.caption + catch + endcatch + case "SDRAW" + Kontext "DocumentDraw" + try + sTemp = DocumentDraw.caption + catch + endcatch + case "SIMPRESS" + Kontext "DocumentImpress" + try + sTemp = DocumentImpress.caption + catch + endcatch + case "SMATH" + Kontext "DocumentMath" + try + sTemp = DocumentMath.caption + catch + endcatch + Case "BASIC" + Kontext "BasicIDE" + try + sTemp = BasicIDE.caption + catch + endcatch + Case "DATABASE" + Kontext "DATABASE" + try + sTemp = DataBase.caption + catch + endcatch + Case "SOFFICE" + Kontext "DocumentBackground" + try + sTemp = DocumentBackground.caption + catch + endcatch + case else + qaErrorLog "sApplication not defined: '" + sApplication + "'" + sTemp = "" + end select + aTemp(i) = sTemp + try + sApplication=aApplication(i+1) + catch + endcatch + next i + if (iTimes > 0) then + hGetWindowCaption = aTemp() + else + hGetWindowCaption = sTemp + endif + +end function + +'******************************************************************************* + +function fSplitWindowTitle( sInString as string ) + + dim a, b, x, i, iProductname as integer + dim sTemp() as string + dim sProductname() as string + dim sTempReturn(2) as string + dim sTempReturn2(3) as string + dim bTestToolCommunication as boolean + dim bDebugVersion as boolean ' aka 'nonpro' + dim bError as boolean + + ' a) 'Untitled2 - OpenOffice.org Draw' (2) + ' b) 'Untitled1 - OpenOffice.org Writer TTD :localhost[1034]' (4) + ' c) 'Untitled1 - StarOffice Writer [680m72(Build:8863)]' (3) + ' d) 'Untitled2 - StarOffice Draw [680m72(Build:8863)] TTD :localhost[1034]' (5) + + bTestToolCommunication = FALSE + bDebugVersion = FALSE + bError = FALSE + if (sInString <> "") then + ' ' - ' separates Filename from Vendor + a = instr(sInString, " - ") ' get Document file name or Untitledi + if (a > 1) then + if (instr(a+1,sInString, " - ") > a) then + qaErrorLog "Argh!" + bError = TRUE + endif + sTempReturn(0) = left(sInString, a-1) ' (0) Filename + else + sTempReturn(0) = "" + bError = TRUE + endif + + ' seperate second string by spaces + sTemp() = split(right(sInString, len(sInString)-(a+2)), " ") ' Parts are now separated by spaces + x = uBound(sTemp()) + sProductname() = split(gProductname, " ") + iProductname = uBound(sProductname()) + x = x - iProductname + + sTempReturn(1) = sTemp(uBound(sTemp())) ' (1) Application + sTempReturn(2) = gProductname 'sTemp(0) ' (2) Vendor + + ' if ']' at end... (b,c,d) + if (right(sInString,1) = "]") then + ' if ')' at second last position it is a nonpro! + if (right(sInString,2) = ")]") then + ' normal detection works with spaces... (c) + bDebugVersion = TRUE + else + ' remove TestTool communication string (b,d) + ' it is the last 2 space seperated parts! + bTestToolCommunication = TRUE + if (left(sTemp(2),1)="[") then + bDebugVersion = TRUE + endif + endif + else + ' normal detection with spaces works... (a) + endif + + ' sanity checks, to warn if assumptions are not met! + select case x + case 1: + if ((bTestToolCommunication) OR (bDebugVersion)) then + qaErrorLog "t_menu.inc::fSplitWindowTitle: Unknown count of Window Title Strings! 1" + bError = TRUE + endif + case 2: + if ((bTestToolCommunication) OR (NOT bDebugVersion)) then + qaErrorLog "t_menu.inc::fSplitWindowTitle: Unknown count of Window Title Strings! 2" + bError = TRUE + endif + case 3: + if ((NOT bTestToolCommunication) OR (bDebugVersion)) then + qaErrorLog "t_menu.inc::fSplitWindowTitle: Unknown count of Window Title Strings! 3" + bError = TRUE + endif + case 4: + if ((NOT bTestToolCommunication) OR (NOT bDebugVersion)) then + qaErrorLog "t_menu.inc::fSplitWindowTitle: Unknown count of Window Title Strings! 4" + bError = TRUE + endif + case else: + qaErrorLog "t_menu.inc::fSplitWindowTitle: Unknown count of Window Title Strings! 0" + bError = TRUE + end select + + if bError then printlog sInString + + if (x > 1) then ' there is more to evaluate + ' save the current computed values + for i=0 to 2 + sTempReturn2(i) = sTempReturn(i) + next i + ' make return array bigger + redim sTempReturn(4) as string + ' copy data back + for i=0 to 2 + sTempReturn(i) = sTempReturn2(i) + next i + ' set remaining values, if exist + ' debug version string + if bDebugVersion then + sTempReturn(3) = mid(sTemp(2),2,len(sTemp(2))-2) ' optional (3) Debug Version + else + sTempReturn(3) = "" + endif + ' TestTool Communication string + if bTestToolCommunication then + ' if true, then always the two last strings + sTempReturn(4) = sTemp(x-1) + " " + sTemp(x) ' optional (4) TestTool Communication + else + sTempReturn(4) = "" + endif + endif + else + redim sTempReturn(0) as string + sTempReturn(0) = "" + endif + + fSplitWindowTitle = sTempReturn() + +end function + diff --git a/testautomation/global/tools/includes/required/t_option.inc b/testautomation/global/tools/includes/required/t_option.inc new file mode 100755 index 000000000000..4f4467263072 --- /dev/null +++ b/testautomation/global/tools/includes/required/t_option.inc @@ -0,0 +1,556 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/****************************************************************************** +'* +'* owner : thorsten.bosbach@oracle.com +'* +'* short description : General option test (sub-routines for options tests) +'* +'\****************************************************************************** + +function hToolsOptions ( Applicationname as string, Tabpagename as string, OPTIONAL bSilent as Boolean ) as Boolean + + const CFN = "global::tools::includes::required::t_option.inc:" + + Dim bCorPage as Boolean + Dim bFirst as Boolean + + Dim InitialNodeCount as Integer ' All nodes collapsed + Dim CurrentNodeCount as Integer ' Number of nodes when a top node is expanded + Dim iCurrentPage as Integer ' Increment variable for stepping through the nodes + Dim startpos as integer + + Applicationname = ucase( Applicationname ) + Tabpagename = ucase( Tabpagename ) + + '///<i>hToolsOptions</i>: Routine to select the correct option page + '///+<u>input</u>: The groupname as string, name of optionpage as string + '///+<u>note</u>: The options dialog has to be opened + '///+<u>OPTIONAL</u>: TRUE as an additional parameter if you want a printlog instead of a warning if a page has not been found. + + if IsMissing(bSilent) then + bSilent = FALSE + end if + + Kontext "Active" + try + if Active.Exists(1) then Active.OK + catch + if Active.Exists(1) then Active.No + endcatch + '///Group names list: + '///+<ul><li>"StarOffice"</li> + '///+<li>"LoadSave"</li> + '///+<li>"LanguageSettings"</li> + '///+<li>"Internet"</li> + '///+<li>"Textdocument"</li> + '///+<li>"HTMLDocument"</li> + '///+<li>"Spreadsheet"</li> + '///+<li>"Presentation"</li> + '///+<li>"Drawing"</li> + '///+<li>"Formula"</li> + '///+<li>"Chart"</li> + '///+<li>"Datasource"</li></ul> + Kontext "ExtrasOptionenDlg" + + if ExtrasOptionenDlg.Exists then + Optionsliste.TypeKeys "<HOME>" + for iCurrentPage = 1 to 12+1 + Optionsliste.TypeKeys "-<DOWN>" + next iCurrentPage + 'Optionsliste.TypeKeys "<HOME>" + InitialNodeCount = Optionsliste.GetItemCount + select case Applicationname + case "STAROFFICE" : startpos = 1 + case "LOADSAVE" : startpos = 2 + case "LANGUAGESETTINGS" : startpos = 3 + case "WRITER" : startpos = 4 + case "MASTERDOCUMENT" : startpos = 4 + case "HTML" : startpos = 5 + case "CALC" : startpos = 4 + case "IMPRESS" : startpos = 4 + case "DRAW" : startpos = 4 + case "MATH" : startpos = 4 + case "DATASOURCES" : startpos = InitialNodeCount -2 + case "CHART" : startpos = InitialNodeCount -1 + case "INTERNET" : startpos = InitialNodeCount ' always the last one + case else + warnlog( CFN & "Invalid Application name specified: " & Applicationname ) + printlog( "Valid options are:" ) + printlog( "gApplications: WRITER, CALC, MASTERDOCUMENT, DRAW, IMPRESS, HTML, MATH, CHART" ) + printlog( "additionally.: STAROFFICE, LOADSAVE, LANGUAGESETTINGS, DATASOURCES, INTERNET" ) + printlog( "All names must be uppercase" ) + exit function + end select + + Optionsliste.select Startpos + Optionsliste.typekeys "+" + CurrentNodeCount = Optionsliste.GetItemCount + bFirst = TRUE + for iCurrentPage = 1 to CurrentNodeCount - InitialNodeCount + bCorPage = FALSE + Kontext "ExtrasOptionenDlg" + Optionsliste.TypeKeys "<DOWN>" + WaitSlot() ' Some sort of NOOP + select case Applicationname + case "STAROFFICE" + '///Pages in group "StarOffice"are: + '///+<ul><li>"UserData"</li> + '///+<li>"General"</li> + '///+<li>"Memory"</li> + '///+<li>"View"</li> + '///+<li>"Print"</li> + '///+<li>"Paths"</li> + '///+<li>"Colors"</li> + '///+<li>"FontReplacement"</li> + '///+<li>"Security"</li> + '///+<li>"Appearence"</li> + '///+<li>"Accessibility"</li> + '///+<li>"Java"</li></ul> + select case Tabpagename + case "USERDATA" + Kontext "TabBenutzerdaten" + if TabBenutzerdaten.exists then bCorPage = TRUE + case "GENERAL" + if bFirst = TRUE then Optionsliste.Select ( startpos + 2 ) + bFirst = FALSE + Kontext "TabSonstigesAllgemein" + If TabSonstigesAllgemein.exists(2) then bCorPage = TRUE + case "MEMORY" + if bFirst = TRUE then Optionsliste.Select ( startpos + 3 ) + bFirst = FALSE + Kontext "TabMemory" + If TabMemory.exists(2) then bCorPage = TRUE + case "VIEW" + if bFirst = TRUE then Optionsliste.Select ( startpos + 4 ) + bFirst = FALSE + Kontext "TabAnsichtAllgemein" + If TabAnsichtAllgemein.exists(2) then bCorPage = TRUE + case "PRINT" + if bFirst = TRUE then Optionsliste.Select ( startpos + 5 ) + bFirst = FALSE + Kontext "TabPrintStarOffice" + if TabPrintStarOffice.exists(2) then bCorPage = TRUE + case "PATHS" + if bFirst = TRUE then Optionsliste.Select ( startpos + 6 ) + bFirst = FALSE + Kontext "TabPfade" + If TabPfade.exists(2) then bCorPage = TRUE + case "COLORS" + if bFirst = TRUE then Optionsliste.Select ( startpos + 7 ) + bFirst = FALSE + Kontext "TabFarben" + If TabFarben.exists(4) then bCorPage = TRUE + case "FONTREPLACEMENT" + if bFirst = TRUE then Optionsliste.Select ( startpos + 8 ) + bFirst = FALSE + Kontext "TabSchriftErsetzung" + If TabSchriftErsetzung.exists(2) then bCorPage = TRUE + case "SECURITY" + if bFirst = TRUE then Optionsliste.Select ( startpos + 9 ) + bFirst = FALSE + Kontext "TabSecurity" + If TabSecurity.exists(2) then bCorPage = TRUE + case "APPEARANCE" + if bFirst = TRUE then Optionsliste.Select ( startpos + 10 ) + bFirst = FALSE + Kontext "TabAppearance" + If TabAppearance.exists(2) then bCorPage = TRUE + case "ACCESSIBILITY" + if bFirst = TRUE then Optionsliste.Select ( startpos + 11 ) + bFirst = FALSE + Kontext "TabAccessibility" + If TabAccessibility.exists(2) then bCorPage = TRUE + case "JAVA" + if bFirst = TRUE then Optionsliste.Select ( startpos + 12 ) + bFirst = FALSE + Kontext "TabJava" + If TabJava.exists(2) then bCorPage = TRUE + case "ONLINEUPDATE" + if bFirst = TRUE then Optionsliste.Select ( startpos + 13 ) + bFirst = FALSE + Kontext "TabOnlineUpdate" + If TabOnlineUpdate.exists(2) then bCorPage = TRUE + case "IMPROVEMENT" + if bFirst = TRUE then Optionsliste.Select ( startpos + 14 ) + bFirst = FALSE + Kontext "TabOOoImprovement" + If TabOOoImprovement.exists(2) then bCorPage = TRUE + case else : bCorPage = FALSE + end select + case "LOADSAVE" + '///Pages in group "LoadSave"are: + '///+<ul><li>"General"</li> + '///+<li>"VBAProperties"</li> + '///+<li>"MicrosoftOffice"</li> + '///+<li>"HTMLCompatibility"</li></ul> + select case Tabpagename + case "GENERAL" + Kontext "TabSpeichern" + if TabSpeichern.exists then bCorPage = TRUE + case "VBAPROPERTIES" + if bFirst = TRUE then Optionsliste.Select ( startpos + 2 ) + bFirst = FALSE + Kontext "TabMicrosoftOffice97" + If WinwordBasicLaden.exists(4) then bCorPage = TRUE + case "MICROSOFTOFFICE" + if bFirst = TRUE then Optionsliste.Select ( startpos + 3 ) + bFirst = FALSE + Kontext "TabMicrosoftOffice2" + If Auswahl.exists(4) then bCorPage = TRUE + case "HTMLCOMPATIBILITY" + if bFirst = TRUE then Optionsliste.Select ( startpos + 4 ) + bFirst = FALSE + Kontext "TabHtml" + If TabHtml.exists(2) then bCorPage = TRUE + case else : bCorPage = FALSE + end select + case "LANGUAGESETTINGS" + '///Pages in group "LanguageSettings"are: + '///+<ul><li>"Language"</li> + '///+<li>"WritingAids"</li> + '///+<li>"SearchingJapanese"</li> + '///+<li>"AsianLayout"</li></ul> + '///+<li>"Complex Text Layout"</li></ul> + Kontext "Active" + if Active.Exists then Active.OK + Kontext "ExtrasOptionenDlg" + select case Tabpagename + case "LANGUAGES" + Kontext "TabSprachen" + If TabSprachen.exists(2) then bCorPage = TRUE + case "WRITINGAIDS" + if bFirst = TRUE then Optionsliste.Select ( startpos + 2 ) + bFirst = FALSE + Kontext "TabLinguistik" + If TabLinguistik.exists(2) then bCorPage = TRUE + case "SEARCHINGINJAPANESE" + if bFirst = TRUE then Optionsliste.Select ( startpos + 3 ) + bFirst = FALSE + Kontext "TabJapaneseFind" + if TabJapaneseFind.exists(2) then bCorPage = TRUE + case "ASIANLAYOUT" + if bFirst = TRUE then Optionsliste.Select ( startpos + 4 ) + bFirst = FALSE + Kontext "TabAsianLayoutOptions" + if TabAsianLayoutOptions.exists(2) then bCorPage = TRUE + case "COMPLEXTEXTLAYOUT" + if bFirst = TRUE then Optionsliste.Select ( startpos + 5 ) + bFirst = FALSE + Kontext "TabComplexTextLayout" + if TabComplexTextLayout.exists(2) then bCorPage = TRUE + case else : bCorPage = FALSE + end select + case "INTERNET" + '///Pages in group "Internet"are: + '///+<ul><li>"Proxy"</li> + '///+<li>"Search"</li></ul> + Kontext "Active" + if Active.Exists then Active.OK + Kontext "ExtrasOptionenDlg" + select case Tabpagename + case "PROXY" + Kontext "TabProxyServer" + if TabProxyServer.exists(2) then bCorPage = TRUE + case "SEARCH" + if bFirst = TRUE then Optionsliste.Select ( startpos + 2 ) + bFirst = FALSE + Kontext "TabSuche" + If TabSuche.exists(2) then bCorPage = TRUE + case "EMAIL" + if bFirst = TRUE then Optionsliste.Select ( startpos + 3 ) + bFirst = FALSE + Kontext "TabEmail" + If TabEmail.exists(2) then bCorPage = TRUE + case else : bCorPage = FALSE + end select + case "WRITER" + '///Pages in group "TextDocument"are: + '///+<ul><li>"General"</li> + '///+<li>"View"</li> + '///+<li>"FormattinAids"</li> + '///+<li>"Grid"</li> + '///+<li>"BasicFonts"</li> + '///+<li>"BasicFontsAsian"</li> + '///+<li>"BasicFontsCTL"</li> + '///+<li>"Print"</li> + '///+<li>"Table"</li> + '///+<li>"Changes"</li></ul> + select case Tabpagename + case "GENERAL" + Kontext "TabLaden" + If TabLaden.exists then bCorPage = TRUE + case "VIEW" + if bFirst = TRUE then Optionsliste.Select ( startpos + 2 ) + bFirst = FALSE + Kontext "TabInhalteWriter" + If TabInhalteWriter.exists(2) then bCorPage = TRUE + case "FORMATTINGAIDS" + if bFirst = TRUE then Optionsliste.Select ( startpos + 3 ) + bFirst = FALSE + Kontext "TabDirektCursor" + If TabDirektCursor.exists(2) then bCorPage = TRUE + case "GRID" + if bFirst = TRUE then Optionsliste.Select ( startpos + 4 ) + bFirst = FALSE + Kontext "TabRaster" + If TabRaster.exists(2) then bCorPage = TRUE + case "BASICFONTS" + if bFirst = TRUE then Optionsliste.Select ( startpos + 5 ) + bFirst = FALSE + Kontext "TabGrundschriften" + If TabGrundschriften.exists(2) then bCorPage = TRUE + case "BASICFONTSASIAN" + if bFirst = TRUE then Optionsliste.Select ( startpos + 6 ) + bFirst = FALSE + Kontext "TabGrundschriftenASIAN" + If TabGrundschriftenASIAN.exists(2) then bCorPage = TRUE + case "BASICFONTSCTL" + if bFirst = TRUE then Optionsliste.Select ( startpos + 6 ) + bFirst = FALSE + Kontext "TabGrundschriftenCTL" + If TabGrundschriftenCTL.exists(2) then bCorPage = TRUE + case "PRINT" + if bFirst = TRUE then Optionsliste.Select ( startpos + 6 ) + bFirst = FALSE + Kontext "TabDruckenWriter" + If TabDruckenWriter.exists(2) then bCorPage = TRUE + case "TABLE" + if bFirst = TRUE then Optionsliste.Select ( startpos + 7 ) + bFirst = FALSE + Kontext "TabTabelleOptionen" + If TabTabelleOptionen.exists(2) then bCorPage = TRUE + case "CHANGES" + if bFirst = TRUE then Optionsliste.Select ( startpos + 8 ) + bFirst = FALSE + Kontext "TabAenderungenWriter" + If TabAenderungenWriter.exists(2) then bCorPage = TRUE + case "COMPATIBILITY" + if bFirst = TRUE then Optionsliste.Select ( startpos + 9 ) + bFirst = FALSE + Kontext "TabCompatibility" + If TabCompatibility.exists(2) then bCorPage = TRUE + case "AUTOCAPTION" + if bFirst = TRUE then Optionsliste.Select ( startpos + 10 ) + bFirst = FALSE + Kontext "TabAutoCaption" + If TabAutoCaption.exists(2) then bCorPage = TRUE + case "MAILMERGEEMAIL" + if bFirst = TRUE then Optionsliste.Select ( startpos + 11 ) + bFirst = FALSE + Kontext "TabMailMergeEMail" + If TabMailMergeEMail.exists(2) then bCorPage = TRUE + + case else : bCorPage = FALSE + end select + case "HTML" + '///Pages in group "HTMLDocument"are: + '///+<ul><li>"General"</li> + '///+<li>"View"</li> + '///+<li>"Grid"</li> + '///+<li>"Print"</li> + '///+<li>"Table"</li> + '///+<li>"Source"</li> + '///+<li>"Background"</li></ul> + select case Tabpagename + case "VIEW" + Kontext "TabInhalteHTML" + If TabInhalteHTML.exists then bCorPage = TRUE + case "FORMATTINGAIDS" + if bFirst = TRUE then Optionsliste.Select ( startpos + 2 ) + bFirst = FALSE + Kontext "TabDirektCursor" + If TabDirektCursor.exists(2) then bCorPage = TRUE + case "GRID" + if bFirst = TRUE then Optionsliste.Select ( startpos + 3 ) + bFirst = FALSE + Kontext "TabRaster" + If TabRaster.exists(2) then bCorPage = TRUE + case "PRINT" + if bFirst = TRUE then Optionsliste.Select ( startpos + 4 ) + bFirst = FALSE + Kontext "TabDruckenHTML" + If TabDruckenHTML.exists(2) then bCorPage = TRUE + case "TABLE" + if bFirst = TRUE then Optionsliste.Select ( startpos + 5 ) + bFirst = FALSE + Kontext "TabTabelleOptionen" + If TabTabelleOptionen.exists(2) then bCorPage = TRUE + case "BACKGROUND" + if bFirst = TRUE then Optionsliste.Select ( startpos + 6 ) + bFirst = FALSE + Kontext "TabHintergrund" + If TabHintergrund.exists then bCorPage = TRUE + case else : bCorPage = FALSE + end select + case "CALC" + '///Pages in group "Spreadsheet"are: + '///+<ul><li>"General"</li> + '///+<li>"View"</li> + '///+<li>"Calculate"</li> + '///+<li>"Sortlists"</li> + '///+<li>"Changes"</li> + '///+<li>"Grid"</li> + '///+<li>"Print"</li></ul> + select case Tabpagename + case "GENERAL" + Kontext "TabLayoutCalc" + If TabLayoutCalc.exists(2) then bCorPage = TRUE + case "VIEW" + if bFirst = TRUE then Optionsliste.Select ( startpos + 2 ) + bFirst = FALSE + Kontext "TabInhaltCalc" + If TabInhaltCalc.exists(2) then bCorPage = TRUE + case "CALCULATE" + if bFirst = TRUE then Optionsliste.Select ( startpos + 3 ) + bFirst = FALSE + Kontext "TabBerechnen" + If TabBerechnen.exists(2) then bCorPage = TRUE + case "SORTLISTS" + if bFirst = TRUE then Optionsliste.Select ( startpos + 4 ) + bFirst = FALSE + Kontext "TabSortierlisten" + If TabSortierlisten.exists(2) then bCorPage = TRUE + case "CHANGES" + if bFirst = TRUE then Optionsliste.Select ( startpos + 5 ) + bFirst = FALSE + Kontext "TabAenderungenCalc" + If TabAenderungenCalc.exists(2) then bCorPage = TRUE + case "GRID" + if bFirst = TRUE then Optionsliste.Select ( startpos + 6 ) + bFirst = FALSE + Kontext "TabRaster" + If TabRaster.exists(2) then bCorPage = TRUE + case "PRINT" + if bFirst = TRUE then Optionsliste.Select ( startpos + 7 ) + bFirst = FALSE + Kontext "TabPrintCalcOptions" + If TabPrintCalcOptions.exists(2) then bCorPage = TRUE + case else : bCorPage = FALSE + end select + case "IMPRESS" + '///Pages in group "Presentation"are: + '///+<ul><li>"General"</li> + '///+<li>"View"</li> + '///+<li>"Grid"</li> + '///+<li>"Print"</li></ul> + select case Tabpagename + case "GENERAL" + Kontext "TabSonstigesDraw" + If TabSonstigesDraw.exists then bCorPage = TRUE + case "VIEW" + if bFirst = TRUE then Optionsliste.Select ( startpos + 2 ) + bFirst = FALSE + Kontext "TabInhalteDraw" + If TabInhalteDraw.exists(2) then bCorPage = TRUE + case "GRID" + if bFirst = TRUE then Optionsliste.Select ( startpos + 3 ) + bFirst = FALSE + Kontext "TabRaster" + If TabRaster.exists(2) then bCorPage = TRUE + case "PRINT" + if bFirst = TRUE then Optionsliste.Select ( startpos + 4 ) + bFirst = FALSE + Kontext "TabDruckenDraw" + If TabDruckenDraw.exists(2) then bCorPage = TRUE + case else : bCorPage = FALSE + end select + case "DRAW" + '///Pages in group "Drawing"are: + '///+<ul><li>"General"</li> + '///+<li>"View"</li> + '///+<li>"Grid"</li> + '///+<li>"Print"</li></ul> + select case Tabpagename + case "GENERAL" + Kontext "TabSonstigesDraw" + If TabSonstigesDraw.exists then bCorPage = TRUE + case "VIEW" + if bFirst = TRUE then Optionsliste.Select ( startpos + 2 ) + bFirst = FALSE + Kontext "TabInhalteDraw" + If TabInhalteDraw.exists(2) then bCorPage = TRUE + case "GRID" + if bFirst = TRUE then Optionsliste.Select ( startpos + 3 ) + bFirst = FALSE + Kontext "TabRaster" + If TabRaster.exists(2) then bCorPage = TRUE + case "PRINT" + if bFirst = TRUE then Optionsliste.Select ( startpos + 4 ) + bFirst = FALSE + Kontext "TabDruckenDraw" + If TabDruckenDraw.exists(2) then bCorPage = TRUE + case else : bCorPage = FALSE + end select + case "MATH" + '///Page(s) in group "Formula"are: + '///+<ul><li>"Settings"</li></ul> + select case Tabpagename + case "SETTINGS" + Kontext "TabDruckenMath" + If TabDruckenMath.exists then bCorPage = TRUE + case else : bCorPage = FALSE + end select + case "CHART" + '///Pages in group "Chart"are: + '///+<ul><li>"DefaultColors"</li></ul> + select case Tabpagename + case "DEFAULTCOLORS" + Kontext "TabGrundfarben" + If TabGrundfarben.exists(4) then bCorPage = TRUE + case else : bCorPage = FALSE + end select + case "DATASOURCES" + '///Pages in group "Datasource"are: + '///+<ul><li>"Connetions"</li></ul> + select case Tabpagename + case "CONNECTIONS" + Kontext "TabConnections" + If TabConnections.exists(4) then bCorPage = TRUE + case "DATABASES" + Kontext "TabRegisteredDatabase" + If TabRegisteredDatabase.exists(4) then bCorPage = TRUE + case else : bCorPage = FALSE + end select + case else + bCorPage = False + end select + If bCorPage = TRUE then Exit for + next iCurrentPage + if ( NOT bCorPage ) then + if ( NOT bSilent ) then + warnlog CFN & Applicationname + " / " + Tabpagename + " could not be found! Please review your test!" + else + printlog CFN & Applicationname + " / " + Tabpagename + " could not be found!" + end if + end if + else + bCorPage = FALSE + warnlog CFN & "Please open the option-dialog with 'ToolsOptions' before you called this routine!" + end if + hToolsOptions = bCorPage +end function + diff --git a/testautomation/global/tools/includes/required/t_option2.inc b/testautomation/global/tools/includes/required/t_option2.inc new file mode 100644 index 000000000000..7e97c58d2848 --- /dev/null +++ b/testautomation/global/tools/includes/required/t_option2.inc @@ -0,0 +1,554 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : thorsten.bosbach@oracle.com +'* +'* short description : Tools library for options testcases +'* +'\*********************************************************************** + +function OptionTabPageZaehler ( SollAnzahl as Integer, optional Ausnahme as Boolean ) + 'parameter Ausnahme is depracted + Dim IstAnzahl + Kontext "ExtrasOptionenDlg" + IstAnzahl = Optionsliste.GetItemCount - iSectionNumber + if Ausnahme = FALSE then + if IstAnzahl <> SollAnzahl then WarnLog "Number of tabpages old : " + SollAnzahl + " new : " + IstAnzahl + end if + OptionTabPageZaehler = IstAnzahl +end function + +'------------------------------------------------------------------------- + +sub ToPosInOptionlist ( Sprung as Integer ) + Dim i as Integer + Kontext "OptionenDlg" + Optionsliste.TypeKeys "<HOME>" + for i = 1 to 12 + Optionsliste.TypeKeys "-<DOWN>" + next i + Optionsliste.Select Sprung + Optionsliste.TypeKeys "+" +end sub + +'------------------------------------------------------------------------- + +sub DialogeFuerTypenKontrollieren + ' Complete test for path-options, for all entries the file-dialog or the path-dialog will be opened + Dim i as Integer + Dim iCount as Integer + Dim iErrorCount as integer + dim iExitCounter as integer : iExitCounter = 0 + Kontext "TabPfade" + Typ.TypeKeys "<Down><Down><Home>" + iCount = 0 + iErrorCount = 0 + for i=1 to Typ.GetItemCount + if i<>1 then Typ.TypeKeys "<Down>" + printlog " "+typ.getText + if ( bAsianLan <> TRUE ) then + try + Bearbeiten.Click + + do while( iExitCounter <= 10 ) + + kontext "Active" + if ( active.exists() ) then + iErrorCount = iErrorCount + 1 + if (iErrorCount > 1) then + Warnlog active.getText + endif + qaErrorlog "#i69014# gallery path doesn't exist: '" + active.getText + "'" + printlog active.getText + active.ok + endif + + Kontext "OeffnenDlg" + if OeffnenDlg.Exists() then + if ( Dateityp.IsVisible ) then + Warnlog "The normal FileOpen-Dialog is visible with the Filetype-Listbox => BUG!" + endif + OeffnenDlg.Cancel + exit do + endif + + Kontext "PfadeAuswaehlen" + if ( PfadeAuswaehlen.exists() ) then + PfadeAuswaehlen.Cancel + exit do + endif + + iExitCounter = iExitCounter + 1 + loop + Kontext "TabPfade" + catch + Warnlog "Error on entry " & i & "!" + Exceptlog + endcatch + else + try + if ( Bearbeiten.IsEnabled ) then + Bearbeiten.Click + + do while( iExitCounter <= 10 ) + + kontext "Active" + if active.exists () then + iErrorCount = iErrorCount + 1 + if (iErrorCount > 1) then + Warnlog active.getText + endif + qaErrorlog "WorkAround for #109107# has to come up only once @'Add-Ins'! else BUG!" + active.ok + endif + + Kontext "OeffnenDlg" + if OeffnenDlg.Exists() then + if ( Dateityp.IsVisible ) then + Warnlog "The normal FileOpen-Dialog is visible with the Filetype-Listbox => BUG!" + endif + OeffnenDlg.Cancel + exit do + endif + + Kontext "PfadeAuswaehlen" + if ( PfadeAuswaehlen.exists() ) then + PfadeAuswaehlen.Cancel + exit do + end if + + iExitCounter = iExitCounter + 1 + loop + Kontext "TabPfade" + else + iCount = iCount + 1 + end if + catch + Warnlog "Error on entry " & i & "!" + Exceptlog + endcatch + end if + next i + if iCount > 3 then Warnlog "There are more than 3 entries are disabled!" + +end sub + +'------------------------------------------------------------------------- + +function hSetMacroSecurity( iLevel as integer ) as integer + + '///<h3>Set macro security level via GUI</h3> + '///<i>Set the macro security by accessing the Tools/Options-> + '///+ OpenOffice.org/Security::Macro... Tabpage</i><br><br> + + '///<u>Parameter(s):</u><br> + '///<ol> + + '///+<li>Desired macro security level (Integer). Following symbolic names are defined:</li> + '///<ul> + '///+<li>GC_MACRO_SECURITY_LEVEL_LOW (0) for low security</li> + '///+<li>GC_MACRO_SECURITY_LEVEL_MEDIUM (1) for medium security</li> + '///+<li>GC_MACRO_SECURITY_LEVEL_HIGH (2) for high security</li> + '///+<li>GC_MACRO_SECURITY_LEVEL_VERYHIGH (3) for very high security</li> + '///</ul> + + '///</ol> + + + '///<u>Returns:</u><br> + '///<ol> + '///+<li>Previous security level (Integer)</li> + '///<ul> + '///+<li>GC_MACRO_SECURITY_LEVEL_LOW (0) for low security</li> + '///+<li>GC_MACRO_SECURITY_LEVEL_MEDIUM (1) for medium security</li> + '///+<li>GC_MACRO_SECURITY_LEVEL_HIGH (2) for high security</li> + '///+<li>GC_MACRO_SECURITY_LEVEL_VERYHIGH (3) for very high security</li> + '///+<li>-1 on error</li> + '///</ul> + '///</ol> + + + + '///Switch between macro security levels in Tools/Options + '///<ul> + const CFN = "hSetMacroSecurity::" + const RETVAL_FAILURE = -1 + const DEFAULT_WAIT_TIME = 2 + + dim iOldSecurityLevel as integer + + dim caLevel( 3 ) as string + caLevel( 0 ) = "low" + caLevel( 1 ) = "medium" + caLevel( 2 ) = "high" + caLevel( 3 ) = "very high" + + if ( ( iLevel < GC_MACRO_SECURITY_LEVEL_LOW ) or ( iLevel > GC_MACRO_SECURITY_LEVEL_VERYHIGH ) ) then + warnlog( CFN & "Invalid index (0...3) passed to function: " & ilevel ) + hSetMacroSecurity() = RETVAL_FAILURE + exit function + end if + + '///+<li>Open Tools/Options -> OpenOffice.org/Security</li> + ToolsOptions + hToolsOptions( "Staroffice" , "Security" ) + + '///+<li>Click on the macro security button</li> + Kontext "TabSecurity" + if ( MacroSecurity.exists( DEFAULT_WAIT_TIME ) ) then + MacroSecurity.click() + + '///+<li>Ensure we are on the Security Level page</li> + kontext "Active" + if ( Active.exists( DEFAULT_WAIT_TIME ) ) then + + Kontext + active.setpage TabSecurityLevel + + '///+<li>Get the current setting (=returnvalue)</li> + Kontext "TabSecurityLevel" + if ( TabSecurityLevel.exists( 2 ) ) then + if ( veryhigh.isChecked() ) then + iOldSecurityLevel = GC_MACRO_SECURITY_LEVEL_VERYHIGH + elseif( high.isChecked() ) then + iOldSecurityLevel = GC_MACRO_SECURITY_LEVEL_HIGH + elseif( medium.isChecked() ) then + iOldSecurityLevel = GC_MACRO_SECURITY_LEVEL_MEDIUM + elseif( low.isChecked() ) then + iOldSecurityLevel = GC_MACRO_SECURITY_LEVEL_LOW + end if + else + printlog( CFN & "Security Tabpage not available. Aborting." ) + kontext "OptionenDlg" + if ( OptionenDlg.exists( DEFAULT_WAIT_TIME ) ) then + OptionenDlg.cancel() + else + warnlog( CFN & "Unrecoverable error, status unknown." ) + endif + hSetMacroSecurity() = RETVAL_FAILURE + exit function + endif + + '///+<li>Set the new security level</li> + select case iLevel + case GC_MACRO_SECURITY_LEVEL_LOW : low.check() + case GC_MACRO_SECURITY_LEVEL_MEDIUM : medium.check() + case GC_MACRO_SECURITY_LEVEL_HIGH : high.check() + case GC_MACRO_SECURITY_LEVEL_VERYHIGH : veryhigh.check() + end select + + printlog( CFN & "Setting macro security level to " & caLevel( iLevel ) ) + + else + printlog( CFN & "Macro Security Dialog did not open. Aborting." ) + kontext "OptionenDlg" + if ( OptionenDlg.exists( DEFAULT_WAIT_TIME ) ) then + OptionenDlg.cancel() + else + warnlog( CFN & "Unrecoverable error, status unknown." ) + endif + hSetMacroSecurity() = RETVAL_FAILURE + exit function + endif + + '///+<li>Close Tools/Options</li> + TabSecurityLevel.ok() + else + warnlog( CFN & "The Macro Security Button is not available" ) + iOldSecurityLevel = RETVAL_FAILURE + end if + Kontext "OptionenDLG" + OptionenDLG.OK() + '///</ul> + hSetMacroSecurity() = iOldSecurityLevel +end function + +'******************************************************************************* + +function hGetMacroSecurityAPI() as integer + + + '///<h3>Retrieve the macro security level via API</h3> + '///<i>Use remote UNO to quickly retrieve the current macro security level. + '///+ This function runs silent unless an error is encountered.</i><br><br> + + '///<u>Parameter(s):</u><br> + '///<ol> + '///+<li>No input parameters</li> + '///</ol> + + + '///<u>Returns:</u><br> + '///<ol> + '///+<li>Macro Security Level (Integer)</li> + '///<ul> + '///+<li>GC_MACRO_SECURITY_LEVEL_LOW (0) for low security</li> + '///+<li>GC_MACRO_SECURITY_LEVEL_MEDIUM (1) for medium security</li> + '///+<li>GC_MACRO_SECURITY_LEVEL_HIGH (2) for high security</li> + '///+<li>GC_MACRO_SECURITY_LEVEL_VERYHIGH (3) for very high security</li> + '///+<li>-1 = Error</li> + '///</ul> + '///</ol> + + const CFN = "hGetMacroSecurityAPI::" + const RETVAL_FAILURE = -1 + + dim oUnoOfficeConnection as object + dim oUnoConfigurationAccess as object + dim aPropertyValue( 1 ) As new com.sun.star.beans.PropertyValue + dim iLevel as integer + dim xViewRoot + + try + + oUnoOfficeConnection=hGetUnoService(TRUE) + oUnoConfigurationAccess=oUnoOfficeConnection.createInstance("com.sun.star.configuration.ConfigurationProvider") + + aPropertyValue( 0 ).Name = "nodepath" + aPropertyValue( 0 ).Value = "/org.openoffice.Office.Common/Security/Scripting" + aPropertyValue( 1 ).Name = "lazywrite" + aPropertyValue( 1 ).Value = FALSE + + xViewRoot=oUnoConfigurationAccess.createInstanceWithArguments( "com.sun.star.configuration.ConfigurationUpdateAccess", aPropertyValue() ) + iLevel = xViewRoot.getByName( "MacroSecurityLevel" ) + xViewRoot.dispose() + + catch + + warnlog( CFN & "Failed to retrieve macro security Level via API" ) + iLevel = RETVAL_FAILURE + + endcatch + + hGetMacroSecurityAPI() = iLevel + +end function + + +'******************************************************************************* + +function hSetMacroSecurityAPI( iSecLevel as integer ) as integer + + + '///<h3>Set macro security level using API</h3> + '///<i>Set the macro security using remote uno. This implementation does exactly + '///+ the same as hSetMacroSecurity but is considerably faster</i><br><br> + + '///<u>Parameter(s):</u><br> + '///<ol> + + '///+<li>Desired macro security level (Integer). Following symbolic names are defined:</li> + '///<ul> + '///+<li>GC_MACRO_SECURITY_LEVEL_LOW (0) for low security</li> + '///+<li>GC_MACRO_SECURITY_LEVEL_MEDIUM (1) for medium security</li> + '///+<li>GC_MACRO_SECURITY_LEVEL_HIGH (2) for high security</li> + '///+<li>GC_MACRO_SECURITY_LEVEL_VERYHIGH (3) for very high security</li> + '///</ul> + + '///</ol> + + + '///<u>Returns:</u><br> + '///<ol> + '///+<li>Previous security level (Integer)</li> + '///<ul> + '///+<li>GC_MACRO_SECURITY_LEVEL_LOW (0) for low security</li> + '///+<li>GC_MACRO_SECURITY_LEVEL_MEDIUM (1) for medium security</li> + '///+<li>GC_MACRO_SECURITY_LEVEL_HIGH (2) for high security</li> + '///+<li>GC_MACRO_SECURITY_LEVEL_VERYHIGH (3) for very high security</li> + '///+<li>-1 on error</li> + '///</ul> + '///</ol> + + const CFN = "hSetMacroSecurityAPI::" + + dim oUnoOfficeConnection as object + dim oUnoConfigurationAccess as object + dim aPropertyValue( 1 ) As new com.sun.star.beans.PropertyValue + dim iLevel as integer + dim xViewRoot + + dim caLevel( 3 ) as string + caLevel( 0 ) = "low" + caLevel( 1 ) = "medium" + caLevel( 2 ) = "high" + caLevel( 3 ) = "very high" + + aPropertyValue( 0 ).Name = "nodepath" + aPropertyValue( 0 ).Value = "/org.openoffice.Office.Common/Security/Scripting" + aPropertyValue( 1 ).Name = "lazywrite" + aPropertyValue( 1 ).Value = FALSE + + '///<u>Description:</u> + '///<ul> + + iLevel = 0 + + '///+<li>Verify input parameter, quit function with a warning on error</li> + if ( iSecLevel < GC_MACRO_SECURITY_LEVEL_LOW or iSecLevel > GC_MACRO_SECURITY_LEVEL_VERYHIGH ) then + + warnlog( CFN & "Invalid security level passed to function: " & iSecLevel ) + hSetMacroSecurityAPI() = -1 + exit function + + endif + + + '///+<li>Get current security level, set the new one</li> + try + + oUnoOfficeConnection=hGetUnoService(TRUE) + oUnoConfigurationAccess=oUnoOfficeConnection.createInstance("com.sun.star.configuration.ConfigurationProvider") + + xViewRoot=oUnoConfigurationAccess.createInstanceWithArguments("com.sun.star.configuration.ConfigurationUpdateAccess",aPropertyValue()) + iLevel = xViewRoot.getByName( "MacroSecurityLevel" ) ' Get the current value + xViewRoot.setPropertyValue( "MacroSecurityLevel" , iSecLevel ) ' Set the new value + xViewRoot.commitChanges() + xViewRoot.dispose() + + 'printlog( CFN & "Setting macro security level to " & caLevel( iSecLevel ) + + catch + + warnlog( CFN & "Failed to get/set new macro security level via API:" & iSecLevel ) + iLevel = -1 + + endcatch + '///</ul> + + hSetMacroSecurityAPI() = iLevel + +end function + +'******************************************************************************* + +function hIsOOoImprovementTabVisible() as boolean + + ' This function tries to find out whether the OOo Improvement Program + ' Tabpage in Tools/Options is visible or not. + + dim oUnoConnect as object + dim oOOoImprovementController as object + dim bExists as boolean + const CFN = "hIsOOoImprovementTabVisible()::" + + oUnoConnect = hGetUnoService( TRUE ) + if ( isNull( oUnoConnect ) ) then + warnlog( CFN & "Failed to establish UNO connection, hGetUnoService failed" ) + hIsOOoImprovementTabVisible() = FALSE + exit function + else + try + oOOoImprovementController = oUnoConnect.createInstance( "com.sun.star.oooimprovement.CoreController" ) + bExists = oOOoImprovementController.showBuiltinOptionsPage( 1 ) + if ( bExists ) then + 'printlog( CFN & "The OOo Improvement Program Tabpage is visible" ) + hIsOOoImprovementTabVisible() = TRUE + else + printlog( CFN & "The OOo Improvement Program Tabpage is not visible" ) + hIsOOoImprovementTabVisible() = FALSE + endif + catch + warnlog( CFN & "Method com.sun.star.oooimprovement.CoreController.showBuiltinOptionsPage() not available." ) + printlog( CFN & "This indicates that the OOo Improvement Program feature is not included in this build." ) + hIsOOoImprovementTabVisible() = FALSE + endcatch + endif + +end function + +'******************************************************************************* + +function hEnableOOoImprovementProgramUNO() as boolean + + ' This function tries to enable the OOo Improvement Program (switch it on) + dim oUnoOfficeConnection as object + dim oUnoConfigurationAccess as object + dim aPropertyValue(1) As new com.sun.star.beans.PropertyValue ' Array of pairs: Property with Value + dim xViewRoot + + const CFN = "hEnableOOoImprovementProgramUNO()::" + + aPropertyValue(0).Name = "nodepath" + aPropertyValue(0).Value = "/org.openoffice.Office.OOoImprovement.Settings/Participation" + aPropertyValue(1).Name = "lazywrite" + aPropertyValue(1).Value = False + + oUnoOfficeConnection = hGetUnoService( TRUE ) + if ( isNull( oUnoOfficeConnection )) then + warnlog( CFN & "Failed to establish UNO connection, hGetUnoService failed" ) + hEnableOOoImprovementProgramUNO() = FALSE + else + oUnoConfigurationAccess = oUnoOfficeConnection.createInstance("com.sun.star.configuration.ConfigurationProvider") + xViewRoot = oUnoConfigurationAccess.createInstanceWithArguments("com.sun.star.configuration.ConfigurationUpdateAccess",aPropertyValue()) + xViewRoot.replaceByName( "ShowedInvitation", TRUE ) + xViewRoot.replaceByName( "InvitationAccepted", TRUE ) + xViewRoot.commitChanges() + hEnableOOoImprovementProgramUNO() = TRUE + if ( xViewRoot.hasPendingChanges() ) then + hEnableOOoImprovementProgramUNO() = FALSE + endif + xViewRoot.dispose() + endif + +end function + +'******************************************************************************* + +function hDisableOOoImprovementProgramUNO() as boolean + + ' This function tries to enable the OOo Improvement Program (switch it on) + dim oUnoOfficeConnection as object + dim oUnoConfigurationAccess as object + dim aPropertyValue(1) As new com.sun.star.beans.PropertyValue ' Array of pairs: Property with Value + dim xViewRoot + + const CFN = "hDisableOOoImprovementProgramUNO()::" + + aPropertyValue(0).Name = "nodepath" + aPropertyValue(0).Value = "/org.openoffice.Office.OOoImprovement.Settings/Participation" + aPropertyValue(1).Name = "lazywrite" + aPropertyValue(1).Value = False + + oUnoOfficeConnection = hGetUnoService( TRUE ) + if ( isNull( oUnoOfficeConnection )) then + warnlog( CFN & "Failed to establish UNO connection, hGetUnoService failed" ) + hDisableOOoImprovementProgramUNO() = FALSE + else + oUnoConfigurationAccess = oUnoOfficeConnection.createInstance("com.sun.star.configuration.ConfigurationProvider") + xViewRoot = oUnoConfigurationAccess.createInstanceWithArguments("com.sun.star.configuration.ConfigurationUpdateAccess",aPropertyValue()) + xViewRoot.replaceByName( "ShowedInvitation", TRUE ) + xViewRoot.replaceByName( "InvitationAccepted", FALSE ) + xViewRoot.commitChanges() + hDisableOOoImprovementProgramUNO() = TRUE + if ( xViewRoot.hasPendingChanges() ) then + hDisableOOoImprovementProgramUNO() = FALSE + endif + xViewRoot.dispose() + endif + +end function diff --git a/testautomation/global/tools/includes/required/t_tools1.inc b/testautomation/global/tools/includes/required/t_tools1.inc new file mode 100755 index 000000000000..051afec0ad24 --- /dev/null +++ b/testautomation/global/tools/includes/required/t_tools1.inc @@ -0,0 +1,1148 @@ +'encoding UTF-8 Do not remove or change this line! +'******************************************************************************* +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/****************************************************************************** +'* +'* owner : joerg.skottke@oracle.com +'* +'* short description : Tools (1) +'* +'\****************************************************************************** + +private SLEEP_TIME_REQUESTED as integer +private SLEEP_CALLS_SUM as integer +private SLEEP_TIME_USED as integer + +function GetClipboardText as string + + '/// Returns the correct clipboard text (also if there is a 'RETURN' at it's end. + Dim i% : Dim CBText$ + Dim Zwischen$ + + wait 500 + GetClipboardText = "" + CBText$ = GetClipboard + + if CBText$ = "" then + GetClipboardText = "" + exit function + end if + + if asc ( Right( CBText$, 1 )) = 10 then + Zwischen$ = Mid( CBText$, 1, len(CBText$)-1 ) + if Zwischen$ <> "" then + if asc ( Right( Zwischen$, 1 )) = 13 then + GetClipboardText = Mid( Zwischen$, 1, len(Zwischen$)-1 ) + else + GetClipboardText = Zwischen$ + end if + else + GetClipboardText = Zwischen$ + end if + else + if asc ( Right( CBText$, 1 )) = 13 then + Zwischen$ = Mid( CBText$, 1, len(CBText$)-1 ) + if asc ( Right( Zwischen$, 1 )) = 10 then + GetClipboardText = Mid( Zwischen$, 1, len(Zwischen$)-1 ) + else + GetClipboardText = Zwischen$ + end if + else + GetClipboardText = CBText$ + end if + end if + +end function + +'******************************************************************************* + +function hDoubleClickInList ( window, Selektion as String, optional bFocus as boolean ) as Boolean + + '/// hDoubleClickInList + '///+ Makes a double click onto an entry in a list (tested only in <i>style lists</i>) + '///+ window: name of list ///' + '///+ selektion: string to find in list ///' + '///+ bFocus: TRUE: activate the window with mouseclick before leaving ///' + '///+ ReturnValue: if found: TRUE; else FALSE ///' + + Dim i as Integer + Dim AlterWert as String + Dim NeuerWert as String + + NeuerWert = "!=! !=!" ' init with dummy value + window.TypeKeys "<Home>" + if window.gettext <> Selektion then + for i=1 to 100 step 2 + + window.MouseDown 5, i +1 + window.MouseUp 5, i +1 + AlterWert = window.GetText + window.TypeKeys "<Down>" + NeuerWert = Window.GetText + window.TypeKeys "<Up>" + + if AlterWert = Selektion then + + window.MouseDown 5, i +1 + window.MouseUp 5, i +1 + + ' catch if <down> had any effects + if Window.GetText = Selektion then + + window.MouseDoubleClick 5, i +1 + + ' if optional parameter provided + if (isMissing (bFocus) = FALSE) then + window.MouseDown 5, i +1 + window.MouseUp 5, i +1 + endif + + i = 202 + else + i=0 ' start at top of list + end if + else + + if AlterWert = NeuerWert then + Warnlog "'" + Selektion + "' wasn't found in list!" + i = 202 + else + + if i > 98 then + i=40 ' list not at end, but scrolled + endif + + end if + + end if + + next i + + if i < 200 OR i > 100 then + hDoubleClickInList = FALSE + else + hDoubleClickInList = TRUE + end if + + else + window.TypeKeys "<Return>" + hDoubleClickInList = TRUE + endif + +end function + +'******************************************************************************* + +sub hMouseClick ( window, xPos, yPos ) + + ' Author: Thorsten Ziehm (26.09.2000) + '/// hMouseClick + '///+ Do a mouse click on a named window. + '/// <i>Input</i>: + '///+ window : The object on which the mouse click should be make (document, listbox, window) + '///+ xPos : x-position (relativ to the size of the window (1:100) + '///+ yPos : y-position (relativ to the size of the window (1:100) + window.MouseDown ( xPos, yPos ) + window.MouseUp ( xPos, yPos ) + +end sub + +'******************************************************************************* + +function wielange (StrtTime, optional iFormat as integer) as String + + ' Author: Michael Friedrichs + '/// wielange + '///+ Returns the time between a start- and an end timeframe. + '///+ iFormat: 0: default; 1: mysql ///' + + Dim Zeitspanne + Dim Zeitspannesek + Dim Zeitspannemin + Dim Zeitspanneh + dim sTemp as string + + if isMissing(iFormat) then + 'dim iFormat as integer + iFormat = 0 + endif + + Zeitspanne = Now() - StrtTime + Zeitspannesek = Zeitspanne / 1.15741E-05 + 1 + Zeitspanneh = Fix(Zeitspannesek / 3600) + Zeitspannesek = Zeitspannesek - Zeitspanneh * 3600 + Zeitspannemin = Fix(Zeitspannesek / 60) + Zeitspannesek = Zeitspannesek - Zeitspannemin * 60 + Zeitspannesek = Fix(Zeitspannesek) + select case iFormat + case 0 + sTemp = "" & Zeitspanneh & "h " & Zeitspannemin & "m " & Zeitspannesek & "s" + case 1 + ' mysql format for status.inc + if Zeitspanneh < 10 then + sTemp = "0" & Zeitspanneh & ":" + else + sTemp = "" & Zeitspanneh & ":" + end if + + if Zeitspannemin < 10 then + sTemp = "" & sTemp & "0" & Zeitspannemin & ":" + else + sTemp = "" & sTemp & Zeitspannemin & ":" + end if + + if Zeitspannesek < 10 then + sTemp = "" & sTemp & "0" & Zeitspannesek + else + sTemp = "" & sTemp & Zeitspannesek + end if + + case default: + qaErrorLog "t_tools1.inc::wielange: optional parameter iFormat out of range!" + sTemp = "" + end select + + wielange = sTemp + +end function + +'******************************************************************************* + +function Sleep( optional _iSeconds as integer ) as integer + + const CFN = "global::tools::includes::required::Sleep(...): " + + const STATUS_NO_DELAY = 0 + const STATUS_TIMEOUT_EXCEEDED = 1 + const STATUS_WAITSLOT_CRASHED = 2 + const STATUS_CLASSIC_WAIT_USED = 3 + + ' This is the "classic" behavior of the sleep function. If you did not set + ' GLOBAL_USE_NEW_SLEEP to TRUE in your .bas file, this will be used. + if ( not GLOBAL_USE_NEW_SLEEP ) then + if ( IsMissing( _iSeconds ) ) then + wait( 1000 ) + else + wait( _iSeconds * 1000 ) + endif + sleep() = STATUS_CLASSIC_WAIT_USED + exit function + endif + + ' This is an extended and accelerated version of the "classic" sleep() + ' subroutine which used to call Wait( n ) with a given number of + ' milliseconds. This function uses WaitSlot( n ) and is dynamic. + ' The try...catch block is necessary because WaitSlot() can - under certain + ' yet unknown conditions - make the office application crash. + ' When called with 0 seconds we return 0 (dynamic sleep statements within + ' test initialization can actually call the function with a Zero parameter) + ' A negative number forces the function to use the classic behavior. + ' If no time is given the function defaults to 5 seconds. + ' The function now provides returnvalues: + ' 0 = Normal WaitSlot() used, this is the preferred method. + ' 1 = WaitSlot() timeout reached, one extra second was added. + ' This is bad and the script developer should try to fix it. + ' 2 = Wait() was used (classic method, fallback). + ' 3 = Wait() was used (forced old behavior) + + dim iMilliseconds as integer + dim iStatus as integer : iStatus = 0 + dim lBegin as long : lBegin = GetSystemTicks + dim iSeconds as integer : iSeconds = 5 + dim iSystemDelay as integer : iSystemDelay = 1000 + dim iTimeDiff as long : iTimeDiff = 0 + + ' On Solaris we are a little slower, so we increase the system delay a little + if ( instr( lcase( gtSysName ) , "solaris" ) > 0 ) then + iSystemDelay = 1500 + endif + + ' Override default wait time (5 seconds) if parameter is given + if ( not IsMissing( _iSeconds ) ) then + iSeconds = _iSeconds + endif + + ' Do exit directly if no wait requested + if ( iSeconds = 0 ) then + Sleep() = STATUS_NO_DELAY + exit function + endif + + ' We need the time in ms and absolute (parameter can be negative) + iMilliseconds = abs( iSeconds * 1000 ) + + ' Here we actually do the delay and generate return values + ' If WaitSlot() times out, we give an extra second (wait(1000)) + if ( iSeconds > 0 ) then + try + if ( WaitSlot( iMilliseconds ) <> WSFinished ) then + wait( iSystemDelay ) + iStatus = STATUS_TIMEOUT_EXCEEDED + endif + catch + wait( iMilliseconds ) + iStatus = STATUS_WAITSLOT_CRASHED + endcatch + else + Wait( iMilliseconds ) + iStatus = STATUS_CLASSIC_WAIT_USED + endif + + ' Find out how long it took, warn if time was zero (sleep most likely not required) + iTimeDiff = GetSystemTicks - lBegin + if ( iTimeDiff = 0 ) then + printlog( CFN & "Zero time. Please consider removing Sleep() statement" ) + endif + + if ( GVERBOSE ) then + SLEEP_CALLS_SUM = SLEEP_CALLS_SUM + 1 + SLEEP_TIME_USED = SLEEP_TIME_USED + iTimeDiff / 1000 ' good enough + SLEEP_TIME_REQUESTED = SLEEP_TIME_REQUESTED + iSeconds + printlog( CFN & "--------------------- New call ---------------------" ) + printlog( CFN & "Total Sleep()-Time requested (seconds): " & SLEEP_TIME_REQUESTED ) + printlog( CFN & "Total Sleep()-Time used (seconds).....: " & SLEEP_TIME_USED ) + printlog( CFN & "Total number of Sleep()-Calls.........: " & SLEEP_CALLS_SUM ) + endif + + ' Try to make something useful out of the status + if ( iStatus <> 0 ) then + printlog( CFN & "Sleep(" & abs( iSeconds ) & "), took " _ + & iTimeDiff & " ms, rc=" & iStatus ) + select case iStatus + case STATUS_TIMEOUT_EXCEEDED : + printlog( CFN & "Timeout exceeded." ) + case STATUS_WAITSLOT_CRASHED : + printlog( CFN & "Used Wait(n). WaitSlot() failed." ) + case STATUS_CLASSIC_WAIT_USED : + printlog( CFN & "Used Wait(n). Classic behavior forced" ) + end select + endif + Sleep() = iStatus + +end function + +'******************************************************************************* + +sub DialogTest( Window, optional iNumber as integer) + + '/// DialogTest + '///+ Make <i>SnapShots</i> + '/// <b>Window</b> : the name of the window as declared in qa/qatesttool/global/win/* + '/// <i>Optional Parameter</i> <b>iNumber</b> : Number to distinguish windows which dynamical change their content but not their ID///' + '///+ the number has to be provided by the testscript creator ///' + Dim Ergebnis as Integer + Dim Ausgabe as String + Dim UndRaus as Boolean + Dim sCount as string + + ' evaluate optional parameter + if isMissing(iNumber) then + 'just one picture + sCount = "" + else + 'there will be more pictures with the same ID + sCount = "_"+iNumber + endif + + if gDasNicht=0 then + ' In Place Translation Feature: not used anymore; + ' The matching of the strings on the later migration step never worked. + ' Just kept here for historical reasons + Ausgabe = "" + UndRaus = FALSE + while UndRaus = FALSE + Ausgabe = translate + if Ausgabe <> "" OR Ausgabe <> "1" then + if Left ( Ausgabe, 1 ) = "0" then + Ausgabe = Right ( Ausgabe, Len( Ausgabe )- 2 ) + AnhaengenAnDatei ( gOfficePath + "trans_output.txt", Ausgabe ) + end if + end if + if Ausgabe = "1" then + UndRaus = TRUE + endif + wend + else + ' Usual window check + try + if Not window.Exists(2) then + Warnlog " - Window nicht existent:" + window.Name + " " + window.ID + exit sub + end if + 'To get a history, of what windows are covered, use the following line + ' AnhaengenAnDatei ( ConvertPath (gOfficePath + "user\work\wieviel.txt"), window.Name + " " + sCount + " : " + window.ID ) + catch + ExceptLog + endcatch + end if + + if gbSnapShot = TRUE then + 'Make Screenshot from dialog and save as HelpID.bmp + Dim Dummy as String, sName as String, sPicName as String + + 'get window ID + Dummy = Window + 'set filename + sName = Dummy + sCount + ".bmp" + + 'save with respect to application and language + sCapturePath = ConvertPath (gOfficePath + "user\work\screenshots"+iSprache+"\") + sPicName = sCapturePath + lCase(gApplication) + + 'create directory if it doesn't exist + if ( not FileExists(sPicName) ) then mkdir sPicName + + sPicName = sPicName + sName + try + sleep 1 + window.SnapShot( sPicName ) + catch + warnlog "t_tools1.inc::DialogTest Failed to save screenshot: '" + sPicName + "'" + endcatch + printlog sPicName + end if + +end sub + +'******************************************************************************* + +function hFindeImDokument ( Passage$ , Optional A, optional bRegEx ) as boolean + + ' Author: Joerg Sievers (13.11.2001) + '/// hFindeImDokument + '/// Searches via 'Search&Replace'-Dlg in StarOffice Writer, -Clac, + '///+ -HTML, -GlobalDoc for the string <b>EXACT MATCH</b>. + '///+ Only ONE TIME and THE FIRST search phrase will be found! + '/// <i>Optional Parameter</i> <b>a</b> : If you do not want a warnlog message + '/// <i>Optional Parameter</i> <b>bRegEx</b> : if you look fort an regular expression + Dim WhatIsIn as string + Dim bSilent as boolean + + bSilent = NOT isMissing(a) + gApplication = UCase ( gApplication ) + hFindeImDokument = FALSE + + select case gApplication + + case "CALC" : + Kontext "DocumentCalc" + DocumentCalc.TypeKeys "<MOD1 HOME>" + + case "WRITER" : + Kontext "DocumentWriter" + DocumentWriter.TypeKeys "<MOD1 HOME>" + + case "HTMLDOKUMENT": + Kontext "DocumentWriterWeb" + DocumentWriterWeb.TypeKeys "<MOD1 HOME>" + + case "GLOBALDOC" : + Kontext "DocumentMasterDoc" + DocumentMasterDoc.TypeKeys "<MOD1 HOME>" + end select + + SetClipboard "" + EditSearchAndReplace + + Kontext "FindAndReplace" + if SimilaritySearch.IsVisible = False then + More.Click + end if + + if MatchCase.IsChecked = False then + MatchCase.Check + end if + + if SimilaritySearch.IsChecked = TRUE then + SimilaritySearch.UnCheck + if NOT bSilent then + warnlog "'Similarity search' checkbox was enabled! It shouldn't be the default!" + endif + end if + + if IsMissing(bRegEx) <> TRUE then + RegularExpressions.Check + end if + + SearchFor.Settext Passage$ + SearchNow.Click + + Kontext + if NOT Active.Exists(2) then + + Kontext "FindAndReplace" + More.Click + FindAndReplace.Cancel + EditCopy + WhatIsIn = GetClipboardText + + if WhatIsIn <> Passage$ then + if NOT bSilent then + warnlog "The search-request for '" & Passage$ & "' has been fault! (Found: '"& WhatIsIn & "')" + end if + else + hFindeImDokument = TRUE + end if + + else + try + Kontext + if Active.Exists(1) then + Active.OK + end if + + if NOT bSilent then + warnlog "The search-request for '" & Passage$ & "' has been fault! (Found: '"& WhatIsIn & "')" + end if + + Kontext "FindAndReplace" + if SimilaritySearch.IsVisible = False then + More.Click + endif + + if MatchCase.IsChecked then + MatchCase.UnCheck + endif + + if SimilaritySearch.IsChecked = TRUE then + + SimilaritySearch.UnCheck + if NOT bSilent then + warnlog "'Similarity search' checkbox was enabled! It shouldn't be the default!" + endif + end if + + if IsMissing(bRegEx) <> TRUE then + RegularExpressions.UnCheck + endif + + More.Click + FindAndReplace.Cancel + catch + Active.Yes + + Kontext + if bSilent then + if Active.Exists then + printlog "> "+Active.GetText + endif + endif + + if Active.Exists then + Active.OK + endif + + if NOT bSilent then + warnlog "The search-request for '" & Passage$ & "' has been fault! (Found: '"& WhatIsIn & "')" + endif + + Kontext "FindAndReplace" + if SimilaritySearch.IsVisible = False then + More.Click + endif + + if MatchCase.IsChecked then + MatchCase.UnCheck + endif + + if SimilaritySearch.IsChecked = TRUE then + + SimilaritySearch.UnCheck + if NOT bSilent then + warnlog "'Similarity search' checkbox was enabled! It shouldn't be the default!" + endif + end if + + if IsMissing(bRegEx) <> TRUE then + RegulaererAusdruck.UnCheck + endif + + More.Click + FindAndReplace.Cancel + + endcatch + end if + +end function + +'******************************************************************************* + +function hFindeMehrImDokument ( Passage as string , WieOft as integer ) as boolean + + ' Author: Joerg Sievers (26.07.2000) + '/// hFindeMehrImDokument + '/// Searches per 'Search&Replace'-Dlg in StarOffice Writer, -Clac, + '///+-HTML, -GlobalDoc for the string <b>EXACT MATCH</b>. + '/// You have to give the function the number how often the phrase + '///+should be found in the document as an additional parameter (as integer). + '/// Only when exact the number of the phrase will be found correctly + '///+the function gives back TRUE. + '/// <i>see also</i> : hFindeImDokument (TOOLS.INC) + Dim i as integer + gApplication = UCase ( gApplication ) + + hFindeMehrImDokument = FALSE + + select case gApplication + + case "CALC" : + Kontext "DocumentCalc" + DocumentCalc.TypeKeys "<MOD1 HOME>" + + case "WRITER" : + Kontext "DocumentWriter" + DocumentWriter.TypeKeys "<MOD1 HOME>" + + case "HTMLDOKUMENT": + Kontext "DocumentWriter" + DocumentWriter.TypeKeys "<MOD1 HOME>" + + case "GLOBALDOC" : + Kontext "DocumentMasterDoc" + DocumentMasterDoc.TypeKeys "<MOD1 HOME>" + + end select + + SetClipboard "" + EditSearchAndReplace + + For i = 1 to WieOft + + Kontext "FindAndReplace" + if NOT MatchCase.IsChecked then + MatchCase.Check + endif + SearchFor.Settext Passage + SearchNow.Click + + Kontext + if NOT Active.Exists(2) then + + FindAndReplace.Cancel + EditCopy + + if GetClipboardText <> Passage then + warnlog "The search-request for '" & Passage & "' has been fault!" + i = WieOft + else + if i = WieOft then + hFindeImDokument = TRUE + printlog "Searchphrase found " & i & " time(s)." + end if + end if + else + try + Active.OK + + Kontext + if Active.Exists then + Active.OK + endif + warnlog "The search-request for '" & Passage & "' has been fault!" + i = WieOft + Kontext "FindAndReplace" + + if MatchCase.IsChecked then + MatchCase.UnCheck + endif + FindAndReplace.Cancel + catch + Active.Yes + + Kontext + if Active.Exists then + Active.OK + endif + warnlog "The search-request for '" & Passage & "' has been fault!" + i = WieOft + + Kontext "FindAndReplace" + if MatchCase.IsChecked then + MatchCase.UnCheck + endif + FindAndReplace.Cancel + endcatch + end if + Next i + Kontext "FindAndReplace" + if FindAndReplace.Exists(2) then + FindAndReplace.Cancel + end if + +end function + +'******************************************************************************* + +sub TextInDatei ( TextText$, Datei$ ) + + '/// TextInDatei + + Dim FileNum% + + FileNum% = FreeFile + Open Datei$ for Append as #FileNum% + Print #FileNum%, TextText$ + Close #FileNum% + +end sub + +'******************************************************************************* + +function TrimTab ( sTrimmer as String ) as String + + '/// TrimTab + '/// <u>Input</u>: the original text + '/// Returns the string without <tab>s at the beginning and the end of a string. + + Dim sInterim as String + + sInterim = sTrimmer + sInterim = lTrimTab ( sInterim ) + TrimTab = rTrimTab ( sInterim ) + +end function + +'******************************************************************************* + +function lTrimTab ( slTrimmer as String ) as String + + '/// lTrimTab + '/// <u>Input</u>: the original text + '/// Returns the string without <tab>s at the beginning. + '/// Cuts <Tab's> at the beginning of a string ( left ) + + Dim i, iLen as Integer + Dim sInterim as String + + iLen = len ( slTrimmer ) + sInterim = slTrimmer + + for i=1 to iLen + if Asc ( left ( sInterim, 1 ) ) = 9 then + sInterim = Right ( sInterim, len ( sInterim ) - 1 ) + else + i=iLen+1 + end if + next i + lTrimTab = sInterim +end function + +'******************************************************************************* + +function rTrimTab ( srTrimmer as String ) as String + + '/// rTrimTab + '/// Input: the original text + '/// Returns the string without <tab>s at the end. + '/// Cuts <Tab's> at the beginning of a string ( right ) + + Dim i, iLen as Integer + Dim sInterim as String + + iLen = len ( srTrimmer ) + sInterim = srTrimmer + + for i=1 to iLen + if Asc ( right ( sInterim, 1 ) ) = 9 then + sInterim = left ( sInterim, len ( sInterim ) - 1 ) + else + i=iLen+1 + end if + next i + rTrimTab = sInterim + + end function + +'******************************************************************************* + +function TrimString (Content as String, delim as integer) as String + + ' Author: Frank Heitbrock (26.07.2002) + '/// TrimString + '/// <u>Input</u>: The String, the delimiter which should be cut from the string. + '/// Returns the String without the delimiter. + '/// <u>Example</u>: + '///+ Content = " H a l l o ", delim = 32 (ascii for space character) + '///+ Return = "Hallo" + dim strlen as integer, i as integer, k as integer + dim CharBuff(1 to 100) as String + dim ResultStr as String + ' at first cut the empty strings left and right of the String + Content = lTrim(Content) + Content = rTrim(Content) + ' now we search for all appropriate ascii characters in the middle of the String and delete them + strlen = len(Content) + k = 1 + for i = 1 to strlen + if mid(Content, i, 1) <> chr(delim) then + CharBuff(k) = mid(Content, i, 1) + k = k +1 + end if + next i + for i = 1 to k + ResultStr = ResultStr + CharBuff(i) + next i + TrimString = ResultStr + +end function + +'******************************************************************************* + +function ActiveDeactivateAsianSupport ( WhatState as Boolean ) as Boolean + + ' Author: Thorsten Ziehm + '/// ActiveDeactivateAsianSupport + '/// <u>Input</u>: TRUE or FALSE + '///+ TRUE: The Asian support will be enabled. + '///+ FALSE: The Asian support will be disabled. + '/// <u>Return:</u> + '///+ TRUE/FALSE for the last state of the checkbox in the office UI. + ToolsOptions + hToolsOptions ( "LanguageSettings", "Languages" ) + + IF Aktivieren.IsEnabled then 'the checkbox is disabled in asian versions + ActiveDeactivateAsianSupport = Aktivieren.IsChecked ' the function gets the old state of the checkbox + + if WhatState = TRUE then + try + Aktivieren.Check + catch + endcatch + else + Aktivieren.UnCheck + end if + gAsianSup = WhatState ' Set the global variable + + Kontext "ExtrasOptionenDlg" + hCloseDialog( ExtrasOptionenDlg, "ok" ) + else + ActiveDeactivateAsianSupport = TRUE + If WhatState = FALSE then + warnlog "Deactivating of asian language support is not possible, because it is disabled in cjk versions" + end if + Kontext "ExtrasOptionenDlg" + hCloseDialog( ExtrasOptionenDlg, "ok" ) + end if + +end function + +'******************************************************************************* + +function ActiveDeactivateCTLSupport ( WhatState as Boolean ) as Boolean + + ' Author: Hercule Li (March 2004) + '/// ActiveDeactivateCTLSupport + '/// <u>Input</u>: TRUE or FALSE + '/// TRUE : The CTL will be enabled. + '/// FALSE: The CTL will be disabled. + '/// <u>Return:</u> + '/// TRUE/FALSE for the last state of the checkbox in the office UI. + ToolsOptions + hToolsOptions ( "LanguageSettings", "Languages" ) + + IF ComplexScriptEnabled.IsEnabled then 'the checkbox is disabled in CTL versions + ActiveDeactivateCTLSupport = ComplexScriptEnabled.IsChecked ' the function gets the old state of the checkbox + + if WhatState = TRUE then + ComplexScriptEnabled.Check + else + ComplexScriptEnabled.UnCheck + end if + gCTLSup = WhatState ' Set the global variable + + Kontext "ExtrasOptionenDlg" + hCloseDialog( ExtrasOptionenDlg, "ok" ) + else + ActiveDeactivateCTLSupport = TRUE + If WhatState = FALSE then + warnlog "Deactivating of CTL language support is not possible, because it is disabled in ctl versions" + end if + Kontext "ExtrasOptionenDlg" + hCloseDialog( ExtrasOptionenDlg, "ok" ) + end if + +end function + +'******************************************************************************* + +function GetDecimalSeperator ( optional sDummy$ ) as String + + '/// <u>Precondition</u>: Measuring unit has to be set to centimeter (cm) before using this function. (see: fSetMeasurementToCM()) + '///+ <u>Input</u>: Number with fractionmark from <i>NumericField</i> as string + '///+ <u>Output</u>: A dot (.) or a comma (,) as string + Dim sCheckForSeparator as string + Const cWhereIsThisFunction = "qa::qatesttool::global::tools::inc::t_tools1.inc::GetDecimalSeperator: " + Dim bDotOrCommaIncluded as boolean + + 'Setting the determination of a dot or a comma to FALSE until it was successfull. + bDotOrCommaIncluded = FALSE + + if IsMissing(sDummy$) then + '/// Opening a new document depending on <i>gApplication</i> value and closing it at the end. + Call hNewDocument + '/// Tools / Options / (Modul: gApplication) / General tabpage. + ToolsOptions + '///+ <ol><li>Reading the string of the tabulator numeric field</li> + select case gApplication + case "WRITER" + Call hToolsOptions("WRITER","GENERAL") + sCheckForSeparator = Tabulatorenabstand.GetText + case "CALC" + Call hToolsOptions("CALC","GENERAL") + sCheckForSeparator = Tabulator.GetText + case "IMPRESS" + Call hToolsOptions("IMPRESS","GENERAL") + sCheckForSeparator = Tabulatorenabstand.GetText + case "DRAW" + Call hToolsOptions("DRAW","GENERAL") + sCheckForSeparator = Tabulatorenabstand.GetText + case "MASTERDOCUMENT" + Call hToolsOptions("WRITER","GENERAL") + sCheckForSeparator = Tabulatorenabstand.GetText + case "HTML" + Call hToolsOptions("WRITER","GENERAL") + sCheckForSeparator = Tabulatorenabstand.GetText + case else + warnlog cWhereIsThisFunction & "For this module ("& gApplication &") no decimal seperator setting exists." + end select + Kontext "ExtrasOptionenDlg" + ExtrasOptionenDlg.OK + if Instr(sCheckForSeparator, ",") > 0 then + GetDecimalSeperator = "," + bDotOrCommaIncluded = TRUE + endif + if Instr(sCheckForSeparator, ".") > 0 then + GetDecimalSeperator = "." + bDotOrCommaIncluded = TRUE + endif + Call hCloseDocument + else + '///+ <li>or determining the seperator depending on the OPTIONAL value (string).</li></ol> + 'Get position of fraction mark / get IT + if InStr (sDummy$, ",") > 0 then + GetDecimalSeperator = "," + bDotOrCommaIncluded = TRUE + endif + if InStr (sDummy$, ".") > 0 then + GetDecimalSeperator = "." + bDotOrCommaIncluded = TRUE + endif + endif + + '/// If the determination failed the dot will be used (default) as decimal seperator. + if bDotOrCommaIncluded = FALSE then + warnlog cWhereIsThisFunction & "Unable to determine decimal separator. Setting dot (.) as default." + GetDecimalSeperator = "." + endif + printlog "Info: Decimal Seperator is a '" & GetDecimalSeperator & "'." + +end function + +'******************************************************************************* + +sub sResetTheOffice as boolean + + Dim uno + Dim ap + Dim xViewRoot + Dim apara(1) As new com.sun.star.beans.PropertyValue + Dim temp() + Dim i,x as integer + Dim sString as string + Dim fDeleteList(32000) as string + Dim sLanguage as string + Dim bError as boolean + Dim sDefaultLocale as string + Dim sDefaultLocaleCJK as string + Dim sDefaultLocaleCTL as string + Dim sfgetL10Nvalue as string + Dim sLanOutIni as string + + sString = "qa:qatesttool:calc:options:inc:coption1.inc:: " + sResetTheOffice = TRUE + + ' only run on UNIX platforms; there is a problem with the quickstarter on win32 + if ("unx" = gPlatgroup) then + try + sLanOutIni = fgetL10Nvalue() + catch + warnlog sString & "can't get the correct Office-Language!." + sResetTheOffice = FALSE + Exit sub + endcatch + + uno=hGetUnoService() + + 'Get UI language + try + ap=uno.createInstance("com.sun.star.configuration.ConfigurationProvider") + apara(0).Name="nodepath" + apara(0).Value="/org.openoffice.Office.Linguistic/General" + apara(1).Name="lazywrite" + apara(1).Value=False + xViewRoot=ap.createInstanceWithArguments("com.sun.star.configuration.ConfigurationUpdateAccess",aPara()) + sLanguage = sfgetL10Nvalue + sDefaultLocale = xViewRoot.getPropertyValue("DefaultLocale") + sDefaultLocaleCJK = xViewRoot.getPropertyValue("DefaultLocale_CJK") + sDefaultLocaleCTL = xViewRoot.getPropertyValue("DefaultLocale_CTL") + printlog "Old UI language: '" + sLanOutIni + "'" + printlog "Old default locale: '" + sDefaultLocale + "'" + printlog "Old default locale CJK: '" + sDefaultLocaleCJK + "'" + printlog "Old default locale CTL: '" + sDefaultLocaleCTL + "'" + xViewRoot.dispose() + bError = FALSE + catch + warnlog sString + "Failed to read UI language." + bError = TRUE + endcatch + + if NOT bError then + 'Close OOo + try + ' To prevent restarting of OOo, the try/catch is around this and + ' to prevent messages about communication errors + printlog ResetApplication + FileExit "SynchronMode", TRUE + try + ' It is no error, if this fails - so it gets its own try/catch + kontext + if active.exists(5) then + active.no 'discard changes + endif + catch + endcatch + bError = FALSE + catch + warnlog sString + "Failed to close OOo." + bError = TRUE + endcatch + sleep 10 'To wait until OOo is realy away + endif + + 'only act, if no error and if language <> '' + if (NOT bError AND sLanguage <> "") then + 'Remove user directory + try + if (right(gOfficePath,1)=gPathSigne) then + 'Dir doesn't work, is a path singe is at the end + gOfficePath = left(gOfficePath,len(gOfficePath)-1) + endif + printlog "Going to delete directory: '" + gOfficePath + "'" + if (dir(gOfficePath) = "") then + qaErrorlog "Directory is already deleted." + else + rmDir (gOfficePath) + if (dir(gOfficePath) <> "") then + warnlog "Directory wasn't deleted." + endif + endif + bError = FALSE + catch + warnlog sString + "Failed to delete user directory." + bError = TRUE + endcatch + endif + + 'Start OOo and restore language + 'Needs only to be done, if UI language wasn't the default (!= "") + if ((sLanguage & sDefaultLocale & sDefaultLocaleCJK & sDefaultLocaleCTL) <> "") then + try + hStartTheOffice + Call hDisableQuickstarter + 'Here we need the Exit from a running Quickstarter... + Call ExitRestartTheOffice + uno=hGetUnoService() + ap=uno.createInstance("com.sun.star.configuration.ConfigurationProvider") + apara(0).Name="nodepath" + apara(0).Value="/org.openoffice.Office.Linguistic/General" + apara(1).Name="lazywrite" + apara(1).Value=False + xViewRoot=ap.createInstanceWithArguments("com.sun.star.configuration.ConfigurationUpdateAccess",aPara()) + if (sLanOutIni <> "") then + printlog "Old UI language: '" + sLanOutIni + "'" + xViewRoot.setPropertyValue("UILocale", sLanOutIni) + xViewRoot.commitChanges() + endif + if (sDefaultLocale <> "") then + printlog "Old default locale: '" + sDefaultLocale + "'" + xViewRoot.setPropertyValue("DefaultLocale", sDefaultLocale) + xViewRoot.commitChanges() + endif + if (sDefaultLocaleCJK <> "") then + printlog "Old default locale CJK: '" + sDefaultLocaleCJK + "'" + xViewRoot.setPropertyValue("DefaultLocale_CJK", sDefaultLocaleCJK) + xViewRoot.commitChanges() + endif + if (sDefaultLocaleCTL <> "") then + printlog "Old default locale CTL: '" + sDefaultLocaleCTL + "'" + xViewRoot.setPropertyValue("DefaultLocale_CTL", sDefaultLocaleCTL) + xViewRoot.commitChanges() + endif + if xViewRoot.hasPendingChanges() then + warnlog(sFileFunction+"Changes still pending...") + endif + xViewRoot.dispose() + catch + warnlog sString + "Failed to set UI language." + exit sub + endcatch + endif + + Call ExitRestartTheOffice + endif +end sub + +'******************************************************************************* + +sub raiseApplication + + ' Try to solve focus problem on MacOS X; After calling this function, OOo should be most front; + dim iCurrentDir as integer + dim iNumberOfHits as integer : iNumberOfHits = 0 + dim iDirPosition as integer + dim tBundle as string + dim aPath ' string array with dynamic itemcount, intended. + + ' Calling just the .app with open on MacOS X via shell command + if ( lcase( gPlatform ) = "osx" ) then + + ' Split the path into its components + aPath = split(gNetzOfficePath, gPathSigne) + + ' make sure 'Contents' is just one time in path + for iCurrentDir = 0 to uBound(aPath) + if "Contents" = aPath( iCurrentDir ) then iNumberOfHits = iNumberOfHits + 1 + next iCurrentDir + + ' exit if not + if ( iNumberOfHits <> 1 ) then exit sub + + iDirPosition = inStr( gNetzOfficePath, "Contents" ) + tBundle = left( gNetzOfficePath, iDirPosition - 2 ) + + shell( "open", 1, tBundle, true ) + + end if +end sub diff --git a/testautomation/global/tools/includes/required/t_tools2.inc b/testautomation/global/tools/includes/required/t_tools2.inc new file mode 100755 index 000000000000..76422a5e8108 --- /dev/null +++ b/testautomation/global/tools/includes/required/t_tools2.inc @@ -0,0 +1,762 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : helge.delfs@oracle.com +'* +'* short description : Global Tools II +'* +'\************************************************************************************* + +function hSetLocaleStrings (fLocale as String, TBOstringLocale() as String ) as Boolean +'TODO: JSI, make real description from it! +' creator: TBO @ 25.10.2001 +'/// function to set a string array with language dependant strings /// +'/// format of file (fLocale): /// +'///+ 1.line: entries/lines per language => x /// +'///+ 2.line: first language (A) number (iSprache) /// +'///+ 3.line: 1. string language A /// +'///+ 4.lin3: 2.language string A /// +'///+ ... /// +'///+ (((x+1)*1) +2).line second language (B) number /// +'///+ (((x+1)*1) +2)+1.line: 1. string language B /// +'///+ ... /// +'///+ example file @ "input\\writer\\la_sp\\locale.txt" ///' +' +'/// the function parses the file until it finds the language (iSprache) or until EOF /// +'///+ on success the variable from th ecalling argument /// +'///+ gets set, /// + dim lLocale (15*20) as string ' list, where file gets loaded into + dim i,y,x as integer + dim bFoundLanguage as Boolean + hSetLocaleStrings = FALSE + lLocale(0)=0 + fLocale = ConvertPath(fLocale) + if ListRead (lLocale (), fLocale, "UTF8" ) then +' printlog "LOCALE: read file :-)" + + bFoundLanguage = FALSE + ' check file format + if ( (ListCount(lLocale ()) -1) mod (val(lLocale (1))+1) ) <> 0 then + warnlog "file has wrong format :-( : lines: "+ ListCount(lLocale ()) +", lenght of entries: "+ lLocale (1) +", (lenght -1) modulo lenghtOfEntries: "+ ( ListCount(lLocale ()) -1) mod ( val(lLocale (1)) +1 ) + else + ' ( all lines in file ) (trnsl words) + for i=0 to ( ( (ListCount(lLocale ())-1) / (val(lLocale (1))+1) )-1) + ' ( (val(lLocale (1))+1) *i+2) + x = ( (val(lLocale (1)) ) *i+2 +i) ' line number of entry language + ' print every language found: +' printlog "position: "+i+" @ line: "+x+" Language: "+lLocale (x) + ' check if at suspected language number position is a number + if (val(lLocale (x)) > 0) then + ' set string variable if it is the right language + if (iSprache = val(lLocale (x))) then +' printlog " ^ LOCALE: found needed language :-)" + for y=1 to val(lLocale (1)) + TBOstringLocale(y) = lLocale (x+y) + if (TBOstringLocale(y) = "") then + qaErrorLog("missing string: " + y + ": '" + lLocale (2+y) + "'") + endif + next y + bFoundLanguage = TRUE + endif + else + warnlog "LOCALE: this is no number :-( FileFormatError" + end if + next i + if (bFoundLanguage = FALSE) then + qaErrorLog "LOCALE: please add language to LOCALE file!: "+ iSprache + endif + endif + else + warnlog "LOCALE: file doesn't exist :-( : "+fLocale + endif + hSetLocaleStrings = bFoundLanguage +end function + +function dec(Ref as integer) +'/// decrement variable, call it like 'dec variable' ///' +' reference or value .-) an excursion :-)) +' to give this func a var as ref: call without ANY brackets => 'dec Variable' +' opposite of this to call it via value ! WE DON'T WANT THIS ! +' (would be 'dec (Variable)' or in declaration 'function dec (ByVal x)') + Ref = Ref - 1 +end function + +'------------------------------------------------------------------------- + +function inc(Ref as integer) +'/// increment variable, call it like 'dec variable' ///' + Ref = Ref + 1 +end function + +'------------------------------------------------------------------------- + +function fSetMeasurementToCM() as string +'/// Sets the measurement unit to centimeter (cm) and returns the unit. + Dim i as integer + + const LANGUAGE_CODE_JAPANESE = 81 + + Call hNewDocument + ToolsOptions + select case UCase(gApplication) + case "WRITER" + Call hToolsOptions("WRITER","GENERAL") + Masseinheit.Select(2) + if iSprache = LANGUAGE_CODE_JAPANESE then + fSetMeasurementToCM = Right$( Tabulatorenabstand.Gettext, 3 ) + else + fSetMeasurementToCM = Right$( Tabulatorenabstand.Gettext, 2 ) + endif + case "CALC" + Call hToolsOptions("CALC","GENERAL") + Masseinheit.Select(2) + if iSprache = LANGUAGE_CODE_JAPANESE then + fSetMeasurementToCM = Right$( Tabulator.Gettext , 3 ) + else + fSetMeasurementToCM = Right$( Tabulator.Gettext , 2 ) + endif + case "IMPRESS" + Call hToolsOptions("IMPRESS","GENERAL") + Masseinheit.Select(2) + if iSprache = LANGUAGE_CODE_JAPANESE then + fSetMeasurementToCM = Right$( Tabulatorabstand.Gettext, 3 ) + else + fSetMeasurementToCM = Right$( Tabulatorabstand.Gettext, 2 ) + endif + case "DRAW" + Call hToolsOptions("DRAW","GENERAL") + Masseinheit.Select(2) + if iSprache = LANGUAGE_CODE_JAPANESE then + fSetMeasurementToCM = Right$( Tabulatorabstand.Gettext, 3 ) + else + fSetMeasurementToCM = Right$( Tabulatorabstand.Gettext, 2 ) + endif + case "MASTERDOCUMENT" + Call hToolsOptions("WRITER","GENERAL") + Masseinheit.Select(2) + if iSprache = LANGUAGE_CODE_JAPANESE then + fSetMeasurementToCM = Right$( Tabulatorenabstand.Gettext, 3 ) + else + fSetMeasurementToCM = Right$( Tabulatorenabstand.Gettext, 2 ) + endif + case "HTML" + Call hToolsOptions("HTML","VIEW") + Masseinheit.Select(2) + 'in Writer/Web also the Writer has to be set to cm + 'because .sdw, .sxw etc. export to HTML depends on it. + Call hToolsOptions("WRITER","GENERAL") + Masseinheit.Select(2) + if iSprache = LANGUAGE_CODE_JAPANESE then + fSetMeasurementToCM = Right$( Tabulatorenabstand.Gettext, 3 ) + else + fSetMeasurementToCM = Right$( Tabulatorenabstand.Gettext, 2 ) + endif + case else : warnlog swhereIsThisFunction & "For this module ("& gApplication &") no decimal seperator setting exists." + end select + printlog "Info: Measurement unit has been set to centimeters." + Kontext "ExtrasOptionenDlg" + ExtrasOptionenDlg.OK + Call hCloseDocument +end function + +'------------------------------------------------------------------------- + +function fRemoveDoubleCharacter(stringToChange as string, sCharacter as string) As String +'/// Removes every Character' after a 'Character' in a given string. + Dim lLength, n As Long + Dim sNextLetter As String + Dim sLastLetter As String + Dim sFinalString As String + Dim sTxt, sChar As String + + 'store all arguments in + sTxt = stringToChange + lLength = Len(sTxt) + sLastLetter = left(sTxt, 1) + sFinalString = sLastLetter + + For n = 2 To lLength Step 1 + sNextLetter = Mid(sTxt, n, 1) + If (sCharacter+sCharacter <> sLastLetter + sNextLetter) Then + sFinalString = sFinalString + sNextLetter + End If + sLastLetter = sNextLetter + Next n + fRemoveDoubleCharacter = sFinalString +End Function + +'------------------------------------------------------------------------- + +function writeCrashRepFile() +'/// Creates a file <i>(gOfficePath)</i>/user/work/crashrep.txt with two lines: +'///+ <ol><li>name of .bas file</li> +'///+ <li>name of testcase</li></ol> + Dim sFile as string + Dim sContent(5) as string + + sFile = ConvertPath (gOfficePath + "user\work\crashrep.txt") + listAppend(sContent(), gTestName) ' get's set in hStatusIn() + listAppend(sContent(), getTestcaseName) + listWrite(sContent(), sFile) +end function + +'------------------------------------------------------------------------- + +function GetBuildNumHidLst as String +'/// Get the "BuildId" out of the <i>hid.lst</i>. + Dim FileNum as Integer + Dim xmlZeile as String + dim iIndex as integer + dim sTemp as string + + if Dir (gtHidLstPath + "hid.lst") <> "" then + FileNum = FreeFile + Open (gtHidLstPath + "hid.lst") For Input As #FileNum + do until EOF(#FileNum) = True + line input #FileNum, xmlZeile + iIndex = inStr (1, xmlZeile, "010101010101010", 1) + sTemp = Left (xmlZeile, abs(iIndex - 1)) + ' usually only the first line is read + if (sTemp <> "") then exit do + loop + Close #FileNum + GetBuildNumHidLst = sTemp + else + GetBuildNumHidLst = "" + end if +end function + +'------------------------------------------------------------------------- + +function hGetUNOService(optional bSilent as boolean, optional byRef sUnoPortExternal as string) as object +'/// Function enables the UNO communication inside the +'///+ TestTool to the office application. +'/// INPUT: optional <i>bSilent</i> to suppress informal messages, but no warnings +'/// INPUT: optional <i>sUnoPortExternal</i> to just get the UNO port number passed to that variable + Dim sResultUno as string + Dim sUnoPort as string + Dim sOfficeParameters as string + Dim sUnoOffice as string + Dim bJustGettingPort as boolean + Dim sTTPort as string + + ' To not to change the old behaviour, set variable if parameter is not given + if (isMissing(bSilent)) then + bSilent = TRUE + end if + + ' master.inc::sStartUpOffice needs just the Port Numberr from UNO, to pass it to first start up + if (isMissing(sUnoPortExternal)) then + bJustGettingPort = FALSE + else + bJustGettingPort = TRUE + sUnoPortExternal = "" ' clear it + end if + + 'To enable spaces and special chars in path; + 'This doesn't work for the TestTool command 'start' + 'But for the 'shell' command it is ok. + sUnoOffice = convertToURL(sAppExe) + + '/// Get the TestTool port value from the TestTool control file + sTTPort = GetIniValue (gTesttoolIni, "Communication", "TTPort") + '/// Get the UNO port value from the TestTool control file + sResultUno = GetIniValue (gTesttoolIni, "Communication", "UnoPort") + ' make sure both ports are different + if sTTPort = sResultUno then + warnlog "TestTool and UNO port are the same ("+sResultUno+")! Please change the UNO port in the TestTool application: Extra -> Settings -> Misc -> Remote UNO Port and exit OpenOffice.org." + exit function + end if + if NOT bSilent then + printlog "Trying to use Office/Testtool UNO Port '" + sResultUno + "'." + endif + if (sResultUno <> "") then + sUnoPort = sResultUno + else + warnlog ("Please add an entry to your '" + gTesttoolIni + "' in section 'Communication': 'UnoPort=82352' and restart your testtool and exit OpenOffice.org.") + warnlog ("You also can check the setting in TestTool: Extra->Settings->Misc: and change the value for 'Remote UNO Port' and then exit OpenOffice.org.") + exit function + end if + if (NOT bJustGettingPort) then + '/// <i>-accept=socket,host=localhost,port=(PortNr);urp</i> has to be added to the start command. + sOfficeParameters = "-accept=socket,host=localhost,port=" + sUnoPort + ";urp" + try + '/// If this service has been used before the connection will be established. + hGetUNOService = getUnoApp + if NOT bSilent then + printlog "Office/Testtool UNO: CONNECTION SUCCESSFULL" + end if + ' If this tree will be used the connection has been established before! + catch + ' If the connection has not been established before this tree will be used. + '/// If the UNO service has not been used before the application will be <i>started</i> with the additional parameters. + qaerrorLog "/qa/qatesttool/global/tools/inc/t_tools2.inc::hGetUNOService 'getUnoApp' needn't fail anymore!" + Shell (sUnoOffice, 1,sOfficeParameters,false) + if NOT bSilent then + printlog "Office/Testtool UNO: TRYING TO CONNECT" + end if + sleep(10) + endcatch + + '/// This will be tried twice. + ' Second chance + if isNull(hGetUNOService) then + try + hGetUNOService = GetUnoApp + if NOT bSilent then + printlog "Office/Testtool UNO: CONNECTION SUCCESSFULL" + endif + catch + '/// If the UNO service could not be started a warnlog will be written to the result file. + warnlog "Office/Testtool UNO: CONNECTION FAILED" + endcatch + end if + else + sUnoPortExternal = sUnoPort + end if +end function + +'------------------------------------------------------------------------- + +function fopenConfig( sPackage as String ,_ + sPath as String ,_ + bReadWrite as Boolean ,_ + bAllLocale as Boolean ) as Object +'/// Open a configuration package from the Office installation via UNO API. +'/// <ul><b>Input</b> +'///+ <li>Parameter: <i>sPackage</i> +'///+ describe the package which should be handled by the returned +'///+ configuration access object +'///+ <u>Example</u>: "/org.openoffice.Office.TypeDetection"</li> +'///+ <li>Parameter: <i>sPath</i> +'///+ Specify the relativ path inside the new opened package, +'///+ where we are interested on +'///+ <u>Example</u>: "Types/xxx" => "/org.openoffice.Office.TypeDetection/Types/xxx"</li> +'///+ <li>Parameter: <i>bReadWrite</i> +'///+ Describe how the package should be opened (readonly/writable)</li> +'///+ <li>Parameter: <i>bAsLocale</i> +'///+ Enable/disable the special ALL LOCALE mode of the configuration API. +'///+ It makes it possible to have access on localized nodes directly instead +'///+ of using the generic handling of used API for it.</li></ul> +'///+ <b>Return</b>: <i>Object</i> +'///+ Object provides access to the required package or directly to a config key. + Dim sFullPath as String + Dim aConfig as Object + Dim aConfigProvider as Object + Dim lNormalParams(0) as new com.sun.star.beans.PropertyValue + Dim lLocaleParams(1) as new com.sun.star.beans.PropertyValue + Dim lParams() as Object + Dim oUno as Object + + sFullPath = sPackage+"/"+sPath + + if (bAllLocale=true) then + lLocaleParams(0).Name = "nodepath" + lLocaleParams(0).Value = sFullPath + lLocaleParams(1).Name = "locale" + lLocaleParams(1).Value = "*" + lParams() = lLocaleParams() + else + lNormalParams(0).Name = "nodepath" + lNormalParams(0).Value = sFullPath + lParams() = lNormalParams() + end if + + oUno = hGetUnoService + + aConfigProvider = oUno.createInstance("com.sun.star.configuration.ConfigurationProvider") + + if (bReadWrite=true) then + aConfig = aConfigProvider.createInstanceWithArguments( _ + "com.sun.star.configuration.ConfigurationUpdateAccess", _ + lParams() ) + else + aConfig = aConfigProvider.createInstanceWithArguments( _ + "com.sun.star.configuration.ConfigurationAccess", _ + lParams() ) + end if + + fopenConfig = aConfig +end function + +'------------------------------------------------------------------------- + +function fGetProductName as string +'/// Reads the ProductKey from bootstrap/version file and cuts of version number, + Dim sProduct as string + Dim sSplit() as string + Dim i as integer + Dim u as integer + Dim sFile as string + Dim sIniEntry as string + Dim cFileExt as string + + 'Using the bootstraprc/bootstrap.ini file in ../program dir + 'to get the value of 'ProductKey' + + if ( lcase( gPlatform ) = "osx" ) then + sfile = convertPath(gNetzOfficePath + "MacOS/bootstrap") + else + sfile = convertPath(gNetzOfficePath + "program/bootstrap") + end if + + sIniEntry = "Bootstrap" + + 'Setting the differnt extension to the files. + if gPlatGroup = "unx" then + cFileExt = "rc" + else + cFileExt = ".ini" + end if + + 'Getting the value of 'ProductKey'-entry or setting it to 'OpenOffice.org 2.0' + if (dir(sFile+cFileExt) <> "") then + sProduct = getIniValue(sFile+cFileExt, sIniEntry , "ProductKey") + else + warnlog "Could not get the ProductKey value! Setting it to 'OpenOffice.org 2.0' and trying to run the tests!" + sProduct = "OpenOffice.org 2.0" + end if + if (sProduct <> "" AND sProduct <> "NOT EXISTING") then + sSplit = split(sProduct, " ") ' get count of spaces + sProduct = "" + 'Presupposition: Version number is not seperated by spaces, + 'but seperated with space from ProductName + u = uBound(sSplit) + if (u > 0) then + for i = 0 to (u-1) + sProduct = sProduct + sSplit(i) ' add strings until last Space + if (i <> (u-1)) then + sProduct = sProduct + " " + end if + next i + else + sProduct = sSplit(0) + end if + end if + fGetProductName = sProduct +end function + +'------------------------------------------------------------------------- + +function FindBuildID as String +'/// Get BuildID out of <i>bootstrap.ini/boostraprc</i> +'///+or search in <i>.../program/resource/isoxxx??.res</i> for the BuildID. + Dim sOfficePath as String + Dim FileNum, iStart, i as Integer + Dim xmlZeile, sZ1, sZ2, sIsofile as String + Dim sTemp as String + Dim sFile as string + Dim sPlatformProgramPath as string + + if (gNetzInst = TRUE) then + sOfficePath = gNetzOfficePath + else + sOfficePath = gOfficePath + end if + + ' bootstrap.ini/rc part + if (gSamePC = TRUE) then + ' since CWS nativefixer18 the information from bootstrap file is spread across bootstrap and version + if ( lcase( gPlatform ) = "osx" ) then + sPlatformProgramPath = "MacOS" + else + sPlatformProgramPath = "program" + end if + sfile = convertPath(gOfficeBasisPath & "program/version") + if gPlatGroup = "unx" then + sFile = sFile + "rc" + if (dir(sFile) <> "") then + sTemp = getIniValue(sFile, "Version", "buildid") + gMajor = getIniValue(sFile, "Version", "ProductSource") + else + sfile = convertPath(gNetzOfficePath & sPlatformProgramPath & "/versionrc") + sTemp = getIniValue(sFile, "Version", "buildid") + end if + else + sFile = sFile + ".ini" + if (dir(sFile) <> "") then + sTemp = getIniValue(sFile, "Version", "buildid") + gMajor = getIniValue(sFile, "Version", "ProductSource") + else + sfile = convertPath(gNetzOfficePath & sPlatformProgramPath & "/version.ini") + sTemp = getIniValue(sFile, "Version", "buildid") + end if + end if + end if + + ' fallback to get the buildID via isoxxx??.res part + if (sTemp = "") then + sIsofile = Dir (sOfficePath & sPlatformProgramPath & gPathSigne & "resource" & gPathSigne & "iso*.res") + if sIsofile = "" then + sIsofile = App.Dir (sOfficePath & sPlatformProgramPath & gPathSigne & "resource" & gPathSigne & "iso*.res") + end if + sIsofile = ConvertPath (sOfficePath & sPlatformProgramPath & gPathSigne & "resource" & gPathSigne & sIsofile) + if sIsofile= "" then + warnlog "FindBuildID : No isoxxx??.res-file was found!" + exit function + end if + + FileNum = FreeFile + Open sIsofile For Input As #FileNum + do until EOF(#FileNum) = True + line input #FileNum, xmlZeile + for i=1 to 100 + if i=1 then + sZ1 = left (xmlzeile, 2048) + else + sZ1 = left (sZ2, 2048) + end if + if sZ1 < 2048 then + i=101 + else + iStart = instr (1, sZ1, "Build", 1) + if iStart <> 0 then + iStart = iStart-5 + sTemp = Mid (sZ1, iStart, 16) + exit do + end if + sZ2 = right (sZ1, len (sZ1)-2048) + end if + next i + loop + Close #FileNum + end if + + ' WorkAround version information starting with 'SRC' or any other letter code as announced + iStart = len(sTemp) + i = 1 + ' take the first character + sZ1 = mid(sTemp,i,1) + ' if there is more than one character in the string AND the first character is not a number + if ((iStart > 0) AND (NOT isNumeric(sZ1))) then + ' increment counter as long as there is no number found in the string + while ((i < iStart) AND (NOT isNumeric(mid(sTemp,i,1)) )) + inc(i) + wend + ' cut of the not number characters at the start of the string + sTemp = right(sTemp, len(sTemp)-(i-1)) + end if + + FindBuildID = sTemp +end function + +'------------------------------------------------------------------------- + +sub hSetBuildVersionInformation(bQuite as boolean) +'/// set global version information variables: gMajor, gMinor, gBuild ///' +'/// presupposition: global variable gVersionsnummer is initialised by FindBuildID() ///' + dim slVersion() as string + dim ilVersion as integer + dim sLastVersion as string + dim iPosA as integer + dim iPosB as integer + + slVersion() = Split(gVersionsnummer, ",") + ilVersion = uBound(slVersion()) ' array counts from 0 on! + sLastVersion = slVersion(ilVersion) + ' major is from start to 'm' + iPosA = 1 + iPosB = instr(sLastVersion, "m") + if (iPosB = 0) then ' there is no minor + if (Not bQuite) then + warnlog "Product Version Information is missing (mXX). Please tell the developer to build with 'setsolar -ver'" + endif + iPosB = instr(sLastVersion, "(") + endif + if gMajor = "" then + gMajor = Mid(sLastVersion, iPosA, (iPosB-iPosA)) '(1) Major + endif + iPosA = iPosB + iPosB = instr(sLastVersion, "(") + gMinor = Mid(sLastVersion, iPosA, iPosB-iPosA) '(2) Minor + iPosA = instr(sLastVersion, ":") + 1 + iPosB = instr(sLastVersion, ")") + gBuild = cInt(Mid(sLastVersion, iPosA, iPosB-iPosA)) '(3) Build +end sub + +'------------------------------------------------------------------------- + +function fRelativeToAbsolutePath (sRelativePath as string) as string +'/// INPUT: provide a path with relative indicators ".." ///' +'///+ The input needs to konsist of the parts: where was the relative string found, and ///' +'///+ the relative path itself as one string. E.g: "/opt/var/../../here/is/it"///' +'/// RETURN: String with the removed parts for each relative iteration. E.g. This returns: "/here/is/it"///' + + dim iHowOften as string + dim aSplitOnDoublePoints() as string + dim aSplitOnPathSign() as string + dim aJoinWithPathSign() as string + dim i,x,y as integer + dim sIntern as string + + ' save the input + sIntern = sRelativePath + ' get count of 'relative path ups' + aSplitOnDoublePoints = split(sIntern, gPathSigne+"..") + ' for every occurence cut part from path + iHowOften = uBound(aSplitOnDoublePoints)-1 + for i = 0 to iHowOften + ' Split on every "/.." + aSplitOnDoublePoints = split(sIntern, gPathSigne+"..") + ' always work on the first part (The one before the first "/..") + ' Split the first path at the PathSeperators + aSplitOnPathSign = split(aSplitOnDoublePoints(0), gPathSigne) + ' define new size for the first part destination + redim aJoinWithPathSign(uBound(aSplitOnPathSign())-1) + ' copy the parts, but not the last part + for x = 0 to uBound(aJoinWithPathSign()) + aJoinWithPathSign(x) = aSplitOnPathSign(x) + next x + ' make one string of the parts with PathSeperators + aSplitOnDoublePoints(0) = join(aJoinWithPathSign(), gPathSigne) + ' cut the .. for this run from the string + redim aJoinWithPathSign(uBound(aSplitOnDoublePoints())-1) + y=0 + for x = 0 to uBound(aJoinWithPathSign())+1 + if x <> 1 then + aJoinWithPathSign(x-y) = aSplitOnDoublePoints(x) + else + y=1 + endif + next x + ' set put all parts together again into one string + if iHowOften <> i then + sIntern = join(aJoinWithPathSign(), gPathSigne+"..") + else + sIntern = join(aSplitOnDoublePoints(), "") + endif + next i + ' set the returnvalue + fRelativeToAbsolutePath = sIntern +end function + +'------------------------------------------------------------------------- + +sub sCheckValgrindStatus() + ' valgrind only exists on Linux + ' If testlauncher is started with parameter --valgrind, a file called + ' $HOME/tcs.txt is created, with the name of the .bas file + ' If you don't know the testlauncher, just make sure that the file is created + ' and contains the name of the .bas file, if you want to use valgrind tests. + Dim sTestCaseSpecification as string + Dim sList(10) as string + Dim sTemp as string + + sTemp = environ("HOME") + sTemp = sTemp + "/tcs.txt" + if fileExists(sTemp) then + ListRead(sList(), sTemp) + if (ListCount(sList())>0) then + sTemp = sList(1) + sTemp = right(sTemp, len(sTemp)-1) + printlog "** Valgrind mode detected: '" + sTemp + "'" + setChildEnv("tcs",sTemp) + end if + end if +end sub + +'------------------------------------------------------------------------- + +function fgetDocumentLanguages(byRef aDefaultLocale(), optional bInteger as boolean) +'/// INPUT: aDefaultLocale - array from 0 to 3 +'/// INPUT: OPTIONAL: bInteger - TRUE: return language as number en: 1; FALSE: (default) return the short text for locale e.g en_US +'/// RETURN: write in the deliverd array aDefaultLocale depending on bInteger the language from Tools->Options->Language Settings->Languages->Default language for documents +'///+ either the short string representing the language (default) e.g. en_US or the number e.g. 1 +'///+ The index of the array is defined: +'///+ (1) Western +'///+ (2) Asian +'///+ (3) CTL + + dim uno + dim ap + dim xViewRoot + dim apara(1) As new com.sun.star.beans.PropertyValue + dim i as integer + dim blInteger as boolean + + if isMissing(bInteger) then + blInteger = FALSE + else + blInteger = bInteger + endif + + uno=hGetUnoService(true) + ap=uno.createInstance("com.sun.star.configuration.ConfigurationProvider") + apara(0).Name="nodepath" + apara(0).Value="/org.openoffice.Office.Linguistic/General" + apara(1).Name="lazywrite" + apara(1).Value=False + xViewRoot=ap.createInstanceWithArguments("com.sun.star.configuration.ConfigurationUpdateAccess",aPara()) + aDefaultLocale(1) = xViewRoot.getPropertyValue("DefaultLocale") + aDefaultLocale(2) = xViewRoot.getPropertyValue("DefaultLocale_CJK") + aDefaultLocale(3) = xViewRoot.getPropertyValue("DefaultLocale_CTL") + xViewRoot.dispose() + + ' If the return of the language number is requested, convert it + if blInteger then + for i = 1 to 3 + if aDefaultLocale(i) <> "" then + aDefaultLocale(i) = convertLanguage2(aDefaultLocale(i)) + else + aDefaultLocale(i) = 0 + endif + next i + endif +end function + +'------------------------------------------------------------------------- + +function hDisableQuickstarterAPI as boolean + Dim xQuickStarter as object + Dim oUnoOfficeConnection as object + Dim bResult as boolean + + bResult = TRUE + 'Second, closing the Quickstarter process that a restart of the office + 'would result into one process (the Quickstart would hinder otherwise + 'the communication to the office. + 'On mac this results in a disbaled quickstarter imediately, but not persistant on restart. + oUnoOfficeConnection=hGetUnoService(TRUE) + if (isNull(oUnoOfficeConnection)) then + QAErrorLog "Couldn't create UNO access. Can't disable Quickstarter via UNO API." + bResult = FALSE + else + try + xQuickStarter = oUnoOfficeConnection.createInstance("com.sun.star.office.Quickstart") + 'DEBUG: printlog xQuickStarter.dbg_supportedinterfaces + 'disable quickstart veto (not quickstart UI) + xQuickStarter.setFastPropertyValue(0, FALSE) + catch + qaErrorLog "Join Quickstarter and OOo process failed. There will be problems on shutdown" + bResult = FALSE + endcatch + end if + hDisableQuickstarterAPI = bResult +end function + +'------------------------------------------------------------------------- + diff --git a/testautomation/global/tools/includes/required/t_tools3.inc b/testautomation/global/tools/includes/required/t_tools3.inc new file mode 100755 index 000000000000..4b29928a1b93 --- /dev/null +++ b/testautomation/global/tools/includes/required/t_tools3.inc @@ -0,0 +1,1256 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : helge.delfs@oracle.com +'* +'* short description : Global Tools III +'* +'\****************************************************************************** + +sub hToolbarSelect( sType as string, sOpen as boolean, optional SetToDefault as boolean ) + Dim sDefault as integer, sKontext as string, sPosition as integer + Dim SteppedThrough as boolean + '/// Created by helge.delfs@oracle.com + '/// This function opens/closes a toolbar through View/Toolbar menu + '/// Required parameters: + '/// sType as string -> Name of the toolbar to be opened / closed + '/// sOpen as boolean -> Shall the toolbar be opened (true) or closed (false) + '/// optional SetToDefault as boolean -> true if Toolbar-State should be set to default + + Select Case Ucase(sType) + case "3DSETTING" + Kontext "ExtrusionObjectBar" + if ExtrusionObjectBar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsThreeDSettings + else + if SetToDefault = True then ViewToolbarsThreeDSettings + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsThreeDSettings + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsThreeDSettings + endif + endif + endif + + + case "ALIGN" + Kontext "Alignmentbar" + if Alignmentbar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsAlign + else + if SetToDefault = True then ViewToolbarsAlign + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsAlign + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsAlign + endif + endif + endif + + Case "BULLETSANDNUMBERING" + Kontext "NumObjectbar" + if NumObjectbar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsBulletsAndNumbering + else + if SetToDefault = True then ViewToolbarsBulletsAndNumbering + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsBulletsAndNumbering + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsBulletsAndNumbering + endif + endif + endif + + case "COLOR" + Kontext "ColorBar" + if ColorBar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsColor + else + if SetToDefault = True then ViewToolbarsColor + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsColor + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsColor + endif + endif + endif + + case "CUSTOMIZE" + ViewToolbarsCustomize + + case "DRAWING" + Kontext "DrawBar" + if DrawBar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsDrawing + else + if SetToDefault = True then ViewToolbarsDrawing + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsDrawing + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsDrawing + endif + endif + endif + + case "FORMATTING" + Kontext "TextObjectbar" + if TextObjectbar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsFormatting + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsFormatting + else + if SetToDefault = True then ViewToolbarsFormatting + endif + endif + endif + + case "FORMCONTROLS" + Kontext "FormControls" + if FormControls.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsFormControls + else + if SetToDefault = True then ViewToolbarsFormControls + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsFormControls + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsFormControls + endif + endif + endif + case "CONTROLS" + Kontext "FormControls" + if FormControls.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsFormControls + else + if SetToDefault = True then ViewToolbarsFormControls + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsFormControls + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsFormControls + endif + endif + endif + + case "FORMDESIGNTOOLS", "FORMDESIGN" + Kontext "FormDesignTools" + if FormDesignTools.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsFormDesign + else + if SetToDefault = True then ViewToolbarsFormDesign + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsFormDesign + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsFormDesign + endif + endif + endif + + case "HTMLSOURCEVIEW" + Kontext "SourceViewToolbar" + if SourceViewToolbar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsHTMLSourceView + else + if SetToDefault = True then ViewToolbarsHTMLSourceView + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsHTMLSourceView + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsHTMLSourceView + endif + endif + endif + + case "FORMFILTER" + Kontext "FormsFilterBar" + if FormsFilterBar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsFormFilter + else + if SetToDefault = True then ViewToolbarsFormFilter + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsFormFilter + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsFormFilter + endif + endif + endif + + case "FORMNAVIGATION" + Kontext "FormsNavigationBar" + if FormsNavigationBar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsFormNavigation + else + if SetToDefault = True then ViewToolbarsFormNavigation + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsFormNavigation + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsFormNavigation + endif + endif + endif + + case "FORMOBJECT" + Kontext "FormsObjectbar" + if FormsObjectbar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsFormObject + else + if SetToDefault = True then ViewToolbarsFormObject + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsFormObject + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsFormObject + endif + endif + endif + + case "FRAME" + Kontext "FrameObjectbar" + if FrameObjectbar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsFrame + else + if SetToDefault = True then ViewToolbarsFrame + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsFrame + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsFrame + endif + endif + endif + + case "FULLSCREEN" + Kontext "FullScreenBar" + if FullScreenBar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsFullScreen + else + if SetToDefault = True then ViewToolbarsFullScreen + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsFullScreen + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsFullScreen + endif + endif + endif + + case "GRAPHIC", "DRAWINGOBJECTPROPERTIES" + Kontext "DrawingObjectbar" + if DrawingObjectbar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsGraphic + else + if SetToDefault = True then ViewToolbarsGraphic + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsGraphic + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsGraphic + endif + endif + endif + + case "HYPERLINK", "HYPERLINKBAR" + Kontext "Hyperlinkleiste" + if Hyperlinkleiste.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsInsertHyperlink + else + if SetToDefault = True then ViewToolbarsInsertHyperlink + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsInsertHyperlink + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsInsertHyperlink + endif + endif + endif + + + case "INSERT" + Kontext "InsertBar" + if InsertBar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsInsert + else + if SetToDefault = True then ViewToolbarsInsert + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsInsert + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsInsert + endif + endif + endif + + case "INSERTOBJECT" + Kontext "InsertObjectBar" + if InsertObjectBar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsInsertObject + else + if SetToDefault = True then ViewToolbarsInsertObject + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsInsertObject + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsInsertObject + endif + endif + endif + + case "MEDIAPLAYBACK" + Kontext "MediaObjectBar" + if MediaObjectBar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsMediaPlayback + else + if SetToDefault = True then ViewToolbarsMediaPlayback + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsMediaPlayback + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsMediaPlayback + endif + endif + endif + + case "MORECONTROLS" + Kontext "MoreControls" + if MoreControls.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsMoreControls + else + if SetToDefault = True then ViewToolbarsMoreControls + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsMoreControls + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsMoreControls + endif + endif + endif + + case "MOREXFORMCONTROLS" + Kontext "MoreXFormControls" + if MoreXFormControls.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsMoreXFormControls + else + if SetToDefault = True then ViewToolbarsMoreXFormControls + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsMoreXFormControls + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsMoreXFormControls + endif + endif + endif + + case "OLEOBJECT" + Kontext "OLEObjectbar" + if OLEObjectbar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsOleObject + else + if SetToDefault = True then ViewToolbarsOleObject + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsOleObject + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsOleObject + endif + endif + endif + + case "OPTIMIZETABLE" + Kontext "OptimizeTablebar" + if OptimizeTablebar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsOptimizeTable + else + if SetToDefault = True then ViewToolbarsOptimizeTable + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsOptimizeTable + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsOptimizeTable + endif + endif + endif + + case "PAGEPREVIEW" + Kontext "PreviewObjectbar" + if PreviewObjectbar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsPagePreview + else + if SetToDefault = True then ViewToolbarsPagePreview + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsPagePreview + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsPagePreview + endif + endif + endif + + case "PATH" + Kontext "BezierObjectBar" + if BezierObjectBar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsBezier + else + if SetToDefault = True then ViewToolbarsBezier + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsBezier + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsBezier + endif + endif + endif + + case "PICTURE" + Kontext "GraphicObjectbar" + if GraphicObjectbar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsPicture + else + if SetToDefault = True then ViewToolbarsPicture + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsPicture + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsPicture + endif + endif + endif + + case "PICTUREFILTER" + Kontext "GraphicFilterBar" + if GraphicFilterBar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsPictureFilter + else + if SetToDefault = True then ViewToolbarsPictureFilter + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsPictureFilter + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsPictureFilter + endif + endif + endif + + case "STANDARD" + Kontext "StandardBar" + if StandardBar.Exists then + if StandardBar.IsVisible then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsStandard + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsStandard + else + if SetToDefault = True then ViewToolbarsStandard + endif + endif + endif + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsStandard + else + if SetToDefault = True then ViewToolbarsStandard + endif + endif + endif + + case "STANDARDVIEWINGMODE" + Kontext "Viewerbar" + if Viewerbar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsStandardView + else + if SetToDefault = True then ViewToolbarsStandardView + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsStandardView + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsStandardView + endif + endif + endif + + case "TABLE" + Kontext "TableObjectbar" + if TableObjectbar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsTable + else + if SetToDefault = True then ViewToolbarsTable + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsTable + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsTable + endif + endif + endif + + case "TEXTOBJECT" + Kontext "DrawTextObjectBar" + if DrawTextObjectBar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsTextObject + else + if SetToDefault = True then ViewToolbarsTextObject + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsTextObject + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsTextObject + endif + endif + endif + + case "TOOLS" + Kontext "Toolbar" + if Toolbar.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsTools + else + if SetToDefault = True then ViewToolbarsTools + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsTools + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsTools + endif + endif + endif + + + case "MATH" + Kontext "OL_SW_Rechenleiste" + if OL_SW_Rechenleiste.Exists then + Select Case sOpen + Case False + if IsMissing(SetToDefault) then + ViewToolbarsInsertFormula + else + if SetToDefault = True then ViewToolbarsInsertFormula + endif + Case True + if IsMissing(SetToDefault) = False then + if SetToDefault = True then ViewToolbarsInsertFormula + endif + end select + else + if sOpen = True then + if IsMissing(SetToDefault) then + ViewToolbarsInsertFormula + endif + endif + endif + + case else + Warnlog "No menuentry for parameter " & sType & " found!" + + end select + Sleep 1 + +end sub + +sub hCloseAllToolbars + '/// Created by thorsten.bosbach@oracle.com + '/// This function closes all known toolbars which are not docked + '/// only if Build ID is below 8892 + if (gBuild < 8892) AND (gBuild > 8888) then + try + Kontext "ExtrusionObjectBar" + if ExtrusionObjectBar.Exists(0) then if NOT ExtrusionObjectBar.isDocked then ExtrusionObjectBar.close + Kontext "Alignmentbar" + if Alignmentbar.Exists(0) then if NOT Alignmentbar.isDocked then Alignmentbar.close + Kontext "NumObjectbar" + if NumObjectbar.Exists(0) then if NOT NumObjectbar.isDocked then NumObjectbar.close + Kontext "DrawBar" + if DrawBar.Exists(0) then if NOT DrawBar.isDocked then DrawBar.close + Kontext "TextObjectbar" + if TextObjectbar.Exists(0) then if NOT TextObjectbar.isDocked then TextObjectbar.close + Kontext "FormControls" + if FormControls.Exists(0) then if NOT FormControls.isDocked then FormControls.close + Kontext "FormControls" + if FormControls.Exists(0) then if NOT FormControls.isDocked then FormControls.close + Kontext "FormDesignTools" + if FormDesignTools.Exists(0) then if NOT FormDesignTools.isDocked then FormDesignTools.close + Kontext "SourceViewToolbar" + if SourceViewToolbar.Exists(0) then if NOT SourceViewToolbar.isDocked then SourceViewToolbar.close + Kontext "FormsFilterBar" + if FormsFilterBar.Exists(0) then if NOT FormsFilterBar.isDocked then FormsFilterBar.close + Kontext "FormsNavigationBar" + if FormsNavigationBar.Exists(0) then if NOT FormsNavigationBar.isDocked then FormsNavigationBar.close + Kontext "FormsObjectbar" + if FormsObjectbar.Exists(0) then if NOT FormsObjectbar.isDocked then FormsObjectbar.close + Kontext "FrameObjectbar" + if FrameObjectbar.Exists(0) then if NOT FrameObjectbar.isDocked then FrameObjectbar.close + Kontext "FullScreenBar" + if FullScreenBar.Exists(0) then if NOT FullScreenBar.isDocked then FullScreenBar.close + Kontext "DrawingObjectbar" + if DrawingObjectbar.Exists(0) then if NOT DrawingObjectbar.isDocked then DrawingObjectbar.close + Kontext "Hyperlinkleiste" + if Hyperlinkleiste.Exists(0) then if NOT Hyperlinkleiste.isDocked then Hyperlinkleiste.close + Kontext "InsertBar" + if InsertBar.Exists(0) then if NOT InsertBar.isDocked then InsertBar.close + Kontext "InsertObjectBar" + if InsertObjectBar.Exists(0) then if NOT InsertObjectBar.isDocked then InsertObjectBar.close + Kontext "MediaObjectBar" + if MediaObjectBar.Exists(0) then if NOT MediaObjectBar.isDocked then MediaObjectBar.close + Kontext "MoreControls" + if MoreControls.Exists(0) then if NOT MoreControls.isDocked then MoreControls.close + Kontext "OLEObjectbar" + if OLEObjectbar.Exists(0) then if NOT OLEObjectbar.isDocked then OLEObjectbar.close + Kontext "OptimizeTablebar" + if OptimizeTablebar.Exists(0) then if NOT OptimizeTablebar.isDocked then OptimizeTablebar.close + Kontext "PreviewObjectbar" + if PreviewObjectbar.Exists(0) then if NOT PreviewObjectbar.isDocked then PreviewObjectbar.close + Kontext "BezierObjectBar" + if BezierObjectBar.Exists(0) then if NOT BezierObjectBar.isDocked then BezierObjectBar.close + Kontext "GraphicObjectbar" + if GraphicObjectbar.Exists(0) then if NOT GraphicObjectbar.isDocked then GraphicObjectbar.close + Kontext "GraphicFilterBar" + if GraphicFilterBar.Exists(0) then if NOT GraphicFilterBar.isDocked then GraphicFilterBar.close + Kontext "StandardBar" + if StandardBar.Exists(0) then if NOT StandardBar.isDocked then StandardBar.close + Kontext "Viewerbar" + if Viewerbar.Exists(0) then if NOT Viewerbar.isDocked then Viewerbar.close + Kontext "TableObjectbar" + if TableObjectbar.Exists(0) then if NOT TableObjectbar.isDocked then TableObjectbar.close + Kontext "DrawTextObjectBar" + if DrawTextObjectBar.Exists(0) then if NOT DrawTextObjectBar.isDocked then DrawTextObjectBar.close + Kontext "Toolbar" + if Toolbar.Exists(0) then if NOT Toolbar.isDocked then Toolbar.close + Kontext "OL_SW_Rechenleiste" + if OL_SW_Rechenleiste.Exists(0) then if NOT OL_SW_Rechenleiste.isDocked then OL_SW_Rechenleiste.close + catch + printlog "tools3.inc::hCloseAllToolbars Can't close some toolbar" + endcatch + endif +end sub + +'******************************************************************************* + +function hIsAccessbridgeInstalled() as boolean + '/// created by HDE + '/// detects if a Java Access Bridge is installed which decreases testtool performance + '/// and should not be installed while running automated tests + '/// 1. searches in testtool.ini entry "UseAccessBridge" in profile "current". Is it <> True then + '/// 2. searches in directory "C:\Program Files\Java Access Bridge" a Java-Bridge Installation. If this is not found + '/// 3. searches in options of installed StarOffice on Java-Tabpage for the entry "with accessibility support" + '/// if 1. = true then false is returned, because it should be tested with accessibility + '/// if 2. or 3. matches this func returns true else false + '/// if Java is deactivated in Office options it returns false, because no Java->no AccessBridge + '/// if AccessbridgeIsInstalled = false (after checking on Java-Tabpage) and iSprache <> English a warning will be printed, because the string in options maybe has to be adapted! + + Dim i as integer, j as integer, sAccessibilityCompare as string + Dim sProgramFiles as string, sAccessBridgeFolder as string, sTmpEntry as string + Dim sCompareString as string, AccessbridgeIsInstalled as boolean + AccessbridgeIsInstalled = False + if GetIniValue ( gTesttoolIni, "UseAccessBridge", "Current" ) = True then + AccessbridgeIsInstalled = False + else + Select case gPlatgroup + Case "w95" + sProgramFiles = environ("ProgramFiles") + sAccessBridgeFolder = "Java Access Bridge" + sCompareString = sProgramFiles & "\" & sAccessBridgeFolder & "\AccessBridgeTester.class" + sAccessibilityCompare = "with accessibility support" + if ( FileExists( sCompareString ) ) then + AccessbridgeIsInstalled = True + else + ToolsOptions + Call hToolsOptions("STAROFFICE","JAVA") + Kontext "TabJava" + if UseJava.IsChecked = True then + For i = 1 to JavaList.GetItemCount() + JavaList.Select i + if JavaList.GetText(4) = sAccessibilityCompare then + AccessbridgeIsInstalled = True + exit for + endif + next i + if AccessbridgeIsInstalled = false then + Select Case iSprache + Case 01 : sAccessibilityCompare = "with accessibility support" + Case else : Warnlog "Accessibility check failed. Maybe language has to be adapted." + exit function + end select + endif + endif + Kontext "OptionenDlg" + hCloseDialog( OptionenDlg, "Cancel" ) + endif + end select + endif + + hIsAccessbridgeInstalled = AccessbridgeIsInstalled + +end function + +'******************************************************************************* + +function hUseAsyncSlot( cSlot as string ) as integer + + ' These are a selection of slots that take time to get enabled after + ' actions have been performed on a document. Although they might appear + ' to be ready in the UI we still need to probe them. + + dim iRetries as integer : iRetries = 0 + dim iTime as integer : iTime = 0 + + dim slot as string : slot = lcase( cSlot ) + + const MAX_RETRIES = 100 ' Number of time we try to call the slot + const DELAY = 100 ' 100ms delay to wait between retries + const RC_TIMEOUT = -1 ' Returnvalue if slot is not available + const CFN = "global::tools::includes::required::hUseAsyncSlot(): " + + if ( GVERBOSE ) then printlog( CFN & "Execute <" & cSlot & ">" ) + WaitSlot() + + for iRetries = 1 to MAX_RETRIES + try + select case ( slot ) + case "fileclose" : FileClose + case "filesave" : FileSave + case "filesaveas" : FileSaveAs( "SynchronMode", TRUE ) + case "filesaveall" : FileSaveAll( "SynchronMode", TRUE ) + case "fileexport" : FileExport + case "filereload" : FileReload( "SynchronMode", TRUE ) + case "fileopen" : FileOpen + case "fileprint" : FilePrint + case "fileprintersettings" : FilePrintersettings + case "fileproperties" : FileProperties + + case "editdoc" : EditDoc + case "editcopy" : EditCopy + case "editchangesrecord" : EditChangesRecord + case "editchangesshow" : EditChangesShow + case "editchangesprotecttrace" : EditChangesProtectTrace + case "editchangescomment" : EditChangesComment + + case "editpaste" : EditPaste + case "editcut" : EditCut + case "editselectall" : EditSelectAll + case "editselectallmath" : EditSelectAllMath + case "editselectionmodeblock" : EditSelectionModeBlock + case "editselectionmodestandard" : EditSelectionModeStandard + case "editdeletecontents" : EditDeleteContents + case "editundo" : EditUndo + case "editredo" : EditRedo + case "editrepeat" : EditRepeat + case "editpastespecial" : EditPasteSpecial + case "editpastespecialwriter" : EditPasteSpecialWriter + case "editsearchandreplace" : EditSearchAndReplace + case "editduplicate" : EditDuplicate + case "editgluepoints" : EditGluePoints + case "editdeleteslide" : EditDeleteSlide + case "editobjectproperties" : EditObjectProperties + case "editobjectedit" : EditObjectEdit + case "editobjectsavecopyas" : EditObjectSaveCopyAs + case "edithyperlink" : EditHyperlink + case "editlinkswriter" : EditLinksWriter + case "editfields" : EditFields + + case "formatframe" : FormatFrame + case "formatcharttype" : FormatChartType + case "formatcontrol" : FormatControl + case "formateditpoints" : FormatEditPoints + case "formatsections" : FormatSections + case "formatchangecaseupper" : FormatChangeCaseUpper + case "formatchangecaselower" : FormatChangeCaseLower + case "formatarea" : FormatArea + case "formatarrangebringtofrontcalc" : FormatArrangeBringToFrontCalc + case "formatflipvertically" : FormatFlipVertically + case "formatfliphorizontally" : FormatFlipHorizontally + case "formatline" : FormatLine + case "formatpositionandsize" : FormatPositionAndSize + case "formatfontwork" : FormatFontwork + case "formatpagewriter" : FormatPageWriter + case "formatparagraph" : FormatParagraph + case "formatruby" : FormatRuby + case "formatstylebold" : FormatStyleBold + case "formatungroupdraw" : FormatUngroupDraw + case "formatexitgroupdraw" : FormatExitGroupDraw + case "formatgroupgroup" : FormatGroupGroup + case "formatgroupeditgroupcalc" : FormatGroupEditGroupCalc + case "formatalignmentlefttext" : FormatAlignmentLeftText + case "formatgraphics" : FormatGraphics + case "formatanchortopage" : FormatAnchorToPage + case "formatwrapcontour" : FormatWrapContour + case "formatwrapeditcontour" : FormatWrapEditContour + case "formatpagewriter" : FormatPageWriter + case "formatautoformatapply" : FormatAutoformatApply + + case "insertslide" : InsertSlide + case "insertfieldsother" : InsertFieldsOther + case "insertgraphicsfromfile" : InsertGraphicsFromFile + case "insertindexesbibliographyentry" : InsertIndexesBibliographyEntry + + case "contextpositionandsize" : ContextPositionAndSize + case "contextproperties" : ContextProperties + + case "toolslanguagehyphenate" : ToolsLanguageHyphenate + case "toolsupdateallindexes" : ToolsUpdateAllIndexes + case "toolsupdatefields" : ToolsUpdateFields + case "toolsupdatelinks" : ToolsUpdateLinks + case "toolslanguagehangulhanjaconversion" : ToolsLanguageHangulHanjaConversion + + case "viewslide" : ViewSlide + case "viewdrawing" : ViewDrawing + case "viewnotes" : ViewNotes + case "viewhandout" : ViewHandout + case "viewzoom" : ViewZoom + case "viewnormal" : ViewNormal + case "viewworkspacedrawingview" : ViewWorkspaceDrawingView + case "viewworkspaceoutlineview" : ViewWorkspaceOutlineView + case "viewworkspaceslideview" : ViewWorkspaceSlidesView + case "viewworkspacenotesview" : ViewWorkspaceNotesView + case "viewworkspacehandoutview" : ViewWorkspaceHandoutView + + case else : warnlog( "Unknown slot called: " & cSlot ) + end select + + exit for ' This is only executed if the slot was called successfully + catch + wait( DELAY ) + endcatch + next iRetries + + ' Total time used + iTime = iRetries * DELAY + + ' Timeout is -1 + if ( iRetries >= MAX_RETRIES ) then iTime = RC_TIMEOUT + + if ( GVERBOSE ) then printlog( CFN & "Exit with rc=" & iTime ) + hUseAsyncSlot() = iTime + +end function + +'******************************************************************************* + +function hClickButton( oButton as object ) as integer + + dim iRetries as integer : iRetries = 0 + dim iTime as integer : iTime = 0 + + const MAX_RETRIES = 50 ' Try to click the button max 50 times + const DELAY = 100 ' 100ms wait between retries + const RC_TIMEOUT = -1 ' Return -1 if the button is not available + const CFN = "global::tools::includes::required::hClickButton(): " + + if ( GVERBOSE ) then printlog( "Click <" & oButton.name() & ">" ) + WaitSlot() + + for iRetries = 1 to MAX_RETRIES + try + oButton.click() + exit for + catch + wait( DELAY ) + endcatch + next iRetries + + ' Total time used + iTime = iRetries * DELAY + + if ( iRetries >= MAX_RETRIES ) then iTime = RC_TIMEOUT + + if ( GVERBOSE ) then printlog( CFN & "Exit with rc=" & iTime ) + hClickButton() = iTime + +end function + +'******************************************************************************* + +function hCloseDialog( oDialog as object, sUserFlags as string ) as boolean + + ' this function closes a dialog providing three different methods while + ' removing the need for static sleep statements + + const CFN = "global::tools::includes::required::t_tools3.inc::hCloseDialog(): " + const METHOD_CLOSE = 1 + const METHOD_CANCEL = 2 + const METHOD_OK = 3 + const METHOD_202 = 4 + const METHOD_YES = 5 + const METHOD_NO = 6 + const TIMEOUT = 2 ' Maximum time to wait for a dialog to close + + dim sFlags as string : sFlags = lcase( sUserFlags ) + dim iClosingMethod as integer + dim bDialogMustExist as boolean : bDialogMustExist = TRUE + + hCloseDialog() = FALSE ' Set default returnvalue, assume failure + + ' Find out which closing method was provided, "close" ist the default + if ( instr( sFlags, "cancel" ) ) then + iClosingMethod = METHOD_CANCEL + elseif ( instr( sFlags, "202" ) ) then + iClosingMethod = METHOD_202 + elseif ( instr( sFlags, "yes" ) ) then + iClosingMethod = METHOD_YES + elseif ( instr( sFlags, "ok" ) ) then + iClosingMethod = METHOD_OK + elseif ( instr( sFlags, "no" ) ) then + iClosingMethod = METHOD_NO + else + iClosingMethod = METHOD_CLOSE + endif + + ' Find out whether the dialog must exist (default) or is just closed as a precaution ("optional") + if ( instr( sFlags, "optional") ) then bDialogMustExist = FALSE + + if ( GVERBOSE ) then + printlog( "Closing dialog <" & oDialog.name() & "> using the flags <" & sFlags & ">.") + endif + + if ( oDialog.exists() ) then + try + select case( iClosingMethod ) + case METHOD_CLOSE : oDialog.close() + case METHOD_CANCEL : oDialog.cancel() + case METHOD_202 : oDialog.click( 202 ) + case METHOD_YES : oDialog.yes() + case METHOD_NO : oDialog.no() + case METHOD_OK : oDialog.ok() + case else : + warnlog( CFN & " Script error: Allowed closing methods are cancel, close, ok, yes, no and 202" ) + end select + catch + warnlog( CFN & "This dialog does not provide the requested closing method" ) + hCloseDialog() = FALSE + exit function + endcatch + else + if ( bDialogMustExist ) then + warnlog( CFN & "The requested dialog is not available, no action taken" ) + hCloseDialog() = FALSE + exit function + endif + endif + + ' Any other outcome until now returned FALSE. If we get here, we have a success. + if ( oDialog.notExists( TIMEOUT ) ) then hCloseDialog() = TRUE + +end function + +'******************************************************************************* + +function hWaitForObject( oControl as object, iTime as integer ) as integer + + const CFN = "global::tools::includes::required::t_tools3.inc::hWaitForObject(): " + const RC_TIMEOUT = -1 + + dim iWait as integer + + if ( GVERBOSE ) then printlog( CFN & "Entering function for control: " & oControl.name() ) + + WaitSlot( 2000 ) + + for iWait = 0 to iTime + try + if ( oControl.isEnabled() ) then + printlog( CFN & "Control is enabled: " & oControl.name() ) + hWaitForObject() = iWait + exit function + else + if ( GVERBOSE ) then printlog( "Waiting..." ) + endif + catch + wait( 1 ) + endcatch + next iWait + + printlog( CFN & "Control not found or not enabled, timeout reached" ) + hWaitForObject() = RC_TIMEOUT + +end function diff --git a/testautomation/global/tools/resetoffice.bas b/testautomation/global/tools/resetoffice.bas new file mode 100755 index 000000000000..ca7590ad753f --- /dev/null +++ b/testautomation/global/tools/resetoffice.bas @@ -0,0 +1,75 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : thorsten.bosbach@oracle.com +'* +'* short description : Exit the [Star|Open][Office|Suite][.org] and delete user directory +'* +'\************************************************************************************* + +sub main + dim sString as string + + sString = "qatesttool/global/tools/resetoffice.bas:: " + + 'Close OOo + try + ' To prevent restarting of OOo, the try/catch is around this and + ' to prevent messages about communication errors + printlog ResetApplication + FileExit "SynchronMode", TRUE + catch + warnlog sString + "Failed to close OOo." + endcatch + sleep 10 'To wait until OOo is realy away + + 'Remove user directory + try + if (right(gOfficePath,1)=gPathSigne) then + 'Dir doesn't work, is a path singe is at the end + gOfficePath = left(gOfficePath,len(gOfficePath)-1) + endif + printlog "Going to delete directory: '" + gOfficePath + "'" + if (dir(gOfficePath) = "") then + qaErrorlog "Directory is already deleted." + else + rmDir (gOfficePath) + if (dir(gOfficePath) <> "") then + warnlog "Directory wasn't deleted." + endif + endif + catch + warnlog sString + "Failed to delete user directory." + endcatch +end sub + +sub LoadIncludeFiles + use "global\system\includes\master.inc" + use "global\system\includes\gvariabl.inc" + Call GetUseFiles() +end sub + diff --git a/testautomation/global/tools/wintree.bas b/testautomation/global/tools/wintree.bas new file mode 100755 index 000000000000..0d4c376316a0 --- /dev/null +++ b/testautomation/global/tools/wintree.bas @@ -0,0 +1,39 @@ +'encoding UTF-8 Do not remove or change this line! +'************************************************************************** +' DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +' +' Copyright 2000, 2010 Oracle and/or its affiliates. +' +' OpenOffice.org - a multi-platform office productivity suite +' +' This file is part of OpenOffice.org. +' +' OpenOffice.org is free software: you can redistribute it and/or modify +' it under the terms of the GNU Lesser General Public License version 3 +' only, as published by the Free Software Foundation. +' +' OpenOffice.org 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 version 3 for more details +' (a copy is included in the LICENSE file that accompanied this code). +' +' You should have received a copy of the GNU Lesser General Public License +' version 3 along with OpenOffice.org. If not, see +' <http://www.openoffice.org/license.html> +' for a copy of the LGPLv3 License. +' +'/************************************************************************ +'* +'* owner : thorsten.bosbach@oracle.com +'* +'* short description : Show the complete window hierarchy +'* +'\************************************************************************************* + +sub main +' Office has to be started before starting this! + setClipboard(WinTree) + Printlog (getClipboard) +end sub + |