private void instantiateCalloutController(UserRequest ureq, Component content, Link button) {
   removeAsListenerAndDispose(calloutCtrl);
   String title = translate("textartefact.edit.title");
   calloutCtrl =
       new CloseableCalloutWindowController(
           ureq, getWindowControl(), content, button, title, true, null);
   listenTo(calloutCtrl);
   calloutCtrl.activate();
 }
 @Override
 protected void event(UserRequest ureq, Controller source, Event event) {
   if (commentCalloutCtrl == source) {
     cleanUp();
   } else if (editCommentCtrl == source) {
     if (event == Event.DONE_EVENT) {
       table.reset();
     }
     commentCalloutCtrl.deactivate();
     cleanUp();
   }
   super.event(ureq, source, event);
 }
 @Override
 protected void event(UserRequest ureq, Controller source, Event event) {
   if (source == calloutCtrl
       && event.equals(CloseableCalloutWindowController.CLOSE_WINDOW_EVENT)) {
     removeAsListenerAndDispose(calloutCtrl);
     calloutCtrl = null;
   } else if (source == textEditCtrl && event == Event.DONE_EVENT) {
     // close callout, refresh artefact-details
     calloutCtrl.deactivate();
     removeAsListenerAndDispose(calloutCtrl);
     init(ureq);
   }
 }
  private void doEditComment(UserRequest ureq, AssessmentRow row) {
    removeAsListenerAndDispose(commentCalloutCtrl);

    OLATResourceable courseOres = courseEnv.getCourseGroupManager().getCourseResource();
    editCommentCtrl = new EditCommentController(ureq, getWindowControl(), courseOres, gtaNode, row);
    listenTo(editCommentCtrl);
    commentCalloutCtrl =
        new CloseableCalloutWindowController(
            ureq,
            getWindowControl(),
            editCommentCtrl.getInitialComponent(),
            row.getCommentEditLink().getFormDispatchId(),
            "",
            true,
            "");
    listenTo(commentCalloutCtrl);
    commentCalloutCtrl.activate();
  }