001 /** 002 * jline - Java console input library 003 * Copyright (c) 2002,2003 Marc Prud'hommeaux mwp1@cornell.edu 004 * 005 * This library is free software; you can redistribute it and/or 006 * modify it under the terms of the GNU Lesser General Public 007 * License as published by the Free Software Foundation; either 008 * version 2.1 of the License, or (at your option) any later version. 009 * 010 * This library is distributed in the hope that it will be useful, 011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 013 * Lesser General Public License for more details. 014 * 015 * You should have received a copy of the GNU Lesser General Public 016 * License along with this library; if not, write to the Free Software 017 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 018 */ 019 package jline; 020 021 import java.io.*; 022 import java.util.*; 023 024 /** 025 * <p> 026 * A completor that contains multiple embedded completors. This differs 027 * from the {@link ArgumentCompletor}, in that the nested completors 028 * are dispatched individually, rather than delimited by arguments. 029 * </p> 030 * 031 * @author <a href="mailto:mwp1@cornell.edu">Marc Prud'hommeaux</a> 032 */ 033 public class MultiCompletor 034 implements Completor 035 { 036 Completor [] completors = new Completor [0]; 037 038 039 /** 040 * Construct a MultiCompletor with no embedded completors. 041 */ 042 public MultiCompletor () 043 { 044 this (new Completor [0]); 045 } 046 047 048 /** 049 * Construct a MultiCompletor with the specified list of 050 * {@link Completor} instances. 051 */ 052 public MultiCompletor (final List completors) 053 { 054 this ((Completor [])completors.toArray ( 055 new Completor [completors.size ()])); 056 } 057 058 059 /** 060 * Construct a MultiCompletor with the specified 061 * {@link Completor} instances. 062 */ 063 public MultiCompletor (final Completor [] completors) 064 { 065 this.completors = completors; 066 } 067 068 069 public int complete (final String buffer, final int pos, final List cand) 070 { 071 int [] positions = new int [completors.length]; 072 List [] copies = new List [completors.length]; 073 for (int i = 0; i < completors.length; i++) 074 { 075 // clone and save the candidate list 076 copies [i] = new LinkedList (cand); 077 positions [i] = completors [i].complete (buffer, pos, copies [i]); 078 } 079 080 int maxposition = -1; 081 for (int i = 0; i < positions.length; i++) 082 maxposition = Math.max (maxposition, positions [i]); 083 084 // now we have the max cursor value: build up all the 085 // candidate lists that have the same cursor value 086 for (int i = 0; i < copies.length; i++) 087 { 088 if (positions [i] == maxposition) 089 cand.addAll (copies [i]); 090 } 091 092 return maxposition; 093 } 094 095 096 public void setCompletors (final Completor [] completors) 097 { 098 this.completors = completors; 099 } 100 101 102 public Completor [] getCompletors () 103 { 104 return this.completors; 105 } 106 }