-$Query = "";
-@options = ();
-%queues = ();
-$optionlist = build_array( \$Query, $currentkey, $tree, \@options, \%queues );
-
-sub build_array {
- my $Query = shift;
- my $currentkey = shift;
- my $tree = shift;
- my ($keys, $queues) = @_;
- my $i = 0;
- my $optionlist;
- my $depth = 0;
- my %parens;
-
- $tree->traverse( sub {
- my ($_tree) = @_;
-
- return if $_tree->getParent->isRoot();
-
- push @$keys, $_tree;
- my $clause = $_tree->getNodeValue();
- my $str;
- my $ea = $_tree->getParent()->getNodeValue();
- if (ref($clause)) {
- $str .= $ea . " " if $_tree->getIndex() > 0;
- $str .= $clause->{Key} . " " . $clause->{Op} . " " . $clause->{Value};
-
- if ( $clause->{Key} eq "Queue" ) {
- $queues->{ $clause->{Value} } = 1;
- }
- } else {
- $str = $ea if $_tree->getIndex() > 0;
- }
-
- my $selected;
- if ($_tree == $currentkey) {
- $selected = "SELECTED";
- }
- else {
- $selected = "";
- }
-
- foreach my $p (keys %parens) {
- if ($p > $_tree->getDepth) {
- $$Query .= ')' x $parens{$p};
- $parens{$p}--;
- }
- }
-
- $optionlist .= "<option value=$i $selected>" .
- (" " x 5 x ($_tree->getDepth() - 1)) . "$str</option>\n";
- my $parent = $_tree->getParent();
- if (!($parent->isRoot || $parent->getParent()->isRoot) &&
- !ref($parent->getNodeValue())) {
- if ( $_tree->getIndex() == 0) {
- $$Query .= '(';
- $parens{$_tree->getDepth}++;
- }
- }
- $$Query .= " " . $str . " ";
-
- if ($_tree->getDepth < $depth) {
- $$Query .= ')';
- $parens{$depth}--;
- }
-
- $i++;
- });
-
- foreach my $p (keys %parens) {
- $$Query .= ") " x $parens{$p};
- }
+$Query = "";
+my $optionlist_arrayref;
+
+($Query, $optionlist_arrayref) = $tree->GetQueryAndOptionList(\@current_values);
+
+my $optionlist = join "\n", map { qq(<option value="$_->{INDEX}" $_->{SELECTED}>)
+ . (" " x (5 * $_->{DEPTH}))
+ . $m->interp->apply_escapes($_->{TEXT}, 'h') . qq(</option>) } @$optionlist_arrayref;
+