import javax.swing.*;
import java.awt.*;
import Jakarta.util.*;
import java.awt.event.*;
import java.math.BigInteger;
import java.util.*;
class production {
private static boolean toplevel = true;
public JComponent draw (int several) {
pattern p;
// Step 1: create vertical panel and add patterns
JPanel panel = new JPanel();
panel.setLayout( new BoxLayout(panel, BoxLayout.Y_AXIS) );
int size = pat.size();
Iterator i = pat.iterator();
boolean flag = false;//indicates whether we've started a new tab this time
if (toplevel || var.tab){//either top level or annotation
panel = new JPanel();
panel.setLayout( new BoxLayout(panel, BoxLayout.Y_AXIS) );
panel.setVisible(true);
Gui.tabs.insertTab(var.disp, null, panel, "See " + var.disp, Gui.tabs.getTabCount());
toplevel = false;
flag = true;
}
if (size==1) {//consists of only one pattern
p = (pattern) i.next();
boolean ntd = p.hasNonOpt();
if (several == 1 && ntd){//if optional parent has non-optional child
JPanel row = new JPanel();
row.setLayout( new FlowLayout(FlowLayout.LEFT) );
JCheckBox cb = new JCheckBox(p.var.disp);
// JCheckBox cb = new JCheckBox("ADD:");
cb.setToolTipText("Optional");
row.add(cb);
p.setWidget(cb);
row.add( p.draw(several) );
panel.add( row);
}
else
panel.add(p.draw(several));
}
else {
int min = 0, max = 0;
if (several == 1){
min = 0; max = 1;
} else if (several == 2){
min = 1; max = 100;
} else if (several == 0){
min = 1; max = 1;
}
GroupButtons gp = new GroupButtons(min, max);//form a group of buttons
while ( i.hasNext() ) {//iterate through the patterns
p = (pattern) i.next();
JPanel row = new JPanel();
row.setLayout( new FlowLayout(FlowLayout.LEFT) );
AbstractButton ab;
if (several == 1 || several == 2){ //optional production, or plus production
JCheckBox cb = new JCheckBox(p.var.disp);
row.add(cb);
gp.addToGroup(cb);
ab = cb;
if(several == 2) //plus
ab.setToolTipText("Select at least one from this group");
if (several == 1)//opt
ab.setToolTipText("Optional");
}
else if (several == 3){//star production
JCheckBox cb = new JCheckBox(p.var.disp);
row.add(cb);
ab = cb;
ab.setToolTipText("Select zero or more from this group");
}
else{
JRadioButton jb = new JRadioButton(p.var.disp);
row.add( jb );
gp.addToGroup(jb);
jb.setToolTipText("Select exactly one from this group");
ab = jb;
}
p.setWidget(ab);
row.add( p.draw(several) );//call the draw method of whatever the pattern points to
panel.add( row);// add the entire thing to the panel
}
}
if (flag){//if tab were inserted at this step
//add a button to lead over to the next tab
JButton seeNext = new JButton("See next: " + var.disp);
final JPanel thisone = panel;
seeNext.addMouseListener(new MouseListener(){
public void mouseReleased(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mousePressed(MouseEvent e){}
public void mouseClicked(MouseEvent e){
Gui.tabs.setSelectedComponent(thisone);}
public void mouseEntered(MouseEvent e){}
});
seeNext.setToolTipText("Proceed for more selections");
return seeNext;
}
// Step 2: add title
if (var == null)
Util.fatalError( "var is null " + name );
panel.setBorder( BorderFactory.createTitledBorder(var.disp) );
return panel;
}
}