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.nonterminalsymbolset.NonterminalSymbolSetParseable; import de.unisiegen.gtitool.core.parser.style.Style; import de.unisiegen.gtitool.ui.i18n.Messages; import de.unisiegen.gtitool.ui.style.parser.StyledParserPanel; /** * The styled {@link NonterminalSymbolSet} panel class. * * @author Christian Fehler * @version $Id: StyledNonterminalSymbolSetParserPanel.java 532 2008-02-04 * 23:54:55Z fehler $ */ public final class StyledNonterminalSymbolSetParserPanel extends StyledParserPanel < NonterminalSymbolSet > { /** * The serial version uid. */ private static final long serialVersionUID = -349502367082489237L; /** * The parsed {@link NonterminalSymbolSet} can not contain this * {@link NonterminalSymbol}s. */ private TreeSet < NonterminalSymbol > notRemoveableNonterminalSymbols = null; /** * Every {@link NonterminalSymbol} in the {@link NonterminalSymbolSet} can not * be be in the {@link TerminalSymbolSet}. */ private TerminalSymbolSet terminalSymbolSet = null; /** * The start {@link NonterminalSymbol}. */ private NonterminalSymbol startNonterminalSymbol; /** * Allocates a new {@link StyledNonterminalSymbolSetParserPanel}. */ public StyledNonterminalSymbolSetParserPanel () { super ( new NonterminalSymbolSetParseable () ); } /** * {@inheritDoc} * * @see StyledParserPanel#checkParsedObject(Entity) */ @Override protected final NonterminalSymbolSet checkParsedObject ( NonterminalSymbolSet nonterminalSymbolSet ) { ArrayList < ScannerException > exceptionList = new ArrayList < ScannerException > (); if ( ( this.terminalSymbolSet != null ) && ( nonterminalSymbolSet != null ) ) { for ( NonterminalSymbol currentNonterminal : nonterminalSymbolSet ) { for ( TerminalSymbol currentTerminal : this.terminalSymbolSet ) { if ( currentNonterminal.getName ().equals ( currentTerminal.getName () ) ) { exceptionList.add ( new ParserException ( currentNonterminal .getParserOffset ().getStart (), currentNonterminal .getParserOffset ().getEnd (), Messages.getPrettyString ( "TerminalPanel.AlreadyTerminalSymbol", //$NON-NLS-1$ currentTerminal.toPrettyString () ).toHTMLString () ) ); } } } } if ( ( this.notRemoveableNonterminalSymbols != null ) && ( nonterminalSymbolSet != null ) ) { for ( NonterminalSymbol current : this.notRemoveableNonterminalSymbols ) { if ( !nonterminalSymbolSet.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 nonterminalSymbolSet; } /** * Sets the {@link NonterminalSymbol}s which should not be removeable. * * @param notRemoveableNonterminalSymbols The {@link NonterminalSymbol}s which * should not be removeable. * @see #notRemoveableNonterminalSymbols */ public final void setNotRemoveableNonterminalSymbols ( TreeSet < NonterminalSymbol > notRemoveableNonterminalSymbols ) { this.notRemoveableNonterminalSymbols = notRemoveableNonterminalSymbols; } /** * Sets the start {@link NonterminalSymbol}. * * @param startNonterminalSymbol The start {@link NonterminalSymbol} to set. */ public final void setStartNonterminalSymbol ( NonterminalSymbol startNonterminalSymbol ) { this.startNonterminalSymbol = startNonterminalSymbol; // Set the overwritten style clearOverwrittenStyle ( Style.START_NONTERMINAL_SYMBOL ); if ( this.startNonterminalSymbol != null ) { addOverwrittenStyle ( this.startNonterminalSymbol.getName (), Style.START_NONTERMINAL_SYMBOL ); } } /** * Sets the {@link TerminalSymbolSet}. Every {@link NonterminalSymbol} in the * {@link NonterminalSymbolSet} can not be be in the {@link TerminalSymbolSet} * . * * @param terminalSymbolSet The {@link TerminalSymbolSet} to set. */ public final void setTerminalSymbolSet ( TerminalSymbolSet terminalSymbolSet ) { this.terminalSymbolSet = terminalSymbolSet; } }