docs: public int fieldChanged(boolean bDisplayOption, int iMoveMode)
      {
          if (!(this.getOwner() instanceof DateTimeField))
              return DBConstants.NORMAL_RETURN;
          if (m_fldSource != null)
          {
              Date time = null;
              if (m_fldStartDate != null)
              {
                  if ((m_fldStartDate.isNull()) || (m_fldStartDate.getDateTime().getTime() == 0))
                      return this.getOwner().setData(null, bDisplayOption, iMoveMode);
                  time = m_fldStartDate.getDateTime();
              }
              else
                  time = new Date();     // Current time
              double timeSpan = 0;
              if (!m_fldSource.isNull())
                  timeSpan = m_fldSource.getValue();
              else
              {
                  if (!m_bCalcIfNull)
                      return super.fieldChanged(bDisplayOption, iMoveMode);
              }
              timeSpan = Math.floor(timeSpan * DBConstants.KMS_IN_A_DAY + 0.5);  // Rounded number of ms
              Date newTime = new Date(time.getTime() + (long)timeSpan);
              return ((DateTimeField)this.getOwner()).setDateTime(newTime, bDisplayOption, iMoveMode);
          }
          else
          {
              Calendar calendar = Calendar.getInstance();   // Current time
              calendar.add(Calendar.YEAR, m_lYears);
              calendar.add(Calendar.MONTH, m_lMonths);
              calendar.add(Calendar.DATE, m_lDays);
              return ((DateTimeField)this.getOwner()).setCalendar(calendar, bDisplayOption, iMoveMode);
          }
      }