/* ** j###t ########## #### #### ** j###t ########## #### #### ** j###T "###L J###" ** ######P' ########## ######### ** ######k, ########## T######T ** ####~###L #### ** #### q###L ########## .##### ** #### \###L ########## #####" ** ** $Id$ ** ** Class History ** ** Date Name Description ** ---------|------------|----------------------------------------------- ** 19Aug98 subtle start of recorded history ** */ package key; import java.io.IOException; import java.io.DataOutput; import java.io.DataInput; import java.io.Serializable; import java.util.Enumeration; import java.util.StringTokenizer; import java.util.Vector; public class QualifierList implements java.io.Serializable { Vector entries; public QualifierList() { entries = new Vector( 0, 3 ); // set up some default colours: set( Type.PLAYER, 'M' ); set( Type.CLAN, 'B' ); set( Type.FRIENDS, 'G' ); set( Type.SHOUT, 'W' ); set( Type.ROOM, 'c' ); set( Type.CONNECTION, 'r' ); set( Type.MOVEMENT, 'R' ); } public Enumeration elements() { return( entries.elements() ); } public int count() { return( entries.size() ); } public void set( Type c, char code ) { if( code == Qualifiers.UNKNOWN_CODE ) clear( c ); else { Entry cle = getEntryFor( c ); if( cle == null ) { cle = new Entry( c ); newEntry( cle ); } cle.set( code ); } } public void clear( Type c ) { Entry cle = getEntryFor( c ); if( cle != null ) entries.removeElement( cle ); } Entry getEntryFor( Type c ) { for( Enumeration e = elements(); e.hasMoreElements(); ) { Entry cle = (Entry) e.nextElement(); if( cle.isFor( c ) ) return( cle ); } return( null ); } public char check( Type c ) { Entry cle = getEntryFor( c ); if( cle != null ) { return( cle.get() ); } return( Qualifiers.UNKNOWN_CODE ); } protected void newEntry( Entry ent ) { entries.addElement( ent ); } public String toString() { if( count() == 0 ) { return( "No list entries" ); } else { StringBuffer sb = new StringBuffer(); sb.append( Integer.toString( count() ) + " entr" + ((count()==1) ? "y" : "ies") + " in the list:\n" ); for( Enumeration e = elements(); e.hasMoreElements(); ) { Entry cle = (Entry) e.nextElement(); sb.append( " " ); sb.append( cle.toString() ); sb.append( "\n" ); } return( sb.toString() ); } } public QualifierList.Immutable getImmutable() { return( new Immutable() ); } public static final class Entry implements Serializable { private static final long serialVersionUID = 5079643376687355139L; Type entryFor; char code; /** * A mark is mainly used for the 'suppression' code. You * see, if a player suppresses a channel, it is often a * temporary assignment, at which point they'll want to * return to the unsuppressed colour. The mark is used * to store the 'old' colour. Call mark() just before * setting the suppression code, and call reset() to * return to the 'previous' colour. (Whatever that is) */ char mark; public Entry( Type entry ) { entryFor = entry; code = Qualifiers.UNKNOWN_CODE; mark = Qualifiers.UNKNOWN_CODE; } public boolean isFor( Type test ) { return( test == entryFor ); } public Type getTypeFor() { return( entryFor ); } public void set( char newCode ) { if( newCode == Qualifiers.UNSUPPRESSION_CODE ) { code = mark; mark = Qualifiers.UNKNOWN_CODE; } else { if( newCode == Qualifiers.SUPPRESSION_CODE && mark != Qualifiers.SUPPRESSION_CODE ) mark = code; code = newCode; } } public char get() { return( code ); } public char getMark() { return( mark ); } public String toString() { return( entryFor.getName() + ": ^" + code + Qualifiers.getCodeName( code ) + "^-" ); } public String toMarkedString() { return( entryFor.getName() + ": ^" + mark + Qualifiers.getCodeName( mark ) + "^- (suppressed)" ); } public Immutable getImmutable() { return( new Immutable() ); } public final class Immutable { Immutable() { } public boolean isFor( Type test ) { return( QualifierList.Entry.this.isFor( test ) ); } public Type getTypeFor() { return( QualifierList.Entry.this.getTypeFor() ); } public char get() { return( QualifierList.Entry.this.code ); } public char getMark() { return( QualifierList.Entry.this.mark ); } public String toString() { return( QualifierList.Entry.this.entryFor.getName() + ": ^" + QualifierList.Entry.this.code + Qualifiers.getCodeName( QualifierList.Entry.this.code ) + "^-" ); } public String toMarkedString() { return( "(" + QualifierList.Entry.this.entryFor.getName() + ": ^" + QualifierList.Entry.this.mark + Qualifiers.getCodeName( QualifierList.Entry.this.mark ) + "^-)" ); } } } public class Immutable { public final int count() { return( QualifierList.this.count() ); } public final char check( Type c ) { return( QualifierList.this.check( c ) ); } public final String toString() { return( QualifierList.this.toString() ); } public final Enumeration elements() { return( new key.util.FilteredEnumeration( QualifierList.this.elements(), new key.util.FilteredEnumeration.Filter() { public boolean isValid( Object e, Enumeration en ) { return( true ); } public Object replace( Object element, Enumeration en ) { return( ((Entry)element). new Immutable() ); } } ) ); } } }