package de.unisiegen.gtitool.ui.logic;
import java.util.TreeSet;
import javax.swing.JFrame;
import de.unisiegen.gtitool.core.entities.NonterminalSymbol;
import de.unisiegen.gtitool.core.entities.NonterminalSymbolSet;
import de.unisiegen.gtitool.core.entities.Symbol;
import de.unisiegen.gtitool.core.entities.TerminalSymbol;
import de.unisiegen.gtitool.core.entities.TerminalSymbolSet;
import de.unisiegen.gtitool.core.exceptions.nonterminalsymbolset.NonterminalSymbolSetException;
import de.unisiegen.gtitool.core.exceptions.terminalsymbolset.TerminalSymbolSetException;
import de.unisiegen.gtitool.core.grammars.Grammar;
import de.unisiegen.gtitool.ui.logic.interfaces.LogicClass;
import de.unisiegen.gtitool.ui.netbeans.TerminalDialogForm;
import de.unisiegen.gtitool.ui.redoundo.GrammarSymbolsChangedItem;
import de.unisiegen.gtitool.ui.style.listener.ParseableChangedListener;
/**
* The logic class for the create new transition dialog.
*
* @author Benjamin Mies
* @author Christian Fehler
* @version $Id$
*/
public final class TerminalDialog implements LogicClass < TerminalDialogForm >
{
/**
* The {@link Grammar} of this dialog.
*/
private Grammar grammar;
/**
* The {@link TerminalDialogForm}.
*/
private TerminalDialogForm gui;
/**
* The parent {@link JFrame}.
*/
private JFrame parent;
/**
* The {@link GrammarPanel}.
*/
private GrammarPanel grammarPanel;
/**
* Create a new {@link TerminalDialog}
*
* @param parent The parent frame.
* @param grammarPanel The {@link GrammarPanel}.
* @param grammar The {@link Grammar} of this dialog.
*/
public TerminalDialog ( JFrame parent, GrammarPanel grammarPanel,
Grammar grammar )
{
this.parent = parent;
this.grammarPanel = grammarPanel;
this.grammar = grammar;
this.gui = new TerminalDialogForm ( this, parent );
this.gui.terminalPanelForm.setTerminalSymbolSet ( this.grammar
.getTerminalSymbolSet () );
this.gui.terminalPanelForm.setNonterminalSymbolSet ( this.grammar
.getNonterminalSymbolSet () );
this.gui.terminalPanelForm.styledNonterminalSymbolSetParserPanel
.setNotRemoveableNonterminalSymbols ( this.grammar
.getNotRemoveableNonterminalSymbolsFromNonterminalSymbol () );
this.gui.terminalPanelForm.styledTerminalSymbolSetParserPanel
.setNotRemoveableTerminalSymbols ( this.grammar
.getNotRemoveableTerminalSymbolsFromTerminalSymbol () );
this.gui.terminalPanelForm.styledStartNonterminalSymbolParserPanel
.setText ( this.grammar.getStartSymbol () );
this.gui.terminalPanelForm.styledTerminalSymbolSetParserPanel
.addParseableChangedListener ( new ParseableChangedListener < TerminalSymbolSet > ()
{
public void parseableChanged (
@SuppressWarnings ( "unused" ) TerminalSymbolSet newTerminalSymbolSet )
{
setButtonStatus ();
}
} );
this.gui.terminalPanelForm.styledNonterminalSymbolSetParserPanel
.addParseableChangedListener ( new ParseableChangedListener < NonterminalSymbolSet > ()
{
public void parseableChanged (
@SuppressWarnings ( "unused" ) NonterminalSymbolSet newNonterminalSymbolSet )
{
setButtonStatus ();
}
} );
this.gui.terminalPanelForm.styledStartNonterminalSymbolParserPanel
.addParseableChangedListener ( new ParseableChangedListener < NonterminalSymbol > ()
{
public void parseableChanged (
@SuppressWarnings ( "unused" ) NonterminalSymbol newNonterminalSymbol )
{
setButtonStatus ();
}
} );
}
/**
* {@inheritDoc}
*
* @see LogicClass#getGUI()
*/
public final TerminalDialogForm getGUI ()
{
return this.gui;
}
/**
* Handles cancel button pressed.
*/
public final void handleCancel ()
{
this.gui.dispose ();
}
/**
* Handle ok button pressed.
*/
public final void handleOk ()
{
this.gui.setVisible ( false );
if ( !this.grammar.getNonterminalSymbolSet ().equals (
this.gui.terminalPanelForm.styledNonterminalSymbolSetParserPanel
.getParsedObject () )
|| !this.grammar.getTerminalSymbolSet ().equals (
this.gui.terminalPanelForm.styledTerminalSymbolSetParserPanel
.getParsedObject () )
|| !this.grammar.getStartSymbol ().equals (
this.gui.terminalPanelForm.styledStartNonterminalSymbolParserPanel
.getParsedObject () ) )
{
this.grammarPanel
.getRedoUndoHandler ()
.addItem (
new GrammarSymbolsChangedItem (
this.grammar,
this.gui.terminalPanelForm.styledNonterminalSymbolSetParserPanel
.getParsedObject (),
this.gui.terminalPanelForm.styledTerminalSymbolSetParserPanel
.getParsedObject (),
this.grammar.getStartSymbol (),
this.gui.terminalPanelForm.styledStartNonterminalSymbolParserPanel
.getParsedObject () ) );
}
performNonterminalSymbolChange ( this.grammar.getNonterminalSymbolSet (),
this.gui.terminalPanelForm.styledNonterminalSymbolSetParserPanel
.getParsedObject () );
performTerminalSymbolChange ( this.grammar.getTerminalSymbolSet (),
this.gui.terminalPanelForm.styledTerminalSymbolSetParserPanel
.getParsedObject () );
this.grammar
.setStartSymbol ( this.gui.terminalPanelForm.styledStartNonterminalSymbolParserPanel
.getParsedObject () );
this.gui.dispose ();
}
/**
* Preforms the {@link Symbol} change.
*
* @param oldNonterminalSymbols The old {@link NonterminalSymbolSet}.
* @param newNonterminalSymbols The new {@link NonterminalSymbolSet}.
*/
private final void performNonterminalSymbolChange (
NonterminalSymbolSet oldNonterminalSymbols,
NonterminalSymbolSet newNonterminalSymbols )
{
TreeSet < NonterminalSymbol > symbolsToAdd = new TreeSet < NonterminalSymbol > ();
TreeSet < NonterminalSymbol > symbolsToRemove = new TreeSet < NonterminalSymbol > ();
for ( NonterminalSymbol current : newNonterminalSymbols )
{
if ( !oldNonterminalSymbols.contains ( current ) )
{
symbolsToAdd.add ( current );
}
}
for ( NonterminalSymbol current : oldNonterminalSymbols )
{
if ( !newNonterminalSymbols.contains ( current ) )
{
symbolsToRemove.add ( current );
}
}
try
{
oldNonterminalSymbols.add ( symbolsToAdd );
oldNonterminalSymbols.remove ( symbolsToRemove );
}
catch ( NonterminalSymbolSetException exc )
{
exc.printStackTrace ();
System.exit ( 1 );
}
}
/**
* Performs the {@link Symbol} change.
*
* @param oldTerminalSymbols The old {@link TerminalSymbolSet}.
* @param newTerminalSymbols The new {@link TerminalSymbolSet}.
*/
private final void performTerminalSymbolChange (
TerminalSymbolSet oldTerminalSymbols, TerminalSymbolSet newTerminalSymbols )
{
TreeSet < TerminalSymbol > symbolsToAdd = new TreeSet < TerminalSymbol > ();
TreeSet < TerminalSymbol > symbolsToRemove = new TreeSet < TerminalSymbol > ();
for ( TerminalSymbol current : newTerminalSymbols )
{
if ( !oldTerminalSymbols.contains ( current ) )
{
symbolsToAdd.add ( current );
}
}
for ( TerminalSymbol current : oldTerminalSymbols )
{
if ( !newTerminalSymbols.contains ( current ) )
{
symbolsToRemove.add ( current );
}
}
try
{
oldTerminalSymbols.add ( symbolsToAdd );
oldTerminalSymbols.remove ( symbolsToRemove );
}
catch ( TerminalSymbolSetException exc )
{
exc.printStackTrace ();
}
}
/**
* Sets the status of the buttons.
*/
public final void setButtonStatus ()
{
if ( ( this.gui.terminalPanelForm.styledTerminalSymbolSetParserPanel
.getParsedObject () == null )
|| ( this.gui.terminalPanelForm.styledNonterminalSymbolSetParserPanel
.getParsedObject () == null ) )
{
this.gui.jGTIButtonOk.setEnabled ( false );
}
else
{
this.gui.jGTIButtonOk.setEnabled ( true );
}
}
/**
* Show the dialog for creating a new transition
*/
public final void show ()
{
int x = this.parent.getBounds ().x + ( this.parent.getWidth () / 2 )
- ( this.gui.getWidth () / 2 );
int y = this.parent.getBounds ().y + ( this.parent.getHeight () / 2 )
- ( this.gui.getHeight () / 2 );
this.gui.setBounds ( x, y, this.gui.getWidth (), this.gui.getHeight () );
this.gui.setVisible ( true );
}
}