docs: public ScreenComponent setupTableLookup(ScreenLoc itsLocation, ComponentParent targetScreen, Convert converter, int iDisplayFieldDesc, Rec record, String keyAreaName, Converter fldDisplayFieldDesc, boolean bIncludeBlankOption, boolean bIncludeFormButton)
      {
          ScreenComponent screenField = null;
          if ((!(this instanceof ReferenceField)) && (!(this instanceof CounterField)))
              Debug.doAssert(false);    // error, wrong field type
          Converter conv = null;
          if (keyAreaName != null)
          { // Set up the listener to read the record using the code key (optional)
              BaseField fldKey = ((Record)record).getKeyArea(keyAreaName).getField(DBConstants.MAIN_KEY_FIELD);    // Code
              if (this.getRecord().getRecordOwner() instanceof ComponentParent)
                  if (!((ComponentParent)this.getRecord().getRecordOwner()).isPrintReport())
              {   // Only need the read behavior if this is an input field
                  ((Record)record).setKeyArea(keyAreaName);
                  MainReadOnlyHandler behavior = new MainReadOnlyHandler(keyAreaName);
                  fldKey.addListener(behavior);
              }
              if (iDisplayFieldDesc != ScreenConstants.DONT_DISPLAY_DESC)
                  conv = new FieldDescConverter(fldKey, (Converter)converter); // Use the description for this field
              else
                  conv = fldKey;
              screenField = conv.setupDefaultView(itsLocation, targetScreen, iDisplayFieldDesc);
  //            screenField = new SEditText(itsLocation, targetScreen, conv, iDisplayFieldDesc);
              itsLocation = null;
              iDisplayFieldDesc = ScreenConstants.DONT_DISPLAY_DESC;      // Display it only once
          }
          // Set up to display the record description
          if (fldDisplayFieldDesc != null)
          {
              if ((conv == null) && (iDisplayFieldDesc != ScreenConstants.DONT_DISPLAY_DESC))
                  conv = new FieldDescConverter(fldDisplayFieldDesc, (Converter)converter);  // Use the description for this field
              else
                  conv = fldDisplayFieldDesc;
          }
          if (conv != null)
          {
              if (itsLocation == null)
                  itsLocation = targetScreen.getNextLocation(ScreenConstants.RIGHT_OF_LAST, ScreenConstants.DONT_SET_ANCHOR);
              ScreenComponent sfDesc = conv.setupDefaultView(itsLocation, targetScreen, iDisplayFieldDesc);
  //            ScreenField sfDesc = new SEditText(itsLocation, targetScreen, conv, iDisplayFieldDesc);
              sfDesc.setEnabled(false);
          }
          // Add the lookup button and form (opt) button (Even though SSelectBoxes don't use converter, pass it, so field.enable(true), etc will work)
          Map<String,Object> properties = new HashMap<String,Object>();
          properties.put(ScreenModel.RECORD, record);
          properties.put(ScreenModel.COMMAND, ThinMenuConstants.LOOKUP);
          properties.put(ScreenModel.IMAGE, ThinMenuConstants.LOOKUP);
          screenField = createScreenComponent(ScreenModel.CANNED_BOX, targetScreen.getNextLocation(ScreenConstants.RIGHT_OF_LAST, ScreenConstants.DONT_SET_ANCHOR), targetScreen, converter, ScreenConstants.DONT_DISPLAY_FIELD_DESC, properties);
          if (bIncludeFormButton)
              if (!(targetScreen instanceof GridScreenParent))
          {
              properties = new HashMap<String,Object>();
              properties.put(ScreenModel.RECORD, record);
              properties.put(ScreenModel.COMMAND, ThinMenuConstants.FORM);
              properties.put(ScreenModel.IMAGE, ThinMenuConstants.FORM);
              screenField = createScreenComponent(ScreenModel.CANNED_BOX, targetScreen.getNextLocation(ScreenConstants.RIGHT_OF_LAST, ScreenConstants.DONT_SET_ANCHOR), targetScreen, converter, ScreenConstants.DONT_DISPLAY_FIELD_DESC, properties);
          }
          if ((bIncludeBlankOption) || (keyAreaName == null))     // If there is no code field, the only way to blank a field is to click this button
              if (!(targetScreen instanceof GridScreenParent))
          {
              properties = new HashMap<String,Object>();
              properties.put(ScreenModel.FIELD, this);
              properties.put(ScreenModel.COMMAND, ScreenModel.CLEAR);
              properties.put(ScreenModel.IMAGE, ScreenModel.CLEAR);
              screenField = createScreenComponent(ScreenModel.CANNED_BOX, targetScreen.getNextLocation(ScreenConstants.RIGHT_OF_LAST, ScreenConstants.DONT_SET_ANCHOR), targetScreen, converter, ScreenConstants.DONT_DISPLAY_FIELD_DESC, properties);
          }
  
  //x can't yet - what if someone wants access to a field.        record.selectScreenFields();    // Only select fields that you will display
  
          boolean bUpdateRecord = false;
          if ((record.getDatabaseType() & (DBConstants.REMOTE | DBConstants.USER_DATA)) == (DBConstants.REMOTE | DBConstants.USER_DATA))
              bUpdateRecord = true;
          //  Set up the listener to read the current record on a valid main record
          ReadSecondaryHandler behavior = new ReadSecondaryHandler((Record)record, null, DBConstants.CLOSE_ON_FREE, bUpdateRecord, bIncludeBlankOption);
          this.addListener(behavior);
          if (((Record)record).getRecordOwner() != targetScreen)
              if (this.getRecord().getRecordOwner() != targetScreen)
                  if (this.getRecord().getRecordOwner() != targetScreen.getParentScreen())
                      if (targetScreen.getMainRecord() != null)
                          ((Record)targetScreen.getMainRecord()).addListener(new FileRemoveBOnCloseHandler(behavior)); // Being very careful (remove this behavior when screen closes)
  
          return screenField;
      }