package net.iplantevin.ql.gui.main;
import net.iplantevin.ql.ast.expressions.Expression;
import net.iplantevin.ql.evaluation.EvaluationVisitor;
import net.iplantevin.ql.evaluation.Value;
import net.iplantevin.ql.gui.formcomponents.AbstractFormComponent;
import net.iplantevin.ql.gui.formcomponents.AbstractWidgetContainer;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Set;
/**
* A window for a single form. Builds itself by visiting a given Form.
*
* @author Ivan
*/
public class FormFrame extends JFrame {
private final EvaluationVisitor evaluator;
private final FormEventManager eventManager;
private final int preferredLabelWidth = 500;
private final Dimension preferredWidgetSize = new Dimension(150, 25);
public FormFrame(String title, EvaluationVisitor evaluator,
FormEventManager eventManager) {
setTitle(title);
this.evaluator = evaluator;
this.eventManager = eventManager;
}
/**
* To be called by builder to finalise creation of the frame.
*
* @param topComponent the top most panel containing all form elements.
*/
public void initUI(AbstractFormComponent topComponent,
final GUIController controller) {
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// This disables horizontal scrolling (and sets a width of 850px).
addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
setSize(new Dimension(850, getHeight()));
super.componentResized(e);
}
});
final FormFrame thisFrame = this;
addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
controller.closeForm(thisFrame);
}
});
// Scrolling pane settings.
JScrollPane formScrollPane = new JScrollPane();
formScrollPane.setBorder(new EmptyBorder(new Insets(5, 5, 5, 5)));
formScrollPane.getViewport().add(topComponent);
add(formScrollPane);
pack();
}
public Value evaluate(Expression expression) {
return evaluator.evaluate(expression);
}
public void storeValue(String identifier, Value value) {
evaluator.storeValue(identifier, value);
}
public void subscribe(AbstractFormComponent formComponent, Set<String> ids) {
eventManager.subscribe(formComponent, ids);
}
public void registerValueChange(AbstractWidgetContainer source, Value value) {
eventManager.scheduleEvaluation(source, value);
}
public int getPreferredLabelWidth() {
return preferredLabelWidth;
}
public Dimension getPreferredWidgetSize() {
return preferredWidgetSize;
}
}