@Override
  public StyledString getStyledText(Object element) {
    if (element instanceof AddNewFunctionModel) {
      return new StyledString("Add new function", StyledString.COUNTER_STYLER);
    } else if (element instanceof SetFunctionModel) {
      return new StyledString("Set function", StyledString.COUNTER_STYLER);
    } else if (element instanceof FunctionModel) {
      FunctionModel functionModel = (FunctionModel) element;
      IFunction function = functionModel.getFunction();
      if (function instanceof JexlExpressionFunction) {
        return getJexlStyledText((JexlExpressionFunction) function);
      } else {
        return new StyledString(function.getName());
      }
    } else if (element instanceof OperatorModel) {
      OperatorModel operatorModel = (OperatorModel) element;
      IOperator operator = operatorModel.getOperator();
      return new StyledString(operator.getName());
    } else if (element instanceof ParameterModel) {
      ParameterModel parameterModel = (ParameterModel) element;
      return new StyledString(parameterModel.getParameter().getName());
    }

    return new StyledString("");
  }
  @Override
  public void updateParameters() {
    params.clear();
    for (int i = 0; i < 2; i++) {
      IFunction f = getFunction(i);
      if (f == null) continue;
      for (int j = 0, jmax = f.getNoOfParameters(); j < jmax; j++) {
        IParameter p = f.getParameter(j);
        boolean add = true;
        for (IParameter param : params) {
          if (p == param) {
            add = false;
            break;
          }
        }
        if (add) {
          params.add(p);
        }
      }
    }
    setDirty(true);

    if (parent != null) {
      parent.updateParameters();
    }
  }
  @Override
  public String toString() {
    StringBuffer out = new StringBuffer();
    if (fa != null) {
      out.append(String.format("Function 0 - \n"));
      out.append(fa.toString());
      out.append('\n');
    }
    if (fb != null) {
      out.append(String.format("Function 1 - \n"));
      out.append(fb.toString());
      out.append('\n');
    }

    return out.length() == 0 ? OPERATOR_NO_FUNCTIONS : out.substring(0, out.length() - 1);
  }
 @Override
 public void removeFunction(int index) {
   switch (index) {
     case 0:
       fa.setParentOperator(null);
       fa = fb;
       fb = null;
       break;
     case 1:
       fb.setParentOperator(null);
       fb = null;
       break;
     default:
       throw new IndexOutOfBoundsException("Can not remove this index as it is not 0 or 1");
   }
   updateParameters();
 }
 @Override
 public void setFunction(int index, IFunction function) {
   switch (index) {
     case 0:
       fa = function;
       break;
     case 1:
       fb = function;
       break;
     default:
       throw new IndexOutOfBoundsException("Can not set this index as it is not 0 or 1");
   }
   if (function != null) function.setParentOperator(this);
   updateParameters();
 }