/*
 * Copyright (c) 2002-2007, Marc Prud'hommeaux. All rights reserved.
 *
 * This software is distributable under the BSD license. See the terms of the
 * BSD license in the documentation provided with this software.
 */
package jline;

import java.util.*;

/**
 *  <p>
 *  A completor that contains multiple embedded completors. This differs
 *  from the {@link ArgumentCompletor}, in that the nested completors
 *  are dispatched individually, rather than delimited by arguments.
 *  </p>
 *
 *  @author  <a href="mailto:mwp1@cornell.edu">Marc Prud'hommeaux</a>
 */
public class MultiCompletor implements Completor {
    Completor[] completors = new Completor[0];

    /**
     *  Construct a MultiCompletor with no embedded completors.
     */
    public MultiCompletor() {
        this(new Completor[0]);
    }

    /**
     *  Construct a MultiCompletor with the specified list of
     *  {@link Completor} instances.
     */
    public MultiCompletor(final List completors) {
        this((Completor[]) completors.toArray(new Completor[completors.size()]));
    }

    /**
     *  Construct a MultiCompletor with the specified
     *  {@link Completor} instances.
     */
    public MultiCompletor(final Completor[] completors) {
        this.completors = completors;
    }

    public int complete(final String buffer, final int pos, final List cand) {
        int[] positions = new int[completors.length];
        List[] copies = new List[completors.length];

        for (int i = 0; i < completors.length; i++) {
            // clone and save the candidate list
            copies[i] = new LinkedList(cand);
            positions[i] = completors[i].complete(buffer, pos, copies[i]);
        }

        int maxposition = -1;

        for (int i = 0; i < positions.length; i++) {
            maxposition = Math.max(maxposition, positions[i]);
        }

        // now we have the max cursor value: build up all the
        // candidate lists that have the same cursor value
        for (int i = 0; i < copies.length; i++) {
            if (positions[i] == maxposition) {
                cand.addAll(copies[i]);
            }
        }

        return maxposition;
    }

    public void setCompletors(final Completor[] completors) {
        this.completors = completors;
    }

    public Completor[] getCompletors() {
        return this.completors;
    }
}
