docs: public void addListeners()
      {
          super.addListeners();
          
          // Link the screen field to the passed in record
          ((ReferenceField)this.getScreenRecord().getField(MessageInfoScreenRecord.MESSAGE_INFO_ID)).syncReference(this.getHeaderRecord());
          this.getScreenRecord().getField(MessageInfoScreenRecord.MESSAGE_INFO_ID).addListener(new FieldReSelectHandler(this));
          
          this.getMainRecord().addListener(new CompareFileFilter(this.getMainRecord().getField(MessageProcessInfo.MESSAGE_TYPE_ID), this.getScreenRecord().getField(MessageInfoScreenRecord.MESSAGE_TYPE_ID), DBConstants.EQUALS, null, true));
          this.getScreenRecord().getField(MessageInfoScreenRecord.MESSAGE_TYPE_ID).addListener(new FieldReSelectHandler(this));
          this.getMainRecord().addListener(new CompareFileFilter(this.getMainRecord().getField(MessageProcessInfo.PROCESS_TYPE_ID), this.getScreenRecord().getField(MessageInfoScreenRecord.PROCESS_TYPE_ID), DBConstants.EQUALS, null, true));
          this.getScreenRecord().getField(MessageInfoScreenRecord.PROCESS_TYPE_ID).addListener(new FieldReSelectHandler(this));
          
          this.getScreenRecord().getField(MessageInfoScreenRecord.MESSAGE_INFO_TYPE_ID).addListener(new FieldReSelectHandler(this));
          this.getScreenRecord().getField(MessageInfoScreenRecord.CONTACT_TYPE_ID).addListener(new FieldReSelectHandler(this));
          this.getScreenRecord().getField(MessageInfoScreenRecord.REQUEST_TYPE_ID).addListener(new FieldReSelectHandler(this));
          // This is a little inefficient, but this filter is not used much.
          this.getMainRecord().addListener(new FileFilter(null)
          {
              /**
               * Set up/do the remote criteria.
               * @param strbFilter The SQL query string to add to.
               * @param bIncludeFileName Include the file name with this query?
               * @param vParamList The param list to add the raw data to (for prepared statements).
               * @return True if you should not skip this record (does a check on the local data).
               */
              public boolean doLocalCriteria(StringBuffer strbFilter, boolean bIncludeFileName, Vector<BaseField> vParamList)
              {
                  Record recMessageInfoScreenRecord = getScreenRecord();
                  if (recMessageInfoScreenRecord != null)
                      if ((!recMessageInfoScreenRecord.getField(MessageInfoScreenRecord.MESSAGE_INFO_TYPE_ID).isNull())
                          || (!recMessageInfoScreenRecord.getField(MessageInfoScreenRecord.CONTACT_TYPE_ID).isNull())
                          || (!recMessageInfoScreenRecord.getField(MessageInfoScreenRecord.REQUEST_TYPE_ID).isNull()))
                  {
                      // Note I move the MessageInfoField to a temp field since the reference is a header filter.
                              recMessageInfoScreenRecord.getField(MessageInfoScreenRecord.MESSAGE_INFO_COMPARE_ID).moveFieldToThis(this.getOwner().getField(MessageProcessInfo.MESSAGE_INFO_ID));
                              Record recMessageInfo = ((ReferenceField)recMessageInfoScreenRecord.getField(MessageInfoScreenRecord.MESSAGE_INFO_COMPARE_ID)).getReference();
                              if (recMessageInfo != null)
                              {
                                  if (!recMessageInfoScreenRecord.getField(MessageInfoScreenRecord.MESSAGE_INFO_TYPE_ID).isNull())
                                      if (!recMessageInfoScreenRecord.getField(MessageInfoScreenRecord.MESSAGE_INFO_TYPE_ID).equals(recMessageInfo.getField(MessageInfo.MESSAGE_INFO_TYPE_ID)))
                                          return false;
                                  if (!recMessageInfoScreenRecord.getField(MessageInfoScreenRecord.CONTACT_TYPE_ID).isNull())
                                      if (!recMessageInfoScreenRecord.getField(MessageInfoScreenRecord.CONTACT_TYPE_ID).equals(recMessageInfo.getField(MessageInfo.CONTACT_TYPE_ID)))
                                          return false;
                                  if (!recMessageInfoScreenRecord.getField(MessageInfoScreenRecord.REQUEST_TYPE_ID).isNull())
                                      if (!recMessageInfoScreenRecord.getField(MessageInfoScreenRecord.REQUEST_TYPE_ID).equals(recMessageInfo.getField(MessageInfo.REQUEST_TYPE_ID)))
                                          return false;
                              }
                          }
                          return super.doLocalCriteria(strbFilter, bIncludeFileName, vParamList);                
                      }
           
                  });
      }