@Nullable
    protected Object getCellValue(Object element, ObjectColumn objectColumn, boolean formatValue) {
        if (element instanceof ObjectsGroupingWrapper) {
            if (objectColumn == groupingColumn) {
                Object groupingKey = ((ObjectsGroupingWrapper) element).groupingKey;
                List<Object> elements = ((ObjectsGroupingWrapper) element).groupedElements;
                int groupElementsSize = 0;
                if (!CommonUtils.isEmpty(elements)) {
                    groupElementsSize = elements.size();
                }
                if (groupingKey == null || "".equals(groupingKey)) {
                    return EMPTY_GROUPING_LABEL + (groupElementsSize > 0 ? " (" + groupElementsSize + ")" : "");
                }
                return groupingKey + (groupElementsSize > 0 ? " (" + groupElementsSize + ")" : "");
            }
            return null;
        }
        OBJECT_TYPE object = (OBJECT_TYPE) element;

        Object objectValue = getObjectValue(object);
        if (objectValue == null) {
            return null;
        }
        ObjectPropertyDescriptor prop = getPropertyByObject(objectColumn, objectValue);
        if (prop == null) {
            return null;
        }
        //if (!prop.isReadOnly(objectValue) && isNewObject(object)) {
        // Non-editable properties are empty for new objects
        //return null;
        //}
        if (!isDynamicObject(object) && prop.isLazy(objectValue, true)) {
            synchronized (lazyCache) {
                final Map<String, Object> cache = lazyCache.get(object);
                if (cache != null) {
                    Object value = cache.get(objectColumn.id);
                    if (value != null) {
                        if (value == NULL_VALUE) {
                            return null;
                        } else {
                            if (formatValue) {
                                value = prop.formatValue(object, value);
                            }
                            return value;
                        }
                    }
                }
            }
            if (prop.supportsPreview()) {
                final Object previewValue = getListPropertySource().getPropertyValue(null, objectValue, prop, formatValue);
                if (previewValue != null) {
                    return new LazyValue(previewValue);
                }
            }
            return DEF_LAZY_VALUE;
        }
        return getListPropertySource().getPropertyValue(null, objectValue, prop, formatValue);
    }
Used to save/load columns configuration.
Must depend on object types

@param classList classes of objects in the list
plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/itemlist/ObjectListControl.java