public String getNotation()
      throws NotationException, IOException, MonomerException, JDOMException {
    ComplexProtein cp = new ComplexProtein();
    cp.setSequences(getSequences());

    if (annotationTable.getCellEditor() != null) {
      annotationTable.getCellEditor().stopCellEditing();
    }
    cp.setAnnotations(annotationTableModel.getPopulatedSeqeuenceAnnotations());

    if (connectionTable.getCellEditor() != null) {
      connectionTable.getCellEditor().stopCellEditing();
    }
    cp.setConnections(connectionTableModel.getPopulatedConnections());
    return cp.getNotation();
  }
  public void setNotation(String notation) {
    if (null == notation || notation.length() == 0) {
      notFiringOnChange = true;
      sequenceTextArea.setText("");
      connectionTableModel.setupEmptyData(CONNECTION_TABLE_ROW_COUNT);
      annotationTableModel.setupEmptyData(ANNOTATION_TABLE_ROW_COUNT);
      notFiringOnChange = false;
      return;
    }

    notFiringOnChange = true;
    try {
      ComplexProtein cp = ComplexProtein.convert(notation);
      List<String> sequences = cp.getSequences();
      if (null != sequences && !sequences.isEmpty()) {
        StringBuilder sb = new StringBuilder();
        for (String seq : sequences) {
          if (sb.length() > 0) {
            sb.append(ComplexProtein.SEQUENCE_SEPARATOR_SYMBOL);
            sb.append("\n");
          }
          sb.append(toBlockedSequence(seq));
          sb.append("\n");
        }
        sequenceTextArea.setText(sb.toString());

        List<PeptideConnection> conList = cp.getConnections();
        if (null != conList && !conList.isEmpty()) {
          if (conList.size() >= CONNECTION_TABLE_ROW_COUNT) {
            connectionTableModel.setData(conList);
          } else {
            List<PeptideConnection> l = new ArrayList<PeptideConnection>();
            l.addAll(conList);
            for (int i = 0; i < CONNECTION_TABLE_ROW_COUNT - conList.size(); i++) {
              l.add(new PeptideConnection());
            }
            connectionTableModel.setData(l);
          }
        } else {
          connectionTableModel.setupEmptyData(CONNECTION_TABLE_ROW_COUNT);
        }

        List<SequenceAnnotation> annList = cp.getAnnotations();
        if (null != annList && !annList.isEmpty()) {
          if (annList.size() >= ANNOTATION_TABLE_ROW_COUNT) {
            annotationTableModel.setData(annList);
          } else {
            List<SequenceAnnotation> l = new ArrayList<SequenceAnnotation>();
            l.addAll(annList);
            for (int i = 0; i < ANNOTATION_TABLE_ROW_COUNT - annList.size(); i++) {
              l.add(new SequenceAnnotation());
            }
            annotationTableModel.setData(l);
          }
        } else {
          annotationTableModel.setupEmptyData(ANNOTATION_TABLE_ROW_COUNT);
        }

      } else {
        sequenceTextArea.setText("");
        connectionTableModel.setupEmptyData(CONNECTION_TABLE_ROW_COUNT);
        annotationTableModel.setupEmptyData(ANNOTATION_TABLE_ROW_COUNT);
      }
    } catch (Exception ex) {
      Logger.getLogger(ProteinEditor.class.getName()).log(Level.SEVERE, null, ex);
      ExceptionHandler.handleException(ex);
    }
    notFiringOnChange = false;
  }