whole_func_string: function addNewPredicateObject (e) {
        if (UI.utils.getTarget(e).className !== 'bottom-border-active') return
        var This = outline.UserInput
        var target = UI.utils.getTarget(e)
  
          // UI.log.warn(ancestor(target,'TABLE').textContent);
        var insertTr = myDocument.createElement('tr')
        UI.utils.ancestor(target, 'DIV').insertBefore(insertTr, UI.utils.ancestor(target, 'TR'))
        var tempTr = myDocument.createElement('tr')
        var reqTerm1 = This.generateRequest('(TBD)', tempTr, true)
        insertTr.appendChild(tempTr.firstChild)
        var reqTerm2 = This.generateRequest('(Enter text or drag an object onto this field)', tempTr, false)
        insertTr.appendChild(tempTr.firstChild)
          // there should be an elegant way of doing this
  
          // Take the why of the last TR and write to it.
        if (UI.utils.ancestor(target, 'TR').previousSibling &&  // there is a previous predicate/object line
                  UI.utils.ancestor(target, 'TR').previousSibling.AJAR_statement) {
          let preStat = UI.utils.ancestor(target, 'TR').previousSibling.AJAR_statement
              // This should always(?) input a non-inverse statement
          This.formUndetStat(insertTr, preStat.subject, reqTerm1, reqTerm2, preStat.why, false)
        } else { // no previous row: write to the document defining the subject
          var subject = UI.utils.getAbout(kb, UI.utils.ancestor(target.parentNode.parentNode, 'TD'))
          var doc = kb.sym(UI.rdf.Util.uri.docpart(subject.uri))
          This.formUndetStat(insertTr, subject, reqTerm1, reqTerm2, doc, false)
        }
  
        outline.walk('moveTo', insertTr.firstChild)
        UI.log.info('addNewPredicateObject: selection = ' + outline.getSelection().map(function (item) { return item.textContent }).join(', '))
        this.startFillInText(outline.getSelection()[0])
      }
func_code_string: function addNewPredicateObject (e) {
        if (UI.utils.getTarget(e).className !== 'bottom-border-active') return
        var This = outline.UserInput
        var target = UI.utils.getTarget(e)
  
          // UI.log.warn(ancestor(target,'TABLE').textContent);
        var insertTr = myDocument.createElement('tr')
        UI.utils.ancestor(target, 'DIV').insertBefore(insertTr, UI.utils.ancestor(target, 'TR'))
        var tempTr = myDocument.createElement('tr')
        var reqTerm1 = This.generateRequest('(TBD)', tempTr, true)
        insertTr.appendChild(tempTr.firstChild)
        var reqTerm2 = This.generateRequest('(Enter text or drag an object onto this field)', tempTr, false)
        insertTr.appendChild(tempTr.firstChild)
          // there should be an elegant way of doing this
  
          // Take the why of the last TR and write to it.
        if (UI.utils.ancestor(target, 'TR').previousSibling &&  // there is a previous predicate/object line
                  UI.utils.ancestor(target, 'TR').previousSibling.AJAR_statement) {
          let preStat = UI.utils.ancestor(target, 'TR').previousSibling.AJAR_statement
              // This should always(?) input a non-inverse statement
          This.formUndetStat(insertTr, preStat.subject, reqTerm1, reqTerm2, preStat.why, false)
        } else { // no previous row: write to the document defining the subject
          var subject = UI.utils.getAbout(kb, UI.utils.ancestor(target.parentNode.parentNode, 'TD'))
          var doc = kb.sym(UI.rdf.Util.uri.docpart(subject.uri))
          This.formUndetStat(insertTr, subject, reqTerm1, reqTerm2, doc, false)
        }
  
        outline.walk('moveTo', insertTr.firstChild)
        UI.log.info('addNewPredicateObject: selection = ' + outline.getSelection().map(function (item) { return item.textContent }).join(', '))
        this.startFillInText(outline.getSelection()[0])
      }
func_documentation_string: Called when the blue cross under the default pane is clicked. Add a new row to a property list ( P and O)