An interesting note:
If we insert some 'print' statements, we can see that the
$dlg->add() function resets the value of $id, I am assuming because it does not match any of the 'valid' options.
#... code
my $id = $sel || (@ids && $ids[0]) || '';
print "id 1 is <$id>\n";
my $IDText = $dlg->add (
'JComboBox',
-mode => 'readonly',
-selectcommand => [\&changeEditPlayer, \$id],
-validate => 'match',
-textvariable => \$id,
);
print "id 2 is <$id>\n";
What is also interesting, is that we cannot set
$id to anything now that is associated with the readonly JComboBox. However, once the options are defined,
$id can be set, but only to a
valid option.
$id = "Joe";print "id is not Joe!! <$id>\n";
$IDText->form (-left => '%0', -right => '%100', -top => '%0');
$IDText->configure (-options => \@ids);
# not only sets the selection but calls <c>changeEditPlayer</c>
$id = "Joe"; print "now id is not empty!! <$id>\n";
# does nothing, because 'Sandy' is not a valid option
$id = "Sandy"; print "id not set to Sandy because it is an invalid
+ option <$id>\n";
$id = $sel || (@ids && $ids[0]) || '';
### now it works !!
$IDText->setSelected ($id); # dosn't work
With the print statement modified slightly in changeEditPlayer, we get the following results (without any clicking of the mouse!)
id 1 is <Fred>
id 2 is <>
id is not Joe!! <>
- inside changeEditPlayer Joe
now id is not empty!! <Joe>
id not set to Sandy because it is an invalid option <Joe>
- inside changeEditPlayer Fred
Honestly, I was a bit confused when I was first playing with this bit of code. Never had I seen a straight declaration, like the following, not work.
$id = 'Sandy';
print "<$id>\n"; # prints Joe