@Override
  public boolean stopCellEditing() {

    System.out.println("Advanced stopCellEditing");
    component.hidePopup();

    if (tabledesign.colls.get(last_col).validator != null) {
      if (!tabledesign.colls.get(last_col).validator.acceptData(component.getText())) {
        component.setBorder(new LineBorder(Color.RED));
        return false;
      }
    }

    DBValue val = null;

    if (DBValue.class.isInstance(current_value)) {
      val = (DBValue) current_value;
    } else {
      Object o = tabledesign.rows.get(last_row).get(last_col);
      if (o instanceof DBValue) val = (DBValue) o;
    }

    if (val != null) {
      String s = component.getText();

      boolean do_self = true;

      if (tabledesign.colls.get(last_col).validator != null) {
        if (tabledesign.colls.get(last_col).validator.wantDoLoadSelf()) {
          do_self = false;

          if (!tabledesign.colls.get(last_col).validator.loadToValue(val, s, last_row)) {
            component.setBorder(new LineBorder(Color.RED));
            return false;
          }
        }
      }

      if (do_self) {
        if (!val.acceptString(s)) {
          component.setBorder(new LineBorder(Color.RED));
          return false;
        } else {
          val.loadFromString(s);
        }
      }
    }

    component.setBackground(Color.WHITE);

    return super.stopCellEditing();
  }
  @Override
  public Object getCellEditorValue() {
    /*
    System.out.println( "value+:" + ((JTextField)component).getText() );
    System.out.println( "add row:" + last_row );
     */
    // System.out.println("getCellEditorValue");

    tabledesign.edited_cols.add(last_col);
    tabledesign.edited_rows.add(last_row);
    // return component.getSelectedItem().toString();
    return component.getText();
  }