public CallMethodWidget(
      String factName,
      ScenarioParentWidget parent,
      Scenario scenario,
      CallMethod mCall,
      ExecutionTrace executionTrace,
      PackageDataModelOracle dmo) {
    super();
    this.factName = factName;
    this.parent = parent;
    this.scenario = scenario;
    this.mCall = mCall;
    this.executionTrace = executionTrace;
    this.dmo = dmo;

    this.layout = new DirtyableFlexTable();

    layout.setStyleName("model-builderInner-Background"); // NON-NLS

    if (dmo.isGlobalVariable(mCall.getVariable())) {

      List<MethodInfo> infos = dmo.getMethodInfosForGlobalVariable(mCall.getVariable());
      this.fieldCompletionTexts = new String[infos.size()];
      this.fieldCompletionValues = new String[infos.size()];
      int i = 0;
      for (MethodInfo info : infos) {
        this.fieldCompletionTexts[i] = info.getName();
        this.fieldCompletionValues[i] = info.getNameWithParameters();
        i++;
      }

      this.variableClass = (String) dmo.getGlobalVariable(mCall.getVariable());
    } else {
      FactData pattern = (FactData) scenario.getFactTypes().get(mCall.getVariable());
      if (pattern != null) {
        List<String> methodList = dmo.getMethodNames(pattern.getType());
        fieldCompletionTexts = new String[methodList.size()];
        fieldCompletionValues = new String[methodList.size()];
        int i = 0;
        for (String methodName : methodList) {
          fieldCompletionTexts[i] = methodName;
          fieldCompletionValues[i] = methodName;
          i++;
        }
        this.variableClass = pattern.getType();
        this.isBoundFact = true;
      }
    }

    doLayout();
    initWidget(this.layout);
  }
  public CallMethodWidget(
      final String factName,
      final ScenarioParentWidget parent,
      final Scenario scenario,
      final CallMethod mCall,
      final ExecutionTrace executionTrace,
      final AsyncPackageDataModelOracle oracle) {
    super();
    this.factName = factName;
    this.parent = parent;
    this.scenario = scenario;
    this.mCall = mCall;
    this.executionTrace = executionTrace;
    this.oracle = oracle;

    this.layout = new DirtyableFlexTable();

    layout.setStyleName("model-builderInner-Background"); // NON-NLS

    if (this.oracle.isGlobalVariable(mCall.getVariable())) {

      this.oracle.getMethodInfosForGlobalVariable(
          mCall.getVariable(),
          new Callback<List<MethodInfo>>() {
            @Override
            public void callback(final List<MethodInfo> infos) {
              CallMethodWidget.this.fieldCompletionTexts = new String[infos.size()];
              CallMethodWidget.this.fieldCompletionValues = new String[infos.size()];
              int i = 0;
              for (MethodInfo info : infos) {
                CallMethodWidget.this.fieldCompletionTexts[i] = info.getName();
                CallMethodWidget.this.fieldCompletionValues[i] = info.getNameWithParameters();
                i++;
              }

              CallMethodWidget.this.variableClass =
                  (String) CallMethodWidget.this.oracle.getGlobalVariable(mCall.getVariable());
            }
          });
    } else {

      final FactData pattern = (FactData) scenario.getFactTypes().get(mCall.getVariable());
      if (pattern != null) {
        this.oracle.getMethodInfos(
            pattern.getType(),
            new Callback<List<MethodInfo>>() {
              @Override
              public void callback(final List<MethodInfo> methodInfos) {
                CallMethodWidget.this.fieldCompletionTexts = new String[methodInfos.size()];
                CallMethodWidget.this.fieldCompletionValues = new String[methodInfos.size()];
                int i = 0;
                for (MethodInfo methodInfo : methodInfos) {
                  CallMethodWidget.this.fieldCompletionTexts[i] = methodInfo.getName();
                  CallMethodWidget.this.fieldCompletionValues[i] =
                      methodInfo.getNameWithParameters();
                  i++;
                }
                CallMethodWidget.this.variableClass = pattern.getType();
                CallMethodWidget.this.isBoundFact = true;
              }
            });
      }
    }

    doLayout();
    initWidget(this.layout);
  }