class AbstractAttributeColumnPropertyEditor extends PropertyEditorSupport {

    private final EditorClass editorClass;
    private final AttributeTypeClass attributeTypeClass;
    private Column[] columns;
    private Column selectedColumn;

    protected AbstractAttributeColumnPropertyEditor(EditorClass editorClass, AttributeTypeClass attributeClass) {
        this.editorClass = editorClass;
        this.attributeTypeClass = attributeClass;
    }

    protected Column[] getColumns() {<FILL_FUNCTION_BODY>}

    @Override
    public String[] getTags() {
        columns = getColumns();
        //selectedColumn = columns[0];
        String[] tags = new String[columns.length];
        for (int i = 0; i < columns.length; i++) {
            tags[i] = columns[i].getTitle();
        }
        return tags;
    }

    @Override
    public Object getValue() {
        return selectedColumn;
    }

    @Override
    public void setValue(Object value) {
        Column column = (Column) value;
        this.selectedColumn = column;
    }

    @Override
    public String getAsText() {
        if (selectedColumn == null) {
            return "---";
        }
        return selectedColumn.getTitle();
    }

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        if (columns == null) {
            columns = getColumns();
        }
        for (Column c : columns) {
            if (c.getTitle().equals(text)) {
                this.selectedColumn = c;
            }
        }
    }

    public boolean isDynamicNumberColumn(Column column) {
        return AttributeUtils.isDynamicType(column.getTypeClass()) &&
            AttributeUtils.isNumberType(column.getTypeClass());
    }

    public boolean isNumberColumn(Column column) {
        return AttributeUtils.isNumberType(column.getTypeClass())
            && !AttributeUtils.isArrayType(column.getTypeClass())
            && !AttributeUtils.isDynamicType(column.getTypeClass());
    }

    public boolean isStringColumn(Column column) {
        return column.getTypeClass().equals(String.class);
    }

    public enum EditorClass {

        NODE, EDGE, NODEEDGE
    }

    public enum AttributeTypeClass {

        ALL, NUMBER, STRING, DYNAMIC_NUMBER, ALL_NUMBER
    }
}

        List<Column> cols = new ArrayList<>();
        GraphModel model = Lookup.getDefault().lookup(GraphController.class).getGraphModel();
        if (model != null) {
            if (editorClass.equals(EditorClass.NODE) || editorClass.equals(EditorClass.NODEEDGE)) {
                for (Column column : model.getNodeTable()) {
                    if (attributeTypeClass.equals(AttributeTypeClass.NUMBER) && isNumberColumn(column)) {
                        cols.add(column);
                    } else if (attributeTypeClass.equals(AttributeTypeClass.DYNAMIC_NUMBER) &&
                        isDynamicNumberColumn(column)) {
                        cols.add(column);
                    } else if (attributeTypeClass.equals(AttributeTypeClass.ALL_NUMBER) &&
                        (isDynamicNumberColumn(column) || isNumberColumn(column))) {
                        cols.add(column);
                    } else if (attributeTypeClass.equals(AttributeTypeClass.ALL)) {
                        cols.add(column);
                    } else if (attributeTypeClass.equals(AttributeTypeClass.STRING) && isStringColumn(column)) {
                        cols.add(column);
                    }
                }
            }
            if (editorClass.equals(EditorClass.EDGE) || editorClass.equals(EditorClass.NODEEDGE)) {
                for (Column column : model.getEdgeTable()) {
                    if (attributeTypeClass.equals(AttributeTypeClass.NUMBER) && isNumberColumn(column)) {
                        cols.add(column);
                    } else if (attributeTypeClass.equals(AttributeTypeClass.DYNAMIC_NUMBER) &&
                        isDynamicNumberColumn(column)) {
                        cols.add(column);
                    } else if (attributeTypeClass.equals(AttributeTypeClass.ALL_NUMBER) &&
                        (isDynamicNumberColumn(column) || isNumberColumn(column))) {
                        cols.add(column);
                    } else if (attributeTypeClass.equals(AttributeTypeClass.ALL)) {
                        cols.add(column);
                    } else if (attributeTypeClass.equals(AttributeTypeClass.STRING) && isStringColumn(column)) {
                        cols.add(column);
                    }
                }
            }
        }
        return cols.toArray(new Column[0]);
    
<methods>public void <init>() ,public void <init>(java.lang.Object) ,public synchronized void addPropertyChangeListener(java.beans.PropertyChangeListener) ,public void firePropertyChange() ,public java.lang.String getAsText() ,public java.awt.Component getCustomEditor() ,public java.lang.String getJavaInitializationString() ,public java.lang.Object getSource() ,public java.lang.String[] getTags() ,public java.lang.Object getValue() ,public boolean isPaintable() ,public void paintValue(java.awt.Graphics, java.awt.Rectangle) ,public synchronized void removePropertyChangeListener(java.beans.PropertyChangeListener) ,public void setAsText(java.lang.String) throws java.lang.IllegalArgumentException,public void setSource(java.lang.Object) ,public void setValue(java.lang.Object) ,public boolean supportsCustomEditor() <variables>private Vector<java.beans.PropertyChangeListener> listeners,private java.lang.Object source,private java.lang.Object value