package de.unisiegen.gtitool.ui.style;
import java.util.ArrayList;
import java.util.TreeSet;
import de.unisiegen.gtitool.core.entities.Entity;
import de.unisiegen.gtitool.core.entities.NonterminalSymbol;
import de.unisiegen.gtitool.core.entities.NonterminalSymbolSet;
import de.unisiegen.gtitool.core.entities.TerminalSymbol;
import de.unisiegen.gtitool.core.entities.TerminalSymbolSet;
import de.unisiegen.gtitool.core.parser.exceptions.ParserException;
import de.unisiegen.gtitool.core.parser.exceptions.ScannerException;
import de.unisiegen.gtitool.core.parser.terminalsymbolset.TerminalSymbolSetParseable;
import de.unisiegen.gtitool.ui.i18n.Messages;
import de.unisiegen.gtitool.ui.style.parser.StyledParserPanel;
/**
* The styled {@link TerminalSymbolSet} panel class.
*
* @author Christian Fehler
* @version $Id: StyledTerminalSymbolSetParserPanel.java 532 2008-02-04
* 23:54:55Z fehler $
*/
public final class StyledTerminalSymbolSetParserPanel extends
StyledParserPanel < TerminalSymbolSet >
{
/**
* The serial version uid.
*/
private static final long serialVersionUID = -928492541925565704L;
/**
* Every {@link TerminalSymbol} in the {@link TerminalSymbolSet} can not be be
* in the {@link NonterminalSymbolSet}.
*/
private NonterminalSymbolSet nonterminalSymbolSet = null;
/**
* The parsed {@link TerminalSymbolSet} can not contain this
* {@link TerminalSymbol}s.
*/
private TreeSet < TerminalSymbol > notRemoveableTerminalSymbols = null;
/**
* Allocates a new {@link StyledTerminalSymbolSetParserPanel}.
*/
public StyledTerminalSymbolSetParserPanel ()
{
super ( new TerminalSymbolSetParseable () );
}
/**
* {@inheritDoc}
*
* @see StyledParserPanel#checkParsedObject(Entity)
*/
@Override
protected final TerminalSymbolSet checkParsedObject (
TerminalSymbolSet terminalSymbolSet )
{
ArrayList < ScannerException > exceptionList = new ArrayList < ScannerException > ();
if ( ( this.nonterminalSymbolSet != null ) && ( terminalSymbolSet != null ) )
{
for ( TerminalSymbol currentTerminal : terminalSymbolSet )
{
for ( NonterminalSymbol currentNonterminal : this.nonterminalSymbolSet )
{
if ( currentTerminal.getName ().equals (
currentNonterminal.getName () ) )
{
exceptionList.add ( new ParserException ( currentTerminal
.getParserOffset ().getStart (), currentTerminal
.getParserOffset ().getEnd (), Messages.getPrettyString (
"TerminalPanel.AlreadyNonterminalSymbol", //$NON-NLS-1$
currentTerminal.toPrettyString () ).toHTMLString () ) );
}
}
}
}
if ( ( this.notRemoveableTerminalSymbols != null )
&& ( terminalSymbolSet != null ) )
{
for ( TerminalSymbol current : this.notRemoveableTerminalSymbols )
{
if ( !terminalSymbolSet.contains ( current ) )
{
exceptionList.add ( new ParserException ( current.getParserOffset ()
.getStart (), current.getParserOffset ().getEnd (), Messages
.getPrettyString ( "TerminalPanel.SymbolUsed", //$NON-NLS-1$
current.toPrettyString () ).toHTMLString () ) );
}
}
}
if ( exceptionList.size () > 0 )
{
setException ( exceptionList );
return null;
}
return terminalSymbolSet;
}
/**
* Sets the {@link NonterminalSymbolSet}. Every {@link TerminalSymbol} in the
* {@link TerminalSymbolSet} can not be be in the {@link NonterminalSymbolSet}
* .
*
* @param nonterminalSymbolSet The {@link NonterminalSymbolSet} to set.
*/
public final void setNonterminalSymbolSet (
NonterminalSymbolSet nonterminalSymbolSet )
{
this.nonterminalSymbolSet = nonterminalSymbolSet;
}
/**
* Sets the {@link TerminalSymbol}s which should not be removeable.
*
* @param notRemoveableTerminalSymbols The {@link TerminalSymbol}s which
* should not be removeable.
* @see #notRemoveableTerminalSymbols
*/
public final void setNotRemoveableTerminalSymbols (
TreeSet < TerminalSymbol > notRemoveableTerminalSymbols )
{
this.notRemoveableTerminalSymbols = notRemoveableTerminalSymbols;
}
}