    001    /**
    002     *      jline - Java console input library
    003     *      Copyright (c) 2002, 2003, 2004, 2005, Marc Prud'hommeaux <mwp1@cornell.edu>
    004     *      All rights reserved.
    005     *
    006     *      Redistribution and use in source and binary forms, with or
    007     *      without modification, are permitted provided that the following
    008     *      conditions are met:
    009     *
    010     *      Redistributions of source code must retain the above copyright
    011     *      notice, this list of conditions and the following disclaimer.
    012     *
    013     *      Redistributions in binary form must reproduce the above copyright
    014     *      notice, this list of conditions and the following disclaimer
    015     *      in the documentation and/or other materials provided with
    016     *      the distribution.
    017     *
    018     *      Neither the name of JLine nor the names of its contributors
    019     *      may be used to endorse or promote products derived from this
    020     *      software without specific prior written permission.
    021     *
    022     *      THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    023     *      "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
    024     *      BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
    025     *      AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
    026     *      EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    027     *      FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
    028     *      OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    029     *      PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    030     *      DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
    031     *      AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    032     *      LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
    033     *      IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
    034     *      OF THE POSSIBILITY OF SUCH DAMAGE.
    035     */
    036    package jline;
    037
    038    import java.util.*;
    039
    040    /**
    041     *      <p>
    042     *      A completor that contains multiple embedded completors. This differs
    043     *      from the {@link ArgumentCompletor}, in that the nested completors
    044     *      are dispatched individually, rather than delimited by arguments.
    045     *      </p>
    046     *
    047     *  @author  <a href="mailto:mwp1@cornell.edu">Marc Prud'hommeaux</a>
    048     */
    049    public class MultiCompletor
    050            implements Completor
    051    {
    052            Completor [] completors = new Completor [0];
    053
    054
    055            /**
    056             *  Construct a MultiCompletor with no embedded completors.
    057             */
    058            public MultiCompletor ()
    059            {
    060                    this (new Completor [0]);
    061            }
    062
    063
    064            /**
    065             *  Construct a MultiCompletor with the specified list of
    066             *  {@link Completor} instances.
    067             */
    068            public MultiCompletor (final List completors)
    069            {
    070                    this ((Completor [])completors.toArray (
    071                            new Completor [completors.size ()]));
    072            }
    073
    074
    075            /**
    076             *  Construct a MultiCompletor with the specified
    077             *  {@link Completor} instances.
    078             */
    079            public MultiCompletor (final Completor [] completors)
    080            {
    081                    this.completors = completors;
    082            }
    083
    084
    085            public int complete (final String buffer, final int pos, final List cand)
    086            {
    087                    int [] positions = new int [completors.length];
    088                    List [] copies = new List [completors.length];
    089                    for (int i = 0; i < completors.length; i++)
    090                    {
    091                            // clone and save the candidate list
    092                            copies [i] = new LinkedList (cand);
    093                            positions [i] = completors [i].complete (buffer, pos, copies [i]);
    094                    }
    095
    096                    int maxposition = -1;
    097                    for (int i = 0; i < positions.length; i++)
    098                            maxposition = Math.max (maxposition, positions [i]);
    099
    100                    // now we have the max cursor value: build up all the
    101                    // candidate lists that have the same cursor value
    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    }