private void init() {
    input = new JTextField[nInputs];

    double[] rowWeights =
        new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
    rowWeights[nInputs + 2] = 1.0;

    GridBagLayout gbl_functionPanel = new GridBagLayout();
    gbl_functionPanel.columnWidths = new int[] {5, 0, 50, 50, 30, 25, 5, 0};
    gbl_functionPanel.rowHeights = new int[] {10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10};
    gbl_functionPanel.columnWeights =
        new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
    gbl_functionPanel.rowWeights = rowWeights;
    this.setLayout(gbl_functionPanel);

    // Function input field.
    for (int i = 0; i < nInputs; i++) {
      // Creation.
      input[i] = new JTextField();
      GridBagConstraints gbc_stdFuncInput = new GridBagConstraints();
      gbc_stdFuncInput.gridwidth = 4;
      gbc_stdFuncInput.insets = new Insets(0, 0, 5, 5);
      gbc_stdFuncInput.fill = GridBagConstraints.HORIZONTAL;
      gbc_stdFuncInput.anchor = GridBagConstraints.NORTH;
      gbc_stdFuncInput.gridx = 2;
      gbc_stdFuncInput.gridy = i + 1;

      // Setup.
      GuiUtil.setupUndoListener(input[i]);
      setupInputListeners(input[i]);
      this.add(input[i], gbc_stdFuncInput);
    }

    // Labels for the input fields
    String[] labelNames = labelNames();
    for (int i = 0; i < labelNames.length; i++) {
      GridBagConstraints gbc_FuncLabel = new GridBagConstraints();
      gbc_FuncLabel.gridwidth = 1;
      gbc_FuncLabel.insets = new Insets(0, 0, 5, 5);
      gbc_FuncLabel.fill = GridBagConstraints.HORIZONTAL;
      gbc_FuncLabel.anchor = GridBagConstraints.CENTER;
      gbc_FuncLabel.gridx = 1;
      gbc_FuncLabel.gridy = i + 1;

      JLabel label = new JLabel(labelNames[i]);
      this.add(label, gbc_FuncLabel);
    }

    // OptionPanel.
    mainOP = new JPanel();
    mainOP.setBorder(BorderFactory.createEtchedBorder());
    GridBagConstraints gbc_mainOP = new GridBagConstraints();
    gbc_mainOP.fill = GridBagConstraints.BOTH;
    gbc_mainOP.gridwidth = 5;
    gbc_mainOP.insets = new Insets(0, 0, 5, 5);
    gbc_mainOP.gridx = 1;
    gbc_mainOP.gridy = nInputs + 1;
    this.add(mainOP, gbc_mainOP);

    gridOP = getGridOptionPanel();
    gridOP.addFunctionListener(createGridOptionPanelListener());
    apperanceOP = new AppearanceOptionPanel(colorList, map);
    mainOP.setLayout(new BoxLayout(mainOP, BoxLayout.Y_AXIS));
    mainOP.add((Component) gridOP);
    mainOP.add(apperanceOP);

    // The standard function list
    outerFuncTab = new JPanel();
    funcPanelWrapper = new JScrollPane(outerFuncTab);
    funcPanelWrapper.setBorder(BorderFactory.createEtchedBorder());
    funcPanelWrapper.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    funcPanelWrapper.setMinimumSize(new Dimension(310, 500));
    GridBagConstraints gbc_funcPanelWrapper = new GridBagConstraints();
    gbc_funcPanelWrapper.fill = GridBagConstraints.BOTH;
    gbc_funcPanelWrapper.gridwidth = 5;
    gbc_funcPanelWrapper.insets = new Insets(0, 0, 5, 5);
    gbc_funcPanelWrapper.gridx = 1;
    gbc_funcPanelWrapper.gridy = nInputs + 2;
    ;
    this.add(funcPanelWrapper, gbc_funcPanelWrapper);

    GridBagLayout gbl_stdFuncPanel = new GridBagLayout();
    gbl_stdFuncPanel.columnWidths = new int[] {0, 0};
    gbl_stdFuncPanel.rowHeights = new int[] {0, 0};
    gbl_stdFuncPanel.columnWeights = new double[] {1.0, Double.MIN_VALUE};
    gbl_stdFuncPanel.rowWeights = new double[] {1.0, Double.MIN_VALUE};
    outerFuncTab.setLayout(gbl_stdFuncPanel);

    innerFuncTab = new JPanel();
    GridBagConstraints gbc_innerFuncPanel = new GridBagConstraints();
    gbc_innerFuncPanel.anchor = GridBagConstraints.NORTH;
    gbc_innerFuncPanel.fill = GridBagConstraints.HORIZONTAL;
    gbc_innerFuncPanel.gridx = 0;
    gbc_innerFuncPanel.gridy = 0;
    outerFuncTab.add(innerFuncTab, gbc_innerFuncPanel);
    innerFuncTab.setLayout(new BoxLayout(innerFuncTab, BoxLayout.Y_AXIS));
  }
 public void updateReferences(Function f) throws IllegalExpressionException {
   gridOP.updateFuncReference(f);
   apperanceOP.updateFuncReference(f);
 }