/*
* 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;
}
}