1 /**
2 * jline - Java console input library
3 * Copyright (c) 2002, 2003, 2004, 2005, Marc Prud'hommeaux <mwp1@cornell.edu>
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or
7 * without modification, are permitted provided that the following
8 * conditions are met:
9 *
10 * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 *
13 * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer
15 * in the documentation and/or other materials provided with
16 * the distribution.
17 *
18 * Neither the name of JLine nor the names of its contributors
19 * may be used to endorse or promote products derived from this
20 * software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
24 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
25 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
26 * EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
28 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
31 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
33 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
34 * OF THE POSSIBILITY OF SUCH DAMAGE.
35 */
36 package jline;
37
38 import java.util.*;
39
40 /**
41 * <p>
42 * A completor that contains multiple embedded completors. This differs
43 * from the {@link ArgumentCompletor}, in that the nested completors
44 * are dispatched individually, rather than delimited by arguments.
45 * </p>
46 *
47 * @author <a href="mailto:mwp1@cornell.edu">Marc Prud'hommeaux</a>
48 */
49 public class MultiCompletor
50 implements Completor
51 {
52 Completor [] completors = new Completor [0];
53
54
55 /**
56 * Construct a MultiCompletor with no embedded completors.
57 */
58 public MultiCompletor ()
59 {
60 this (new Completor [0]);
61 }
62
63
64 /**
65 * Construct a MultiCompletor with the specified list of
66 * {@link Completor} instances.
67 */
68 public MultiCompletor (final List completors)
69 {
70 this ((Completor [])completors.toArray (
71 new Completor [completors.size ()]));
72 }
73
74
75 /**
76 * Construct a MultiCompletor with the specified
77 * {@link Completor} instances.
78 */
79 public MultiCompletor (final Completor [] completors)
80 {
81 this.completors = completors;
82 }
83
84
85 public int complete (final String buffer, final int pos, final List cand)
86 {
87 int [] positions = new int [completors.length];
88 List [] copies = new List [completors.length];
89 for (int i = 0; i < completors.length; i++)
90 {
91
92 copies [i] = new LinkedList (cand);
93 positions [i] = completors [i].complete (buffer, pos, copies [i]);
94 }
95
96 int maxposition = -1;
97 for (int i = 0; i < positions.length; i++)
98 maxposition = Math.max (maxposition, positions [i]);
99
100
101
102 for (int i = 0; i < copies.length; i++)
103 {
104 if (positions [i] == maxposition)
105 cand.addAll (copies [i]);
106 }
107
108 return maxposition;
109 }
110
111
112 public void setCompletors (final Completor [] completors)
113 {
114 this.completors = completors;
115 }
116
117
118 public Completor [] getCompletors ()
119 {
120 return this.completors;
121 }
122 }