Program: 68571
Project: 68571
Buggy source:
private void fireEvent(boolean bByModifyText){
  boolean isFractionConverted=false;
  String sText=txtValue.getText();
  if (sText == null || sText.trim().length() == 0) {
    bValueIsSet=false;
  }
 else {
    int iDelimiter=sText.indexOf('/');
    if (iDelimiter < 0) {
      iDelimiter=sText.indexOf(':');
    }
    if (iDelimiter > 0) {
      isFractionConverted=true;
      String numerator=sText.substring(0,iDelimiter);
      String denominator=sText.substring(iDelimiter + 1);
      try {
        Number nume=numberFormat.parse(numerator);
        Number deno=numberFormat.parse(denominator);
        dValue=nume.doubleValue() / deno.doubleValue();
        bValueIsSet=true;
        sText=numberFormat.format(dValue);
        if (!bByModifyText) {
          this.txtValue.setText(sText);
        }
      }
 catch (      ParseException e) {
        if (!this.bTextModified) {
          handleFormatError(sText);
        }
      }
    }
 else {
      try {
        Number num=numberFormat.parse(sText);
        dValue=num.doubleValue();
        bValueIsSet=true;
        sText=numberFormat.format(dValue);
      }
 catch (      ParseException e) {
        if (!this.bTextModified) {
          handleFormatError(sText);
        }
      }
    }
  }
  for (int i=0; i < vModifyListeners.size(); i++) {
    Event e=new Event();
    e.data=bByModifyText ? Boolean.FALSE : Boolean.TRUE;
    e.widget=this;
    e.type=TEXT_MODIFIED;
    ((ModifyListener)vModifyListeners.get(i)).modifyText(new ModifyEvent(e));
  }
  if (isFractionConverted) {
    for (int i=0; i < vFractionListeners.size(); i++) {
      Event e=new Event();
      e.data=sText;
      e.widget=this;
      e.type=TEXT_FRACTION_CONVERTED;
      ((Listener)vFractionListeners.get(i)).handleEvent(e);
    }
  }
}

Fixed version (ground truth):
private void fireEvent(boolean bByModifyText){
  boolean isFractionConverted=false;
  String sText=txtValue.getText();
  if (sText == null || sText.trim().length() == 0) {
    bValueIsSet=false;
    dValue=0d;
  }
 else {
    int iDelimiter=sText.indexOf('/');
    if (iDelimiter < 0) {
      iDelimiter=sText.indexOf(':');
    }
    if (iDelimiter > 0) {
      isFractionConverted=true;
      String numerator=sText.substring(0,iDelimiter);
      String denominator=sText.substring(iDelimiter + 1);
      try {
        Number nume=numberFormat.parse(numerator);
        Number deno=numberFormat.parse(denominator);
        dValue=nume.doubleValue() / deno.doubleValue();
        bValueIsSet=true;
        sText=numberFormat.format(dValue);
        if (!bByModifyText) {
          this.txtValue.setText(sText);
        }
      }
 catch (      ParseException e) {
        if (!this.bTextModified) {
          handleFormatError(sText);
        }
      }
    }
 else {
      try {
        Number num=numberFormat.parse(sText);
        dValue=num.doubleValue();
        bValueIsSet=true;
        sText=numberFormat.format(dValue);
      }
 catch (      ParseException e) {
        if (!this.bTextModified) {
          handleFormatError(sText);
        }
      }
    }
  }
  for (int i=0; i < vModifyListeners.size(); i++) {
    Event e=new Event();
    e.data=bByModifyText ? Boolean.FALSE : Boolean.TRUE;
    e.widget=this;
    e.type=TEXT_MODIFIED;
    ((ModifyListener)vModifyListeners.get(i)).modifyText(new ModifyEvent(e));
  }
  if (isFractionConverted) {
    for (int i=0; i < vFractionListeners.size(); i++) {
      Event e=new Event();
      e.data=sText;
      e.widget=this;
      e.type=TEXT_FRACTION_CONVERTED;
      ((Listener)vFractionListeners.get(i)).handleEvent(e);
    }
  }
}