/**
   * Calculates the required left indent for a given item, given its type and its hierarchy level.
   */
  static int getIndent(PropertySheetTable table, Item item) {
    int indent = 0;

    if (item.isProperty()) {
      // it is a property, it has no parent or a category, and no child
      if ((item.getParent() == null || !item.getParent().isProperty()) && !item.hasToggle()) {
        indent = table.getWantsExtraIndent() ? HOTSPOT_SIZE : 0;
      } else {
        // it is a property with children
        if (item.hasToggle()) {
          indent = item.getDepth() * HOTSPOT_SIZE;
        } else {
          indent = (item.getDepth() + 1) * HOTSPOT_SIZE;
        }
      }

      if (table.getSheetModel().getMode() == PropertySheet.VIEW_AS_CATEGORIES
          && table.getWantsExtraIndent()) {
        indent += HOTSPOT_SIZE;
      }

    } else {
      // category has no indent
      indent = 0;
    }
    return indent;
  }
    public void configure(PropertySheetTable table, Item item) {
      isProperty = item.isProperty();
      toggleState = item.isVisible();
      showToggle = item.hasToggle();

      indentWidth = getIndent(table, item);
      insets.left = indentWidth + (showToggle ? HOTSPOT_SIZE : 0) + 2;
      ;
    }
  /**
   * Gets the CellEditor for the given row and column. It uses the editor registry to find a
   * suitable editor for the property.
   *
   * @see javax.swing.JTable#getCellEditor(int, int)
   */
  public TableCellEditor getCellEditor(int row, int column) {
    if (column == 0) {
      return null;
    }

    Item item = getSheetModel().getPropertySheetElement(row);
    if (!item.isProperty()) return null;

    TableCellEditor result = null;
    Property propery = item.getProperty();
    PropertyEditor editor = getEditorFactory().createPropertyEditor(propery);
    if (editor != null) result = new CellEditorAdapter(editor);

    return result;
  }