package com.revolsys.swing.map.layer.record;
import java.beans.PropertyChangeEvent;
import java.util.List;
import com.revolsys.datatype.DataType;
import com.revolsys.identifier.Identifier;
import com.revolsys.io.BaseCloseable;
import com.revolsys.record.Record;
import com.revolsys.record.RecordState;
import com.revolsys.record.schema.FieldDefinition;
import com.revolsys.record.schema.RecordDefinition;
import com.revolsys.util.Property;
public interface LayerRecord extends Record {
default boolean cancelChanges() {
return true;
}
default void clearChanges() {
}
default BaseCloseable eventsDisabled() {
final AbstractRecordLayer layer = getLayer();
return layer.eventsDisabled();
}
default BaseCloseable eventsEnabled() {
final AbstractRecordLayer layer = getLayer();
return layer.eventsEnabled();
}
default void firePropertyChange(final String fieldName, final Object oldValue,
final Object newValue) {
final AbstractRecordLayer layer = getLayer();
if (layer.isEventsEnabled()) {
final LayerRecord record = getEventRecord();
final PropertyChangeEvent fieldEvent = new PropertyChangeEvent(record, fieldName, oldValue,
newValue);
layer.propertyChange(fieldEvent);
}
fireRecordUpdated();
}
default void fireRecordUpdated() {
final AbstractRecordLayer layer = getLayer();
if (layer.isEventsEnabled()) {
final LayerRecord record = getEventRecord();
final PropertyChangeEvent fieldEvent = new PropertyChangeEvent(layer,
AbstractRecordLayer.RECORD_UPDATED, null, record);
layer.propertyChange(fieldEvent);
}
}
/**
* Get the record to use for property change events.
*
* @return The record;
*/
default LayerRecord getEventRecord() {
return this;
}
AbstractRecordLayer getLayer();
default LayerRecordMenu getMenu() {
final AbstractRecordLayer layer = getLayer();
return layer.getRecordMenu(this);
}
default Record getOriginalRecord() {
return new OriginalRecord(this);
}
@SuppressWarnings("unchecked")
default <T> T getOriginalValue(final String name) {
return (T)getValue(name);
}
@Override
default RecordDefinition getRecordDefinition() {
final AbstractRecordLayer layer = getLayer();
return layer.getRecordDefinition();
}
default boolean isDeletable() {
final AbstractRecordLayer layer = getLayer();
if (layer.isCanDeleteRecords()) {
return !layer.isDeleted(this);
}
return false;
}
default boolean isGeometryEditable() {
return true;
}
default boolean isHasModifiedEmptyFields() {
final List<String> fieldNames = getFieldNames();
for (final String fieldName : fieldNames) {
final Object value = getValue(fieldName);
if (Property.isEmpty(value)) {
final Object originalValue = getOriginalValue(fieldName);
if (!Property.isEmpty(originalValue)) {
return true;
}
}
}
return false;
}
default boolean isHighlighted() {
final AbstractRecordLayer layer = getLayer();
return layer.isHighlighted(this);
}
default boolean isLayerRecord(final Record record) {
final AbstractRecordLayer layer = getLayer();
return layer.isLayerRecord(record);
}
default boolean isModified(final int index) {
final String fieldName = getFieldName(index);
return isModified(fieldName);
}
default boolean isModified(final String name) {
return false;
}
default boolean isProxyRecord() {
return false;
}
@Override
default boolean isSame(Record record) {
if (record == null) {
return false;
} else {
if (record instanceof AbstractProxyLayerRecord) {
final AbstractProxyLayerRecord proxyRecord = (AbstractProxyLayerRecord)record;
record = proxyRecord.getRecordProxied();
}
if (this == record) {
return true;
} else {
synchronized (this) {
if (isLayerRecord(record)) {
final Identifier id = getIdentifier();
final Identifier otherId = record.getIdentifier();
if (id == null || otherId == null) {
return false;
} else if (DataType.equal(id, otherId)) {
return true;
} else {
return false;
}
} else {
return false;
}
}
}
}
}
default boolean isSelected() {
final AbstractRecordLayer layer = getLayer();
return layer.isSelected(this);
}
@Override
default boolean isValid(final CharSequence fieldName) {
final RecordDefinition recordDefinition = getRecordDefinition();
final int index = recordDefinition.getFieldIndex(fieldName);
return isValid(index);
}
@Override
default boolean isValid(final int index) {
synchronized (this) {
if (getState() == RecordState.INITIALIZING) {
return true;
} else {
final FieldDefinition fieldDefinition = getFieldDefinition(index);
if (fieldDefinition != null) {
final Object value = getValue(index);
return fieldDefinition.isValid(value);
}
return true;
}
}
}
default LayerRecord newRecordProxy() {
return this;
}
default void postSaveDeleted() {
}
default void postSaveModified() {
synchronized (this) {
if (getState() == RecordState.PERSISTED) {
clearChanges();
}
}
}
default void postSaveNew() {
}
default LayerRecord revertChanges() {
return this;
}
default void revertEmptyFields() {
synchronized (this) {
final AbstractRecordLayer layer = getLayer();
for (final String fieldName : getFieldNames()) {
final Object value = getValue(fieldName);
if (Property.isEmpty(value)) {
if (!layer.isFieldUserReadOnly(fieldName)) {
final Object originalValue = getOriginalValue(fieldName);
if (!Property.isEmpty(originalValue)) {
setValue(fieldName, originalValue);
}
}
}
}
}
}
default void validate() {
}
}