################################################################################
# TSL-LIBRARY:	EMOS_STD_list_lib
################################################################################
# Copyright (C) 2000  EMOS Computer Consulting GmbH
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# For further information please contact:
#
#	Dean Rajovic
#	EMOS Computer Consulting GmbH
#	Oskar-Messter-Straße 25
#	85737 Ismaning
#	Germany
#	tel.: +49 89 608 765-0
#	mailto:drajovic@emos.de
#	http://www.emos.de
################################################################################
# $Revision: 1.1.1.1 $
# $Author: drajovic $
# $Date: 2004/03/24 20:14:02 $
# $Archive: /MERCURY/Projects/EMOS_GPL/STD/emos_std_list_lib/script $
# $NoKeywords: $
################################################################################

#**#
#*	This library contains alternative implementations of standard functions
#*	that operate on list objects (list_x() functions). Reasons for alternative 
#*	implementations can be various. They should be carefully documented with
#*	each function.
#*	Another sort of functions in this library are functions that implement some
#*	additional functionality that would probably fit into Mercury's logic
#*	for list_x() functions.
#*/

#**
#* 	Checks whether the <code>list</code> contains a particular item. You can search for
#*	items that must exactly match the search string <code>str1</code> or contain the
#*	searched substring.
#* @param obj (in)		list object to be searched
#* @param regex (in)	string to search for
#* @param pos (out)	item number in case <str1> was found
#* @param soft (in)	(optional)
#*	            TRUE = matches a substring
#*				FALSE = exact match [default: FALSE]
#* @return
#*	E_OK:		match found
#*	E_NOT_FOUND: match not found
#*	else:		errors detected
#*/

public function list_item_exists( in obj, in regex, out pos, in soft )
{
	static i,nnn,val,rc;
	extern RLENGTH;

	rc = list_get_info(obj,"count",nnn);
	if (rc  != 0) return(rc);
	if (nnn == 0) return(E_NOT_FOUND);

	for(pos = 0; pos <= nnn-1; pos++)
	{
		rc = list_get_item(obj,pos,val);
		if (rc != 0)  return(rc);
		switch ( match(val,regex) )
		{
		case 0:
			break;
		case 1:
			if ( soft || ( length(val) == RLENGTH ) )
			{
				pos++;
				return(E_OK);
			}
			break;
		default:
			if ( soft )
			{
				pos++;
				return(E_OK);
			}
			break;
		}
	}
	return(E_NOT_FOUND);
}

#**
#*	This function was created as an attempt to solve a particularly ugly bug
#*	in WR 6.0 / 6.02. It is obsolete now because we have discovered the real
#*	cause of the problem which you can solve by placing set_var("timeout",10)
#*	in your startup script. 
#*	We have left the function in the library to show one way how some problems
#*	could be aproached by applying alternative methods to achieve the "same"
#*	effect. In this case we rely on the fact that MFC listboxes typically
#*	position the focus on the item whose name starts with the key pressed. So
#*	we are pressing the initial key until we either find an item or we "cycle-
#*	through" the list.
#*<p> PROBLEM DESCRIPTION:<p>
#*	Hier and then we had the problem that after restarting WinRunner, list
#*	objects wouldn't work properly. For some reason list_select_item() would
#*	suddenly not work although the item was still there and neither application
#*	nor the test (that's what we thought) changed. GUI editor would show no
#*	problems whatsoever with any of the list objects. Only the selecting would
#*	not work. The only way to "solve" the problem was to re-install WinRunner.
#*	Finally, after days of searching,, we have discovered, that after some
#*	WinRunner crashes, the default timeout value (saved in wrun.ini, where else)
#*	had a value of 10 instead of 10000. This has explained why this problem 
#*	only occurs in WR 6.0. It is 6.0 when timeout was changed from seconds to
#*	miliseconds. Obviously, somewhere deep in some WinRunner dll there is still
#*	a peace of logic that thinks in seconds instead of miliseconds.
#*	Since we know what Mercury could claim, we have checked our test scripts -
#*	they are deffinitely fine. It is WinRunner who causes problems.
#*<p> PROBLEM SOLUTION:<p>
#*	There are several solutions for this problem:
#*<ul>
#* <li> You change the wrun.ini each time this happens.</li>
#* <li> You wait until Mercury fixes the problem.</li>
#* <li> You (re)set the timeout you want in your startup script.</li>
#*</ul>
#*	Obviously, the last one is the only feasible.
#* @param obj (in)		name of the list object
#* @param item (in)	item which is to be selected
#* @return
#*	E_OK:	success
#*	!E_OK:	error
#*/

public function list_select_item1 ( in obj, in item )
{
	auto rc, x, t;
	auto arr[], n=0;
	x = substr(item,1,1);
	while( 1 )
	{
		rc = list_get_selected( obj, t, n ); 
		if (rc) return rc;
		if ( t == item )
			return E_OK;
		if( t in arr )
			break;
		arr[t] = n;
		rc=obj_type(obj, x);
		if (rc) return rc;
	}
	return E_NOT_FOUND;
}

################################################################################
# TSL-LIBRARY:	EMOS_STD_list_lib
################################################################################