public ToolExecutionForm(
      AppContext appContext,
      ToolAdapterOperatorDescriptor descriptor,
      PropertySet propertySet,
      TargetProductSelector targetProductSelector) {
    this.appContext = appContext;
    this.operatorDescriptor = descriptor;
    this.propertySet = propertySet;
    this.targetProductSelector = targetProductSelector;

    // before executing, the sourceProduct and sourceProductFile must be removed from the list,
    // since they cannot be edited
    Property sourceProperty =
        this.propertySet.getProperty(ToolAdapterConstants.TOOL_SOURCE_PRODUCT_FILE);
    if (sourceProperty != null) {
      this.propertySet.removeProperty(sourceProperty);
    }
    sourceProperty = this.propertySet.getProperty(ToolAdapterConstants.TOOL_SOURCE_PRODUCT_ID);
    if (sourceProperty != null) {
      this.propertySet.removeProperty(sourceProperty);
    }
    // if the tool is handling by itself the output product name, then remove targetProductFile from
    // the list,
    // since it may bring only confusion in this case
    if (operatorDescriptor.isHandlingOutputName()) {
      sourceProperty = this.propertySet.getProperty(ToolAdapterConstants.TOOL_TARGET_PRODUCT_FILE);
      if (sourceProperty != null) {
        this.propertySet.removeProperty(sourceProperty);
      }
    }

    // initialise the target product's directory to the working directory
    final TargetProductSelectorModel targetProductSelectorModel = targetProductSelector.getModel();
    targetProductSelectorModel.setProductDir(
        operatorDescriptor.resolveVariables(operatorDescriptor.getWorkingDir()));

    ioParamPanel = createIOParamTab();
    addTab("I/O Parameters", ioParamPanel);
    JPanel processingParamPanel = new JPanel(new SpringLayout());
    checkDisplayOutput = new JCheckBox("Display execution output");
    processingParamPanel.add(checkDisplayOutput);
    processingParamPanel.add(createProcessingParamTab());
    SpringUtilities.makeCompactGrid(processingParamPanel, 2, 1, 2, 2, 2, 2);
    addTab("Processing Parameters", processingParamPanel);
    updateTargetProductFields();
  }