NationalSecurityAgency/ghidra · error · UnsupportedOperationException

Cell is not editable

Error message

Cell is not editable

What it means

Default implementation of EnumeratedTableColumn.setValueOf(R, Object). Mirrors error 562 for the simpler EnumeratedTableColumn interface: columns are non-editable unless isEditable(R) is overridden to return true, and when editing is enabled the subclass must also override setValueOf. The default throws to signal an incomplete edit implementation.

Source

Thrown at Ghidra/Debug/ProposedUtils/src/main/java/docking/widgets/table/EnumeratedTableColumn.java:61

	 * @return the value
	 */
	public Object getValueOf(R row);

	/**
	 * Get the name of this column
	 * 
	 * @return the name
	 */
	public String getHeader();

	/**
	 * Get the value of this column for the given row
	 * 
	 * @param row the row
	 * @param value the new value
	 */
	default public void setValueOf(R row, Object value) {
		throw new UnsupportedOperationException("Cell is not editable");
	}

	/**
	 * Check if this column can be modified for the given row
	 * 
	 * @param row the row
	 * @return true if editable
	 */
	default public boolean isEditable(R row) {
		return false;
	}

	/**
	 * Check if this column can be sorted
	 * 
	 * <p>
	 * TODO: Either this should be implemented as ported to {@link GDynamicColumnTableModel}, or
	 * removed.

View on GitHub (pinned to d5f144c24d)

Solutions

  1. Override setValueOf(R row, Object value) in the enum constant/class so the edit is applied to the row.
  2. Leave isEditable returning false if the column must remain read-only.
  3. Pair every isEditable()==true column with a tested setValueOf override.

Example fix

// before
ADDRESS {
  public Object getValueOf(Row r) { return r.getAddress(); }
  public boolean isEditable(Row r) { return true; } // no setValueOf
};

// after
ADDRESS {
  public Object getValueOf(Row r) { return r.getAddress(); }
  public boolean isEditable(Row r) { return true; }
  public void setValueOf(Row r, Object value) { r.setAddress((Address) value); }
};
Defensive patterns

Strategy: type-guard

Type guard

if (col.isEditable(row)) {
  // only call setValueOf if isEditable is true AND the column overrides setValueOf
}

Try / catch

try {
  col.setValueOf(row, value);
} catch (UnsupportedOperationException e) {
  if ("Cell is not editable".equals(e.getMessage())) {
    // no setter implemented; ignore
  } else throw e;
}

Prevention

When it happens

Trigger: An enum-based EnumeratedTableColumn overrides isEditable(row) to true but does not override setValueOf(row, value). The table invokes setValueOf when a user commits an edit in that cell.

Common situations: Prototyping an editable enumerated table column; toggling editability on a column modeled after a read-only one without adding the setter; framework upgrades where the editable contract was tightened.

Related errors


AI-assisted analysis of NationalSecurityAgency/ghidra@d5f144c24d (2026-08-14). Data as JSON: /api/errors/5a30621947ab5b74. Report an issue: GitHub.