import Jakarta.SwingUtils.*;
import Jakarta.util.Find;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.LinkedList;
import java.util.Collections;
import java.util.Comparator;
import javax.swing.JFileChooser;
import java.lang.Integer;
import java.io.*;
import java.util.*;
import java.util.regex.*;
import java.lang.*;
public class Gui extends JPanel {
public void initConstants() {}
// declare and initialize atomic components here
JTextField layerName;
JTextField productionName;
JTextField fileName;
JTextField methodSignature;
JRadioButton fileInput;
JRadioButton stdInput;
JCheckBox includeKernel;
JButton generate;
JButton addMethodButton;
JButton removeMethodButton;
JButton openFileButton;
ButtonGroup buttonGroup;
JList methodList;
JFileChooser fileChooser;
JScrollPane scrollPane;
JPanel textInput;
JPanel optionInput;
JPanel methodInput;
JTable parameterTable;
JScrollPane pane;
String inputFileName;
String DefaultFileName = " ";
JPanel parentPanel;
DefaultListModel model;
public Gui() {
generate = new JButton( "Generate!" );
addMethodButton = new JButton( "Add " );
removeMethodButton = new JButton( "Remove " );
removeMethodButton.setEnabled( false );
openFileButton = new JButton( "Browse" );
openFileButton.setToolTipText( "open a file" );
parentPanel = this;
this.setLayout( new BorderLayout() );
layerName = new JTextField( 10 );
layerName.setText( Find.currentDirectory() );
layerName.setBorder( BorderFactory.createTitledBorder( "Layer Name" ) );
productionName = new JTextField( 10 );
productionName.setText( "AST_Program" );
productionName.setBorder( BorderFactory.createTitledBorder( "Name of start Production" ) );
methodSignature = new JTextField( 10 );
methodSignature.setText( "void execute()" );
methodSignature.setBorder( BorderFactory.createTitledBorder( "Method Signature" ) );
fileName = new JTextField( 20 );
fileName.setText( "grammar.b" );
fileName.setBorder( BorderFactory.createTitledBorder( "Name of Class list or Grammar File" ) );
fileInput = new JRadioButton( "include main that uses file input" );
fileInput.setSelected( false );
stdInput = new JRadioButton( "include main that uses std input" );
stdInput.setSelected( false );
includeKernel = new JCheckBox( "include kernel classes" );
includeKernel.setSelected(false);
ButtonGroup buttonGroup = new ButtonGroup();
buttonGroup.add( fileInput );
buttonGroup.add( stdInput );
JPanel fileInputPanel = new JPanel();
fileInputPanel.setBorder( BorderFactory.createEtchedBorder() );
fileInputPanel.setLayout( new BoxLayout( fileInputPanel, BoxLayout.X_AXIS ) );
fileInputPanel.add( fileName );
fileInputPanel.add( openFileButton );
fileChooser = new JFileChooser( ( new File( "." ) ).getPath() );
fileChooser.setFileSelectionMode( JFileChooser.FILES_AND_DIRECTORIES );
model = new DefaultListModel();
methodList = new JList( model );
scrollPane = new JScrollPane( methodList );
methodList.setEnabled( true );
textInput = new JPanel();
textInput.setLayout( new BoxLayout( textInput, BoxLayout.X_AXIS ) );
textInput.add( layerName );
textInput.add( productionName );
optionInput = new JPanel();
optionInput.setBorder( BorderFactory.createEtchedBorder() );
optionInput.setLayout( new BoxLayout( optionInput, BoxLayout.Y_AXIS ) );
optionInput.add( fileInput );
optionInput.add( stdInput );
optionInput.add( includeKernel );
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout( new BoxLayout( buttonPanel, BoxLayout.Y_AXIS ) );
buttonPanel.add( addMethodButton );
buttonPanel.add( removeMethodButton );
JPanel north = new JPanel();
north.setLayout( new BoxLayout( north, BoxLayout.Y_AXIS ) );
north.add( textInput );
north.add( optionInput );
JPanel methodPanel = new JPanel();
methodPanel.setLayout( new BorderLayout() );
methodPanel.add( optionInput, BorderLayout.NORTH );
methodPanel.add( methodSignature, BorderLayout.CENTER );
methodPanel.add( scrollPane, BorderLayout.SOUTH );
JPanel p = new JPanel();
p.setLayout( new BoxLayout( p, BoxLayout.X_AXIS ) );
p.add( methodPanel );
p.add( buttonPanel );
JPanel gPanel = new JPanel();
gPanel.setLayout( new BorderLayout() );
gPanel.add( p, BorderLayout.CENTER );
gPanel.add( generate, BorderLayout.SOUTH );
this.add( north, BorderLayout.NORTH );
this.add( fileInputPanel, BorderLayout.CENTER );
this.add( gPanel, BorderLayout.SOUTH );
initListeners();
}
/**
*Check to see if a method signature is syntactly correct
* @layer<GramGui>
*/
private boolean validMethod( String method ) {
String methodRegex = "\\s*([a-zA-Z][.a-zA-Z]*\\s+){0,1}" //return type
+ "\\s*[$_a-zA-Z][$_a-zA-Z0-9]*\\s*" //method name
+ "\\(\\s*([a-zA-Z][.a-zA-Z]*\\s+" //type
+"[$_a-zA-Z][$_a-zA-Z0-9]*\\s*" // variable
+"(\\s*,\\s*[a-zA-Z][.a-zA-Z]*\\s+[$_a-zA-Z][$_a-zA-Z0-9]*)*){0,1}\\s*\\)\\s*";
java.util.regex.Pattern p = java.util.regex.Pattern.compile( methodRegex );
Matcher m = p.matcher( method );
if( m.matches() )
return true;
else
return false;
}
// initialize listeners here
public void initListeners() {
generate.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
Arguments args = new Arguments();
args.setLayer( layerName.getText() );
args.setStart( productionName.getText() );
String s = fileName.getText();
File checkFile = new File( s );
if( !checkFile.exists() ) {
JOptionPane.showMessageDialog( null, "Error: " + s
+ " can not be found" );
return;
}
if( s.endsWith( ".b" ) ) {
args.setBaliFile( s );
}
else {
args.setClassFile( s );
}
if ( fileInput.isSelected() ) {
args.setFileInput( true );
args.setOutputMain( true );
}
if ( stdInput.isSelected() ) {
args.setStdInput( true );
args.setOutputMain( true );
}
int m = model.getSize();
if ( m > 0 ) {
for( int i = 0; i < m; i++ ) {
String method = ( String ) methodList.getModel().getElementAt( i );
args.addMethod( method );
//System.out.println(method);
}
}
// generate Ast files, if necessary
try {
if (includeKernel.isSelected() && m>0)
generateAstNodeFiles( m );
}
catch ( Exception ex ) {
System.err.println( ex.getMessage() );
System.exit( 1 );
}
try {
args.collectClass();
}
catch ( Throwable t ) {
System.err.println( t.getMessage() );
System.exit( 1 );
}
Main instance = new Main() ;
instance.generateObject( args ) ;
JOptionPane.showMessageDialog( null, "code templates generated" );
System.exit( 1 );
}
} );
addMethodButton.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
String s = methodSignature.getText().trim();
boolean duplicate = false;
if( !validMethod( s ) ) {
JOptionPane.showMessageDialog( null, "Incorrect syntax for method: " + s );
return;
}
if ( s.equals( "" ) ) {
Toolkit.getDefaultToolkit().beep();
return;
}
int index = methodList.getSelectedIndex();
int size = model.getSize();
if( size == 0 ) {
removeMethodButton.setEnabled( true );
}
for( int i = 0; i < model.getSize(); i++ ) {
if( s.equals( methodList.getModel().getElementAt( i ) ) )
duplicate = true;
}
if( !duplicate ) {
if ( index == -1 || ( index+1 == size ) ) {
model.addElement( s );
}
else {
model.insertElementAt( s, index+1 );
}
methodSignature.setText( null );
}
}
} );
removeMethodButton.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
int index = methodList.getSelectedIndex();
model.remove( index );
int size = model.getSize();
if ( size == 0 ) {
removeMethodButton.setEnabled( false );
}
else {
if ( index == model.getSize() ) //removed item in last position
index--;
}
}
} );
openFileButton.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e )
{
int returnVal=0;
returnVal = fileChooser.showOpenDialog( parentPanel );
if ( returnVal == JFileChooser.APPROVE_OPTION )
{
File Inputfile = fileChooser.getSelectedFile();
String Name = Inputfile.getName();
if ( Name.equals( DefaultFileName ) || Name.equals( "" ) ) {
// if the chosen name is the default you have to change it
JOptionPane.showMessageDialog( null, "Wrong File Name ","Error!", JOptionPane.ERROR_MESSAGE );
}
inputFileName = Inputfile.getPath();
fileName.setText( inputFileName );
}
} // of action Performed
} );
}
public void valueChanged( ListSelectionEvent e ) {
if ( e.getValueIsAdjusting() == false ) {
if ( methodList.getSelectedIndex() == -1 ) {
//No selection, disable fire button.
removeMethodButton.setEnabled( false );
methodSignature.setText( "" );
}
else {
//Selection, update text field.
removeMethodButton.setEnabled( true );
String name = methodList.getSelectedValue().toString();
methodSignature.setText( name );
}
}
}
private void generateAstNodeFiles( int n ) throws Exception {
String name, type, parms, args;
PrintStream ps;
String[] m;
int i;
Arguments dummy = new Arguments();
// create AstNode.jak
ps = new PrintStream(new FileOutputStream( "AstNode.jak"));
ps.println("refines class AstNode {");
for( i = 0; i < n; i++ ) {
String method = ( String ) methodList.getModel().getElementAt( i );
m = dummy.decompose(method, null);
type = m[0] + " ";
name = m[1];
args = "(" + m[2] + ")";
parms = "(" + m[3] + ")";
ps.println(" public "+method+" { ");
ps.println(" int i;");
ps.println(" if (arg == null)");
ps.println(" return;");
ps.println(" for (i=0; i<arg.length; i++)");
ps.println(" if (arg[i]!=null)");
ps.println(" arg[i]."+name+parms+";");
ps.println(" }");
}
ps.println("}");
ps.close();
// create AstList.jak
ps = new PrintStream(new FileOutputStream( "AstList.jak"));
ps.println("refines class AstList {");
for( i = 0; i < n; i++ ) {
String method = ( String ) methodList.getModel().getElementAt( i );
m = dummy.decompose(method, null);
type = m[0] + " ";
name = m[1];
args = "(" + m[2] + ")";
parms = "(" + m[3] + ")";
ps.println(" public "+method+ " {");
ps.println(" AstNode l;");
ps.println(" if (arg[0]==null) return;");
ps.println(" for (l = arg[0]; l!=null; l = l.right) {");
ps.println(" if (l.arg[0] == null) ");
ps.println(" continue;");
ps.println(" l.arg[0]."+name+parms+";");
ps.println(" }");
ps.println(" }");
}
ps.println("}");
ps.close();
// create AstListNode.jak
ps = new PrintStream(new FileOutputStream( "AstListNode.jak"));
ps.println("refines class AstListNode {");
for( i = 0; i < n; i++ ) {
String method = ( String ) methodList.getModel().getElementAt( i );
m = dummy.decompose(method, null);
type = m[0] + " ";
name = m[1];
args = "(" + m[2] + ")";
parms = "(" + m[3] + ")";
ps.println(" public " + method + " { ");
ps.println(" Util.fatalError(\"AstListNode."
+ name+"() method should not be called\");");
ps.println(" }");
}
ps.println("}");
ps.close();
// create AstOptNode.jak
ps = new PrintStream(new FileOutputStream( "AstOptNode.jak"));
ps.println("refines class AstOptNode {");
for( i = 0; i < n; i++ ) {
String method = ( String ) methodList.getModel().getElementAt( i );
m = dummy.decompose(method, null);
type = m[0] + " ";
name = m[1];
args = "(" + m[2] + ")";
parms = "(" + m[3] + ")";
ps.println(" public "+method+" {");
ps.println(" if (arg[0]!=null)");
ps.println(" arg[0]."+name+parms+";");
ps.println(" }");
}
ps.println("}");
ps.close();
}
}